summaryrefslogtreecommitdiff
path: root/usr.bin/cvs/add.c
diff options
context:
space:
mode:
authorJoris Vink <joris@cvs.openbsd.org>2006-05-28 17:26:13 +0000
committerJoris Vink <joris@cvs.openbsd.org>2006-05-28 17:26:13 +0000
commit825cb4e5a457d43b597e4e3c3e28037f8cb804db (patch)
treebb732850ee9bfb026ad08c1eed87d98bec2cd169 /usr.bin/cvs/add.c
parentba54056f0ec2e5f1552b8ce2356271757127969c (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.c93
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));