Skip to content

Commit fe0bb5f

Browse files
committed
builtin-mktree.c: use a helper function to handle one line of input
The main() function used to do the whole thing; this moves the handling of a single input line to a separate function to make it easier to read. Signed-off-by: Junio C Hamano <gitster@pobox.com>
1 parent 1fdee85 commit fe0bb5f

1 file changed

Lines changed: 42 additions & 40 deletions

File tree

builtin-mktree.c

Lines changed: 42 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
70109
int 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

Comments
 (0)