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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.