BUG: git request-pull broken for plain branches

3 messages, 2 authors, 2016-06-15 · open the first message on its own page

BUG: git request-pull broken for plain branches

From: Uwe Kleine-König <hidden>
Date: 2016-06-15 23:01:44

Hello,

I have git from Debian's 2.0.0-2 package:

	$ git version
	git version 2.0.0

git request-pull is broken for me:

	$ git rev-parse HEAD
	9e065e4a5a58308f1a0da4bb80b830929dfa90b3
	$ git ls-remote origin | grep 9e065e4a5a58308f1a0da4bb80b830929dfa90b3
	9e065e4a5a58308f1a0da4bb80b830929dfa90b3	refs/heads/ukl/for-mainline
	$ git request-pull origin/master origin HEAD > /dev/null
	warn: No match for commit 9e065e4a5a58308f1a0da4bb80b830929dfa90b3 found at origin
	warn: Are you sure you pushed 'HEAD' there?

The same happens on 2.0.0.421.g786a89d.

The problem is in git-request-pull.sh's find_matching_ref. This code has
more than one problem (looking on 2.0.0.421.g786a89d):

	- find_matching_ref doesn't assign to $found if none of the if
	  conditions in the loop match (this results in my problem);
	- find_matching_ref happily overwrites $found even if the
	  previous ref was better according to the metric specified
	  above the definition of find_matching_ref; and
	- the output generated uses $pretty_remote without asserting
	  that it matches $ref. In my case this results in a branch
	  specification of "HEAD" even if I fix find_matching_ref to
	  return refs/heads/ukl/for-mainline.

I tried to add this case to t/t5150-request-pull.sh, but didn't
understand how after starring at it for half an hour. :-(

Bisection points on 024d34cb0813 (request-pull: more strictly match
local/remote branches) as first bad commit. Apart from introducing the
warning, it also changes the branch spec from "ukl/for-mainline" (which
is correct) to the name of the current branch (which is bogus). Also
024d34cb0813 makes 5 out of 7 tests in t/t5150-request-pull.sh fail.

Best regards
Uwe

-- 
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |

Re: BUG: git request-pull broken for plain branches

From: Linus Torvalds <torvalds@linux-foundation.org>
Date: 2016-06-15 23:01:44

On Wed, Jun 25, 2014 at 2:55 AM, Uwe Kleine-König
[off-list ref] wrote:
        $ git rev-parse HEAD
        9e065e4a5a58308f1a0da4bb80b830929dfa90b3
        $ git ls-remote origin | grep 9e065e4a5a58308f1a0da4bb80b830929dfa90b3
        9e065e4a5a58308f1a0da4bb80b830929dfa90b3        refs/heads/ukl/for-mainline
        $ git request-pull origin/master origin HEAD > /dev/null
        warn: No match for commit 9e065e4a5a58308f1a0da4bb80b830929dfa90b3 found at origin
        warn: Are you sure you pushed 'HEAD' there?
Notice how "HEAD" does not match.

The error message is perhaps misleading. It's not enough to match the
commit. You need to match the branch name too. git used to guess the
branch name (from the commit), and it often guessed wrongly. So now
they need to match.

So you should do

    git request-pull origin/master origin ukl/for-mainline

to let request-pull know that you're requesting a pull for "ukl/for-mainline".

If you have another name for that branch locally (ie you did something
like "git push origin local:remote"), then you can say

    git request-pull origin/master origin local-name:remote-name

to specify what the branch to be pulled is called locally vs remotely.

In other words, what used to be "pick some branch randomly" is now
"you need to _specify_ the branch".

                Linus

Re: BUG: git request-pull broken for plain branches

From: Uwe Kleine-König <hidden>
Date: 2016-06-15 23:01:44

Hello Linus,

On Wed, Jun 25, 2014 at 05:05:51AM -0700, Linus Torvalds wrote:
On Wed, Jun 25, 2014 at 2:55 AM, Uwe Kleine-König
[off-list ref] wrote:
quoted
        $ git rev-parse HEAD
        9e065e4a5a58308f1a0da4bb80b830929dfa90b3
        $ git ls-remote origin | grep 9e065e4a5a58308f1a0da4bb80b830929dfa90b3
        9e065e4a5a58308f1a0da4bb80b830929dfa90b3        refs/heads/ukl/for-mainline
        $ git request-pull origin/master origin HEAD > /dev/null
        warn: No match for commit 9e065e4a5a58308f1a0da4bb80b830929dfa90b3 found at origin
        warn: Are you sure you pushed 'HEAD' there?
Notice how "HEAD" does not match.

The error message is perhaps misleading. It's not enough to match the
commit. You need to match the branch name too. git used to guess the
branch name (from the commit), and it often guessed wrongly. So now
they need to match.

So you should do

    git request-pull origin/master origin ukl/for-mainline

to let request-pull know that you're requesting a pull for "ukl/for-mainline".

If you have another name for that branch locally (ie you did something
like "git push origin local:remote"), then you can say

    git request-pull origin/master origin local-name:remote-name

to specify what the branch to be pulled is called locally vs remotely.

In other words, what used to be "pick some branch randomly" is now
"you need to _specify_ the branch".
ah, got it. Still some of my concerns stay valid and I also have some
new ones:

 - if there is a branch and a tag on the remote side that match what I
   specified the outcome depends on the order of git-ls-remote. (minor
   nit.)
 - if I have to specify the remote name now, why do I have to also
   specify my local ref? Isn't the respective $sha1 of the remote side
   enough to do what is needed?
 - Isn't $found = $sha1; silly because I cannot pull a rev, only a ref?
   (side note:

   	git pull linus d91d66e88ea95b6dd21958834414009614385153

   gives no error message, only returns 1 and does nothing else.)
 - Is the result of

 	git request-pull $somecommit origin

   what is intended? For me it does

   	...
	are available in the git repository at:

	  $repository

	for you to fetch changes ...

   if the remote HEAD matches the local one. I'd prefer to have an
   explicit branch name there, or at least HEAD.

I liked git guessing the branch name, maybe we can teach it to guess a
bit better than it did before 2.0? Something like:

 - if there is a unique match on the remote side, use it.
 - if there are >= 1 match on the remote side and exactly one matches
   what I specified as <end>, use it.
 - if there are >= 1 match on the remote side and exactly one of them is
   a tag, use the tag
 - if there are two matches on the remote side, and one is "HEAD",
   pick the other one.

Best regards
Uwe

-- 
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help