зеркало из https://github.com/microsoft/git.git
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.
This commit is contained in:
Родитель
d2b6f7c2fd
Коммит
aff9f97a4f
64
cvs2git.c
64
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;
|
||||
|
||||
rcsdir = getenv("RCSDIR");
|
||||
if (!rcsdir) {
|
||||
fprintf(stderr, "I need an $RCSDIR\n");
|
||||
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");
|
||||
|
||||
if (!cvsmodule || !cvsroot) {
|
||||
fprintf(stderr, "I need a CVSROOT and module name\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче