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

2014-06-26 Thread Uwe Kleine-König
Hi Junio,

On Wed, Jun 25, 2014 at 01:41:23PM -0700, Junio C Hamano wrote:
 Uwe Kleine-König  u.kleine-koe...@pengutronix.de writes:
  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
  u.kleine-koe...@pengutronix.de 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.
 
 Or
 
   git request-pull origin/master origin HEAD:ukl/for-mainline
 
 I am not Linus, and do not speak for him, but FWIW here are some
 comments on the ideas.
 
  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.
 
 I am on the fence but slightly leaning to the negative side on this
 one.  The branch/ref the object was took from when git pull is run
 does matter, because the name is recorded in the merge summary, so
 we cannot say There are refs that happen to point at the object you
 wanted to be pulled, so we'll pick one of them let the integrator
 pull from that ref we randomly chose is not something we would
 want.  If there is a unique one, that must be the one the user has
 meant; there is nothing else possible feels like a strong argument,
 and I was actually contemplating about doing an enhancement on top
 of Linus's original myself along that line, back when we queued that
 patch exactly for that reason.
 
 But a counter-argument, in the context of Linus's change in question
 being primarily to avoid end-user mistakes resulting in a bogus
 request, is that the ref on the remote that happens to match the
 object but is different from what the user named may be a totally
 unrelated branch before the user actually has pushed the set of
 changes the request is going to ask to be pulled.  The mistake that
 this extra strictness tries to avoid is to compose request-pull
 before pushing what to be pulled and then forgetting to push.
Sounds sensible. Then the enhancements that come to my mind are:

Change git-request-pull to explicitly take a remote ref as end. This
makes sure that it is actually there and the right remote name is
picked. Don't require to specify a local ref even if there is no
local matching ref, just use the remote sha1 to generate the diffstat
and summary.

Another thing I'd like to have is to make git-request-pull not generate
the usual output if there is no match. Optionally introduce a -f to get
back the (maybe bogus) output; in this case a local rev would be needed.

Best regards
Uwe

-- 
Pengutronix e.K.   | Uwe Kleine-König|
Industrial Linux Solutions | http://www.pengutronix.de/  |
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


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

2014-06-25 Thread Linus Torvalds
On Wed, Jun 25, 2014 at 2:55 AM, Uwe Kleine-König
u.kleine-koe...@pengutronix.de 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
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


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

2014-06-25 Thread Uwe Kleine-König
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
 u.kleine-koe...@pengutronix.de 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.
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/  |
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


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

2014-06-25 Thread Junio C Hamano
Uwe Kleine-König  u.kleine-koe...@pengutronix.de writes:

 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
 u.kleine-koe...@pengutronix.de 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.

Or

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


I am not Linus, and do not speak for him, but FWIW here are some
comments on the ideas.

 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.

I am on the fence but slightly leaning to the negative side on this
one.  The branch/ref the object was took from when git pull is run
does matter, because the name is recorded in the merge summary, so
we cannot say There are refs that happen to point at the object you
wanted to be pulled, so we'll pick one of them let the integrator
pull from that ref we randomly chose is not something we would
want.  If there is a unique one, that must be the one the user has
meant; there is nothing else possible feels like a strong argument,
and I was actually contemplating about doing an enhancement on top
of Linus's original myself along that line, back when we queued that
patch exactly for that reason.

But a counter-argument, in the context of Linus's change in question
being primarily to avoid end-user mistakes resulting in a bogus
request, is that the ref on the remote that happens to match the
object but is different from what the user named may be a totally
unrelated branch before the user actually has pushed the set of
changes the request is going to ask to be pulled.  The mistake that
this extra strictness tries to avoid is to compose request-pull
before pushing what to be pulled and then forgetting to push.

  - if there are = 1 match on the remote side and exactly one matches
what I specified as end, use it.

The original change by Linus being about avoiding mistakes by
requiring the user to name what to be pulled, i.e. end, this point
of other refs also happen to point at the same object is made
irrelevant---if end does have the object the user named to be
pulled, that should be used regardless of where other refs point at.

  - 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.

Assuming that end does not match the object in these two cases
(otherwise your second condition would have caught it), they share
the same potential objection as the first one.

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