summaryrefslogtreecommitdiff
path: root/src/commit.c
diff options
context:
space:
mode:
authorVicent Marti <tanoku@gmail.com>2010-05-23 04:37:39 +0200
committerAndreas Ericsson <ae@op5.se>2010-06-02 10:32:06 +0200
commitb60488e1d7564716dc2ae7ce078a415280bd7df6 (patch)
tree88ccfe32b8a8455a7d6e709666494c33c7387050 /src/commit.c
parent5e15176dac8b0baa6f7950f5f763608c83b29093 (diff)
downloadlibgit2-b60488e1d7564716dc2ae7ce078a415280bd7df6.tar.gz
Added sort method for commit lists.
Fixed bug when parsing time headers from commits. Signed-off-by: Vicent Marti <tanoku@gmail.com> Signed-off-by: Andreas Ericsson <ae@op5.se>
Diffstat (limited to 'src/commit.c')
-rw-r--r--src/commit.c60
1 files changed, 57 insertions, 3 deletions
diff --git a/src/commit.c b/src/commit.c
index 1763ca88b..dec93efc7 100644
--- a/src/commit.c
+++ b/src/commit.c
@@ -97,7 +97,7 @@ git_commit *git_commit_lookup(git_revpool *pool, const git_oid *id)
{
git_commit *commit = NULL;
- if (pool == NULL || pool->db == NULL)
+ if (pool == NULL)
return NULL;
commit = (git_commit *)git_revpool_table_lookup(pool->commits, id);
@@ -126,14 +126,14 @@ int git_commit__parse_time(time_t *commit_time, char *buffer, const char *buffer
return -1;
buffer = memchr(buffer, '\n', buffer_end - buffer);
- if (buffer == 0 || buffer >= buffer_end)
+ if (buffer == 0 || ++buffer >= buffer_end)
return -1;
if (memcmp(buffer, "committer ", 10) != 0)
return -1;
buffer = memchr(buffer, '\n', buffer_end - buffer);
- if (buffer == 0 || buffer >= buffer_end)
+ if (buffer == 0 || ++buffer >= buffer_end)
return -1;
*commit_time = strtol(buffer, &buffer, 10);
@@ -291,3 +291,57 @@ void git_commit_list_clear(git_commit_list *list, int free_commits)
list->size = 0;
}
+void git_commit_list_sort(git_commit_list *list)
+{
+ git_commit_node *p, *q, *e, *tail;
+ int in_size, p_size, q_size, merge_count, i;
+
+ if (list->head == NULL)
+ return;
+
+ in_size = 1;
+
+ do
+ {
+ p = list->head;
+ tail = NULL;
+ merge_count = 0;
+
+ while (p != NULL)
+ {
+ merge_count++;
+ q = p;
+ p_size = 0;
+ q_size = in_size;
+
+ for (i = 0; i < in_size && q; ++i, q = q->next)
+ p_size++;
+
+ while (p_size > 0 || (q_size > 0 && q))
+ {
+ if (p_size == 0)
+ e = q, q = q->next, q_size--;
+
+ else if (q_size == 0 || q == NULL ||
+ p->commit->commit_time <= q->commit->commit_time)
+ e = p, p = p->next, p_size--;
+
+ else
+ e = q, q = q->next, q_size--;
+
+ if (tail != NULL)
+ tail->next = e;
+ else
+ list->head = e;
+
+ tail = e;
+ }
+
+ p = q;
+ }
+
+ tail->next = NULL;
+ in_size *= 2;
+
+ } while (merge_count > 1);
+}