Browse Source

[PATCH] Add some functions for commit lists

This adds a function for inserting an item in a commit list, a function
for sorting a commit list by date, and a function for progressively
scanning a commit history from most recent to least recent.

Signed-Off-By: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
maint
Daniel Barkalow 20 years ago committed by Linus Torvalds
parent
commit
dd97f850c3
  1. 58
      commit.c
  2. 9
      commit.h

58
commit.c

@ -63,12 +63,9 @@ int parse_commit(struct commit *item) @@ -63,12 +63,9 @@ int parse_commit(struct commit *item)
bufptr += 46; /* "tree " + "hex sha1" + "\n" */
while (!memcmp(bufptr, "parent ", 7) &&
!get_sha1_hex(bufptr + 7, parent)) {
struct commit_list *new_parent =
malloc(sizeof(struct commit_list));
new_parent->next = item->parents;
new_parent->item = lookup_commit(parent);
add_ref(&item->object, &new_parent->item->object);
item->parents = new_parent;
struct commit *new_parent = lookup_commit(parent);
commit_list_insert(new_parent, &item->parents);
add_ref(&item->object, &new_parent->object);
bufptr += 48;
}
item->date = parse_commit_date(bufptr);
@ -76,6 +73,14 @@ int parse_commit(struct commit *item) @@ -76,6 +73,14 @@ int parse_commit(struct commit *item)
return 0;
}

void commit_list_insert(struct commit *item, struct commit_list **list_p)
{
struct commit_list *new_list = malloc(sizeof(struct commit_list));
new_list->item = item;
new_list->next = *list_p;
*list_p = new_list;
}

void free_commit_list(struct commit_list *list)
{
while (list) {
@ -84,3 +89,44 @@ void free_commit_list(struct commit_list *list) @@ -84,3 +89,44 @@ void free_commit_list(struct commit_list *list)
free(temp);
}
}

static void insert_by_date(struct commit_list **list, struct commit *item)
{
struct commit_list **pp = list;
struct commit_list *p;
while ((p = *pp) != NULL) {
if (p->item->date < item->date) {
break;
}
pp = &p->next;
}
commit_list_insert(item, pp);
}

void sort_by_date(struct commit_list **list)
{
struct commit_list *ret = NULL;
while (*list) {
insert_by_date(&ret, (*list)->item);
*list = (*list)->next;
}
*list = ret;
}

struct commit *pop_most_recent_commit(struct commit_list **list)
{
struct commit *ret = (*list)->item;
struct commit_list *parents = ret->parents;
struct commit_list *old = *list;

*list = (*list)->next;
free(old);

while (parents) {
parse_commit(parents->item);
insert_by_date(list, parents->item);
parents = parents->next;
}
return ret;
}

9
commit.h

@ -22,6 +22,15 @@ struct commit *lookup_commit(unsigned char *sha1); @@ -22,6 +22,15 @@ struct commit *lookup_commit(unsigned char *sha1);

int parse_commit(struct commit *item);

void commit_list_insert(struct commit *item, struct commit_list **list_p);

void free_commit_list(struct commit_list *list);

void sort_by_date(struct commit_list **list);

/** Removes the first commit from a list sorted by date, and adds all
* of its parents.
**/
struct commit *pop_most_recent_commit(struct commit_list **list);

#endif /* COMMIT_H */

Loading…
Cancel
Save