From: Eric Wong <normalperson@yhbt.net>
To: Brad King <brad.king@kitware.com>
Cc: Junio C Hamano <gitster@pobox.com>, git@vger.kernel.org
Subject: Re: [PATCH] git-svn: teach dcommit about svn auto-props
Date: Fri, 25 Jul 2008 22:45:47 -0700 [thread overview]
Message-ID: <20080726054547.GA20494@untitled> (raw)
In-Reply-To: <4889F215.9020804@kitware.com>
Brad King <brad.king@kitware.com> wrote:
>
> Subversion repositories often require files to have properties such as
> svn:mime-type and svn:eol-style set when they are added. Users
> typically set these properties automatically using the SVN auto-props
> feature with 'svn add'. This commit teaches dcommit to look at the user
> SVN configuration and apply matching auto-props entries for files added
> by a diff as it is applied to the SVN remote.
>
> Signed-off-by: Brad King <brad.king@kitware.com>
Thanks Brad,
Acked-by: Eric Wong <normalperson@yhbt.net>
> ---
> Eric Wong wrote:
> > I like this patch.
>
> Thanks.
>
> > Can we get an automated test of this functionality?
>
> This patch adds a test. I also fixed the property name/value parsing
> to remove leading and trailing whitespace.
>
> > We can (and probably should) set $HOME for the test and ignore the
> > existing ~/.subversion/config of the user.
>
> I used the --config-dir option.
>
> > Also, some minor nitpicks on whitespace/formatting inline below.
>
> Addressed. I missed the wrong indentation before because my second patch
> removed it.
>
> > I haven't had the chance to look at this. Can anybody else shed more
> > light on that bug? It's really strange that the tests won't run because
> > of it. Are you unable to run some git-svn tests or all of them?
>
> Just that one fails. All others (including the one in the patch below) pass.
Exactly which test fails for you? Perhaps it's some setting in your
~/.subversion/config that's causing it to fail. Maybe we should set
$HOME and use a clean ~/.subversion/config for git-svn tests regardless
if that turns out to be the case...
> Thanks for reviewing,
> -Brad
>
> git-svn.perl | 52 ++++++++++++++++++++
> t/t9124-git-svn-dcommit-auto-props.sh | 84 +++++++++++++++++++++++++++++++++
> 2 files changed, 136 insertions(+), 0 deletions(-)
> create mode 100755 t/t9124-git-svn-dcommit-auto-props.sh
>
> diff --git a/git-svn.perl b/git-svn.perl
> index 2e0e552..0a8e907 100755
> --- a/git-svn.perl
> +++ b/git-svn.perl
> @@ -3340,6 +3340,7 @@ sub new {
> $self->{rm} = { };
> $self->{path_prefix} = length $self->{svn_path} ?
> "$self->{svn_path}/" : '';
> + $self->{config} = $opts->{config};
> return $self;
> }
>
> @@ -3528,6 +3529,56 @@ sub ensure_path {
> return $bat->{$c};
> }
>
> +# Subroutine to convert a globbing pattern to a regular expression.
> +# From perl cookbook.
> +sub glob2pat {
> + my $globstr = shift;
> + my %patmap = ('*' => '.*', '?' => '.', '[' => '[', ']' => ']');
> + $globstr =~ s{(.)} { $patmap{$1} || "\Q$1" }ge;
> + return '^' . $globstr . '$';
> +}
> +
> +sub check_autoprop {
> + my ($self, $pattern, $properties, $file, $fbat) = @_;
> + # Convert the globbing pattern to a regular expression.
> + my $regex = glob2pat($pattern);
> + # Check if the pattern matches the file name.
> + if($file =~ m/($regex)/) {
> + # Parse the list of properties to set.
> + my @props = split(/;/, $properties);
> + foreach my $prop (@props) {
> + # Parse 'name=value' syntax and set the property.
> + if ($prop =~ /([^=]+)=(.*)/) {
> + my ($n,$v) = ($1,$2);
> + $n =~ s/^\s+//; $n =~ s/\s+$//;
> + $v =~ s/^\s+//; $v =~ s/\s+$//;
> + $self->change_file_prop($fbat, $n, $v);
> + }
> + }
> + }
> +}
> +
> +sub apply_autoprops {
> + my ($self, $file, $fbat) = @_;
> + my $conf_t = ${$self->{config}}{'config'};
> + no warnings 'once';
> + # Check [miscellany]/enable-auto-props in svn configuration.
> + if (SVN::_Core::svn_config_get_bool(
> + $conf_t,
> + $SVN::_Core::SVN_CONFIG_SECTION_MISCELLANY,
> + $SVN::_Core::SVN_CONFIG_OPTION_ENABLE_AUTO_PROPS,
> + 0)) {
> + # Auto-props are enabled. Enumerate them to look for matches.
> + my $callback = sub {
> + $self->check_autoprop($_[0], $_[1], $file, $fbat);
> + };
> + SVN::_Core::svn_config_enumerate(
> + $conf_t,
> + $SVN::_Core::SVN_CONFIG_SECTION_AUTO_PROPS,
> + $callback);
> + }
> +}
> +
> sub A {
> my ($self, $m) = @_;
> my ($dir, $file) = split_path($m->{file_b});
> @@ -3535,6 +3586,7 @@ sub A {
> my $fbat = $self->add_file($self->repo_path($m->{file_b}), $pbat,
> undef, -1);
> print "\tA\t$m->{file_b}\n" unless $::_q;
> + $self->apply_autoprops($file, $fbat);
> $self->chg_file($fbat, $m);
> $self->close_file($fbat,undef,$self->{pool});
> }
> diff --git a/t/t9124-git-svn-dcommit-auto-props.sh b/t/t9124-git-svn-dcommit-auto-props.sh
> new file mode 100755
> index 0000000..beefbcc
> --- /dev/null
> +++ b/t/t9124-git-svn-dcommit-auto-props.sh
> @@ -0,0 +1,84 @@
> +#!/bin/sh
> +#
> +# Copyright (c) 2008 Brad King
> +
> +test_description='git-svn dcommit honors auto-props'
> +
> +. ./lib-git-svn.sh
> +
> +generate_auto_props() {
> +cat << EOF
> +[miscellany]
> +enable-auto-props=$1
> +[auto-props]
> +*.sh = svn:mime-type=application/x-shellscript; svn:eol-style=LF
> +*.txt = svn:mime-type=text/plain; svn:eol-style = native
> +EOF
> +}
> +
> +test_expect_success 'initialize git-svn' '
> + mkdir import &&
> + cd import &&
> + echo foo > foo &&
> + svn import -m "import for git-svn" . "$svnrepo" >/dev/null &&
> + cd .. &&
> + rm -rf import &&
> + git-svn init "$svnrepo"
> + git-svn fetch'
> +
> +test_expect_success 'enable auto-props config' '
> + cd "$gittestrepo" &&
> + mkdir user &&
> + generate_auto_props yes > user/config
> + '
> +
> +test_expect_success 'add files matching auto-props' '
> + cd "$gittestrepo" &&
> + echo "#!/bin/sh" > exec1.sh &&
> + chmod +x exec1.sh &&
> + echo "hello" > hello.txt &&
> + echo bar > bar &&
> + git add exec1.sh hello.txt bar &&
> + git commit -m "files for enabled auto-props" &&
> + git svn dcommit --config-dir=user
> + '
> +
> +test_expect_success 'disable auto-props config' '
> + cd "$gittestrepo" &&
> + generate_auto_props no > user/config
> + '
> +
> +test_expect_success 'add files matching disabled auto-props' '
> + cd "$gittestrepo" &&
> + echo "#!/bin/sh" > exec2.sh &&
> + chmod +x exec2.sh &&
> + echo "world" > world.txt &&
> + echo zot > zot &&
> + git add exec2.sh world.txt zot &&
> + git commit -m "files for disabled auto-props" &&
> + git svn dcommit --config-dir=user
> + '
> +
> +test_expect_success 'check resulting svn repository' '
> + mkdir work &&
> + cd work &&
> + svn co "$svnrepo" &&
> + cd svnrepo &&
> +
> + # Check properties from first commit.
> + test "x$(svn propget svn:executable exec1.sh)" = "x*" &&
> + test "x$(svn propget svn:mime-type exec1.sh)" = \
> + "xapplication/x-shellscript" &&
> + test "x$(svn propget svn:mime-type hello.txt)" = "xtext/plain" &&
> + test "x$(svn propget svn:eol-style hello.txt)" = "xnative" &&
> + test "x$(svn propget svn:mime-type bar)" = "x" &&
> +
> + # Check properties from second commit.
> + test "x$(svn propget svn:executable exec2.sh)" = "x*" &&
> + test "x$(svn propget svn:mime-type exec2.sh)" = "x" &&
> + test "x$(svn propget svn:mime-type world.txt)" = "x" &&
> + test "x$(svn propget svn:eol-style world.txt)" = "x" &&
> + test "x$(svn propget svn:mime-type zot)" = "x"
> + '
> +
> +test_done
--
Eric Wong
next prev parent reply other threads:[~2008-07-26 5:47 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-07-21 21:40 [PATCH 1/2] git-svn: teach dcommit about svn auto-props Brad King
2008-07-25 6:00 ` Eric Wong
2008-07-25 15:32 ` [PATCH] " Brad King
2008-07-26 5:45 ` Eric Wong [this message]
2008-07-26 14:08 ` Brad King
2008-08-03 22:02 ` [RFH] - git-svn auth bug (possibly SVN 1.5.0-related) Eric Wong
2008-08-04 14:18 ` Dmitry Potapov
2008-08-04 15:14 ` Dmitry Potapov
2008-08-04 15:30 ` [PATCH] correct access right for git-svn-dcommit test Dmitry Potapov
2008-08-04 15:44 ` Brad King
2008-08-05 3:18 ` Eric Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080726054547.GA20494@untitled \
--to=normalperson@yhbt.net \
--cc=brad.king@kitware.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.