Merge from master for misc fixes.

This commit is contained in:
Junio C Hamano 2005-08-17 15:38:47 -07:00
commit 942bc9c480
8 changed files with 78 additions and 16 deletions

View 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.

View File

@ -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)

View File

@ -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

View File

@ -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 --

View File

@ -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",

View File

@ -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

View File

@ -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 (;;) {

View 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;