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

Re: [PATCH v8 1/4] sha1_file.c: support reading from a loose object of unknown type

From
karthik nayak <karthik.188@gmail.com>
Date
Apr 20, 2015, 18:43 UTC
Message-ID
<553548D2.7010904@gmail.com>
In-Reply-To
<xmqq4moepijp.fsf@gitster.dls.corp.google.com>
On 04/18/2015 02:40 AM, Junio C Hamano wrote:
Show 22 quoted lines
> Jeff King <peff@peff.net> writes:
>
>> On Fri, Apr 17, 2015 at 09:21:31AM -0700, Junio C Hamano wrote:
>>
>>> Jeff King <peff@peff.net> writes:
>>>
>>>> If there _is_ a performance implication to worry about here, I think it
>>>> would be that we are doing an extra malloc/free.
>>>
>>> Thanks for reminding me; yes, that also worried me.
>>
>> As an aside, I worried about the extra allocation for reading the header
>> in the first place. But it looks like we only do this on the --literally
>> code path (and otherwise use the normal unpack_sha1_header).  Still, I
>> wonder if we could make this work automagically.  That is, speculatively
>> unpack the first N bytes, assuming we hit the end-of-header. If not,
>> then go to a strbuf as the slow path. Then it would be fine to cover all
>> cases; the normal ones would be fast, and only ridiculous things would
>> incur the extra allocation.
>
> Yes, that was what I was hoping to see eventually ;-)
>

Sorry for the delay, So after reading what Jeff said I tried to implement it, this might not be a final version of the change, more of a RFC version. What do you'll think?

@@ -1564,6 +1564,36 @@ int unpack_sha1_header(git_zstream *stream, 
unsigned char *map, unsigned long ma
         return git_inflate(stream, 0);
  }

+static int unpack_sha1_header_to_strbuf(git_zstream *stream, unsigned 
char *map,
+                                       unsigned long mapsize, void *buffer,
+                                       unsigned long bufsiz, struct 
strbuf *header)
+{
+       unsigned char *cp;
+       int status;
+       int i = 0;
+
+       status = unpack_sha1_header(stream, map, mapsize, buffer, bufsiz);
+
+       for (cp = buffer; cp < stream->next_out; cp++)
+               if (!*cp) {
+                       /* Found the NUL at the end of the header */
+                       return 0;
+               }
+
+       strbuf_add(header, buffer, stream->next_out - (unsigned char 
*)buffer);
+       do {
+               status = git_inflate(stream, 0);
+               strbuf_add(header, buffer, stream->next_out - (unsigned 
char *)buffer);
+               for (cp = buffer; cp < stream->next_out; cp++)
+                       if (!*cp)
+                               /* Found the NUL at the end of the header */
+                               return 0;
+               stream->next_out = buffer;
+               stream->avail_out = bufsiz;
+       } while (status != Z_STREAM_END);
+       return -1;
+}
+


@@ -2555,17 +2610,24 @@ static int sha1_loose_object_info(const unsigned 
char *sha1,
                 return -1;
         if (oi->disk_sizep)
                 *oi->disk_sizep = mapsize;
-       if (unpack_sha1_header(&stream, map, mapsize, hdr, sizeof(hdr)) < 0)
+       if ((flags & LOOKUP_LITERALLY)) {
+               if (unpack_sha1_header_to_strbuf(&stream, map, mapsize, 
hdr, sizeof(hdr), &hdrbuf) < 0)
+                       status = error("unable to unpack %s header with 
--literally",
+                                      sha1_to_hex(sha1));
+       } else if (unpack_sha1_header(&stream, map, mapsize, hdr, 
sizeof(hdr)) < 0)
                 status = error("unable to unpack %s header",
                                sha1_to_hex(sha1));
-       else if ((status = parse_sha1_header(hdr, &size)) < 0)
+       if (hdrbuf.len) {
+               if ((status = parse_sha1_header_extended(hdrbuf.buf, oi, 
flags)) < 0)
+                       status = error("unable to parse %s header with 
--literally",
+                                      sha1_to_hex(sha1));
+       } else if ((status = parse_sha1_header_extended(hdr, oi, flags)) 
< 0)
                 status = error("unable to parse %s header", 
sha1_to_hex(sha1));


and
Previous: Junio C HamanoNext: Jeff King
Message 9 of 44 in “cat-file: teach cat-file a '--literally' option”
  1. 0/4 cat-file: teach cat-file a '--literally' optionkarthik nayak, Apr 15, 2015
  2. 1/4 sha1_file.c: support reading from a loose object of unknown typeKarthik Nayak, Apr 15, 2015
  3. Junio C HamanoApr 15, 2015
  4. Jeff KingApr 15, 2015
  5. Jeff KingApr 17, 2015
  6. Junio C HamanoApr 17, 2015
  7. Jeff KingApr 17, 2015
  8. Junio C HamanoApr 17, 2015
  9. karthik nayakApr 20, 2015
  10. Jeff KingApr 20, 2015
  11. karthik nayakApr 21, 2015
  12. Jeff KingApr 21, 2015
  13. karthik nayakApr 17, 2015
  14. Jeff KingApr 17, 2015
  15. karthik nayakApr 18, 2015
  16. Junio C HamanoApr 17, 2015
  17. karthik nayakApr 18, 2015
  18. Eric SunshineApr 17, 2015
  19. karthik nayakApr 18, 2015
  20. 2/4 cat-file: teach cat-file a '--literally' optionKarthik Nayak, Apr 15, 2015
  21. Junio C HamanoApr 15, 2015
  22. Junio C HamanoApr 15, 2015
  23. karthik nayakApr 16, 2015
  24. Junio C HamanoApr 16, 2015
  25. Karthik NayakApr 17, 2015
  26. Junio C HamanoApr 17, 2015
  27. Charles BaileyApr 19, 2015
  28. Junio C HamanoApr 20, 2015
  29. Charles BaileyApr 20, 2015
  30. Karthik NayakApr 20, 2015
  31. Charles BaileyApr 20, 2015
  32. karthik nayakApr 20, 2015
  33. Charles BaileyApr 21, 2015
  34. Eric SunshineApr 21, 2015
  35. Junio C HamanoApr 21, 2015
  36. karthik nayakApr 25, 2015
  37. Junio C HamanoApr 25, 2015
  38. karthik nayakApr 27, 2015
  39. Eric SunshineApr 27, 2015
  40. karthik nayakApr 28, 2015
  41. 3/4 cat-file: add documentation for '--literally' option.Karthik Nayak, Apr 15, 2015
  42. 4/4 t1006: add tests for git cat-file --literallyKarthik Nayak, Apr 15, 2015
  43. Eric SunshineApr 18, 2015
  44. karthik nayakApr 18, 2015

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.