summaryrefslogtreecommitdiff
path: root/sys/src/cmd/hgfs
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2012-10-25 01:05:39 +0200
committercinap_lenrek <cinap_lenrek@gmx.de>2012-10-25 01:05:39 +0200
commit5741e1ecfda5caebb4074096800678bda2f6d4fe (patch)
treedf4d7209638798950b3171882c040b361506b960 /sys/src/cmd/hgfs
parentcc595b043a1d0782fc50e79652112e1a7613d5e3 (diff)
hgfs: add wip debug command
Diffstat (limited to 'sys/src/cmd/hgfs')
-rw-r--r--sys/src/cmd/hgfs/fns.h2
-rw-r--r--sys/src/cmd/hgfs/fs.c22
-rw-r--r--sys/src/cmd/hgfs/hgdb.c66
-rw-r--r--sys/src/cmd/hgfs/mkfile6
-rw-r--r--sys/src/cmd/hgfs/util.c28
5 files changed, 106 insertions, 18 deletions
diff --git a/sys/src/cmd/hgfs/fns.h b/sys/src/cmd/hgfs/fns.h
index 52c217de6..3aba47ccb 100644
--- a/sys/src/cmd/hgfs/fns.h
+++ b/sys/src/cmd/hgfs/fns.h
@@ -31,3 +31,5 @@ Revtree *loadfilestree(Revlog *changelog, Revlog *manifest, Revinfo *ri);
Revtree *loadchangestree(Revlog *changelog, Revlog *manifest, Revinfo *ri);
void closerevtree(Revtree *t);
+/* util */
+int getdothg(char *dothg, char *path);
diff --git a/sys/src/cmd/hgfs/fs.c b/sys/src/cmd/hgfs/fs.c
index cd412a7fd..3cac4144b 100644
--- a/sys/src/cmd/hgfs/fs.c
+++ b/sys/src/cmd/hgfs/fs.c
@@ -762,23 +762,8 @@ main(int argc, char *argv[])
usage();
} ARGEND;
- if(*argv){
- snprint(dothg, sizeof(dothg), "%s/.hg", *argv);
- }else{
- if(getwd(buf, sizeof(buf)) == nil)
- sysfatal("can't get working dir: %r");
- for(;;){
- char *s;
-
- snprint(dothg, sizeof(dothg), "%s/.hg", buf);
- if(access(dothg, AEXIST) == 0)
- break;
- if((s = strrchr(buf, '/')) == nil)
- break;
- *s = 0;
- }
- }
- cleanname(dothg);
+ if(getdothg(dothg, *argv) < 0)
+ sysfatal("can't find .hg: %r");
snprint(buf, sizeof(buf), "%s/store/00changelog", dothg);
if(revlogopen(&changelog, buf, OREAD) < 0)
@@ -788,4 +773,7 @@ main(int argc, char *argv[])
sysfatal("can't open menifest: %r\n");
postmountsrv(&fs, srv, mtpt, MREPL);
+
+ exits(0);
}
+
diff --git a/sys/src/cmd/hgfs/hgdb.c b/sys/src/cmd/hgfs/hgdb.c
new file mode 100644
index 000000000..30a189627
--- /dev/null
+++ b/sys/src/cmd/hgfs/hgdb.c
@@ -0,0 +1,66 @@
+/* hg debug stuff, just dumps dirstate database right now */
+
+#include <u.h>
+#include <libc.h>
+#include <thread.h>
+#include "dat.h"
+#include "fns.h"
+
+char dothg[MAXPATH];
+
+void
+main(int argc, char *argv[])
+{
+ char buf[MAXPATH];
+ uchar hdr[1+4+4+4+4];
+ int n, fd;
+
+ ARGBEGIN {
+ } ARGEND;
+
+ if(getdothg(dothg, *argv) < 0)
+ sysfatal("can't find .hg: %r");
+
+ snprint(buf, sizeof(buf), "%s/dirstate", dothg);
+ if((fd = open(buf, OREAD)) < 0)
+ sysfatal("can't open dirstate: %r");
+
+ if(seek(fd, 0x28LL, 0) != 0x28LL)
+ sysfatal("can't seek dirstate: %r");
+
+ for(;;){
+ char state;
+ int mode, len;
+ vlong size;
+ long mtime;
+
+ if((n = read(fd, hdr, sizeof(hdr))) == 0)
+ break;
+ if(n < 0)
+ sysfatal("read error: %r");
+ if(n < sizeof(hdr))
+ sysfatal("dirstate truncated");
+
+ state = hdr[0];
+ mode = hdr[4] | hdr[3]<<8 | hdr[2]<<16 | hdr[1]<<24;
+ size = hdr[8] | hdr[7]<<8 | hdr[6]<<16 | hdr[5]<<24;
+ mtime = hdr[12] | hdr[11]<<8 | hdr[10]<<16 | hdr[9]<<24;
+ len = hdr[16] | hdr[15]<<8 | hdr[14]<<16 | hdr[13]<<24;
+ USED(mtime);
+
+ if(len >= sizeof(buf))
+ sysfatal("invalid name length %d", len);
+
+ n = read(fd, buf, len);
+ if(n < 0)
+ sysfatal("read error: %r");
+ if(n < len)
+ sysfatal("dirstate name truncated");
+ buf[n] = 0;
+
+
+ print("%c\t%o\t%lld\t%s\n", state, mode, size, buf);
+ }
+
+ exits(0);
+}
diff --git a/sys/src/cmd/hgfs/mkfile b/sys/src/cmd/hgfs/mkfile
index 1c0fd724e..f63319185 100644
--- a/sys/src/cmd/hgfs/mkfile
+++ b/sys/src/cmd/hgfs/mkfile
@@ -6,6 +6,10 @@ CFLAGS=-FTVw
HFILES=dat.h fns.h
-OFILES=zip.$O patch.$O hash.$O revlog.$O tree.$O info.$O fs.$O
+OFILES=fs.$O zip.$O patch.$O hash.$O revlog.$O tree.$O info.$O util.$O
</sys/src/cmd/mkone
+
+# debug stuff
+$O.hgdb: hgdb.$O util.$O
+ $LD $LDFLAGS -o $target $prereq
diff --git a/sys/src/cmd/hgfs/util.c b/sys/src/cmd/hgfs/util.c
new file mode 100644
index 000000000..179713124
--- /dev/null
+++ b/sys/src/cmd/hgfs/util.c
@@ -0,0 +1,28 @@
+#include <u.h>
+#include <libc.h>
+#include <thread.h>
+#include "dat.h"
+#include "fns.h"
+
+int
+getdothg(char *dothg, char *path)
+{
+ char buf[MAXPATH], *s;
+
+ if(path != nil){
+ snprint(buf, sizeof(buf), "%s", path);
+ cleanname(buf);
+ } else if(getwd(buf, sizeof(buf)) == nil)
+ return -1;
+ for(;;){
+ snprint(dothg, MAXPATH, "%s/.hg", buf);
+ if(access(dothg, AEXIST) == 0)
+ return 0;
+ if(path != nil)
+ break;
+ if((s = strrchr(buf, '/')) == nil)
+ break;
+ *s = 0;
+ }
+ return -1;
+}