From patchwork Wed Feb 24 04:05:06 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matheus Tavares X-Patchwork-Id: 12101239 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=-18.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT 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 54E0FC433E0 for ; Wed, 24 Feb 2021 04:06:24 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 22A2A64E57 for ; Wed, 24 Feb 2021 04:06:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232077AbhBXEGI (ORCPT ); Tue, 23 Feb 2021 23:06:08 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34924 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231367AbhBXEGF (ORCPT ); Tue, 23 Feb 2021 23:06:05 -0500 Received: from mail-qt1-x82a.google.com (mail-qt1-x82a.google.com [IPv6:2607:f8b0:4864:20::82a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B1636C06174A for ; Tue, 23 Feb 2021 20:05:24 -0800 (PST) Received: by mail-qt1-x82a.google.com with SMTP id v64so558253qtd.5 for ; Tue, 23 Feb 2021 20:05:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=usp.br; s=usp-google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=QhWCLUjjLMe4U+aNbyi9OJzyWyl8sCHrFM886rJ473s=; b=HBuVBjAJ0Z53fyvHszN0LxHOA8zp7tViJMIXu0F/85+tKQv2Ca4TZK1taAOq5XUQfp 1BiR8YqMZQQUOvBxjl4rg39L5KQM6Y62TVHfCrpdK/U7HcpSXDaUvTRkPc0itmX4GNA8 5tdcdcttAdQLlLA/lHzy/HWxSq8aKrk4YLknTMtMSi/pBEEIM2LzOLCBEZdMjbHpEYxU H6MFCza6k0n1eslWAQYGRYBCdqHsEltZxJaa6XjpLS+j1jhbZ2nj27e/ANSFXDYg0TeN l1TXZ+LmS6EXYUFnkwNrffgqXL5KypQI7f4vtwzbIPHCs9rd2fDXynZSbkN9BpmWB4Z8 +yVQ== 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=QhWCLUjjLMe4U+aNbyi9OJzyWyl8sCHrFM886rJ473s=; b=LB6YW8q7r7x+hxry/cif3oOva1qrrCwvCvDEMd6SDqXEXSLjsQ7wNNjfG+woUDpfZb 2NA+9q9aolUE0ULn0nO5OSoijYUXFrsQwprtDEOH6JIW0VmfkIXPms16FOqnSmYnbn9x Cmy24jm/wHxzwN8lnDyB+Eot3yJjjObdJkE0IR8fclHP/GZoFnynOR9SX3UOVVL3XQPq vft9HcQv37NjhppRzOKnfrF5dvtCL4D07yYlpDqe00uBM5HhQSfs74zgOVdecyIznN6L pYMFjwSuFIvO4C6+6dN/woAa8dUE+FvBCXDIWCrJTOsrRTaeEG+AHYc3D2ABWqZK3bYj jlJQ== X-Gm-Message-State: AOAM531E0YBww7lUYXElIoUYBTtYa7w5xbLgUEKnC0J6gXNpMov67tR+ S7ROmV4vToB5hqnZbx+Iz3byP+ApcG4WHQ== X-Google-Smtp-Source: ABdhPJyti9D+LcgwmJfrdJzTbfvXAeAN95lcKuy5fn9q+409fctTyX9NqzETOWmoSQ+whCbCV9b6qA== X-Received: by 2002:ac8:5357:: with SMTP id d23mr27031799qto.253.1614139523621; Tue, 23 Feb 2021 20:05:23 -0800 (PST) Received: from mango.meuintelbras.local ([177.32.118.149]) by smtp.gmail.com with ESMTPSA id z65sm547878qtd.15.2021.02.23.20.05.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 23 Feb 2021 20:05:22 -0800 (PST) From: Matheus Tavares To: git@vger.kernel.org Cc: gitster@pobox.com, newren@gmail.com, stolee@gmail.com Subject: [PATCH v2 1/7] add: include magic part of pathspec on --refresh error Date: Wed, 24 Feb 2021 01:05:06 -0300 Message-Id: <2831fd5744d44fd696e73913bf6e8bc2f03c6c52.1614138107.git.matheus.bernardino@usp.br> X-Mailer: git-send-email 2.30.1 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org When `git add --refresh ` doesn't find any matches for the given pathspec, it prints an error message using the `match` field of the `struct pathspec_item`. However, this field doesn't contain the magic part of the pathspec. Instead, let's use the `original` field. Signed-off-by: Matheus Tavares --- builtin/add.c | 2 +- t/t3700-add.sh | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/builtin/add.c b/builtin/add.c index ea762a41e3..24ed7e25f3 100644 --- a/builtin/add.c +++ b/builtin/add.c @@ -187,7 +187,7 @@ static void refresh(int verbose, const struct pathspec *pathspec) for (i = 0; i < pathspec->nr; i++) { if (!seen[i]) die(_("pathspec '%s' did not match any files"), - pathspec->items[i].match); + pathspec->items[i].original); } free(seen); } diff --git a/t/t3700-add.sh b/t/t3700-add.sh index d402c775c0..15ede17804 100755 --- a/t/t3700-add.sh +++ b/t/t3700-add.sh @@ -196,6 +196,12 @@ test_expect_success 'git add --refresh with pathspec' ' grep baz actual ' +test_expect_success 'git add --refresh correctly reports no match error' " + echo \"fatal: pathspec ':(icase)nonexistent' did not match any files\" >expect && + test_must_fail git add --refresh ':(icase)nonexistent' 2>actual && + test_i18ncmp expect actual +" + test_expect_success POSIXPERM,SANITY 'git add should fail atomically upon an unreadable file' ' git reset --hard && date >foo1 && From patchwork Wed Feb 24 04:05:07 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matheus Tavares X-Patchwork-Id: 12101243 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=-18.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT 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 4CFE4C433E0 for ; Wed, 24 Feb 2021 04:06:44 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E8E7F64E57 for ; Wed, 24 Feb 2021 04:06:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232095AbhBXEGL (ORCPT ); Tue, 23 Feb 2021 23:06:11 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34934 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231981AbhBXEGH (ORCPT ); Tue, 23 Feb 2021 23:06:07 -0500 Received: from mail-qt1-x830.google.com (mail-qt1-x830.google.com [IPv6:2607:f8b0:4864:20::830]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D1B7DC061786 for ; Tue, 23 Feb 2021 20:05:26 -0800 (PST) Received: by mail-qt1-x830.google.com with SMTP id r24so543293qtt.8 for ; Tue, 23 Feb 2021 20:05:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=usp.br; s=usp-google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=YJOyh2Z3wqRYU8jB7NJXwqBub8YTYWTgx8QbA+XydF0=; b=tzasNKl18eRTBhUs/j0LzwjoYjF8ONYvf9+UxHXhZwvYvNSMKciQEbycd3IZiGfCU7 9CZMBf8AEXzEHPBgyqAZ0wiT/SnQWAkoWXcErHzaKDMBeFYK5CsbR/B2Z6FUTZQhLmEx Gzhf1v4gV0nplVBDVM67j9bmqkXs7XbXxRVF8eXl++0XNL5sh7QxgiDzMpAN7cl/CLly XujIsEhCH5kpY/bInKbX/ksbQm8pG2VS77csiXCTd/bwuKoty1uivLMLqzLL5zR+irJn wufmZnrVn9F3/6bDRpVN1x2OKZ0PaYB4rpMhpWq1fAJULq7/8cOC91OmaiC/6YCu6Kbf B4iw== 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=YJOyh2Z3wqRYU8jB7NJXwqBub8YTYWTgx8QbA+XydF0=; b=k83wqJT5pFWShVuJFLYV0ZrUSSA0FpUKpzWGhdPHgIARfZXFB/469JZ5HwFEd7Cc70 2WPzgJRUtUgtjkrgQHz18a6icTuy7tno9K6cmQ8mI//ZN4GhBzJ0CkzW9UNhG+raQ7/s VhCS11g0Wjg8QiCjOUEVhHbyE5+DxHBQ9z2qEOMgPhEwQTThDvnGwtBS2oHgBGzc2/EZ 99BdY5/n4o7YCr52KOynn0YQ1nkfI4yju8BAzXO95BTSKV7liTPPqcY8mojmp3PTCzvN N2hCiQ5RZuEn2PO/BYT6VA/sKSnbxXxeczoGkesLovsxOhq9Bxmf8saZZvxCSWtj2GCZ a8ww== X-Gm-Message-State: AOAM531x8OYtqrFuVfdX6x3q3ZtPeAO5ll6xI6n27eNmzRSJ3XRYzcgQ SUtqZETpKLXlSYoffhKF3pMGkgSrausnPQ== X-Google-Smtp-Source: ABdhPJw2S3j8c4vqO3ZQe1iXkzmTOedrzD5VHyVhFe43X9iiP9i6Li6cE8hES5WaK0fp/ToY0D4t8Q== X-Received: by 2002:ac8:73d0:: with SMTP id v16mr5710100qtp.252.1614139525726; Tue, 23 Feb 2021 20:05:25 -0800 (PST) Received: from mango.meuintelbras.local ([177.32.118.149]) by smtp.gmail.com with ESMTPSA id z65sm547878qtd.15.2021.02.23.20.05.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 23 Feb 2021 20:05:25 -0800 (PST) From: Matheus Tavares To: git@vger.kernel.org Cc: gitster@pobox.com, newren@gmail.com, stolee@gmail.com Subject: [PATCH v2 2/7] t3705: add tests for `git add` in sparse checkouts Date: Wed, 24 Feb 2021 01:05:07 -0300 Message-Id: <72b87870181d8bf72ce7bf86b5fae2e485fef9c0.1614138107.git.matheus.bernardino@usp.br> X-Mailer: git-send-email 2.30.1 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org We already have a couple tests for `add` with SKIP_WORKTREE entries in t7012, but these only cover the most basic scenarios. As we will be changing how `add` deals with sparse paths in the subsequent commits, let's move these two tests to their own file and add more test cases for different `add` options and situations. This also demonstrates two options that don't currently respect SKIP_WORKTREE entries: `--chmod` and `--renormalize`. Signed-off-by: Matheus Tavares --- t/t3705-add-sparse-checkout.sh | 96 ++++++++++++++++++++++++++++++++ t/t7012-skip-worktree-writing.sh | 19 ------- 2 files changed, 96 insertions(+), 19 deletions(-) create mode 100755 t/t3705-add-sparse-checkout.sh diff --git a/t/t3705-add-sparse-checkout.sh b/t/t3705-add-sparse-checkout.sh new file mode 100755 index 0000000000..9bb5dc2389 --- /dev/null +++ b/t/t3705-add-sparse-checkout.sh @@ -0,0 +1,96 @@ +#!/bin/sh + +test_description='git add in sparse checked out working trees' + +. ./test-lib.sh + +SPARSE_ENTRY_BLOB="" + +# Optionally take a printf format string to write to the sparse_entry file +setup_sparse_entry () { + rm -f sparse_entry && + git update-index --force-remove sparse_entry && + + if test $# -eq 1 + then + printf "$1" >sparse_entry + else + >sparse_entry + fi && + git add sparse_entry && + git update-index --skip-worktree sparse_entry && + SPARSE_ENTRY_BLOB=$(git rev-parse :sparse_entry) +} + +test_sparse_entry_unchanged () { + echo "100644 $SPARSE_ENTRY_BLOB 0 sparse_entry" >expected && + git ls-files --stage sparse_entry >actual && + test_cmp expected actual +} + +setup_gitignore () { + test_when_finished rm -f .gitignore && + cat >.gitignore <<-EOF + * + !/sparse_entry + EOF +} + +test_expect_success 'git add does not remove sparse entries' ' + setup_sparse_entry && + rm sparse_entry && + git add sparse_entry && + test_sparse_entry_unchanged +' + +test_expect_success 'git add -A does not remove sparse entries' ' + setup_sparse_entry && + rm sparse_entry && + setup_gitignore && + git add -A && + test_sparse_entry_unchanged +' + +test_expect_success 'git add . does not remove sparse entries' ' + setup_sparse_entry && + rm sparse_entry && + setup_gitignore && + git add . && + test_sparse_entry_unchanged +' + +for opt in "" -f -u --ignore-removal --dry-run +do + test_expect_success "git add${opt:+ $opt} does not update sparse entries" ' + setup_sparse_entry && + echo modified >sparse_entry && + git add $opt sparse_entry && + test_sparse_entry_unchanged + ' +done + +test_expect_success 'git add --refresh does not update sparse entries' ' + setup_sparse_entry && + git ls-files --debug sparse_entry | grep mtime >before && + test-tool chmtime -60 sparse_entry && + git add --refresh sparse_entry && + git ls-files --debug sparse_entry | grep mtime >after && + test_cmp before after +' + +test_expect_failure 'git add --chmod does not update sparse entries' ' + setup_sparse_entry && + git add --chmod=+x sparse_entry && + test_sparse_entry_unchanged && + ! test -x sparse_entry +' + +test_expect_failure 'git add --renormalize does not update sparse entries' ' + test_config core.autocrlf false && + setup_sparse_entry "LINEONE\r\nLINETWO\r\n" && + echo "sparse_entry text=auto" >.gitattributes && + git add --renormalize sparse_entry && + test_sparse_entry_unchanged +' + +test_done diff --git a/t/t7012-skip-worktree-writing.sh b/t/t7012-skip-worktree-writing.sh index e5c6a038fb..217207c1ce 100755 --- a/t/t7012-skip-worktree-writing.sh +++ b/t/t7012-skip-worktree-writing.sh @@ -60,13 +60,6 @@ setup_absent() { git update-index --skip-worktree 1 } -test_absent() { - echo "100644 $EMPTY_BLOB 0 1" > expected && - git ls-files --stage 1 > result && - test_cmp expected result && - test ! -f 1 -} - setup_dirty() { git update-index --force-remove 1 && echo dirty > 1 && @@ -100,18 +93,6 @@ test_expect_success 'index setup' ' test_cmp expected result ' -test_expect_success 'git-add ignores worktree content' ' - setup_absent && - git add 1 && - test_absent -' - -test_expect_success 'git-add ignores worktree content' ' - setup_dirty && - git add 1 && - test_dirty -' - test_expect_success 'git-rm fails if worktree is dirty' ' setup_dirty && test_must_fail git rm 1 && From patchwork Wed Feb 24 04:05:08 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matheus Tavares X-Patchwork-Id: 12101245 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=-18.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT 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 6EEF6C433DB for ; Wed, 24 Feb 2021 04:06:44 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 2211064D9A for ; Wed, 24 Feb 2021 04:06:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232242AbhBXEGb (ORCPT ); Tue, 23 Feb 2021 23:06:31 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34942 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231367AbhBXEGJ (ORCPT ); Tue, 23 Feb 2021 23:06:09 -0500 Received: from mail-qt1-x82f.google.com (mail-qt1-x82f.google.com [IPv6:2607:f8b0:4864:20::82f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E4DEFC06178A for ; Tue, 23 Feb 2021 20:05:28 -0800 (PST) Received: by mail-qt1-x82f.google.com with SMTP id w6so556005qti.6 for ; Tue, 23 Feb 2021 20:05:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=usp.br; s=usp-google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=gz5T/diz7OW/xrcnN1TLwub9W5C7atWIzbheTcDORJ8=; b=eLukSXnLdejgfkm3wYdKyDuwywEsZwvV3koi0/ViXr8lYnM4The/s5DE0RzPngjdLL VPEvfNj2M7kfFVAUQ4RSiCSyKih9C5Jg2XkYahCrbNGYl89JXGYTjNGecQtlmSNJ734U rGaM8uV48Qs9mDxQNuEx9r2OpLwpvK0m4be3P2wHQFB8hlwIr9MJs6w0S8E6Sm2YlHfh dvH8K0iEUeh9sVkKdzhNSFtWcbF6Datz1T/bgBE8uz1OspQuVz3r3vVHO1bYFTTDHlMP GsXllIii2nz6D+gCLSGcKcjyPQZeTkTowdiMlkWB9sTk3TGWGX/VM5O12NFvAdylff0c jk+w== 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=gz5T/diz7OW/xrcnN1TLwub9W5C7atWIzbheTcDORJ8=; b=ln97MbgVF7UyO7T+7rrm/P/yaxGvErvJIRUN5Qu4MMTI6k5hZ2eQW4IUd3YPVqvEHh 8r2xechfHrtar0zQISgnoeo3Y/2FWcz8OtVv2jTZu40iGi+zNGJJ/lI0s9NUXkdNJ2bE vzttlOreKdCS78nwUmvr3Hh/iqxjBA1QV6yiKxWoElJ4wVmTEGrf/SWVQfltKjq/5z7U StWXWj5gBlARAXlzH1Ds+DU+zWKBHvWO0ub9IOdj5WvEKV8ZRL9jNgbS/xJHjsqO/431 oq52kmc1VmB8B3TDYp6IDERAW4rvctOpIE9XeFdp4DCuIiAAMetnFX1tN1WamCPGNYhQ 2aTQ== X-Gm-Message-State: AOAM532UuqqORWh+CUQzul1THb1J24dXPBOY+yIVi2XtglD4Rj8TcigQ l/BAiA3bjdu2Eb8V3L1WAvmG399buQNcPQ== X-Google-Smtp-Source: ABdhPJwee4Nu9WFL2tna1zOmOvYCGY4ajlnW95jxQjOMpy4pYMB6tOnTVtr6PBc+l20oDYe3dbb+Ow== X-Received: by 2002:ac8:75ce:: with SMTP id z14mr13390480qtq.286.1614139527831; Tue, 23 Feb 2021 20:05:27 -0800 (PST) Received: from mango.meuintelbras.local ([177.32.118.149]) by smtp.gmail.com with ESMTPSA id z65sm547878qtd.15.2021.02.23.20.05.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 23 Feb 2021 20:05:27 -0800 (PST) From: Matheus Tavares To: git@vger.kernel.org Cc: gitster@pobox.com, newren@gmail.com, stolee@gmail.com Subject: [PATCH v2 3/7] add: make --chmod and --renormalize honor sparse checkouts Date: Wed, 24 Feb 2021 01:05:08 -0300 Message-Id: <0f03adf241f83dcd97b2be53cd622eedd4695116.1614138107.git.matheus.bernardino@usp.br> X-Mailer: git-send-email 2.30.1 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Signed-off-by: Matheus Tavares --- builtin/add.c | 5 +++++ t/t3705-add-sparse-checkout.sh | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/builtin/add.c b/builtin/add.c index 24ed7e25f3..5fec21a792 100644 --- a/builtin/add.c +++ b/builtin/add.c @@ -46,6 +46,9 @@ static int chmod_pathspec(struct pathspec *pathspec, char flip, int show_only) struct cache_entry *ce = active_cache[i]; int err; + if (ce_skip_worktree(ce)) + continue; + if (pathspec && !ce_path_match(&the_index, ce, pathspec, NULL)) continue; @@ -144,6 +147,8 @@ static int renormalize_tracked_files(const struct pathspec *pathspec, int flags) for (i = 0; i < active_nr; i++) { struct cache_entry *ce = active_cache[i]; + if (ce_skip_worktree(ce)) + continue; if (ce_stage(ce)) continue; /* do not touch unmerged paths */ if (!S_ISREG(ce->ce_mode) && !S_ISLNK(ce->ce_mode)) diff --git a/t/t3705-add-sparse-checkout.sh b/t/t3705-add-sparse-checkout.sh index 9bb5dc2389..6781620297 100755 --- a/t/t3705-add-sparse-checkout.sh +++ b/t/t3705-add-sparse-checkout.sh @@ -78,14 +78,14 @@ test_expect_success 'git add --refresh does not update sparse entries' ' test_cmp before after ' -test_expect_failure 'git add --chmod does not update sparse entries' ' +test_expect_success 'git add --chmod does not update sparse entries' ' setup_sparse_entry && git add --chmod=+x sparse_entry && test_sparse_entry_unchanged && ! test -x sparse_entry ' -test_expect_failure 'git add --renormalize does not update sparse entries' ' +test_expect_success 'git add --renormalize does not update sparse entries' ' test_config core.autocrlf false && setup_sparse_entry "LINEONE\r\nLINETWO\r\n" && echo "sparse_entry text=auto" >.gitattributes && From patchwork Wed Feb 24 04:05:09 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matheus Tavares X-Patchwork-Id: 12101247 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.9 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, UNWANTED_LANGUAGE_BODY,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 97552C433E6 for ; Wed, 24 Feb 2021 04:06:44 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 4C9B864E77 for ; Wed, 24 Feb 2021 04:06:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232283AbhBXEGc (ORCPT ); Tue, 23 Feb 2021 23:06:32 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34954 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231981AbhBXEGM (ORCPT ); Tue, 23 Feb 2021 23:06:12 -0500 Received: from mail-qt1-x835.google.com (mail-qt1-x835.google.com [IPv6:2607:f8b0:4864:20::835]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2F02DC06178B for ; Tue, 23 Feb 2021 20:05:31 -0800 (PST) Received: by mail-qt1-x835.google.com with SMTP id r24so543397qtt.8 for ; Tue, 23 Feb 2021 20:05:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=usp.br; s=usp-google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Ozh311a+BORhAxJEYW4Xj3uH5cuh9nBKmwS5H6ieBsQ=; b=k0lOD8byVCW3nmcfIWaWduSrCc6VkGFmr4nMxgtTlkoegNGvoOXxHjHtHITI9Ueohk OMzC3Oa8wCH9nlBbOXqFED7+5veLBljd2ntrabi1LVN9V2vt/on4BfqmCjpMpEZBJiKu XPF2KbnjkHqGxCqO/tPjyQkigIagejLVWbPH3J1MHIlcHRCo4sif4bMboGaRGqZARhDA yGetybve1fv0ARb1qVRL3vVsn51x30XkCcmQWQm/zGQ/wQ9AmpAow6qas5fqnZeU+qzG oo4P+TVMFoQqcWob+Czas+jwRfavIVhCiNRFstB4658/FGyOwAJnhE4MiJzgy/MVfRWX h9dQ== 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=Ozh311a+BORhAxJEYW4Xj3uH5cuh9nBKmwS5H6ieBsQ=; b=e5heSL3rGS+vObBCd/52NcadEdHlXsyFRQMU9tKDzC6ioFTbanrUbFjHQhSIMMFybQ VgDOBpN0iSzRxVqRIgj8qKbhenOSVpkHI7K5QgrEb2S7K7O/QIB1eBCYZB4YwJVYrsgZ ZvvUP1+6Nz4h+2vos2j37mlc/o+1UIWdPb6Cqba4wLHNuBl5jU7mY0hpWko9Puksp6Ho 4EhBd5KDSwqFV+m8lrJDucSaegJzBU59xBahmhZXFHgLxjexZGynNo7MtIgQx6bxxnJJ BW/Mu+YfKScwufpsmjnwV+nYiizh+GAaMH2qShDmqz9SKBu7LKvXdzhP3H+YyJfwshNV lJ/Q== X-Gm-Message-State: AOAM5336JM+2OomOePz/09/9Ovu1dIKBNP4z59uKUp8Vttr7VtVmarbl z2Q8owtOwlZ0tPnRcQXuolj7JEAuIyKxaw== X-Google-Smtp-Source: ABdhPJxbOrT2ibAfvJ2N3gUtZW180BX9hgMsvrDxTuhOznT0DdEngK56vjnMl+Dm5ZM8iouUFeqJ3g== X-Received: by 2002:ac8:594e:: with SMTP id 14mr28206481qtz.102.1614139529911; Tue, 23 Feb 2021 20:05:29 -0800 (PST) Received: from mango.meuintelbras.local ([177.32.118.149]) by smtp.gmail.com with ESMTPSA id z65sm547878qtd.15.2021.02.23.20.05.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 23 Feb 2021 20:05:29 -0800 (PST) From: Matheus Tavares To: git@vger.kernel.org Cc: gitster@pobox.com, newren@gmail.com, stolee@gmail.com Subject: [PATCH v2 4/7] pathspec: allow to ignore SKIP_WORKTREE entries on index matching Date: Wed, 24 Feb 2021 01:05:09 -0300 Message-Id: X-Mailer: git-send-email 2.30.1 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Add the 'ignore_skip_worktree' boolean parameter to both add_pathspec_matches_against_index() and find_pathspecs_matching_against_index(). When true, these functions will not try to match the given pathspec with SKIP_WORKTREE entries. This will be used in a future patch to make `git add` display a hint when the pathspec matches only sparse paths. Signed-off-by: Matheus Tavares --- builtin/add.c | 4 ++-- builtin/check-ignore.c | 2 +- pathspec.c | 10 +++++++--- pathspec.h | 5 +++-- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/builtin/add.c b/builtin/add.c index 5fec21a792..e15b25a623 100644 --- a/builtin/add.c +++ b/builtin/add.c @@ -177,7 +177,7 @@ static char *prune_directory(struct dir_struct *dir, struct pathspec *pathspec, *dst++ = entry; } dir->nr = dst - dir->entries; - add_pathspec_matches_against_index(pathspec, &the_index, seen); + add_pathspec_matches_against_index(pathspec, &the_index, seen, 0); return seen; } @@ -578,7 +578,7 @@ int cmd_add(int argc, const char **argv, const char *prefix) int i; if (!seen) - seen = find_pathspecs_matching_against_index(&pathspec, &the_index); + seen = find_pathspecs_matching_against_index(&pathspec, &the_index, 0); /* * file_exists() assumes exact match diff --git a/builtin/check-ignore.c b/builtin/check-ignore.c index 3c652748d5..235b7fc905 100644 --- a/builtin/check-ignore.c +++ b/builtin/check-ignore.c @@ -100,7 +100,7 @@ static int check_ignore(struct dir_struct *dir, * should not be ignored, in order to be consistent with * 'git status', 'git add' etc. */ - seen = find_pathspecs_matching_against_index(&pathspec, &the_index); + seen = find_pathspecs_matching_against_index(&pathspec, &the_index, 0); for (i = 0; i < pathspec.nr; i++) { full_path = pathspec.items[i].match; pattern = NULL; diff --git a/pathspec.c b/pathspec.c index 7a229d8d22..e5e6b7458d 100644 --- a/pathspec.c +++ b/pathspec.c @@ -21,7 +21,7 @@ */ void add_pathspec_matches_against_index(const struct pathspec *pathspec, const struct index_state *istate, - char *seen) + char *seen, int ignore_skip_worktree) { int num_unmatched = 0, i; @@ -38,6 +38,8 @@ void add_pathspec_matches_against_index(const struct pathspec *pathspec, return; for (i = 0; i < istate->cache_nr; i++) { const struct cache_entry *ce = istate->cache[i]; + if (ignore_skip_worktree && ce_skip_worktree(ce)) + continue; ce_path_match(istate, ce, pathspec, seen); } } @@ -51,10 +53,12 @@ void add_pathspec_matches_against_index(const struct pathspec *pathspec, * given pathspecs achieves against all items in the index. */ char *find_pathspecs_matching_against_index(const struct pathspec *pathspec, - const struct index_state *istate) + const struct index_state *istate, + int ignore_skip_worktree) { char *seen = xcalloc(pathspec->nr, 1); - add_pathspec_matches_against_index(pathspec, istate, seen); + add_pathspec_matches_against_index(pathspec, istate, seen, + ignore_skip_worktree); return seen; } diff --git a/pathspec.h b/pathspec.h index 454ce364fa..8202882ecd 100644 --- a/pathspec.h +++ b/pathspec.h @@ -151,9 +151,10 @@ static inline int ps_strcmp(const struct pathspec_item *item, void add_pathspec_matches_against_index(const struct pathspec *pathspec, const struct index_state *istate, - char *seen); + char *seen, int ignore_skip_worktree); char *find_pathspecs_matching_against_index(const struct pathspec *pathspec, - const struct index_state *istate); + const struct index_state *istate, + int ignore_skip_worktree); int match_pathspec_attrs(const struct index_state *istate, const char *name, int namelen, const struct pathspec_item *item); From patchwork Wed Feb 24 04:05:10 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matheus Tavares X-Patchwork-Id: 12101249 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=-18.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT 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 274B3C433DB for ; Wed, 24 Feb 2021 04:07:16 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id CF3D064D9A for ; Wed, 24 Feb 2021 04:07:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232761AbhBXEG5 (ORCPT ); Tue, 23 Feb 2021 23:06:57 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35078 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232343AbhBXEGp (ORCPT ); Tue, 23 Feb 2021 23:06:45 -0500 Received: from mail-qk1-x72e.google.com (mail-qk1-x72e.google.com [IPv6:2607:f8b0:4864:20::72e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4474DC06178C for ; Tue, 23 Feb 2021 20:05:33 -0800 (PST) Received: by mail-qk1-x72e.google.com with SMTP id z190so996658qka.9 for ; Tue, 23 Feb 2021 20:05:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=usp.br; s=usp-google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=jM8kxQZu46SsXYjeE9POAehmUnoju7dDCoG7KquSiiU=; b=rXpp9oxTzD33Q8vWHLDBlNmJpXSKUgMYbeZst0tZZ3/ZnmPtuf5yfv/6UngXk5fLCG GDBnk8Qzo+NEfJcQ5dctB++B1lSW6T1sjdBZEj7NO4ZRqBDF4stb/FWUxN2KQ2I8YJBE UVgci3x8mDyUFPzcA7ROE/wC4ePWDki5K81eMlO+34n+QABW3hiDF9XtSo8PaZl5SApZ WQHNZUp0Ky0Z1KSlsloqgfO17NkUCNse/tT5VDzAerES4YbxFAbS1iZmYIKRSTcDTN+v I15l/UVY1C+HY8FRcrRF6ZEDKBTZoGVmA6h0mR3fq0MF1BY6kM90j5cB34zmTHhNAQdD jMyQ== 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=jM8kxQZu46SsXYjeE9POAehmUnoju7dDCoG7KquSiiU=; b=Vj+N/W8okXtWXN8ZebYL4Cqe2+JCGGw1O0MxJUTWrnwcgCxBc/vioSC1YsbuSn6lFa dOZLeKX4UVgiw5+/GrPg2MXxMrLUWJgYEkA8N5/X+lVaXo9d9ZBUdKMkiGSD+qC21AIf vNM5qk4SAthpAOTtT2a+rYCGg9Ed/NYtlq+JI+bwkUJ31oZLrmC2gMCht49BDzroTb56 kklbH2zw0zYK6QJ4IsVz8Fg2KaDYDuNlibN2ufdSTxsOvLyS6RhY33Z5KYREPuvrIFdr P+zUeI1SCZmaLrs1ywIJ9njA3byQpcLTyMFlkC/7l8w/na7GSE8nixqLE+vC/SzsSObo Ju1g== X-Gm-Message-State: AOAM531vQuIhe2RehBkVp60TtyQvHCdN7QQuC1a36qlVT/sMjTZR7yvN Dr/memJyQG6BXuqvVkiS09+AiAbf8lTW7w== X-Google-Smtp-Source: ABdhPJzg/pdoxLz2FFhXa7JGaTEfdln4BPeLZXVijqnmshCfrx3ILClVjQiM8WuI2rqo94ndOId4Mg== X-Received: by 2002:a05:620a:7d5:: with SMTP id 21mr25861499qkb.152.1614139532049; Tue, 23 Feb 2021 20:05:32 -0800 (PST) Received: from mango.meuintelbras.local ([177.32.118.149]) by smtp.gmail.com with ESMTPSA id z65sm547878qtd.15.2021.02.23.20.05.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 23 Feb 2021 20:05:31 -0800 (PST) From: Matheus Tavares To: git@vger.kernel.org Cc: gitster@pobox.com, newren@gmail.com, stolee@gmail.com Subject: [PATCH v2 5/7] refresh_index(): add REFRESH_DONT_MARK_SPARSE_MATCHES flag Date: Wed, 24 Feb 2021 01:05:10 -0300 Message-Id: X-Mailer: git-send-email 2.30.1 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org refresh_index() optionally takes a seen[] array to mark the pathspec items that had matches in the index. This is used by `git add --refresh` to find out if there were any pathspec without matches, and display an error accordingly. In the following patch, `git add` will also learn to warn about pathspecs that only match sparse entries (which are not updated). But for that, we will need a seen[] array marked exclusively with matches from dense entries. To avoid having to call ce_path_match() again for these entries after refresh_index() returns, add a flag that implements this restriction inside the function itself. Note that refresh_index() does not update sparse entries, regardless of passing the flag or not. The flag only controls whether matches with these entries should appear in the seen[] array. While we are here, also realign the REFRESH_* flags and convert the hex values to the more natural bit shift format, which makes it easier to spot holes. Signed-off-by: Matheus Tavares --- cache.h | 15 ++++++++------- read-cache.c | 5 ++++- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/cache.h b/cache.h index d928149614..eec864921a 100644 --- a/cache.h +++ b/cache.h @@ -879,13 +879,14 @@ int match_stat_data_racy(const struct index_state *istate, void fill_stat_cache_info(struct index_state *istate, struct cache_entry *ce, struct stat *st); -#define REFRESH_REALLY 0x0001 /* ignore_valid */ -#define REFRESH_UNMERGED 0x0002 /* allow unmerged */ -#define REFRESH_QUIET 0x0004 /* be quiet about it */ -#define REFRESH_IGNORE_MISSING 0x0008 /* ignore non-existent */ -#define REFRESH_IGNORE_SUBMODULES 0x0010 /* ignore submodules */ -#define REFRESH_IN_PORCELAIN 0x0020 /* user friendly output, not "needs update" */ -#define REFRESH_PROGRESS 0x0040 /* show progress bar if stderr is tty */ +#define REFRESH_REALLY (1 << 0) /* ignore_valid */ +#define REFRESH_UNMERGED (1 << 1) /* allow unmerged */ +#define REFRESH_QUIET (1 << 2) /* be quiet about it */ +#define REFRESH_IGNORE_MISSING (1 << 3) /* ignore non-existent */ +#define REFRESH_IGNORE_SUBMODULES (1 << 4) /* ignore submodules */ +#define REFRESH_IN_PORCELAIN (1 << 5) /* user friendly output, not "needs update" */ +#define REFRESH_PROGRESS (1 << 6) /* show progress bar if stderr is tty */ +#define REFRESH_DONT_MARK_SPARSE_MATCHES (1 << 7) /* don't mark sparse entries' matches on seen[] */ int refresh_index(struct index_state *, unsigned int flags, const struct pathspec *pathspec, char *seen, const char *header_msg); /* * Refresh the index and write it to disk. diff --git a/read-cache.c b/read-cache.c index 29144cf879..485510845c 100644 --- a/read-cache.c +++ b/read-cache.c @@ -1508,6 +1508,7 @@ int refresh_index(struct index_state *istate, unsigned int flags, int quiet = (flags & REFRESH_QUIET) != 0; int not_new = (flags & REFRESH_IGNORE_MISSING) != 0; int ignore_submodules = (flags & REFRESH_IGNORE_SUBMODULES) != 0; + int no_sparse_on_seen = (flags & REFRESH_DONT_MARK_SPARSE_MATCHES) != 0; int first = 1; int in_porcelain = (flags & REFRESH_IN_PORCELAIN); unsigned int options = (CE_MATCH_REFRESH | @@ -1541,12 +1542,14 @@ int refresh_index(struct index_state *istate, unsigned int flags, int cache_errno = 0; int changed = 0; int filtered = 0; + char *cur_seen; ce = istate->cache[i]; if (ignore_submodules && S_ISGITLINK(ce->ce_mode)) continue; - if (pathspec && !ce_path_match(istate, ce, pathspec, seen)) + cur_seen = no_sparse_on_seen && ce_skip_worktree(ce) ? NULL : seen; + if (pathspec && !ce_path_match(istate, ce, pathspec, cur_seen)) filtered = 1; if (ce_stage(ce)) { From patchwork Wed Feb 24 04:05:11 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matheus Tavares X-Patchwork-Id: 12101251 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=-18.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT 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 9766EC433DB for ; Wed, 24 Feb 2021 04:07:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 4449F64E60 for ; Wed, 24 Feb 2021 04:07:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232446AbhBXEHE (ORCPT ); Tue, 23 Feb 2021 23:07:04 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35080 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231981AbhBXEGp (ORCPT ); Tue, 23 Feb 2021 23:06:45 -0500 Received: from mail-qt1-x836.google.com (mail-qt1-x836.google.com [IPv6:2607:f8b0:4864:20::836]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AC2AAC061793 for ; Tue, 23 Feb 2021 20:05:35 -0800 (PST) Received: by mail-qt1-x836.google.com with SMTP id v64so558469qtd.5 for ; Tue, 23 Feb 2021 20:05:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=usp.br; s=usp-google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=nW9oN1R/EIiGKiZwIO8MN0lHdqz+uR5vXY9vLukJ1TA=; b=LqVQgjIEb7nOVW/YB6RMZoX7ykx3LDKTFKfiabL4vP8lfhEQg94FXPhXhSdAO0z6Az rbxTHiPk2uvZJC8LIuvbZZbsQU7NdbdyJa2ETCIpOoZXBih9R0oJaKhcCd9dxFNgonHI DnYuoR0+KNIo+MJ93UbqyyJwoxYEkKPsLesHGeosyvwiQYPAsEDcrjr4IlvL8lkGFv6s TvWNyCvZLNcFinObTg57z3fgkHRzBqCnzrvSGOHuLM+z476vWoWLMKAn6nVQNG1dKB/L 0EOy45IZsJrHnErLkmy0CR9BdSiRSEWbcmxfGHnQH3PsTOHzpH5e6GMpEnyxraIFkn/v LmAQ== 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=nW9oN1R/EIiGKiZwIO8MN0lHdqz+uR5vXY9vLukJ1TA=; b=IxzvdFWwRN1FXAsm9BYtl3zP/iDKNczt0LmEH7K6Qy6YPeEcz+ydHuXh5pTkm8atsz 3g35J9XinzO/3n8gFCp5vAbueSUsZi+QjfzsL8njiM54HSc0KSSnxbLVPAFY9ZsS4UJk 5mGO4bLuwQg5iyDl8I9g5+1av5rXo5yBIB3eCpoSzG6+M1e2JjJkY5Sz10POduCkSybd 1IqDxcoWr6xzuts0cTrAPSD9mfzh1YrZQM4toQY+mEgCZBWu3h+Jwt25B63du1fEjs0f 4KEdg5QWsZ1IWhVYgoC3p5R3WuKZXZwAKvakxb5k9r2RUPFXmbd9Fh9SrS2i+mbNp6nV tUuQ== X-Gm-Message-State: AOAM531yNWsBRN7+59rA4xXI9GmZwPGf3c/DwuBKYahFJGqvnCfGaDth RuDmo/oqna1JPdRwE6n7R4dfgPwo/u8uVQ== X-Google-Smtp-Source: ABdhPJwA1jsIr/YhWEu8CyFbwkXWyhDtQfyffIzM42FdoJOwZlYay3P5LcSJMXXLE4r4U3S0JqwsWQ== X-Received: by 2002:ac8:3aa5:: with SMTP id x34mr16832758qte.299.1614139534176; Tue, 23 Feb 2021 20:05:34 -0800 (PST) Received: from mango.meuintelbras.local ([177.32.118.149]) by smtp.gmail.com with ESMTPSA id z65sm547878qtd.15.2021.02.23.20.05.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 23 Feb 2021 20:05:33 -0800 (PST) From: Matheus Tavares To: git@vger.kernel.org Cc: gitster@pobox.com, newren@gmail.com, stolee@gmail.com Subject: [PATCH v2 6/7] add: warn when pathspec only matches SKIP_WORKTREE entries Date: Wed, 24 Feb 2021 01:05:11 -0300 Message-Id: <24e889ca9b1cb0823d1663a60ce1e0ba9e55f875.1614138107.git.matheus.bernardino@usp.br> X-Mailer: git-send-email 2.30.1 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org `git add` already refrains from updating SKIP_WORKTREE entries, but it silently exits with zero code when a pathspec only matches these entries. Instead, let's warn the user and display a hint on how to update these entries. Note that the warning is only shown if the pathspec matches no untracked paths in the working tree and only matches index entries with the SKIP_WORKTREE bit set. A warning message was chosen over erroring out right away to reproduce the same behavior `add` already exhibits with ignored files. This also allow users to continue their workflow without having to invoke `add` again with only the matching pathspecs, as the matched files will have already been added. Signed-off-by: Matheus Tavares --- Documentation/config/advice.txt | 3 ++ advice.c | 19 +++++++++ advice.h | 4 ++ builtin/add.c | 70 ++++++++++++++++++++++++------- pathspec.c | 15 +++++++ pathspec.h | 8 ++++ t/t3705-add-sparse-checkout.sh | 73 +++++++++++++++++++++++++++++---- 7 files changed, 171 insertions(+), 21 deletions(-) diff --git a/Documentation/config/advice.txt b/Documentation/config/advice.txt index acbd0c09aa..d53eafa00b 100644 --- a/Documentation/config/advice.txt +++ b/Documentation/config/advice.txt @@ -119,4 +119,7 @@ advice.*:: addEmptyPathspec:: Advice shown if a user runs the add command without providing the pathspec parameter. + updateSparsePath:: + Advice shown if the pathspec given to linkgit:git-add[1] only + matches index entries outside the current sparse-checkout. -- diff --git a/advice.c b/advice.c index 164742305f..cf22c1a6e5 100644 --- a/advice.c +++ b/advice.c @@ -2,6 +2,7 @@ #include "config.h" #include "color.h" #include "help.h" +#include "string-list.h" int advice_fetch_show_forced_updates = 1; int advice_push_update_rejected = 1; @@ -136,6 +137,7 @@ static struct { [ADVICE_STATUS_HINTS] = { "statusHints", 1 }, [ADVICE_STATUS_U_OPTION] = { "statusUoption", 1 }, [ADVICE_SUBMODULE_ALTERNATE_ERROR_STRATEGY_DIE] = { "submoduleAlternateErrorStrategyDie", 1 }, + [ADVICE_UPDATE_SPARSE_PATH] = { "updateSparsePath", 1 }, [ADVICE_WAITING_FOR_EDITOR] = { "waitingForEditor", 1 }, }; @@ -284,6 +286,23 @@ void NORETURN die_conclude_merge(void) die(_("Exiting because of unfinished merge.")); } +void advise_on_updating_sparse_paths(struct string_list *pathspec_list) +{ + struct string_list_item *item; + + if (!pathspec_list->nr) + return; + + fprintf(stderr, _("The following pathspecs only matched index entries outside the current\n" + "sparse checkout:\n")); + for_each_string_list_item(item, pathspec_list) + fprintf(stderr, "%s\n", item->string); + + advise_if_enabled(ADVICE_UPDATE_SPARSE_PATH, + _("Disable or modify the sparsity rules if you intend to update such entries.")); + +} + void detach_advice(const char *new_name) { const char *fmt = diff --git a/advice.h b/advice.h index bc2432980a..bd26c385d0 100644 --- a/advice.h +++ b/advice.h @@ -3,6 +3,8 @@ #include "git-compat-util.h" +struct string_list; + extern int advice_fetch_show_forced_updates; extern int advice_push_update_rejected; extern int advice_push_non_ff_current; @@ -71,6 +73,7 @@ extern int advice_add_empty_pathspec; ADVICE_STATUS_HINTS, ADVICE_STATUS_U_OPTION, ADVICE_SUBMODULE_ALTERNATE_ERROR_STRATEGY_DIE, + ADVICE_UPDATE_SPARSE_PATH, ADVICE_WAITING_FOR_EDITOR, }; @@ -92,6 +95,7 @@ void advise_if_enabled(enum advice_type type, const char *advice, ...); int error_resolve_conflict(const char *me); void NORETURN die_resolve_conflict(const char *me); void NORETURN die_conclude_merge(void); +void advise_on_updating_sparse_paths(struct string_list *pathspec_list); void detach_advice(const char *new_name); #endif /* ADVICE_H */ diff --git a/builtin/add.c b/builtin/add.c index e15b25a623..fde6462850 100644 --- a/builtin/add.c +++ b/builtin/add.c @@ -177,24 +177,43 @@ static char *prune_directory(struct dir_struct *dir, struct pathspec *pathspec, *dst++ = entry; } dir->nr = dst - dir->entries; - add_pathspec_matches_against_index(pathspec, &the_index, seen, 0); + add_pathspec_matches_against_index(pathspec, &the_index, seen, 1); return seen; } -static void refresh(int verbose, const struct pathspec *pathspec) +static int refresh(int verbose, const struct pathspec *pathspec) { char *seen; - int i; + int i, ret = 0; + char *skip_worktree_seen = NULL; + struct string_list only_match_skip_worktree = STRING_LIST_INIT_NODUP; + int flags = REFRESH_DONT_MARK_SPARSE_MATCHES | + (verbose ? REFRESH_IN_PORCELAIN : REFRESH_QUIET); seen = xcalloc(pathspec->nr, 1); - refresh_index(&the_index, verbose ? REFRESH_IN_PORCELAIN : REFRESH_QUIET, - pathspec, seen, _("Unstaged changes after refreshing the index:")); + refresh_index(&the_index, flags, pathspec, seen, + _("Unstaged changes after refreshing the index:")); for (i = 0; i < pathspec->nr; i++) { - if (!seen[i]) - die(_("pathspec '%s' did not match any files"), - pathspec->items[i].original); + if (!seen[i]) { + if (matches_skip_worktree(pathspec, i, &skip_worktree_seen)) { + string_list_append(&only_match_skip_worktree, + pathspec->items[i].original); + } else { + die(_("pathspec '%s' did not match any files"), + pathspec->items[i].original); + } + } + } + + if (only_match_skip_worktree.nr) { + advise_on_updating_sparse_paths(&only_match_skip_worktree); + ret = 1; } + free(seen); + free(skip_worktree_seen); + string_list_clear(&only_match_skip_worktree, 0); + return ret; } int run_add_interactive(const char *revision, const char *patch_mode, @@ -570,15 +589,17 @@ int cmd_add(int argc, const char **argv, const char *prefix) } if (refresh_only) { - refresh(verbose, &pathspec); + exit_status |= refresh(verbose, &pathspec); goto finish; } if (pathspec.nr) { int i; + char *skip_worktree_seen = NULL; + struct string_list only_match_skip_worktree = STRING_LIST_INIT_NODUP; if (!seen) - seen = find_pathspecs_matching_against_index(&pathspec, &the_index, 0); + seen = find_pathspecs_matching_against_index(&pathspec, &the_index, 1); /* * file_exists() assumes exact match @@ -592,12 +613,24 @@ int cmd_add(int argc, const char **argv, const char *prefix) for (i = 0; i < pathspec.nr; i++) { const char *path = pathspec.items[i].match; + if (pathspec.items[i].magic & PATHSPEC_EXCLUDE) continue; - if (!seen[i] && path[0] && - ((pathspec.items[i].magic & - (PATHSPEC_GLOB | PATHSPEC_ICASE)) || - !file_exists(path))) { + if (seen[i]) + continue; + + if (matches_skip_worktree(&pathspec, i, &skip_worktree_seen)) { + string_list_append(&only_match_skip_worktree, + pathspec.items[i].original); + continue; + } + + /* Don't complain at 'git add .' inside empty repo. */ + if (!path[0]) + continue; + + if ((pathspec.items[i].magic & (PATHSPEC_GLOB | PATHSPEC_ICASE)) || + !file_exists(path)) { if (ignore_missing) { int dtype = DT_UNKNOWN; if (is_excluded(&dir, &the_index, path, &dtype)) @@ -608,7 +641,16 @@ int cmd_add(int argc, const char **argv, const char *prefix) pathspec.items[i].original); } } + + + if (only_match_skip_worktree.nr) { + advise_on_updating_sparse_paths(&only_match_skip_worktree); + exit_status = 1; + } + free(seen); + free(skip_worktree_seen); + string_list_clear(&only_match_skip_worktree, 0); } plug_bulk_checkin(); diff --git a/pathspec.c b/pathspec.c index e5e6b7458d..61f294fed5 100644 --- a/pathspec.c +++ b/pathspec.c @@ -62,6 +62,21 @@ char *find_pathspecs_matching_against_index(const struct pathspec *pathspec, return seen; } +char *find_pathspecs_matching_skip_worktree(const struct pathspec *pathspec) +{ + struct index_state *istate = the_repository->index; + char *seen = xcalloc(pathspec->nr, 1); + int i; + + for (i = 0; i < istate->cache_nr; i++) { + struct cache_entry *ce = istate->cache[i]; + if (ce_skip_worktree(ce)) + ce_path_match(istate, ce, pathspec, seen); + } + + return seen; +} + /* * Magic pathspec * diff --git a/pathspec.h b/pathspec.h index 8202882ecd..f591ba625c 100644 --- a/pathspec.h +++ b/pathspec.h @@ -155,6 +155,14 @@ void add_pathspec_matches_against_index(const struct pathspec *pathspec, char *find_pathspecs_matching_against_index(const struct pathspec *pathspec, const struct index_state *istate, int ignore_skip_worktree); +char *find_pathspecs_matching_skip_worktree(const struct pathspec *pathspec); +static inline int matches_skip_worktree(const struct pathspec *pathspec, + int item, char **seen_ptr) +{ + if (!*seen_ptr) + *seen_ptr = find_pathspecs_matching_skip_worktree(pathspec); + return (*seen_ptr)[item]; +} int match_pathspec_attrs(const struct index_state *istate, const char *name, int namelen, const struct pathspec_item *item); diff --git a/t/t3705-add-sparse-checkout.sh b/t/t3705-add-sparse-checkout.sh index 6781620297..fdfd8b085e 100755 --- a/t/t3705-add-sparse-checkout.sh +++ b/t/t3705-add-sparse-checkout.sh @@ -36,10 +36,26 @@ setup_gitignore () { EOF } +test_expect_success 'setup' ' + cat >sparse_error_header <<-EOF && + The following pathspecs only matched index entries outside the current + sparse checkout: + EOF + + cat >sparse_hint <<-EOF && + hint: Disable or modify the sparsity rules if you intend to update such entries. + hint: Disable this message with "git config advice.updateSparsePath false" + EOF + + echo sparse_entry | cat sparse_error_header - >sparse_entry_error && + cat sparse_entry_error sparse_hint >error_and_hint +' + test_expect_success 'git add does not remove sparse entries' ' setup_sparse_entry && rm sparse_entry && - git add sparse_entry && + test_must_fail git add sparse_entry 2>stderr && + test_i18ncmp error_and_hint stderr && test_sparse_entry_unchanged ' @@ -47,7 +63,8 @@ test_expect_success 'git add -A does not remove sparse entries' ' setup_sparse_entry && rm sparse_entry && setup_gitignore && - git add -A && + git add -A 2>stderr && + test_must_be_empty stderr && test_sparse_entry_unchanged ' @@ -55,7 +72,13 @@ test_expect_success 'git add . does not remove sparse entries' ' setup_sparse_entry && rm sparse_entry && setup_gitignore && - git add . && + test_must_fail git add . 2>stderr && + + cat sparse_error_header >expect && + echo . >>expect && + cat sparse_hint >>expect && + + test_i18ncmp expect stderr && test_sparse_entry_unchanged ' @@ -64,7 +87,8 @@ do test_expect_success "git add${opt:+ $opt} does not update sparse entries" ' setup_sparse_entry && echo modified >sparse_entry && - git add $opt sparse_entry && + test_must_fail git add $opt sparse_entry 2>stderr && + test_i18ncmp error_and_hint stderr && test_sparse_entry_unchanged ' done @@ -73,14 +97,16 @@ test_expect_success 'git add --refresh does not update sparse entries' ' setup_sparse_entry && git ls-files --debug sparse_entry | grep mtime >before && test-tool chmtime -60 sparse_entry && - git add --refresh sparse_entry && + test_must_fail git add --refresh sparse_entry 2>stderr && + test_i18ncmp error_and_hint stderr && git ls-files --debug sparse_entry | grep mtime >after && test_cmp before after ' test_expect_success 'git add --chmod does not update sparse entries' ' setup_sparse_entry && - git add --chmod=+x sparse_entry && + test_must_fail git add --chmod=+x sparse_entry 2>stderr && + test_i18ncmp error_and_hint stderr && test_sparse_entry_unchanged && ! test -x sparse_entry ' @@ -89,8 +115,41 @@ test_expect_success 'git add --renormalize does not update sparse entries' ' test_config core.autocrlf false && setup_sparse_entry "LINEONE\r\nLINETWO\r\n" && echo "sparse_entry text=auto" >.gitattributes && - git add --renormalize sparse_entry && + test_must_fail git add --renormalize sparse_entry 2>stderr && + test_i18ncmp error_and_hint stderr && test_sparse_entry_unchanged ' +test_expect_success 'git add --dry-run --ignore-missing warn on sparse path' ' + setup_sparse_entry && + rm sparse_entry && + test_must_fail git add --dry-run --ignore-missing sparse_entry 2>stderr && + test_i18ncmp error_and_hint stderr && + test_sparse_entry_unchanged +' + +test_expect_success 'do not advice about sparse entries when they do not match the pathspec' ' + setup_sparse_entry && + test_must_fail git add nonexistent 2>stderr && + test_i18ngrep "fatal: pathspec .nonexistent. did not match any files" stderr && + test_i18ngrep ! "The following pathspecs only matched index entries" stderr +' + +test_expect_success 'do not warn when pathspec matches dense entries' ' + setup_sparse_entry && + echo modified >sparse_entry && + >dense_entry && + git add "*_entry" 2>stderr && + test_must_be_empty stderr && + test_sparse_entry_unchanged && + git ls-files --error-unmatch dense_entry +' + +test_expect_success 'add obeys advice.updateSparsePath' ' + setup_sparse_entry && + test_must_fail git -c advice.updateSparsePath=false add sparse_entry 2>stderr && + test_i18ncmp sparse_entry_error stderr + +' + test_done From patchwork Wed Feb 24 04:05:12 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matheus Tavares X-Patchwork-Id: 12101253 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=-18.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT 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 AD324C433E0 for ; Wed, 24 Feb 2021 04:08:48 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 5434164D9A for ; Wed, 24 Feb 2021 04:08:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233001AbhBXEIO (ORCPT ); Tue, 23 Feb 2021 23:08:14 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35178 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232941AbhBXEHK (ORCPT ); Tue, 23 Feb 2021 23:07:10 -0500 Received: from mail-qv1-xf36.google.com (mail-qv1-xf36.google.com [IPv6:2607:f8b0:4864:20::f36]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5C7EBC0617AA for ; Tue, 23 Feb 2021 20:05:57 -0800 (PST) Received: by mail-qv1-xf36.google.com with SMTP id p12so449207qvv.5 for ; Tue, 23 Feb 2021 20:05:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=usp.br; s=usp-google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=ubUr74NVZFF50O9SWkMMv+h9cQCNyt3zquryW0jmNes=; b=l0ktavTnTy7+RdPXpuAMUGeWh5A6gHTQHFJpGfVOTRhHn/l46DuhgumnsmrxGgRFdk Ec4AUAkFct1HgKm+X4J01Re625KMcdeShgsZ/Ci3FeXmeudMylFaZJeP6pWS5b6NSb47 l7gUUgkhUn/rvaHO4dB8WKEcqSrl0KbOQ68lAHFgbJ/uRG8kdfwrWV39QRh5XshaDNHT VBahgQ6RdOpQw42bFvugFJive5V88G/NQaiMtXL/ThMJeWAyipEWnjYV6kFP4MyI3XYo JtPUzhn7v92kNWx2EKiiMVx52GxkH6IFUj7aqWo6uCnbtxihIeUJcsF8s6RvKkBtsfoe MAmg== 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=ubUr74NVZFF50O9SWkMMv+h9cQCNyt3zquryW0jmNes=; b=sl8R9FMwrb3VnBTkz5CGtoizBRUUpKerVqPBqxZpO9KD/OX7qcpqvmmHp/qSaunJKO zPgR5HDOEJ5LVwOVmvjlXYSis7O+fA8uNpm01LhaT0bGUG9uT4FYo2p1zqKan1QaqTfQ KQbbhcYdrF8HdjX6VXdJBW/lk86aR3vVBz4NheBVcqRTELe2d65db3iUBZDSCkt10wkV 20hZ+x6HqyxqjNeh839Je/ZtrffI56XltRIM26JXQpX2g9BTYiHcHfcKNHlcDZs18Tiy hQ6YQokCEVNKMr4WEIRLLzwvwpRaym0g7jQtXm8wV895drHuiw/LtlFB/2h7bj8W3goG zaZA== X-Gm-Message-State: AOAM533C26C9Gk0OqzEU2jlDFYYtdUlv75JVV7xi7rx7d0lsv+IwCGYI uahGU1Cy83LpGBh4SZ5Bxf3tPUfzlL1Osw== X-Google-Smtp-Source: ABdhPJzuYdQjgZbq+W7qVGhB/42Oic08qXgM07GvjObqldwfT7ftNxrunqiJUaE22HwKFMWRwW7U1w== X-Received: by 2002:a0c:abce:: with SMTP id k14mr28293712qvb.23.1614139555802; Tue, 23 Feb 2021 20:05:55 -0800 (PST) Received: from mango.meuintelbras.local ([177.32.118.149]) by smtp.gmail.com with ESMTPSA id z65sm547878qtd.15.2021.02.23.20.05.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 23 Feb 2021 20:05:55 -0800 (PST) From: Matheus Tavares To: git@vger.kernel.org Cc: gitster@pobox.com, newren@gmail.com, stolee@gmail.com Subject: [PATCH v2 7/7] rm: honor sparse checkout patterns Date: Wed, 24 Feb 2021 01:05:12 -0300 Message-Id: <08f0c32bfcbd04891afd3ca7133484b0ed6c7257.1614138107.git.matheus.bernardino@usp.br> X-Mailer: git-send-email 2.30.1 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org `git add` refrains from adding or updating paths outside the sparsity rules, but `git rm` doesn't follow the same restrictions. This is somewhat counter-intuitive and inconsistent. So make `rm` honor the sparse checkout and advise on how to remove SKIP_WORKTREE entries, just like `add` does. Also add some tests for the new behavior. Suggested-by: Elijah Newren Signed-off-by: Matheus Tavares --- Documentation/config/advice.txt | 5 ++- Documentation/git-rm.txt | 4 +- builtin/rm.c | 35 ++++++++++----- t/t3602-rm-sparse-checkout.sh | 76 ++++++++++++++++++++++++++++++++ t/t7011-skip-worktree-reading.sh | 5 --- 5 files changed, 106 insertions(+), 19 deletions(-) create mode 100755 t/t3602-rm-sparse-checkout.sh diff --git a/Documentation/config/advice.txt b/Documentation/config/advice.txt index d53eafa00b..bdd423ade4 100644 --- a/Documentation/config/advice.txt +++ b/Documentation/config/advice.txt @@ -120,6 +120,7 @@ advice.*:: Advice shown if a user runs the add command without providing the pathspec parameter. updateSparsePath:: - Advice shown if the pathspec given to linkgit:git-add[1] only - matches index entries outside the current sparse-checkout. + Advice shown if the pathspec given to linkgit:git-add[1] or + linkgit:git-rm[1] only matches index entries outside the + current sparse-checkout. -- diff --git a/Documentation/git-rm.txt b/Documentation/git-rm.txt index ab750367fd..26e9b28470 100644 --- a/Documentation/git-rm.txt +++ b/Documentation/git-rm.txt @@ -23,7 +23,9 @@ branch, and no updates to their contents can be staged in the index, though that default behavior can be overridden with the `-f` option. When `--cached` is given, the staged content has to match either the tip of the branch or the file on disk, -allowing the file to be removed from just the index. +allowing the file to be removed from just the index. When +sparse-checkouts are in use (see linkgit:git-sparse-checkout[1]), +`git rm` will only remove paths within the sparse-checkout patterns. OPTIONS diff --git a/builtin/rm.c b/builtin/rm.c index 4858631e0f..d23a3b2164 100644 --- a/builtin/rm.c +++ b/builtin/rm.c @@ -5,6 +5,7 @@ */ #define USE_THE_INDEX_COMPATIBILITY_MACROS #include "builtin.h" +#include "advice.h" #include "config.h" #include "lockfile.h" #include "dir.h" @@ -254,7 +255,7 @@ static struct option builtin_rm_options[] = { int cmd_rm(int argc, const char **argv, const char *prefix) { struct lock_file lock_file = LOCK_INIT; - int i; + int i, ret = 0; struct pathspec pathspec; char *seen; @@ -295,6 +296,8 @@ int cmd_rm(int argc, const char **argv, const char *prefix) for (i = 0; i < active_nr; i++) { const struct cache_entry *ce = active_cache[i]; + if (ce_skip_worktree(ce)) + continue; if (!ce_path_match(&the_index, ce, &pathspec, seen)) continue; ALLOC_GROW(list.entry, list.nr + 1, list.alloc); @@ -308,24 +311,34 @@ int cmd_rm(int argc, const char **argv, const char *prefix) if (pathspec.nr) { const char *original; int seen_any = 0; + char *skip_worktree_seen = NULL; + struct string_list only_match_skip_worktree = STRING_LIST_INIT_NODUP; + for (i = 0; i < pathspec.nr; i++) { original = pathspec.items[i].original; - if (!seen[i]) { - if (!ignore_unmatch) { - die(_("pathspec '%s' did not match any files"), - original); - } - } - else { + if (seen[i]) seen_any = 1; - } + else if (ignore_unmatch) + continue; + else if (matches_skip_worktree(&pathspec, i, &skip_worktree_seen)) + string_list_append(&only_match_skip_worktree, original); + else + die(_("pathspec '%s' did not match any files"), original); + if (!recursive && seen[i] == MATCHED_RECURSIVELY) die(_("not removing '%s' recursively without -r"), *original ? original : "."); } + if (only_match_skip_worktree.nr) { + advise_on_updating_sparse_paths(&only_match_skip_worktree); + ret = 1; + } + free(skip_worktree_seen); + string_list_clear(&only_match_skip_worktree, 0); + if (!seen_any) - exit(0); + exit(ret); } if (!index_only) @@ -405,5 +418,5 @@ int cmd_rm(int argc, const char **argv, const char *prefix) COMMIT_LOCK | SKIP_IF_UNCHANGED)) die(_("Unable to write new index file")); - return 0; + return ret; } diff --git a/t/t3602-rm-sparse-checkout.sh b/t/t3602-rm-sparse-checkout.sh new file mode 100755 index 0000000000..34f4debacf --- /dev/null +++ b/t/t3602-rm-sparse-checkout.sh @@ -0,0 +1,76 @@ +#!/bin/sh + +test_description='git rm in sparse checked out working trees' + +. ./test-lib.sh + +test_expect_success 'setup' ' + mkdir -p sub/dir && + touch a b c sub/d sub/dir/e && + git add -A && + git commit -m files && + + cat >sparse_entry_b_error <<-EOF && + The following pathspecs only matched index entries outside the current + sparse checkout: + b + EOF + + cat >b_error_and_hint sparse_entry_b_error - <<-EOF + hint: Disable or modify the sparsity rules if you intend to update such entries. + hint: Disable this message with "git config advice.updateSparsePath false" + EOF +' + +for opt in "" -f --dry-run +do + test_expect_success "rm${opt:+ $opt} does not remove sparse entries" ' + git sparse-checkout set a && + test_must_fail git rm $opt b 2>stderr && + test_i18ncmp b_error_and_hint stderr && + git ls-files --error-unmatch b + ' +done + +test_expect_success 'recursive rm does not remove sparse entries' ' + git reset --hard && + git sparse-checkout set sub/dir && + git rm -r sub && + git status --porcelain -uno >actual && + echo "D sub/dir/e" >expected && + test_cmp expected actual +' + +test_expect_success 'rm obeys advice.updateSparsePath' ' + git reset --hard && + git sparse-checkout set a && + test_must_fail git -c advice.updateSparsePath=false rm b 2>stderr && + test_i18ncmp sparse_entry_b_error stderr +' + +test_expect_success 'do not advice about sparse entries when they do not match the pathspec' ' + git reset --hard && + git sparse-checkout set a && + test_must_fail git rm nonexistent 2>stderr && + test_i18ngrep "fatal: pathspec .nonexistent. did not match any files" stderr && + test_i18ngrep ! "The following pathspecs only matched index entries" stderr +' + +test_expect_success 'do not warn about sparse entries when pathspec matches dense entries' ' + git reset --hard && + git sparse-checkout set a && + git rm "[ba]" 2>stderr && + test_must_be_empty stderr && + git ls-files --error-unmatch b && + test_must_fail git ls-files --error-unmatch a +' + +test_expect_success 'do not warn about sparse entries with --ignore-unmatch' ' + git reset --hard && + git sparse-checkout set a && + git rm --ignore-unmatch b 2>stderr && + test_must_be_empty stderr && + git ls-files --error-unmatch b +' + +test_done diff --git a/t/t7011-skip-worktree-reading.sh b/t/t7011-skip-worktree-reading.sh index 37525cae3a..f87749951f 100755 --- a/t/t7011-skip-worktree-reading.sh +++ b/t/t7011-skip-worktree-reading.sh @@ -141,11 +141,6 @@ test_expect_success 'diff-files does not examine skip-worktree dirty entries' ' test -z "$(git diff-files -- one)" ' -test_expect_success 'git-rm succeeds on skip-worktree absent entries' ' - setup_absent && - git rm 1 -' - test_expect_success 'commit on skip-worktree absent entries' ' git reset && setup_absent &&