-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathinit.b
70 lines (49 loc) · 1.45 KB
/
init.b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
implement Initgit;
include "init.m";
include "sys.m";
include "draw.m";
include "keyring.m";
include "tables.m";
Strhash: import Tables;
include "gitindex.m";
gitindex: Gitindex;
Header, Index, HEADERSZ: import gitindex;
include "bufio.m";
bufio: Bufio;
Iobuf: import bufio;
include "utils.m";
INDEXPATH, OBJECTSTOREPATH, SHALEN: import Utils;
REPOPATH: string;
init(args: list of string)
{
sys := load Sys Sys->PATH;
gitindex = load Gitindex Gitindex->PATH;
keyring := load Keyring Keyring->PATH;
stderr := sys->fildes(2);
REPOPATH = hd args;
sys->print("Initializing git repo\n");
Index.new(REPOPATH);
header := Header.new();
temp := header.unpack()[:HEADERSZ - SHALEN];
keyring->sha1(temp, len temp, header.sha1, nil);
if((fd := sys->create(REPOPATH + INDEXPATH, Sys->OWRITE, 8r644)) == nil ||
sys->write(fd, temp, len temp) != len temp ||
sys->write(fd, header.sha1, SHALEN) != SHALEN)
{
sys->fprint(stderr,"error in creating index file: %r\n");
return;
}
if(sys->create(REPOPATH + OBJECTSTOREPATH, Sys->OREAD, Sys->DMDIR | 8r700) == nil)
{
sys->fprint(stderr, "objects dir couldn't be created: %r\n");
return;
}
for(i := 0; i <= 255; i++)
{
dirname := sys->sprint("%sobjects/%02x", REPOPATH, i);
dirfd := sys->create(dirname,Sys->OREAD,sys->DMDIR | 8r700);
if(dirfd == nil)
sys->fprint(stderr, "directory %s/%s couldn't be created: %r\n", OBJECTSTOREPATH, dirname);
}
sys->print("Initialization's finished\n");
}