summaryrefslogtreecommitdiffstats
path: root/contrib
diff options
context:
space:
mode:
Diffstat (limited to 'contrib')
-rw-r--r--contrib/cvs/src/main.c47
-rw-r--r--contrib/cvs/src/rcs.c143
-rw-r--r--contrib/cvs/src/rcs.h3
3 files changed, 148 insertions, 45 deletions
diff --git a/contrib/cvs/src/main.c b/contrib/cvs/src/main.c
index 095a36d..df2d9bf 100644
--- a/contrib/cvs/src/main.c
+++ b/contrib/cvs/src/main.c
@@ -42,7 +42,6 @@ int trace = FALSE;
int noexec = FALSE;
int logoff = FALSE;
mode_t cvsumask = UMASK_DFLT;
-char *RCS_citag = NULL;
char *CurDir;
@@ -951,40 +950,38 @@ parseopts(root)
if (!strncmp(buf, "tag=", 4)) {
char *what;
+ char *rcs_localid;
- RCS_citag = strdup(buf+4);
- if (RCS_citag == NULL) {
- printf("no memory for local tag\n");
- return;
- }
- what = malloc(sizeof("RCSLOCALID")+1+strlen(RCS_citag)+1);
+ rcs_localid = buf + 4;
+ RCS_setlocalid(rcs_localid);
+ what = malloc(sizeof("RCSLOCALID") + 2 + strlen(rcs_localid));
if (what == NULL) {
printf("no memory for local tag\n");
return;
}
- sprintf(what, "RCSLOCALID=%s", RCS_citag);
+ sprintf(what, "RCSLOCALID=%s", rcs_localid);
putenv(what);
}
-#if 0 /* not yet.. gotta rethink the implications */
- else if (!strncmp(buf, "umask=", 6)) {
- mode_t mode;
-
- cvsumask = (mode_t)(strtol(buf+6, NULL, 8) & 0777);
- }
- else if (!strncmp(buf, "dlimit=", 7)) {
-#ifdef BSD
-#include <sys/resource.h>
- struct rlimit rl;
-
- if (getrlimit(RLIMIT_DATA, &rl) != -1) {
- rl.rlim_cur = atoi(buf+7);
- rl.rlim_cur *= 1024;
+ if (!strncmp(buf, "tagexpand=", 10)) {
+ char *what;
+ char *rcs_incexc;
- (void) setrlimit(RLIMIT_DATA, &rl);
+ rcs_incexc = buf + 10;
+ RCS_setincexc(rcs_incexc);
+ what = malloc(sizeof("RCSINCEXC") + 2 + strlen(rcs_incexc));
+ if (what == NULL) {
+ printf("no memory for tag expand mode\n");
+ return;
}
-#endif /* BSD */
+ sprintf(what, "RCSINCEXC=%s", rcs_incexc);
+ putenv(what);
}
-#endif /* 0 */
+ /*
+ * OpenBSD has a "umask=" and "dlimit=" command, we silently
+ * ignore them here since they are not much use to us. cvsumask
+ * defaults to 002 already, and the dlimit (data size limit)
+ * should really be handled elsewhere.
+ */
}
fclose(fp);
}
diff --git a/contrib/cvs/src/rcs.c b/contrib/cvs/src/rcs.c
index 663365b..899167a 100644
--- a/contrib/cvs/src/rcs.c
+++ b/contrib/cvs/src/rcs.c
@@ -41,6 +41,8 @@ enum rcs_delta_op {RCS_ANNOTATE, RCS_FETCH};
static void RCS_deltas PROTO ((RCSNode *, FILE *, char *, enum rcs_delta_op,
char **, size_t *, char **, size_t *));
+static char * getfullCVSname PROTO ((char *));
+
/*
* We don't want to use isspace() from the C library because:
*
@@ -2174,28 +2176,31 @@ struct rcs_keyword
{
const char *string;
size_t len;
+ int expandit;
};
#define KEYWORD_INIT(s) (s), sizeof (s) - 1
static struct rcs_keyword keywords[] =
{
- { KEYWORD_INIT ("Author") },
- { KEYWORD_INIT ("Date") },
- { KEYWORD_INIT ("Header") },
- { KEYWORD_INIT ("Id") },
- { KEYWORD_INIT ("Locker") },
- { KEYWORD_INIT ("Log") },
- { KEYWORD_INIT ("Name") },
- { KEYWORD_INIT ("RCSfile") },
- { KEYWORD_INIT ("Revision") },
- { KEYWORD_INIT ("Source") },
- { KEYWORD_INIT ("State") },
- { NULL, 0 },
- { NULL, 0 }
+ { KEYWORD_INIT ("Author"), 1 },
+ { KEYWORD_INIT ("Date"), 1 },
+ { KEYWORD_INIT ("CVSHeader"), 1 },
+ { KEYWORD_INIT ("Header"), 1 },
+ { KEYWORD_INIT ("Id"), 1 },
+ { KEYWORD_INIT ("Locker"), 1 },
+ { KEYWORD_INIT ("Log"), 1 },
+ { KEYWORD_INIT ("Name"), 1 },
+ { KEYWORD_INIT ("RCSfile"), 1 },
+ { KEYWORD_INIT ("Revision"), 1 },
+ { KEYWORD_INIT ("Source"), 1 },
+ { KEYWORD_INIT ("State"), 1 },
+ { NULL, 0, 0 },
+ { NULL, 0, 0 }
};
enum keyword
{
KEYWORD_AUTHOR = 0,
KEYWORD_DATE,
+ KEYWORD_CVSHEADER,
KEYWORD_HEADER,
KEYWORD_ID,
KEYWORD_LOCKER,
@@ -2207,6 +2212,7 @@ enum keyword
KEYWORD_STATE,
KEYWORD_LOCALID
};
+enum keyword keyword_local = KEYWORD_ID;
/* Convert an RCS date string into a readable string. This is like
the RCS date2str function. */
@@ -2342,11 +2348,6 @@ expand_keywords (rcs, ver, name, log, loglen, expand, buf, len, retbuf, retlen)
return;
}
- if (RCS_citag != NULL && keywords[KEYWORD_LOCALID].string == NULL) {
- keywords[KEYWORD_LOCALID].string = RCS_citag;
- keywords[KEYWORD_LOCALID].len = strlen(RCS_citag);
- }
-
/* If we are using -kkvl, dig out the locker information if any. */
locker = NULL;
if (expand == KFLAG_KVL && rcs->other != NULL)
@@ -2422,7 +2423,8 @@ expand_keywords (rcs, ver, name, log, loglen, expand, buf, len, retbuf, retlen)
slen = s - srch;
for (keyword = keywords; keyword->string != NULL; keyword++)
{
- if (keyword->len == slen
+ if (keyword->expandit
+ && keyword->len == slen
&& strncmp (keyword->string, srch, slen) == 0)
{
break;
@@ -2469,6 +2471,7 @@ expand_keywords (rcs, ver, name, log, loglen, expand, buf, len, retbuf, retlen)
free_value = 1;
break;
+ case KEYWORD_CVSHEADER:
case KEYWORD_HEADER:
case KEYWORD_ID:
case KEYWORD_LOCALID:
@@ -2477,8 +2480,14 @@ expand_keywords (rcs, ver, name, log, loglen, expand, buf, len, retbuf, retlen)
int free_path;
char *date;
- if (kw == KEYWORD_HEADER)
+ if (kw == KEYWORD_HEADER ||
+ (kw == KEYWORD_LOCALID &&
+ keyword_local == KEYWORD_HEADER))
path = rcs->path;
+ else if (kw == KEYWORD_CVSHEADER ||
+ (kw == KEYWORD_LOCALID &&
+ keyword_local == KEYWORD_CVSHEADER))
+ path = getfullCVSname(rcs->path);
else
path = last_component (rcs->path);
path = escape_keyword_value (path, &free_path);
@@ -4284,3 +4293,97 @@ annotate (argc, argv)
argc, argv, local, W_LOCAL, 0, 1, (char *)NULL,
1);
}
+
+void
+RCS_setlocalid (arg)
+ const char *arg;
+{
+ char *copy, *next, *key;
+
+ copy = strdup(arg);
+ next = copy;
+ key = strtok(next, "=");
+
+ keywords[KEYWORD_LOCALID].string = strdup(key);
+ keywords[KEYWORD_LOCALID].len = strlen(key);
+
+ /* options? */
+ while (key = strtok(NULL, ",")) {
+ if (!strcmp(key, keywords[KEYWORD_ID].string))
+ keyword_local = KEYWORD_ID;
+ else if (!strcmp(key, keywords[KEYWORD_HEADER].string))
+ keyword_local = KEYWORD_HEADER;
+ else if (!strcmp(key, keywords[KEYWORD_CVSHEADER].string))
+ keyword_local = KEYWORD_CVSHEADER;
+ else
+ error(1, 0, "Unknown LocalId mode: %s", key);
+ }
+ free(copy);
+}
+
+void
+RCS_setincexc (arg)
+ const char *arg;
+{
+ char *key;
+ char *copy, *next;
+ int include = 0;
+ struct rcs_keyword *keyword;
+
+ copy = strdup(arg);
+ next = copy;
+ switch (*next++) {
+ case 'e':
+ include = 0;
+ break;
+ case 'i':
+ include = 1;
+ break;
+ default:
+ free(copy);
+ return;
+ }
+
+ if (include)
+ for (keyword = keywords; keyword->string != NULL; keyword++)
+ {
+ keyword->expandit = 0;
+ }
+
+ key = strtok(next, ",");
+ while (key) {
+ for (keyword = keywords; keyword->string != NULL; keyword++) {
+ if (strcmp (keyword->string, key) == 0)
+ keyword->expandit = include;
+ }
+ key = strtok(NULL, ",");
+ }
+ free(copy);
+ return;
+}
+
+static char *
+getfullCVSname(CVSname)
+ char *CVSname;
+{
+ int rootlen;
+
+ if (CVSroot_directory) {
+ rootlen = strlen(CVSroot_directory);
+ /* ignore trailing '/' chars from $CVSROOT */
+ while (rootlen > 0) {
+ if (CVSroot_directory[rootlen - 1] == '/')
+ rootlen--;
+ else
+ break;
+ }
+ if (strncmp(CVSname, CVSroot_directory, rootlen) == 0) {
+ CVSname += rootlen;
+ /* skip any leading '/' chars */
+ while (*CVSname == '/')
+ CVSname++;
+ return CVSname;
+ }
+ }
+ return CVSname;
+}
diff --git a/contrib/cvs/src/rcs.h b/contrib/cvs/src/rcs.h
index 3de8c91..64d03e0 100644
--- a/contrib/cvs/src/rcs.h
+++ b/contrib/cvs/src/rcs.h
@@ -126,3 +126,6 @@ int RCS_lock PROTO ((RCSNode *, const char *, int));
int RCS_unlock PROTO ((RCSNode *, const char *, int));
int rcs_change_text PROTO ((const char *, char *, size_t, const char *,
size_t, char **, size_t *));
+
+void RCS_setlocalid PROTO ((const char *arg));
+void RCS_setincexc PROTO ((const char *arg));
OpenPOWER on IntegriCloud