From patchwork Sun Oct 21 08:08:52 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Duy Nguyen X-Patchwork-Id: 10650721 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 A060813A4 for ; Sun, 21 Oct 2018 08:09:15 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 93B7128724 for ; Sun, 21 Oct 2018 08:09:15 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 87FAD28745; Sun, 21 Oct 2018 08:09:15 +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 BC44D2873B for ; Sun, 21 Oct 2018 08:09:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727181AbeJUQWh (ORCPT ); Sun, 21 Oct 2018 12:22:37 -0400 Received: from mail-lf1-f65.google.com ([209.85.167.65]:46914 "EHLO mail-lf1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727086AbeJUQWh (ORCPT ); Sun, 21 Oct 2018 12:22:37 -0400 Received: by mail-lf1-f65.google.com with SMTP id p143-v6so17033867lfp.13 for ; Sun, 21 Oct 2018 01:09:06 -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=A3NlXQApNvjvO4CGlOW1A6N96Ozt0nK0pUI7y3rSL24=; b=scfULQb06ArblhwSqNc6fnTd+A92xMVhYOAYpz4uzbLbm/Ke0V87BmuiSW0kGzgU+E Sx+S9FAj4cwEHqN4/UZHx8OYF3a5J8fmWQTD7fSulLgrXf1Na199cTIHhggwuudEkPSS ta58MIqupCYU9fNt6EtJ3cw2mpBrUepJr8XmE/qbgD/4rkwIGPY8CVLRaEbcOh3gZJS/ Wj+BPJl7RHlY+y6Ots4U1FMwwMGAZ7KynMsT5Nb6YIacQfqPqqH4D0To+PQV29S8o8nB KwQPIfefm3VUFaT7MrQh437GsdxAGl2O63d4Nal3dOYz95MiyfFlPTMjaro24u4nPrcn aj1Q== 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=A3NlXQApNvjvO4CGlOW1A6N96Ozt0nK0pUI7y3rSL24=; b=uMGf4LxJFDD2oEvU+l9hw659dZd3lKK4WLnrAsKsQ0rAUzp+ba2ZkTjcZ7Mq01vazf C7hkSQpzMJ3CClzpsndoplqFF88kI0WVbGQeo26reQYEhEWzR1La8vOz6q2fSliUzsv8 oSGqul7LTn3x4lGNpESRHuWD5cgez+LuEATZPnmxE4KMx21gPSj+qKq2Xiy6OpzvCtpm roFTEAOIgqkcCgF5DDfFLEWtbt9rH3yXetFnF/0pqOz3YFnDERJil+pF+oTP/g4x4zdz I5jCpnI9zKrAx5/iV22uAHVFxC9NAUuGmUZtMKleq8xxzcsEtpqsJg1TAR9Gw7mJxYeL UQ5w== X-Gm-Message-State: ABuFfohIX7hAluJCkQOlA5pk0PxeHU2GJHeD5oqgs8yTZV2Atv17W1lY O9Mg4Ar8uAZI+cDKmPR2R78= X-Google-Smtp-Source: ACcGV61jWt0Srg3LLMft7EMIfa7fNSa+yxOxxq9zvE5t5lzYW756tSd+J8mnsD1rRPNE5ICYOMs4VA== X-Received: by 2002:a19:cf8d:: with SMTP id f135-v6mr6524657lfg.53.1540109345574; Sun, 21 Oct 2018 01:09:05 -0700 (PDT) Received: from localhost.localdomain (c80-216-12-205.bredband.comhem.se. [80.216.12.205]) by smtp.gmail.com with ESMTPSA id k9-v6sm6385889lje.51.2018.10.21.01.09.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 21 Oct 2018 01:09:04 -0700 (PDT) From: =?utf-8?b?Tmd1eeG7hW4gVGjDoWkgTmfhu41jIER1eQ==?= To: pclouds@gmail.com Cc: git@vger.kernel.org, gitster@pobox.com, newren@gmail.com, peff@peff.net, sbeller@google.com Subject: [PATCH v3 1/8] refs.c: indent with tabs, not spaces Date: Sun, 21 Oct 2018 10:08:52 +0200 Message-Id: <20181021080859.3203-2-pclouds@gmail.com> X-Mailer: git-send-email 2.19.1.647.g708186aaf9 In-Reply-To: <20181021080859.3203-1-pclouds@gmail.com> References: <20180929191029.13994-1-pclouds@gmail.com> <20181021080859.3203-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 bbcac921b6..f07c775b50 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 Sun Oct 21 08:08:53 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Duy Nguyen X-Patchwork-Id: 10650719 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 4466590 for ; Sun, 21 Oct 2018 08:09:15 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 36B8428724 for ; Sun, 21 Oct 2018 08:09:15 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2AC5428748; Sun, 21 Oct 2018 08:09:15 +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 6A50828724 for ; Sun, 21 Oct 2018 08:09:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727208AbeJUQWj (ORCPT ); Sun, 21 Oct 2018 12:22:39 -0400 Received: from mail-lf1-f67.google.com ([209.85.167.67]:41233 "EHLO mail-lf1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726980AbeJUQWj (ORCPT ); Sun, 21 Oct 2018 12:22:39 -0400 Received: by mail-lf1-f67.google.com with SMTP id q39-v6so28055825lfi.8 for ; Sun, 21 Oct 2018 01:09:08 -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=mYyrS0ZjKHg+JfLKDYlAVRiX3qQ4IYEDl6VNCVtURj0=; b=DZStiD+ZozPeNThplKjxMbpxM8r2ZirauaHBqvMgJieblZokt/MecXdvX14kTDgrxM kxQdLGDHq2/gs/1Tc5rAxRTvjUd5SrQU6Jb25LXVwS6s6keaq7/Wj7L806roC8gGFztt LAMcgutkXC6ntHFA+xzpRpopD7WQLFISNkZWcXIxZEzRmDxVEuo+uKKznLo95UxBsiCT qbXISloQBK+icVBdn9ClWskT9JvGspreOceaKFLthSWplJLFDuaImc2K2mDXHC//UDUf 4TT96b6JnwcHXP9W8wAsphh9sUVIM5rL72mhx+v8cZ3WRPMrv0GEv3tf6Qm+Qb7B4Cda 0m8A== 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=mYyrS0ZjKHg+JfLKDYlAVRiX3qQ4IYEDl6VNCVtURj0=; b=lHKOtRGM/Srs9wayuqFH+wJaHwv7kTIonjrcgiToyhrUDJYlwhTBRnPKoaPPa6Z5HQ kY4BmwZCuUCWmUavZ40dSa7rxxSWG6JYNtzvTK5ohA+OzTi2+UyEW45F83c1qAWIodIq P9/adN9+gxFVr62EqgzZ0ZaKSmuz0OzTCwL23R4+VBUEUY0u9QtyElvLl2XhRVr2EXDe Digf8ubPRnem5KH/pxFsauwrOOM/hi3GTjgB9KfhCyw3xa8PW+6S5Tbx/WXPmbgrWSEP 0fkOTmxUJ9o16CHoxyJ7BOW+Me8q69rqD4CvbA8DlIM/HurIjt24N7EVbHtC8d7VuDu7 Fddw== X-Gm-Message-State: ABuFfojGVshypb2dLOlErw71Ba2O1DrhwVxlPRsw5be4JQ5RpX3H9fma x6nXAs8yt9zod8d0WRRUWsY= X-Google-Smtp-Source: ACcGV60i2iP9SLfoMTkNd4lbcJzT3RBHralNPjcSdZWZyOuvtB42wpxgPvTi8Fz9OA2qCD8X9OfjQg== X-Received: by 2002:a19:288c:: with SMTP id o134-v6mr7289885lfo.124.1540109347283; Sun, 21 Oct 2018 01:09:07 -0700 (PDT) Received: from localhost.localdomain (c80-216-12-205.bredband.comhem.se. [80.216.12.205]) by smtp.gmail.com with ESMTPSA id k9-v6sm6385889lje.51.2018.10.21.01.09.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 21 Oct 2018 01:09:06 -0700 (PDT) From: =?utf-8?b?Tmd1eeG7hW4gVGjDoWkgTmfhu41jIER1eQ==?= To: pclouds@gmail.com Cc: git@vger.kernel.org, gitster@pobox.com, newren@gmail.com, peff@peff.net, sbeller@google.com Subject: [PATCH v3 2/8] Add a place for (not) sharing stuff between worktrees Date: Sun, 21 Oct 2018 10:08:53 +0200 Message-Id: <20181021080859.3203-3-pclouds@gmail.com> X-Mailer: git-send-email 2.19.1.647.g708186aaf9 In-Reply-To: <20181021080859.3203-1-pclouds@gmail.com> References: <20180929191029.13994-1-pclouds@gmail.com> <20181021080859.3203-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 f07c775b50..67daf0918e 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 Sun Oct 21 08:08:54 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Duy Nguyen X-Patchwork-Id: 10650725 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 38C5A17D4 for ; Sun, 21 Oct 2018 08:09:18 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2A0372873B for ; Sun, 21 Oct 2018 08:09:18 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1C3A328724; Sun, 21 Oct 2018 08:09:18 +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 3BEF128724 for ; Sun, 21 Oct 2018 08:09:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727231AbeJUQWn (ORCPT ); Sun, 21 Oct 2018 12:22:43 -0400 Received: from mail-lj1-f194.google.com ([209.85.208.194]:38849 "EHLO mail-lj1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726980AbeJUQWn (ORCPT ); Sun, 21 Oct 2018 12:22:43 -0400 Received: by mail-lj1-f194.google.com with SMTP id k11-v6so2250292lja.5 for ; Sun, 21 Oct 2018 01:09:11 -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=+PTXgwmf50dR0T1hGKYe2V3JU1ghg5hrwVyFbGIubYA=; b=aGgiTExn2Gm5wj59/FsZGr/GtqXNeLfz4ZjVVeorQ3XSMC+H69RQkvpVzHeEh6xAZt 0JvqrRfefdHRBiBfWNu3LfuB6JXnFD/mCoMIrXfeimFSrmbfPPTF9ldGowNb7SWFTKZt yjQgS7PNStGIA6PoTUqsxDs26VGTlew4+2qv1ISMJHCSNLz/I24e1Ui2fVoOIOAT6DMZ 9TE7IqjHqvXVAVmbmL5M842XXavt6cpoQwEXSYbIMYVU/wJZXVTyM++0vuzSVwEf8Q15 p4RDd7tLe2Yu5ZVrfNPZHy2zlVogNilJXAU2vvoesRAGFTanT7Bvg0XP+f9T2IhWFbwr T+Wg== 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=+PTXgwmf50dR0T1hGKYe2V3JU1ghg5hrwVyFbGIubYA=; b=KvNacLMAUthtqVq1jZsrC7bnVT537jTJACnbb9VRczIhrvhMov8KPCrCtT6+FCv29/ MuIWUkAnrk1mAqojAARLwvuepd6HzGYOaMcTmGe+yyDon7O/By5I/yTMNMJHkBtNNoRN l+eU8MG8kvFkhxk1/XZKy1Y/OoVvVZXvCXhfjM6bl1I6IE1Jze0bdWQiV454Dl88nXJu ibcT+qTHe9M8wR5fHZ2/Mcc7BitkfObySSuy/Tq7eVo463gSRDJFnVzhDI13dQ2Dp8Mo foyQrxQ9d/eJYTYVbnvYifJkPkHpYk0YHcSz1xaYB2a5pdiCGgKZN4NQY/fGS1LM1hUa zkQA== X-Gm-Message-State: AGRZ1gIUENRUN9yXctKkII4DeICQl2eZV+HiO7H/i7o/3V9xjqWfu/qG rLnS87Ha5JaVU+vfcCGOVdeeGCTQ X-Google-Smtp-Source: AJdET5fCJ2k5oSnCLG/1RoZFccm3Q2vgg92KkbhpKn5x+grXuKtASL/BG/dEdeOG0EX2OzmNRMhUuA== X-Received: by 2002:a2e:c52:: with SMTP id o18-v6mr2377869ljd.94.1540109350142; Sun, 21 Oct 2018 01:09:10 -0700 (PDT) Received: from localhost.localdomain (c80-216-12-205.bredband.comhem.se. [80.216.12.205]) by smtp.gmail.com with ESMTPSA id k9-v6sm6385889lje.51.2018.10.21.01.09.09 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 21 Oct 2018 01:09:09 -0700 (PDT) From: =?utf-8?b?Tmd1eeG7hW4gVGjDoWkgTmfhu41jIER1eQ==?= To: pclouds@gmail.com Cc: git@vger.kernel.org, gitster@pobox.com, newren@gmail.com, peff@peff.net, sbeller@google.com Subject: [PATCH v3 3/8] refs: new ref types to make per-worktree refs visible to all worktrees Date: Sun, 21 Oct 2018 10:08:54 +0200 Message-Id: <20181021080859.3203-4-pclouds@gmail.com> X-Mailer: git-send-email 2.19.1.647.g708186aaf9 In-Reply-To: <20181021080859.3203-1-pclouds@gmail.com> References: <20180929191029.13994-1-pclouds@gmail.com> <20181021080859.3203-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 ++++++++++++++++++++++++++++++++++ worktree.c | 30 ++++++++++++++++++++++ worktree.h | 9 +++++++ 7 files changed, 153 insertions(+), 4 deletions(-) diff --git a/Documentation/git-worktree.txt b/Documentation/git-worktree.txt index a50fbf8094..9117e4fb50 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 latter 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 67daf0918e..17e4307f31 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 6cc0397679..308fa1f03b 100644 --- a/refs.h +++ b/refs.h @@ -714,9 +714,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..9183875dad 100644 --- a/refs/files-backend.c +++ b/refs/files-backend.c @@ -10,6 +10,7 @@ #include "../object.h" #include "../dir.h" #include "../chdir-notify.h" +#include "worktree.h" /* * This backend uses the following flags in `ref_update::flags` for @@ -149,6 +150,25 @@ 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; + const char *worktree_name; + int length; + + if (parse_worktree_ref(refname, &worktree_name, &length, &real_ref)) + BUG("refname %s is not a other-worktree ref", refname); + + if (worktree_name) + strbuf_addf(sb, "%s/worktrees/%.*s/logs/%s", refs->gitcommondir, + length, worktree_name, real_ref); + else + strbuf_addf(sb, "%s/logs/%s", refs->gitcommondir, + real_ref); +} + static void files_reflog_path(struct files_ref_store *refs, struct strbuf *sb, const char *refname) @@ -158,6 +178,9 @@ 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: + case REF_TYPE_MAIN_PSEUDOREF: + return files_reflog_path_other_worktrees(refs, sb, refname); 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); + /* fallthrough */ + 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..b664e51250 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 -f .git/refs/heads/main-worktree/HEAD && + cp .git/HEAD .git/refs/heads/main-worktree/HEAD && + git rev-parse main-worktree/HEAD 2>warn && + 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 -f .git/refs/heads/worktrees/wt1/HEAD && + cp .git/HEAD .git/refs/heads/worktrees/wt1/HEAD && + git rev-parse worktrees/wt1/HEAD 2>warn && + 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 diff --git a/worktree.c b/worktree.c index b0d0b5426d..4193496f2a 100644 --- a/worktree.c +++ b/worktree.c @@ -487,6 +487,36 @@ int submodule_uses_worktrees(const char *path) return ret; } +int parse_worktree_ref(const char *worktree_ref, const char **name, + int *name_length, const char **ref) +{ + if (skip_prefix(worktree_ref, "main-worktree/", &worktree_ref)) { + if (!*worktree_ref) + return -1; + if (name) + *name = NULL; + if (name_length) + *name_length = 0; + if (ref) + *ref = worktree_ref; + return 0; + } + if (skip_prefix(worktree_ref, "worktrees/", &worktree_ref)) { + const char *slash = strchr(worktree_ref, '/'); + + if (!slash || slash == worktree_ref || !slash[1]) + return -1; + if (name) + *name = worktree_ref; + if (name_length) + *name_length = slash - worktree_ref; + if (ref) + *ref = slash + 1; + return 0; + } + return -1; +} + int other_head_refs(each_ref_fn fn, void *cb_data) { struct worktree **worktrees, **p; diff --git a/worktree.h b/worktree.h index df3fc30f73..440bb219dd 100644 --- a/worktree.h +++ b/worktree.h @@ -108,4 +108,13 @@ extern const char *worktree_git_path(const struct worktree *wt, const char *fmt, ...) __attribute__((format (printf, 2, 3))); +/* + * Parse a worktree ref (i.e. with prefix main-worktree/ or + * worktrees/) and return the position of the worktree's name and + * length (or NULL and zero if it's main worktree), and ref. + * + * All name, name_length and ref arguments could be NULL. + */ +int parse_worktree_ref(const char *worktree_ref, const char **name, + int *name_length, const char **ref); #endif From patchwork Sun Oct 21 08:08:55 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Duy Nguyen X-Patchwork-Id: 10650723 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 C56F713A4 for ; Sun, 21 Oct 2018 08:09:17 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B990E2873B for ; Sun, 21 Oct 2018 08:09:17 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id AE53828748; Sun, 21 Oct 2018 08:09:17 +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 677EC2873B for ; Sun, 21 Oct 2018 08:09:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727276AbeJUQWo (ORCPT ); Sun, 21 Oct 2018 12:22:44 -0400 Received: from mail-lj1-f193.google.com ([209.85.208.193]:33481 "EHLO mail-lj1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727219AbeJUQWo (ORCPT ); Sun, 21 Oct 2018 12:22:44 -0400 Received: by mail-lj1-f193.google.com with SMTP id z21-v6so34255502ljz.0 for ; Sun, 21 Oct 2018 01:09:12 -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=7Nfh/EXuh/GEoGmihJ63ZcnomAHgfD5xEkB9WPhSJGs=; b=OZmT4SKprDg3paI/yGWVSSvnXm+d3nvF7tKwUNRXk4HksE/o1Zsnp3+Z9f03IE/YBp BDBLwpMy38oW0zFdue2pGbJq4vHb2Vt99PSXt7vM4vD0nGNd7uEqfp4+PTZlEUIobQ8N 8pP9Vgy1WS/PqNhPs+H4qm7z1ceUfJ268GHRszqKJtLYpGiFfQHJh98IkhCVcwZnFivG ZsErKHfC0x05s1FKoysQRnvs6UWQbYfx/VcILxVWXr51CxmmsiC+2MNuR17BmgzwCquc 0YZu6/e7WQhOyUNqTbz8AE2Xp9DWjCGfmCfGY6VtJklxTwiZsWgAMpC4TY2Yt9oZGJBD 9ETg== 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=7Nfh/EXuh/GEoGmihJ63ZcnomAHgfD5xEkB9WPhSJGs=; b=LANdFp0SXHVSdFG5et8JBXT9DHY60MS2DEoMaE7Qnp2F4kvjlNblAKSfioNZIyr/2q GxGnC2p1tKYTmCIL83hEXZFyqOI/lJ36kouBkNHkV/4yPwmSq5zkyjuCGderorS2Dx6/ emj5Hqnm6GLTlE3rSI748FgPxJvHhs3MUQqTQ2ALHIy90HnpTGmAgOt8pZ0VW1QrRLiy Ic3i2UPcEESkMaSbSaLZK7sUcys6pxXYyCLOprKheZqpXpGZt4x19/fPKO3iBi1tXJXn wi2TXmsCO9tAuYsMxmvAlqrUSoVKzaKGP+m71rYWBS0DzhhlKceK6QxXLdRsi0U0IN6q XAAw== X-Gm-Message-State: ABuFfoj0c7YtSRXTP+NlK98mR1sR2ljX/90NFxNBv3GQH4L1BsOaFewi dG460Qni/jUBZ3Fd6HWzOxU= X-Google-Smtp-Source: ACcGV60KGl3emaKO684mxKruBDsPG4HKyCb6GMGbbK1nc3w2ZysNCbOewmUDXKsRQtm7hYt7qDpbFw== X-Received: by 2002:a2e:9b46:: with SMTP id o6-v6mr29062511ljj.78.1540109352014; Sun, 21 Oct 2018 01:09:12 -0700 (PDT) Received: from localhost.localdomain (c80-216-12-205.bredband.comhem.se. [80.216.12.205]) by smtp.gmail.com with ESMTPSA id k9-v6sm6385889lje.51.2018.10.21.01.09.11 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 21 Oct 2018 01:09:11 -0700 (PDT) From: =?utf-8?b?Tmd1eeG7hW4gVGjDoWkgTmfhu41jIER1eQ==?= To: pclouds@gmail.com Cc: git@vger.kernel.org, gitster@pobox.com, newren@gmail.com, peff@peff.net, sbeller@google.com Subject: [PATCH v3 4/8] revision.c: correct a parameter name Date: Sun, 21 Oct 2018 10:08:55 +0200 Message-Id: <20181021080859.3203-5-pclouds@gmail.com> X-Mailer: git-send-email 2.19.1.647.g708186aaf9 In-Reply-To: <20181021080859.3203-1-pclouds@gmail.com> References: <20180929191029.13994-1-pclouds@gmail.com> <20181021080859.3203-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 b5108b75ab..ea1d695e23 100644 --- a/revision.c +++ b/revision.c @@ -1278,13 +1278,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 Sun Oct 21 08:08:56 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Duy Nguyen X-Patchwork-Id: 10650727 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 AA9C290 for ; Sun, 21 Oct 2018 08:09:20 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9B7F128748 for ; Sun, 21 Oct 2018 08:09:20 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 8EC002874C; Sun, 21 Oct 2018 08:09:20 +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 03E8B28724 for ; Sun, 21 Oct 2018 08:09:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727323AbeJUQWq (ORCPT ); Sun, 21 Oct 2018 12:22:46 -0400 Received: from mail-lj1-f194.google.com ([209.85.208.194]:40871 "EHLO mail-lj1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726980AbeJUQWp (ORCPT ); Sun, 21 Oct 2018 12:22:45 -0400 Received: by mail-lj1-f194.google.com with SMTP id r83-v6so34224573ljr.7 for ; Sun, 21 Oct 2018 01:09:13 -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=/PyQPX0EzNSjUgvAQKnlu8lJtGLDIZ2XbHC08HR/v2w=; b=hySgAKfNoI340OOL8ww+6MexU8GBgpdwrff10U/+Du/2wIErD4SamJIvoLk0EcDSqf 9HYU/69n/vxuQOBHOqRBC19w0X0NQFTj1gnRgaawVECJ6iNpBrJ7aFGP2q7vtB2k8mny NaShCmKmBSiwpvnwnfLrMV++wJdG59Cppg3yrJgDlOi/qCAeaKrZWnlVOUpASVoqA6y8 daekEJdsyOgbJlO1FC1wVVvutoQ3dHx/r/oxJ6zNCKVkHhA0yX7jd4JlBstHE7Ziok6o aiQKDK2RL4RM8Bf6pIya5EJjae1tx0n+6ri91q/SR/lf+CldgRzZfMKHCkH66Pj+pHgR s3Pg== 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=/PyQPX0EzNSjUgvAQKnlu8lJtGLDIZ2XbHC08HR/v2w=; b=e1y/oh9DExvz9X+7pMTRcFRY1aPUkXwEYlhuPDgXtzogelMAhNskt0jxShDlfzk8Rb ci9KAeD2CvEzwJgUfWUvMCEZL/acg+AC0JAumpSpCbgtHnpu6/4wO+2FCZsZICWeq5t0 huXDTkYOWoCCpd/Iyl2Bx/C3nk/gI3P14IDqhWqZ5B67Yahb+tE7E1s0bvUh4x7p614E E9K/mRCbo8UbJNvB69ktIxLm4fPpSb4wBYE6gFC2ncRU96ksPtAX/K+fAvU9MYJotEc/ U32yzEEFZhBPLZ1Qorr3FOSaFNdc19bu30xfDqUZsfk/Azfzh/sirsD1BZjhQbQiexQy jnRg== X-Gm-Message-State: ABuFfog+Za3Sy6rbBu17lM5HPfgMWiIbdptGmuIfLiopwhKkajo7psw3 JTnJdDE5lbtVmNcGvUs0VujiwZu9 X-Google-Smtp-Source: ACcGV63/ZSaDKpSpJEZ7bkaZYoT1APWJYTyYO3FGcsC9BKUzTlKIPMqbZDtJBtcdL60Tpph2H7X6lA== X-Received: by 2002:a2e:980f:: with SMTP id a15-v6mr29491887ljj.6.1540109353126; Sun, 21 Oct 2018 01:09:13 -0700 (PDT) Received: from localhost.localdomain (c80-216-12-205.bredband.comhem.se. [80.216.12.205]) by smtp.gmail.com with ESMTPSA id k9-v6sm6385889lje.51.2018.10.21.01.09.12 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 21 Oct 2018 01:09:12 -0700 (PDT) From: =?utf-8?b?Tmd1eeG7hW4gVGjDoWkgTmfhu41jIER1eQ==?= To: pclouds@gmail.com Cc: git@vger.kernel.org, gitster@pobox.com, newren@gmail.com, peff@peff.net, sbeller@google.com Subject: [PATCH v3 5/8] revision.c: better error reporting on ref from different worktrees Date: Sun, 21 Oct 2018 10:08:56 +0200 Message-Id: <20181021080859.3203-6-pclouds@gmail.com> X-Mailer: git-send-email 2.19.1.647.g708186aaf9 In-Reply-To: <20181021080859.3203-1-pclouds@gmail.com> References: <20180929191029.13994-1-pclouds@gmail.com> <20181021080859.3203-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 | 49 ++++++++++++++++++++++++++++++++++++++++++++++--- worktree.h | 15 +++++++++++++++ 3 files changed, 74 insertions(+), 11 deletions(-) diff --git a/revision.c b/revision.c index ea1d695e23..1737aad3ec 100644 --- a/revision.c +++ b/revision.c @@ -1178,7 +1178,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) @@ -1215,7 +1215,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) @@ -1278,15 +1278,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; } @@ -1301,8 +1306,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); } @@ -1315,7 +1320,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(revs->repo); + cb.wt = NULL; for_each_reflog(handle_one_reflog, &cb); if (!revs->single_worktree) diff --git a/worktree.c b/worktree.c index 4193496f2a..e6a65ec684 100644 --- a/worktree.c +++ b/worktree.c @@ -517,6 +517,45 @@ int parse_worktree_ref(const char *worktree_ref, const char **name, return -1; } +void strbuf_worktree_ref(const struct worktree *wt, + struct strbuf *sb, + const char *refname) +{ + switch (ref_type(refname)) { + case REF_TYPE_PSEUDOREF: + case REF_TYPE_PER_WORKTREE: + if (wt && !wt->is_current) { + if (is_main_worktree(wt)) + strbuf_addstr(sb, "main-worktree/"); + else + strbuf_addf(sb, "worktrees/%s/", wt->id); + } + break; + + case REF_TYPE_MAIN_PSEUDOREF: + case REF_TYPE_OTHER_PSEUDOREF: + break; + + case REF_TYPE_NORMAL: + /* + * For shared refs, don't prefix worktrees/ or + * main-worktree/. It's not necessary and + * files-backend.c can't handle it anyway. + */ + break; + } + 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; @@ -525,13 +564,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 440bb219dd..1164ca396f 100644 --- a/worktree.h +++ b/worktree.h @@ -117,4 +117,19 @@ extern const char *worktree_git_path(const struct worktree *wt, */ int parse_worktree_ref(const char *worktree_ref, const char **name, int *name_length, const char **ref); + +/* + * 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 will be destroyed at the next call. + */ +const char *worktree_ref(const struct worktree *wt, + const char *refname); + #endif From patchwork Sun Oct 21 08:08:57 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Duy Nguyen X-Patchwork-Id: 10650731 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 77ABB90 for ; Sun, 21 Oct 2018 08:09:21 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6B7532873B for ; Sun, 21 Oct 2018 08:09:21 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5FC9628748; Sun, 21 Oct 2018 08:09:21 +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 2F7B22873B for ; Sun, 21 Oct 2018 08:09:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727336AbeJUQWq (ORCPT ); Sun, 21 Oct 2018 12:22:46 -0400 Received: from mail-lf1-f68.google.com ([209.85.167.68]:38729 "EHLO mail-lf1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727219AbeJUQWq (ORCPT ); Sun, 21 Oct 2018 12:22:46 -0400 Received: by mail-lf1-f68.google.com with SMTP id x24-v6so12331389lfe.5 for ; Sun, 21 Oct 2018 01:09:14 -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=+DpLvrt58z39wqrAIBLzt5dGOySDlIdXbtXQtwJjyg0=; b=Rfftcp3Prc8x49vcXQX1Ha8FhWXvctS8FU7vKCE+3Q6cRpJs2/n2n1sCME5GsX8whm ftxKRdi1tbDmzyV6JtZGI1Rrb2eC0KguS8FpFZXFgtrOOVYQT20hmFQOdGgamTSH18fa dqH5wjx/3LvJQA2DgKGSkEavB83jZSMuYbkPW69JPqMhG3EWRdBsneBRLNPaOApX5dwl JGe7JiAFdZrQ7zt2FuOU7VjwOF8WqxOxqUX8t9SyVu6VbiuiH02Lv9XkPAUy3aWjR0Ph T4ArtY4EkWG0IDbBnz8nk7XRcgiMwrBlQi2z51UULBA+CPaehrM1eiXBaR6fZ9VB+iv5 bzaw== 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=+DpLvrt58z39wqrAIBLzt5dGOySDlIdXbtXQtwJjyg0=; b=Y+y8nACjzsbQ31eWuR1BeQ5Td/hwci/N/WHc5Ptld3kDYphDejSrGhPjQVWjm5tBUU H+eSChcvjxVbsNEHttygky+tkUMpO5UjcAwuja435OIak4YJS1dYbxfqgYKBtVvq6KDa OUFIacqOKiR/qNHQMvyWiSUPVHfqX4bcnHjsqoff8sGf+/+I+9tRITa1d7Ld2FhihCgJ oN4TMMAi14lCiTTQg2lW7PAWuLAjuZMzxezXSYkuWj0Vw6tBB3pUBLOykNrImc5n8zUI YFo07/VK8yUowh71ktds5zS4KYPTtP7qMLXP5JiiEfjaCQda0oeu7B+tRuETJ0FPKUnM YAhw== X-Gm-Message-State: ABuFfojUCXczdG3eEq3t8OLfpr5ehqhm0IKU/UcXowM1IqoGdQtikaL6 Is5yU7/rHckHrMhirjDNtkA= X-Google-Smtp-Source: ACcGV60iAltaRtoNKjBzHr1wA4qjLikZjAVB55QUkILdSvLFTAknepYcMZ9K+TontUTKGYk1Numq8A== X-Received: by 2002:a19:2b54:: with SMTP id r81mr444517lfr.34.1540109354169; Sun, 21 Oct 2018 01:09:14 -0700 (PDT) Received: from localhost.localdomain (c80-216-12-205.bredband.comhem.se. [80.216.12.205]) by smtp.gmail.com with ESMTPSA id k9-v6sm6385889lje.51.2018.10.21.01.09.13 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 21 Oct 2018 01:09:13 -0700 (PDT) From: =?utf-8?b?Tmd1eeG7hW4gVGjDoWkgTmfhu41jIER1eQ==?= To: pclouds@gmail.com Cc: git@vger.kernel.org, gitster@pobox.com, newren@gmail.com, peff@peff.net, sbeller@google.com Subject: [PATCH v3 6/8] fsck: Move fsck_head_link() to get_default_heads() to avoid some globals Date: Sun, 21 Oct 2018 10:08:57 +0200 Message-Id: <20181021080859.3203-7-pclouds@gmail.com> X-Mailer: git-send-email 2.19.1.647.g708186aaf9 In-Reply-To: <20181021080859.3203-1-pclouds@gmail.com> References: <20180929191029.13994-1-pclouds@gmail.com> <20181021080859.3203-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 06eb421720..0d39462058 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 Sun Oct 21 08:08:58 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Duy Nguyen X-Patchwork-Id: 10650729 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 46F2D17D4 for ; Sun, 21 Oct 2018 08:09:21 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 399F528745 for ; Sun, 21 Oct 2018 08:09:21 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2DD6E28748; Sun, 21 Oct 2018 08:09:21 +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 4FC5928745 for ; Sun, 21 Oct 2018 08:09:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727348AbeJUQWs (ORCPT ); Sun, 21 Oct 2018 12:22:48 -0400 Received: from mail-lj1-f193.google.com ([209.85.208.193]:39123 "EHLO mail-lj1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727291AbeJUQWs (ORCPT ); Sun, 21 Oct 2018 12:22:48 -0400 Received: by mail-lj1-f193.google.com with SMTP id p1-v6so34233585ljg.6 for ; Sun, 21 Oct 2018 01:09:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=ZAQtjldgr3Xllzn97vTv0fiD3FA5oTWY2N6klV3tFrI=; b=bh+hT0wkVJQyq0JVf+e9LsSdAjZXxqMvpmuFYhUzx8ca1xAeMU5vYyCTo5zR10n1/N xehmCkphZ1NPR71boeuTwf/fJhplNRXiRU2ozUW2XgBD/DEF6d3xkbaevXs12vHU69CN I2OR/cXctGYfhM6F8OG0V/SxhGbrKCQ3V2eWbKAPNc67mBUkCL1wwukPt1Zg0qkIOlHl aJcsOzSPFubz/TKDbtbH3qXCrveWP9jSLlS4rUtdW2Kvbcuj5ybnZr10tEvQWsrCsJvS H8JmWJshXjoI75CNnFYjBmKIjYpnRqJlLcMTuznA5P9LZMJtUsNuwlVko5e7cgvg3+5k syFQ== 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=ZAQtjldgr3Xllzn97vTv0fiD3FA5oTWY2N6klV3tFrI=; b=kafkHG6n+KTnO3i1LsB6KDTLhzlQ4yC7pSXogKKYRPHXt9ppX+1V8rE07HxO2YprXj ViaS9eYTFeWdsmmrjk1X6gYC6Ul0joTNgxuDv1/wQv9gAdDqGICK2hTGinVi44CaikEH FkvmQEDWz0l3fmIN+cMzVpTOsmIOuDdgqBDOY+Z0P2Z9WyaZj9xbRo1bqRQJj5Is+9pW nXPK64qWbHef7EsKL1qP3O8Od9H96/+Ap3SctnN4bVzd1V+TX1WzAdUm+MLGIuIK8ucO UnsXySRQInsvWKwW9jZlgc2JkJjYIKWCv9b4xBtb/Vt+zwdigWIQJbJ+mSvFBtfSiZdy uYaw== X-Gm-Message-State: ABuFfoh7BAl2N+nDKCc31B0iP7hZi+4UTXIaRUEdHZ3cU3TSCLqgKNcP ROu4SSZd3Aq/ZbCMMB0aehE= X-Google-Smtp-Source: ACcGV61XAhQFGfJG13H6OCIGaXxk+vQJHQVIEeRbTqDgF0p52Uj3mJykh45znkX+RKSgaxbw0zmHkw== X-Received: by 2002:a2e:908:: with SMTP id 8-v6mr25886723ljj.1.1540109355197; Sun, 21 Oct 2018 01:09:15 -0700 (PDT) Received: from localhost.localdomain (c80-216-12-205.bredband.comhem.se. [80.216.12.205]) by smtp.gmail.com with ESMTPSA id k9-v6sm6385889lje.51.2018.10.21.01.09.14 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 21 Oct 2018 01:09:14 -0700 (PDT) From: =?utf-8?b?Tmd1eeG7hW4gVGjDoWkgTmfhu41jIER1eQ==?= To: pclouds@gmail.com Cc: git@vger.kernel.org, gitster@pobox.com, newren@gmail.com, peff@peff.net, sbeller@google.com Subject: [PATCH v3 7/8] fsck: check HEAD and reflog from other worktrees Date: Sun, 21 Oct 2018 10:08:58 +0200 Message-Id: <20181021080859.3203-8-pclouds@gmail.com> X-Mailer: git-send-email 2.19.1.647.g708186aaf9 In-Reply-To: <20181021080859.3203-1-pclouds@gmail.com> References: <20180929191029.13994-1-pclouds@gmail.com> <20181021080859.3203-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 0d39462058..3c3e0f06e7 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..28201677d5 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-worktree/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 Sun Oct 21 08:08:59 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Duy Nguyen X-Patchwork-Id: 10650733 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 DE03813A4 for ; Sun, 21 Oct 2018 08:09:21 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D045528724 for ; Sun, 21 Oct 2018 08:09:21 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C470228745; Sun, 21 Oct 2018 08:09:21 +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 366D728724 for ; Sun, 21 Oct 2018 08:09:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727363AbeJUQWt (ORCPT ); Sun, 21 Oct 2018 12:22:49 -0400 Received: from mail-lf1-f68.google.com ([209.85.167.68]:44885 "EHLO mail-lf1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727219AbeJUQWt (ORCPT ); Sun, 21 Oct 2018 12:22:49 -0400 Received: by mail-lf1-f68.google.com with SMTP id m18-v6so28081093lfl.11 for ; Sun, 21 Oct 2018 01:09:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=KQSJ/OJiKdgDiHynUxM85a5wcFSvPZI24npdJx7rbnc=; b=EDctusfSNmL1YqLUnvz84vZOpjp1Eaqc5Qs9mczX6zX+67P22zmwVPfMHtxh1KAZ1l lzVYzNDG1X0vXSOmayRpjHbeNBMik+t2HyMZazXCa/mxwE2jc6sp0uAPYv+fwcKfOwRS YVqg88jbLWlTYFOOnRnhwQLBRHbBwcpTnNWnX5dGBzzxxECM+bkqoEB1sQaPf30vwQrx eA3uY3BOJZLfi2l6pkrYLWcHcBjRcXcJUCTlDgyncFYwp6AbJWw6ZGIskhXcmqK2s7nw Qljp9o+7bAUi+h5diEANOR/Uo/ejzuVLsA8l/5v4gMbCBBhikBpbmoNIUEyF0460d4wb Va5g== 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=KQSJ/OJiKdgDiHynUxM85a5wcFSvPZI24npdJx7rbnc=; b=GilIxvcSBYGlGwsk5jn8t3zrp/DsdcDXGHAZxjhGpLFP0buMChtWCSdMOQXwubZi6G GazmmJjWDE7xb8AN0qlc7ZHou5Nb5uEVNaakJ3PC6bWWVquvWDJdPstCVICN5LmGHtPg xXCkHZQXxXD0TfVbxe9f1HsVigk5o6FdJmGV3QDskOZ2ADlZuVAtE9KPXOW2DJiDxwFt kMz+RIye2E+BnttzS6LNQD37ZF9JKdcjhybBAoJ7cbEG4VyYkyhmgmRt6KbY8469Jd34 3d2i7J2NPXvfNbc000ukyADFtlx4HRiVgJd8/o4TmX6INA3txPFJsnlsAaVb4nPsgSYu 7M7A== X-Gm-Message-State: ABuFfojsEkNhtRU5d78rkwsl9zszS6pm3SIytKxHRRw+tYHtBaicwRRy gOt13XzuAQIEtc+OuHrfHlQ= X-Google-Smtp-Source: ACcGV60O0VD5/mP+ElHnWOcw/ApPyt+P0fpZcwYP7Z8LTVfvHYUH3GnBzn49VvIaJD0ckVpQhXnkhw== X-Received: by 2002:a19:1202:: with SMTP id h2mr992945lfi.122.1540109356597; Sun, 21 Oct 2018 01:09:16 -0700 (PDT) Received: from localhost.localdomain (c80-216-12-205.bredband.comhem.se. [80.216.12.205]) by smtp.gmail.com with ESMTPSA id k9-v6sm6385889lje.51.2018.10.21.01.09.15 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 21 Oct 2018 01:09:15 -0700 (PDT) From: =?utf-8?b?Tmd1eeG7hW4gVGjDoWkgTmfhu41jIER1eQ==?= To: pclouds@gmail.com Cc: git@vger.kernel.org, gitster@pobox.com, newren@gmail.com, peff@peff.net, sbeller@google.com Subject: [PATCH v3 8/8] reflog expire: cover reflog from all worktrees Date: Sun, 21 Oct 2018 10:08:59 +0200 Message-Id: <20181021080859.3203-9-pclouds@gmail.com> X-Mailer: git-send-email 2.19.1.647.g708186aaf9 In-Reply-To: <20181021080859.3203-1-pclouds@gmail.com> References: <20180929191029.13994-1-pclouds@gmail.com> <20181021080859.3203-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 | 46 ++++++++++++++++++++++++++++++++---- t/t1410-reflog.sh | 15 ++++++++++++ 3 files changed, 63 insertions(+), 5 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=