• Jeff King's avatar
    branch: clean up commit flags after merge-filter walk · 8376a704
    Jeff King authored
    When we run `branch --merged`, we use prepare_revision_walk
    with the merge-filter marked as UNINTERESTING. Any branch
    tips that are marked UNINTERESTING after it returns must be
    ancestors of that commit. As we iterate through the list of
    refs to show, we check item->commit->object.flags to see
    whether it was marked.
    
    This interacts badly with --verbose, which will do a
    separate walk to find the ahead/behind information for each
    branch. There are two bad things that can happen:
    
      1. The ahead/behind walk may get the wrong results,
         because it can see a bogus UNINTERESTING flag leftover
         from the merge-filter walk.
    
      2. We may omit some branches if their tips are involved in
         the ahead/behind traversal of a branch shown earlier.
         The ahead/behind walk carefully cleans up its commit
         flags, meaning it may also erase the UNINTERESTING
         flag that we expect to check later.
    
    We can solve this by moving the merge-filter state for each
    ref into its "struct ref_item" as soon as we finish the
    merge-filter walk. That fixes (2). Then we are free to clear
    the commit flags we used in the walk, fixing (1).
    
    Note that we actually do away with the matches_merge_filter
    helper entirely here, and inline it between the revision
    walk and the flag-clearing. This ensures that nobody
    accidentally calls it at the wrong time (it is only safe to
    check in that instant between the setting and clearing of
    the global flag).
    Signed-off-by: default avatarJeff King <peff@peff.net>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    8376a704
t3201-branch-contains.sh 3.02 KB