Re: [PATCH] git-svn: allow to specify svn branch for commands

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Sam Vilain <sam@xxxxxxxxxx> wrote:
> Eric Wong wrote:
> > Sam Vilain <sam.vilain@xxxxxxxxxxxxxxx> wrote:
> >> "git-svn dcommit" ends up making an arbitrary decision when pushing
> >> back merges.  Allow the user to specify which one is used, albeit in a
> >> rather hack-ish way.
> > 
> > Frightening...  Perhaps we should echo the final URL out
> > to the user and prompt them for confirmation.
> 
> Actually in between sending this to the list, I figured that it should
> be possible to detect when this is happening, at the expense of an extra
> "git-log" command.  Basically, take the first revision you found a
> commitlog entry in, and then do a log from the indicated head excluding
> that commit.  If you find more valid tips then the user is merging in
> gitspace.
> 
> Of course ideally you want to make sure that merge commits posted back
> are shipped with all of the necessary tokens for the various SVN-land
> tools out there.  eg, svk:merge, svnmerge, and whatever kooky system the
> SVN dev team come up with.  But that's a separate issue.
> 
> The original patch had a fairly dire bug, so here's a version that at
> least doesn't break the test suite.
> 
> Subject: [PATCH] git-svn: allow to specify svn branch for commands
> 
> "git-svn dcommit" ends up making an arbitrary decision when pushing
> back merges.  Allow the user to specify which one is used, albeit in a
> rather hack-ish way.

Actually, I believe 13c823fb520eaf1cded520213cf0ae4c3268208d already
solves this problem.  In fact, I'm not certain if you can find a case
where this will help if 13c823fb520eaf1cded520213cf0ae4c3268208d is in
place.  A test case to prove that this is actually needed would be
greatly appreciated :)

On the other hand (much to my chagrin), I haven't been working much on
git-svn lately and my knowledge could be rusty.

> ---
> 
>  Documentation/git-svn.txt |   11 +++++++++++
>  git-svn.perl              |   17 ++++++++++-------
>  2 files changed, 21 insertions(+), 7 deletions(-)
> 
> diff --git a/Documentation/git-svn.txt b/Documentation/git-svn.txt
> index c0d7d95..3e64522 100644
> --- a/Documentation/git-svn.txt
> +++ b/Documentation/git-svn.txt
> @@ -69,6 +69,17 @@ COMMANDS
>  	argument if that is what you want.  This is useful if
>  	you wish to track multiple projects that share a common
>  	repository.
> +-B<svn_branch>;;
> +--branch=<svn_branch>;;
> +	Normally, git-svn is capable of figuring out which branch you
> +	are working on.  However, if you are doing merges between svn
> +	branches using git then the decision about which branch to
> +	dcommit to will end up being made based on which of the
> +	branches you are merging has the newest upstream commit.  This
> +	option enables a global filter that tells git-svn what to look
> +	for in the git-svn-id: line - specify a repository UUID or a
> +	branch name here.  So, it may be used with "git-svn log",
> +	"git-svn dcommit", etc.

I think you missed my comment here on it being a regexp :)

>  'fetch'::
>  	Fetch unfetched revisions from the Subversion remote we are
> diff --git a/git-svn.perl b/git-svn.perl
> index e350061..906aa4b 100755
> --- a/git-svn.perl
> +++ b/git-svn.perl
> @@ -54,7 +54,7 @@ $sha1 = qr/[a-f\d]{40}/;
>  $sha1_short = qr/[a-f\d]{4,40}/;
>  my ($_stdin, $_help, $_edit,
>  	$_message, $_file,
> -	$_template, $_shared,
> +	$_template, $_shared, $_branch,
>  	$_version, $_fetch_all, $_no_rebase,
>  	$_merge, $_strategy, $_dry_run, $_local,
>  	$_prefix, $_no_checkout, $_verbose);
> @@ -69,6 +69,7 @@ my %fc_opts = ( 'follow-parent|follow!' => \$Git::SVN::_follow_parent,
>  		'useSvmProps' => \$Git::SVN::_use_svm_props,
>  		'useSvnsyncProps' => \$Git::SVN::_use_svnsync_props,
>  		'log-window-size=i' => \$Git::SVN::Ra::_log_window_size,
> +		'branch|B=s' => \$_branch,
>  		'no-checkout' => \$_no_checkout,
>  		'quiet|q' => \$_q,
>  		'repack-flags|repack-args|repack-opts=s' =>
> @@ -367,7 +368,7 @@ sub cmd_dcommit {
>  	my $head = shift;
>  	$head ||= 'HEAD';
>  	my @refs;
> -	my ($url, $rev, $uuid, $gs) = working_head_info($head, \@refs);
> +	my ($url, $rev, $uuid, $gs) = working_head_info($head, \@refs, $_branch);
>  	unless ($gs) {
>  		die "Unable to determine upstream SVN information from ",
>  		    "$head history\n";
> @@ -441,7 +442,7 @@ sub cmd_find_rev {
>  		my $head = shift;
>  		$head ||= 'HEAD';
>  		my @refs;
> -		my (undef, undef, undef, $gs) = working_head_info($head, \@refs);
> +		my (undef, undef, undef, $gs) = working_head_info($head, \@refs, $_branch);
>  		unless ($gs) {
>  			die "Unable to determine upstream SVN information from ",
>  			    "$head history\n";
> @@ -457,7 +458,7 @@ sub cmd_find_rev {
  
I don't think you need this hunk.  You can already pass the remote
branch name here (same with "git svn log").

>  sub cmd_rebase {
>  	command_noisy(qw/update-index --refresh/);
> -	my ($url, $rev, $uuid, $gs) = working_head_info('HEAD');
> +	my ($url, $rev, $uuid, $gs) = working_head_info('HEAD', undef, $_branch);
>  	unless ($gs) {
>  		die "Unable to determine upstream SVN information from ",
>  		    "working tree history\n";
> @@ -474,7 +475,7 @@ sub cmd_rebase {
>  }
>  
>  sub cmd_show_ignore {
> -	my ($url, $rev, $uuid, $gs) = working_head_info('HEAD');
> +	my ($url, $rev, $uuid, $gs) = working_head_info('HEAD', undef, $_branch);
>  	$gs ||= Git::SVN->new;
>  	my $r = (defined $_revision ? $_revision : $gs->ra->get_latest_revnum);
>  	$gs->traverse_ignore(\*STDOUT, $gs->{path}, $r);
> @@ -801,12 +802,14 @@ sub cmt_metadata {
>  }

You need to put --branch/-B into %cmd directly, %fc_opts won't cover
this ('fc' => fetch/commit).  On the other hand, we should probably make
this command take a $head from the command-line like "git svn log" and
"git svn find-rev"...

>  sub working_head_info {
> -	my ($head, $refs) = @_;
> +	my ($head, $refs, $grep) = @_;
>  	my ($fh, $ctx) = command_output_pipe('rev-list', $head);
>  	while (my $hash = <$fh>) {
>  		chomp($hash);
>  		my ($url, $rev, $uuid) = cmt_metadata($hash);
>  		if (defined $url && defined $rev) {
> +			next unless (!$grep or
> +				$url =~ m{$grep} or $uuid =~ m{$grep});
>  			if (my $gs = Git::SVN->find_by_url($url)) {
>  				my $c = $gs->rev_db_get($rev);
>  				if ($c && $c eq $hash) {

This last 'if' statement here checking the rev_db (introduced in
13c823fb520eaf1cded520213cf0ae4c3268208d still allows what
this patch is intended to do?

> @@ -3394,7 +3397,7 @@ sub git_svn_log_cmd {
>  		last;
>  	}
>  
> -	my ($url, $rev, $uuid, $gs) = ::working_head_info($head);
> +	my ($url, $rev, $uuid, $gs) = ::working_head_info($head, undef, $_branch);
>  	$gs ||= Git::SVN->_new;
>  	my @cmd = (qw/log --abbrev-commit --pretty=raw --default/,
>  	           $gs->refname);

You don't need this last hunk.   git svn log already takes
remote branches as an argument, and I don't think the -B switch is
passed here where you put it in %fc_opts.

-- 
Eric Wong
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux