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

[PATCH] Split out "pull" from particular methods

From
Daniel Barkalow <barkalow@iabervon.org>
Date
Apr 30, 2005, 05:36 UTC
Message-ID
<Pine.LNX.4.21.0504300133430.30848-100000@iabervon.org>
In-Reply-To
<7vy8b12qg1.fsf@assigned-by-dhcp.cox.net>

The method for deciding what to pull is useful separately from any of the ways of actually fetching the objects.

Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
Split out "pull" functionality from http-pull and rpull
Index: Makefile
===================================================================
--- 8602fe7cb4bf668fd021ab3bfb2082ac7d535e57/Makefile  (mode:100644 sha1:ef9a9fae88a1ac438c22beb50790f0f0e37ffc3c)
+++ 41f4697d0ada8e79a2f262aa9b6357a45194f31d/Makefile  (mode:100644 sha1:87fe8fef5ebd315f370af882bd3172632b850c02)
@@ -82,9 +82,9 @@
 git-export: export.c
 git-diff-cache: diff-cache.c
 git-convert-cache: convert-cache.c
-git-http-pull: http-pull.c
+git-http-pull: http-pull.c pull.c
 git-rpush: rsh.c
-git-rpull: rsh.c
+git-rpull: rsh.c pull.c
 git-rev-list: rev-list.c
 git-mktag: mktag.c
 git-diff-tree-helper: diff-tree-helper.c
Index: http-pull.c
===================================================================
--- 8602fe7cb4bf668fd021ab3bfb2082ac7d535e57/http-pull.c  (mode:100644 sha1:192dcc370dee47c52c72915394bb6f2a79f64e12)
+++ 41f4697d0ada8e79a2f262aa9b6357a45194f31d/http-pull.c  (mode:100644 sha1:d877c4abe3ff7766d858bfeac5c9a0eaf1385b65)
@@ -7,6 +7,8 @@
 #include <errno.h>
 #include <stdio.h>
 
+#include "pull.h"
+
 #include <curl/curl.h>
 #include <curl/easy.h>
 
@@ -14,10 +16,6 @@
 
 static char *base;
 
-static int tree = 0;
-static int commits = 0;
-static int all = 0;
-
 static SHA_CTX c;
 static z_stream stream;
 
@@ -47,7 +45,7 @@
 	return size;
 }
 
-static int fetch(unsigned char *sha1)
+int fetch(unsigned char *sha1)
 {
 	char *hex = sha1_to_hex(sha1);
 	char *filename = sha1_file_name(sha1);
@@ -105,77 +103,21 @@
 	return 0;
 }
 
-static int process_tree(unsigned char *sha1)
-{
-	struct tree *tree = lookup_tree(sha1);
-	struct tree_entry_list *entries;
-
-	if (parse_tree(tree))
-		return -1;
-
-	for (entries = tree->entries; entries; entries = entries->next) {
-		if (fetch(entries->item.tree->object.sha1))
-			return -1;
-		if (entries->directory) {
-			if (process_tree(entries->item.tree->object.sha1))
-				return -1;
-		}
-	}
-	return 0;
-}
-
-static int process_commit(unsigned char *sha1)
-{
-	struct commit *obj = lookup_commit(sha1);
-
-	if (fetch(sha1))
-		return -1;
-
-	if (parse_commit(obj))
-		return -1;
-
-	if (tree) {
-		if (fetch(obj->tree->object.sha1))
-			return -1;
-		if (process_tree(obj->tree->object.sha1))
-			return -1;
-		if (!all)
-			tree = 0;
-	}
-	if (commits) {
-		struct commit_list *parents = obj->parents;
-		for (; parents; parents = parents->next) {
-			if (has_sha1_file(parents->item->object.sha1))
-				continue;
-			if (fetch(parents->item->object.sha1)) {
-				/* The server might not have it, and
-				 * we don't mind. 
-				 */
-				continue;
-			}
-			if (process_commit(parents->item->object.sha1))
-				return -1;
-		}
-	}
-	return 0;
-}
-
 int main(int argc, char **argv)
 {
 	char *commit_id;
 	char *url;
 	int arg = 1;
-	unsigned char sha1[20];
 
 	while (arg < argc && argv[arg][0] == '-') {
 		if (argv[arg][1] == 't') {
-			tree = 1;
+			get_tree = 1;
 		} else if (argv[arg][1] == 'c') {
-			commits = 1;
+			get_history = 1;
 		} else if (argv[arg][1] == 'a') {
-			all = 1;
-			tree = 1;
-			commits = 1;
+			get_all = 1;
+			get_tree = 1;
+			get_history = 1;
 		}
 		arg++;
 	}
@@ -186,17 +128,13 @@
 	commit_id = argv[arg];
 	url = argv[arg + 1];
 
-	get_sha1_hex(commit_id, sha1);
-
 	curl_global_init(CURL_GLOBAL_ALL);
 
 	curl = curl_easy_init();
 
 	base = url;
 
-	if (fetch(sha1))
-		return 1;
-	if (process_commit(sha1))
+	if (pull(commit_id))
 		return 1;
 
 	curl_global_cleanup();
Index: pull.c
===================================================================
--- /dev/null  (tree:8602fe7cb4bf668fd021ab3bfb2082ac7d535e57)
+++ 41f4697d0ada8e79a2f262aa9b6357a45194f31d/pull.c  (mode:100644 sha1:86a7b6901fe69a82c12c3470b456982ef52cebd0)
@@ -0,0 +1,77 @@
+#include "pull.h"
+
+#include "cache.h"
+#include "commit.h"
+#include "tree.h"
+
+int get_tree = 0;
+int get_history = 0;
+int get_all = 0;
+
+static int process_tree(unsigned char *sha1)
+{
+	struct tree *tree = lookup_tree(sha1);
+	struct tree_entry_list *entries;
+
+	if (parse_tree(tree))
+		return -1;
+
+	for (entries = tree->entries; entries; entries = entries->next) {
+		if (fetch(entries->item.tree->object.sha1))
+			return -1;
+		if (entries->directory) {
+			if (process_tree(entries->item.tree->object.sha1))
+				return -1;
+		}
+	}
+	return 0;
+}
+
+static int process_commit(unsigned char *sha1)
+{
+	struct commit *obj = lookup_commit(sha1);
+
+	if (fetch(sha1))
+		return -1;
+
+	if (parse_commit(obj))
+		return -1;
+
+	if (get_tree) {
+		if (fetch(obj->tree->object.sha1))
+			return -1;
+		if (process_tree(obj->tree->object.sha1))
+			return -1;
+		if (!get_all)
+			get_tree = 0;
+	}
+	if (get_history) {
+		struct commit_list *parents = obj->parents;
+		for (; parents; parents = parents->next) {
+			if (has_sha1_file(parents->item->object.sha1))
+				continue;
+			if (fetch(parents->item->object.sha1)) {
+				/* The server might not have it, and
+				 * we don't mind. 
+				 */
+				continue;
+			}
+			if (process_commit(parents->item->object.sha1))
+				return -1;
+		}
+	}
+	return 0;
+}
+
+int pull(char *target)
+{
+	int retval;
+	unsigned char sha1[20];
+	retval = get_sha1_hex(target, sha1);
+	if (retval)
+		return retval;
+	retval = fetch(sha1);
+	if (retval)
+		return retval;
+	return process_commit(sha1);
+}
Index: pull.h
===================================================================
--- /dev/null  (tree:8602fe7cb4bf668fd021ab3bfb2082ac7d535e57)
+++ 41f4697d0ada8e79a2f262aa9b6357a45194f31d/pull.h  (mode:100644 sha1:314bc7e95ab1a73634f6a96a8a3782fda91ea261)
@@ -0,0 +1,18 @@
+#ifndef PULL_H
+#define PULL_H
+
+/** To be provided by the particular implementation. **/
+extern int fetch(unsigned char *sha1);
+
+/** Set to fetch the target tree. */
+extern int get_tree;
+
+/** Set to fetch the commit history. */
+extern int get_history;
+
+/** Set to fetch the trees in the commit history. **/
+extern int get_all;
+
+extern int pull(char *target);
+
+#endif /* PULL_H */
Index: rpull.c
===================================================================
--- 8602fe7cb4bf668fd021ab3bfb2082ac7d535e57/rpull.c  (mode:100644 sha1:c27af2c2464de28732b8ad1fff3ed8a0804250d6)
+++ 41f4697d0ada8e79a2f262aa9b6357a45194f31d/rpull.c  (mode:100644 sha1:6624440d5ad24854e1bd1a8dff628427581198e0)
@@ -7,15 +7,12 @@
 #include <errno.h>
 #include <stdio.h>
 #include "rsh.h"
-
-static int tree = 0;
-static int commits = 0;
-static int all = 0;
+#include "pull.h"
 
 static int fd_in;
 static int fd_out;
 
-static int fetch(unsigned char *sha1)
+int fetch(unsigned char *sha1)
 {
 	if (has_sha1_file(sha1))
 		return 0;
@@ -23,87 +20,21 @@
 	return write_sha1_from_fd(sha1, fd_in);
 }
 
-static int process_tree(unsigned char *sha1)
-{
-	struct tree *tree = lookup_tree(sha1);
-	struct tree_entry_list *entries;
-
-	if (parse_tree(tree))
-		return -1;
-
-	for (entries = tree->entries; entries; entries = entries->next) {
-		/*
-		  fprintf(stderr, "Tree %s ", sha1_to_hex(sha1));
-		  fprintf(stderr, "needs %s\n", 
-		  sha1_to_hex(entries->item.tree->object.sha1));
-		*/
-		if (fetch(entries->item.tree->object.sha1)) {
-			return error("Missing item %s",
-				     sha1_to_hex(entries->item.tree->object.sha1));
-		}
-		if (entries->directory) {
-			if (process_tree(entries->item.tree->object.sha1))
-				return -1;
-		}
-	}
-	return 0;
-}
-
-static int process_commit(unsigned char *sha1)
-{
-	struct commit *obj = lookup_commit(sha1);
-
-	if (fetch(sha1)) {
-		return error("Fetching %s", sha1_to_hex(sha1));
-	}
-
-	if (parse_commit(obj))
-		return -1;
-
-	if (tree) {
-		if (fetch(obj->tree->object.sha1))
-			return -1;
-		if (process_tree(obj->tree->object.sha1))
-			return -1;
-		if (!all)
-			tree = 0;
-	}
-	if (commits) {
-		struct commit_list *parents = obj->parents;
-		for (; parents; parents = parents->next) {
-			if (has_sha1_file(parents->item->object.sha1))
-				continue;
-			if (fetch(parents->item->object.sha1)) {
-				/* The server might not have it, and
-				 * we don't mind. 
-				 */
-				error("Missing tree %s; continuing", 
-				      sha1_to_hex(parents->item->object.sha1));
-				continue;
-			}
-			if (process_commit(parents->item->object.sha1))
-				return -1;
-		}
-	}
-	return 0;
-}
-
 int main(int argc, char **argv)
 {
 	char *commit_id;
 	char *url;
 	int arg = 1;
-	unsigned char sha1[20];
 
 	while (arg < argc && argv[arg][0] == '-') {
 		if (argv[arg][1] == 't') {
-			tree = 1;
+			get_tree = 1;
 		} else if (argv[arg][1] == 'c') {
-			commits = 1;
+			get_history = 1;
 		} else if (argv[arg][1] == 'a') {
-			all = 1;
-			tree = 1;
-			commits = 1;
+			get_all = 1;
+			get_tree = 1;
+			get_history = 1;
 		}
 		arg++;
 	}
@@ -117,11 +48,7 @@
 	if (setup_connection(&fd_in, &fd_out, "rpush", url, arg, argv + 1))
 		return 1;
 
-	get_sha1_hex(commit_id, sha1);
-
-	if (fetch(sha1))
-		return 1;
-	if (process_commit(sha1))
+	if (pull(commit_id))
 		return 1;
 
 	return 0;
Previous: Junio C HamanoNext: Ryan Anderson
Message 22 of 24 in “More problems...”
  1. Russell KingApr 29, 2005
  2. Russell KingApr 29, 2005
  3. Linus TorvaldsApr 29, 2005
  4. Petr BaudisApr 29, 2005
  5. Ryan AndersonApr 29, 2005
  6. Thomas GlanzmannApr 29, 2005
  7. Linus TorvaldsApr 29, 2005
  8. Junio C HamanoApr 29, 2005
  9. Russell KingApr 29, 2005
  10. Anton AltaparmakovApr 29, 2005
  11. Petr BaudisMay 2, 2005
  12. Dave KleikampMay 2, 2005
  13. Thomas GlanzmannMay 2, 2005
  14. Anton AltaparmakovMay 2, 2005
  15. Linus TorvaldsMay 2, 2005
  16. Petr BaudisMay 3, 2005
  17. Daniel BarkalowMay 3, 2005
  18. Andreas GalMay 3, 2005
  19. Junio C HamanoMay 3, 2005
  20. Daniel BarkalowApr 29, 2005
  21. Junio C HamanoApr 29, 2005
  22. Split out "pull" from particular methodsDaniel Barkalow, Apr 30, 2005
  23. Add git-relink-script, a tool to hardlink two existing repositories.Ryan Anderson, May 4, 2005
  24. Petr BaudisMay 2, 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.