Hi,
Since commit dd4bc01c0a8f ("revision: use priority queue for non-limited streaming walks") in Git 2.55.0, git rev-list --no-walk no longer considers optional <path>... arguments.
https://lore.kernel.org/git/pull.2127.git.1779897003.gitgitgadget@gmail.com/
The following example lists all commits between two Linux kernel releases that modify paths within a given directory and further modified paths outside of that directory, too.
With Git 2.54.0, the second rev-list correctly filters by paths:
% git rev-list --topo-order v7.0..v7.1 -- drivers/gpu/drm/ | wc -l 2026 % git rev-list --topo-order v7.0..v7.1 -- drivers/gpu/drm/ | git rev-list --stdin --no-walk=unsorted -- ':!drivers/gpu/drm/' | wc -l 146
With Git 2.55.0, the second rev-list passes through all commits:
% git rev-list --topo-order v7.0..v7.1 -- drivers/gpu/drm/ | wc -l 2026 % git rev-list --topo-order v7.0..v7.1 -- drivers/gpu/drm/ | git rev-list --stdin --no-walk=unsorted -- ':!drivers/gpu/drm/' | wc -l 2026
Reverting commit dd4bc01c0a8f ("revision: use priority queue for non-limited streaming walks") on top of Git 2.55.0 restores the previous behaviour. Specifically, the following hunk that no longer invokes process_parents() in the no_walk case causes the regression.
@@ -4390,12 +4394,13 @@ static struct commit *get_revision_1(struct rev_info *revs) break; case REV_WALK_STREAMING: if (process_parents(revs, commit, - &revs->commits, NULL) < 0) { + &revs->commit_queue) < 0) { if (!revs->ignore_missing_links) die("Failed to traverse parents of commit %s", oid_to_hex(&commit->object.oid)); } break; + case REV_WALK_NO_WALK: case REV_WALK_LIMITED: break; } Is the behaviour in Git 2.55.0 intentional, i.e., was --no-walk never intended to support path filtering, or is this indeed a regression? Thanks, Peter