git: 9front

Download patch

ref: f7390ace4e3355bb7f5533e375d996beb8a2ef02
parent: 1999ac1c65196ea498dc7f844675f119640df660
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Wed Oct 24 21:05:39 EDT 2012

hgfs: add wip debug command

--- a/sys/src/cmd/hgfs/fns.h
+++ b/sys/src/cmd/hgfs/fns.h
@@ -31,3 +31,5 @@
 Revtree *loadchangestree(Revlog *changelog, Revlog *manifest, Revinfo *ri);
 void closerevtree(Revtree *t);
 
+/* util */
+int getdothg(char *dothg, char *path);
--- a/sys/src/cmd/hgfs/fs.c
+++ b/sys/src/cmd/hgfs/fs.c
@@ -762,24 +762,9 @@
 		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;
+	if(getdothg(dothg, *argv) < 0)
+		sysfatal("can't find .hg: %r");
 
-			snprint(dothg, sizeof(dothg), "%s/.hg", buf);
-			if(access(dothg, AEXIST) == 0)
-				break;
-			if((s = strrchr(buf, '/')) == nil)
-				break;
-			*s = 0;
-		}
-	}
-	cleanname(dothg);
-
 	snprint(buf, sizeof(buf), "%s/store/00changelog", dothg);
 	if(revlogopen(&changelog, buf, OREAD) < 0)
 		sysfatal("can't open changelog: %r\n");
@@ -788,4 +773,7 @@
 		sysfatal("can't open menifest: %r\n");
 
 	postmountsrv(&fs, srv, mtpt, MREPL);
+
+	exits(0);
 }
+
--- /dev/null
+++ b/sys/src/cmd/hgfs/hgdb.c
@@ -1,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);
+}
--- a/sys/src/cmd/hgfs/mkfile
+++ b/sys/src/cmd/hgfs/mkfile
@@ -6,6 +6,10 @@
 
 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
--- /dev/null
+++ b/sys/src/cmd/hgfs/util.c
@@ -1,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;
+}
--