]> git.ipfire.org Git - thirdparty/git.git/blobdiff - builtin-send-pack.c
move duplicated get_local_heads() to remote.c
[thirdparty/git.git] / builtin-send-pack.c
index a9fdbf9d45ddd84e6397ab3e559b06e105c52a19..2fbfc291dc0f78a104f27c821dca39d380083ed3 100644 (file)
@@ -15,6 +15,20 @@ static struct send_pack_args args = {
        /* .receivepack = */ "git-receive-pack",
 };
 
+static int feed_object(const unsigned char *sha1, int fd, int negative)
+{
+       char buf[42];
+
+       if (negative && !has_sha1_file(sha1))
+               return 1;
+
+       memcpy(buf + negative, sha1_to_hex(sha1), 40);
+       if (negative)
+               buf[0] = '^';
+       buf[40 + negative] = '\n';
+       return write_or_whine(fd, buf, 41 + negative, "send-pack: send refs");
+}
+
 /*
  * Make a pack stream and spit it out into file descriptor fd
  */
@@ -35,7 +49,6 @@ static int pack_objects(int fd, struct ref *refs, struct extra_have_objects *ext
        };
        struct child_process po;
        int i;
-       char buf[42];
 
        if (args.use_thin_pack)
                argv[4] = "--thin";
@@ -51,31 +64,17 @@ static int pack_objects(int fd, struct ref *refs, struct extra_have_objects *ext
         * We feed the pack-objects we just spawned with revision
         * parameters by writing to the pipe.
         */
-       for (i = 0; i < extra->nr; i++) {
-               memcpy(buf + 1, sha1_to_hex(&extra->array[i][0]), 40);
-               buf[0] = '^';
-               buf[41] = '\n';
-               if (!write_or_whine(po.in, buf, 42, "send-pack: send refs"))
+       for (i = 0; i < extra->nr; i++)
+               if (!feed_object(extra->array[i], po.in, 1))
                        break;
-       }
 
        while (refs) {
                if (!is_null_sha1(refs->old_sha1) &&
-                   has_sha1_file(refs->old_sha1)) {
-                       memcpy(buf + 1, sha1_to_hex(refs->old_sha1), 40);
-                       buf[0] = '^';
-                       buf[41] = '\n';
-                       if (!write_or_whine(po.in, buf, 42,
-                                               "send-pack: send refs"))
-                               break;
-               }
-               if (!is_null_sha1(refs->new_sha1)) {
-                       memcpy(buf, sha1_to_hex(refs->new_sha1), 40);
-                       buf[40] = '\n';
-                       if (!write_or_whine(po.in, buf, 41,
-                                               "send-pack: send refs"))
-                               break;
-               }
+                   !feed_object(refs->old_sha1, po.in, 1))
+                       break;
+               if (!is_null_sha1(refs->new_sha1) &&
+                   !feed_object(refs->new_sha1, po.in, 0))
+                       break;
                refs = refs->next;
        }
 
@@ -134,33 +133,8 @@ static int ref_newer(const unsigned char *new_sha1,
        return found;
 }
 
-static struct ref *local_refs, **local_tail;
 static struct ref *remote_refs, **remote_tail;
 
-static int one_local_ref(const char *refname, const unsigned char *sha1, int flag, void *cb_data)
-{
-       struct ref *ref;
-       int len;
-
-       /* we already know it starts with refs/ to get here */
-       if (check_ref_format(refname + 5))
-               return 0;
-
-       len = strlen(refname) + 1;
-       ref = xcalloc(1, sizeof(*ref) + len);
-       hashcpy(ref->new_sha1, sha1);
-       memcpy(ref->name, refname, len);
-       *local_tail = ref;
-       local_tail = &ref->next;
-       return 0;
-}
-
-static void get_local_heads(void)
-{
-       local_tail = &local_refs;
-       for_each_ref(one_local_ref, NULL);
-}
-
 static int receive_status(int in, struct ref *refs)
 {
        struct ref *hint;
@@ -388,7 +362,7 @@ static int refs_pushed(struct ref *ref)
 
 static int do_send_pack(int in, int out, struct remote *remote, const char *dest, int nr_refspec, const char **refspec)
 {
-       struct ref *ref;
+       struct ref *ref, *local_refs;
        int new_refs;
        int ask_for_status_report = 0;
        int allow_deleting_refs = 0;
@@ -406,7 +380,7 @@ static int do_send_pack(int in, int out, struct remote *remote, const char *dest
        /* No funny business with the matcher */
        remote_tail = get_remote_heads(in, &remote_refs, 0, NULL, REF_NORMAL,
                                       &extra_have);
-       get_local_heads();
+       local_refs = get_local_heads();
 
        /* Does the other end support the reporting? */
        if (server_supports("report-status"))