shithub: git9

Download patch

ref: cec38a6e09ce13a29ad85c217f1039e038a5dbd7
parent: 60d952cc1465ca99cc101be38f340a2f64550bdf
author: Ori Bernstein <ori@eigenstate.org>
date: Sat Jan 18 22:49:46 EST 2020

clean up handling of branch names and push -a

--- a/push
+++ b/push
@@ -24,10 +24,10 @@
 		shift
 		upstream=$1
 	case -a
-		sendall=true
+		branch=-b`$nl{cd .git/refs/heads && walk -f}
 	case -b
 		shift
-		branch=$1
+		branch=(-b$1 $branch)
 	case -r
 		shift
 		remove=(-r$1 $remove);
@@ -47,10 +47,9 @@
 	remote=$upstream
 if(~ $#remote 0)
 	die 'no idea where to push'
-if(~ $sendall '')
-	updates=`$nl{git/send $force -b $branch  $remove $remote || die $status}
-if not
-	updates=`$nl{git/send $force $remove -a $remote || die $status}
+if(~ $#branch 0)
+	die 'no branches'
+updates=`$nl{git/send $force $branch $remove $remote || die $status}
 
 for(ln in $updates){
 	u=`{echo $ln}
--- a/send.c
+++ b/send.c
@@ -33,7 +33,8 @@
 
 int sendall;
 int force;
-char *curbranch = "refs/heads/master";
+int nbranch;
+char **branch;
 char *removed[128];
 int nremoved;
 
@@ -246,28 +247,17 @@
 readours(Update **ret)
 {
 	Update *u, *r;
-	Hash *h;
-	int nd, nu, i;
+	int nu, i;
 	char *pfx;
-	Dir *d;
+	Hash *h;
 
 	nu = 0;
-	if(!sendall){
-		u = emalloc((nremoved + 1)*sizeof(Update));
-		snprint(u[nu].ref, sizeof(u[nu].ref), "%s", curbranch);
-		if(resolveref(&u[nu].ours, curbranch) == -1)
-			sysfatal("broken branch %s", curbranch);
+	u = emalloc((nremoved + nbranch)*sizeof(Update));
+	for(i = 0; i < nbranch; i++){
+		snprint(u[nu].ref, sizeof(u[nu].ref), "%s", branch[i]);
+		if(resolveref(&u[nu].ours, branch[i]) == -1)
+			sysfatal("broken branch %s", branch[i]);
 		nu++;
-	}else{
-		if((nd = slurpdir(".git/refs/heads", &d)) == -1)
-			sysfatal("read branches: %r");
-		u = emalloc((nremoved + nd)*sizeof(Update));
-		for(i = 0; i < nd; i++){
-			snprint(u[nu].ref, sizeof(u[nu].ref), "refs/heads/%s", d[nu].name);
-			if(resolveref(&u[nu].ours, u[nu].ref) == -1)
-				continue;
-			nu++;
-		}
 	}
 	for(i = 0; i < nremoved; i++){
 		pfx = "refs/heads/";
@@ -296,8 +286,7 @@
 	Update *upd, *u;
 	Object *a, *b;
 
-	if((nupd = readours(&upd)) == -1)
-		sysfatal("read refs: %r");
+	nupd = readours(&upd);
 	while(1){
 		n = readpkt(fd, buf, sizeof(buf));
 		if(n == -1)
@@ -410,13 +399,16 @@
 {
 	char proto[Nproto], host[Nhost], port[Nport];
 	char repo[Nrepo], path[Npath];
+	char *br;
 	int fd;
 
 	ARGBEGIN{
-	default:	usage();	break;
-	case 'a':	sendall++;	break;
-	case 'd':	chattygit++;	break;
-	case 'f':	force++;	break;
+	default:
+		usage();	break;
+	case 'd':
+		chattygit++;	break;
+	case 'f':
+		force++;	break;
 	case 'r':
 		if(nremoved == nelem(removed))
 			sysfatal("too many deleted branches");
@@ -423,7 +415,16 @@
 		removed[nremoved++] = EARGF(usage());
 		break;
 	case 'b':
-		curbranch = smprint("refs/%s", EARGF(usage()));
+		br = EARGF(usage());
+		if(strncmp(br, "refs/heads/", strlen("refs/heads/")) == 0)
+			br = smprint("%s", br);
+		else if(strncmp(br, "heads/", strlen("heads/")) == 0)
+			br = smprint("refs/%s", br);
+		else
+			br = smprint("refs/heads/%s", br);
+		branch = erealloc(branch, (nbranch + 1)*sizeof(char*));
+		branch[nbranch] = br;
+		nbranch++;
 		break;
 	}ARGEND;