[PATCH] sha1-name.c: for ":/", find detached HEAD commits
From: William Chargin <hidden>
Date: 2018-07-10 15:42:22
Subsystem:
documentation, the rest · Maintainers:
Jonathan Corbet, Linus Torvalds
This patch broadens the set of commits matched by ":/" pathspecs to include commits reachable from HEAD but not any named ref. This avoids surprising behavior when working with a detached HEAD and trying to refer to a commit that was recently created and only exists within the detached state. Signed-off-by: William Chargin <redacted> Based-on-patch-by: Jeff King [off-list ref] --- Documentation/revisions.txt | 10 +++++----- sha1-name.c | 1 + t/t4208-log-magic-pathspec.sh | 14 ++++++++++++++ 3 files changed, 20 insertions(+), 5 deletions(-)
diff --git a/Documentation/revisions.txt b/Documentation/revisions.txt
index 7d1bd4409..aa56907fd 100644
--- a/Documentation/revisions.txt
+++ b/Documentation/revisions.txt@@ -181,11 +181,11 @@ existing tag object. the '<rev>' before '{caret}'. ':/<text>', e.g. ':/fix nasty bug':: - A colon, followed by a slash, followed by a text, names - a commit whose commit message matches the specified regular expression. - This name returns the youngest matching commit which is - reachable from any ref. The regular expression can match any part of the - commit message. To match messages starting with a string, one can use + A colon, followed by a slash, followed by a text, names a commit whose + commit message matches the specified regular expression. This name + returns the youngest matching commit which is reachable from any ref + or from HEAD. The regular expression can match any part of the commit + message. To match messages starting with a string, one can use e.g. ':/^foo'. The special sequence ':/!' is reserved for modifiers to what is matched. ':/!-foo' performs a negative match, while ':/!!foo' matches a literal '!' character, followed by 'foo'. Any other sequence beginning with
diff --git a/sha1-name.c b/sha1-name.c
index 60d9ef3c7..641ca12f9 100644
--- a/sha1-name.c
+++ b/sha1-name.c@@ -1650,6 +1650,7 @@ static int get_oid_with_context_1(const char *name, struct commit_list *list = NULL; for_each_ref(handle_one_ref, &list); + head_ref(handle_one_ref, &list); commit_list_sort_by_date(&list); return get_oid_oneline(name + 2, oid, list); }
diff --git a/t/t4208-log-magic-pathspec.sh b/t/t4208-log-magic-pathspec.sh
index 62f335b2d..41b9f3eba 100755
--- a/t/t4208-log-magic-pathspec.sh
+++ b/t/t4208-log-magic-pathspec.sh@@ -25,6 +25,20 @@ test_expect_success '"git log :/a -- " should not be ambiguous' ' git log :/a -- ' +test_expect_success '"git log :/detached -- " should find a commit only in HEAD' ' + test_when_finished "git checkout master" && + git checkout --detach && + test_tick && + git commit --allow-empty -m detached && + test_tick && + git commit --allow-empty -m something-else && + git log :/detached -- +' + +test_expect_success '"git log :/detached -- " should not find an orphaned commit' ' + test_must_fail git log :/detached -- +' + test_expect_success '"git log -- :/a" should not be ambiguous' ' git log -- :/a '
--
2.18.0.130.g61d0c9dcf