summaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorJean-Francois Brousseau <jfb@cvs.openbsd.org>2005-05-26 00:51:37 +0000
committerJean-Francois Brousseau <jfb@cvs.openbsd.org>2005-05-26 00:51:37 +0000
commit79fdcce75bf5ff2d3c33c56e508350036bc25f9b (patch)
tree36e6894f23d82db03684e846c5003f7e2cf55be4 /usr.bin
parent91068b74bf81783bc184f41f9b0452e8648e6b6b (diff)
support the -b option in local mode as well and rearrange the branch
code a bit to get rid of an annoying global. Also remove a memory leak by adding a cleanup handler and print the number of conflicts created while importing
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/cvs/import.c65
1 files changed, 48 insertions, 17 deletions
diff --git a/usr.bin/cvs/import.c b/usr.bin/cvs/import.c
index 9afe799c9fc..8f8b760f700 100644
--- a/usr.bin/cvs/import.c
+++ b/usr.bin/cvs/import.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: import.c,v 1.18 2005/05/25 21:47:19 jfb Exp $ */
+/* $OpenBSD: import.c,v 1.19 2005/05/26 00:51:36 jfb Exp $ */
/*
* Copyright (c) 2004 Joris Vink <joris@openbsd.org>
* All rights reserved.
@@ -41,14 +41,20 @@
#define CVS_IMPORT_DEFBRANCH "1.1.1"
+
static int cvs_import_init (struct cvs_cmd *, int, char **, int *);
static int cvs_import_pre_exec (struct cvsroot *);
+static int cvs_import_pre_exec (struct cvsroot *);
+static int cvs_import_post_exec(struct cvsroot *);
static int cvs_import_remote (CVSFILE *, void *);
static int cvs_import_local (CVSFILE *, void *);
+static int cvs_import_cleanup (void);
static int dflag = 0;
-static RCSNUM *bnum;
-static char *branch, *module, *vendor, *release;
+static int conflicts = 0;
+static RCSNUM *imp_brnum;
+
+static char *module, *vendor, *release;
struct cvs_cmd cvs_cmd_import = {
CVS_OP_IMPORT, CVS_REQ_IMPORT, "import",
@@ -63,8 +69,8 @@ struct cvs_cmd cvs_cmd_import = {
cvs_import_pre_exec,
cvs_import_remote,
cvs_import_local,
- NULL,
- NULL,
+ cvs_import_post_exec,
+ cvs_import_cleanup,
CVS_CMD_SENDDIR
};
@@ -73,18 +79,14 @@ cvs_import_init(struct cvs_cmd *cmd, int argc, char **argv, int *arg)
{
int ch;
- branch = CVS_IMPORT_DEFBRANCH;
-
while ((ch = getopt(argc, argv, cmd->cmd_opts)) != -1) {
switch (ch) {
case 'b':
- branch = optarg;
- if ((bnum = rcsnum_parse(branch)) == NULL) {
+ if ((imp_brnum = rcsnum_parse(optarg)) == NULL) {
cvs_log(LP_ERR, "%s is not a numeric branch",
- branch);
+ optarg);
return (CVS_EX_USAGE);
}
- rcsnum_free(bnum);
break;
case 'd':
dflag = 1;
@@ -112,10 +114,15 @@ cvs_import_init(struct cvs_cmd *cmd, int argc, char **argv, int *arg)
argc -= optind;
argv += optind;
-
if (argc != 3)
return (CVS_EX_USAGE);
+ if ((imp_brnum == NULL) &&
+ ((imp_brnum = rcsnum_parse(CVS_IMPORT_DEFBRANCH)) == NULL)) {
+ cvs_log(LP_ERR, "failed to parse default import branch");
+ return (CVS_EX_DATA);
+ }
+
module = argv[0];
vendor = argv[1];
release = argv[2];
@@ -132,7 +139,7 @@ cvs_import_init(struct cvs_cmd *cmd, int argc, char **argv, int *arg)
static int
cvs_import_pre_exec(struct cvsroot *root)
{
- char repodir[MAXPATHLEN];
+ char numbuf[64], repodir[MAXPATHLEN];
if (root->cr_method == CVS_METHOD_LOCAL) {
snprintf(repodir, sizeof(repodir), "%s/%s", root->cr_dir,
@@ -142,8 +149,10 @@ cvs_import_pre_exec(struct cvsroot *root)
return (CVS_EX_DATA);
}
} else {
+ rcsnum_tostr(imp_brnum, numbuf, sizeof(numbuf));
+
if ((cvs_sendarg(root, "-b", 0) < 0) ||
- (cvs_sendarg(root, branch, 0) < 0) ||
+ (cvs_sendarg(root, numbuf, 0) < 0) ||
(cvs_logmsg_send(root, cvs_msg) < 0) ||
(cvs_sendarg(root, module, 0) < 0) ||
(cvs_sendarg(root, vendor, 0) < 0) ||
@@ -154,6 +163,22 @@ cvs_import_pre_exec(struct cvsroot *root)
return (0);
}
+static int
+cvs_import_post_exec(struct cvsroot *root)
+{
+ char buf[8];
+
+ if (root->cr_method == CVS_METHOD_LOCAL) {
+ if (conflicts > 0)
+ snprintf(buf, sizeof(buf), "%d", conflicts);
+
+ cvs_printf("\n%s conflicts created by this import\n\n",
+ conflicts == 0 ? "No" : buf);
+ }
+
+ return (CVS_EX_OK);
+}
+
/*
* cvs_import_remote()
*
@@ -324,13 +349,11 @@ cvs_import_local(CVSFILE *cf, void *arg)
return (CVS_EX_DATA);
}
-#if 0
- if (rcs_branch_set(rf, rev) < 0) {
+ if (rcs_branch_set(rf, imp_brnum) < 0) {
cvs_log(LP_ERR, "failed to set RCS default branch: %s",
strerror(rcs_errno));
return (CVS_EX_DATA);
}
-#endif
/* add the vendor tag and release tag as symbols */
rcs_close(rf);
@@ -340,3 +363,11 @@ cvs_import_local(CVSFILE *cf, void *arg)
return (CVS_EX_OK);
}
+
+static int
+cvs_import_cleanup(void)
+{
+ if (imp_brnum != NULL)
+ rcsnum_free(imp_brnum);
+ return (0);
+}