[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>
This commit is contained in:
Daniel Barkalow 2005-04-23 18:47:23 -07:00 committed by Linus Torvalds
parent 90ffd0952f
commit dd97f850c3
2 changed files with 61 additions and 6 deletions

View File

@ -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)
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)
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;
}

View File

@ -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 */