diff --git a/Documentation/git-cvsimport-script.txt b/Documentation/git-cvsimport-script.txt index ae46b2f072..d01a15d8a3 100644 --- a/Documentation/git-cvsimport-script.txt +++ b/Documentation/git-cvsimport-script.txt @@ -12,7 +12,7 @@ SYNOPSIS 'git-cvsimport-script' [ -o ] [ -h ] [ -v ] [ -d ] [ -p ] [ -C ] [ -i ] [ -k ] - [ -s ] [ ] + [ -s ] [ -m ] [ -M regex ] [ ] DESCRIPTION @@ -58,6 +58,16 @@ OPTIONS If you need to pass multiple options, separate them with a comma. +-m:: + Attempt to detect merges based on the commit message. This option + will enable default regexes that try to capture the name source + branch name from the commit message. + +-M :: + Attempt to detect merges based on the commit message with a custom + regex. It can be used with -m to also see the default regexes. + You must escape forward slashes. + -v:: Verbosity: let 'cvsimport' report what it is doing. diff --git a/git-cvsimport-script b/git-cvsimport-script index 2f39af33d9..1f36acea22 100755 --- a/git-cvsimport-script +++ b/git-cvsimport-script @@ -28,19 +28,19 @@ use POSIX qw(strftime dup2); $SIG{'PIPE'}="IGNORE"; $ENV{'TZ'}="UTC"; -our($opt_h,$opt_o,$opt_v,$opt_k,$opt_d,$opt_p,$opt_C,$opt_z,$opt_i,$opt_s); +our($opt_h,$opt_o,$opt_v,$opt_k,$opt_d,$opt_p,$opt_C,$opt_z,$opt_i,$opt_s,$opt_m,$opt_M); sub usage() { print STDERR <; chomp $cvs_tree; - close $f + close $f; } else { usage(); } +our @mergerx = (); +if ($opt_m) { + @mergerx = ( qr/\W(?:from|of|merge|merging|merged) (\w+)/i ); +} +if ($opt_M) { + push (@mergerx, qr/$opt_M/); +} + select(STDERR); $|=1; select(STDOUT); @@ -375,6 +383,22 @@ sub getwd() { return $pwd; } + +sub get_headref($$) { + my $name = shift; + my $git_dir = shift; + my $sha; + + if (open(C,"$git_dir/refs/heads/$name")) { + chomp($sha = ); + close(C); + length($sha) == 40 + or die "Cannot get head id for $name ($sha): $!\n"; + } + return $sha; +} + + -d $git_tree or mkdir($git_tree,0777) or die "Could not create $git_tree: $!"; @@ -549,6 +573,22 @@ my $commit = sub { my @par = (); @par = ("-p",$parent) if $parent; + + # loose detection of merges + # based on the commit msg + foreach my $rx (@mergerx) { + if ($logmsg =~ $rx) { + my $mparent = $1; + if ($mparent eq 'HEAD') { $mparent = 'origin'}; + if ( -e "$git_dir/refs/heads/$mparent") { + $mparent = get_headref($mparent, $git_dir); + push @par, '-p', $mparent; + # printing here breaks import # + # # print "Merge parent branch: $mparent\n" if $opt_v; + } + } + } + exec("env", "GIT_AUTHOR_NAME=$author", "GIT_AUTHOR_EMAIL=$author",