* [Q] Determing if a commit is reachable from the HEAD ?
@ 2012-01-20 13:33 Brian Foster
2012-01-20 14:13 ` Andreas Schwab
2012-01-20 22:50 ` Sitaram Chamarty
0 siblings, 2 replies; 12+ messages in thread
From: Brian Foster @ 2012-01-20 13:33 UTC (permalink / raw)
To: git mailing list
Hello,
Whilst I have found answers to my question on the Web,
only one seems to do exactly what I want ....
x---Y---y---y---y HEAD
/
...--o---o---C---o---S
\
n---n---N---*---* other
In a script, how can I determine commit Y is reachable
from the current HEAD ? And, much more importantly
for my purposes, that commit N is _not_-reachable from
the current HEAD ? "A is reachable from B" meaning B
is an ancestor of A (B could possibly part of a merge
(not shown in the above diagram)):
✓ Commits o(all), C, S, x, y(all), and Y: YES (reachable).
✗ Commits n(all), N, and *(all): NO (not-reachable).
The only readily script-able answer I've found is to use
`git branch --contains=Y' and check to see if the current
branch (conveniently marked `*') is/isn't included in the
output. That is probably Ok, but I'm wondering if there
is some "better" method (with the IMPORTANT caveat it must
work with GIT 1.5.x or later ;-\ ).
git-rev-list(1) may be a answer (see script below), but ....
`git rev-list ^Y HEAD' lists all the y commits, which is Ok
(correct for my purposes). However, `git rev-list ^N HEAD'
lists commits x, Y, and y(all) on branch "other", which is
not-Ok: As per above, the answer I want is "NO".
Apologies if I've overlooked something totally obvious !
cheers,
-blf-
=====(cut here and below)=====reach02.sh=====
#!/bin/bash
#
# x---Y---y---y---y HEAD
# /
# ...--o---o---C---o---S
# \
# n---n---N---*---* other
#
: ${GIT:=git} # Allow use of different installed GIT versions.
update_file() {
date +"%c: $*" >>file
$GIT add file && $GIT commit -m "$*" file
}
set -e # Terminate if problem creating diagrammed situation.
rm -rf -- reachable
mkdir -- reachable
cd reachable
$GIT version
$GIT init
update_file o1
update_file o2
update_file "C (o3)"; $GIT tag C
update_file o4
update_file "S (o5)"; $GIT tag S
$GIT checkout -b other
update_file n1
update_file n2
update_file "N (n3)"; $GIT tag N
update_file "*1"
update_file "*2"
$GIT checkout master
update_file x
update_file "Y (y1)"; $GIT tag Y
update_file y2
update_file y3
update_file y4
declare -i wrong=0
echo "Is Y reachable from HEAD? Wanted answer: Yes."
$GIT log --oneline ^Y HEAD
if $GIT rev-list --quiet ^Y HEAD; then
echo "rev-list: YES (wanted answer)!"
else
echo "rev-list: No! *** not-wanted, oops... ***"
wrong=$(( wrong + 1 ))
fi
if $GIT branch --contains=Y | grep -q -e '^\*'; then
echo "contains: YES (wanted answer)!"
else
echo "contains: No! *** not-wanted, oops... ***"
wrong=$(( wrong + 1 ))
fi
echo "Is N reachable from HEAD? Wanted answer: No."
$GIT log --oneline ^N HEAD
if $GIT rev-list --quiet ^N HEAD; then
echo "rev-list: YES? *** not-wanted, oops... ***"
wrong=$(( wrong + 1 ))
else
echo "rev-list: No (wanted answer)!"
fi
if $GIT branch --contains=N | grep -q -e '^\*'; then
echo "contains: YES? *** not-wanted, oops... ***"
wrong=$(( wrong + 1 ))
else
echo "contains: No (wanted answer)!"
fi
exit $wrong
=====(cut here and above)=====reach02.sh=====
--
Brian Foster
Principal MTS, Software | La Ciotat, France
Maxim Integrated Products | Web: http://www.maxim-ic.com/
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Q] Determing if a commit is reachable from the HEAD ?
2012-01-20 13:33 [Q] Determing if a commit is reachable from the HEAD ? Brian Foster
@ 2012-01-20 14:13 ` Andreas Schwab
2012-01-20 18:06 ` David Brown
2012-01-20 22:50 ` Sitaram Chamarty
1 sibling, 1 reply; 12+ messages in thread
From: Andreas Schwab @ 2012-01-20 14:13 UTC (permalink / raw)
To: Brian Foster; +Cc: git mailing list
Brian Foster <brian.foster@maxim-ic.com> writes:
> In a script, how can I determine commit Y is reachable
> from the current HEAD ?
test $(git merge-base HEAD Y) = $(git rev-parse Y)
> And, much more importantly
> for my purposes, that commit N is _not_-reachable from
> the current HEAD ?
test $(git merge-base HEAD N) != $(git rev-parse N)
Andreas.
--
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Q] Determing if a commit is reachable from the HEAD ?
2012-01-20 14:13 ` Andreas Schwab
@ 2012-01-20 18:06 ` David Brown
2012-01-20 19:18 ` Junio C Hamano
0 siblings, 1 reply; 12+ messages in thread
From: David Brown @ 2012-01-20 18:06 UTC (permalink / raw)
To: Andreas Schwab; +Cc: Brian Foster, git mailing list
On Fri, Jan 20, 2012 at 03:13:58PM +0100, Andreas Schwab wrote:
> Brian Foster <brian.foster@maxim-ic.com> writes:
>
> > In a script, how can I determine commit Y is reachable
> > from the current HEAD ?
>
> test $(git merge-base HEAD Y) = $(git rev-parse Y)
Almost. It works as long as there is only one merge base. You really
need to check if $(git rev-parse Y) is one of $(git merge-base --all
HEAD Y)
if HEAD is a named branch, you can do
git name-rev --refs=refs/heads/branchname Y
which will give you Y relative to branchname if it is contained within
it.
David
--
Sent by an employee of the Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Q] Determing if a commit is reachable from the HEAD ?
2012-01-20 18:06 ` David Brown
@ 2012-01-20 19:18 ` Junio C Hamano
2012-01-20 23:33 ` David Brown
0 siblings, 1 reply; 12+ messages in thread
From: Junio C Hamano @ 2012-01-20 19:18 UTC (permalink / raw)
To: David Brown; +Cc: Andreas Schwab, Brian Foster, git mailing list
David Brown <davidb@codeaurora.org> writes:
> On Fri, Jan 20, 2012 at 03:13:58PM +0100, Andreas Schwab wrote:
>> Brian Foster <brian.foster@maxim-ic.com> writes:
>>
>> > In a script, how can I determine commit Y is reachable
>> > from the current HEAD ?
>>
>> test $(git merge-base HEAD Y) = $(git rev-parse Y)
>
> Almost. It works as long as there is only one merge base. You really
> need to check if $(git rev-parse Y) is one of $(git merge-base --all
> HEAD Y)
Can you give us an example of a topology to which "merge-base --all HEAD Y"
gives more than one output and Y is still reachable from HEAD?
It is my understanding that merge-base computation will give only Y and
nothing else when Y is reachable from HEAD. I also think this assumption
is used by some of the internal code in Git, and that is why I care.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Q] Determing if a commit is reachable from the HEAD ?
2012-01-20 19:18 ` Junio C Hamano
@ 2012-01-20 23:33 ` David Brown
2012-01-21 0:04 ` Junio C Hamano
0 siblings, 1 reply; 12+ messages in thread
From: David Brown @ 2012-01-20 23:33 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Andreas Schwab, Brian Foster, git mailing list
On Fri, Jan 20, 2012 at 11:18:50AM -0800, Junio C Hamano wrote:
> David Brown <davidb@codeaurora.org> writes:
>
> > On Fri, Jan 20, 2012 at 03:13:58PM +0100, Andreas Schwab wrote:
> >> Brian Foster <brian.foster@maxim-ic.com> writes:
> >>
> >> > In a script, how can I determine commit Y is reachable
> >> > from the current HEAD ?
> >>
> >> test $(git merge-base HEAD Y) = $(git rev-parse Y)
> >
> > Almost. It works as long as there is only one merge base. You really
> > need to check if $(git rev-parse Y) is one of $(git merge-base --all
> > HEAD Y)
>
> Can you give us an example of a topology to which "merge-base --all HEAD Y"
> gives more than one output and Y is still reachable from HEAD?
>
> It is my understanding that merge-base computation will give only Y and
> nothing else when Y is reachable from HEAD. I also think this assumption
> is used by some of the internal code in Git, and that is why I care.
Hmm, I thought I'd convinced myself that this was possible. Now, I
can't come up with a way of doing it that doesn't involve improper
commits with earlier timestamps than their parents.
Sorry about that,
David
--
Sent by an employee of the Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Q] Determing if a commit is reachable from the HEAD ?
2012-01-20 23:33 ` David Brown
@ 2012-01-21 0:04 ` Junio C Hamano
2012-01-21 4:58 ` David Brown
0 siblings, 1 reply; 12+ messages in thread
From: Junio C Hamano @ 2012-01-21 0:04 UTC (permalink / raw)
To: David Brown; +Cc: Andreas Schwab, Brian Foster, git mailing list
David Brown <davidb@codeaurora.org> writes:
> Hmm, I thought I'd convinced myself that this was possible. Now, I
> can't come up with a way of doing it that doesn't involve improper
> commits with earlier timestamps than their parents.
I'd actually want to see a way to do so that *does* involve timestamp
skew.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Q] Determing if a commit is reachable from the HEAD ?
2012-01-21 0:04 ` Junio C Hamano
@ 2012-01-21 4:58 ` David Brown
0 siblings, 0 replies; 12+ messages in thread
From: David Brown @ 2012-01-21 4:58 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Andreas Schwab, Brian Foster, git mailing list
On Fri, Jan 20, 2012 at 04:04:50PM -0800, Junio C Hamano wrote:
> David Brown <davidb@codeaurora.org> writes:
>
> > Hmm, I thought I'd convinced myself that this was possible. Now, I
> > can't come up with a way of doing it that doesn't involve improper
> > commits with earlier timestamps than their parents.
>
> I'd actually want to see a way to do so that *does* involve timestamp
> skew.
Sorry, I guess I shouldn't tried this with a recent version of git. I
can't cause this, and it looks like there's some pretty sophisticated
stuff in there to deal with this.
David
--
Sent by an employee of the Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Q] Determing if a commit is reachable from the HEAD ?
2012-01-20 13:33 [Q] Determing if a commit is reachable from the HEAD ? Brian Foster
2012-01-20 14:13 ` Andreas Schwab
@ 2012-01-20 22:50 ` Sitaram Chamarty
2012-01-23 9:20 ` Brian Foster
1 sibling, 1 reply; 12+ messages in thread
From: Sitaram Chamarty @ 2012-01-20 22:50 UTC (permalink / raw)
To: Brian Foster; +Cc: git mailing list
On Fri, Jan 20, 2012 at 7:03 PM, Brian Foster <brian.foster@maxim-ic.com> wrote:
>
> Hello,
>
> Whilst I have found answers to my question on the Web,
> only one seems to do exactly what I want ....
>
> x---Y---y---y---y HEAD
> /
> ...--o---o---C---o---S
> \
> n---n---N---*---* other
>
> In a script, how can I determine commit Y is reachable
> from the current HEAD ? And, much more importantly
I've been using 'git rev-list HEAD..Y'. If it produces any output, Y
is not reachable from HEAD (there is something in Y that is not in
HEAD).
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Q] Determing if a commit is reachable from the HEAD ?
2012-01-20 22:50 ` Sitaram Chamarty
@ 2012-01-23 9:20 ` Brian Foster
2012-01-23 16:09 ` Junio C Hamano
0 siblings, 1 reply; 12+ messages in thread
From: Brian Foster @ 2012-01-23 9:20 UTC (permalink / raw)
To: git mailing list; +Cc: Sitaram Chamarty
On Friday 20 January 2012 23:50:23 Sitaram Chamarty wrote:
> On Fri, Jan 20, 2012 at 7:03 PM, Brian Foster <brian.foster@maxim-ic.com> wrote:
>[ ... ]
> > x---Y---y---y---y HEAD
> > /
> > ...--o---o---C---o---S
> > \
> > n---n---N---*---* other
> >
> > In a script, how can I determine commit Y is reachable
> > from the current HEAD ? [ ... ]
>
> I've been using 'git rev-list HEAD..Y'. If it produces any output,
> Y is not reachable from HEAD (there is something in Y that is not
> in HEAD).
What's interesting about this solution, at least
with GIT v1.7.6.1 (I haven't tried other versions),
is ‘git rev-list HEAD..Y’ does seem to work (if
there is any output, then Y is not reachable from
HEAD), but ‘git rev-list --quiet HEAD..Y’ does _not_
work (it seems to always(?) exit status 0).
I am probably misunderstanding ‘--quiet’, which the
man page cryptically describes as “... allow the
caller to test the exit status to see if a range
of objects is fully connected (or not).” What is
meant here by “fully connected” ?
cheers!
-blf-
--
Brian Foster
Principal MTS, Software | La Ciotat, France
Maxim Integrated Products | Web: http://www.maxim-ic.com/
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Q] Determing if a commit is reachable from the HEAD ?
2012-01-23 9:20 ` Brian Foster
@ 2012-01-23 16:09 ` Junio C Hamano
2012-01-24 8:16 ` Brian Foster
2012-01-24 8:56 ` Brian Foster
0 siblings, 2 replies; 12+ messages in thread
From: Junio C Hamano @ 2012-01-23 16:09 UTC (permalink / raw)
To: Brian Foster; +Cc: git mailing list, Sitaram Chamarty
Brian Foster <brian.foster@maxim-ic.com> writes:
> I am probably misunderstanding ‘--quiet’, which the
> man page cryptically describes as “... allow the
> caller to test the exit status to see if a range
> of objects is fully connected (or not).” What is
> meant here by “fully connected” ?
If the real history looks like this:
---Y---x---HEAD
i.e. the commit at HEAD says "parent x" in it, and your lacks "x"
for whatever reason, Y..HEAD is not fully connected.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Q] Determing if a commit is reachable from the HEAD ?
2012-01-23 16:09 ` Junio C Hamano
@ 2012-01-24 8:16 ` Brian Foster
2012-01-24 8:56 ` Brian Foster
1 sibling, 0 replies; 12+ messages in thread
From: Brian Foster @ 2012-01-24 8:16 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git mailing list, Sitaram Chamarty
On Monday 23 January 2012 17:09:38 Junio C Hamano wrote:
> Brian Foster <brian.foster@maxim-ic.com> writes:
> > I am probably misunderstanding ‘--quiet’, which the
> > man page cryptically describes as “... allow the
> > caller to test the exit status to see if a range
> > of objects is fully connected (or not).” What is
> > meant here by “fully connected” ?
>
> If the real history looks like this:
>
> ---Y---x---HEAD
>
> i.e. the commit at HEAD says "parent x" in it, and your lacks "x"
> for whatever reason, Y..HEAD is not fully connected.
Junio, and my _what_ lacks "x"? Sorry, it looks like
you typo'ed, but I cannot decipher what you meant.
cheers!
-blf-
--
Brian Foster
Principal MTS, Software | La Ciotat, France
Maxim Integrated Products | Web: http://www.maxim-ic.com/
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Q] Determing if a commit is reachable from the HEAD ?
2012-01-23 16:09 ` Junio C Hamano
2012-01-24 8:16 ` Brian Foster
@ 2012-01-24 8:56 ` Brian Foster
1 sibling, 0 replies; 12+ messages in thread
From: Brian Foster @ 2012-01-24 8:56 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git mailing list, Sitaram Chamarty
On Monday 23 January 2012 17:09:38 Junio C Hamano wrote:
> Brian Foster <brian.foster@maxim-ic.com> writes:
> > I am probably misunderstanding ‘--quiet’, which the
> > man page cryptically describes as “... allow the
> > caller to test the exit status to see if a range
> > of objects is fully connected (or not).” What is
> > meant here by “fully connected” ?
>
> If the real history looks like this:
>
> ---Y---x---HEAD
>
> i.e. the commit at HEAD says "parent x" in it, and your [repository]
> lacks "x" for whatever reason, Y..HEAD is not fully connected.
Ah, Ok. Thanks! Then YES, I misunderstood ‘--quiet’.
The man page caused me to think it was functionally
equivalent to ‘git rev-list STUFF >/dev/null’.
cheers!
-blf-
--
Brian Foster
Principal MTS, Software | La Ciotat, France
Maxim Integrated Products | Web: http://www.maxim-ic.com/
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2012-01-24 8:56 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-01-20 13:33 [Q] Determing if a commit is reachable from the HEAD ? Brian Foster
2012-01-20 14:13 ` Andreas Schwab
2012-01-20 18:06 ` David Brown
2012-01-20 19:18 ` Junio C Hamano
2012-01-20 23:33 ` David Brown
2012-01-21 0:04 ` Junio C Hamano
2012-01-21 4:58 ` David Brown
2012-01-20 22:50 ` Sitaram Chamarty
2012-01-23 9:20 ` Brian Foster
2012-01-23 16:09 ` Junio C Hamano
2012-01-24 8:16 ` Brian Foster
2012-01-24 8:56 ` Brian Foster
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).