From patchwork Thu May 20 08:18:58 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: 12269395 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 12605C433B4 for ; Thu, 20 May 2021 08:19:21 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id DCA73610A8 for ; Thu, 20 May 2021 08:19:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231175AbhETIUk (ORCPT ); Thu, 20 May 2021 04:20:40 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57158 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230339AbhETIUg (ORCPT ); Thu, 20 May 2021 04:20:36 -0400 Received: from mail-wr1-x42f.google.com (mail-wr1-x42f.google.com [IPv6:2a00:1450:4864:20::42f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A2F33C06175F for ; Thu, 20 May 2021 01:19:15 -0700 (PDT) Received: by mail-wr1-x42f.google.com with SMTP id i17so16641418wrq.11 for ; Thu, 20 May 2021 01:19:15 -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=0DM7g88S8qTw13CCLVk0BhRivg4tIZDvYn0SduUuGLM=; b=NDRavTxzIv5LaJd/JecOcgzSTecxqxtrZE7F9QtR3tW1+ZFdQxfufRivvUn2Y0x3OR QFZV8RvA9n9+vpgdmS2BVq/L5sO7/RMvHKOc61vO2LeJKBJMBf5dbszlwfcbv4iPEmxr jVzkkwW0K1Xm8Q9aZZnRSvC4TCjMBRkXyxm8eTMk3qLE4y70Z6UkQdcilJ2vbtd2AIYi hOpZ53y5xQrF5hdAZGt1TUJcxVLqodnfhrz82pOBW4SaEWlbrkVB59N15K0DOkC/g9SV lk42EjGVMS0wwwg3yEigvf1CMHNlZD8qRMSdny9Vt22dup57mHidnLj/hiHNWgROeQtj VJ8w== 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=0DM7g88S8qTw13CCLVk0BhRivg4tIZDvYn0SduUuGLM=; b=gPPLmuwJzfZpk5wse8iwfFXVTOMTpzDTlDiB2gDFJftZAUTb+dl+gePK+6FNQrs07W 42XeEQaQQeUPPEjEcfA+t5ohEHJs5ThQZ747MQ+DpfcQgHA+TKg7k2CCxHfPQUm5GNqE t5R7gzA85M/IfeLlSer8OIx1gPahAYh7oXgMgrG2WEYi3DW5mFPMBp/XZN5vcVGmfv9o 50GNiLeressBWdadth/kMkzx8iJYpno463PmuW/pfrLWuTGxyX11CN5/wu3llnnaAz17 4lwadzC67R7J+s8fU080iunTqsDf9kOkl69Ld0Io8dxpfizrq0i20UPDJOaLPkXgOQts 40ng== X-Gm-Message-State: AOAM53256ivmK3U8Y41bDUBKVBc9fRvWI3u2vLwJJ7bc900sZriMxXPV qkmnnS3z5zxQ8PkRMn3qxyD5ObL1nCzB9A== X-Google-Smtp-Source: ABdhPJyjVEPi+WVMKaDpLUasEI+WDhMarbkUUEU47SRihfYKNGIEZP1zHL5NfRIOzBYmg8vLN+7u7A== X-Received: by 2002:adf:d1c2:: with SMTP id b2mr2965515wrd.407.1621498754017; Thu, 20 May 2021 01:19:14 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id y20sm8900004wmi.0.2021.05.20.01.19.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 May 2021 01:19:13 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Gregory Anders , =?utf-8?b?xJBvw6BuIFRy4bqnbiBDw7RuZyBEYW5o?= , Jeff King , Eric Sunshine , Eric Wong , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= Subject: [PATCH v2 01/10] send-email: remove non-working support for "sendemail.smtpssl" Date: Thu, 20 May 2021 10:18:58 +0200 Message-Id: X-Mailer: git-send-email 2.32.0.rc0.405.g5d387561bb3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Remove the already dead code to support "sendemail.smtpssl" by finally removing the dead code supporting the configuration option. In f6bebd121ac (git-send-email: add support for TLS via Net::SMTP::SSL, 2008-06-25) the --smtp-ssl command-line option was documented as deprecated, later in 65180c66186 (List send-email config options in config.txt., 2009-07-22) the "sendemail.smtpssl" configuration option was also documented as such. Then in in 3ff15040e22 (send-email: fix regression in sendemail.identity parsing, 2019-05-17) I unintentionally removed support for it by introducing a bug in read_config(). As can be seen from the diff context we've already returned unless $enc i defined, so it's not possible for us to reach the "elsif" branch here. This code was therefore already dead since Git v2.23.0. So let's just remove it. We were already 11 years into a stated deprecation period of this variable when 3ff15040e22 landed, now it's around 13. Since it hasn't worked anyway for around 2 years it looks like we can safely remove it. The --smtp-ssl option is still deprecated, if someone cares they can follow-up and remove that too, but unlike the config option that one could still be in use in the wild. I'm just removing this code that's provably unused already. Signed-off-by: Ævar Arnfjörð Bjarmason --- Documentation/config/sendemail.txt | 3 --- git-send-email.perl | 6 +----- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/Documentation/config/sendemail.txt b/Documentation/config/sendemail.txt index cbc5af42fdf..50baa5d6bfb 100644 --- a/Documentation/config/sendemail.txt +++ b/Documentation/config/sendemail.txt @@ -8,9 +8,6 @@ sendemail.smtpEncryption:: See linkgit:git-send-email[1] for description. Note that this setting is not subject to the 'identity' mechanism. -sendemail.smtpssl (deprecated):: - Deprecated alias for 'sendemail.smtpEncryption = ssl'. - sendemail.smtpsslcertpath:: Path to ca-certificates (either a directory or a single file). Set it to an empty string to disable certificate verification. diff --git a/git-send-email.perl b/git-send-email.perl index 175da07d946..3ef194fe2da 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -383,11 +383,7 @@ sub read_config { my $enc = Git::config(@repo, $setting); return unless defined $enc; return if $configured->{$setting}++; - if (defined $enc) { - $smtp_encryption = $enc; - } elsif (Git::config_bool(@repo, "$prefix.smtpssl")) { - $smtp_encryption = 'ssl'; - } + $smtp_encryption = $enc; } } From patchwork Thu May 20 08:18:59 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: 12269399 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 8E7B9C433B4 for ; Thu, 20 May 2021 08:19:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 61AA4610A8 for ; Thu, 20 May 2021 08:19:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231193AbhETIUm (ORCPT ); Thu, 20 May 2021 04:20:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57168 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230406AbhETIUi (ORCPT ); Thu, 20 May 2021 04:20:38 -0400 Received: from mail-wr1-x434.google.com (mail-wr1-x434.google.com [IPv6:2a00:1450:4864:20::434]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 86558C061760 for ; Thu, 20 May 2021 01:19:16 -0700 (PDT) Received: by mail-wr1-x434.google.com with SMTP id z17so16644882wrq.7 for ; Thu, 20 May 2021 01:19:16 -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=Mcpi+veS1ouLAzwPPjWff4qtV+I+ikDsFN1D1lOXCXQ=; b=mX9LlIGO3Mnr5PWtUdefttycEabxGn+TaJ7xJIqa+iGco6yXntbVwQUw6kRxYocqaW u3y03X9FBLQToZfZ6rfA15iR7l9GE4MhSMji6eoFyENTF4vog8hRgHepgVMvAO4V16N0 Lc+FTBxmIPJGEKa/jpByYAiuCLSOZnbYhE+QO0wOXh8AeHZar+bZvaHosK9AkjgXqNDm AfutoEhc6bLiRqqMp9LTIVPTSA/A7y8oAu19CXI8bhsnuqxtT2U9RGcZXwcakNfc8g+3 qiUrtWP6fzYwevuluatFDXiMcxjdqM68cSUGIsV+FDOeICBv/ROcETcbTVUcKXvtST5g vAaQ== 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=Mcpi+veS1ouLAzwPPjWff4qtV+I+ikDsFN1D1lOXCXQ=; b=gOztidgF8KA4bi3wwhzSqjJxl/RZXozb644/m5V4K/lxJ1UJGhqZnlCTP9SVe9FiHC LJaTRHm//Cu9wrEzEP4IQxPEhjSSpSyk5GAONffHGj5W6GN8tQah+yau4VgryC0pRhEY iqZMLYRWjYQHPi71+1P7BDYXY2OK1SltMhGfDBx+CXwm/lN7pAVcOJ9QYRPQkRel/IQV FsZWVg/XxcVaysUZpInF/6UCmjcBWkrC1m4kD3h8Cufm3HY1ENn0k4u3wAAJ3EXWZ+sC 1CtbSHDhkftoCPm2k9pEPXQhNPn9KLXN49NW1GbEp/WKynXxqPM9m0S8mgBN3rLPuw9z 2Ckg== X-Gm-Message-State: AOAM531NZ7r2V06SC432YRoEopQM9PRL8FNFF1I8ZPa+Ju08dUTkqA1w CzAdJ5uddN++Cyr68QxJGpVDkyZ7In0mYQ== X-Google-Smtp-Source: ABdhPJzkmlyKo9c0q+p1FWAfTefvrkDEac88qPJJYq6pkRfuYw0lartlEnZQWbpVOb3HjYwzDwiRaw== X-Received: by 2002:a5d:4588:: with SMTP id p8mr2961492wrq.216.1621498754881; Thu, 20 May 2021 01:19:14 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id y20sm8900004wmi.0.2021.05.20.01.19.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 May 2021 01:19:14 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Gregory Anders , =?utf-8?b?xJBvw6BuIFRy4bqnbiBDw7RuZyBEYW5o?= , Jeff King , Eric Sunshine , Eric Wong , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= Subject: [PATCH v2 02/10] send-email: refactor sendemail.smtpencryption config parsing Date: Thu, 20 May 2021 10:18:59 +0200 Message-Id: X-Mailer: git-send-email 2.32.0.rc0.405.g5d387561bb3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org With the removal of the support for sendemail.smtpssl in the preceding commit the parsing of sendemail.smtpencryption is no longer special, and can by moved to %config_settings. This gets us rid of an unconditional call to Git::config(), which as we'll see in subsequent commits matters for startup performance. Signed-off-by: Ævar Arnfjörð Bjarmason --- git-send-email.perl | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/git-send-email.perl b/git-send-email.perl index 3ef194fe2da..f9d859da3ed 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -277,6 +277,7 @@ sub do_edit { ); my %config_settings = ( + "smtpencryption" => \$smtp_encryption, "smtpserver" => \$smtp_server, "smtpserverport" => \$smtp_server_port, "smtpserveroption" => \@smtp_server_options, @@ -377,14 +378,6 @@ sub read_config { $$target = $v; } } - - if (!defined $smtp_encryption) { - my $setting = "$prefix.smtpencryption"; - my $enc = Git::config(@repo, $setting); - return unless defined $enc; - return if $configured->{$setting}++; - $smtp_encryption = $enc; - } } # sendemail.identity yields to --identity. We must parse this From patchwork Thu May 20 08:19:00 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: 12269401 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 B17AEC433ED for ; Thu, 20 May 2021 08:19:24 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 91A7A61184 for ; Thu, 20 May 2021 08:19:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231205AbhETIUo (ORCPT ); Thu, 20 May 2021 04:20:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57172 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230527AbhETIUj (ORCPT ); Thu, 20 May 2021 04:20:39 -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 5C4A0C061574 for ; Thu, 20 May 2021 01:19:17 -0700 (PDT) Received: by mail-wr1-x431.google.com with SMTP id j14so14922979wrq.5 for ; Thu, 20 May 2021 01:19:17 -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=xjWYfUkOLhfBqzRrvPIkPY20lr+lidbzK5DR35M+UHs=; b=kNApqOByEccrSeK4YTf/Iwu9m0zcexpaIseTZw6WQRg0z9KXLrJ3G87grho2kpqsgl HwFmCN1EUzJA0WkAntAuY6Dbr//db13Rh9+qcNey3pNmLcXw0EFdCWPCtbyUKE9uNyi1 aQpDeSLhPnxkUHE3WorOwmIpvxAGpapmmsMF3mGlxWLeR9NsVUBuMNMkn532ANt1Kx+o P16PLkzOGwLnkY3Y6taUMyB7wpyEZX/KcVfayTsK8u2NZ95c02oly04B6QoTeuSq1hdk Oks/R8OQMvvH3OOEw9o6sL6j4PPA0/P92ZDoqEHrMQAnTcKVBwcrUmh6RudU6VfuLIdu jXzg== 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=xjWYfUkOLhfBqzRrvPIkPY20lr+lidbzK5DR35M+UHs=; b=nlbKjLrtNgopJn0/wjH+QDmhYWjsNgHQ+uBomR5UpoS1XcfeipsgpvipZxc4CFqThF Z8kwCCZ3+v9hj69vMP+ipUI6p5Hci721/xZo3MfxcuBr5htR78LvzahGZ9ZKDFYSp7xx tBce48hGeiZNd0nAUXQqvt7HPhoQLHckKfk3IyaNLOzOVyNpVkfx8IBZ3ZxIn7y4lUuS N2dvJBLKTNwRHKWY1Es6Nhe8EkDiK5ytIjs/oY3p4UB/pQtWrD/oEbJJKOMVkF2liowE pgTsG3oGh9jqQyjL6M7aIT1tzWZIMf1zFZfABADzthuWnepWt1nhrnkZ5MhmxHQA5RA3 GKfQ== X-Gm-Message-State: AOAM532P2S6f9DRJQWUqjzKu1X5LBmGTEWI8HCIHLg0Rr3RbOEGh9iqY xfd4UbJzLiaXrWzPTy8uyyTMMnkUUDJYyQ== X-Google-Smtp-Source: ABdhPJwoWuymEsBkI0Gn2r3yL6eWRykEJrWWuAk5mVrAmz87HrtHaByqczf5sF6Npl65VcZu8enn5Q== X-Received: by 2002:a05:6000:43:: with SMTP id k3mr3002802wrx.222.1621498755672; Thu, 20 May 2021 01:19:15 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id y20sm8900004wmi.0.2021.05.20.01.19.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 May 2021 01:19:15 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Gregory Anders , =?utf-8?b?xJBvw6BuIFRy4bqnbiBDw7RuZyBEYW5o?= , Jeff King , Eric Sunshine , Eric Wong , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= Subject: [PATCH v2 03/10] send-email: lazily load config for a big speedup Date: Thu, 20 May 2021 10:19:00 +0200 Message-Id: X-Mailer: git-send-email 2.32.0.rc0.405.g5d387561bb3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Reduce the time it takes git-send-email to get to even the most trivial of tasks (such as serving up its "-h" output) by first listing config keys that exist, and only then only call e.g. "git config --bool" on them if they do. Over a lot of runs this speeds the time to "-h" up for me from ~250ms to ~150ms, and the runtime of t9001-send-email.sh goes from ~25s to ~20s. This introduces a race condition where we'll do the "wrong" thing if a config key were to be inserted between us discovering the list and calling read_config(), i.e. we won't know about the racily added key. In theory this is a change in behavior, in practice it doesn't matter. The config_regexp() function being changed here was added in dd84e528a34 (git-send-email: die if sendmail.* config is set, 2020-07-23) for use by git-send-email. So we can change its odd return value in the case where no values are found by "git config". The difference in the *.pm code would matter if it was invoked in scalar context, but now it no longer is. Arguably this caching belongs in Git.pm itself, but in lieu of modifying it for all its callers let's only do this for "git send-email". The other big potential win would be "git svn", but unlike "git send-email" it doesn't check tens of config variables one at a time at startup (in my brief testing it doesn't check any). Signed-off-by: Ævar Arnfjörð Bjarmason --- git-send-email.perl | 35 ++++++++++++++++++++++++++--------- perl/Git.pm | 4 ++-- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/git-send-email.perl b/git-send-email.perl index f9d859da3ed..5b0b7c33ec6 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -337,11 +337,13 @@ sub signal_handler { # Read our sendemail.* config sub read_config { - my ($configured, $prefix) = @_; + my ($known_keys, $configured, $prefix) = @_; foreach my $setting (keys %config_bool_settings) { my $target = $config_bool_settings{$setting}; - my $v = Git::config_bool(@repo, "$prefix.$setting"); + my $key = "$prefix.$setting"; + next unless exists $known_keys->{$key}; + my $v = Git::config_bool(@repo, $key); next unless defined $v; next if $configured->{$setting}++; $$target = $v; @@ -349,8 +351,10 @@ sub read_config { foreach my $setting (keys %config_path_settings) { my $target = $config_path_settings{$setting}; + my $key = "$prefix.$setting"; + next unless exists $known_keys->{$key}; if (ref($target) eq "ARRAY") { - my @values = Git::config_path(@repo, "$prefix.$setting"); + my @values = Git::config_path(@repo, $key); next unless @values; next if $configured->{$setting}++; @$target = @values; @@ -365,14 +369,16 @@ sub read_config { foreach my $setting (keys %config_settings) { my $target = $config_settings{$setting}; + my $key = "$prefix.$setting"; + next unless exists $known_keys->{$key}; if (ref($target) eq "ARRAY") { - my @values = Git::config(@repo, "$prefix.$setting"); + my @values = Git::config(@repo, $key); next unless @values; next if $configured->{$setting}++; @$target = @values; } else { - my $v = Git::config(@repo, "$prefix.$setting"); + my $v = Git::config(@repo, $key); next unless defined $v; next if $configured->{$setting}++; $$target = $v; @@ -380,9 +386,20 @@ sub read_config { } } +# Save ourselves a lot of work of shelling out to 'git config' (it +# parses 'bool' etc.) by only doing so for config keys that exist. +my %known_config_keys; +{ + my @known_config_keys = Git::config_regexp("^sende?mail[.]"); + @known_config_keys{@known_config_keys} = (); +} + # sendemail.identity yields to --identity. We must parse this # special-case first before the rest of the config is read. -$identity = Git::config(@repo, "sendemail.identity"); +{ + my $key = "sendemail.identity"; + $identity = Git::config(@repo, $key) if exists $known_config_keys{$key}; +} my $rc = GetOptions( "identity=s" => \$identity, "no-identity" => \$no_identity, @@ -393,8 +410,8 @@ sub read_config { # Now we know enough to read the config { my %configured; - read_config(\%configured, "sendemail.$identity") if defined $identity; - read_config(\%configured, "sendemail"); + read_config(\%known_config_keys, \%configured, "sendemail.$identity") if defined $identity; + read_config(\%known_config_keys, \%configured, "sendemail"); } # Begin by accumulating all the variables (defined above), that we will end up @@ -478,7 +495,7 @@ sub read_config { usage(); } -if ($forbid_sendmail_variables && (scalar Git::config_regexp("^sendmail[.]")) != 0) { +if ($forbid_sendmail_variables && grep { /^sendmail/s } keys %known_config_keys) { die __("fatal: found configuration options for 'sendmail'\n" . "git-send-email is configured with the sendemail.* options - note the 'e'.\n" . "Set sendemail.forbidSendmailVariables to false to disable this check.\n"); diff --git a/perl/Git.pm b/perl/Git.pm index 73ebbf80cc6..06a10b175a7 100644 --- a/perl/Git.pm +++ b/perl/Git.pm @@ -754,8 +754,8 @@ sub config_regexp { } catch Git::Error::Command with { my $E = shift; if ($E->value() == 1) { - my @matches = (); - return @matches; + # Key(s) not found. + return; } else { throw $E; } From patchwork Thu May 20 08:19:01 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: 12269403 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 7ADAFC433B4 for ; Thu, 20 May 2021 08:19:25 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 578D960698 for ; Thu, 20 May 2021 08:19:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231215AbhETIUp (ORCPT ); Thu, 20 May 2021 04:20:45 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57182 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231160AbhETIUk (ORCPT ); Thu, 20 May 2021 04:20:40 -0400 Received: from mail-wr1-x430.google.com (mail-wr1-x430.google.com [IPv6:2a00:1450:4864:20::430]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 40377C06175F for ; Thu, 20 May 2021 01:19:18 -0700 (PDT) Received: by mail-wr1-x430.google.com with SMTP id d11so16634654wrw.8 for ; Thu, 20 May 2021 01:19:18 -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=M4faH6RYNlO/pm7Bw4L8i9QvqiyCzYWNSdjahLmtu5Q=; b=RXVwJmTDDl/8byXD5KcZEEoN+cQONdgJCbfplXdbT8wdgC8g46UZymKa6r7Qv7CSJ2 0i9mDyGaQT2ta9KC/xwam3sUaZvxfvwdhadwJDKZwPXZ9j35zqGLaAKRmgTs1KA82bET 0VflilLm9XI+5zwcLdk6lYYmn9hkg+atLjTDZvTbbSE37L2K+A3M76wr3hDfQ2Zde6EZ 2trXFxeEjsrVbbA9OzeqeBNv5X1gMZiq7UGfSddKJeH1XC20WBG9Nw0pqk6Sl5/40bW4 eOr5GzpvpmnHeFTDEMJ7t7U4jZfCNVOu1tZmZ88e2mvrjRxiWBGaN5lAQzGVj+mtyrKv pdxA== 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=M4faH6RYNlO/pm7Bw4L8i9QvqiyCzYWNSdjahLmtu5Q=; b=IkU0cREGk49kwbwvw9o2s+os1fC8ZyXm3/fB46t877IQzZHHdARnmQNNp2X/oCpg33 +GJXwsM3M9Hib4R0YEVtpvI8pfI8eDoXnecikL6jLX0U36IaV/Ph1fgNBx4Wr2C1ArKq QObFf85KX5phkxK62so4Q88UHPAkC7U/AvqY5zLRRMma5Pg/WUiupIW6lNgX8+N2UyD2 Esk9DFnjmyMuG/XSLVwvQJSQ5o9wjbmffDwHj87j5HDCcD7Qo5p+/0uRKwukenwm+wPx GgVCTxQBa9aRwl0uKYyop2+y98RIhuLyh+psKtKqbEaxsXwx92s3XUlTcJgZDcOxNXDm E4hQ== X-Gm-Message-State: AOAM5318Tt0TO0i1XvUd6Hx8tGAy8zT6MzqXfPcexUdfc3NvZlvJDgtO M18rsTb79gE8PbHECNQPWFMY67KsdMfTlA== X-Google-Smtp-Source: ABdhPJxJhQc7chkKElkwnuYxYMeJk51mzik2AZlGYUC7QCOlaxCGkdgxqxqh3xBADiPRw2bnlkC6jA== X-Received: by 2002:adf:ea0d:: with SMTP id q13mr3022298wrm.161.1621498756526; Thu, 20 May 2021 01:19:16 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id y20sm8900004wmi.0.2021.05.20.01.19.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 May 2021 01:19:15 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Gregory Anders , =?utf-8?b?xJBvw6BuIFRy4bqnbiBDw7RuZyBEYW5o?= , Jeff King , Eric Sunshine , Eric Wong , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= Subject: [PATCH v2 04/10] send-email: lazily shell out to "git var" Date: Thu, 20 May 2021 10:19:01 +0200 Message-Id: X-Mailer: git-send-email 2.32.0.rc0.405.g5d387561bb3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Optimize git-send-email by only shelling out to "git var" if we need to. This is easily done by re-inventing our own small version of perl's Memoize module. I suppose I could just use Memoize itself, but in a subsequent patch I'll be micro-optimizing send-email's use of dependencies. Using Memoize is a measly extra 5-10 milliseconds, but as we'll see that'll end up mattering for us in the end. This brings the runtime of a plain "send-email" from around ~160-170ms to ~140m-150ms. The runtime of the tests is around the same, or around ~20s. Signed-off-by: Ævar Arnfjörð Bjarmason --- git-send-email.perl | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/git-send-email.perl b/git-send-email.perl index 5b0b7c33ec6..9ff315f775c 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -560,8 +560,18 @@ sub read_config { } my ($repoauthor, $repocommitter); -($repoauthor) = Git::ident_person(@repo, 'author'); -($repocommitter) = Git::ident_person(@repo, 'committer'); +{ + my %cache; + my ($author, $committer); + my $common = sub { + my ($what) = @_; + return $cache{$what} if exists $cache{$what}; + ($cache{$what}) = Git::ident_person(@repo, $what); + return $cache{$what}; + }; + $repoauthor = sub { $common->('author') }; + $repocommitter = sub { $common->('committer') }; +} sub parse_address_line { return map { $_->format } Mail::Address->parse($_[0]); @@ -749,7 +759,7 @@ sub get_patch_subject { or die sprintf(__("Failed to open for writing %s: %s"), $compose_filename, $!); - my $tpl_sender = $sender || $repoauthor || $repocommitter || ''; + my $tpl_sender = $sender || $repoauthor->() || $repocommitter->() || ''; my $tpl_subject = $initial_subject || ''; my $tpl_in_reply_to = $initial_in_reply_to || ''; my $tpl_reply_to = $reply_to || ''; @@ -955,7 +965,7 @@ sub file_declares_8bit_cte { $sender =~ s/^\s+|\s+$//g; ($sender) = expand_aliases($sender); } else { - $sender = $repoauthor || $repocommitter || ''; + $sender = $repoauthor->() || $repocommitter->() || ''; } # $sender could be an already sanitized address @@ -1104,7 +1114,7 @@ sub make_message_id { $uniq = "$message_id_stamp-$message_id_serial"; my $du_part; - for ($sender, $repocommitter, $repoauthor) { + for ($sender, $repocommitter->(), $repoauthor->()) { $du_part = extract_valid_address(sanitize_address($_)); last if (defined $du_part and $du_part ne ''); } From patchwork Thu May 20 08:19:02 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: 12269405 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 7D3D1C43460 for ; Thu, 20 May 2021 08:19:26 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 5FB5361184 for ; Thu, 20 May 2021 08:19:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231218AbhETIUq (ORCPT ); Thu, 20 May 2021 04:20:46 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57184 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231176AbhETIUk (ORCPT ); Thu, 20 May 2021 04:20:40 -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 0EF01C061761 for ; Thu, 20 May 2021 01:19:19 -0700 (PDT) Received: by mail-wm1-x32d.google.com with SMTP id u133so8608183wmg.1 for ; Thu, 20 May 2021 01:19:18 -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=AaBdfw3GdZpYoGXSbn8rz6bzLF2PZkxjP1/zYS8+YnY=; b=EaeJD8w1/lq4KGDp+MG3c/L2YA/9yQH5L+YCW1h4x2Jw7k1UT05eGoSMUWmCxVcX7c FY2o0zbBIE+/CbSnLt9KXmsl98oJaCtMfiwUXg1ADrakFZdeauEoIEHFT5cT+7QXhgsZ q7qdb7gquNPP6bQ1IFgGbZa3v/+QY+k84HtV5BWJjH6XbDELjlg75EDbKc0SCM0sZGQ6 S8UZeMYw8HGU5a2Ow4OABytzpjzeMke0ZlCfjVzJRbQGzrMkuu6UOA/5HA6MwHHL4BkJ HyR+yquD6iMbHrb2teINQFqadvVfBqCXoTCxJe7QEQHJMmnEbK9TfRhkGqcb7jSDhdzI /Mog== 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=AaBdfw3GdZpYoGXSbn8rz6bzLF2PZkxjP1/zYS8+YnY=; b=aX4GNGbA2Bsm7U7yXnll/2BF4MVJ6gKdtsqm+OzjbhZi+5Sdhf1nUi8eoinLUOtTj8 T0KfuT62Ha4zJD2UlELtqhPYzFN22iYKMMtD6YeHuGrLWnKMWeTfe6kma92+qWKfkfx7 TS6tR3LXZTEWTdXP/5DajlieX3QSBwXtZ4aDnxQhP5bDKyMokh7v3l2vXONssvGGwE6Y T4QRcN1O21qPlqCSQ6rplugMkzzcz/cT/lgvMV4hWs7jW9df/hOarUfpvH6+ClN8dAXI 6CxRXZS194ntsFqSsF+7eaaEvG8TpJ1p9GH8TvnEKmuoaLwVybGq4VbwzYl//ucxwoWd xrog== X-Gm-Message-State: AOAM533a0ueor13RJM1M2BJabDaN02pxQFc7s9F7eVk1a1wVSSC/bDgu lMa+YTiTicnG5cWzXdNNOObMYM2r4KfYfg== X-Google-Smtp-Source: ABdhPJz4iu9/jJygDlPI6zi5hnJz9Npp+LO5mTedXYSnrA+EJiNd2aPiBjYXf6gI78iCwwqZm+cVCA== X-Received: by 2002:a05:600c:4fd6:: with SMTP id o22mr2345488wmq.83.1621498757423; Thu, 20 May 2021 01:19:17 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id y20sm8900004wmi.0.2021.05.20.01.19.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 May 2021 01:19:16 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Gregory Anders , =?utf-8?b?xJBvw6BuIFRy4bqnbiBDw7RuZyBEYW5o?= , Jeff King , Eric Sunshine , Eric Wong , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= Subject: [PATCH v2 05/10] send-email: use function syntax instead of barewords Date: Thu, 20 May 2021 10:19:02 +0200 Message-Id: X-Mailer: git-send-email 2.32.0.rc0.405.g5d387561bb3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Change calls like "__ 'foo'" to "__('foo')" so the Perl compiler doesn't have to guess that "__" is a function. This makes the code more readable. Signed-off-by: Ævar Arnfjörð Bjarmason --- git-send-email.perl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/git-send-email.perl b/git-send-email.perl index 9ff315f775c..da46925aa05 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -678,7 +678,7 @@ sub is_format_patch_arg { if (defined($format_patch)) { return $format_patch; } - die sprintf(__ < X-Patchwork-Id: 12269407 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 6AFDAC433ED for ; Thu, 20 May 2021 08:19:28 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 56B38610A2 for ; Thu, 20 May 2021 08:19:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230447AbhETIUs (ORCPT ); Thu, 20 May 2021 04:20:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57188 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230339AbhETIUl (ORCPT ); Thu, 20 May 2021 04:20:41 -0400 Received: from mail-wr1-x429.google.com (mail-wr1-x429.google.com [IPv6:2a00:1450:4864:20::429]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F10D0C061574 for ; Thu, 20 May 2021 01:19:19 -0700 (PDT) Received: by mail-wr1-x429.google.com with SMTP id a4so16701047wrr.2 for ; Thu, 20 May 2021 01:19:19 -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=ZrrdEqMCRDF5/Q5A0hIEtL3208jmftOezmToY775kEg=; b=eBw1MNWw1PDT9rtN6SOw8jiLTMn0LhUOZxWXdTjp8Hda0/Z9aOhoFz4MBbhTUAn8aV yekMfckvIJjpi1esTQgR7jeTh3CPST3BmpN9CoFlMoNTX75opaf8FXT8sb7y0e75+ZaT rA/QQVRnZ6B7Gs5DbOXjgRINJ9vhwh+JANft2CQwvb7GYWNHGYCdKOWuoLFws9srfKr0 wGChvF1VsCivJ++2Ah6YPfGQgBcmUsxUpdFOkoiFpehzEB0iL/fF70vDD7V6mhx/Tpw9 WPkvYVSSnJvnV/gb9clgIl9LFBOT89EfqyT+UHHymXZX2b0TaAVmYLDCF+Jr9mYN4fqU J2Yg== 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=ZrrdEqMCRDF5/Q5A0hIEtL3208jmftOezmToY775kEg=; b=WCZHhi66B5btX8xfExsZsiq+hRuB2CxAUDAd8iDuqWDyyqRBp9fCW7nCcyJSa6+42+ //O0dcVTH36iGxYTuDD9dh9F/Eo/j7xYLa1kgR3cSBk2W89xycuG6fkaQQ1UcyY7V2F0 PO66KIY2aGMZWX+uinMuZuqujqIfSATuXnzOZVlsY9O1CYwDe5YjdMfKuwgxtkHvW4kC ZTFfafTv8iI0zDtBY6BDrNmIA/9p+qvIlfb5xJo0OqMCc2ug6OHHF4zR4CM7etDjJuKF EpFXFJ215aAQp4CVDwOatVUj4kw5TT/5L0ikIEVvvYMSNBWedDEmuhF+V4Lp3uy3jJzd Ln/Q== X-Gm-Message-State: AOAM530tFkp1gKZBYCk7gWd9g9m/a/WckRIpVLVaqRyfdRc7oeeTnKIZ ddd/NqndS+FywT5SFFfSv23mi+whTV8/xw== X-Google-Smtp-Source: ABdhPJzrgOBSaYMj8+9sLktCymwp/bT6KO/pTgTGdW9s3QHuFqWeeHe7gCOzGvN4MtUemqBhXegjkQ== X-Received: by 2002:a5d:62d0:: with SMTP id o16mr3087111wrv.164.1621498758281; Thu, 20 May 2021 01:19:18 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id y20sm8900004wmi.0.2021.05.20.01.19.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 May 2021 01:19:17 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Gregory Anders , =?utf-8?b?xJBvw6BuIFRy4bqnbiBDw7RuZyBEYW5o?= , Jeff King , Eric Sunshine , Eric Wong , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= Subject: [PATCH v2 06/10] send-email: get rid of indirect object syntax Date: Thu, 20 May 2021 10:19:03 +0200 Message-Id: X-Mailer: git-send-email 2.32.0.rc0.405.g5d387561bb3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Change indirect object syntax such as "new X ARGS" to "X->new(ARGS)". This allows perl to see what "new" is at compile-time without having loaded Term::ReadLine. This doesn't matter now, but will in a subsequent commit when we start lazily loading it. Let's do the same for the adjacent "FakeTerm" package for consistency, even though we're not going to conditionally load it. Signed-off-by: Ævar Arnfjörð Bjarmason --- git-send-email.perl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/git-send-email.perl b/git-send-email.perl index da46925aa05..f9c780ceed6 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -194,11 +194,11 @@ sub format_2822_time { my @repo = $repo ? ($repo) : (); my $term = eval { $ENV{"GIT_SEND_EMAIL_NOTTY"} - ? new Term::ReadLine 'git-send-email', \*STDIN, \*STDOUT - : new Term::ReadLine 'git-send-email'; + ? Term::ReadLine->new('git-send-email', \*STDIN, \*STDOUT) + : Term::ReadLine->new('git-send-email'); }; if ($@) { - $term = new FakeTerm "$@: going non-interactive"; + $term = FakeTerm->new("$@: going non-interactive"); } # Behavior modification variables From patchwork Thu May 20 08:19:04 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: 12269411 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 31B88C433ED for ; Thu, 20 May 2021 08:19:30 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 158FF60698 for ; Thu, 20 May 2021 08:19:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231229AbhETIUu (ORCPT ); Thu, 20 May 2021 04:20:50 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57196 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231195AbhETIUn (ORCPT ); Thu, 20 May 2021 04:20:43 -0400 Received: from mail-wm1-x334.google.com (mail-wm1-x334.google.com [IPv6:2a00:1450:4864:20::334]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DA4D5C061574 for ; Thu, 20 May 2021 01:19:20 -0700 (PDT) Received: by mail-wm1-x334.google.com with SMTP id n17-20020a7bc5d10000b0290169edfadac9so4846825wmk.1 for ; Thu, 20 May 2021 01:19:20 -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=FMA2GQQCGDWNfC9+8UebrAXlIwLdMS5IsaZWiBrpesI=; b=koVeLnlqshQhNlKlmHNV1g4tVWYN1c+FlvdCaHDer8P9ht2kvveIrtSEIZ6chIFyvA SpIoKlxBeWxQ/scKLovQkRO/ULNf3w40Ypb7klv/Pm682bPw17snKQKLZ/w4ehXCPZwX jVy8D49XH0VrGaFZYlRHKiURyjuS/wAzIi91yKriA3bYt18lOvriUH6v6UiiP9tePE3J u4sPklV2HhJ9iMa7+ungHAWpm1Rq9tCAoWQhdR+VSKA234srwJC5gVPFU+7JxdEK9ufR WIj7ZtM9O7hI1LEGEOoa/tZIsJqtCoNDTBEfrnSDgL+5/mx+SqIrKVVoZN50Rst5Vwiw x5MA== 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=FMA2GQQCGDWNfC9+8UebrAXlIwLdMS5IsaZWiBrpesI=; b=DGUZh5pdO513itUQ3xsW6aOpHzBpudBe5H5ow2d2kDMwpiUr8/so3XoRjPXDvxA0kY jTrm46FTKwct1/B/UafBAtel4YvnlSbiCaHyjrwuLEBoXliALisnSw1pYZ4gyDiE+aAX IUbPWQG6NV1hKmi8HVhkvKYstOwOwZ8oNV8jxDj/X6te4gbYZ/1Lt0YSqg9c3MfN5uXC s/KthmuDgzm5FBjBTh5+6ZbhyRv+wlIwXlF2n7kgqM5lUe8CGgsmitloSwocizYKXKt3 obMEvw36ZhvOs+pE6yNbjTU8d6+JHhpiVQCqV2tW/Mrmn928wWjeFG3wYeq7jDF1KmjP pmeA== X-Gm-Message-State: AOAM533DCrPrZfssBYXQUXTHx6lBWW1h329iKVQw2FhKfZrv1XNl94xJ KLBFjSQ6sJx8FCNXah5d3yibrHRIIoSitQ== X-Google-Smtp-Source: ABdhPJwiXrSVWT+Zm3igg1m+Q0rW5Ealu/YgXmZO9hmYEVL0qgzK6qelm4Th0qbPI96mFwqfYD2MeA== X-Received: by 2002:a1c:ed0a:: with SMTP id l10mr2384934wmh.151.1621498759072; Thu, 20 May 2021 01:19:19 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id y20sm8900004wmi.0.2021.05.20.01.19.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 May 2021 01:19:18 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Gregory Anders , =?utf-8?b?xJBvw6BuIFRy4bqnbiBDw7RuZyBEYW5o?= , Jeff King , Eric Sunshine , Eric Wong , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= Subject: [PATCH v2 07/10] send-email: lazily load modules for a big speedup Date: Thu, 20 May 2021 10:19:04 +0200 Message-Id: X-Mailer: git-send-email 2.32.0.rc0.405.g5d387561bb3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Optimize the time git-send-email takes to do even the simplest of things (such as serving up "-h") from around ~150ms to ~80ms-~90ms by lazily loading the modules it requires. Before this change Devel::TraceUse would report 99/97 used modules under NO_GETTEXT=[|Y], respectively. Now it's 52/37. It now takes ~15s to run t9001-send-email.sh, down from ~20s. Signed-off-by: Ævar Arnfjörð Bjarmason --- git-send-email.perl | 71 +++++++++++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 32 deletions(-) diff --git a/git-send-email.perl b/git-send-email.perl index f9c780ceed6..a521f37c341 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -19,20 +19,10 @@ use 5.008; use strict; use warnings; -use POSIX qw/strftime/; -use Term::ReadLine; use Getopt::Long; -use Text::ParseWords; -use Term::ANSIColor; -use File::Temp qw/ tempdir tempfile /; -use File::Spec::Functions qw(catdir catfile); use Git::LoadCPAN::Error qw(:try); -use Cwd qw(abs_path cwd); use Git; use Git::I18N; -use Net::Domain (); -use Net::SMTP (); -use Git::LoadCPAN::Mail::Address; Getopt::Long::Configure qw/ pass_through /; @@ -166,7 +156,6 @@ sub format_2822_time { ); } -my $have_email_valid = eval { require Email::Valid; 1 }; my $smtp; my $auth; my $num_sent = 0; @@ -192,14 +181,6 @@ sub format_2822_time { my $repo = eval { Git->repository() }; my @repo = $repo ? ($repo) : (); -my $term = eval { - $ENV{"GIT_SEND_EMAIL_NOTTY"} - ? Term::ReadLine->new('git-send-email', \*STDIN, \*STDOUT) - : Term::ReadLine->new('git-send-email'); -}; -if ($@) { - $term = FakeTerm->new("$@: going non-interactive"); -} # Behavior modification variables my ($quiet, $dry_run) = (0, 0); @@ -309,9 +290,9 @@ sub do_edit { # Handle Uncouth Termination sub signal_handler { - # Make text normal - print color("reset"), "\n"; + require Term::ANSIColor; + print Term::ANSIColor::color("reset"), "\n"; # SMTP password masked system "stty echo"; @@ -574,11 +555,13 @@ sub read_config { } sub parse_address_line { + require Git::LoadCPAN::Mail::Address; return map { $_->format } Mail::Address->parse($_[0]); } sub split_addrs { - return quotewords('\s*,\s*', 1, @_); + require Text::ParseWords; + return Text::ParseWords::quotewords('\s*,\s*', 1, @_); } my %aliases; @@ -627,10 +610,11 @@ sub parse_sendmail_aliases { s/\\"/"/g foreach @addr; $aliases{$alias} = \@addr }}}, - mailrc => sub { my $fh = shift; while (<$fh>) { + mailrc => sub { my $fh = shift; while (<$fh>) { if (/^alias\s+(\S+)\s+(.*?)\s*$/) { + require Text::ParseWords; # spaces delimit multiple addresses - $aliases{$1} = [ quotewords('\s+', 0, $2) ]; + $aliases{$1} = [ Text::ParseWords::quotewords('\s+', 0, $2) ]; }}}, pine => sub { my $fh = shift; my $f='\t[^\t]*'; for (my $x = ''; defined($x); $x = $_) { @@ -702,7 +686,8 @@ sub is_format_patch_arg { opendir my $dh, $f or die sprintf(__("Failed to opendir %s: %s"), $f, $!); - push @files, grep { -f $_ } map { catfile($f, $_) } + require File::Spec; + push @files, grep { -f $_ } map { File::Spec->catfile($f, $_) } sort readdir $dh; closedir $dh; } elsif ((-f $f or -p $f) and !is_format_patch_arg($f)) { @@ -715,7 +700,8 @@ sub is_format_patch_arg { if (@rev_list_opts) { die __("Cannot run git format-patch from outside a repository\n") unless $repo; - push @files, $repo->command('format-patch', '-o', tempdir(CLEANUP => 1), @rev_list_opts); + require File::Temp; + push @files, $repo->command('format-patch', '-o', File::Temp::tempdir(CLEANUP => 1), @rev_list_opts); } @files = handle_backup_files(@files); @@ -752,9 +738,10 @@ sub get_patch_subject { if ($compose) { # Note that this does not need to be secure, but we will make a small # effort to have it be unique + require File::Temp; $compose_filename = ($repo ? - tempfile(".gitsendemail.msg.XXXXXX", DIR => $repo->repo_path()) : - tempfile(".gitsendemail.msg.XXXXXX", DIR => "."))[1]; + File::Temp::tempfile(".gitsendemail.msg.XXXXXX", DIR => $repo->repo_path()) : + File::Temp::tempfile(".gitsendemail.msg.XXXXXX", DIR => "."))[1]; open my $c, ">", $compose_filename or die sprintf(__("Failed to open for writing %s: %s"), $compose_filename, $!); @@ -861,6 +848,19 @@ sub get_patch_subject { do_edit(@files); } +sub term { + my $term = eval { + require Term::ReadLine; + $ENV{"GIT_SEND_EMAIL_NOTTY"} + ? Term::ReadLine->new('git-send-email', \*STDIN, \*STDOUT) + : Term::ReadLine->new('git-send-email'); + }; + if ($@) { + $term = FakeTerm->new("$@: going non-interactive"); + } + return $term; +} + sub ask { my ($prompt, %arg) = @_; my $valid_re = $arg{valid_re}; @@ -868,6 +868,7 @@ sub ask { my $confirm_only = $arg{confirm_only}; my $resp; my $i = 0; + my $term = term(); return defined $default ? $default : undef unless defined $term->IN and defined fileno($term->IN) and defined $term->OUT and defined fileno($term->OUT); @@ -1048,6 +1049,7 @@ sub extract_valid_address { return $address if ($address =~ /^($local_part_regexp)$/); $address =~ s/^\s*<(.*)>\s*$/$1/; + my $have_email_valid = eval { require Email::Valid; 1 }; if ($have_email_valid) { return scalar Email::Valid->address($address); } @@ -1107,7 +1109,8 @@ sub validate_address_list { sub make_message_id { my $uniq; if (!defined $message_id_stamp) { - $message_id_stamp = strftime("%Y%m%d%H%M%S.$$", gmtime(time)); + require POSIX; + $message_id_stamp = POSIX::strftime("%Y%m%d%H%M%S.$$", gmtime(time)); $message_id_serial = 0; } $message_id_serial++; @@ -1277,6 +1280,7 @@ sub valid_fqdn { sub maildomain_net { my $maildomain; + require Net::Domain; my $domain = Net::Domain::domainname(); $maildomain = $domain if valid_fqdn($domain); @@ -1287,6 +1291,7 @@ sub maildomain_mta { my $maildomain; for my $host (qw(mailhost localhost)) { + require Net::SMTP; my $smtp = Net::SMTP->new($host); if (defined $smtp) { my $domain = $smtp->domain; @@ -1965,13 +1970,15 @@ sub validate_patch { my ($fn, $xfer_encoding) = @_; if ($repo) { - my $validate_hook = catfile($repo->hooks_path(), + require File::Spec; + my $validate_hook = File::Spec->catfile($repo->hooks_path(), 'sendemail-validate'); my $hook_error; if (-x $validate_hook) { - my $target = abs_path($fn); + require Cwd; + my $target = Cwd::abs_path($fn); # The hook needs a correct cwd and GIT_DIR. - my $cwd_save = cwd(); + my $cwd_save = Cwd::cwd(); chdir($repo->wc_path() or $repo->repo_path()) or die("chdir: $!"); local $ENV{"GIT_DIR"} = $repo->repo_path(); From patchwork Thu May 20 08:19:05 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: 12269409 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 6D5ADC433B4 for ; Thu, 20 May 2021 08:19:29 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 4DF3F60698 for ; Thu, 20 May 2021 08:19:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231200AbhETIUt (ORCPT ); Thu, 20 May 2021 04:20:49 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57198 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231199AbhETIUm (ORCPT ); Thu, 20 May 2021 04:20:42 -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 D2007C06175F for ; Thu, 20 May 2021 01:19:21 -0700 (PDT) Received: by mail-wr1-x431.google.com with SMTP id c14so14876635wrx.3 for ; Thu, 20 May 2021 01:19:21 -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=5xyiR4OcoDuKW7gd4RhvrXJWBJ/74ptwn8ERo0wEbrk=; b=NU9/wZxa6PFaHJt1XRMyP6Tut254h7deK/OBm/EEs2WV4l9v06w/cAvun+YepFsTE2 R7cEJ28RctstzgLfE5MvGrO0uWEz0uSRgA/ri1NVR4EIvVK6s3LMDov4EZOmyoh15ir7 n1ppQgaXRGY/FLDisdcTMgDIUS2UMDikDfV1gkBWXmuVdMv/MKyLaxCpsxUTGPu8hkWW wX/ABXj9rF2SP/FkfKDtjNHMymSI3a50OMiZ+JUq1jp4hdgvioRNirTFiFHUbwHaZPxf l8zhbDDKe9CVgjJXKUj6yH6am1LVQwIi9x3u0s+s9rWWsurFPaRs8lr8+PGqT0gGZZgo nG9g== 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=5xyiR4OcoDuKW7gd4RhvrXJWBJ/74ptwn8ERo0wEbrk=; b=RjrxWH/HT1juyBv3uGwZ0n+BlCtujJgKyiPUnVPUfz+v+3FIpbpnc8YmiStAk2FDb+ s7KXdurm/hgcHaGTGAvKrxRRwufsGp7zTL2eAhj0Ia20XdNkwTVzvRZgL5dstsILnRmu WvAk6Q/krdy/Wg9t2NFZ6E4s0FG7sLNp52Tpx7TsfXrDVyPu4twURJn/OLKUlHuRi8EV Wyfp9Z4B/cCLJx1vHDcm6wufcmgSLYSGIol5YTvpd+W1GidsBvopxMJz97Q2KLfqgruf lOG22kLciLVzhEDteXwPYfQhZRiXJx7/OqL+Bw11BnVJv62+Nd/W28njJW4sQirYBXHw KBhA== X-Gm-Message-State: AOAM531J70QiRKmsQFVYFCD++F2nXQqZ/WT/+AuQWN4ghnL/kTAexDnf qEi5Y3z4VVAoWRWTT2Fuft1fzwaM8HEPCw== X-Google-Smtp-Source: ABdhPJyf1cA6kjSkvu4ASpLX13aqy+337u6CZE6JSLmyzjYFNBLMlesQT5imxcft8wESaQM/kBihUw== X-Received: by 2002:adf:d1ec:: with SMTP id g12mr3009017wrd.294.1621498760115; Thu, 20 May 2021 01:19:20 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id y20sm8900004wmi.0.2021.05.20.01.19.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 May 2021 01:19:19 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Gregory Anders , =?utf-8?b?xJBvw6BuIFRy4bqnbiBDw7RuZyBEYW5o?= , Jeff King , Eric Sunshine , Eric Wong , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= Subject: [PATCH v2 08/10] perl: lazily load some common Git.pm setup code Date: Thu, 20 May 2021 10:19:05 +0200 Message-Id: X-Mailer: git-send-email 2.32.0.rc0.405.g5d387561bb3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Instead of unconditionally requiring modules such as File::Spec, let's only load them when needed. This speeds up code that only needs a subset of the features Git.pm provides. This brings a plain invocation of "git send-email" down from 52/37 loaded modules under NO_GETTEXT=[|Y] to 39/18, and it now takes ~60-~70ms instead of ~80-~90ms. The runtime of t9001-send-email.sh test is down to ~13s from ~15s. Signed-off-by: Ævar Arnfjörð Bjarmason --- perl/Git.pm | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/perl/Git.pm b/perl/Git.pm index 06a10b175a7..f18852fb09c 100644 --- a/perl/Git.pm +++ b/perl/Git.pm @@ -11,9 +11,6 @@ package Git; use strict; use warnings $ENV{GIT_PERL_FATAL_WARNINGS} ? qw(FATAL all) : (); -use File::Temp (); -use File::Spec (); - BEGIN { our ($VERSION, @ISA, @EXPORT, @EXPORT_OK); @@ -103,12 +100,9 @@ =head1 DESCRIPTION =cut -use Carp qw(carp croak); # but croak is bad - throw instead +sub carp { require Carp; goto &Carp::carp } +sub croak { require Carp; goto &Carp::croak } use Git::LoadCPAN::Error qw(:try); -use Cwd qw(abs_path cwd); -use IPC::Open2 qw(open2); -use Fcntl qw(SEEK_SET SEEK_CUR); -use Time::Local qw(timegm); } @@ -191,13 +185,15 @@ sub repository { $dir = undef; }; + require Cwd; if ($dir) { + require File::Spec; File::Spec->file_name_is_absolute($dir) or $dir = $opts{Directory} . '/' . $dir; - $opts{Repository} = abs_path($dir); + $opts{Repository} = Cwd::abs_path($dir); # If --git-dir went ok, this shouldn't die either. my $prefix = $search->command_oneline('rev-parse', '--show-prefix'); - $dir = abs_path($opts{Directory}) . '/'; + $dir = Cwd::abs_path($opts{Directory}) . '/'; if ($prefix) { if (substr($dir, -length($prefix)) ne $prefix) { throw Error::Simple("rev-parse confused me - $dir does not have trailing $prefix"); @@ -223,7 +219,7 @@ sub repository { throw Error::Simple("fatal: Not a git repository: $dir"); } - $opts{Repository} = abs_path($dir); + $opts{Repository} = Cwd::abs_path($dir); } delete $opts{Directory}; @@ -408,10 +404,12 @@ sub command_bidi_pipe { my $cwd_save = undef; if ($self) { shift; - $cwd_save = cwd(); + require Cwd; + $cwd_save = Cwd::cwd(); _setup_git_cmd_env($self); } - $pid = open2($in, $out, 'git', @_); + require IPC::Open2; + $pid = IPC::Open2::open2($in, $out, 'git', @_); chdir($cwd_save) if $cwd_save; return ($pid, $in, $out, join(' ', @_)); } @@ -538,7 +536,8 @@ sub get_tz_offset { my $t = shift || time; my @t = localtime($t); $t[5] += 1900; - my $gm = timegm(@t); + require Time::Local; + my $gm = Time::Local::timegm(@t); my $sign = qw( + + - )[ $gm <=> $t ]; return sprintf("%s%02d%02d", $sign, (gmtime(abs($t - $gm)))[2,1]); } @@ -629,7 +628,8 @@ sub hooks_path { my ($self) = @_; my $dir = $self->command_oneline('rev-parse', '--git-path', 'hooks'); - my $abs = abs_path($dir); + require Cwd; + my $abs = Cwd::abs_path($dir); return $abs; } @@ -1353,6 +1353,7 @@ sub _temp_cache { my $n = $name; $n =~ s/\W/_/g; # no strange chars + require File::Temp; ($$temp_fd, $fname) = File::Temp::tempfile( "Git_${n}_XXXXXX", UNLINK => 1, DIR => $tmpdir, ) or throw Error::Simple("couldn't open new temp file"); @@ -1375,9 +1376,9 @@ sub temp_reset { truncate $temp_fd, 0 or throw Error::Simple("couldn't truncate file"); - sysseek($temp_fd, 0, SEEK_SET) and seek($temp_fd, 0, SEEK_SET) + sysseek($temp_fd, 0, Fcntl::SEEK_SET()) and seek($temp_fd, 0, Fcntl::SEEK_SET()) or throw Error::Simple("couldn't seek to beginning of file"); - sysseek($temp_fd, 0, SEEK_CUR) == 0 and tell($temp_fd) == 0 + sysseek($temp_fd, 0, Fcntl::SEEK_CUR()) == 0 and tell($temp_fd) == 0 or throw Error::Simple("expected file position to be reset"); } From patchwork Thu May 20 08:19:06 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: 12269415 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 E7BD0C43460 for ; Thu, 20 May 2021 08:19:32 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id CA3C860698 for ; Thu, 20 May 2021 08:19:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231222AbhETIUw (ORCPT ); Thu, 20 May 2021 04:20:52 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57208 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231201AbhETIUn (ORCPT ); Thu, 20 May 2021 04:20:43 -0400 Received: from mail-wr1-x429.google.com (mail-wr1-x429.google.com [IPv6:2a00:1450:4864:20::429]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D7E5DC061760 for ; Thu, 20 May 2021 01:19:22 -0700 (PDT) Received: by mail-wr1-x429.google.com with SMTP id i17so16641764wrq.11 for ; Thu, 20 May 2021 01:19:22 -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=oI+zdh2LxK7O2FozgT3O2YS+T0pHSpp8BMngjmveJRA=; b=Elqqhd1vkw70X4+KREiycBxPSM9E3CRwPaUde0oOWinMOeEORPuxNU6PPkAyVNTswy ljc4eVRHpGfLZNZbfM+gbyzC4KNL1m4acxCIesdDK7u5+ZufUEsIKuJkcVflvBgCLLAT ONmkWiyJujmABdea4ebEDVXqCyb34zvWyZeWajT663nk5g9EAKq7GA9/poWTEQbEzCuD Vm4kJFQbaLVSX68QK7tGGkima9V4Y0emQPRkxe7vknF/gqbjy/W/8H3ua20JW1oawKaX 1qXhZdxyj5fCg1FOOyRSGuDXyxXwK/QkOPIaXZvjkdHoMDp2BbODixypRAOAW7NG06U5 NwcQ== 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=oI+zdh2LxK7O2FozgT3O2YS+T0pHSpp8BMngjmveJRA=; b=rdW7s1vayFcEZ0/AUn6E/jkncCEzuIQd3gWF3J8O2s4gzu0S+zWv70+ACh9Mckwthc nxaOIpcjJetLnSV1zND4XaX97hdTrnwnrt339Cv6f7StcDVFisklnZw4+n3LrMNxjkVx FtOrGGsiHMkmpVZdzawCBPCin1HKHhXpOzLCdj60MLmzzrSaBx/9uLcTcAM/8OnlYUwE sEeYslILhWY9F3FYgr7XfNUZSwQfmmrJuZXein6NxopydJvbLfrMZ88iLQ4p+N0SHSrN prdJbSUqdl3xiDd+Q0iAaISIxFA5JwYjFt7Tm69zwPErwJtOuEleaX7hAfn9UsyXYXwp AThw== X-Gm-Message-State: AOAM5302jckvm7Bgp8ULKsUKmI9IRyoOOggbV2I637x/E/Bi4pKFtTFh F5pk6UVHP1N/DVpzX7bTKsema2M2N0JKnw== X-Google-Smtp-Source: ABdhPJw/XWsCJWKrb1JWGyssmLBRYcuscbRLGpY+XLKksHgVb81YKz0E7UWjCfkGnL402KlyJ8Jr2g== X-Received: by 2002:adf:dd4c:: with SMTP id u12mr2994157wrm.224.1621498761118; Thu, 20 May 2021 01:19:21 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id y20sm8900004wmi.0.2021.05.20.01.19.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 May 2021 01:19:20 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Gregory Anders , =?utf-8?b?xJBvw6BuIFRy4bqnbiBDw7RuZyBEYW5o?= , Jeff King , Eric Sunshine , Eric Wong , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= Subject: [PATCH v2 09/10] send-email: move trivial config handling to Perl Date: Thu, 20 May 2021 10:19:06 +0200 Message-Id: X-Mailer: git-send-email 2.32.0.rc0.405.g5d387561bb3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Optimize the startup time of git-send-email by using an amended config_regexp() function to retrieve the list of config keys and values we're interested in. See the earlier "send-email: lazily load config for a big speedup" commit for why changing its interface is OK. For boolean keys we can handle the [true|false] case ourselves, and the "--get" case didn't need any parsing. Let's leave "--path" and other "--bool" cases to "git config". As noted in a preceding commit we're free to change the config_regexp() function, it's only used by "git send-email". This brings the runtime of "git send-email" from ~60-~70ms to a very steady ~40ms on my test box. We now run just one "git config" invocation on startup instead of 8, the exact number will differ based on the local sendemail.* config. I happen to have 8 of those set. This brings the runtime of t9001-send-email.sh from ~13s down to ~12s for me. The change there is less impressive as many of those tests set various config values, and we're also getting to the point of diminishing returns for optimizing "git send-email" itself. Signed-off-by: Ævar Arnfjörð Bjarmason --- git-send-email.perl | 17 ++++++++++------- perl/Git.pm | 10 +++++----- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/git-send-email.perl b/git-send-email.perl index a521f37c341..28b9a20a7f2 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -324,7 +324,10 @@ sub read_config { my $target = $config_bool_settings{$setting}; my $key = "$prefix.$setting"; next unless exists $known_keys->{$key}; - my $v = Git::config_bool(@repo, $key); + my $v = (@{$known_keys->{$key}} == 1 && + $known_keys->{$key}->[0] =~ /^(?:true|false)$/s) + ? $known_keys->{$key}->[0] eq 'true' + : Git::config_bool(@repo, $key); next unless defined $v; next if $configured->{$setting}++; $$target = $v; @@ -353,14 +356,12 @@ sub read_config { my $key = "$prefix.$setting"; next unless exists $known_keys->{$key}; if (ref($target) eq "ARRAY") { - my @values = Git::config(@repo, $key); - next unless @values; + my @values = @{$known_keys->{$key}}; next if $configured->{$setting}++; @$target = @values; } else { - my $v = Git::config(@repo, $key); - next unless defined $v; + my $v = $known_keys->{$key}->[0]; next if $configured->{$setting}++; $$target = $v; } @@ -371,8 +372,10 @@ sub read_config { # parses 'bool' etc.) by only doing so for config keys that exist. my %known_config_keys; { - my @known_config_keys = Git::config_regexp("^sende?mail[.]"); - @known_config_keys{@known_config_keys} = (); + my @kv = Git::config_regexp("^sende?mail[.]"); + while (my ($k, $v) = splice @kv, 0, 2) { + push @{$known_config_keys{$k}} => $v; + } } # sendemail.identity yields to --identity. We must parse this diff --git a/perl/Git.pm b/perl/Git.pm index f18852fb09c..a9020d0d01f 100644 --- a/perl/Git.pm +++ b/perl/Git.pm @@ -739,18 +739,18 @@ sub config_int { =item config_regexp ( RE ) Retrieve the list of configuration key names matching the regular -expression C. The return value is a list of strings matching -this regex. +expression C. The return value is an ARRAY of key-value pairs. =cut sub config_regexp { my ($self, $regex) = _maybe_self(@_); try { - my @cmd = ('config', '--name-only', '--get-regexp', $regex); + my @cmd = ('config', '--null', '--get-regexp', $regex); unshift @cmd, $self if $self; - my @matches = command(@cmd); - return @matches; + my $data = command(@cmd); + my (@kv) = map { split /\n/, $_, 2 } split /\0/, $data; + return @kv; } catch Git::Error::Command with { my $E = shift; if ($E->value() == 1) { From patchwork Thu May 20 08:19:07 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: 12269413 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 B93CCC433B4 for ; Thu, 20 May 2021 08:19:31 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 90D52610A2 for ; Thu, 20 May 2021 08:19:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231245AbhETIUv (ORCPT ); Thu, 20 May 2021 04:20:51 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57210 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231206AbhETIUo (ORCPT ); Thu, 20 May 2021 04:20:44 -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 BDC59C061761 for ; Thu, 20 May 2021 01:19:23 -0700 (PDT) Received: by mail-wr1-x42e.google.com with SMTP id j14so14923318wrq.5 for ; Thu, 20 May 2021 01:19:23 -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=cZGB6i2oJiRkl8UzFplpjDcK87CRCHvFjc33vqrxLSs=; b=S/dxIcMnoJE9zlfQ0ZIm0TPBy9pjDdTASkqtjqOYyQOrz9GkeSs/BGSFSo/LmkpC2A wSqyKsLliuP43B10L/jGrBRldSfPgprui2t/PFWe62otlK0AJ8ZMSJXma4+YAHw0wWWC 2dgYLFZuoKbQgR2PgUjSW6CdTojqq8B8StEmErXkPOgogBPSvSTXjzhf7lx2/9onobaO 06tmepGdyGKW+OjGtiVhYb8SChSixk0czEKCYXz0+OoCzcWNqvMIfwLzr7HqXiRe04El hCYJX0SiojuuKT1HbIzJAInCGyFcoFR/zkshhWeSKM5PQq+xtiJNbVz4Ig10SNLimobg UDDA== 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=cZGB6i2oJiRkl8UzFplpjDcK87CRCHvFjc33vqrxLSs=; b=B2Y3benHrKrlDfzh4yO2k7JZlb61idVfLcl/FV4OMikM5jPaVppao7IKAIklt0t2ZT KkfRAEQHvAzYsBy5HdrDe9d8ztK5t2g/us6N831iUUE2wILR7wmmZ65eh2E3wLf5MeDT 7KBH0U6s4YNu8GjqmQyci2Uk2oZJ7uGBMK5s31YFmLCaN9Uuiit8wzKaA/+3H5g5yIri a3mt2hrEVO3n0ZzXtR370d/QT+ol24Zf4FwMPzTqcULcas49BStyU/NoI2GvKIh2bSCu Cu4Y2wU4vJ1Xk8pAQRenrzCxi/vGGpasoQo20JHxpFfa5JunKvGT6HhFKU18HzyhZBbp 55Fw== X-Gm-Message-State: AOAM531rOSi5Ao04NUOSBDRJHxOs21zqCp7WjRNZUbwat4iK+V66sKR3 Fb5h4VDOd6yrqn0YXsqPtSv52D2q5ZMEkA== X-Google-Smtp-Source: ABdhPJwUjS++IbKIxl0D9HjocBIJiFAK93dmrY9+vIHDnOONfvjThg44zQeDUinbYqk6Q9Snjvy9vA== X-Received: by 2002:a05:6000:104a:: with SMTP id c10mr2960259wrx.45.1621498762057; Thu, 20 May 2021 01:19:22 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id y20sm8900004wmi.0.2021.05.20.01.19.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 May 2021 01:19:21 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Gregory Anders , =?utf-8?b?xJBvw6BuIFRy4bqnbiBDw7RuZyBEYW5o?= , Jeff King , Eric Sunshine , Eric Wong , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= Subject: [PATCH v2 10/10] perl: nano-optimize by replacing Cwd::cwd() with Cwd::getcwd() Date: Thu, 20 May 2021 10:19:07 +0200 Message-Id: X-Mailer: git-send-email 2.32.0.rc0.405.g5d387561bb3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org It has been pointed out[1] that cwd() invokes "pwd(1)" while getcwd() is a Perl-native XS function. For what we're using these for we can use getcwd(). The performance difference is miniscule, we're saving on the order of a millisecond or so, see [2] below for the benchmark. I don't think this matters in practice for optimizing git-send-email or perl execution (unlike the patches leading up to this one). But let's do it regardless of that, if only so we don't have to think about this as a low-hanging fruit anymore. 1. https://lore.kernel.org/git/20210512180517.GA11354@dcvr/ 2. $ perl -MBenchmark=:all -MCwd -wE 'cmpthese(10000, { getcwd => sub { getcwd }, cwd => sub { cwd }, pwd => sub { system "pwd >/dev/null" }})' (warning: too few iterations for a reliable count) Rate pwd cwd getcwd pwd 982/s -- -48% -100% cwd 1890/s 92% -- -100% getcwd 10000000000000000000/s 1018000000000000000% 529000000000000064% - Signed-off-by: Ævar Arnfjörð Bjarmason --- git-send-email.perl | 2 +- perl/Git.pm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/git-send-email.perl b/git-send-email.perl index 28b9a20a7f2..ff3008bfa34 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -1981,7 +1981,7 @@ sub validate_patch { require Cwd; my $target = Cwd::abs_path($fn); # The hook needs a correct cwd and GIT_DIR. - my $cwd_save = Cwd::cwd(); + my $cwd_save = Cwd::getcwd(); chdir($repo->wc_path() or $repo->repo_path()) or die("chdir: $!"); local $ENV{"GIT_DIR"} = $repo->repo_path(); diff --git a/perl/Git.pm b/perl/Git.pm index a9020d0d01f..358a5f5625e 100644 --- a/perl/Git.pm +++ b/perl/Git.pm @@ -405,7 +405,7 @@ sub command_bidi_pipe { if ($self) { shift; require Cwd; - $cwd_save = Cwd::cwd(); + $cwd_save = Cwd::getcwd(); _setup_git_cmd_env($self); } require IPC::Open2;