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

Re: [PATCH v2 05/16] blame: accept multiple -L ranges

From
Eric Sunshine <sunshine@sunshineco.com>
Date
Aug 6, 2013, 22:44 UTC
Message-ID
<CAPig+cTHbV-ijfXNBn45v2opOH7Jh0A22QaxCeKhRBPA39xAwQ@mail.gmail.com>
In-Reply-To
<7v1u66fqrz.fsf@alter.siamese.dyndns.org>
On Tue, Aug 6, 2013 at 5:33 PM, Junio C Hamano <gitster@pobox.com> wrote:
Show 19 quoted lines
>> +     for (range_i = ranges.nr; range_i > 0; --range_i) {
>> +             const struct range *r = &ranges.ranges[range_i - 1];
>> +             long bottom = r->start;
>> +             long top = r->end;
>> +             struct blame_entry *next = ent;
>> +             ent = xcalloc(1, sizeof(*ent));
>> +             ent->lno = bottom;
>> +             ent->num_lines = top - bottom;
>> +             ent->suspect = o;
>> +             ent->s_lno = bottom;
>> +             ent->next = next;
>> +             if (next)
>> +                     next->prev = ent;
>> +             origin_incref(o);
>> +     }
>> +     origin_decref(o);
>
> Hmph, I do not see where the need for this decref is coming from.
> Did we incref once too many somewhere?

Each constructed blame_entry must own a reference to the suspect. o->refcnt should equal the number of blame_entries. At construction, a 'struct origin' has refcnt 1. In the original code, which supported only a single initial range (blame_entry), we had:

  o = get-initial-suspect();  # refcnt already 1
  ent->suspect = o;  # refcnt still 1
  sb.ent = ent;
  assign_blame(&sb);

So, o->refcnt equals the number of blame_entries (1) when assign_blame() is called.

The new for-loop calls origin_incref() on each iteration since each blame_entry needs to own a reference to the suspect. Assume that we have two disjoint -L ranges:

  o = get-initial-suspect();  # refcnt already 1
  foreach range:
    ent = new blame_entry;
    ent->suspect = o;
    origin_incref(o);  # refcnt++
  end
  # for 2 ranges, refcnt incremented twice, so value is 3
  origin_decref(o);  # refcnt = 2
  sb.ent = ent;
  assign_blame(&sb);

Thus, as with the original code, o->refcnt equals the number of blame_entries (2) when assign_blame() is called.

The same holds for the boundary case when the file is empty and there is no range. o->refcnt starts at 1, the loop is never entered so no blame_entries are created, and o->refcnt gets decremented to 0, which again matches the number of blame_entries (0).

Previous: Junio C HamanoNext: Junio C Hamano
Message 8 of 22 in “blame: accept multiple -L ranges”
  1. 00/16 blame: accept multiple -L rangesEric Sunshine, Aug 6, 2013
  2. 01/16 git-log.txt: place each -L option variation on its own lineEric Sunshine, Aug 6, 2013
  3. 02/16 line-range-format.txt: clarify -L:regex usage formEric Sunshine, Aug 6, 2013
  4. 03/16 range-set: publish API for re-use by git-blame -LEric Sunshine, Aug 6, 2013
  5. 04/16 blame: inline one-line function into its lone callerEric Sunshine, Aug 6, 2013
  6. 05/16 blame: accept multiple -L rangesEric Sunshine, Aug 6, 2013
  7. Junio C HamanoAug 6, 2013
  8. Eric SunshineAug 6, 2013
  9. Junio C HamanoAug 6, 2013
  10. 06/16 t8001/t8002: blame: add tests of multiple -L optionsEric Sunshine, Aug 6, 2013
  11. 07/16 blame: document multiple -L supportEric Sunshine, Aug 6, 2013
  12. 08/16 line-range: teach -L/RE/ to search relative to anchor pointEric Sunshine, Aug 6, 2013
  13. Junio C HamanoAug 6, 2013
  14. 09/16 blame: teach -L/RE/ to search from end of previous -L rangeEric Sunshine, Aug 6, 2013
  15. Junio C HamanoAug 6, 2013
  16. 10/16 log: teach -L/RE/ to search from end of previous -L rangeEric Sunshine, Aug 6, 2013
  17. 11/16 line-range-format.txt: document -L/RE/ relative searchEric Sunshine, Aug 6, 2013
  18. 12/16 line-range: teach -L^/RE/ to search from start of fileEric Sunshine, Aug 6, 2013
  19. 13/16 line-range: teach -L:RE to search from end of previous -L rangeEric Sunshine, Aug 6, 2013
  20. 14/16 line-range: teach -L^:RE to search from start of fileEric Sunshine, Aug 6, 2013
  21. 15/16 t8001/t8002: blame: add tests of -L line numbers less than 1Eric Sunshine, Aug 6, 2013
  22. 16/16 line-range: reject -L line numbers less than 1Eric Sunshine, Aug 6, 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.