summaryrefslogtreecommitdiffstats
path: root/build
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 /build
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.
Diffstat (limited to 'build')
-rw-r--r--build/scripts/common.subr65
-rwxr-xr-xbuild/scripts/git_checkout.sh106
2 files changed, 171 insertions, 0 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
OpenPOWER on IntegriCloud