From patchwork Sat Mar 16 01:38:05 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nickolai Belakovski X-Patchwork-Id: 10855669 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 A73FA1880 for ; Sat, 16 Mar 2019 01:38:31 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8E2812ABA8 for ; Sat, 16 Mar 2019 01:38:31 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 821EE2AC3D; Sat, 16 Mar 2019 01:38:31 +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 5FEBC2AC3E for ; Sat, 16 Mar 2019 01:38:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726688AbfCPBi0 (ORCPT ); Fri, 15 Mar 2019 21:38:26 -0400 Received: from mail-pg1-f193.google.com ([209.85.215.193]:44001 "EHLO mail-pg1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726649AbfCPBiZ (ORCPT ); Fri, 15 Mar 2019 21:38:25 -0400 Received: by mail-pg1-f193.google.com with SMTP id l11so7589236pgq.10 for ; Fri, 15 Mar 2019 18:38:25 -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; bh=8+XtTxtpx239s3GzcMWaH2iyT0LVbC9sqeYeDC4xRWY=; b=oxSOJ/v1NQN5Am+MBU1e0v0+PQ3mFdHU47NuY2urxfADcksKvON0cWEtzxsQkcTneA uiReFwD+OSv6YBx6fkBiq8KzH+DG/jo6vPbGIIxr2xhBnNAdB148ZTZmhnoHDBMVNyOr 28FoN3XmshG/nRBLdrjFO2JUIitvsrz2BWOSBWAvgsp3KxeJgNXFjX4W/rzHE7hSo4Em pOfQufqdtfOBDzwDX5DFI4CiQGL1T+rXJU+TXfrl59MMTPIhHb9DfgSKtJBhqKIVdUMs JoJLDwIlES2MYc9jFogA06r84j73kKVHX2iMllO4tX58aoLLQZ9Jpyt6Ony78vuAc3K3 KAWw== 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; bh=8+XtTxtpx239s3GzcMWaH2iyT0LVbC9sqeYeDC4xRWY=; b=bqk0kEIkPtzq3Z9Xt+dwT9fla+xEEISgIurPrTa8r9W82+P/JcmcCqUiYAhPC8jvOK GX/wKBsCGxqOKa0qa56YVAKtGbjkXDtnOlaaYUAHtbR86bGvVRxqjAfjTbag61sIXn9a frwKGBU9zEtUTStHJC3zng1e8IGQyrShDjPYtkskVdEaSwhS9Cysw/Z2+XiEoJ1FYV/N iHLshDWXPnQTMX9XnKak7LETPvUNP4GQw44mMB9aLy8uDdwPugUXbegTQi4hdZUmPS+7 FD03QHRKv7eF5iuNw0mqehpHuWwGqA5s8i5tFs9e6Zx9kwGc8NN4nmtX0Ar+3ckJChPn ysfA== X-Gm-Message-State: APjAAAXoBcty7TWpxgCaULjxBjLNmwrEdbYNo5hIv9Nq+Iyd0EntcEni zBONAyuznRoM/EjfQuVb6dIBG+kU X-Google-Smtp-Source: APXvYqyu8cWzZ4AjrQmWuyvrlTZ9O0pseV1G4PP1843BXc5isTBVMQQZAxn6nTT6Gh1ZjbC7vuIcxg== X-Received: by 2002:a17:902:9683:: with SMTP id n3mr7462637plp.333.1552700304389; Fri, 15 Mar 2019 18:38:24 -0700 (PDT) Received: from localhost.localdomain (173-8-128-22-SFBA.hfc.comcastbusiness.net. [173.8.128.22]) by smtp.gmail.com with ESMTPSA id b138sm5817623pfb.48.2019.03.15.18.38.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 15 Mar 2019 18:38:23 -0700 (PDT) From: nbelakovski@gmail.com To: git@vger.kernel.org Cc: peff@peff.net, gitster@pobox.com, rafa.almas@gmail.com, avarab@gmail.com, Nickolai Belakovski Subject: [PATCH v9 1/3] ref-filter: add worktreepath atom Date: Fri, 15 Mar 2019 18:38:05 -0700 Message-Id: <20190316013807.38756-2-nbelakovski@gmail.com> X-Mailer: git-send-email 2.14.2 In-Reply-To: <20190316013807.38756-1-nbelakovski@gmail.com> References: <20190316013807.38756-1-nbelakovski@gmail.com> Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Nickolai Belakovski Add an atom providing the path of the linked worktree where this ref is checked out, if it is checked out in any linked worktrees, and empty string otherwise. Signed-off-by: Nickolai Belakovski --- Documentation/git-for-each-ref.txt | 5 +++ ref-filter.c | 78 ++++++++++++++++++++++++++++++++++++++ t/t6302-for-each-ref-filter.sh | 13 +++++++ 3 files changed, 96 insertions(+) diff --git a/Documentation/git-for-each-ref.txt b/Documentation/git-for-each-ref.txt index 774cecc7ed..6dcd39f6f6 100644 --- a/Documentation/git-for-each-ref.txt +++ b/Documentation/git-for-each-ref.txt @@ -214,6 +214,11 @@ symref:: `:lstrip` and `:rstrip` options in the same way as `refname` above. +worktreepath:: + The absolute path to the worktree in which the ref is checked + out, if it is checked out in any linked worktree. Empty string + otherwise. + In addition to the above, for commit and tag objects, the header field names (`tree`, `parent`, `object`, `type`, and `tag`) can be used to specify the value in the header field. diff --git a/ref-filter.c b/ref-filter.c index 3aca105307..79cfec914a 100644 --- a/ref-filter.c +++ b/ref-filter.c @@ -20,6 +20,8 @@ #include "commit-slab.h" #include "commit-graph.h" #include "commit-reach.h" +#include "worktree.h" +#include "hashmap.h" static struct ref_msg { const char *gone; @@ -75,6 +77,27 @@ static struct expand_data { struct object_info info; } oi, oi_deref; +struct ref_to_worktree_entry { + struct hashmap_entry ent; /* must be the first member! */ + struct worktree *wt; /* key is wt->head_ref */ +}; + +static int ref_to_worktree_map_cmpfnc(const void *unused_lookupdata, + const void *existing_hashmap_entry_to_test, + const void *key, + const void *keydata_aka_refname) +{ + const struct ref_to_worktree_entry *e = existing_hashmap_entry_to_test; + const struct ref_to_worktree_entry *k = key; + return strcmp(e->wt->head_ref, + keydata_aka_refname ? keydata_aka_refname : k->wt->head_ref); +} + +static struct ref_to_worktree_map { + struct hashmap map; + struct worktree **worktrees; +} ref_to_worktree_map; + /* * An atom is a valid field atom listed below, possibly prefixed with * a "*" to denote deref_tag(). @@ -480,6 +503,7 @@ static struct { { "flag", SOURCE_NONE }, { "HEAD", SOURCE_NONE, FIELD_STR, head_atom_parser }, { "color", SOURCE_NONE, FIELD_STR, color_atom_parser }, + { "worktreepath", SOURCE_NONE }, { "align", SOURCE_NONE, FIELD_STR, align_atom_parser }, { "end", SOURCE_NONE }, { "if", SOURCE_NONE, FIELD_STR, if_atom_parser }, @@ -1529,6 +1553,48 @@ static int get_object(struct ref_array_item *ref, int deref, struct object **obj return 0; } +static void populate_worktree_map(struct hashmap *map, struct worktree **worktrees) +{ + int i; + + for (i = 0; worktrees[i]; i++) { + if (worktrees[i]->head_ref) { + struct ref_to_worktree_entry *entry; + entry = xmalloc(sizeof(*entry)); + entry->wt = worktrees[i]; + hashmap_entry_init(entry, strhash(worktrees[i]->head_ref)); + + hashmap_add(map, entry); + } + } +} + +static void lazy_init_worktree_map(void) +{ + if (ref_to_worktree_map.worktrees) + return; + + ref_to_worktree_map.worktrees = get_worktrees(0); + hashmap_init(&(ref_to_worktree_map.map), ref_to_worktree_map_cmpfnc, NULL, 0); + populate_worktree_map(&(ref_to_worktree_map.map), ref_to_worktree_map.worktrees); +} + +static char *get_worktree_path(const struct used_atom *atom, const struct ref_array_item *ref) +{ + struct hashmap_entry entry; + struct ref_to_worktree_entry *lookup_result; + + lazy_init_worktree_map(); + + hashmap_entry_init(&entry, strhash(ref->refname)); + lookup_result = hashmap_get(&(ref_to_worktree_map.map), &entry, ref->refname); + + if (lookup_result) + return xstrdup(lookup_result->wt->path); + else + return xstrdup(""); +} + /* * Parse the object referred by ref, and grab needed value. */ @@ -1566,6 +1632,13 @@ static int populate_value(struct ref_array_item *ref, struct strbuf *err) if (starts_with(name, "refname")) refname = get_refname(atom, ref); + else if (!strcmp(name, "worktreepath")) { + if (ref->kind == FILTER_REFS_BRANCHES) + v->s = get_worktree_path(atom, ref); + else + v->s = xstrdup(""); + continue; + } else if (starts_with(name, "symref")) refname = get_symref(atom, ref); else if (starts_with(name, "upstream")) { @@ -2049,6 +2122,11 @@ void ref_array_clear(struct ref_array *array) free_array_item(array->items[i]); FREE_AND_NULL(array->items); array->nr = array->alloc = 0; + if (ref_to_worktree_map.worktrees) { + hashmap_free(&(ref_to_worktree_map.map), 1); + free_worktrees(ref_to_worktree_map.worktrees); + ref_to_worktree_map.worktrees = NULL; + } } static void do_merge_filter(struct ref_filter_cbdata *ref_cbdata) diff --git a/t/t6302-for-each-ref-filter.sh b/t/t6302-for-each-ref-filter.sh index fc067ed672..35408d53fd 100755 --- a/t/t6302-for-each-ref-filter.sh +++ b/t/t6302-for-each-ref-filter.sh @@ -441,4 +441,17 @@ test_expect_success '--merged is incompatible with --no-merged' ' test_must_fail git for-each-ref --merged HEAD --no-merged HEAD ' +test_expect_success 'validate worktree atom' ' + cat >expect <<-EOF && + master: $(pwd) + master_worktree: $(pwd)/worktree_dir + side: not checked out + EOF + git worktree add -b master_worktree worktree_dir master && + git for-each-ref --format="%(refname:short): %(if)%(worktreepath)%(then)%(worktreepath)%(else)not checked out%(end)" refs/heads/ >actual && + rm -r worktree_dir && + git worktree prune && + test_cmp expect actual +' + test_done From patchwork Sat Mar 16 01:38:06 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nickolai Belakovski X-Patchwork-Id: 10855673 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 EDA181669 for ; Sat, 16 Mar 2019 01:38:38 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D5E282AC2F for ; Sat, 16 Mar 2019 01:38:38 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C94032AC3F; Sat, 16 Mar 2019 01:38:38 +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 350CD2AC31 for ; Sat, 16 Mar 2019 01:38:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726697AbfCPBia (ORCPT ); Fri, 15 Mar 2019 21:38:30 -0400 Received: from mail-pg1-f194.google.com ([209.85.215.194]:46893 "EHLO mail-pg1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726649AbfCPBia (ORCPT ); Fri, 15 Mar 2019 21:38:30 -0400 Received: by mail-pg1-f194.google.com with SMTP id a22so7571009pgg.13 for ; Fri, 15 Mar 2019 18:38:29 -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; bh=1qqn3LRy77vxD0232fOQ2ZHhJEYFv+LPoLGpJdYLriw=; b=KkkxsZN3N1p0WeK4S+VAAXd8FPRCXSQQcX1OiQCfRlPMIzl/flmE805zpJbJWzlH7U c/a7NLfGaKaIPD/9CWUKoMu+lk2ngjH8G77Sq4aEjfB4NxQhg5NTWI93DoOt964RAavu 1f4GemFihvJED/eTW4zzS3sWzZOlBF3U/q3Ex4pnZHog47dB3ToT/ReNdcFTUF16fWvW KYi9isg6E+kOmv0mIaV0Z6r7RQeEsKfRqLVC9WUS3ybZslrBOlu1wg74mw5ihltQ9dV8 ksHqnVUIswLZnJxdEZRjssDiNMT+rMllW3/Fi7ERf28HURvSlxScy608bt4pn131mh4G /BaQ== 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; bh=1qqn3LRy77vxD0232fOQ2ZHhJEYFv+LPoLGpJdYLriw=; b=Q6NXmWCLz8lk54RJ3JTXSXyEJ3X4edjqRzKDY3G70x7s+PZc7478hAslmz3eoMdWZ6 bVuIr6OfbOOZcGDhubfvAfIUumXWuWgzI1rlx1kxgDCNw7B4dyoCBHkVaFb1dk+1k6JO SkpIMfV98mhr4Q0YcRZ0RzqYZXyEbIao/qXLjDvK5PIvxhWq8lnDuU264o+xwm+/+06k EsZ4so3Gznx4a7HThCRsUnWmmK9E30SkG4I5AqUh7y7wXFYgMJ7kmvfW/KcPcG+ZWn3v +y2v1Zy+a7KMFrlLs23mEK5CB0GBHSCyQ1jHi32WU9XY7kh9rO8wW7pyqr7ito/MBsBe gZ/A== X-Gm-Message-State: APjAAAU/NPjDwP27QIRD+cNBBt/GUbG90YB+DTe3i9jziAdRE8j4+lCU mPabUo7PYnfVOSFoEXJ0pBn9Ajm9 X-Google-Smtp-Source: APXvYqxzSP5DOk0gJRGzp5PEVYWmOmkUZnmy2RvM82ShCaL0Og0UXMQREak8H+VI5mw7g97NkYsQxQ== X-Received: by 2002:a63:5321:: with SMTP id h33mr6336593pgb.168.1552700308673; Fri, 15 Mar 2019 18:38:28 -0700 (PDT) Received: from localhost.localdomain (173-8-128-22-SFBA.hfc.comcastbusiness.net. [173.8.128.22]) by smtp.gmail.com with ESMTPSA id b138sm5817623pfb.48.2019.03.15.18.38.26 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 15 Mar 2019 18:38:28 -0700 (PDT) From: nbelakovski@gmail.com To: git@vger.kernel.org Cc: peff@peff.net, gitster@pobox.com, rafa.almas@gmail.com, avarab@gmail.com, Nickolai Belakovski Subject: [PATCH v9 2/3] branch: update output to include worktree info Date: Fri, 15 Mar 2019 18:38:06 -0700 Message-Id: <20190316013807.38756-3-nbelakovski@gmail.com> X-Mailer: git-send-email 2.14.2 In-Reply-To: <20190316013807.38756-1-nbelakovski@gmail.com> References: <20190316013807.38756-1-nbelakovski@gmail.com> Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Nickolai Belakovski The output of git branch is modified to mark branches checked out in a linked worktree with a "+" and color them in cyan (in contrast to the current branch, which will still be denoted with a "*" and colored in green) This is meant to communicate to the user that the branches that are marked or colored will behave differently from other branches if the user attempts to check them out or delete them, since branches checked out in another worktree cannot be checked out or deleted. Signed-off-by: Nickolai Belakovski --- Documentation/git-branch.txt | 6 ++++-- builtin/branch.c | 12 ++++++++---- t/t3200-branch.sh | 16 +++++++++++----- t/t3203-branch-output.sh | 24 ++++++++++++++++++++++-- 4 files changed, 45 insertions(+), 13 deletions(-) diff --git a/Documentation/git-branch.txt b/Documentation/git-branch.txt index 0cd87ddeff..7d18dffc4b 100644 --- a/Documentation/git-branch.txt +++ b/Documentation/git-branch.txt @@ -26,8 +26,10 @@ DESCRIPTION ----------- If `--list` is given, or if there are no non-option arguments, existing -branches are listed; the current branch will be highlighted with an -asterisk. Option `-r` causes the remote-tracking branches to be listed, +branches are listed; the current branch will be highlighted in green and +marked with an asterisk. Any branches checked out in linked worktrees will +be highlighted in cyan and marked with a plus sign. Option `-r` causes the +remote-tracking branches to be listed, and option `-a` shows both local and remote branches. If a `` is given, it is used as a shell wildcard to restrict the output to matching branches. If multiple patterns are given, a branch is shown if diff --git a/builtin/branch.c b/builtin/branch.c index 4c83055730..350b039063 100644 --- a/builtin/branch.c +++ b/builtin/branch.c @@ -47,6 +47,7 @@ static char branch_colors[][COLOR_MAXLEN] = { GIT_COLOR_NORMAL, /* LOCAL */ GIT_COLOR_GREEN, /* CURRENT */ GIT_COLOR_BLUE, /* UPSTREAM */ + GIT_COLOR_CYAN, /* WORKTREE */ }; enum color_branch { BRANCH_COLOR_RESET = 0, @@ -54,7 +55,8 @@ enum color_branch { BRANCH_COLOR_REMOTE = 2, BRANCH_COLOR_LOCAL = 3, BRANCH_COLOR_CURRENT = 4, - BRANCH_COLOR_UPSTREAM = 5 + BRANCH_COLOR_UPSTREAM = 5, + BRANCH_COLOR_WORKTREE = 6 }; static const char *color_branch_slots[] = { @@ -64,6 +66,7 @@ static const char *color_branch_slots[] = { [BRANCH_COLOR_LOCAL] = "local", [BRANCH_COLOR_CURRENT] = "current", [BRANCH_COLOR_UPSTREAM] = "upstream", + [BRANCH_COLOR_WORKTREE] = "worktree", }; static struct string_list output = STRING_LIST_INIT_DUP; @@ -342,9 +345,10 @@ static char *build_format(struct ref_filter *filter, int maxwidth, const char *r struct strbuf local = STRBUF_INIT; struct strbuf remote = STRBUF_INIT; - strbuf_addf(&local, "%%(if)%%(HEAD)%%(then)* %s%%(else) %s%%(end)", - branch_get_color(BRANCH_COLOR_CURRENT), - branch_get_color(BRANCH_COLOR_LOCAL)); + strbuf_addf(&local, "%%(if)%%(HEAD)%%(then)* %s%%(else)%%(if)%%(worktreepath)%%(then)+ %s%%(else) %s%%(end)%%(end)", + branch_get_color(BRANCH_COLOR_CURRENT), + branch_get_color(BRANCH_COLOR_WORKTREE), + branch_get_color(BRANCH_COLOR_LOCAL)); strbuf_addf(&remote, " %s", branch_get_color(BRANCH_COLOR_REMOTE)); diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh index 478b82cf9b..88719cc02c 100755 --- a/t/t3200-branch.sh +++ b/t/t3200-branch.sh @@ -202,18 +202,22 @@ test_expect_success 'git branch -M baz bam should succeed when baz is checked ou git worktree add -f bazdir2 baz && git branch -M baz bam && test $(git -C bazdir rev-parse --abbrev-ref HEAD) = bam && - test $(git -C bazdir2 rev-parse --abbrev-ref HEAD) = bam + test $(git -C bazdir2 rev-parse --abbrev-ref HEAD) = bam && + rm -r bazdir bazdir2 && + git worktree prune ' test_expect_success 'git branch -M baz bam should succeed within a worktree in which baz is checked out' ' git checkout -b baz && - git worktree add -f bazdir3 baz && + git worktree add -f bazdir baz && ( - cd bazdir3 && + cd bazdir && git branch -M baz bam && test $(git rev-parse --abbrev-ref HEAD) = bam ) && - test $(git rev-parse --abbrev-ref HEAD) = bam + test $(git rev-parse --abbrev-ref HEAD) = bam && + rm -r bazdir && + git worktree prune ' test_expect_success 'git branch -M master should work when master is checked out' ' @@ -774,7 +778,9 @@ test_expect_success 'test deleting branch without config' ' test_expect_success 'deleting currently checked out branch fails' ' git worktree add -b my7 my7 && test_must_fail git -C my7 branch -d my7 && - test_must_fail git branch -d my7 + test_must_fail git branch -d my7 && + rm -r my7 && + git worktree prune ' test_expect_success 'test --track without .fetch entries' ' diff --git a/t/t3203-branch-output.sh b/t/t3203-branch-output.sh index be55148930..ceb74e0826 100755 --- a/t/t3203-branch-output.sh +++ b/t/t3203-branch-output.sh @@ -136,11 +136,13 @@ test_expect_success 'git branch `--show-current` works properly with worktrees' branch-two EOF git checkout branch-one && - git worktree add worktree branch-two && + git worktree add worktree_dir branch-two && { git branch --show-current && - git -C worktree branch --show-current + git -C worktree_dir branch --show-current } >actual && + rm -r worktree_dir && + git worktree prune && test_cmp expect actual ' @@ -284,6 +286,24 @@ test_expect_success 'git branch --format option' ' test_i18ncmp expect actual ' +test_expect_success 'worktree colors correct' ' + cat >expect <<-EOF && + * (HEAD detached from fromtag) + ambiguous + branch-one + + branch-two + master + ref-to-branch -> branch-one + ref-to-remote -> origin/branch-one + EOF + git worktree add worktree_dir branch-two && + git branch --color >actual.raw && + rm -r worktree_dir && + git worktree prune && + test_decode_color actual && + test_cmp expect actual +' + test_expect_success "set up color tests" ' echo "master" >expect.color && echo "master" >expect.bare && From patchwork Sat Mar 16 01:38:07 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nickolai Belakovski X-Patchwork-Id: 10855675 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 640B11669 for ; Sat, 16 Mar 2019 01:38:40 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4C6C72ABA8 for ; Sat, 16 Mar 2019 01:38:40 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 40C2C2AC31; Sat, 16 Mar 2019 01:38:40 +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 6037F2ABA8 for ; Sat, 16 Mar 2019 01:38:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726736AbfCPBic (ORCPT ); Fri, 15 Mar 2019 21:38:32 -0400 Received: from mail-pf1-f195.google.com ([209.85.210.195]:43315 "EHLO mail-pf1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726649AbfCPBic (ORCPT ); Fri, 15 Mar 2019 21:38:32 -0400 Received: by mail-pf1-f195.google.com with SMTP id c8so838960pfd.10 for ; Fri, 15 Mar 2019 18:38:32 -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; bh=I+pmuiRF1vn0PNUriOKb1kA/CI3kf5evv0H1tYz1MWo=; b=pg0gKyeCXElz1idcCUxTmu9DfZCeM2Zi/hbviKo4ECyxeB2mgUATdN1uXpNoUwET+4 QSwqWYg8a1Mt5bbVb2joxCVd9sPyrVHpxHVg1IhWs/hFf9tiOkcPaoIBp9hs6s7M2I8K iCkmf6Z2MqDGX7/I1QQS13D9yvHjZkVlZ/MF+DnMO/8QCab7DIijhyNr7YJ3PzXSPTyC orRb0pdZoVSUcPQlkXZag/55tmzituIBdpH36Gkc4NLOJ+IZ+RacO93TlLVsSbsmmuv2 hWSwvJSg6kBRYbHD+rZJft56gRr1IhFNiiP0m9u4fBy8VZxtpg1iPpiSEtIAaysjtSPu Io9w== 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; bh=I+pmuiRF1vn0PNUriOKb1kA/CI3kf5evv0H1tYz1MWo=; b=Ql6uZUMTQOVw6NniD0wcOD4jvDkZMR4rtBP4mGz9wRSzShDp5svLn3HjlS4PjM0+Au obVQNbvf5+se53Paw3ryqH/fBG0IHyctTwnjFyI9l302vrIBhh/xiuPSSKJmj2oOUDU0 KKzLVc+iKditVMa69ab83qXpGX6484EOBqXSvsvTaiTDjARO3RaX4r2P7UAqVklWLnBr hChsjWfQZ2hQwa86oZMMR2N6R/51JUP4wdDIC0rmjHSGcVAxlwsPo5d1WwVortshkYkp XkvriR1DLdqFqzy9GrSh2qYQ63uLk3g5yBirT8ODqSuM3UQrGplWdxw4xmZKxYaLl1RW H29g== X-Gm-Message-State: APjAAAWp29qkbok+86Md54R8iuOT3h2sc5uAaq326prV0kQX8BH88jkT cxwJ20F2YYPTrKsCtAXHpzYnxEtT X-Google-Smtp-Source: APXvYqwq5I7rjXnZj23fgNABWmUDV2D96qtxGKEm6aQmhGYhBcP8vmIfTTklO98vHRTC8sn4RlAu2Q== X-Received: by 2002:a65:6241:: with SMTP id q1mr6410962pgv.340.1552700311564; Fri, 15 Mar 2019 18:38:31 -0700 (PDT) Received: from localhost.localdomain (173-8-128-22-SFBA.hfc.comcastbusiness.net. [173.8.128.22]) by smtp.gmail.com with ESMTPSA id b138sm5817623pfb.48.2019.03.15.18.38.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 15 Mar 2019 18:38:30 -0700 (PDT) From: nbelakovski@gmail.com To: git@vger.kernel.org Cc: peff@peff.net, gitster@pobox.com, rafa.almas@gmail.com, avarab@gmail.com, Nickolai Belakovski Subject: [PATCH v9 3/3] branch: add worktree info on verbose output Date: Fri, 15 Mar 2019 18:38:07 -0700 Message-Id: <20190316013807.38756-4-nbelakovski@gmail.com> X-Mailer: git-send-email 2.14.2 In-Reply-To: <20190316013807.38756-1-nbelakovski@gmail.com> References: <20190316013807.38756-1-nbelakovski@gmail.com> Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Nickolai Belakovski To display worktree path for refs checked out in a linked worktree Signed-off-by: Nickolai Belakovski --- Documentation/git-branch.txt | 6 ++++-- builtin/branch.c | 4 ++++ t/t3203-branch-output.sh | 19 +++++++++++++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/Documentation/git-branch.txt b/Documentation/git-branch.txt index 7d18dffc4b..d11d00583a 100644 --- a/Documentation/git-branch.txt +++ b/Documentation/git-branch.txt @@ -172,8 +172,10 @@ This option is only applicable in non-verbose mode. When in list mode, show sha1 and commit subject line for each head, along with relationship to upstream branch (if any). If given twice, print - the name of the upstream branch, as well (see also `git remote - show `). + the path of the linked worktree (if any) and the name of the upstream + branch, as well (see also `git remote show `). Note that the + current worktree's HEAD will not have its path printed (it will always + be your current directory). -q:: --quiet:: diff --git a/builtin/branch.c b/builtin/branch.c index 350b039063..3d1872babc 100644 --- a/builtin/branch.c +++ b/builtin/branch.c @@ -367,9 +367,13 @@ static char *build_format(struct ref_filter *filter, int maxwidth, const char *r strbuf_addf(&local, " %s ", obname.buf); if (filter->verbose > 1) + { + strbuf_addf(&local, "%%(if:notequals=*)%%(HEAD)%%(then)%%(if)%%(worktreepath)%%(then)(%s%%(worktreepath)%s) %%(end)%%(end)", + branch_get_color(BRANCH_COLOR_WORKTREE), branch_get_color(BRANCH_COLOR_RESET)); strbuf_addf(&local, "%%(if)%%(upstream)%%(then)[%s%%(upstream:short)%s%%(if)%%(upstream:track)" "%%(then): %%(upstream:track,nobracket)%%(end)] %%(end)%%(contents:subject)", branch_get_color(BRANCH_COLOR_UPSTREAM), branch_get_color(BRANCH_COLOR_RESET)); + } else strbuf_addf(&local, "%%(if)%%(upstream:track)%%(then)%%(upstream:track) %%(end)%%(contents:subject)"); diff --git a/t/t3203-branch-output.sh b/t/t3203-branch-output.sh index ceb74e0826..e5dc23e225 100755 --- a/t/t3203-branch-output.sh +++ b/t/t3203-branch-output.sh @@ -328,4 +328,23 @@ test_expect_success '--color overrides auto-color' ' test_cmp expect.color actual ' +test_expect_success 'verbose output lists worktree path' ' + one=$(git rev-parse --short HEAD) && + two=$(git rev-parse --short master) && + cat >expect <<-EOF && + * (HEAD detached from fromtag) $one one + ambiguous $one one + branch-one $two two + + branch-two $one ($(pwd)/worktree_dir) one + master $two two + ref-to-branch $two two + ref-to-remote $two two + EOF + git worktree add worktree_dir branch-two && + git branch -vv >actual && + rm -r worktree_dir && + git worktree prune && + test_cmp expect actual +' + test_done