From patchwork Sat Sep 29 19:10:22 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Duy Nguyen X-Patchwork-Id: 10620949 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id F14C5175A for ; Sat, 29 Sep 2018 19:10:58 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E3E3229D48 for ; Sat, 29 Sep 2018 19:10:58 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D82FD29E60; Sat, 29 Sep 2018 19:10:58 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6334B29DB7 for ; Sat, 29 Sep 2018 19:10:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727821AbeI3BkT (ORCPT ); Sat, 29 Sep 2018 21:40:19 -0400 Received: from mail-lf1-f48.google.com ([209.85.167.48]:36232 "EHLO mail-lf1-f48.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727643AbeI3BkT (ORCPT ); Sat, 29 Sep 2018 21:40:19 -0400 Received: by mail-lf1-f48.google.com with SMTP id v17-v6so7233747lfe.3 for ; Sat, 29 Sep 2018 12:10:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=sa+c0EW8tO9MABBq3n/w1rFPMAMz61LAna+tCvyQNp4=; b=pYOKHp/EP4nMHmmgxwwyid6AQlhJOIDbNiZhmy5I607ZgUyc60zQHL6I3OFxbzA1aj 2HheOY3oZmCZTOZShgORfcA8VapIwLmnXR1WrpiTyhxEEqp0JLEXco81/ZR9zkGwjFQI gtceZjVYmkb6DKTKA6fIKh0Aihkknvt2BTVHYZP38HL/ychuXce4vl4dHe3HGFHz27Pp Mn6ouan3KMTmznzS8RTu8Owd/Lsz0em4Y4ctYSOe09WNYI+h68Bo/n7kegM27UgXfTrU /cw1F5lBeuK6YxwQ3U7PKasYQ3BKp/uDgQPLSuQCrUQOkzB77OotlFcQw0/pV94lFEC3 Og2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=sa+c0EW8tO9MABBq3n/w1rFPMAMz61LAna+tCvyQNp4=; b=mP3GNAEAYZY0PeSbctrhO/fMJ30HwXsHfKVcDHUfKmmC9EaTYUTfV4UbNxsLXOxk7g DIq9hXMcPPoz67ArqPaTTW692/8et66D7E79Y8/dDOj4v1PUPPHiz4MQDof4YwLqaoF9 OHsRGXz+qzJKWQEuyHJrrkOxWt7uxKaie3rhtUzYLiF8iSpvemU5Nt0AWgPxn7cWqDD4 sATP0Ww6Zaw2ZKjUfwX4AEGlJrDysB7p5D9LU1PY8/KwCoo1g9h4yI3J2wRe8JhbwvWv pltos9uRO9XqsxorhqkOutw3f8P9UZeWWpkOk9HwHvjlPt+w+dUgaF/+SyrdNlqEfIO5 egiA== X-Gm-Message-State: ABuFfogSq8vVpH8/hHtwP4wYmyuzmt+H5yr9wCzemx18vFgcJjonS+Af tD1S/0G3xeVBD2CB9BAySrk= X-Google-Smtp-Source: ACcGV61jE+mHKGKw+GESxTl375JH8SCKY6Mp7GpEyiDhBHdTv5oZikABVhsezNgIybCKLwQJBTfc8Q== X-Received: by 2002:a19:e495:: with SMTP id x21-v6mr1924391lfi.29.1538248243279; Sat, 29 Sep 2018 12:10:43 -0700 (PDT) Received: from localhost.localdomain (c80-216-12-205.bredband.comhem.se. [80.216.12.205]) by smtp.gmail.com with ESMTPSA id c14-v6sm1638494lfi.23.2018.09.29.12.10.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 29 Sep 2018 12:10:41 -0700 (PDT) From: =?utf-8?b?Tmd1eeG7hW4gVGjDoWkgTmfhu41jIER1eQ==?= To: pclouds@gmail.com Cc: git@vger.kernel.org, newren@gmail.com, peff@peff.net, Junio C Hamano , Eric Sunshine , Stefan Beller Subject: [PATCH v2 1/8] refs.c: indent with tabs, not spaces Date: Sat, 29 Sep 2018 21:10:22 +0200 Message-Id: <20180929191029.13994-2-pclouds@gmail.com> X-Mailer: git-send-email 2.19.0.341.g3acb95d729 In-Reply-To: <20180929191029.13994-1-pclouds@gmail.com> References: <20180922180500.4689-1-pclouds@gmail.com> <20180929191029.13994-1-pclouds@gmail.com> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Signed-off-by: Nguyễn Thái Ngọc Duy --- refs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/refs.c b/refs.c index a7a75b4cc0..9f7268d5fe 100644 --- a/refs.c +++ b/refs.c @@ -646,7 +646,7 @@ enum ref_type ref_type(const char *refname) return REF_TYPE_PER_WORKTREE; if (is_pseudoref_syntax(refname)) return REF_TYPE_PSEUDOREF; - return REF_TYPE_NORMAL; + return REF_TYPE_NORMAL; } long get_files_ref_lock_timeout_ms(void) From patchwork Sat Sep 29 19:10:23 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Duy Nguyen X-Patchwork-Id: 10620955 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 797284B76 for ; Sat, 29 Sep 2018 19:10:59 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6869929E61 for ; Sat, 29 Sep 2018 19:10:59 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5D10029E62; Sat, 29 Sep 2018 19:10:59 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8374729E58 for ; Sat, 29 Sep 2018 19:10:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727950AbeI3BkW (ORCPT ); Sat, 29 Sep 2018 21:40:22 -0400 Received: from mail-lj1-f181.google.com ([209.85.208.181]:46945 "EHLO mail-lj1-f181.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727405AbeI3BkV (ORCPT ); Sat, 29 Sep 2018 21:40:21 -0400 Received: by mail-lj1-f181.google.com with SMTP id 203-v6so8658754ljj.13 for ; Sat, 29 Sep 2018 12:10:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=5DHjMdBVzc0ftQDk1QrFBLgqscJh4z3WYoserVUP91A=; b=u046yJqFarRKKmYEMvCLLDS6EkC/d6WcTlFLMRqGgTolw1L7CnrHP5aGbFcHbTDCxt xyg5CLoh7hJmVq6eJFV2KLOnMFqNIIGOYpdC99wLSRD/s4tYsGi9IRmU7ag+4OnpJrYa PJHOxrUYhiu38s5w9BxKr++UTau7DYiZgNrlOmDFTKbTNQRi9g/71TICTP9eH2vxNlGW yG/5eZoIDhzeewhcTypuVvyEefczUienbJfFR2KI6c12k/DexfuEEHjnkNRutoFgmarO AHdK5cGUs91s3MRe0d2LbUp9DWoVUfwYI58MxkkZsqDP8LgUYjn3XWfvKZMXPAh11XQt 5lbQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=5DHjMdBVzc0ftQDk1QrFBLgqscJh4z3WYoserVUP91A=; b=eIETfKcO9QR6wxrXXbwtvMechAQiGWL/13cqSTLlax/L56rzBqh8IMOYIWy4FqUKTM qrW/XxJ27JgpSG1qc8PYCwsjNW6WA2foYYqRMnq0c7SPDI9OF53eNMcjOu+Y0kruqlwx 5inm90D4BYlJ/KwFAWHB2KwZY6pdiHgTDrZ4cw4LcNW712DapD9UNEnCJB2bKucTVJFh eKUaseLrpOv1ozrSQZFk/Hhnu+iaQospz/aKlMrZEufhEq+LGKbWFD7tEzKqFxF2wi3i ejSa9q/1xdZOIbYFVZ1S0ATvr5+p0+flZ1YI2sWEm08K7YJg6BjKZeP0NgiNe9Y5GAIA +nvg== X-Gm-Message-State: ABuFfohX8XpD0KdFzF8o/eq4HTqPchYcJX3+ZD5cxosEpOdPZMKFVdrw +Pv6mD00rcBUUCEMrYXz0BA= X-Google-Smtp-Source: ACcGV63Jqc7A4ZtKk5taF3dUvnr9P5xuAB6rpB4APj/9++lIk0fZ2MQptRdcGyJ0YrRplt7SXslJzg== X-Received: by 2002:a2e:97c8:: with SMTP id m8-v6mr2258728ljj.167.1538248244416; Sat, 29 Sep 2018 12:10:44 -0700 (PDT) Received: from localhost.localdomain (c80-216-12-205.bredband.comhem.se. [80.216.12.205]) by smtp.gmail.com with ESMTPSA id c14-v6sm1638494lfi.23.2018.09.29.12.10.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 29 Sep 2018 12:10:43 -0700 (PDT) From: =?utf-8?b?Tmd1eeG7hW4gVGjDoWkgTmfhu41jIER1eQ==?= To: pclouds@gmail.com Cc: git@vger.kernel.org, newren@gmail.com, peff@peff.net, Junio C Hamano , Eric Sunshine , Stefan Beller Subject: [PATCH v2 2/8] Add a place for (not) sharing stuff between worktrees Date: Sat, 29 Sep 2018 21:10:23 +0200 Message-Id: <20180929191029.13994-3-pclouds@gmail.com> X-Mailer: git-send-email 2.19.0.341.g3acb95d729 In-Reply-To: <20180929191029.13994-1-pclouds@gmail.com> References: <20180922180500.4689-1-pclouds@gmail.com> <20180929191029.13994-1-pclouds@gmail.com> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP When multiple worktrees are used, we need rules to determine if something belongs to one worktree or all of them. Instead of keeping adding rules when new stuff comes (*), have a generic rule: - Inside $GIT_DIR, which is per-worktree by default, add $GIT_DIR/common which is always shared. New features that want to share stuff should put stuff under this directory. - Inside refs/, which is shared by default except refs/bisect, add refs/worktree/ which is per-worktree. We may eventually move refs/bisect to this new location and remove the exception in refs code. (*) And it may also include stuff from external commands which will have no way to modify common/per-worktree rules. Signed-off-by: Nguyễn Thái Ngọc Duy --- Documentation/git-worktree.txt | 19 ++++++++++++++- Documentation/gitrepository-layout.txt | 11 +++++++-- path.c | 2 ++ refs.c | 1 + refs/files-backend.c | 14 ++++++++--- t/t0060-path-utils.sh | 2 ++ t/t1415-worktree-refs.sh | 33 ++++++++++++++++++++++++++ 7 files changed, 76 insertions(+), 6 deletions(-) create mode 100755 t/t1415-worktree-refs.sh diff --git a/Documentation/git-worktree.txt b/Documentation/git-worktree.txt index e2ee9fc21b..a50fbf8094 100644 --- a/Documentation/git-worktree.txt +++ b/Documentation/git-worktree.txt @@ -204,6 +204,22 @@ working trees, it can be used to identify worktrees. For example if you only have two working trees, at "/abc/def/ghi" and "/abc/def/ggg", then "ghi" or "def/ghi" is enough to point to the former working tree. +REFS +---- +In multiple working trees, some refs may be shared between all working +trees, some refs are local. One example is HEAD is different for all +working trees. This section is about the sharing rules. + +In general, all pseudo refs are per working tree and all refs starting +with "refs/" are shared. Pseudo refs are ones like HEAD which are +directly under GIT_DIR instead of inside GIT_DIR/refs. There are one +exception to this: refs inside refs/bisect and refs/worktree is not +shared. + +To access refs, it's best not to look inside GIT_DIR directly. Instead +use commands such as linkgit:git-revparse[1] or linkgit:git-update-ref[1] +which will handle refs correctly. + DETAILS ------- Each linked working tree has a private sub-directory in the repository's @@ -228,7 +244,8 @@ linked working tree `git rev-parse --git-path HEAD` returns `/path/other/test-next/.git/HEAD` or `/path/main/.git/HEAD`) while `git rev-parse --git-path refs/heads/master` uses $GIT_COMMON_DIR and returns `/path/main/.git/refs/heads/master`, -since refs are shared across all working trees. +since refs are shared across all working trees, except refs/bisect and +refs/worktree. See linkgit:gitrepository-layout[5] for more information. The rule of thumb is do not make any assumption about whether a path belongs to diff --git a/Documentation/gitrepository-layout.txt b/Documentation/gitrepository-layout.txt index e85148f05e..89b616e049 100644 --- a/Documentation/gitrepository-layout.txt +++ b/Documentation/gitrepository-layout.txt @@ -95,8 +95,10 @@ refs:: References are stored in subdirectories of this directory. The 'git prune' command knows to preserve objects reachable from refs found in this directory and - its subdirectories. This directory is ignored if $GIT_COMMON_DIR - is set and "$GIT_COMMON_DIR/refs" will be used instead. + its subdirectories. + This directory is ignored (except refs/bisect and + refs/worktree) if $GIT_COMMON_DIR is set and + "$GIT_COMMON_DIR/refs" will be used instead. refs/heads/`name`:: records tip-of-the-tree commit objects of branch `name` @@ -165,6 +167,11 @@ hooks:: each hook. This directory is ignored if $GIT_COMMON_DIR is set and "$GIT_COMMON_DIR/hooks" will be used instead. +common:: + When multiple working trees are used, most of files in + $GIT_DIR are per-worktree with a few known exceptions. All + files under 'common' however will be shared between all + working trees. index:: The current index file for the repository. It is diff --git a/path.c b/path.c index 34f0f98349..bf4bb02a27 100644 --- a/path.c +++ b/path.c @@ -108,6 +108,7 @@ struct common_dir { static struct common_dir common_list[] = { { 0, 1, 0, "branches" }, + { 0, 1, 0, "common" }, { 0, 1, 0, "hooks" }, { 0, 1, 0, "info" }, { 0, 0, 1, "info/sparse-checkout" }, @@ -118,6 +119,7 @@ static struct common_dir common_list[] = { { 0, 1, 0, "objects" }, { 0, 1, 0, "refs" }, { 0, 1, 1, "refs/bisect" }, + { 0, 1, 1, "refs/worktree" }, { 0, 1, 0, "remotes" }, { 0, 1, 0, "worktrees" }, { 0, 1, 0, "rr-cache" }, diff --git a/refs.c b/refs.c index 9f7268d5fe..1bc4ed301b 100644 --- a/refs.c +++ b/refs.c @@ -624,6 +624,7 @@ int dwim_log(const char *str, int len, struct object_id *oid, char **log) static int is_per_worktree_ref(const char *refname) { return !strcmp(refname, "HEAD") || + starts_with(refname, "refs/worktree/") || starts_with(refname, "refs/bisect/") || starts_with(refname, "refs/rewritten/"); } diff --git a/refs/files-backend.c b/refs/files-backend.c index 16ef9325e0..2dd77f9485 100644 --- a/refs/files-backend.c +++ b/refs/files-backend.c @@ -269,9 +269,9 @@ static void loose_fill_ref_dir(struct ref_store *ref_store, closedir(d); /* - * Manually add refs/bisect, which, being per-worktree, might - * not appear in the directory listing for refs/ in the main - * repo. + * Manually add refs/bisect and refs/worktree, which, being + * per-worktree, might not appear in the directory listing for + * refs/ in the main repo. */ if (!strcmp(dirname, "refs/")) { int pos = search_ref_dir(dir, "refs/bisect/", 12); @@ -281,6 +281,14 @@ static void loose_fill_ref_dir(struct ref_store *ref_store, dir->cache, "refs/bisect/", 12, 1); add_entry_to_dir(dir, child_entry); } + + pos = search_ref_dir(dir, "refs/worktree/", 11); + + if (pos < 0) { + struct ref_entry *child_entry = create_dir_entry( + dir->cache, "refs/worktree/", 11, 1); + add_entry_to_dir(dir, child_entry); + } } } diff --git a/t/t0060-path-utils.sh b/t/t0060-path-utils.sh index cd74c0a471..c7b53e494b 100755 --- a/t/t0060-path-utils.sh +++ b/t/t0060-path-utils.sh @@ -306,6 +306,8 @@ test_git_path GIT_COMMON_DIR=bar hooks/me bar/hooks/me test_git_path GIT_COMMON_DIR=bar config bar/config test_git_path GIT_COMMON_DIR=bar packed-refs bar/packed-refs test_git_path GIT_COMMON_DIR=bar shallow bar/shallow +test_git_path GIT_COMMON_DIR=bar common bar/common +test_git_path GIT_COMMON_DIR=bar common/file bar/common/file # In the tests below, $(pwd) must be used because it is a native path on # Windows and avoids MSYS's path mangling (which simplifies "foo/../bar" and diff --git a/t/t1415-worktree-refs.sh b/t/t1415-worktree-refs.sh new file mode 100755 index 0000000000..16c91bef57 --- /dev/null +++ b/t/t1415-worktree-refs.sh @@ -0,0 +1,33 @@ +#!/bin/sh + +test_description='per-worktree refs' + +. ./test-lib.sh + +test_expect_success 'setup' ' + test_commit initial && + test_commit wt1 && + test_commit wt2 && + git worktree add wt1 wt1 && + git worktree add wt2 wt2 && + git checkout initial && + git update-ref refs/worktree/foo HEAD && + git -C wt1 update-ref refs/worktree/foo HEAD && + git -C wt2 update-ref refs/worktree/foo HEAD +' + +test_expect_success 'refs/worktree must not be packed' ' + git pack-refs --all && + test_path_is_missing .git/refs/tags/wt1 && + test_path_is_file .git/refs/worktree/foo && + test_path_is_file .git/worktrees/wt1/refs/worktree/foo && + test_path_is_file .git/worktrees/wt2/refs/worktree/foo +' + +test_expect_success 'refs/worktree are per-worktree' ' + test_cmp_rev worktree/foo initial && + ( cd wt1 && test_cmp_rev worktree/foo wt1 ) && + ( cd wt2 && test_cmp_rev worktree/foo wt2 ) +' + +test_done From patchwork Sat Sep 29 19:10:24 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Duy Nguyen X-Patchwork-Id: 10620963 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id C848B15A7 for ; Sat, 29 Sep 2018 19:11:00 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B75D8294C2 for ; Sat, 29 Sep 2018 19:11:00 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id ABC2129D97; Sat, 29 Sep 2018 19:11:00 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A40CC29E59 for ; Sat, 29 Sep 2018 19:10:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728075AbeI3BkX (ORCPT ); Sat, 29 Sep 2018 21:40:23 -0400 Received: from mail-lf1-f67.google.com ([209.85.167.67]:47030 "EHLO mail-lf1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727643AbeI3BkX (ORCPT ); Sat, 29 Sep 2018 21:40:23 -0400 Received: by mail-lf1-f67.google.com with SMTP id q2-v6so7183181lfc.13 for ; Sat, 29 Sep 2018 12:10:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=gjH83BQBEIV9zGTb6sA7alTUSuKHIbeGklJLQwZvK8s=; b=JIXs0jlacT/qTUNaY5+a8kUWt1Q8gRTJrblgKmwvMfj+A2UBZlIjkGvprxSKSvUIUB PEq0DsLtRdQsfB3y/6qmanwl8HZ8xhF3EZI02LYgay0ZYooobEzH/TMEIge2ZbMxc4G2 lRSMR4X/W3sVs5/WisjLiJx+iEg55eZ9f0IX8gOefAbHjaLybnYg387xqx5GRbcLpijB 9tdbCoQeFVlmvyQFzwu7lj6KDS+0LT5MPubOtP/4NmcoQw7MxM8m6CC+JSfl51A5wptc XTRIVSN4K+oA9f1H/YzY9r4SlouhrHb7Iq4F3Y0oYsuqkLo03EaVp+tAAP+uXLPQ2/Ql 3bxw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=gjH83BQBEIV9zGTb6sA7alTUSuKHIbeGklJLQwZvK8s=; b=uR1CdJwo8fT2ulKoUIQIVVMLCFqDYTyxlBB77rDz4Av2O5m4K2dXM8U+Rof79R0/Ah gR98NTuyPSOMpdMwRyGY2xIxaQ7WYs9VSPiBJR9w/opFA0C7p1MdAVOFUHavA/fKQdzt w1fiHg1KWcRFwGAPCl91dOx4O/GXJfi+vgzS7rTeC7h27Qfq/nNvZkX8PuHZ0nxSvBxj wDwu6nWhQA5ySPdJ8H4Ifru1xG7QAH2lw0N44b8HGi/uI5DD7GjIFuloAOGtN7RGr0Zz jbP7z+tjrCxh876VW/8gKXBUTLDTVtEj2uWojKHzIa1yUoOeaY9pPEjjkX5zMuY6925d t1Uw== X-Gm-Message-State: ABuFfogTCLi3YBu3wU5oaYHKlCLFGpG4+y7oRKdbWavyZJvWAwfu0D+V ljFrLAeZV0mcz2f/Pi/pCr0= X-Google-Smtp-Source: ACcGV61Xmz6Io22FAPjFYaZqZWjDaNHnJ1r91cU/L7JHTHJjOJx55djkEG3rCPVFi6WFdrDQB+gn5A== X-Received: by 2002:a19:a90f:: with SMTP id s15-v6mr1877353lfe.154.1538248245773; Sat, 29 Sep 2018 12:10:45 -0700 (PDT) Received: from localhost.localdomain (c80-216-12-205.bredband.comhem.se. [80.216.12.205]) by smtp.gmail.com with ESMTPSA id c14-v6sm1638494lfi.23.2018.09.29.12.10.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 29 Sep 2018 12:10:44 -0700 (PDT) From: =?utf-8?b?Tmd1eeG7hW4gVGjDoWkgTmfhu41jIER1eQ==?= To: pclouds@gmail.com Cc: git@vger.kernel.org, newren@gmail.com, peff@peff.net, Junio C Hamano , Eric Sunshine , Stefan Beller Subject: [PATCH v2 3/8] refs: new ref types to make per-worktree refs visible to all worktrees Date: Sat, 29 Sep 2018 21:10:24 +0200 Message-Id: <20180929191029.13994-4-pclouds@gmail.com> X-Mailer: git-send-email 2.19.0.341.g3acb95d729 In-Reply-To: <20180929191029.13994-1-pclouds@gmail.com> References: <20180922180500.4689-1-pclouds@gmail.com> <20180929191029.13994-1-pclouds@gmail.com> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP One of the problems with multiple worktree is accessing per-worktree refs of one worktree from another worktree. This was sort of solved by multiple ref store, where the code can open the ref store of another worktree and has access to the ref space of that worktree. The problem with this is reporting. "HEAD" in another ref space is also called "HEAD" like in the current ref space. In order to differentiate them, all the code must somehow carry the ref store around and print something like "HEAD from this ref store". But that is not feasible (or possible with a _lot_ of work). With the current design, we pass a reference around as a string (so called "refname"). Extending this design to pass a string _and_ a ref store is a nightmare, especially when handling extended SHA-1 syntax. So we do it another way. Instead of entering a separate ref space, we make refs from other worktrees available in the current ref space. So "HEAD" is always HEAD of the current worktree, but then we can have "worktrees/blah/HEAD" to denote HEAD from a worktree named "blah". This syntax coincidentally matches the underlying directory structure which makes implementation a bit easier. The main worktree has to be treated specially because well.. it's special from the beginning. So HEAD from the main worktree is acccessible via the name "main-worktree/HEAD" instead of "worktrees/main/HEAD" because "main" could be just another secondary worktree. This patch also makes it possible to specify refs from one worktree in another one, e.g. git log worktrees/foo/HEAD Signed-off-by: Nguyễn Thái Ngọc Duy --- Documentation/git-worktree.txt | 15 ++++++++++- refs.c | 21 ++++++++++++++++ refs.h | 8 +++--- refs/files-backend.c | 28 +++++++++++++++++++++ t/t1415-worktree-refs.sh | 46 ++++++++++++++++++++++++++++++++++ 5 files changed, 114 insertions(+), 4 deletions(-) diff --git a/Documentation/git-worktree.txt b/Documentation/git-worktree.txt index a50fbf8094..58415f9207 100644 --- a/Documentation/git-worktree.txt +++ b/Documentation/git-worktree.txt @@ -208,7 +208,8 @@ REFS ---- In multiple working trees, some refs may be shared between all working trees, some refs are local. One example is HEAD is different for all -working trees. This section is about the sharing rules. +working trees. This section is about the sharing rules and how to access +refs of one working tree from another. In general, all pseudo refs are per working tree and all refs starting with "refs/" are shared. Pseudo refs are ones like HEAD which are @@ -216,6 +217,18 @@ directly under GIT_DIR instead of inside GIT_DIR/refs. There are one exception to this: refs inside refs/bisect and refs/worktree is not shared. +Refs that are per working tree can still be accessed from another +working tree via two special paths main-worktree and worktrees. The +former gives access to per-worktree refs of the main working tree, +while the former to all linked working trees. + +For example, main-worktree/HEAD or main-worktree/refs/bisect/good +resolve to the same value as the main working tree's HEAD and +refs/bisect/good respectively. Similarly, worktrees/foo/HEAD or +worktrees/bar/refs/bisect/bad are the same as +GIT_COMMON_DIR/worktrees/foo/HEAD and +GIT_COMMON_DIR/worktrees/bar/refs/bisect/bad. + To access refs, it's best not to look inside GIT_DIR directly. Instead use commands such as linkgit:git-revparse[1] or linkgit:git-update-ref[1] which will handle refs correctly. diff --git a/refs.c b/refs.c index 1bc4ed301b..2378b2e7fc 100644 --- a/refs.c +++ b/refs.c @@ -641,12 +641,33 @@ static int is_pseudoref_syntax(const char *refname) return 1; } +static int is_main_pseudoref_syntax(const char *refname) +{ + return skip_prefix(refname, "main-worktree/", &refname) && + *refname && + is_pseudoref_syntax(refname); +} + +static int is_other_pseudoref_syntax(const char *refname) +{ + if (!skip_prefix(refname, "worktrees/", &refname)) + return 0; + refname = strchr(refname, '/'); + if (!refname || !refname[1]) + return 0; + return is_pseudoref_syntax(refname + 1); +} + enum ref_type ref_type(const char *refname) { if (is_per_worktree_ref(refname)) return REF_TYPE_PER_WORKTREE; if (is_pseudoref_syntax(refname)) return REF_TYPE_PSEUDOREF; + if (is_main_pseudoref_syntax(refname)) + return REF_TYPE_MAIN_PSEUDOREF; + if (is_other_pseudoref_syntax(refname)) + return REF_TYPE_OTHER_PSEUDOREF; return REF_TYPE_NORMAL; } diff --git a/refs.h b/refs.h index bd52c1bbae..9b53dbeae8 100644 --- a/refs.h +++ b/refs.h @@ -704,9 +704,11 @@ int parse_hide_refs_config(const char *var, const char *value, const char *); int ref_is_hidden(const char *, const char *); enum ref_type { - REF_TYPE_PER_WORKTREE, - REF_TYPE_PSEUDOREF, - REF_TYPE_NORMAL, + REF_TYPE_PER_WORKTREE, /* refs inside refs/ but not shared */ + REF_TYPE_PSEUDOREF, /* refs outside refs/ in current worktree */ + REF_TYPE_MAIN_PSEUDOREF, /* pseudo refs from the main worktree */ + REF_TYPE_OTHER_PSEUDOREF, /* pseudo refs from other worktrees */ + REF_TYPE_NORMAL, /* normal/shared refs inside refs/ */ }; enum ref_type ref_type(const char *refname); diff --git a/refs/files-backend.c b/refs/files-backend.c index 2dd77f9485..9ca2a3706c 100644 --- a/refs/files-backend.c +++ b/refs/files-backend.c @@ -149,6 +149,23 @@ static struct files_ref_store *files_downcast(struct ref_store *ref_store, return refs; } +static void files_reflog_path_other_worktrees(struct files_ref_store *refs, + struct strbuf *sb, + const char *refname) +{ + const char *real_ref; + + if (!skip_prefix(refname, "worktrees/", &real_ref)) + BUG("refname %s is not a other-worktree ref", refname); + real_ref = strchr(real_ref, '/'); + if (!real_ref) + BUG("refname %s is not a other-worktree ref", refname); + real_ref++; + + strbuf_addf(sb, "%s/%.*slogs/%s", refs->gitcommondir, + (int)(real_ref - refname), refname, real_ref); +} + static void files_reflog_path(struct files_ref_store *refs, struct strbuf *sb, const char *refname) @@ -158,6 +175,12 @@ static void files_reflog_path(struct files_ref_store *refs, case REF_TYPE_PSEUDOREF: strbuf_addf(sb, "%s/logs/%s", refs->gitdir, refname); break; + case REF_TYPE_OTHER_PSEUDOREF: + return files_reflog_path_other_worktrees(refs, sb, refname); + case REF_TYPE_MAIN_PSEUDOREF: + if (!skip_prefix(refname, "main-worktree/", &refname)) + BUG("ref %s is not a main pseudoref", refname); + /* passthru */ case REF_TYPE_NORMAL: strbuf_addf(sb, "%s/logs/%s", refs->gitcommondir, refname); break; @@ -176,6 +199,11 @@ static void files_ref_path(struct files_ref_store *refs, case REF_TYPE_PSEUDOREF: strbuf_addf(sb, "%s/%s", refs->gitdir, refname); break; + case REF_TYPE_MAIN_PSEUDOREF: + if (!skip_prefix(refname, "main-worktree/", &refname)) + BUG("ref %s is not a main pseudoref", refname); + /* passthru */ + case REF_TYPE_OTHER_PSEUDOREF: case REF_TYPE_NORMAL: strbuf_addf(sb, "%s/%s", refs->gitcommondir, refname); break; diff --git a/t/t1415-worktree-refs.sh b/t/t1415-worktree-refs.sh index 16c91bef57..8b701d07af 100755 --- a/t/t1415-worktree-refs.sh +++ b/t/t1415-worktree-refs.sh @@ -30,4 +30,50 @@ test_expect_success 'refs/worktree are per-worktree' ' ( cd wt2 && test_cmp_rev worktree/foo wt2 ) ' +test_expect_success 'resolve main-worktree/HEAD' ' + test_cmp_rev main-worktree/HEAD initial && + ( cd wt1 && test_cmp_rev main-worktree/HEAD initial ) && + ( cd wt2 && test_cmp_rev main-worktree/HEAD initial ) +' + +test_expect_success 'ambiguous main-worktree/HEAD' ' + mkdir -p .git/refs/heads/main-worktree && + test_when_finished rm .git/refs/heads/main-worktree/HEAD && + cp .git/HEAD .git/refs/heads/main-worktree/HEAD && + git rev-parse main-worktree/HEAD 2>warn >/dev/null && + grep "main-worktree/HEAD.*ambiguous" warn +' + +test_expect_success 'resolve worktrees/xx/HEAD' ' + test_cmp_rev worktrees/wt1/HEAD wt1 && + ( cd wt1 && test_cmp_rev worktrees/wt1/HEAD wt1 ) && + ( cd wt2 && test_cmp_rev worktrees/wt1/HEAD wt1 ) +' + +test_expect_success 'ambiguous worktrees/xx/HEAD' ' + mkdir -p .git/refs/heads/worktrees/wt1 && + test_when_finished rm .git/refs/heads/worktrees/wt1/HEAD && + cp .git/HEAD .git/refs/heads/worktrees/wt1/HEAD && + git rev-parse worktrees/wt1/HEAD 2>warn >/dev/null && + grep "worktrees/wt1/HEAD.*ambiguous" warn +' + +test_expect_success 'reflog of main-worktree/HEAD' ' + git reflog HEAD | sed "s/HEAD/main-worktree\/HEAD/" >expected && + git reflog main-worktree/HEAD >actual && + test_cmp expected actual && + git -C wt1 reflog main-worktree/HEAD >actual.wt1 && + test_cmp expected actual.wt1 +' + +test_expect_success 'reflog of worktrees/xx/HEAD' ' + git -C wt2 reflog HEAD | sed "s/HEAD/worktrees\/wt2\/HEAD/" >expected && + git reflog worktrees/wt2/HEAD >actual && + test_cmp expected actual && + git -C wt1 reflog worktrees/wt2/HEAD >actual.wt1 && + test_cmp expected actual.wt1 && + git -C wt2 reflog worktrees/wt2/HEAD >actual.wt2 && + test_cmp expected actual.wt2 +' + test_done From patchwork Sat Sep 29 19:10:25 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Duy Nguyen X-Patchwork-Id: 10620951 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 2F0BF417B for ; Sat, 29 Sep 2018 19:10:59 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 215FB29DB7 for ; Sat, 29 Sep 2018 19:10:59 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1603329E60; Sat, 29 Sep 2018 19:10:59 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C51F629E61 for ; Sat, 29 Sep 2018 19:10:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728058AbeI3BkX (ORCPT ); Sat, 29 Sep 2018 21:40:23 -0400 Received: from mail-lf1-f65.google.com ([209.85.167.65]:32803 "EHLO mail-lf1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727823AbeI3BkW (ORCPT ); Sat, 29 Sep 2018 21:40:22 -0400 Received: by mail-lf1-f65.google.com with SMTP id o21-v6so7250366lfe.0 for ; Sat, 29 Sep 2018 12:10:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=41b5LyjPxBOGJy2oERhln0Kbaiw7quSdzC9AzbHcFf4=; b=DDRYqMbAFWVgwiqZ/P/6T6f7oz3YSf4K0cGxFd8+zl0tPN5R011i8nRVXhYMrMDVr1 AfYsUjsScjDVozLiHWvjycK165sjq279qdCH0FlqOPxvCx9RguM3ZiyVDsWDZHiS+pbA JA9so9JYCseazAohiZnFeO8KRfJpFu5ndeGKuQi8JwSN6TX2X9/MJ52fWcjhAyhJz6JJ QshNIMi8fXDN/4UjLr1FIh9fWE9BaVbHADD2Mq1AbwsjW89ZP9zS4N6D9oQQsF4NEmPZ vIBY6d3G9uJFXE75ry3ucD5RwiDFCKF2wEiD256Lxqd8NpLDPkXkjpiSjfvX9rY8ITf9 y0kA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=41b5LyjPxBOGJy2oERhln0Kbaiw7quSdzC9AzbHcFf4=; b=munzGjBXGjiu2rk9RhJA0Vnoe4as7O/Z9JSqWsJCTmUUMjAjOIgtsV7FcAAdyc4Ewe SD8pCdP2PVkQC5m/CVHM4mSWjX8MdZUJeWizft5dvgo7g1AdThK5KpeaZghY5hL6bYF2 lAXTcXyMm5xtl61HofgZwZeGqbt1903xQRFbPMp5lJkwRm7h1npd37MLMsHM8WPvUsRY x4Wbmsw11Go1wXVaGvyQp7drOLM9Bab33xwZW/pcvBz9Kf7CJmW3iyUlr3ykqYMui/w2 xQA6Hc6CDOi802xK+7Ydyml+rFhu7aq2s3SjvYIFMfXoPZ8LTrA0vV3ZVX5FRl9QB93C 3PBA== X-Gm-Message-State: ABuFfoh72zimYW+ly+fSdjrxd1tMWCasdC/MN3UwLyWYV2P9VXa3kHwV uTe8SdteKa3LisrUlekFsio= X-Google-Smtp-Source: ACcGV619U3nMYKsuu7QRLeAqu5QduLDMYzGECg1K650sB2cBtq3ES+GmGnrInGAGnI/1nk3LljsuWQ== X-Received: by 2002:a19:e21c:: with SMTP id z28-v6mr110331lfg.20.1538248246876; Sat, 29 Sep 2018 12:10:46 -0700 (PDT) Received: from localhost.localdomain (c80-216-12-205.bredband.comhem.se. [80.216.12.205]) by smtp.gmail.com with ESMTPSA id c14-v6sm1638494lfi.23.2018.09.29.12.10.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 29 Sep 2018 12:10:46 -0700 (PDT) From: =?utf-8?b?Tmd1eeG7hW4gVGjDoWkgTmfhu41jIER1eQ==?= To: pclouds@gmail.com Cc: git@vger.kernel.org, newren@gmail.com, peff@peff.net, Junio C Hamano , Eric Sunshine , Stefan Beller Subject: [PATCH v2 4/8] revision.c: correct a parameter name Date: Sat, 29 Sep 2018 21:10:25 +0200 Message-Id: <20180929191029.13994-5-pclouds@gmail.com> X-Mailer: git-send-email 2.19.0.341.g3acb95d729 In-Reply-To: <20180929191029.13994-1-pclouds@gmail.com> References: <20180922180500.4689-1-pclouds@gmail.com> <20180929191029.13994-1-pclouds@gmail.com> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This function is a callback of for_each_reflog() which will pass a ref name as the first argument, not a path (to a reflog file). Signed-off-by: Nguyễn Thái Ngọc Duy --- revision.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/revision.c b/revision.c index e18bd530e4..63aae722c1 100644 --- a/revision.c +++ b/revision.c @@ -1277,13 +1277,14 @@ static int handle_one_reflog_ent(struct object_id *ooid, struct object_id *noid, return 0; } -static int handle_one_reflog(const char *path, const struct object_id *oid, +static int handle_one_reflog(const char *refname, + const struct object_id *oid, int flag, void *cb_data) { struct all_refs_cb *cb = cb_data; cb->warned_bad_reflog = 0; - cb->name_for_errormsg = path; - refs_for_each_reflog_ent(cb->refs, path, + cb->name_for_errormsg = refname; + refs_for_each_reflog_ent(cb->refs, refname, handle_one_reflog_ent, cb_data); return 0; } From patchwork Sat Sep 29 19:10:26 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Duy Nguyen X-Patchwork-Id: 10620957 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9450A15A6 for ; Sat, 29 Sep 2018 19:10:59 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 86508294C2 for ; Sat, 29 Sep 2018 19:10:59 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7AC1D29E62; Sat, 29 Sep 2018 19:10:59 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E564029E69 for ; Sat, 29 Sep 2018 19:10:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728083AbeI3BkZ (ORCPT ); Sat, 29 Sep 2018 21:40:25 -0400 Received: from mail-lj1-f194.google.com ([209.85.208.194]:39816 "EHLO mail-lj1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727981AbeI3BkZ (ORCPT ); Sat, 29 Sep 2018 21:40:25 -0400 Received: by mail-lj1-f194.google.com with SMTP id 5-v6so8700329lju.6 for ; Sat, 29 Sep 2018 12:10:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=9eDaz944Md18kLFfnZS3EhOlwiserwQ2TRsWkWypeW4=; b=IhSf99prFanbZGCJ4xFnccIVHVH/i/Op+UcaMonAlPzz0mbpbN4yyZ2ae4SYzw8k9r vVIzaG0GMKXhb4+wPqzTN1V3tBHWRF0QCK/bS4SaqWBCDjUQhZHQreGH0y4dFpKxZx42 nDad/YYpO3n8kgqR4vMR/t9epp3XE3DgWITRdbwtqVrPLb3sOtDB89VYCkHfPX5rfvLg NPMFxvNUex4w0V/19vYLdMFhGqNhcJ4Usynm0r640tdn1OVn3+b69AVk6n9q+5mxtYSs AdvjcIsvDptVLLSjEiXZBEwCfH4q2X7P2EsyXb8DDEPELpgaeq9azNrAvNb3iEzPKLRf s17g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=9eDaz944Md18kLFfnZS3EhOlwiserwQ2TRsWkWypeW4=; b=MzGrg/E/p41jW9rZWlvYLqzuZF350rRFdsWgDDptNLBqQNLyNiMZXE0zgwCZc0Fh1D jOLTA9lpEdM/WxRlB7h3Sro/A0QuQDzQ7f1rXOW8bM1lOyO3uVZlGcQtRbIrh9HG2Ybf uzx9alBcoFUffYF21ON90V8UCoNVPg/Uv86F7ySWIz2Cns7V+h6WjvWMAUlI1JnxbOaY Y9sBnO33pJ5pIYxEJPkvSUpcUw5vHZTGCqsVMHM8qZB/ADi2w8PIOZ8Ji5IJQz9Hg5Dm jWi7taeg8favVqSJqD/2Z4nvSE8J9x16caZM1HuppKGoYApMDVOBxq4Z5dIldVE6eWB1 RL1Q== X-Gm-Message-State: ABuFfojbbYe1hRFlSCYhPUZepQkWJcQ6apcHqvafYpZ+bJl6GC4gA+3Y M8NBNuOSKYKk2Mo7q9GR08E= X-Google-Smtp-Source: ACcGV61JgFzujwr3HT7gtthBaza8bbManxDMRGLLKE7tCBayhCxjeVlXKYriFwmyUBG9EQ/FMCFNCA== X-Received: by 2002:a2e:7c18:: with SMTP id x24-v6mr2480263ljc.174.1538248248052; Sat, 29 Sep 2018 12:10:48 -0700 (PDT) Received: from localhost.localdomain (c80-216-12-205.bredband.comhem.se. [80.216.12.205]) by smtp.gmail.com with ESMTPSA id c14-v6sm1638494lfi.23.2018.09.29.12.10.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 29 Sep 2018 12:10:47 -0700 (PDT) From: =?utf-8?b?Tmd1eeG7hW4gVGjDoWkgTmfhu41jIER1eQ==?= To: pclouds@gmail.com Cc: git@vger.kernel.org, newren@gmail.com, peff@peff.net, Junio C Hamano , Eric Sunshine , Stefan Beller Subject: [PATCH v2 5/8] revision.c: better error reporting on ref from different worktrees Date: Sat, 29 Sep 2018 21:10:26 +0200 Message-Id: <20180929191029.13994-6-pclouds@gmail.com> X-Mailer: git-send-email 2.19.0.341.g3acb95d729 In-Reply-To: <20180929191029.13994-1-pclouds@gmail.com> References: <20180922180500.4689-1-pclouds@gmail.com> <20180929191029.13994-1-pclouds@gmail.com> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Make use of the new ref aliases to pass refs from another worktree around and access them from the current ref store instead. This does not change any functionality, but when a problem arises, we would like the reported messages to mention full ref aliases, like this: fatal: bad object worktrees/ztemp/HEAD warning: reflog of 'main-worktree/HEAD' references pruned commits instead of fatal: bad object HEAD warning: reflog of 'HEAD' references pruned commits which does not really tell where the refs are from. Signed-off-by: Nguyễn Thái Ngọc Duy --- revision.c | 21 +++++++++++++-------- worktree.c | 32 +++++++++++++++++++++++++++++--- worktree.h | 14 ++++++++++++++ 3 files changed, 56 insertions(+), 11 deletions(-) diff --git a/revision.c b/revision.c index 63aae722c1..8ce660e3b1 100644 --- a/revision.c +++ b/revision.c @@ -1177,7 +1177,7 @@ struct all_refs_cb { int warned_bad_reflog; struct rev_info *all_revs; const char *name_for_errormsg; - struct ref_store *refs; + struct worktree *wt; }; int ref_excluded(struct string_list *ref_excludes, const char *path) @@ -1214,7 +1214,7 @@ static void init_all_refs_cb(struct all_refs_cb *cb, struct rev_info *revs, cb->all_revs = revs; cb->all_flags = flags; revs->rev_input_given = 1; - cb->refs = NULL; + cb->wt = NULL; } void clear_ref_exclusion(struct string_list **ref_excludes_p) @@ -1277,15 +1277,20 @@ static int handle_one_reflog_ent(struct object_id *ooid, struct object_id *noid, return 0; } -static int handle_one_reflog(const char *refname, +static int handle_one_reflog(const char *refname_in_wt, const struct object_id *oid, int flag, void *cb_data) { struct all_refs_cb *cb = cb_data; + struct strbuf refname = STRBUF_INIT; + cb->warned_bad_reflog = 0; - cb->name_for_errormsg = refname; - refs_for_each_reflog_ent(cb->refs, refname, + strbuf_worktree_ref(cb->wt, &refname, refname_in_wt); + cb->name_for_errormsg = refname.buf; + refs_for_each_reflog_ent(get_main_ref_store(the_repository), + refname.buf, handle_one_reflog_ent, cb_data); + strbuf_release(&refname); return 0; } @@ -1300,8 +1305,8 @@ static void add_other_reflogs_to_pending(struct all_refs_cb *cb) if (wt->is_current) continue; - cb->refs = get_worktree_ref_store(wt); - refs_for_each_reflog(cb->refs, + cb->wt = wt; + refs_for_each_reflog(get_worktree_ref_store(wt), handle_one_reflog, cb); } @@ -1314,7 +1319,7 @@ void add_reflogs_to_pending(struct rev_info *revs, unsigned flags) cb.all_revs = revs; cb.all_flags = flags; - cb.refs = get_main_ref_store(the_repository); + cb.wt = NULL; for_each_reflog(handle_one_reflog, &cb); if (!revs->single_worktree) diff --git a/worktree.c b/worktree.c index b0d0b5426d..ec1a5bc511 100644 --- a/worktree.c +++ b/worktree.c @@ -487,6 +487,28 @@ int submodule_uses_worktrees(const char *path) return ret; } +void strbuf_worktree_ref(const struct worktree *wt, + struct strbuf *sb, + const char *refname) +{ + if (wt && !wt->is_current) { + if (is_main_worktree(wt)) + strbuf_addstr(sb, "main/"); + else + strbuf_addf(sb, "worktrees/%s/", wt->id); + } + strbuf_addstr(sb, refname); +} + +const char *worktree_ref(const struct worktree *wt, const char *refname) +{ + static struct strbuf sb = STRBUF_INIT; + + strbuf_reset(&sb); + strbuf_worktree_ref(wt, &sb, refname); + return sb.buf; +} + int other_head_refs(each_ref_fn fn, void *cb_data) { struct worktree **worktrees, **p; @@ -495,13 +517,17 @@ int other_head_refs(each_ref_fn fn, void *cb_data) worktrees = get_worktrees(0); for (p = worktrees; *p; p++) { struct worktree *wt = *p; - struct ref_store *refs; + struct object_id oid; + int flag; if (wt->is_current) continue; - refs = get_worktree_ref_store(wt); - ret = refs_head_ref(refs, fn, cb_data); + if (!refs_read_ref_full(get_main_ref_store(the_repository), + worktree_ref(wt, "HEAD"), + RESOLVE_REF_READING, + &oid, &flag)) + ret = fn(worktree_ref(wt, "HEAD"), &oid, flag, cb_data); if (ret) break; } diff --git a/worktree.h b/worktree.h index df3fc30f73..0016eb9e88 100644 --- a/worktree.h +++ b/worktree.h @@ -108,4 +108,18 @@ extern const char *worktree_git_path(const struct worktree *wt, const char *fmt, ...) __attribute__((format (printf, 2, 3))); +/* + * Return a refname suitable for access from the current ref store. + */ +void strbuf_worktree_ref(const struct worktree *wt, + struct strbuf *sb, + const char *refname); + +/* + * Return a refname suitable for access from the current ref + * store. The result may be destroyed at the next call. + */ +const char *worktree_ref(const struct worktree *wt, + const char *refname); + #endif From patchwork Sat Sep 29 19:10:27 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Duy Nguyen X-Patchwork-Id: 10620965 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 3BBB815A7 for ; Sat, 29 Sep 2018 19:11:02 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2C706294C2 for ; Sat, 29 Sep 2018 19:11:02 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1F66929D97; Sat, 29 Sep 2018 19:11:02 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 119B429D48 for ; Sat, 29 Sep 2018 19:10:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728080AbeI3BkZ (ORCPT ); Sat, 29 Sep 2018 21:40:25 -0400 Received: from mail-lj1-f169.google.com ([209.85.208.169]:33930 "EHLO mail-lj1-f169.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727643AbeI3BkZ (ORCPT ); Sat, 29 Sep 2018 21:40:25 -0400 Received: by mail-lj1-f169.google.com with SMTP id f8-v6so8744898ljk.1 for ; Sat, 29 Sep 2018 12:10:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=peAfcrMCwTzr8JvcGSBo29sgF3aTa4S1yNrHBSWYrUo=; b=bNcWp8cSl9/oZvFEofj/Yy74pamAeWAFw5tdbpvyyvnY4aaUTAeBAz2oUE8hiaywCO XAfttv/HzC2ZhVtARCuUXVBVGYypvYakuhNHQoA825YcyXQXRqFtAnu6jSeoh5nmftQp xMnbe9OP7Vj+iqJ/7NdPZ8Gtrxdar+vci8HFXfUszolAmd/7D3si1AnlkMqXMgvW2bl5 UBavS7iZJoSJ0u7VGzeQnOhO1rQF4bS9hkSP5oRxNvQMOzeokyKcDZTshzdBGrQbpVDZ mx+f9W2XLPY9p1NxbHiTu39x9wbPIAZaXCHnJHcJt0ZemyjtuJypuUpyKvKj9Kk4ZB+f OpsQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=peAfcrMCwTzr8JvcGSBo29sgF3aTa4S1yNrHBSWYrUo=; b=I2bqtEYOUIcpb/P6dI8Co1ij6VNPmrxhz2MbGodI6K7mzWNRus1xKVQmQjyv9n35zc ydvoy6T7le9bTuzGEEAxcOBHGMkR8Kk/eSQmrlQvRYJ6npSIVFqhoq2owuEmHQpkKb8O bBd+CX0GQdAsIODDtodIW0ROwLVvJV9NVl0mBr1zRoOQNoP70xGG3nQtqr7KQ9geklm1 7AIp9MjciGf2lbIZr1Jiy6B2ViOEIVEQPH95VsP0x9u8zfnyou/5IoxPvFzxsNkuJtI2 QQihOKT/BRf2ga2cO9cFbSY2hPZ8pqgqWI0xBOcnYjE0u4xwtIWK8XMtsKH8xGYH4qmT U0SA== X-Gm-Message-State: ABuFfogh8xHqUCyu1b0PKcQ/hB8vEaga8Kj3h2h3XiV4xAXlMLDRkok8 YDLQtv/2xbDg/CdYVtLDMPI= X-Google-Smtp-Source: ACcGV61R8yRSxPrgl6FmxYk9nmpLtz7jJ7HQNgmT+veJ+e8WD1tIUEnqYl1YMn8/yDChy7riyQEGvQ== X-Received: by 2002:a2e:5317:: with SMTP id h23-v6mr2251869ljb.26.1538248249116; Sat, 29 Sep 2018 12:10:49 -0700 (PDT) Received: from localhost.localdomain (c80-216-12-205.bredband.comhem.se. [80.216.12.205]) by smtp.gmail.com with ESMTPSA id c14-v6sm1638494lfi.23.2018.09.29.12.10.48 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 29 Sep 2018 12:10:48 -0700 (PDT) From: =?utf-8?b?Tmd1eeG7hW4gVGjDoWkgTmfhu41jIER1eQ==?= To: pclouds@gmail.com Cc: git@vger.kernel.org, newren@gmail.com, peff@peff.net, Junio C Hamano , Eric Sunshine , Stefan Beller Subject: [PATCH v2 6/8] fsck: Move fsck_head_link() to get_default_heads() to avoid some globals Date: Sat, 29 Sep 2018 21:10:27 +0200 Message-Id: <20180929191029.13994-7-pclouds@gmail.com> X-Mailer: git-send-email 2.19.0.341.g3acb95d729 In-Reply-To: <20180929191029.13994-1-pclouds@gmail.com> References: <20180922180500.4689-1-pclouds@gmail.com> <20180929191029.13994-1-pclouds@gmail.com> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Elijah Newren This will make it easier to check the HEAD of other worktrees from fsck. Signed-off-by: Elijah Newren Signed-off-by: Nguyễn Thái Ngọc Duy --- builtin/fsck.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/builtin/fsck.c b/builtin/fsck.c index 63c8578cc1..24f8a09a3c 100644 --- a/builtin/fsck.c +++ b/builtin/fsck.c @@ -36,8 +36,6 @@ static int check_strict; static int keep_cache_objects; static struct fsck_options fsck_walk_options = FSCK_OPTIONS_DEFAULT; static struct fsck_options fsck_obj_options = FSCK_OPTIONS_DEFAULT; -static struct object_id head_oid; -static const char *head_points_at; static int errors_found; static int write_lost_and_found; static int verbose; @@ -484,8 +482,15 @@ static int fsck_handle_ref(const char *refname, const struct object_id *oid, return 0; } +static int fsck_head_link(const char **head_points_at, + struct object_id *head_oid); + static void get_default_heads(void) { + const char *head_points_at; + struct object_id head_oid; + + fsck_head_link(&head_points_at, &head_oid); if (head_points_at && !is_null_oid(&head_oid)) fsck_handle_ref("HEAD", &head_oid, 0, NULL); for_each_rawref(fsck_handle_ref, NULL); @@ -579,33 +584,34 @@ static void fsck_object_dir(const char *path) stop_progress(&progress); } -static int fsck_head_link(void) +static int fsck_head_link(const char **head_points_at, + struct object_id *head_oid) { int null_is_error = 0; if (verbose) fprintf(stderr, "Checking HEAD link\n"); - head_points_at = resolve_ref_unsafe("HEAD", 0, &head_oid, NULL); - if (!head_points_at) { + *head_points_at = resolve_ref_unsafe("HEAD", 0, head_oid, NULL); + if (!*head_points_at) { errors_found |= ERROR_REFS; return error("Invalid HEAD"); } - if (!strcmp(head_points_at, "HEAD")) + if (!strcmp(*head_points_at, "HEAD")) /* detached HEAD */ null_is_error = 1; - else if (!starts_with(head_points_at, "refs/heads/")) { + else if (!starts_with(*head_points_at, "refs/heads/")) { errors_found |= ERROR_REFS; return error("HEAD points to something strange (%s)", - head_points_at); + *head_points_at); } - if (is_null_oid(&head_oid)) { + if (is_null_oid(head_oid)) { if (null_is_error) { errors_found |= ERROR_REFS; return error("HEAD: detached HEAD points at nothing"); } fprintf(stderr, "notice: HEAD points to an unborn branch (%s)\n", - head_points_at + 11); + *head_points_at + 11); } return 0; } @@ -720,7 +726,6 @@ int cmd_fsck(int argc, const char **argv, const char *prefix) git_config(fsck_config, NULL); - fsck_head_link(); if (connectivity_only) { for_each_loose_object(mark_loose_for_connectivity, NULL, 0); for_each_packed_object(mark_packed_for_connectivity, NULL, 0); From patchwork Sat Sep 29 19:10:28 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Duy Nguyen X-Patchwork-Id: 10620961 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 8820915A6 for ; Sat, 29 Sep 2018 19:11:00 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6DD9B294C2 for ; Sat, 29 Sep 2018 19:11:00 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6215629E58; Sat, 29 Sep 2018 19:11:00 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3521D29D97 for ; Sat, 29 Sep 2018 19:10:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728126AbeI3Bk1 (ORCPT ); Sat, 29 Sep 2018 21:40:27 -0400 Received: from mail-lf1-f50.google.com ([209.85.167.50]:46842 "EHLO mail-lf1-f50.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728063AbeI3Bk0 (ORCPT ); Sat, 29 Sep 2018 21:40:26 -0400 Received: by mail-lf1-f50.google.com with SMTP id q2-v6so7183228lfc.13 for ; Sat, 29 Sep 2018 12:10:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=kUV/xSrYy+WbCwmd5DanAD6l3yjLd9ZtNgqn5wslcFU=; b=uaY06nN5HinE0lDQtp8QjR4AFzSKaAC0NnhXgPY1rUypIkj8Y9mriB2j3610b+aW5L AiY++B1PWMzl2lcXjiXJD2x0xPER9fDzyIGzcT1B52GvESKkE4jnp4W4h/8hAamXigKv XQODNybiYYWGVc6srColzz/ZGSi8csv04zrUdHY/h5IcPYusTFBieMjLvMQNudx+XGk+ ghGBsIDZbI5dGweazUzM5qYADvnOJr7wLJC50SxHYbCviZAX3WnkQ9P85uCkAeIlrTEf y1qi+vllNYmmQ99WAExpfkY/04mpLs8VtACKz95yKOLAJjmfojOrY/3h0k95J89d4oCJ tN4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=kUV/xSrYy+WbCwmd5DanAD6l3yjLd9ZtNgqn5wslcFU=; b=PWkdG4aG/48PT8hZ7LfzLBalDwG28XtMilX3hqvVvKFtJ+sHelyv/HV0rCeVxrNurA puCoHlu8qq1mfCVkx9xNtxXtkXdcf3hxj+yjvcTqoXYTScrl0Td18o9puFYj5Kyvr3FJ /j+42JpjDHuYduSJNcV/Z/KFz8vVdAkXPF/LNPfycFCNOW7WAvdrcAGvpUIvQqgl1O7O OYKjmfXqQD16eW1quvnJZUFUNiJnHpKmlAoWT0VbAljLVIcW8k1mEzzZO+l9j0rVxw+h X8Oo1+nPjL5RCXpybk0C/c7xbieC7WO7Arx8ZrbU+xiTT0ZA4t7gTDJGN62pxBJmMzRo +v9A== X-Gm-Message-State: ABuFfoiaHBO4f49wqcYaF7MJSX8RI4glbar+JhT3TZEk1sMhjWhaP7bv XMNDw+cBmY+huGCFUayt6dg= X-Google-Smtp-Source: ACcGV63qKlepv3j0MKWqQQkdumzcdQyxsQQClXrKuGS2O1/EfPecx9q0N9TEa77+HbnX/8Cy2MaPgw== X-Received: by 2002:a19:98c1:: with SMTP id a184-v6mr1906119lfe.94.1538248250160; Sat, 29 Sep 2018 12:10:50 -0700 (PDT) Received: from localhost.localdomain (c80-216-12-205.bredband.comhem.se. [80.216.12.205]) by smtp.gmail.com with ESMTPSA id c14-v6sm1638494lfi.23.2018.09.29.12.10.49 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 29 Sep 2018 12:10:49 -0700 (PDT) From: =?utf-8?b?Tmd1eeG7hW4gVGjDoWkgTmfhu41jIER1eQ==?= To: pclouds@gmail.com Cc: git@vger.kernel.org, newren@gmail.com, peff@peff.net, Junio C Hamano , Eric Sunshine , Stefan Beller Subject: [PATCH v2 7/8] fsck: check HEAD and reflog from other worktrees Date: Sat, 29 Sep 2018 21:10:28 +0200 Message-Id: <20180929191029.13994-8-pclouds@gmail.com> X-Mailer: git-send-email 2.19.0.341.g3acb95d729 In-Reply-To: <20180929191029.13994-1-pclouds@gmail.com> References: <20180922180500.4689-1-pclouds@gmail.com> <20180929191029.13994-1-pclouds@gmail.com> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP fsck is a repo-wide operation and should check all references no matter which worktree they are associated to. Reported-by: Jeff King Helped-by: Elijah Newren Signed-off-by: Nguyễn Thái Ngọc Duy --- builtin/fsck.c | 55 ++++++++++++++++++++++++++++++++++--------------- t/t1450-fsck.sh | 35 +++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 17 deletions(-) diff --git a/builtin/fsck.c b/builtin/fsck.c index 24f8a09a3c..71492c158d 100644 --- a/builtin/fsck.c +++ b/builtin/fsck.c @@ -19,6 +19,7 @@ #include "packfile.h" #include "object-store.h" #include "run-command.h" +#include "worktree.h" #define REACHABLE 0x0001 #define SEEN 0x0002 @@ -444,7 +445,11 @@ static int fsck_handle_reflog_ent(struct object_id *ooid, struct object_id *noid static int fsck_handle_reflog(const char *logname, const struct object_id *oid, int flag, void *cb_data) { - for_each_reflog_ent(logname, fsck_handle_reflog_ent, (void *)logname); + struct strbuf refname = STRBUF_INIT; + + strbuf_worktree_ref(cb_data, &refname, logname); + for_each_reflog_ent(refname.buf, fsck_handle_reflog_ent, refname.buf); + strbuf_release(&refname); return 0; } @@ -482,20 +487,34 @@ static int fsck_handle_ref(const char *refname, const struct object_id *oid, return 0; } -static int fsck_head_link(const char **head_points_at, +static int fsck_head_link(const char *head_ref_name, + const char **head_points_at, struct object_id *head_oid); static void get_default_heads(void) { + struct worktree **worktrees, **p; const char *head_points_at; struct object_id head_oid; - fsck_head_link(&head_points_at, &head_oid); - if (head_points_at && !is_null_oid(&head_oid)) - fsck_handle_ref("HEAD", &head_oid, 0, NULL); for_each_rawref(fsck_handle_ref, NULL); - if (include_reflogs) - for_each_reflog(fsck_handle_reflog, NULL); + + worktrees = get_worktrees(0); + for (p = worktrees; *p; p++) { + struct worktree *wt = *p; + struct strbuf ref = STRBUF_INIT; + + strbuf_worktree_ref(wt, &ref, "HEAD"); + fsck_head_link(ref.buf, &head_points_at, &head_oid); + if (head_points_at && !is_null_oid(&head_oid)) + fsck_handle_ref(ref.buf, &head_oid, 0, NULL); + strbuf_release(&ref); + + if (include_reflogs) + refs_for_each_reflog(get_worktree_ref_store(wt), + fsck_handle_reflog, wt); + } + free_worktrees(worktrees); /* * Not having any default heads isn't really fatal, but @@ -584,34 +603,36 @@ static void fsck_object_dir(const char *path) stop_progress(&progress); } -static int fsck_head_link(const char **head_points_at, +static int fsck_head_link(const char *head_ref_name, + const char **head_points_at, struct object_id *head_oid) { int null_is_error = 0; if (verbose) - fprintf(stderr, "Checking HEAD link\n"); + fprintf(stderr, "Checking %s link\n", head_ref_name); - *head_points_at = resolve_ref_unsafe("HEAD", 0, head_oid, NULL); + *head_points_at = resolve_ref_unsafe(head_ref_name, 0, head_oid, NULL); if (!*head_points_at) { errors_found |= ERROR_REFS; - return error("Invalid HEAD"); + return error("Invalid %s", head_ref_name); } - if (!strcmp(*head_points_at, "HEAD")) + if (!strcmp(*head_points_at, head_ref_name)) /* detached HEAD */ null_is_error = 1; else if (!starts_with(*head_points_at, "refs/heads/")) { errors_found |= ERROR_REFS; - return error("HEAD points to something strange (%s)", - *head_points_at); + return error("%s points to something strange (%s)", + head_ref_name, *head_points_at); } if (is_null_oid(head_oid)) { if (null_is_error) { errors_found |= ERROR_REFS; - return error("HEAD: detached HEAD points at nothing"); + return error("%s: detached HEAD points at nothing", + head_ref_name); } - fprintf(stderr, "notice: HEAD points to an unborn branch (%s)\n", - *head_points_at + 11); + fprintf(stderr, "notice: %s points to an unborn branch (%s)\n", + head_ref_name, *head_points_at + 11); } return 0; } diff --git a/t/t1450-fsck.sh b/t/t1450-fsck.sh index 0f2dd26f74..e97e6a7c6d 100755 --- a/t/t1450-fsck.sh +++ b/t/t1450-fsck.sh @@ -101,6 +101,41 @@ test_expect_success 'HEAD link pointing at a funny place' ' grep "HEAD points to something strange" out ' +test_expect_success 'HEAD link pointing at a funny object (from different wt)' ' + test_when_finished "mv .git/SAVED_HEAD .git/HEAD" && + test_when_finished "rm -rf .git/worktrees wt" && + git worktree add wt && + mv .git/HEAD .git/SAVED_HEAD && + echo $ZERO_OID >.git/HEAD && + # avoid corrupt/broken HEAD from interfering with repo discovery + test_must_fail git -C wt fsck 2>out && + grep "main/HEAD: detached HEAD points" out +' + +test_expect_success 'other worktree HEAD link pointing at a funny object' ' + test_when_finished "rm -rf .git/worktrees other" && + git worktree add other && + echo $ZERO_OID >.git/worktrees/other/HEAD && + test_must_fail git fsck 2>out && + grep "worktrees/other/HEAD: detached HEAD points" out +' + +test_expect_success 'other worktree HEAD link pointing at missing object' ' + test_when_finished "rm -rf .git/worktrees other" && + git worktree add other && + echo "Contents missing from repo" | git hash-object --stdin >.git/worktrees/other/HEAD && + test_must_fail git fsck 2>out && + grep "worktrees/other/HEAD: invalid sha1 pointer" out +' + +test_expect_success 'other worktree HEAD link pointing at a funny place' ' + test_when_finished "rm -rf .git/worktrees other" && + git worktree add other && + echo "ref: refs/funny/place" >.git/worktrees/other/HEAD && + test_must_fail git fsck 2>out && + grep "worktrees/other/HEAD points to something strange" out +' + test_expect_success 'email without @ is okay' ' git cat-file commit HEAD >basis && sed "s/@/AT/" basis >okay && From patchwork Sat Sep 29 19:10:29 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Duy Nguyen X-Patchwork-Id: 10620959 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 0067E417B for ; Sat, 29 Sep 2018 19:11:00 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E4F5929DB7 for ; Sat, 29 Sep 2018 19:10:59 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D941729E62; Sat, 29 Sep 2018 19:10:59 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 55BB029DB7 for ; Sat, 29 Sep 2018 19:10:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728138AbeI3Bk2 (ORCPT ); Sat, 29 Sep 2018 21:40:28 -0400 Received: from mail-lf1-f68.google.com ([209.85.167.68]:37398 "EHLO mail-lf1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727981AbeI3Bk1 (ORCPT ); Sat, 29 Sep 2018 21:40:27 -0400 Received: by mail-lf1-f68.google.com with SMTP id a82-v6so7240681lfa.4 for ; Sat, 29 Sep 2018 12:10:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=mnQmeALmRUcajqsB7R83zm9F0Xm5SsLX7IbLzEfo1Y4=; b=rVf4GNlIqi5ohxfsbV6YLBtxVEycLwBcrfiyE8/vdYI1m28kSgVNCG4zZAwbz2vzbm IsMZP9lHn/7ZjYS/oJfzQeKUfPTIMVFtBDoqi84Sp3juQR3jupwjWl2XD2GYd6Tu9gRu lyk7l1xqp0nWMaiMjyi2s1VurBx7tFqResbr9PTMZnSARKlscTev9kh0mnAxA+BOJ78j u13Y7+paqk+lG104jjYux3bhKYFpHYc3n+In/fu2N/ea7iDOAWdf6aXlYeqyF+Dtr4l8 Ne0YKsdaLPNHM0K0tZN1A7yTvmioAiTSLPasHrWH5O99ZDWLFufns3NntL+732uxDy7h MR2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=mnQmeALmRUcajqsB7R83zm9F0Xm5SsLX7IbLzEfo1Y4=; b=YtAerxoFgmZXmySvvB0Wk1qgBL5eSJSxPpwWe/y0KYAHhYkut/1VzBxtcfhsl/GTZy Lci4aJuBU6C94qRyWKI+pf6oqtj1nADPuvLTr4gqTEpwYJ278vba4NT719rdWJ7ft9zg FY0ymfqUCHN/O7f9hT5gggCSdomNqv+j+1FxG6F9zVO4TaBwjFD6ekYQ9j/1txGJqLBT VD/ysJmfQPVRp7w9c8ghGRZOhZUmBHjkybhtpNaDlhZ45pp06TjA2bhn0zvGOZA4cUlf F+QcvH5HK00tOlHIEXwE/voiPGvUIUc+bRBtIy80UpFhXK3vR+cP7JtsQKfaPcDDH9Bi rAbA== X-Gm-Message-State: ABuFfogmvhnL2auWfUuTHeoDaH91VgOkI7kAtAr3dcnt2SxpL3nlJsgE +8fnJBDLd19j+niCJNzokHw= X-Google-Smtp-Source: ACcGV60v6nLmvS0hv+85Nyn2Lw9tn5kEhMLTx1Gy55gE/gyzNWmiRqFSe5QfYFLpOcvSzrxLz7orfQ== X-Received: by 2002:ac2:5082:: with SMTP id f2-v6mr1899668lfm.47.1538248251324; Sat, 29 Sep 2018 12:10:51 -0700 (PDT) Received: from localhost.localdomain (c80-216-12-205.bredband.comhem.se. [80.216.12.205]) by smtp.gmail.com with ESMTPSA id c14-v6sm1638494lfi.23.2018.09.29.12.10.50 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 29 Sep 2018 12:10:50 -0700 (PDT) From: =?utf-8?b?Tmd1eeG7hW4gVGjDoWkgTmfhu41jIER1eQ==?= To: pclouds@gmail.com Cc: git@vger.kernel.org, newren@gmail.com, peff@peff.net, Junio C Hamano , Eric Sunshine , Stefan Beller Subject: [PATCH v2 8/8] reflog expire: cover reflog from all worktrees Date: Sat, 29 Sep 2018 21:10:29 +0200 Message-Id: <20180929191029.13994-9-pclouds@gmail.com> X-Mailer: git-send-email 2.19.0.341.g3acb95d729 In-Reply-To: <20180929191029.13994-1-pclouds@gmail.com> References: <20180922180500.4689-1-pclouds@gmail.com> <20180929191029.13994-1-pclouds@gmail.com> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Reported-by: Jeff King Signed-off-by: Nguyễn Thái Ngọc Duy --- Documentation/git-reflog.txt | 7 ++++++- builtin/reflog.c | 22 +++++++++++++++++++--- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/Documentation/git-reflog.txt b/Documentation/git-reflog.txt index 472a6808cd..ff487ff77d 100644 --- a/Documentation/git-reflog.txt +++ b/Documentation/git-reflog.txt @@ -20,7 +20,7 @@ depending on the subcommand: 'git reflog' ['show'] [log-options] [] 'git reflog expire' [--expire=