From patchwork Sun Jan 6 00:26:17 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nickolai Belakovski X-Patchwork-Id: 10749421 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 77E7D14E5 for ; Sun, 6 Jan 2019 00:26:35 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 664CF2886A for ; Sun, 6 Jan 2019 00:26:35 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5901428877; Sun, 6 Jan 2019 00:26:35 +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 44C5128876 for ; Sun, 6 Jan 2019 00:26:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726378AbfAFA0c (ORCPT ); Sat, 5 Jan 2019 19:26:32 -0500 Received: from mail-pf1-f196.google.com ([209.85.210.196]:36247 "EHLO mail-pf1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726364AbfAFA0c (ORCPT ); Sat, 5 Jan 2019 19:26:32 -0500 Received: by mail-pf1-f196.google.com with SMTP id b85so20049104pfc.3 for ; Sat, 05 Jan 2019 16:26:31 -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=ypauC4IUvMMcSuUYDROiCLMx5UzRvg2xWq3xwwBdJ94=; b=UT1xnR4F2nLzzv/zfJUwSDuerrYTHSS4N6H9YGNT2Mog6WqiMyGETAdjNFhXPv+Iap 93pd3No0Zp5fz1DWaH7Ef+iSFD1VgJE+Cmv7h71y1pxWK+d/iDypguWp0zbI9oN2z43O jwzsil8qFH69VfPmQOmV+M9WnvjgSjer+9/UGfpAB+J0BAmEup0sQeDnJIo+aqktzH/D k41XJ/aINje21iPjDrM4dcph2WJhjJ5lc5LD50YSAmVsSfgL58imEmf1xbXBYm9Q0Jve qMC6wDcaRbU6N/RrXXNSv3UynmZWpNp+tblX8ns6Wu6iaXiG6lfJrBPf8+fsR79V1cGJ mXNg== 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=ypauC4IUvMMcSuUYDROiCLMx5UzRvg2xWq3xwwBdJ94=; b=lWDb9gePVYxhDMjzRA9aonLO7My6DoTXUfh5fjTQm0fbhaGuoBX/YjkCZV4QvDhgSP 95192b0ccpY19lnkt03ubEiP1BdBl9UZg5dkxGgnHwfxsUqmY5iY7NKSrnY1rNKqdQC2 kzZigbcuRU8t2PU20CsLptJFXWJApjXVDb8Cf9EPcQ2znekRKwbjSV1jAvHvfq6B4UKs GQ3BzgRlm+QQ43i0R2kaw9spU0/PQTzwAKHuFcXgaNgR4mhvy4uLhYyUYHNPWC1xUUQi LJTCwT/1uu2GkWunl+JuFlceq6NLgwSfqaTAeK8M6yqHegcTNmb0BczSY287xkVYnI1x w3pw== X-Gm-Message-State: AJcUukftJdmrAZAxIkECuht4ukitPBTYdwDzqaeg22W3Rx7vfHZg0JJN pUejpXhtwQDGjscaKu28B2zTM8U8 X-Google-Smtp-Source: AFSGD/XNyEojnTo7gFhzipzeBc8fsZZNOIwDrsY761c1se7xJWWC+PjJV83iwi5qSm0pD2cSKGn3Yg== X-Received: by 2002:a62:1c7:: with SMTP id 190mr57903344pfb.46.1546734390511; Sat, 05 Jan 2019 16:26:30 -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 e16sm85376485pfn.46.2019.01.05.16.26.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 05 Jan 2019 16:26: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 v5 1/3] ref-filter: add worktreepath atom Date: Sat, 5 Jan 2019 16:26:17 -0800 Message-Id: <20190106002619.54741-2-nbelakovski@gmail.com> X-Mailer: git-send-email 2.14.2 In-Reply-To: <20190106002619.54741-1-nbelakovski@gmail.com> References: <20190106002619.54741-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. --- Documentation/git-for-each-ref.txt | 5 +++ ref-filter.c | 71 ++++++++++++++++++++++++++++++++++++++ t/t6302-for-each-ref-filter.sh | 15 ++++++++ 3 files changed, 91 insertions(+) diff --git a/Documentation/git-for-each-ref.txt b/Documentation/git-for-each-ref.txt index 901faef1bf..caba1c23b8 100644 --- a/Documentation/git-for-each-ref.txt +++ b/Documentation/git-for-each-ref.txt @@ -209,6 +209,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 5de616befe..e7ca45f39b 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,22 @@ 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 hashmap ref_to_worktree_map; +static struct worktree **worktrees = NULL; + /* * An atom is a valid field atom listed below, possibly prefixed with * a "*" to denote deref_tag(). @@ -420,6 +438,34 @@ static int head_atom_parser(const struct ref_format *format, struct used_atom *a return 0; } +static int worktree_atom_parser(const struct ref_format *format, + struct used_atom *atom, + const char *arg, + struct strbuf *unused_err) +{ + int i; + + if (worktrees) + return 0; + + worktrees = get_worktrees(0); + + hashmap_init(&ref_to_worktree_map, ref_to_worktree_map_cmpfnc, NULL, 0); + + 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(&ref_to_worktree_map, entry); + } + } + + return 0; +} + static struct { const char *name; info_source source; @@ -461,6 +507,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, FIELD_STR, worktree_atom_parser }, { "align", SOURCE_NONE, FIELD_STR, align_atom_parser }, { "end", SOURCE_NONE }, { "if", SOURCE_NONE, FIELD_STR, if_atom_parser }, @@ -1500,6 +1547,21 @@ static int get_object(struct ref_array_item *ref, int deref, struct object **obj return 0; } +static char *get_worktree_path(const struct used_atom *atom, const struct ref_array_item *ref) +{ + struct strbuf val = STRBUF_INIT; + struct hashmap_entry entry; + struct ref_to_worktree_entry *lookup_result; + + hashmap_entry_init(&entry, strhash(ref->refname)); + lookup_result = hashmap_get(&ref_to_worktree_map, &entry, ref->refname); + + if (lookup_result) + strbuf_addstr(&val, lookup_result->wt->path); + + return strbuf_detach(&val, NULL); +} + /* * Parse the object referred by ref, and grab needed value. */ @@ -1537,6 +1599,10 @@ 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")) { + v->s = get_worktree_path(atom, ref); + continue; + } else if (starts_with(name, "symref")) refname = get_symref(atom, ref); else if (starts_with(name, "upstream")) { @@ -2020,6 +2086,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 (worktrees) + { + hashmap_free(&ref_to_worktree_map, 1); + free_worktrees(worktrees); + } } 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 Sun Jan 6 00:26: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: 10749427 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 29BB614E5 for ; Sun, 6 Jan 2019 00:26:40 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 177CE2886A for ; Sun, 6 Jan 2019 00:26:40 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0B26C2887B; Sun, 6 Jan 2019 00:26: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 67F3A2886A for ; Sun, 6 Jan 2019 00:26:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726384AbfAFA0d (ORCPT ); Sat, 5 Jan 2019 19:26:33 -0500 Received: from mail-pf1-f194.google.com ([209.85.210.194]:44688 "EHLO mail-pf1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726375AbfAFA0c (ORCPT ); Sat, 5 Jan 2019 19:26:32 -0500 Received: by mail-pf1-f194.google.com with SMTP id u6so20032625pfh.11 for ; Sat, 05 Jan 2019 16:26: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=AOKP/w1CtgQPV1B9uxhMuHW1hETCGi+cuoWRGM4z+C4=; b=LjK/K+H0wIUN2KPAItwJ6S4LN2nn0ekUYS8r7e6bZT9Zy8yhu84RjBgi9PJYeCJOVs /CqKSuuJ78RfJI8pGTw9PnlgZBjoTLhKjdzrPG4ibsg4U3MHhQGA+D8hzXO4gg19TCFj ecKQYvcXtykDTzlV/Ml+zuSMCblibbfqFmfD8xFwxsGT/gz+XFHcMCEUnYFBO4OZGmBV bdaHCXcJqcZQ8tjlgSqyzGV3VAcJmGifs6FZYjP/Pl7UP5+aQSFinynnUxZ2DeO4S4BL l9mybRnZZAywSHgfQiAAXVpWnOamFJtrH580Q65q1T4IYqBg1PeSQYLPul3gwiho5p6f 0EUQ== 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=AOKP/w1CtgQPV1B9uxhMuHW1hETCGi+cuoWRGM4z+C4=; b=LszrQl37+EgStEScB+ArHmKf3dtqT1TR8WNm3cHTebhZBkN/ViXfvzR8FJjBqvmnp0 Xt2mF0//qAxanu+lSmr7X3USZa+krA0DrJDolScVb4o38g/ORps5z9A0dA7TTRe6+Rfj goZpHjDomrZGHQO+T/wIo5sDuczwhUtgF5j4KOTlOC/IzueTvpU5Gk0jSRlxBWFT1ocL E39scWdLC+BHmTzeeqCVZZBXISE/UnOQ21BeJarf8l67xDA8Q0siNd36vb6tuqLq9R9h 5g1OLehZHLTJpymIW1pTvrntQC4tuCXoZZULyN/RRetx+dncvcnDYihCM+bvtZt8R5Q7 KaLA== X-Gm-Message-State: AJcUukcTs7ZYUrGf+C7u95U8gSDK3B/2qJTlUgbUL3HySYVAT6ISD/Sl TZReIOvDb4xlv4Df9jVkpgQE5XtK X-Google-Smtp-Source: AFSGD/XV9cDnWZr6TBJ9qKNwWzyf13XzcUpKNeZqIDU7JogoS5fk3MsMIyKuUizF5S24lBlPIkduRA== X-Received: by 2002:a62:868b:: with SMTP id x133mr60827661pfd.252.1546734391596; Sat, 05 Jan 2019 16:26: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 e16sm85376485pfn.46.2019.01.05.16.26.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 05 Jan 2019 16:26: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 v5 2/3] branch: Mark and color a branch differently if it is checked out in a linked worktree Date: Sat, 5 Jan 2019 16:26:18 -0800 Message-Id: <20190106002619.54741-3-nbelakovski@gmail.com> X-Mailer: git-send-email 2.14.2 In-Reply-To: <20190106002619.54741-1-nbelakovski@gmail.com> References: <20190106002619.54741-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 In order to more clearly display which branches are active, 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 simplify workflows related to worktree, particularly due to the limitations of not being able to check out the same branch in two worktrees and the inability to delete a branch checked out in a worktree. When performing branch operations like checkout and delete, it would be useful to know more readily if the branches in which the user is interested are already checked out in a worktree. The git worktree list command contains the relevant information, however this is a much less frquently used command than git branch. --- 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 0c55f7f065..2a24153b78 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 Sun Jan 6 00:26: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: 10749425 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 0C28513B5 for ; Sun, 6 Jan 2019 00:26:40 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EEE4228877 for ; Sun, 6 Jan 2019 00:26:39 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E331628879; Sun, 6 Jan 2019 00:26:39 +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 92FE028876 for ; Sun, 6 Jan 2019 00:26:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726389AbfAFA0f (ORCPT ); Sat, 5 Jan 2019 19:26:35 -0500 Received: from mail-pf1-f196.google.com ([209.85.210.196]:34318 "EHLO mail-pf1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726364AbfAFA0e (ORCPT ); Sat, 5 Jan 2019 19:26:34 -0500 Received: by mail-pf1-f196.google.com with SMTP id h3so20053089pfg.1 for ; Sat, 05 Jan 2019 16:26:33 -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=gmj9cOKjf9eNaado/rGoApnApEIcP5otGDSKvJ8ILbs=; b=BsktX3OagfOUAnsIAbHw4nIrAvCiKSouMWymABnK5+uXHth2ZoHxYGGYnvOZXPGBy+ mvzTuEhAVdRAgktJTDPDElbNMYg7p+OdqoS+VEveDclPJ5JpLqtAALmKkbm+fRApthka MIIqb58EsZ4WKyQXR5Pu9uKUDWUP/VOoZcxo112psRkIRq0L8ZUKXGI/CaYGWRJonYna Emp4pdWlW+HipMqooRPZarUaq3BiPSprTpACWRACrDdW7to2QiPMXX2szeWhX/mpBfIN 36Kq6Xbe5qv4hfa+bVeAOoWPMlmlrZnBitsYKf3CmwhhnT24ehERPrKeiWkKR8x5zHz7 JWEw== 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=gmj9cOKjf9eNaado/rGoApnApEIcP5otGDSKvJ8ILbs=; b=kvjj0JPbDBVsK2g5py5DZz5l5qk6r3w111wn12ir1LrJ+/Eer8cQdaBSi2jm+CScV7 LYlP2YG4rl8kLbKlLae+V5HXNyJsnYEdBLOj45kgfVXlu5DGhHNPk60U9Zv/qtruxMkM GZhNhkmviFmdbt7IgmPmkX1RAbRITc/9D375xCKl8MyRmH2mtD8nuF2QWiNK1zbsC4w/ dG1rE31G/5tWPoUpuD8PupwaCl2K/c1mK9xf7QiRa5pPf4nFnWm1VPoF7/5Hzgoxy/CK szmwbW9wHcMNEOKAahEY70n8Px830kAWUB6jb/ySNkxjXx3PDPqibS5ZkcbEiziU45TS 9WwA== X-Gm-Message-State: AJcUukdosCk24iiO8q5XngjbGKLRHswS+am3R5Wj5mAiEF5crT74VjhB 11RXe6mTL3ZeuPcTt+uybCFDfDgf X-Google-Smtp-Source: ALg8bN5iiOqTCfdH3wTlTRTBhpSiQjtrr77JN2YqSDkTUZnHIqK/AcsKUOKQGglIHNS5A1DHJac/1w== X-Received: by 2002:a63:5207:: with SMTP id g7mr6339344pgb.253.1546734392586; Sat, 05 Jan 2019 16:26:32 -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 e16sm85376485pfn.46.2019.01.05.16.26.31 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 05 Jan 2019 16:26:32 -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 v5 3/3] branch: Add an extra verbose output displaying worktree path for refs checked out in a linked worktree Date: Sat, 5 Jan 2019 16:26:19 -0800 Message-Id: <20190106002619.54741-4-nbelakovski@gmail.com> X-Mailer: git-send-email 2.14.2 In-Reply-To: <20190106002619.54741-1-nbelakovski@gmail.com> References: <20190106002619.54741-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 --- Documentation/git-branch.txt | 5 ++++- builtin/branch.c | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Documentation/git-branch.txt b/Documentation/git-branch.txt index b3eca6ffdc..6d1fc59e32 100644 --- a/Documentation/git-branch.txt +++ b/Documentation/git-branch.txt @@ -163,12 +163,15 @@ This option is only applicable in non-verbose mode. -v:: -vv:: +-vvv:: --verbose:: 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 `). + show `). If given 3 times, print the path of the linked + worktree, if applicable (not applicable for main worktree since + its path will be a subset of $PWD) -q:: --quiet:: diff --git a/builtin/branch.c b/builtin/branch.c index 2a24153b78..56589a3684 100644 --- a/builtin/branch.c +++ b/builtin/branch.c @@ -366,6 +366,10 @@ static char *build_format(struct ref_filter *filter, int maxwidth, const char *r strbuf_addstr(&local, branch_get_color(BRANCH_COLOR_RESET)); strbuf_addf(&local, " %s ", obname.buf); + if (filter->verbose > 2) + strbuf_addf(&local, "%s%%(if:notequals=*)%%(HEAD)%%(then)%%(if)%%(worktreepath)%%(then)%%(worktreepath) %%(end)%%(end)%s", + branch_get_color(BRANCH_COLOR_WORKTREE), branch_get_color(BRANCH_COLOR_RESET)); + if (filter->verbose > 1) strbuf_addf(&local, "%%(if)%%(upstream)%%(then)[%s%%(upstream:short)%s%%(if)%%(upstream:track)" "%%(then): %%(upstream:track,nobracket)%%(end)] %%(end)%%(contents:subject)",