config documentation: some configs are auto-set by git-init
[gitweb.git] / upload-pack.c
index f1dc3a351c522a91acb9663f832f2a18a9c20dc2..6bfb500eb4116bc74d6088b5b0621e89453fab3d 100644 (file)
@@ -39,6 +39,8 @@ static unsigned int timeout;
  */
 static int use_sideband;
 static int debug_fd;
+static int advertise_refs;
+static int stateless_rpc;
 
 static void reset_timeout(void)
 {
@@ -308,6 +310,23 @@ static void create_pack_file(void)
                        }
                        continue;
                }
+               if (0 <= pe && (pfd[pe].revents & (POLLIN|POLLHUP))) {
+                       /* Status ready; we ship that in the side-band
+                        * or dump to the standard error.
+                        */
+                       sz = xread(pack_objects.err, progress,
+                                 sizeof(progress));
+                       if (0 < sz)
+                               send_client_data(2, progress, sz);
+                       else if (sz == 0) {
+                               close(pack_objects.err);
+                               pack_objects.err = -1;
+                       }
+                       else
+                               goto fail;
+                       /* give priority to status messages */
+                       continue;
+               }
                if (0 <= pu && (pfd[pu].revents & (POLLIN|POLLHUP))) {
                        /* Data ready; we keep the last byte to ourselves
                         * in case we detect broken rev-list, so that we
@@ -345,21 +364,6 @@ static void create_pack_file(void)
                        if (sz < 0)
                                goto fail;
                }
-               if (0 <= pe && (pfd[pe].revents & (POLLIN|POLLHUP))) {
-                       /* Status ready; we ship that in the side-band
-                        * or dump to the standard error.
-                        */
-                       sz = xread(pack_objects.err, progress,
-                                 sizeof(progress));
-                       if (0 < sz)
-                               send_client_data(2, progress, sz);
-                       else if (sz == 0) {
-                               close(pack_objects.err);
-                               pack_objects.err = -1;
-                       }
-                       else
-                               goto fail;
-               }
        }
 
        if (finish_command(&pack_objects)) {
@@ -509,6 +513,8 @@ static int get_common_commits(void)
                if (!len) {
                        if (have_obj.nr == 0 || multi_ack)
                                packet_write(1, "NAK\n");
+                       if (stateless_rpc)
+                               exit(0);
                        continue;
                }
                strip(line, len);
@@ -710,12 +716,32 @@ static int send_ref(const char *refname, const unsigned char *sha1, int flag, vo
        return 0;
 }
 
+static int mark_our_ref(const char *refname, const unsigned char *sha1, int flag, void *cb_data)
+{
+       struct object *o = parse_object(sha1);
+       if (!o)
+               die("git upload-pack: cannot find object %s:", sha1_to_hex(sha1));
+       if (!(o->flags & OUR_REF)) {
+               o->flags |= OUR_REF;
+               nr_our_refs++;
+       }
+       return 0;
+}
+
 static void upload_pack(void)
 {
-       reset_timeout();
-       head_ref(send_ref, NULL);
-       for_each_ref(send_ref, NULL);
-       packet_flush(1);
+       if (advertise_refs || !stateless_rpc) {
+               reset_timeout();
+               head_ref(send_ref, NULL);
+               for_each_ref(send_ref, NULL);
+               packet_flush(1);
+       } else {
+               head_ref(mark_our_ref, NULL);
+               for_each_ref(mark_our_ref, NULL);
+       }
+       if (advertise_refs)
+               return;
+
        receive_needs();
        if (want_obj.nr) {
                get_common_commits();
@@ -737,6 +763,14 @@ int main(int argc, char **argv)
 
                if (arg[0] != '-')
                        break;
+               if (!strcmp(arg, "--advertise-refs")) {
+                       advertise_refs = 1;
+                       continue;
+               }
+               if (!strcmp(arg, "--stateless-rpc")) {
+                       stateless_rpc = 1;
+                       continue;
+               }
                if (!strcmp(arg, "--strict")) {
                        strict = 1;
                        continue;