summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRenato Botelho <renato@netgate.com>2016-08-01 14:00:10 -0300
committerRenato Botelho <renato@netgate.com>2016-08-01 14:02:29 -0300
commita10a0e7043b0d14df99a31ca54a9709406391b43 (patch)
tree6cc240a4dbaeca004b9bed43c81f6ef9828be21f
parent7da937948f83ce82745346fbd5ecb5e4457fa1bc (diff)
downloadpfsense-a10a0e7043b0d14df99a31ca54a9709406391b43.zip
pfsense-a10a0e7043b0d14df99a31ca54a9709406391b43.tar.gz
Add git_checkout.sh and common.subr
This is the first of a set commits to start replacing big builder_common.sh by smaller and specific scripts to do necessary build tasks. First is git_checkout.sh, a script used to checkout or update a git repository on desired destination dir and branch or tag.
-rw-r--r--build/scripts/common.subr65
-rwxr-xr-xbuild/scripts/git_checkout.sh106
-rw-r--r--tools/builder_common.sh34
-rw-r--r--tools/builder_defaults.sh1
4 files changed, 182 insertions, 24 deletions
diff --git a/build/scripts/common.subr b/build/scripts/common.subr
new file mode 100644
index 0000000..3ceb468
--- /dev/null
+++ b/build/scripts/common.subr
@@ -0,0 +1,65 @@
+#
+# ex: filetype=sh
+#
+# common.subr
+#
+# part of pfSense (https://www.pfsense.org)
+# Copyright (c) 2004-2016 Electric Sheep Fencing, LLC
+# All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Obtained from poudriere common.sh
+eargs() {
+ local fname="$1"
+ shift
+ case $# in
+ 0) err "${fname}: No arguments expected" ;;
+ 1) err "${fname}: 1 argument expected: $1" ;;
+ *) err "${fname}: $# arguments expected: $*" ;;
+ esac
+}
+
+err() {
+ [ $# -eq 1 ] || eargs err msg
+ local msg="$1"
+
+ echo >&2 "====>> ERROR: $msg"
+ exit 1
+}
+
+run() {
+ [ $# -eq 2 ] || eargs run msg cmd
+ local msg="$1"
+ local cmd="$2"
+
+ echo "====>> ${msg}"
+ ${cmd} 2>&1
+ rc=$?
+ [ $rc -ne 0 ] \
+ && err "Execution of '${cmd}' failed (rc = ${rc})"
+}
+
+force_rm() {
+ [ $# -eq 1 ] || eargs force_rm directory
+ local directory="$1"
+
+ [ "${directory}" = "/" ] \
+ && err "Removing / is not a good idea"
+
+ run "Removing immutable flags from ${directory}" \
+ "chflags -R noschg ${directory}"
+
+ run "Removing recursively ${directory}" \
+ "rm -rf ${directory}"
+}
diff --git a/build/scripts/git_checkout.sh b/build/scripts/git_checkout.sh
new file mode 100755
index 0000000..10c43ce
--- /dev/null
+++ b/build/scripts/git_checkout.sh
@@ -0,0 +1,106 @@
+#!/bin/sh
+#
+# git_checkout.sh
+#
+# part of pfSense (https://www.pfsense.org)
+# Copyright (c) 2004-2016 Electric Sheep Fencing, LLC
+# All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+export PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
+
+scripts_path=$(dirname $(realpath $0))
+
+if [ ! -f "${scripts_path}/common.subr" ]; then
+ echo >&2 "ERROR: common.subr is missing"
+ exit 1
+fi
+
+. ${scripts_path}/common.subr
+
+usage() {
+ cat >&2 <<END
+Usage: $(basename $0) -r repo_url -d destdir [-b branch] [-h]
+
+Options:
+ -r repo_url -- URL of desired git repository
+ -d destdir -- Directory to clone
+ -b branch -- Branch or tag to clone (default: master)
+ -h -- Show this help and exit
+
+Environment:
+ GIT_BIN -- Path to git binary
+END
+ exit 1
+}
+
+branch="master"
+while getopts r:d:b:h opt; do
+ case "$opt" in
+ r)
+ repo_url=$OPTARG
+ ;;
+ d)
+ destdir=$OPTARG
+ ;;
+ b)
+ branch=$OPTARG
+ ;;
+ *)
+ usage
+ ;;
+ esac
+done
+
+[ -z "$repo_url" ] \
+ && err "repository URL is not defined"
+
+[ -z "$destdir" ] \
+ && err "destdir is not defined"
+
+[ -e $destdir -a ! -d $destdir ] \
+ && err "destdir already exists and is not a directory"
+
+git=${GIT_BIN:-$(which git)}
+if [ ! -x "${git}" ]; then
+ err "git binary is missing"
+fi
+
+if [ -d "${destdir}/.git" ]; then
+ current_url=$(${git} -C ${destdir} config --get remote.origin.url)
+
+ [ "${current_url}" != "${repo_url}" ] \
+ && err "destination directory contains a different git " \
+ "repository"
+
+ run "Removing local changes from git repo ${repo_url} (${branch})" \
+ "${git} -C ${destdir} reset -q --hard"
+ run "Removing leftovers from git repo ${repo_url} (${branch})" \
+ "${git} -C ${destdir} clean -qfd"
+ run "Retrieving updates from git repo ${repo_url} (${branch})" \
+ "${git} -C ${destdir} fetch -q origin"
+ run "Updating git repo ${repo_url} (${branch})" \
+ "git -C ${destdir} checkout -q ${branch}"
+
+ # Detect if it's a branch and rebase it
+ if ${git} -C ${destdir} show-ref -q --verify refs/heads/${branch}; then
+ run "Rebasing git repo ${repo_url} (${branch})" \
+ "git -C ${destdir} rebase -q origin/${branch}"
+ fi
+else
+ run "Cloning git repository ${repo_url} (${branch})" \
+ "git clone -q -b ${branch} ${repo_url} ${destdir}"
+fi
+
+exit 0
diff --git a/tools/builder_common.sh b/tools/builder_common.sh
index 16e5331..c54917f 100644
--- a/tools/builder_common.sh
+++ b/tools/builder_common.sh
@@ -1444,42 +1444,28 @@ update_freebsd_sources() {
local _clone_params="--depth 1 --single-branch"
fi
- if [ ! -d "${FREEBSD_SRC_DIR}" ]; then
- mkdir -p ${FREEBSD_SRC_DIR}
- fi
-
if [ -n "${NO_BUILDWORLD}" -a -n "${NO_BUILDKERNEL}" ]; then
echo ">>> NO_BUILDWORLD and NO_BUILDKERNEL set, skipping update of freebsd sources" | tee -a ${LOGFILE}
return
fi
- echo -n ">>> Obtaining FreeBSD sources ${FREEBSD_BRANCH}..."
- local _FREEBSD_BRANCH=${FREEBSD_BRANCH:-"devel"}
- local _CLONE=1
+ echo ">>> Obtaining FreeBSD sources (${FREEBSD_BRANCH})..."
+ ${SCRIPTS_DIR}/git_checkout.sh \
+ -r ${FREEBSD_REPO_BASE} \
+ -d ${FREEBSD_SRC_DIR} \
+ -b ${FREEBSD_BRANCH}
- if [ -d "${FREEBSD_SRC_DIR}/.git" ]; then
- CUR_BRANCH=$(cd ${FREEBSD_SRC_DIR} && git branch | grep '^\*' | cut -d' ' -f2)
- if [ ${_full} -eq 0 -a "${CUR_BRANCH}" = "${_FREEBSD_BRANCH}" ]; then
- _CLONE=0
- ( cd ${FREEBSD_SRC_DIR} && git clean -fd; git fetch origin; git reset --hard origin/${_FREEBSD_BRANCH} ) 2>&1 | grep -C3 -i -E 'error|fatal'
- else
- rm -rf ${FREEBSD_SRC_DIR}
- fi
- fi
-
- if [ ${_CLONE} -eq 1 ]; then
- ( git clone --branch ${_FREEBSD_BRANCH} ${_clone_params} ${FREEBSD_REPO_BASE} ${FREEBSD_SRC_DIR} ) 2>&1 | grep -C3 -i -E 'error|fatal'
- fi
-
- if [ ! -d "${FREEBSD_SRC_DIR}/.git" ]; then
+ if [ $? -ne 0 -o ! -d "${FREEBSD_SRC_DIR}/.git" ]; then
echo ">>> ERROR: It was not possible to clone FreeBSD src repo"
print_error_pfS
fi
if [ -n "${GIT_FREEBSD_COSHA1}" ]; then
- ( cd ${FREEBSD_SRC_DIR} && git checkout ${GIT_FREEBSD_COSHA1} ) 2>&1 | grep -C3 -i -E 'error|fatal'
+ echo -n ">>> Checking out desired commit (${GIT_FREEBSD_COSHA1})... "
+ ( git -C ${FREEBSD_SRC_DIR} checkout ${GIT_FREEBSD_COSHA1} ) 2>&1 | \
+ grep -C3 -i -E 'error|fatal'
+ echo "Done!"
fi
- echo "Done!"
}
pkg_chroot() {
diff --git a/tools/builder_defaults.sh b/tools/builder_defaults.sh
index 01a4074..48d341c 100644
--- a/tools/builder_defaults.sh
+++ b/tools/builder_defaults.sh
@@ -37,6 +37,7 @@ if [ ! -d "${BUILDER_ROOT}" ]; then
fi
export BUILDER_TOOLS=${BUILDER_TOOLS:-"${BUILDER_ROOT}/tools"}
+export BUILDER_SCRIPTS=${BUILDER_SCRIPTS:-"${BUILDER_ROOT}/build/scripts"}
if [ ! -d "${BUILDER_TOOLS}" ]; then
echo ">>> ERROR: BUILDER_TOOLS is invalid"
OpenPOWER on IntegriCloud