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

Re: [PATCH] use child_process_init() to initialize struct child_process variables

From
Junio C Hamano <gitster@pobox.com>
Date
Oct 30, 2014, 18:07 UTC
Message-ID
<xmqqlhnxwhw4.fsf@gitster.dls.corp.google.com>
In-Reply-To
<xmqqlhnyy9e2.fsf@gitster.dls.corp.google.com>
Junio C Hamano <gitster@pobox.com> writes:
Show 17 quoted lines
> Probably three helper functions:
>
>  - The first is to find tops and bottoms (this translates fuzzy
>    specifications such as "--since 30.days" into a more concrete
>    revision range "^A ^B ... Z" to establish bundle prerequisites),
>    which is done by running a "rev-list --boundary".
>
>  - The second is to show refs, while paying attention to things like
>    "--10 maint master" which may result in the tip of 'maint' not
>    being shown at all.  I am not sure if this part can/should take
>    advantage of revs.cmdline, though.
>
>  - The last is to create the actual pack data.
>
> I agree with your analysis on the change in column.c and trailer.c
>
> Thanks.

So here are a few patches on top of René's change. This is the third point in the above list.

-- >8 --
Subject: [PATCH] bundle: split out a helper function to create a pack data

The create_bundle() function, while it does one single logical thing and tries to do it well, that single logical thing takes a rather large implementation.

Let's start separating what it does into smaller steps to make it easier what is going on. This is a first step to separate out the actual pack-data generation, after the earlier part of the function figures out which part of the history to place in the bundle.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 bundle.c | 64 +++++++++++++++++++++++++++++++++++++---------------------------
 1 file changed, 37 insertions(+), 27 deletions(-)
diff --git a/bundle.c b/bundle.c
index c846092..9c87532 100644
--- a/bundle.c
+++ b/bundle.c
@@ -235,6 +235,41 @@ out:
 	return result;
 }
 
+static int write_pack_data(int bundle_fd, struct lock_file *lock, struct rev_info *revs)
+{
+	struct child_process pack_objects = CHILD_PROCESS_INIT;
+	int i;
+
+	argv_array_pushl(&pack_objects.args,
+			 "pack-objects", "--all-progress-implied",
+			 "--stdout", "--thin", "--delta-base-offset",
+			 NULL);
+	pack_objects.in = -1;
+	pack_objects.out = bundle_fd;
+	pack_objects.git_cmd = 1;
+	if (start_command(&pack_objects))
+		return error(_("Could not spawn pack-objects"));
+
+	/*
+	 * start_command closed bundle_fd if it was > 1
+	 * so set the lock fd to -1 so commit_lock_file()
+	 * won't fail trying to close it.
+	 */
+	lock->fd = -1;
+
+	for (i = 0; i < revs->pending.nr; i++) {
+		struct object *object = revs->pending.objects[i].item;
+		if (object->flags & UNINTERESTING)
+			write_or_die(pack_objects.in, "^", 1);
+		write_or_die(pack_objects.in, sha1_to_hex(object->sha1), 40);
+		write_or_die(pack_objects.in, "\n", 1);
+	}
+	close(pack_objects.in);
+	if (finish_command(&pack_objects))
+		return error(_("pack-objects died"));
+	return 0;
+}
+
 int create_bundle(struct bundle_header *header, const char *path,
 		  int argc, const char **argv)
 {
@@ -381,34 +416,9 @@ int create_bundle(struct bundle_header *header, const char *path,
 	write_or_die(bundle_fd, "\n", 1);
 
 	/* write pack */
-	child_process_init(&rls);
-	argv_array_pushl(&rls.args,
-			 "pack-objects", "--all-progress-implied",
-			 "--stdout", "--thin", "--delta-base-offset",
-			 NULL);
-	rls.in = -1;
-	rls.out = bundle_fd;
-	rls.git_cmd = 1;
-	if (start_command(&rls))
-		return error(_("Could not spawn pack-objects"));
-
-	/*
-	 * start_command closed bundle_fd if it was > 1
-	 * so set the lock fd to -1 so commit_lock_file()
-	 * won't fail trying to close it.
-	 */
-	lock.fd = -1;
+	if (write_pack_data(bundle_fd, &lock, &revs))
+		return -1;
 
-	for (i = 0; i < revs.pending.nr; i++) {
-		struct object *object = revs.pending.objects[i].item;
-		if (object->flags & UNINTERESTING)
-			write_or_die(rls.in, "^", 1);
-		write_or_die(rls.in, sha1_to_hex(object->sha1), 40);
-		write_or_die(rls.in, "\n", 1);
-	}
-	close(rls.in);
-	if (finish_command(&rls))
-		return error(_("pack-objects died"));
 	if (!bundle_to_stdout) {
 		if (commit_lock_file(&lock))
 			die_errno(_("cannot create '%s'"), path);
-- 
2.1.3-612-g493e79e
Previous: Junio C HamanoNext: Jeff King
Message 5 of 25 in “use child_process_init() to initialize struct child_process variables”
  1. use child_process_init() to initialize struct child_process variablesRené Scharfe, Oct 28, 2014
  2. mike.gorchak.qnx@gmail.comOct 28, 2014
  3. Jeff KingOct 29, 2014
  4. Junio C HamanoOct 29, 2014
  5. Junio C HamanoOct 30, 2014
  6. Jeff KingOct 30, 2014
  7. bundle: split out a helper function to compute and write prerequisitesJunio C Hamano, Oct 30, 2014
  8. Jeff KingOct 30, 2014
  9. Jeff KingOct 30, 2014
  10. Philip OakleyOct 31, 2014
  11. Junio C HamanoOct 31, 2014
  12. Jeff KingNov 1, 2014
  13. Philip OakleyNov 2, 2014
  14. Junio C HamanoNov 3, 2014
  15. Jeff KingNov 3, 2014
  16. Junio C HamanoNov 3, 2014
  17. Junio C HamanoNov 4, 2014
  18. Jeff KingNov 4, 2014
  19. Junio C HamanoNov 5, 2014
  20. Philip OakleyNov 5, 2014
  21. Philip OakleyNov 5, 2014
  22. Jeff KingNov 5, 2014
  23. Philip OakleyNov 5, 2014
  24. René ScharfeNov 9, 2014
  25. Jeff KingNov 10, 2014

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.