ref: 3858b49942afb68d29e1ad02e6210bc5aba84c6e
dir: /sys/src/cmd/git/branch/
#!/bin/rc -e rfork en . /sys/lib/git/common.rc gitup flagfmt='a:listall, b:baseref ref, d:delete, n:newbr, s:stay, m:merge' args='[branch]' eval `''{aux/getflags $*} || exec aux/usage modified=() deleted=() if(~ $#* 0){ if(~ $#listall 0) awk '$1=="branch"{print $2}' < /mnt/git/ctl if not cd .git/refs/ && walk -f heads remotes exit } if(! ~ $#* 1) exec aux/usage branch=$1 if(~ $branch refs/heads/*) new=$name if not if(~ $branch heads/*) new=refs/$branch if not new=refs/heads/$branch orig=`{git/query HEAD} if (~ $#baseref 1) base=`{git/query $baseref} || exit 'bad base' if not if(test -e .git/$new) base=`{git/query $new} if not base=`{git/query HEAD} modified=`$nl{git/query -c HEAD $base | grep '^[^-]' | subst '^..'} deleted=`$nl{git/query -c HEAD $base | grep '^-' | subst '^..'} if(! ~ $#modified 0 || ! ~ $#deleted 0 && ~ $#merge 0){ git/walk -fRMA $modified $deleted || die 'uncommited changes would be clobbered' } if(~ $delete 1){ rm -f .git/$new echo 'deleted branch' $new exit } if(~ $#newbr 0){ if(! ~ $#baseref 0) die update would clobber $branch with $baseref baseref=`$nl{echo -n $new | sed s@refs/heads/@refs/remotes/origin/@} if(! test -e .git/$new) if(! base=`{git/query $baseref}) die could not find branch $branch } commit=`{git/query $base} || die 'branch does not exist:' $base if(~ $new */*) mkdir -p .git/`{basename -d $new} echo $commit > .git/$new if(! ~ $#stay 0) exit basedir=`{git/query -p $base} dirtypaths=() cleanpaths=($modified $deleted) if(! ~ $#modified 0 || ! ~ $#deleted 0) dirtypaths=`$nl{git/walk -cfRMA $modified $deleted} if(! ~ $#dirtypaths 0){ x=$nl^$cleanpaths y=$nl^$dirtypaths cleanpaths=`$nl{echo $"x$nl$"y | sort | uniq -u} } for(m in $cleanpaths){ d=`{basename -d $m} mkdir -p $d mkdir -p .git/index9/tracked/$d # Modifications can turn a file into # a directory, or vice versa, so we # need to delete and copy the files # over. a=`{test -f $m && echo file || echo dir} b=`{test -f $basedir/tree/$m && echo file || echo dir} if(! ~ $a $b){ rm -rf $m rm -rf .git/index9/tracked/$m } if(test -f $basedir/tree/$m){ cp $basedir/tree/$m $m walk -eq $m > .git/index9/tracked/$m } } for(ours in $dirtypaths){ common=/mnt/git/object/$orig/tree/$ours theirs=/mnt/git/object/$base/tree/$ours merge1 $ours $ours $common $theirs } if(! ~ $#deleted 0){ rm -f $deleted rm -f .git/index9/tracked/$deleted } echo ref: $new > .git/HEAD exit ''