git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v2 13/16] ref-filter: add --no-contains option to tag/branch/for-each-ref

From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date
Mar 21, 2017, 19:03 UTC
Message-ID
<CACBZZX5-RRrWZfPAtMon_WnioG-9AwfhTFC174=4uBx_QCcEGA@mail.gmail.com>
In-Reply-To
<xmqqbmsupinm.fsf@gitster.mtv.corp.google.com>
On Tue, Mar 21, 2017 at 7:51 PM, Junio C Hamano <gitster@pobox.com> wrote:
Show 48 quoted lines
> Ævar Arnfjörð Bjarmason  <avarab@gmail.com> writes:
>
>> Change the tag, branch & for-each-ref commands to have a --no-contains
>> option in addition to their longstanding --contains options.
>>
>> This allows for finding the last-good rollout tag given a known-bad
>> <commit>. Given a hypothetically bad commit cf5c7253e0, the git
>> version to revert to can be found with this hacky two-liner:
>>
>>     (git tag -l 'v[0-9]*'; git tag -l --contains cf5c7253e0 'v[0-9]*') |
>>         sort | uniq -c | grep -E '^ *1 ' | awk '{print $2}' | tail -n 10
>>
>> With this new --no-contains option the same can be achieved with:
>>
>>     git tag -l --no-contains cf5c7253e0 'v[0-9]*' | sort | tail -n 10
>>
>> As the filtering machinery is shared between the tag, branch &
>> for-each-ref commands, implement this for those commands too. A
>> practical use for this with "branch" is e.g. finding branches which
>> were branched off between v2.8.0 and v2.10.0:
>>
>>     git branch --contains v2.8.0 --no-contains v2.10.0
>>
>> The "describe" command also has a --contains option, but its semantics
>> are unrelated to what tag/branch/for-each-ref use --contains for. A
>> --no-contains option for "describe" wouldn't make any sense, other
>> than being exactly equivalent to not supplying --contains at all,
>> which would be confusing at best.
>
> Nicely explained.  Thanks.
>
>> diff --git a/parse-options.h b/parse-options.h
>> index dcd8a0926c..0eac90b510 100644
>> --- a/parse-options.h
>> +++ b/parse-options.h
>> @@ -258,7 +258,9 @@ extern int parse_opt_passthru_argv(const struct option *, const char *, int);
>>         PARSE_OPT_LASTARG_DEFAULT | flag, \
>>         parse_opt_commits, (intptr_t) "HEAD" \
>>       }
>> -#define OPT_CONTAINS(v, h) _OPT_CONTAINS_OR_WITH("contains", v, h, 0)
>> +#define OPT_CONTAINS(v, h) _OPT_CONTAINS_OR_WITH("contains", v, h, PARSE_OPT_NONEG)
>> +#define OPT_NO_CONTAINS(v, h) _OPT_CONTAINS_OR_WITH("no-contains", v, h, PARSE_OPT_NONEG)
>>  #define OPT_WITH(v, h) _OPT_CONTAINS_OR_WITH("with", v, h, PARSE_OPT_HIDDEN)
>> +#define OPT_WITHOUT(v, h) _OPT_CONTAINS_OR_WITH("without", v, h, PARSE_OPT_HIDDEN)
>
> Doesn't OPT_WITHOUT() need PARSE_OPT_NONEG (in addition to HIDDEN),
> just like OPT_NO_CONTAINS() uses one to reject "--no-no-contains"?
> Does the code do a sensible thing when --no-without is given?

Yes, you'd mentioned this before but fixing this got lost in my note taking process for v1->v2. Will fix for v3.

Previous: Junio C HamanoNext: Ævar Arnfjörð Bjarmason
Message 15 of 45 in “Various changes to the "tag" command & related”
  1. 00/16 Various changes to the "tag" command & relatedÆvar Arnfjörð Bjarmason, Mar 21, 2017
  2. 01/16 tag doc: move the description of --[no-]merged earlierÆvar Arnfjörð Bjarmason, Mar 21, 2017
  3. Junio C HamanoMar 21, 2017
  4. 03/16 tag doc: reword --[no-]merged to talk about commits, not tipsÆvar Arnfjörð Bjarmason, Mar 21, 2017
  5. 14/16 ref-filter: reflow recently changed branch/tag/for-each-ref docsÆvar Arnfjörð Bjarmason, Mar 21, 2017
  6. Junio C HamanoMar 21, 2017
  7. Ævar Arnfjörð BjarmasonMar 21, 2017
  8. 15/16 tag: implicitly supply --list given the -n optionÆvar Arnfjörð Bjarmason, Mar 21, 2017
  9. Junio C HamanoMar 21, 2017
  10. Ævar Arnfjörð BjarmasonMar 21, 2017
  11. Junio C HamanoMar 21, 2017
  12. Ævar Arnfjörð BjarmasonMar 21, 2017
  13. 13/16 ref-filter: add --no-contains option to tag/branch/for-each-refÆvar Arnfjörð Bjarmason, Mar 21, 2017
  14. Junio C HamanoMar 21, 2017
  15. Ævar Arnfjörð BjarmasonMar 21, 2017
  16. 02/16 tag doc: split up the --[no-]merged documentationÆvar Arnfjörð Bjarmason, Mar 21, 2017
  17. Junio C HamanoMar 21, 2017
  18. 12/16 tag: change --point-at to default to HEADÆvar Arnfjörð Bjarmason, Mar 21, 2017
  19. Junio C HamanoMar 21, 2017
  20. 06/16 tag: remove a TODO item from the test suiteÆvar Arnfjörð Bjarmason, Mar 21, 2017
  21. 04/16 ref-filter: make combining --merged & --no-merged an errorÆvar Arnfjörð Bjarmason, Mar 21, 2017
  22. 05/16 ref-filter: add test for --contains on a non-commitÆvar Arnfjörð Bjarmason, Mar 21, 2017
  23. Junio C HamanoMar 21, 2017
  24. 07/16 tag tests: fix a typo in a test descriptionÆvar Arnfjörð Bjarmason, Mar 21, 2017
  25. 08/16 for-each-ref: partly change <object> to <commit> in helpÆvar Arnfjörð Bjarmason, Mar 21, 2017
  26. Junio C HamanoMar 21, 2017
  27. Ævar Arnfjörð BjarmasonMar 21, 2017
  28. Junio C HamanoMar 21, 2017
  29. 09/16 tag: add more incompatibles mode testsÆvar Arnfjörð Bjarmason, Mar 21, 2017
  30. Junio C HamanoMar 21, 2017
  31. Ævar Arnfjörð BjarmasonMar 21, 2017
  32. 16/16 tag: add tests for --with and --withoutÆvar Arnfjörð Bjarmason, Mar 21, 2017
  33. 10/16 tag: change misleading --list <pattern> documentationÆvar Arnfjörð Bjarmason, Mar 21, 2017
  34. Junio C HamanoMar 21, 2017
  35. Ævar Arnfjörð BjarmasonMar 22, 2017
  36. Junio C HamanoMar 22, 2017
  37. Ævar Arnfjörð BjarmasonMar 22, 2017
  38. Junio C HamanoMar 22, 2017
  39. Jeff KingMar 22, 2017
  40. Ævar Arnfjörð BjarmasonMar 22, 2017
  41. Junio C HamanoMar 23, 2017
  42. Junio C HamanoMar 22, 2017
  43. 11/16 tag: implicitly supply --list given another list-like optionÆvar Arnfjörð Bjarmason, Mar 21, 2017
  44. Junio C HamanoMar 21, 2017
  45. Junio C HamanoMar 21, 2017

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.