Re: [PATCH v2 2/3] sha1_file: implement changes for cat-file --literally -t
Karthik Nayak karthik@gmail.com writes: add sha1_object_info_literally() which is to be used when the literally option is given to get the type of object and print it, using sha1_object_info_extended(). add unpack_sha1_header_literally() to unpack sha headers which may be greater than 32 bytes, which is the threshold for a regular object header. modify sha1_loose_object_info() to include a flag argument and also include changes to call unpack_sha1_header_literally() when the literally flag is passed. Also copies the obtained type to the typename field of object_info. modify sha1_object_info_extended() to call the function sha1_loose_object_info() with flags. Signed-off-by: Karthik Nayak karthik@gmail.com --- sha1_file.c | 84 +++-- 1 file changed, 77 insertions(+), 7 deletions(-) diff --git a/sha1_file.c b/sha1_file.c index 69a60ec..1068ca0 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -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_literally(git_zstream *stream, unsigned char *map, + unsigned long mapsize, + struct strbuf *header) +{ +... +} Looks suspiciously familiar... +int sha1_object_info_literally(const unsigned char *sha1) +{ + enum object_type type; + struct strbuf sb = STRBUF_INIT; + struct object_info oi = {NULL}; + + oi.typename = sb; + oi.typep = type; + if (sha1_object_info_extended(sha1, oi, LOOKUP_LITERALLY) 0) + return -1; + if (*oi.typep 0) + printf(%s\n, typename(*oi.typep)); + else + printf(%s\n, oi.typename-buf); + strbuf_release(oi.typename); + return 0; +} + NAK. Please don't add end-user facing final output to sha1_file.c; instead have the caller use a helper function like this one to extract necessary information and perform the end-user interaction there. -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v2 2/3] sha1_file: implement changes for cat-file --literally -t
On 03/05/2015 02:28 AM, Junio C Hamano wrote: Karthik Nayak karthik@gmail.com writes: add sha1_object_info_literally() which is to be used when the literally option is given to get the type of object and print it, using sha1_object_info_extended(). add unpack_sha1_header_literally() to unpack sha headers which may be greater than 32 bytes, which is the threshold for a regular object header. modify sha1_loose_object_info() to include a flag argument and also include changes to call unpack_sha1_header_literally() when the literally flag is passed. Also copies the obtained type to the typename field of object_info. modify sha1_object_info_extended() to call the function sha1_loose_object_info() with flags. Signed-off-by: Karthik Nayak karthik@gmail.com --- sha1_file.c | 84 +++-- 1 file changed, 77 insertions(+), 7 deletions(-) diff --git a/sha1_file.c b/sha1_file.c index 69a60ec..1068ca0 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -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_literally(git_zstream *stream, unsigned char *map, +unsigned long mapsize, +struct strbuf *header) +{ +... +} Looks suspiciously familiar... Yes, you suggested it. It has a similar structure to unpack_sha1_header(). Anything wrong with it? +int sha1_object_info_literally(const unsigned char *sha1) +{ +enum object_type type; +struct strbuf sb = STRBUF_INIT; +struct object_info oi = {NULL}; + +oi.typename = sb; +oi.typep = type; +if (sha1_object_info_extended(sha1, oi, LOOKUP_LITERALLY) 0) +return -1; +if (*oi.typep 0) +printf(%s\n, typename(*oi.typep)); +else +printf(%s\n, oi.typename-buf); +strbuf_release(oi.typename); +return 0; +} + NAK. Please don't add end-user facing final output to sha1_file.c; instead have the caller use a helper function like this one to extract necessary information and perform the end-user interaction there. Ok, will do that. -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v2 2/3] sha1_file: implement changes for cat-file --literally -t
karthik nayak karthik@gmail.com writes: Looks suspiciously familiar... Yes, you suggested it. It has a similar structure to unpack_sha1_header(). Anything wrong with it? I don't know if there is something wrong with the code, or not, but it wasn't mentioned in the log message at all that it is not your code, and I was mostly reacting to that. It is fairly common around here to take somebody else's code and run with it, but people say things like This is based on suggestion from X, This function was stolen from Y, etc. and then conclude with but I adjusted it to match the caller I wrote, so bugs are mine. when they do so. -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH v2 2/3] sha1_file: implement changes for cat-file --literally -t
add sha1_object_info_literally() which is to be used when the literally option is given to get the type of object and print it, using sha1_object_info_extended(). add unpack_sha1_header_literally() to unpack sha headers which may be greater than 32 bytes, which is the threshold for a regular object header. modify sha1_loose_object_info() to include a flag argument and also include changes to call unpack_sha1_header_literally() when the literally flag is passed. Also copies the obtained type to the typename field of object_info. modify sha1_object_info_extended() to call the function sha1_loose_object_info() with flags. Signed-off-by: Karthik Nayak karthik@gmail.com --- sha1_file.c | 84 +++-- 1 file changed, 77 insertions(+), 7 deletions(-) diff --git a/sha1_file.c b/sha1_file.c index 69a60ec..1068ca0 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -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_literally(git_zstream *stream, unsigned char *map, + unsigned long mapsize, + struct strbuf *header) +{ + unsigned char buffer[32], *cp; + unsigned long bufsiz = sizeof(buffer); + int status; + + /* Get the data stream */ + memset(stream, 0, sizeof(*stream)); + stream-next_in = map; + stream-avail_in = mapsize; + stream-next_out = buffer; + stream-avail_out = bufsiz; + + git_inflate_init(stream); + + do { + status = git_inflate(stream, 0); + strbuf_add(header, buffer, stream-next_out - 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_OK); + return -1; +} + static void *unpack_sha1_rest(git_zstream *stream, void *buffer, unsigned long size, const unsigned char *sha1) { int bytes = strlen(buffer) + 1; @@ -2524,13 +2554,16 @@ struct packed_git *find_sha1_pack(const unsigned char *sha1, } static int sha1_loose_object_info(const unsigned char *sha1, - struct object_info *oi) + struct object_info *oi, + int flags) { - int status; + int status = 0; unsigned long mapsize, size; void *map; git_zstream stream; char hdr[32]; + struct strbuf hdrbuf = STRBUF_INIT; + char *hdrp; if (oi-delta_base_sha1) hashclr(oi-delta_base_sha1); @@ -2557,10 +2590,25 @@ 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) - status = error(unable to unpack %s header, - sha1_to_hex(sha1)); - else if ((status = parse_sha1_header(hdr, size)) 0) + if ((flags LOOKUP_LITERALLY)) { + if (unpack_sha1_header_literally(stream, map, mapsize, hdrbuf) 0) + status = error(unable to unpack %s header with --literally, + sha1_to_hex(sha1)); + hdrp = hdrbuf.buf; + } else { + if (unpack_sha1_header(stream, map, mapsize, hdr, sizeof(hdr)) 0) { + status = error(unable to unpack %s header, + sha1_to_hex(sha1)); + } + hdrp = hdr; + } + if (status) + ; /* We're already checking for errors */ + else if ((flags LOOKUP_LITERALLY)) { + size_t typelen = strcspn(hdrbuf.buf, ); + strbuf_add(oi-typename, hdrbuf.buf, typelen); + } + else if ((status = parse_sha1_header(hdrp, size)) 0) status = error(unable to parse %s header, sha1_to_hex(sha1)); else if (oi-sizep) *oi-sizep = size; @@ -2568,6 +2616,10 @@ static int sha1_loose_object_info(const unsigned char *sha1, munmap(map, mapsize); if (oi-typep) *oi-typep = status; + if (oi-typename 0 = status typename(status)) + strbuf_addstr(oi-typename, typename(status)); + if (hdrp == hdrbuf.buf) + strbuf_release(hdrbuf); return 0; } @@ -2594,7 +2646,7 @@ int sha1_object_info_extended(const unsigned char *sha1, struct object_info *oi, if (!find_pack_entry(real, e)) { /* Most likely it's a loose object. */ - if