diff --git a/buildroot/share/git/firstpush b/buildroot/share/git/firstpush index 0d8e71c79..60767f04b 100755 --- a/buildroot/share/git/firstpush +++ b/buildroot/share/git/firstpush @@ -6,11 +6,13 @@ # commit log to watch Travis CI progress. # -MFINFO=$(mfinfo) || exit +[[ $# == 0 ]] || { echo "Usage: `basename $0`" 1>&2 ; exit 1; } + +MFINFO=$(mfinfo) || exit 1 IFS=' ' read -a INFO <<< "$MFINFO" FORK=${INFO[1]} REPO=${INFO[2]} -BRANCH=${INFO[4]} +BRANCH=${INFO[5]} git push --set-upstream origin $BRANCH diff --git a/buildroot/share/git/mfadd b/buildroot/share/git/mfadd index 6d6912449..8b6ded366 100755 --- a/buildroot/share/git/mfadd +++ b/buildroot/share/git/mfadd @@ -5,20 +5,16 @@ # Add a remote and fetch it # -MFINFO=$(mfinfo) || exit +[[ $# == 1 ]] || { echo "Usage: `basename $0` user" 1>&2 ; exit 1; } -IFS=' ' read -a INFO <<< "$MFINFO" +USER=$1 +MFINFO=$(mfinfo) || exit 1 +IFS=' ' read -a INFO <<< "$MFINFO" REPO=${INFO[2]} -OLDBRANCH=${INFO[4]} - -case "$#" in - 1 ) USER=$1 ;; - * ) echo "Usage: `basename $0` [user]" 1>&2 ; exit 1 ;; -esac set -e echo "Adding and fetching $USER..." - -git remote add -f "$USER" "git@github.com:$USER/$REPO.git" +git remote add "$USER" "git@github.com:$USER/$REPO.git" +git fetch "$USER" diff --git a/buildroot/share/git/mfclean b/buildroot/share/git/mfclean index 4ce0faa8f..99fd227d2 100755 --- a/buildroot/share/git/mfclean +++ b/buildroot/share/git/mfclean @@ -21,9 +21,10 @@ echo "Pruning Remotely-deleted Branches..." git branch -vv | egrep -v "^\*|$KEEP" | grep ': gone]' | gawk '{print $1}' | xargs -n 1 git branch -D echo +# List fork branches that don't match local branches echo "You may want to remove (or checkout) these refs..." comm -23 \ <(git branch --all | sed 's/^[\* ] //' | grep origin/ | grep -v "\->" | awk '{ print $1; }' | sed 's/remotes\/origin\///') \ <(git branch --all | sed 's/^[\* ] //' | grep -v remotes/ | awk '{ print $1; }') \ - | awk '{ print "git branch -d -r origin/" $1; print "git checkout origin/" $1 " -b " $1; }' + | awk '{ print "git branch -d -r origin/" $1; print "git checkout origin/" $1 " -b " $1; print ""; }' echo diff --git a/buildroot/share/git/mfdoc b/buildroot/share/git/mfdoc index 4b28e9ca1..dde571dd0 100755 --- a/buildroot/share/git/mfdoc +++ b/buildroot/share/git/mfdoc @@ -5,16 +5,15 @@ # Start Jekyll in watch mode to work on Marlin Documentation and preview locally # -MFINFO=$(mfinfo "$@") || exit +[[ $# == 0 ]] || { echo "Usage: `basename $0`" 1>&2 ; exit 1; } + +MFINFO=$(mfinfo "$@") || exit 1 IFS=' ' read -a INFO <<< "$MFINFO" ORG=${INFO[0]} REPO=${INFO[2]} -BRANCH=${INFO[4]} +BRANCH=${INFO[5]} -if [[ $ORG != "MarlinFirmware" || $REPO != "MarlinDocumentation" ]]; then - echo "Wrong repository." - exit -fi +[[ $ORG == "MarlinFirmware" && $REPO == "MarlinDocumentation" ]] || { echo "Wrong repository." 1>&2; exit 1; } opensite() { TOOL=$(which gnome-open xdg-open open | awk '{ print $1 }') diff --git a/buildroot/share/git/mfinfo b/buildroot/share/git/mfinfo index e22744fe9..febbcc3ec 100755 --- a/buildroot/share/git/mfinfo +++ b/buildroot/share/git/mfinfo @@ -2,27 +2,25 @@ # # mfinfo # -# Get the following helpful git info about the working directory: +# Provide the following info about the working directory: # # - Remote (upstream) Org name (MarlinFirmware) # - Remote (origin) Org name (your Github username) -# - Repo Name (Marlin or MarlinDev) -# - Marlin Target branch (RCBugFix or dev) -# - Branch Name (the current branch or the one that was passed) +# - Repo Name (Marlin, MarlinDev, MarlinDocumentation) +# - PR Target branch (bugfix-1.1.x, dev, or master) +# - Branch Arg (the branch argument or current branch) +# - Current Branch # -REPO=$(git remote get-url upstream 2>/dev/null | sed -E 's/.*\/(.*)\.git/\1/') +CURR=$(git branch 2>/dev/null | grep ^* | sed 's/\* //g') +[[ -z $CURR ]] && { echo "No git repository here!" 1>&2 ; exit 1; } +[[ $CURR == "(no"* ]] && { echo "Git is busy with merge, rebase, etc." 1>&2 ; exit 1; } -if [[ -z $REPO ]]; then - echo "`basename $0`: No 'upstream' remote found." 1>&2 ; exit 1 -fi +REPO=$(git remote get-url upstream 2>/dev/null | sed -E 's/.*\/(.*)\.git/\1/') +[[ -z $REPO ]] && { echo "`basename $0`: No 'upstream' remote found. (Did you run mfinit?)" 1>&2 ; exit 1; } ORG=$(git remote get-url upstream 2>/dev/null | sed -E 's/.*[\/:](.*)\/.*$/\1/') - -if [[ $ORG != MarlinFirmware ]]; then - echo "`basename $0`: Not a Marlin repository." - exit 1 -fi +[[ $ORG == MarlinFirmware ]] || { echo "`basename $0`: Not a Marlin repository." 1>&2 ; exit 1; } case "$REPO" in Marlin ) TARG=bugfix-1.1.x ;; @@ -33,13 +31,9 @@ esac FORK=$(git remote get-url origin 2>/dev/null | sed -E 's/.*[\/:](.*)\/.*$/\1/') case "$#" in - 0 ) BRANCH=$(git branch 2>/dev/null | grep ^* | sed 's/\* //g') ;; + 0 ) BRANCH=$CURR ;; 1 ) BRANCH=$1 ;; * ) echo "Usage: `basename $0` [branch]" 1>&2 ; exit 1 ;; esac -if [[ $BRANCH == "(no" ]]; then - echo "Git is busy with merge, rebase, etc." 1>&2 ; exit 1 -fi - -echo "$ORG $FORK $REPO $TARG $BRANCH" +echo "$ORG $FORK $REPO $TARG $BRANCH $CURR" diff --git a/buildroot/share/git/mfinit b/buildroot/share/git/mfinit index 2a3791460..05bab8767 100755 --- a/buildroot/share/git/mfinit +++ b/buildroot/share/git/mfinit @@ -5,12 +5,13 @@ # Create the upstream remote for a forked repository # -REPO=$(git remote get-url origin 2>/dev/null | sed -E 's/.*\/(.*)\.git/\1/') +[[ $# == 0 ]] || { echo "Usage: `basename $0`" 1>&2 ; exit 1; } -if [[ -z $REPO ]]; then - echo "`basename $0`: No 'origin' remote found." 1>&2 ; exit 1 -fi +[[ -z $(git branch 2>/dev/null | grep ^* | sed 's/\* //g') ]] && { echo "No git repository here!" 1>&2 ; exit 1; } -git remote add upstream "git@github.com:MarlinFirmware/$REPO.git" +REPO=$(git remote get-url origin 2>/dev/null | sed -E 's/.*\/(.*)\.git/\1/') +[[ -z $REPO ]] && { echo "`basename $0`: No 'origin' remote found." 1>&2 ; exit 1; } -git fetch upstream \ No newline at end of file +echo "Adding 'upstream' remote for convenience." +git remote add upstream "git@github.com:MarlinFirmware/$REPO.git" +git fetch upstream diff --git a/buildroot/share/git/mfnew b/buildroot/share/git/mfnew index 42f233bf6..f1e495cbc 100755 --- a/buildroot/share/git/mfnew +++ b/buildroot/share/git/mfnew @@ -5,14 +5,15 @@ # Create a new branch from the default target with the given name # -MFINFO=$(mfinfo) || exit +[[ $# < 2 ]] || { echo "Usage: `basename $0` [branch]" 1>&2 ; exit 1; } + +MFINFO=$(mfinfo) || exit 1 IFS=' ' read -a INFO <<< "$MFINFO" TARG=${INFO[3]} case "$#" in 0 ) BRANCH=pr_for_$TARG-$(date +"%G-%m-%d_%H.%M.%S") ;; 1 ) BRANCH=$1 ;; - * ) echo "Usage: `basename $0` [branch]" 1>&2 ; exit 1 ;; esac git fetch upstream diff --git a/buildroot/share/git/mfpr b/buildroot/share/git/mfpr index eb2e102ae..025b68692 100755 --- a/buildroot/share/git/mfpr +++ b/buildroot/share/git/mfpr @@ -5,22 +5,22 @@ # Make a PR of the current branch against RCBugFix or dev # -MFINFO=$(mfinfo "$@") || exit +[[ $# < 2 ]] || { echo "Usage: `basename $0` [branch]" 1>&2 ; exit 1; } +MFINFO=$(mfinfo "$@") || exit 1 IFS=' ' read -a INFO <<< "$MFINFO" - ORG=${INFO[0]} FORK=${INFO[1]} REPO=${INFO[2]} TARG=${INFO[3]} BRANCH=${INFO[4]} +OLDBRANCH=${INFO[5]} -if [[ ! -z "$1" ]]; then { BRANCH=$1 ; git checkout $1 || exit 1; } fi +[[ $BRANCH == $TARG ]] && { echo "Can't create a PR from the PR Target ($BRANCH). Make a copy first." 1>&2 ; exit 1; } -if [[ $BRANCH == $TARG ]]; then - echo "Can't make a PR from $BRANCH" ; exit -fi +[[ $BRANCH != $OLDBRANCH ]] && { git checkout $BRANCH || exit 1; } +# See if it's been pushed yet if [ -z "$(git branch -vv | grep ^\* | grep \\[origin)" ]; then firstpush; fi TOOL=$(which gnome-open xdg-open open | awk '{ print $1 }') @@ -33,3 +33,5 @@ else echo "Opening a New PR Form..." "$TOOL" "$URL" fi + +[[ $BRANCH != $OLDBRANCH ]] && git checkout $OLDBRANCH diff --git a/buildroot/share/git/mfpub b/buildroot/share/git/mfpub index 9e590eb07..9b48480d0 100755 --- a/buildroot/share/git/mfpub +++ b/buildroot/share/git/mfpub @@ -9,7 +9,9 @@ # any permanent changes to 'master'. # -MFINFO=$(mfinfo "$@") || exit +[[ $# < 2 ]] || { echo "Usage: `basename $0` [branch]" 1>&2 ; exit 1; } + +MFINFO=$(mfinfo "$@") || exit 1 IFS=' ' read -a INFO <<< "$MFINFO" ORG=${INFO[0]} FORK=${INFO[1]} diff --git a/buildroot/share/git/mfqp b/buildroot/share/git/mfqp index 67a385c2e..97cac5dbe 100755 --- a/buildroot/share/git/mfqp +++ b/buildroot/share/git/mfqp @@ -5,26 +5,22 @@ # Add all changed files, commit as "patch", do `mfrb` and `git push -f` # -MFINFO=$(mfinfo) || exit -IFS=' ' read -a INFO <<< "$MFINFO" - -if [[ ${INFO[4]} == "(no" ]]; then - echo "Branch is unavailable!" ; exit 1 -fi +[[ $# == 0 ]] || { echo "Usage: `basename $0`" 1>&2 ; exit 1; } -case "$#" in - 0 ) ;; - * ) echo "Usage: `basename $0`" 1>&2 ; exit 1 ;; -esac +MFINFO=$(mfinfo) || exit 1 +IFS=' ' read -a INFO <<< "$MFINFO" +REPO=${INFO[2]} +TARG=${INFO[3]} +BRANCH=${INFO[5]} -git add * .travis.yml +git add . git commit -m "patch" -if [[ ${INFO[3]} == ${INFO[4]} ]]; then - if [[ ${INFO[2]} == "MarlinDocumentation" ]]; then +if [[ $BRANCH == $TARG ]]; then + if [[ $REPO == "MarlinDocumentation" ]]; then git rebase -i HEAD~2 else - echo "Don't alter the PR target branch."; exit 1 + echo "Don't alter the PR Target branch."; exit 1 fi else mfrb diff --git a/buildroot/share/git/mfrb b/buildroot/share/git/mfrb index 954556d0e..b376b4074 100755 --- a/buildroot/share/git/mfrb +++ b/buildroot/share/git/mfrb @@ -5,16 +5,15 @@ # Do "git rebase -i" against the "target" branch (RCBugFix or dev) # -MFINFO=$(mfinfo) || exit -IFS=' ' read -a INFO <<< "$MFINFO" +[[ $# == 0 ]] || { echo "Usage: `basename $0`" 1>&2 ; exit 1; } -case "$#" in - 0 ) ;; - * ) echo "Usage: `basename $0`" 1>&2 ; exit 1 ;; -esac +MFINFO=$(mfinfo) || exit 1 +IFS=' ' read -a INFO <<< "$MFINFO" +TARG=${INFO[3]} +BRANCH=${INFO[5]} # If the branch isn't currently the PR target -if [[ ${INFO[3]} != ${INFO[4]} ]]; then +if [[ $TARG != $BRANCH ]]; then git fetch upstream - git rebase upstream/${INFO[3]} && git rebase -i upstream/${INFO[3]} + git rebase upstream/$TARG && git rebase -i upstream/$TARG fi diff --git a/buildroot/share/git/mfup b/buildroot/share/git/mfup index 8d339c068..cb6abda9a 100755 --- a/buildroot/share/git/mfup +++ b/buildroot/share/git/mfup @@ -2,47 +2,55 @@ # # mfup # -# Fetch and merge upstream changes, optionally with a branch +# - Fetch latest upstream and replace the PR Target branch with +# - Rebase the (current or specified) branch on the PR Target +# - Force-push the branch to 'origin' +# - # -MFINFO=$(mfinfo) || exit +[[ $# < 2 ]] || { echo "Usage: `basename $0` [branch]" 1>&2 ; exit 1; } +MFINFO=$(mfinfo "$@") || exit 1 IFS=' ' read -a INFO <<< "$MFINFO" - ORG=${INFO[0]} FORK=${INFO[1]} REPO=${INFO[2]} TARG=${INFO[3]} -OLDBRANCH=${INFO[4]} - -case "$#" in - 0 ) BRANCH=$OLDBRANCH ;; - 1 ) BRANCH=$1 ;; - * ) echo "Usage: `basename $0` [branch]" 1>&2 ; exit 1 ;; -esac +BRANCH=${INFO[4]} +OLDBRANCH=${INFO[5]} set -e +# Prevent accidental loss of current changes +[[ $(git stash) != "No local "* ]] && HAS_STASH=1 + echo "Fetching upstream ($ORG/$REPO)..." git fetch upstream echo ; echo "Bringing $TARG up to date..." -git checkout -q $TARG || git branch checkout upstream/$TARG -b $TARG && git push --set-upstream origin $TARG -git merge upstream/$TARG -git push origin +if [[ git checkout -q $TARG ]]; then + git reset --hard upstream/$TARG + git push -f origin +else + git checkout upstream/$TARG -b $TARG + git push --set-upstream origin $TARG +fi if [[ $BRANCH != $TARG ]]; then echo ; echo "Rebasing $BRANCH on $TARG..." if git checkout $BRANCH; then echo if git rebase $TARG; then - git push -f ; echo - [[ $BRANCH != $OLDBRANCH ]] && git checkout $OLDBRANCH + git push -f else - echo "Looks like merge conflicts. Stopping here." + echo "Looks like merge conflicts. Stopping here." ; exit fi else - echo "No such branch!" ; echo - git checkout $OLDBRANCH + echo "No such branch!" fi fi + +echo +[[ $BRANCH != $OLDBRANCH ]] && git checkout $OLDBRANCH + +[[ $HAS_STASH == 1 ]] && git stash pop