diff options
Diffstat (limited to 'usr.bin/cvs')
-rw-r--r-- | usr.bin/cvs/cvs.h | 7 | ||||
-rw-r--r-- | usr.bin/cvs/util.c | 122 |
2 files changed, 125 insertions, 4 deletions
diff --git a/usr.bin/cvs/cvs.h b/usr.bin/cvs/cvs.h index 0d16dbc8080..ec2491d05a3 100644 --- a/usr.bin/cvs/cvs.h +++ b/usr.bin/cvs/cvs.h @@ -1,4 +1,4 @@ -/* $OpenBSD: cvs.h,v 1.80 2005/08/16 16:34:19 xsa Exp $ */ +/* $OpenBSD: cvs.h,v 1.81 2005/09/05 19:29:42 xsa Exp $ */ /* * Copyright (c) 2004 Jean-Francois Brousseau <jfb@openbsd.org> * All rights reserved. @@ -139,6 +139,7 @@ #define CVS_PATH_LOGENTRIES CVS_PATH_CVSDIR "/Entries.Log" #define CVS_PATH_ROOTSPEC CVS_PATH_CVSDIR "/Root" #define CVS_PATH_REPOSITORY CVS_PATH_CVSDIR "/Repository" +#define CVS_PATH_TAG CVS_PATH_CVSDIR "/Tag" /* flags for cmd_flags */ @@ -367,7 +368,7 @@ void cvsroot_free(struct cvsroot *); struct cvsroot *cvsroot_get(const char *); -/* Entries API */ +/* entries.c */ CVSENTRIES *cvs_ent_open(const char *, int); struct cvs_ent *cvs_ent_get(CVSENTRIES *, const char *); struct cvs_ent *cvs_ent_next(CVSENTRIES *); @@ -412,6 +413,8 @@ int cvs_create_dir(const char *, int, char *, char *); char *cvs_rcs_getpath(CVSFILE *, char *, size_t); char **cvs_makeargv(const char *, int *); void cvs_freeargv(char **, int); +void cvs_write_tagfile(char *, char *, int); +void cvs_parse_tagfile(char **, char **, int *); size_t cvs_path_cat(const char *, const char *, char *, size_t); diff --git a/usr.bin/cvs/util.c b/usr.bin/cvs/util.c index 285a65b431c..0136acafeb8 100644 --- a/usr.bin/cvs/util.c +++ b/usr.bin/cvs/util.c @@ -1,4 +1,4 @@ -/* $OpenBSD: util.c,v 1.50 2005/08/17 08:35:53 xsa Exp $ */ +/* $OpenBSD: util.c,v 1.51 2005/09/05 19:29:42 xsa Exp $ */ /* * Copyright (c) 2004 Jean-Francois Brousseau <jfb@openbsd.org> * All rights reserved. @@ -281,7 +281,6 @@ cvs_splitpath(const char *path, char *base, size_t blen, char **file) return (0); } - /* * cvs_getargv() * @@ -789,3 +788,122 @@ cvs_rcs_getpath(CVSFILE *file, char *buf, size_t len) return (buf); } + +/* + * cvs_write_tagfile() + * + * Write the CVS/Tag file for current directory. + */ +void +cvs_write_tagfile(char *tag, char *date, int nb) +{ + FILE *fp; + char tagpath[MAXPATHLEN]; + + if (cvs_noexec == 1) + return; + + if (strlcpy(tagpath, CVS_PATH_TAG, sizeof(tagpath)) >= sizeof(tagpath)) + return; + + if ((tag != NULL) || (date != NULL)) { + fp = fopen(tagpath, "w+"); + if (fp == NULL) { + if (errno != ENOENT) + cvs_log(LP_NOTICE, + "failed to open `%s' : %s", tagpath, + strerror(errno)); + return; + } + if (tag != NULL) { + if (nb != 0) + fprintf(fp, "N%s\n", tag); + else + fprintf(fp, "T%s\n", tag); + } else { + fprintf(fp, "D%s\n", date); + } + (void)fclose(fp); + } else { + cvs_unlink(tagpath); + return; + } +} + +/* + * cvs_parse_tagfile() + * + * Parse the CVS/Tag file for current directory. + * + * If it contains a branch tag, sets <tagp>. + * If it contains a date, sets <datep>. + * If it contains a non-branch tag, sets <nbp>. + * + * Returns nothing but an error message, and sets <tagp>, <datep> to NULL + * and <nbp> to 0. + */ +void +cvs_parse_tagfile(char **tagp, char **datep, int *nbp) +{ + FILE *fp; + int linenum; + size_t len; + char linebuf[128], tagpath[MAXPATHLEN]; + + if (tagp != NULL) + *tagp = (char *)NULL; + + if (datep != NULL) + *datep = (char *)NULL; + + if (nbp != NULL) + *nbp = 0; + + if (strlcpy(tagpath, CVS_PATH_TAG, sizeof(tagpath)) >= sizeof(tagpath)) + return; + + fp = fopen(tagpath, "r"); + if (fp == NULL) { + if (errno != ENOENT) + cvs_log(LP_NOTICE, "failed to open `%s' : %s", tagpath, + strerror(errno)); + return; + } + + linenum = 0; + + while (fgets(linebuf, (int)sizeof(linebuf), fp) != NULL) { + linenum++; + if ((len = strlen(linebuf)) == 0) + continue; + if (linebuf[len -1] != '\n') { + cvs_log(LP_WARN, "line too long in `%s:%d'", tagpath, + linenum); + break; + } + linebuf[--len] = '\0'; + + switch(*linebuf) { + case 'T': + if (tagp != NULL) + *tagp = strdup(linebuf); + break; + case 'D': + if (datep != NULL) + *datep = strdup(linebuf); + break; + case 'N': + if (tagp != NULL) + *tagp = strdup(linebuf); + if (nbp != NULL) + *nbp = 1; + break; + default: + break; + } + } + if (ferror(fp)) + cvs_log(LP_NOTICE, "failed to read line from `%s'", tagpath); + + (void)fclose(fp); +} |