shithub: git9

Download patch

ref: a6b7833442b430a1db521b0e2d18d2cda1763920
parent: a4bde0a775f6d7d1ddb2346e096df3591b3adbb7
author: Ori Bernstein <ori@eigenstate.org>
date: Fri Oct 9 11:45:34 EDT 2020

query: chdir to root of repo for queries

add util for repo finding, use it in git/query.

--- a/conf.c
+++ b/conf.c
@@ -35,25 +35,7 @@
 	return 0;
 }
 
-static void
-showroot(void)
-{
-	char path[256], buf[256], *p;
 
-	if((getwd(path, sizeof(path))) == nil)
-		sysfatal("could not get wd: %r");
-	while((p = strrchr(path, '/')) != nil){
-		snprint(buf, sizeof(buf), "%s/.git/HEAD", path);
-		if(access(buf, AEXIST) == 0){
-			print("%s\n", path);
-			return;
-		}
-		*p = '\0';
-	}
-	sysfatal("not a git repository");
-}
-
-
 void
 usage(void)
 {
@@ -66,7 +48,7 @@
 void
 main(int argc, char **argv)
 {
-	char *file[32], *p, *s;
+	char *file[32], repo[512], *p, *s;
 	int i, j, nfile, findroot;
 
 	nfile = 0;
@@ -77,8 +59,12 @@
 	default:	usage();			break;
 	}ARGEND;
 
-	if(findroot)
-		showroot();
+	if(findroot){
+		if(findrepo(repo, sizeof(repo)) == -1)
+			sysfatal("%r");
+		print("%s\n", repo);
+		exits(nil);
+	}
 	if(nfile == 0){
 		file[nfile++] = ".git/config";
 		if((p = getenv("home")) != nil)
--- a/git.h
+++ b/git.h
@@ -278,6 +278,7 @@
 int	hassuffix(char *, char *);
 int	swapsuffix(char *, int, char *, char *, char *);
 char	*strip(char *);
+int	findrepo(char *, int);
 
 /* packing */
 void	dtinit(Dtab *, void *, int);
--- a/query.c
+++ b/query.c
@@ -130,7 +130,7 @@
 	int i, j, n;
 	Hash *h;
 	char *p, *e, *s;
-	char query[2048];
+	char query[2048], repo[512];
 
 	ARGBEGIN{
 	case 'p':	fullpath++;	break;
@@ -139,6 +139,10 @@
 	}ARGEND;
 
 	gitinit();
+	if(findrepo(repo, sizeof(repo)) == -1)
+		sysfatal("find root: %r");
+	if(argc == 0)
+		usage();
 	fmtinstall('P', Pfmt);
 	s = "";
 	p = query;
--- a/util.c
+++ b/util.c
@@ -256,3 +256,25 @@
 	vfprint(2, fmt, ap);
 	va_end(ap);
 }
+
+/* Finds the directory containing the git repo. */
+int
+findrepo(char *buf, int nbuf)
+{
+	char *p, *suff;
+
+	suff = "/.git/HEAD";
+	if(getwd(buf, nbuf - strlen(suff) - 1) == nil)
+		return -1;
+
+	for(p = buf + strlen(buf); p != nil; p = strrchr(buf, '/')){
+		strcpy(p, suff);
+		if(access(buf, AEXIST) == 0){
+			*p = 0;
+			return 0;
+		}
+		*p = '\0';
+	}
+	werrstr("not a git repository");
+	return -1;
+}
--- a/walk.c
+++ b/walk.c
@@ -136,26 +136,6 @@
 	r->npath = o + 1;
 }
 
-static void
-findroot(void)
-{
-	char path[256], buf[256], *p;
-
-	if(access("/mnt/git/ctl", AEXIST) != 0)
-		sysfatal("no running git/fs");
-	if((getwd(path, sizeof(path))) == nil)
-		sysfatal("could not get wd: %r");
-	while((p = strrchr(path, '/')) != nil){
-		snprint(buf, sizeof(buf), "%s/.git", path);
-		if(access(buf, AEXIST) == 0){
-			chdir(path);
-			return;
-		}
-		*p = '\0';
-	}
-	sysfatal("not a git repository");
-}
-
 int
 sameqid(Dir *d, char *qf)
 {
@@ -224,7 +204,7 @@
 void
 main(int argc, char **argv)
 {
-	char *rpath, *tpath, *bpath, buf[8];
+	char *rpath, *tpath, *bpath, buf[8], repo[512];
 	char *p, *e;
 	int i, dirty;
 	Wres r;
@@ -254,7 +234,11 @@
 		usage();
 	}ARGEND
 
-	findroot();
+	if(access("/mnt/git/ctl", AEXIST) != 0)
+		sysfatal("no running git/fs");
+	if(findrepo(repo, sizeof(repo)) == -1)
+		sysfatal("find root: %r");
+	chdir(repo);
 	dirty = 0;
 	memset(&r, 0, sizeof(r));
 	if(access("/mnt/git/ctl", AEXIST) != 0)