ports/183142: [patch] devel/rcs57 doesn't support freebsd extensions

Sven
Mon Oct 21 02:30:02 UTC 2013


>Number:         183142
>Category:       ports
>Synopsis:       [patch] devel/rcs57 doesn't support freebsd extensions
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Mon Oct 21 02:30:01 UTC 2013
>Closed-Date:
>Last-Modified:
>Originator:     Sven
>Release:        
>Organization:
>Environment:
>Description:
devel/rcs52 (unlike devel/cvs) isn't based on a snapshot of freebsd
sources and as such not suitable to be a drop-in replacement for the
tool despite COMMENT claiming to do so.

  COMMENT=	Version control system (as was in FreeBSD prior to removal)

>How-To-Repeat:

>Fix:
Ideally, the patch should be split based on corresponding features
it introduces in freebsd svn e.g., see devel/cvs-devel/files/.

--- patch-freebsd.diff begins here ---
--- src/ident.c
+++ freebsd/gnu/usr.bin/rcs/ident/ident.c
@@ -234,7 +233,7 @@ match(fp)   /* group substring between t
       if (c == EOF  &&  feof(fp) | ferror(fp))
 	 return c;
       switch (ctab[c]) {
-	 case LETTER: case Letter:
+	 case LETTER: case Letter: case DIGIT:
 	    *tp++ = c;
 	    if (tp < line+sizeof(line)-4)
 	       break;
--- src/maketime.c
+++ freebsd/gnu/usr.bin/rcs/lib/maketime.c	1999-08-28 03:37:10.000000000 +0400
@@ -335,7 +335,7 @@ main(argc, argv) int argc; char **argv;
 	time_t default_time = time((time_t *)0);
 	long default_zone = argv[1] ? atol(argv[1]) : 0;
 	char buf[1000];
-	while (gets(buf)) {
+	while (fgets(buf, 1000, stdin)) {
 		time_t t = str2time(buf, default_time, default_zone);
 		printf("%s", asctime(gmtime(&t)));
 	}
--- src/rcsbase.h
+++ freebsd/gnu/usr.bin/rcs/lib/rcsbase.h	1999-08-28 03:37:10.000000000 +0400
@@ -427,10 +426,12 @@ struct assoc {
 #define REVISION        "Revision"
 #define SOURCE          "Source"
 #define STATE           "State"
-#define keylength 8 /* max length of any of the above keywords */
+#define CVSHEADER       "CVSHeader"
+#define keylength 9 /* max length of any of the above keywords */
 
 enum markers { Nomatch, Author, Date, Header, Id,
-	       Locker, Log, Name, RCSfile, Revision, Source, State };
+	       Locker, Log, Name, RCSfile, Revision, Source, State, CVSHeader,
+	       LocalId };
 	/* This must be in the same order as rcskeys.c's Keyword[] array. */
 
 #define DELNUMFORM      "\n\n%s\n%s\n"
@@ -501,6 +502,7 @@ RILE *rcsreadopen P((struct buf*,struct 
 char *bufenlarge P((struct buf*,char const**));
 char const *basefilename P((char const*));
 char const *getfullRCSname P((void));
+char const *getfullCVSname P((void));
 char const *maketemp P((int));
 char const *rcssuffix P((char const*));
 int pairnames P((int,char**,RILE*(*)P((struct buf*,struct stat*,int)),int,int));
@@ -531,8 +533,11 @@ extern struct buf prevauthor, prevdate, 
 int getoldkeys P((RILE*));
 
 /* rcskeys */
-extern char const *const Keyword[];
+extern char const *Keyword[];
+extern enum markers LocalIdMode;
 enum markers trymatch P((char const*));
+void setRCSLocalId(char const *);
+void setIncExc(char const *);
 
 /* rcslex */
 extern FILE *foutptr;
--- src/rcsedit.c
+++ freebsd/gnu/usr.bin/rcs/lib/rcsedit.c
@@ -1050,12 +1049,17 @@ keyreplace(marker, delta, delimstuffed, 
 		aputs(date2str(date,datebuf), out);
                 break;
 	    case Id:
+	    case LocalId:
 	    case Header:
-		escape_string(out,
-			marker==Id || RCSv<VERSION(4)
-			? basefilename(RCSname)
-			: getfullRCSname()
-		);
+	    case CVSHeader:
+		if (marker == Id || RCSv < VERSION(4) ||
+		    (marker == LocalId && LocalIdMode == Id))
+			escape_string(out, basefilename(RCSname));
+		else if (marker == CVSHeader ||
+		    (marker == LocalId && LocalIdMode == CVSHeader))
+			escape_string(out, getfullCVSname());
+		else
+			escape_string(out, getfullRCSname());
 		aprintf(out, " %s %s %s %s",
 			delta->num,
 			date2str(date, datebuf),
@@ -1503,6 +1507,9 @@ makedirtemp(isworkfile)
 	register size_t dl;
 	register struct buf *bn;
 	register char const *name = isworkfile ? workname : RCSname;
+#	if has_mktemp
+	int fd;
+#	endif
 
 	dl = basefilename(name) - name;
 	bn = &dirtpname[newRCSdirtp_index + isworkfile];
@@ -1521,10 +1528,12 @@ makedirtemp(isworkfile)
 	catchints();
 #	if has_mktemp
 		VOID strcpy(tp, "XXXXXX");
-		if (!mktemp(np) || !*np)
+		fd = mkstemp(np);
+		if (fd < 0 || !*np)
 		    faterror("can't make temporary pathname `%.*s_%cXXXXXX'",
 			(int)dl, name, '0'+isworkfile
 		    );
+		close(fd);
 #	else
 		/*
 		 * Posix 1003.1-1990 has no reliable way
--- src/rcsfnms.c
+++ freebsd/gnu/usr.bin/rcs/lib/rcsfnms.c
@@ -285,6 +284,9 @@ maketemp(n)
 {
 	char *p;
 	char const *t = tpnames[n];
+#	if has_mktemp
+	int fd;
+#	endif
 
 	if (t)
 		return t;
@@ -296,10 +298,12 @@ maketemp(n)
 	    size_t tplen = dir_useful_len(tp);
 	    p = testalloc(tplen + 10);
 	    VOID sprintf(p, "%.*s%cT%cXXXXXX", (int)tplen, tp, SLASH, '0'+n);
-	    if (!mktemp(p) || !*p)
+	    fd = mkstemp(p);
+	    if (fd < 0 || !*p)
 		faterror("can't make temporary pathname `%.*s%cT%cXXXXXX'",
 			(int)tplen, tp, SLASH, '0'+n
 		);
+	    close(fd);
 #	else
 	    static char tpnamebuf[TEMPNAMES][L_tmpnam];
 	    p = tpnamebuf[n];
@@ -868,6 +872,47 @@ getfullRCSname()
         }
 }
 
+/* Derived from code from the XFree86 project */
+	char const *
+getfullCVSname()
+/* Function: returns a pointer to the path name of the RCS file with the
+ * CVSROOT part stripped off, and with 'Attic/' stripped off (if present).
+ */
+{
+
+#define ATTICDIR "/Attic"
+
+	char const *namebuf = getfullRCSname();
+	char *cvsroot = cgetenv("CVSROOT");
+	int cvsrootlen;
+	char *c = NULL;
+	int alen = strlen(ATTICDIR);
+
+	if ((c = strrchr(namebuf, '/')) != NULL) {
+	    if (namebuf - c >= alen) {
+		if (!strncmp(c - alen, ATTICDIR, alen)) {
+		    while(*c != '\0') {
+			*(c - alen) = *c;
+			c++;
+		    }
+		    *(c - alen) = '\0';
+		}
+	    }
+	}
+	
+	if (!cvsroot)
+	    return(namebuf);
+	else
+	{
+	    cvsrootlen = strlen(cvsroot);
+	    if (!strncmp(namebuf, cvsroot, cvsrootlen) &&
+	        namebuf[cvsrootlen] == '/')
+		return(namebuf + cvsrootlen + 1);
+	    else
+		return(namebuf);
+	}
+}
+
 	static size_t
 dir_useful_len(d)
 	char const *d;
--- src/rcskeep.c
+++ freebsd/gnu/usr.bin/rcs/lib/rcskeep.c	1999-08-28 03:37:10.000000000 +0400
@@ -192,6 +191,7 @@ getoldkeys(fp)
                 break;
             case Header:
             case Id:
+	    case LocalId:
 		if (!(
 		      getval(fp, (struct buf*)0, false) &&
 		      keeprev(fp) &&
--- src/rcskeys.c
+++ freebsd/gnu/usr.bin/rcs/lib/rcskeys.c
@@ -67,14 +66,22 @@
 libId(keysId, "$Id: rcskeys.c,v 5.4 1995/06/16 06:19:24 eggert Exp $")
 
 
-char const *const Keyword[] = {
+char const *Keyword[] = {
     /* This must be in the same order as rcsbase.h's enum markers type. */
 	0,
 	AUTHOR, DATE, HEADER, IDH,
-	LOCKER, LOG, NAME, RCSFILE, REVISION, SOURCE, STATE
+	LOCKER, LOG, NAME, RCSFILE, REVISION, SOURCE, STATE, CVSHEADER,
+	NULL
 };
 
-
+/* Expand all keywords by default */
+static int ExpandKeyword[] = {
+	false,
+	true, true, true, true,
+	true, true, true, true, true, true, true, true,
+	true
+};
+enum markers LocalIdMode = Id;
 
 	enum markers
 trymatch(string)
@@ -87,8 +94,12 @@ trymatch(string)
         register int j;
 	register char const *p, *s;
 	for (j = sizeof(Keyword)/sizeof(*Keyword);  (--j);  ) {
+		if (!ExpandKeyword[j])
+			continue;
 		/* try next keyword */
 		p = Keyword[j];
+		if (p == NULL)
+			continue;
 		s = string;
 		while (*p++ == *s++) {
 			if (!*p)
@@ -104,3 +115,72 @@ trymatch(string)
         return(Nomatch);
 }
 
+	void
+setIncExc(arg)
+	char const *arg;
+/* Sets up the ExpandKeyword table according to command-line flags */
+{
+	char *key;
+	char *copy, *next;
+	int include = 0, j;
+
+	copy = strdup(arg);
+	next = copy;
+	switch (*next++) {
+	    case 'e':
+		include = false;
+		break;
+	    case 'i':
+		include = true;
+		break;
+	    default:
+		free(copy);
+		return;
+	}
+	if (include)
+		for (j = sizeof(Keyword)/sizeof(*Keyword);  (--j);  )
+			ExpandKeyword[j] = false;
+	key = strtok(next, ",");
+	while (key) {
+		for (j = sizeof(Keyword)/sizeof(*Keyword);  (--j);  ) {
+			if (Keyword[j] == NULL)
+				continue;
+			if (!strcmp(key, Keyword[j]))
+				ExpandKeyword[j] = include;
+		}
+		key = strtok(NULL, ",");
+	}
+	free(copy);
+	return;
+}
+
+	void
+setRCSLocalId(string)
+	char const *string;
+/* function: sets local RCS id and RCSLOCALID envariable */
+{
+	static char local_id[keylength+1];
+	char *copy, *next, *key;
+	int j;
+
+	copy = strdup(string);
+	next = copy;
+	key = strtok(next, "=");
+	if (strlen(key) > keylength)
+		faterror("LocalId is too long");
+	VOID strcpy(local_id, key);
+	Keyword[LocalId] = local_id;
+
+	/* options? */
+	while (key = strtok(NULL, ",")) {
+		if (!strcmp(key, Keyword[Id]))
+			LocalIdMode=Id;
+		else if (!strcmp(key, Keyword[Header]))
+			LocalIdMode=Header;
+		else if (!strcmp(key, Keyword[CVSHeader]))
+			LocalIdMode=CVSHeader;
+		else
+			error("Unknown LocalId mode");
+	}
+	free(copy);
+}
--- src/rcsrev.c
+++ freebsd/gnu/usr.bin/rcs/lib/rcsrev.c	1999-08-28 03:37:10.000000000 +0400
@@ -883,17 +882,17 @@ int argc; char * argv[];
                 /* all output goes to stderr, to have diagnostics and       */
                 /* errors in sequence.                                      */
 		aputs("\nEnter revision number or <return> or '.': ",stderr);
-		if (!gets(symrevno)) break;
+		if (!fgets(symrevno, 100, stdin)) break;
                 if (*symrevno == '.') break;
 		aprintf(stderr,"%s;\n",symrevno);
 		expandsym(symrevno,&numricrevno);
 		aprintf(stderr,"expanded number: %s; ",numricrevno.string);
 		aprintf(stderr,"Date: ");
-		gets(date); aprintf(stderr,"%s; ",date);
+		fgets(date, 20, stdin); aprintf(stderr,"%s; ",date);
 		aprintf(stderr,"Author: ");
-		gets(author); aprintf(stderr,"%s; ",author);
+		fgets(author, 20, stdin); aprintf(stderr,"%s; ",author);
 		aprintf(stderr,"State: ");
-		gets(state); aprintf(stderr, "%s;\n", state);
+		fgets(state, 20, stdin); aprintf(stderr, "%s;\n", state);
 		target = genrevs(numricrevno.string, *date?date:(char *)0, *author?author:(char *)0,
 				 *state?state:(char*)0, &gendeltas);
 		if (target) {
--- src/rcsutil.c
+++ freebsd/gnu/usr.bin/rcs/lib/rcsutil.c	1999-08-28 03:37:10.000000000 +0400
@@ -1231,8 +1230,15 @@ getRCSINIT(argc, argv, newargv)
 	char **argv, ***newargv;
 {
 	register char *p, *q, **pp;
+	char const *ev;
 	size_t n;
 
+	if ((ev = cgetenv("RCSLOCALID")))
+		setRCSLocalId(ev);
+
+	if ((ev = cgetenv("RCSINCEXC")))
+		setIncExc(ev);
+
 	if (!(q = cgetenv("RCSINIT")))
 		*newargv = argv;
 	else {
--- src/rcsdiff.c
+++ freebsd/gnu/usr.bin/rcs/rcsdiff/rcsdiff.c	1999-08-28 03:37:10.000000000 +0400
@@ -216,7 +215,7 @@ mainProg(rcsdiffId, "rcsdiff", "$Id: rcs
 		    /* fall into */
 	    case 'C': case 'F': case 'I': case 'L': case 'W':
 #if DIFF_L
-		    if (c == 'L'  &&  ++file_labels == 2)
+		    if (c == 'L'  &&  file_labels++ == 2)
 			faterror("too many -L options");
 #endif
 		    *dcp++ = c;
--- src/rlog.c
+++ freebsd/gnu/usr.bin/rcs/rlog/rlog.c	1999-08-28 03:37:10.000000000 +0400
@@ -222,7 +221,7 @@
 mainProg(rlogId, "rlog", "$Id: rlog.c,v 5.18 1995/06/16 06:19:24 eggert Exp $")
 {
 	static char const cmdusage[] =
-		"\nrlog usage: rlog -{bhLNRt} -ddates -l[lockers] -r[revs] -sstates -Vn -w[logins] -xsuff -zzone file ...";
+		"\nrlog usage: rlog -{bhLNRt} -v[string] -ddates -l[lockers] -r[revs] -sstates -Vn -w[logins] -xsuff -zzone file ...";
 
 	register FILE *out;
 	char *a, **newargv;
@@ -239,9 +238,12 @@ mainProg(rlogId, "rlog", "$Id: rlog.c,v 
 	int pre5;
 	int shownames;
 	int revno;
+	int versionlist;
+	char *vstring;
 
         descflag = selectflag = shownames = true;
-	onlylockflag = onlyRCSflag = false;
+	versionlist = onlylockflag = onlyRCSflag = false;
+	vstring=0;
 	out = stdout;
 	suffixes = X_DEFAULT;
 
@@ -318,6 +320,11 @@ mainProg(rlogId, "rlog", "$Id: rlog.c,v 
 			setRCSversion(*argv);
 			break;
 
+		case 'v':
+			versionlist = true;
+			vstring = a;
+			break;
+
                 default:
 		unknown:
 			error("unknown option: %s%s", *argv, cmdusage);
@@ -371,6 +378,12 @@ mainProg(rlogId, "rlog", "$Id: rlog.c,v 
 	    if (onlylockflag && !Locks)
 		continue;
 
+	    if ( versionlist ) {
+		gettree();
+		aprintf(out, "%s%s %s\n", vstring, workname, tiprev());
+		continue;
+	    }
+
 	    if ( onlyRCSflag ) {
 		aprintf(out, "%s\n", RCSname);
 		continue;
@@ -462,6 +475,7 @@ mainProg(rlogId, "rlog", "$Id: rlog.c,v 
 		putrunk();
 		putree(Head);
 	    }
+	    aputs("----------------------------\n", out);
 	    aputs("=============================================================================\n",out);
 	  }
 	Ofclose(out);
--- patch-freebsd.diff ends here ---

>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-ports-bugs mailing list