summaryrefslogtreecommitdiff
path: root/pkt-line.c
diff options
context:
space:
mode:
authorJiang Xin <zhiyou.jx@alibaba-inc.com>2023-12-17 14:41:37 (GMT)
committerJunio C Hamano <gitster@pobox.com>2023-12-18 21:24:37 (GMT)
commit64220dc5f7450d8eca471fa484965b1dcddc2827 (patch)
tree2b8c592b39a440f65f6ccc9cd44f00573cd61478 /pkt-line.c
parenteaa82f8e983199080369c44869ceac1e403f81fc (diff)
downloadgit-64220dc5f7450d8eca471fa484965b1dcddc2827.zip
git-64220dc5f7450d8eca471fa484965b1dcddc2827.tar.gz
git-64220dc5f7450d8eca471fa484965b1dcddc2827.tar.bz2
pkt-line: memorize sideband fragment in reader
When we turn on the "use_sideband" field of the packet_reader, "packet_reader_read()" will call the function "demultiplex_sideband()" to parse and consume sideband messages. Sideband fragment which does not end with "\r" or "\n" will be saved in the sixth parameter "scratch" and it can be reused and be concatenated when parsing another sideband message. In "packet_reader_read()" function, the local variable "scratch" can only be reused by subsequent sideband messages. But if there is a payload message between two sideband fragments, the first fragment which is saved in the local variable "scratch" will be lost. To solve this problem, we can add a new field "scratch" in packet_reader to memorize the sideband fragment across different calls of "packet_reader_read()". Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'pkt-line.c')
-rw-r--r--pkt-line.c5
1 files changed, 2 insertions, 3 deletions
diff --git a/pkt-line.c b/pkt-line.c
index af83a19..5943777 100644
--- a/pkt-line.c
+++ b/pkt-line.c
@@ -592,12 +592,11 @@ void packet_reader_init(struct packet_reader *reader, int fd,
reader->options = options;
reader->me = "git";
reader->hash_algo = &hash_algos[GIT_HASH_SHA1];
+ strbuf_init(&reader->scratch, 0);
}
enum packet_read_status packet_reader_read(struct packet_reader *reader)
{
- struct strbuf scratch = STRBUF_INIT;
-
if (reader->line_peeked) {
reader->line_peeked = 0;
return reader->status;
@@ -620,7 +619,7 @@ enum packet_read_status packet_reader_read(struct packet_reader *reader)
break;
if (demultiplex_sideband(reader->me, reader->status,
reader->buffer, reader->pktlen, 1,
- &scratch, &sideband_type))
+ &reader->scratch, &sideband_type))
break;
}