From mboxrd@z Thu Jan 1 00:00:00 1970 From: Karthik Nayak Subject: [PATCH v5 16/16] branch: implement '--format' option Date: Sat, 23 Apr 2016 00:34:07 +0530 Message-ID: <1461351847-22903-17-git-send-email-Karthik.188@gmail.com> References: <1461351847-22903-1-git-send-email-Karthik.188@gmail.com> Cc: jacob.keller@gmail.com, gitster@pobox.com, peff@peff.net, Karthik Nayak , Karthik Nayak To: git@vger.kernel.org X-From: git-owner@vger.kernel.org Fri Apr 22 21:05:57 2016 Return-path: Envelope-to: gcvg-git-2@plane.gmane.org Received: from vger.kernel.org ([209.132.180.67]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1atgOp-0000Sh-Eh for gcvg-git-2@plane.gmane.org; Fri, 22 Apr 2016 21:05:55 +0200 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752722AbcDVTFk (ORCPT ); Fri, 22 Apr 2016 15:05:40 -0400 Received: from mail-pf0-f194.google.com ([209.85.192.194]:35187 "EHLO mail-pf0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752562AbcDVTFi (ORCPT ); Fri, 22 Apr 2016 15:05:38 -0400 Received: by mail-pf0-f194.google.com with SMTP id r187so10798376pfr.2 for ; Fri, 22 Apr 2016 12:05:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=EiNT5cttZfw7HUv+oLnmVOZx/vNXCu7HdYssev3Q8JE=; b=SM60ZS8tvPXrI3H0FsP5LRghNNWq0+PLAiaSNO9bJJBJZKzPnyEbMmvA5Qgs5+R+8F PYT6cvz2YjvQc4CtiiGvL2vJYshU57srwGMPhH/S+++az/lWA+tYSa9qBLPunZFSycOJ jBO/98q4d2Xh282WxF7v5kSjIvI8v5bz2kZvcn5NxONlhQuG6k3TxmZ0sRiyfiqUCYJX 6IcZ2u07jE/c6PaHjbiMIwdtSVS36XdI6CA/gAIreLciEmsG/mBBun4AKhrXEm6s7Xdf vJcjYOAqW/Q+0WTmBRrEuxDNbQ/wylUNzP8gv1OizISyf6b++HGKc5BKxT2gxl+ok6RS t8RQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=EiNT5cttZfw7HUv+oLnmVOZx/vNXCu7HdYssev3Q8JE=; b=H4JxIix2dh91LUeXvktq7rNMoPFEvulcFr3QTK/N724KlKm5rqSrQbBsKWeeYbo7HE o2XNCqYJ2w3SRsRpHMSvpu+LErpeML7k4VPtxmFYy0lZ2wRZsPnn4v8j8WqWCcAIuqNN YnaeI2UUiJzEbd+2j0XaeCkGAerJOhDd0n7v8sG9o6GB6Z8W/m/rgJHdW5QytALZWKhu rfaJtA0l6ndng3b0bNR3ClEefaLCdGAiHsn8unIIdGCajakjxFhkdLMKsRjisj28P3ht KDyXKnbFz5wGo+l2g4SqjeuHL1XdTIshCR0hrP+DzApyvXIMEQouGNkWBydNpsZaT1g4 wrUA== X-Gm-Message-State: AOPr4FXuZjrEyO+/v7Dc1pYU6QXITnN0sWt1MLYu7TNRe4wVHxCoSqks7KsPkQEKLDhCzA== X-Received: by 10.98.9.129 with SMTP id 1mr30759983pfj.163.1461351932419; Fri, 22 Apr 2016 12:05:32 -0700 (PDT) Received: from ashley.localdomain ([106.216.186.206]) by smtp.gmail.com with ESMTPSA id t1sm11266470paa.17.2016.04.22.12.05.28 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 22 Apr 2016 12:05:31 -0700 (PDT) X-Google-Original-From: Karthik Nayak X-Mailer: git-send-email 2.8.0 In-Reply-To: <1461351847-22903-1-git-send-email-Karthik.188@gmail.com> Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Archived-At: Implement the '--format' option provided by 'ref-filter'. This lets the user list branches as per desired format similar to the implementation in 'git for-each-ref'. Add tests and documentation for the same. Mentored-by: Christian Couder Mentored-by: Matthieu Moy Signed-off-by: Karthik Nayak --- Documentation/git-branch.txt | 7 ++++++- builtin/branch.c | 14 +++++++++----- t/t3203-branch-output.sh | 14 ++++++++++++++ 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/Documentation/git-branch.txt b/Documentation/git-branch.txt index 4a7037f..8af132f 100644 --- a/Documentation/git-branch.txt +++ b/Documentation/git-branch.txt @@ -12,7 +12,7 @@ SYNOPSIS [--list] [-v [--abbrev= | --no-abbrev]] [--column[=] | --no-column] [(--merged | --no-merged | --contains) []] [--sort=] - [--points-at ] [...] + [--points-at ] [--format=] [...] 'git branch' [--set-upstream | --track | --no-track] [-l] [-f] [] 'git branch' (--set-upstream-to= | -u ) [] 'git branch' --unset-upstream [] @@ -246,6 +246,11 @@ start-point is either a local or remote-tracking branch. --points-at :: Only list branches of the given object. +--format :: + A string that interpolates `%(fieldname)` from the object + pointed at by a ref being shown. The format is the same as + that of linkgit:git-for-each-ref[1]. + Examples -------- diff --git a/builtin/branch.c b/builtin/branch.c index 07068d2..6847ac3 100644 --- a/builtin/branch.c +++ b/builtin/branch.c @@ -28,6 +28,7 @@ static const char * const builtin_branch_usage[] = { N_("git branch [] [-r] (-d | -D) ..."), N_("git branch [] (-m | -M) [] "), N_("git branch [] [-r | -a] [--points-at]"), + N_("git branch [] [-r | -a] [--format]"), NULL }; @@ -340,14 +341,14 @@ static char *build_format(struct ref_filter *filter, int maxwidth, const char *r return strbuf_detach(&fmt, NULL); } -static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sorting) +static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sorting, const char *format) { int i; struct ref_array array; int maxwidth = 0; const char *remote_prefix = ""; struct strbuf out = STRBUF_INIT; - char *format; + char *to_free = NULL; /* * If we are listing more than just remote branches, @@ -364,7 +365,8 @@ static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sortin if (filter->verbose) maxwidth = calc_maxwidth(&array, strlen(remote_prefix)); - format = build_format(filter, maxwidth, remote_prefix); + if (!format) + format = to_free = build_format(filter, maxwidth, remote_prefix); verify_ref_format(format); /* @@ -392,7 +394,7 @@ static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sortin } ref_array_clear(&array); - free(format); + free(to_free); } static void rename_branch(const char *oldname, const char *newname, int force) @@ -491,6 +493,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix) enum branch_track track; struct ref_filter filter; static struct ref_sorting *sorting = NULL, **sorting_tail = &sorting; + const char *format = NULL; struct option options[] = { OPT_GROUP(N_("Generic options")), @@ -531,6 +534,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix) OPTION_CALLBACK, 0, "points-at", &filter.points_at, N_("object"), N_("print only branches of the object"), 0, parse_opt_object_name }, + OPT_STRING( 0 , "format", &format, N_("format"), N_("format to use for the output")), OPT_END(), }; @@ -591,7 +595,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix) if ((filter.kind & FILTER_REFS_BRANCHES) && filter.detached) filter.kind |= FILTER_REFS_DETACHED_HEAD; filter.name_patterns = argv; - print_ref_list(&filter, sorting); + print_ref_list(&filter, sorting, format); print_columns(&output, colopts, NULL); string_list_clear(&output, 0); return 0; diff --git a/t/t3203-branch-output.sh b/t/t3203-branch-output.sh index 980c732..d8edaf2 100755 --- a/t/t3203-branch-output.sh +++ b/t/t3203-branch-output.sh @@ -196,4 +196,18 @@ test_expect_success 'local-branch symrefs shortened properly' ' test_cmp expect actual ' +test_expect_success 'git branch --format option' ' + cat >expect <<-\EOF && + Refname is (HEAD detached from fromtag) + Refname is refs/heads/ambiguous + Refname is refs/heads/branch-one + Refname is refs/heads/branch-two + Refname is refs/heads/master + Refname is refs/heads/ref-to-branch + Refname is refs/heads/ref-to-remote + EOF + git branch --format="Refname is %(refname)" >actual && + test_cmp expect actual +' + test_done -- 2.8.0