Re: [RFC 3/3] refspec: add support for negative refspecs
- From
Jacob Keller <jacob.keller@gmail.com>
- Date
- Aug 21, 2020, 17:26 UTC
- Message-ID
- <CA+P7+xq4+RJF5f8v6ZG6mfXKg29Sh4CcFB72tKDPTx5vQLsS1A@mail.gmail.com>
- In-Reply-To
- <CA+P7+xrPep7caJm2uN+hAqOqZU3b2njpW95JQCzYJdKgbakp8A@mail.gmail.com>
On Fri, Aug 21, 2020 at 10:16 AM Jacob Keller <jacob.keller@gmail.com> wrote:
Show 52 quoted lines
> > On Tue, Aug 18, 2020 at 10:41 AM Jeff King <peff@peff.net> wrote: > > Hmm. I think the behavior we'd want is something like: > > > > # make sure the other side has three refs > > git branch prune/one HEAD > > git branch prune/two HEAD > > git branch prune/three HEAD > > git push dst.git refs/heads/prune/* > > > > # now drop two of ours, which are eligible for pruning > > git branch -d prune/one > > git branch -d prune/two > > > > # push with pruning, omitting "two" > > git push --prune dst.git refs/heads/prune/* ^refs/heads/prune/two > > > > # we should leave "two" but still deleted "one" > > test_write_lines one three >expect > > git -C dst.git for-each-ref --format='%(refname:lstrip=3)' refs/heads/prune/ >actual > > test_cmp expect actual > > > > I.e., the negative refspec shrinks the space we're considering pruning. > > And we'd probably want a similar test for "fetch --prune". > > > > I just tried that, though, and got an interesting result. The push > > actually complains: > > > > $ git push --prune dst.git refs/heads/prune/* ^refs/heads/prune/two > > error: src refspec refs/heads/prune/two does not match any > > error: failed to push some refs to 'dst.git' > > > > For negative refspecs, would we want to loosen the "must-exist" check? > > Or really, is this getting into the "are we negative on the src or dst" > > thing you brought up earlier? Especially with --prune, what I really > > want to say is "do not touch the remote refs/heads/two". > > > > We can get work around it by using a wildcard: > > > > $ git push --prune dst.git refs/heads/prune/* ^refs/heads/prune/two* > > To dst.git > > - [deleted] prune/one > > > > So it works as I'd expect already with your patch. But I do wonder if > > there are corner cases around the src/dst thing that might not behave > > sensibly. > > > > Hmm. So this raises a good point. I added a variation of this test > where I used separate names for the source and destination. It looks > like with the current implementation, negative refspecs always apply > to the destination.
I also tried adding a test for fetch --prune, but that ultimately calls query_refspecs_multiple and query_refspecs. I need to figure out how negative refspecs need to interact with that function still.