X-Git-Url: https://feistymeow.org/gitweb/?a=blobdiff_plain;f=scripts%2Frev_control%2Fversion_control.sh;h=c41f7cdded99575cf8737ba96b1383f860867527;hb=63ea779000a06dd59febb62501f0e97812037a31;hp=a42363020a7abc0a6a26d92a569991470c0f693f;hpb=effad3771ed1c45241578a2b075e4cdd0887209a;p=feisty_meow.git diff --git a/scripts/rev_control/version_control.sh b/scripts/rev_control/version_control.sh index a4236302..c41f7cdd 100644 --- a/scripts/rev_control/version_control.sh +++ b/scripts/rev_control/version_control.sh @@ -3,8 +3,15 @@ # 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 @@ -12,11 +19,11 @@ 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= @@ -89,7 +96,8 @@ function compute_modifier() if [ "$home_system" == "true" ]; then if [ "$in_or_out" == "out" ]; then # need the right home machine for modifier when checking out. - modifier="svn://shaggy/" +#huhhh? modifier="svn://shaggy/" + modifier= else # no modifier for checkin. modifier= @@ -101,25 +109,105 @@ function compute_modifier() 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 - if [ -d "CVS" ]; then cvs ci . ; - elif [ -d ".svn" ]; then svn ci . ; + 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 + svn ci . + retval=$? elif [ -d ".git" ]; then # snag all new files. not to everyone's liking. - git add . + git add --all . + retval=$? # tell git about all the files and get a check-in comment. git commit . + retval+=$? # upload the files to the server so others can see them. 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 + local retval=0 # normally successful. + + # only update if we see a repository living there. + if [ -d ".svn" ]; then + svn diff . + elif [ -d ".git" ]; then + git diff + elif [ -d "CVS" ]; then + cvs diff . + 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 { +function checkin_list() +{ local list=$* + + save_terminal_title + for i in $list; do # turn repo list back into an array. eval "repository_list=( ${REPOSITORY_LIST[*]} )" @@ -127,25 +215,25 @@ function checkin_list { # add in the directory component. j="$i/$j" if [ ! -d "$j" ]; then continue; fi - -# pushd $j &>/dev/null echo "checking in '$j'..." do_checkin $j -# popd &>/dev/null + 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 @@ -158,23 +246,37 @@ function squash_first_few_crs() 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[*]} )" @@ -183,7 +285,7 @@ function checkout_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 @@ -192,5 +294,53 @@ function checkout_list { do_update $j done done + + restore_terminal_title +} + +# provides a list of absolute paths of revision control directories +# that are located under the directory passed as the first parameter. +function generate_rev_ctrl_filelist() +{ + local dir="$1"; shift + pushd "$dir" &>/dev/null + local dirhere="$( \cd "$(\dirname "$dir")" && /bin/pwd )" + local tempfile=$(mktemp /tmp/zz_rev_checkin.XXXXXX) + 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 + 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_revctrl_action_on_file() +{ + +#hmmm: this doesn't capture any error returns! + + local tempfile="$1"; shift + local action="$1"; shift + + save_terminal_title + + while read -u 3 dirname; do + if [ -z "$dirname" ]; then continue; fi + pushd "$dirname" &>/dev/null + echo "[$(pwd)]" + $action . + sep 7 + popd &>/dev/null + done 3<"$tempfile" + + restore_terminal_title + + rm $tempfile } +