[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:
parent
90ffd0952f
commit
dd97f850c3
58
commit.c
58
commit.c
@ -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;
|
||||
}
|
||||
|
9
commit.h
9
commit.h
@ -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…
Reference in New Issue
Block a user