From patchwork Fri Feb 1 22:04:18 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nickolai Belakovski X-Patchwork-Id: 10793781 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 C3264922 for ; Fri, 1 Feb 2019 22:04:33 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B443B33210 for ; Fri, 1 Feb 2019 22:04:33 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A808433279; Fri, 1 Feb 2019 22:04:33 +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 1C36633210 for ; Fri, 1 Feb 2019 22:04:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726606AbfBAWEc (ORCPT ); Fri, 1 Feb 2019 17:04:32 -0500 Received: from mail-pf1-f194.google.com ([209.85.210.194]:43559 "EHLO mail-pf1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726054AbfBAWEb (ORCPT ); Fri, 1 Feb 2019 17:04:31 -0500 Received: by mail-pf1-f194.google.com with SMTP id w73so3866245pfk.10 for ; Fri, 01 Feb 2019 14:04:30 -0800 (PST) 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 :in-reply-to:references; bh=r8ZJBVojhGBJy6py5NSd9y+/6Ei//9KbdDqpMxxRVVc=; b=h3c/YqyDfTIb0D6aqca9vEGWC2gEeiLDW0mPAiG7CKGUXXp29ACqNjKsRB4hx/sYNB yo1Wb1pkItmisRa1GNsXSjBgufDl4uOHn2reyxgyaOAUaW2C6BFHzJlo3xa0aqUjR7ay Mat2VLfVFFjjdZmZgu/iQKRuyeZDi091i1/pObB6FAgyZfV8vcnzLm6mEsTxXCObUF37 dtRPnbix5nYn4V8gToFDAKUOPQXa6E5O89sF9psf1daTP1ub8XZfgtv5X07Ynrr6dP8G px72opCKtSliiZV4v0aWilb1ywOKxOJ4ilbMST7meIguhHSYYr8ZmUJJUuT1RLiZCtMD /mig== 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:in-reply-to:references; bh=r8ZJBVojhGBJy6py5NSd9y+/6Ei//9KbdDqpMxxRVVc=; b=l9IOJJ4DVQg6pKIgOCaPCzUJBh3Af+aq83ViPuZJJ8YAEISY9MGT/lq7TVjRWQU7D6 Tjp5BXAFzKHiSHtYVldoc/L3eyBEt2JFLs4nHAYDhUMmsoigAY6lSWiBzsZ4OlVTvpjG 8tObodRbpFLLEr/yQbBCU+SZ9yVw+iVDTXURjdg5c6pDPYstO2QOgW44xGsK7vN/zd1h LV9XAiMF4ZQYDvaexS3SnFv+hK7vPnlnn4KlNmQg7FX7IHLH3jWI+phBQa6GxcVxtNs+ NARHxMrRL5E86cz6Fbtb5KOVd6jjf7W3dcFvXgOTtQwTeHA8ywuBEOtd/B/WUG1rsMol yUnw== X-Gm-Message-State: AJcUukeli2d3iJgd07RAzOI0Qr/nOt6fiujpTaNsolW1fdHwQSJIcnvB hgjHdYhIY0jlMNFSQdzjeKi8QZjPhmU= X-Google-Smtp-Source: ALg8bN6jw82pcZ5NicYNZiDX9JmearHFErT07O3uV8C8MUhLpaomHYH5WnB4w6MGlmnhiK64STCF+w== X-Received: by 2002:a62:7e13:: with SMTP id z19mr41034398pfc.94.1549058669725; Fri, 01 Feb 2019 14:04:29 -0800 (PST) Received: from localhost.localdomain (cpe-23-241-199-231.socal.res.rr.com. [23.241.199.231]) by smtp.gmail.com with ESMTPSA id h128sm12131281pgc.15.2019.02.01.14.04.28 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 01 Feb 2019 14:04:29 -0800 (PST) From: nbelakovski@gmail.com To: git@vger.kernel.org Cc: peff@peff.net, rafa.almas@gmail.com, gitster@pobox.com, avarab@gmail.com, Nickolai Belakovski Subject: [PATCH v7 1/3] ref-filter: add worktreepath atom Date: Fri, 1 Feb 2019 14:04:18 -0800 Message-Id: <20190201220420.36216-2-nbelakovski@gmail.com> X-Mailer: git-send-email 2.14.2 In-Reply-To: <20190201220420.36216-1-nbelakovski@gmail.com> References: <""> <20190201220420.36216-1-nbelakovski@gmail.com> In-Reply-To: References: 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 | 15 ++++++++ 3 files changed, 98 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 422a9c9ae3..e46608476d 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 }, @@ -1525,6 +1549,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. */ @@ -1562,6 +1628,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 (starts_with(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")) { @@ -2045,6 +2118,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..87e0222ea1 100755 --- a/t/t6302-for-each-ref-filter.sh +++ b/t/t6302-for-each-ref-filter.sh @@ -441,4 +441,19 @@ test_expect_success '--merged is incompatible with --no-merged' ' test_must_fail git for-each-ref --merged HEAD --no-merged HEAD ' +test_expect_success '"add" a worktree' ' + mkdir worktree_dir && + git worktree add -b master_worktree worktree_dir master +' + +test_expect_success 'validate worktree atom' ' + cat >expect <<-EOF && + master: $(pwd) + master_worktree: $(pwd)/worktree_dir + side: not checked out + EOF + git for-each-ref --format="%(refname:short): %(if)%(worktreepath)%(then)%(worktreepath)%(else)not checked out%(end)" refs/heads/ >actual && + test_cmp expect actual +' + test_done From patchwork Fri Feb 1 22:04:19 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nickolai Belakovski X-Patchwork-Id: 10793783 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 25E79922 for ; Fri, 1 Feb 2019 22:04:36 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 15CA033220 for ; Fri, 1 Feb 2019 22:04:36 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 09D4633289; Fri, 1 Feb 2019 22:04:36 +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 6B9AA33220 for ; Fri, 1 Feb 2019 22:04:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726637AbfBAWEe (ORCPT ); Fri, 1 Feb 2019 17:04:34 -0500 Received: from mail-pf1-f171.google.com ([209.85.210.171]:34108 "EHLO mail-pf1-f171.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726054AbfBAWEd (ORCPT ); Fri, 1 Feb 2019 17:04:33 -0500 Received: by mail-pf1-f171.google.com with SMTP id h3so3894101pfg.1 for ; Fri, 01 Feb 2019 14:04:32 -0800 (PST) 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 :in-reply-to:references; bh=DgcsEEBQ7zqXoqZfk8dCwAjSesrHri9rmB3M150BI+E=; b=pXSI8AVONF9E+rvO1c/WsmK76SmbCvBYytxs9goHkkqBVwD8AF15bJjfWWcMeDT9vL xJLVNQjAdgLLFDo3flvyxr2oMoXnFTLHvcBVQQl6D/d6SpmLKwiQLgsVpI+4jjdAnIP/ SBtOMwJF/uYAHANOb72/t84QU9cd0fKGHUlrZMEqZW6JipJzdeG24zHYVkLDCepeTPPj 25C+fuf/OjNYR49G1Pv9WPtlQqphMehPPBgut6pBODotCFXRy5X+whtAwxMx4lzeGuoz qRlV9qRZY/5UXyZU7ZWks7ioHxP4/C8GebD/hQObjaLvbCOMdH8RW8w3q3fx0lcQCLky IS1w== 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:in-reply-to:references; bh=DgcsEEBQ7zqXoqZfk8dCwAjSesrHri9rmB3M150BI+E=; b=qmKVYk8wQ7B/nADaFREMPdr6qoKyJoP6rNtnkqEc+1hZ9CR5+0NVxvh6Rdk/TVgM/S 2EyvXAvYU/csEpnLdYI/8aqOA+002nIwuRD4bJiE8Fl47cZ/sWDi3jzymeEYxZPry8ZZ KbEC9J6uJcK0UwFIwazv0PGTVVMVI2Pcn41KvEzATAYAt0UwpYn+8GhWrqyVhEs4w2WL nQ5m3zKOGytESNhp8ljXhoDz+u/35dlhG1ZS1oiU/n75zvJSCYHTbSXacj2FxaFYCash 0bkyoWPXePwQjvjU0Js6/znrZklKy4MYAtEjWWxS3ZdoJnPH/LYZieZrI/P9rdkrAKja +Lnw== X-Gm-Message-State: AJcUukccEMfp2635CYRs31hstcl8LRpsv1gR0TBHbs9Xp5sDgofE6yis tyuLNk8KWI4s2hpRSvBA+IOEcwGHrRA= X-Google-Smtp-Source: ALg8bN6wkdDF+0AehklxFbN5upb5XEQ/Nq67jkIbP6/Nn+BlVVW7Vu4TI2Ohr611Ta3IMBnoti/4aQ== X-Received: by 2002:a62:83ce:: with SMTP id h197mr40889696pfe.187.1549058671997; Fri, 01 Feb 2019 14:04:31 -0800 (PST) Received: from localhost.localdomain (cpe-23-241-199-231.socal.res.rr.com. [23.241.199.231]) by smtp.gmail.com with ESMTPSA id h128sm12131281pgc.15.2019.02.01.14.04.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 01 Feb 2019 14:04:31 -0800 (PST) From: nbelakovski@gmail.com To: git@vger.kernel.org Cc: peff@peff.net, rafa.almas@gmail.com, gitster@pobox.com, avarab@gmail.com, Nickolai Belakovski Subject: [PATCH v7 2/3] branch: Mark and color a branch differently if it is checked out in a linked worktree Date: Fri, 1 Feb 2019 14:04:19 -0800 Message-Id: <20190201220420.36216-3-nbelakovski@gmail.com> X-Mailer: git-send-email 2.14.2 In-Reply-To: <20190201220420.36216-1-nbelakovski@gmail.com> References: <""> <20190201220420.36216-1-nbelakovski@gmail.com> In-Reply-To: References: 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 checkout 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 | 15 ++++++++------- builtin/branch.c | 12 ++++++++---- t/t3200-branch.sh | 8 ++++---- t/t3203-branch-output.sh | 21 +++++++++++++++++++++ 4 files changed, 41 insertions(+), 15 deletions(-) diff --git a/Documentation/git-branch.txt b/Documentation/git-branch.txt index bf5316ffa9..b3eca6ffdc 100644 --- a/Documentation/git-branch.txt +++ b/Documentation/git-branch.txt @@ -26,13 +26,14 @@ 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, -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 -it matches any of the patterns. Note that when providing a -``, you must use `--list`; otherwise the command is interpreted +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 it matches any of the patterns. Note that when providing +a ``, you must use `--list`; otherwise the command is interpreted as branch creation. With `--contains`, shows only the branches that contain the named commit diff --git a/builtin/branch.c b/builtin/branch.c index 1be727209b..c2a86362bb 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..e404f6e23c 100755 --- a/t/t3200-branch.sh +++ b/t/t3200-branch.sh @@ -292,7 +292,7 @@ test_expect_success 'git branch --list -v with --abbrev' ' test_expect_success 'git branch --column' ' COLUMNS=81 git branch --column=column >actual && cat >expected <<\EOF && - a/b/c bam foo l * master n o/p r + a/b/c + bam foo l * master n o/p r abc bar j/k m/m master2 o/o q EOF test_cmp expected actual @@ -307,7 +307,7 @@ test_expect_success 'git branch --column with an extremely long branch name' ' cat >expected <expected <<\EOF && - a/b/c bam foo l * master n o/p r + a/b/c + bam foo l * master n o/p r abc bar j/k m/m master2 o/o q EOF test_cmp expected actual @@ -349,7 +349,7 @@ test_expect_success 'git branch -v with column.ui ignored' ' cat >expected <<\EOF && a/b/c abc - bam ++ bam bar foo j/k diff --git a/t/t3203-branch-output.sh b/t/t3203-branch-output.sh index ee6787614c..94ab05ad59 100755 --- a/t/t3203-branch-output.sh +++ b/t/t3203-branch-output.sh @@ -240,6 +240,27 @@ test_expect_success 'git branch --format option' ' test_i18ncmp expect actual ' +test_expect_success '"add" a worktree' ' + mkdir worktree_dir && + git worktree add -b master_worktree worktree_dir master +' + +cat >expect <<'EOF' +* (HEAD detached from fromtag) + ambiguous + branch-one + branch-two + master ++ master_worktree + ref-to-branch -> branch-one + ref-to-remote -> origin/branch-one +EOF +test_expect_success TTY 'worktree colors correct' ' + test_terminal git branch >actual.raw && + 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 Fri Feb 1 22:04:20 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nickolai Belakovski X-Patchwork-Id: 10793785 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 06C0E14E1 for ; Fri, 1 Feb 2019 22:04:38 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EAED133220 for ; Fri, 1 Feb 2019 22:04:37 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id DEC1233289; Fri, 1 Feb 2019 22:04:37 +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 D317133220 for ; Fri, 1 Feb 2019 22:04:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726652AbfBAWEf (ORCPT ); Fri, 1 Feb 2019 17:04:35 -0500 Received: from mail-pf1-f195.google.com ([209.85.210.195]:44870 "EHLO mail-pf1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726054AbfBAWEf (ORCPT ); Fri, 1 Feb 2019 17:04:35 -0500 Received: by mail-pf1-f195.google.com with SMTP id u6so3865431pfh.11 for ; Fri, 01 Feb 2019 14:04:34 -0800 (PST) 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 :in-reply-to:references; bh=Uj0gr9DoHHdKBkQsWhVD6KKHOCm0Hb8ua7S4FSAnrTQ=; b=R3Zm/NlvRg6nxmZVXhiBeIkc9dOk61JpieiEVojFkOf7nZLoyuhe8iYEzmbRxjR0QL WXZd4tPmZMLJ+IUP6znM9n8TlDbkbyqxWk2UuWo9V7zJaTzhFQqoj4puxz40Dab+UEU0 lWqOP2h0NkUpSpVZmYxwS1mXvfWHh59qAKoY1xQmq38GfEt+vaRL2EsBWsTSbqkz3pLr fhirTgyhUI1Qc8mpRBoEur/o0CIXizJBCh2CDXcAgBH8hLjOCyi8/aVdx5tGVa3rKyQv C993YS2gu0JV2FUyp4Vx536Ad4CFnp30vY5+Y3M4Pp6vpoUr1v7918pNLQxcZZqLXWzj mLyw== 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:in-reply-to:references; bh=Uj0gr9DoHHdKBkQsWhVD6KKHOCm0Hb8ua7S4FSAnrTQ=; b=iEy3h3U2V9e1bqzr/SbbhMYtPTRBziohqmD6/Gw3Zo8wZC6dE+hQWGJ1ORI75e0nzB fZwyvZYtMsOX8CYqOrN+oXSHi+tE/DGsINBsMG+wgofV8KFl/MRoE+B/QX2PAnxlICEh JDxPMTeGNawWrMc1QPYBo3SFx+Wi5PlHR5CZyWRx3jzDBtRcRlZFoCSOPQmS5WREaG+D YPvmYa8iOdFYU6Ct9vTJW6fDFe+nL+Jhg0RYBpWJTXL01n0PLtEU7uCSKsoUKRLPNCQv kcaF51MDMqeXVF+F19W7XMCGukApk7iBsPIn4jHbbvy9Jsp3FlSYf04WOsARFdqlWxeE uqgA== X-Gm-Message-State: AJcUukd/Ap0+hzuaOvvkJwx62nD3u7I3FCRKm1Otfa3BzvsnosTm251y tRi+Yz7K5HiENWHNE+3cvnA4OZEz6eY= X-Google-Smtp-Source: ALg8bN620q3khdgGUEcd7/LMZPZf5CBGvoV531Wkczxux37H3+wjILmz2qCQ6GkoXH1x0++YHqGlng== X-Received: by 2002:a62:184e:: with SMTP id 75mr40457284pfy.28.1549058674013; Fri, 01 Feb 2019 14:04:34 -0800 (PST) Received: from localhost.localdomain (cpe-23-241-199-231.socal.res.rr.com. [23.241.199.231]) by smtp.gmail.com with ESMTPSA id h128sm12131281pgc.15.2019.02.01.14.04.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 01 Feb 2019 14:04:33 -0800 (PST) From: nbelakovski@gmail.com To: git@vger.kernel.org Cc: peff@peff.net, rafa.almas@gmail.com, gitster@pobox.com, avarab@gmail.com, Nickolai Belakovski Subject: [PATCH v7 3/3] branch: Add an extra verbose output displaying worktree path for refs checked out in a linked worktree Date: Fri, 1 Feb 2019 14:04:20 -0800 Message-Id: <20190201220420.36216-4-nbelakovski@gmail.com> X-Mailer: git-send-email 2.14.2 In-Reply-To: <20190201220420.36216-1-nbelakovski@gmail.com> References: <""> <20190201220420.36216-1-nbelakovski@gmail.com> In-Reply-To: References: 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 Signed-off-by: Nickolai Belakovski --- Documentation/git-branch.txt | 6 ++++-- builtin/branch.c | 4 ++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Documentation/git-branch.txt b/Documentation/git-branch.txt index b3eca6ffdc..778be7080f 100644 --- a/Documentation/git-branch.txt +++ b/Documentation/git-branch.txt @@ -167,8 +167,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 applicable (not applicable + for main worktree since user's path will already be in main + worktree) and the name of the upstream branch, as well (see also + `git remote show `). -q:: --quiet:: diff --git a/builtin/branch.c b/builtin/branch.c index c2a86362bb..0b8ba9e4c5 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)");