X-Git-Url: https://feistymeow.org/gitweb/?a=blobdiff_plain;f=scripts%2Frev_control%2Fversion_control.sh;h=96a8558e8a1d7fa20864e18d5b4b58be38dfeeeb;hb=e6ce0aa508c3ad1beb167fdf20732b24f383c651;hp=f017a1e0bb2127319ea577c68c5722962b0dcea9;hpb=a96a113c134dfb31cebae4a1ac6db00a1d8af387;p=feisty_meow.git diff --git a/scripts/rev_control/version_control.sh b/scripts/rev_control/version_control.sh index f017a1e0..96a8558e 100644 --- a/scripts/rev_control/version_control.sh +++ b/scripts/rev_control/version_control.sh @@ -11,29 +11,15 @@ source "$FEISTY_MEOW_SCRIPTS/tty/terminal_titler.sh" ############## -# check git version to see if we can use autostash. -# this appears to be an ubuntu issue, where xenial did not provide it even though the -# feature appeared in git 2.6 and xenial claims it has git version 2.7.4. eventually, -# this version test can go away. -gitvertest="$(git version | sed -e 's/git version [0-9]\.//' | sed -e 's/\.[0-9][0-9]*$//' )" -if (( $gitvertest >= 11 )); then - # auto-stash is not available until 2.6 for git, but ubuntu is misreporting or using a - # differing version number somehow. we are sure autostash was missing on ubuntu xenial - # with git 2.7.4 and it's definitely present in zesty with git at 2.11. -# PULL_ADDITION='--rebase --autostash' -#although initially attractive, above set of flags seems to lose history we don't want to -#lose. -PULL_ADDITION= -fi - -############## - # the maximum depth that the recursive functions will try to go below the starting directory. export MAX_DEPTH=5 +# the name of our "don't check this stuff in" file. +export NO_CHECKIN=".no-checkin" + # use our splitter tool for lengthy output if it's available. -if [ ! -z "$(which splitter 2>/dev/null)" ]; then - TO_SPLITTER="$(which splitter)" +if [ ! -z "$(whichable splitter)" ]; then + TO_SPLITTER="$(whichable splitter)" # calculate the number of columsn in the terminal. cols=$(get_maxcols) TO_SPLITTER+=" --maxcol $(($cols - 1))" @@ -43,15 +29,6 @@ fi ############## -#hmmm: move this to core -# this makes the status of pipe N into the main return value. -function promote_pipe_return() -{ - ( exit ${PIPESTATUS[$1]} ) -} - -############## - # 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 GFFS testing, so that blows. # to get past this, TMP gets changed below to a hopefully generic and safe place. @@ -76,82 +53,90 @@ fi ############## # checks the directory provided into the revision control system repository it belongs to. -function do_checkin() +function do_revctrl_checkin() { local directory="$1"; shift - save_terminal_title - +#hmmm: another piece of reusable code, to process the directory for printing. # make a nice echoer since we want to use it inside conditions below. local nicedir="$directory" if [ $nicedir == "." ]; then nicedir=$(\pwd) fi - local blatt="echo -ne \nchecking in '$nicedir'... " - -#hmmm: we don't do a puff out on this directory to carefully update the git repo. is there a good reason why? -# we know we at least have to get the remote version synched up to avoid severe tire damage, so it's sensible at -# least to call do_update, but is there a reason not to call the careful git update instead? -#AHA, below we do call a careful git update, which is at least partially redundant with calling do_update here. -# how about pushing the do_update down into the two cases that use it and just not calling it for the git case? - do_update "$directory" - exit_on_error "updating repository; this issue should be fixed before check-in." + local blatt_report="echo -ne \nchecking in '$nicedir'... " + local tell_no_checkin="echo -ne \nskipping check-in due to presence of $NO_CHECKIN sentinel file: $nicedir" pushd "$directory" &>/dev/null - if [ -f ".no-checkin" ]; then - echo "skipping check-in due to presence of .no-checkin sentinel file." - elif [ -d "CVS" ]; then +#hmmm: overly elaborate sections below here, but we do want precise handling for git case. + if [ -d "CVS" ]; then if test_writeable "CVS"; then - $blatt - cvs ci . - exit_on_error "cvs checkin" + do_revctrl_simple_update "$directory" + exit_on_error "updating repository; this issue should be fixed before check-in." + if [ -f "$NO_CHECKIN" ]; then +# echo -ne "\nskipping check-in due to presence of $NO_CHECKIN sentinel file: $directory" + $tell_no_checkin + else + $blatt_report + cvs ci . + exit_on_error "cvs checkin" + fi fi elif [ -d ".svn" ]; then if test_writeable ".svn"; then - $blatt - svn ci . - exit_on_error "svn checkin" + do_revctrl_simple_update "$directory" + exit_on_error "updating repository; this issue should be fixed before check-in." + if [ -f "$NO_CHECKIN" ]; then +# echo -ne "\nskipping check-in due to presence of $NO_CHECKIN sentinel file: $directory" + $tell_no_checkin + else + $blatt_report + svn ci . + exit_on_error "svn checkin" + fi fi elif [ -d ".git" ]; then if test_writeable ".git"; then - $blatt - # put all changed and new files in the commit. not to everyone's liking. - git add --all . | $TO_SPLITTER - promote_pipe_return 0 - exit_on_error "git add all new files" + # take steps to make sure the branch integrity is good and we're up to date against remote repos. + do_revctrl_careful_update "$(\pwd)" + + if [ -f "$NO_CHECKIN" ]; then +# echo -ne "\nskipping check-in due to presence of $NO_CHECKIN sentinel file: $directory" + $tell_no_checkin + else + $blatt_report + + # put all changed and new files in the commit. not to everyone's liking. + git add --all . | $TO_SPLITTER + promote_pipe_return 0 + exit_on_error "git add all new files" -#hmmm: was there a reason to commit before doing the puffing out careful git update? i seem to think there was. -# would be nice to remember that or recapture the reason, so we can be sure we're not committing too early. - # see if there are any changes in the local repository. - if ! git diff-index --quiet HEAD --; then - # tell git about all the files and get a check-in comment. + # see if there are any changes in the local repository. + if ! git diff-index --quiet HEAD --; then + # tell git about all the files and get a check-in comment. #hmmm: begins to look like, you guessed it, a reusable bit that all commit actions could enjoy. - git commit . - retval=$? - continue_on_error "git commit" - if [ $retval -ne 0 ]; then - echo -e -n "Commit failed or was aborted:\nShould we continue with other check-ins? [y/N] " - local line - read line - if [[ "${line:0:1}" != "y" ]]; then - echo "Stopping check-in process due to missing commit and user request." - exit 1 + git commit . + retval=$? + continue_on_error "git commit" + if [ $retval -ne 0 ]; then + echo -e -n "Commit failed or was aborted:\nShould we continue with other check-ins? [y/N] " + local line + read line + if [[ "${line:0:1}" != "y" ]]; then + echo "Stopping check-in process due to missing commit and user request." + exit 1 + fi fi fi - fi - - # a new set of steps we have to take to make sure the branch integrity is good. - do_careful_git_update "$(\pwd)" - # we continue on to the push, even if there were no changes this time, because - # there could already be committed changes that haven't been pushed yet. - - # upload any changes to the upstream repo so others can see them. - git push --tags origin "$(my_branch_name)" 2>&1 | grep -v "X11 forwarding request failed" | $TO_SPLITTER - promote_pipe_return 0 - exit_on_error "git push" + # we continue on to the push, even if there were no obvious changes this run, because + # there could already be committed changes that haven't been pushed yet. + # upload any changes to the upstream repo so others can see them. + git push --tags origin "$(my_branch_name)" 2>&1 | grep -v "X11 forwarding request failed" | $TO_SPLITTER + promote_pipe_return 0 + exit_on_error "git push" + fi fi else # nothing there. it's not an error though. @@ -159,18 +144,14 @@ function do_checkin() fi popd &>/dev/null - restore_terminal_title - return 0 } # shows the local changes in a repository. -function do_diff +function do_revctrl_diff { local directory="$1"; shift - save_terminal_title - pushd "$directory" &>/dev/null # only update if we see a repository living there. @@ -178,7 +159,7 @@ function do_diff svn diff . exit_on_error "subversion diff" elif [ -d ".git" ]; then - git diff + git --no-pager diff exit_on_error "git diff" elif [ -d "CVS" ]; then cvs diff . @@ -187,23 +168,19 @@ function do_diff popd &>/dev/null - restore_terminal_title - return 0 } # reports any files that are not already known to the upstream repository. -function do_report_new +function do_revctrl_report_new { local directory="$1"; shift - save_terminal_title - pushd "$directory" &>/dev/null # 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." + if [ -f "$NO_CHECKIN" ]; then + echo -ne "\nskipping reporting due to presence of $NO_CHECKIN sentinel file: $directory" 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 @@ -215,8 +192,6 @@ function do_report_new popd &>/dev/null - restore_terminal_title - return 0 } @@ -226,8 +201,6 @@ function checkin_list() # make the list of directories unique. local list="$(uniquify $*)" - save_terminal_title - # turn repo list back into an array. eval "repository_list=( ${REPOSITORY_LIST[*]} )" @@ -238,22 +211,18 @@ function checkin_list() if [[ $outer =~ /.* ]]; then # yep, this path is absolute. just handle it directly. if [ ! -d "$outer" ]; then continue; fi - do_checkin "$outer" + do_revctrl_checkin "$outer" exit_on_error "running check-in (absolute) on path: $outer" -# sep 28 else for inner in $list; do # add in the directory component to see if we can find the folder. local path="$inner/$outer" if [ ! -d "$path" ]; then continue; fi - do_checkin "$path" + do_revctrl_checkin "$path" exit_on_error "running check-in (relative) on path: $path" -# sep 28 done fi done - - restore_terminal_title } #hmmm: below functions are git specific and should be named that way. @@ -263,13 +232,6 @@ function all_branch_names() echo "$(git branch -vv | cut -d ' ' -f2)" } -# a helpful method that reports the git branch for the current directory's -# git repository. -function my_branch_name() -{ - echo "$(git branch -vv | grep '\*' | cut -d ' ' -f2)" -} - #this had a -> in it at one point for not matching, didn't it? # this reports the upstream branch for the current repo. ##function parent_branch_name() @@ -277,6 +239,13 @@ function my_branch_name() ##echo "$(git branch -vv | grep \* | cut -d ' ' -f2)" ##} +# a helpful method that reports the git branch for the current directory's +# git repository. +function my_branch_name() +{ + echo "$(git branch -vv | grep '\*' | cut -d ' ' -f2)" +} + # reports the status of the branch by echoing one of these values: # okay: up to date and everything is good. # needs_pull: this branch needs to be pulled from origins. @@ -294,9 +263,9 @@ function check_branch_state() local to_return=120 # unknown issue. - local local_branch=$(git rev-parse @) + local local_branch=$(git rev-parse HEAD) local remote_branch=$(git rev-parse "$branch") - local merge_base=$(git merge-base @ "$branch") + local merge_base=$(git merge-base HEAD "$branch") local to_echo= if [ "$local_branch" == "$remote_branch" ]; then @@ -314,6 +283,23 @@ function check_branch_state() return $to_return } +# showes the branch currently active in the repository. +function show_active_branch() +{ +#hmmm: if no args, assume current dir! + + for directory in "$@"; do + echo -n "active branch for '$directory': " + pushd "$directory" &>/dev/null + +#hmmm: if git... + git rev-parse --abbrev-ref HEAD +#hmmm: else OTHERS!!! + + popd &>/dev/null + done +} + # only shows the branch state if it's not okay. # note that this is not the same as a conditional branch (ha ha). function show_branch_conditionally() @@ -329,7 +315,7 @@ function show_branch_conditionally() # the git update process just gets more and more complex when you bring in # branches, so we've moved this here to avoid having a ton of code in the # other methods. -function do_careful_git_update() +function do_revctrl_careful_update() { local directory="$1"; shift pushd "$directory" &>/dev/null @@ -338,8 +324,8 @@ function do_careful_git_update() if [ ! -d ".git" ]; then # not a git project, so just boil this down to a getem action. popd &>/dev/null -echo "special case; not doing careful git update on non git repository: $directory" - do_update "$directory" + log_feisty_meow_event "skipping careful part and doing simple update on non-git repository: $directory" + do_revctrl_simple_update "$directory" return $? fi @@ -349,8 +335,8 @@ echo "special case; not doing careful git update on non git repository: $directo if [ $nicedir == "." ]; then nicedir=$(\pwd) fi - local blatt="echo -e \nretrieving '$nicedir'..." - $blatt + local blatt_report="echo -e \ncarefully retrieving '$nicedir'..." + $blatt_report local this_branch="$(my_branch_name)" @@ -369,7 +355,7 @@ echo "special case; not doing careful git update on non git repository: $directo local branch_list=$(all_branch_names) local bran for bran in $branch_list; do -# echo "synchronizing remote branch: $bran" + log_feisty_meow_event "synchronizing remote branch: $bran" git checkout "$bran" | $TO_SPLITTER promote_pipe_return 0 exit_on_error "git switching checkout to remote branch: $bran" @@ -379,9 +365,7 @@ echo "special case; not doing careful git update on non git repository: $directo remote_branch_info=$(git ls-remote --heads origin $bran 2>/dev/null) if [ ! -z "$remote_branch_info" ]; then # we are pretty sure the remote branch does exist. - git pull --tags $PULL_ADDITION origin "$bran" | $TO_SPLITTER -# we may want to choose to do fast forward, to avoid crazy multiple merge histories -# without any changes in them. --no-ff + git pull --tags origin "$bran" | $TO_SPLITTER promote_pipe_return 0 fi exit_on_error "git pull of remote branch: $bran" @@ -393,10 +377,9 @@ echo "special case; not doing careful git update on non git repository: $directo # now pull down any changes in our own origin in the repo, to stay in synch # with any changes from others. - git pull --tags $PULL_ADDITION --all | $TO_SPLITTER + git fetch --tags --all | $TO_SPLITTER #is the above really important when we did this branch already in the loop? #it does an --all, but is that effective or different? should we be doing that in above loop? -# --no-ff promote_pipe_return 0 exit_on_error "git pulling all upstream" @@ -404,39 +387,37 @@ echo "special case; not doing careful git update on non git repository: $directo } # gets the latest versions of the assets from the upstream repository. -function do_update() +function do_revctrl_simple_update() { directory="$1"; shift - save_terminal_title - +#hmmm: another piece of reusable code, to process the directory for printing. # make a nice echoer since we want to use it inside conditions below. local nicedir="$directory" if [ $nicedir == "." ]; then nicedir=$(\pwd) fi - local blatt="echo -e \nretrieving '$nicedir'..." + local blatt_report="echo -e \nretrieving '$nicedir'..." pushd "$directory" &>/dev/null if [ -d "CVS" ]; then if test_writeable "CVS"; then - $blatt + $blatt_report cvs update . | $TO_SPLITTER promote_pipe_return 0 exit_on_error "cvs update" fi elif [ -d ".svn" ]; then if test_writeable ".svn"; then - $blatt + $blatt_report svn update . | $TO_SPLITTER promote_pipe_return 0 exit_on_error "svn update" fi elif [ -d ".git" ]; then if test_writeable ".git"; then - $blatt - git pull --tags $PULL_ADDITION 2>&1 | grep -v "X11 forwarding request failed" | $TO_SPLITTER -#ordinary pulls should be allowed to do fast forward: --no-ff + $blatt_report + git pull --tags 2>&1 | grep -v "X11 forwarding request failed" | $TO_SPLITTER promote_pipe_return 0 exit_on_error "git pull of origin" fi @@ -446,8 +427,6 @@ function do_update() fi popd &>/dev/null - restore_terminal_title - return 0 } @@ -456,8 +435,6 @@ function checkout_list() { local list="$(uniquify $*)" - save_terminal_title - # turn repo list back into an array. eval "repository_list=( ${REPOSITORY_LIST[*]} )" @@ -468,22 +445,18 @@ function checkout_list() if [[ $outer =~ /.* ]]; then # yep, this path is absolute. just handle it directly. if [ ! -d "$outer" ]; then continue; fi - do_update $outer + do_revctrl_simple_update $outer exit_on_error "running update on: $path" -# sep 28 else for inner in $list; do # add in the directory component to see if we can find the folder. local path="$inner/$outer" if [ ! -d "$path" ]; then continue; fi - do_update $path + do_revctrl_simple_update $path exit_on_error "running update on: $path" -# sep 28 done fi done - - restore_terminal_title } # does a careful update on all the folders in the specified list; @@ -495,8 +468,6 @@ function puff_out_list() # make the list of directories unique. local list="$(uniquify $*)" - save_terminal_title - # turn repo list back into an array. eval "repository_list=( ${REPOSITORY_LIST[*]} )" @@ -508,22 +479,18 @@ function puff_out_list() if [[ $outer =~ /.* ]]; then # yep, this path is absolute. just handle it directly. if [ ! -d "$outer" ]; then continue; fi - do_careful_git_update "$outer" + do_revctrl_careful_update "$outer" exit_on_error "running puff-out (absolute) on path: $outer" -# sep 28 else for inner in $list; do # add in the directory component to see if we can find the folder. local path="$inner/$outer" if [ ! -d "$path" ]; then continue; fi - do_careful_git_update "$path" + do_revctrl_careful_update "$path" exit_on_error "running puff-out (relative) on path: $path" -# sep 28 done fi done - - restore_terminal_title } # provides a list of absolute paths of revision control directories @@ -559,8 +526,6 @@ function perform_revctrl_action_on_file() local tempfile="$1"; shift local action="$1"; shift - save_terminal_title - local did_anything= while read -u 3 dirname; do @@ -574,7 +539,6 @@ function perform_revctrl_action_on_file() # pass the current directory plus the remaining parameters from function invocation. $action . exit_on_error "performing action $action on: $(pwd)" -# sep 28 popd &>/dev/null done 3<"$tempfile" @@ -582,8 +546,6 @@ function perform_revctrl_action_on_file() echo "There was nothing to do the action '$action' on." fi - restore_terminal_title - rm "$tempfile" }