зеркало из https://github.com/microsoft/git.git
Merge branch 'maint'
* maint: git-svn: don't attempt to minimize URLs by default git-svn: fix segfaults due to initial SVN pool being cleared git-svn: clean up caching of SVN::Ra functions git-svn: don't drop the username from URLs when dcommit is run RPM spec: include files in technical/ to package. Remove stale non-static-inline prototype for tree_entry_extract() git-config: test for 'do not forget "a.b.var" ends "a.var" section'. git-config: do not forget seeing "a.b.var" means we are out of "a.var" section.
This commit is contained in:
Коммит
43d151a1b0
28
config.c
28
config.c
|
@ -451,6 +451,9 @@ static int matches(const char* key, const char* value)
|
|||
|
||||
static int store_aux(const char* key, const char* value)
|
||||
{
|
||||
const char *ep;
|
||||
size_t section_len;
|
||||
|
||||
switch (store.state) {
|
||||
case KEY_SEEN:
|
||||
if (matches(key, value)) {
|
||||
|
@ -468,12 +471,29 @@ static int store_aux(const char* key, const char* value)
|
|||
}
|
||||
break;
|
||||
case SECTION_SEEN:
|
||||
if (strncmp(key, store.key, store.baselen+1)) {
|
||||
/*
|
||||
* What we are looking for is in store.key (both
|
||||
* section and var), and its section part is baselen
|
||||
* long. We found key (again, both section and var).
|
||||
* We would want to know if this key is in the same
|
||||
* section as what we are looking for. We already
|
||||
* know we are in the same section as what should
|
||||
* hold store.key.
|
||||
*/
|
||||
ep = strrchr(key, '.');
|
||||
section_len = ep - key;
|
||||
|
||||
if ((section_len != store.baselen) ||
|
||||
memcmp(key, store.key, section_len+1)) {
|
||||
store.state = SECTION_END_SEEN;
|
||||
break;
|
||||
} else
|
||||
/* do not increment matches: this is no match */
|
||||
store.offset[store.seen] = ftell(config_file);
|
||||
}
|
||||
|
||||
/*
|
||||
* Do not increment matches: this is no match, but we
|
||||
* just made sure we are in the desired section.
|
||||
*/
|
||||
store.offset[store.seen] = ftell(config_file);
|
||||
/* fallthru */
|
||||
case SECTION_END_SEEN:
|
||||
case START:
|
||||
|
|
76
git-svn.perl
76
git-svn.perl
|
@ -80,6 +80,7 @@ my %icv;
|
|||
my %init_opts = ( 'template=s' => \$_template, 'shared:s' => \$_shared,
|
||||
'trunk|T=s' => \$_trunk, 'tags|t=s' => \$_tags,
|
||||
'branches|b=s' => \$_branches, 'prefix=s' => \$_prefix,
|
||||
'minimize-url|m' => \$Git::SVN::_minimize_url,
|
||||
'no-metadata' => sub { $icv{noMetadata} = 1 },
|
||||
'use-svm-props' => sub { $icv{useSvmProps} = 1 },
|
||||
'use-svnsync-props' => sub { $icv{useSvnsyncProps} = 1 },
|
||||
|
@ -393,7 +394,7 @@ sub cmd_dcommit {
|
|||
} else {
|
||||
my %ed_opts = ( r => $last_rev,
|
||||
log => get_commit_entry($d)->{log},
|
||||
ra => Git::SVN::Ra->new($url),
|
||||
ra => Git::SVN::Ra->new($gs->full_url),
|
||||
tree_a => "$d~1",
|
||||
tree_b => $d,
|
||||
editor_cb => sub {
|
||||
|
@ -820,7 +821,7 @@ use strict;
|
|||
use warnings;
|
||||
use vars qw/$default_repo_id $default_ref_id $_no_metadata $_follow_parent
|
||||
$_repack $_repack_flags $_use_svm_props $_head
|
||||
$_use_svnsync_props $no_reuse_existing/;
|
||||
$_use_svnsync_props $no_reuse_existing $_minimize_url/;
|
||||
use Carp qw/croak/;
|
||||
use File::Path qw/mkpath/;
|
||||
use File::Copy qw/copy/;
|
||||
|
@ -1037,7 +1038,7 @@ sub init_remote_config {
|
|||
"[svn-remote \"$existing\"]\n";
|
||||
}
|
||||
$self->{repo_id} = $existing;
|
||||
} else {
|
||||
} elsif ($_minimize_url) {
|
||||
my $min_url = Git::SVN::Ra->new($url)->minimize_url;
|
||||
$existing = find_existing_remote($min_url, $r);
|
||||
if ($existing) {
|
||||
|
@ -1390,7 +1391,7 @@ sub traverse_ignore {
|
|||
}
|
||||
}
|
||||
foreach (sort keys %$dirent) {
|
||||
next if $dirent->{$_}->kind != $SVN::Node::dir;
|
||||
next if $dirent->{$_}->{kind} != $SVN::Node::dir;
|
||||
$self->traverse_ignore($fh, "$path/$_", $r);
|
||||
}
|
||||
}
|
||||
|
@ -2888,7 +2889,7 @@ my ($can_do_switch, %ignored_err, $RA);
|
|||
BEGIN {
|
||||
# enforce temporary pool usage for some simple functions
|
||||
my $e;
|
||||
foreach (qw/get_latest_revnum get_uuid get_repos_root/) {
|
||||
foreach (qw/rev_proplist get_latest_revnum get_uuid get_repos_root/) {
|
||||
$e .= "sub $_ {
|
||||
my \$self = shift;
|
||||
my \$pool = SVN::Pool->new;
|
||||
|
@ -2897,36 +2898,13 @@ BEGIN {
|
|||
wantarray ? \@ret : \$ret[0]; }\n";
|
||||
}
|
||||
|
||||
# get_dir needs $pool held in cache for dirents to work,
|
||||
# check_path is cacheable and rev_proplist is close enough
|
||||
# for our purposes.
|
||||
foreach (qw/check_path get_dir rev_proplist/) {
|
||||
$e .= "my \%${_}_cache; my \$${_}_rev = 0; sub $_ {
|
||||
my \$self = shift;
|
||||
my \$r = pop;
|
||||
my \$k = join(\"\\0\", \@_);
|
||||
if (my \$x = \$${_}_cache{\$r}->{\$k}) {
|
||||
return wantarray ? \@\$x : \$x->[0];
|
||||
}
|
||||
my \$pool = SVN::Pool->new;
|
||||
my \@ret = \$self->SUPER::$_(\@_, \$r, \$pool);
|
||||
if (\$r != \$${_}_rev) {
|
||||
\%${_}_cache = ( pool => [] );
|
||||
\$${_}_rev = \$r;
|
||||
}
|
||||
\$${_}_cache{\$r}->{\$k} = \\\@ret;
|
||||
push \@{\$${_}_cache{pool}}, \$pool;
|
||||
wantarray ? \@ret : \$ret[0]; }\n";
|
||||
}
|
||||
$e .= "\n1;";
|
||||
eval $e or die $@;
|
||||
eval "$e; 1;" or die $@;
|
||||
}
|
||||
|
||||
sub new {
|
||||
my ($class, $url) = @_;
|
||||
$url =~ s!/+$!!;
|
||||
return $RA if ($RA && $RA->{url} eq $url);
|
||||
$RA->{pool}->clear if $RA;
|
||||
|
||||
SVN::_Core::svn_config_ensure($config_dir, undef);
|
||||
my ($baton, $callbacks) = SVN::Core::auth_open_helper([
|
||||
|
@ -2952,9 +2930,47 @@ sub new {
|
|||
$self->{svn_path} = $url;
|
||||
$self->{repos_root} = $self->get_repos_root;
|
||||
$self->{svn_path} =~ s#^\Q$self->{repos_root}\E(/|$)##;
|
||||
$self->{cache} = { check_path => { r => 0, data => {} },
|
||||
get_dir => { r => 0, data => {} } };
|
||||
$RA = bless $self, $class;
|
||||
}
|
||||
|
||||
sub check_path {
|
||||
my ($self, $path, $r) = @_;
|
||||
my $cache = $self->{cache}->{check_path};
|
||||
if ($r == $cache->{r} && exists $cache->{data}->{$path}) {
|
||||
return $cache->{data}->{$path};
|
||||
}
|
||||
my $pool = SVN::Pool->new;
|
||||
my $t = $self->SUPER::check_path($path, $r, $pool);
|
||||
$pool->clear;
|
||||
if ($r != $cache->{r}) {
|
||||
%{$cache->{data}} = ();
|
||||
$cache->{r} = $r;
|
||||
}
|
||||
$cache->{data}->{$path} = $t;
|
||||
}
|
||||
|
||||
sub get_dir {
|
||||
my ($self, $dir, $r) = @_;
|
||||
my $cache = $self->{cache}->{get_dir};
|
||||
if ($r == $cache->{r}) {
|
||||
if (my $x = $cache->{data}->{$dir}) {
|
||||
return wantarray ? @$x : $x->[0];
|
||||
}
|
||||
}
|
||||
my $pool = SVN::Pool->new;
|
||||
my ($d, undef, $props) = $self->SUPER::get_dir($dir, $r, $pool);
|
||||
my %dirents = map { $_ => { kind => $d->{$_}->kind } } keys %$d;
|
||||
$pool->clear;
|
||||
if ($r != $cache->{r}) {
|
||||
%{$cache->{data}} = ();
|
||||
$cache->{r} = $r;
|
||||
}
|
||||
$cache->{data}->{$dir} = [ \%dirents, $r, $props ];
|
||||
wantarray ? (\%dirents, $r, $props) : \%dirents;
|
||||
}
|
||||
|
||||
sub DESTROY {
|
||||
# do not call the real DESTROY since we store ourselves in $RA
|
||||
}
|
||||
|
@ -3169,7 +3185,7 @@ sub match_globs {
|
|||
return unless scalar @x == 3;
|
||||
my $dirents = $x[0];
|
||||
foreach my $de (keys %$dirents) {
|
||||
next if $dirents->{$de}->kind != $SVN::Node::dir;
|
||||
next if $dirents->{$de}->{kind} != $SVN::Node::dir;
|
||||
my $p = $g->{path}->full_path($de);
|
||||
next if $exists->{$p};
|
||||
next if (length $g->{path}->{right} &&
|
||||
|
|
|
@ -185,8 +185,13 @@ rm -rf $RPM_BUILD_ROOT
|
|||
%{_datadir}/git-core/
|
||||
%doc README COPYING Documentation/*.txt
|
||||
%{!?_without_docs: %doc Documentation/*.html Documentation/howto}
|
||||
%{!?_without_docs: %doc Documentation/technical}
|
||||
|
||||
%changelog
|
||||
* Tue May 13 2007 Quy Tonthat <qtonthat@gmail.com>
|
||||
- Added lib files for git-gui
|
||||
- Added Documentation/technical (As needed by Git Users Manual)
|
||||
|
||||
* Tue May 8 2007 Quy Tonthat <qtonthat@gmail.com>
|
||||
- Added howto files
|
||||
|
||||
|
|
|
@ -407,6 +407,25 @@ EOF
|
|||
test_expect_success "section was removed properly" \
|
||||
"git diff -u expect .git/config"
|
||||
|
||||
rm .git/config
|
||||
|
||||
cat > expect << EOF
|
||||
[gitcvs]
|
||||
enabled = true
|
||||
dbname = %Ggitcvs2.%a.%m.sqlite
|
||||
[gitcvs "ext"]
|
||||
dbname = %Ggitcvs1.%a.%m.sqlite
|
||||
EOF
|
||||
|
||||
test_expect_success 'section ending' '
|
||||
|
||||
git-config gitcvs.enabled true &&
|
||||
git-config gitcvs.ext.dbname %Ggitcvs1.%a.%m.sqlite &&
|
||||
git-config gitcvs.dbname %Ggitcvs2.%a.%m.sqlite &&
|
||||
cmp .git/config expect
|
||||
|
||||
'
|
||||
|
||||
test_expect_success numbers '
|
||||
|
||||
git-config kilo.gram 1k &&
|
||||
|
|
|
@ -229,7 +229,7 @@ test_expect_failure 'exit if init-ing a would clobber a URL' "
|
|||
|
||||
test_expect_success \
|
||||
'init allows us to connect to another directory in the same repo' "
|
||||
git-svn init -i bar $svnrepo/bar &&
|
||||
git-svn init --minimize-url -i bar $svnrepo/bar &&
|
||||
git config --get svn-remote.svn.fetch \
|
||||
'^bar:refs/remotes/bar$' &&
|
||||
git config --get svn-remote.svn.fetch \
|
||||
|
|
|
@ -28,7 +28,7 @@ test_expect_success 'initialize repo' "
|
|||
"
|
||||
|
||||
test_expect_success 'init and fetch a moved directory' "
|
||||
git-svn init -i thunk $svnrepo/thunk &&
|
||||
git-svn init --minimize-url -i thunk $svnrepo/thunk &&
|
||||
git-svn fetch -i thunk &&
|
||||
test \"\`git-rev-parse --verify refs/remotes/thunk@2\`\" \
|
||||
= \"\`git-rev-parse --verify refs/remotes/thunk~1\`\" &&
|
||||
|
@ -68,7 +68,8 @@ test_expect_success 'follow larger parent' "
|
|||
echo hi > import/trunk/thunk/bump/thud/file &&
|
||||
svn import -m 'import a larger parent' import $svnrepo/larger-parent &&
|
||||
svn cp -m 'hi' $svnrepo/larger-parent $svnrepo/another-larger &&
|
||||
git-svn init -i larger $svnrepo/another-larger/trunk/thunk/bump/thud &&
|
||||
git-svn init --minimize-url -i larger \
|
||||
$svnrepo/another-larger/trunk/thunk/bump/thud &&
|
||||
git-svn fetch -i larger &&
|
||||
git-rev-parse --verify refs/remotes/larger &&
|
||||
git-rev-parse --verify \
|
||||
|
@ -90,14 +91,14 @@ test_expect_success 'follow higher-level parent' "
|
|||
cd ..
|
||||
svn mkdir -m 'new glob at top level' $svnrepo/glob &&
|
||||
svn mv -m 'move blob down a level' $svnrepo/blob $svnrepo/glob/blob &&
|
||||
git-svn init -i blob $svnrepo/glob/blob &&
|
||||
git-svn init --minimize-url -i blob $svnrepo/glob/blob &&
|
||||
git-svn fetch -i blob
|
||||
"
|
||||
|
||||
test_expect_success 'follow deleted directory' "
|
||||
svn mv -m 'bye!' $svnrepo/glob/blob/hi $svnrepo/glob/blob/bye &&
|
||||
svn rm -m 'remove glob' $svnrepo/glob &&
|
||||
git-svn init -i glob $svnrepo/glob &&
|
||||
git-svn init --minimize-url -i glob $svnrepo/glob &&
|
||||
git-svn fetch -i glob &&
|
||||
test \"\`git cat-file blob refs/remotes/glob:blob/bye\`\" = hi &&
|
||||
test \"\`git ls-tree refs/remotes/glob | wc -l \`\" -eq 1
|
||||
|
@ -127,7 +128,7 @@ test_expect_success 'follow-parent avoids deleting relevant info' "
|
|||
poke native/t/c.t &&
|
||||
svn commit -m 'reorg test' &&
|
||||
cd .. &&
|
||||
git-svn init -i r9270-t \
|
||||
git-svn init --minimize-url -i r9270-t \
|
||||
$svnrepo/r9270/trunk/subversion/bindings/swig/perl/native/t &&
|
||||
git-svn fetch -i r9270-t &&
|
||||
test \`git rev-list r9270-t | wc -l\` -eq 2 &&
|
||||
|
@ -137,7 +138,7 @@ test_expect_success 'follow-parent avoids deleting relevant info' "
|
|||
|
||||
test_expect_success "track initial change if it was only made to parent" "
|
||||
svn cp -m 'wheee!' $svnrepo/r9270/trunk $svnrepo/r9270/drunk &&
|
||||
git-svn init -i r9270-d \
|
||||
git-svn init --minimize-url -i r9270-d \
|
||||
$svnrepo/r9270/drunk/subversion/bindings/swig/perl/native/t &&
|
||||
git-svn fetch -i r9270-d &&
|
||||
test \`git rev-list r9270-d | wc -l\` -eq 3 &&
|
||||
|
|
|
@ -33,7 +33,7 @@ test_expect_success 'test the commit-diff command' "
|
|||
|
||||
test_expect_success 'commit-diff to a sub-directory (with git-svn config)' "
|
||||
svn import -m 'sub-directory' import $svnrepo/subdir &&
|
||||
git-svn init $svnrepo/subdir &&
|
||||
git-svn init --minimize-url $svnrepo/subdir &&
|
||||
git-svn fetch &&
|
||||
git-svn commit-diff -r3 '$prev' '$head' &&
|
||||
svn cat $svnrepo/subdir/readme > readme.2 &&
|
||||
|
|
|
@ -9,9 +9,10 @@ test_description='git-svn useSvmProps test'
|
|||
|
||||
test_expect_success 'load svm repo' "
|
||||
svnadmin load -q $rawsvnrepo < ../t9110/svm.dump &&
|
||||
git-svn init -R arr -i bar $svnrepo/mirror/arr &&
|
||||
git-svn init -R argh -i dir $svnrepo/mirror/argh &&
|
||||
git-svn init -R argh -i e $svnrepo/mirror/argh/a/b/c/d/e &&
|
||||
git-svn init --minimize-url -R arr -i bar $svnrepo/mirror/arr &&
|
||||
git-svn init --minimize-url -R argh -i dir $svnrepo/mirror/argh &&
|
||||
git-svn init --minimize-url -R argh -i e \
|
||||
$svnrepo/mirror/argh/a/b/c/d/e &&
|
||||
git-config svn.useSvmProps true &&
|
||||
git-svn fetch --all
|
||||
"
|
||||
|
|
|
@ -9,9 +9,9 @@ test_description='git-svn useSvnsyncProps test'
|
|||
|
||||
test_expect_success 'load svnsync repo' "
|
||||
svnadmin load -q $rawsvnrepo < ../t9111/svnsync.dump &&
|
||||
git-svn init -R arr -i bar $svnrepo/bar &&
|
||||
git-svn init -R argh -i dir $svnrepo/dir &&
|
||||
git-svn init -R argh -i e $svnrepo/dir/a/b/c/d/e &&
|
||||
git-svn init --minimize-url -R arr -i bar $svnrepo/bar &&
|
||||
git-svn init --minimize-url -R argh -i dir $svnrepo/dir &&
|
||||
git-svn init --minimize-url -R argh -i e $svnrepo/dir/a/b/c/d/e &&
|
||||
git-config svn.useSvnsyncProps true &&
|
||||
git-svn fetch --all
|
||||
"
|
||||
|
|
|
@ -27,7 +27,6 @@ static inline int tree_entry_len(const char *name, const unsigned char *sha1)
|
|||
|
||||
void update_tree_entry(struct tree_desc *);
|
||||
void init_tree_desc(struct tree_desc *desc, const void *buf, unsigned long size);
|
||||
const unsigned char *tree_entry_extract(struct tree_desc *, const char **, unsigned int *);
|
||||
|
||||
/* Helper function that does both of the above and returns true for success */
|
||||
int tree_entry(struct tree_desc *, struct name_entry *);
|
||||
|
|
Загрузка…
Ссылка в новой задаче