aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Bennée <kernel-hacker@bennee.com>2009-06-16 15:21:04 +0100
committerJunio C Hamano <gitster@pobox.com>2009-06-18 10:19:50 -0700
commit907ffe1522560ba71991ae4d2b03e357a8f57110 (patch)
treee5d0af32ed784c188accab16a651267b873fb0b5
parent4f4fa9c228a1ac2854c0814b5b23df43b8d98203 (diff)
downloadgit-907ffe1522560ba71991ae4d2b03e357a8f57110.tar.gz
git-907ffe1522560ba71991ae4d2b03e357a8f57110.tar.xz
Add -k option to cvsexportcommit to revert expanded CVS keywords in CVS working tree before applying commit patch
Depending on how your CVS->GIT conversion went you will have some unexpanded CVS keywords in your GIT repo. If any of your git commits touch these lines then the patch application will fail. This patch addresses that by adding an option that will revert and expanded CVS keywords to files in the working CVS directory that are affected by the commit being applied. Signed-off-by: Alex Bennée <alex@bennee.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--Documentation/git-cvsexportcommit.txt4
-rwxr-xr-xgit-cvsexportcommit.perl25
2 files changed, 26 insertions, 3 deletions
diff --git a/Documentation/git-cvsexportcommit.txt b/Documentation/git-cvsexportcommit.txt
index 2da8588f4..abaaf273b 100644
--- a/Documentation/git-cvsexportcommit.txt
+++ b/Documentation/git-cvsexportcommit.txt
@@ -63,6 +63,10 @@ OPTIONS
-u::
Update affected files from CVS repository before attempting export.
+-k::
+ Reverse CVS keyword expansion (e.g. $Revision: 1.2.3.4$
+ becomes $Revision$) in working CVS checkout before applying patch.
+
-w::
Specify the location of the CVS checkout to use for the export. This
option does not require GIT_DIR to be set before execution if the
diff --git a/git-cvsexportcommit.perl b/git-cvsexportcommit.perl
index 9ec1df95c..a36df3392 100755
--- a/git-cvsexportcommit.perl
+++ b/git-cvsexportcommit.perl
@@ -8,9 +8,9 @@ use File::Basename qw(basename dirname);
use File::Spec;
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, $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, $opt_k);
-getopts('uhPpvcfam:d:w:W');
+getopts('uhPpvcfkam:d:w:W');
$opt_h && usage();
@@ -287,7 +287,26 @@ foreach my $f (@files) {
$dirty = 1;
warn "File $f not up to date but has status '$cvsstat{$f}' in your CVS checkout!\n";
}
+
+ # Depending on how your GIT tree got imported from CVS you may
+ # have a conflict between expanded keywords in your CVS tree and
+ # unexpanded keywords in the patch about to be applied.
+ if ($opt_k) {
+ my $orig_file ="$f.orig";
+ rename $f, $orig_file;
+ open(FILTER_IN, "<$orig_file") or die "Cannot open $orig_file\n";
+ open(FILTER_OUT, ">$f") or die "Cannot open $f\n";
+ while (<FILTER_IN>)
+ {
+ my $line = $_;
+ $line =~ s/\$([A-Z][a-z]+):[^\$]+\$/\$\1\$/g;
+ print FILTER_OUT $line;
+ }
+ close FILTER_IN;
+ close FILTER_OUT;
+ }
}
+
if ($dirty) {
if ($opt_f) { warn "The tree is not clean -- forced merge\n";
$dirty = 0;
@@ -391,7 +410,7 @@ sleep(1);
sub usage {
print STDERR <<END;
-Usage: GIT_DIR=/path/to/.git git cvsexportcommit [-h] [-p] [-v] [-c] [-f] [-u] [-w cvsworkdir] [-m msgprefix] [ parent ] commit
+Usage: GIT_DIR=/path/to/.git git cvsexportcommit [-h] [-p] [-v] [-c] [-f] [-u] [-k] [-w cvsworkdir] [-m msgprefix] [ parent ] commit
END
exit(1);
}