mirror of
https://github.com/git/git.git
synced 2024-12-03 23:14:23 +08:00
Drop strbuf's 'eof' marker, and make read_line a first class citizen.
read_line is now strbuf_getline, and is a first class citizen, it returns 0 when reading a line worked, EOF else. The ->eof marker was used non-locally by fast-import.c, mimic the same behaviour using a static int in "read_next_command", that now returns -1 on EOF, and avoids to call strbuf_getline when it's in EOF state. Also no longer automagically strbuf_release the buffer, it's counter intuitive and breaks fast-import in a very subtle way. Note: being at EOF implies that command_buf.len == 0. Signed-off-by: Pierre Habouzit <madcoder@debian.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
8b6087fb25
commit
e6c019d0b0
@ -277,9 +277,7 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix)
|
|||||||
while (1) {
|
while (1) {
|
||||||
char *path_name;
|
char *path_name;
|
||||||
const char *p;
|
const char *p;
|
||||||
|
if (strbuf_getline(&buf, stdin, line_termination) == EOF)
|
||||||
read_line(&buf, stdin, line_termination);
|
|
||||||
if (buf.eof)
|
|
||||||
break;
|
break;
|
||||||
if (line_termination && buf.buf[0] == '"')
|
if (line_termination && buf.buf[0] == '"')
|
||||||
path_name = unquote_c_style(buf.buf, NULL);
|
path_name = unquote_c_style(buf.buf, NULL);
|
||||||
@ -292,6 +290,7 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix)
|
|||||||
if (path_name != buf.buf)
|
if (path_name != buf.buf)
|
||||||
free(path_name);
|
free(path_name);
|
||||||
}
|
}
|
||||||
|
strbuf_release(&buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (all)
|
if (all)
|
||||||
|
@ -327,8 +327,7 @@ static void read_index_info(int line_termination)
|
|||||||
* This format is to put higher order stages into the
|
* This format is to put higher order stages into the
|
||||||
* index file and matches git-ls-files --stage output.
|
* index file and matches git-ls-files --stage output.
|
||||||
*/
|
*/
|
||||||
read_line(&buf, stdin, line_termination);
|
if (strbuf_getline(&buf, stdin, line_termination) == EOF)
|
||||||
if (buf.eof)
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
@ -391,6 +390,7 @@ static void read_index_info(int line_termination)
|
|||||||
bad_line:
|
bad_line:
|
||||||
die("malformed index info %s", buf.buf);
|
die("malformed index info %s", buf.buf);
|
||||||
}
|
}
|
||||||
|
strbuf_release(&buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char update_index_usage[] =
|
static const char update_index_usage[] =
|
||||||
@ -719,8 +719,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
|
|||||||
while (1) {
|
while (1) {
|
||||||
char *path_name;
|
char *path_name;
|
||||||
const char *p;
|
const char *p;
|
||||||
read_line(&buf, stdin, line_termination);
|
if (strbuf_getline(&buf, stdin, line_termination) == EOF)
|
||||||
if (buf.eof)
|
|
||||||
break;
|
break;
|
||||||
if (line_termination && buf.buf[0] == '"')
|
if (line_termination && buf.buf[0] == '"')
|
||||||
path_name = unquote_c_style(buf.buf, NULL);
|
path_name = unquote_c_style(buf.buf, NULL);
|
||||||
@ -735,6 +734,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
|
|||||||
if (path_name != buf.buf)
|
if (path_name != buf.buf)
|
||||||
free(path_name);
|
free(path_name);
|
||||||
}
|
}
|
||||||
|
strbuf_release(&buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
finish:
|
finish:
|
||||||
|
@ -1584,20 +1584,25 @@ static void dump_marks(void)
|
|||||||
mark_file, strerror(errno));
|
mark_file, strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void read_next_command(void)
|
static int read_next_command(void)
|
||||||
{
|
{
|
||||||
|
static int stdin_eof = 0;
|
||||||
|
|
||||||
|
if (stdin_eof) {
|
||||||
|
unread_command_buf = 0;
|
||||||
|
return EOF;
|
||||||
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (unread_command_buf) {
|
if (unread_command_buf) {
|
||||||
unread_command_buf = 0;
|
unread_command_buf = 0;
|
||||||
if (command_buf.eof)
|
|
||||||
return;
|
|
||||||
} else {
|
} else {
|
||||||
struct recent_command *rc;
|
struct recent_command *rc;
|
||||||
|
|
||||||
strbuf_detach(&command_buf);
|
strbuf_detach(&command_buf);
|
||||||
read_line(&command_buf, stdin, '\n');
|
stdin_eof = strbuf_getline(&command_buf, stdin, '\n');
|
||||||
if (command_buf.eof)
|
if (stdin_eof)
|
||||||
return;
|
return EOF;
|
||||||
|
|
||||||
rc = rc_free;
|
rc = rc_free;
|
||||||
if (rc)
|
if (rc)
|
||||||
@ -1616,6 +1621,8 @@ static void read_next_command(void)
|
|||||||
cmd_tail = rc;
|
cmd_tail = rc;
|
||||||
}
|
}
|
||||||
} while (command_buf.buf[0] == '#');
|
} while (command_buf.buf[0] == '#');
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void skip_optional_lf(void)
|
static void skip_optional_lf(void)
|
||||||
@ -1648,8 +1655,7 @@ static void *cmd_data (size_t *size)
|
|||||||
size_t term_len = command_buf.len - 5 - 2;
|
size_t term_len = command_buf.len - 5 - 2;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
read_line(&command_buf, stdin, '\n');
|
if (strbuf_getline(&command_buf, stdin, '\n') == EOF)
|
||||||
if (command_buf.eof)
|
|
||||||
die("EOF in data (terminator '%s' not found)", term);
|
die("EOF in data (terminator '%s' not found)", term);
|
||||||
if (term_len == command_buf.len
|
if (term_len == command_buf.len
|
||||||
&& !strcmp(term, command_buf.buf))
|
&& !strcmp(term, command_buf.buf))
|
||||||
@ -2095,7 +2101,7 @@ static void cmd_new_commit(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* file_change* */
|
/* file_change* */
|
||||||
while (!command_buf.eof && command_buf.len > 0) {
|
while (command_buf.len > 0) {
|
||||||
if (!prefixcmp(command_buf.buf, "M "))
|
if (!prefixcmp(command_buf.buf, "M "))
|
||||||
file_change_m(b);
|
file_change_m(b);
|
||||||
else if (!prefixcmp(command_buf.buf, "D "))
|
else if (!prefixcmp(command_buf.buf, "D "))
|
||||||
@ -2110,7 +2116,8 @@ static void cmd_new_commit(void)
|
|||||||
unread_command_buf = 1;
|
unread_command_buf = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
read_next_command();
|
if (read_next_command() == EOF)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* build the tree and the commit */
|
/* build the tree and the commit */
|
||||||
@ -2375,11 +2382,8 @@ int main(int argc, const char **argv)
|
|||||||
prepare_packed_git();
|
prepare_packed_git();
|
||||||
start_packfile();
|
start_packfile();
|
||||||
set_die_routine(die_nicely);
|
set_die_routine(die_nicely);
|
||||||
for (;;) {
|
while (read_next_command() != EOF) {
|
||||||
read_next_command();
|
if (!strcmp("blob", command_buf.buf))
|
||||||
if (command_buf.eof)
|
|
||||||
break;
|
|
||||||
else if (!strcmp("blob", command_buf.buf))
|
|
||||||
cmd_new_blob();
|
cmd_new_blob();
|
||||||
else if (!prefixcmp(command_buf.buf, "commit "))
|
else if (!prefixcmp(command_buf.buf, "commit "))
|
||||||
cmd_new_commit();
|
cmd_new_commit();
|
||||||
|
4
fetch.c
4
fetch.c
@ -222,8 +222,7 @@ int pull_targets_stdin(char ***target, const char ***write_ref)
|
|||||||
char *rf_one = NULL;
|
char *rf_one = NULL;
|
||||||
char *tg_one;
|
char *tg_one;
|
||||||
|
|
||||||
read_line(&buf, stdin, '\n');
|
if (strbuf_getline(&buf, stdin, '\n') == EOF)
|
||||||
if (buf.eof)
|
|
||||||
break;
|
break;
|
||||||
tg_one = buf.buf;
|
tg_one = buf.buf;
|
||||||
rf_one = strchr(tg_one, '\t');
|
rf_one = strchr(tg_one, '\t');
|
||||||
@ -239,6 +238,7 @@ int pull_targets_stdin(char ***target, const char ***write_ref)
|
|||||||
(*write_ref)[targets] = rf_one ? xstrdup(rf_one) : NULL;
|
(*write_ref)[targets] = rf_one ? xstrdup(rf_one) : NULL;
|
||||||
targets++;
|
targets++;
|
||||||
}
|
}
|
||||||
|
strbuf_release(&buf);
|
||||||
return targets;
|
return targets;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
4
mktree.c
4
mktree.c
@ -88,8 +88,7 @@ int main(int ac, char **av)
|
|||||||
enum object_type type;
|
enum object_type type;
|
||||||
char *path;
|
char *path;
|
||||||
|
|
||||||
read_line(&sb, stdin, line_termination);
|
if (strbuf_getline(&sb, stdin, line_termination) == EOF)
|
||||||
if (sb.eof)
|
|
||||||
break;
|
break;
|
||||||
ptr = sb.buf;
|
ptr = sb.buf;
|
||||||
/* Input is non-recursive ls-tree output format
|
/* Input is non-recursive ls-tree output format
|
||||||
@ -121,6 +120,7 @@ int main(int ac, char **av)
|
|||||||
if (path != ntr)
|
if (path != ntr)
|
||||||
free(path);
|
free(path);
|
||||||
}
|
}
|
||||||
|
strbuf_release(&sb);
|
||||||
write_tree(sha1);
|
write_tree(sha1);
|
||||||
puts(sha1_to_hex(sha1));
|
puts(sha1_to_hex(sha1));
|
||||||
exit(0);
|
exit(0);
|
||||||
|
20
strbuf.c
20
strbuf.c
@ -17,7 +17,6 @@ void strbuf_reset(struct strbuf *sb)
|
|||||||
{
|
{
|
||||||
if (sb->len)
|
if (sb->len)
|
||||||
strbuf_setlen(sb, 0);
|
strbuf_setlen(sb, 0);
|
||||||
sb->eof = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
char *strbuf_detach(struct strbuf *sb)
|
char *strbuf_detach(struct strbuf *sb)
|
||||||
@ -145,14 +144,13 @@ ssize_t strbuf_read(struct strbuf *sb, int fd, size_t hint)
|
|||||||
return sb->len - oldlen;
|
return sb->len - oldlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
void read_line(struct strbuf *sb, FILE *fp, int term)
|
int strbuf_getline(struct strbuf *sb, FILE *fp, int term)
|
||||||
{
|
{
|
||||||
int ch;
|
int ch;
|
||||||
if (feof(fp)) {
|
|
||||||
strbuf_release(sb);
|
strbuf_grow(sb, 0);
|
||||||
sb->eof = 1;
|
if (feof(fp))
|
||||||
return;
|
return EOF;
|
||||||
}
|
|
||||||
|
|
||||||
strbuf_reset(sb);
|
strbuf_reset(sb);
|
||||||
while ((ch = fgetc(fp)) != EOF) {
|
while ((ch = fgetc(fp)) != EOF) {
|
||||||
@ -161,11 +159,9 @@ void read_line(struct strbuf *sb, FILE *fp, int term)
|
|||||||
strbuf_grow(sb, 1);
|
strbuf_grow(sb, 1);
|
||||||
sb->buf[sb->len++] = ch;
|
sb->buf[sb->len++] = ch;
|
||||||
}
|
}
|
||||||
if (ch == EOF && sb->len == 0) {
|
if (ch == EOF && sb->len == 0)
|
||||||
strbuf_release(sb);
|
return EOF;
|
||||||
sb->eof = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
strbuf_grow(sb, 1);
|
|
||||||
sb->buf[sb->len] = '\0';
|
sb->buf[sb->len] = '\0';
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
5
strbuf.h
5
strbuf.h
@ -44,11 +44,10 @@
|
|||||||
struct strbuf {
|
struct strbuf {
|
||||||
size_t alloc;
|
size_t alloc;
|
||||||
size_t len;
|
size_t len;
|
||||||
int eof;
|
|
||||||
char *buf;
|
char *buf;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define STRBUF_INIT { 0, 0, 0, NULL }
|
#define STRBUF_INIT { 0, 0, NULL }
|
||||||
|
|
||||||
/*----- strbuf life cycle -----*/
|
/*----- strbuf life cycle -----*/
|
||||||
extern void strbuf_init(struct strbuf *, size_t);
|
extern void strbuf_init(struct strbuf *, size_t);
|
||||||
@ -101,6 +100,6 @@ extern size_t strbuf_fread(struct strbuf *, size_t, FILE *);
|
|||||||
/* XXX: if read fails, any partial read is undone */
|
/* XXX: if read fails, any partial read is undone */
|
||||||
extern ssize_t strbuf_read(struct strbuf *, int fd, size_t hint);
|
extern ssize_t strbuf_read(struct strbuf *, int fd, size_t hint);
|
||||||
|
|
||||||
extern void read_line(struct strbuf *, FILE *, int);
|
extern int strbuf_getline(struct strbuf *, FILE *, int);
|
||||||
|
|
||||||
#endif /* STRBUF_H */
|
#endif /* STRBUF_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user