3 * Written by Jan Roeloffzen
5 * - SVN interface and revision analysis
16 #include "log2lines.h"
19 log_rev_check(FILE *outFile
, char *fileName
, int showfile
)
24 strcpy(s
, opt_SourcesPath
);
26 rev
= getRevision(s
, 1);
29 if (revinfo
.opt_verbose
)
30 log(outFile
, "| R--- %s Last Changed Rev: %d\n", s
, rev
);
32 if (rev
&& opt_Revision_check
)
34 if (revinfo
.rev
< revinfo
.buildrev
)
37 log(outFile
, "| R--- Conflict %s: source tree(%d) < build(%d)\n", s
, rev
, revinfo
.buildrev
);
39 else if (rev
> revinfo
.buildrev
)
42 log(outFile
, "| R--- Conflict %s: file(%d) > build(%d)\n", s
, rev
, revinfo
.buildrev
);
48 logRevCheck(FILE *outFile
)
52 twice
= (lastLine
.nr2
&& strcmp(lastLine
.file1
, lastLine
.file2
) != 0);
53 log_rev_check(outFile
, lastLine
.file1
, twice
);
56 log_rev_check(outFile
, lastLine
.file2
, twice
);
61 getRevision(char *fileName
, int lastChanged
)
68 fileName
= opt_SourcesPath
;
69 sprintf(s
, "svn info %s", fileName
);
70 if ((psvn
= POPEN(s
, "r")))
72 while (fgets(s
, LINESIZE
, psvn
))
76 if (sscanf(s
, "Last Changed Rev: %d", &rev
))
81 if (sscanf(s
, "Revision: %d", &rev
))
87 l2l_dbg(1, "Can't popen: \"%s\"\n", s
);
96 getTBRevision(char *fileName
)
101 s
= strrchr(fileName
, PATH_CHAR
);
107 sscanf(s
, TRKBUILDPREFIX
"%d", &rev
);
110 s
= strrchr(fileName
, PATH_CHAR
);
112 *s
= '\0'; // clear, so we have the parent dir
115 // where else to look?
116 fileName
= opt_SourcesPath
;
118 rev
= getRevision(fileName
, 1);
120 *s
= PATH_CHAR
; // restore
123 l2l_dbg(1, "TBRevision: %d\n", rev
);
129 reportRevision(FILE *outFile
)
131 if (opt_Revision_check
)
134 logRevCheck(outFile
);
139 findRev(FILE *finx
, int *rev
)
141 unsigned long pos
= 0L;
143 while (!fseek(finx
, (*rev
) * sizeof(unsigned long), SEEK_SET
))
145 fread(&pos
, sizeof(long), 1, finx
);
154 regscan(FILE *outFile
)
157 char logname
[PATH_MAX
];
158 char inxname
[PATH_MAX
];
159 char line
[LINESIZE
+ 1];
160 char line2
[LINESIZE
+ 1];
163 unsigned long pos
= 0L;
166 sprintf(logname
, "%s" PATH_STR
"%s", opt_SourcesPath
, SVNDB
);
167 sprintf(inxname
, "%s" PATH_STR
"%s", opt_SourcesPath
, SVNDB_INX
);
168 flog
= fopen(logname
, "rb");
169 finx
= fopen(inxname
, "rb");
173 r
= revinfo
.buildrev
;
174 if (!fread(&pos
, sizeof(long), 1, finx
))
177 l2l_dbg(0, "Cannot read magic number\n");
182 if (pos
!= MAGIC_INX
)
185 l2l_dbg(0, "Incorrect magic number (%lx)\n", pos
);
193 char path2
[PATH_MAX
];
195 clilog(outFile
, "Regression candidates:\n");
196 while (( pos
= findRev(finx
, &r
) ))
198 if (r
< (revinfo
.buildrev
- revinfo
.range
))
200 l2l_dbg(1, "r%d is outside range of %d revisions\n", r
, revinfo
.range
);
203 fseek(flog
, pos
, SEEK_SET
);
205 fgets(line
, LINESIZE
, flog
);
206 fgets(line2
, LINESIZE
, flog
);
207 while (fgets(line2
, LINESIZE
, flog
))
210 if (sscanf(line2
, "%1s %s %s", flag
, path
, path2
) >= 2)
212 if (entry_lookup(&sources
, path
) || entry_lookup(&sources
, path2
))
216 clilog(outFile
, "%sChanged paths:\n", line
);
220 clilog(outFile
, "%s", line2
);
229 clilog(outFile
, "\n");
230 while (fgets(line2
, LINESIZE
, flog
))
233 clilog(outFile
, "%s", line2
);
234 if (strncmp(LOGBOTTOM
, line2
, sizeof(LOGBOTTOM
) - 1) == 0)
244 l2l_dbg(0, "Cannot open %s or %s\n", logname
, inxname
);
260 char logname
[PATH_MAX
];
261 char inxname
[PATH_MAX
];
262 char line
[LINESIZE
+ 1];
269 sprintf(logname
, "%s" PATH_STR
"%s", opt_SourcesPath
, SVNDB
);
270 sprintf(inxname
, "%s" PATH_STR
"%s", opt_SourcesPath
, SVNDB_INX
);
271 flog
= fopen(logname
, "rb");
272 finx
= fopen(inxname
, "wb");
277 fwrite(&pos
, sizeof(long), 1, finx
);
279 while (fgets(line
, LINESIZE
, flog
))
281 if (sscanf(line
, "r%d | %s | %d-%d-%d", &r
, name
, &y
, &m
, &d
) == 5)
283 l2l_dbg(1, "%ld r%d | %s | %d-%d-%d\n", pos
, r
, name
, y
, m
, d
);
284 fseek(finx
, r
* sizeof(unsigned long), SEEK_SET
);
285 fwrite(&pos
, sizeof(unsigned long), 1, finx
);