shithub: git9

Download patch

ref: 0f064279e7a15c16894fb3527d96f78b0aa0f550
parent: da809634e9cb0668ff9d0a37b297a4720ab79086
author: Ori Bernstein <ori@eigenstate.org>
date: Tue Oct 22 14:04:53 EDT 2019

Switch branches correctly with git/branch.

--- a/branch
+++ b/branch
@@ -50,10 +50,15 @@
 if not
 	new=refs/heads/$1
 
-if(! ~ $#create 0){
+if(! git/walk -q `{git/query -c HEAD $base | sed 's/^..//g'}){
+	echo remote changes would clobber local changes >[1=2]
+	exit dirty
+}
+
+if(~ $#create 0){
 	if(! test -e .git/$new){
 		echo branch $new: does not exist >[1=2]
-		exit exists
+		exit noexist
 	}
 }
 if not{
@@ -76,31 +81,25 @@
 	}
 }
 
+modified=`$nl{git/query -c $new $base | grep '^[+~]' | sed 's/^..//'}
+deleted=`$nl{git/query -c $new $base | grep '^-' | sed 's/^..//'}
+
 if(! ~ $#stay 0)
 	exit
 
-
-modified=`$nl{git/query -c HEAD $base | grep '^[+~]' | sed 's/^..//'}
-deleted=`$nl{git/query -c HEAD $base | grep '^-' | sed 's/^..//'}
-
-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){
+	basedir=`{git/query -p $base}
 	# Modifications can turn a file into
 	# a directory, so we need to walk to
 	# check the blobs out correctly.
-	for(gm in `{cd /mnt/git/HEAD/tree/ && walk -f $modified}){
-		m=`{sed s@^/mnt/git/HEAD/tree/@@}
-		d=`{basename -d $m}
-		mkdir -p $d
-		mkdir -p .git/index9/tracked/$d
-		cp  $gm $m
-		walk -eq $m > .git/index9/tracked/$m
+	for(m in $modified){
+		if(test -f $basedir/tree/$m){
+			d=`{basename -d $m}
+			mkdir -p $d
+			mkdir -p .git/index9/tracked/$d
+			cp  $basedir/tree/$m $m
+			walk -eq $m > .git/index9/tracked/$m
+		}
 	}
 }
 if(! ~ $#deleted 0){
--- a/walk.c
+++ b/walk.c
@@ -150,10 +150,9 @@
 }
 
 int
-sameqid(char *f, char *qf)
+sameqid(Dir *d, char *qf)
 {
 	char indexqid[64], fileqid[64], *p;
-	Dir *d;
 	int fd, n;
 
 	if((fd = open(qf, OREAD)) == -1)
@@ -165,10 +164,9 @@
 	if((p = strpbrk(indexqid, "  \t\n\r")) != nil)
 		*p = 0;
 
-	if((d = dirstat(f)) == nil)
-		return -1;
 	snprint(fileqid, sizeof(fileqid), "%ullx.%uld.%.2uhhx",
-	    d->qid.path, d->qid.vers, d->qid.type);
+		d->qid.path, d->qid.vers, d->qid.type);
+
 	if(strcmp(indexqid, fileqid) == 0)
 		return 1;
 	return 0;
@@ -221,6 +219,7 @@
 	char *p, *e;
 	int i, dirty;
 	Wres r;
+	Dir *d;
 
 	ARGBEGIN{
 	case 'q':
@@ -276,7 +275,10 @@
 		snprint(rmpath, sizeof(rmpath), RDIR"/%s", p);
 		snprint(tpath, sizeof(tpath), TDIR"/%s", p);
 		snprint(bpath, sizeof(bpath), HDIR"/%s", p);
-		if(sameqid(p, tpath)){
+		d = dirstat(p);
+		if(d->mode & DMDIR)
+			goto next;
+		if(sameqid(d, tpath)){
 			if(!quiet && (printflg & Tflg))
 				print("%s%s\n", tstr, p);
 		}else if(access(p, AEXIST) != 0 || access(rmpath, AEXIST) == 0){
@@ -295,6 +297,8 @@
 			if(!quiet && (printflg & Tflg))
 				print("%s%s\n", tstr, p);
 		}
+next:
+		free(d);
 	}
 	if(!dirty)
 		exits(nil);