]> git.pld-linux.org Git - packages/cvsps.git/blame - cvsps-fixes.patch
- up to 1a680d69dd39346bdf3674c6cb2460e11e15c7d2
[packages/cvsps.git] / cvsps-fixes.patch
CommitLineData
36d74589
ER
1--- b/Makefile
2+++ b/Makefile 2011-01-31 08:14:42.829723957 +0200
e37b3f32
AM
3@@ -1,8 +1,8 @@
4 MAJOR=2
5 MINOR=1
6 CC?=gcc
7-CFLAGS?=-g -O2 -Wall
8-CFLAGS+=-I. -DVERSION=\"$(MAJOR).$(MINOR)\"
9+CFLAGS?=-g -O2 -Wall
10+CPPFLAGS?=-I. -DVERSION=\"$(MAJOR).$(MINOR)\"
11 prefix?=/usr/local
12 OBJS=\
13 cbtcommon/debug.o\
36d74589 14@@ -20,6 +20,9 @@
e37b3f32
AM
15
16 all: cvsps
17
18+deps:
19+ makedepend -Y -I. *.c cbtcommon/*.c
20+
21 cvsps: $(OBJS)
22 $(CC) -o cvsps $(OBJS) -lz
23
36d74589
ER
24@@ -32,4 +35,31 @@
25+tags: *.c *.h cbtcommon/*.c cbtcommon/*.h
26+ ctags *.c *.h cbtcommon/*.c cbtcommon/*.h
27+
28 clean:
29- rm -f cvsps *.o cbtcommon/*.o core
30+ rm -f cvsps *.o cbtcommon/*.o core tags
e37b3f32
AM
31
32 .PHONY: install clean
33+# DO NOT DELETE
34+
35+cache.o: ./cbtcommon/hash.h ./cbtcommon/list.h ./cbtcommon/inline.h
36+cache.o: ./cbtcommon/debug.h cache.h cvsps_types.h cvsps.h util.h
37+cap.o: ./cbtcommon/debug.h ./cbtcommon/inline.h ./cbtcommon/text_util.h cap.h
38+cap.o: cvs_direct.h
39+cvs_direct.o: ./cbtcommon/debug.h ./cbtcommon/inline.h
40+cvs_direct.o: ./cbtcommon/text_util.h ./cbtcommon/tcpsocket.h
41+cvs_direct.o: ./cbtcommon/sio.h cvs_direct.h util.h
42+cvsps.o: ./cbtcommon/hash.h ./cbtcommon/list.h ./cbtcommon/inline.h
43+cvsps.o: ./cbtcommon/list.h ./cbtcommon/text_util.h ./cbtcommon/debug.h
44+cvsps.o: ./cbtcommon/rcsid.h cache.h cvsps_types.h cvsps.h util.h stats.h
45+cvsps.o: cap.h cvs_direct.h list_sort.h
46+list_sort.o: list_sort.h ./cbtcommon/list.h
47+stats.o: ./cbtcommon/hash.h ./cbtcommon/list.h ./cbtcommon/inline.h
48+stats.o: cvsps_types.h cvsps.h
49+util.o: ./cbtcommon/debug.h ./cbtcommon/inline.h util.h
50+cbtcommon/debug.o: cbtcommon/debug.h ./cbtcommon/inline.h cbtcommon/rcsid.h
51+cbtcommon/hash.o: cbtcommon/debug.h ./cbtcommon/inline.h cbtcommon/hash.h
52+cbtcommon/hash.o: ./cbtcommon/list.h cbtcommon/rcsid.h
53+cbtcommon/sio.o: cbtcommon/sio.h cbtcommon/rcsid.h
54+cbtcommon/tcpsocket.o: cbtcommon/tcpsocket.h cbtcommon/debug.h
55+cbtcommon/tcpsocket.o: ./cbtcommon/inline.h cbtcommon/rcsid.h
56+cbtcommon/text_util.o: cbtcommon/text_util.h cbtcommon/rcsid.h
e37b3f32
AM
57--- a/cache.c
58+++ b/cache.c
59@@ -108,10 +108,19 @@ time_t read_cache()
60 int tag_flags = 0;
61 char branchbuff[LOG_STR_MAX] = "";
62 int branch_add = 0;
63- char logbuff[LOG_STR_MAX] = "";
64+ int logbufflen = LOG_STR_MAX + 1;
65+ char * logbuff = malloc(logbufflen);
66 time_t cache_date = -1;
67 int read_version;
68
69+ if (logbuff == NULL)
70+ {
71+ debug(DEBUG_SYSERROR, "could not malloc %d bytes for logbuff in read_cache", logbufflen);
72+ exit(1);
73+ }
74+
75+ logbuff[0] = 0;
76+
77 if (!(fp = cache_open("r")))
78 goto out;
79
80@@ -299,8 +308,19 @@ time_t read_cache()
81 else
82 {
83 /* Make sure we have enough in the buffer */
84- if (strlen(logbuff)+strlen(buff)<LOG_STR_MAX)
85- strcat(logbuff, buff);
86+ int len = strlen(buff);
87+ if (strlen(logbuff) + len >= LOG_STR_MAX)
88+ {
89+ logbufflen += (len >= LOG_STR_MAX ? (len+1) : LOG_STR_MAX);
90+ char * newlogbuff = realloc(logbuff, logbufflen);
91+ if (newlogbuff == NULL)
92+ {
93+ debug(DEBUG_SYSERROR, "could not realloc %d bytes for logbuff in read_cache", logbufflen);
94+ exit(1);
95+ }
96+ logbuff = newlogbuff;
97+ }
98+ strcat(logbuff, buff);
99 }
100 break;
101 case CACHE_NEED_PS_MEMBERS:
102@@ -332,6 +352,7 @@ time_t read_cache()
103 out_close:
104 fclose(fp);
105 out:
106+ free(logbuff);
107 return cache_date;
108 }
109
110@@ -344,7 +365,7 @@ enum
111 CR_BRANCH_POINT
112 };
113
114-static void parse_cache_revision(PatchSetMember * psm, const char * p_buff)
115+static void parse_cache_revision(PatchSetMember * psm, const char * buff)
116 {
117 /* The format used to generate is:
118 * "file:%s; pre_rev:%s; post_rev:%s; dead:%d; branch_point:%d\n"
119@@ -354,35 +375,37 @@ static void parse_cache_revision(PatchSetMember * psm, const char * p_buff)
120 char post[REV_STR_MAX];
121 int dead = 0;
122 int bp = 0;
123- char buff[BUFSIZ];
124 int state = CR_FILENAME;
125- const char *s;
126- char * p = buff;
127-
128- strcpy(buff, p_buff);
129+ const char *sep;
130+ char * p;
131+ char * c;
132
133- while ((s = strsep(&p, ";")))
134+ for (p = buff, sep = buff; /* just ensure sep is non-NULL */
135+ (sep != NULL) && (c = strchr(p, ':'));
136+ p = sep + 1)
137 {
138- char * c = strchr(s, ':');
139-
140- if (!c)
141- {
142- debug(DEBUG_APPERROR, "invalid cache revision line '%s'|'%s'", p_buff, s);
143- exit(1);
144- }
145+ size_t len;
146+ sep = strchr(c, ';');
147+ c++;
148
149- *c++ = 0;
150+ if (sep != NULL)
151+ len = sep - c;
152+ else /* last field in the cache line */
153+ len = strlen(c);
154
155 switch(state)
156 {
157 case CR_FILENAME:
158- strcpy(filename, c);
159+ memcpy(filename, c, len);
160+ filename[len] = '\0';
161 break;
162 case CR_PRE_REV:
163- strcpy(pre, c);
164+ memcpy(pre, c, len);
165+ pre[len] = '\0';
166 break;
167 case CR_POST_REV:
168- strcpy(post, c);
169+ memcpy(post, c, len);
170+ post[len] = '\0';
171 break;
172 case CR_DEAD:
173 dead = atoi(c);
e37b3f32
AM
174--- a/cap.c
175+++ b/cap.c
176@@ -121,11 +121,19 @@ int check_version_string(const char * str, int req_major, int req_minor, int req
177 return 0;
178 }
179
180+ /* We might have encountered a FreeBSD system which
181+ * has a mucked up version string of:
182+ * Concurrent Versions System (CVS) '1.11.17'-FreeBSD (client/server)
183+ * so re-test just in case
184+ */
185 p += skip;
186 if (sscanf(p, "%d.%d.%d", &major, &minor, &extra) != 3)
187 {
188- debug(DEBUG_APPMSG1, "WARNING: malformed CVS version: %s", str);
189- return 0;
190+ if (sscanf(p, "'%d.%d.%d'", &major, &minor, &extra) != 3)
191+ {
192+ debug(DEBUG_APPMSG1, "WARNING: malformed CVS version: %s", str);
193+ return 0;
194+ }
195 }
196
197 return (major > req_major ||
e37b3f32
AM
198--- a/cbtcommon/tcpsocket.c
199+++ b/cbtcommon/tcpsocket.c
200@@ -185,20 +185,20 @@ tcp_connect(int sockfd, const char *rem_addr, unsigned short port)
201 int
202 convert_address(long *dest, const char *addr_str)
203 {
204-#ifdef LINUX
205+#ifdef __linux__
206 struct in_addr ip;
207 #endif
208 int retval = 0;
209 char errstr[256];
210
211 /* first try converting "numbers and dots" notation */
212-#ifdef LINUX
213+#ifdef __linux__
214 if ( inet_aton(addr_str, &ip) )
215 {
216 memcpy(dest, &ip.s_addr, sizeof(ip.s_addr));
217 }
218 #else
219- if ( (*dest = inet_addr(addr_str)) != -1)
220+ if ( (*dest = inet_addr(addr_str)) != INADDR_NONE)
221 {
222 /* nothing */
223 }
36d74589
ER
224--- b/cvsps.1
225+++ b/cvsps.1 2011-01-31 08:14:42.846391432 +0200
226@@ -83,7 +83,7 @@
e37b3f32
AM
227 disable the use of rlog internally. Note: rlog is
228 required for stable PatchSet numbering. Use with care.
229 .TP
230-.B \-\-diffs\-opts <option string>
231+.B \-\-diff\-opts <option string>
232 send a custom set of options to diff, for example to increase
233 the number of context lines, or change the diff format.
234 .TP
36d74589
ER
235@@ -103,6 +103,7 @@
236 .TP
237 .B \-q
238 Be quiet about warnings.
239+.TP
240 .B \-A
241 Show ancestor branch when a new branch is found.
242 .TP
243--- b/cvsps.c
244+++ b/cvsps.c 2011-01-31 08:14:42.846391432 +0200
245@@ -39,7 +39,8 @@
e37b3f32
AM
246
247 enum
248 {
249- NEED_FILE,
250+ NEED_RCS_FILE,
251+ NEED_WORKING_FILE,
252 NEED_SYMS,
253 NEED_EOS,
254 NEED_START_LOG,
36d74589 255@@ -117,7 +118,9 @@
e37b3f32
AM
256 static int parse_rc();
257 static void load_from_cvs();
258 static void init_paths();
259-static CvsFile * parse_file(const char *);
260+static CvsFile * build_file_by_name(const char *);
261+static CvsFile * parse_rcs_file(const char *);
262+static CvsFile * parse_working_file(const char *);
263 static CvsFileRevision * parse_revision(CvsFile * file, char * rev_str);
264 static void assign_pre_revision(PatchSetMember *, CvsFileRevision * rev);
265 static void check_print_patch_set(PatchSet *);
36d74589 266@@ -260,12 +263,13 @@
e37b3f32
AM
267 {
268 FILE * cvsfp;
269 char buff[BUFSIZ];
270- int state = NEED_FILE;
271+ int state = NEED_RCS_FILE;
272 CvsFile * file = NULL;
273 PatchSetMember * psm = NULL;
274 char datebuff[20];
275 char authbuff[AUTH_STR_MAX];
276- char logbuff[LOG_STR_MAX + 1];
277+ int logbufflen = LOG_STR_MAX + 1;
278+ char * logbuff = malloc(logbufflen);
279 int loglen = 0;
280 int have_log = 0;
281 char cmd[BUFSIZ];
36d74589 282@@ -273,6 +277,12 @@
e37b3f32
AM
283 char use_rep_buff[PATH_MAX];
284 char * ltype;
285
286+ if (logbuff == NULL)
287+ {
288+ debug(DEBUG_SYSERROR, "could not malloc %d bytes for logbuff in load_from_cvs", logbufflen);
289+ exit(1);
290+ }
291+
292 if (!no_rlog && !test_log_file && cvs_check_cap(CAP_HAVE_RLOG))
293 {
294 ltype = "rlog";
36d74589 295@@ -298,12 +308,12 @@
e37b3f32
AM
296 * which is necessary to fill in the pre_rev stuff for a
297 * PatchSetMember
298 */
299- snprintf(cmd, BUFSIZ, "cvs %s %s %s -d '%s<;%s' %s", compress_arg, norc, ltype, date_str, date_str, use_rep_buff);
300+ snprintf(cmd, BUFSIZ, "cvs %s %s -q %s -d '%s<;%s' %s", compress_arg, norc, ltype, date_str, date_str, use_rep_buff);
301 }
302 else
303 {
304 date_str[0] = 0;
305- snprintf(cmd, BUFSIZ, "cvs %s %s %s %s", compress_arg, norc, ltype, use_rep_buff);
306+ snprintf(cmd, BUFSIZ, "cvs %s %s -q %s %s", compress_arg, norc, ltype, use_rep_buff);
307 }
308
309 debug(DEBUG_STATUS, "******* USING CMD %s", cmd);
36d74589 310@@ -339,10 +349,26 @@
e37b3f32
AM
311
312 switch(state)
313 {
314- case NEED_FILE:
315- if (strncmp(buff, "RCS file", 8) == 0 && (file = parse_file(buff)))
316+ case NEED_RCS_FILE:
317+ if (strncmp(buff, "RCS file", 8) == 0) {
318+ if ((file = parse_rcs_file(buff)) != NULL)
319 state = NEED_SYMS;
320+ else
321+ state = NEED_WORKING_FILE;
322+ }
323 break;
324+ case NEED_WORKING_FILE:
325+ if (strncmp(buff, "Working file", 12) == 0) {
326+ if ((file = parse_working_file(buff)))
327+ state = NEED_SYMS;
328+ else
329+ state = NEED_RCS_FILE;
330+ break;
331+ } else {
332+ // Working file come just after RCS file. So reset state if it was not found
333+ state = NEED_RCS_FILE;
334+ }
335+ break;
336 case NEED_SYMS:
337 if (strncmp(buff, "symbolic names:", 15) == 0)
338 state = NEED_EOS;
36d74589 339@@ -471,7 +497,7 @@
e37b3f32
AM
340 have_log = 0;
341 psm = NULL;
342 file = NULL;
343- state = NEED_FILE;
344+ state = NEED_RCS_FILE;
345 }
346 else
347 {
36d74589 348@@ -480,24 +506,22 @@
e37b3f32
AM
349 */
350 if (have_log || !is_revision_metadata(buff))
351 {
352- /* if the log buffer is full, that's it.
353- *
354- * Also, read lines (fgets) always have \n in them
355- * which we count on. So if truncation happens,
356- * be careful to put a \n on.
357- *
358- * Buffer has LOG_STR_MAX + 1 for room for \0 if
359- * necessary
360- */
361- if (loglen < LOG_STR_MAX)
362+ /* If the log buffer is full, try to reallocate more. */
363+ if (loglen < logbufflen)
364 {
365 int len = strlen(buff);
366
367- if (len >= LOG_STR_MAX - loglen)
368+ if (len >= logbufflen - loglen)
369 {
370- debug(DEBUG_APPMSG1, "WARNING: maximum log length exceeded, truncating log");
371- len = LOG_STR_MAX - loglen;
372- buff[len - 1] = '\n';
373+ debug(DEBUG_STATUS, "reallocating logbufflen to %d bytes for file %s", logbufflen, file->filename);
374+ logbufflen += (len >= LOG_STR_MAX ? (len+1) : LOG_STR_MAX);
375+ char * newlogbuff = realloc(logbuff, logbufflen);
376+ if (newlogbuff == NULL)
377+ {
378+ debug(DEBUG_SYSERROR, "could not realloc %d bytes for logbuff in load_from_cvs", logbufflen);
379+ exit(1);
380+ }
381+ logbuff = newlogbuff;
382 }
383
384 debug(DEBUG_STATUS, "appending %s to log", buff);
36d74589 385@@ -524,7 +548,7 @@
e37b3f32
AM
386 exit(1);
387 }
388
389- if (state != NEED_FILE)
390+ if (state != NEED_RCS_FILE)
391 {
392 debug(DEBUG_APPERROR, "Error: Log file parsing error. (%d) Use -v to debug", state);
393 exit(1);
36d74589 394@@ -1038,8 +1062,8 @@
e37b3f32
AM
395 *
396 * NOTE: because of some bizarre 'feature' in cvs, when 'rlog' is used
397 * (instead of log) it gives the 'real' RCS file path, which can be different
398- * from the 'nominal' repository path because of symlinks in the server and
399- * the like. See also the 'parse_file' routine
400+ * from the 'nominal' repository path because of symlinks in the server and
401+ * the like. See also the 'parse_rcs_file' routine
402 */
403 strip_path_len = snprintf(strip_path, PATH_MAX, "%s/%s/", p, repository_path);
404
36d74589 405@@ -1052,9 +1076,8 @@
e37b3f32
AM
406 debug(DEBUG_STATUS, "strip_path: %s", strip_path);
407 }
408
409-static CvsFile * parse_file(const char * buff)
410+static CvsFile * parse_rcs_file(const char * buff)
411 {
412- CvsFile * retval;
413 char fn[PATH_MAX];
414 int len = strlen(buff + 10);
415 char * p;
36d74589 416@@ -1129,6 +1152,28 @@
e37b3f32
AM
417
418 debug(DEBUG_STATUS, "stripped filename %s", fn);
419
420+ return build_file_by_name(fn);
421+}
422+
423+static CvsFile * parse_working_file(const char * buff)
424+{
425+ char fn[PATH_MAX];
426+ int len = strlen(buff + 14);
427+
428+ /* chop the "LF" */
429+ len -= 1;
430+ memcpy(fn, buff + 14, len);
431+ fn[len] = 0;
432+
433+ debug(DEBUG_STATUS, "working filename %s", fn);
434+
435+ return build_file_by_name(fn);
436+}
437+
438+static CvsFile * build_file_by_name(const char * fn)
439+{
440+ CvsFile * retval;
441+
442 retval = (CvsFile*)get_hash_object(file_hash, fn);
443
444 if (!retval)
36d74589 445@@ -2104,6 +2149,11 @@
e37b3f32
AM
446
447 if (!get_branch_ext(rev, eot, &leaf))
448 {
449+ if (strcmp(tag, "TRUNK") == 0)
450+ {
451+ debug(DEBUG_STATUS, "ignoring the TRUNK branch/tag");
452+ return;
453+ }
454 debug(DEBUG_APPERROR, "malformed revision");
455 exit(1);
456 }
36d74589 457@@ -2384,8 +2434,31 @@
e37b3f32
AM
458 for (next = ps->members.next; next != &ps->members; next = next->next)
459 {
460 PatchSetMember * m = list_entry(next, PatchSetMember, link);
461- if (m->file == psm->file && ps->collision_link.next == NULL)
462- list_add(&ps->collision_link, &collisions);
463+ if (m->file == psm->file) {
464+ int order = compare_rev_strings(psm->post_rev->rev, m->post_rev->rev);
465+
466+ /*
467+ * Same revision too? Add it to the collision list
468+ * if it isn't already.
469+ */
470+ if (!order) {
471+ if (ps->collision_link.next == NULL)
472+ list_add(&ps->collision_link, &collisions);
473+ return;
474+ }
475+
476+ /*
477+ * If this is an older revision than the one we already have
478+ * in this patchset, just ignore it
479+ */
480+ if (order < 0)
481+ return;
482+
483+ /*
484+ * This is a newer one, remove the old one
485+ */
486+ list_del(&m->link);
487+ }
488 }
489
490 psm->ps = ps;
36d74589
ER
491@@ -2398,11 +2471,10 @@
492 if (psm->post_rev->dead)
493 {
494 /*
495- * we expect a 'file xyz initially added on branch abc' here
496- * but there can only be one such member in a given patchset
497+ * We expect a 'file xyz initially added on branch abc' here.
498+ * There can only be several such member in a given patchset,
499+ * since cvs only includes the file basename in the log message.
500 */
501- if (psm->ps->branch_add)
502- debug(DEBUG_APPMSG1, "WARNING: branch_add already set!");
503 psm->ps->branch_add = 1;
504 }
505 }
506@@ -2576,7 +2648,7 @@
e37b3f32
AM
507 * note: rev is the pre-commit revision, not the post-commit
508 */
509 if (!head_ps->ancestor_branch)
510- d1 = 0;
511+ d1 = -1;
512 else if (strcmp(ps->branch, rev->branch) == 0)
513 continue;
514 else if (strcmp(head_ps->ancestor_branch, "HEAD") == 0)
e37b3f32
AM
515--- a/cvsps_types.h
516+++ b/cvsps_types.h
517@@ -8,7 +8,7 @@
518
519 #include <time.h>
520
521-#define LOG_STR_MAX 32768
522+#define LOG_STR_MAX 65536
523 #define AUTH_STR_MAX 64
524 #define REV_STR_MAX 64
525 #define MIN(a, b) ((a) < (b) ? (a) : (b))
36d74589
ER
526--- a/cbtcommon/list.h 2005-05-26 06:39:40.000000000 +0300
527+++ b/cbtcommon/list.h 2011-01-31 08:14:42.829723957 +0200
528@@ -23,6 +23,7 @@
529 */
530
531 #include "inline.h"
532+#include <stddef.h>
533
534 struct list_head {
535 struct list_head *next, *prev;
536@@ -107,6 +108,6 @@
537 }
538
539 #define list_entry(ptr, type, member) \
540- ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
541+ ((type *)((char *)(ptr)-offsetof(type, member)))
542
543 #endif /* _COMMON_LIST_H */
This page took 3.622528 seconds and 4 git commands to generate.