summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2012-04-29 17:51:30 -0700
committerJunio C Hamano <gitster@pobox.com>2012-04-29 17:51:30 -0700
commit6a8989709efbd6d5187005497907264fde026ae9 (patch)
tree9a575ab5e173c5e5f0203a6053531eb3d0055bec
parent5fa8bf6bf9d20ccb37ed46ec7027a9ac64b2a2a7 (diff)
parenta81a7fbc1a423b112158c2d8647ee80caba108ef (diff)
downloadgit-6a8989709efbd6d5187005497907264fde026ae9.tar.gz
Merge branch 'rs/commit-list-append'
There is no need for "commit_list_reverse()" function that only invites inefficient code. By René Scharfe * rs/commit-list-append: commit: remove commit_list_reverse() revision: append to list instead of insert and reverse sequencer: export commit_list_append()
-rw-r--r--commit.c42
-rw-r--r--commit.h3
-rw-r--r--revision.c4
-rw-r--r--sequencer.c27
4 files changed, 31 insertions, 45 deletions
diff --git a/commit.c b/commit.c
index b80a45281c..9ed36c7db5 100644
--- a/commit.c
+++ b/commit.c
@@ -361,21 +361,6 @@ struct commit_list *commit_list_insert(struct commit *item, struct commit_list *
return new_list;
}
-void commit_list_reverse(struct commit_list **list_p)
-{
- struct commit_list *prev = NULL, *curr = *list_p, *next;
-
- if (!list_p)
- return;
- while (curr) {
- next = curr->next;
- curr->next = prev;
- prev = curr;
- curr = next;
- }
- *list_p = prev;
-}
-
unsigned commit_list_count(const struct commit_list *l)
{
unsigned c = 0;
@@ -1214,3 +1199,30 @@ struct commit *get_merge_parent(const char *name)
}
return commit;
}
+
+/*
+ * Append a commit to the end of the commit_list.
+ *
+ * next starts by pointing to the variable that holds the head of an
+ * empty commit_list, and is updated to point to the "next" field of
+ * the last item on the list as new commits are appended.
+ *
+ * Usage example:
+ *
+ * struct commit_list *list;
+ * struct commit_list **next = &list;
+ *
+ * next = commit_list_append(c1, next);
+ * next = commit_list_append(c2, next);
+ * assert(commit_list_count(list) == 2);
+ * return list;
+ */
+struct commit_list **commit_list_append(struct commit *commit,
+ struct commit_list **next)
+{
+ struct commit_list *new = xmalloc(sizeof(struct commit_list));
+ new->item = commit;
+ *next = new;
+ new->next = NULL;
+ return &new->next;
+}
diff --git a/commit.h b/commit.h
index f8d250d6f6..ccaa20b262 100644
--- a/commit.h
+++ b/commit.h
@@ -53,11 +53,12 @@ int find_commit_subject(const char *commit_buffer, const char **subject);
struct commit_list *commit_list_insert(struct commit *item,
struct commit_list **list);
+struct commit_list **commit_list_append(struct commit *commit,
+ struct commit_list **next);
unsigned commit_list_count(const struct commit_list *l);
struct commit_list *commit_list_insert_by_date(struct commit *item,
struct commit_list **list);
void commit_list_sort_by_date(struct commit_list **list);
-void commit_list_reverse(struct commit_list **list_p);
void free_commit_list(struct commit_list *list);
diff --git a/revision.c b/revision.c
index e0e80f13ef..935e7a7ba4 100644
--- a/revision.c
+++ b/revision.c
@@ -2075,6 +2075,7 @@ int prepare_revision_walk(struct rev_info *revs)
{
int nr = revs->pending.nr;
struct object_array_entry *e, *list;
+ struct commit_list **next = &revs->commits;
e = list = revs->pending.objects;
revs->pending.nr = 0;
@@ -2085,12 +2086,11 @@ int prepare_revision_walk(struct rev_info *revs)
if (commit) {
if (!(commit->object.flags & SEEN)) {
commit->object.flags |= SEEN;
- commit_list_insert(commit, &revs->commits);
+ next = commit_list_append(commit, next);
}
}
e++;
}
- commit_list_reverse(&revs->commits);
commit_list_sort_by_date(&revs->commits);
if (!revs->leak_pending)
free(list);
diff --git a/sequencer.c b/sequencer.c
index cd11e340dd..81d8ace35f 100644
--- a/sequencer.c
+++ b/sequencer.c
@@ -468,33 +468,6 @@ static void read_and_refresh_cache(struct replay_opts *opts)
rollback_lock_file(&index_lock);
}
-/*
- * Append a commit to the end of the commit_list.
- *
- * next starts by pointing to the variable that holds the head of an
- * empty commit_list, and is updated to point to the "next" field of
- * the last item on the list as new commits are appended.
- *
- * Usage example:
- *
- * struct commit_list *list;
- * struct commit_list **next = &list;
- *
- * next = commit_list_append(c1, next);
- * next = commit_list_append(c2, next);
- * assert(commit_list_count(list) == 2);
- * return list;
- */
-static struct commit_list **commit_list_append(struct commit *commit,
- struct commit_list **next)
-{
- struct commit_list *new = xmalloc(sizeof(struct commit_list));
- new->item = commit;
- *next = new;
- new->next = NULL;
- return &new->next;
-}
-
static int format_todo(struct strbuf *buf, struct commit_list *todo_list,
struct replay_opts *opts)
{