From patchwork Tue Jan 22 23:22:59 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nickolai Belakovski X-Patchwork-Id: 10776439 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 6E13317F0 for ; Tue, 22 Jan 2019 23:23:21 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5DBAC2B698 for ; Tue, 22 Jan 2019 23:23:21 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 521772B6D0; Tue, 22 Jan 2019 23:23: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 B3DAA2B698 for ; Tue, 22 Jan 2019 23:23:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726898AbfAVXXT (ORCPT ); Tue, 22 Jan 2019 18:23:19 -0500 Received: from mail-pl1-f194.google.com ([209.85.214.194]:41466 "EHLO mail-pl1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726741AbfAVXXT (ORCPT ); Tue, 22 Jan 2019 18:23:19 -0500 Received: by mail-pl1-f194.google.com with SMTP id u6so128205plm.8 for ; Tue, 22 Jan 2019 15:23:19 -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=Arv647prEPMSd9EKm0rTDcqhDFA2SvSM7i2XQwxfdhg=; b=b2a3K6WOffM4SzxvmRQBdugZ6OukvsqyEXXWMeFqnG4rkZpgxX4ZYr8be6Qt7uInVo vmsVjkwYdXvyEotMH5kplBw00Wc3aihSIDpPFk8v2KzWYoaiLo6H+gJ8RoMYbf8vfk4I jUvcDP7uV0WTDtluKm3XD9sMuPFOI+FhqpgMdWlilfNhYXH1YzW3m9uxKxiYn33fWxbe wt+AZO0bfsOBfAvAJgbXXzdfsmMDOgycwlDoC7L/8DuM4efcbEUup6EfH5XREZ4qNnoX sAJiMaYWdRisRCs45/aAfox7NQfIvj5utBVeR30k6aRy0nCwao8i5+gsOwbvGJRsRoIs /YhA== 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=Arv647prEPMSd9EKm0rTDcqhDFA2SvSM7i2XQwxfdhg=; b=eH639yfIuiGQqTDjiwhFcYJ8VG8/d/xNeDoYneuaULshTrpvpZee56CGiq7yrdsp+3 wbiVmDYMVvC1YTLoR3gaGVziPQCpmL/wkQMcnnKl50tT7GXEMBkamhZu2DVwlFlbWJGX gDQgjTakeQKD1WgJRzM8rNNp0TPnonPi3FqqsKADQtFBsa82J0dVVU94u31YP9L2rFUB H41USY7UE8j56JTIv95ElBvfBjsE1fFxLwGSh8U97Wt0YLE7IL+mCI6E8l+QLF6euKrJ P3hh+q4KOUCziG5t5VdU0W+fw3TMqHc35v8f/7gV75xwTRYN0gpCnZ1dQe8+QRyw9mOn diMg== X-Gm-Message-State: AJcUukdvI37slAqfUfi7R6FhiiMP4HhktmPvKcS6XGMoqVeIpKBdJKUP gYNnwPxy4+5VFHmEVL29we8/DC8J X-Google-Smtp-Source: ALg8bN7tRJ+CpgFv/MrurrD+lFZD2IX+622bSfWxs5ePfYqxYGeJCZWu+VrVwwl4G6dllxM7Z+Rx2Q== X-Received: by 2002:a17:902:b707:: with SMTP id d7mr34640268pls.29.1548199398252; Tue, 22 Jan 2019 15:23:18 -0800 (PST) Received: from localhost.localdomain ([12.167.51.36]) by smtp.gmail.com with ESMTPSA id 84sm23608057pfk.134.2019.01.22.15.23.17 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 22 Jan 2019 15:23:17 -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 v6 1/3] ref-filter: add worktreepath atom Date: Tue, 22 Jan 2019 15:22:59 -0800 Message-Id: <20190122232301.95971-2-nbelakovski@gmail.com> X-Mailer: git-send-email 2.14.2 In-Reply-To: <20190122232301.95971-1-nbelakovski@gmail.com> References: <20190122232301.95971-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 | 74 ++++++++++++++++++++++++++++++++++++++ t/t6302-for-each-ref-filter.sh | 15 ++++++++ 3 files changed, 94 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..3c056cc148 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(). @@ -438,6 +456,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; @@ -480,6 +526,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 }, @@ -1525,6 +1572,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. */ @@ -1562,6 +1624,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 +2114,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); + 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 Tue Jan 22 23:23:00 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nickolai Belakovski X-Patchwork-Id: 10776443 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 992126C2 for ; Tue, 22 Jan 2019 23:23:24 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 870632B698 for ; Tue, 22 Jan 2019 23:23:24 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7B5DB2B6BB; Tue, 22 Jan 2019 23:23:24 +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 3F1272B698 for ; Tue, 22 Jan 2019 23:23:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726899AbfAVXXW (ORCPT ); Tue, 22 Jan 2019 18:23:22 -0500 Received: from mail-pf1-f172.google.com ([209.85.210.172]:41369 "EHLO mail-pf1-f172.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726741AbfAVXXV (ORCPT ); Tue, 22 Jan 2019 18:23:21 -0500 Received: by mail-pf1-f172.google.com with SMTP id b7so141331pfi.8 for ; Tue, 22 Jan 2019 15:23:21 -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=jWHhxw3QUy1MVBgNNYJB3MmWraRoPxwSqAD6ureaG78=; b=JxIardLPDW1w7rTeSLPxyMk3Zo8TjC+JUt01CgZ9d1TZFF/uRy0nZ4UvPQXi6jblOv PzY1bCLFeKpUSUXLbXAcd2HnYuATH4hDJywc2Hh1/2bVdqbtD0/pzeG69cjIcZLwFaus Fwst5UrSdLqXRHRVjo024EPaxMG5q7Ku88NLeVJj15Rb5tgVheqqdifuUTy9AQN6g7Q7 bEDTvQdHXmXpWTNL7c6GBg+cbpdbgsoBkkijv025WCHuBo6PczA8u5id8LEf3H9z8DZ7 UW1W5bpBtLcMuQI+9AF55+csnuTD1a9/j4zE6fkTgejwA99LAe5OAWniqgkK3x5ljfiv Lmig== 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=jWHhxw3QUy1MVBgNNYJB3MmWraRoPxwSqAD6ureaG78=; b=m0K127E/j5gtPnP0ieFA4C9CbgOKcwLBbR0oeJ5GGtH6JgEWvwpv+XJUETPOAvfNly lcvyfLAMblyarOUFoY23ULh+f+atu/vvTVEMbIdMT4ZCHJ6BJIwiz9MmKd5+So8yDxzw PZ0u0vKW0kcXz1bsFVNHxy3JiL3H1TIU19XANLvp1d0HsxGGA0Bydr1ywa9ieRGKJL4w +8YAZe7KUvmJTVOlapP71R6a4Rlj1bqxozFE/UINkQuZ6o87V91vithI4zlsLvNbvBD9 YF3GxtzdNNFw5pPWT2g7q93SWkxm3y/tshva8NCt9jMJtQ29vu55JNTE7p8j2PNFzM73 pEvA== X-Gm-Message-State: AJcUukf2T45vkMXysVJ8aVNQ0tSClmkxfjWi3PaVCNV+ZKO/5E0eFy7b jsakpEIF2FFxTrpjaRkOnIWtWpCC X-Google-Smtp-Source: ALg8bN4zuunHlyFZNH9G5QUEf2EuhAm/Rqj/YrvXC5x6sSv5uBzRX/yB2sdKiWtC05RFs9kPTQO4jg== X-Received: by 2002:a62:6f49:: with SMTP id k70mr35089403pfc.7.1548199400467; Tue, 22 Jan 2019 15:23:20 -0800 (PST) Received: from localhost.localdomain ([12.167.51.36]) by smtp.gmail.com with ESMTPSA id 84sm23608057pfk.134.2019.01.22.15.23.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 22 Jan 2019 15:23:19 -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 v6 2/3] branch: Mark and color a branch differently if it is checked out in a linked worktree Date: Tue, 22 Jan 2019 15:23:00 -0800 Message-Id: <20190122232301.95971-3-nbelakovski@gmail.com> X-Mailer: git-send-email 2.14.2 In-Reply-To: <20190122232301.95971-1-nbelakovski@gmail.com> References: <20190122232301.95971-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. --- 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 Tue Jan 22 23:23:01 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nickolai Belakovski X-Patchwork-Id: 10776445 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 E9FD913B5 for ; Tue, 22 Jan 2019 23:23:25 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D98972B698 for ; Tue, 22 Jan 2019 23:23:25 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id CDEC12B6BB; Tue, 22 Jan 2019 23:23:25 +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 740722B698 for ; Tue, 22 Jan 2019 23:23:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726907AbfAVXXY (ORCPT ); Tue, 22 Jan 2019 18:23:24 -0500 Received: from mail-pf1-f194.google.com ([209.85.210.194]:39959 "EHLO mail-pf1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726741AbfAVXXX (ORCPT ); Tue, 22 Jan 2019 18:23:23 -0500 Received: by mail-pf1-f194.google.com with SMTP id i12so144796pfo.7 for ; Tue, 22 Jan 2019 15:23:22 -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=MJ4XOKpK59zkhiiUtopH1ZCvJueDIfsnNfu19jHmmtI=; b=Bih51gC6v/+yyUte5YeX9wfaG3zvZrpysYeGkx0mlDKZtOULtRZw4B3rozR1JFgGP7 nhrt1fsyBDwq1JC0BFwlqYm1aQl3Lqi/Zn/dNW/7FdiCA7kvk5xypDHBErGIrWQljdjc G+hzLB83m/pyJd7R9GjvboenLBBoXPR4nJbU9ttfHrPDftGJYOLiUMZM/bffA/DcM5VK +ZhQqGEn7trSANzA8wX95X1jL2D+HhAyopczB7sit6JPf5Ew34YWfp5HnIb0AuY8/j4p 2KKsECwpS28q25LxHnLfwKaUzyBxOrK+RChj5FERkITufDOMe1s9oZcm3FG/rP80C4uu PqDg== 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=MJ4XOKpK59zkhiiUtopH1ZCvJueDIfsnNfu19jHmmtI=; b=Lxm16rtgUZJXQOgw0ov5Ft8PKR2Jv6cpg+m690AN98LKg8lRpoPXLjhppNeLCcUnlb HzMLG8U4pUqNa7eqKEed5fa0oD+WrFR8ZrRbq8lRsgUYArzpZpWJHzSFBTMLW+yOeTu1 jiKiIri+jOauj+11bLWlNlVl69iR1tjjcYM7mmi+XUCtrRl+Nl0XluMK2WS2pllnNPcw 6rGuWllJtgV5qVuBEpBls66MfuXIGBrQn0K9cJm3Na6AiYbAoEmlm6I/fhZb1qwm/6Nv ufuO6nnGtZGnszrLScgYouYYS4zZk0iddux3QdFu6x62mhI9LD3S6//NIkxZXWQttGnR uAGw== X-Gm-Message-State: AJcUukeCXcvpGwwpUrZY1CMu9Rh0/aTh58+MbRf+NCenDk9DDBezJgzn 8uBZTyST04VrC/Am4KgaYkudnuPt X-Google-Smtp-Source: ALg8bN5n88pwotWTmoNPuzz/BAzphDXuglbThsY+FDYAFOxOept/oXlW1XNfo/uFTq/KagyGGh/+Kg== X-Received: by 2002:a63:7e1a:: with SMTP id z26mr33067336pgc.216.1548199402298; Tue, 22 Jan 2019 15:23:22 -0800 (PST) Received: from localhost.localdomain ([12.167.51.36]) by smtp.gmail.com with ESMTPSA id 84sm23608057pfk.134.2019.01.22.15.23.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 22 Jan 2019 15:23:21 -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 v6 3/3] branch: Add an extra verbose output displaying worktree path for refs checked out in a linked worktree Date: Tue, 22 Jan 2019 15:23:01 -0800 Message-Id: <20190122232301.95971-4-nbelakovski@gmail.com> X-Mailer: git-send-email 2.14.2 In-Reply-To: <20190122232301.95971-1-nbelakovski@gmail.com> References: <20190122232301.95971-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 | 7 +++++-- builtin/branch.c | 4 ++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Documentation/git-branch.txt b/Documentation/git-branch.txt index b3eca6ffdc..a1aef00af0 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 `). + 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)");