# [PATCH] Make cvs2git support remote CVS repos

2 messages from 2005-05-25 to 2005-05-26. Participants: Mark Allen, Linus Torvalds.
Thread: https://gitlist.dev/t/715

## Mark Allen, 2005-05-25 18:11

Subject: [PATCH] Make cvs2git support remote CVS repos
Message-ID: <20050525181132.75705.qmail@web41204.mail.yahoo.com>
URL: https://gitlist.dev/e/20050525181132.75705.qmail%40web41204.mail.yahoo.com

```
Added a "--module=cvsmodule" command line option and (since we're going to process argv
anyway) made "-v" for verbose mode a command line option too, instead of a compile time
option.

I've tested it on some (small) private CVS repos and it *seems* to work, although some of
the initial commit ordering is wrong, but I think this is due to the commit time being
wrong within my CVS repo itself.

I didn't make author and email prettyprint, but I really want to make it a command line
option, the discussion from yesterday about whether prettyprinting should be at the
plumbing or porcelain layer notwithstanding.

Regards,

--Mark

Index: cvs2git.c
===================================================================
--- a0e0d3940c350f14545a481b179217f626c93440/cvs2git.c  (mode:100644)
+++ uncommitted/cvs2git.c  (mode:100644)
@@ -32,6 +32,8 @@
 };
 
 static char *rcsdir;
+static char *cvsroot;
+static char *cvsmodule;
 
 static char date[100];
 static char author[100];
@@ -194,9 +196,13 @@
 	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);
+	if ( !cvsmodule ) {
+		get_rcs_name(rcspathname, name, dir);
+		printf("co -q -p -r%s '%s' > '%s'\n", version, rcspathname, name);
+	} else {
+		printf("cvs -d %s checkout -r%s -p '%s/%s' > '%s'\n", cvsroot, version, cvsmodule, name, name);
+	}
+
 	printf("git-update-cache --add -- '%s'\n", name);
 }
 
@@ -217,13 +223,34 @@
 {
 	static char line[1000];
 	enum state state = Header;
+	int i;
+
+	for (i = 1; i < argc; i++) {
+		const char *arg = argv[i];
+		if (!memcmp(arg, "--module=", 9)) {
+			cvsroot = getenv("CVSROOT");
+			cvsmodule = (char *)arg+9;
+			continue;
+		} 
+		if (!strcmp(arg, "-v")) {
+			verbose = 1;
+			continue;
+		}
+	}
+
+	if (!cvsmodule)
+		rcsdir = getenv("RCSDIR");
 
-	rcsdir = getenv("RCSDIR");
-	if (!rcsdir) {
+	if (!cvsmodule && !rcsdir) {
 		fprintf(stderr, "I need an $RCSDIR\n");
 		exit(1);
 	}
 
+	if (cvsmodule && !cvsroot) {
+		fprintf(stderr, "I need a $CVSROOT\n");
+		exit(1);
+	}
+
 	printf("[ -d .git ] && exit 1\n");
 	printf("git-init-db\n");
 	printf("mkdir -p .git/refs/heads\n");

```

## Linus Torvalds, 2005-05-26 02:42

Subject: Re: [PATCH] Make cvs2git support remote CVS repos
Message-ID: <Pine.LNX.4.58.0505251938580.2307@ppc970.osdl.org>
URL: https://gitlist.dev/e/Pine.LNX.4.58.0505251938580.2307%40ppc970.osdl.org
In-Reply-To: <20050525181132.75705.qmail@web41204.mail.yahoo.com>

```


On Wed, 25 May 2005, Mark Allen wrote:
>
> Added a "--module=cvsmodule" command line option and (since we're going to process argv
> anyway) made "-v" for verbose mode a command line option too, instead of a compile time
> option.

Ahh.. You found out how to get CVS to check out individual files. 

The reason I use RCS "co" directly is because I couldn't figure out how
CVS can be made to do it. Of course, the raw RCS possibly also performs
better, but somebody should check that. If the overhead of using CVS to do
this is low enough, we should drop the raw RCS access, which should
simplify your patch and get rid of the need for "RCSDIR".

Anybody up for some performance testing?

			Linus

```
