Initial round of support for a local $Id$ keyword in cvs, eg: $FreeBSD$.
This is not complete yet in that it doesn't drive our version of RCS completely, but it does work fine when you do the appropriate magic. Obtained from: OpenBSD source tree
This commit is contained in:
parent
174a377378
commit
12c4ced9fa
@ -182,6 +182,7 @@ extern int errno;
|
||||
#define CVSROOTADM_READERS "readers"
|
||||
#define CVSROOTADM_WRITERS "writers"
|
||||
#define CVSROOTADM_PASSWD "passwd"
|
||||
#define CVSROOTADM_OPTIONS "options"
|
||||
|
||||
#define CVSNULLREPOS "Emptydir" /* an empty directory */
|
||||
|
||||
@ -360,6 +361,7 @@ extern int really_quiet, quiet;
|
||||
extern int use_editor;
|
||||
extern int cvswrite;
|
||||
extern mode_t cvsumask;
|
||||
extern char *RCS_citag;
|
||||
|
||||
/* Access method specified in CVSroot. */
|
||||
typedef enum {
|
||||
@ -449,6 +451,7 @@ int isabsolute PROTO((const char *filename));
|
||||
char *last_component PROTO((char *path));
|
||||
char *get_homedir PROTO ((void));
|
||||
char *cvs_temp_name PROTO ((void));
|
||||
void parseopts PROTO ((const char *root));
|
||||
|
||||
int numdots PROTO((const char *s));
|
||||
int unlink_file PROTO((const char *f));
|
||||
|
@ -42,6 +42,7 @@ int trace = FALSE;
|
||||
int noexec = FALSE;
|
||||
int logoff = FALSE;
|
||||
mode_t cvsumask = UMASK_DFLT;
|
||||
char *RCS_citag = NULL;
|
||||
|
||||
char *CurDir;
|
||||
|
||||
@ -736,6 +737,7 @@ main (argc, argv)
|
||||
error (1, save_errno, "%s", path);
|
||||
}
|
||||
free (path);
|
||||
parseopts(CVSroot_directory);
|
||||
}
|
||||
|
||||
#ifdef HAVE_PUTENV
|
||||
@ -791,6 +793,12 @@ main (argc, argv)
|
||||
(void) putenv (env);
|
||||
/* do not free env, as putenv has control of it */
|
||||
}
|
||||
{
|
||||
char *env;
|
||||
env = xmalloc (sizeof "CVS_PID=" + 32); /* XXX pid < 10^32 */
|
||||
(void) sprintf (env, "CVS_PID=%ld", (long) getpid ());
|
||||
(void) putenv (env);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
@ -907,3 +915,77 @@ usage (cpp)
|
||||
(void) fprintf (stderr, *cpp);
|
||||
error_exit ();
|
||||
}
|
||||
|
||||
void
|
||||
parseopts(root)
|
||||
const char *root;
|
||||
{
|
||||
char path[PATH_MAX];
|
||||
int save_errno;
|
||||
char buf[1024];
|
||||
const char *p;
|
||||
char *q;
|
||||
FILE *fp;
|
||||
|
||||
if (root == NULL) {
|
||||
printf("no CVSROOT in parseopts\n");
|
||||
return;
|
||||
}
|
||||
p = strchr (root, ':');
|
||||
if (p)
|
||||
p++;
|
||||
else
|
||||
p = root;
|
||||
if (p == NULL) {
|
||||
printf("mangled CVSROOT in parseopts\n");
|
||||
return;
|
||||
}
|
||||
(void) sprintf (path, "%s/%s/%s", p, CVSROOTADM, CVSROOTADM_OPTIONS);
|
||||
if ((fp = fopen(path, "r")) != NULL) {
|
||||
while (fgets(buf, sizeof buf, fp) != NULL) {
|
||||
if (buf[0] == '#')
|
||||
continue;
|
||||
q = strrchr(buf, '\n');
|
||||
if (q)
|
||||
*q = '\0';
|
||||
|
||||
if (!strncmp(buf, "tag=", 4)) {
|
||||
char *what;
|
||||
|
||||
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);
|
||||
if (what == NULL) {
|
||||
printf("no memory for local tag\n");
|
||||
return;
|
||||
}
|
||||
sprintf(what, "RCSLOCALID=%s", RCS_citag);
|
||||
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;
|
||||
|
||||
(void) setrlimit(RLIMIT_DATA, &rl);
|
||||
}
|
||||
#endif /* BSD */
|
||||
}
|
||||
#endif /* 0 */
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
}
|
||||
|
@ -2176,7 +2176,7 @@ struct rcs_keyword
|
||||
size_t len;
|
||||
};
|
||||
#define KEYWORD_INIT(s) (s), sizeof (s) - 1
|
||||
static const struct rcs_keyword keywords[] =
|
||||
static struct rcs_keyword keywords[] =
|
||||
{
|
||||
{ KEYWORD_INIT ("Author") },
|
||||
{ KEYWORD_INIT ("Date") },
|
||||
@ -2189,6 +2189,7 @@ static const struct rcs_keyword keywords[] =
|
||||
{ KEYWORD_INIT ("Revision") },
|
||||
{ KEYWORD_INIT ("Source") },
|
||||
{ KEYWORD_INIT ("State") },
|
||||
{ NULL, 0 },
|
||||
{ NULL, 0 }
|
||||
};
|
||||
enum keyword
|
||||
@ -2203,7 +2204,8 @@ enum keyword
|
||||
KEYWORD_RCSFILE,
|
||||
KEYWORD_REVISION,
|
||||
KEYWORD_SOURCE,
|
||||
KEYWORD_STATE
|
||||
KEYWORD_STATE,
|
||||
KEYWORD_LOCALID
|
||||
};
|
||||
|
||||
/* Convert an RCS date string into a readable string. This is like
|
||||
@ -2340,6 +2342,11 @@ 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)
|
||||
@ -2464,6 +2471,7 @@ expand_keywords (rcs, ver, name, log, loglen, expand, buf, len, retbuf, retlen)
|
||||
|
||||
case KEYWORD_HEADER:
|
||||
case KEYWORD_ID:
|
||||
case KEYWORD_LOCALID:
|
||||
{
|
||||
char *path;
|
||||
int free_path;
|
||||
|
@ -565,6 +565,7 @@ Sorry, you don't have read/write access to the history file %s", path);
|
||||
(void) putenv (env);
|
||||
/* do not free env, as putenv has control of it */
|
||||
#endif
|
||||
parseopts(CVSroot_directory);
|
||||
}
|
||||
|
||||
static int max_dotdot_limit = 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user