summaryrefslogtreecommitdiff
path: root/builtin/name-rev.c
diff options
context:
space:
mode:
authorLibravatar SZEDER Gábor <szeder.dev@gmail.com>2019-12-09 12:52:58 +0100
committerLibravatar Junio C Hamano <gitster@pobox.com>2019-12-09 13:33:01 -0800
commit2866fd284c57d729d486ed93a7fc118f78e765cb (patch)
treed8d6cec474450479f3d73e01c1815b7164098148 /builtin/name-rev.c
parentname-rev: eliminate recursion in name_rev() (diff)
downloadtgif-2866fd284c57d729d486ed93a7fc118f78e765cb.tar.xz
name-rev: cleanup name_ref()
Earlier patches in this series moved a couple of conditions from the recursive name_rev() function into its caller name_ref(), for no other reason than to make eliminating the recursion a bit easier to follow. Since the previous patch name_rev() is not recursive anymore, so let's move all those conditions back into name_rev(). Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin/name-rev.c')
-rw-r--r--builtin/name-rev.c31
1 files changed, 16 insertions, 15 deletions
diff --git a/builtin/name-rev.c b/builtin/name-rev.c
index a3b796eac4..cc488ee319 100644
--- a/builtin/name-rev.c
+++ b/builtin/name-rev.c
@@ -107,12 +107,26 @@ copy_data:
static void name_rev(struct commit *start_commit,
const char *tip_name, timestamp_t taggerdate,
- int from_tag)
+ int from_tag, int deref)
{
struct prio_queue queue;
struct commit *commit;
struct commit **parents_to_queue = NULL;
size_t parents_to_queue_nr, parents_to_queue_alloc = 0;
+ char *to_free = NULL;
+
+ parse_commit(start_commit);
+ if (start_commit->date < cutoff)
+ return;
+
+ if (deref)
+ tip_name = to_free = xstrfmt("%s^0", tip_name);
+
+ if (!create_or_update_name(start_commit, tip_name, taggerdate, 0, 0,
+ from_tag)) {
+ free(to_free);
+ return;
+ }
memset(&queue, 0, sizeof(queue)); /* Use the prio_queue as LIFO */
prio_queue_put(&queue, start_commit);
@@ -309,20 +323,7 @@ static int name_ref(const char *path, const struct object_id *oid, int flags, vo
if (taggerdate == TIME_MAX)
taggerdate = commit->date;
path = name_ref_abbrev(path, can_abbreviate_output);
- if (commit->date >= cutoff) {
- const char *tip_name;
- char *to_free = NULL;
- if (deref)
- tip_name = to_free = xstrfmt("%s^0", path);
- else
- tip_name = xstrdup(path);
- if (create_or_update_name(commit, tip_name, taggerdate,
- 0, 0, from_tag))
- name_rev(commit, tip_name, taggerdate,
- from_tag);
- else
- free(to_free);
- }
+ name_rev(commit, xstrdup(path), taggerdate, from_tag, deref);
}
return 0;
}