|
|
|
@ -2968,6 +2968,61 @@ enum commit_action get_commit_action(struct rev_info *revs, struct commit *commi
@@ -2968,6 +2968,61 @@ enum commit_action get_commit_action(struct rev_info *revs, struct commit *commi
|
|
|
|
|
return commit_show; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
define_commit_slab(saved_parents, struct commit_list *); |
|
|
|
|
|
|
|
|
|
#define EMPTY_PARENT_LIST ((struct commit_list *)-1) |
|
|
|
|
|
|
|
|
|
/* |
|
|
|
|
* You may only call save_parents() once per commit (this is checked |
|
|
|
|
* for non-root commits). |
|
|
|
|
*/ |
|
|
|
|
static void save_parents(struct rev_info *revs, struct commit *commit) |
|
|
|
|
{ |
|
|
|
|
struct commit_list **pp; |
|
|
|
|
|
|
|
|
|
if (!revs->saved_parents_slab) { |
|
|
|
|
revs->saved_parents_slab = xmalloc(sizeof(struct saved_parents)); |
|
|
|
|
init_saved_parents(revs->saved_parents_slab); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
pp = saved_parents_at(revs->saved_parents_slab, commit); |
|
|
|
|
|
|
|
|
|
/* |
|
|
|
|
* When walking with reflogs, we may visit the same commit |
|
|
|
|
* several times: once for each appearance in the reflog. |
|
|
|
|
* |
|
|
|
|
* In this case, save_parents() will be called multiple times. |
|
|
|
|
* We want to keep only the first set of parents. We need to |
|
|
|
|
* store a sentinel value for an empty (i.e., NULL) parent |
|
|
|
|
* list to distinguish it from a not-yet-saved list, however. |
|
|
|
|
*/ |
|
|
|
|
if (*pp) |
|
|
|
|
return; |
|
|
|
|
if (commit->parents) |
|
|
|
|
*pp = copy_commit_list(commit->parents); |
|
|
|
|
else |
|
|
|
|
*pp = EMPTY_PARENT_LIST; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void free_saved_parents(struct rev_info *revs) |
|
|
|
|
{ |
|
|
|
|
if (revs->saved_parents_slab) |
|
|
|
|
clear_saved_parents(revs->saved_parents_slab); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
struct commit_list *get_saved_parents(struct rev_info *revs, const struct commit *commit) |
|
|
|
|
{ |
|
|
|
|
struct commit_list *parents; |
|
|
|
|
|
|
|
|
|
if (!revs->saved_parents_slab) |
|
|
|
|
return commit->parents; |
|
|
|
|
|
|
|
|
|
parents = *saved_parents_at(revs->saved_parents_slab, commit); |
|
|
|
|
if (parents == EMPTY_PARENT_LIST) |
|
|
|
|
return NULL; |
|
|
|
|
return parents; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
enum commit_action simplify_commit(struct rev_info *revs, struct commit *commit) |
|
|
|
|
{ |
|
|
|
|
enum commit_action action = get_commit_action(revs, commit); |
|
|
|
@ -3267,54 +3322,3 @@ void put_revision_mark(const struct rev_info *revs, const struct commit *commit)
@@ -3267,54 +3322,3 @@ void put_revision_mark(const struct rev_info *revs, const struct commit *commit)
|
|
|
|
|
fputs(mark, stdout); |
|
|
|
|
putchar(' '); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
define_commit_slab(saved_parents, struct commit_list *); |
|
|
|
|
|
|
|
|
|
#define EMPTY_PARENT_LIST ((struct commit_list *)-1) |
|
|
|
|
|
|
|
|
|
void save_parents(struct rev_info *revs, struct commit *commit) |
|
|
|
|
{ |
|
|
|
|
struct commit_list **pp; |
|
|
|
|
|
|
|
|
|
if (!revs->saved_parents_slab) { |
|
|
|
|
revs->saved_parents_slab = xmalloc(sizeof(struct saved_parents)); |
|
|
|
|
init_saved_parents(revs->saved_parents_slab); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
pp = saved_parents_at(revs->saved_parents_slab, commit); |
|
|
|
|
|
|
|
|
|
/* |
|
|
|
|
* When walking with reflogs, we may visit the same commit |
|
|
|
|
* several times: once for each appearance in the reflog. |
|
|
|
|
* |
|
|
|
|
* In this case, save_parents() will be called multiple times. |
|
|
|
|
* We want to keep only the first set of parents. We need to |
|
|
|
|
* store a sentinel value for an empty (i.e., NULL) parent |
|
|
|
|
* list to distinguish it from a not-yet-saved list, however. |
|
|
|
|
*/ |
|
|
|
|
if (*pp) |
|
|
|
|
return; |
|
|
|
|
if (commit->parents) |
|
|
|
|
*pp = copy_commit_list(commit->parents); |
|
|
|
|
else |
|
|
|
|
*pp = EMPTY_PARENT_LIST; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
struct commit_list *get_saved_parents(struct rev_info *revs, const struct commit *commit) |
|
|
|
|
{ |
|
|
|
|
struct commit_list *parents; |
|
|
|
|
|
|
|
|
|
if (!revs->saved_parents_slab) |
|
|
|
|
return commit->parents; |
|
|
|
|
|
|
|
|
|
parents = *saved_parents_at(revs->saved_parents_slab, commit); |
|
|
|
|
if (parents == EMPTY_PARENT_LIST) |
|
|
|
|
return NULL; |
|
|
|
|
return parents; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void free_saved_parents(struct rev_info *revs) |
|
|
|
|
{ |
|
|
|
|
if (revs->saved_parents_slab) |
|
|
|
|
clear_saved_parents(revs->saved_parents_slab); |
|
|
|
|
} |
|
|
|
|