Merge branch 'wc/find-commit-with-pattern-on-detached-head'

"git rev-parse ':/substring'" did not consider the history leading
only to HEAD when looking for a commit with the given substring,
when the HEAD is detached.  This has been fixed.

* wc/find-commit-with-pattern-on-detached-head:
  sha1-name.c: for ":/", find detached HEAD commits
This commit is contained in:
Junio C Hamano 2018-07-24 14:50:49 -07:00
Родитель 18a86f32ab 6b3351e799
Коммит 53cae9e0f8
3 изменённых файлов: 29 добавлений и 1 удалений

Просмотреть файл

@ -184,7 +184,8 @@ existing tag object.
A colon, followed by a slash, followed by a text, names A colon, followed by a slash, followed by a text, names
a commit whose commit message matches the specified regular expression. a commit whose commit message matches the specified regular expression.
This name returns the youngest matching commit which is This name returns the youngest matching commit which is
reachable from any ref. The regular expression can match any part of the reachable from any ref, including HEAD.
The regular expression can match any part of the
commit message. To match messages starting with a string, one can use commit message. To match messages starting with a string, one can use
e.g. ':/^foo'. The special sequence ':/!' is reserved for modifiers to what e.g. ':/^foo'. The special sequence ':/!' is reserved for modifiers to what
is matched. ':/!-foo' performs a negative match, while ':/!!foo' matches a is matched. ':/!-foo' performs a negative match, while ':/!!foo' matches a

Просмотреть файл

@ -1650,6 +1650,7 @@ static int get_oid_with_context_1(const char *name,
struct commit_list *list = NULL; struct commit_list *list = NULL;
for_each_ref(handle_one_ref, &list); for_each_ref(handle_one_ref, &list);
head_ref(handle_one_ref, &list);
commit_list_sort_by_date(&list); commit_list_sort_by_date(&list);
return get_oid_oneline(name + 2, oid, list); return get_oid_oneline(name + 2, oid, list);
} }

Просмотреть файл

@ -25,6 +25,32 @@ test_expect_success '"git log :/a -- " should not be ambiguous' '
git log :/a -- 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 &&
# Must manually call `test_tick` instead of using `test_commit`,
# because the latter additionally creates a tag, which would make
# the commit reachable not only via HEAD.
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 :/detached -- " should find HEAD only of own worktree' '
git worktree add other-tree HEAD &&
git -C other-tree checkout --detach &&
test_tick &&
git -C other-tree commit --allow-empty -m other-detached &&
git -C other-tree log :/other-detached -- &&
test_must_fail git log :/other-detached --
'
test_expect_success '"git log -- :/a" should not be ambiguous' ' test_expect_success '"git log -- :/a" should not be ambiguous' '
git log -- :/a git log -- :/a
' '