Subject: Re: [PATCH v3 2/3] sha1_file: implement changes for "cat-file --literally -t"

From: karthik nayak <[email-masked]>
Date: Sun, 08 Mar 2015 14:18:14 +0530

On 03/08/2015 01:39 PM, Junio C Hamano wrote:
> karthik nayak <[email-masked]> writes:
>
>> On 03/07/2015 12:58 AM, Junio C Hamano wrote:
>>
>> case 't':
>> 	oi.typep = &type;
>> 	oi.typename = &sb;
>> 	sha1_object_info_extended(sha1, &oi, flags);
>> 	if (sb.len) {
>> 		printf("%s\n", sb.buf);
>> 		strbuf_release(&sb);
>> 		return 0;
>> 	} else if (type) {
>> 		printf("%s\n", typename(type));
>> 		return 0;
>> 	}
>> 	break;
>>
>> This works but I need an else statement to check the type if not
>> getting the type literally, which is because if not called literally
>> the oi.typename is not set,...
>
> Hmph, when I outlined that change to object-info-extended, I meant
> to do it in such a way that when the optional oi->typename is set,
> it is always filled whether "literally" is asked for andr whether
> the object is a kosher one or a bogus one.
>
> Without parsing the header, we wouldn't know how long the object
> would be, so I do not know if not doing some variant of parse_header
> is an option.
>
> Thanks.
>

What parse_sha1_header() does to get the type is just find the first 
occurrence of a " " manually and store everything before it as the type. 
Then it finds the size of the object if needed. And finally returns the 
type by calling type_from_string(). This is where we get the undefined 
type error.
When getting the type "literally" we could just find the first 
occurrence of a " " using strcspn() copy the type to oi->typename and 
avoid calling parse_sha1_header(). Even your code went along these lines.
If "literally" is not set we could call parse_sha1_header() like we 
regularly would.

Thanks
Karthik