Skip to content

Commit

Permalink
[PATCH] Add some functions for commit lists
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
iabervon authored and Linus Torvalds committed Apr 24, 2005
1 parent 90ffd09 commit dd97f85
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 6 deletions.
58 changes: 52 additions & 6 deletions commit.c
Expand Up @@ -63,19 +63,24 @@ 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);
free(buffer);
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) {
Expand All @@ -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 changes: 9 additions & 0 deletions commit.h
Expand Up @@ -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 */

0 comments on commit dd97f85

Please sign in to comment.