From patchwork Tue Sep 21 16:51:03 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Tan X-Patchwork-Id: 12508347 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 230E1C433F5 for ; Tue, 21 Sep 2021 16:51:18 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 0699361166 for ; Tue, 21 Sep 2021 16:51:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229770AbhIUQwp (ORCPT ); Tue, 21 Sep 2021 12:52:45 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41396 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229761AbhIUQwp (ORCPT ); Tue, 21 Sep 2021 12:52:45 -0400 Received: from mail-qv1-xf49.google.com (mail-qv1-xf49.google.com [IPv6:2607:f8b0:4864:20::f49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A0B08C061574 for ; Tue, 21 Sep 2021 09:51:16 -0700 (PDT) Received: by mail-qv1-xf49.google.com with SMTP id p12-20020ad4496c000000b0037a535cb8b2so231447472qvy.15 for ; Tue, 21 Sep 2021 09:51:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=O/Hj74umZUSqytV6ZDox3DChOc/rmL/nE86YLHIW7sk=; b=qRjAnr3ZzSW+UkwyKhXaI2qufF7966X7nV5uPBwrBOnFjiJMEiJSgXHQwi6R7eWwRU ENAjva7Gs4sytipGzmScCl0Jp/SU6dwe0LNqaMtJ8LUeHXEzWrVNebPCSlXnI3BatGVO y7MbYAvGNNzFun35wX6iGPkNbFDp/RAIXfSYlAXL4cuqHtO2R8idIJdF1PK3aaPjEDTC 2c9vrIfBfFkKtczM7ybp+YOLZzqETqD5LJ3bKEMel5Obp6kwaRKwkNLggokEe2O2aGr2 mUqnSomYFT/jzRTpzaoH3Q0Pn4AycCu5yhZgED1q4RkJxSYcGATDqg/H/P6IydMFjUNu asew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=O/Hj74umZUSqytV6ZDox3DChOc/rmL/nE86YLHIW7sk=; b=tUqWZB6pEyu0euzxH/y85Q/DtOr58Ztgn931G98ZSdBb9CauRW2WZjq3XajPKUOn0G DZhO7YBJVVSb7y2hDsINRShLPbf1AdId3hxjfTUJmjALDck79H4Opi65T0N0yMhiqYnl h29uSFoEsNeREItb9v3bknldJeRDjzGso6u+UmfnjbsuLziKK4c/YyCVYCSCCPg1JgKl IkX1/Ps/4iYhvVFNiiRuGXCjMrbZ1YWmvumbSocg+cR4L+kL1ZyTf9dLJ9gra1jdl2M4 CAUj9LHF7N1TeeIWLNUFHmPAL6/jQkxREbiUIcOQhgFaMy6UlspVlJ/3hBdAt8VB/q2W 0ucQ== X-Gm-Message-State: AOAM530CGMeLU+xgTkn0gClxBf6QqN55tArQB/SIWZhorHvzyNnQ13lY POEmL6/CrSkdkj1crfIwd1WH3M0nIpfgZmSGf3oUJcVkZmLCA+I5o7FCEqhwdMZuYaCGdqn7Ptx O9E5fVyfoYOLbikkNWVGeI9l7W4QwXu6Cb+1FLSxkqL50eACa19dZVZ2WmbIAfPu8ZuRX4fhm0u vt X-Google-Smtp-Source: ABdhPJzns6Q+3NF872Am62if5NuexROqGLd4rFSJt9oIFfSOQUOrI917KanlblAjwYEQMllOoibChwR46fI97JZGZx0e X-Received: from twelve4.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:437a]) (user=jonathantanmy job=sendgmr) by 2002:a0c:f3c6:: with SMTP id f6mr15575540qvm.33.1632243075793; Tue, 21 Sep 2021 09:51:15 -0700 (PDT) Date: Tue, 21 Sep 2021 09:51:03 -0700 In-Reply-To: Message-Id: <493fff7f4716d889da751b5f8c6740cc1e3aa360.1632242495.git.jonathantanmy@google.com> Mime-Version: 1.0 References: X-Mailer: git-send-email 2.33.0.464.g1972c5931b-goog Subject: [PATCH 1/9] refs: make _advance() check struct repo, not flag From: Jonathan Tan To: git@vger.kernel.org Cc: Jonathan Tan Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Currently, ref iterators access the object store each time they advance if and only if the boolean flag DO_FOR_EACH_INCLUDE_BROKEN is unset. (The iterators access the object store because, if DO_FOR_EACH_INCLUDE_BROKEN is unset, they need to attempt to resolve each ref to determine that it is not broken.) Also, the object store accessed is always that of the_repository, making it impossible to iterate over a submodule's refs without DO_FOR_EACH_INCLUDE_BROKEN (unless add_submodule_odb() is used). As a first step in resolving both these problems, replace the DO_FOR_EACH_INCLUDE_BROKEN flag with a struct repository pointer. This commit is a mechanical conversion - whenever DO_FOR_EACH_INCLUDE_BROKEN is set, a NULL repository (representing access to no object store) is used instead, and whenever DO_FOR_EACH_INCLUDE_BROKEN is unset, a non-NULL repository (representing access to that repository's object store) is used instead. Right now, the locations in which non-the_repository support needs to be added are marked with BUG() statements - in a future patch, these will be replaced. (NEEDSWORK: in this RFC patch set, this has not been done) I have considered and rejected the following design alternative: - Change the _advance() callback to also have a repository object parameter, and either skip or not skip depending on whether that parameter is NULL. This burdens callers to have to carry this information along with the iterator, and such calling code may be unclear as to why that parameter can be NULL in some cases and cannot in others. Signed-off-by: Jonathan Tan --- refs.c | 46 +++++++++++++++++++++++-------------------- refs/files-backend.c | 14 ++++--------- refs/iterator.c | 18 ++++++++++++++++- refs/packed-backend.c | 10 +--------- refs/refs-internal.h | 27 +++++++++++++++---------- 5 files changed, 64 insertions(+), 51 deletions(-) diff --git a/refs.c b/refs.c index 8b9f7c3a80..49ddcdac53 100644 --- a/refs.c +++ b/refs.c @@ -1413,16 +1413,16 @@ int head_ref(each_ref_fn fn, void *cb_data) struct ref_iterator *refs_ref_iterator_begin( struct ref_store *refs, - const char *prefix, int trim, int flags) + const char *prefix, int trim, struct repository *repo, + int flags) { struct ref_iterator *iter; if (ref_paranoia < 0) ref_paranoia = git_env_bool("GIT_REF_PARANOIA", 0); - if (ref_paranoia) - flags |= DO_FOR_EACH_INCLUDE_BROKEN; iter = refs->be->iterator_begin(refs, prefix, flags); + iter->repo = ref_paranoia ? NULL : repo; /* * `iterator_begin()` already takes care of prefix, but we @@ -1442,13 +1442,16 @@ struct ref_iterator *refs_ref_iterator_begin( * Call fn for each reference in the specified submodule for which the * refname begins with prefix. If trim is non-zero, then trim that * many characters off the beginning of each refname before passing - * the refname to fn. flags can be DO_FOR_EACH_INCLUDE_BROKEN to - * include broken references in the iteration. If fn ever returns a + * the refname to fn. If fn ever returns a * non-zero value, stop the iteration and return that value; * otherwise, return 0. + * + * See the documentation of refs_ref_iterator_begin() for more information on + * the repo parameter. */ static int do_for_each_repo_ref(struct repository *r, const char *prefix, - each_repo_ref_fn fn, int trim, int flags, + each_repo_ref_fn fn, int trim, + struct repository *repo, int flags, void *cb_data) { struct ref_iterator *iter; @@ -1457,7 +1460,7 @@ static int do_for_each_repo_ref(struct repository *r, const char *prefix, if (!refs) return 0; - iter = refs_ref_iterator_begin(refs, prefix, trim, flags); + iter = refs_ref_iterator_begin(refs, prefix, trim, repo, flags); return do_for_each_repo_ref_iterator(r, iter, fn, cb_data); } @@ -1479,7 +1482,8 @@ static int do_for_each_ref_helper(struct repository *r, } static int do_for_each_ref(struct ref_store *refs, const char *prefix, - each_ref_fn fn, int trim, int flags, void *cb_data) + each_ref_fn fn, int trim, struct repository *repo, + int flags, void *cb_data) { struct ref_iterator *iter; struct do_for_each_ref_help hp = { fn, cb_data }; @@ -1487,7 +1491,7 @@ static int do_for_each_ref(struct ref_store *refs, const char *prefix, if (!refs) return 0; - iter = refs_ref_iterator_begin(refs, prefix, trim, flags); + iter = refs_ref_iterator_begin(refs, prefix, trim, repo, flags); return do_for_each_repo_ref_iterator(the_repository, iter, do_for_each_ref_helper, &hp); @@ -1495,7 +1499,7 @@ static int do_for_each_ref(struct ref_store *refs, const char *prefix, int refs_for_each_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data) { - return do_for_each_ref(refs, "", fn, 0, 0, cb_data); + return do_for_each_ref(refs, "", fn, 0, the_repository, 0, cb_data); } int for_each_ref(each_ref_fn fn, void *cb_data) @@ -1506,7 +1510,7 @@ int for_each_ref(each_ref_fn fn, void *cb_data) int refs_for_each_ref_in(struct ref_store *refs, const char *prefix, each_ref_fn fn, void *cb_data) { - return do_for_each_ref(refs, prefix, fn, strlen(prefix), 0, cb_data); + return do_for_each_ref(refs, prefix, fn, strlen(prefix), the_repository, 0, cb_data); } int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data) @@ -1518,10 +1522,10 @@ int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data, unsig { unsigned int flag = 0; - if (broken) - flag = DO_FOR_EACH_INCLUDE_BROKEN; return do_for_each_ref(get_main_ref_store(the_repository), - prefix, fn, 0, flag, cb_data); + prefix, fn, 0, + broken ? NULL : the_repository, + flag, cb_data); } int refs_for_each_fullref_in(struct ref_store *refs, const char *prefix, @@ -1530,16 +1534,16 @@ int refs_for_each_fullref_in(struct ref_store *refs, const char *prefix, { unsigned int flag = 0; - if (broken) - flag = DO_FOR_EACH_INCLUDE_BROKEN; - return do_for_each_ref(refs, prefix, fn, 0, flag, cb_data); + return do_for_each_ref(refs, prefix, fn, 0, + broken ? NULL : the_repository, + flag, cb_data); } int for_each_replace_ref(struct repository *r, each_repo_ref_fn fn, void *cb_data) { return do_for_each_repo_ref(r, git_replace_ref_base, fn, strlen(git_replace_ref_base), - DO_FOR_EACH_INCLUDE_BROKEN, cb_data); + NULL, 0, cb_data); } int for_each_namespaced_ref(each_ref_fn fn, void *cb_data) @@ -1548,7 +1552,7 @@ int for_each_namespaced_ref(each_ref_fn fn, void *cb_data) int ret; strbuf_addf(&buf, "%srefs/", get_git_namespace()); ret = do_for_each_ref(get_main_ref_store(the_repository), - buf.buf, fn, 0, 0, cb_data); + buf.buf, fn, 0, the_repository, 0, cb_data); strbuf_release(&buf); return ret; } @@ -1556,7 +1560,7 @@ int for_each_namespaced_ref(each_ref_fn fn, void *cb_data) int refs_for_each_rawref(struct ref_store *refs, each_ref_fn fn, void *cb_data) { return do_for_each_ref(refs, "", fn, 0, - DO_FOR_EACH_INCLUDE_BROKEN, cb_data); + NULL, 0, cb_data); } int for_each_rawref(each_ref_fn fn, void *cb_data) @@ -2263,7 +2267,7 @@ int refs_verify_refname_available(struct ref_store *refs, strbuf_addch(&dirname, '/'); iter = refs_ref_iterator_begin(refs, dirname.buf, 0, - DO_FOR_EACH_INCLUDE_BROKEN); + NULL, 0); while ((ok = ref_iterator_advance(iter)) == ITER_OK) { if (skip && string_list_has_string(skip, iter->refname)) diff --git a/refs/files-backend.c b/refs/files-backend.c index 677b7e4cdd..cd145301d0 100644 --- a/refs/files-backend.c +++ b/refs/files-backend.c @@ -744,12 +744,6 @@ static int files_ref_iterator_advance(struct ref_iterator *ref_iterator) ref_type(iter->iter0->refname) != REF_TYPE_PER_WORKTREE) continue; - if (!(iter->flags & DO_FOR_EACH_INCLUDE_BROKEN) && - !ref_resolves_to_object(iter->iter0->refname, - iter->iter0->oid, - iter->iter0->flags)) - continue; - iter->base.refname = iter->iter0->refname; iter->base.oid = iter->iter0->oid; iter->base.flags = iter->iter0->flags; @@ -801,9 +795,6 @@ static struct ref_iterator *files_ref_iterator_begin( struct ref_iterator *ref_iterator; unsigned int required_flags = REF_STORE_READ; - if (!(flags & DO_FOR_EACH_INCLUDE_BROKEN)) - required_flags |= REF_STORE_ODB; - refs = files_downcast(ref_store, required_flags, "ref_iterator_begin"); /* @@ -836,10 +827,13 @@ static struct ref_iterator *files_ref_iterator_begin( * references, and (if needed) do our own check for broken * ones in files_ref_iterator_advance(), after we have merged * the packed and loose references. + * + * Do this by not supplying any repo, regardless of whether a repo was + * supplied to files_ref_iterator_begin(). */ packed_iter = refs_ref_iterator_begin( refs->packed_ref_store, prefix, 0, - DO_FOR_EACH_INCLUDE_BROKEN); + NULL, 0); overlay_iter = overlay_ref_iterator_begin(loose_iter, packed_iter); diff --git a/refs/iterator.c b/refs/iterator.c index a89d132d4f..5af6554887 100644 --- a/refs/iterator.c +++ b/refs/iterator.c @@ -10,7 +10,23 @@ int ref_iterator_advance(struct ref_iterator *ref_iterator) { - return ref_iterator->vtable->advance(ref_iterator); + int ok; + + if (ref_iterator->repo && ref_iterator->repo != the_repository) + /* + * NEEDSWORK: make ref_resolves_to_object() support + * arbitrary repositories + */ + BUG("ref_iterator->repo must be NULL or the_repository"); + while ((ok = ref_iterator->vtable->advance(ref_iterator)) == ITER_OK) { + if (ref_iterator->repo && + !ref_resolves_to_object(ref_iterator->refname, + ref_iterator->oid, + ref_iterator->flags)) + continue; + return ITER_OK; + } + return ok; } int ref_iterator_peel(struct ref_iterator *ref_iterator, diff --git a/refs/packed-backend.c b/refs/packed-backend.c index f8aa97d799..f52d5488b8 100644 --- a/refs/packed-backend.c +++ b/refs/packed-backend.c @@ -863,11 +863,6 @@ static int packed_ref_iterator_advance(struct ref_iterator *ref_iterator) ref_type(iter->base.refname) != REF_TYPE_PER_WORKTREE) continue; - if (!(iter->flags & DO_FOR_EACH_INCLUDE_BROKEN) && - !ref_resolves_to_object(iter->base.refname, &iter->oid, - iter->flags)) - continue; - return ITER_OK; } @@ -922,8 +917,6 @@ static struct ref_iterator *packed_ref_iterator_begin( struct ref_iterator *ref_iterator; unsigned int required_flags = REF_STORE_READ; - if (!(flags & DO_FOR_EACH_INCLUDE_BROKEN)) - required_flags |= REF_STORE_ODB; refs = packed_downcast(ref_store, required_flags, "ref_iterator_begin"); /* @@ -1136,8 +1129,7 @@ static int write_with_updates(struct packed_ref_store *refs, * list of refs is exhausted, set iter to NULL. When the list * of updates is exhausted, leave i set to updates->nr. */ - iter = packed_ref_iterator_begin(&refs->base, "", - DO_FOR_EACH_INCLUDE_BROKEN); + iter = refs_ref_iterator_begin(&refs->base, "", 0, NULL, 0); if ((ok = ref_iterator_advance(iter)) != ITER_OK) iter = NULL; diff --git a/refs/refs-internal.h b/refs/refs-internal.h index 3155708345..dc0ed65686 100644 --- a/refs/refs-internal.h +++ b/refs/refs-internal.h @@ -245,9 +245,6 @@ int refs_rename_ref_available(struct ref_store *refs, /* We allow "recursive" symbolic refs. Only within reason, though */ #define SYMREF_MAXDEPTH 5 -/* Include broken references in a do_for_each_ref*() iteration: */ -#define DO_FOR_EACH_INCLUDE_BROKEN 0x01 - /* * Reference iterators * @@ -305,6 +302,12 @@ struct ref_iterator { */ unsigned int ordered : 1; + /* + * See the documentation of refs_ref_iterator_begin() for more + * information. + */ + struct repository *repo; + const char *refname; const struct object_id *oid; unsigned int flags; @@ -349,16 +352,19 @@ int is_empty_ref_iterator(struct ref_iterator *ref_iterator); * Return an iterator that goes over each reference in `refs` for * which the refname begins with prefix. If trim is non-zero, then * trim that many characters off the beginning of each refname. - * The output is ordered by refname. The following flags are supported: + * The output is ordered by refname. + * + * Pass NULL as repo to include broken references in the iteration, or non-NULL + * to skip references that do not resolve to an object in the given repo. * - * DO_FOR_EACH_INCLUDE_BROKEN: include broken references in - * the iteration. + * The following flags are supported: * * DO_FOR_EACH_PER_WORKTREE_ONLY: only produce REF_TYPE_PER_WORKTREE refs. */ struct ref_iterator *refs_ref_iterator_begin( struct ref_store *refs, - const char *prefix, int trim, int flags); + const char *prefix, int trim, struct repository *repo, + int flags); /* * A callback function used to instruct merge_ref_iterator how to @@ -446,8 +452,9 @@ void base_ref_iterator_free(struct ref_iterator *iter); /* * backend-specific implementation of ref_iterator_advance. For symrefs, the * function should set REF_ISSYMREF, and it should also dereference the symref - * to provide the OID referent. If DO_FOR_EACH_INCLUDE_BROKEN is set, symrefs - * with non-existent referents and refs pointing to non-existent object names + * to provide the OID referent. If a NULL repo was passed to the _begin() + * function that created this iterator, symrefs with non-existent referents and + * refs pointing to non-existent object names * should also be returned. If DO_FOR_EACH_PER_WORKTREE_ONLY, only * REF_TYPE_PER_WORKTREE refs should be returned. */ @@ -504,7 +511,7 @@ int do_for_each_repo_ref_iterator(struct repository *r, * where all reference backends will presumably store their * per-worktree refs. */ -#define DO_FOR_EACH_PER_WORKTREE_ONLY 0x02 +#define DO_FOR_EACH_PER_WORKTREE_ONLY 0x01 struct ref_store; From patchwork Tue Sep 21 16:51:04 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Tan X-Patchwork-Id: 12508349 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 92E48C433FE for ; Tue, 21 Sep 2021 16:51:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 729CF611BD for ; Tue, 21 Sep 2021 16:51:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229778AbhIUQwr (ORCPT ); Tue, 21 Sep 2021 12:52:47 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41400 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229773AbhIUQwq (ORCPT ); Tue, 21 Sep 2021 12:52:46 -0400 Received: from mail-qk1-x749.google.com (mail-qk1-x749.google.com [IPv6:2607:f8b0:4864:20::749]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E93E0C061574 for ; Tue, 21 Sep 2021 09:51:17 -0700 (PDT) Received: by mail-qk1-x749.google.com with SMTP id m10-20020a05620a290a00b004334bcdf1f4so56777402qkp.2 for ; Tue, 21 Sep 2021 09:51:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=wBaTShB5IU0mBEEDbpuS4BpyQQqt78GrIjGwByykJZU=; b=YK/UWKCOpwGnurpPP8lbRa3SYXTLkc0M00Z58PxmlitNutWP+eE2mfUpdZgx0J42MJ 31htW8Ht0w9Di4D3Vq7E871Zxu2U34VRgyvmKLCoOIujjolO17V6/RDIimR1QaWebZD/ 1HIT6x4TqES8Jsr1MQRLbEAHL9M9nPMd85BazxvNdvAG3AwgATPjaPe8HpNqEWKmdaEg l3EYu7WWi3ujzJXLR+ao13PYIizq0TJUXE/00aJfLYskvxD2v9yc96lkXqQquqBvs5EK GwIs4z8OJ6jE2waXigCiOWKBseFQPiuSXT6g3dRX8iDUyFaC7xVCpNFHU6woRhD1qURE 8V/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=wBaTShB5IU0mBEEDbpuS4BpyQQqt78GrIjGwByykJZU=; b=i3TeTo7UqNhkqi6hKa5S4mAqFuj3RHXGvz/GaDBewvGWWSbVKCzn7bREuIef5TBuwK uwt2NsyrU3Qibp2iEIM1ojOc3PzBO9RJbFiWAb7RAIsK2oIuOIfYRYmtI9Px5HN+E7Vc 9KV2mvLgi0vEx3mHmyNe5Sk9XyGKBJFXraS+BLMd8cG1G+ujRZvt6Ix8Ykoj18+7Y7oT p9PO56hsdWPlN5S7WcexmVMtKR62lVjwwXnK4t4/OZ2dRKdzg7cnaNRe8k6pwRbKyecJ U4+kS80/eLW6RS576sF/b5jk7t5ahbTmfXKWNLdpXd3t9jVYLKABF53GTmwf3cmpSCXX 0coQ== X-Gm-Message-State: AOAM532k1GEQ3DA6JedB0OBBcSsNaZwJCwMT9qK6JloIc0NOgWkpsEVo ug9VjOxHSMcZOIpU4clWzM725KZSAtn/OxB85CR5EDWaOs42yibEsAqEA7cWHnoqWjS+UPQCZ28 EkprAg7KLIkJftOHTQYgl51nmVcZxVZ4k3N60HmXZ9KDIH+XXdDaaqODZ8hvaHpvyiFNAj2UREJ 3B X-Google-Smtp-Source: ABdhPJylYjUtZ0+Bo3GptM9N70ExmEOk2QmOO06BtMUdsQHg/H+yKmcxo43yV7t9bNHgoeVZMzGgQea7Pk4zpwAhC+Ip X-Received: from twelve4.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:437a]) (user=jonathantanmy job=sendgmr) by 2002:a05:6214:689:: with SMTP id r9mr23123350qvz.37.1632243077064; Tue, 21 Sep 2021 09:51:17 -0700 (PDT) Date: Tue, 21 Sep 2021 09:51:04 -0700 In-Reply-To: Message-Id: Mime-Version: 1.0 References: X-Mailer: git-send-email 2.33.0.464.g1972c5931b-goog Subject: [PATCH 2/9] refs: add repo paramater to _iterator_peel() From: Jonathan Tan To: git@vger.kernel.org Cc: Jonathan Tan Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Split the ref_iterator_peel() function into two functions: one that returns information solely based on what the ref store contains (success, failure, inconclusive), and one that takes a repo parameter and accesses the object store if need be. Update the ref store's callbacks to not access the object store, and to return success/failure/inconclusive instead of a binary success/failure. This makes it explicit whether a peel attempt may access the object store of a repository. The approach taken in this commit for peeling is different from the approach taken in the parent commit for advancing: - It is complicated to reuse the repo field (which determines if an object store is ever accessed during advancing, and if yes, which object store) added to ref stores in the parent commit; the files ref store wraps the packed ref store, and it does not want the packed ref store to access any object store during advancing (as described in files_ref_iterator_begin()) - thus repo is NULL - but it wants packed ref store peeling. - Having the repo handy when peeling is not as cumbersome as it is when advancing. Firstly, the repo in this case is always non-NULL, and secondly, peeling is typically followed by reading the object, which requires the repo anyway. Signed-off-by: Jonathan Tan --- refs.c | 2 +- refs/debug.c | 9 +++++---- refs/files-backend.c | 12 +++++++----- refs/iterator.c | 38 +++++++++++++++++++++++++++++--------- refs/packed-backend.c | 14 ++++++++------ refs/ref-cache.c | 7 ++++--- refs/refs-internal.h | 27 ++++++++++++++++++++++----- 7 files changed, 76 insertions(+), 33 deletions(-) diff --git a/refs.c b/refs.c index 49ddcdac53..3a57893032 100644 --- a/refs.c +++ b/refs.c @@ -2012,7 +2012,7 @@ int peel_iterated_oid(const struct object_id *base, struct object_id *peeled) if (current_ref_iter && (current_ref_iter->oid == base || oideq(current_ref_iter->oid, base))) - return ref_iterator_peel(current_ref_iter, peeled); + return ref_iterator_peel(current_ref_iter, the_repository, peeled); return peel_object(base, peeled) ? -1 : 0; } diff --git a/refs/debug.c b/refs/debug.c index 1a7a9e11cf..7592de0a4a 100644 --- a/refs/debug.c +++ b/refs/debug.c @@ -198,13 +198,14 @@ static int debug_ref_iterator_advance(struct ref_iterator *ref_iterator) return res; } -static int debug_ref_iterator_peel(struct ref_iterator *ref_iterator, - struct object_id *peeled) +static enum ref_iterator_peel_result debug_ref_iterator_peel( + struct ref_iterator *ref_iterator, + struct object_id *peeled) { struct debug_ref_iterator *diter = (struct debug_ref_iterator *)ref_iterator; - int res = diter->iter->vtable->peel(diter->iter, peeled); - trace_printf_key(&trace_refs, "iterator_peel: %s: %d\n", diter->iter->refname, res); + enum ref_iterator_peel_result res = diter->iter->vtable->peel(diter->iter, peeled); + trace_printf_key(&trace_refs, "iterator_peel: %s: %d\n", diter->iter->refname, (int) res); return res; } diff --git a/refs/files-backend.c b/refs/files-backend.c index cd145301d0..1faab1cf66 100644 --- a/refs/files-backend.c +++ b/refs/files-backend.c @@ -757,13 +757,14 @@ static int files_ref_iterator_advance(struct ref_iterator *ref_iterator) return ok; } -static int files_ref_iterator_peel(struct ref_iterator *ref_iterator, - struct object_id *peeled) +static enum ref_iterator_peel_result files_ref_iterator_peel( + struct ref_iterator *ref_iterator, + struct object_id *peeled) { struct files_ref_iterator *iter = (struct files_ref_iterator *)ref_iterator; - return ref_iterator_peel(iter->iter0, peeled); + return ref_iterator_peel_raw(iter->iter0, peeled); } static int files_ref_iterator_abort(struct ref_iterator *ref_iterator) @@ -2105,8 +2106,9 @@ static int files_reflog_iterator_advance(struct ref_iterator *ref_iterator) return ok; } -static int files_reflog_iterator_peel(struct ref_iterator *ref_iterator, - struct object_id *peeled) +static enum ref_iterator_peel_result files_reflog_iterator_peel( + struct ref_iterator *ref_iterator, + struct object_id *peeled) { BUG("ref_iterator_peel() called for reflog_iterator"); } diff --git a/refs/iterator.c b/refs/iterator.c index 5af6554887..ee6b00a7be 100644 --- a/refs/iterator.c +++ b/refs/iterator.c @@ -29,10 +29,27 @@ int ref_iterator_advance(struct ref_iterator *ref_iterator) return ok; } +enum ref_iterator_peel_result ref_iterator_peel_raw( + struct ref_iterator *ref_iterator, + struct object_id *peeled) +{ + return ref_iterator->vtable->peel(ref_iterator, peeled); +} + int ref_iterator_peel(struct ref_iterator *ref_iterator, + struct repository *repo, struct object_id *peeled) { - return ref_iterator->vtable->peel(ref_iterator, peeled); + enum ref_iterator_peel_result result = + ref_iterator_peel_raw(ref_iterator, peeled); + + if (repo != the_repository) + /* NEEDSWORK: make peel_object() work with all repositories */ + BUG("ref_iterator_peel() can only be used with the_repository"); + if (result == REF_ITERATOR_PEEL_INCONCLUSIVE) + return peel_object(ref_iterator->oid, peeled) == PEEL_PEELED ? + 0 : -1; + return result == REF_ITERATOR_PEEL_SUCCESS ? 0 : -1; } int ref_iterator_abort(struct ref_iterator *ref_iterator) @@ -67,8 +84,9 @@ static int empty_ref_iterator_advance(struct ref_iterator *ref_iterator) return ref_iterator_abort(ref_iterator); } -static int empty_ref_iterator_peel(struct ref_iterator *ref_iterator, - struct object_id *peeled) +static enum ref_iterator_peel_result empty_ref_iterator_peel( + struct ref_iterator *ref_iterator, + struct object_id *peeled) { BUG("peel called for empty iterator"); } @@ -186,8 +204,9 @@ static int merge_ref_iterator_advance(struct ref_iterator *ref_iterator) return ITER_ERROR; } -static int merge_ref_iterator_peel(struct ref_iterator *ref_iterator, - struct object_id *peeled) +static enum ref_iterator_peel_result merge_ref_iterator_peel( + struct ref_iterator *ref_iterator, + struct object_id *peeled) { struct merge_ref_iterator *iter = (struct merge_ref_iterator *)ref_iterator; @@ -195,7 +214,7 @@ static int merge_ref_iterator_peel(struct ref_iterator *ref_iterator, if (!iter->current) { BUG("peel called before advance for merge iterator"); } - return ref_iterator_peel(*iter->current, peeled); + return ref_iterator_peel_raw(*iter->current, peeled); } static int merge_ref_iterator_abort(struct ref_iterator *ref_iterator) @@ -371,13 +390,14 @@ static int prefix_ref_iterator_advance(struct ref_iterator *ref_iterator) return ok; } -static int prefix_ref_iterator_peel(struct ref_iterator *ref_iterator, - struct object_id *peeled) +static enum ref_iterator_peel_result prefix_ref_iterator_peel( + struct ref_iterator *ref_iterator, + struct object_id *peeled) { struct prefix_ref_iterator *iter = (struct prefix_ref_iterator *)ref_iterator; - return ref_iterator_peel(iter->iter0, peeled); + return ref_iterator_peel_raw(iter->iter0, peeled); } static int prefix_ref_iterator_abort(struct ref_iterator *ref_iterator) diff --git a/refs/packed-backend.c b/refs/packed-backend.c index f52d5488b8..d258303696 100644 --- a/refs/packed-backend.c +++ b/refs/packed-backend.c @@ -872,19 +872,21 @@ static int packed_ref_iterator_advance(struct ref_iterator *ref_iterator) return ok; } -static int packed_ref_iterator_peel(struct ref_iterator *ref_iterator, - struct object_id *peeled) +static enum ref_iterator_peel_result packed_ref_iterator_peel( + struct ref_iterator *ref_iterator, + struct object_id *peeled) { struct packed_ref_iterator *iter = (struct packed_ref_iterator *)ref_iterator; if ((iter->base.flags & REF_KNOWS_PEELED)) { oidcpy(peeled, &iter->peeled); - return is_null_oid(&iter->peeled) ? -1 : 0; + return is_null_oid(&iter->peeled) ? + REF_ITERATOR_PEEL_FAILURE : REF_ITERATOR_PEEL_SUCCESS; } else if ((iter->base.flags & (REF_ISBROKEN | REF_ISSYMREF))) { - return -1; + return REF_ITERATOR_PEEL_FAILURE; } else { - return peel_object(&iter->oid, peeled) ? -1 : 0; + return REF_ITERATOR_PEEL_INCONCLUSIVE; } } @@ -1210,7 +1212,7 @@ static int write_with_updates(struct packed_ref_store *refs, /* Pass the old reference through. */ struct object_id peeled; - int peel_error = ref_iterator_peel(iter, &peeled); + int peel_error = ref_iterator_peel(iter, the_repository, &peeled); if (write_packed_entry(out, iter->refname, iter->oid, diff --git a/refs/ref-cache.c b/refs/ref-cache.c index 49d732f6db..031b613bb2 100644 --- a/refs/ref-cache.c +++ b/refs/ref-cache.c @@ -488,10 +488,11 @@ static int cache_ref_iterator_advance(struct ref_iterator *ref_iterator) } } -static int cache_ref_iterator_peel(struct ref_iterator *ref_iterator, - struct object_id *peeled) +static enum ref_iterator_peel_result cache_ref_iterator_peel( + struct ref_iterator *ref_iterator, + struct object_id *peeled) { - return peel_object(ref_iterator->oid, peeled) ? -1 : 0; + return REF_ITERATOR_PEEL_INCONCLUSIVE; } static int cache_ref_iterator_abort(struct ref_iterator *ref_iterator) diff --git a/refs/refs-internal.h b/refs/refs-internal.h index dc0ed65686..4656ef83a3 100644 --- a/refs/refs-internal.h +++ b/refs/refs-internal.h @@ -323,11 +323,26 @@ struct ref_iterator { */ int ref_iterator_advance(struct ref_iterator *ref_iterator); +enum ref_iterator_peel_result { + REF_ITERATOR_PEEL_SUCCESS, + REF_ITERATOR_PEEL_FAILURE, + REF_ITERATOR_PEEL_INCONCLUSIVE +}; + +/* + * Peel the reference currently being viewed by the iterator without + * using any information from any object store. + */ +enum ref_iterator_peel_result ref_iterator_peel_raw( + struct ref_iterator *ref_iterator, + struct object_id *peeled); + /* - * If possible, peel the reference currently being viewed by the - * iterator. Return 0 on success. + * Peel the reference currently being viewed by the iterator, using the object + * store if the ref store has insufficient information. Returns 0 upon success. */ int ref_iterator_peel(struct ref_iterator *ref_iterator, + struct repository *repo, struct object_id *peeled); /* @@ -461,10 +476,12 @@ void base_ref_iterator_free(struct ref_iterator *iter); typedef int ref_iterator_advance_fn(struct ref_iterator *ref_iterator); /* - * Peels the current ref, returning 0 for success or -1 for failure. + * Peels the current ref using only information from the ref store. If there is + * not enough information, returns REF_ITERATOR_PEEL_INCONCLUSIVE. */ -typedef int ref_iterator_peel_fn(struct ref_iterator *ref_iterator, - struct object_id *peeled); +typedef enum ref_iterator_peel_result ref_iterator_peel_fn( + struct ref_iterator *ref_iterator, + struct object_id *peeled); /* * Implementations of this function should free any resources specific From patchwork Tue Sep 21 16:51:05 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Tan X-Patchwork-Id: 12508351 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 766A8C433EF for ; Tue, 21 Sep 2021 16:51:28 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 597B161168 for ; Tue, 21 Sep 2021 16:51:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229788AbhIUQwv (ORCPT ); Tue, 21 Sep 2021 12:52:51 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41408 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229773AbhIUQwr (ORCPT ); Tue, 21 Sep 2021 12:52:47 -0400 Received: from mail-qv1-xf49.google.com (mail-qv1-xf49.google.com [IPv6:2607:f8b0:4864:20::f49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 731E0C061574 for ; Tue, 21 Sep 2021 09:51:19 -0700 (PDT) Received: by mail-qv1-xf49.google.com with SMTP id p75-20020a0c90d1000000b0037efc8547d4so77512355qvp.16 for ; Tue, 21 Sep 2021 09:51:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=5k53Oe1cPxBEVX28aZwTlKMNCC6Icjyz2KTay6HzpkU=; b=q+XBe4FPENVgTWQGzWSeM+/KNQYx+U7zyUKoqcA5wEZupl9Aznb+QzebknycPzWXES ldjZAS67N28iNVycUdxp8EQLfn5+JK/mnqHffE9T1D+QjE7RuRVZVW/yAwDpnFKflSje hgGua3+t+uoIay5dx/ePoIQHMtxTVO4Pl/MJKlaYVFJ3ugnYHaFkfBhSaJsOHSgQAvAK V8Mv85CYvUhvzEFvZkD3EVG/8Heud5PT2y3n32jKhGOCY2j1P3HRSB6t6XPcCTu6hg1e AMiVAL+a121xHNSEyoGpo4LR24nKhTSngCg3BOC2+TEjwU+xorJ5KgmQi3Ugv3U0iKz3 8Nsw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=5k53Oe1cPxBEVX28aZwTlKMNCC6Icjyz2KTay6HzpkU=; b=AmkHrOb1RVjUoe7kc3hwS/LRaGgtxBHyTnDNuJt8kjX26uqj6igwkfTrerZMB0S2WF lXb5C4GQYht9ThmbohURD21+iw0G36x6Lb13oLW3iPwXtk0o5b9cVhXOWYkwFo6OzcrI xtiggfoCwXTYEopn5DrYFKOfaDkSjeEcLBRLbD03aHyop3jcZ36g1OtNqLT+3JT/HCcK HrvMmgHKBc5TKEyyy0k7jEBa9kCUkyDOP+WFBUrnPWhzOzS+7yZ9cMCQjHkk9igfi51y cCVSzL5z+hxw1DQTvmCe/mjCYtFeRiypu2917bggAwtRbEIjdCv/dJjtYAvFTBSruiRB P5AQ== X-Gm-Message-State: AOAM5330ocE5Z9+u9GtzDmLlA/kRpKfbr7DSasiur/aJtxXfEgX7ywg7 nlewew0xKW5dFkZ96V/+TA0jSwov1jl4NioOHEmru8XtTtNK67O/shIeYXHb9AkiFwSv5XxiLTj 8QF/VSFKnEMjtLWvBKNXYdhZphBfdy8zO1MY5ztbuj7FG+ypzhldIwb8NGrcy7ZHRtHYGWyAdhw RN X-Google-Smtp-Source: ABdhPJzztxOtud01dA7Q42vOZ7WmcVBJrODlBUugcbZuSh7xLEfLgKryD4yjJnC6sHfNrnfrWx5yXVvoJ+cqhekYI/SQ X-Received: from twelve4.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:437a]) (user=jonathantanmy job=sendgmr) by 2002:a05:6214:1392:: with SMTP id g18mr2248030qvz.15.1632243078631; Tue, 21 Sep 2021 09:51:18 -0700 (PDT) Date: Tue, 21 Sep 2021 09:51:05 -0700 In-Reply-To: Message-Id: <3ed77eedb8a18a53931433eca741e27f84e51e4d.1632242495.git.jonathantanmy@google.com> Mime-Version: 1.0 References: X-Mailer: git-send-email 2.33.0.464.g1972c5931b-goog Subject: [PATCH 3/9] refs iterator: support non-the_repository advance From: Jonathan Tan To: git@vger.kernel.org Cc: Jonathan Tan Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Support repositories other than the_repository when advancing through an iterator. Signed-off-by: Jonathan Tan --- refs.c | 3 ++- refs/files-backend.c | 2 +- refs/iterator.c | 7 +------ refs/refs-internal.h | 1 + 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/refs.c b/refs.c index 3a57893032..6ed64bee1b 100644 --- a/refs.c +++ b/refs.c @@ -255,12 +255,13 @@ int refname_is_safe(const char *refname) * does not exist, emit a warning and return false. */ int ref_resolves_to_object(const char *refname, + struct repository *repo, const struct object_id *oid, unsigned int flags) { if (flags & REF_ISBROKEN) return 0; - if (!has_object_file(oid)) { + if (!repo_has_object_file(repo, oid)) { error(_("%s does not point to a valid object!"), refname); return 0; } diff --git a/refs/files-backend.c b/refs/files-backend.c index 1faab1cf66..24e5668d6c 100644 --- a/refs/files-backend.c +++ b/refs/files-backend.c @@ -1127,7 +1127,7 @@ static int should_pack_ref(const char *refname, return 0; /* Do not pack broken refs: */ - if (!ref_resolves_to_object(refname, oid, ref_flags)) + if (!ref_resolves_to_object(refname, the_repository, oid, ref_flags)) return 0; return 1; diff --git a/refs/iterator.c b/refs/iterator.c index ee6b00a7be..59048523b8 100644 --- a/refs/iterator.c +++ b/refs/iterator.c @@ -12,15 +12,10 @@ int ref_iterator_advance(struct ref_iterator *ref_iterator) { int ok; - if (ref_iterator->repo && ref_iterator->repo != the_repository) - /* - * NEEDSWORK: make ref_resolves_to_object() support - * arbitrary repositories - */ - BUG("ref_iterator->repo must be NULL or the_repository"); while ((ok = ref_iterator->vtable->advance(ref_iterator)) == ITER_OK) { if (ref_iterator->repo && !ref_resolves_to_object(ref_iterator->refname, + ref_iterator->repo, ref_iterator->oid, ref_iterator->flags)) continue; diff --git a/refs/refs-internal.h b/refs/refs-internal.h index 4656ef83a3..57ad1262ab 100644 --- a/refs/refs-internal.h +++ b/refs/refs-internal.h @@ -66,6 +66,7 @@ int refname_is_safe(const char *refname); * referred-to object does not exist, emit a warning and return false. */ int ref_resolves_to_object(const char *refname, + struct repository *repo, const struct object_id *oid, unsigned int flags); From patchwork Tue Sep 21 16:51:06 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Tan X-Patchwork-Id: 12508353 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 34493C433EF for ; Tue, 21 Sep 2021 16:51:30 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 1DFE561168 for ; Tue, 21 Sep 2021 16:51:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229889AbhIUQw5 (ORCPT ); Tue, 21 Sep 2021 12:52:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41418 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229821AbhIUQwt (ORCPT ); Tue, 21 Sep 2021 12:52:49 -0400 Received: from mail-qv1-xf49.google.com (mail-qv1-xf49.google.com [IPv6:2607:f8b0:4864:20::f49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 092F9C061757 for ; Tue, 21 Sep 2021 09:51:21 -0700 (PDT) Received: by mail-qv1-xf49.google.com with SMTP id ci14-20020a056214054e00b0037a75ff56f9so229460580qvb.23 for ; Tue, 21 Sep 2021 09:51:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=4n59XsA58rLCFYF6p+fHqDOHSxl+NBLEiF3PDDsOGo0=; b=BOW5Y5myZv9gT8NGA32XQABE5/RqgD3Ca/WjCRDqUR0uXotgG1DUV/Jxw4w6tr8lqT jQq8AHxZKyYcGAF7ifSsjeHJj61sHxXUhAucz6bGZ9caAtslGfHGJvcJMwyQACcBOalM p67D20AFGBrbTcu2hm/UsQMEJ1lg0OyH61h+AChrqcazHxGpOu3JAvtTAzlaTf5y9T0o k7pGBrcji+nNHEOUOuBIlJ6NL6U+C+BzWplXe+QCqkmBQgP2Np4dIOufMdfhQNz9NNW+ iRYhX6HFpy3dR2YFubuIaIxYUkvigiKaua7imC+B1IGdGZ3UJts442IDKangJx2KkfsP TjSA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=4n59XsA58rLCFYF6p+fHqDOHSxl+NBLEiF3PDDsOGo0=; b=g5w71AR8GzGi8wtaJY/atqSbxKY39NxyxyISwXsaEddZ3D1OcDGRyDHzYhXnXJev4s v4unpuOUpRbwx8M7GydU6kscZQYYOIlq7h0FzI5skDuEamNRGliDapQ1PLPZ12/DKzYs ZXBz7d+0KU4jodURPtYoZ+W0wgKiCZfnyX2tRZrh7oKS/H2Bd+IxGDuTcxDNo711T2NH qrC2mb4V9bdOnLY7n8XaJINT5G+HAVK2SfCjzeGGRY5s8EwzB519KVLkaXlQpycms6Xa z/KYRiqSDjygEdzL8n9zdOu4Ju0Mrl8csujiIhhrWL9pUUIKk0ds1AgWkJyX9RTb0C2/ 7Cgg== X-Gm-Message-State: AOAM533waRH+sEbqQgKwUPxhlutacCxxn4qBFU40hsm4ncue559cB6rd 4Xh1BOU3R3sFgDw2/judPDRRVkEHfrTjG+uQb2Ccf/iLaLb+3Wop1GCeGzTVrGD7FEXpj0GglPA InZJcNnmztbZlT7K4ywQTLugRMNpLayp1NWa5/kCLjhyJEFt4EztGB7+2UFwedRFtLmXmlY0db6 BU X-Google-Smtp-Source: ABdhPJyHQ/J4HNhmsxs/BsB4Kp7UNeqho6z7SknmHNmhVSMPHOor3hBRbo+RPMWPtyv5o+fErxGxujKtbqo5cGm3MZ3U X-Received: from twelve4.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:437a]) (user=jonathantanmy job=sendgmr) by 2002:a05:6214:153:: with SMTP id x19mr31489938qvs.18.1632243080072; Tue, 21 Sep 2021 09:51:20 -0700 (PDT) Date: Tue, 21 Sep 2021 09:51:06 -0700 In-Reply-To: Message-Id: Mime-Version: 1.0 References: X-Mailer: git-send-email 2.33.0.464.g1972c5931b-goog Subject: [PATCH 4/9] refs: teach refs_for_each_ref() arbitrary repos From: Jonathan Tan To: git@vger.kernel.org Cc: Jonathan Tan Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org A subsequent patch needs to perform a revision walk with --all. As seen from handle_revision_pseudo_opt() in revision.c, refs_for_each_ref() needs to be updated to take a repository struct and pass it to the underlying ref iterator mechanism. This is so that refs can be checked if they resolve to an existing object and in doing so, non-resolving refs can be skipped over. (refs_head_ref() doesn't seem to read any objects and doesn't need this treatment.) Update refs_for_each_ref() accordingly. Now that get_main_ref_store() can take repositories other than the_repository, ensure that it sets the correct flags according to the repository passed as an argument. The signatures of some other functions need to be changed too for consistency (because of handle_refs() in revision.c), so do that in this patch too. Signed-off-by: Jonathan Tan --- builtin/submodule--helper.c | 16 ++++++++++------ object-name.c | 4 ++-- refs.c | 34 ++++++++++++++++++---------------- refs.h | 10 +++++----- revision.c | 12 ++++++------ submodule.c | 10 ++++++++-- 6 files changed, 49 insertions(+), 37 deletions(-) diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c index 6718f202db..1cc43adfd1 100644 --- a/builtin/submodule--helper.c +++ b/builtin/submodule--helper.c @@ -827,15 +827,16 @@ static void status_submodule(const char *path, const struct object_id *ce_oid, displaypath); } else if (!(flags & OPT_CACHED)) { struct object_id oid; - struct ref_store *refs = get_submodule_ref_store(path); + struct repository subrepo; - if (!refs) { + if (repo_submodule_init(&subrepo, the_repository, path, null_oid())) { print_status(flags, '-', path, ce_oid, displaypath); goto cleanup; } - if (refs_head_ref(refs, handle_submodule_head_ref, &oid)) + if (refs_head_ref(&subrepo, handle_submodule_head_ref, &oid)) die(_("could not resolve HEAD ref inside the " "submodule '%s'"), path); + repo_clear(&subrepo); print_status(flags, '+', path, &oid, displaypath); } else { @@ -1044,9 +1045,12 @@ static void generate_submodule_summary(struct summary_cb *info, if (!info->cached && oideq(&p->oid_dst, null_oid())) { if (S_ISGITLINK(p->mod_dst)) { - struct ref_store *refs = get_submodule_ref_store(p->sm_path); - if (refs) - refs_head_ref(refs, handle_submodule_head_ref, &p->oid_dst); + struct repository subrepo; + + if (!repo_submodule_init(&subrepo, the_repository, p->sm_path, null_oid())) { + refs_head_ref(&subrepo, handle_submodule_head_ref, &p->oid_dst); + repo_clear(&subrepo); + } } else if (S_ISLNK(p->mod_dst) || S_ISREG(p->mod_dst)) { struct stat st; int fd = open(p->sm_path, O_RDONLY); diff --git a/object-name.c b/object-name.c index 3263c19457..00df1c8ddb 100644 --- a/object-name.c +++ b/object-name.c @@ -1822,8 +1822,8 @@ static enum get_oid_result get_oid_with_context_1(struct repository *repo, cb.repo = repo; cb.list = &list; - refs_for_each_ref(get_main_ref_store(repo), handle_one_ref, &cb); - refs_head_ref(get_main_ref_store(repo), handle_one_ref, &cb); + refs_for_each_ref(repo, handle_one_ref, &cb); + refs_head_ref(repo, handle_one_ref, &cb); commit_list_sort_by_date(&list); return get_oid_oneline(repo, name + 2, oid, list); } diff --git a/refs.c b/refs.c index 6ed64bee1b..c04b2c1462 100644 --- a/refs.c +++ b/refs.c @@ -408,34 +408,34 @@ void warn_dangling_symrefs(FILE *fp, const char *msg_fmt, const struct string_li for_each_rawref(warn_if_dangling_symref, &data); } -int refs_for_each_tag_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data) +int refs_for_each_tag_ref(struct repository *repo, each_ref_fn fn, void *cb_data) { - return refs_for_each_ref_in(refs, "refs/tags/", fn, cb_data); + return refs_for_each_ref_in(get_main_ref_store(repo), "refs/tags/", fn, cb_data); } int for_each_tag_ref(each_ref_fn fn, void *cb_data) { - return refs_for_each_tag_ref(get_main_ref_store(the_repository), fn, cb_data); + return refs_for_each_tag_ref(the_repository, fn, cb_data); } -int refs_for_each_branch_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data) +int refs_for_each_branch_ref(struct repository *repo, each_ref_fn fn, void *cb_data) { - return refs_for_each_ref_in(refs, "refs/heads/", fn, cb_data); + return refs_for_each_ref_in(get_main_ref_store(repo), "refs/heads/", fn, cb_data); } int for_each_branch_ref(each_ref_fn fn, void *cb_data) { - return refs_for_each_branch_ref(get_main_ref_store(the_repository), fn, cb_data); + return refs_for_each_branch_ref(the_repository, fn, cb_data); } -int refs_for_each_remote_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data) +int refs_for_each_remote_ref(struct repository *repo, each_ref_fn fn, void *cb_data) { - return refs_for_each_ref_in(refs, "refs/remotes/", fn, cb_data); + return refs_for_each_ref_in(get_main_ref_store(repo), "refs/remotes/", fn, cb_data); } int for_each_remote_ref(each_ref_fn fn, void *cb_data) { - return refs_for_each_remote_ref(get_main_ref_store(the_repository), fn, cb_data); + return refs_for_each_remote_ref(the_repository, fn, cb_data); } int head_ref_namespaced(each_ref_fn fn, void *cb_data) @@ -1395,12 +1395,12 @@ int refs_rename_ref_available(struct ref_store *refs, return ok; } -int refs_head_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data) +int refs_head_ref(struct repository *repo, each_ref_fn fn, void *cb_data) { struct object_id oid; int flag; - if (!refs_read_ref_full(refs, "HEAD", RESOLVE_REF_READING, + if (!refs_read_ref_full(get_main_ref_store(repo), "HEAD", RESOLVE_REF_READING, &oid, &flag)) return fn("HEAD", &oid, flag, cb_data); @@ -1409,7 +1409,7 @@ int refs_head_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data) int head_ref(each_ref_fn fn, void *cb_data) { - return refs_head_ref(get_main_ref_store(the_repository), fn, cb_data); + return refs_head_ref(the_repository, fn, cb_data); } struct ref_iterator *refs_ref_iterator_begin( @@ -1498,14 +1498,14 @@ static int do_for_each_ref(struct ref_store *refs, const char *prefix, do_for_each_ref_helper, &hp); } -int refs_for_each_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data) +int refs_for_each_ref(struct repository *repo, each_ref_fn fn, void *cb_data) { - return do_for_each_ref(refs, "", fn, 0, the_repository, 0, cb_data); + return do_for_each_ref(get_main_ref_store(repo), "", fn, 0, repo, 0, cb_data); } int for_each_ref(each_ref_fn fn, void *cb_data) { - return refs_for_each_ref(get_main_ref_store(the_repository), fn, cb_data); + return refs_for_each_ref(the_repository, fn, cb_data); } int refs_for_each_ref_in(struct ref_store *refs, const char *prefix, @@ -1896,13 +1896,15 @@ static struct ref_store *ref_store_init(const char *gitdir, struct ref_store *get_main_ref_store(struct repository *r) { + unsigned flags = r == the_repository ? + REF_STORE_ALL_CAPS : REF_STORE_READ | REF_STORE_ODB; if (r->refs_private) return r->refs_private; if (!r->gitdir) BUG("attempting to get main_ref_store outside of repository"); - r->refs_private = ref_store_init(r->gitdir, REF_STORE_ALL_CAPS); + r->refs_private = ref_store_init(r->gitdir, flags); r->refs_private = maybe_debug_wrap_ref_store(r->gitdir, r->refs_private); return r->refs_private; } diff --git a/refs.h b/refs.h index 48970dfc7e..b53cae717d 100644 --- a/refs.h +++ b/refs.h @@ -316,17 +316,17 @@ typedef int each_repo_ref_fn(struct repository *r, * modifies the reference also returns a nonzero value to immediately * stop the iteration. Returned references are sorted. */ -int refs_head_ref(struct ref_store *refs, +int refs_head_ref(struct repository *repo, each_ref_fn fn, void *cb_data); -int refs_for_each_ref(struct ref_store *refs, +int refs_for_each_ref(struct repository *repo, each_ref_fn fn, void *cb_data); int refs_for_each_ref_in(struct ref_store *refs, const char *prefix, each_ref_fn fn, void *cb_data); -int refs_for_each_tag_ref(struct ref_store *refs, +int refs_for_each_tag_ref(struct repository *repo, each_ref_fn fn, void *cb_data); -int refs_for_each_branch_ref(struct ref_store *refs, +int refs_for_each_branch_ref(struct repository *repo, each_ref_fn fn, void *cb_data); -int refs_for_each_remote_ref(struct ref_store *refs, +int refs_for_each_remote_ref(struct repository *repo, each_ref_fn fn, void *cb_data); /* just iterates the head ref. */ diff --git a/revision.c b/revision.c index 31fc1884d2..ec9baf9508 100644 --- a/revision.c +++ b/revision.c @@ -1567,7 +1567,7 @@ void add_ref_exclusion(struct string_list **ref_excludes_p, const char *exclude) static void handle_refs(struct ref_store *refs, struct rev_info *revs, unsigned flags, - int (*for_each)(struct ref_store *, each_ref_fn, void *)) + int (*for_each)(struct repository *, each_ref_fn, void *)) { struct all_refs_cb cb; @@ -1577,7 +1577,7 @@ static void handle_refs(struct ref_store *refs, } init_all_refs_cb(&cb, revs, flags); - for_each(refs, handle_one_ref, &cb); + for_each(revs->repo, handle_one_ref, &cb); } static void handle_one_reflog_commit(struct object_id *oid, void *cb_data) @@ -2551,14 +2551,14 @@ static int for_each_bisect_ref(struct ref_store *refs, each_ref_fn fn, return status; } -static int for_each_bad_bisect_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data) +static int for_each_bad_bisect_ref(struct repository *repo, each_ref_fn fn, void *cb_data) { - return for_each_bisect_ref(refs, fn, cb_data, term_bad); + return for_each_bisect_ref(get_main_ref_store(repo), fn, cb_data, term_bad); } -static int for_each_good_bisect_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data) +static int for_each_good_bisect_ref(struct repository *repo, each_ref_fn fn, void *cb_data) { - return for_each_bisect_ref(refs, fn, cb_data, term_good); + return for_each_bisect_ref(get_main_ref_store(repo), fn, cb_data, term_good); } static int handle_revision_pseudo_opt(struct rev_info *revs, diff --git a/submodule.c b/submodule.c index ecda0229af..bdaeb72e08 100644 --- a/submodule.c +++ b/submodule.c @@ -92,8 +92,14 @@ int is_staging_gitmodules_ok(struct index_state *istate) static int for_each_remote_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data) { - return refs_for_each_remote_ref(get_submodule_ref_store(submodule), - fn, cb_data); + struct repository subrepo; + int ret; + + if (repo_submodule_init(&subrepo, the_repository, submodule, null_oid())) + return 0; + ret = refs_for_each_remote_ref(&subrepo, fn, cb_data); + repo_clear(&subrepo); + return ret; } /* From patchwork Tue Sep 21 16:51:07 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Tan X-Patchwork-Id: 12508355 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.2 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id ED1E8C433F5 for ; Tue, 21 Sep 2021 16:51:30 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id D35EE611C5 for ; Tue, 21 Sep 2021 16:51:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229833AbhIUQw6 (ORCPT ); Tue, 21 Sep 2021 12:52:58 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41430 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229827AbhIUQwu (ORCPT ); Tue, 21 Sep 2021 12:52:50 -0400 Received: from mail-pf1-x449.google.com (mail-pf1-x449.google.com [IPv6:2607:f8b0:4864:20::449]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6B6EDC061574 for ; Tue, 21 Sep 2021 09:51:22 -0700 (PDT) Received: by mail-pf1-x449.google.com with SMTP id v206-20020a627ad7000000b0043e010e5392so38124pfc.1 for ; Tue, 21 Sep 2021 09:51:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=6/+0f8JDOAEVdbdXaTV1+hoWjLFcXUrCQTK555FD/Ak=; b=Pqz8iSFBmXBLv4VonDxoA1uZs53u7SJAnR354SELwc7M/t1gCHIBfPJGiDWX0zzgJ/ X27XbfvcfiZ5lCD5/DlA/zAHX/aYCb41RU4cavXhO47s1ve3vcBdd0/Kbz/H6AfqxrIk dvGnzhaT1JLkZhtkY3l4k0SRSBWow6goKj8mk5UDMNlCDZdXZWREVev7pXfjSdbqK6Py H51cazIwlB7yM6gwXt/X12H9L2cdzYLA2BMkN7on0ep4bM7nygfz10GN52ZrePpAFSnw PDUh6p4RileGBCogEr5syFqqJHNjdUj6yhylkMn8DW7G7m+PS6GwVjjXH/psWfq7L4PM 5HfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=6/+0f8JDOAEVdbdXaTV1+hoWjLFcXUrCQTK555FD/Ak=; b=AhSff3jw5U3t6ntNb51K21jzcR7R3B8EN9tBFVcrMbcvFaizTJq/d6A6kwFfs5ufm1 VnYIMfnk4HduhftapbHlJGEcEBNPm5A2U49aF3TbYOFHIDgxjdNKkHhtIQBfLzWOUwzU 6LDzxGVocoJufrj+xv9oQPOf3AdUepPnYduEKBWBELBXuxaR4YFBJJIdlPJu5R/mWqE5 XFXrSN+Ss1WpgFeU3dcwrUfKA9OiNiOVXApYBSpkUaSvFIPjLu5M1dg/o7tSvUY1hrtk XIiHmxY2UOK4bcsI332dKq/3/DSRmdMIWemBx0aZzZkwykiLDnShIDt9nUkxuQA//eTC 9Rlw== X-Gm-Message-State: AOAM531rAtv7D6NS1rZvf7izLQUx0oDrffJAJuZGWHWzf6FmaJAmALi3 svyNivQupsdVKN0syuM0QiZsLo9N1aHzASidkyt+UjruM8X9cAh3kDno7Ws6/b/S6fQOQiPsbtf Do9uX9FIIGsGS0hgwLEGfHszNKzxlucHZ8omZOUul8YJfwsSKaZALk7w0cQr6WckMi+yTiBQjRo qE X-Google-Smtp-Source: ABdhPJwSeZgFnG2vlxug+/6j7q8/CmdAhwE7wcYmHfj+6Af4Dug18WNOLjgUoriKHSFgL2/zhvMHX3m20crywEBuk+bU X-Received: from twelve4.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:437a]) (user=jonathantanmy job=sendgmr) by 2002:a05:6a00:8d4:b0:447:cfd7:1b6a with SMTP id s20-20020a056a0008d400b00447cfd71b6amr8271501pfu.28.1632243081793; Tue, 21 Sep 2021 09:51:21 -0700 (PDT) Date: Tue, 21 Sep 2021 09:51:07 -0700 In-Reply-To: Message-Id: <0655a321bd9630736d6853437cc8d11a5cd012b6.1632242495.git.jonathantanmy@google.com> Mime-Version: 1.0 References: X-Mailer: git-send-email 2.33.0.464.g1972c5931b-goog Subject: [PATCH 5/9] merge-{ort,recursive}: remove add_submodule_odb() From: Jonathan Tan To: git@vger.kernel.org Cc: Jonathan Tan Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org After the parent commit and some of its ancestors, the only place commits are being accessed through alternates are in the user-facing message formatting code. Fix those, and remove the add_submodule_odb() calls. Signed-off-by: Jonathan Tan Reviewed-by: Elijah Newren --- merge-ort.c | 18 ++++------------- merge-recursive.c | 41 +++++++++++++++++++------------------- strbuf.c | 12 ++++++++--- strbuf.h | 6 ++++-- t/t6437-submodule-merge.sh | 3 +++ 5 files changed, 40 insertions(+), 40 deletions(-) diff --git a/merge-ort.c b/merge-ort.c index b8efaee8e0..a4aad8f33f 100644 --- a/merge-ort.c +++ b/merge-ort.c @@ -628,6 +628,7 @@ static int err(struct merge_options *opt, const char *err, ...) static void format_commit(struct strbuf *sb, int indent, + struct repository *repo, struct commit *commit) { struct merge_remote_desc *desc; @@ -641,7 +642,7 @@ static void format_commit(struct strbuf *sb, return; } - format_commit_message(commit, "%h %s", sb, &ctx); + repo_format_commit_message(repo, commit, "%h %s", sb, &ctx); strbuf_addch(sb, '\n'); } @@ -1566,17 +1567,6 @@ static int merge_submodule(struct merge_options *opt, if (is_null_oid(b)) return 0; - /* - * NEEDSWORK: Remove this when all submodule object accesses are - * through explicitly specified repositores. - */ - if (add_submodule_odb(path)) { - path_msg(opt, path, 0, - _("Failed to merge submodule %s (not checked out)"), - path); - return 0; - } - if (repo_submodule_init(&subrepo, opt->repo, path, null_oid())) { path_msg(opt, path, 0, _("Failed to merge submodule %s (not checked out)"), @@ -1641,7 +1631,7 @@ static int merge_submodule(struct merge_options *opt, break; case 1: - format_commit(&sb, 4, + format_commit(&sb, 4, &subrepo, (struct commit *)merges.objects[0].item); path_msg(opt, path, 0, _("Failed to merge submodule %s, but a possible merge " @@ -1658,7 +1648,7 @@ static int merge_submodule(struct merge_options *opt, break; default: for (i = 0; i < merges.nr; i++) - format_commit(&sb, 4, + format_commit(&sb, 4, &subrepo, (struct commit *)merges.objects[i].item); path_msg(opt, path, 0, _("Failed to merge submodule %s, but multiple " diff --git a/merge-recursive.c b/merge-recursive.c index fc8ac39d8c..6e8fb39315 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -337,7 +337,9 @@ static void output(struct merge_options *opt, int v, const char *fmt, ...) flush_output(opt); } -static void output_commit_title(struct merge_options *opt, struct commit *commit) +static void repo_output_commit_title(struct merge_options *opt, + struct repository *repo, + struct commit *commit) { struct merge_remote_desc *desc; @@ -346,23 +348,29 @@ static void output_commit_title(struct merge_options *opt, struct commit *commit if (desc) strbuf_addf(&opt->obuf, "virtual %s\n", desc->name); else { - strbuf_add_unique_abbrev(&opt->obuf, &commit->object.oid, - DEFAULT_ABBREV); + strbuf_repo_add_unique_abbrev(&opt->obuf, repo, + &commit->object.oid, + DEFAULT_ABBREV); strbuf_addch(&opt->obuf, ' '); - if (parse_commit(commit) != 0) + if (repo_parse_commit(repo, commit) != 0) strbuf_addstr(&opt->obuf, _("(bad commit)\n")); else { const char *title; - const char *msg = get_commit_buffer(commit, NULL); + const char *msg = repo_get_commit_buffer(repo, commit, NULL); int len = find_commit_subject(msg, &title); if (len) strbuf_addf(&opt->obuf, "%.*s\n", len, title); - unuse_commit_buffer(commit, msg); + repo_unuse_commit_buffer(repo, commit, msg); } } flush_output(opt); } +static void output_commit_title(struct merge_options *opt, struct commit *commit) +{ + repo_output_commit_title(opt, the_repository, commit); +} + static int add_cacheinfo(struct merge_options *opt, const struct diff_filespec *blob, const char *path, int stage, int refresh, int options) @@ -1152,14 +1160,14 @@ static int find_first_merges(struct repository *repo, return result->nr; } -static void print_commit(struct commit *commit) +static void print_commit(struct repository *repo, struct commit *commit) { struct strbuf sb = STRBUF_INIT; struct pretty_print_context ctx = {0}; ctx.date_mode.type = DATE_NORMAL; /* FIXME: Merge this with output_commit_title() */ assert(!merge_remote_util(commit)); - format_commit_message(commit, " %h: %m %s", &sb, &ctx); + repo_format_commit_message(repo, commit, " %h: %m %s", &sb, &ctx); fprintf(stderr, "%s\n", sb.buf); strbuf_release(&sb); } @@ -1199,15 +1207,6 @@ static int merge_submodule(struct merge_options *opt, if (is_null_oid(b)) return 0; - /* - * NEEDSWORK: Remove this when all submodule object accesses are - * through explicitly specified repositores. - */ - if (add_submodule_odb(path)) { - output(opt, 1, _("Failed to merge submodule %s (not checked out)"), path); - return 0; - } - if (repo_submodule_init(&subrepo, opt->repo, path, null_oid())) { output(opt, 1, _("Failed to merge submodule %s (not checked out)"), path); return 0; @@ -1232,7 +1231,7 @@ static int merge_submodule(struct merge_options *opt, oidcpy(result, b); if (show(opt, 3)) { output(opt, 3, _("Fast-forwarding submodule %s to the following commit:"), path); - output_commit_title(opt, commit_b); + repo_output_commit_title(opt, &subrepo, commit_b); } else if (show(opt, 2)) output(opt, 2, _("Fast-forwarding submodule %s"), path); else @@ -1245,7 +1244,7 @@ static int merge_submodule(struct merge_options *opt, oidcpy(result, a); if (show(opt, 3)) { output(opt, 3, _("Fast-forwarding submodule %s to the following commit:"), path); - output_commit_title(opt, commit_a); + repo_output_commit_title(opt, &subrepo, commit_a); } else if (show(opt, 2)) output(opt, 2, _("Fast-forwarding submodule %s"), path); else @@ -1277,7 +1276,7 @@ static int merge_submodule(struct merge_options *opt, case 1: output(opt, 1, _("Failed to merge submodule %s (not fast-forward)"), path); output(opt, 2, _("Found a possible merge resolution for the submodule:\n")); - print_commit((struct commit *) merges.objects[0].item); + print_commit(&subrepo, (struct commit *) merges.objects[0].item); output(opt, 2, _( "If this is correct simply add it to the index " "for example\n" @@ -1290,7 +1289,7 @@ static int merge_submodule(struct merge_options *opt, default: output(opt, 1, _("Failed to merge submodule %s (multiple merges found)"), path); for (i = 0; i < merges.nr; i++) - print_commit((struct commit *) merges.objects[i].item); + print_commit(&subrepo, (struct commit *) merges.objects[i].item); } object_array_clear(&merges); diff --git a/strbuf.c b/strbuf.c index c8a5789694..b22e981655 100644 --- a/strbuf.c +++ b/strbuf.c @@ -1059,15 +1059,21 @@ void strbuf_addftime(struct strbuf *sb, const char *fmt, const struct tm *tm, strbuf_setlen(sb, sb->len + len); } -void strbuf_add_unique_abbrev(struct strbuf *sb, const struct object_id *oid, - int abbrev_len) +void strbuf_repo_add_unique_abbrev(struct strbuf *sb, struct repository *repo, + const struct object_id *oid, int abbrev_len) { int r; strbuf_grow(sb, GIT_MAX_HEXSZ + 1); - r = find_unique_abbrev_r(sb->buf + sb->len, oid, abbrev_len); + r = repo_find_unique_abbrev_r(repo, sb->buf + sb->len, oid, abbrev_len); strbuf_setlen(sb, sb->len + r); } +void strbuf_add_unique_abbrev(struct strbuf *sb, const struct object_id *oid, + int abbrev_len) +{ + strbuf_repo_add_unique_abbrev(sb, the_repository, oid, abbrev_len); +} + /* * Returns the length of a line, without trailing spaces. * diff --git a/strbuf.h b/strbuf.h index 5b1113abf8..2d9e01c16f 100644 --- a/strbuf.h +++ b/strbuf.h @@ -634,8 +634,10 @@ void strbuf_list_free(struct strbuf **list); * Add the abbreviation, as generated by find_unique_abbrev, of `sha1` to * the strbuf `sb`. */ -void strbuf_add_unique_abbrev(struct strbuf *sb, - const struct object_id *oid, +struct repository; +void strbuf_repo_add_unique_abbrev(struct strbuf *sb, struct repository *repo, + const struct object_id *oid, int abbrev_len); +void strbuf_add_unique_abbrev(struct strbuf *sb, const struct object_id *oid, int abbrev_len); /** diff --git a/t/t6437-submodule-merge.sh b/t/t6437-submodule-merge.sh index e5e89c2045..178413c22f 100755 --- a/t/t6437-submodule-merge.sh +++ b/t/t6437-submodule-merge.sh @@ -5,6 +5,9 @@ test_description='merging with submodules' GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME +GIT_TEST_FATAL_REGISTER_SUBMODULE_ODB=1 +export GIT_TEST_FATAL_REGISTER_SUBMODULE_ODB + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-merge.sh From patchwork Tue Sep 21 16:51:08 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Tan X-Patchwork-Id: 12508357 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id CD4EFC433EF for ; Tue, 21 Sep 2021 16:51:32 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id A7184611C5 for ; Tue, 21 Sep 2021 16:51:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229846AbhIUQxA (ORCPT ); Tue, 21 Sep 2021 12:53:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41446 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229834AbhIUQwz (ORCPT ); Tue, 21 Sep 2021 12:52:55 -0400 Received: from mail-qt1-x849.google.com (mail-qt1-x849.google.com [IPv6:2607:f8b0:4864:20::849]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3B948C061760 for ; Tue, 21 Sep 2021 09:51:24 -0700 (PDT) Received: by mail-qt1-x849.google.com with SMTP id o9-20020ac80249000000b002a0c9fd54d5so219703984qtg.4 for ; Tue, 21 Sep 2021 09:51:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=t9cwlG+FrGgkn5xv3ucIAw4oOscV1kNAZh0tFZOztbE=; b=QrOivPt1bp2rORltM4vpsut6RGW5noaUsY0ChETjHiss1oXppsmen3CWoAzKTBX4V1 LZtp0JRTDbn5oLAm+WjsYAKRgWFm9BPbhe/Wz23uLGHYFyxdrvBoaFzVYF+F6NDnyBUy bQ+1M0+mqy2zb9S36oi3pD8puqeiiOqZWytsw4WbWBOt4rCvpu7VDrNuoD79TLp8KTxs H0itmMA06zJIYqZS2bXccK1k1imCSs2RwYIkgu2VnfQrA/P3KHDOBDO/3dJOvGKyVCV1 vcpsid3Vfm0FePGGqDC7z+M0b6JEuxCaNIbwgLN6sZrYv29czhEpHV6+YHkXeZ3dFitG xeYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=t9cwlG+FrGgkn5xv3ucIAw4oOscV1kNAZh0tFZOztbE=; b=hRtOxhV4Nce10JqEVD+qLXbtwYW3RtiM2NitJiaWL9KFdgr+l0GkiR3quSboXqHXdN 0nEJlTDjkyrT6v1Ysh5qR5GQm9E9OfvmTGq0i+ZCA+5M7Gb1T54oCfWsOvWwQpn4MJrD 7CLD76ExV+Hr2Bpe2R73B1bKgVJpQkijMwo4CZMw6MhBJO3msjPBNMfm83MkQmuVyXx7 Eul39qOuY8g8v5sVkcBLCtj2mfsHjs9Dc5ygab2qhsyMwbjZS5xaoWYkNIQ7CPab+dXg 4i08iabInwbL7+LVXzowEysiHsKnh8WoFXDzAjkMfAhwtW8cmDjdkBzWUgUvE6UZDep7 Zulw== X-Gm-Message-State: AOAM532iti33dkQk0N1VcIMePueKznh5orVzRsiIsuZjZB6Rg/7YUNgX QdoaIOX6X0K3b+XLyWgC0WOpngEgyOp0awypl9hw308P585rExh1gJdCs9IbG3oatQrax3hnhGp Vuf3duQoFiA11MWg7r+V6j4xEin7zlsWQnl6BZxtrB8kBD1RjucWF8C25BLUvdGinfrfQqS4FgJ BN X-Google-Smtp-Source: ABdhPJw1vFnL5DOqk1QEOG5SCkf9etm+JelGF04Uv1PXh7DeOwPeyWtsdJ72hgaLMz11gfJkajKo7HNeZ5dRAu2pNoEt X-Received: from twelve4.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:437a]) (user=jonathantanmy job=sendgmr) by 2002:a05:6214:1474:: with SMTP id c20mr31643423qvy.14.1632243083366; Tue, 21 Sep 2021 09:51:23 -0700 (PDT) Date: Tue, 21 Sep 2021 09:51:08 -0700 In-Reply-To: Message-Id: Mime-Version: 1.0 References: X-Mailer: git-send-email 2.33.0.464.g1972c5931b-goog Subject: [PATCH 6/9] object-file: only register submodule ODB if needed From: Jonathan Tan To: git@vger.kernel.org Cc: Jonathan Tan Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org In a35e03dee0 ("submodule: lazily add submodule ODBs as alternates", 2021-09-08), Git was taught to add all known submodule ODBs as alternates when attempting to read an object that doesn't exist, as a fallback for when a submodule object is read as if it were in the_repository. However, this behavior wasn't restricted to happen only when reading from the_repository. Fix this. Signed-off-by: Jonathan Tan --- object-file.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/object-file.c b/object-file.c index 621b121bcb..ab861dfdeb 100644 --- a/object-file.c +++ b/object-file.c @@ -1593,7 +1593,8 @@ static int do_oid_object_info_extended(struct repository *r, break; } - if (register_all_submodule_odb_as_alternates()) + if (r == the_repository && + register_all_submodule_odb_as_alternates()) /* We added some alternates; retry */ continue; From patchwork Tue Sep 21 16:51:09 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Tan X-Patchwork-Id: 12508359 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.2 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C4A0FC433F5 for ; Tue, 21 Sep 2021 16:51:33 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id B0B2D600D3 for ; Tue, 21 Sep 2021 16:51:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229884AbhIUQxB (ORCPT ); Tue, 21 Sep 2021 12:53:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41468 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229873AbhIUQw4 (ORCPT ); Tue, 21 Sep 2021 12:52:56 -0400 Received: from mail-pf1-x449.google.com (mail-pf1-x449.google.com [IPv6:2607:f8b0:4864:20::449]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6CE2BC061764 for ; Tue, 21 Sep 2021 09:51:25 -0700 (PDT) Received: by mail-pf1-x449.google.com with SMTP id m26-20020a62a21a000000b0041361973ba7so16362583pff.15 for ; Tue, 21 Sep 2021 09:51:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=QxVqJLdL9x7T+9x1SfsbuzHBfmYKfIpr6EbDbIq6+vI=; b=IWSEAQjQLcpDUH3H01UeDPcWTw53spfYKiAnSHqcM2w3qqZegZqhS54AJJ/Xcpny3F FyAViMM5YSrRlcw7mJJjjCZZukBtfBeIx/nA58vqnmONXl7uGb7+SfkjcxLSfrd1oQ2Z a+9lahfHSSL2UkXabR54Aj1ohpiNvTtC517/yZwfdD2mtzpAFLpmbMVYZi7hp30YuKEJ 2cjlFnUkqyzV6nv8rNtbvqLn09gGHFrYTOnvUA4d7uHgt0z1y97ZkycqQaiDSebbH2ig /wjmyiIQaBhlH3tYkwps7ysKoOZafLoVTETX3uD86JW8py5AC/HxbjOPwwHoGw/5Fvwy T5Vw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=QxVqJLdL9x7T+9x1SfsbuzHBfmYKfIpr6EbDbIq6+vI=; b=ylRiV194JN4OKRBKcXoqHt9xmtTIkrC5/sk04NV5+KIUY7WJljcdNGsUb9JIFhZmbw R2CsdQgpaqmbLZMFjpnVmcSfIuVtklIluPcPBK5ozU8sswj7GRcTuLlb8Fh4UkT39QE7 t3qXG//YuDaW3u4dFLY+Mc9CndGzDHaB2FOqh00Dx0/CBmz+NEq8qZaIpPga4iWYJTNB wGjpGhTc3JKjQjSBuwXLXIknkWGNLKTTC0fWy8C9UCXh22x9T8i87M+IrOzioE/I3I9q n6BJ5yuDVOwLsgBOn7X3s1mULyDRQ4YUg52DnbTvaur/OOaTRvdvFRBPzyxvjAjtr8p4 /k2w== X-Gm-Message-State: AOAM533uFhAxc2IynM76rgsQwUYs1NgBA+vj3pLyglgfmwmv13SAUBLp FUxgPImQZwUxf9n8nrnIT6/eJTcDjWwoLga0W6oqTmSqeb3h26I8UPRpOldUdvCCMHSZDIebOL9 kjCK/gRansoKPZ0Zjvx5ZaD+3FGRMG/PAjfms3TBccjMMm4RXpmhBIOhwgLWmlm+zXe6qJ1/Rd8 Gh X-Google-Smtp-Source: ABdhPJwQKk8OyxAIaJ04GyL7kleTly+mOb84lyzwzWrlw/BIaE7shvrOEEZmdZFxPe3eIFqS9Ic+BYnYb+OaC+1NIsI1 X-Received: from twelve4.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:437a]) (user=jonathantanmy job=sendgmr) by 2002:a17:902:7613:b0:13d:b35f:b4d7 with SMTP id k19-20020a170902761300b0013db35fb4d7mr9144462pll.8.1632243084778; Tue, 21 Sep 2021 09:51:24 -0700 (PDT) Date: Tue, 21 Sep 2021 09:51:09 -0700 In-Reply-To: Message-Id: <20adc937b736df67edf9533edcf96070b7724774.1632242495.git.jonathantanmy@google.com> Mime-Version: 1.0 References: X-Mailer: git-send-email 2.33.0.464.g1972c5931b-goog Subject: [PATCH 7/9] submodule: pass repo to check_has_commit() From: Jonathan Tan To: git@vger.kernel.org Cc: Jonathan Tan Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Pass the repo explicitly when calling check_has_commit() to avoid relying on add_submodule_odb(). With this commit and the parent commit, several tests no longer rely on add_submodule_odb(), so mark these tests accordingly. Signed-off-by: Jonathan Tan --- submodule.c | 16 +++++++++++++--- t/t5526-fetch-submodules.sh | 3 +++ t/t5572-pull-submodule.sh | 3 +++ t/t7418-submodule-sparse-gitmodules.sh | 3 +++ 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/submodule.c b/submodule.c index bdaeb72e08..e9757376c2 100644 --- a/submodule.c +++ b/submodule.c @@ -917,23 +917,33 @@ struct has_commit_data { static int check_has_commit(const struct object_id *oid, void *data) { struct has_commit_data *cb = data; + struct repository subrepo; + enum object_type type; - enum object_type type = oid_object_info(cb->repo, oid, NULL); + if (repo_submodule_init(&subrepo, cb->repo, cb->path, null_oid())) { + cb->result = 0; + goto cleanup; + } + + type = oid_object_info(&subrepo, oid, NULL); switch (type) { case OBJ_COMMIT: - return 0; + goto cleanup; case OBJ_BAD: /* * Object is missing or invalid. If invalid, an error message * has already been printed. */ cb->result = 0; - return 0; + goto cleanup; default: die(_("submodule entry '%s' (%s) is a %s, not a commit"), cb->path, oid_to_hex(oid), type_name(type)); } +cleanup: + repo_clear(&subrepo); + return 0; } static int submodule_has_commits(struct repository *r, diff --git a/t/t5526-fetch-submodules.sh b/t/t5526-fetch-submodules.sh index ed11569d8d..2dc75b80db 100755 --- a/t/t5526-fetch-submodules.sh +++ b/t/t5526-fetch-submodules.sh @@ -6,6 +6,9 @@ test_description='Recursive "git fetch" for submodules' GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME +GIT_TEST_FATAL_REGISTER_SUBMODULE_ODB=1 +export GIT_TEST_FATAL_REGISTER_SUBMODULE_ODB + . ./test-lib.sh pwd=$(pwd) diff --git a/t/t5572-pull-submodule.sh b/t/t5572-pull-submodule.sh index 4f92a116e1..fa6b4cca65 100755 --- a/t/t5572-pull-submodule.sh +++ b/t/t5572-pull-submodule.sh @@ -2,6 +2,9 @@ test_description='pull can handle submodules' +GIT_TEST_FATAL_REGISTER_SUBMODULE_ODB=1 +export GIT_TEST_FATAL_REGISTER_SUBMODULE_ODB + . ./test-lib.sh . "$TEST_DIRECTORY"/lib-submodule-update.sh diff --git a/t/t7418-submodule-sparse-gitmodules.sh b/t/t7418-submodule-sparse-gitmodules.sh index 3f7f271883..f87e524d6d 100755 --- a/t/t7418-submodule-sparse-gitmodules.sh +++ b/t/t7418-submodule-sparse-gitmodules.sh @@ -12,6 +12,9 @@ The test setup uses a sparse checkout, however the same scenario can be set up also by committing .gitmodules and then just removing it from the filesystem. ' +GIT_TEST_FATAL_REGISTER_SUBMODULE_ODB=1 +export GIT_TEST_FATAL_REGISTER_SUBMODULE_ODB + . ./test-lib.sh test_expect_success 'sparse checkout setup which hides .gitmodules' ' From patchwork Tue Sep 21 16:51:10 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Tan X-Patchwork-Id: 12508361 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.2 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id EE025C433F5 for ; Tue, 21 Sep 2021 16:51:36 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id D71326115A for ; Tue, 21 Sep 2021 16:51:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229935AbhIUQxE (ORCPT ); Tue, 21 Sep 2021 12:53:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41480 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229904AbhIUQw5 (ORCPT ); Tue, 21 Sep 2021 12:52:57 -0400 Received: from mail-pj1-x104a.google.com (mail-pj1-x104a.google.com [IPv6:2607:f8b0:4864:20::104a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A0F0FC0613D5 for ; Tue, 21 Sep 2021 09:51:26 -0700 (PDT) Received: by mail-pj1-x104a.google.com with SMTP id d2-20020a17090a2a4200b001994a2b5092so3379191pjg.3 for ; Tue, 21 Sep 2021 09:51:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=a1fuzx4gkeES1caU7MU1V9eOWhufggwMC/r9KdiNK58=; b=Paz7F5kUI0hyYS1+CBSA9Fzo+7uWhc+hdmY4YPYs6ZEAeP0LY2cUnhAFyaAjPE9J3n i9VowIcUUg7wIJC8xIezke+zbUutTh9uP3YJmrXApNAAJhcmYrWw4wfm5k8ERFd51t3+ dYMpswuKdAaeXrdM4yQFWljGyZrSS7PAWval3thuuAre1G4UG+5DmlaxOekxYxv6Eaxf MxERZG3xZ7oex3nJarauDrUmySmk5uQSZ/de16OXbQq0EKd24xHuTAlvGBo0YU0j774g Fyg7WflkbNHFGENFYEDYpJx9x9PPaKl6+T9cHkgpkRm3W0oMqe6CW8CoF0n8tFs3I7rZ mfLg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=a1fuzx4gkeES1caU7MU1V9eOWhufggwMC/r9KdiNK58=; b=GMSndgKTGg1C9k+CdthMJIOYKhXynuugE5Mll1SuWvNXFHeewNnbEVS9FraIONutNB 8S/6A33NCYhqc+Th+W0hytDmr2h++9L6UylaOxkEZdX8xZNy0761n8M2/v5hM1L0ms77 FLW7DeUN+n53iWw9XuC1fXerksUO+12FFRr55YVrQQhShTJQY0pTkcXPOjtQAKlfvBw1 D6Cxe/XIzumMhiX+U3gfGqcjHzLA0V0Tde1YoaHGwjhRN2teSHkueCjub/nJuqr37q7G Jvnx1FyEuTT8bWsyb4kT8JnbxlGW7HswKq7ubf4NhF8vfJf2TvRwofGfCpWBCp7x/2EN N6GQ== X-Gm-Message-State: AOAM531KJX+uVNk+1k3DdPPW03RLhExBzjl+CV5KN+TC4USMUYtONr9z vrLxoh95H1f1gXuOUSdjiyawWBI6iiDLDLlxL68ZCmhHNU45QyOUTGtXlHiuNqeB3xV4zZP6HXp ZGE7wgZKrsuWx411be4NjA4cYZiMg29QDEuxdk8Rv3CHkXA1RV1yB/I3ni/i5Dm5tVyD4YKbw8c ps X-Google-Smtp-Source: ABdhPJw9K9hPlH2YTqxRM4lO+72Q6JGyHz1dTr9SGi1Fyh3evg42CUADRvH4QX+qvFGskFIcThvBFNcrJTJaP59ET5fh X-Received: from twelve4.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:437a]) (user=jonathantanmy job=sendgmr) by 2002:a17:902:c184:b0:13c:957d:63f1 with SMTP id d4-20020a170902c18400b0013c957d63f1mr4091002pld.32.1632243086082; Tue, 21 Sep 2021 09:51:26 -0700 (PDT) Date: Tue, 21 Sep 2021 09:51:10 -0700 In-Reply-To: Message-Id: Mime-Version: 1.0 References: X-Mailer: git-send-email 2.33.0.464.g1972c5931b-goog Subject: [PATCH 8/9] refs: change refs_for_each_ref_in() to take repo From: Jonathan Tan To: git@vger.kernel.org Cc: Jonathan Tan Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Pass a repository to refs_for_each_ref_in() so that object accesses during iteration (done to skip over invalid refs) are made with the correct repository instead of relying on add_submodule_odb(). With this, the last remaining tests no longer rely on add_submodule_odb(), so mark them accordingly. The test-ref-store test helper needed to be changed to reflect the new API. For now, just pass the repository through a global variable. Signed-off-by: Jonathan Tan --- refs.c | 12 ++++++------ refs.h | 2 +- t/helper/test-ref-store.c | 20 +++++++++----------- t/t5531-deep-submodule-push.sh | 3 +++ t/t5545-push-options.sh | 3 +++ 5 files changed, 22 insertions(+), 18 deletions(-) diff --git a/refs.c b/refs.c index c04b2c1462..b011953e32 100644 --- a/refs.c +++ b/refs.c @@ -410,7 +410,7 @@ void warn_dangling_symrefs(FILE *fp, const char *msg_fmt, const struct string_li int refs_for_each_tag_ref(struct repository *repo, each_ref_fn fn, void *cb_data) { - return refs_for_each_ref_in(get_main_ref_store(repo), "refs/tags/", fn, cb_data); + return refs_for_each_ref_in(repo, "refs/tags/", fn, cb_data); } int for_each_tag_ref(each_ref_fn fn, void *cb_data) @@ -420,7 +420,7 @@ int for_each_tag_ref(each_ref_fn fn, void *cb_data) int refs_for_each_branch_ref(struct repository *repo, each_ref_fn fn, void *cb_data) { - return refs_for_each_ref_in(get_main_ref_store(repo), "refs/heads/", fn, cb_data); + return refs_for_each_ref_in(repo, "refs/heads/", fn, cb_data); } int for_each_branch_ref(each_ref_fn fn, void *cb_data) @@ -430,7 +430,7 @@ int for_each_branch_ref(each_ref_fn fn, void *cb_data) int refs_for_each_remote_ref(struct repository *repo, each_ref_fn fn, void *cb_data) { - return refs_for_each_ref_in(get_main_ref_store(repo), "refs/remotes/", fn, cb_data); + return refs_for_each_ref_in(repo, "refs/remotes/", fn, cb_data); } int for_each_remote_ref(each_ref_fn fn, void *cb_data) @@ -1508,15 +1508,15 @@ int for_each_ref(each_ref_fn fn, void *cb_data) return refs_for_each_ref(the_repository, fn, cb_data); } -int refs_for_each_ref_in(struct ref_store *refs, const char *prefix, +int refs_for_each_ref_in(struct repository *repo, const char *prefix, each_ref_fn fn, void *cb_data) { - return do_for_each_ref(refs, prefix, fn, strlen(prefix), the_repository, 0, cb_data); + return do_for_each_ref(get_main_ref_store(repo), prefix, fn, strlen(prefix), repo, 0, cb_data); } int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data) { - return refs_for_each_ref_in(get_main_ref_store(the_repository), prefix, fn, cb_data); + return refs_for_each_ref_in(the_repository, prefix, fn, cb_data); } int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data, unsigned int broken) diff --git a/refs.h b/refs.h index b53cae717d..fe290317ae 100644 --- a/refs.h +++ b/refs.h @@ -320,7 +320,7 @@ int refs_head_ref(struct repository *repo, each_ref_fn fn, void *cb_data); int refs_for_each_ref(struct repository *repo, each_ref_fn fn, void *cb_data); -int refs_for_each_ref_in(struct ref_store *refs, const char *prefix, +int refs_for_each_ref_in(struct repository *repo, const char *prefix, each_ref_fn fn, void *cb_data); int refs_for_each_tag_ref(struct repository *repo, each_ref_fn fn, void *cb_data); diff --git a/t/helper/test-ref-store.c b/t/helper/test-ref-store.c index b314b81a45..1964cb349e 100644 --- a/t/helper/test-ref-store.c +++ b/t/helper/test-ref-store.c @@ -5,6 +5,8 @@ #include "object-store.h" #include "repository.h" +static struct repository *repo; + static const char *notnull(const char *arg, const char *name) { if (!arg) @@ -24,18 +26,13 @@ static const char **get_store(const char **argv, struct ref_store **refs) if (!argv[0]) { die("ref store required"); } else if (!strcmp(argv[0], "main")) { + repo = the_repository; *refs = get_main_ref_store(the_repository); } else if (skip_prefix(argv[0], "submodule:", &gitdir)) { - struct strbuf sb = STRBUF_INIT; - int ret; - - ret = strbuf_git_path_submodule(&sb, gitdir, "objects/"); - if (ret) - die("strbuf_git_path_submodule failed: %d", ret); - add_to_alternates_memory(sb.buf); - strbuf_release(&sb); - - *refs = get_submodule_ref_store(gitdir); + repo = xmalloc(sizeof(*repo)); + if (repo_submodule_init(repo, the_repository, gitdir, null_oid())) + die("repo_submodule_init failed"); + *refs = get_main_ref_store(repo); } else if (skip_prefix(argv[0], "worktree:", &gitdir)) { struct worktree **p, **worktrees = get_worktrees(); @@ -52,6 +49,7 @@ static const char **get_store(const char **argv, struct ref_store **refs) if (!*p) die("no such worktree: %s", gitdir); + repo = the_repository; *refs = get_worktree_ref_store(*p); } else die("unknown backend %s", argv[0]); @@ -113,7 +111,7 @@ static int cmd_for_each_ref(struct ref_store *refs, const char **argv) { const char *prefix = notnull(*argv++, "prefix"); - return refs_for_each_ref_in(refs, prefix, each_ref, NULL); + return refs_for_each_ref_in(repo, prefix, each_ref, NULL); } static int cmd_resolve_ref(struct ref_store *refs, const char **argv) diff --git a/t/t5531-deep-submodule-push.sh b/t/t5531-deep-submodule-push.sh index d573ca496a..3f58b515ce 100755 --- a/t/t5531-deep-submodule-push.sh +++ b/t/t5531-deep-submodule-push.sh @@ -5,6 +5,9 @@ test_description='test push with submodules' GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME +GIT_TEST_FATAL_REGISTER_SUBMODULE_ODB=1 +export GIT_TEST_FATAL_REGISTER_SUBMODULE_ODB + . ./test-lib.sh test_expect_success setup ' diff --git a/t/t5545-push-options.sh b/t/t5545-push-options.sh index 58c7add7ee..214228349a 100755 --- a/t/t5545-push-options.sh +++ b/t/t5545-push-options.sh @@ -5,6 +5,9 @@ test_description='pushing to a repository using push options' GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME +GIT_TEST_FATAL_REGISTER_SUBMODULE_ODB=1 +export GIT_TEST_FATAL_REGISTER_SUBMODULE_ODB + . ./test-lib.sh mk_repo_pair () { From patchwork Tue Sep 21 16:51:11 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Tan X-Patchwork-Id: 12508363 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7E102C433FE for ; Tue, 21 Sep 2021 16:51:39 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 6482E61159 for ; Tue, 21 Sep 2021 16:51:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229983AbhIUQxG (ORCPT ); Tue, 21 Sep 2021 12:53:06 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41484 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229913AbhIUQw5 (ORCPT ); Tue, 21 Sep 2021 12:52:57 -0400 Received: from mail-qt1-x849.google.com (mail-qt1-x849.google.com [IPv6:2607:f8b0:4864:20::849]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 740A2C0613DE for ; Tue, 21 Sep 2021 09:51:28 -0700 (PDT) Received: by mail-qt1-x849.google.com with SMTP id e5-20020ac84905000000b002a69dc43859so54329060qtq.10 for ; Tue, 21 Sep 2021 09:51:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=HFqLEkU1/Ra2gyePyQyr5P3z6Ttngf4Jb3XsJstas8Y=; b=ew2gNDem6FrwrOWzm4KPW/T3IkZZ5PvmgYFso5XXyQJ5sHL7HUHUIcaz68josgwn7E enUgX2p/bijqES0Hm5MePoIUdqRNW3kPe4nILC9iz73FgMI58KdB1WbctmWIJz4iSbVu zsfpoeZZvLWg8jWpd+DZ0MC+2MqefbKc58m4PZ4oSy6+5msd8ZKyTNuPnZDDuFYkIhR8 jm3Jtv28U4ECRns/pkOEP1r4c4mQHuyU0854pXYRJQyUUvzh7wVobm26wW3CcCKCPccd 8EWjCS0jgledftdQDJlDjOTffD3Ye1IsuKWW0lGn22VIvSNdqAekoJlChTGkg2n3yCBJ mpww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=HFqLEkU1/Ra2gyePyQyr5P3z6Ttngf4Jb3XsJstas8Y=; b=7RZ9+qO1uDU6WjDHj+92NW/fdq+qmYIFu7gc06LoKkEKJzXeMsjtOuNy6W2O8H3Hau BRO9I9+QK4mD5cXRP2yvsaXGPxt3soKxLNewSsPbEEZvvKr2fr23PvLRU2nm87KnOcRR GtZ+yP4yOt4Uj+/xILcBDt9PnkLXgekSobRXJ60m4tYBldNKqZwRu+idDmoGXuzTGS7Y oBKuzuBo5o+OG1OJjJ9t+jnOwfNv0ekxh4kMJDNCz421VzNidcZJU7hSTVFjVX6yQ9RF O0OK2Yg6PCHBhwx+51eo0zwuaXjLj0JCOtEbrEl2NhkWaK6iBX1hhlCJHCZRkozBROg7 H6sA== X-Gm-Message-State: AOAM532kmxKDFMNsf3DLRz2DpaE9lFFT7xoBgsbquzbsSlxYTECvxVuq mLod4+1NhfXueugvFUSWMOMum/jO/+qwpM8zfKo7BjgDxpNYCUTbj2utFTNsgDNlXzwTDrU+iFO uh9c/DD/n05C3QOdSHUPoglfwc47jxmKnQCCWQMZ0bdQssnhwdWfObkCYgUiwslV8ylToSEY5+i II X-Google-Smtp-Source: ABdhPJy+JB61oS30bYuT3Flr4VjS1UAMx9BFgFKTKvVJ0OaU/Y5K58vX0fF4nJWxag7r+H6ai9f3DGRGLOS3ZF+npi0Q X-Received: from twelve4.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:437a]) (user=jonathantanmy job=sendgmr) by 2002:a05:6214:723:: with SMTP id c3mr32136692qvz.60.1632243087677; Tue, 21 Sep 2021 09:51:27 -0700 (PDT) Date: Tue, 21 Sep 2021 09:51:11 -0700 In-Reply-To: Message-Id: <933c505de862ce11f522192745dad78dd8346b99.1632242495.git.jonathantanmy@google.com> Mime-Version: 1.0 References: X-Mailer: git-send-email 2.33.0.464.g1972c5931b-goog Subject: [PATCH 9/9] submodule: trace adding submodule ODB as alternate From: Jonathan Tan To: git@vger.kernel.org Cc: Jonathan Tan Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Submodule ODBs are never added as alternates during the execution of the test suite, but there may be a rare interaction that the test suite does not have coverage of. Add a trace message when this happens, so that users who trace their commands can notice such occurrences. Signed-off-by: Jonathan Tan --- submodule.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/submodule.c b/submodule.c index e9757376c2..77e76d3f9c 100644 --- a/submodule.c +++ b/submodule.c @@ -207,6 +207,8 @@ int register_all_submodule_odb_as_alternates(void) add_to_alternates_memory(added_submodule_odb_paths.items[i].string); if (ret) { string_list_clear(&added_submodule_odb_paths, 0); + trace2_data_intmax("submodule", the_repository, + "register_all_submodule_odb_as_alternates/registered", ret); if (git_env_bool("GIT_TEST_FATAL_REGISTER_SUBMODULE_ODB", 0)) BUG("register_all_submodule_odb_as_alternates() called"); }