3 . /sys/lib/git/common.rc
7 flagfmt='a:listall, b:baseref ref, d:delete, n:newbr, s:stay, m:merge'
9 eval `''{aux/getflags $*} || exec aux/usage
16 awk '$1=="branch"{print $2}' < $gitfs/ctl
18 cd .git/refs/ && walk -f heads remotes
25 if(~ $branch refs/heads/*)
27 if not if(~ $branch heads/*)
30 new=refs/heads/$branch
32 orig=`{git/query HEAD}
34 base=`{git/query $baseref} || exit 'bad base'
35 if not if(~ $#newbr 0)
36 base=`{git/query $new}
38 base=`{git/query HEAD}
42 die update would clobber $branch with $baseref
43 baseref=`$nl{echo -n $new | sed s@refs/heads/@refs/remotes/origin/@}
44 if(! test -e .git/$new)
45 if(! base=`{git/query $baseref})
46 die could not find branch $branch
48 modified=`$nl{git/query -c HEAD $base | grep '^[^-]' | subst '^..'}
49 deleted=`$nl{git/query -c HEAD $base | grep '^-' | subst '^..'}
51 if(! ~ $#modified 0 || ! ~ $#deleted 0 && ~ $#merge 0){
52 git/walk -fRMA $modified $deleted ||
53 die 'uncommited changes would be clobbered'
57 echo 'deleted branch' $new
60 commit=`{git/query $base} || die 'branch does not exist:' $base
62 mkdir -p .git/`{basename -d $new}
64 echo $commit > .git/$new
67 basedir=`{git/query -p $base}
69 if(! ~ $#modified 0 || ! ~ $#deleted 0)
70 dirtypaths=`$nl{git/walk -cfRMA $modified $deleted}
71 if(! ~ $#modified 0 || ! ~ $#deleted 0)
72 dirtypaths=`$nl{git/walk -cfRMA $modified $deleted}
74 cleanpaths=($modified $deleted)
77 for(p in $modified $deleted)
78 if(! ~ $p $dirtypaths)
79 cleanpaths=($cleanpaths $p)
82 echo $commit > .git/$new
83 for(m in $cleanpaths){
84 d=`$nl{basename -d $m}
86 mkdir -p .git/index9/tracked/$d
87 # Modifications can turn a file into
88 # a directory, or vice versa, so we
89 # need to delete and copy the files
95 if(test -f $basedir/tree/$m)
99 rm -rf .git/index9/tracked/$m
102 if(cp -x -- $basedir/tree/$m $m)
103 walk -eq $m > .git/index9/tracked/$m
105 echo -n > .git/index9/tracked/$m
109 for(ours in $dirtypaths){
110 common=$gitfs/object/$orig/tree/$ours
111 theirs=$gitfs/object/$base/tree/$ours
112 merge1 $ours $ours $common $theirs
117 rm -f .git/index9/tracked/$deleted
120 echo ref: $new > .git/HEAD
121 echo $new: `{git/query $new}