From: Junio C Hamano <gitster@pobox.com>
To: git@vger.kernel.org
Subject: [PATCH 4/4] describe/name-rev: tell name-rev to peel the incoming object to commit first
Date: Sun, 7 Jul 2013 15:33:44 -0700 [thread overview]
Message-ID: <1373236424-25617-5-git-send-email-gitster@pobox.com> (raw)
In-Reply-To: <1373236424-25617-1-git-send-email-gitster@pobox.com>
With this on top of the other patches in this series, you would get:
$ git describe --contains $(git rev-parse v1.8.3 v1.8.3^0)
v1.8.3
v1.8.3
while you can still differentiate tags and the commits they point at
with:
$ git name-rev --refs=tags/\* --name-only $(git rev-parse v1.8.3 v1.8.3^0)
v1.8.3
v1.8.3^0
The difference in these two behaviours is achieved by adding --peel-to-commit
option to "name-rev" and using it when "describe" internally calls it.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
builtin/describe.c | 1 +
builtin/name-rev.c | 35 +++++++++++++++++++++++++----------
2 files changed, 26 insertions(+), 10 deletions(-)
diff --git a/builtin/describe.c b/builtin/describe.c
index b5434e4..f7adda6 100644
--- a/builtin/describe.c
+++ b/builtin/describe.c
@@ -447,6 +447,7 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
argv_array_init(&args);
argv_array_push(&args, "name-rev");
+ argv_array_push(&args, "--peel-to-commit");
argv_array_push(&args, "--name-only");
argv_array_push(&args, "--no-undefined");
if (always)
diff --git a/builtin/name-rev.c b/builtin/name-rev.c
index 29a6f56..fa37731 100644
--- a/builtin/name-rev.c
+++ b/builtin/name-rev.c
@@ -15,6 +15,7 @@ typedef struct rev_name {
} rev_name;
static long cutoff = LONG_MAX;
+static int peel_to_commit;
/* How many generations are maximally preferred over _one_ merge traversal? */
#define MERGE_TRAVERSAL_WEIGHT 65535
@@ -33,7 +34,7 @@ static void name_rev(struct commit *commit,
if (commit->date < cutoff)
return;
- if (deref) {
+ if (deref && !peel_to_commit) {
char *new_name = xmalloc(strlen(tip_name)+3);
strcpy(new_name, tip_name);
strcat(new_name, "^0");
@@ -320,6 +321,8 @@ int cmd_name_rev(int argc, const char **argv, const char *prefix)
OPT_BOOLEAN(0, "undefined", &allow_undefined, N_("allow to print `undefined` names")),
OPT_BOOLEAN(0, "always", &always,
N_("show abbreviated commit object as fallback")),
+ OPT_BOOLEAN(0, "peel-to-commit", &peel_to_commit,
+ N_("peel tag object names in the input to a commmit")),
OPT_END(),
};
@@ -334,7 +337,7 @@ int cmd_name_rev(int argc, const char **argv, const char *prefix)
for (; argc; argc--, argv++) {
unsigned char sha1[20];
- struct object *o;
+ struct object *object;
struct commit *commit;
if (get_sha1(*argv, sha1)) {
@@ -343,17 +346,29 @@ int cmd_name_rev(int argc, const char **argv, const char *prefix)
continue;
}
- o = deref_tag(parse_object(sha1), *argv, 0);
- if (!o || o->type != OBJ_COMMIT) {
+ commit = NULL;
+ object = parse_object(sha1);
+ if (object) {
+ struct object *peeled = deref_tag(object, *argv, 0);
+ if (peeled && peeled->type == OBJ_COMMIT)
+ commit = (struct commit *) peeled;
+ }
+
+ if (!object) {
+ fprintf(stderr, "Could not get object for %s. Skipping.\n",
+ *argv);
+ continue;
+ }
+ if (peel_to_commit && !commit) {
fprintf(stderr, "Could not get commit for %s. Skipping.\n",
- *argv);
+ *argv);
continue;
}
-
- commit = (struct commit *)o;
- if (cutoff > commit->date)
- cutoff = commit->date;
- add_object_array((struct object *)commit, *argv, &revs);
+ if (commit) {
+ if (cutoff > commit->date)
+ cutoff = commit->date;
+ }
+ add_object_array(object, *argv, &revs);
}
if (cutoff)
--
1.8.3.2-853-ga8cbcc9
next prev parent reply other threads:[~2013-07-07 22:34 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-07-07 22:33 [PATCH 0/4] Make "git name-rev $(git rev-parse v1.8.3)" work Junio C Hamano
2013-07-07 22:33 ` [PATCH 1/4] name-ref: factor out name shortening logic from name_ref() Junio C Hamano
2013-07-08 8:52 ` Michael Haggerty
2013-07-08 15:04 ` Junio C Hamano
2013-07-07 22:33 ` [PATCH 2/4] name-rev: allow converting the exact object name at the tip of a ref Junio C Hamano
2013-07-08 12:20 ` Ramkumar Ramachandra
2013-07-08 15:12 ` Junio C Hamano
2013-07-07 22:33 ` [PATCH 3/4] describe: use argv-array Junio C Hamano
2013-07-09 4:51 ` Jeff King
2013-07-09 14:55 ` Junio C Hamano
2013-07-09 16:00 ` Junio C Hamano
2013-07-09 18:53 ` Jeff King
2013-07-07 22:33 ` Junio C Hamano [this message]
2013-07-08 13:08 ` [PATCH 4/4] describe/name-rev: tell name-rev to peel the incoming object to commit first Ramkumar Ramachandra
2013-07-09 5:12 ` Jeff King
2013-07-09 5:06 ` Jeff King
2013-07-09 5:33 ` Junio C Hamano
2013-07-09 5:35 ` Jeff King
2013-07-09 11:45 ` Junio C Hamano
2013-07-09 12:42 ` Ramkumar Ramachandra
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
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1373236424-25617-5-git-send-email-gitster@pobox.com \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
/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.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
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 read-only IMAP folder(s) and NNTP newsgroup(s).