diff options
author | Joris Vink <joris@cvs.openbsd.org> | 2006-05-28 17:26:13 +0000 |
---|---|---|
committer | Joris Vink <joris@cvs.openbsd.org> | 2006-05-28 17:26:13 +0000 |
commit | 825cb4e5a457d43b597e4e3c3e28037f8cb804db (patch) | |
tree | bb732850ee9bfb026ad08c1eed87d98bec2cd169 /usr.bin/cvs/add.c | |
parent | ba54056f0ec2e5f1552b8ce2356271757127969c (diff) |
our add command can now add directories to the repository as well.
Diffstat (limited to 'usr.bin/cvs/add.c')
-rw-r--r-- | usr.bin/cvs/add.c | 93 |
1 files changed, 87 insertions, 6 deletions
diff --git a/usr.bin/cvs/add.c b/usr.bin/cvs/add.c index 1004085ee8c..ea9d88cd359 100644 --- a/usr.bin/cvs/add.c +++ b/usr.bin/cvs/add.c @@ -1,4 +1,4 @@ -/* $OpenBSD: add.c,v 1.44 2006/05/28 10:15:35 joris Exp $ */ +/* $OpenBSD: add.c,v 1.45 2006/05/28 17:26:12 joris Exp $ */ /* * Copyright (c) 2006 Joris Vink <joris@openbsd.org> * @@ -25,6 +25,9 @@ int cvs_add(int, char **); void cvs_add_local(struct cvs_file *); +static void add_directory(struct cvs_file *); +static void add_file(struct cvs_file *); + char *logmsg; struct cvs_cmd cvs_cmd_add = { @@ -45,7 +48,7 @@ cvs_add(int argc, char **argv) char *arg = "."; struct cvs_recursion cr; - flags = CR_RECURSE_DIRS | CR_REPO; + flags = CR_REPO; while ((ch = getopt(argc, argv, cvs_cmd_add.cmd_opts)) != -1) { switch (ch) { @@ -77,14 +80,92 @@ cvs_add(int argc, char **argv) void cvs_add_local(struct cvs_file *cf) { - int stop, l; - char *entry, revbuf[16]; - CVSENTRIES *entlist; - cvs_log(LP_TRACE, "cvs_add_local(%s)", cf->file_path); cvs_file_classify(cf, 0); + if (cf->file_type == CVS_DIR) + add_directory(cf); + else + add_file(cf); +} + +static void +add_directory(struct cvs_file *cf) +{ + int l; + struct stat st; + CVSENTRIES *entlist; + char *entry, *repo; + + cvs_log(LP_TRACE, "add_directory(%s)", cf->file_path); + + entry = xmalloc(MAXPATHLEN); + l = snprintf(entry, MAXPATHLEN, "%s%s", cf->file_rpath, RCS_FILE_EXT); + if (l == -1 || l >= MAXPATHLEN) + fatal("cvs_add_local: overflow"); + + if (stat(entry, &st) != -1) { + cvs_log(LP_NOTICE, "cannot add directory %s: " + "a file with that name already exists", + cf->file_path); + } else { + l = snprintf(entry, MAXPATHLEN, "%s/%s", cf->file_path, + CVS_PATH_CVSDIR); + if (l == -1 || l >= MAXPATHLEN) + fatal("add_directory: overflow"); + + if (stat(entry, &st) != -1) { + if (!S_ISDIR(st.st_mode)) { + cvs_log(LP_ERR, "%s exists but is not " + "directory", entry); + } else { + cvs_log(LP_NOTICE, "%s already exists", + entry); + } + } else { + if (mkdir(cf->file_rpath, 0755) == -1 && + errno != EEXIST) + fatal("add_directory: %s: %s", cf->file_path, + strerror(errno)); + + repo = xmalloc(MAXPATHLEN); + cvs_get_repository_name(cf->file_wd, repo, + MAXPATHLEN); + + l = snprintf(entry, MAXPATHLEN, "%s/%s", repo, + cf->file_path); + + cvs_mkadmin(cf->file_path, current_cvsroot->cr_dir, + entry); + + xfree(repo); + xfree(entry); + + entry = xmalloc(CVS_ENT_MAXLINELEN); + l = snprintf(entry, CVS_ENT_MAXLINELEN, + "D/%s/////", cf->file_name); + entlist = cvs_ent_open(cf->file_wd); + cvs_ent_add(entlist, entry); + cvs_ent_close(entlist, ENT_SYNC); + + cvs_printf("Directory %s added to the repository\n", + cf->file_rpath); + } + } + + cf->file_status = FILE_SKIP; + xfree(entry); +} + +static void +add_file(struct cvs_file *cf) +{ + int l; + int stop; + char *entry, revbuf[16]; + CVSENTRIES *entlist; + if (cf->file_rcs != NULL) rcsnum_tostr(cf->file_rcs->rf_head, revbuf, sizeof(revbuf)); |