Jonathan Tan <jonathanta...@google.com> writes:

> @@ -126,6 +129,12 @@ static int read_pack_objects_stdout(int outfd, struct 
> output_state *os)
>       }
>       os->used += readsz;
>  
> +     if (!os->packfile_started) {
> +             os->packfile_started = 1;
> +             if (use_protocol_v2)
> +                     packet_write_fmt(1, "packfile\n");

If we fix this function so that the only byte in the buffer is held
back without emitted when os->used == 1 as I alluded to, this may
have to be done a bit later, as with such a change, it is no longer
guaranteed that send_client_data() will be called after this point.

> +     }
> +
>       if (os->used > 1) {
>               send_client_data(1, os->buffer, os->used - 1);
>               os->buffer[0] = os->buffer[os->used - 1];

> +static void flush_progress_buf(struct strbuf *progress_buf)
> +{
> +     if (!progress_buf->len)
> +             return;
> +     send_client_data(2, progress_buf->buf, progress_buf->len);
> +     strbuf_reset(progress_buf);
> +}

Interesting.

>  static void create_pack_file(const struct object_array *have_obj,
> -                          const struct object_array *want_obj)
> +                          const struct object_array *want_obj,
> +                          int use_protocol_v2)
>  {
>       struct child_process pack_objects = CHILD_PROCESS_INIT;
>       struct output_state output_state = {0};
> @@ -260,9 +278,13 @@ static void create_pack_file(const struct object_array 
> *have_obj,
>                        */
>                       sz = xread(pack_objects.err, progress,
>                                 sizeof(progress));
> -                     if (0 < sz)
> -                             send_client_data(2, progress, sz);
> -                     else if (sz == 0) {
> +                     if (0 < sz) {
> +                             if (output_state.packfile_started)
> +                                     send_client_data(2, progress, sz);
> +                             else
> +                                     strbuf_add(&output_state.progress_buf,
> +                                                progress, sz);

Isn't progress output that goes to the channel #2 pretty much
independent from the payload stream that carries the pkt-line 
command like "packfile" plus the raw pack stream?  It somehow
feels like an oxymoron to _buffer_ progress indicator, as it
defeats the whole point of progress report to buffer it.

Reply via email to