@@ -67,10 +67,48 @@ static const char *mktree_usage[] = {
6767 NULL
6868};
6969
70+ static void mktree_line (char * buf , size_t len , int line_termination )
71+ {
72+ char * ptr , * ntr ;
73+ unsigned mode ;
74+ enum object_type type ;
75+ char * path ;
76+ unsigned char sha1 [20 ];
77+
78+ ptr = buf ;
79+ /*
80+ * Read non-recursive ls-tree output format:
81+ * mode SP type SP sha1 TAB name
82+ */
83+ mode = strtoul (ptr , & ntr , 8 );
84+ if (ptr == ntr || !ntr || * ntr != ' ' )
85+ die ("input format error: %s" , buf );
86+ ptr = ntr + 1 ; /* type */
87+ ntr = strchr (ptr , ' ' );
88+ if (!ntr || buf + len <= ntr + 40 ||
89+ ntr [41 ] != '\t' ||
90+ get_sha1_hex (ntr + 1 , sha1 ))
91+ die ("input format error: %s" , buf );
92+ type = sha1_object_info (sha1 , NULL );
93+ if (type < 0 )
94+ die ("object %s unavailable" , sha1_to_hex (sha1 ));
95+ * ntr ++ = 0 ; /* now at the beginning of SHA1 */
96+ if (type != type_from_string (ptr ))
97+ die ("object type %s mismatch (%s)" , ptr , typename (type ));
98+
99+ path = ntr + 41 ; /* at the beginning of name */
100+ if (line_termination && path [0 ] == '"' ) {
101+ struct strbuf p_uq = STRBUF_INIT ;
102+ if (unquote_c_style (& p_uq , path , NULL ))
103+ die ("invalid quoting" );
104+ path = strbuf_detach (& p_uq , NULL );
105+ }
106+ append_to_tree (mode , sha1 , path );
107+ }
108+
70109int cmd_mktree (int ac , const char * * av , const char * prefix )
71110{
72111 struct strbuf sb = STRBUF_INIT ;
73- struct strbuf p_uq = STRBUF_INIT ;
74112 unsigned char sha1 [20 ];
75113 int line_termination = '\n' ;
76114 const struct option option [] = {
@@ -80,45 +118,9 @@ int cmd_mktree(int ac, const char **av, const char *prefix)
80118
81119 ac = parse_options (ac , av , option , mktree_usage , 0 );
82120
83- while (strbuf_getline (& sb , stdin , line_termination ) != EOF ) {
84- char * ptr , * ntr ;
85- unsigned mode ;
86- enum object_type type ;
87- char * path ;
88-
89- ptr = sb .buf ;
90- /*
91- * Read non-recursive ls-tree output format:
92- * mode SP type SP sha1 TAB name
93- */
94- mode = strtoul (ptr , & ntr , 8 );
95- if (ptr == ntr || !ntr || * ntr != ' ' )
96- die ("input format error: %s" , sb .buf );
97- ptr = ntr + 1 ; /* type */
98- ntr = strchr (ptr , ' ' );
99- if (!ntr || sb .buf + sb .len <= ntr + 40 ||
100- ntr [41 ] != '\t' ||
101- get_sha1_hex (ntr + 1 , sha1 ))
102- die ("input format error: %s" , sb .buf );
103- type = sha1_object_info (sha1 , NULL );
104- if (type < 0 )
105- die ("object %s unavailable" , sha1_to_hex (sha1 ));
106- * ntr ++ = 0 ; /* now at the beginning of SHA1 */
107- if (type != type_from_string (ptr ))
108- die ("object type %s mismatch (%s)" , ptr , typename (type ));
109-
110- path = ntr + 41 ; /* at the beginning of name */
111- if (line_termination && path [0 ] == '"' ) {
112- strbuf_reset (& p_uq );
113- if (unquote_c_style (& p_uq , path , NULL )) {
114- die ("invalid quoting" );
115- }
116- path = p_uq .buf ;
117- }
118-
119- append_to_tree (mode , sha1 , path );
120- }
121- strbuf_release (& p_uq );
121+ while (strbuf_getline (& sb , stdin , line_termination ) != EOF )
122+ mktree_line (sb .buf , sb .len , line_termination );
123+
122124 strbuf_release (& sb );
123125
124126 write_tree (sha1 );
0 commit comments