From 12e952e684d149628360b6fcdb583be86052f944 Mon Sep 17 00:00:00 2001 From: Ori Bernstein Date: Sun, 30 May 2021 17:46:21 -0700 Subject: [PATCH] git/fs: move mount point to $repo/.git/fs Moving the mount point to within the repo directory means that we can have multiple git repos mounted at once with no conflict. --- sys/lib/git/common.rc | 7 +++++-- sys/man/1/git | 13 ++++++++++--- sys/man/4/gitfs | 4 ++-- sys/src/cmd/git/add | 2 +- sys/src/cmd/git/branch | 6 +++--- sys/src/cmd/git/clone | 3 ++- sys/src/cmd/git/commit | 12 ++++++------ sys/src/cmd/git/fs.c | 15 +++++++++++---- sys/src/cmd/git/import | 4 ++-- sys/src/cmd/git/merge | 6 +++--- sys/src/cmd/git/query.c | 6 ++++-- sys/src/cmd/git/rebase | 2 +- sys/src/cmd/git/revert | 2 +- sys/src/cmd/git/walk.c | 8 +++----- 14 files changed, 54 insertions(+), 36 deletions(-) diff --git a/sys/lib/git/common.rc b/sys/lib/git/common.rc index 573612712..dbcef04bf 100644 --- a/sys/lib/git/common.rc +++ b/sys/lib/git/common.rc @@ -75,14 +75,17 @@ fn gitup{ gitroot=`{git/conf -r >[2]/dev/null} if(~ $#gitroot 0) die 'not a git repository' + gitfs=$gitroot/.git/fs gitrel=`{pwd | subst '^'$"gitroot'/?'} if(~ $#gitrel 0) gitrel='.' cd $gitroot startfs=() - if(! test -e /mnt/git/ctl) + if(! test -d $gitfs) + mkdir -p $gitfs + if(! test -e $gitfs/ctl) startfs=true - if(! grep -s '^repo '$gitroot'$' /mnt/git/ctl >[2]/dev/null) + if(! grep -s '^repo '$gitroot'$' $gitfs/ctl >[2]/dev/null) startfs=true if(~ $#startfs 1) git/fs diff --git a/sys/man/1/git b/sys/man/1/git index 7b04c037b..ad903a44d 100644 --- a/sys/man/1/git +++ b/sys/man/1/git @@ -18,7 +18,7 @@ git/pull, git/rm, git/serve .PP .B git/branch [ -.B -adns +.B -admns ] [ .B -b @@ -211,7 +211,7 @@ This suite of tools provides a file interface to the .I .git directory mounted on -.I /mnt/git. +.I $repo/.git/fs. Modifications to the repository are done directly to the .I .git directory, and are reflected in the file system interface. @@ -304,7 +304,7 @@ flag serves repositories relative to .PP .B Git/fs -serves a file system on /mnt/git. +serves a file system on $repo/.git/fs. For full documentation, see .IR gitfs (4) @@ -363,6 +363,13 @@ option, the branch is created but the files are not checked out. When passed the .I -d option, the branch is deleted. +.PP +When switching branches, git/branch will refuse to clobber +modificiations. +Passing the +.I -m +option will cause git9 to attempt to merge the changes between +the branches. .PP .B Git/log diff --git a/sys/man/4/gitfs b/sys/man/4/gitfs index 00c68edc3..7ba097ad0 100644 --- a/sys/man/4/gitfs +++ b/sys/man/4/gitfs @@ -20,7 +20,7 @@ Git/fs serves a file system interface to a git repository in the current directory. This file system provides a read-only view into the repository contents. By default, it is mounted on -.B /mnt/git. +.B $repo/.git/fs. It does not cache mutable data, so any changes to the git repository will immediately be reflected in git/fs. .PP @@ -83,7 +83,7 @@ The git repository being expected. .B .git/HEAD A reference to the current HEAD. Used to populate -.B /mnt/git/HEAD +.B $repo/.git/fs/HEAD .TP .git/config The per-repository configuation for git tools. diff --git a/sys/src/cmd/git/add b/sys/src/cmd/git/add index cfe08ddaa..9b79d766b 100755 --- a/sys/src/cmd/git/add +++ b/sys/src/cmd/git/add @@ -31,7 +31,7 @@ for(f in $files){ # git/walk doesn't think this came from # a checkout. if(! test -e $addpath) - if(~ $add 'tracked' || test -e /mnt/git/HEAD/tree/$f) + if(~ $add 'tracked' || test -e $gitfs/HEAD/tree/$f) touch $addpath rm -f $delpath } diff --git a/sys/src/cmd/git/branch b/sys/src/cmd/git/branch index b4dac7162..f2656f2fa 100755 --- a/sys/src/cmd/git/branch +++ b/sys/src/cmd/git/branch @@ -13,7 +13,7 @@ deleted=() if(~ $#* 0){ if(~ $#listall 0) - awk '$1=="branch"{print $2}' < /mnt/git/ctl + awk '$1=="branch"{print $2}' < $gitfs/ctl if not cd .git/refs/ && walk -f heads remotes exit @@ -95,8 +95,8 @@ for(m in $cleanpaths){ } for(ours in $dirtypaths){ - common=/mnt/git/object/$orig/tree/$ours - theirs=/mnt/git/object/$base/tree/$ours + common=$gitfs/object/$orig/tree/$ours + theirs=$gitfs/object/$base/tree/$ours merge1 $ours $ours $common $theirs } diff --git a/sys/src/cmd/git/clone b/sys/src/cmd/git/clone index 52346e3b3..47043d573 100755 --- a/sys/src/cmd/git/clone +++ b/sys/src/cmd/git/clone @@ -23,6 +23,7 @@ if(test -e $local) fn clone{ flag +e mkdir -p $local/.git + mkdir -p $local/.git/fs mkdir -p $local/.git/objects/pack/ mkdir -p $local/.git/refs/heads/ @@ -76,7 +77,7 @@ fn clone{ } '} |[3] tr '\x0d' '\x0a' || die 'could not clone repository' - tree=/mnt/git/HEAD/tree + tree=.git/fs/HEAD/tree lbranch=`{git/branch} rbranch=`{echo $lbranch | subst '^heads' 'remotes/origin'} echo checking out repository... diff --git a/sys/src/cmd/git/commit b/sys/src/cmd/git/commit index 7b754bb38..bcbe3b1c4 100755 --- a/sys/src/cmd/git/commit +++ b/sys/src/cmd/git/commit @@ -19,15 +19,15 @@ fn whoami{ fn findbranch{ branch=`{git/branch} - if(test -e /mnt/git/branch/$branch/tree){ + if(test -e $gitfs/branch/$branch/tree){ refpath=.git/refs/$branch initial=false } - if not if(test -e /mnt/git/object/$branch/tree){ + if not if(test -e $gitfs/object/$branch/tree){ refpath=.git/HEAD initial=false } - if not if(! test -e /mnt/git/HEAD/tree){ + if not if(! test -e $gitfs/HEAD/tree){ refpath=.git/refs/$branch initial=true } @@ -79,7 +79,7 @@ fn editmsg{ fn parents{ if(! ~ $#revise 0) - parents=`{cat /mnt/git/HEAD/parent} + parents=`{cat $gitfs/HEAD/parent} if not if(test -f .git/index9/merge-parents) parents=`{cat .git/index9/merge-parents | sort | uniq} if not if(~ $initial true) @@ -129,8 +129,8 @@ if(~ $#msg 1) echo $msg >$msgfile.tmp if not if(~ $#revise 1){ msg=1 - echo revising commit `{cat /mnt/git/HEAD/hash} - cat /mnt/git/HEAD/msg >$msgfile.tmp + echo revising commit `{cat $gitfs/HEAD/hash} + cat $gitfs/HEAD/msg >$msgfile.tmp } files=() diff --git a/sys/src/cmd/git/fs.c b/sys/src/cmd/git/fs.c index 1f4d5c99b..f116f2973 100644 --- a/sys/src/cmd/git/fs.c +++ b/sys/src/cmd/git/fs.c @@ -79,7 +79,7 @@ char *qroot[] = { char gitdir[512]; char *username; -char *mtpt = "/mnt/git"; +char *mntpt = ".git/fs"; char **branches = nil; Cache uqidcache[512]; vlong nextqid = Qmax; @@ -839,8 +839,15 @@ main(int argc, char **argv) { gitinit(); ARGBEGIN{ - case 'd': chatty9p++; break; - default: usage(); break; + case 'd': + chatty9p++; + break; + case 'm': + mntpt = EARGF(usage()); + break; + default: + usage(); + break; }ARGEND; if(argc != 0) usage(); @@ -848,6 +855,6 @@ main(int argc, char **argv) username = getuser(); branches = emalloc(sizeof(char*)); branches[0] = nil; - postmountsrv(&gitsrv, nil, "/mnt/git", MCREATE); + postmountsrv(&gitsrv, nil, mntpt, MCREATE); exits(nil); } diff --git a/sys/src/cmd/git/import b/sys/src/cmd/git/import index 31103cde3..3d1424143 100755 --- a/sys/src/cmd/git/import +++ b/sys/src/cmd/git/import @@ -14,9 +14,9 @@ fn apply @{ msg='' parents='-p'^`{git/query HEAD} branch=`{git/branch} - if(test -e /mnt/git/branch/$branch/tree) + if(test -e $gitfs/branch/$branch/tree) refpath=.git/refs/$branch - if not if(test -e /mnt/git/object/$branch/tree) + if not if(test -e $gitfs/object/$branch/tree) refpath=.git/HEAD if not die 'invalid branch:' $branch diff --git a/sys/src/cmd/git/merge b/sys/src/cmd/git/merge index 5517a3924..6e9791914 100755 --- a/sys/src/cmd/git/merge +++ b/sys/src/cmd/git/merge @@ -3,9 +3,9 @@ rfork ne . /sys/lib/git/common.rc fn merge{ - ourbr=/mnt/git/object/$1/tree - basebr=/mnt/git/object/$2/tree - theirbr=/mnt/git/object/$3/tree + ourbr=$gitfs/object/$1/tree + basebr=$gitfs/object/$2/tree + theirbr=$gitfs/object/$3/tree all=`$nl{{git/query -c $1 $2; git/query -c $2 $3} | sed 's/^..//' | \ subst -g '^('$ourbr'|'$basebr'|'$theirbr')/*' | sort | uniq} diff --git a/sys/src/cmd/git/query.c b/sys/src/cmd/git/query.c index 5f1330dad..cb0f243df 100644 --- a/sys/src/cmd/git/query.c +++ b/sys/src/cmd/git/query.c @@ -154,7 +154,7 @@ main(int argc, char **argv) { int i, j, n; Hash *h; - char *p, *e, *s; + char *p, *e, *s, *objpfx; char query[2048], repo[512]; ARGBEGIN{ @@ -173,6 +173,8 @@ main(int argc, char **argv) sysfatal("find root: %r"); if(chdir(repo) == -1) sysfatal("chdir: %r"); + if((objpfx = smprint("%s/.git/fs/object/", repo)) == nil) + sysfatal("smprint: %r"); s = ""; p = query; e = query + nelem(query); @@ -187,7 +189,7 @@ main(int argc, char **argv) sysfatal("diff: need 2 commits, got %d", n); diffcommits(h[0], h[1]); }else{ - p = (fullpath ? "/mnt/git/object/" : ""); + p = (fullpath ? objpfx : ""); for(j = 0; j < n; j++) print("%s%H\n", p, h[reverse ? n - 1 - j : j]); } diff --git a/sys/src/cmd/git/rebase b/sys/src/cmd/git/rebase index 9ceb39f00..395f3e693 100755 --- a/sys/src/cmd/git/rebase +++ b/sys/src/cmd/git/rebase @@ -72,7 +72,7 @@ while(! ~ $#todo 0){ exit case s squash git/export $c | git/import -n - msg=`''{cat /mnt/git/HEAD/msg; echo; cat /mnt/git/object/$c/msg} + msg=`''{cat $gitfs/HEAD/msg; echo; cat $gitfs/object/$c/msg} git/commit -rem $msg . case f fixup git/export $c | git/import -n diff --git a/sys/src/cmd/git/revert b/sys/src/cmd/git/revert index af02f5cbf..a3c775a78 100644 --- a/sys/src/cmd/git/revert +++ b/sys/src/cmd/git/revert @@ -7,7 +7,7 @@ gitup flagfmt='c:query query' args='file ...' eval `''{aux/getflags $*} || exec aux/usage -commit=/mnt/git/HEAD +commit=$gitfs/HEAD if(~ $#query 1) commit=`{git/query -p $query} diff --git a/sys/src/cmd/git/walk.c b/sys/src/cmd/git/walk.c index c50ac2873..50a227e21 100644 --- a/sys/src/cmd/git/walk.c +++ b/sys/src/cmd/git/walk.c @@ -5,7 +5,7 @@ #define NCACHE 4096 #define TDIR ".git/index9/tracked" #define RDIR ".git/index9/removed" -#define HDIR "/mnt/git/HEAD/tree" +#define HDIR ".git/fs/HEAD/tree" typedef struct Cache Cache; typedef struct Wres Wres; struct Cache { @@ -246,16 +246,14 @@ main(int argc, char **argv) usage(); }ARGEND - if(access("/mnt/git/ctl", AEXIST) != 0) - sysfatal("no running git/fs"); if(findrepo(repo, sizeof(repo)) == -1) sysfatal("find root: %r"); if(chdir(repo) == -1) sysfatal("chdir: %r"); + if(access(".git/fs/ctl", AEXIST) != 0) + sysfatal("no running git/fs"); dirty = 0; memset(&r, 0, sizeof(r)); - if(access("/mnt/git/ctl", AEXIST) != 0) - sysfatal("git/fs does not seem to be running"); if(printflg == 0) printflg = Tflg | Aflg | Mflg | Rflg; if(argc == 0){