ref: d84d6af68821626afbbe20a0fc62a8d024aaed50
parent: ca837be27a257b8dff9df887fe751f46136c17d3
author: Ori Bernstein <ori@eigenstate.org>
date: Mon May 24 22:02:41 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/README
+++ b/README
@@ -54,8 +54,8 @@
Structure
---------
-The git/fs program provides a file system mounted on /mnt/git. It
-provides a read-only view into the repository contents to allow
+The git/fs program provides a file system mounted on $repo/.git/fs.
+It provides a read-only view into the repository contents to allow
scripts to inspect the data. Surrounding scripts and binaries will
manipulate the repository contents directly. These changes will be
immediately mirrored in the file system.
@@ -62,14 +62,14 @@
Scripts will generally mount git/fs as needed to do
their work, but if you want to browse the repository
-manually, run it yourself. You'll get `/mnt/git` mounted,
+manually, run it yourself. You'll get `$repo/.git/fs` mounted,
with the following contents:
- /mnt/git/object: The objects in the repo.
- /mnt/git/branch: The branches in the repo.
- /mnt/git/ctl: A file showing the status of the repo.
+ $repo/.git/fs/object: The objects in the repo.
+ $repo/.git/fs/branch: The branches in the repo.
+ $repo/.git/fs/ctl: A file showing the status of the repo.
Currently, it only shows the current branch.
- /mnt/git/HEAD An alias for the currently checked out
+ $repo/.git/fs/HEAD An alias for the currently checked out
commit directory.
Visible Differences
@@ -104,7 +104,7 @@
git/log
cd subdir/name
git/add foo.c
- diff bar.c /mnt/git/HEAD/
+ diff bar.c $repo/.git/fs/HEAD/
git/commit foo.c
git/push
@@ -119,30 +119,30 @@
So, for example:
- % ls /mnt/git/branch/heads/master
- /mnt/git/branch/heads/master/author
- /mnt/git/branch/heads/master/hash
- /mnt/git/branch/heads/master/msg
- /mnt/git/branch/heads/master/parent
- /mnt/git/branch/heads/master/tree
- % cat /mnt/git/branch/heads/master/hash
+ % ls $repo/.git/fs/branch/heads/master
+ $repo/.git/fs/branch/heads/master/author
+ $repo/.git/fs/branch/heads/master/hash
+ $repo/.git/fs/branch/heads/master/msg
+ $repo/.git/fs/branch/heads/master/parent
+ $repo/.git/fs/branch/heads/master/tree
+ % cat $repo/.git/fs/branch/heads/master/hash
7d539a7c08aba3f31b3913e0efef11c43ea9
# This is the same commit, with the same contents.
- % ls /mnt/git/object/7d539a7c08aba3f31b3913e0efef11c43ea9f9ef
- /mnt/git/object/7d539a7c08aba3f31b3913e0efef11c43ea9f9ef/author
- /mnt/git/object/7d539a7c08aba3f31b3913e0efef11c43ea9f9ef/hash
- /mnt/git/object/7d539a7c08aba3f31b3913e0efef11c43ea9f9ef/msg
- /mnt/git/object/7d539a7c08aba3f31b3913e0efef11c43ea9f9ef/parent
- /mnt/git/object/7d539a7c08aba3f31b3913e0efef11c43ea9f9ef/tree
+ % ls $repo/.git/fs/object/7d539a7c08aba3f31b3913e0efef11c43ea9f9ef
+ $repo/.git/fs/object/7d539a7c08aba3f31b3913e0efef11c43ea9f9ef/author
+ $repo/.git/fs/object/7d539a7c08aba3f31b3913e0efef11c43ea9f9ef/hash
+ $repo/.git/fs/object/7d539a7c08aba3f31b3913e0efef11c43ea9f9ef/msg
+ $repo/.git/fs/object/7d539a7c08aba3f31b3913e0efef11c43ea9f9ef/parent
+ $repo/.git/fs/object/7d539a7c08aba3f31b3913e0efef11c43ea9f9ef/tree
# what git/diff will hopefully do more concisely soon, filtering
# out the non-git files.
- ape/diff -ur /mnt/git/branch/heads/master/tree .
+ ape/diff -ur $repo/.git/fs/branch/heads/master/tree .
Only in .: .git
Only in .: debug
- diff -ur /mnt/git/branch/heads/master/tree/fold.myr ./fold.myr
- --- /mnt/git/branch/heads/master/tree/fold.myr Wed Dec 31 16:00:00 1969
+ diff -ur $repo/.git/fs/branch/heads/master/tree/fold.myr ./fold.myr
+ --- $repo/.git/fs/branch/heads/master/tree/fold.myr Wed Dec 31 16:00:00 1969
+++ ./fold.myr Mon Apr 1 21:39:06 2019
@@ -6,6 +6,8 @@
const foldexpr : (e : expr# -> std.option(constval))
--- a/add
+++ b/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/branch
+++ b/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/clone
+++ b/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/commit
+++ b/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/common.rc
+++ b/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/extra/gitls
+++ b/extra/gitls
@@ -20,9 +20,9 @@
fn resolveref {
if(~ $refname HEAD)
echo $refname
- if not if(test -d /mnt/git/branch/$refname/tree)
+ if not if(test -d $gitfs/branch/$refname/tree)
echo branch/$refname
- if not if(test -d /mnt/git/object/$refname/tree)
+ if not if(test -d $gitfs/object/$refname/tree)
echo object/$refname
if not
status='bad ref'
@@ -87,7 +87,7 @@
echo '<b>invalid ref '$refname'</b>'
exit
}
- bind /mnt/git/$ref/tree /mnt/$repo
+ bind $gitfs/$ref/tree /mnt/$repo
cd /mnt
tar cz $repo
}
@@ -120,8 +120,8 @@
echo '<b>invalid ref '$refname'</b>'
exit
}
- cd /mnt/git/$ref/tree
- hash=`{cat /mnt/git/$ref/hash}
+ cd $gitfs/$ref/tree
+ hash=`{cat $gitfs/$ref/hash}
prelude $repo $ref $repo
echo ' <h1><a href="/git/repos.html">Git</a>: <a
@@ -128,7 +128,7 @@
href=/git/'$repo'/'$ref'/info.html>'$repo'</a></h1>
<p>'$repo' @ <a href='/git/$repo/$hash/f.html'>'$hash'</a>
<pre id="desc">'
- htcat /mnt/git/object/$hash/msg
+ htcat $gitfs/object/$hash/msg
echo ' </pre>
<h2>Code</h2>
<p>
@@ -175,10 +175,10 @@
echo '<b>invalid ref '$refname'</b>'
exit
}
- cd /mnt/git/$ref/tree
+ cd $gitfs/$ref/tree
if(~ $file '')
file='.'
- hash=`{cat /mnt/git/$ref/hash}
+ hash=`{cat $gitfs/$ref/hash}
prelude
echo ' <h1><a href="/git/repos.html">Git</a>: <a
--- a/fs.c
+++ b/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/git.1.man
+++ b/git.1.man
@@ -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)
--- a/gitfs.4.man
+++ b/gitfs.4.man
@@ -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/import
+++ b/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/merge
+++ b/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/query.c
+++ b/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/rebase
+++ b/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/revert
+++ b/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/walk.c
+++ b/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){