git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 1/5] Add some functions for commit lists

From
Daniel Barkalow <barkalow@iabervon.org>
Date
Apr 24, 2005, 00:07 UTC
Message-ID
<Pine.LNX.4.21.0504232003490.30848-100000@iabervon.org>
In-Reply-To
<Pine.LNX.4.21.0504231953490.30848-100000@iabervon.org>

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>
Index: commit.c
===================================================================
--- 329aca984ad6d06eb6d2dffae3933f00ccb8df5a/commit.c  (mode:100644 sha1:9f0668eb68cec56a738a58fe930ae0ae2960e2b2)
+++ e09a6d73a7c6c7a8bfb7e7003a34a507ed97a3b6/commit.c  (mode:100644 sha1:911f6435a74b93f6d25c6852d1814fa8dbaf626e)
@@ -63,12 +63,9 @@
 	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 @@
 	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 @@
 		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;
+}
Index: commit.h
===================================================================
--- 329aca984ad6d06eb6d2dffae3933f00ccb8df5a/commit.h  (mode:100644 sha1:4afd27b1095cf9f9203c96db2b9f2b0bba5063d8)
+++ e09a6d73a7c6c7a8bfb7e7003a34a507ed97a3b6/commit.h  (mode:100644 sha1:c8684d1cd07d7c9ed0af06a3f3d9e7b49fbed0a2)
@@ -22,6 +22,15 @@
 
 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 */
Previous: Daniel BarkalowNext: Linus Torvalds
Message 2 of 12 in “Better merge-base, alternative transport programs”
  1. 0/5 Better merge-base, alternative transport programsDaniel Barkalow, Apr 24, 2005
  2. 1/5 Add some functions for commit listsDaniel Barkalow, Apr 24, 2005
  3. Linus TorvaldsApr 24, 2005
  4. Linus TorvaldsApr 24, 2005
  5. Daniel BarkalowApr 24, 2005
  6. Allow multiple date-ordered listsDaniel Barkalow, Apr 24, 2005
  7. Add -u option to diff-cache to show UNCHANGED filesAndreas Gal, Apr 24, 2005
  8. Petr BaudisApr 24, 2005
  9. 2/5 Parse tree objects completelyDaniel Barkalow, Apr 24, 2005
  10. 3/5 Additional functions for the objects databaseDaniel Barkalow, Apr 24, 2005
  11. 4/5 Replace merge-base implementationDaniel Barkalow, Apr 24, 2005
  12. 5/5 Various transport programsDaniel Barkalow, Apr 24, 2005

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.