Code

atomic write for sideband remote messages
authorNicolas Pitre <nico@cam.org>
Wed, 11 Oct 2006 15:49:15 +0000 (11:49 -0400)
committerJunio C Hamano <junkio@cox.net>
Wed, 11 Oct 2006 18:13:01 +0000 (11:13 -0700)
It has been a few times that I ended up with such a confusing display:

|remote: Generating pack...
|remote: Done counting 17 objects.
|remote: Result has 9 objects.
|remote: Deltifying 9 objects.
|remote:  100% (9/9) done
|remote: Unpacking 9 objects
|Total 9, written 9 (delta 8), reused 0 (delta 0)
| 100% (9/9) done

The confusion can be avoided in most cases by writing the remote message
in one go to prevent interleacing with local messages.  The buffer
declaration has been moved inside recv_sideband() to avoid extra string
copies.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
builtin-archive.c
fetch-clone.c
sideband.c
sideband.h

index 6dabdee2019d15d7deadfc094d0c1e5f101d09ca..9177379122ea29152e1213cc533f7cd7c569f8d3 100644 (file)
@@ -75,7 +75,7 @@ static int run_remote_archiver(const char *remote, int argc,
                die("git-archive: expected a flush");
 
        /* Now, start reading from fd[0] and spit it out to stdout */
-       rv = recv_sideband("archive", fd[0], 1, 2, buf, sizeof(buf));
+       rv = recv_sideband("archive", fd[0], 1, 2);
        close(fd[0]);
        rv |= finish_connect(pid);
 
index b632ca0438b378944b37a7d64fd508ea3f7f470f..76b99afcdb8556fec284a621bbdc76223845877e 100644 (file)
@@ -115,12 +115,10 @@ static pid_t setup_sideband(int sideband, const char *me, int fd[2], int xd[2])
                die("%s: unable to fork off sideband demultiplexer", me);
        if (!side_pid) {
                /* subprocess */
-               char buf[LARGE_PACKET_MAX];
-
                close(fd[0]);
                if (xd[0] != xd[1])
                        close(xd[1]);
-               if (recv_sideband(me, xd[0], fd[1], 2, buf, sizeof(buf)))
+               if (recv_sideband(me, xd[0], fd[1], 2))
                        exit(1);
                exit(0);
        }
index 1b14ff88924668e6803229d4d2cef981823522fb..277fa3c10d19ee7997ee5b38c5f77a6cd04576f1 100644 (file)
  * stream, aka "verbose").  A message over band #3 is a signal that
  * the remote died unexpectedly.  A flush() concludes the stream.
  */
-int recv_sideband(const char *me, int in_stream, int out, int err, char *buf, int bufsz)
+int recv_sideband(const char *me, int in_stream, int out, int err)
 {
+       char buf[7 + LARGE_PACKET_MAX + 1];
+       strcpy(buf, "remote:");
        while (1) {
-               int len = packet_read_line(in_stream, buf, bufsz);
+               int band, len;
+               len     = packet_read_line(in_stream, buf+7, LARGE_PACKET_MAX);
                if (len == 0)
                        break;
                if (len < 1) {
@@ -22,25 +25,26 @@ int recv_sideband(const char *me, int in_stream, int out, int err, char *buf, in
                        safe_write(err, buf, len);
                        return SIDEBAND_PROTOCOL_ERROR;
                }
+               band = buf[7] & 0xff;
                len--;
-               switch (buf[0] & 0xFF) {
+               switch (band) {
                case 3:
-                       safe_write(err, "remote: ", 8);
-                       safe_write(err, buf+1, len);
-                       safe_write(err, "\n", 1);
+                       buf[7] = ' ';
+                       buf[8+len] = '\n';
+                       safe_write(err, buf, 8+len+1);
                        return SIDEBAND_REMOTE_ERROR;
                case 2:
-                       safe_write(err, "remote: ", 8);
-                       safe_write(err, buf+1, len);
+                       buf[7] = ' ';
+                       safe_write(err, buf, 8+len);
                        continue;
                case 1:
-                       safe_write(out, buf+1, len);
+                       safe_write(out, buf+8, len);
                        continue;
                default:
-                       len = sprintf(buf + 1,
+                       len = sprintf(buf,
                                      "%s: protocol error: bad band #%d\n",
-                                     me, buf[0] & 0xFF);
-                       safe_write(err, buf+1, len);
+                                     me, band);
+                       safe_write(err, buf, len);
                        return SIDEBAND_PROTOCOL_ERROR;
                }
        }
index 4872106fa0881a4ccb6fbaf6343d63bd31effd8c..a84b6917c7a17b5f8a922540801e98d46aa24431 100644 (file)
@@ -7,7 +7,7 @@
 #define DEFAULT_PACKET_MAX 1000
 #define LARGE_PACKET_MAX 65520
 
-int recv_sideband(const char *me, int in_stream, int out, int err, char *, int);
+int recv_sideband(const char *me, int in_stream, int out, int err);
 ssize_t send_sideband(int fd, int band, const char *data, ssize_t sz, int packet_max);
 
 #endif