Code

Merge from master for misc fixes.
authorJunio C Hamano <junkio@cox.net>
Wed, 17 Aug 2005 22:38:47 +0000 (15:38 -0700)
committerJunio C Hamano <junkio@cox.net>
Wed, 17 Aug 2005 22:38:47 +0000 (15:38 -0700)
Documentation/git-cvsimport-script.txt
cache.h
git-clone-script
git-commit-script
git-cvsimport-script
git-rebase-script
setup.c
update-cache.c

index ae46b2f0722387ce7cb4b30e5867b11c7bd0de72..d01a15d8a3a60b58aaa5d084b07bfe5809956e54 100644 (file)
@@ -12,7 +12,7 @@ SYNOPSIS
 'git-cvsimport-script' [ -o <branch-for-HEAD> ] [ -h ] [ -v ]
                        [ -d <CVSROOT> ] [ -p <options-for-cvsps> ]
                        [ -C <GIT_repository> ] [ -i ] [ -k ]
-                       [ -s <subst> ] [ <CVS_module> ]
+                       [ -s <subst> ] [ -m ] [ -M regex ] [ <CVS_module> ]
 
 
 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 <regex>::
+       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/cache.h b/cache.h
index 6365381c17f9255240004818f1c1a257d68b75f9..742378f40ffb3746c72af7e470c94fe9735ca0a4 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -142,6 +142,7 @@ extern char *get_graft_file(void);
 
 extern const char **get_pathspec(const char *prefix, char **pathspec);
 extern const char *setup_git_directory(void);
+extern char *prefix_path(const char *prefix, int len, char *path);
 
 #define alloc_nr(x) (((x)+16)*3/2)
 
index 909ccc530136899eee130f1a29969281f3b878c9..99c2459631f2bdcc6382bd2b5fc03090e1888ee3 100755 (executable)
@@ -81,7 +81,11 @@ yes,yes)
            ;;
        yes)
            mkdir -p "$D/.git/objects/info"
-           echo "$repo/objects" >"$D/.git/objects/info/alternates"
+           {
+               test -f "$repo/objects/info/alternates" &&
+               cat "$repo/objects/info/alternates";
+               echo "$repo/objects"
+           } >"$D/.git/objects/info/alternates"
            ;;
        esac
 
index f6cd75f024a0ddb247807086c04eff6d6f8fe6cd..15d03913d5eca6c7eb0eeb146e3e6cf6ba7d1d56 100755 (executable)
@@ -85,11 +85,13 @@ tt*)
   die "Only one of -c/-C/-F/-m can be used." ;;
 esac
 
-case "$all" in
-t)
+case "$all,$#" in
+t,*)
        git-diff-files --name-only -z |
        xargs -0 git-update-cache -q --
        ;;
+,0)
+       ;;
 *)
        git-diff-files --name-only -z "$@" |
        xargs -0 git-update-cache -q --
index 2f39af33d9c5d0054268ba6a2d400368b518d5ba..e3a8e584a562e8e50c5d7316acc653babafcd8ba 100755 (executable)
@@ -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 <<END;
 Usage: ${\basename $0}     # fetch/update GIT from CVS
        [ -o branch-for-HEAD ] [ -h ] [ -v ] [ -d CVSROOT ]
        [ -p opts-for-cvsps ] [ -C GIT_repository ] [ -z fuzz ]
-       [ -i ] [ -k ] [-s subst] [ CVS_module ]
+       [ -i ] [ -k ] [-s subst] [ -m ] [ -M regex] [ CVS_module ]
 END
        exit(1);
 }
 
-getopts("hivko:d:p:C:z:s:") or usage();
+getopts("hivmko:d:p:C:z:s:M:") or usage();
 usage if $opt_h;
 
 @ARGV <= 1 or usage();
@@ -71,11 +71,19 @@ if ($#ARGV == 0) {
            die 'Failed to open CVS/Repository';
        $cvs_tree = <$f>;
        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 = <C>);
+       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 = $opt_o };
+                               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",
index 026225ab2cea131fcea00e5a5112dcd350f36eab..7b1d4900bd256ee8c1dd70220012be3e77070cc5 100755 (executable)
@@ -17,16 +17,19 @@ case "$#,$1" in
     shift ;;
 esac
 
+git-update-cache --refresh || exit
+
 case "$#" in
-1) upstream=`git-rev-parse --verify "$1"` &&
-   ours=`git-rev-parse --verify HEAD` || exit
-   ;;
-2) upstream=`git-rev-parse --verify "$1"` &&
-   ours=`git-rev-parse --verify "$2"` || exit
-   ;;
-*) echo >&2 "$usage"; exit 1 ;;
+1) ours_symbolic=HEAD ;;
+2) ours_symbolic="$2" ;;
+*) die "$usage" ;;
 esac
 
+upstream=`git-rev-parse --verify "$1"` &&
+ours=`git-rev-parse --verify "$ours_symbolic^` || exit
+test "$(git-diff-cache --cached "$ours")" = "" || 
+die "Your working tree does not match $ours_symbolic."
+
 git-read-tree -m -u $ours $upstream &&
 git-rev-parse --verify "$upstream^0" >"$GIT_DIR/HEAD" || exit
 
diff --git a/setup.c b/setup.c
index 1710b1685463e481d1c7ff5471bee6774d4b9c32..b8789de5c523d72110187960fb887852732f8486 100644 (file)
--- a/setup.c
+++ b/setup.c
@@ -1,6 +1,6 @@
 #include "cache.h"
 
-static char *prefix_path(const char *prefix, int len, char *path)
+char *prefix_path(const char *prefix, int len, char *path)
 {
        char *orig = path;
        for (;;) {
index 1fcc59a9c005e154c09731f25b7a99389dca2733..63815ed658e9c2007938309458444b218c330d68 100644 (file)
@@ -321,6 +321,7 @@ int main(int argc, char **argv)
 {
        int i, newfd, entries, has_errors = 0;
        int allow_options = 1;
+       const char *prefix = setup_git_directory();
 
        newfd = hold_index_file_for_update(&cache_file, get_index_file());
        if (newfd < 0)
@@ -381,6 +382,7 @@ int main(int argc, char **argv)
                        }
                        die("unknown option %s", path);
                }
+               path = prefix_path(prefix, prefix ? strlen(prefix) : 0, path);
                if (!verify_path(path)) {
                        fprintf(stderr, "Ignoring path %s\n", argv[i]);
                        continue;