Merge branch 'js/cvsexportcommit'
* js/cvsexportcommit: cvsexportcommit: introduce -W for shared working trees (between Git and CVS) cvsexportcommit: chomp only removes trailing whitespace Conflicts: git-cvsexportcommit.perl
This commit is contained in:
commit
6c99f18660
@ -8,7 +8,7 @@ git-cvsexportcommit - Export a single commit to a CVS checkout
|
|||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
--------
|
--------
|
||||||
'git-cvsexportcommit' [-h] [-u] [-v] [-c] [-P] [-p] [-a] [-d cvsroot] [-w cvsworkdir] [-f] [-m msgprefix] [PARENTCOMMIT] COMMITID
|
'git-cvsexportcommit' [-h] [-u] [-v] [-c] [-P] [-p] [-a] [-d cvsroot] [-w cvsworkdir] [-W] [-f] [-m msgprefix] [PARENTCOMMIT] COMMITID
|
||||||
|
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
@ -68,6 +68,11 @@ OPTIONS
|
|||||||
current directory is within a git repository. The default is the
|
current directory is within a git repository. The default is the
|
||||||
value of 'cvsexportcommit.cvsdir'.
|
value of 'cvsexportcommit.cvsdir'.
|
||||||
|
|
||||||
|
-W::
|
||||||
|
Tell cvsexportcommit that the current working directory is not only
|
||||||
|
a Git checkout, but also the CVS checkout. Therefore, Git will
|
||||||
|
reset the working directory to the parent commit before proceeding.
|
||||||
|
|
||||||
-v::
|
-v::
|
||||||
Verbose.
|
Verbose.
|
||||||
|
|
||||||
|
@ -8,9 +8,9 @@ use File::Basename qw(basename dirname);
|
|||||||
use File::Spec;
|
use File::Spec;
|
||||||
use Git;
|
use Git;
|
||||||
|
|
||||||
our ($opt_h, $opt_P, $opt_p, $opt_v, $opt_c, $opt_f, $opt_a, $opt_m, $opt_d, $opt_u, $opt_w);
|
our ($opt_h, $opt_P, $opt_p, $opt_v, $opt_c, $opt_f, $opt_a, $opt_m, $opt_d, $opt_u, $opt_w, $opt_W);
|
||||||
|
|
||||||
getopts('uhPpvcfam:d:w:');
|
getopts('uhPpvcfam:d:w:W');
|
||||||
|
|
||||||
$opt_h && usage();
|
$opt_h && usage();
|
||||||
|
|
||||||
@ -20,7 +20,7 @@ die "Need at least one commit identifier!" unless @ARGV;
|
|||||||
my $repo = Git->repository();
|
my $repo = Git->repository();
|
||||||
$opt_w = $repo->config('cvsexportcommit.cvsdir') unless defined $opt_w;
|
$opt_w = $repo->config('cvsexportcommit.cvsdir') unless defined $opt_w;
|
||||||
|
|
||||||
if ($opt_w) {
|
if ($opt_w || $opt_W) {
|
||||||
# Remember where GIT_DIR is before changing to CVS checkout
|
# Remember where GIT_DIR is before changing to CVS checkout
|
||||||
unless ($ENV{GIT_DIR}) {
|
unless ($ENV{GIT_DIR}) {
|
||||||
# No GIT_DIR set. Figure it out for ourselves
|
# No GIT_DIR set. Figure it out for ourselves
|
||||||
@ -30,7 +30,9 @@ if ($opt_w) {
|
|||||||
}
|
}
|
||||||
# Make sure GIT_DIR is absolute
|
# Make sure GIT_DIR is absolute
|
||||||
$ENV{GIT_DIR} = File::Spec->rel2abs($ENV{GIT_DIR});
|
$ENV{GIT_DIR} = File::Spec->rel2abs($ENV{GIT_DIR});
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($opt_w) {
|
||||||
if (! -d $opt_w."/CVS" ) {
|
if (! -d $opt_w."/CVS" ) {
|
||||||
die "$opt_w is not a CVS checkout";
|
die "$opt_w is not a CVS checkout";
|
||||||
}
|
}
|
||||||
@ -121,6 +123,15 @@ if ($parent) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
my $go_back_to = 0;
|
||||||
|
|
||||||
|
if ($opt_W) {
|
||||||
|
$opt_v && print "Resetting to $parent\n";
|
||||||
|
$go_back_to = `git symbolic-ref HEAD 2> /dev/null ||
|
||||||
|
git rev-parse HEAD` || die "Could not determine current branch";
|
||||||
|
system("git checkout -q $parent^0") && die "Could not check out $parent^0";
|
||||||
|
}
|
||||||
|
|
||||||
$opt_v && print "Applying to CVS commit $commit from parent $parent\n";
|
$opt_v && print "Applying to CVS commit $commit from parent $parent\n";
|
||||||
|
|
||||||
# grab the commit message
|
# grab the commit message
|
||||||
@ -215,7 +226,8 @@ if (@canstatusfiles) {
|
|||||||
my $basename = basename($name);
|
my $basename = basename($name);
|
||||||
|
|
||||||
$basename = "no file " . $basename if (exists($added{$basename}));
|
$basename = "no file " . $basename if (exists($added{$basename}));
|
||||||
chomp($basename);
|
$basename =~ s/^\s+//;
|
||||||
|
$basename =~ s/\s+$//;
|
||||||
|
|
||||||
if (!exists($fullname{$basename})) {
|
if (!exists($fullname{$basename})) {
|
||||||
$fullname{$basename} = $name;
|
$fullname{$basename} = $name;
|
||||||
@ -264,7 +276,11 @@ if ($dirty) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
print "Applying\n";
|
print "Applying\n";
|
||||||
`GIT_DIR= git-apply $context --summary --numstat --apply <.cvsexportcommit.diff` || die "cannot patch";
|
if ($opt_W) {
|
||||||
|
system("git checkout -q $commit^0") && die "cannot patch";
|
||||||
|
} else {
|
||||||
|
`GIT_DIR= git-apply $context --summary --numstat --apply <.cvsexportcommit.diff` || die "cannot patch";
|
||||||
|
}
|
||||||
|
|
||||||
print "Patch applied successfully. Adding new files and directories to CVS\n";
|
print "Patch applied successfully. Adding new files and directories to CVS\n";
|
||||||
my $dirtypatch = 0;
|
my $dirtypatch = 0;
|
||||||
@ -317,7 +333,9 @@ if ($dirtypatch) {
|
|||||||
print "using a patch program. After applying the patch and resolving the\n";
|
print "using a patch program. After applying the patch and resolving the\n";
|
||||||
print "problems you may commit using:";
|
print "problems you may commit using:";
|
||||||
print "\n cd \"$opt_w\"" if $opt_w;
|
print "\n cd \"$opt_w\"" if $opt_w;
|
||||||
print "\n $cmd\n\n";
|
print "\n $cmd\n";
|
||||||
|
print "\n git checkout $go_back_to\n" if $go_back_to;
|
||||||
|
print "\n";
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -337,6 +355,14 @@ if ($opt_c) {
|
|||||||
# clean up
|
# clean up
|
||||||
unlink(".cvsexportcommit.diff");
|
unlink(".cvsexportcommit.diff");
|
||||||
|
|
||||||
|
if ($opt_W) {
|
||||||
|
system("git checkout $go_back_to") && die "cannot move back to $go_back_to";
|
||||||
|
if (!($go_back_to =~ /^[0-9a-fA-F]{40}$/)) {
|
||||||
|
system("git symbolic-ref HEAD $go_back_to") &&
|
||||||
|
die "cannot move back to $go_back_to";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# CVS version 1.11.x and 1.12.x sleeps the wrong way to ensure the timestamp
|
# CVS version 1.11.x and 1.12.x sleeps the wrong way to ensure the timestamp
|
||||||
# used by CVS and the one set by subsequence file modifications are different.
|
# used by CVS and the one set by subsequence file modifications are different.
|
||||||
# If they are not different CVS will not detect changes.
|
# If they are not different CVS will not detect changes.
|
||||||
|
@ -297,4 +297,21 @@ test_expect_success 'commit a file with leading spaces in the name' '
|
|||||||
|
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'use the same checkout for Git and CVS' '
|
||||||
|
|
||||||
|
(mkdir shared &&
|
||||||
|
cd shared &&
|
||||||
|
unset GIT_DIR &&
|
||||||
|
cvs co . &&
|
||||||
|
git init &&
|
||||||
|
git add " space" &&
|
||||||
|
git commit -m "fake initial commit" &&
|
||||||
|
echo Hello >> " space" &&
|
||||||
|
git commit -m "Another change" " space" &&
|
||||||
|
git cvsexportcommit -W -p -u -c HEAD &&
|
||||||
|
grep Hello " space" &&
|
||||||
|
git diff-files)
|
||||||
|
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Loading…
Reference in New Issue
Block a user