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){