blob: aef3a98366d5095ba8ea847b4a58deabee75e006 [file] [log] [blame]
# -*- shell-script -*-
# These functions are useful functions when working with a bash shell
# within a Net-SNMP git checkout.
nsbuildroot=${nsbuildroot:=$HOME/ns-build-root}
nsecho=${nsecho:=}
nsbranches=${nsbranches:="V5-4-patches V5-5-patches V5-6-patches V5-7-patches master"}
# set nsverbose to ':' if you don't want verbose output of what's going on
nsverbose=${nsverbose:="echo ::: Net-SNMP: "}
_ns_maybemkdir () {
dir=$1
if [ ! -d $dir ] ; then
$nsverbose making directory $dir
mkdir -p $dir
fi
}
_ns_switchtobuilddir () {
dir=$1
_ns_maybemkdir $dir
$nsverbose cd $dir
cd $dir
}
_ns_getbuilddir() {
nssuffix=${1:-$nssuffix}
nsbranch=`git branch | egrep '^\*' | sed 's/^..//'`
NSBUILDDIR="$nsbuildroot/$nsbranch"
NSSRCDIR="$PWD"
# add on the suffix if created
if [ "$nssuffix" != "" ]; then
NSBUILDDIR="$nsbuildroot/$nsbranch-$nssuffix"
fi
}
_ns_setbuilddir() {
_ns_getbuilddir "$1"
_ns_switchtobuilddir $NSBUILDDIR
}
_ns_cleanup() {
$nsverbose cd $NSSRCDIR
cd $NSSRCDIR
}
_ns_checkclean() {
if [ `git status --porcelain --untracked-files=no | wc -l` -gt 0 ] ; then
echo "Your directory has outstanding changes!"
echo " Please either commit the changes, discard them or stash them"
NSCLEAN=0
else
NSCLEAN=1
fi
}
#
# nsmake [-s suffix]
# runs 'make' in $nsbuildroot/branch[-suffix]
nsmake () {
if [ "$1" = "-s" ]; then
shift
_ns_setbuilddir "$1"
shift
elif [ "$1" != "" ]; then
echo "Unknown argument: $1"
exit 1
else
_ns_setbuilddir
fi
$nsverbose make "$@"
$nsecho make "$@"
_ns_cleanup
}
nsmakeall () {
_ns_checkclean
if [ $NSCLEAN != 1 ]; then
return
fi
for branch in $nsbranches ; do
git checkout $branch
nsmake "$@"
done
}
#
# nsconfigure [-s suffix] [configure arguments]
# runs 'configure' in $nsbuildroot/branch[-suffix] with passed arguments
nsconfigure () {
if [ "$1" = "-s" ]; then
shift
_ns_setbuilddir "$1"
shift
elif [ "$1" != "" ]; then
echo "Unknown argument: $1"
exit 1
else
_ns_setbuilddir
fi
$nsverbose running $NSSRCDIR/configure "$@"
$nsecho $NSSRCDIR/configure "$@"
_ns_cleanup
}
nspatchtry() {
_ns_checkclean
if [ $NSCLEAN != 1 ]; then
return
fi
# remember these branches
nsgoodbranches=""
nsbadbranches=""
# remember the patch args for later use
nspatchargs="$@"
# attempt to add any missing patch arguments
echo "x $nspatchargs x" | grep -- -p > /dev/null
if [ $? != "0" ] ; then
# they didn't specify a -p option. Try to guess at one...
nspatchfile=`echo $nspatchargs | sed 's/.* \([^ ]+\)$/\1/'`
# attempt to count the slashes before any agent/snmplib/apps/etc
patchcount=$((`grep diff $nspatchfile | head -1 | awk '{print $NF}' | sed 's/\(agent\|snmplib\|apps\|local\|perl\|python\).*//;s#[^/]##g' | wc -c` - 1))
nspatchargs="-p $patchcount $nspatchargs"
fi
echo "x $nspatchargs x" | grep -- "-i " > /dev/null
if [ $? != "0" ] ; then
# they didn't specify a -i option. Try to add one...
nspatchargs=`echo $nspatchargs | sed 's/\(.*\) \(..*\)$/\1 -i \2/'`
fi
echo "Using patch args: $nspatchargs"
for branch in $nsbranches ; do
$nsverbose checking out and applying patch in $branch
$nsecho git checkout $branch
$nsverbose Appling patch
$nsecho patch -N --batch $nspatchargs
if [ $? = 0 ] ; then
$nsverbose Patch succeeded on $branch
nsgoodbranches="$nsgoodbranches $branch"
else
$nsverbose Patch failed on $branch
nsbadbranches="$nsbadbranches $branch"
fi
$nsverbose cleaning source tree
git checkout .
done
echo ""
echo "Patch application results:"
echo " Success: $nsgoodbranches"
echo " Fail: $nsbadbranches"
}
_nspatchapplybase() {
_ns_checkclean
if [ $NSCLEAN != 1 ]; then
return
fi
patchbranch=`echo $nsgoodbranches | sed 's/ .*//'`
$nsverbose Checking out $patchbranch
$nsecho git checkout $patchbranch
$nsverbose applying the patch "$nspatchargs"
$nsecho patch $nspatchargs
$nsecho git diff | cat
}
nspatchapply() {
_nspatchapplybase
echo ""
echo -n "commit the results to $patchbranch? [y/n]"
read ans
if [ $ans = 'y' -o $ans = 'Y' ] ; then
$nsecho git commit -a "$@"
fi
}
nssfpatchapply() {
_nspatchapplybase
nssfpatchcommit "$@"
}
nssfpatchcommit() {
patch="$1"
area="$2"
if [ "$patch" = "" ] ; then
echo "Enter patch number: "
echo -n "> "
read patch
fi
if [ "$patch" = "" ] ; then
echo "Error: A patch number is required"
return
fi
if [ "$area" = "" ] ; then
echo "Which area does this patch affect? (agent, libnetsnmp, apps, ...)?"
echo -n "> "
read area
fi
if [ "$area" = "" ] ; then
area="unknown"
fi
#
# get the patch's html
#
tmpfile="/tmp/nspatch.$patch"
if [ ! -f "$tmpfile" ]; then
wget -O $tmpfile "https://sourceforge.net/tracker/?func=detail&aid="${patch}"&group_id=12694&atid=312694"
fi
echo "---------------------------------"
username=`grep /users/ $tmpfile | head -1 | sed 's/.*.users.//;s/.".*//;'`
echo "username: $username"
fullname=`grep /users/ $tmpfile | head -1 | sed 's/.*title=.//;s/".*//;'`
echo "fullname: $fullname"
title=`grep "Detail: $patch" $tmpfile | head -1 | sed "s/.*$patch - //;s/<.*//" | sed 's/"//g;' | sed "s/'//g;"`
echo commit msg: $title
commitmsg="CHANGES: $area: PATCH $patch: from $username: $title"
patchbranch=`echo $nsgoodbranches | sed 's/ .*//'`
echo "Branch: $patchbranch"
echo "Command: "
echo " git commit -a -s \\"
echo " --author='$fullname <$username@users.sourceforge.net>'\\"
echo " -m '$commitmsg'"
echo ""
echo -n "commit the results to $patchbranch? [y/n]"
read ans
if [ $ans = 'y' -o $ans = 'Y' ] ; then
$nsecho git commit -a -s --author="$fullname <$username@users.sourceforge.net>" -m "$commitmsg"
else
echo "if you don't wish to keep the changes, use 'git reset --hard'"
fi
}
nsrollup() {
fetch=1;
if [ "$1" = "--no-fetch" ] ; then
fetch=0
shift
fi
if [ "$1" = "--merge" ] ; then
mergeop="merge"
elif [ "$1" = "--rebase" ] ; then
mergeop="rebase"
elif [ "$1" != "" ]; then
echo "Unknown argument: $1"
exit 1
else
mergeop="merge"
fi
_ns_checkclean
if [ $NSCLEAN != 1 ]; then
return
fi
if [ $fetch == 1 ]; then
$nsverbose Pulling all upstream branches
$nsecho git fetch --all
fi
nslastbranch=""
nsbranchesdone=""
nsbranchesnotdone=""
for branch in $nsbranches ; do
if [ "$nslastbranch" != "" ] ; then
$nsverbose checking out $branch
$nsecho git checkout $branch
if [ -f dist/release ] ; then
if [ "`egrep ^$branch dist/release`" = "$branch rc" ] ; then
$nsverbose Skipping: branch is in rc phase of release
nsbranchesnotdone="$nsbranchesnotdone $branch"
# comment this out if you want nsrollup to skip the
# branch and roll the changes in the lower branch up
# to the super-parent when the parent is in release status
nslastbranch=$branch
continue
fi
fi
$nsverbose rebasing our local changes on $branch
MERGE_AUTOEDIT=no git $mergeop origin/$branch
$nsverbose merging $nslastbranch into $branch
MERGE_AUTOEDIT=no $nsecho git merge --log $nslastbranch
if [ $? != 0 ] ; then
echo ""
echo "---------------------------------------------"
echo "Merge of $nslastbranch into $branch failed!!!"
echo ""
echo "Hints for fixing this:"
echo " You're on: $branch"
echo " Steps:"
echo " 1) fix all files marked as problematic"
echo " 2) run 'git add' on each file"
if [ $mergeop = "rebase" ] ; then
echo " 3) run 'git rebase --continue' to commit the changes"
else
echo " 3) run 'git commit' to commit the changes"
fi
echo " 4) once done, re-run nsrollup"
echo " Aborting:"
echo " If instead you want to give up, run"
echo " 1) git $mergeop --abort"
echo ""
echo "Updated the following branches:"
echo " $nsbranchesdone"
if [ "$nsbranchesnotdone" != "" ] ; then
echo "Did NOT update the following branches:"
echo " $nsbranchesnotdone"
fi
echo "Failed to update this branch:"
echo " $branch"
return
fi
_ns_checkclean
if [ $NSCLEAN != 1 ] ; then
# we really shouldn't git here. merge will either autocommit
# or it will fail
$nsverbose committing merge results
$nsecho git commit -m "nsrollup: merging $nslastbranch into $branch" -a
fi
nsbranchesdone="$nsbranchesdone $branch"
fi
nslastbranch=$branch
done
echo ""
echo "-------------------------------"
echo "Updated the following branches:"
echo " $nsbranchesdone"
if [ "$nsbranchesnotdone" != "" ] ; then
echo "Did NOT update the following branches:"
echo " $nsbranchesnotdone"
fi
echo ""
echo "Now would be a good time to run 'nssync'"
}
nspull() {
nscurrentbranch=`git branch | egrep '^\*' | sed 's/^..//'`
_ns_checkclean
if [ $NSCLEAN != 1 ]; then
return
fi
if [ "$1" = "--merge" ] ; then
mergeop="merge"
elif [ "$1" = "--rebase" ] ; then
mergeop="rebase"
elif [ "$1" != "" ]; then
echo "Unknown argument: $1"
exit 1
else
mergeop="merge"
fi
git fetch --all
for branch in $nsbranches ; do
git checkout $branch
MERGE_AUTOEDIT=no git $mergeop origin/$branch
if [ $? != 0 ] ; then
echo "git $mergeop failed; please fix first"
return
fi
done
git checkout $nscurrentbranch
}
nspush() {
_ns_checkclean
if [ $NSCLEAN != 1 ]; then
return
fi
git push origin $nsbranches
if [ $? != 0 ] ; then
echo "git push failed; help?"
return
fi
}
#
# pull/pushes all the known active branches
#
nssync() {
nspull "$@"
nspush "$@"
}
#
# runs the right version of autoconf for a given branch
#
# configure autoconf versions using --prefix=/usr/local/autoconf-VERSION
#
nsautoconf() {
if [ "$1" == "autoheader" ] ; then
tool="autoheader"
else
tool="autoconf"
fi
COR=`cat dist/autoconf-version`
PATH=/usr/local/autoconf-${COR}/bin:$PATH autoconf --version > /tmp/autoconf.version
VER=`head -1 /tmp/autoconf.version | awk '{print $NF}'`
if [ "$VER" != "$COR" ] ; then
echo "failed to find the correct version of autoconf"
echo "please install autoconf version $COR in /usr/local/autoconf-$COR"
echo " (configure autoconf-$COR using -prefix=/usr/local/autoconf-$COR"
return
fi
echo "RUNNING AUTOCONF $COR"
PATH=/usr/local/autoconf-${autover}/bin:$PATH $tool
}