From: Brian Foster <brian.foster@maxim-ic.com>
To: git mailing list <git@vger.kernel.org>
Subject: [Q] Determing if a commit is reachable from the HEAD ?
Date: Fri, 20 Jan 2012 14:33:29 +0100 [thread overview]
Message-ID: <201201201433.30267.brian.foster@maxim-ic.com> (raw)
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/
next reply other threads:[~2012-01-20 13:44 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-01-20 13:33 Brian Foster [this message]
2012-01-20 14:13 ` [Q] Determing if a commit is reachable from the HEAD ? 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
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=201201201433.30267.brian.foster@maxim-ic.com \
--to=brian.foster@maxim-ic.com \
--cc=git@vger.kernel.org \
/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 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).