]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/hgfs/info.c
merge
[plan9front.git] / sys / src / cmd / hgfs / info.c
1 #include <u.h>
2 #include <libc.h>
3 #include <thread.h>
4 #include <bio.h>
5 #include "dat.h"
6 #include "fns.h"
7
8 Revinfo*
9 loadrevinfo(Revlog *changelog, int rev)
10 {
11         int c, fd;
12         char *line;
13         Revinfo *ri;
14         vlong off;
15         Biobuf *buf;
16
17         if((fd = revlogopentemp(changelog, rev)) < 0)
18                 return nil;
19
20         off = fmetaheader(fd);
21         seek(fd, off, 0);
22
23         ri = malloc(sizeof(*ri));
24         memset(ri, 0, sizeof(*ri));
25
26         ri->logoff = off;
27         memmove(ri->chash, changelog->map[rev].hash, HASHSZ);
28
29         buf = Bfdopen(fd, OREAD);
30         line = Brdstr(buf, '\n', 1);
31         if(line == nil)
32                 goto Error;
33         hex2hash(line, ri->mhash);
34         free(line);
35
36         line = Brdstr(buf, '\n', 1);
37         if(line == nil)
38                 goto Error;
39         ri->who = line;
40
41         line = Brdstr(buf, '\n', 1);
42         if(line == nil)
43                 goto Error;
44         ri->when = strtol(line, nil, 10);
45         free(line);
46
47         ri->logoff = Boffset(buf);
48
49         for(;;){
50                 if((c = Bgetc(buf)) < 0)
51                         goto Error;
52                 if(c == '\n'){
53                         if((c = Bgetc(buf)) < 0)
54                                 goto Error;
55                         if(c == '\n')
56                                 break;
57                 }
58         }
59
60         ri->loglen = Boffset(buf) - ri->logoff - 1;
61
62         line = Brdstr(buf, '\0', 1);
63         if(line == nil)
64                 goto Error;
65         ri->why = line;
66
67         Bterm(buf);
68         close(fd);
69
70         return ri;
71 Error:
72         Bterm(buf);
73         close(fd);
74         free(ri->who);
75         free(ri->why);
76         free(ri);
77         return nil;
78 }