From patchwork Mon Feb 27 15:28:08 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 13153808 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6FFFDC64ED6 for ; Mon, 27 Feb 2023 15:28:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230116AbjB0P2b (ORCPT ); Mon, 27 Feb 2023 10:28:31 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42972 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229568AbjB0P21 (ORCPT ); Mon, 27 Feb 2023 10:28:27 -0500 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 BB29DD33B for ; Mon, 27 Feb 2023 07:28:24 -0800 (PST) Received: by mail-wm1-x334.google.com with SMTP id j3so4500530wms.2 for ; Mon, 27 Feb 2023 07:28:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=xOAL/WFgID8YOd9lLNB0zCh3EXi1IuYdpdDovPkOCQY=; b=En1WTzLGkjEbZqF+BljsC1Kc1URK0ovR+rg+mgZv1SasvG6gwnXCF+6hbtVDbjE++Q 6YbuYfP2uhxTbrLqpo/H6QVbU7uERa3k6nXZrpp/hsUIgPXmE5JwM5JcsWyx/Y6w1itZ 0RHSQeYBZkrTcnfzIqRq1OkRBRCndjO42kqUyrN8BfRIAMpwRIbt+xBfwfM9DTnc+avt nPxwLtUZs3B+L5xHQ/YoWEVGqhGFBD1pc41eUhAF3KeAdZbEPvGhiv/Raai1aRJsyrBO 9zGM5m3hQgy5Wyt7nSJo4dxCPyuOoJUCInae56dXoOqrs/11LxqLkIhQeATlialyO3cs wpNg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=xOAL/WFgID8YOd9lLNB0zCh3EXi1IuYdpdDovPkOCQY=; b=jQmcrE4Qm7WoJO3wK9GbsFdbWEWTvlVFlZrwq8VFu9Usa1rP/Acs4J+uAimcj7Ib9X J6mkccPewbhsZPu09uiBW1857X/+jWIbN4CSR5F93Gt9gMaSezCNs+F5KURhSxeQ+GvK +02bd5dh4O1BcvSjcSLT4B0zpm7TPBLqNOzMxuTlOgdqoGaOS0Vl/GstmHMe5RFugoz6 FGe+EnBqyEOi6/zNw3icYJ7QNrp2/egxTJT8kJToE2daEt5nCwjVmpSGZQQjBP4bGqu5 8majtmMwbseZSww2ghClwgEcYfxHr2sZIgnh5ffkDGPNYx8qRBnTZZjo126egNLsy4ZQ CfUQ== X-Gm-Message-State: AO0yUKWPI1vxqa9jjX0+kBXCVYnKWbG7o6gx2izmrBZO9Ua/+YhOA5qD SSM0HiaJalhyxkKFDYKl+s8oHKB0HZU= X-Google-Smtp-Source: AK7set/Pac+RYEDU9SVOQsDbovlNLgNwSVTWHm3lu9J2NzVxaJTW50UGW5j/imUSpwDMI8F2drI2nQ== X-Received: by 2002:a05:600c:929:b0:3e2:5c3:bcfc with SMTP id m41-20020a05600c092900b003e205c3bcfcmr19389061wmp.18.1677511702546; Mon, 27 Feb 2023 07:28:22 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id c10-20020a5d4f0a000000b002c54911f50bsm7387044wru.84.2023.02.27.07.28.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Feb 2023 07:28:22 -0800 (PST) Message-Id: <7bbc4577a57fc9cb9debc249af232282b6b3f24f.1677511700.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Mon, 27 Feb 2023 15:28:08 +0000 Subject: [PATCH v3 01/13] t2021: fix platform-specific leftover cruft Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Derrick Stolee , Elijah Newren , Jacob Keller , Jonathan Tan , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren t2021.6 existed to test the status of a symlink that was left around by previous tests. It tried to also clean up the symlink after it was done so that subsequent tests wouldn't be tripped up by it. Unfortunately, since this test had a SYMLINK prerequisite, that made the cleanup platform dependent...and made a testcase I was trying to add to this testsuite fail (that testcase will be included in the next patch). Before we go and add new testcases, fix this cleanup by moving it into a separate test. Signed-off-by: Elijah Newren --- t/t2021-checkout-overwrite.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/t/t2021-checkout-overwrite.sh b/t/t2021-checkout-overwrite.sh index 713c3fa6038..baca66e1a31 100755 --- a/t/t2021-checkout-overwrite.sh +++ b/t/t2021-checkout-overwrite.sh @@ -50,10 +50,13 @@ test_expect_success 'checkout commit with dir must not remove untracked a/b' ' test_expect_success SYMLINKS 'the symlink remained' ' - test_when_finished "rm a/b" && test -h a/b ' +test_expect_success 'cleanup after previous symlink tests' ' + rm a/b +' + test_expect_success SYMLINKS 'checkout -f must not follow symlinks when removing entries' ' git checkout -f start && mkdir dir && From patchwork Mon Feb 27 15:28:09 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 13153809 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C9351C64ED8 for ; Mon, 27 Feb 2023 15:28:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229942AbjB0P2d (ORCPT ); Mon, 27 Feb 2023 10:28:33 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42934 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230170AbjB0P22 (ORCPT ); Mon, 27 Feb 2023 10:28:28 -0500 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 550A2B473 for ; Mon, 27 Feb 2023 07:28:25 -0800 (PST) Received: by mail-wr1-x431.google.com with SMTP id v16so3844049wrn.0 for ; Mon, 27 Feb 2023 07:28:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=tLo1zUU46LmESvRDG8CVbF8q0iwxbn/Du3MzxOLzph8=; b=BrDbAjWU7/t9bDALdgDw8rJ00w3XckTSPc3yWn4Ee1t0rlTb35OQGyX5Y5OQajfXCJ cXhLoljtl6xRn1PXnNvMs/e/7ER0bcEFe1v6Wil7EZG/Yvpo+Z1OwCMs7C3CHcOwhEk/ LFbTNtO5hOplzMfNTBudFfo0A7gXQ6i9I1WiZm+7ed8Uczm5K1RiMPl7JAbTWzfIsKfy GpEbP5hoXikJhOxOaqU965ftBKKxO4sU0eq0TQ5h5JKR6ccTO8NC+1dOgQd0zLD8Bu2e CgIZu/omQhZ/nUXMwLB9epiazfZaJbGGGoCsJOv3kIU2catlECl7NuZx3yRzRDS7Q6WX MtNA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=tLo1zUU46LmESvRDG8CVbF8q0iwxbn/Du3MzxOLzph8=; b=ZI3qiPD1h7SU2L7aDbABwHYMjjIM7j3hHQI7opKl8jdaOYhVcJ1kFI3XZQ1cazagni FOenZy64xgaYorceJ3dLQ0Q+bDLBq4JPixWwIz+eXqPxGH8OlHSOlUBp1tPjm7tVELZB eC5vcgDNHWmftrgLzQ5OO7/rDI9DCnCnqrBxojtPaYy0D4Fx6OLCPfJ1OzXMEEovk8H7 Wh73sKIxWpcd1XeOy1fSsXTvuBq7o+0AYOeczY1JrkSNp+lCQODzvfaRg71S+FHESdTL zuDXy7uvy3+DSGDlT8Xf+iBlOp5HIjw+/QwpvaHL1zCW0/ReEJKY/O2ceM3YRwrR6Ibo qj6A== X-Gm-Message-State: AO0yUKWXnlDgmiLD0RtxCfzl8RfLkBdfMQHzl2CFPw14gaRqTzKh/uRP f5GFjpamZgKcwE03Bijsrv4FTQgELyA= X-Google-Smtp-Source: AK7set8gAXKCOm2kYpcoyR5SIDQDwgaBXTii3yc/CZBay7DCD3br+DAVls/YTlnCfmVnfeRM8MY+Kw== X-Received: by 2002:a5d:568c:0:b0:2c7:478:d1d9 with SMTP id f12-20020a5d568c000000b002c70478d1d9mr17860182wrv.33.1677511703561; Mon, 27 Feb 2023 07:28:23 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id a2-20020adfdd02000000b002c3f03d8851sm7465019wrm.16.2023.02.27.07.28.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Feb 2023 07:28:22 -0800 (PST) Message-Id: <8ffdb6c8a8a3b162c898ba759137d41bbfd44b39.1677511700.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Mon, 27 Feb 2023 15:28:09 +0000 Subject: [PATCH v3 02/13] unpack-trees: heed requests to overwrite ignored files Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Derrick Stolee , Elijah Newren , Jacob Keller , Jonathan Tan , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren When a directory exists but has only ignored files within it and we are trying to switch to a branch that has a file where that directory is, the behavior depends upon --[no]-overwrite-ignore. If the user wants to --overwrite-ignore (the default), then we should delete the ignored file and directory and switch to the new branch. The code to handle this in verify_clean_subdirectory() in unpack-trees tried to handle this via paying attention to the exclude_per_dir setting of the internal dir field. This came from commit c81935348b ("Fix switching to a branch with D/F when current branch has file D.", 2007-03-15), which pre-dated 039bc64e88 ("core.excludesfile clean-up", 2007-11-14), and thus did not pay attention to ignore patterns from other relevant files. Change it to use setup_standard_excludes() so that it is also aware of excludes specified in other locations. Signed-off-by: Elijah Newren --- t/t2021-checkout-overwrite.sh | 11 +++++++++++ unpack-trees.c | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/t/t2021-checkout-overwrite.sh b/t/t2021-checkout-overwrite.sh index baca66e1a31..034f62c13c5 100755 --- a/t/t2021-checkout-overwrite.sh +++ b/t/t2021-checkout-overwrite.sh @@ -69,4 +69,15 @@ test_expect_success SYMLINKS 'checkout -f must not follow symlinks when removing test_path_is_file untracked/f ' +test_expect_success 'checkout --overwrite-ignore should succeed if only ignored files in the way' ' + git checkout -b df_conflict && + test_commit contents some_dir && + git checkout start && + mkdir some_dir && + echo autogenerated information >some_dir/ignore && + echo ignore >.git/info/exclude && + git checkout --overwrite-ignore df_conflict && + ! test_path_is_dir some_dir +' + test_done diff --git a/unpack-trees.c b/unpack-trees.c index 3d05e45a279..4518d33ed99 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -2337,7 +2337,7 @@ static int verify_clean_subdirectory(const struct cache_entry *ce, memset(&d, 0, sizeof(d)); if (o->dir) - d.exclude_per_dir = o->dir->exclude_per_dir; + setup_standard_excludes(&d); i = read_directory(&d, o->src_index, pathbuf, namelen+1, NULL); dir_clear(&d); free(pathbuf); From patchwork Mon Feb 27 15:28:10 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 13153811 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4A81DC64ED6 for ; Mon, 27 Feb 2023 15:28:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230202AbjB0P2g (ORCPT ); Mon, 27 Feb 2023 10:28:36 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43156 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230022AbjB0P2b (ORCPT ); Mon, 27 Feb 2023 10:28:31 -0500 Received: from mail-wr1-x42d.google.com (mail-wr1-x42d.google.com [IPv6:2a00:1450:4864:20::42d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 43B40B466 for ; Mon, 27 Feb 2023 07:28:26 -0800 (PST) Received: by mail-wr1-x42d.google.com with SMTP id h14so6653038wru.4 for ; Mon, 27 Feb 2023 07:28:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=+u27gOH9RYe6QyCkl0ejZiHnwquTtRxgSgfFbllh58Y=; b=AlEs54fVm4qoVNMOt74olQ/I+yjrdXN5qihmHwikDtKc80p9FctuFgKFiW+iwmAgxO /0Qwq9fW0t5+7D24sVNXvv2znsUfTbm+GiqNuc7v+2to0uq5qP5t6M2JRaCCkThV5S49 n/97JQRZA96/OG/RmWcK+BR7QfgZ2dImeRRIwW5b9ACjrBauulME837wpehopPHNOWaX bzJd+XJ16wX5djHGBYQzFjC0/wK/1BKCMCpU7LOayfvST5VooForSi/1Uhw7PiLeQkDa zVCZxjxnOJIba6/sWq8FeIyxwhahmI/BWEbKBj8qhJqCiNXoH6prdweYXbkimk4iD5Gx 4AUg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=+u27gOH9RYe6QyCkl0ejZiHnwquTtRxgSgfFbllh58Y=; b=okcqDRNU4uaJVI2k5ZsN+1GrwrL63hrFEDi5wWp2C9Mbpl7lbMohMr5xHpEVBdxAvX mDiDLGJfAHiB64HaHYhD8rY2TuGdKbtfoOCxJnYZsmhikVWnbHjF2yr30FLwRDNjaogI F6ZV1XeAbadMuCQEkOznNaYX0JDPE3B8rPaLGlyBl/jKK/MKxP3Dwp3cldIGAJeo5uSF Zn9pZ/eyOjy9CbN2PJ3Br+VWrryH5B2Hcn9/0jddVpqDfRnH55ohx7N0Jsn/9vceRL/+ r6BoPtB2q/Ij76PoyKAri0OO74tx6j2uS19enEYMIqR3Z4AUZ12iJxkFre2fq2QdR+e6 QCtQ== X-Gm-Message-State: AO0yUKVxFrVc2KrM4QsKmMvxIADjtHn772hV2qkQzWkycoDUL8Bb11Lf 62gVrCBlyfO1r+fK7bP974tNRLkAXkg= X-Google-Smtp-Source: AK7set+7L4jTCQrjfIskws8p3CLjFjVVxK9zB+M8YhaQG6rBwgf/OqkWXrMtj032nRe3LVWMtG76HQ== X-Received: by 2002:a5d:638f:0:b0:2c7:1608:d56d with SMTP id p15-20020a5d638f000000b002c71608d56dmr11143292wru.2.1677511704366; Mon, 27 Feb 2023 07:28:24 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id n3-20020a5d4203000000b002c57384dfe0sm7224567wrq.113.2023.02.27.07.28.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Feb 2023 07:28:24 -0800 (PST) Message-Id: <879a93ac2d7c9113489d6964e434aed73219651d.1677511700.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Mon, 27 Feb 2023 15:28:10 +0000 Subject: [PATCH v3 03/13] dir: separate public from internal portion of dir_struct Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Derrick Stolee , Elijah Newren , Jacob Keller , Jonathan Tan , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren In order to make it clearer to callers what portions of dir_struct are public API, and avoid errors from them setting fields that are meant as internal API, split the fields used for internal implementation reasons into a separate embedded struct. Signed-off-by: Elijah Newren --- dir.c | 114 +++++++++++++++++++++++++++++----------------------------- dir.h | 86 +++++++++++++++++++++++--------------------- 2 files changed, 104 insertions(+), 96 deletions(-) diff --git a/dir.c b/dir.c index 4e99f0c868f..7adf242026e 100644 --- a/dir.c +++ b/dir.c @@ -1190,7 +1190,7 @@ struct pattern_list *add_pattern_list(struct dir_struct *dir, struct pattern_list *pl; struct exclude_list_group *group; - group = &dir->exclude_list_group[group_type]; + group = &dir->internal.exclude_list_group[group_type]; ALLOC_GROW(group->pl, group->nr + 1, group->alloc); pl = &group->pl[group->nr++]; memset(pl, 0, sizeof(*pl)); @@ -1211,7 +1211,7 @@ static void add_patterns_from_file_1(struct dir_struct *dir, const char *fname, * differently when dir->untracked is non-NULL. */ if (!dir->untracked) - dir->unmanaged_exclude_files++; + dir->internal.unmanaged_exclude_files++; pl = add_pattern_list(dir, EXC_FILE, fname); if (add_patterns(fname, "", 0, pl, NULL, 0, oid_stat) < 0) die(_("cannot use %s as an exclude file"), fname); @@ -1219,7 +1219,7 @@ static void add_patterns_from_file_1(struct dir_struct *dir, const char *fname, void add_patterns_from_file(struct dir_struct *dir, const char *fname) { - dir->unmanaged_exclude_files++; /* see validate_untracked_cache() */ + dir->internal.unmanaged_exclude_files++; /* see validate_untracked_cache() */ add_patterns_from_file_1(dir, fname, NULL); } @@ -1519,7 +1519,7 @@ static struct path_pattern *last_matching_pattern_from_lists( struct exclude_list_group *group; struct path_pattern *pattern; for (i = EXC_CMDL; i <= EXC_FILE; i++) { - group = &dir->exclude_list_group[i]; + group = &dir->internal.exclude_list_group[i]; for (j = group->nr - 1; j >= 0; j--) { pattern = last_matching_pattern_from_list( pathname, pathlen, basename, dtype_p, @@ -1545,20 +1545,20 @@ static void prep_exclude(struct dir_struct *dir, struct untracked_cache_dir *untracked; int current; - group = &dir->exclude_list_group[EXC_DIRS]; + group = &dir->internal.exclude_list_group[EXC_DIRS]; /* * Pop the exclude lists from the EXCL_DIRS exclude_list_group * which originate from directories not in the prefix of the * path being checked. */ - while ((stk = dir->exclude_stack) != NULL) { + while ((stk = dir->internal.exclude_stack) != NULL) { if (stk->baselen <= baselen && - !strncmp(dir->basebuf.buf, base, stk->baselen)) + !strncmp(dir->internal.basebuf.buf, base, stk->baselen)) break; - pl = &group->pl[dir->exclude_stack->exclude_ix]; - dir->exclude_stack = stk->prev; - dir->pattern = NULL; + pl = &group->pl[dir->internal.exclude_stack->exclude_ix]; + dir->internal.exclude_stack = stk->prev; + dir->internal.pattern = NULL; free((char *)pl->src); /* see strbuf_detach() below */ clear_pattern_list(pl); free(stk); @@ -1566,7 +1566,7 @@ static void prep_exclude(struct dir_struct *dir, } /* Skip traversing into sub directories if the parent is excluded */ - if (dir->pattern) + if (dir->internal.pattern) return; /* @@ -1574,12 +1574,12 @@ static void prep_exclude(struct dir_struct *dir, * memset(dir, 0, sizeof(*dir)) before use. Changing all of * them seems lots of work for little benefit. */ - if (!dir->basebuf.buf) - strbuf_init(&dir->basebuf, PATH_MAX); + if (!dir->internal.basebuf.buf) + strbuf_init(&dir->internal.basebuf, PATH_MAX); /* Read from the parent directories and push them down. */ current = stk ? stk->baselen : -1; - strbuf_setlen(&dir->basebuf, current < 0 ? 0 : current); + strbuf_setlen(&dir->internal.basebuf, current < 0 ? 0 : current); if (dir->untracked) untracked = stk ? stk->ucd : dir->untracked->root; else @@ -1599,32 +1599,33 @@ static void prep_exclude(struct dir_struct *dir, die("oops in prep_exclude"); cp++; untracked = - lookup_untracked(dir->untracked, untracked, + lookup_untracked(dir->untracked, + untracked, base + current, cp - base - current); } - stk->prev = dir->exclude_stack; + stk->prev = dir->internal.exclude_stack; stk->baselen = cp - base; stk->exclude_ix = group->nr; stk->ucd = untracked; pl = add_pattern_list(dir, EXC_DIRS, NULL); - strbuf_add(&dir->basebuf, base + current, stk->baselen - current); - assert(stk->baselen == dir->basebuf.len); + strbuf_add(&dir->internal.basebuf, base + current, stk->baselen - current); + assert(stk->baselen == dir->internal.basebuf.len); /* Abort if the directory is excluded */ if (stk->baselen) { int dt = DT_DIR; - dir->basebuf.buf[stk->baselen - 1] = 0; - dir->pattern = last_matching_pattern_from_lists(dir, + dir->internal.basebuf.buf[stk->baselen - 1] = 0; + dir->internal.pattern = last_matching_pattern_from_lists(dir, istate, - dir->basebuf.buf, stk->baselen - 1, - dir->basebuf.buf + current, &dt); - dir->basebuf.buf[stk->baselen - 1] = '/'; - if (dir->pattern && - dir->pattern->flags & PATTERN_FLAG_NEGATIVE) - dir->pattern = NULL; - if (dir->pattern) { - dir->exclude_stack = stk; + dir->internal.basebuf.buf, stk->baselen - 1, + dir->internal.basebuf.buf + current, &dt); + dir->internal.basebuf.buf[stk->baselen - 1] = '/'; + if (dir->internal.pattern && + dir->internal.pattern->flags & PATTERN_FLAG_NEGATIVE) + dir->internal.pattern = NULL; + if (dir->internal.pattern) { + dir->internal.exclude_stack = stk; return; } } @@ -1647,15 +1648,15 @@ static void prep_exclude(struct dir_struct *dir, */ !is_null_oid(&untracked->exclude_oid))) { /* - * dir->basebuf gets reused by the traversal, but we - * need fname to remain unchanged to ensure the src - * member of each struct path_pattern correctly + * dir->internal.basebuf gets reused by the traversal, + * but we need fname to remain unchanged to ensure the + * src member of each struct path_pattern correctly * back-references its source file. Other invocations * of add_pattern_list provide stable strings, so we * strbuf_detach() and free() here in the caller. */ struct strbuf sb = STRBUF_INIT; - strbuf_addbuf(&sb, &dir->basebuf); + strbuf_addbuf(&sb, &dir->internal.basebuf); strbuf_addstr(&sb, dir->exclude_per_dir); pl->src = strbuf_detach(&sb, NULL); add_patterns(pl->src, pl->src, stk->baselen, pl, istate, @@ -1681,10 +1682,10 @@ static void prep_exclude(struct dir_struct *dir, invalidate_gitignore(dir->untracked, untracked); oidcpy(&untracked->exclude_oid, &oid_stat.oid); } - dir->exclude_stack = stk; + dir->internal.exclude_stack = stk; current = stk->baselen; } - strbuf_setlen(&dir->basebuf, baselen); + strbuf_setlen(&dir->internal.basebuf, baselen); } /* @@ -1704,8 +1705,8 @@ struct path_pattern *last_matching_pattern(struct dir_struct *dir, prep_exclude(dir, istate, pathname, basename-pathname); - if (dir->pattern) - return dir->pattern; + if (dir->internal.pattern) + return dir->internal.pattern; return last_matching_pattern_from_lists(dir, istate, pathname, pathlen, basename, dtype_p); @@ -1742,7 +1743,7 @@ static struct dir_entry *dir_add_name(struct dir_struct *dir, if (index_file_exists(istate, pathname, len, ignore_case)) return NULL; - ALLOC_GROW(dir->entries, dir->nr+1, dir->alloc); + ALLOC_GROW(dir->entries, dir->nr+1, dir->internal.alloc); return dir->entries[dir->nr++] = dir_entry_new(pathname, len); } @@ -1753,7 +1754,7 @@ struct dir_entry *dir_add_ignored(struct dir_struct *dir, if (!index_name_is_other(istate, pathname, len)) return NULL; - ALLOC_GROW(dir->ignored, dir->ignored_nr+1, dir->ignored_alloc); + ALLOC_GROW(dir->ignored, dir->ignored_nr+1, dir->internal.ignored_alloc); return dir->ignored[dir->ignored_nr++] = dir_entry_new(pathname, len); } @@ -2569,7 +2570,7 @@ static enum path_treatment read_directory_recursive(struct dir_struct *dir, if (open_cached_dir(&cdir, dir, untracked, istate, &path, check_only)) goto out; - dir->visited_directories++; + dir->internal.visited_directories++; if (untracked) untracked->check_only = !!check_only; @@ -2578,7 +2579,7 @@ static enum path_treatment read_directory_recursive(struct dir_struct *dir, /* check how the file or directory should be treated */ state = treat_path(dir, untracked, &cdir, istate, &path, baselen, pathspec); - dir->visited_paths++; + dir->internal.visited_paths++; if (state > dir_state) dir_state = state; @@ -2586,7 +2587,8 @@ static enum path_treatment read_directory_recursive(struct dir_struct *dir, /* recurse into subdir if instructed by treat_path */ if (state == path_recurse) { struct untracked_cache_dir *ud; - ud = lookup_untracked(dir->untracked, untracked, + ud = lookup_untracked(dir->untracked, + untracked, path.buf + baselen, path.len - baselen); subdir_state = @@ -2846,7 +2848,7 @@ static struct untracked_cache_dir *validate_untracked_cache(struct dir_struct *d * condition also catches running setup_standard_excludes() * before setting dir->untracked! */ - if (dir->unmanaged_exclude_files) + if (dir->internal.unmanaged_exclude_files) return NULL; /* @@ -2875,7 +2877,7 @@ static struct untracked_cache_dir *validate_untracked_cache(struct dir_struct *d * EXC_CMDL is not considered in the cache. If people set it, * skip the cache. */ - if (dir->exclude_list_group[EXC_CMDL].nr) + if (dir->internal.exclude_list_group[EXC_CMDL].nr) return NULL; if (!ident_in_untracked(dir->untracked)) { @@ -2935,15 +2937,15 @@ static struct untracked_cache_dir *validate_untracked_cache(struct dir_struct *d /* Validate $GIT_DIR/info/exclude and core.excludesfile */ root = dir->untracked->root; - if (!oideq(&dir->ss_info_exclude.oid, + if (!oideq(&dir->internal.ss_info_exclude.oid, &dir->untracked->ss_info_exclude.oid)) { invalidate_gitignore(dir->untracked, root); - dir->untracked->ss_info_exclude = dir->ss_info_exclude; + dir->untracked->ss_info_exclude = dir->internal.ss_info_exclude; } - if (!oideq(&dir->ss_excludes_file.oid, + if (!oideq(&dir->internal.ss_excludes_file.oid, &dir->untracked->ss_excludes_file.oid)) { invalidate_gitignore(dir->untracked, root); - dir->untracked->ss_excludes_file = dir->ss_excludes_file; + dir->untracked->ss_excludes_file = dir->internal.ss_excludes_file; } /* Make sure this directory is not dropped out at saving phase */ @@ -2969,9 +2971,9 @@ static void emit_traversal_statistics(struct dir_struct *dir, } trace2_data_intmax("read_directory", repo, - "directories-visited", dir->visited_directories); + "directories-visited", dir->internal.visited_directories); trace2_data_intmax("read_directory", repo, - "paths-visited", dir->visited_paths); + "paths-visited", dir->internal.visited_paths); if (!dir->untracked) return; @@ -2993,8 +2995,8 @@ int read_directory(struct dir_struct *dir, struct index_state *istate, struct untracked_cache_dir *untracked; trace2_region_enter("dir", "read_directory", istate->repo); - dir->visited_paths = 0; - dir->visited_directories = 0; + dir->internal.visited_paths = 0; + dir->internal.visited_directories = 0; if (has_symlink_leading_path(path, len)) { trace2_region_leave("dir", "read_directory", istate->repo); @@ -3342,14 +3344,14 @@ void setup_standard_excludes(struct dir_struct *dir) excludes_file = xdg_config_home("ignore"); if (excludes_file && !access_or_warn(excludes_file, R_OK, 0)) add_patterns_from_file_1(dir, excludes_file, - dir->untracked ? &dir->ss_excludes_file : NULL); + dir->untracked ? &dir->internal.ss_excludes_file : NULL); /* per repository user preference */ if (startup_info->have_repository) { const char *path = git_path_info_exclude(); if (!access_or_warn(path, R_OK, 0)) add_patterns_from_file_1(dir, path, - dir->untracked ? &dir->ss_info_exclude : NULL); + dir->untracked ? &dir->internal.ss_info_exclude : NULL); } } @@ -3405,7 +3407,7 @@ void dir_clear(struct dir_struct *dir) struct dir_struct new = DIR_INIT; for (i = EXC_CMDL; i <= EXC_FILE; i++) { - group = &dir->exclude_list_group[i]; + group = &dir->internal.exclude_list_group[i]; for (j = 0; j < group->nr; j++) { pl = &group->pl[j]; if (i == EXC_DIRS) @@ -3422,13 +3424,13 @@ void dir_clear(struct dir_struct *dir) free(dir->ignored); free(dir->entries); - stk = dir->exclude_stack; + stk = dir->internal.exclude_stack; while (stk) { struct exclude_stack *prev = stk->prev; free(stk); stk = prev; } - strbuf_release(&dir->basebuf); + strbuf_release(&dir->internal.basebuf); memcpy(dir, &new, sizeof(*dir)); } diff --git a/dir.h b/dir.h index 8acfc044181..33fd848fc8d 100644 --- a/dir.h +++ b/dir.h @@ -215,14 +215,9 @@ struct dir_struct { /* The number of members in `entries[]` array. */ int nr; - /* Internal use; keeps track of allocation of `entries[]` array.*/ - int alloc; - /* The number of members in `ignored[]` array. */ int ignored_nr; - int ignored_alloc; - /* bit-field of options */ enum { @@ -296,51 +291,62 @@ struct dir_struct { */ struct dir_entry **ignored; + /* Enable/update untracked file cache if set */ + struct untracked_cache *untracked; + /** * The name of the file to be read in each directory for excluded files * (typically `.gitignore`). */ const char *exclude_per_dir; - /* - * We maintain three groups of exclude pattern lists: - * - * EXC_CMDL lists patterns explicitly given on the command line. - * EXC_DIRS lists patterns obtained from per-directory ignore files. - * EXC_FILE lists patterns from fallback ignore files, e.g. - * - .git/info/exclude - * - core.excludesfile - * - * Each group contains multiple exclude lists, a single list - * per source. - */ + struct dir_struct_internal { + /* Keeps track of allocation of `entries[]` array.*/ + int alloc; + + /* Keeps track of allocation of `ignored[]` array. */ + int ignored_alloc; + + /* + * We maintain three groups of exclude pattern lists: + * + * EXC_CMDL lists patterns explicitly given on the command line. + * EXC_DIRS lists patterns obtained from per-directory ignore + * files. + * EXC_FILE lists patterns from fallback ignore files, e.g. + * - .git/info/exclude + * - core.excludesfile + * + * Each group contains multiple exclude lists, a single list + * per source. + */ #define EXC_CMDL 0 #define EXC_DIRS 1 #define EXC_FILE 2 - struct exclude_list_group exclude_list_group[3]; - - /* - * Temporary variables which are used during loading of the - * per-directory exclude lists. - * - * exclude_stack points to the top of the exclude_stack, and - * basebuf contains the full path to the current - * (sub)directory in the traversal. Exclude points to the - * matching exclude struct if the directory is excluded. - */ - struct exclude_stack *exclude_stack; - struct path_pattern *pattern; - struct strbuf basebuf; - - /* Enable untracked file cache if set */ - struct untracked_cache *untracked; - struct oid_stat ss_info_exclude; - struct oid_stat ss_excludes_file; - unsigned unmanaged_exclude_files; + struct exclude_list_group exclude_list_group[3]; - /* Stats about the traversal */ - unsigned visited_paths; - unsigned visited_directories; + /* + * Temporary variables which are used during loading of the + * per-directory exclude lists. + * + * exclude_stack points to the top of the exclude_stack, and + * basebuf contains the full path to the current + * (sub)directory in the traversal. Exclude points to the + * matching exclude struct if the directory is excluded. + */ + struct exclude_stack *exclude_stack; + struct path_pattern *pattern; + struct strbuf basebuf; + + /* Additional metadata related to 'untracked' */ + struct oid_stat ss_info_exclude; + struct oid_stat ss_excludes_file; + unsigned unmanaged_exclude_files; + + /* Stats about the traversal */ + unsigned visited_paths; + unsigned visited_directories; + } internal; }; #define DIR_INIT { 0 } From patchwork Mon Feb 27 15:28:11 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 13153812 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1C72AC7EE2E for ; Mon, 27 Feb 2023 15:28:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230222AbjB0P2i (ORCPT ); Mon, 27 Feb 2023 10:28:38 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43330 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230205AbjB0P2e (ORCPT ); Mon, 27 Feb 2023 10:28:34 -0500 Received: from mail-wm1-x330.google.com (mail-wm1-x330.google.com [IPv6:2a00:1450:4864:20::330]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E91B79779 for ; Mon, 27 Feb 2023 07:28:26 -0800 (PST) Received: by mail-wm1-x330.google.com with SMTP id k37so4530960wms.0 for ; Mon, 27 Feb 2023 07:28:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=6G9UY5G/xhpuixYbrSG4zCsVzN5tLvEplL1kmmNUZe8=; b=YuJ2ulZubmFJStn0o7Fi208tDv4a74JablZ1OcOq9ihsWhVjrzAiNQiFHOFc8AwKDf LqH62Q+iYKBwj71dZtDWew/wxVpIEArQ0mLP8r1bVvj6tv70HkwxvtSKBzhUZ28AAPO2 pn6xPs5uX0nS1xMbRuRJ97Pd+qKTaFSPFBR9lUQv9jmW2/ZkQ1I9coFSb1OL7163Bx1I ZPDd7zDgSW8gGnbUx3lXy+lsEqNxKk1ZNCcXZqIY1sTQY/CudJWXuYhMdrCKEoGcTb0+ laBfh1FTbid4KUB1Re8S1zKBESDVX6XJGdRC8y6xTxA17H3trcJX64q+JDk7dZuozp/1 A6eQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=6G9UY5G/xhpuixYbrSG4zCsVzN5tLvEplL1kmmNUZe8=; b=gowiKEzkOw8fH/dI9hLdx6LkCah/oqQX5epSESMhaMlT/5+HPeL4N0BGbj3nySiS+k zoBDGmt5TGOVLlPA8XF9dlm6czu/FS31+PXzBvviwXP+sNmHaXSmfhy2L5+PFMfmoBW+ fx85PGQu57w50HVEbYM2GrtopfUgA0v2U95XlaxZ+eSy1Z2W1Wz4u5+aQdlnbpb67j7/ d6p/r/734mHEu02dwsfslXfyGwXHaYbHVb+1lxw7bOgaD5R7p3fapD6YAQ+0y8ugrW1i OJgsBagxAzmF6RNNOcNNAU/b2ZMCVNiIk35BaFhmlCuD7HXqoA8TAUrvRUbRZHQEWZ6p g25A== X-Gm-Message-State: AO0yUKU1XLldpZE2tWr7eBRP9ux0ruBPNWVsfg7KpdGFliyGz9GbCT4C rNHw82QeMegQQcbpizUJlWzSObu02iQ= X-Google-Smtp-Source: AK7set97CGcmcUbu9kEwY9rTKPNzofoZLDhhr92sGr42CEixU03PrsnMaRGRzG3bIF6HpopfeVQ0KA== X-Received: by 2002:a05:600c:600d:b0:3ea:f883:53ea with SMTP id az13-20020a05600c600d00b003eaf88353eamr9242668wmb.7.1677511705130; Mon, 27 Feb 2023 07:28:25 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id x6-20020adff646000000b002c56046a3b5sm7219049wrp.53.2023.02.27.07.28.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Feb 2023 07:28:24 -0800 (PST) Message-Id: <4ce9fae5e7f47e71d32d71cdbb9bc07b990e86c6.1677511700.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Mon, 27 Feb 2023 15:28:11 +0000 Subject: [PATCH v3 04/13] dir: add a usage note to exclude_per_dir Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Derrick Stolee , Elijah Newren , Jacob Keller , Jonathan Tan , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren As evidenced by the fix a couple commits ago, places in the code using exclude_per_dir are likely buggy and should be adapted to call setup_standard_excludes() instead. Unfortunately, the usage of exclude_per_dir has been hardcoded into the arguments ls-files accepts, so we cannot actually remove it. Add a note that it is deprecated and no other callers should use it directly. Signed-off-by: Elijah Newren --- dir.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/dir.h b/dir.h index 33fd848fc8d..2196e12630c 100644 --- a/dir.h +++ b/dir.h @@ -295,8 +295,12 @@ struct dir_struct { struct untracked_cache *untracked; /** - * The name of the file to be read in each directory for excluded files - * (typically `.gitignore`). + * Deprecated: ls-files is the only allowed caller; all other callers + * should leave this as NULL; it pre-dated the + * setup_standard_excludes() mechanism that replaces this. + * + * This field tracks the name of the file to be read in each directory + * for excluded files (typically `.gitignore`). */ const char *exclude_per_dir; From patchwork Mon Feb 27 15:28:12 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 13153810 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1938FC7EE23 for ; Mon, 27 Feb 2023 15:28:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229739AbjB0P2h (ORCPT ); Mon, 27 Feb 2023 10:28:37 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43328 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230170AbjB0P2e (ORCPT ); Mon, 27 Feb 2023 10:28:34 -0500 Received: from mail-wr1-x435.google.com (mail-wr1-x435.google.com [IPv6:2a00:1450:4864:20::435]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A11579741 for ; Mon, 27 Feb 2023 07:28:27 -0800 (PST) Received: by mail-wr1-x435.google.com with SMTP id l1so3596672wry.12 for ; Mon, 27 Feb 2023 07:28:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=NJhOI5pH2/X7Uqaz8J/86RgsSNzaLLs6qLmjlPTEmeM=; b=UHZ2WyhoU2m5Kd8QQxE6UFNIETlU5q4FTS0ubuZmZ/2F3daMy7NzHQMzD5Yr7mMOpC bgc/HezmvOfJS/gR0c6udC+Xn4ZRrfidYyJ+1XowQpqOZYLtbJegjBbnNdNO2HiubxQ5 Lawxm0sAgFGto2ySDh2liFU4tG29xen9oiQwTxIbT5rebE9ICJcsMyvPWGDV4qRZFvoe XdQ+0ABIXdV+0jP5XyAcgIpdTzCLadwO0sdmVATSgMHw1275gBTMvuAMKUeCNT0MFGli keslyK1Sgb4CKMRl99JUgp/E1QoDTxH/VknPDJMOXMN/a4Y25kHHsyVQKy8aGovPay6S 0fmw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=NJhOI5pH2/X7Uqaz8J/86RgsSNzaLLs6qLmjlPTEmeM=; b=WY6w5nXvY5m75B03UiL96vwCDNxsV2QWL6PqK8ub6moVsMtfkTlCzIclrHK1lzAdPI v8iJV9Dhc4UUaeVpi2TFJfry2BFklS2s41FLiBzkLFUGc+LJ+dMW5ohdv4hWEe3IfH/t vYtSEdRcmIhiwhXmoxFVRug3UHosnI9wc6o/cQ2PrSXsP9AhOqryQcohcR8R2BSZEY// YDXhQaEhm5Tp7wskl4RtFhXzH/oa1sE5jM4wsn9nWxeDKWGS6HHiDzqfdWbZ54cXd2PM DYKsMhblg2b0EQ/s8JK5PQeZ62Mhln3WlczMw7K2B8QSqTPOqQPc1156QhJ42hqgb0ja RUtg== X-Gm-Message-State: AO0yUKVbtumxqBGtOv+Rxz+6hmMhT6LWC4lgYZhFzVT2bvwZoFumCMf0 7H/Yw3HecGgf9GOkz2/+a6l5BVJ3WhM= X-Google-Smtp-Source: AK7set9s8b9pEsyn51Zdk4wjcLonj6HVo+dhmxVAcNXrEoMIrSrYdkHS7xWh+oRtg//wh85HQCdPbA== X-Received: by 2002:a5d:534f:0:b0:2c7:145c:68f2 with SMTP id t15-20020a5d534f000000b002c7145c68f2mr14343695wrv.58.1677511705824; Mon, 27 Feb 2023 07:28:25 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id s2-20020adff802000000b002c706c754fesm7440298wrp.32.2023.02.27.07.28.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Feb 2023 07:28:25 -0800 (PST) Message-Id: <12344400fa04d279de269785f62ba988e589a9f9.1677511700.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Mon, 27 Feb 2023 15:28:12 +0000 Subject: [PATCH v3 05/13] dir: mark output only fields of dir_struct as such Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Derrick Stolee , Elijah Newren , Jacob Keller , Jonathan Tan , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren While at it, also group these fields together for convenience. Signed-off-by: Elijah Newren --- dir.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/dir.h b/dir.h index 2196e12630c..e8106e1ecac 100644 --- a/dir.h +++ b/dir.h @@ -212,12 +212,6 @@ struct untracked_cache { */ struct dir_struct { - /* The number of members in `entries[]` array. */ - int nr; - - /* The number of members in `ignored[]` array. */ - int ignored_nr; - /* bit-field of options */ enum { @@ -282,14 +276,20 @@ struct dir_struct { DIR_SKIP_NESTED_GIT = 1<<9 } flags; + /* The number of members in `entries[]` array. */ + int nr; /* output only */ + + /* The number of members in `ignored[]` array. */ + int ignored_nr; /* output only */ + /* An array of `struct dir_entry`, each element of which describes a path. */ - struct dir_entry **entries; + struct dir_entry **entries; /* output only */ /** * used for ignored paths with the `DIR_SHOW_IGNORED_TOO` and * `DIR_COLLECT_IGNORED` flags. */ - struct dir_entry **ignored; + struct dir_entry **ignored; /* output only */ /* Enable/update untracked file cache if set */ struct untracked_cache *untracked; From patchwork Mon Feb 27 15:28:13 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 13153814 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E216EC7EE23 for ; Mon, 27 Feb 2023 15:28:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229986AbjB0P2m (ORCPT ); Mon, 27 Feb 2023 10:28:42 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43368 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230208AbjB0P2e (ORCPT ); Mon, 27 Feb 2023 10:28:34 -0500 Received: from mail-wr1-x432.google.com (mail-wr1-x432.google.com [IPv6:2a00:1450:4864:20::432]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 67E4DBDF5 for ; Mon, 27 Feb 2023 07:28:28 -0800 (PST) Received: by mail-wr1-x432.google.com with SMTP id h14so6653159wru.4 for ; Mon, 27 Feb 2023 07:28:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=ecsu1e8JznAMHuK6DT0D0241DAYP1YyqQzs56RCk4Sg=; b=nbmPjER+hKn7ILAKa8uXcJabfyc1eze4JdxtRPiOMa3bC0+8Gps2K2DPDpt29Iytgy DF/TAhpCYT15fkDn1SpMjgtLvVDKJ9fE442SpOLVZ/P7ftDgXax8rseOJTprugC/16lw rxBH89zCq9osUhabhVW1WKCeqHN/V/NLMmJr/jqTR4tHMOnpznnhYQdIKw442mtDNSYF JCXXPDuh5eRDOkz1t7z56T0pKHN2lHSlp2WwkFxXVyOG2QcRjmX+I9oacA5nTDRDAob4 2vVvB5vwC5SQTvxye7kGCOwWb0AG+1bJflzHYoMWSlvhd6el+LQEq2vx16kzj6s0wrhU jBhQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ecsu1e8JznAMHuK6DT0D0241DAYP1YyqQzs56RCk4Sg=; b=Mg7ojhdsxGdec936zyMYU/mQCHiOOxPZFu76e8BSTBhM3A9Gk4JiZzqY3CmbBvtcPk YsPsN5lYCxXDl6GwRHcjb7bywkjp657zTF72dEOzEiPN+UTN1ZXpSD7kAPrNoK/UiJsu 2fPBLA9X4QuQhCW3iKqSBkJz9S2ajgZBg1ipJqNVpdzggmMfCBPHyhbnfVInNrGtYx68 kYquUCtI0BwsXkbwuaWppjf9o3EA4Pab5vlitjOE7BMVZdLABcZUBroFVlExlUrl0L4Y sC5e0JuL8VAhKQtT+/dzZeTc1UL+WQDFyn5nH8T13YwQRSzVlCXE+pcnAUBooJveMiV0 oBjA== X-Gm-Message-State: AO0yUKXkfEBtUZ6wu43ac0C8CfZQ5UqhVRw5vs0BGsP5oxNx9Rtf9LcJ NXBtMAVVmvuT+XsLCUkbqGX7EjI6frQ= X-Google-Smtp-Source: AK7set+UgZmIBfM7cPFRdfBkhr8t0W+zYm9JAOBXY/bxG/NC8p3ABRcmh4lVulCo0dsBiSV9Dh62ZA== X-Received: by 2002:a5d:60ca:0:b0:2c7:e909:5fcf with SMTP id x10-20020a5d60ca000000b002c7e9095fcfmr8378164wrt.3.1677511706497; Mon, 27 Feb 2023 07:28:26 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id a4-20020adff7c4000000b002c4084d3472sm7291571wrq.58.2023.02.27.07.28.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Feb 2023 07:28:26 -0800 (PST) Message-Id: <4e86e39506c65e5a84fcd655a632ddae21be51d0.1677511700.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Mon, 27 Feb 2023 15:28:13 +0000 Subject: [PATCH v3 06/13] unpack-trees: clean up some flow control Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Derrick Stolee , Elijah Newren , Jacob Keller , Jonathan Tan , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren The update_sparsity() function was introduced in commit 7af7a25853 ("unpack-trees: add a new update_sparsity() function", 2020-03-27). Prior to that, unpack_trees() was used, but that had a few bugs because the needs of the caller were different, and different enough that unpack_trees() could not easily be modified to handle both usecases. The implementation detail that update_sparsity() was written by copying unpack_trees() and then streamlining it, and then modifying it in the needed ways still shows through in that there are leftover vestiges in both functions that are no longer needed. Clean them up. In particular: * update_sparsity() allows a pattern list to be passed in, but unpack_trees() never should use a different pattern list. Add a check and a BUG() if this gets violated. * update_sparsity() has a check early on that will BUG() if o->skip_sparse_checkout is set; as such, there's no need to check for that condition again later in the code. We can simply remove the check and its corresponding goto label. Signed-off-by: Elijah Newren --- unpack-trees.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/unpack-trees.c b/unpack-trees.c index 4518d33ed99..bad3120a76e 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -1873,6 +1873,8 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options die("unpack_trees takes at most %d trees", MAX_UNPACK_TREES); if (o->dir) BUG("o->dir is for internal use only"); + if (o->pl) + BUG("o->pl is for internal use only"); trace_performance_enter(); trace2_region_enter("unpack_trees", "unpack_trees", the_repository); @@ -1899,7 +1901,7 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options if (!core_apply_sparse_checkout || !o->update) o->skip_sparse_checkout = 1; - if (!o->skip_sparse_checkout && !o->pl) { + if (!o->skip_sparse_checkout) { memset(&pl, 0, sizeof(pl)); free_pattern_list = 1; populate_from_existing_patterns(o, &pl); @@ -2113,8 +2115,6 @@ enum update_sparsity_result update_sparsity(struct unpack_trees_options *o) memset(&pl, 0, sizeof(pl)); free_pattern_list = 1; populate_from_existing_patterns(o, &pl); - if (o->skip_sparse_checkout) - goto skip_sparse_checkout; } /* Expand sparse directories as needed */ @@ -2142,7 +2142,6 @@ enum update_sparsity_result update_sparsity(struct unpack_trees_options *o) ret = UPDATE_SPARSITY_WARNINGS; } -skip_sparse_checkout: if (check_updates(o, o->src_index)) ret = UPDATE_SPARSITY_WORKTREE_UPDATE_FAILURES; From patchwork Mon Feb 27 15:28:14 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 13153813 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1DC84C64ED8 for ; Mon, 27 Feb 2023 15:28:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230230AbjB0P2k (ORCPT ); Mon, 27 Feb 2023 10:28:40 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43308 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229486AbjB0P2f (ORCPT ); Mon, 27 Feb 2023 10:28:35 -0500 Received: from mail-wm1-x32a.google.com (mail-wm1-x32a.google.com [IPv6:2a00:1450:4864:20::32a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0C49330E2 for ; Mon, 27 Feb 2023 07:28:29 -0800 (PST) Received: by mail-wm1-x32a.google.com with SMTP id m25-20020a7bcb99000000b003e7842b75f2so4070231wmi.3 for ; Mon, 27 Feb 2023 07:28:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=68C0omPWjHuvknyuECeLxPbnkoBhw243omtWOKp8Tz4=; b=k/ErE1Yv2o/zZE6zmnEMbN9M3NQRUXZTOX+8700bqZKkNG1I8NkpNQeujaG6ZJT7Nb ln/eGZrdYOtJjlTLRjiqpjzzRXp3hRVxyNNVvemfNhfH8YxT+VYCji+JFzbU+PglnCEF gk/sGez+nfD5/s1FGLa0Cqpdhc1KgDwIiJB9Y78j5Ih21QZObyo2EULr2MZD/p1+s5RJ eciVnjYC7OHhX41TAnoouMTVxzLut5H9Bv52ysU/87dZHtP4KggseAMEdH9zPP879ySn Xe/cgnFMw4nzPlLHIIMn22jFb1pAKQbW8uN6owQFZpDHpJsb9YwQc8Wt5SImZUFPzlOQ 1wkg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=68C0omPWjHuvknyuECeLxPbnkoBhw243omtWOKp8Tz4=; b=6ULf7OdeGwyzO1YanZVgEpGXT7r5z/+sfj6HaR6gqCgP/FuXgei+9hmVKKXfKeW3xh 4nYfN9W32pccAVtbs5aeS/gp4Oh8ksX95MmMOGO6l0TfKFofegd7Wurss9iGio0xSmTk K8fuEIf6PHQU+pjGVD8owQ7bhcaLh6TacvmIbFNYLYz9KQZflAF4EO3EKEz/BjKnO95E xplBFhJBI4qYRQ8zjexhGVlXViJhpoFfYIHHgBqoE6Iw4xghKCXkTS1hL2VGJewlNH+0 YTaRo/1Gw6e9TpWwEybVct33zkLbRfRKDInXXm7hPT40ACXByZbJDFhu65NS9TK2xrcl AF3g== X-Gm-Message-State: AO0yUKXLknj0brabfAqtMGVVNnxEO17pWDJS18SKMOU3qkw0guC9QIjE 7MCnKVZ2DuoaPfuRYWbV6vBsM7Wz62c= X-Google-Smtp-Source: AK7set9steWchjY21CaMGW6JVI2ZSKaEaRMvhKnamw5TAFTikzKLEZ82pKSEhKJvyb1nN5/Vle53Rw== X-Received: by 2002:a05:600c:1f18:b0:3eb:1d0c:ad71 with SMTP id bd24-20020a05600c1f1800b003eb1d0cad71mr7766477wmb.23.1677511707334; Mon, 27 Feb 2023 07:28:27 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id az34-20020a05600c602200b003e6efc0f91csm9392604wmb.42.2023.02.27.07.28.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Feb 2023 07:28:27 -0800 (PST) Message-Id: In-Reply-To: References: Date: Mon, 27 Feb 2023 15:28:14 +0000 Subject: [PATCH v3 07/13] sparse-checkout: avoid using internal API of unpack-trees Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Derrick Stolee , Elijah Newren , Jacob Keller , Jonathan Tan , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren struct unpack_trees_options has the following field and comment: struct pattern_list *pl; /* for internal use */ Despite the internal-use comment, commit e091228e17 ("sparse-checkout: update working directory in-process", 2019-11-21) starting setting this field from an external caller. At the time, the only way around that would have been to modify unpack_trees() to take an extra pattern_list argument, and there's a lot of callers of that function. However, when we split update_sparsity() off as a separate function, with sparse-checkout being the sole caller, the need to update other callers went away. Fix this API problem by adding a pattern_list argument to update_sparsity() and stop setting the internal o.pl field directly. Signed-off-by: Elijah Newren --- builtin/sparse-checkout.c | 3 +-- unpack-trees.c | 18 +++++++++++------- unpack-trees.h | 3 ++- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/builtin/sparse-checkout.c b/builtin/sparse-checkout.c index c3738154918..4b7390ce367 100644 --- a/builtin/sparse-checkout.c +++ b/builtin/sparse-checkout.c @@ -219,14 +219,13 @@ static int update_working_directory(struct pattern_list *pl) o.dst_index = r->index; index_state_init(&o.result, r); o.skip_sparse_checkout = 0; - o.pl = pl; setup_work_tree(); repo_hold_locked_index(r, &lock_file, LOCK_DIE_ON_ERROR); setup_unpack_trees_porcelain(&o, "sparse-checkout"); - result = update_sparsity(&o); + result = update_sparsity(&o, pl); clear_unpack_trees_porcelain(&o); if (result == UPDATE_SPARSITY_WARNINGS) diff --git a/unpack-trees.c b/unpack-trees.c index bad3120a76e..6e4ca6fe800 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -2091,10 +2091,10 @@ return_failed: * * CE_NEW_SKIP_WORKTREE is used internally. */ -enum update_sparsity_result update_sparsity(struct unpack_trees_options *o) +enum update_sparsity_result update_sparsity(struct unpack_trees_options *o, + struct pattern_list *pl) { enum update_sparsity_result ret = UPDATE_SPARSITY_SUCCESS; - struct pattern_list pl; int i; unsigned old_show_all_errors; int free_pattern_list = 0; @@ -2111,11 +2111,12 @@ enum update_sparsity_result update_sparsity(struct unpack_trees_options *o) trace_performance_enter(); /* If we weren't given patterns, use the recorded ones */ - if (!o->pl) { - memset(&pl, 0, sizeof(pl)); + if (!pl) { free_pattern_list = 1; - populate_from_existing_patterns(o, &pl); + pl = xcalloc(1, sizeof(*pl)); + populate_from_existing_patterns(o, pl); } + o->pl = pl; /* Expand sparse directories as needed */ expand_index(o->src_index, o->pl); @@ -2147,8 +2148,11 @@ enum update_sparsity_result update_sparsity(struct unpack_trees_options *o) display_warning_msgs(o); o->show_all_errors = old_show_all_errors; - if (free_pattern_list) - clear_pattern_list(&pl); + if (free_pattern_list) { + clear_pattern_list(pl); + free(pl); + o->pl = NULL; + } trace_performance_leave("update_sparsity"); return ret; } diff --git a/unpack-trees.h b/unpack-trees.h index 3a7b3e5f007..f3a6e4f90ef 100644 --- a/unpack-trees.h +++ b/unpack-trees.h @@ -112,7 +112,8 @@ enum update_sparsity_result { UPDATE_SPARSITY_WORKTREE_UPDATE_FAILURES = -2 }; -enum update_sparsity_result update_sparsity(struct unpack_trees_options *options); +enum update_sparsity_result update_sparsity(struct unpack_trees_options *options, + struct pattern_list *pl); int verify_uptodate(const struct cache_entry *ce, struct unpack_trees_options *o); From patchwork Mon Feb 27 15:28:15 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 13153815 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3B99FC64ED6 for ; Mon, 27 Feb 2023 15:28:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229563AbjB0P2o (ORCPT ); Mon, 27 Feb 2023 10:28:44 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43306 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230191AbjB0P2f (ORCPT ); Mon, 27 Feb 2023 10:28:35 -0500 Received: from mail-wm1-x32b.google.com (mail-wm1-x32b.google.com [IPv6:2a00:1450:4864:20::32b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BAA45903F for ; Mon, 27 Feb 2023 07:28:29 -0800 (PST) Received: by mail-wm1-x32b.google.com with SMTP id d41-20020a05600c4c2900b003e9e066550fso4069333wmp.4 for ; Mon, 27 Feb 2023 07:28:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=j8Cfw/c/+MlKLD/ZLO8612wMe8zuxoFzxBZtOVpPexg=; b=OlQeRwhQHvBmM1htuMjW+bqYGeWIovx3S9MhunrWj0ExIgyMQT9S0LpCp7iisT+RhP H3KzUuwyb8os1OlL7YpgsIQjLQ8An90C5+RzdFOAg7Q1kAUSW0SY6NpRw/vgSD5Y66Oi Htle5PsU60AcW2LpPF8/59njoNKCEqP1P4nfCgWqI9j8gi4UXzT/Mxf7N47zWqjDZx36 V7ybPLfhLL21VwYHOSYLY5JEMYJFXMC799RXKdYEhXh62zMahMGejp+zSZtUyiKzsjee 1+N8amYY8kTURVHfoOthqe5+B4l7MTQDhr2KbZ38UqCncLec6zNHNsMS6usmaNOEEdcr 38kA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=j8Cfw/c/+MlKLD/ZLO8612wMe8zuxoFzxBZtOVpPexg=; b=3ImQw2EFeTYjshGz7jbc2GQklk/DuP7MnwfcoN61nCAlbT27jil9wHsZZj/n6F5pGE YhavZwqtzfvI6L0rPGDFuW5ekI+zuibPAxs2MBSEPYuQFdRZ6/qzGT+ZxrrEGG1Ycig/ fK7p4XQrCxXvxB/+ZHmQHQ57aaOyERCw6ZE2VLdjvD53Ic3CK3wDAYKXu3BMRJRHa/sL 0Aa0BW2P9LClgRbJbRdhbHh0p9pHty7ZyOsi8Ci6q62s8J0TOoe06qVROqEzXI+IAg9F PLo59D1ktzhIAbafoPBL7JaaZOXq46bv0bqTLjJLA9lt5OQmCsxAORGBkK2g/g5O4Mi9 2ysg== X-Gm-Message-State: AO0yUKWqFyavW7eYAoZc1FdCxzlFQAtcsx+eQibFQEaHa0eGTkkaHPIs xxdHbLnGjEa1NVuKSRVBQAwx8CHhwFk= X-Google-Smtp-Source: AK7set8lirAY49GjhlDYe4VGEV4cEAHYGSKqB0+mwgg+Nl84OHemPqlPum39+KKvrmDLDgHkE39IiQ== X-Received: by 2002:a05:600c:4fcf:b0:3eb:3945:d3f1 with SMTP id o15-20020a05600c4fcf00b003eb3945d3f1mr4602527wmq.5.1677511708075; Mon, 27 Feb 2023 07:28:28 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id 13-20020a05600c020d00b003dc1d668866sm13027434wmi.10.2023.02.27.07.28.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Feb 2023 07:28:27 -0800 (PST) Message-Id: <09140cb2ac53773eae19f06e51d6276e03689fc1.1677511700.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Mon, 27 Feb 2023 15:28:15 +0000 Subject: [PATCH v3 08/13] sparse-checkout: avoid using internal API of unpack-trees, take 2 Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Derrick Stolee , Elijah Newren , Jacob Keller , Jonathan Tan , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren Commit 2f6b1eb794 ("cache API: add a "INDEX_STATE_INIT" macro/function, add release_index()", 2023-01-12) mistakenly added some initialization of a member of unpack_trees_options that was intended to be internal-only. This initialization should be done within update_sparsity() instead. Note that while o->result is mostly meant for unpack_trees() and update_sparsity() mostly operates without o->result, check_ok_to_remove() does consult it so we need to ensure it is properly initialized. Signed-off-by: Elijah Newren --- builtin/sparse-checkout.c | 1 - unpack-trees.c | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/builtin/sparse-checkout.c b/builtin/sparse-checkout.c index 4b7390ce367..8d5ae6f2a60 100644 --- a/builtin/sparse-checkout.c +++ b/builtin/sparse-checkout.c @@ -217,7 +217,6 @@ static int update_working_directory(struct pattern_list *pl) o.head_idx = -1; o.src_index = r->index; o.dst_index = r->index; - index_state_init(&o.result, r); o.skip_sparse_checkout = 0; setup_work_tree(); diff --git a/unpack-trees.c b/unpack-trees.c index 6e4ca6fe800..c8dacd76c5f 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -2101,6 +2101,7 @@ enum update_sparsity_result update_sparsity(struct unpack_trees_options *o, old_show_all_errors = o->show_all_errors; o->show_all_errors = 1; + index_state_init(&o->result, o->src_index->repo); /* Sanity checks */ if (!o->update || o->index_only || o->skip_sparse_checkout) From patchwork Mon Feb 27 15:28:16 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 13153817 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id CD2EFC64ED6 for ; Mon, 27 Feb 2023 15:29:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230243AbjB0P3E (ORCPT ); Mon, 27 Feb 2023 10:29:04 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43674 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230226AbjB0P2j (ORCPT ); Mon, 27 Feb 2023 10:28:39 -0500 Received: from mail-wm1-x336.google.com (mail-wm1-x336.google.com [IPv6:2a00:1450:4864:20::336]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B455AA27B for ; Mon, 27 Feb 2023 07:28:30 -0800 (PST) Received: by mail-wm1-x336.google.com with SMTP id o11-20020a05600c4fcb00b003eb33ea29a8so3571065wmq.1 for ; Mon, 27 Feb 2023 07:28:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=uh/1PkSv5KAh5i7b2pA+MpoAmuWSfVgixYFdtLJ0dUU=; b=U9vl49xFUXkJ4Wpb6x3Wg5bOZr6btuWQ4y0An+Y6JsKVxWD7D9jVv1q+zlmTC69UyX xnp3GvZilzvAXz6gQ5mEC6PzxVHNvDuGV2NFc2lchHZIoLoM98q3VHyAP2dK/m91Fels WfCChNrK+mYlR1FVbFCMfr3Yf/FRwjcftPEnSUPV1WtvM5JXhBFIm1GOoRjQaOJHMQAG VrEfRg2NsotWVdlzRDmNK7s5nu5rL5+0LGUy7bx81qVTq3qJhKOmrnY2K3VGtq+cY6Pq Kx6OEH28pBXc0t0aMjE5d/x0fDqwe/Hc/jvsUdKHGytE2wGM1FP4p/wDAm/PUAEpva/r SHaw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=uh/1PkSv5KAh5i7b2pA+MpoAmuWSfVgixYFdtLJ0dUU=; b=4WWpgUSXC1e/MJCxdRiIPZbbb2qSENZTzzI6rjnZAjBVpawz59qKIYFFpS4rxmr/pg BEc77Qbu5ar/tSs6DZCQ6vaLLrr1OjsaIk6XyKSlNfTfxB4Mmb4LpLadiQHANqL/uTy7 4reGrUpELc5D3zZN0rlGCxAJWAcMnXHmY5ODbqF4BUOuXmRIaTuJ033wESXdW0YNb+wT 93VcWce/CPSGMa2uRLbqfhRvFlzH6rd31nRhJffd1hLl4nOZ85cJyJsmauYrOmgF2Myr RfOiBv/5mLeAHMLZMjoGemn76En1ZMk3Y26SY4q1SSvgK4N8liaOHicjha0zAEqcvUoD sH1w== X-Gm-Message-State: AO0yUKUAyJKyV2w3iCLchc9O2732AmWoBv0JbD/Z8ShilfuszZ9ZmHN+ r9p4DKhtzIDYh52e51H2DOPmy9riQ6w= X-Google-Smtp-Source: AK7set/CwFL7DAJWPCtW7S7r52rSfKhTRrDpaK9+RnQLEYM0/wdWdSPr/bCGAW70issaINYD16OffQ== X-Received: by 2002:a05:600c:3416:b0:3eb:3cc9:9f85 with SMTP id y22-20020a05600c341600b003eb3cc99f85mr4466438wmp.26.1677511708837; Mon, 27 Feb 2023 07:28:28 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id l1-20020a1ced01000000b003ea57808179sm12744613wmh.38.2023.02.27.07.28.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Feb 2023 07:28:28 -0800 (PST) Message-Id: <27f2d4771166348f5dd73bdccb4eeba5b16a7416.1677511700.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Mon, 27 Feb 2023 15:28:16 +0000 Subject: [PATCH v3 09/13] unpack_trees: start splitting internal fields from public API Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Derrick Stolee , Elijah Newren , Jacob Keller , Jonathan Tan , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren This just splits the two fields already marked as internal-only into a separate internal struct. Future commits will add more fields that were meant to be internal-only but were not explicitly marked as such to the same struct. Signed-off-by: Elijah Newren --- unpack-trees.c | 40 ++++++++++++++++++++-------------------- unpack-trees.h | 7 +++++-- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/unpack-trees.c b/unpack-trees.c index c8dacd76c5f..ecf89d5bfeb 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -1809,7 +1809,7 @@ static void populate_from_existing_patterns(struct unpack_trees_options *o, if (get_sparse_checkout_patterns(pl) < 0) o->skip_sparse_checkout = 1; else - o->pl = pl; + o->internal.pl = pl; } static void update_sparsity_for_prefix(const char *prefix, @@ -1871,10 +1871,10 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options if (len > MAX_UNPACK_TREES) die("unpack_trees takes at most %d trees", MAX_UNPACK_TREES); - if (o->dir) - BUG("o->dir is for internal use only"); - if (o->pl) - BUG("o->pl is for internal use only"); + if (o->internal.dir) + BUG("o->internal.dir is for internal use only"); + if (o->internal.pl) + BUG("o->internal.pl is for internal use only"); trace_performance_enter(); trace2_region_enter("unpack_trees", "unpack_trees", the_repository); @@ -1891,9 +1891,9 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options BUG("UNPACK_RESET_OVERWRITE_UNTRACKED incompatible with preserved ignored files"); if (!o->preserve_ignored) { - o->dir = &dir; - o->dir->flags |= DIR_SHOW_IGNORED; - setup_standard_excludes(o->dir); + o->internal.dir = &dir; + o->internal.dir->flags |= DIR_SHOW_IGNORED; + setup_standard_excludes(o->internal.dir); } if (o->prefix) @@ -1943,7 +1943,7 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options * Sparse checkout loop #1: set NEW_SKIP_WORKTREE on existing entries */ if (!o->skip_sparse_checkout) - mark_new_skip_worktree(o->pl, o->src_index, 0, + mark_new_skip_worktree(o->internal.pl, o->src_index, 0, CE_NEW_SKIP_WORKTREE, o->verbose_update); if (!dfc) @@ -2009,7 +2009,7 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options * If they will have NEW_SKIP_WORKTREE, also set CE_SKIP_WORKTREE * so apply_sparse_checkout() won't attempt to remove it from worktree */ - mark_new_skip_worktree(o->pl, &o->result, + mark_new_skip_worktree(o->internal.pl, &o->result, CE_ADDED, CE_SKIP_WORKTREE | CE_NEW_SKIP_WORKTREE, o->verbose_update); @@ -2067,9 +2067,9 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options done: if (free_pattern_list) clear_pattern_list(&pl); - if (o->dir) { - dir_clear(o->dir); - o->dir = NULL; + if (o->internal.dir) { + dir_clear(o->internal.dir); + o->internal.dir = NULL; } trace2_region_leave("unpack_trees", "unpack_trees", the_repository); trace_performance_leave("unpack_trees"); @@ -2117,14 +2117,14 @@ enum update_sparsity_result update_sparsity(struct unpack_trees_options *o, pl = xcalloc(1, sizeof(*pl)); populate_from_existing_patterns(o, pl); } - o->pl = pl; + o->internal.pl = pl; /* Expand sparse directories as needed */ - expand_index(o->src_index, o->pl); + expand_index(o->src_index, o->internal.pl); /* Set NEW_SKIP_WORKTREE on existing entries. */ mark_all_ce_unused(o->src_index); - mark_new_skip_worktree(o->pl, o->src_index, 0, + mark_new_skip_worktree(o->internal.pl, o->src_index, 0, CE_NEW_SKIP_WORKTREE, o->verbose_update); /* Then loop over entries and update/remove as needed */ @@ -2152,7 +2152,7 @@ enum update_sparsity_result update_sparsity(struct unpack_trees_options *o, if (free_pattern_list) { clear_pattern_list(pl); free(pl); - o->pl = NULL; + o->internal.pl = NULL; } trace_performance_leave("update_sparsity"); return ret; @@ -2340,7 +2340,7 @@ static int verify_clean_subdirectory(const struct cache_entry *ce, pathbuf = xstrfmt("%.*s/", namelen, ce->name); memset(&d, 0, sizeof(d)); - if (o->dir) + if (o->internal.dir) setup_standard_excludes(&d); i = read_directory(&d, o->src_index, pathbuf, namelen+1, NULL); dir_clear(&d); @@ -2395,8 +2395,8 @@ static int check_ok_to_remove(const char *name, int len, int dtype, if (ignore_case && icase_exists(o, name, len, st)) return 0; - if (o->dir && - is_excluded(o->dir, o->src_index, name, &dtype)) + if (o->internal.dir && + is_excluded(o->internal.dir, o->src_index, name, &dtype)) /* * ce->name is explicitly excluded, so it is Ok to * overwrite it. diff --git a/unpack-trees.h b/unpack-trees.h index f3a6e4f90ef..5c1a9314a06 100644 --- a/unpack-trees.h +++ b/unpack-trees.h @@ -97,9 +97,12 @@ struct unpack_trees_options { struct index_state *src_index; struct index_state result; - struct pattern_list *pl; /* for internal use */ - struct dir_struct *dir; /* for internal use only */ struct checkout_metadata meta; + + struct unpack_trees_options_internal { + struct pattern_list *pl; + struct dir_struct *dir; + } internal; }; int unpack_trees(unsigned n, struct tree_desc *t, From patchwork Mon Feb 27 15:28:17 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 13153816 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 86595C7EE23 for ; Mon, 27 Feb 2023 15:28:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229874AbjB0P2p (ORCPT ); Mon, 27 Feb 2023 10:28:45 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43586 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230203AbjB0P2i (ORCPT ); Mon, 27 Feb 2023 10:28:38 -0500 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 5306AA24A for ; Mon, 27 Feb 2023 07:28:30 -0800 (PST) Received: by mail-wr1-x431.google.com with SMTP id v16so3844402wrn.0 for ; Mon, 27 Feb 2023 07:28:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=TxCq8Uc1FL6lOEMiMQCHsF0rKjaFMHqkajOPIRH8TSk=; b=JRuKkbK560+kfGRjuoFsxiOx98NL0OUatriLIW7OkOzMfOBtzrjImdnmOU/tQWA2ej Wc5TNpoh6XdFyEMJQOqhcP1hhfq0QetBiLvpdNFe0QmxSFEjIk+GgbgQ1gWUYSO4/D0L HH1s1QI6bzPKU3DiBoECNjf7L/GuKqq7U79PS5jgAmjbJ00fdb3Gd9IbBRnkdljHREm8 vF3MrJz9AHXtQgKHQcBzOcWNEO4Wq8VA5I2Ek1KOMT1v7F4YIZB2B97I9YPH/4V8tj5o B3iB6vHPf92gxv3L9b+fhoSM0Joeejj0E2Szwv/6yq2VGCllhDedYQYZm94uCpjE6xdY xU0A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=TxCq8Uc1FL6lOEMiMQCHsF0rKjaFMHqkajOPIRH8TSk=; b=h6JHaVtzdS7V7JFl1YnaG4wKeGMHKz/4hWAJwxzG9Yw1RwSTU64DMfY18lkGVVqGL9 C6KAeNCOsGZSw8quwAcVMxTo7enE4FYZIGv47PsvNMwuutGIzxsue4LioEFluph856R7 GqRQA/mATzBGDiLqmJ5qrQiDWos1uPQPfKM5JEEYmsiT4WUivRz8GbTPAsGRoTeLLYcp fWkAIBmL9qJgPuU68Q+UPOhgWilJylhF5F6Nr364Cj0LdyfLbmuCXYu0Z6J1ZNffeAzT BZvC+wEVgc7rjGYZaVDlIOTjdxYEZsgYPiQ2y9+6XoPeJIyn2RjwYKpLF/VV1C4ieAvK gbzg== X-Gm-Message-State: AO0yUKXcLhOvZVrL9xyCDVo7EZRyDgVo5wYPXy6UsXGn2huLYEsNEhfq jGV/t6zM+VjI9XnJ/VXkfn8oiOJqouc= X-Google-Smtp-Source: AK7set/RqISlAUp2/UgcBurBAqSUZ4E3fDngUPJ4gMefEKcFkpIpzqiJxM1C11n+W1S+PaJbb6/YPg== X-Received: by 2002:adf:cd8b:0:b0:2c7:bfe:4f60 with SMTP id q11-20020adfcd8b000000b002c70bfe4f60mr16742522wrj.15.1677511709582; Mon, 27 Feb 2023 07:28:29 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id l17-20020a5d6691000000b002c54e26bca5sm7414470wru.49.2023.02.27.07.28.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Feb 2023 07:28:29 -0800 (PST) Message-Id: <4236c0d80c7dd8b8c6b45462dea6bf88f844f50d.1677511700.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Mon, 27 Feb 2023 15:28:17 +0000 Subject: [PATCH v3 10/13] unpack-trees: mark fields only used internally as internal Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Derrick Stolee , Elijah Newren , Jacob Keller , Jonathan Tan , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren Continue the work from the previous patch by finding additional fields which are only used internally but not yet explicitly marked as such, and include them in the internal fields struct. Signed-off-by: Elijah Newren --- unpack-trees.c | 159 +++++++++++++++++++++++++------------------------ unpack-trees.h | 26 ++++---- 2 files changed, 95 insertions(+), 90 deletions(-) diff --git a/unpack-trees.c b/unpack-trees.c index ecf89d5bfeb..dd4b55ef49e 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -66,8 +66,8 @@ static const char *unpack_plumbing_errors[NB_UNPACK_TREES_WARNING_TYPES] = { }; #define ERRORMSG(o,type) \ - ( ((o) && (o)->msgs[(type)]) \ - ? ((o)->msgs[(type)]) \ + ( ((o) && (o)->internal.msgs[(type)]) \ + ? ((o)->internal.msgs[(type)]) \ : (unpack_plumbing_errors[(type)]) ) static const char *super_prefixed(const char *path, const char *super_prefix) @@ -108,10 +108,10 @@ void setup_unpack_trees_porcelain(struct unpack_trees_options *opts, const char *cmd) { int i; - const char **msgs = opts->msgs; + const char **msgs = opts->internal.msgs; const char *msg; - strvec_init(&opts->msgs_to_free); + strvec_init(&opts->internal.msgs_to_free); if (!strcmp(cmd, "checkout")) msg = advice_enabled(ADVICE_COMMIT_BEFORE_MERGE) @@ -129,7 +129,7 @@ void setup_unpack_trees_porcelain(struct unpack_trees_options *opts, "Please commit your changes or stash them before you %s.") : _("Your local changes to the following files would be overwritten by %s:\n%%s"); msgs[ERROR_WOULD_OVERWRITE] = msgs[ERROR_NOT_UPTODATE_FILE] = - strvec_pushf(&opts->msgs_to_free, msg, cmd, cmd); + strvec_pushf(&opts->internal.msgs_to_free, msg, cmd, cmd); msgs[ERROR_NOT_UPTODATE_DIR] = _("Updating the following directories would lose untracked files in them:\n%s"); @@ -153,7 +153,7 @@ void setup_unpack_trees_porcelain(struct unpack_trees_options *opts, "Please move or remove them before you %s.") : _("The following untracked working tree files would be removed by %s:\n%%s"); msgs[ERROR_WOULD_LOSE_UNTRACKED_REMOVED] = - strvec_pushf(&opts->msgs_to_free, msg, cmd, cmd); + strvec_pushf(&opts->internal.msgs_to_free, msg, cmd, cmd); if (!strcmp(cmd, "checkout")) msg = advice_enabled(ADVICE_COMMIT_BEFORE_MERGE) @@ -171,7 +171,7 @@ void setup_unpack_trees_porcelain(struct unpack_trees_options *opts, "Please move or remove them before you %s.") : _("The following untracked working tree files would be overwritten by %s:\n%%s"); msgs[ERROR_WOULD_LOSE_UNTRACKED_OVERWRITTEN] = - strvec_pushf(&opts->msgs_to_free, msg, cmd, cmd); + strvec_pushf(&opts->internal.msgs_to_free, msg, cmd, cmd); /* * Special case: ERROR_BIND_OVERLAP refers to a pair of paths, we @@ -189,16 +189,16 @@ void setup_unpack_trees_porcelain(struct unpack_trees_options *opts, msgs[WARNING_SPARSE_ORPHANED_NOT_OVERWRITTEN] = _("The following paths were already present and thus not updated despite sparse patterns:\n%s"); - opts->show_all_errors = 1; + opts->internal.show_all_errors = 1; /* rejected paths may not have a static buffer */ - for (i = 0; i < ARRAY_SIZE(opts->unpack_rejects); i++) - opts->unpack_rejects[i].strdup_strings = 1; + for (i = 0; i < ARRAY_SIZE(opts->internal.unpack_rejects); i++) + opts->internal.unpack_rejects[i].strdup_strings = 1; } void clear_unpack_trees_porcelain(struct unpack_trees_options *opts) { - strvec_clear(&opts->msgs_to_free); - memset(opts->msgs, 0, sizeof(opts->msgs)); + strvec_clear(&opts->internal.msgs_to_free); + memset(opts->internal.msgs, 0, sizeof(opts->internal.msgs)); } static int do_add_entry(struct unpack_trees_options *o, struct cache_entry *ce, @@ -210,7 +210,7 @@ static int do_add_entry(struct unpack_trees_options *o, struct cache_entry *ce, set |= CE_WT_REMOVE; ce->ce_flags = (ce->ce_flags & ~clear) | set; - return add_index_entry(&o->result, ce, + return add_index_entry(&o->internal.result, ce, ADD_CACHE_OK_TO_ADD | ADD_CACHE_OK_TO_REPLACE); } @@ -218,7 +218,7 @@ static void add_entry(struct unpack_trees_options *o, const struct cache_entry *ce, unsigned int set, unsigned int clear) { - do_add_entry(o, dup_cache_entry(ce, &o->result), set, clear); + do_add_entry(o, dup_cache_entry(ce, &o->internal.result), set, clear); } /* @@ -233,7 +233,7 @@ static int add_rejected_path(struct unpack_trees_options *o, if (o->quiet) return -1; - if (!o->show_all_errors) + if (!o->internal.show_all_errors) return error(ERRORMSG(o, e), super_prefixed(path, o->super_prefix)); @@ -241,7 +241,7 @@ static int add_rejected_path(struct unpack_trees_options *o, * Otherwise, insert in a list for future display by * display_(error|warning)_msgs() */ - string_list_append(&o->unpack_rejects[e], path); + string_list_append(&o->internal.unpack_rejects[e], path); return -1; } @@ -253,7 +253,7 @@ static void display_error_msgs(struct unpack_trees_options *o) int e; unsigned error_displayed = 0; for (e = 0; e < NB_UNPACK_TREES_ERROR_TYPES; e++) { - struct string_list *rejects = &o->unpack_rejects[e]; + struct string_list *rejects = &o->internal.unpack_rejects[e]; if (rejects->nr > 0) { int i; @@ -281,7 +281,7 @@ static void display_warning_msgs(struct unpack_trees_options *o) unsigned warning_displayed = 0; for (e = NB_UNPACK_TREES_ERROR_TYPES + 1; e < NB_UNPACK_TREES_WARNING_TYPES; e++) { - struct string_list *rejects = &o->unpack_rejects[e]; + struct string_list *rejects = &o->internal.unpack_rejects[e]; if (rejects->nr > 0) { int i; @@ -600,13 +600,14 @@ static void mark_ce_used(struct cache_entry *ce, struct unpack_trees_options *o) { ce->ce_flags |= CE_UNPACKED; - if (o->cache_bottom < o->src_index->cache_nr && - o->src_index->cache[o->cache_bottom] == ce) { - int bottom = o->cache_bottom; + if (o->internal.cache_bottom < o->src_index->cache_nr && + o->src_index->cache[o->internal.cache_bottom] == ce) { + int bottom = o->internal.cache_bottom; + while (bottom < o->src_index->cache_nr && o->src_index->cache[bottom]->ce_flags & CE_UNPACKED) bottom++; - o->cache_bottom = bottom; + o->internal.cache_bottom = bottom; } } @@ -652,7 +653,7 @@ static void mark_ce_used_same_name(struct cache_entry *ce, static struct cache_entry *next_cache_entry(struct unpack_trees_options *o) { const struct index_state *index = o->src_index; - int pos = o->cache_bottom; + int pos = o->internal.cache_bottom; while (pos < index->cache_nr) { struct cache_entry *ce = index->cache[pos]; @@ -711,7 +712,7 @@ static void restore_cache_bottom(struct traverse_info *info, int bottom) if (o->diff_index_cached) return; - o->cache_bottom = bottom; + o->internal.cache_bottom = bottom; } static int switch_cache_bottom(struct traverse_info *info) @@ -721,13 +722,13 @@ static int switch_cache_bottom(struct traverse_info *info) if (o->diff_index_cached) return 0; - ret = o->cache_bottom; + ret = o->internal.cache_bottom; pos = find_cache_pos(info->prev, info->name, info->namelen); if (pos < -1) - o->cache_bottom = -2 - pos; + o->internal.cache_bottom = -2 - pos; else if (pos < 0) - o->cache_bottom = o->src_index->cache_nr; + o->internal.cache_bottom = o->src_index->cache_nr; return ret; } @@ -873,9 +874,9 @@ static int traverse_trees_recursive(int n, unsigned long dirmask, * save and restore cache_bottom anyway to not miss * unprocessed entries before 'pos'. */ - bottom = o->cache_bottom; + bottom = o->internal.cache_bottom; ret = traverse_by_cache_tree(pos, nr_entries, n, info); - o->cache_bottom = bottom; + o->internal.cache_bottom = bottom; return ret; } @@ -1212,7 +1213,7 @@ static int unpack_single_entry(int n, unsigned long mask, * cache entry from the index aware logic. */ src[i + o->merge] = create_ce_entry(info, names + i, stage, - &o->result, o->merge, + &o->internal.result, o->merge, bit & dirmask); } @@ -1237,7 +1238,7 @@ static int unpack_single_entry(int n, unsigned long mask, static int unpack_failed(struct unpack_trees_options *o, const char *message) { - discard_index(&o->result); + discard_index(&o->internal.result); if (!o->quiet && !o->exiting_early) { if (message) return error("%s", message); @@ -1260,7 +1261,7 @@ static int find_cache_pos(struct traverse_info *info, struct index_state *index = o->src_index; int pfxlen = info->pathlen; - for (pos = o->cache_bottom; pos < index->cache_nr; pos++) { + for (pos = o->internal.cache_bottom; pos < index->cache_nr; pos++) { const struct cache_entry *ce = index->cache[pos]; const char *ce_name, *ce_slash; int cmp, ce_len; @@ -1271,8 +1272,8 @@ static int find_cache_pos(struct traverse_info *info, * we can never match it; don't check it * again. */ - if (pos == o->cache_bottom) - ++o->cache_bottom; + if (pos == o->internal.cache_bottom) + ++o->internal.cache_bottom; continue; } if (!ce_in_traverse_path(ce, info)) { @@ -1450,7 +1451,7 @@ static int unpack_sparse_callback(int n, unsigned long mask, unsigned long dirma */ if (!is_null_oid(&names[0].oid)) { src[0] = create_ce_entry(info, &names[0], 0, - &o->result, 1, + &o->internal.result, 1, dirmask & (1ul << 0)); src[0]->ce_flags |= (CE_SKIP_WORKTREE | CE_NEW_SKIP_WORKTREE); } @@ -1560,7 +1561,7 @@ static int unpack_callback(int n, unsigned long mask, unsigned long dirmask, str * in 'mark_ce_used()' */ if (!src[0] || !S_ISSPARSEDIR(src[0]->ce_mode)) - o->cache_bottom += matches; + o->internal.cache_bottom += matches; return mask; } } @@ -1907,37 +1908,37 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options populate_from_existing_patterns(o, &pl); } - index_state_init(&o->result, o->src_index->repo); - o->result.initialized = 1; - o->result.timestamp.sec = o->src_index->timestamp.sec; - o->result.timestamp.nsec = o->src_index->timestamp.nsec; - o->result.version = o->src_index->version; + index_state_init(&o->internal.result, o->src_index->repo); + o->internal.result.initialized = 1; + o->internal.result.timestamp.sec = o->src_index->timestamp.sec; + o->internal.result.timestamp.nsec = o->src_index->timestamp.nsec; + o->internal.result.version = o->src_index->version; if (!o->src_index->split_index) { - o->result.split_index = NULL; + o->internal.result.split_index = NULL; } else if (o->src_index == o->dst_index) { /* * o->dst_index (and thus o->src_index) will be discarded - * and overwritten with o->result at the end of this function, + * and overwritten with o->internal.result at the end of this function, * so just use src_index's split_index to avoid having to * create a new one. */ - o->result.split_index = o->src_index->split_index; - o->result.split_index->refcount++; + o->internal.result.split_index = o->src_index->split_index; + o->internal.result.split_index->refcount++; } else { - o->result.split_index = init_split_index(&o->result); + o->internal.result.split_index = init_split_index(&o->internal.result); } - oidcpy(&o->result.oid, &o->src_index->oid); + oidcpy(&o->internal.result.oid, &o->src_index->oid); o->merge_size = len; mark_all_ce_unused(o->src_index); - o->result.fsmonitor_last_update = + o->internal.result.fsmonitor_last_update = xstrdup_or_null(o->src_index->fsmonitor_last_update); - o->result.fsmonitor_has_run_once = o->src_index->fsmonitor_has_run_once; + o->internal.result.fsmonitor_has_run_once = o->src_index->fsmonitor_has_run_once; if (!o->src_index->initialized && !repo->settings.command_requires_full_index && - is_sparse_index_allowed(&o->result, 0)) - o->result.sparse_index = 1; + is_sparse_index_allowed(&o->internal.result, 0)) + o->internal.result.sparse_index = 1; /* * Sparse checkout loop #1: set NEW_SKIP_WORKTREE on existing entries @@ -1957,7 +1958,7 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options setup_traverse_info(&info, prefix); info.fn = unpack_callback; info.data = o; - info.show_all_errors = o->show_all_errors; + info.show_all_errors = o->internal.show_all_errors; info.pathspec = o->pathspec; if (o->prefix) { @@ -1998,7 +1999,7 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options } mark_all_ce_unused(o->src_index); - if (o->trivial_merges_only && o->nontrivial_merge) { + if (o->trivial_merges_only && o->internal.nontrivial_merge) { ret = unpack_failed(o, "Merge requires file-level merging"); goto done; } @@ -2009,13 +2010,13 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options * If they will have NEW_SKIP_WORKTREE, also set CE_SKIP_WORKTREE * so apply_sparse_checkout() won't attempt to remove it from worktree */ - mark_new_skip_worktree(o->internal.pl, &o->result, + mark_new_skip_worktree(o->internal.pl, &o->internal.result, CE_ADDED, CE_SKIP_WORKTREE | CE_NEW_SKIP_WORKTREE, o->verbose_update); ret = 0; - for (i = 0; i < o->result.cache_nr; i++) { - struct cache_entry *ce = o->result.cache[i]; + for (i = 0; i < o->internal.result.cache_nr; i++) { + struct cache_entry *ce = o->internal.result.cache[i]; /* * Entries marked with CE_ADDED in merged_entry() do not have @@ -2029,7 +2030,7 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options verify_absent(ce, WARNING_SPARSE_ORPHANED_NOT_OVERWRITTEN, o)) ret = 1; - if (apply_sparse_checkout(&o->result, ce, o)) + if (apply_sparse_checkout(&o->internal.result, ce, o)) ret = 1; } if (ret == 1) { @@ -2037,30 +2038,30 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options * Inability to sparsify or de-sparsify individual * paths is not an error, but just a warning. */ - if (o->show_all_errors) + if (o->internal.show_all_errors) display_warning_msgs(o); ret = 0; } } - ret = check_updates(o, &o->result) ? (-2) : 0; + ret = check_updates(o, &o->internal.result) ? (-2) : 0; if (o->dst_index) { - move_index_extensions(&o->result, o->src_index); + move_index_extensions(&o->internal.result, o->src_index); if (!ret) { if (git_env_bool("GIT_TEST_CHECK_CACHE_TREE", 0)) - cache_tree_verify(the_repository, &o->result); + cache_tree_verify(the_repository, &o->internal.result); if (!o->skip_cache_tree_update && - !cache_tree_fully_valid(o->result.cache_tree)) - cache_tree_update(&o->result, + !cache_tree_fully_valid(o->internal.result.cache_tree)) + cache_tree_update(&o->internal.result, WRITE_TREE_SILENT | WRITE_TREE_REPAIR); } - o->result.updated_workdir = 1; + o->internal.result.updated_workdir = 1; discard_index(o->dst_index); - *o->dst_index = o->result; + *o->dst_index = o->internal.result; } else { - discard_index(&o->result); + discard_index(&o->internal.result); } o->src_index = NULL; @@ -2076,7 +2077,7 @@ done: return ret; return_failed: - if (o->show_all_errors) + if (o->internal.show_all_errors) display_error_msgs(o); mark_all_ce_unused(o->src_index); ret = unpack_failed(o, NULL); @@ -2099,9 +2100,9 @@ enum update_sparsity_result update_sparsity(struct unpack_trees_options *o, unsigned old_show_all_errors; int free_pattern_list = 0; - old_show_all_errors = o->show_all_errors; - o->show_all_errors = 1; - index_state_init(&o->result, o->src_index->repo); + old_show_all_errors = o->internal.show_all_errors; + o->internal.show_all_errors = 1; + index_state_init(&o->internal.result, o->src_index->repo); /* Sanity checks */ if (!o->update || o->index_only || o->skip_sparse_checkout) @@ -2148,7 +2149,7 @@ enum update_sparsity_result update_sparsity(struct unpack_trees_options *o, ret = UPDATE_SPARSITY_WORKTREE_UPDATE_FAILURES; display_warning_msgs(o); - o->show_all_errors = old_show_all_errors; + o->internal.show_all_errors = old_show_all_errors; if (free_pattern_list) { clear_pattern_list(pl); free(pl); @@ -2248,15 +2249,15 @@ static int verify_uptodate_sparse(const struct cache_entry *ce, } /* - * TODO: We should actually invalidate o->result, not src_index [1]. + * TODO: We should actually invalidate o->internal.result, not src_index [1]. * But since cache tree and untracked cache both are not copied to - * o->result until unpacking is complete, we invalidate them on + * o->internal.result until unpacking is complete, we invalidate them on * src_index instead with the assumption that they will be copied to * dst_index at the end. * * [1] src_index->cache_tree is also used in unpack_callback() so if - * we invalidate o->result, we need to update it to use - * o->result.cache_tree as well. + * we invalidate o->internal.result, we need to update it to use + * o->internal.result.cache_tree as well. */ static void invalidate_ce_path(const struct cache_entry *ce, struct unpack_trees_options *o) @@ -2424,7 +2425,7 @@ static int check_ok_to_remove(const char *name, int len, int dtype, * delete this path, which is in a subdirectory that * is being replaced with a blob. */ - result = index_file_exists(&o->result, name, len, 0); + result = index_file_exists(&o->internal.result, name, len, 0); if (result) { if (result->ce_flags & CE_REMOVE) return 0; @@ -2525,7 +2526,7 @@ static int merged_entry(const struct cache_entry *ce, struct unpack_trees_options *o) { int update = CE_UPDATE; - struct cache_entry *merge = dup_cache_entry(ce, &o->result); + struct cache_entry *merge = dup_cache_entry(ce, &o->internal.result); if (!old) { /* @@ -2620,7 +2621,7 @@ static int merged_sparse_dir(const struct cache_entry * const *src, int n, setup_traverse_info(&info, src[0]->name); info.fn = unpack_sparse_callback; info.data = o; - info.show_all_errors = o->show_all_errors; + info.show_all_errors = o->internal.show_all_errors; info.pathspec = o->pathspec; /* Get the tree descriptors of the sparse directory in each of the merging trees */ @@ -2838,7 +2839,7 @@ int threeway_merge(const struct cache_entry * const *stages, return -1; } - o->nontrivial_merge = 1; + o->internal.nontrivial_merge = 1; /* #2, #3, #4, #6, #7, #9, #10, #11. */ count = 0; diff --git a/unpack-trees.h b/unpack-trees.h index 5c1a9314a06..0335c89bc75 100644 --- a/unpack-trees.h +++ b/unpack-trees.h @@ -59,7 +59,6 @@ struct unpack_trees_options { preserve_ignored, clone, index_only, - nontrivial_merge, trivial_merges_only, verbose_update, aggressive, @@ -70,22 +69,13 @@ struct unpack_trees_options { skip_sparse_checkout, quiet, exiting_early, - show_all_errors, dry_run, skip_cache_tree_update; enum unpack_trees_reset_type reset; const char *prefix; const char *super_prefix; - int cache_bottom; struct pathspec *pathspec; merge_fn_t fn; - const char *msgs[NB_UNPACK_TREES_WARNING_TYPES]; - struct strvec msgs_to_free; - /* - * Store error messages in an array, each case - * corresponding to a error message type - */ - struct string_list unpack_rejects[NB_UNPACK_TREES_WARNING_TYPES]; int head_idx; int merge_size; @@ -95,11 +85,25 @@ struct unpack_trees_options { struct index_state *dst_index; struct index_state *src_index; - struct index_state result; struct checkout_metadata meta; struct unpack_trees_options_internal { + unsigned int nontrivial_merge, + show_all_errors; + + int cache_bottom; + const char *msgs[NB_UNPACK_TREES_WARNING_TYPES]; + struct strvec msgs_to_free; + + /* + * Store error messages in an array, each case + * corresponding to a error message type + */ + struct string_list unpack_rejects[NB_UNPACK_TREES_WARNING_TYPES]; + + struct index_state result; + struct pattern_list *pl; struct dir_struct *dir; } internal; From patchwork Mon Feb 27 15:28:18 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 13153818 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C375CC64ED8 for ; Mon, 27 Feb 2023 15:29:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230259AbjB0P3G (ORCPT ); Mon, 27 Feb 2023 10:29:06 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43640 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229379AbjB0P3C (ORCPT ); Mon, 27 Feb 2023 10:29:02 -0500 Received: from mail-wr1-x436.google.com (mail-wr1-x436.google.com [IPv6:2a00:1450:4864:20::436]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3936CD33F for ; Mon, 27 Feb 2023 07:28:32 -0800 (PST) Received: by mail-wr1-x436.google.com with SMTP id l1so3596921wry.12 for ; Mon, 27 Feb 2023 07:28:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=gumFfoHYTikPuKuMLA7FCNGHGsKUNE8MRz/fbK1UzHE=; b=cU8UHjy8yuNfw+Gh9GX5XIrIX4wQCvwIM19LFEiimgCS1skRkqS5MIPEdKivWfMUcY ySUZH8usIUJNT2M+OgjAPkQq5Js3k8eQ8VxjWsyrBjufKCtLvYKdJjaBTx86bUzD1HVY HqE3YvaLDexTJM7+gtAd/Bnx/SBBFoCFZy3FyCCnw/d53RabCHnCsuiZsKa9+EI7FwWl dviOM6VJmopQ/SycL8PXvJgSh2P3QATD5zSoJLCwAjqXvwp+L6mBEzmJOcDYWDU4i978 6YCmOGiLJ4baMZDsV6r7H3SxwmVjJjM3Z96ou4qIKwMY7vx3rVXr1gr8IqA0UzHlSF9g wYGA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=gumFfoHYTikPuKuMLA7FCNGHGsKUNE8MRz/fbK1UzHE=; b=OHUhd73HFeQkOblzJO9uKdZcywebXeTqC5B6P9PwX7UWaOfZYy01lk8DWQBTJ2R55s t8mEmgDtyCNot3OTIr+d3af8fmJ7e9EGsl9IXxglqdmZVCHbLS+sYdIpqmGcFKw3p6zF GNDrXRYz23RNjZPw55fa0M7DyrtrxhOxMLH9A1xXI0SejWT7B+3hWch/jOWcaklP1JY0 WzFzdyyibRwL7yxrrKLysBfmPmRH6iRc6apKECYJInSfLJmPEUEi50ai5mbLoHIVxcvw E3QKkRit6L6aPKp6+GvrMHIC4JkosoLqcbEPrQUIYIFHPthY0AaRqdLuupiFQB3w2Uci RNKA== X-Gm-Message-State: AO0yUKWzZfhuZGX74MR1kQ8jA7+QHqjOUdOFa5tuxlbZmlOSYeNV88I2 2k98DTxopOZr6nheHVe0HmlF1l6PmBk= X-Google-Smtp-Source: AK7set9rB6oOCi5ErJZD7rlGVHQwpei52waGUbJYKM2YOVA6QjQQbZpnV3fupQ2zG0AtkDCOgMDnpw== X-Received: by 2002:adf:ea88:0:b0:2c5:5a65:79a0 with SMTP id s8-20020adfea88000000b002c55a6579a0mr17781982wrm.53.1677511710544; Mon, 27 Feb 2023 07:28:30 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id b6-20020a5d4b86000000b002c5691f13eesm7325631wrt.50.2023.02.27.07.28.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Feb 2023 07:28:30 -0800 (PST) Message-Id: <76f4a544e4bcf1207d2db68e26a2b12221c84abd.1677511700.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Mon, 27 Feb 2023 15:28:18 +0000 Subject: [PATCH v3 11/13] unpack-trees: rewrap a few overlong lines from previous patch Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Derrick Stolee , Elijah Newren , Jacob Keller , Jonathan Tan , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren The previous patch made many lines a little longer, resulting in four becoming a bit too long. They were left as-is for the previous patch to facilitate reviewers verifying that we were just adding "internal." in a bunch of places, but rewrap them now. Signed-off-by: Elijah Newren --- unpack-trees.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/unpack-trees.c b/unpack-trees.c index dd4b55ef49e..cac5dd0da37 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -1213,8 +1213,8 @@ static int unpack_single_entry(int n, unsigned long mask, * cache entry from the index aware logic. */ src[i + o->merge] = create_ce_entry(info, names + i, stage, - &o->internal.result, o->merge, - bit & dirmask); + &o->internal.result, + o->merge, bit & dirmask); } if (o->merge) { @@ -1918,14 +1918,15 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options } else if (o->src_index == o->dst_index) { /* * o->dst_index (and thus o->src_index) will be discarded - * and overwritten with o->internal.result at the end of this function, - * so just use src_index's split_index to avoid having to - * create a new one. + * and overwritten with o->internal.result at the end of + * this function, so just use src_index's split_index to + * avoid having to create a new one. */ o->internal.result.split_index = o->src_index->split_index; o->internal.result.split_index->refcount++; } else { - o->internal.result.split_index = init_split_index(&o->internal.result); + o->internal.result.split_index = + init_split_index(&o->internal.result); } oidcpy(&o->internal.result.oid, &o->src_index->oid); o->merge_size = len; @@ -2049,7 +2050,8 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options move_index_extensions(&o->internal.result, o->src_index); if (!ret) { if (git_env_bool("GIT_TEST_CHECK_CACHE_TREE", 0)) - cache_tree_verify(the_repository, &o->internal.result); + cache_tree_verify(the_repository, + &o->internal.result); if (!o->skip_cache_tree_update && !cache_tree_fully_valid(o->internal.result.cache_tree)) cache_tree_update(&o->internal.result, From patchwork Mon Feb 27 15:28:19 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 13153823 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4CCF0C7EE23 for ; Mon, 27 Feb 2023 15:29:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230195AbjB0P3I (ORCPT ); Mon, 27 Feb 2023 10:29:08 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43674 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230031AbjB0P3D (ORCPT ); Mon, 27 Feb 2023 10:29:03 -0500 Received: from mail-wr1-x433.google.com (mail-wr1-x433.google.com [IPv6:2a00:1450:4864:20::433]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 023DFBB9C for ; Mon, 27 Feb 2023 07:28:32 -0800 (PST) Received: by mail-wr1-x433.google.com with SMTP id j2so6630183wrh.9 for ; Mon, 27 Feb 2023 07:28:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=57O1SBnusX2DO4YrkV3tzxYypiz2azc4iEL6YnRbeSQ=; b=ofsdHG164Cb85MuP5gzhRvIdGiUiElty6jAa+vVJeTyYS+w271goAd5fH20QZoLrOU uF7pGcF5/LHzPT5FtgRfAu2KOHMMvx2uCV4W7+eWCfZMp8+Xx0C0wiRDwOIWOIUi6s7/ trUAOvHC+noaqWvVYmz7iHpvtiajwfx4PdMlnYBy+2xIYrT9WyAyYgs/cCDEFZpTP2sG Iui3eB4hctf63b9orplBdHGW7NR2lBr2zBdA1RwTLkL0qBMgUIcOST2tZUZfa6RcXbdB GtonP5aBPJI/efJ72glMN93CiWmP3NkseoKUfSHjNoLnWi0yvw+UzYLFNWrMTfRfxrfc y6EA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=57O1SBnusX2DO4YrkV3tzxYypiz2azc4iEL6YnRbeSQ=; b=NIoTVEHVSrfeG42qEycyAAdT0EVTuPFS1+JPC2x70vbUfrh6VHb6wzdCRLOmq5tM2s R1oOksAcxL7YaP1v7uP+nSg3/bggDqDtCD/h6I/VxlpCpl2rgOnRmCnnMn8YtHTLKB6R YLLgzVSiKLG2E0ULkGIQuv4GWXnbXmBUbzdztcYPUZAzj+0qEeRYC2+q7PUnXyJb/ip1 0ETKbignYtI5lVMCetkIDufy4IuDocSGoDjD1fhnI+s3MSZ2MqjsMjQOTuttrOgtplFd AiyVfnTxcYPwJoYItWMH0hi5wzNLrCKU60IOisb8b/TRMDIauTz1UPiDaHzI/dvHwNaj xNqg== X-Gm-Message-State: AO0yUKVhz+UfeyQYjVufeOJpjFeytSifqN6gpDfTE0wPCMTBkAXES8GE iAqjXgJ31rZ98fMrIS01nv/SRqLvkoE= X-Google-Smtp-Source: AK7set9UoJvrmWKWKcVXkCBsYQoiLy4dLvlCIpc61xAEcftJny3LWqpfTQLBfa2GidKG632dVWcLNA== X-Received: by 2002:a5d:6a03:0:b0:2c7:84e:1cfe with SMTP id m3-20020a5d6a03000000b002c7084e1cfemr18855960wru.61.1677511711335; Mon, 27 Feb 2023 07:28:31 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id ja6-20020a05600c556600b003dfefe115b9sm9658529wmb.0.2023.02.27.07.28.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Feb 2023 07:28:31 -0800 (PST) Message-Id: In-Reply-To: References: Date: Mon, 27 Feb 2023 15:28:19 +0000 Subject: [PATCH v3 12/13] unpack-trees: special case read-tree debugging as internal usage Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Derrick Stolee , Elijah Newren , Jacob Keller , Jonathan Tan , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren builtin/read-tree.c has some special functionality explicitly designed for debugging unpack-trees.[ch]. Associated with that is two fields that no other external caller would or should use. Mark these as internal to unpack-trees, but allow builtin/read-tree to read or write them for this special case. Signed-off-by: Elijah Newren --- builtin/read-tree.c | 10 +++++----- unpack-trees.c | 22 +++++++++++----------- unpack-trees.h | 6 +++--- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/builtin/read-tree.c b/builtin/read-tree.c index 3ce75417833..6034408d486 100644 --- a/builtin/read-tree.c +++ b/builtin/read-tree.c @@ -87,9 +87,9 @@ static int debug_merge(const struct cache_entry * const *stages, { int i; - printf("* %d-way merge\n", o->merge_size); + printf("* %d-way merge\n", o->internal.merge_size); debug_stage("index", stages[0], o); - for (i = 1; i <= o->merge_size; i++) { + for (i = 1; i <= o->internal.merge_size; i++) { char buf[24]; xsnprintf(buf, sizeof(buf), "ent#%d", i); debug_stage(buf, stages[i], o); @@ -144,7 +144,7 @@ int cmd_read_tree(int argc, const char **argv, const char *cmd_prefix) OPT__DRY_RUN(&opts.dry_run, N_("don't update the index or the work tree")), OPT_BOOL(0, "no-sparse-checkout", &opts.skip_sparse_checkout, N_("skip applying sparse checkout filter")), - OPT_BOOL(0, "debug-unpack", &opts.debug_unpack, + OPT_BOOL(0, "debug-unpack", &opts.internal.debug_unpack, N_("debug unpack-trees")), OPT_CALLBACK_F(0, "recurse-submodules", NULL, "checkout", "control recursive updating of submodules", @@ -247,7 +247,7 @@ int cmd_read_tree(int argc, const char **argv, const char *cmd_prefix) opts.head_idx = 1; } - if (opts.debug_unpack) + if (opts.internal.debug_unpack) opts.fn = debug_merge; /* If we're going to prime_cache_tree later, skip cache tree update */ @@ -263,7 +263,7 @@ int cmd_read_tree(int argc, const char **argv, const char *cmd_prefix) if (unpack_trees(nr_trees, t, &opts)) return 128; - if (opts.debug_unpack || opts.dry_run) + if (opts.internal.debug_unpack || opts.dry_run) return 0; /* do not write the index out */ /* diff --git a/unpack-trees.c b/unpack-trees.c index cac5dd0da37..3e5f4bd2355 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -839,7 +839,7 @@ static int traverse_by_cache_tree(int pos, int nr_entries, int nr_names, mark_ce_used(src[0], o); } free(tree_ce); - if (o->debug_unpack) + if (o->internal.debug_unpack) printf("Unpacked %d entries from %s to %s using cache-tree\n", nr_entries, o->src_index->cache[pos]->name, @@ -1488,7 +1488,7 @@ static int unpack_callback(int n, unsigned long mask, unsigned long dirmask, str while (!p->mode) p++; - if (o->debug_unpack) + if (o->internal.debug_unpack) debug_unpack_callback(n, mask, dirmask, names, info); /* Are we supposed to look at the index too? */ @@ -1929,7 +1929,7 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options init_split_index(&o->internal.result); } oidcpy(&o->internal.result.oid, &o->src_index->oid); - o->merge_size = len; + o->internal.merge_size = len; mark_all_ce_unused(o->src_index); o->internal.result.fsmonitor_last_update = @@ -2882,9 +2882,9 @@ int twoway_merge(const struct cache_entry * const *src, const struct cache_entry *oldtree = src[1]; const struct cache_entry *newtree = src[2]; - if (o->merge_size != 2) + if (o->internal.merge_size != 2) return error("Cannot do a twoway merge of %d trees", - o->merge_size); + o->internal.merge_size); if (oldtree == o->df_conflict_entry) oldtree = NULL; @@ -2964,9 +2964,9 @@ int bind_merge(const struct cache_entry * const *src, const struct cache_entry *old = src[0]; const struct cache_entry *a = src[1]; - if (o->merge_size != 1) + if (o->internal.merge_size != 1) return error("Cannot do a bind merge of %d trees", - o->merge_size); + o->internal.merge_size); if (a && old) return o->quiet ? -1 : error(ERRORMSG(o, ERROR_BIND_OVERLAP), @@ -2990,9 +2990,9 @@ int oneway_merge(const struct cache_entry * const *src, const struct cache_entry *old = src[0]; const struct cache_entry *a = src[1]; - if (o->merge_size != 1) + if (o->internal.merge_size != 1) return error("Cannot do a oneway merge of %d trees", - o->merge_size); + o->internal.merge_size); if (!a || a == o->df_conflict_entry) return deleted_entry(old, old, o); @@ -3027,8 +3027,8 @@ int stash_worktree_untracked_merge(const struct cache_entry * const *src, const struct cache_entry *worktree = src[1]; const struct cache_entry *untracked = src[2]; - if (o->merge_size != 2) - BUG("invalid merge_size: %d", o->merge_size); + if (o->internal.merge_size != 2) + BUG("invalid merge_size: %d", o->internal.merge_size); if (worktree && untracked) return error(_("worktree and untracked commit have duplicate entries: %s"), diff --git a/unpack-trees.h b/unpack-trees.h index 0335c89bc75..e8737adfeda 100644 --- a/unpack-trees.h +++ b/unpack-trees.h @@ -65,7 +65,6 @@ struct unpack_trees_options { skip_unmerged, initial_checkout, diff_index_cached, - debug_unpack, skip_sparse_checkout, quiet, exiting_early, @@ -78,7 +77,6 @@ struct unpack_trees_options { merge_fn_t fn; int head_idx; - int merge_size; struct cache_entry *df_conflict_entry; void *unpack_data; @@ -90,8 +88,10 @@ struct unpack_trees_options { struct unpack_trees_options_internal { unsigned int nontrivial_merge, - show_all_errors; + show_all_errors, + debug_unpack; /* used by read-tree debugging */ + int merge_size; /* used by read-tree debugging */ int cache_bottom; const char *msgs[NB_UNPACK_TREES_WARNING_TYPES]; struct strvec msgs_to_free; From patchwork Mon Feb 27 15:28:20 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elijah Newren X-Patchwork-Id: 13153824 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5851CC64ED8 for ; Mon, 27 Feb 2023 15:29:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229682AbjB0P3K (ORCPT ); Mon, 27 Feb 2023 10:29:10 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44448 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230203AbjB0P3D (ORCPT ); Mon, 27 Feb 2023 10:29:03 -0500 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 D6DB5E3A8 for ; Mon, 27 Feb 2023 07:28:33 -0800 (PST) Received: by mail-wr1-x42e.google.com with SMTP id e37so4170493wri.10 for ; Mon, 27 Feb 2023 07:28:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=31Y4dPoAZJ/DJSbINQlLzmb6PNUb4te5nJmnpDMstGk=; b=KmGny+WPJceBM9bHIpoiyXa5oviPNLmEn/ahLCRQ739QksPXuhv9UQwYQnI84YZgI3 ClkDoESLl86CFOkJh49PHtWsraMDT2unXul/AkZnEu6xyJMQc3zfxEk0y41jJKr7UwCI jYCKMrNWHdTxOVVqMizP+rFYJdbd/nwkmyHLGO12450XP7654ZAQ4c3J8BlThgj+3LU9 qnWiE7h8th2+fqAmf2g86i12xw/wHTcWzEgK8LjWx0AaX+rM6UAF+2DkgWrrtSULEPik XMuaF3G52pPUM4AdfxmMJRMdH76k5Km9aVpGfFi+sz2J95pAXuJgQgZM9wVq+FjtIykp Uqow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=31Y4dPoAZJ/DJSbINQlLzmb6PNUb4te5nJmnpDMstGk=; b=kwW42yF+uWjmflELaET6Le/6qm/z7wIBtBMugytd3IWD4Av2F9KswYRGUJZnd4vQ3a fEEm5E3kK5mtjKL0Rs8Q+sAeFLles+P98tGMRHJSKexeOzc+CydUPhumsQZ17I9Zu8nj BnT6X4g75hVMydmkhkjL3d6VYzq85deqzxLN5UDdsMz33esx72nkwpi2tFpzGAxXpaDn c3OqLWFRk9jDfuliJ4Yuuhjkxr21yJcaY/TLJrmVDaKpIXi4doKi9g/HyTWk53r/NBUT QY2q009A1VR/eE804IDWPSOoo0HCPMftKv685OfxFyMx/8vuwVTX7oT7gsPlz7qtVnn0 IxCg== X-Gm-Message-State: AO0yUKXF8iyzh61zvrFve/9LzQAC/VUOBevD85rv8Qib+YSLG7Ezxhzg YyMJMUPMqSVqg7Q/jewtqJfC22VjIKs= X-Google-Smtp-Source: AK7set+WYHh1DSBHVKy6Tw/ZPMUsYXnqy7DGxqHG2weX4Cr4Z8BbssPm2ZNsbyQE1YisA3IDBlqduA== X-Received: by 2002:a5d:47a1:0:b0:2c5:519f:307a with SMTP id 1-20020a5d47a1000000b002c5519f307amr7088468wrb.30.1677511712151; Mon, 27 Feb 2023 07:28:32 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id c10-20020a5d4f0a000000b002c54911f50bsm7387398wru.84.2023.02.27.07.28.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Feb 2023 07:28:31 -0800 (PST) Message-Id: <6575c007577c0ae78125bc138ff0eb56ef1c4c1e.1677511700.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Mon, 27 Feb 2023 15:28:20 +0000 Subject: [PATCH v3 13/13] unpack-trees: add usage notices around df_conflict_entry Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Derrick Stolee , Elijah Newren , Jacob Keller , Jonathan Tan , Elijah Newren , Elijah Newren Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Elijah Newren From: Elijah Newren Avoid making users believe they need to initialize df_conflict_entry to something (as happened with other output only fields before) with a quick comment and a small sanity check. Signed-off-by: Elijah Newren --- unpack-trees.c | 2 ++ unpack-trees.h | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/unpack-trees.c b/unpack-trees.c index 3e5f4bd2355..a37ab292bbd 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -1876,6 +1876,8 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options BUG("o->internal.dir is for internal use only"); if (o->internal.pl) BUG("o->internal.pl is for internal use only"); + if (o->df_conflict_entry) + BUG("o->df_conflict_entry is an output only field"); trace_performance_enter(); trace2_region_enter("unpack_trees", "unpack_trees", the_repository); diff --git a/unpack-trees.h b/unpack-trees.h index e8737adfeda..61c06eb7c50 100644 --- a/unpack-trees.h +++ b/unpack-trees.h @@ -78,7 +78,7 @@ struct unpack_trees_options { int head_idx; - struct cache_entry *df_conflict_entry; + struct cache_entry *df_conflict_entry; /* output only */ void *unpack_data; struct index_state *dst_index;