ref: f633a247589b6de4b058f66ad6b014db57bad3dd
parent: 72621d62735fefe8bbcbf7308f6f271abe9c8f37
author: Ori Bernstein <ori@eigenstate.org>
date: Tue Oct 15 23:57:32 EDT 2019
Move branch update code into git/branch.
--- a/branch
+++ b/branch
@@ -6,6 +6,7 @@
echo usage: $0 '[-b base] [-o origin] new
-b base: use "base" for branch (default: current branch)
-o origin: use "origin" for remote branch
+ -u: update branch if it exists
new: name of new branch' >[1=2]
exit usage
}
@@ -18,14 +19,16 @@
nl='
'
-stay=''
-create=''
-cur=`{awk '$1=="branch"{print $2}' < /mnt/git/ctl}+stay=()
+create=()
+update=()
+base=`{awk '$1=="branch"{print $2}' < /mnt/git/ctl} while(~ $1 -* && ! ~ $1 --){ switch($1){case -c; create=true
case -s; stay=true
- case -o; origin=$1
+ case -b; shift; base=$1
+ case -u; update=true
case *
usage
}
@@ -34,14 +37,20 @@
if(~ $1 --) shift
if(~ $#* 0){- echo $cur
+ echo $base
exit
}
if(! ~ $#* 1)
usage
-new=$1
+if(~ $new refs/heads/*)
+ trim='s@^refs/heads/@@g'
+if not if(~ $new heads/*)
+ trim='s@^heads/@@g'
+if not
+ trim='s@^@@g'
+new=`{echo $1 | sed $trim}-if(~ $create ''){+if(~ $#create 0){ if(! test -e .git/refs/heads/$new){echo branch $new: does not exist >[1=2]
exit exists
@@ -48,12 +57,12 @@
}
}
if not{- if(test -e .git/refs/heads/$new){+ if(~ $#update 0 && test -e .git/refs/heads/$new){echo could not create $new: already exists >[1=2]
exit exists
}
- branched=''
- candidates=(.git/refs/$cur .git/refs/heads/$cur .git/refs/remotes/$cur .git/refs/remotes/*/$cur)
+ branched=()
+ candidates=(.git/refs/$base .git/refs/heads/$base .git/refs/remotes/$base .git/refs/remotes/*/$base)
for(br in $candidates){ if(test -f $br){echo 'creating new branch '$new
@@ -61,22 +70,39 @@
branched="ok"
}
}
- if(~ $branched ''){- echo 'could not find branch '$cur >[1=2]
+ if(~ $#branched 0){+ echo 'could not find branch '$base >[1=2]
exit notfound
}
}
-if(~ $stay ''){- rm -f `$nl{git/walk -cfT}- echo 'ref: refs/heads/'$new > .git/HEAD
- tree=/mnt/git/HEAD/tree
- @{builtin cd $tree && tar cif /fd/1 .} | @{tar xf /fd/0}- for(f in `$nl{walk -f $tree | sed 's@^'$tree'/*@@'}){- if(! ~ $#f 0){- idx=.git/index9/tracked/$f
- mkdir -p `{basename -d $idx}- walk -eq $f > $idx
- }
+if(! ~ $#stay 0)
+ exit
+
+modified=`$nl{git/query -c HEAD $base | grep '^[+~]' | sed 's/^..//'}+deleted=`$nl{git/query -c HEAD $base | grep '^-' | sed 's/^..//'}+echo here-- mod $#modified del $#deleted
+if(! ~ $#modified 0 || ! ~ $#deleted 0){+ if(! git/walk -q $modified $deleted){+ echo remote changes would clobber local changes >[1=2]
+ exit dirty
}
+}
+
+if(! ~ $#modified 0){+ # Modifications can turn a file into
+ # a directory, so we need to walk to
+ # check the blobs out correctly.
+ for(m in `{walk -f $modified}){+ gm=/mnt/git/HEAD/tree/$m
+ d=`{basename -d $m}+ mkdir -p $d
+ mkdir -p .git/index9/tracked/$d
+ cp $gm $m
+ walk -eq $m > .git/index9/tracked/$m
+ }
+}
+if(! ~ $#deleted 0){+ rm -f $deleted
+ rm -f .git/index9/tracked/$deleted
}
--- a/diff
+++ b/diff
@@ -24,12 +24,12 @@
if(~ $#branch 0)
branch=`{git/branch}-dirty=`{git/walk | awk '/^[MAR]/ {print $2}'}-if(! ~ $#* 0){- echo $dirty | sed 's/ /\n/g' | sort >/tmp/git.$pid.diff.dirty
- echo $* | sed 's/ /\n/g' | sort >/tmp/git.$pid.diff.args
- dirty=`{join /tmp/git.$pid.diff.dirty /tmp/git.$pid.diff.args}-}
+
+if(~ $#* 0)
+ dirty=`{git/walk -cfMAR}+if not
+ dirty=`{git/walk -cfMAR $*}+
for(f in $dirty){orig=/mnt/git/branch/$branch/tree/$f
if(! test -f $orig)
@@ -38,4 +38,3 @@
f=/dev/null
ape/diff -up $orig $f
}
-rm -f /tmp/git.$pid.diff.dirty /tmp/git.$pid.diff.args
--- a/pull
+++ b/pull
@@ -1,4 +1,4 @@
-#!/bin/rc -ex
+#!/bin/rc -e
rfork en
@@ -81,32 +81,19 @@
local=`{git/branch} remote=`{git/branch | sed 's@^(refs/)?heads@remotes/'$upstream'@'}-echo 'remote='$remote
-modified=`$nl{git/query -c HEAD $remote | grep '^[+~]' | sed 's/^..//'}-deleted=`$nl{git/query -c HEAD $remote | grep '^-' | sed 's/^..//'}-if(~ foo bar) { #! ~ $#modified 0 || ! ~ $#deleted 0){- if(! git/walk -q $modified $deleted){- echo remote changes would clobber local changes >[1=2]
- exit dirty
- }
-}
-
-cp .git/refs/$remote .git/refs/$local
-if(! ~ $#modified 0){- # Modifications can turn a file into
- # a directory, so we need to walk to
- # check the blobs out correctly.
- for(m in `{walk -f $modified}){- gm=/mnt/git/HEAD/tree/$m
- d=`{basename -d $m}- mkdir -p $d
- mkdir -p .git/index9/tracked/$d
- cp $gm $m
- walk -eq $m > .git/index9/tracked/$m
- }
+# we have local commits, but the remote hasn't changed.
+# in this case, we want to keep the local commits untouched.
+if(~ `{git/query HEAD $remote @} `{git/query $remote}){+ exit
}
-if(! ~ $#deleted 0){- rm -f $deleted
- rm -f .git/index9/tracked/$deleted
+# The remote repository and our HEAD have diverged: we
+# need to merge.
+if(! ~ `{git/query HEAD $remote @} `{git/query HEAD)+ echo git/merge $remote '# diverged' >[1=2]
+ exit merge
}
+
+# The remote is directly ahead of the local, and we have
+# no local commits that need merging.
+git/branch -u -b $remote $local
--
⑨