aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@ppc970.osdl.org>2005-05-30 21:00:09 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-05-30 21:00:09 -0700
commitaff9f97a4fd98e34b0dfde06dacd9dbd82de0b58 (patch)
treea71a9a6e492759ba459ccbcab08eba6079777cda
parentd2b6f7c2fdd4012402b61b0a0a333b8b2011e8bc (diff)
downloadgit-aff9f97a4fd98e34b0dfde06dacd9dbd82de0b58.tar.gz
git-aff9f97a4fd98e34b0dfde06dacd9dbd82de0b58.tar.xz
cvs2git: use CVS (rather than RCS) to extract the different
file versions. This allows you to do the conversion (although slowly) from a remote repository, and besides, it's one less thing to worry about when you don't need to look up the CVS Attic directories etc.
-rw-r--r--cvs2git.c64
1 files changed, 37 insertions, 27 deletions
diff --git a/cvs2git.c b/cvs2git.c
index 1adc918f5..06dd74b36 100644
--- a/cvs2git.c
+++ b/cvs2git.c
@@ -24,6 +24,17 @@ static int verbose = 0;
* Hopefully David Mansfield will update his distribution soon
* enough (he's the one who wrote the patch, so at least we don't
* have to figt maintainer issues ;)
+ *
+ * Usage:
+ *
+ * TZ=UTC cvsps -A |
+ * cvs2git --cvsroot=[root] --module=[module] > script
+ *
+ * Creates a shell script that will generate the .git archive of
+ * the names CVS repository.
+ *
+ * IMPORTANT NOTE ABOUT "cvsps"! This requires version 2.1 or better,
+ * and the "TZ=UTC" and the "-A" flag is required for sane results!
*/
enum state {
Header,
@@ -31,7 +42,8 @@ enum state {
Members
};
-static char *rcsdir;
+static const char *cvsroot;
+static const char *cvsmodule;
static char date[100];
static char author[100];
@@ -147,28 +159,8 @@ static void commit(void)
initial_commit = 0;
}
-static void get_rcs_name(char *rcspathname, char *name, char *dir)
-{
- sprintf(rcspathname, "%s/%s,v", rcsdir, name);
- if (!access(rcspathname, R_OK))
- return;
-
- sprintf(rcspathname, "%s/Attic/%s,v", rcsdir, name);
- if (!access(rcspathname, R_OK))
- return;
-
- if (dir) {
- sprintf(rcspathname, "%s/%.*s/Attic/%s,v", rcsdir, (int)(dir - name), name, dir+1);
- if (!access(rcspathname, R_OK))
- return;
- }
- fprintf(stderr, "Unable to find RCS file for %s\n", name);
- exit(1);
-}
-
static void update_file(char *line)
{
- static char rcspathname[4096];
char *name, *version;
char *dir;
@@ -194,9 +186,7 @@ static void update_file(char *line)
if (dir)
printf("mkdir -p %.*s\n", (int)(dir - name), name);
- get_rcs_name(rcspathname, name, dir);
-
- printf("co -q -p -r%s '%s' > '%s'\n", version, rcspathname, name);
+ printf("cvs -q -d %s checkout -r%s -p '%s/%s' > '%s'\n", cvsroot, version, cvsmodule, name, name);
printf("git-update-cache --add -- '%s'\n", name);
}
@@ -217,10 +207,30 @@ int main(int argc, char **argv)
{
static char line[1000];
enum state state = Header;
+ int i;
+
+ for (i = 1; i < argc; i++) {
+ const char *arg = argv[i];
+ if (!memcmp(arg, "--cvsroot=", 10)) {
+ cvsroot = arg + 10;
+ continue;
+ }
+ if (!memcmp(arg, "--module=", 9)) {
+ cvsmodule = arg+9;
+ continue;
+ }
+ if (!strcmp(arg, "-v")) {
+ verbose = 1;
+ continue;
+ }
+ }
+
+
+ if (!cvsroot)
+ cvsroot = getenv("CVSROOT");
- rcsdir = getenv("RCSDIR");
- if (!rcsdir) {
- fprintf(stderr, "I need an $RCSDIR\n");
+ if (!cvsmodule || !cvsroot) {
+ fprintf(stderr, "I need a CVSROOT and module name\n");
exit(1);
}