From patchwork Fri Oct 14 15:40:13 2022 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: 13007143 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4AC02C433FE for ; Fri, 14 Oct 2022 15:40:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230511AbiJNPkd (ORCPT ); Fri, 14 Oct 2022 11:40:33 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60686 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229714AbiJNPkb (ORCPT ); Fri, 14 Oct 2022 11:40:31 -0400 Received: from mail-wm1-x32c.google.com (mail-wm1-x32c.google.com [IPv6:2a00:1450:4864:20::32c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5CFEBBC44C for ; Fri, 14 Oct 2022 08:40:29 -0700 (PDT) Received: by mail-wm1-x32c.google.com with SMTP id n9so3332024wms.1 for ; Fri, 14 Oct 2022 08:40:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=/nlRzpzET1+ufxozcZfKhB82cr+VhjsGGBOSlyx+bfk=; b=GEXnOaFquxSmy8P0LpwUvoXr4H9EsC0z0X1EAgjcecwCNHNz0ygfdaAmgyMuHe2G5k IeEjya1lJGvSZMb71qMKtca1/esi1thsv3m0CVlXkDWU21175GiRY4SNkMqkaBG9nmWV o80tdnOKPSubaCbVI1euIZn5eK9MbS3Lxi+HqaN5ygo39ejCb/Ml9hQKshkQpy7XiLQE dm7ER6Vl0Hoq43kqFxayEX8fUBzc8+FarpDOvoxmDHMkciTUOcipkXPvecbaLxMMVRDZ bhwHjv+B9X212JmlKAarZ64YcoZGmjZanhs2/nXY9J7GK2uIAgv2RUUWTWJJuyvMEamV OoRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=/nlRzpzET1+ufxozcZfKhB82cr+VhjsGGBOSlyx+bfk=; b=wqSY0ULeKm/QkbyRbFZliQTG/CB/AbqBno2IYHQB2wEzoaEEICEwD7JHEx2Fp9be0E Za++G3HvT9Om6Zt9iMG0tLF48AgKDBiUSBfamloROsmuWX/FNhGiFwGWKIVLnH0NHy72 3zfj5QnB9nyvLX1bZiI9++rStSrJmsaTIQfvFhinyRT7wDDRowc5f8KvTc8nVnA9HuI+ 9XJ5Pb/mifKXG5IjmSz6B8rvegWWkmT3dZeuPHqg6at8w0ySiNn/jnFFPxpBC4Ls1jSc LO22yeZkTiMx6P8AVF18rXJ5RpmUuHohQ157XJLyANP2S9tBkkw2Rd/Kkk/1PvDTe34a wvzA== X-Gm-Message-State: ACrzQf0qEglBllAAvD47f72Y2rderRcJYS4LbWJqYWmH20fxQCG38EJD 1imVQzifmGmSsG8uxjDKy7JjUOyahPi6RQ== X-Google-Smtp-Source: AMsMyM53vIUqZkSegUWCIeK8eZi/MYXJBpgPeyLxHcfp0JLQQX9kESNAZVtmhE8rTcEeRyQyzZQ7kQ== X-Received: by 2002:a05:600c:4f53:b0:3b4:9aad:7845 with SMTP id m19-20020a05600c4f5300b003b49aad7845mr4102139wmq.159.1665762027471; Fri, 14 Oct 2022 08:40:27 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id 123-20020a1c1981000000b003c6c4639ac6sm2385391wmz.34.2022.10.14.08.40.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Oct 2022 08:40:26 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Jeff King , =?utf-8?q?Ren=C3=A9_Scharfe?= , =?utf-8?b?w4Z2YXIgQXJuZmo=?= =?utf-8?b?w7Zyw7AgQmphcm1hc29u?= Subject: [PATCH 01/10] run-command.c: refactor run_command_*_tr2() to internal helpers Date: Fri, 14 Oct 2022 17:40:13 +0200 Message-Id: X-Mailer: git-send-email 2.38.0.1092.g8c0298861b0 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Refactor the run_command_v_opt_cd_env_tr2() function to helpers which takes a "struct child_process *cmd" argument. This will allow for adding a helper which won't need to copy a set of arguments to the "cmd.args" we'd otherwise have to populate from the "argv". Splitting out the part of the function that sets the various members from "opt" will help in the subsequent commit. Signed-off-by: Ævar Arnfjörð Bjarmason --- run-command.c | 40 +++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/run-command.c b/run-command.c index 5ec3a46dccf..cf4a431c839 100644 --- a/run-command.c +++ b/run-command.c @@ -1004,6 +1004,18 @@ int run_command(struct child_process *cmd) return finish_command(cmd); } +static void run_command_set_opts(struct child_process *cmd, int opt) +{ + cmd->no_stdin = opt & RUN_COMMAND_NO_STDIN ? 1 : 0; + cmd->git_cmd = opt & RUN_GIT_CMD ? 1 : 0; + cmd->stdout_to_stderr = opt & RUN_COMMAND_STDOUT_TO_STDERR ? 1 : 0; + cmd->silent_exec_failure = opt & RUN_SILENT_EXEC_FAILURE ? 1 : 0; + cmd->use_shell = opt & RUN_USING_SHELL ? 1 : 0; + cmd->clean_on_exit = opt & RUN_CLEAN_ON_EXIT ? 1 : 0; + cmd->wait_after_clean = opt & RUN_WAIT_AFTER_CLEAN ? 1 : 0; + cmd->close_object_store = opt & RUN_CLOSE_OBJECT_STORE ? 1 : 0; +} + int run_command_v_opt(const char **argv, int opt) { return run_command_v_opt_cd_env(argv, opt, NULL, NULL); @@ -1019,24 +1031,26 @@ int run_command_v_opt_cd_env(const char **argv, int opt, const char *dir, const return run_command_v_opt_cd_env_tr2(argv, opt, dir, env, NULL); } +static int run_command_v_opt_cd_env_tr2_1(struct child_process *cmd, int opt, + const char *dir, + const char *const *env, + const char *tr2_class) +{ + run_command_set_opts(cmd, opt); + cmd->dir = dir; + if (env) + strvec_pushv(&cmd->env, (const char **)env); + cmd->trace2_child_class = tr2_class; + return run_command(cmd); +} + int run_command_v_opt_cd_env_tr2(const char **argv, int opt, const char *dir, const char *const *env, const char *tr2_class) { struct child_process cmd = CHILD_PROCESS_INIT; + strvec_pushv(&cmd.args, argv); - cmd.no_stdin = opt & RUN_COMMAND_NO_STDIN ? 1 : 0; - cmd.git_cmd = opt & RUN_GIT_CMD ? 1 : 0; - cmd.stdout_to_stderr = opt & RUN_COMMAND_STDOUT_TO_STDERR ? 1 : 0; - cmd.silent_exec_failure = opt & RUN_SILENT_EXEC_FAILURE ? 1 : 0; - cmd.use_shell = opt & RUN_USING_SHELL ? 1 : 0; - cmd.clean_on_exit = opt & RUN_CLEAN_ON_EXIT ? 1 : 0; - cmd.wait_after_clean = opt & RUN_WAIT_AFTER_CLEAN ? 1 : 0; - cmd.close_object_store = opt & RUN_CLOSE_OBJECT_STORE ? 1 : 0; - cmd.dir = dir; - if (env) - strvec_pushv(&cmd.env, (const char **)env); - cmd.trace2_child_class = tr2_class; - return run_command(&cmd); + return run_command_v_opt_cd_env_tr2_1(&cmd, opt, dir, env, tr2_class); } #ifndef NO_PTHREADS From patchwork Fri Oct 14 15:40:14 2022 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: 13007144 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 71F85C433FE for ; Fri, 14 Oct 2022 15:40:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230518AbiJNPkg (ORCPT ); Fri, 14 Oct 2022 11:40:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60688 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230361AbiJNPkb (ORCPT ); Fri, 14 Oct 2022 11:40:31 -0400 Received: from mail-wr1-x42e.google.com (mail-wr1-x42e.google.com [IPv6:2a00:1450:4864:20::42e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 798DBCC804 for ; Fri, 14 Oct 2022 08:40:30 -0700 (PDT) Received: by mail-wr1-x42e.google.com with SMTP id j16so8174975wrh.5 for ; Fri, 14 Oct 2022 08:40:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=GFNlsgYQ0dsoh8dgONvx5+5zKAaU+exnmxKZ1k1Ogcg=; b=LsE4oG4tx63agiaXg9Ky0gVQIJ5ZbjgkYpkq1GEtvMY+6VnhR/lGzygVb1WnaA6TAm lYZXRzicMMQaOGlzCZs1hgFuVRNnU1Lo+GG5roZMR0Tp3G2WXpcWtPcdUhPuP8Or6J2H 0hmNx9+WnvFy3uaDTH/Ql5/lUUCjj3EJL8PImRpx0g/WOuqMRVGjj7BbK337qV74675w ilTBXInwNkIHQyFeQMhs4H5kVEkD2j+Gs6HhTP3vPNn7QgCymSl1UOX0hYS5pH1WRCzu otmROduf5HpJenX9cXJmqJDs2uW36qCO/rSeK3VgAY4dcdw3kOUyvF1zB1oFoYTQGg3G LhrQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=GFNlsgYQ0dsoh8dgONvx5+5zKAaU+exnmxKZ1k1Ogcg=; b=lViLlHdlfi7A+NWCq7nHM3cRzRLYVZVQLy37Fk5tiluGt3uvS9LVZVKD2SFOiMHM9W CRAS0B+Jjk3PTuE3Ra339Mo9eMnba/TQx6s8eHRyO3bqSSOtqgYx5+rkJi3FtuHwWI96 1aFiUNHOIFiMilb+jx4PsAr+iFz4/loH4znmS2/Sy0LiJT6lUqeE5e0f8fYvjbmBrccH gLIG4hK6MQnzQhlJZdm3R/4v9v26nOnGkiYyfWaAYB5tk3HwsDWoCw0KpanywF80dckF TXjSyVo87HUuGmRjTtvf54F6/xj4JbIQgbfbbJUCcjqjRFF2kJkkhn6SZu7it8wXxqBX /sQQ== X-Gm-Message-State: ACrzQf0HzY9nw0Fu1DX2i4pi2UM8nd2u+LeNwIvqimbQF6Wab+AOvsk7 bZkMEE5wI6FV4al23JCImbV99DSlm5sc0g== X-Google-Smtp-Source: AMsMyM6I0grl+wEQa1bjhTPcb9nTEf2u0TH3rMQa/8CoYv4E9SChNSK3b0mqRWB3vlWzFUxmhq2Kew== X-Received: by 2002:adf:ee88:0:b0:22e:330a:f741 with SMTP id b8-20020adfee88000000b0022e330af741mr3750679wro.199.1665762028550; Fri, 14 Oct 2022 08:40:28 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id 123-20020a1c1981000000b003c6c4639ac6sm2385391wmz.34.2022.10.14.08.40.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Oct 2022 08:40:27 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Jeff King , =?utf-8?q?Ren=C3=A9_Scharfe?= , =?utf-8?b?w4Z2YXIgQXJuZmo=?= =?utf-8?b?w7Zyw7AgQmphcm1hc29u?= Subject: [PATCH 02/10] merge: remove always-the-same "verbose" arguments Date: Fri, 14 Oct 2022 17:40:14 +0200 Message-Id: X-Mailer: git-send-email 2.38.0.1092.g8c0298861b0 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Simplify the code that builds the arguments for the "read-tree" invocation in reset_hard() and read_empty() to remove the "verbose" parameter. Before 172b6428d06 (do not overwrite untracked during merge from unborn branch, 2010-11-14) there was a "reset_hard()" function that would be called in two places, one of those passed a "verbose=1", the other a "verbose=0". After 172b6428d06 when read_empty() was split off from reset_hard() both of these functions only had one caller. The "verbose" in read_empty() would always be false, and the one in reset_hard() would always be true. There was never a good reason for the code to act this way, it happened because the read_empty() function was a copy/pasted and adjusted version of reset_hard(). Since we're no longer conditionally adding the "-v" parameter here (and we'd only add it for "reset_hard()" we'll be able to move to a simpler and safer run-command API in the subsequent commit. Signed-off-by: Ævar Arnfjörð Bjarmason --- builtin/merge.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/builtin/merge.c b/builtin/merge.c index 5900b81729d..3bb49d805b4 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -345,14 +345,12 @@ static int save_state(struct object_id *stash) return rc; } -static void read_empty(const struct object_id *oid, int verbose) +static void read_empty(const struct object_id *oid) { int i = 0; const char *args[7]; args[i++] = "read-tree"; - if (verbose) - args[i++] = "-v"; args[i++] = "-m"; args[i++] = "-u"; args[i++] = empty_tree_oid_hex(); @@ -363,14 +361,13 @@ static void read_empty(const struct object_id *oid, int verbose) die(_("read-tree failed")); } -static void reset_hard(const struct object_id *oid, int verbose) +static void reset_hard(const struct object_id *oid) { int i = 0; const char *args[6]; args[i++] = "read-tree"; - if (verbose) - args[i++] = "-v"; + args[i++] = "-v"; args[i++] = "--reset"; args[i++] = "-u"; args[i++] = oid_to_hex(oid); @@ -385,7 +382,7 @@ static void restore_state(const struct object_id *head, { struct strvec args = STRVEC_INIT; - reset_hard(head, 1); + reset_hard(head); if (is_null_oid(stash)) goto refresh_cache; @@ -1470,7 +1467,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix) check_trust_level); remote_head_oid = &remoteheads->item->object.oid; - read_empty(remote_head_oid, 0); + read_empty(remote_head_oid); update_ref("initial pull", "HEAD", remote_head_oid, NULL, 0, UPDATE_REFS_DIE_ON_ERR); goto done; From patchwork Fri Oct 14 15:40:15 2022 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: 13007145 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E2FC7C433FE for ; Fri, 14 Oct 2022 15:40:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231147AbiJNPkp (ORCPT ); Fri, 14 Oct 2022 11:40:45 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33032 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230513AbiJNPkf (ORCPT ); Fri, 14 Oct 2022 11:40:35 -0400 Received: from mail-wr1-x42e.google.com (mail-wr1-x42e.google.com [IPv6:2a00:1450:4864:20::42e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 57D2EBC44C for ; Fri, 14 Oct 2022 08:40:32 -0700 (PDT) Received: by mail-wr1-x42e.google.com with SMTP id n12so8147696wrp.10 for ; Fri, 14 Oct 2022 08:40:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=OqWQpP4+MHgKm9G83g2j0bsZFUI5ekhWntQs2m2nobk=; b=Q1o7HIXZ+oLy0n2pM9qz7/xPZ2x2yteRXlg3+VaH6QhsbXwbvsjq5ZZPfB2famq4tJ 0NhUawV/ZKOe7iT4iMrZoF69vPWSCRYkZ01njra8jq4oI0SZE/aIoA/sf9yQHrzxeIxk WTMRMLzyCCLB0m/CfnzGZr/69kuetZAlbDp2HugMLEBjvL156QtaPJGTeOEG7jPkDt0Z ZhPpApwi71bSjcOe3nKj/EtCCWI5UIq1aAvmy8SOWZoKi3bjzDf2ivkq/0/UnNOBhvr2 YigeCbwAG0P3S8xYZ6aSDDAcvacIokqxbENQ2EZXLu76vAWZKOqIEYxEKZPo7alWO30R 6NDw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=OqWQpP4+MHgKm9G83g2j0bsZFUI5ekhWntQs2m2nobk=; b=1xUB/lzKxj5hQb+jPSaeUE4vbAV1UZMhrzjpvBLInTCnr/YhCfOvXKelEPTR+F1inN vmBe30CVJteL2xTnFwvmSdSm4iIExyaUeD3wXETc3eULbeYrHTJ7tfDKZ2Gz4tmjnDT+ VDWXwlwCuTYW+l1LXDtRAIYAx33OEun4MqS26kvuNAVjekngxjWrOJFM5rjKY4kv6HOi RQbG25+gtg/kxLjY1X5lvU9rvO/UltXYTSRb3yiVXl0vSA9RixfFcl0fcgXLPLXn1t48 op7uY7WhrEqjk48cl7OWeU8YEnLKxqQgMBlFX/3KQBdn3KQ8n2dXSUAKCqmgIuz66pcb kFtw== X-Gm-Message-State: ACrzQf2jQ5skAg5u0LrJf0aJGv7Ig5VTBcd0LbCyBdJ4J5MNC4+MSRpL aaXlNMY48U4C+xbgfpl/OeK5ofrHMX8GJA== X-Google-Smtp-Source: AMsMyM5ceEigAEnMupB4FCaJzBdHHxFrOLClKQ3OfjpTzKcUqjlttHyOx3toblcmN6KaNUzHRfcKfw== X-Received: by 2002:a05:6000:cf:b0:22e:58cd:5a38 with SMTP id q15-20020a05600000cf00b0022e58cd5a38mr3981557wrx.436.1665762030098; Fri, 14 Oct 2022 08:40:30 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id 123-20020a1c1981000000b003c6c4639ac6sm2385391wmz.34.2022.10.14.08.40.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Oct 2022 08:40:29 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Jeff King , =?utf-8?q?Ren=C3=A9_Scharfe?= , =?utf-8?b?w4Z2YXIgQXJuZmo=?= =?utf-8?b?w7Zyw7AgQmphcm1hc29u?= Subject: [PATCH 03/10] run-command API: add and use a run_command_l_opt() Date: Fri, 14 Oct 2022 17:40:15 +0200 Message-Id: X-Mailer: git-send-email 2.38.0.1092.g8c0298861b0 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org When run_command() is used with strvec_pushl() as in the pre-image of b004c902827 (gc: simplify maintenance_task_pack_refs(), 2022-10-04) we get the benefit of the LAST_ARG_MUST_BE_NULL. See 9fe3edc47f1 (Add the LAST_ARG_MUST_BE_NULL macro, 2013-07-18). Let's provide and use a run_command_l_opt() function, which gives us the best of both worlds. We'll now need less code to accomplish the same thing, and this version's safer as we can assert that the terminating NULL is present. The "builtin/bisect--helper.c" would be a large beneficiary of this API, with "15 insertions(+), 26 deletions(-)", but let's leave that aside for now, as there's an outstanding topic that's extensively modifying it. Signed-off-by: Ævar Arnfjörð Bjarmason --- bisect.c | 19 +++++++++---------- builtin/clone.c | 16 ++++++---------- builtin/difftool.c | 14 ++++++-------- builtin/gc.c | 22 ++++++++-------------- builtin/merge.c | 35 ++++++----------------------------- builtin/remote.c | 10 ++++------ compat/mingw.c | 8 +++----- ll-merge.c | 4 +--- run-command.c | 15 +++++++++++++++ run-command.h | 13 +++++++++++-- sequencer.c | 4 +--- t/helper/test-fake-ssh.c | 4 +--- 12 files changed, 71 insertions(+), 93 deletions(-) diff --git a/bisect.c b/bisect.c index fd581b85a72..415b0e7b0b2 100644 --- a/bisect.c +++ b/bisect.c @@ -738,18 +738,17 @@ enum bisect_error bisect_checkout(const struct object_id *bisect_rev, update_ref(NULL, "BISECT_EXPECTED_REV", bisect_rev, NULL, 0, UPDATE_REFS_DIE_ON_ERR); argv_checkout[2] = bisect_rev_hex; - if (no_checkout) { + if (no_checkout) update_ref(NULL, "BISECT_HEAD", bisect_rev, NULL, 0, UPDATE_REFS_DIE_ON_ERR); - } else { - if (run_command_v_opt(argv_checkout, RUN_GIT_CMD)) - /* - * Errors in `run_command()` itself, signaled by res < 0, - * and errors in the child process, signaled by res > 0 - * can both be treated as regular BISECT_FAILED (-1). - */ - return BISECT_FAILED; - } + else if (run_command_l_opt(RUN_GIT_CMD, "checkout", "-q", + bisect_rev_hex, "--", NULL)) + /* + * Errors in `run_command()` itself, signaled by res < 0, + * and errors in the child process, signaled by res > 0 + * can both be treated as regular BISECT_FAILED (-1). + */ + return BISECT_FAILED; commit = lookup_commit_reference(the_repository, bisect_rev); format_commit_message(commit, "[%H] %s%n", &commit_msg, &pp); diff --git a/builtin/clone.c b/builtin/clone.c index ed8d44bb6ab..13fc7a4bc5d 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -651,23 +651,19 @@ static void update_head(const struct ref *our, const struct ref *remote, static int git_sparse_checkout_init(const char *repo) { - struct strvec argv = STRVEC_INIT; - int result = 0; - strvec_pushl(&argv, "-C", repo, "sparse-checkout", "set", NULL); - /* * We must apply the setting in the current process * for the later checkout to use the sparse-checkout file. */ core_apply_sparse_checkout = 1; - if (run_command_v_opt(argv.v, RUN_GIT_CMD)) { + if (run_command_l_opt(RUN_GIT_CMD, "-C", repo, "sparse-checkout", + "set", NULL)) { error(_("failed to initialize sparse-checkout")); - result = 1; + return 1; } - strvec_clear(&argv); - return result; + return 0; } static int checkout(int submodule_progress, int filter_submodules) @@ -862,11 +858,11 @@ static void write_refspec_config(const char *src_ref_prefix, static void dissociate_from_references(void) { - static const char* argv[] = { "repack", "-a", "-d", NULL }; char *alternates = git_pathdup("objects/info/alternates"); if (!access(alternates, F_OK)) { - if (run_command_v_opt(argv, RUN_GIT_CMD|RUN_COMMAND_NO_STDIN)) + if (run_command_l_opt(RUN_GIT_CMD|RUN_COMMAND_NO_STDIN, + "repack", "-a", "-d", NULL)) die(_("cannot repack to clean up")); if (unlink(alternates) && errno != ENOENT) die_errno(_("cannot unlink temporary alternates file")); diff --git a/builtin/difftool.c b/builtin/difftool.c index 4b10ad1a369..ed211a87322 100644 --- a/builtin/difftool.c +++ b/builtin/difftool.c @@ -44,8 +44,8 @@ static int difftool_config(const char *var, const char *value, void *cb) static int print_tool_help(void) { - const char *argv[] = { "mergetool", "--tool-help=diff", NULL }; - return run_command_v_opt(argv, RUN_GIT_CMD); + return run_command_l_opt(RUN_GIT_CMD, "mergetool", "--tool-help=diff", + NULL); } static int parse_index_info(char *p, int *mode1, int *mode2, @@ -361,7 +361,7 @@ static int run_dir_diff(const char *extcmd, int symlinks, const char *prefix, struct index_state wtindex; struct checkout lstate, rstate; int flags = RUN_GIT_CMD, err = 0; - const char *helper_argv[] = { "difftool--helper", NULL, NULL, NULL }; + const char *helper_command = "difftool--helper"; struct hashmap wt_modified, tmp_modified; int indices_loaded = 0; @@ -563,16 +563,14 @@ static int run_dir_diff(const char *extcmd, int symlinks, const char *prefix, } strbuf_setlen(&ldir, ldir_len); - helper_argv[1] = ldir.buf; strbuf_setlen(&rdir, rdir_len); - helper_argv[2] = rdir.buf; - if (extcmd) { - helper_argv[0] = extcmd; + helper_command = extcmd; flags = 0; } else setenv("GIT_DIFFTOOL_DIRDIFF", "true", 1); - ret = run_command_v_opt(helper_argv, flags); + ret = run_command_l_opt(flags, helper_command, ldir.buf, rdir.buf, + NULL); /* TODO: audit for interaction with sparse-index. */ ensure_full_index(&wtindex); diff --git a/builtin/gc.c b/builtin/gc.c index 243ee85d283..075b4637660 100644 --- a/builtin/gc.c +++ b/builtin/gc.c @@ -58,8 +58,6 @@ static unsigned long max_delta_cache_size = DEFAULT_DELTA_CACHE_SIZE; static struct strvec reflog = STRVEC_INIT; static struct strvec repack = STRVEC_INIT; static struct strvec prune = STRVEC_INIT; -static struct strvec prune_worktrees = STRVEC_INIT; -static struct strvec rerere = STRVEC_INIT; static struct tempfile *pidfile; static struct lock_file log_lock; @@ -167,9 +165,8 @@ static void gc_config(void) struct maintenance_run_opts; static int maintenance_task_pack_refs(MAYBE_UNUSED struct maintenance_run_opts *opts) { - const char *argv[] = { "pack-refs", "--all", "--prune", NULL }; - - return run_command_v_opt(argv, RUN_GIT_CMD); + return run_command_l_opt(RUN_GIT_CMD, "pack-refs", "--all", "--prune", + NULL); } static int too_many_loose_objects(void) @@ -574,8 +571,6 @@ int cmd_gc(int argc, const char **argv, const char *prefix) strvec_pushl(&reflog, "reflog", "expire", "--all", NULL); strvec_pushl(&repack, "repack", "-d", "-l", NULL); strvec_pushl(&prune, "prune", "--expire", NULL); - strvec_pushl(&prune_worktrees, "worktree", "prune", "--expire", NULL); - strvec_pushl(&rerere, "rerere", "gc", NULL); /* default expiry time, overwritten in gc_config */ gc_config(); @@ -688,14 +683,13 @@ int cmd_gc(int argc, const char **argv, const char *prefix) } } - if (prune_worktrees_expire) { - strvec_push(&prune_worktrees, prune_worktrees_expire); - if (run_command_v_opt(prune_worktrees.v, RUN_GIT_CMD)) - die(FAILED_RUN, prune_worktrees.v[0]); - } + if (prune_worktrees_expire && + run_command_l_opt(RUN_GIT_CMD, "worktree", "prune", "--expire", + prune_worktrees_expire, NULL)) + die(FAILED_RUN, "worktree"); - if (run_command_v_opt(rerere.v, RUN_GIT_CMD)) - die(FAILED_RUN, rerere.v[0]); + if (run_command_l_opt(RUN_GIT_CMD, "rerere", "gc", NULL)) + die(FAILED_RUN, "rerere"); report_garbage = report_pack_garbage; reprepare_packed_git(the_repository); diff --git a/builtin/merge.c b/builtin/merge.c index 3bb49d805b4..9c04b588f68 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -347,55 +347,32 @@ static int save_state(struct object_id *stash) static void read_empty(const struct object_id *oid) { - int i = 0; - const char *args[7]; - - args[i++] = "read-tree"; - args[i++] = "-m"; - args[i++] = "-u"; - args[i++] = empty_tree_oid_hex(); - args[i++] = oid_to_hex(oid); - args[i] = NULL; - - if (run_command_v_opt(args, RUN_GIT_CMD)) + if (run_command_l_opt(RUN_GIT_CMD, "read-tree", "-m", "-u", + empty_tree_oid_hex(), oid_to_hex(oid), NULL)) die(_("read-tree failed")); } static void reset_hard(const struct object_id *oid) { - int i = 0; - const char *args[6]; - - args[i++] = "read-tree"; - args[i++] = "-v"; - args[i++] = "--reset"; - args[i++] = "-u"; - args[i++] = oid_to_hex(oid); - args[i] = NULL; - - if (run_command_v_opt(args, RUN_GIT_CMD)) + if (run_command_l_opt(RUN_GIT_CMD, "read-tree", "-v", "--reset", "-u", + oid_to_hex(oid), NULL)) die(_("read-tree failed")); } static void restore_state(const struct object_id *head, const struct object_id *stash) { - struct strvec args = STRVEC_INIT; - reset_hard(head); if (is_null_oid(stash)) goto refresh_cache; - strvec_pushl(&args, "stash", "apply", "--index", "--quiet", NULL); - strvec_push(&args, oid_to_hex(stash)); - /* * It is OK to ignore error here, for example when there was * nothing to restore. */ - run_command_v_opt(args.v, RUN_GIT_CMD); - strvec_clear(&args); + run_command_l_opt(RUN_GIT_CMD, "stash", "apply", "--index", "--quiet", + oid_to_hex(stash), NULL); refresh_cache: if (discard_cache() < 0 || read_cache() < 0) diff --git a/builtin/remote.c b/builtin/remote.c index 910f7b9316a..1d86c14297b 100644 --- a/builtin/remote.c +++ b/builtin/remote.c @@ -92,13 +92,11 @@ static int verbose; static int fetch_remote(const char *name) { - const char *argv[] = { "fetch", name, NULL, NULL }; - if (verbose) { - argv[1] = "-v"; - argv[2] = name; - } printf_ln(_("Updating %s"), name); - if (run_command_v_opt(argv, RUN_GIT_CMD)) + if (verbose && run_command_l_opt(RUN_GIT_CMD, "-v", "fetch", name, + NULL)) + return error(_("Could not fetch %s"), name); + else if (run_command_l_opt(RUN_GIT_CMD, "fetch", name, NULL)) return error(_("Could not fetch %s"), name); return 0; } diff --git a/compat/mingw.c b/compat/mingw.c index 901375d5841..4f5392c5796 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -196,17 +196,15 @@ static int read_yes_no_answer(void) static int ask_yes_no_if_possible(const char *format, ...) { char question[4096]; - const char *retry_hook[] = { NULL, NULL, NULL }; + char *retry_hook; va_list args; va_start(args, format); vsnprintf(question, sizeof(question), format, args); va_end(args); - if ((retry_hook[0] = mingw_getenv("GIT_ASK_YESNO"))) { - retry_hook[1] = question; - return !run_command_v_opt(retry_hook, 0); - } + if ((retry_hook = mingw_getenv("GIT_ASK_YESNO"))) + return !run_command_l_opt(0, retry_hook, question, NULL); if (!isatty(_fileno(stdin)) || !isatty(_fileno(stderr))) return 0; diff --git a/ll-merge.c b/ll-merge.c index 8955d7e1f6e..740689b7bd6 100644 --- a/ll-merge.c +++ b/ll-merge.c @@ -193,7 +193,6 @@ static enum ll_merge_result ll_ext_merge(const struct ll_merge_driver *fn, struct strbuf cmd = STRBUF_INIT; struct strbuf_expand_dict_entry dict[6]; struct strbuf path_sq = STRBUF_INIT; - const char *args[] = { NULL, NULL }; int status, fd, i; struct stat st; enum ll_merge_result ret; @@ -219,8 +218,7 @@ static enum ll_merge_result ll_ext_merge(const struct ll_merge_driver *fn, strbuf_expand(&cmd, fn->cmdline, strbuf_expand_dict_cb, &dict); - args[0] = cmd.buf; - status = run_command_v_opt(args, RUN_USING_SHELL); + status = run_command_l_opt(RUN_USING_SHELL, cmd.buf, NULL); fd = open(temp[1], O_RDONLY); if (fd < 0) goto bad; diff --git a/run-command.c b/run-command.c index cf4a431c839..0be5626f7f2 100644 --- a/run-command.c +++ b/run-command.c @@ -1016,6 +1016,21 @@ static void run_command_set_opts(struct child_process *cmd, int opt) cmd->close_object_store = opt & RUN_CLOSE_OBJECT_STORE ? 1 : 0; } +int run_command_l_opt(int opt, ...) +{ + struct child_process cmd = CHILD_PROCESS_INIT; + va_list ap; + const char *arg; + + va_start(ap, opt); + while ((arg = va_arg(ap, const char *))) + strvec_push(&cmd.args, arg); + va_end(ap); + + run_command_set_opts(&cmd, opt); + return run_command(&cmd); +} + int run_command_v_opt(const char **argv, int opt) { return run_command_v_opt_cd_env(argv, opt, NULL, NULL); diff --git a/run-command.h b/run-command.h index 0e85e5846a5..6320d70f062 100644 --- a/run-command.h +++ b/run-command.h @@ -151,8 +151,8 @@ struct child_process { /** * The functions: child_process_init, start_command, finish_command, - * run_command, run_command_v_opt, run_command_v_opt_cd_env, child_process_clear - * do the following: + * run_command, run_command_l_opt, run_command_v_opt, + * run_command_v_opt_cd_env, child_process_clear do the following: * * - If a system call failed, errno is set and -1 is returned. A diagnostic * is printed. @@ -254,6 +254,15 @@ int run_command_v_opt_cd_env(const char **argv, int opt, const char *dir, const int run_command_v_opt_cd_env_tr2(const char **argv, int opt, const char *dir, const char *const *env, const char *tr2_class); +/** + * The run_command_l_opt() function run_command_v_opt() takes a list + * of strings terminated by a NULL. Use it instead of + * run_command_v_opt() when possible, as it allows the compiler to + * check that the "argv" is NULL-delimited. + */ +LAST_ARG_MUST_BE_NULL +int run_command_l_opt(int opt, ...); + /** * Execute the given command, sending "in" to its stdin, and capturing its * stdout and stderr in the "out" and "err" strbufs. Any of the three may diff --git a/sequencer.c b/sequencer.c index debb2ecbafe..20495db9de2 100644 --- a/sequencer.c +++ b/sequencer.c @@ -3558,12 +3558,10 @@ static int error_failed_squash(struct repository *r, static int do_exec(struct repository *r, const char *command_line) { - const char *child_argv[] = { NULL, NULL }; int dirty, status; fprintf(stderr, _("Executing: %s\n"), command_line); - child_argv[0] = command_line; - status = run_command_v_opt(child_argv, RUN_USING_SHELL); + status = run_command_l_opt(RUN_USING_SHELL, command_line, NULL); /* force re-reading of the cache */ if (discard_index(r->index) < 0 || repo_read_index(r) < 0) diff --git a/t/helper/test-fake-ssh.c b/t/helper/test-fake-ssh.c index 12beee99ad2..7967478a40a 100644 --- a/t/helper/test-fake-ssh.c +++ b/t/helper/test-fake-ssh.c @@ -8,7 +8,6 @@ int cmd_main(int argc, const char **argv) struct strbuf buf = STRBUF_INIT; FILE *f; int i; - const char *child_argv[] = { NULL, NULL }; /* First, print all parameters into $TRASH_DIRECTORY/ssh-output */ if (!trash_directory) @@ -25,6 +24,5 @@ int cmd_main(int argc, const char **argv) /* Now, evaluate the *last* parameter */ if (argc < 2) return 0; - child_argv[0] = argv[argc - 1]; - return run_command_v_opt(child_argv, RUN_USING_SHELL); + return run_command_l_opt(RUN_USING_SHELL, argv[argc - 1], NULL); } From patchwork Fri Oct 14 15:40:16 2022 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: 13007146 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 92B7EC4332F for ; Fri, 14 Oct 2022 15:40:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230523AbiJNPkq (ORCPT ); Fri, 14 Oct 2022 11:40:46 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33034 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230514AbiJNPkf (ORCPT ); Fri, 14 Oct 2022 11:40:35 -0400 Received: from mail-wm1-x331.google.com (mail-wm1-x331.google.com [IPv6:2a00:1450:4864:20::331]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C9A4CD57E4 for ; Fri, 14 Oct 2022 08:40:32 -0700 (PDT) Received: by mail-wm1-x331.google.com with SMTP id 6-20020a1c0206000000b003c6c154d528so668299wmc.4 for ; Fri, 14 Oct 2022 08:40:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=WDMsddTcchLQ+RogwtGT9AYtAffFjvt6JtkN/S2ISbI=; b=himsfKbSEJokD0u4h9docFCbCUe/B9PiDAChKfJ6zrXbsLDtV/KRORfxiZLbtdkuO6 Jk4ZAICNHjjrctFfWfdkfyKOOWnLCssKghiTzLFQin+WR7KT8IckIy7MOei4jZmWG6yA xvguVpPiTurcAtllQ8K24p4TS/n8AhP2Mq76IkkfhWjNLetQEdkXlTYXjUiUhzyxPZTI Isy6kOMNiTw5xYA7pTNF3hK/6+9xZbVbT1mu3w7q4Ym1FcQCMprAl6US//vfXHY2pdrw boGv2aBQIHeWDxOh+xASe5K9jJyrtE6gluE3UAlQ98L0b13FMgdhp3MV6QAnjXSNWfKM i49Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=WDMsddTcchLQ+RogwtGT9AYtAffFjvt6JtkN/S2ISbI=; b=NVXFsmfmk27/grOMiNEWydsiD2zbEvFIIt+2cPWdlRG1tj4b0ZTEAReVUFh3/VtMCi AxtC1AKSddPHFaQnmrA9VUfeRQJ5AJor7dOMFyqqPBRcQ/An+8tnOX4fmcJjgeLqhyzO +QwmBvlfbicIiJeCfBQcvL/uWbvnJUS75N+MR2jv9eTCZWaceEvzkwrZfpO134qNCy+X tNwwJLBtpFzEQo6SKm8/bwgUUe9oa/Eup8DMk0qF6B9Cba0GmiWd3OKxN4aqm0bOz+hI zeKJDyFJyYlMbQoYoqwYcYxRq6/cde87mCV0xKB5g8ZPEbniepoiLNmvmvopPzSsJGs7 h2dg== X-Gm-Message-State: ACrzQf3pLS44JlGC/RGcr6rxnP5AA53nhApSEMc+Y5ylbaNS3XSDwwlO AJAxf/VXIZcmNo44mqGrzhDxADTEjEOO4Q== X-Google-Smtp-Source: AMsMyM4KHrt12gNpmhJ8JLg8AYVzUySn8+9ixdXjr9DtC7+cpIPKZXf1YcUYqqGbtHyhV5hKGkBy7g== X-Received: by 2002:a05:600c:198e:b0:3c6:e7e6:490 with SMTP id t14-20020a05600c198e00b003c6e7e60490mr2909321wmq.79.1665762031069; Fri, 14 Oct 2022 08:40:31 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id 123-20020a1c1981000000b003c6c4639ac6sm2385391wmz.34.2022.10.14.08.40.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Oct 2022 08:40:30 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Jeff King , =?utf-8?q?Ren=C3=A9_Scharfe?= , =?utf-8?b?w4Z2YXIgQXJuZmo=?= =?utf-8?b?w7Zyw7AgQmphcm1hc29u?= Subject: [PATCH 04/10] am: use run_command_l_opt() for show_patch() Date: Fri, 14 Oct 2022 17:40:16 +0200 Message-Id: X-Mailer: git-send-email 2.38.0.1092.g8c0298861b0 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org The "git show" invocation added in 66335298a47 (rebase: add --show-current-patch, 2018-02-11) is a one-off, and one where we're not calling oid_to_hex() twice. So we can rely on the static buffer that oid_to_hex() points to, rather than xstrdup()-ing it. As a result we can use the run_command_l_opt() function. Signed-off-by: Ævar Arnfjörð Bjarmason --- builtin/am.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/builtin/am.c b/builtin/am.c index 39fea248330..1d298a91306 100644 --- a/builtin/am.c +++ b/builtin/am.c @@ -2186,16 +2186,10 @@ static int show_patch(struct am_state *state, enum show_patch_type sub_mode) const char *patch_path; int len; - if (!is_null_oid(&state->orig_commit)) { - const char *av[4] = { "show", NULL, "--", NULL }; - char *new_oid_str; - int ret; - - av[1] = new_oid_str = xstrdup(oid_to_hex(&state->orig_commit)); - ret = run_command_v_opt(av, RUN_GIT_CMD); - free(new_oid_str); - return ret; - } + if (!is_null_oid(&state->orig_commit)) + return run_command_l_opt(RUN_GIT_CMD, "show", + oid_to_hex(&state->orig_commit), + "--", NULL); switch (sub_mode) { case SHOW_PATCH_RAW: From patchwork Fri Oct 14 15:40:17 2022 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: 13007147 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 97E16C43219 for ; Fri, 14 Oct 2022 15:40:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231156AbiJNPkr (ORCPT ); Fri, 14 Oct 2022 11:40:47 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33102 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230517AbiJNPkf (ORCPT ); Fri, 14 Oct 2022 11:40:35 -0400 Received: from mail-wr1-x431.google.com (mail-wr1-x431.google.com [IPv6:2a00:1450:4864:20::431]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 278D5EA37B for ; Fri, 14 Oct 2022 08:40:33 -0700 (PDT) Received: by mail-wr1-x431.google.com with SMTP id bu30so8158715wrb.8 for ; Fri, 14 Oct 2022 08:40:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=zvNgDTNWspXdQYWjfMNnNU7pq+rmI/6FtHUPNOtVF3w=; b=QqbWogzgzcztXDsHg5M9JAnBX41RSQnDS7d60RohvUNQt8ww/n8W76Ya6hcGMZWcn7 ReQn+BjEfyFKpIEkBCGHvxkDO2JGyKZ+09K9+ktqBnN93RUfVKdZiLEa8mJ6m7KsSerZ PcDx4+NcXLiStKd88zQOL0K06vBT7rTAi1AfFmzBnOwk1ni6UxD0aWHOpXInJmn/pUix SlFkrxTOpfogODEeDpewV9fTsNoj3Y4kbdWPGLY4i8uh0srfWKMPPncNuLUE8KM0NapH n+3QOsReEE/c4Fqwl7cgZHXl0W/CRhRZBnUA2Sa0S5MqKfgVZoMe+M29Ttius98+4/UQ wPXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=zvNgDTNWspXdQYWjfMNnNU7pq+rmI/6FtHUPNOtVF3w=; b=IejCs9YE5IZCMQckgWh68/SblgHGCg0U7U037YYkb9RzYDg5ve/y3weTZXY/kGj4r+ o77z92biwHqKjmQQ8VupgehRF80HLRGPErzpkio/CfFipM6Il3mCXO7GNjsx/Ie3O1cx mUEqyMIzc6eLbtR4PFfGD8SfXeLqVo3UrEVrTVRQb0ncA+YKqzxwqBrvsTOOMXSb3jWA +trn4gAEzMZLhc4uxJ9jr3hD+NIjUjS5DWHFtvOvTjk15P4XKfzwr8SCMcuWIn6rW6A+ JvHFV9N1cLzkTa3FRzxF0l71DNh2zE+iBuKrL+jGGIxdGysTRcqC1fhsJ/eC3ctaFv9Y jMMg== X-Gm-Message-State: ACrzQf2EHTHfLAu4HuUHqBux4VmxIiIt5yXStfbxMgk/07kamvmx0Skn tKh+J9GiL/ODnMWrJ6B3C4WY0UXR4JibFQ== X-Google-Smtp-Source: AMsMyM5cjhy1yLLDKkYgNlWqRlOULyIClvmOxVtaNqBX/wllN7jinJL80VUNbER+1bUDZDBdZQWjYQ== X-Received: by 2002:a5d:4f8b:0:b0:22e:40fc:bd1b with SMTP id d11-20020a5d4f8b000000b0022e40fcbd1bmr3767892wru.717.1665762032097; Fri, 14 Oct 2022 08:40:32 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id 123-20020a1c1981000000b003c6c4639ac6sm2385391wmz.34.2022.10.14.08.40.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Oct 2022 08:40:31 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Jeff King , =?utf-8?q?Ren=C3=A9_Scharfe?= , =?utf-8?b?w4Z2YXIgQXJuZmo=?= =?utf-8?b?w7Zyw7AgQmphcm1hc29u?= Subject: [PATCH 05/10] run-command API docs: clarify & fleshen out run_command_v_opt*() docs Date: Fri, 14 Oct 2022 17:40:17 +0200 Message-Id: X-Mailer: git-send-email 2.38.0.1092.g8c0298861b0 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Add a discussion of the flags that were missing to the run_command_v_opt*() docs, and in doing so format them such that we can easily add or remove flags from a table in the future, rather than having them tied up in prose. Let's also clarify why the user might want to use this API over run_command() itself. Signed-off-by: Ævar Arnfjörð Bjarmason --- run-command.h | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/run-command.h b/run-command.h index 6320d70f062..cf250e36426 100644 --- a/run-command.h +++ b/run-command.h @@ -234,13 +234,28 @@ int run_auto_maintenance(int quiet); #define RUN_CLOSE_OBJECT_STORE (1<<7) /** - * Convenience functions that encapsulate a sequence of - * start_command() followed by finish_command(). The argument argv - * specifies the program and its arguments. The argument opt is zero - * or more of the flags `RUN_COMMAND_NO_STDIN`, `RUN_GIT_CMD`, - * `RUN_COMMAND_STDOUT_TO_STDERR`, or `RUN_SILENT_EXEC_FAILURE` - * that correspond to the members .no_stdin, .git_cmd, - * .stdout_to_stderr, .silent_exec_failure of `struct child_process`. + * The run_command_v_opt*() API is a convenience wrapper for an + * underlying run_command(). + * + * It's intended to be used when the user already has an "argv" they'd + * like to use. As opposed to the "struct child_process"'s "args" + * member, which will be strvec_clear()'d by calling run_command(), + * the caller owns the "argv", which is not altered by invoking these + * functions. + * + * The "opt" flags that will cause various underlying run_command() + * members to be set. The flags and the corresponding struct members + * are: + * + * - RUN_COMMAND_NO_STDIN: .no_stdin + * - RUN_GIT_CMD: .git_cmd + * - RUN_COMMAND_STDOUT_TO_STDERR: .stdout_to_stderr + * - RUN_SILENT_EXEC_FAILURE: .silent_exec_failure + * - RUN_USING_SHELL: .use_shell + * - RUN_CLEAN_ON_EXIT: .clean_on_exit + * - RUN_WAIT_AFTER_CLEAN: .wait_after_clean + * - RUN_CLOSE_OBJECT_STORE: .close_object_store + * * The argument dir corresponds the member .dir. The argument env * corresponds to the member .env. */ From patchwork Fri Oct 14 15:40:18 2022 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: 13007148 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6C068C4332F for ; Fri, 14 Oct 2022 15:40:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231180AbiJNPk6 (ORCPT ); Fri, 14 Oct 2022 11:40:58 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34076 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231127AbiJNPko (ORCPT ); Fri, 14 Oct 2022 11:40:44 -0400 Received: from mail-wr1-x433.google.com (mail-wr1-x433.google.com [IPv6:2a00:1450:4864:20::433]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 05FD3F6151 for ; Fri, 14 Oct 2022 08:40:35 -0700 (PDT) Received: by mail-wr1-x433.google.com with SMTP id a3so8251333wrt.0 for ; Fri, 14 Oct 2022 08:40:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=czw+C2bEo+JIYG+MFFoenGzOzqMwi0isCQRejd0sv7w=; b=cChel47kxeW/kEm7c1q9OBfMtrfK8p/9XjWYeyDfiolmtuk0oyXeDIoif+9Lmj5yvJ DUbN7fuPGAxLjwBfT7GNTWesIsA5Ty3T7S3hI0CjcbJ6SG3Z1Sb/mZa1WnFvrNs0Y4K2 FwImq4LDnhzUfGCyzoKN5Wrw3TsbuYwJDmnpX85EtZ5qMzvtCCWaYMQb7ckmX2nR3MUU j7O2go45o2d/MfmVdsu+2Y7HwHcKK3cJYpyNc00U4OqKSsGSSL/LIrMZgXS0mV9OWVS2 LlDpLr4UtYG8jKF9bmwqbNjz/CS3EJZYKzn5KAXJ69GLIjl8D7mNks9t4IuY036EZgKW wlTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=czw+C2bEo+JIYG+MFFoenGzOzqMwi0isCQRejd0sv7w=; b=lourtNo6jdU+aXbIzfNWg/Gzk21dv1P9AJo+VGVSVdcD5KDJuwe1hvcj2REONCK7kJ qFUM6wD6Q+TXs/esjMfDUtbuv36EwaCq/K7W8WutNzdGz78IrdF16RDF8WZk4uo5Wozl a6JzfuUxBzccARIMo1cxJmJtMctJGp0W/SY4tb2ONhED3Hd/l8b5Hdh0MqcrNDkzw/wq TlnYEYQnw9WXtxB6vdb/gt4eBR+qHe2zBVyaSpUukwAO4xnjI2XLjRuamV37cVwTer3v jQVnUIJRf5UsJVySGRiduwAcyi7dAaP5ulXMtmmRDW7UhlYM3xG0dhZN7/7hUQlFv7ti JY9Q== X-Gm-Message-State: ACrzQf3kemp2JWpWsfdISkMeXULvCnutu32FTL/fvvhi4Mrz8HkrHGu1 43lClFBsMu5IudBCpXQERKbmSQBf0WM5xA== X-Google-Smtp-Source: AMsMyM6w45giNSzQ1AdkVCnpYuKywGcftA8qaXOIWt+C+YON1LMmepP3Ur56h6wHqJLK4ihuzfU7oQ== X-Received: by 2002:a5d:648c:0:b0:22e:63be:be09 with SMTP id o12-20020a5d648c000000b0022e63bebe09mr3788195wri.159.1665762033370; Fri, 14 Oct 2022 08:40:33 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id 123-20020a1c1981000000b003c6c4639ac6sm2385391wmz.34.2022.10.14.08.40.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Oct 2022 08:40:32 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Jeff King , =?utf-8?q?Ren=C3=A9_Scharfe?= , =?utf-8?b?w4Z2YXIgQXJuZmo=?= =?utf-8?b?w7Zyw7AgQmphcm1hc29u?= Subject: [PATCH 06/10] run-command API: remove RUN_COMMAND_STDOUT_TO_STDERR flag Date: Fri, 14 Oct 2022 17:40:18 +0200 Message-Id: X-Mailer: git-send-email 2.38.0.1092.g8c0298861b0 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org The run_command_v_opt*() API is meant to handle various common cases where we don't want the verbosity of calling the underlying run_command(), but we're explicitly not trying to cover the full API surface of run_command() itself. So if we're not using some of these flags we probably won't need them again, any future user who needs to set "stdout_to_stderr" can just use run_command() itself, and the convenience API shouldn't be cluttered by trying to handle all the needs of various one-offs. So let's remove the RUN_COMMAND_STDOUT_TO_STDERR flag, it hasn't been used since 860a2ebecd2 (receive-pack: send auto-gc output over sideband 2, 2016-06-05) when its last user started using the underlying API directly. Signed-off-by: Ævar Arnfjörð Bjarmason --- run-command.c | 1 - run-command.h | 12 +++++------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/run-command.c b/run-command.c index 0be5626f7f2..fe1b4a0b650 100644 --- a/run-command.c +++ b/run-command.c @@ -1008,7 +1008,6 @@ static void run_command_set_opts(struct child_process *cmd, int opt) { cmd->no_stdin = opt & RUN_COMMAND_NO_STDIN ? 1 : 0; cmd->git_cmd = opt & RUN_GIT_CMD ? 1 : 0; - cmd->stdout_to_stderr = opt & RUN_COMMAND_STDOUT_TO_STDERR ? 1 : 0; cmd->silent_exec_failure = opt & RUN_SILENT_EXEC_FAILURE ? 1 : 0; cmd->use_shell = opt & RUN_USING_SHELL ? 1 : 0; cmd->clean_on_exit = opt & RUN_CLEAN_ON_EXIT ? 1 : 0; diff --git a/run-command.h b/run-command.h index cf250e36426..0af01bd9b67 100644 --- a/run-command.h +++ b/run-command.h @@ -226,12 +226,11 @@ int run_auto_maintenance(int quiet); #define RUN_COMMAND_NO_STDIN (1<<0) #define RUN_GIT_CMD (1<<1) -#define RUN_COMMAND_STDOUT_TO_STDERR (1<<2) -#define RUN_SILENT_EXEC_FAILURE (1<<3) -#define RUN_USING_SHELL (1<<4) -#define RUN_CLEAN_ON_EXIT (1<<5) -#define RUN_WAIT_AFTER_CLEAN (1<<6) -#define RUN_CLOSE_OBJECT_STORE (1<<7) +#define RUN_SILENT_EXEC_FAILURE (1<<2) +#define RUN_USING_SHELL (1<<3) +#define RUN_CLEAN_ON_EXIT (1<<4) +#define RUN_WAIT_AFTER_CLEAN (1<<5) +#define RUN_CLOSE_OBJECT_STORE (1<<6) /** * The run_command_v_opt*() API is a convenience wrapper for an @@ -249,7 +248,6 @@ int run_auto_maintenance(int quiet); * * - RUN_COMMAND_NO_STDIN: .no_stdin * - RUN_GIT_CMD: .git_cmd - * - RUN_COMMAND_STDOUT_TO_STDERR: .stdout_to_stderr * - RUN_SILENT_EXEC_FAILURE: .silent_exec_failure * - RUN_USING_SHELL: .use_shell * - RUN_CLEAN_ON_EXIT: .clean_on_exit From patchwork Fri Oct 14 15:40:19 2022 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: 13007150 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6F51BC4332F for ; Fri, 14 Oct 2022 15:41:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231194AbiJNPlC (ORCPT ); Fri, 14 Oct 2022 11:41:02 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34158 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231145AbiJNPkp (ORCPT ); Fri, 14 Oct 2022 11:40:45 -0400 Received: from mail-wr1-x435.google.com (mail-wr1-x435.google.com [IPv6:2a00:1450:4864:20::435]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 141C111463 for ; Fri, 14 Oct 2022 08:40:36 -0700 (PDT) Received: by mail-wr1-x435.google.com with SMTP id w18so8160254wro.7 for ; Fri, 14 Oct 2022 08:40:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=8303stTuwgLVqHRzW06UPCvIrmHu/7v7E3qPwvU07jU=; b=lLuj5mUp4jXZQ+Z+p7NdYsXqrsCjZBv4Sajp7LVtaLj3q8MGC6ijuntMtao6orAN1v dnkApPYmFrvXJ+gx2+r2IhDnYxCmWnGdBinmA4WQxgFMa9Gqx53g4NXYlZI8aBHuemYf 4UIeZiy1dta2iDynhtLmOeTwj4NRc39usbk14RegJZ7LXnxILQAjJYSo8th1llHWGj1f YsWhYFPFt9wYlA83a0nWXhLt9NW5uIzIxnUkhLu0ovcnLnmW3eP7+EKJfhUgqi6nTlw+ YtbN1NgnDwmO8LKwS7ppAhQvWO4X6AN4yCUC9vH77LAdw0T6xoej2WUSxzLObbmgTks+ E+Dw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=8303stTuwgLVqHRzW06UPCvIrmHu/7v7E3qPwvU07jU=; b=i5P1gURvaq4SPAYtqooL2FXyHjZRERQITNeOi19bIYtNCXR2a7kVsZOkWuOIHYLM63 ewwjCmCZ9GvmEyCfbX5Gbvqq/KX9arWobT6mYRX/vMz+N/9SppjnaeomQrc1BWoUX0fg nxhCXra4EbEqbUH9cFEzerQAocm5E/dZhdSCjG7TQLdAqZiTKCZNvE1ZzIK+Kfuc+1Pq YSHVsXVd8x1rsDITmfxnBYdeHoXmuy2mytaxiThwVLVpV6vnJT0yoJH5cQ+Imrs3zZv5 i3yYwXG498zHJCEfH/j6nW9O2mi6U6AO8s4RKsKlYV1Pprt2tTe3+anLlLdJpClDtHkK afXA== X-Gm-Message-State: ACrzQf1ag8C80APw6Ests+in8d8DaSROYgiHkYmGvhN3lkoxdHaXAK4l GgTwiddRLABhCkh7RD6z40xdvVYdI3N0kg== X-Google-Smtp-Source: AMsMyM4RPj2R34PEIVvBCcB5amMSS+23neLmI7I8xjEJzsOX91TrFLlMrPjMyoddwDaRgdoJ/np5YA== X-Received: by 2002:a05:6000:a11:b0:22e:3dab:537c with SMTP id co17-20020a0560000a1100b0022e3dab537cmr3926636wrb.638.1665762034638; Fri, 14 Oct 2022 08:40:34 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id 123-20020a1c1981000000b003c6c4639ac6sm2385391wmz.34.2022.10.14.08.40.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Oct 2022 08:40:33 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Jeff King , =?utf-8?q?Ren=C3=A9_Scharfe?= , =?utf-8?b?w4Z2YXIgQXJuZmo=?= =?utf-8?b?w7Zyw7AgQmphcm1hc29u?= Subject: [PATCH 07/10] run-command API & diff.c: remove run_command_v_opt_cd_env() Date: Fri, 14 Oct 2022 17:40:19 +0200 Message-Id: X-Mailer: git-send-email 2.38.0.1092.g8c0298861b0 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org As we'll see in subsequent commits most of the run_command_v_opt_*() API users are a bad fit for what we'd like to do with that API. The ideal use-case for it is something where we already have an "argv", and don't want the one-shot semantics of run_command(). In the case of run_command_v_opt_cd_env() there was only user of it, and that user was just accumulating complexity by not using run_command() directly. By not having to maintain its own "argv" and "env" it doesn't have to strvec_clear() them both, which in the case of run_command() will be done by child_process_clear() before it returns. Signed-off-by: Ævar Arnfjörð Bjarmason --- diff.c | 26 ++++++++++++-------------- run-command.c | 7 +------ run-command.h | 3 +-- tmp-objdir.h | 6 ++++-- 4 files changed, 18 insertions(+), 24 deletions(-) diff --git a/diff.c b/diff.c index 648f6717a55..392530016fa 100644 --- a/diff.c +++ b/diff.c @@ -4278,35 +4278,33 @@ static void run_external_diff(const char *pgm, const char *xfrm_msg, struct diff_options *o) { - struct strvec argv = STRVEC_INIT; - struct strvec env = STRVEC_INIT; struct diff_queue_struct *q = &diff_queued_diff; + struct child_process cmd = CHILD_PROCESS_INIT; - strvec_push(&argv, pgm); - strvec_push(&argv, name); + strvec_push(&cmd.args, pgm); + strvec_push(&cmd.args, name); if (one && two) { - add_external_diff_name(o->repo, &argv, name, one); + add_external_diff_name(o->repo, &cmd.args, name, one); if (!other) - add_external_diff_name(o->repo, &argv, name, two); + add_external_diff_name(o->repo, &cmd.args, name, two); else { - add_external_diff_name(o->repo, &argv, other, two); - strvec_push(&argv, other); - strvec_push(&argv, xfrm_msg); + add_external_diff_name(o->repo, &cmd.args, other, two); + strvec_push(&cmd.args, other); + strvec_push(&cmd.args, xfrm_msg); } } - strvec_pushf(&env, "GIT_DIFF_PATH_COUNTER=%d", ++o->diff_path_counter); - strvec_pushf(&env, "GIT_DIFF_PATH_TOTAL=%d", q->nr); + strvec_pushf(&cmd.env, "GIT_DIFF_PATH_COUNTER=%d", ++o->diff_path_counter); + strvec_pushf(&cmd.env, "GIT_DIFF_PATH_TOTAL=%d", q->nr); diff_free_filespec_data(one); diff_free_filespec_data(two); - if (run_command_v_opt_cd_env(argv.v, RUN_USING_SHELL, NULL, env.v)) + cmd.use_shell = 1; + if (run_command(&cmd)) die(_("external diff died, stopping at %s"), name); remove_tempfile(); - strvec_clear(&argv); - strvec_clear(&env); } static int similarity_index(struct diff_filepair *p) diff --git a/run-command.c b/run-command.c index fe1b4a0b650..6132a9f19f0 100644 --- a/run-command.c +++ b/run-command.c @@ -1032,7 +1032,7 @@ int run_command_l_opt(int opt, ...) int run_command_v_opt(const char **argv, int opt) { - return run_command_v_opt_cd_env(argv, opt, NULL, NULL); + return run_command_v_opt_cd_env_tr2(argv, opt, NULL, NULL, NULL); } int run_command_v_opt_tr2(const char **argv, int opt, const char *tr2_class) @@ -1040,11 +1040,6 @@ int run_command_v_opt_tr2(const char **argv, int opt, const char *tr2_class) return run_command_v_opt_cd_env_tr2(argv, opt, NULL, NULL, tr2_class); } -int run_command_v_opt_cd_env(const char **argv, int opt, const char *dir, const char *const *env) -{ - return run_command_v_opt_cd_env_tr2(argv, opt, dir, env, NULL); -} - static int run_command_v_opt_cd_env_tr2_1(struct child_process *cmd, int opt, const char *dir, const char *const *env, diff --git a/run-command.h b/run-command.h index 0af01bd9b67..2574d46cb70 100644 --- a/run-command.h +++ b/run-command.h @@ -152,7 +152,7 @@ struct child_process { /** * The functions: child_process_init, start_command, finish_command, * run_command, run_command_l_opt, run_command_v_opt, - * run_command_v_opt_cd_env, child_process_clear do the following: + * child_process_clear do the following: * * - If a system call failed, errno is set and -1 is returned. A diagnostic * is printed. @@ -263,7 +263,6 @@ int run_command_v_opt_tr2(const char **argv, int opt, const char *tr2_class); * env (the environment) is to be formatted like environ: "VAR=VALUE". * To unset an environment variable use just "VAR". */ -int run_command_v_opt_cd_env(const char **argv, int opt, const char *dir, const char *const *env); int run_command_v_opt_cd_env_tr2(const char **argv, int opt, const char *dir, const char *const *env, const char *tr2_class); diff --git a/tmp-objdir.h b/tmp-objdir.h index 76efc7edee5..c96aa77396d 100644 --- a/tmp-objdir.h +++ b/tmp-objdir.h @@ -10,9 +10,11 @@ * * Example: * + * struct child_process cmd = CHILD_PROCESS_INIT; + * ... * struct tmp_objdir *t = tmp_objdir_create("incoming"); - * if (!run_command_v_opt_cd_env(cmd, 0, NULL, tmp_objdir_env(t)) && - * !tmp_objdir_migrate(t)) + * strvec_pushl(&cmd.env, tmp_objdir_env(t)); + * if (!run_command(&cmd) && !tmp_objdir_migrate(t)) * printf("success!\n"); * else * die("failed...tmp_objdir will clean up for us"); From patchwork Fri Oct 14 15:40:20 2022 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: 13007149 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8EFCBC43217 for ; Fri, 14 Oct 2022 15:41:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229796AbiJNPk7 (ORCPT ); Fri, 14 Oct 2022 11:40:59 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34080 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231132AbiJNPko (ORCPT ); Fri, 14 Oct 2022 11:40:44 -0400 Received: from mail-wm1-x331.google.com (mail-wm1-x331.google.com [IPv6:2a00:1450:4864:20::331]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E1A06136412 for ; Fri, 14 Oct 2022 08:40:36 -0700 (PDT) Received: by mail-wm1-x331.google.com with SMTP id 6-20020a1c0206000000b003c6c154d528so668500wmc.4 for ; Fri, 14 Oct 2022 08:40:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=hMmTZ84LRl1cKUH9c/6XaQnfWOvXVtaEIbKisUsW30Y=; b=OPcOlbawIyBraQKuCrXYQ2hOjd0cimKtUnKhNMMPjU7xN0fYXR6GihEe2RCVI2630w UAmUVbWn9s9ON06IIIM6i3JCaF4BbyCrD2n6HObBxVNA9KPUf+1HIoyUNOSEtOXNDav+ wi9e3zvSOfmpjVbwaMwzlLMiTSxNFvpdYdXEOaIJSB5jgFZzr/ckHSo1f+h399uXIsYP oD2uQL4dvXmt5X9D1E9jN7hNwoSfntj60tQ4wNdsOjBNq0k8lSEExNbIKyvt9k9o76lo 2XTV1jQk1+nNtZYbXMKzQBzk28bGNhLJ9LkfwLIDm4fyxkJNrXRfnlm8oUCoIT8+LgwQ 0oHQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=hMmTZ84LRl1cKUH9c/6XaQnfWOvXVtaEIbKisUsW30Y=; b=H3L8yU/2c77iD43B8Mm6Y5Q9S03HXq8TQPitgVhnC93l7YpQSNg+I9XXqrs6YhEU94 iZnLwX8RsMAWNyzRyRgL8nsrw8W/i09ehfJ7XgdpdkU0ept37r0MMNaY01cHzQQ7V6Kx +uElfmBzw60oEpUAaMo/fsDk79dcyOXrHAa3PNhWumRJBu4Z6PM/IRJdKf8+b8GKGzCZ BWlDnDd+38qDAviHxdIu+sho7HuGVNOZN83mX+tEZcx9b79q98lCqyP+Xpmi10A+do5F EH5j06NS90y0ms+WWtAFyooOhO05MYogvAU+z0VwAkkM14LJy+mznDN2U+Aep2aHSg4K DXSQ== X-Gm-Message-State: ACrzQf1T/huHWsgoWFONkr6e/kVVPOOGAaA8vef+Ol/zVNJLhtB0I088 j68jQ2G4gPmhBnp6RDiOzuq6T+9ASNO7VA== X-Google-Smtp-Source: AMsMyM7CGmrdTRQkuTmeyXdTPAzickYoWktTz1SYk+4YDK1ntt8sArQawz82qz64KkmbCE51iZjGqw== X-Received: by 2002:a05:600c:3543:b0:3b4:ba45:9945 with SMTP id i3-20020a05600c354300b003b4ba459945mr10748174wmq.58.1665762035757; Fri, 14 Oct 2022 08:40:35 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id 123-20020a1c1981000000b003c6c4639ac6sm2385391wmz.34.2022.10.14.08.40.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Oct 2022 08:40:35 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Jeff King , =?utf-8?q?Ren=C3=A9_Scharfe?= , =?utf-8?b?w4Z2YXIgQXJuZmo=?= =?utf-8?b?w7Zyw7AgQmphcm1hc29u?= Subject: [PATCH 08/10] run-command API & users: remove run_command_v_opt_tr2() Date: Fri, 14 Oct 2022 17:40:20 +0200 Message-Id: X-Mailer: git-send-email 2.38.0.1092.g8c0298861b0 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org As noted in the preceding commit for run_command_v_opt_cd_env() that function's users could more easily use the underlying run_command() directly. In the case of the "git.c" user that can be argued the other way, given the slight line count increase here, but part of that's because the "args" in "git.c" was being leaked, which we now don't have to worry about. That just leaves the spawn_daemon() user in "fsmonitor-ipc.c", it's likewise slightly more verbose as a result, but by making it use run_command() we can remove this entire part of the API. As noted in a preceding commit run_command_v_opt*() should be aimed at handling various common cases, not these one-offs. The "fsmonitor-ipc.c" caller would be nicer with a hypothetical run_command_l_opt_tr2(), but let's not maintain such a thing only for it, as it would be its only user. Signed-off-by: Ævar Arnfjörð Bjarmason --- fsmonitor-ipc.c | 10 +++++++--- git.c | 15 +++++++++------ run-command.c | 28 ++-------------------------- run-command.h | 19 +++---------------- 4 files changed, 21 insertions(+), 51 deletions(-) diff --git a/fsmonitor-ipc.c b/fsmonitor-ipc.c index 789e7397baa..7251f48e456 100644 --- a/fsmonitor-ipc.c +++ b/fsmonitor-ipc.c @@ -56,10 +56,14 @@ enum ipc_active_state fsmonitor_ipc__get_state(void) static int spawn_daemon(void) { - const char *args[] = { "fsmonitor--daemon", "start", NULL }; + struct child_process cmd = CHILD_PROCESS_INIT; - return run_command_v_opt_tr2(args, RUN_COMMAND_NO_STDIN | RUN_GIT_CMD, - "fsmonitor"); + cmd.git_cmd = 1; + cmd.no_stdin = 1; + cmd.trace2_child_class = "fsmonitor"; + strvec_pushl(&cmd.args, "fsmonitor--daemon", "start", NULL); + + return run_command(&cmd); } int fsmonitor_ipc__send_query(const char *since_token, diff --git a/git.c b/git.c index da411c53822..ccf444417b5 100644 --- a/git.c +++ b/git.c @@ -787,7 +787,7 @@ static int run_argv(int *argcp, const char ***argv) if (!done_alias) handle_builtin(*argcp, *argv); else if (get_builtin(**argv)) { - struct strvec args = STRVEC_INIT; + struct child_process cmd = CHILD_PROCESS_INIT; int i; /* @@ -804,18 +804,21 @@ static int run_argv(int *argcp, const char ***argv) commit_pager_choice(); - strvec_push(&args, "git"); + strvec_push(&cmd.args, "git"); for (i = 0; i < *argcp; i++) - strvec_push(&args, (*argv)[i]); + strvec_push(&cmd.args, (*argv)[i]); - trace_argv_printf(args.v, "trace: exec:"); + trace_argv_printf(cmd.args.v, "trace: exec:"); /* * if we fail because the command is not found, it is * OK to return. Otherwise, we just pass along the status code. */ - i = run_command_v_opt_tr2(args.v, RUN_SILENT_EXEC_FAILURE | - RUN_CLEAN_ON_EXIT | RUN_WAIT_AFTER_CLEAN, "git_alias"); + cmd.silent_exec_failure = 1; + cmd.clean_on_exit = 1; + cmd.wait_after_clean = 1; + cmd.trace2_child_class = "git_alias"; + i = run_command(&cmd); if (i >= 0 || errno != ENOENT) exit(i); die("could not execute builtin %s", **argv); diff --git a/run-command.c b/run-command.c index 6132a9f19f0..0066ace85fa 100644 --- a/run-command.c +++ b/run-command.c @@ -1010,7 +1010,6 @@ static void run_command_set_opts(struct child_process *cmd, int opt) cmd->git_cmd = opt & RUN_GIT_CMD ? 1 : 0; cmd->silent_exec_failure = opt & RUN_SILENT_EXEC_FAILURE ? 1 : 0; cmd->use_shell = opt & RUN_USING_SHELL ? 1 : 0; - cmd->clean_on_exit = opt & RUN_CLEAN_ON_EXIT ? 1 : 0; cmd->wait_after_clean = opt & RUN_WAIT_AFTER_CLEAN ? 1 : 0; cmd->close_object_store = opt & RUN_CLOSE_OBJECT_STORE ? 1 : 0; } @@ -1031,35 +1030,12 @@ int run_command_l_opt(int opt, ...) } int run_command_v_opt(const char **argv, int opt) -{ - return run_command_v_opt_cd_env_tr2(argv, opt, NULL, NULL, NULL); -} - -int run_command_v_opt_tr2(const char **argv, int opt, const char *tr2_class) -{ - return run_command_v_opt_cd_env_tr2(argv, opt, NULL, NULL, tr2_class); -} - -static int run_command_v_opt_cd_env_tr2_1(struct child_process *cmd, int opt, - const char *dir, - const char *const *env, - const char *tr2_class) -{ - run_command_set_opts(cmd, opt); - cmd->dir = dir; - if (env) - strvec_pushv(&cmd->env, (const char **)env); - cmd->trace2_child_class = tr2_class; - return run_command(cmd); -} - -int run_command_v_opt_cd_env_tr2(const char **argv, int opt, const char *dir, - const char *const *env, const char *tr2_class) { struct child_process cmd = CHILD_PROCESS_INIT; strvec_pushv(&cmd.args, argv); - return run_command_v_opt_cd_env_tr2_1(&cmd, opt, dir, env, tr2_class); + run_command_set_opts(&cmd, opt); + return run_command(&cmd); } #ifndef NO_PTHREADS diff --git a/run-command.h b/run-command.h index 2574d46cb70..2b1fe3cde5c 100644 --- a/run-command.h +++ b/run-command.h @@ -228,12 +228,11 @@ int run_auto_maintenance(int quiet); #define RUN_GIT_CMD (1<<1) #define RUN_SILENT_EXEC_FAILURE (1<<2) #define RUN_USING_SHELL (1<<3) -#define RUN_CLEAN_ON_EXIT (1<<4) -#define RUN_WAIT_AFTER_CLEAN (1<<5) -#define RUN_CLOSE_OBJECT_STORE (1<<6) +#define RUN_WAIT_AFTER_CLEAN (1<<4) +#define RUN_CLOSE_OBJECT_STORE (1<<5) /** - * The run_command_v_opt*() API is a convenience wrapper for an + * The run_command_v_opt() function is a convenience wrapper for an * underlying run_command(). * * It's intended to be used when the user already has an "argv" they'd @@ -250,21 +249,9 @@ int run_auto_maintenance(int quiet); * - RUN_GIT_CMD: .git_cmd * - RUN_SILENT_EXEC_FAILURE: .silent_exec_failure * - RUN_USING_SHELL: .use_shell - * - RUN_CLEAN_ON_EXIT: .clean_on_exit - * - RUN_WAIT_AFTER_CLEAN: .wait_after_clean * - RUN_CLOSE_OBJECT_STORE: .close_object_store - * - * The argument dir corresponds the member .dir. The argument env - * corresponds to the member .env. */ int run_command_v_opt(const char **argv, int opt); -int run_command_v_opt_tr2(const char **argv, int opt, const char *tr2_class); -/* - * env (the environment) is to be formatted like environ: "VAR=VALUE". - * To unset an environment variable use just "VAR". - */ -int run_command_v_opt_cd_env_tr2(const char **argv, int opt, const char *dir, - const char *const *env, const char *tr2_class); /** * The run_command_l_opt() function run_command_v_opt() takes a list From patchwork Fri Oct 14 15:40:21 2022 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: 13007151 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2B784C43217 for ; Fri, 14 Oct 2022 15:41:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231145AbiJNPlF (ORCPT ); Fri, 14 Oct 2022 11:41:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34296 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231152AbiJNPkp (ORCPT ); Fri, 14 Oct 2022 11:40:45 -0400 Received: from mail-wm1-x32d.google.com (mail-wm1-x32d.google.com [IPv6:2a00:1450:4864:20::32d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6CE3E15A305 for ; Fri, 14 Oct 2022 08:40:38 -0700 (PDT) Received: by mail-wm1-x32d.google.com with SMTP id c7-20020a05600c0ac700b003c6cad86f38so5635752wmr.2 for ; Fri, 14 Oct 2022 08:40:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=IV9VsMnmeNLvXObYBNqpDkqy5Y1QcPO4zazqC6lXxXc=; b=XZ7xDPbNSkGvfhzde4YH7OOvpuSrkG7iGSN3E9qsacyMlmhKtRTlDKtbQdu+lsV3MB E2IZZzxSd4bUOUvRAOntjPQrtrGCgSm5zJNx3uNAhKJDdXVh7D1amK05l2q7de0nSBRE LiiRKllrjv52LpCuYUJ03PyDHeHtSiCXo9H/Aq2AfcQ7OiN9F0T03KI5zEy/5EDO/SbY EjZQRhFoAvHDP8+4q/DUQOZ2S0rc7IbTanhNvrqMgAcARew/ncI/rhXQ98IparZl2Nzm c61QYPvPD0g7tkh79Y3arNzP/PzcLNx3jg9a3oWlj0neEqymNnkOZrxdA/9fTpoECn8/ v5HA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=IV9VsMnmeNLvXObYBNqpDkqy5Y1QcPO4zazqC6lXxXc=; b=Wd1MBfhjiuSGwlBPmAg61LZLSMR09B04TFQs/y2JpS94YdF00lQBsalvFB9+A8Nknz yAi8xQLlNs2sz5VIIX65J1R2svUinYCcfQFdbdGpwapY25YtZZvvx+SHKij393llz1tz XNH2PeCLI4IixXKntSOvhTFJ3af5UH7Iv7EyCFaRznmzlvnUG7RneHpKaTiqZS8r9Ly6 loferS8L0oIXBNVuvUs/xCAJHi72/2Yh5vUcHzMSdbjl/Ue2+LJaIlA5biBuWI0JoYre EVbn7PRO0xIXCNuoT8oVu06604+1lwZDvAD3ej2NUliQbUlH7nW5kojt05FIDHTewecJ kv7g== X-Gm-Message-State: ACrzQf1/MEBuN8rUotZhg5VKLYqPNeLaMHjpKexbu9yRu2tEQoNTbXPU 1QZabKWTZB/zQs2d5yCNIUGr9wq0sylFBg== X-Google-Smtp-Source: AMsMyM41vMTOM+4rq9PNK2zfVIimw/t1qrqIaPEVNnGM6k4BOq/J3KmeLIcejE76otAAtPLjvlro/A== X-Received: by 2002:a05:600c:5388:b0:3c5:4c1:a1f6 with SMTP id hg8-20020a05600c538800b003c504c1a1f6mr4127029wmb.11.1665762036899; Fri, 14 Oct 2022 08:40:36 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id 123-20020a1c1981000000b003c6c4639ac6sm2385391wmz.34.2022.10.14.08.40.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Oct 2022 08:40:36 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Jeff King , =?utf-8?q?Ren=C3=A9_Scharfe?= , =?utf-8?b?w4Z2YXIgQXJuZmo=?= =?utf-8?b?w7Zyw7AgQmphcm1hc29u?= Subject: [PATCH 09/10] gc: use strvec_pushf(), avoid redundant strbuf_detach() Date: Fri, 14 Oct 2022 17:40:21 +0200 Message-Id: X-Mailer: git-send-email 2.38.0.1092.g8c0298861b0 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Adjust code added in 3797a0a7b7a (maintenance: use Windows scheduled tasks, 2021-01-05) to use strvec_pushf() directly. Rather than having a function that returns a strbuf_detach() we need to free and have the "strvec_pushl()" do its own "xstrdup()" we can format this in-place. By changing this we only have the "strvec_clear()" between the "run_command_v_opt()" and the "return result" in "schtasks_remove_task()". In the subsequent commit we'll start using a helper which'll allow us to skip the "strvec_clear()". Signed-off-by: Ævar Arnfjörð Bjarmason --- builtin/gc.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/builtin/gc.c b/builtin/gc.c index 075b4637660..519e64e86ee 100644 --- a/builtin/gc.c +++ b/builtin/gc.c @@ -1894,12 +1894,7 @@ static int is_schtasks_available(void) #endif } -static char *schtasks_task_name(const char *frequency) -{ - struct strbuf label = STRBUF_INIT; - strbuf_addf(&label, "Git Maintenance (%s)", frequency); - return strbuf_detach(&label, NULL); -} +#define SCHTASKS_NAME_FMT "Git Maintenance (%s)" static int schtasks_remove_task(enum schedule_priority schedule) { @@ -1907,16 +1902,15 @@ static int schtasks_remove_task(enum schedule_priority schedule) int result; struct strvec args = STRVEC_INIT; const char *frequency = get_frequency(schedule); - char *name = schtasks_task_name(frequency); get_schedule_cmd(&cmd, NULL); strvec_split(&args, cmd); - strvec_pushl(&args, "/delete", "/tn", name, "/f", NULL); + strvec_pushl(&args, "/delete", "/tn", NULL); + strvec_pushf(&args, SCHTASKS_NAME_FMT, frequency); + strvec_pushl(&args, "/f", NULL); result = run_command_v_opt(args.v, 0); - strvec_clear(&args); - free(name); return result; } @@ -1935,7 +1929,6 @@ static int schtasks_schedule_task(const char *exec_path, enum schedule_priority const char *xml; struct tempfile *tfile; const char *frequency = get_frequency(schedule); - char *name = schtasks_task_name(frequency); struct strbuf tfilename = STRBUF_INIT; get_schedule_cmd(&cmd, NULL); @@ -2028,8 +2021,10 @@ static int schtasks_schedule_task(const char *exec_path, enum schedule_priority "\n"; fprintf(tfile->fp, xml, exec_path, exec_path, frequency); strvec_split(&child.args, cmd); - strvec_pushl(&child.args, "/create", "/tn", name, "/f", "/xml", - get_tempfile_path(tfile), NULL); + strvec_pushl(&child.args, "/create", "/tn", NULL); + strvec_pushf(&child.args, SCHTASKS_NAME_FMT, frequency); + strvec_pushl(&child.args, "/f", "/xml", + get_tempfile_path(tfile), NULL); close_tempfile_gently(tfile); child.no_stdout = 1; @@ -2040,7 +2035,6 @@ static int schtasks_schedule_task(const char *exec_path, enum schedule_priority result = finish_command(&child); delete_tempfile(&tfile); - free(name); return result; } From patchwork Fri Oct 14 15:40:22 2022 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: 13007152 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 69AEAC433FE for ; Fri, 14 Oct 2022 15:41:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231174AbiJNPlW (ORCPT ); Fri, 14 Oct 2022 11:41:22 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34160 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231165AbiJNPk5 (ORCPT ); Fri, 14 Oct 2022 11:40:57 -0400 Received: from mail-wm1-x336.google.com (mail-wm1-x336.google.com [IPv6:2a00:1450:4864:20::336]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F2B4818024A for ; Fri, 14 Oct 2022 08:40:40 -0700 (PDT) Received: by mail-wm1-x336.google.com with SMTP id iv17so3325379wmb.4 for ; Fri, 14 Oct 2022 08:40:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=BCJDH7D97rTg80cmdAamHQ62cGQKQK2n52aTiMAStxM=; b=ByN1LouT52kJH6Fw0gQVjmYjj6OD5ZOuuo7+P9G6jp+md858kGcDOK5j3AwcPLiHzC FJf5hBUQo3o/duxgiaTKYgQh+NDzgkDuLlELf4fEbU7qEsCRe1AYoLRKOzHhnuxWmPE7 u8M5cvyMnQzet4DwxMmEua6m3ghJmee/2I8xQ4jzq81GPyJHJmjyE1U4u2VhlKf/+jCQ ecxKfRLjdE00uLMwibOgmLQoUYzoBGQ6ruXwf8oJR9fRcL2TlESVzslvw92+3iuPtzzK ne/FORS5zbmL4QfjnDowJXXUyiirGfyoJ7K3j6KBTitoNeLr68IkqDv6MbCXdkXDBLNC hjtg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=BCJDH7D97rTg80cmdAamHQ62cGQKQK2n52aTiMAStxM=; b=X8pwsGz8pPK8dyLXGKlPl6oRNxwUi1Su7lHUpJyN7CPL8GgCH1XZkvv8A0as8WBhUG /Zuj2Ldld64sekxHTKzj1ZRfGZG+LeTS0rwtO0CytvRzQdGhLcaesagbTD1dtad+HSsM RrX0P+GnnPRnxXUFWsz8bQ+y/iz2bhItwTh/6kFGHMC2NfRXywOcX5W5WGvsVF3khNOp 77UT387RJpx05c0wouqhU8LMD2isElqwZuy/q2L1UTS7/ZNTXJChyublsHwKKyqT53Cs eRwNu5/LGzNvJxUP3aFUrObGp1Vm0EwADqgdJ2xE4XD+yYYBy5j0wt5KTOj+nYbxWk7Z Dlhw== X-Gm-Message-State: ACrzQf1oYBEiylkxRQwd/5jHPMnuRrYa626cykld6hfNZkkIjriqgiyn LwWHVfHoDF+IZztab0YPvud5T+H6GgvLhg== X-Google-Smtp-Source: AMsMyM5BMbd5iKxbpcn9JnHYdDHIuv7EDrn4b4z6usd9Fx+l0RxQbbCIx9ORCUEBd50Pcsew6/Ss/g== X-Received: by 2002:a05:600c:3c8e:b0:3b4:d224:addf with SMTP id bg14-20020a05600c3c8e00b003b4d224addfmr10863710wmb.132.1665762037967; Fri, 14 Oct 2022 08:40:37 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id 123-20020a1c1981000000b003c6c4639ac6sm2385391wmz.34.2022.10.14.08.40.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Oct 2022 08:40:37 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Jeff King , =?utf-8?q?Ren=C3=A9_Scharfe?= , =?utf-8?b?w4Z2YXIgQXJuZmo=?= =?utf-8?b?w7Zyw7AgQmphcm1hc29u?= Subject: [PATCH 10/10] run-command API: add and use a run_command_sv_opt() Date: Fri, 14 Oct 2022 17:40:22 +0200 Message-Id: X-Mailer: git-send-email 2.38.0.1092.g8c0298861b0 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Add a run_command_sv_opt() convenience wrapper for run_command_v_opt(), as noted in the API documentation this is for the common case of wanting to construct a "struct strvec" to pass to run_command_v_opt(), and as it's a one-shot to strvec_clear() it afterwards. Let's convert those API users that were using a "ret" variable to carry over to "return" after a "strvec_clear()" to use this new function instead. Let's leave aside the user in "builtin/bisect--helper.c"'s bisect_visualize(). There's an outstanding topic that's extensively modifying it. Signed-off-by: Ævar Arnfjörð Bjarmason --- add-interactive.c | 3 +-- builtin/add.c | 6 ++---- builtin/clone.c | 3 +-- builtin/gc.c | 5 +---- builtin/pull.c | 15 +++------------ builtin/remote.c | 5 +---- merge.c | 3 +-- run-command.h | 20 +++++++++++++++++++- scalar.c | 6 +----- sequencer.c | 11 ++--------- 10 files changed, 32 insertions(+), 45 deletions(-) diff --git a/add-interactive.c b/add-interactive.c index f071b2a1b4f..9c86f3b9532 100644 --- a/add-interactive.c +++ b/add-interactive.c @@ -1007,8 +1007,7 @@ static int run_diff(struct add_i_state *s, const struct pathspec *ps, if (files->selected[i]) strvec_push(&args, files->items.items[i].string); - res = run_command_v_opt(args.v, 0); - strvec_clear(&args); + res = run_command_sv_opt(&args, 0); } putchar('\n'); diff --git a/builtin/add.c b/builtin/add.c index f84372964c8..7c783eebc0e 100644 --- a/builtin/add.c +++ b/builtin/add.c @@ -240,7 +240,7 @@ static int refresh(int verbose, const struct pathspec *pathspec) int run_add_interactive(const char *revision, const char *patch_mode, const struct pathspec *pathspec) { - int status, i; + int i; struct strvec argv = STRVEC_INIT; int use_builtin_add_i = git_env_bool("GIT_TEST_ADD_I_USE_BUILTIN", -1); @@ -282,9 +282,7 @@ int run_add_interactive(const char *revision, const char *patch_mode, /* pass original pathspec, to be re-parsed */ strvec_push(&argv, pathspec->items[i].original); - status = run_command_v_opt(argv.v, RUN_GIT_CMD); - strvec_clear(&argv); - return status; + return run_command_sv_opt(&argv, RUN_GIT_CMD); } int interactive_add(const char **argv, const char *prefix, int patch) diff --git a/builtin/clone.c b/builtin/clone.c index 13fc7a4bc5d..eabf8e0f196 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -756,8 +756,7 @@ static int checkout(int submodule_progress, int filter_submodules) "--single-branch" : "--no-single-branch"); - err = run_command_v_opt(args.v, RUN_GIT_CMD); - strvec_clear(&args); + return run_command_sv_opt(&args, RUN_GIT_CMD); } return err; diff --git a/builtin/gc.c b/builtin/gc.c index 519e64e86ee..8393e19b504 100644 --- a/builtin/gc.c +++ b/builtin/gc.c @@ -1899,7 +1899,6 @@ static int is_schtasks_available(void) static int schtasks_remove_task(enum schedule_priority schedule) { const char *cmd = "schtasks"; - int result; struct strvec args = STRVEC_INIT; const char *frequency = get_frequency(schedule); @@ -1909,9 +1908,7 @@ static int schtasks_remove_task(enum schedule_priority schedule) strvec_pushf(&args, SCHTASKS_NAME_FMT, frequency); strvec_pushl(&args, "/f", NULL); - result = run_command_v_opt(args.v, 0); - strvec_clear(&args); - return result; + return run_command_sv_opt(&args, 0); } static int schtasks_remove_tasks(void) diff --git a/builtin/pull.c b/builtin/pull.c index 403a24d7ca6..2f36823c97e 100644 --- a/builtin/pull.c +++ b/builtin/pull.c @@ -516,7 +516,6 @@ static void parse_repo_refspecs(int argc, const char **argv, const char **repo, static int run_fetch(const char *repo, const char **refspecs) { struct strvec args = STRVEC_INIT; - int ret; strvec_pushl(&args, "fetch", "--update-head-ok", NULL); @@ -582,9 +581,7 @@ static int run_fetch(const char *repo, const char **refspecs) strvec_pushv(&args, refspecs); } else if (*refspecs) BUG("refspecs without repo?"); - ret = run_command_v_opt(args.v, RUN_GIT_CMD | RUN_CLOSE_OBJECT_STORE); - strvec_clear(&args); - return ret; + return run_command_sv_opt(&args, RUN_GIT_CMD | RUN_CLOSE_OBJECT_STORE); } /** @@ -653,7 +650,6 @@ static int update_submodules(void) */ static int run_merge(void) { - int ret; struct strvec args = STRVEC_INIT; strvec_pushl(&args, "merge", NULL); @@ -696,9 +692,7 @@ static int run_merge(void) strvec_push(&args, "--allow-unrelated-histories"); strvec_push(&args, "FETCH_HEAD"); - ret = run_command_v_opt(args.v, RUN_GIT_CMD); - strvec_clear(&args); - return ret; + return run_command_sv_opt(&args, RUN_GIT_CMD); } /** @@ -879,7 +873,6 @@ static int get_rebase_newbase_and_upstream(struct object_id *newbase, static int run_rebase(const struct object_id *newbase, const struct object_id *upstream) { - int ret; struct strvec args = STRVEC_INIT; strvec_push(&args, "rebase"); @@ -913,9 +906,7 @@ static int run_rebase(const struct object_id *newbase, strvec_push(&args, oid_to_hex(upstream)); - ret = run_command_v_opt(args.v, RUN_GIT_CMD); - strvec_clear(&args); - return ret; + return run_command_sv_opt(&args, RUN_GIT_CMD); } static int get_can_ff(struct object_id *orig_head, diff --git a/builtin/remote.c b/builtin/remote.c index 1d86c14297b..07de21a624e 100644 --- a/builtin/remote.c +++ b/builtin/remote.c @@ -1508,7 +1508,6 @@ static int update(int argc, const char **argv, const char *prefix) }; struct strvec fetch_argv = STRVEC_INIT; int default_defined = 0; - int retval; argc = parse_options(argc, argv, prefix, options, builtin_remote_update_usage, @@ -1534,9 +1533,7 @@ static int update(int argc, const char **argv, const char *prefix) } } - retval = run_command_v_opt(fetch_argv.v, RUN_GIT_CMD); - strvec_clear(&fetch_argv); - return retval; + return run_command_sv_opt(&fetch_argv, RUN_GIT_CMD); } static int remove_all_fetch_refspecs(const char *key) diff --git a/merge.c b/merge.c index 2382ff66d35..487debacecb 100644 --- a/merge.c +++ b/merge.c @@ -33,8 +33,7 @@ int try_merge_command(struct repository *r, for (j = remotes; j; j = j->next) strvec_push(&args, merge_argument(j->item)); - ret = run_command_v_opt(args.v, RUN_GIT_CMD); - strvec_clear(&args); + ret = run_command_sv_opt(&args, RUN_GIT_CMD); discard_index(r->index); if (repo_read_index(r) < 0) diff --git a/run-command.h b/run-command.h index 2b1fe3cde5c..639cee4f4fb 100644 --- a/run-command.h +++ b/run-command.h @@ -151,7 +151,7 @@ struct child_process { /** * The functions: child_process_init, start_command, finish_command, - * run_command, run_command_l_opt, run_command_v_opt, + * run_command, run_command_l_opt, run_command_v_opt, run_command_sv_opt, * child_process_clear do the following: * * - If a system call failed, errno is set and -1 is returned. A diagnostic @@ -262,6 +262,24 @@ int run_command_v_opt(const char **argv, int opt); LAST_ARG_MUST_BE_NULL int run_command_l_opt(int opt, ...); +/** + * The run_command_sv_opt() function is a wrapper for + * run_command_v_opt(). It takes a "struct strvec *args" which + * similarly to run_command() (but not run_command_sv_opt()) will be + * strvec_clear()'d before returning. + * + * Use it for the common case of constructing a "struct strvec" for a + * one-shot run_command_v_opt() invocation. + */ +RESULT_MUST_BE_USED +static inline int run_command_sv_opt(struct strvec *args, int opt) +{ + int ret = run_command_v_opt(args->v, opt); + + strvec_clear(args); + return ret; +} + /** * Execute the given command, sending "in" to its stdin, and capturing its * stdout and stderr in the "out" and "err" strbufs. Any of the three may diff --git a/scalar.c b/scalar.c index 6de9c0ee523..3480bf73cbd 100644 --- a/scalar.c +++ b/scalar.c @@ -72,7 +72,6 @@ static int run_git(const char *arg, ...) struct strvec argv = STRVEC_INIT; va_list args; const char *p; - int res; va_start(args, arg); strvec_push(&argv, arg); @@ -80,10 +79,7 @@ static int run_git(const char *arg, ...) strvec_push(&argv, p); va_end(args); - res = run_command_v_opt(argv.v, RUN_GIT_CMD); - - strvec_clear(&argv); - return res; + return run_command_sv_opt(&argv, RUN_GIT_CMD); } struct scalar_config { diff --git a/sequencer.c b/sequencer.c index 20495db9de2..7ee0e05512c 100644 --- a/sequencer.c +++ b/sequencer.c @@ -3183,7 +3183,6 @@ static int rollback_is_safe(void) static int reset_merge(const struct object_id *oid) { - int ret; struct strvec argv = STRVEC_INIT; strvec_pushl(&argv, "reset", "--merge", NULL); @@ -3191,10 +3190,7 @@ static int reset_merge(const struct object_id *oid) if (!is_null_oid(oid)) strvec_push(&argv, oid_to_hex(oid)); - ret = run_command_v_opt(argv.v, RUN_GIT_CMD); - strvec_clear(&argv); - - return ret; + return run_command_sv_opt(&argv, RUN_GIT_CMD); } static int rollback_single_pick(struct repository *r) @@ -4866,7 +4862,6 @@ static int pick_commits(struct repository *r, static int continue_single_pick(struct repository *r, struct replay_opts *opts) { struct strvec argv = STRVEC_INIT; - int ret; if (!refs_ref_exists(get_main_ref_store(r), "CHERRY_PICK_HEAD") && !refs_ref_exists(get_main_ref_store(r), "REVERT_HEAD")) @@ -4887,9 +4882,7 @@ static int continue_single_pick(struct repository *r, struct replay_opts *opts) */ strvec_pushl(&argv, "--no-edit", "--cleanup=strip", NULL); - ret = run_command_v_opt(argv.v, RUN_GIT_CMD); - strvec_clear(&argv); - return ret; + return run_command_sv_opt(&argv, RUN_GIT_CMD); } static int commit_staged_changes(struct repository *r,