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
+++ b/sys/src/cmd/git/log.c
@@ -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);