]> git.ipfire.org Git - thirdparty/git.git/blobdiff - connect.c
Merge branch 'ab/detox-gettext-tests'
[thirdparty/git.git] / connect.c
index 9c97fee43031056dff2beb2a8fe9ed882e476c2d..40b5c15f811305648e22e0c2db55fbd1998cf211 100644 (file)
--- a/connect.c
+++ b/connect.c
@@ -376,7 +376,8 @@ struct ref **get_remote_heads(struct packet_reader *reader,
 }
 
 /* Returns 1 when a valid ref has been added to `list`, 0 otherwise */
-static int process_ref_v2(struct packet_reader *reader, struct ref ***list)
+static int process_ref_v2(struct packet_reader *reader, struct ref ***list,
+                         char **unborn_head_target)
 {
        int ret = 1;
        int i = 0;
@@ -397,6 +398,25 @@ static int process_ref_v2(struct packet_reader *reader, struct ref ***list)
                goto out;
        }
 
+       if (!strcmp("unborn", line_sections.items[i].string)) {
+               i++;
+               if (unborn_head_target &&
+                   !strcmp("HEAD", line_sections.items[i++].string)) {
+                       /*
+                        * Look for the symref target (if any). If found,
+                        * return it to the caller.
+                        */
+                       for (; i < line_sections.nr; i++) {
+                               const char *arg = line_sections.items[i].string;
+
+                               if (skip_prefix(arg, "symref-target:", &arg)) {
+                                       *unborn_head_target = xstrdup(arg);
+                                       break;
+                               }
+                       }
+               }
+               goto out;
+       }
        if (parse_oid_hex_algop(line_sections.items[i++].string, &old_oid, &end, reader->hash_algo) ||
            *end) {
                ret = 0;
@@ -453,12 +473,16 @@ void check_stateless_delimiter(int stateless_rpc,
 
 struct ref **get_remote_refs(int fd_out, struct packet_reader *reader,
                             struct ref **list, int for_push,
-                            const struct strvec *ref_prefixes,
+                            struct transport_ls_refs_options *transport_options,
                             const struct string_list *server_options,
                             int stateless_rpc)
 {
        int i;
        const char *hash_name;
+       struct strvec *ref_prefixes = transport_options ?
+               &transport_options->ref_prefixes : NULL;
+       char **unborn_head_target = transport_options ?
+               &transport_options->unborn_head_target : NULL;
        *list = NULL;
 
        if (server_supports_v2("ls-refs", 1))
@@ -488,6 +512,8 @@ struct ref **get_remote_refs(int fd_out, struct packet_reader *reader,
        if (!for_push)
                packet_write_fmt(fd_out, "peel\n");
        packet_write_fmt(fd_out, "symrefs\n");
+       if (server_supports_feature("ls-refs", "unborn", 0))
+               packet_write_fmt(fd_out, "unborn\n");
        for (i = 0; ref_prefixes && i < ref_prefixes->nr; i++) {
                packet_write_fmt(fd_out, "ref-prefix %s\n",
                                 ref_prefixes->v[i]);
@@ -496,7 +522,7 @@ struct ref **get_remote_refs(int fd_out, struct packet_reader *reader,
 
        /* Process response from server */
        while (packet_reader_read(reader) == PACKET_READ_NORMAL) {
-               if (!process_ref_v2(reader, &list))
+               if (!process_ref_v2(reader, &list, unborn_head_target))
                        die(_("invalid ls-refs response: %s"), reader->line);
        }