# these are helper functions for doing localized revision control.
# this script should be sourced into other scripts that use it.
+source "$FEISTY_MEOW_SCRIPTS/core/launch_feisty_meow.sh"
+source "$FEISTY_MEOW_SCRIPTS/tty/terminal_titler.sh"
+
+# the maximum depth that the recursive functions will try to go below the starting directory.
+export MAX_DEPTH=5
+
+#hmmm: re-address this code, since it doesn't make a lot of sense to me right now...
# one unpleasantry to take care of first; cygwin barfs aggressively if the TMP directory
-# is a DOS path, but we need it to be a DOS path for our XSEDE testing, so that blows.
+# is a DOS path, but we need it to be a DOS path for our GFFS testing, so that blows.
# to get past this, TMP gets changed below to a hopefully generic and safe place.
if [[ "$TMP" =~ .:.* ]]; then
export TMP=/tmp/rev_control_$USER
fi
if [ ! -d "$TMP" ]; then
- mkdir $TMP
+ mkdir -p $TMP
fi
if [ ! -d "$TMP" ]; then
- echo "Could not create the temporary directory TMP in: $TMP"
- echo "This script will not work properly without an existing TMP directory."
+ echo "could not create the temporary directory TMP in: $TMP"
+ echo "this script will not work properly without an existing TMP directory."
fi
this_host=
function do_checkin()
{
local directory="$1"; shift
+
+ save_terminal_title
+
+ do_update "$directory"
+ if [ $? -ne 0 ]; then
+ echo "repository update failed; this should be fixed before check-in."
+ return 1
+ fi
pushd "$directory" &>/dev/null
- retval=0 # normally successful.
- if [ -d "CVS" ]; then
+ local retval=0 # normally successful.
+ if [ -f ".no-checkin" ]; then
+ echo "skipping check-in due to presence of .no-checkin sentinel file."
+ elif [ -d "CVS" ]; then
cvs ci .
retval=$?
elif [ -d ".svn" ]; then
git push 2>&1 | grep -v "X11 forwarding request failed"
retval+=$?
else
- echo unknown repository for $directory...
+ echo no repository in $directory
retval=1
fi
popd &>/dev/null
+
+ restore_terminal_title
+
return $retval
}
function do_diff
{
local directory="$1"; shift
+
+ save_terminal_title
+
pushd "$directory" &>/dev/null
- retval=0 # normally successful.
+ local retval=0 # normally successful.
# only update if we see a repository living there.
if [ -d ".svn" ]; then
fi
popd &>/dev/null
+
+ restore_terminal_title
+
return $retval
}
+function do_report_new
+{
+ local directory="$1"; shift
+
+ save_terminal_title
+
+ pushd "$directory" &>/dev/null
+ local retval=0 # normally successful.
+
+ # only update if we see a repository living there.
+ if [ -f ".no-checkin" ]; then
+ echo "skipping reporting due to presence of .no-checkin sentinel file."
+ elif [ -d ".svn" ]; then
+ # this action so far only makes sense and is needed for svn.
+ bash $FEISTY_MEOW_SCRIPTS/rev_control/svnapply.sh \? echo
+ retval=$?
+ elif [ -d ".git" ]; then
+ git status -u
+ retval=$?
+ fi
+
+ popd &>/dev/null
+
+ restore_terminal_title
+
+ return $retval
+}
# checks in all the folders in a specified list.
function checkin_list()
{
- local list=$*
+echo list originally was: $*
+
+ # make the list of directories unique.
+ HOLDIFS="$IFS"
+ IFS=' '
+ local list="$(echo $* | uniq)"
+ IFS="$HOLDIFS"
+echo list became $list
+
+#hmmm: if above works, then it's needed in other places that
+# are passed lists.
+#hmmm: in fact, shouldn't it be a handy function of some sort for uniquifying lists?
+
+ save_terminal_title
+
for i in $list; do
# turn repo list back into an array.
eval "repository_list=( ${REPOSITORY_LIST[*]} )"
if [ ! -d "$j" ]; then continue; fi
echo "checking in '$j'..."
do_checkin $j
+ sep 7
done
done
+
+ restore_terminal_title
}
# takes out the first few carriage returns that are in the input.
function squash_first_few_crs()
{
i=0
- while read line; do
+ while read input_text; do
i=$((i+1))
- if [ $i -le 3 ]; then
- echo -n "$line "
+ if [ $i -le 5 ]; then
+ echo -n "$input_text "
else
- echo $line
+ echo $input_text
fi
done
if [ $i -le 3 ]; then
function do_update()
{
directory="$1"; shift
-
+
+ save_terminal_title
+
+ local retval=0 # plan on success for now.
pushd "$directory" &>/dev/null
if [ -d "CVS" ]; then
cvs update . | squash_first_few_crs
+ retval=${PIPESTATUS[0]}
elif [ -d ".svn" ]; then
svn update . | squash_first_few_crs
+ retval=${PIPESTATUS[0]}
elif [ -d ".git" ]; then
git pull 2>&1 | grep -v "X11 forwarding request failed" | squash_first_few_crs
+ retval=${PIPESTATUS[0]}
else
- echo unknown repository for $directory...
+ # this is not an error necessarily; we'll just pretend they planned this.
+ echo no repository in $directory
fi
popd &>/dev/null
+
+ restore_terminal_title
+
+ return $retval
}
# gets all the updates for a list of folders under revision control.
function checkout_list {
list=$*
+
+ save_terminal_title
+
for i in $list; do
# turn repo list back into an array.
eval "repository_list=( ${REPOSITORY_LIST[*]} )"
j="$i/$j"
if [ ! -d $j ]; then
if [ ! -z "$SHELL_DEBUG" ]; then
- echo "No directory called $j exists."
+ echo "no directory called $j exists."
fi
continue
fi
do_update $j
done
done
+
+ restore_terminal_title
}
# provides a list of absolute paths of revision control directories
{
local dir="$1"; shift
pushd "$dir" &>/dev/null
- local dirhere="$(\pwd)"
+ local dirhere="$( \cd "$(\dirname "$dir")" && /bin/pwd )"
local tempfile=$(mktemp /tmp/zz_rev_checkin.XXXXXX)
echo >$tempfile
- find $dirhere -maxdepth 3 -type d -iname ".svn" -exec echo {}/.. ';' >>$tempfile
- find $dirhere -maxdepth 3 -type d -iname ".git" -exec echo {}/.. ';' >>$tempfile
-#CVS is not well behaved, and we seldom use it anymore.
-# find $dirhere -maxdepth 3 -type d -iname "CVS" -exec echo {}/.. ';' >>$tempfile
+ find $dirhere -follow -maxdepth $MAX_DEPTH -type d -iname ".svn" -exec echo {}/.. ';' >>$tempfile 2>/dev/null
+ find $dirhere -follow -maxdepth $MAX_DEPTH -type d -iname ".git" -exec echo {}/.. ';' >>$tempfile 2>/dev/null
+ # CVS is not well behaved like git and (now) svn, and we seldom use it anymore.
popd &>/dev/null
- echo "$tempfile"
+ local sortfile=$(mktemp /tmp/zz_rev_checkin_sort.XXXXXX)
+ sort <"$tempfile" >"$sortfile"
+ \rm "$tempfile"
+ echo "$sortfile"
}
# iterates across a list of directories contained in a file (first parameter).
# on each directory name, it performs the action (second parameter) provided.
-function perform_action_on_file()
+function perform_revctrl_action_on_file()
{
+
+#hmmm: this doesn't capture any error returns!
+
local tempfile="$1"; shift
local action="$1"; shift
- dirs=($(cat $tempfile))
+ save_terminal_title
- for dirname in ${dirs[@]}; do
+ while read -u 3 dirname; do
if [ -z "$dirname" ]; then continue; fi
- pushd $dirname &>/dev/null
+ pushd "$dirname" &>/dev/null
echo "[$(pwd)]"
$action .
- echo "======="
+ sep 7
popd &>/dev/null
- done
+ done 3<"$tempfile"
+
+ restore_terminal_title
rm $tempfile
}