author | Junio C Hamano <junkio@cox.net> | |
Wed, 17 Aug 2005 22:38:47 +0000 (15:38 -0700) | ||
committer | Junio C Hamano <junkio@cox.net> | |
Wed, 17 Aug 2005 22:38:47 +0000 (15:38 -0700) |
index ae46b2f0722387ce7cb4b30e5867b11c7bd0de72..d01a15d8a3a60b58aaa5d084b07bfe5809956e54 100644 (file)
'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
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.
index 6365381c17f9255240004818f1c1a257d68b75f9..742378f40ffb3746c72af7e470c94fe9735ca0a4 100644 (file)
--- a/cache.h
+++ b/cache.h
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)
diff --git a/git-clone-script b/git-clone-script
index 909ccc530136899eee130f1a29969281f3b878c9..99c2459631f2bdcc6382bd2b5fc03090e1888ee3 100755 (executable)
--- a/git-clone-script
+++ b/git-clone-script
;;
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
diff --git a/git-commit-script b/git-commit-script
index f6cd75f024a0ddb247807086c04eff6d6f8fe6cd..15d03913d5eca6c7eb0eeb146e3e6cf6ba7d1d56 100755 (executable)
--- a/git-commit-script
+++ b/git-commit-script
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 --
diff --git a/git-cvsimport-script b/git-cvsimport-script
index 2f39af33d9c5d0054268ba6a2d400368b518d5ba..e3a8e584a562e8e50c5d7316acc653babafcd8ba 100755 (executable)
--- a/git-cvsimport-script
+++ b/git-cvsimport-script
$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();
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);
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: $!";
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",
diff --git a/git-rebase-script b/git-rebase-script
index 026225ab2cea131fcea00e5a5112dcd350f36eab..7b1d4900bd256ee8c1dd70220012be3e77070cc5 100755 (executable)
--- a/git-rebase-script
+++ b/git-rebase-script
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
index 1710b1685463e481d1c7ff5471bee6774d4b9c32..b8789de5c523d72110187960fb887852732f8486 100644 (file)
--- a/setup.c
+++ b/setup.c
#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 (;;) {
diff --git a/update-cache.c b/update-cache.c
index 1fcc59a9c005e154c09731f25b7a99389dca2733..63815ed658e9c2007938309458444b218c330d68 100644 (file)
--- a/update-cache.c
+++ b/update-cache.c
{
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)
}
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;