shithub: plan9front

Download patch

ref: eeb0f9a9dad1c09ba2c0985b1af2c99b1bebe4c1
parent: a87a4b763f58eb51ccfd5a9a394258c9398176aa
author: Ori Bernstein <ori@eigenstate.org>
date: Sun Jun 20 13:07:33 EDT 2021

git/log: handle absolute paths gracefully.

strip off the repo prefix if the path given
is absolute, and then look up as though it
was rooted in the repo.

--- a/sys/src/cmd/git/log.c	Sun Jun 20 10:59:10 2021
+++ b/sys/src/cmd/git/log.c	Sun Jun 20 13:07:33 2021
@@ -282,7 +282,7 @@
 main(int argc, char **argv)
 {
 	char path[1024], repo[1024], *p, *r;
-	int i;
+	int i, nrepo;
 
 	ARGBEGIN{
 	case 'e':
@@ -301,15 +301,21 @@
 
 	if(findrepo(repo, sizeof(repo)) == -1)
 		sysfatal("find root: %r");
+	nrepo = strlen(repo);
 	if(argc != 0){
 		if(getwd(path, sizeof(path)) == nil)
 			sysfatal("getwd: %r");
-		if(strlen(path) < strlen(repo))
-			sysfatal("path changed");
-		p = path + strlen(repo);
+		if(strncmp(path, repo, nrepo) != 0)
+			sysfatal("path shifted??");
+		p = path + nrepo;
 		pathfilt = emalloc(sizeof(Pfilt));
 		for(i = 0; i < argc; i++){
-			r = smprint("./%s/%s", p, argv[i]);
+			if(*argv[i] == '/'){
+				if(strncmp(argv[i], repo, nrepo) != 0)
+					continue;
+				r = smprint("./%s", argv[i]+nrepo);
+			}else
+				r = smprint("./%s/%s", p, argv[i]);
 			cleanname(r);
 			filteradd(pathfilt, r);
 			free(r);