summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoris Vink <joris@cvs.openbsd.org>2007-01-17 17:54:51 +0000
committerJoris Vink <joris@cvs.openbsd.org>2007-01-17 17:54:51 +0000
commit85fc4ab54949af79c8a6a9a5053de81499f6116a (patch)
treec1fe17e97e9da284c6c3c3961f56d14f4eba94b2
parent2859e665e7d21c18819d9bbb86fbb84215aa09a2 (diff)
add support for remote checkout in both our client and server,
with this the last real dependency to actually be able to use opencvs in a remote setup has been added. based upon an initial diff from xsa@ 'kay niallo@
-rw-r--r--usr.bin/cvs/checkout.c30
-rw-r--r--usr.bin/cvs/client.c6
-rw-r--r--usr.bin/cvs/cvs.h3
-rw-r--r--usr.bin/cvs/remote.h3
-rw-r--r--usr.bin/cvs/server.c42
-rw-r--r--usr.bin/cvs/update.c7
-rw-r--r--usr.bin/cvs/util.c11
7 files changed, 84 insertions, 18 deletions
diff --git a/usr.bin/cvs/checkout.c b/usr.bin/cvs/checkout.c
index 878a4e309af..ccc6764f6da 100644
--- a/usr.bin/cvs/checkout.c
+++ b/usr.bin/cvs/checkout.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: checkout.c,v 1.78 2007/01/16 08:33:46 xsa Exp $ */
+/* $OpenBSD: checkout.c,v 1.79 2007/01/17 17:54:50 joris Exp $ */
/*
* Copyright (c) 2006 Joris Vink <joris@openbsd.org>
*
@@ -125,6 +125,34 @@ checkout_check_repository(int argc, char **argv)
int i;
char repo[MAXPATHLEN];
struct stat st;
+ struct cvs_recursion cr;
+
+ if (current_cvsroot->cr_method != CVS_METHOD_LOCAL) {
+ cvs_client_connect_to_server();
+
+ if (reset_stickies == 1)
+ cvs_client_send_request("Argument -A");
+
+ if (cvs_cmdop == CVS_OP_CHECKOUT && prune_dirs == 1)
+ cvs_client_send_request("Argument -P");
+
+ cr.enterdir = NULL;
+ cr.leavedir = NULL;
+ cr.fileproc = cvs_client_sendfile;
+ cr.flags = flags;
+
+ cvs_file_run(argc, argv, &cr);
+
+ cvs_client_send_files(argv, argc);
+ cvs_client_senddir(".");
+
+ cvs_client_send_request("%s",
+ (cvs_cmdop == CVS_OP_CHECKOUT) ? "co" : "export");
+
+ cvs_client_get_responses();
+
+ return;
+ }
for (i = 0; i < argc; i++) {
cvs_mkpath(argv[i]);
diff --git a/usr.bin/cvs/client.c b/usr.bin/cvs/client.c
index c4cb8ebc602..28df816f35b 100644
--- a/usr.bin/cvs/client.c
+++ b/usr.bin/cvs/client.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: client.c,v 1.47 2007/01/16 09:14:19 xsa Exp $ */
+/* $OpenBSD: client.c,v 1.48 2007/01/17 17:54:50 joris Exp $ */
/*
* Copyright (c) 2006 Joris Vink <joris@openbsd.org>
*
@@ -61,7 +61,7 @@ struct cvs_req cvs_requests[] = {
/* commands that might be supported */
{ "ci", 0, cvs_server_commit, 0 },
- { "co", 0, NULL, 0 },
+ { "co", 0, cvs_server_checkout, 0 },
{ "update", 0, cvs_server_update, 0 },
{ "diff", 0, cvs_server_diff, 0 },
{ "log", 0, cvs_server_log, 0 },
@@ -632,6 +632,8 @@ cvs_client_updated(char *data)
repo = xmalloc(MAXPATHLEN);
cvs_get_repository_path(".", repo, MAXPATHLEN);
+ STRIP_SLASH(repo);
+
if (strlen(repo) + 1 > strlen(rpath))
fatal("received a repository path that is too short");
diff --git a/usr.bin/cvs/cvs.h b/usr.bin/cvs/cvs.h
index f7fc2dbf416..d7c0c0f0c4d 100644
--- a/usr.bin/cvs/cvs.h
+++ b/usr.bin/cvs/cvs.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: cvs.h,v 1.129 2007/01/13 15:45:59 joris Exp $ */
+/* $OpenBSD: cvs.h,v 1.130 2007/01/17 17:54:50 joris Exp $ */
/*
* Copyright (c) 2004 Jean-Francois Brousseau <jfb@openbsd.org>
* All rights reserved.
@@ -374,6 +374,7 @@ int cvs_add(int, char **);
int cvs_admin(int, char **);
int cvs_annotate(int, char **);
int cvs_commit(int, char **);
+int cvs_checkout(int, char **);
int cvs_diff(int, char **);
int cvs_edit(int, char **);
int cvs_editors(int, char **);
diff --git a/usr.bin/cvs/remote.h b/usr.bin/cvs/remote.h
index ea8dd061118..f7a55e032f6 100644
--- a/usr.bin/cvs/remote.h
+++ b/usr.bin/cvs/remote.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: remote.h,v 1.18 2007/01/13 15:29:34 joris Exp $ */
+/* $OpenBSD: remote.h,v 1.19 2007/01/17 17:54:50 joris Exp $ */
/*
* Copyright (c) 2006 Joris Vink <joris@openbsd.org>
*
@@ -90,6 +90,7 @@ void cvs_server_add(char *);
void cvs_server_admin(char *);
void cvs_server_annotate(char *);
void cvs_server_commit(char *);
+void cvs_server_checkout(char *);
void cvs_server_diff(char *);
void cvs_server_init(char *);
void cvs_server_log(char *);
diff --git a/usr.bin/cvs/server.c b/usr.bin/cvs/server.c
index a8a8309cdd9..c27ebd77527 100644
--- a/usr.bin/cvs/server.c
+++ b/usr.bin/cvs/server.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: server.c,v 1.48 2007/01/13 15:29:34 joris Exp $ */
+/* $OpenBSD: server.c,v 1.49 2007/01/17 17:54:50 joris Exp $ */
/*
* Copyright (c) 2006 Joris Vink <joris@openbsd.org>
*
@@ -299,19 +299,34 @@ cvs_server_directory(char *data)
{
int l;
CVSENTRIES *entlist;
- char *dir, *repo, *parent, *entry, *dirn;
+ char *dir, *repo, *parent, *entry, *dirn, *p;
dir = cvs_remote_input();
- if (strlen(dir) < strlen(current_cvsroot->cr_dir) + 1)
+ STRIP_SLASH(dir);
+
+ if (strlen(dir) < strlen(current_cvsroot->cr_dir))
fatal("cvs_server_directory: bad Directory request");
- repo = dir + strlen(current_cvsroot->cr_dir) + 1;
- cvs_mkpath(repo);
+ repo = dir + strlen(current_cvsroot->cr_dir);
+
+ /*
+ * This is somewhat required for checkout, as the
+ * directory request will be:
+ *
+ * Directory .
+ * /path/to/cvs/root
+ */
+ if (repo[0] == '\0')
+ p = xstrdup(".");
+ else
+ p = xstrdup(repo + 1);
+
+ cvs_mkpath(p);
- if ((dirn = basename(repo)) == NULL)
+ if ((dirn = basename(p)) == NULL)
fatal("cvs_server_directory: %s", strerror(errno));
- if ((parent = dirname(repo)) == NULL)
+ if ((parent = dirname(p)) == NULL)
fatal("cvs_server_directory: %s", strerror(errno));
if (strcmp(parent, ".")) {
@@ -328,8 +343,9 @@ cvs_server_directory(char *data)
if (server_currentdir != NULL)
xfree(server_currentdir);
- server_currentdir = xstrdup(repo);
+ server_currentdir = xstrdup(p);
+ xfree(p);
xfree(dir);
}
@@ -499,6 +515,16 @@ cvs_server_commit(char *data)
}
void
+cvs_server_checkout(char *data)
+{ if (chdir(server_currentdir) == -1)
+ fatal("cvs_server_checkout: %s", strerror(errno));
+
+ cvs_cmdop = CVS_OP_CHECKOUT;
+ cvs_checkout(server_argc, server_argv);
+ cvs_server_send_response("ok");
+}
+
+void
cvs_server_diff(char *data)
{
if (chdir(server_currentdir) == -1)
diff --git a/usr.bin/cvs/update.c b/usr.bin/cvs/update.c
index 29f3d589405..e84aebfa696 100644
--- a/usr.bin/cvs/update.c
+++ b/usr.bin/cvs/update.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: update.c,v 1.85 2007/01/13 15:45:59 joris Exp $ */
+/* $OpenBSD: update.c,v 1.86 2007/01/17 17:54:50 joris Exp $ */
/*
* Copyright (c) 2006 Joris Vink <joris@openbsd.org>
*
@@ -185,6 +185,11 @@ cvs_update_leavedir(struct cvs_file *cf)
cvs_log(LP_TRACE, "cvs_update_leavedir(%s)", cf->file_path);
+ if (cvs_server_active == 1) {
+ cvs_rmdir(cf->file_path);
+ return;
+ }
+
if (cvs_cmdop == CVS_OP_EXPORT) {
export = xmalloc(MAXPATHLEN);
if (cvs_path_cat(cf->file_path, CVS_PATH_CVSDIR, export,
diff --git a/usr.bin/cvs/util.c b/usr.bin/cvs/util.c
index 34e1de8d0ac..6de7a36c86c 100644
--- a/usr.bin/cvs/util.c
+++ b/usr.bin/cvs/util.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: util.c,v 1.97 2007/01/11 17:44:18 niallo Exp $ */
+/* $OpenBSD: util.c,v 1.98 2007/01/17 17:54:50 joris Exp $ */
/*
* Copyright (c) 2004 Jean-Francois Brousseau <jfb@openbsd.org>
* Copyright (c) 2005, 2006 Joris Vink <joris@openbsd.org>
@@ -611,8 +611,11 @@ cvs_get_repository_name(const char *dir, char *dst, size_t len)
}
}
} else {
- if (strlcat(dst, dir, len) >= len)
- fatal("cvs_get_repository_name: truncation");
+ if (cvs_cmdop != CVS_OP_CHECKOUT) {
+ if (strlcat(dst, dir, len) >= len)
+ fatal("cvs_get_repository_name: "
+ "truncation");
+ }
}
}
}
@@ -727,7 +730,7 @@ cvs_mkpath(const char *path)
if (mkdir(rpath, 0755) == -1 && errno != EEXIST)
fatal("cvs_mkpath: %s: %s", rpath, strerror(errno));
- cvs_mkadmin(rpath, current_cvsroot->cr_dir, repo,
+ cvs_mkadmin(rpath, current_cvsroot->cr_str, repo,
NULL, NULL, 0);
}