diff options
author | Jean-Francois Brousseau <jfb@cvs.openbsd.org> | 2005-01-06 19:56:39 +0000 |
---|---|---|
committer | Jean-Francois Brousseau <jfb@cvs.openbsd.org> | 2005-01-06 19:56:39 +0000 |
commit | 5fc409fb4a59df4deddd5c8b027ed9bbd2f5131b (patch) | |
tree | 4d92d5cd67da8e8b81c140e0e3cf5f93b3f6dfdd /usr.bin/cvs/import.c | |
parent | aadaced04d315665e3feb85a6631588a23566130 (diff) |
Improved and working import code from Joris Vink with modifications
from me (client mode only for the moment)
Diffstat (limited to 'usr.bin/cvs/import.c')
-rw-r--r-- | usr.bin/cvs/import.c | 227 |
1 files changed, 79 insertions, 148 deletions
diff --git a/usr.bin/cvs/import.c b/usr.bin/cvs/import.c index 0e8a4a1c272..411db5f05ee 100644 --- a/usr.bin/cvs/import.c +++ b/usr.bin/cvs/import.c @@ -1,4 +1,4 @@ -/* $OpenBSD: import.c,v 1.2 2004/12/07 17:10:56 tedu Exp $ */ +/* $OpenBSD: import.c,v 1.3 2005/01/06 19:56:38 jfb Exp $ */ /* * Copyright (c) 2004 Joris Vink <amni@pandora.be> * All rights reserved. @@ -36,14 +36,18 @@ #include <string.h> #include <sysexits.h> -#include "cvs.h" #include "log.h" #include "file.h" +#include "cvs.h" #include "proto.h" -static int do_import(struct cvsroot *, char **); -static int cvs_import_dir(struct cvsroot *, char *, char *); -static int cvs_import_file(struct cvsroot *, CVSFILE *); + +#define CVS_IMPORT_DEFBRANCH "1.1.1" + + + +int cvs_import_file(CVSFILE *, void *); +char repo[MAXPATHLEN]; /* * cvs_import() @@ -54,14 +58,26 @@ int cvs_import(int argc, char **argv) { int ch, flags; - char *repo, *vendor, *release; + char *branch, *ep; struct cvsroot *root; + RCSNUM *bnum; - flags = CF_IGNORE|CF_NOSYMS; + branch = CVS_IMPORT_DEFBRANCH; + flags = CF_RECURSE | CF_IGNORE | CF_NOSYMS; while ((ch = getopt(argc, argv, "b:dI:k:m:")) != -1) { switch (ch) { case 'b': + branch = optarg; + if ((bnum = rcsnum_alloc()) == NULL) + return (-1); + if ((rcsnum_aton(branch, &ep, bnum) < 0) || + (*ep != '\0')) { + cvs_log(LP_ERR, "%s is not a numeric branch", + branch); + return (EX_USAGE); + } + break; case 'd': break; case 'I': @@ -91,167 +107,82 @@ cvs_import(int argc, char **argv) return (EX_DATAERR); root = CVS_DIR_ROOT(cvs_files); - if (root->cr_method != CVS_METHOD_LOCAL) { - cvs_connect(root); - - /* Do it */ - do_import(root, argv); - - cvs_disconnect(root); + if (root == NULL) { + cvs_log(LP_ERR, + "No CVSROOT specified! Please use the `-d' option"); + cvs_log(LP_ERR, + "or set the CVSROOT environment variable."); + return (EX_USAGE); } - return (0); -} - -/* - * Import a module using a server - */ -static int -do_import(struct cvsroot *root, char **argv) -{ - char repository[MAXPATHLEN]; - - /* XXX temporary */ - if (cvs_sendarg(root, "-m testlog", 0) < 0) { - cvs_log(LP_ERR, "failed to send temporary logmessage"); + if ((cvs_msg == NULL) && + (cvs_msg = cvs_logmsg_get(NULL, NULL, NULL, NULL)) == NULL) return (-1); - } - /* send arguments */ - if (cvs_sendarg(root, argv[0], 0) < 0 || - cvs_sendarg(root, argv[1], 0) < 0 || - cvs_sendarg(root, argv[2], 0) < 0) { - cvs_log(LP_ERR, "failed to send arguments"); - return (-1); + if (root->cr_method != CVS_METHOD_LOCAL) { + if ((cvs_connect(root) < 0) || + (cvs_sendarg(root, "-b", 0) < 0) || + (cvs_sendarg(root, branch, 0) < 0) || + (cvs_logmsg_send(root, cvs_msg) < 0) || + (cvs_sendarg(root, argv[0], 0) < 0) || + (cvs_sendarg(root, argv[1], 0) < 0) || + (cvs_sendarg(root, argv[2], 0) < 0)) + return (EX_PROTOCOL); } - /* create the repository name */ - snprintf(repository, sizeof(repository), "%s/%s", - root->cr_dir, argv[0]); + snprintf(repo, sizeof(repo), "%s/%s", root->cr_dir, argv[0]); + cvs_file_examine(cvs_files, cvs_import_file, NULL); - cvs_files = cvs_file_get(".", 0); - if (cvs_files == NULL) { - cvs_log(LP_ERR, "failed to obtain info on root"); - return (-1); + if (root->cr_method != CVS_METHOD_LOCAL) { + if (cvs_senddir(root, cvs_files) < 0 || + cvs_sendreq(root, CVS_REQ_IMPORT, NULL) < 0) + return (EX_PROTOCOL); } - /* walk the root directory */ - cvs_import_dir(root, ".", repository); - - /* send import request */ - if (cvs_senddir(root, cvs_files) < 0 || - cvs_sendraw(root, repository, strlen(repository) < 0 || - cvs_sendraw(root, "\n", 1) < 0 || - cvs_sendreq(root, CVS_REQ_IMPORT, NULL) < 0)) - cvs_log(LP_ERR, "failed to import repository %s", - repository); - - - /* done */ return (0); } -static int -cvs_import_dir(struct cvsroot *root, char *dirname, char *repo) +/* + * cvs_import_file() + * + * Perform the import of a single file or directory. + */ +int +cvs_import_file(CVSFILE *cfp, void *arg) { - char *cwd; - char *basedir; - char cvsdir[MAXPATHLEN]; - CVSFILE *parent, *fp; - - if ((basedir = strrchr(dirname, '/')) != NULL) - basedir++; - else - basedir = dirname; - - /* save current directory */ - if ((cwd = getcwd(NULL, MAXPATHLEN)) == NULL) { - cvs_log(LP_ERR, "couldn't save current directory"); - return (-1); - } - - /* Switch to the new directory */ - if (chdir(basedir) < 0) { - cvs_log(LP_ERR, "failed to switch to directory %s", dirname); - return (-1); - } - - if (!strcmp(dirname, ".")) - strlcpy(cvsdir, repo, sizeof(cvsdir)); - else - snprintf(cvsdir, sizeof(cvsdir), "%s/%s", repo, dirname); - - /* Obtain information about the directory */ - parent = cvs_file_get(".", CF_SORT|CF_RECURSE|CF_IGNORE); - if (parent == NULL) { - cvs_log(LP_ERR, "couldn't obtain info on %s", dirname); - return (-1); - } - - if (cvs_sendreq(root, CVS_REQ_DIRECTORY, dirname) < 0 || - cvs_sendraw(root, cvsdir, strlen(cvsdir)) < 0 || - cvs_sendraw(root, "\n", 1) < 0) - return (-1); - - printf("Importing %s\n", dirname); + int ret; + struct cvsroot *root; + char fpath[MAXPATHLEN], repodir[MAXPATHLEN]; - /* Walk the directory */ - TAILQ_FOREACH(fp, &(parent->cf_ddat->cd_files), cf_list) { - /* If we have a sub directory, skip it for now */ - if (fp->cf_type == DT_DIR) - continue; + root = CVS_DIR_ROOT(cfp); - /* Import the file */ - if (cvs_import_file(root, fp) < 0) -#if 0 - cvs_log(LP_ERR, "failed to import %s", fp->cf_path); -#else - cvs_log(LP_ERR, "failed to import %s", NULL); -#endif - } + cvs_file_getpath(cfp, fpath, sizeof(fpath)); + printf("Importing %s\n", fpath); - /* Walk the subdirectories */ - TAILQ_FOREACH(fp, &(parent->cf_ddat->cd_files), cf_list) { - if (fp->cf_type != DT_DIR) - continue; - if (!strcmp(CVS_FILE_NAME(fp), ".") || - !strcmp(CVS_FILE_NAME(fp), "..")) - continue; - - if (strcmp(dirname, ".")) - snprintf(cvsdir, sizeof(cvsdir), "%s/%s", - dirname, CVS_FILE_NAME(fp)); + if (cfp->cf_type == DT_DIR) { + if (!strcmp(CVS_FILE_NAME(cfp), ".")) + strlcpy(repodir, repo, sizeof(repodir)); else - strlcpy(cvsdir, CVS_FILE_NAME(fp), sizeof(cvsdir)); - if (cvs_import_dir(root, cvsdir, repo) < 0) - cvs_log(LP_ERR, "failed to import directory %s", - CVS_FILE_NAME(fp)); - } - - cvs_file_free(parent); + snprintf(repodir, sizeof(repodir), "%s/%s", repo, fpath); + if (root->cr_method != CVS_METHOD_LOCAL) { + ret = cvs_sendreq(root, CVS_REQ_DIRECTORY, fpath); + if (ret == 0) + ret = cvs_sendln(root, repodir); + } else { + /* create the directory */ + } - /* restore working directory */ - if (chdir(cwd) < 0) { - cvs_log(LP_ERR, "failed to restore directory %s", cwd); - return (-1); + return (0); } - return (0); -} - -/* - * Import a file - */ -static int -cvs_import_file(struct cvsroot *root, CVSFILE *fp) -{ - /* Send a Modified response follwed by the - * file's mode, length and contents - */ - if (cvs_sendreq(root, CVS_REQ_MODIFIED, CVS_FILE_NAME(fp)) < 0) - return (-1); - if (cvs_sendfile(root, CVS_FILE_NAME(fp)) < 0) - return (-1); + if (root->cr_method != CVS_METHOD_LOCAL) { + if (cvs_sendreq(root, CVS_REQ_MODIFIED, CVS_FILE_NAME(cfp)) < 0) + return (-1); + if (cvs_sendfile(root, fpath) < 0) + return (-1); + } else { + /* local import */ + } return (0); } |