really close for simple powerups
[feisty_meow.git] / scripts / rev_control / version_control.sh
index fad415785f99d2c46294126a6994393b82d43db3..282dd4d922ff3bd9aa2708bbd34cca9760b679aa 100644 (file)
@@ -11,23 +11,6 @@ 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
 
@@ -43,15 +26,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.
@@ -80,84 +54,86 @@ function do_revctrl_checkin()
 {
   local directory="$1"; shift
 
+#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_revctrl_simple_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_revctrl_simple_update here.
-# how about pushing the do_revctrl_simple_update down into the two cases that use it and just not calling it for the git case?
-#hmmm: trying the better seeming approach below now.
+  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
       do_revctrl_simple_update "$directory"
       exit_on_error "updating repository; this issue should be fixed before check-in."
-      $blatt
-      cvs ci .
-      exit_on_error "cvs checkin"
+      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
       do_revctrl_simple_update "$directory"
       exit_on_error "updating repository; this issue should be fixed before check-in."
-      $blatt
-      svn ci .
-      exit_on_error "svn checkin"
+      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
 
-#hmmm: trying this in front; i have a bad feeling we used to do it like this and there were problems from not committing first!
-# a new set of steps we have to take to make sure the branch integrity is good.
-do_revctrl_careful_update "$(\pwd)"
+      # take steps to make sure the branch integrity is good and we're up to date against remote repos.
+      do_revctrl_careful_update "$(\pwd)"
 
-      $blatt
+      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"
+        # 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.
-#hold      do_revctrl_careful_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.
@@ -201,7 +177,7 @@ function do_revctrl_report_new
 
   # 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."
+    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
@@ -253,13 +229,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()
@@ -267,6 +236,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.
@@ -339,8 +315,8 @@ function do_revctrl_careful_update()
   if [ $nicedir == "." ]; then
     nicedir=$(\pwd)
   fi
-  local blatt="echo -e \ncarefully retrieving '$nicedir'..."
-  $blatt
+  local blatt_report="echo -e \ncarefully retrieving '$nicedir'..."
+  $blatt_report
 
   local this_branch="$(my_branch_name)"
 
@@ -359,7 +335,7 @@ function do_revctrl_careful_update()
   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"
@@ -369,9 +345,7 @@ function do_revctrl_careful_update()
     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"
@@ -383,10 +357,9 @@ function do_revctrl_careful_update()
 
   # 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 pull --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"
 
@@ -398,33 +371,33 @@ function do_revctrl_simple_update()
 {
   directory="$1"; shift
 
+#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