diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-10-25 01:05:39 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-10-25 01:05:39 +0200 |
commit | 5741e1ecfda5caebb4074096800678bda2f6d4fe (patch) | |
tree | df4d7209638798950b3171882c040b361506b960 /sys/src/cmd/hgfs | |
parent | cc595b043a1d0782fc50e79652112e1a7613d5e3 (diff) |
hgfs: add wip debug command
Diffstat (limited to 'sys/src/cmd/hgfs')
-rw-r--r-- | sys/src/cmd/hgfs/fns.h | 2 | ||||
-rw-r--r-- | sys/src/cmd/hgfs/fs.c | 22 | ||||
-rw-r--r-- | sys/src/cmd/hgfs/hgdb.c | 66 | ||||
-rw-r--r-- | sys/src/cmd/hgfs/mkfile | 6 | ||||
-rw-r--r-- | sys/src/cmd/hgfs/util.c | 28 |
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; +} |