From: Christian Couder <chriscool@tuxfamily.org>
To: Junio C Hamano <gitster@pobox.com>
Cc: git@vger.kernel.org, Jeff King <peff@peff.net>,
Joey Hess <joey@kitenet.net>,
Eric Sunshine <sunshine@sunshineco.com>
Subject: [PATCH v3 07/10] builtin/replace: teach listing using short, medium or full formats
Date: Wed, 11 Dec 2013 08:46:10 +0100 [thread overview]
Message-ID: <20131211074614.11117.96106.chriscool@tuxfamily.org> (raw)
In-Reply-To: <20131211074147.11117.1155.chriscool@tuxfamily.org>
By default when listing replace refs, only the sha1 of the
replaced objects are shown.
In many cases, it is much nicer to be able to list all the
sha1 of the replaced objects along with the sha1 of the
replacment objects.
And in other cases it might be interesting to also show the
types of the replaced and replacement objects.
This patch introduce a new --format=<fmt> option where
<fmt> can be any of the following:
'short': this is the same as when no --format
option is used, that is only the sha1 of
the replaced objects are shown
'medium': this also lists the sha1 of the
replacement objects
'full': this shows the sha1 and the type of both
the replaced and the replacement objects
Some documentation and some tests will follow.
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
---
builtin/replace.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 54 insertions(+), 7 deletions(-)
diff --git a/builtin/replace.c b/builtin/replace.c
index b1bd3ef..9f3619a 100644
--- a/builtin/replace.c
+++ b/builtin/replace.c
@@ -16,27 +16,65 @@
static const char * const git_replace_usage[] = {
N_("git replace [-f] <object> <replacement>"),
N_("git replace -d <object>..."),
- N_("git replace -l [<pattern>]"),
+ N_("git replace [--format=<format>] [-l [<pattern>]]"),
NULL
};
+enum repl_fmt { SHORT, MEDIUM, FULL };
+
+struct show_data {
+ const char *pattern;
+ enum repl_fmt fmt;
+};
+
static int show_reference(const char *refname, const unsigned char *sha1,
int flag, void *cb_data)
{
- const char *pattern = cb_data;
+ struct show_data *data = cb_data;
+
+ if (!fnmatch(data->pattern, refname, 0)) {
+ if (data->fmt == SHORT)
+ printf("%s\n", refname);
+ else if (data->fmt == MEDIUM)
+ printf("%s -> %s\n", refname, sha1_to_hex(sha1));
+ else { /* data->fmt == FULL */
+ unsigned char object[20];
+ enum object_type obj_type, repl_type;
- if (!fnmatch(pattern, refname, 0))
- printf("%s\n", refname);
+ if (get_sha1(refname, object))
+ return error("Failed to resolve '%s' as a valid ref.", refname);
+
+ obj_type = sha1_object_info(object, NULL);
+ repl_type = sha1_object_info(sha1, NULL);
+
+ printf("%s (%s) -> %s (%s)\n", refname, typename(obj_type),
+ sha1_to_hex(sha1), typename(repl_type));
+ }
+ }
return 0;
}
-static int list_replace_refs(const char *pattern)
+static int list_replace_refs(const char *pattern, const char *format)
{
+ struct show_data data;
+
if (pattern == NULL)
pattern = "*";
+ data.pattern = pattern;
+
+ if (format == NULL || *format == '\0' || !strcmp(format, "short"))
+ data.fmt = SHORT;
+ else if (!strcmp(format, "medium"))
+ data.fmt = MEDIUM;
+ else if (!strcmp(format, "full"))
+ data.fmt = FULL;
+ else
+ die("invalid replace format '%s'\n"
+ "valid formats are 'short', 'medium' and 'full'\n",
+ format);
- for_each_replace_ref(show_reference, (void *) pattern);
+ for_each_replace_ref(show_reference, (void *) &data);
return 0;
}
@@ -127,10 +165,12 @@ static int replace_object(const char *object_ref, const char *replace_ref,
int cmd_replace(int argc, const char **argv, const char *prefix)
{
int list = 0, delete = 0, force = 0;
+ const char *format = NULL;
struct option options[] = {
OPT_BOOL('l', "list", &list, N_("list replace refs")),
OPT_BOOL('d', "delete", &delete, N_("delete replace refs")),
OPT_BOOL('f', "force", &force, N_("replace the ref if it exists")),
+ OPT_STRING(0, "format", &format, N_("format"), N_("use this format")),
OPT_END()
};
@@ -140,6 +180,10 @@ int cmd_replace(int argc, const char **argv, const char *prefix)
usage_msg_opt("-l and -d cannot be used together",
git_replace_usage, options);
+ if (format && delete)
+ usage_msg_opt("--format and -d cannot be used together",
+ git_replace_usage, options);
+
if (force && (list || delete))
usage_msg_opt("-f cannot be used with -d or -l",
git_replace_usage, options);
@@ -157,6 +201,9 @@ int cmd_replace(int argc, const char **argv, const char *prefix)
if (argc != 2)
usage_msg_opt("bad number of arguments",
git_replace_usage, options);
+ if (format)
+ usage_msg_opt("--format cannot be used when not listing",
+ git_replace_usage, options);
return replace_object(argv[0], argv[1], force);
}
@@ -168,5 +215,5 @@ int cmd_replace(int argc, const char **argv, const char *prefix)
usage_msg_opt("-f needs some arguments",
git_replace_usage, options);
- return list_replace_refs(argv[0]);
+ return list_replace_refs(argv[0], format);
}
--
1.8.5.1.102.g090758b
next prev parent reply other threads:[~2013-12-11 7:48 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-12-11 7:46 [PATCH v3 00/10] teach replace objects to sha1_object_info_extended() Christian Couder
2013-12-11 7:46 ` [PATCH v3 01/10] Rename READ_SHA1_FILE_REPLACE flag to LOOKUP_REPLACE_OBJECT Christian Couder
2013-12-11 7:46 ` [PATCH v3 02/10] replace_object: don't check read_replace_refs twice Christian Couder
2013-12-11 7:46 ` [PATCH v3 03/10] Introduce lookup_replace_object_extended() to pass flags Christian Couder
2013-12-11 7:46 ` [PATCH v3 04/10] Add an "unsigned flags" parameter to sha1_object_info_extended() Christian Couder
2013-12-11 7:46 ` [PATCH v3 05/10] t6050: show that git cat-file --batch fails with replace objects Christian Couder
2013-12-11 7:46 ` [PATCH v3 06/10] sha1_file: perform object replacement in sha1_object_info_extended() Christian Couder
2013-12-11 7:46 ` Christian Couder [this message]
2013-12-18 12:37 ` [PATCH v3 07/10] builtin/replace: teach listing using short, medium or full formats Karsten Blees
2013-12-18 16:49 ` Christian Couder
2013-12-18 17:37 ` Junio C Hamano
2013-12-19 16:36 ` Christian Couder
2013-12-19 18:58 ` Junio C Hamano
2013-12-21 9:34 ` Christian Couder
2013-12-26 19:10 ` Junio C Hamano
2013-12-28 10:27 ` Christian Couder
2013-12-11 7:46 ` [PATCH v3 08/10] t6050: add tests for listing with --format Christian Couder
2013-12-11 7:46 ` [PATCH v3 09/10] builtin/replace: unset read_replace_refs Christian Couder
2013-12-11 7:46 ` [PATCH v3 10/10] Documentation/git-replace: describe --format option Christian Couder
2013-12-12 20:05 ` [PATCH v3 00/10] teach replace objects to sha1_object_info_extended() Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20131211074614.11117.96106.chriscool@tuxfamily.org \
--to=chriscool@tuxfamily.org \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=joey@kitenet.net \
--cc=peff@peff.net \
--cc=sunshine@sunshineco.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).