]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/git/branch
git/branch: make '-n' use HEAD when '-b' unspecified
[plan9front.git] / sys / src / cmd / git / branch
1 #!/bin/rc -e
2 rfork en
3 . /sys/lib/git/common.rc
4
5 gitup
6
7 flagfmt='a:listall, b:baseref ref, d:delete, n:newbr, s:stay, m:merge'
8 args='[branch]'
9 eval `''{aux/getflags $*} || exec aux/usage
10
11 modified=()
12 deleted=()
13
14 if(~ $#* 0){
15         if(~ $#listall 0)
16                 awk '$1=="branch"{print $2}' < $gitfs/ctl
17         if not
18                 cd .git/refs/ && walk -f heads remotes
19         exit
20 }
21 if(! ~ $#* 1)
22         exec aux/usage
23
24 branch=$1
25 if(~ $branch refs/heads/*)
26         new=$name
27 if not if(~ $branch heads/*)
28         new=refs/$branch
29 if not
30         new=refs/heads/$branch
31
32 orig=`{git/query HEAD}
33 if (~ $#baseref 1)
34         base=`{git/query $baseref} || exit 'bad base'
35 if not if(~ $#newbr 0)
36         base=`{git/query $new}
37 if not
38         base=`{git/query HEAD}
39
40 if(~ $#newbr 0){
41         if(! ~ $#baseref 0)
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
47 }
48 modified=`$nl{git/query -c HEAD $base | grep '^[^-]' | subst '^..'}
49 deleted=`$nl{git/query -c HEAD $base | grep '^-' | subst '^..'}
50
51 if(! ~ $#modified 0 || ! ~ $#deleted 0 && ~ $#merge 0){
52         git/walk -fRMA $modified $deleted || 
53                 die 'uncommited changes would be clobbered'
54 }
55 if(~ $delete 1){
56         rm -f .git/$new
57         echo 'deleted branch' $new
58         exit
59 }
60 commit=`{git/query $base} || die 'branch does not exist:' $base
61 if(~ $new */*)
62         mkdir -p .git/`{basename -d $new}
63 if(! ~ $#stay 0){
64         echo $commit > .git/$new
65         exit
66 }
67 basedir=`{git/query -p $base}
68 dirtypaths=()
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}
73 if(~ $#dirtypaths 0)
74         cleanpaths=($modified $deleted)
75 if not {
76         cleanpaths=()
77         for(p in $modified $deleted)
78                 if(! ~ $p $dirtypaths)
79                         cleanpaths=($cleanpaths $p)
80 }
81
82 echo $commit > .git/$new
83 for(m in $cleanpaths){
84         d=`$nl{basename -d $m}
85         mkdir -p $d
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
90         # over.
91         a=dir
92         b=dir
93         if(test -f $m)
94                 a=file
95         if(test -f $basedir/tree/$m)
96                 b=file
97         if(! ~ $a $b){
98                 rm -rf $m
99                 rm -rf .git/index9/tracked/$m
100         }
101         if(~ $b file){
102                 if(cp -x -- $basedir/tree/$m $m)
103                         walk -eq $m > .git/index9/tracked/$m
104                 if not
105                         echo -n > .git/index9/tracked/$m
106         }
107 }
108
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
113 }
114
115 if(! ~ $#deleted 0){
116         rm -f $deleted
117         rm -f .git/index9/tracked/$deleted
118 }
119
120 echo ref: $new > .git/HEAD
121 echo $new: `{git/query $new}
122 exit ''