]> git.ipfire.org Git - thirdparty/git.git/blobdiff - fetch-pack.c
t/check-non-portable-shell: detect "FOO= shell_func", too
[thirdparty/git.git] / fetch-pack.c
index f80e2d11498e2dc23f8f0cde1eea5df4c125f21b..1734a573b010dd2f87541154cc70e5bb71b00463 100644 (file)
@@ -669,17 +669,20 @@ static void mark_complete_and_common_ref(struct fetch_negotiator *negotiator,
 
        save_commit_buffer = 0;
 
+       trace2_region_enter("fetch-pack", "parse_remote_refs_and_find_cutoff", NULL);
        for (ref = *refs; ref; ref = ref->next) {
                struct object *o;
 
                if (!has_object_file_with_flags(&ref->old_oid,
-                                               OBJECT_INFO_QUICK))
+                                               OBJECT_INFO_QUICK |
+                                                       OBJECT_INFO_SKIP_FETCH_OBJECT))
                        continue;
                o = parse_object(the_repository, &ref->old_oid);
                if (!o)
                        continue;
 
-               /* We already have it -- which may mean that we were
+               /*
+                * We already have it -- which may mean that we were
                 * in sync with the other side at some time after
                 * that (it is OK if we guess wrong here).
                 */
@@ -689,7 +692,13 @@ static void mark_complete_and_common_ref(struct fetch_negotiator *negotiator,
                                cutoff = commit->date;
                }
        }
+       trace2_region_leave("fetch-pack", "parse_remote_refs_and_find_cutoff", NULL);
 
+       /*
+        * This block marks all local refs as COMPLETE, and then recursively marks all
+        * parents of those refs as COMPLETE.
+        */
+       trace2_region_enter("fetch-pack", "mark_complete_local_refs", NULL);
        if (!args->deepen) {
                for_each_ref(mark_complete_oid, NULL);
                for_each_cached_alternate(NULL, mark_alternate_complete);
@@ -697,11 +706,13 @@ static void mark_complete_and_common_ref(struct fetch_negotiator *negotiator,
                if (cutoff)
                        mark_recent_complete_commits(args, cutoff);
        }
+       trace2_region_leave("fetch-pack", "mark_complete_local_refs", NULL);
 
        /*
         * Mark all complete remote refs as common refs.
         * Don't mark them common yet; the server has to be told so first.
         */
+       trace2_region_enter("fetch-pack", "mark_common_remote_refs", NULL);
        for (ref = *refs; ref; ref = ref->next) {
                struct object *o = deref_tag(the_repository,
                                             lookup_object(the_repository,
@@ -714,6 +725,7 @@ static void mark_complete_and_common_ref(struct fetch_negotiator *negotiator,
                negotiator->known_common(negotiator,
                                         (struct commit *)o);
        }
+       trace2_region_leave("fetch-pack", "mark_common_remote_refs", NULL);
 
        save_commit_buffer = old_save_commit_buffer;
 }
@@ -934,8 +946,15 @@ static struct ref *do_fetch_pack(struct fetch_pack_args *args,
        struct object_id oid;
        const char *agent_feature;
        int agent_len;
-       struct fetch_negotiator negotiator;
-       fetch_negotiator_init(r, &negotiator);
+       struct fetch_negotiator negotiator_alloc;
+       struct fetch_negotiator *negotiator;
+
+       if (args->no_dependents) {
+               negotiator = NULL;
+       } else {
+               negotiator = &negotiator_alloc;
+               fetch_negotiator_init(r, negotiator);
+       }
 
        sort_ref_list(&ref, ref_compare_name);
        QSORT(sought, nr_sought, cmp_ref_by_name);
@@ -1022,7 +1041,7 @@ static struct ref *do_fetch_pack(struct fetch_pack_args *args,
                die(_("Server does not support --deepen"));
 
        if (!args->no_dependents) {
-               mark_complete_and_common_ref(&negotiator, args, &ref);
+               mark_complete_and_common_ref(negotiator, args, &ref);
                filter_refs(args, &ref, sought, nr_sought);
                if (everything_local(args, &ref)) {
                        packet_flush(fd[1]);
@@ -1031,7 +1050,7 @@ static struct ref *do_fetch_pack(struct fetch_pack_args *args,
        } else {
                filter_refs(args, &ref, sought, nr_sought);
        }
-       if (find_common(&negotiator, args, fd, &oid, ref) < 0)
+       if (find_common(negotiator, args, fd, &oid, ref) < 0)
                if (!args->keep_pack)
                        /* When cloning, it is not unusual to have
                         * no common commit.
@@ -1051,7 +1070,8 @@ static struct ref *do_fetch_pack(struct fetch_pack_args *args,
                die(_("git fetch-pack: fetch failed."));
 
  all_done:
-       negotiator.release(&negotiator);
+       if (negotiator)
+               negotiator->release(negotiator);
        return ref;
 }
 
@@ -1269,7 +1289,8 @@ static int process_acks(struct fetch_negotiator *negotiator,
                                struct commit *commit;
                                oidset_insert(common, &oid);
                                commit = lookup_commit(the_repository, &oid);
-                               negotiator->ack(negotiator, commit);
+                               if (negotiator)
+                                       negotiator->ack(negotiator, commit);
                        }
                        continue;
                }
@@ -1421,8 +1442,16 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
        struct packet_reader reader;
        int in_vain = 0, negotiation_started = 0;
        int haves_to_send = INITIAL_FLUSH;
-       struct fetch_negotiator negotiator;
-       fetch_negotiator_init(r, &negotiator);
+       struct fetch_negotiator negotiator_alloc;
+       struct fetch_negotiator *negotiator;
+
+       if (args->no_dependents) {
+               negotiator = NULL;
+       } else {
+               negotiator = &negotiator_alloc;
+               fetch_negotiator_init(r, negotiator);
+       }
+
        packet_reader_init(&reader, fd[0], NULL, 0,
                           PACKET_READ_CHOMP_NEWLINE |
                           PACKET_READ_DIE_ON_ERR_PACKET);
@@ -1446,15 +1475,15 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
 
                        /* Filter 'ref' by 'sought' and those that aren't local */
                        if (!args->no_dependents) {
-                               mark_complete_and_common_ref(&negotiator, args, &ref);
+                               mark_complete_and_common_ref(negotiator, args, &ref);
                                filter_refs(args, &ref, sought, nr_sought);
                                if (everything_local(args, &ref))
                                        state = FETCH_DONE;
                                else
                                        state = FETCH_SEND_REQUEST;
 
-                               mark_tips(&negotiator, args->negotiation_tips);
-                               for_each_cached_alternate(&negotiator,
+                               mark_tips(negotiator, args->negotiation_tips);
+                               for_each_cached_alternate(negotiator,
                                                          insert_one_alternate_object);
                        } else {
                                filter_refs(args, &ref, sought, nr_sought);
@@ -1468,7 +1497,7 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
                                                    "negotiation_v2",
                                                    the_repository);
                        }
-                       if (send_fetch_request(&negotiator, fd[1], args, ref,
+                       if (send_fetch_request(negotiator, fd[1], args, ref,
                                               &common,
                                               &haves_to_send, &in_vain,
                                               reader.use_sideband))
@@ -1478,7 +1507,7 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
                        break;
                case FETCH_PROCESS_ACKS:
                        /* Process ACKs/NAKs */
-                       switch (process_acks(&negotiator, &reader, &common)) {
+                       switch (process_acks(negotiator, &reader, &common)) {
                        case 2:
                                state = FETCH_GET_PACK;
                                break;
@@ -1513,7 +1542,8 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
                }
        }
 
-       negotiator.release(&negotiator);
+       if (negotiator)
+               negotiator->release(negotiator);
        oidset_clear(&common);
        return ref;
 }