From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-Status: No, score=-3.7 required=3.0 tests=AWL,BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_PASS, SPF_PASS shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by dcvr.yhbt.net (Postfix) with ESMTP id 6D5BB1F934 for ; Sat, 17 Oct 2020 21:04:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2439458AbgJQVEl (ORCPT ); Sat, 17 Oct 2020 17:04:41 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54318 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2439450AbgJQVEl (ORCPT ); Sat, 17 Oct 2020 17:04:41 -0400 Received: from mail-wm1-x342.google.com (mail-wm1-x342.google.com [IPv6:2a00:1450:4864:20::342]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C8CF0C061755 for ; Sat, 17 Oct 2020 14:04:40 -0700 (PDT) Received: by mail-wm1-x342.google.com with SMTP id 13so6704981wmf.0 for ; Sat, 17 Oct 2020 14:04:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=7p7HYzVQTY1ynw8rjsFhzxNNXaJqnM6pIlRGWVFciSY=; b=MC/8UL1RYFr00X3Pc8kKR91bu9eHhxbf9YDpDSZAmws9jkvLDwhTao9h4Ml3C5J2WL xAIBB+JsQ4m0o3AcXrzlt2WVkcMAYEmZEHWkyrAj6QBbHQtJipEt8PXVOXNjGQFZoyjU 1+qFyC+6LHr3f82Zg1JM6V0lVpSwLMXQ2XI/SmTNpSJBYKy2q2lf7l+Xycdcv7BRHzIg K2zSck5IUtEZfGAj/XTIXtw0uCkPWAXV1Dm1sdL60lOanVL1p824E9k+eC9cGk+AcyUE R/g+4b3f+slF9PyFWd56lFzUJqA+XYPMRADojntkcX3ZrwBHt/qVR2gHG/Ag7E1JFYO1 eMmQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=7p7HYzVQTY1ynw8rjsFhzxNNXaJqnM6pIlRGWVFciSY=; b=BT2y2svYFZfvulm/WYhUtTkD4sRVfWthE0OFIpnK3thZQkPQc2bO6wvPnxP+sW+W9M wnMwGDcsbjkWbBusavlxdotgdLifZKOB0YBxH7Exu3g58q8/YhP7mFYJx5uZ61H3trFc JtmDn93VpjMD06K/DNGXRqtIdjvP3qjfWxqr9JyeJIhXoKV+Yp1847080iFxscQ3XtzY K54+ElPHPOy8G/hn8z4MH53sr7qwOic0Lc4f3cIPIvjTom5hoCB7zwfKQnNn1DpNuwMi lrAgrbIfEEWEQBEQ3unrXE5SHn0Gs3HHzyDhcC/cBy3tPS0t7ILBsozdWv92zPffSJqm RS9w== X-Gm-Message-State: AOAM5303RHpU/C7WhOW6J6m1+gxyABbBsECdcqhdWVfunmrH2qTF7zhS 6al3AFARlbak3HKbeY7jtyuDY3fGGNQ= X-Google-Smtp-Source: ABdhPJzNcgVKH2GN1f9rWUtT5pnbSjC1qk50jQz7hfn3k17zTLdYdm3RgsErkTYFMino8M5mOkdhOQ== X-Received: by 2002:a1c:1f89:: with SMTP id f131mr10302542wmf.10.1602968679473; Sat, 17 Oct 2020 14:04:39 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id n5sm10526035wrm.2.2020.10.17.14.04.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 17 Oct 2020 14:04:38 -0700 (PDT) Message-Id: <13fd992a375e30e8c7b0953a128e149951dee0ea.1602968677.git.gitgitgadget@gmail.com> In-Reply-To: References: From: "Alex Vandiver via GitGitGadget" Date: Sat, 17 Oct 2020 21:04:33 +0000 Subject: [PATCH 1/4] fsmonitor: use fsmonitor data in `git diff` Fcc: Sent Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MIME-Version: 1.0 To: git@vger.kernel.org Cc: Derrick Stolee , Utsav Shah , Nipunn Koorapati , Alex Vandiver Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Alex Vandiver With fsmonitor enabled, the first call to match_stat_with_submodule calls refresh_fsmonitor, incurring the overhead of reading the list of updated files -- but run_diff_files does not respect the CE_FSMONITOR_VALID flag. Make use of the fsmonitor extension to skip lstat() calls on files that fsmonitor judged as unmodified. Notably, this change improves performance of the git shell prompt when GIT_PS1_SHOWDIRTYSTATE is set. Signed-off-by: Alex Vandiver Signed-off-by: Nipunn Koorapati --- diff-lib.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/diff-lib.c b/diff-lib.c index f95c6de75f..b7ee1b89ef 100644 --- a/diff-lib.c +++ b/diff-lib.c @@ -97,6 +97,8 @@ int run_diff_files(struct rev_info *revs, unsigned int option) diff_set_mnemonic_prefix(&revs->diffopt, "i/", "w/"); + refresh_fsmonitor(istate); + if (diff_unmerged_stage < 0) diff_unmerged_stage = 2; entries = istate->cache_nr; @@ -197,8 +199,19 @@ int run_diff_files(struct rev_info *revs, unsigned int option) if (ce_uptodate(ce) || ce_skip_worktree(ce)) continue; - /* If CE_VALID is set, don't look at workdir for file removal */ - if (ce->ce_flags & CE_VALID) { + /* + * If CE_VALID is set, the user has promised us that the workdir + * hasn't changed compared to index, so don't stat workdir + * for file removal + * eg - via git udpate-index --assume-unchanged + * eg - via core.ignorestat=true + * + * When using FSMONITOR: + * If CE_FSMONITOR_VALID is set, then we know the metadata on disk + * has not changed since the last refresh, and we can skip the + * file-removal checks without doing the stat in check_removed. + */ + if (ce->ce_flags & CE_VALID || ce->ce_flags & CE_FSMONITOR_VALID) { changed = 0; newmode = ce->ce_mode; } else { -- gitgitgadget