summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2010-08-02 15:38:55 -0700
committerJunio C Hamano <gitster@pobox.com>2010-08-02 15:38:55 -0700
commite7bdd1b90bb37139b37683aa306a9e161cb9e6ce (patch)
tree7de9fb5a55c5840989d1209b6362404849ef79cb
parent9f9aa761305e909aca9a46ccb33a5872b36bcb8e (diff)
parent181264ad590ffef9d956fdd023369869c2d0a55f (diff)
downloadgit-e7bdd1b90bb37139b37683aa306a9e161cb9e6ce.tar.gz
Merge git://git.bogomips.org/git-svn
* git://git.bogomips.org/git-svn: git svn: fix dcommit to work with touched files git svn: add an option to recode pathnames
-rw-r--r--Documentation/git-svn.txt6
-rwxr-xr-xgit-svn.perl10
-rwxr-xr-xt/t9100-git-svn-basic.sh11
3 files changed, 27 insertions, 0 deletions
diff --git a/Documentation/git-svn.txt b/Documentation/git-svn.txt
index b09bd9761f..4b84d08fc8 100644
--- a/Documentation/git-svn.txt
+++ b/Documentation/git-svn.txt
@@ -646,6 +646,12 @@ svn.brokenSymlinkWorkaround::
revision fetched. If unset, 'git svn' assumes this option to
be "true".
+svn.pathnameencoding::
+ This instructs git svn to recode pathnames to a given encoding.
+ It can be used by windows users and by those who work in non-utf8
+ locales to avoid corrupted file names with non-ASCII characters.
+ Valid encodings are the ones supported by Perl's Encode module.
+
Since the noMetadata, rewriteRoot, rewriteUUID, useSvnsyncProps and useSvmProps
options all affect the metadata generated and used by 'git svn'; they
*must* be set in the configuration file before any history is imported
diff --git a/git-svn.perl b/git-svn.perl
index c4163584a9..8d2ef3d16f 100755
--- a/git-svn.perl
+++ b/git-svn.perl
@@ -494,6 +494,7 @@ sub cmd_set_tree {
sub cmd_dcommit {
my $head = shift;
+ command_noisy(qw/update-index --refresh/);
git_cmd_try { command_oneline(qw/diff-index --quiet HEAD/) }
'Cannot dcommit with a dirty index. Commit your changes first, '
. "or stash them with `git stash'.\n";
@@ -4050,6 +4051,7 @@ sub new {
$self->{absent_dir} = {};
$self->{absent_file} = {};
$self->{gii} = $git_svn->tmp_index_do(sub { Git::IndexInfo->new });
+ $self->{pathnameencoding} = Git::config('svn.pathnameencoding');
$self;
}
@@ -4133,6 +4135,10 @@ sub open_directory {
sub git_path {
my ($self, $path) = @_;
+ if (my $enc = $self->{pathnameencoding}) {
+ require Encode;
+ Encode::from_to($path, 'UTF-8', $enc);
+ }
if ($self->{path_strip}) {
$path =~ s!$self->{path_strip}!! or
die "Failed to strip path '$path' ($self->{path_strip})\n";
@@ -4521,6 +4527,10 @@ sub split_path {
sub repo_path {
my ($self, $path) = @_;
+ if (my $enc = $self->{pathnameencoding}) {
+ require Encode;
+ Encode::from_to($path, $enc, 'UTF-8');
+ }
$self->{path_prefix}.(defined $path ? $path : '');
}
diff --git a/t/t9100-git-svn-basic.sh b/t/t9100-git-svn-basic.sh
index 13766ab160..d5adae640b 100755
--- a/t/t9100-git-svn-basic.sh
+++ b/t/t9100-git-svn-basic.sh
@@ -271,6 +271,17 @@ test_expect_success 'able to dcommit to a subdirectory' "
test -z \"\`git diff refs/heads/my-bar refs/remotes/bar\`\"
"
+test_expect_success 'dcommit should not fail with a touched file' '
+ test_commit "commit-new-file-foo2" foo2 &&
+ test-chmtime =-60 foo &&
+ git svn dcommit
+'
+
+test_expect_success 'rebase should not fail with a touched file' '
+ test-chmtime =-60 foo &&
+ git svn rebase
+'
+
test_expect_success 'able to set-tree to a subdirectory' "
echo cba > d &&
git update-index d &&