From patchwork Tue Jun 8 12:16:27 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= X-Patchwork-Id: 12306669 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=-15.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT 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 8086EC4743E for ; Tue, 8 Jun 2021 12:17:40 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 6D0046124C for ; Tue, 8 Jun 2021 12:17:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232430AbhFHMTc (ORCPT ); Tue, 8 Jun 2021 08:19:32 -0400 Received: from mail-wm1-f54.google.com ([209.85.128.54]:54918 "EHLO mail-wm1-f54.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232181AbhFHMTc (ORCPT ); Tue, 8 Jun 2021 08:19:32 -0400 Received: by mail-wm1-f54.google.com with SMTP id o127so1683783wmo.4 for ; Tue, 08 Jun 2021 05:17:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=UxECZp7JY34KeX2gncBgWpBtcjabFvELktQrnq8fNPc=; b=C82B64JKGYC0NVWGxOJ8ZC5f6/RCpRMnZOc0x6eqmjJDNqS6NE6bbg+bgMq7Hm2Sol b4p3lcizkhagUfObMOCDspJWcsqtCWoNchpvQQ2On7eKLn6WpyKoWiWg8SA11dNw9EQP YCYRg0BYp5jElG3HzMzFcCW5aEwIV5FLcwFx3gpDTTONaMqjuaobaW3ZZvf5lv8GIfHq K7W6sXSM+/womcSZBenZWtR/CyoHUMqU+2aMMpobGFJa8OFIlqUUyyzUEBgRlrpmbb0G DmNhIkpI8et0Buw43HvxzT0XhwIB8YzQ0tIxPmzcHnCRQ+VFsi9A6jdYDVBE9w/+oOhR M/7g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=UxECZp7JY34KeX2gncBgWpBtcjabFvELktQrnq8fNPc=; b=qtY6Nv31dPQTMDOtu8ECJoXGTdpqTaIEguSNv1YViM0dynFMCqFaM34c2Ox3wZwlDW YytK4sN97wGCkMbFig8g13ot/yBVKaLuQQZx0mrzLVjmvHMvOp+aKAHtrDagC/n3VCee KRHIl6hVuCuLpCVvVr6CY+wAa6xlqXE07dH6GQeoItxMGHA7FpLeHn/S/Sk0ialvaDOi UnG+5eUFUP/G7d6AVXmJTP3+5tE9+mNDE0EEt+kYfMNRe+gXBKAwx8tpPgfSgZHzAp4t +BbVyKiYZHnaCdJyuCCvDKZsOaozfmtU8nuUU1XUhzy8/rNbsfzcaRCMYcQ51Siq8wpl lwGw== X-Gm-Message-State: AOAM533CgYR284EeetqcB5hwjONdioVP4jo5FOtJVqOIldklcrBp9iu1 X/FKPb7wus21eLw8JiKL6Gk2orJsq8D0eQ== X-Google-Smtp-Source: ABdhPJxF/Jj5gpBrofV36UAzKIjc1nF3PcGRIPGkRCn+aMQ3NzI013XglNW+F/p32dRfbqxPfqpCoA== X-Received: by 2002:a05:600c:154f:: with SMTP id f15mr21618531wmg.22.1623154598350; Tue, 08 Jun 2021 05:16:38 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id x20sm12976378wmc.39.2021.06.08.05.16.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Jun 2021 05:16:37 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Jeff King , Jiang Xin , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBC?= =?utf-8?b?amFybWFzb24=?= Subject: [PATCH 1/4] upload-pack: run is_repository_shallow() before setup_revisions() Date: Tue, 8 Jun 2021 14:16:27 +0200 Message-Id: X-Mailer: git-send-email 2.32.0.rc3.434.gd8aed1f08a7 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Move the is_repository_shallow() added in b790e0f67cd (upload-pack: send shallow info over stdin to pack-objects, 2014-03-11) to above setup_revisions(). Running is_repository_shallow() before setup_revisions() doesn't matter now, but in subsequent commits we'll make the code that followed setup_revisions() happen inside a callback in that function. This isolated change documents that re-arranging this part of the code is OK in isolation. Signed-off-by: Ævar Arnfjörð Bjarmason --- builtin/pack-objects.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c index de00adbb9e..1fbaa34f91 100644 --- a/builtin/pack-objects.c +++ b/builtin/pack-objects.c @@ -3757,11 +3757,12 @@ static void get_object_list(int ac, const char **av) repo_init_revisions(the_repository, &revs, NULL); save_commit_buffer = 0; - setup_revisions(ac, av, &revs, &s_r_opt); /* make sure shallows are read */ is_repository_shallow(the_repository); + setup_revisions(ac, av, &revs, &s_r_opt); + save_warning = warn_on_object_refname_ambiguity; warn_on_object_refname_ambiguity = 0; From patchwork Tue Jun 8 12:16:28 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= X-Patchwork-Id: 12306635 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=-15.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT 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 9061DC47082 for ; Tue, 8 Jun 2021 12:16:53 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 79D6B61073 for ; Tue, 8 Jun 2021 12:16:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232351AbhFHMSp (ORCPT ); Tue, 8 Jun 2021 08:18:45 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58378 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231560AbhFHMSo (ORCPT ); Tue, 8 Jun 2021 08:18:44 -0400 Received: from mail-wr1-x436.google.com (mail-wr1-x436.google.com [IPv6:2a00:1450:4864:20::436]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DB1E9C061787 for ; Tue, 8 Jun 2021 05:16:40 -0700 (PDT) Received: by mail-wr1-x436.google.com with SMTP id z8so21297641wrp.12 for ; Tue, 08 Jun 2021 05:16:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=hd5NrxT3sYzOEkIdDOEzM0FYqpxg1ObNZB4s0T4HFF0=; b=SOEQGOcB/ha2ySsedbpn6DF4LCNU/+GuVKqk2xv28i7U57MTR8mpmbeOt9n/tkRMii yFvQg6gEhbDmlt4kliYngemSjHR0rnK//ZXsU5d+uFa0/WX4DUTvMICHvB05vi/re3M8 mIM1q2VTeL7vBEX3m3yTMZIA910awRXa7pU65I2GsANveb/qGAzbJ5tSywKOsZdOnUPR Di7cGb2Y03YNSY9FNCvlCKV3qiP0zLRqKwRBXluN6JTmdItyPj79vKmY6qPoe5NsDrO7 cvzij0VQGoNbodxatXsmmIFCLHxgngG8ood7xe7kb6i1uW8lrs6O03KQJ18c+d8jCy3H 72EQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=hd5NrxT3sYzOEkIdDOEzM0FYqpxg1ObNZB4s0T4HFF0=; b=bvNTHzrrrAzHGyghMDiUTD42jgsdG1CYKg2tj/2XO6+t2YQ0phuZsw/Jl42nAJQpGA u/zCA7O+rISo6CwLCy3ZxF5YupcJxuL5WkLSnVkbT4jXV8WSpT79C9X3Ktr0v4SQrY/a WQ49owwZvLeU3qv+yeK+qpHeElrjfwS8n03ajnkzguL/yUiOnxgWpLU6w1PsuprEpUIh xchzVNI1hT5jNCIpfFyb1ClVpfylGd53yjYbvGWNZWWLYai4Z7ZI92B1JamsrENm6r3r 3b35v3q6DXhUu3/ns6mscgksN3WprnK8psbiRl9U6zlaK6AVvFXdXrcXv4r5X12q7yS/ fjbg== X-Gm-Message-State: AOAM530ikXepIzHxxEjsR2jlzgWmR31XWJERzQ/uvBrtS1NFoFLN5VFv E6yOBKrHXr9fErfxSpaxD9auZNSBFvtcHg== X-Google-Smtp-Source: ABdhPJxDg9MCAsent5B0VJkeIZycnHnYpzBS+S3VlPKt7uEraA/FFmbcDao59Uxu35TZgsODPeaJJw== X-Received: by 2002:adf:ba02:: with SMTP id o2mr2946818wrg.234.1623154599105; Tue, 08 Jun 2021 05:16:39 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id x20sm12976378wmc.39.2021.06.08.05.16.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Jun 2021 05:16:38 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Jeff King , Jiang Xin , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBC?= =?utf-8?b?amFybWFzb24=?= Subject: [PATCH 2/4] revision.h: unify "disable_stdin" and "read_from_stdin" Date: Tue, 8 Jun 2021 14:16:28 +0200 Message-Id: X-Mailer: git-send-email 2.32.0.rc3.434.gd8aed1f08a7 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org In 8b3dce56508 (Teach --stdin option to "log" family, 2009-11-03) we added the "disable_stdin" flag, and then much later in a12cbe23ef7 (rev-list: make empty --stdin not an error, 2018-08-22) we gained a "read_from_stdin" flag. The interaction between these is more subtle than they might appear at first sight, as noted in a12cbe23ef7. "read_stdin" is not the inverse of "disable_stdin", rather we read stdin if we see the "--stdin" option. The "read" is intended to understood as "I read it", not "you should read it". Let's avoid this confusion by using "consume" and "consumed" instead, i.e. a word whose present and past tense isn't the same. Signed-off-by: Ævar Arnfjörð Bjarmason --- builtin/am.c | 4 ++-- builtin/blame.c | 2 +- builtin/diff-tree.c | 2 +- builtin/rev-list.c | 2 +- revision.c | 4 ++-- revision.h | 23 ++++++++++++++++++++--- sequencer.c | 4 ++-- 7 files changed, 29 insertions(+), 12 deletions(-) diff --git a/builtin/am.c b/builtin/am.c index 0b2d886c81..3a6c8455b4 100644 --- a/builtin/am.c +++ b/builtin/am.c @@ -1355,7 +1355,7 @@ static void write_commit_patch(const struct am_state *state, struct commit *comm repo_init_revisions(the_repository, &rev_info, NULL); rev_info.diff = 1; rev_info.abbrev = 0; - rev_info.disable_stdin = 1; + rev_info.stdin_handling = REV_INFO_STDIN_IGNORE; rev_info.show_root_diff = 1; rev_info.diffopt.output_format = DIFF_FORMAT_PATCH; rev_info.no_commit_id = 1; @@ -1390,7 +1390,7 @@ static void write_index_patch(const struct am_state *state) fp = xfopen(am_path(state, "patch"), "w"); repo_init_revisions(the_repository, &rev_info, NULL); rev_info.diff = 1; - rev_info.disable_stdin = 1; + rev_info.stdin_handling = REV_INFO_STDIN_IGNORE; rev_info.no_commit_id = 1; rev_info.diffopt.output_format = DIFF_FORMAT_PATCH; rev_info.diffopt.use_color = 0; diff --git a/builtin/blame.c b/builtin/blame.c index 641523ff9a..c9f66c58c4 100644 --- a/builtin/blame.c +++ b/builtin/blame.c @@ -1061,7 +1061,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix) argv[argc - 1] = "--"; } - revs.disable_stdin = 1; + revs.stdin_handling = REV_INFO_STDIN_IGNORE; setup_revisions(argc, argv, &revs, NULL); if (!revs.pending.nr && is_bare_repository()) { struct commit *head_commit; diff --git a/builtin/diff-tree.c b/builtin/diff-tree.c index f33d30d57b..fc548ebe16 100644 --- a/builtin/diff-tree.c +++ b/builtin/diff-tree.c @@ -122,7 +122,7 @@ int cmd_diff_tree(int argc, const char **argv, const char *prefix) die(_("index file corrupt")); opt->abbrev = 0; opt->diff = 1; - opt->disable_stdin = 1; + opt->stdin_handling = REV_INFO_STDIN_IGNORE; memset(&s_r_opt, 0, sizeof(s_r_opt)); s_r_opt.tweak = diff_tree_tweak_rev; diff --git a/builtin/rev-list.c b/builtin/rev-list.c index 7677b1af5a..88bd9ef954 100644 --- a/builtin/rev-list.c +++ b/builtin/rev-list.c @@ -651,7 +651,7 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix) if ((!revs.commits && reflog_walk_empty(revs.reflog_info) && (!(revs.tag_objects || revs.tree_objects || revs.blob_objects) && !revs.pending.nr) && - !revs.rev_input_given && !revs.read_from_stdin) || + !revs.rev_input_given && !revs.consumed_stdin_per_option) || revs.diff) usage(rev_list_usage); diff --git a/revision.c b/revision.c index 8140561b6c..69b3812093 100644 --- a/revision.c +++ b/revision.c @@ -2741,11 +2741,11 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s } if (!strcmp(arg, "--stdin")) { - if (revs->disable_stdin) { + if (revs->stdin_handling == REV_INFO_STDIN_IGNORE) { argv[left++] = arg; continue; } - if (revs->read_from_stdin++) + if (revs->consumed_stdin_per_option++) die("--stdin given twice?"); read_revisions_from_stdin(revs, &prune_data); continue; diff --git a/revision.h b/revision.h index 93aa012f51..03231f089f 100644 --- a/revision.h +++ b/revision.h @@ -86,6 +86,11 @@ struct rev_cmdline_info { struct oidset; struct topo_walk_info; +enum rev_info_stdin { + REV_INFO_STDIN_CONSUME_ON_OPTION = 0, + REV_INFO_STDIN_IGNORE, +}; + struct rev_info { /* Starting list */ struct commit_list *commits; @@ -114,9 +119,22 @@ struct rev_info { int rev_input_given; /* - * Whether we read from stdin due to the --stdin option. + * How should we handle seeing --stdin? + * + * Defaults to reading if we see it with + * REV_INFO_STDIN_CONSUME_ON_OPTION. + * + * Can be set to REV_INFO_STDIN_IGNORE to ignore any provided + * --stdin option. + */ + enum rev_info_stdin stdin_handling; + + /* + * Did we read from stdin due to stdin_handling == + * REV_INFO_STDIN_CONSUME_ON_OPTION and seeing the --stdin + * option? */ - int read_from_stdin; + int consumed_stdin_per_option; /* topo-sort */ enum rev_sort_order sort_order; @@ -216,7 +234,6 @@ struct rev_info { date_mode_explicit:1, preserve_subject:1, encode_email_headers:1; - unsigned int disable_stdin:1; /* --show-linear-break */ unsigned int track_linear:1, track_first_time:1, diff --git a/sequencer.c b/sequencer.c index 0bec01cf38..4e73bd79d6 100644 --- a/sequencer.c +++ b/sequencer.c @@ -3377,7 +3377,7 @@ static int make_patch(struct repository *r, log_tree_opt.abbrev = 0; log_tree_opt.diff = 1; log_tree_opt.diffopt.output_format = DIFF_FORMAT_PATCH; - log_tree_opt.disable_stdin = 1; + log_tree_opt.stdin_handling = REV_INFO_STDIN_IGNORE; log_tree_opt.no_commit_id = 1; log_tree_opt.diffopt.file = fopen(buf.buf, "w"); log_tree_opt.diffopt.use_color = GIT_COLOR_NEVER; @@ -4513,7 +4513,7 @@ static int pick_commits(struct repository *r, log_tree_opt.diff = 1; log_tree_opt.diffopt.output_format = DIFF_FORMAT_DIFFSTAT; - log_tree_opt.disable_stdin = 1; + log_tree_opt.stdin_handling = REV_INFO_STDIN_IGNORE; if (read_oneliner(&buf, rebase_path_orig_head(), 0) && !get_oid(buf.buf, &orig) && From patchwork Tue Jun 8 12:16:29 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= X-Patchwork-Id: 12306637 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=-15.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT 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 3F5ACC4743E for ; Tue, 8 Jun 2021 12:16:54 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 23C6061182 for ; Tue, 8 Jun 2021 12:16:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232421AbhFHMSq (ORCPT ); Tue, 8 Jun 2021 08:18:46 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58384 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232195AbhFHMSo (ORCPT ); Tue, 8 Jun 2021 08:18:44 -0400 Received: from mail-wr1-x42b.google.com (mail-wr1-x42b.google.com [IPv6:2a00:1450:4864:20::42b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9AEDAC061789 for ; Tue, 8 Jun 2021 05:16:41 -0700 (PDT) Received: by mail-wr1-x42b.google.com with SMTP id a20so21395825wrc.0 for ; Tue, 08 Jun 2021 05:16:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=eTOa9i2QqbP4H+KPArnwSd5NwpZd2aD21MFBSek4WhM=; b=eODidhh4qODDpAIBR7dA0QxE6uu8QAa7/RIqp2Ykj5V7woc4QkTK1vd6ykul5UUGWk SimzEoJj/7LIQe2lJEpTBL5uV376sBph5YhCzjXiTYfl0U+zMd5nuo4Z8aFRasFOK+fK YpIfIUZoPyOBHsEJBJVD0dj7NPyXAg9yr0CVE2zx8V6GmrerOD2O8tJaw86okVpdDhLZ oMpuj3zZ2ZKem44lQDxx7JEN+m+1wn09rzfFGZ2S8o2A08n5Zw7T5GB9nPVy9cjnYkzl NqmvGuFVueGN0tohScCYdrgv5/eik1uGzKWiul/YhDtll+ceT3cKkjoboJt77N1NjJC5 UvJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=eTOa9i2QqbP4H+KPArnwSd5NwpZd2aD21MFBSek4WhM=; b=BPCwvIl5Umt5CLhmKBpC6AdzOYXyqL6k8yo9gSBxpTj2kC2yCm62wpwjTbJgUcEUiM EDGeHVPe9Ug6/FOr/VPZnNeh/ocpxhQj/XXft+mejLTKbApC5/RkDeHRbhfRERxnmcyt dMsvXU9Xp26+VscQKgxeUj8sTiB9lxi1sfnRwC3edxILWObM+M2mUAVm4RvtYRCpSyyE PASWiGed6VeEapOP09Ty2UXIvc5Fv+LiLwAJLjJry6Zra/CDWRy1yoy5R0ooXj76XaN6 3nrMXeDRw+J9OhUkwpW0yF5ScB/t2vwjbUd7ng49DK6EMezv3tU/B5WTHX5p+ahKCEld 8FJg== X-Gm-Message-State: AOAM531BPdvVqAuhbXaplvVZln6RWTc2V+Ggy+HpWBebzFncwtn0qp0c iylLOWfnb/ZU1bU7zcie9mZWgluZfy6+6w== X-Google-Smtp-Source: ABdhPJxFQb17osWtNRcdDoczdvFyfy1T061vv2iAWFCS06hjPy9QDAoi/z53Z44s/vqemYBLTF+4Yw== X-Received: by 2002:adf:ea4c:: with SMTP id j12mr21801787wrn.64.1623154599867; Tue, 08 Jun 2021 05:16:39 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id x20sm12976378wmc.39.2021.06.08.05.16.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Jun 2021 05:16:39 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Jeff King , Jiang Xin , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBC?= =?utf-8?b?amFybWFzb24=?= Subject: [PATCH 3/4] pack-objects.c: do stdin parsing via revision.c's API Date: Tue, 8 Jun 2021 14:16:29 +0200 Message-Id: X-Mailer: git-send-email 2.32.0.rc3.434.gd8aed1f08a7 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Change the fgets(..., stdin) parsing in pack-objects.c to use a now-extended version of the rev_info stdin parsing API. The fgets() loop being refactored away here was first added in Linus's c323ac7d9c5 (git-pack-objects: create a packed object representation., 2005-06-25). Later on rev-list started doing similar parsing in 42cabc341c4 (Teach rev-list an option to read revs from the standard input., 2006-09-05), and that code was promoted to a more general API in 1fc561d169a (Move read_revisions_from_stdin from builtin-rev-list.c to revision.c, 2008-07-05). Since then the API in revision.c has received improvements that have been missed here. E.g. the arbitrary limit of 1000 bytes was removed in 63d564b3002 (read_revision_from_stdin(): use strbuf, 2009-11-20), and it moved to a more simpler strbuf API in 6e8d46f9d4b (revision: read --stdin with strbuf_getline(), 2015-10-28). Let's do the same here, as in 6e8d46f9d4b we can remove the "if (len && line[len - 1] == '\n')" check, it's now redundant to using strbuf_getline(), and we get to skip the whole "warn_on_object_refname_ambiguity" dance. The read_revisions_from_stdin() function in revision.c we're now using does it for us. For now there isn't all that much point in this whole exercises. We just end up calling setup_revisions() to loop over stdin for us, but the callback we define makes no use of REV_INFO_STDIN_LINE_PROCESS, we still need to call handle_revision_arg() ourselves because we'd like to call it with different flags. This very light use of the API will be further refined in a subsequent commit, for now we're just doing the bare minimum to move this existing code over to the new callback pattern without any functional changes, and making it as friendly to "git show -w" and "the --color-moved-ws=allow-indentation-change" mode as possible. Signed-off-by: Ævar Arnfjörð Bjarmason --- builtin/pack-objects.c | 66 +++++++++++++++++++++--------------------- revision.c | 27 +++++++++++++++++ revision.h | 31 ++++++++++++++++++++ 3 files changed, 91 insertions(+), 33 deletions(-) diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c index 1fbaa34f91..cbb01f2b2d 100644 --- a/builtin/pack-objects.c +++ b/builtin/pack-objects.c @@ -3745,15 +3745,43 @@ static void mark_bitmap_preferred_tips(void) } } +static enum rev_info_stdin_line get_object_list_handle_stdin_line( + struct rev_info *revs, struct strbuf *line_sb, void *stdin_line_priv) +{ + int *flags = stdin_line_priv; + char *line = line_sb->buf; + size_t len = line_sb->len; + + if (!len) + return REV_INFO_STDIN_LINE_BREAK; + if (*line == '-') { + if (!strcmp(line, "--not")) { + *flags ^= UNINTERESTING; + write_bitmap_index = 0; + return REV_INFO_STDIN_LINE_CONTINUE; + } + if (starts_with(line, "--shallow ")) { + struct object_id oid; + if (get_oid_hex(line + 10, &oid)) + die("not an object name '%s'", line + 10); + register_shallow(the_repository, &oid); + use_bitmap_index = 0; + return REV_INFO_STDIN_LINE_CONTINUE; + } + die(_("not a rev '%s'"), line); + } + if (handle_revision_arg(line, revs, *flags, REVARG_CANNOT_BE_FILENAME)) + die(_("bad revision '%s'"), line); + return REV_INFO_STDIN_LINE_CONTINUE; +} + static void get_object_list(int ac, const char **av) { struct rev_info revs; struct setup_revision_opt s_r_opt = { .allow_exclude_promisor_objects = 1, }; - char line[1000]; int flags = 0; - int save_warning; repo_init_revisions(the_repository, &revs, NULL); save_commit_buffer = 0; @@ -3761,39 +3789,11 @@ static void get_object_list(int ac, const char **av) /* make sure shallows are read */ is_repository_shallow(the_repository); + revs.stdin_handling = REV_INFO_STDIN_ALWAYS_READ; + revs.handle_stdin_line = get_object_list_handle_stdin_line; + revs.stdin_line_priv = &flags; setup_revisions(ac, av, &revs, &s_r_opt); - save_warning = warn_on_object_refname_ambiguity; - warn_on_object_refname_ambiguity = 0; - - while (fgets(line, sizeof(line), stdin) != NULL) { - int len = strlen(line); - if (len && line[len - 1] == '\n') - line[--len] = 0; - if (!len) - break; - if (*line == '-') { - if (!strcmp(line, "--not")) { - flags ^= UNINTERESTING; - write_bitmap_index = 0; - continue; - } - if (starts_with(line, "--shallow ")) { - struct object_id oid; - if (get_oid_hex(line + 10, &oid)) - die("not an object name '%s'", line + 10); - register_shallow(the_repository, &oid); - use_bitmap_index = 0; - continue; - } - die(_("not a rev '%s'"), line); - } - if (handle_revision_arg(line, &revs, flags, REVARG_CANNOT_BE_FILENAME)) - die(_("bad revision '%s'"), line); - } - - warn_on_object_refname_ambiguity = save_warning; - if (use_bitmap_index && !get_object_list_from_bitmap(&revs)) return; diff --git a/revision.c b/revision.c index 69b3812093..878eb51032 100644 --- a/revision.c +++ b/revision.c @@ -2119,6 +2119,25 @@ static void read_revisions_from_stdin(struct rev_info *revs, int len = sb.len; if (!len) break; + + if (revs->handle_stdin_line) { + int do_break = 0; + enum rev_info_stdin_line ret = revs->handle_stdin_line( + revs, &sb, revs->stdin_line_priv); + + switch (ret) { + case REV_INFO_STDIN_LINE_PROCESS: + break; + case REV_INFO_STDIN_LINE_BREAK: + do_break = 1; + break; + case REV_INFO_STDIN_LINE_CONTINUE: + continue; + } + if (do_break) + break; + } + if (sb.buf[0] == '-') { if (len == 2 && sb.buf[1] == '-') { seen_dashdash = 1; @@ -2787,6 +2806,14 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s } } + /* + * We've got always_read_from_stdin but no --stdin (or + * "consumed_stdin_per_option" would be set). + */ + if (revs->stdin_handling == REV_INFO_STDIN_ALWAYS_READ && + !revs->consumed_stdin_per_option) + read_revisions_from_stdin(revs, &prune_data); + if (prune_data.nr) { /* * If we need to introduce the magic "a lone ':' means no diff --git a/revision.h b/revision.h index 03231f089f..9d977cd3cc 100644 --- a/revision.h +++ b/revision.h @@ -89,8 +89,18 @@ struct topo_walk_info; enum rev_info_stdin { REV_INFO_STDIN_CONSUME_ON_OPTION = 0, REV_INFO_STDIN_IGNORE, + REV_INFO_STDIN_ALWAYS_READ, }; +enum rev_info_stdin_line { + REV_INFO_STDIN_LINE_PROCESS, + REV_INFO_STDIN_LINE_BREAK, + REV_INFO_STDIN_LINE_CONTINUE, +}; + +typedef enum rev_info_stdin_line (*rev_info_stdin_line_func)( + struct rev_info *revs, struct strbuf *line, void *stdin_line_priv); + struct rev_info { /* Starting list */ struct commit_list *commits; @@ -126,6 +136,9 @@ struct rev_info { * * Can be set to REV_INFO_STDIN_IGNORE to ignore any provided * --stdin option. + * + * Set it to REV_INFO_STDIN_ALWAYS_READ if there's always data + * on stdin to be read, even if no --stdin option is provided. */ enum rev_info_stdin stdin_handling; @@ -136,6 +149,24 @@ struct rev_info { */ int consumed_stdin_per_option; + /* + * When reading from stdin (see "stdin_handling" above) define + * a handle_stdin_line function to consume the lines. + * + * - Return 0 to continue revision.c's normal processing of the + * line (after possibly munging the provided strbuf). + * + * - Return 1 to indicate that the line is fully processed, + * moving onto the next line (if any) + * + * - Return 2 to process no further lines. + * + * Use the "stdin_line_priv" to optionally pass your own data + * around. + */ + rev_info_stdin_line_func handle_stdin_line; + void *stdin_line_priv; + /* topo-sort */ enum rev_sort_order sort_order; From patchwork Tue Jun 8 12:16:30 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= X-Patchwork-Id: 12306671 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=-15.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT 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 5A9A0C47082 for ; Tue, 8 Jun 2021 12:17:56 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 32C7261182 for ; Tue, 8 Jun 2021 12:17:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232484AbhFHMTs (ORCPT ); Tue, 8 Jun 2021 08:19:48 -0400 Received: from mail-wr1-f50.google.com ([209.85.221.50]:41627 "EHLO mail-wr1-f50.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232452AbhFHMTr (ORCPT ); Tue, 8 Jun 2021 08:19:47 -0400 Received: by mail-wr1-f50.google.com with SMTP id o3so2948943wri.8 for ; Tue, 08 Jun 2021 05:17:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=XRaqzm7k7AqQbOy3fFiUgR+oprsXIe4BRiLMjxIi0Us=; b=ZK6uasVdFUIVCpmi6CLej/X5XDDN0/CjMV2cV7OIuAsDbgTqUhTfT7FqinVBN83RqV EWRscpY9ZhuAPIh7yUjnNZ42y9zuUKwtJ7oCQTmLIxWvlvQ919/Lx9IwkLClvUTfP7MF /TLS6J3eRy/Th6efqdrU7Sk8CIZLakbNdTZAHb/HGnybb5Jg9SYVSMxsW7v2s8bl9n9r zkx1ifjdT65C8xdZq5BywII8gT7rPvljPH/JU6VTb+QgbMNEItVQ3xcaCXxgJaFbajtg +xuyX86ci+aswzkCMTQfDCV4ZZoPaiDDeDXTa4V3IDBOkZlSl6Udnmv6hHbjFEv80MUT 2EAw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=XRaqzm7k7AqQbOy3fFiUgR+oprsXIe4BRiLMjxIi0Us=; b=XwuM1d1ZNWBFC1+BKuZ+ChNefuulRh4G91PWILcQQMZIbZZ90KtC1m4Hqn1leDZpT1 1gq2QHOiqEUUqAD0cgmFPlVNnq4o7EqwVONImBS3Le7+znTfnTtJoUtSq8w2ilzPairO QPA7CuTBhSsLBX3kwGP65hi4ujgX+8wx3fAjq5TyHIGW9D5Ize3UHFmfCpSrBPRv++gP QdVIOy4yCpb2iITgAr5WCdr7uWIfEzXkB45GEsBYmiVe24lMXMrBfD43F4qeQUmR5I0f jH2neEDm2TOzFX75leJkoRpPTf0brR3R0swnLX4SHjpwG6ilK7WUSTgtyOuiSKkqKtdV QO8A== X-Gm-Message-State: AOAM530TRhNWCSzLBLp8m/O81brpIQxIybOas8fMLZJ2QbUNzsLgoTek PjZSNxF9hxPxnhGrX1iBe/mSK//Gg8rpUg== X-Google-Smtp-Source: ABdhPJyCGWLGoxdlOEaMLiJsxyBuNSeTGeUJyVcnIZx7JDu0poTq/C4NzjZbhY+S/aLOj+RVoCys6Q== X-Received: by 2002:adf:f5c9:: with SMTP id k9mr21415400wrp.180.1623154600662; Tue, 08 Jun 2021 05:16:40 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id x20sm12976378wmc.39.2021.06.08.05.16.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Jun 2021 05:16:40 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Jeff King , Jiang Xin , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBC?= =?utf-8?b?amFybWFzb24=?= Subject: [PATCH 4/4] pack-objects.c: make use of REV_INFO_STDIN_LINE_PROCESS Date: Tue, 8 Jun 2021 14:16:30 +0200 Message-Id: X-Mailer: git-send-email 2.32.0.rc3.434.gd8aed1f08a7 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Continue the work started in the preceding commit of porting pack-objects.c over to the new handle_stdin_line callback pattern. The common case for the users of this API is to do some of their own parsing or munging, and then have handle_revision_arg() handle the rest. The existing users of the --stdin parsing always wanted a flag of "0" to be passed to handle_revision_arg(), but pack-objects.c wants to set custom flags. Let's support this common case by having a "revarg_flags" member in the "rev_info" struct. This allows us to return REV_INFO_STDIN_LINE_PROCESS in the new get_object_list_handle_stdin_line() instead of REV_INFO_STDIN_LINE_CONTINUE, as read_revisions_from_stdin() will now pass down the right flag for us. This also means that we can make the handle_revision_arg() function static. Now that the only external user of the API has been migrated over to the callback mechanism nothing external to revision.c needs to call handle_revision_arg() anymore. That handle_revision_arg() function was made public in a combination of 5d6f0935e6d (revision.c: allow injecting revision parameters after setup_revisions()., 2006-09-05) and b5d97e6b0a0 (pack-objects: run rev-list equivalent internally., 2006-09-04). This change leaves the briefly-used in preceding commits "void *stdin_line_priv" without any in-tree user, as builtin/pack-objects.c could be ported over to our new "revarg_flags" common case. I'm leaving that "void *stdin_line_priv" in place anyway for two reasons: 1. It's a common pattern to allow such a "void *" to be used for callback data, so we might as well follow that pattern here in anticipation of a future in-tree user. 2. I have patches for such an in-tree user already in a series that'll be submitted after this one. Signed-off-by: Ævar Arnfjörð Bjarmason --- builtin/pack-objects.c | 9 ++------- revision.c | 4 ++-- revision.h | 6 ++++-- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c index cbb01f2b2d..0ab2d10853 100644 --- a/builtin/pack-objects.c +++ b/builtin/pack-objects.c @@ -3748,7 +3748,6 @@ static void mark_bitmap_preferred_tips(void) static enum rev_info_stdin_line get_object_list_handle_stdin_line( struct rev_info *revs, struct strbuf *line_sb, void *stdin_line_priv) { - int *flags = stdin_line_priv; char *line = line_sb->buf; size_t len = line_sb->len; @@ -3756,7 +3755,7 @@ static enum rev_info_stdin_line get_object_list_handle_stdin_line( return REV_INFO_STDIN_LINE_BREAK; if (*line == '-') { if (!strcmp(line, "--not")) { - *flags ^= UNINTERESTING; + revs->revarg_flags ^= UNINTERESTING; write_bitmap_index = 0; return REV_INFO_STDIN_LINE_CONTINUE; } @@ -3770,9 +3769,7 @@ static enum rev_info_stdin_line get_object_list_handle_stdin_line( } die(_("not a rev '%s'"), line); } - if (handle_revision_arg(line, revs, *flags, REVARG_CANNOT_BE_FILENAME)) - die(_("bad revision '%s'"), line); - return REV_INFO_STDIN_LINE_CONTINUE; + return REV_INFO_STDIN_LINE_PROCESS; } static void get_object_list(int ac, const char **av) @@ -3781,7 +3778,6 @@ static void get_object_list(int ac, const char **av) struct setup_revision_opt s_r_opt = { .allow_exclude_promisor_objects = 1, }; - int flags = 0; repo_init_revisions(the_repository, &revs, NULL); save_commit_buffer = 0; @@ -3791,7 +3787,6 @@ static void get_object_list(int ac, const char **av) revs.stdin_handling = REV_INFO_STDIN_ALWAYS_READ; revs.handle_stdin_line = get_object_list_handle_stdin_line; - revs.stdin_line_priv = &flags; setup_revisions(ac, av, &revs, &s_r_opt); if (use_bitmap_index && !get_object_list_from_bitmap(&revs)) diff --git a/revision.c b/revision.c index 878eb51032..8054a9d037 100644 --- a/revision.c +++ b/revision.c @@ -2089,7 +2089,7 @@ static int handle_revision_arg_1(const char *arg_, struct rev_info *revs, int fl return 0; } -int handle_revision_arg(const char *arg, struct rev_info *revs, int flags, unsigned revarg_opt) +static int handle_revision_arg(const char *arg, struct rev_info *revs, int flags, unsigned revarg_opt) { int ret = handle_revision_arg_1(arg, revs, flags, revarg_opt); if (!ret) @@ -2145,7 +2145,7 @@ static void read_revisions_from_stdin(struct rev_info *revs, } die("options not supported in --stdin mode"); } - if (handle_revision_arg(sb.buf, revs, 0, + if (handle_revision_arg(sb.buf, revs, revs->revarg_flags, REVARG_CANNOT_BE_FILENAME)) die("bad revision '%s'", sb.buf); } diff --git a/revision.h b/revision.h index 9d977cd3cc..c55147e7f2 100644 --- a/revision.h +++ b/revision.h @@ -156,6 +156,9 @@ struct rev_info { * - Return 0 to continue revision.c's normal processing of the * line (after possibly munging the provided strbuf). * + * Change "revarg_flags" to affect the subsequent handling + * in handle_revision_arg() + * * - Return 1 to indicate that the line is fully processed, * moving onto the next line (if any) * @@ -165,6 +168,7 @@ struct rev_info { * around. */ rev_info_stdin_line_func handle_stdin_line; + int revarg_flags; void *stdin_line_priv; /* topo-sort */ @@ -422,8 +426,6 @@ void parse_revision_opt(struct rev_info *revs, struct parse_opt_ctx_t *ctx, const char * const usagestr[]); #define REVARG_CANNOT_BE_FILENAME 01 #define REVARG_COMMITTISH 02 -int handle_revision_arg(const char *arg, struct rev_info *revs, - int flags, unsigned revarg_opt); /** * Reset the flags used by the revision walking api. You can use this to do