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

Re: [PATCH v3 4/6] for-each-ref: introduce %(upstream:track[short])

From
Ramkumar Ramachandra <artagnon@gmail.com>
Date
Nov 17, 2013, 05:58 UTC
Message-ID
<CALkWK0=3=a5hiU7zxDAk=077CePkmN+MaLZFcuYdeZJM8QXApw@mail.gmail.com>
In-Reply-To
<CAPig+cRqwOgE8by8DwuGc1nNA3C_bA07ob-GuRzETKoRPBe+CQ@mail.gmail.com>
Eric Sunshine wrote:
Show 5 quoted lines
> The "prompt" is not mentioned elsewhere in for-each-ref documentation,
> and a person not familiar with contrib/completion/ may be confused by
> this reference. It might make sense instead to explain the meanings of
> ">", "<", "<>", and "=" directly since they are not necessarily
> obvious to the casual reader.
Someone else raised the same point earlier. Okay, I'll elaborate.
Show 36 quoted lines
>> diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c
>> index 5f1842f..ed81407 100644
>> --- a/builtin/for-each-ref.c
>> +++ b/builtin/for-each-ref.c
>> @@ -689,13 +690,46 @@ static void populate_value(struct refinfo *ref)
>>                         continue;
>>
>>                 formatp = strchr(name, ':');
>> -               /* look for "short" refname format */
>>                 if (formatp) {
>> +                       int num_ours, num_theirs;
>> +
>>                         formatp++;
>>                         if (!strcmp(formatp, "short"))
>>                                 refname = shorten_unambiguous_ref(refname,
>>                                                       warn_ambiguous_refs);
>> -                       else
>> +                       else if (!strcmp(formatp, "track") &&
>> +                               !prefixcmp(name, "upstream")) {
>> +                               char buf[40];
>> +
>> +                               stat_tracking_info(branch, &num_ours, &num_theirs);
>> +                               if (!num_ours && !num_theirs)
>> +                                       v->s = "";
>> +                               else if (!num_ours) {
>> +                                       sprintf(buf, "[behind %d]", num_theirs);
>> +                                       v->s = xstrdup(buf);
>> +                               } else if (!num_theirs) {
>> +                                       sprintf(buf, "[ahead %d]", num_ours);
>> +                                       v->s = xstrdup(buf);
>> +                               } else {
>> +                                       sprintf(buf, "[ahead %d, behind %d]",
>
> Is the intention that these strings ("[ahead %d]", etc.) will be
> internationalized in the future? If so, the allocated 40-character
> buffer may be insufficient.

Similar strings in wt-status.c aren't ready for internationalization either. Besides, these xstrdup() calls leak memory and are quite suboptimal: if I allocate more memory, I'm going to be leaking more; so, I'd defer the internationalization discussion until we restructure this.

Show 23 quoted lines
>> +                                               num_ours, num_theirs);
>> +                                       v->s = xstrdup(buf);
>> +                               }
>> +                               continue;
>> +                       } else if (!strcmp(formatp, "trackshort") &&
>> +                               !prefixcmp(name, "upstream")) {
>> +
>> +                               stat_tracking_info(branch, &num_ours, &num_theirs);
>> +                               if (!num_ours && !num_theirs)
>> +                                       v->s = "=";
>> +                               else if (!num_ours)
>> +                                       v->s = "<";
>> +                               else if (!num_theirs)
>> +                                       v->s = ">";
>> +                               else
>> +                                       v->s = "<>";
>> +                               continue;
>> +                       } else
>>                                 die("unknown %.*s format %s",
>>                                     (int)(formatp - name), name, formatp);
>
> Is it still accurate to call this a "format" in the error message?
> 'track' and 'trackshort' seem more like decorations.

By convention, all f-e-r formatting errors are reported as fatal errors (see color errors too, for instance), unlike pretty-formats. We might want to change this in a later series.

Show 37 quoted lines
>> diff --git a/t/t6300-for-each-ref.sh b/t/t6300-for-each-ref.sh
>> index 5e29ffc..9d874fd 100755
>> --- a/t/t6300-for-each-ref.sh
>> +++ b/t/t6300-for-each-ref.sh
>> @@ -303,6 +303,28 @@ test_expect_success 'Check short upstream format' '
>>         test_cmp expected actual
>>  '
>>
>> +test_expect_success 'setup for upstream:track[short]' '
>> +       test_commit two
>> +'
>> +
>> +cat >expected <<EOF
>> +[ahead 1]
>> +EOF
>> +
>> +test_expect_success 'Check upstream:track format' '
>> +       git for-each-ref --format="%(upstream:track)" refs/heads >actual &&
>> +       test_cmp expected actual
>> +'
>> +
>> +cat >expected <<EOF
>> +>
>> +EOF
>> +
>> +test_expect_success 'Check upstream:trackshort format' '
>> +       git for-each-ref --format="%(upstream:trackshort)" refs/heads >actual &&
>> +       test_cmp expected actual
>> +'
>> +
>>  cat >expected <<EOF
>>  $(git rev-parse --short HEAD)
>>  EOF
>
> Would it make sense also to add tests verifying that :track and
> :trackshort correctly fail when applied to a key other than
> "upstream"?
Sure.
And thanks for the detailed review.
Previous: Eric SunshineNext: Ramkumar Ramachandra
Message 9 of 12 in “Replacement for rr/for-each-ref-decoration”
  1. 0/6 Replacement for rr/for-each-ref-decorationRamkumar Ramachandra, Nov 15, 2013
  2. 1/6 t6300 (for-each-ref): clearly demarcate setupRamkumar Ramachandra, Nov 15, 2013
  3. Eric SunshineNov 16, 2013
  4. 2/6 t6300 (for-each-ref): don't hardcode SHA-1 hexesRamkumar Ramachandra, Nov 15, 2013
  5. 3/6 for-each-ref: introduce %(HEAD) asterisk markerRamkumar Ramachandra, Nov 15, 2013
  6. Eric SunshineNov 16, 2013
  7. 4/6 for-each-ref: introduce %(upstream:track[short])Ramkumar Ramachandra, Nov 15, 2013
  8. Eric SunshineNov 16, 2013
  9. Ramkumar RamachandraNov 17, 2013
  10. 5/6 for-each-ref: introduce %(color:...) for colorRamkumar Ramachandra, Nov 15, 2013
  11. Eric SunshineNov 17, 2013
  12. 6/6 for-each-ref: auto reset color after each atomRamkumar Ramachandra, Nov 15, 2013

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.