code: plan9front

Download patch

ref: 12e952e684d149628360b6fcdb583be86052f944
parent: 1af2546e96fa96ec5341026dd509c9e4ed54c6db
author: Ori Bernstein <ori@eigenstate.org>
date: Sun May 30 13:46:21 EDT 2021

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.

--- a/sys/lib/git/common.rc
+++ b/sys/lib/git/common.rc
@@ -75,14 +75,17 @@
 	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
--- a/sys/man/1/git
+++ b/sys/man/1/git
@@ -18,7 +18,7 @@
 .PP
 .B git/branch
 [
-.B -adns
+.B -admns
 ]
 [
 .B -b
@@ -211,7 +211,7 @@
 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 @@
 
 .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 @@
 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
--- a/sys/man/4/gitfs
+++ b/sys/man/4/gitfs
@@ -20,7 +20,7 @@
 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 @@
 .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.
--- a/sys/src/cmd/git/add
+++ b/sys/src/cmd/git/add
@@ -31,7 +31,7 @@
 		# 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
 	}
--- a/sys/src/cmd/git/branch
+++ b/sys/src/cmd/git/branch
@@ -13,7 +13,7 @@
 
 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(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
 }
 
--- a/sys/src/cmd/git/clone
+++ b/sys/src/cmd/git/clone
@@ -23,6 +23,7 @@
 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 @@
 		}
 	'} |[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...
--- a/sys/src/cmd/git/commit
+++ b/sys/src/cmd/git/commit
@@ -19,15 +19,15 @@
 
 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 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 @@
 	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=()
--- a/sys/src/cmd/git/fs.c
+++ b/sys/src/cmd/git/fs.c
@@ -79,7 +79,7 @@
 
 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 @@
 {
 	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 @@
 	username = getuser();
 	branches = emalloc(sizeof(char*));
 	branches[0] = nil;
-	postmountsrv(&gitsrv, nil, "/mnt/git", MCREATE);
+	postmountsrv(&gitsrv, nil, mntpt, MCREATE);
 	exits(nil);
 }
--- a/sys/src/cmd/git/import
+++ b/sys/src/cmd/git/import
@@ -14,9 +14,9 @@
 	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
--- a/sys/src/cmd/git/merge
+++ b/sys/src/cmd/git/merge
@@ -3,9 +3,9 @@
 . /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}
--- a/sys/src/cmd/git/query.c
+++ b/sys/src/cmd/git/query.c
@@ -154,7 +154,7 @@
 {
 	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 @@
 		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 @@
 			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]);
 	}
--- a/sys/src/cmd/git/rebase
+++ b/sys/src/cmd/git/rebase
@@ -72,7 +72,7 @@
 		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
--- a/sys/src/cmd/git/revert
+++ b/sys/src/cmd/git/revert
@@ -7,7 +7,7 @@
 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}
 
--- 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 @@
 		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){