git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/3] Refactor writing promisor file
@ 2021-01-14 15:50 Christian Couder
  2021-01-14 15:50 ` [PATCH v2 1/3] fetch-pack: rename helper to create_promisor_file() Christian Couder
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Christian Couder @ 2021-01-14 15:50 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, Christian Couder, Jonathan Tan, Jeff King, Taylor Blau

This is a small patch series to refactor the code that actually writes
a promisor file (<pack-name>.promisor) into a write_promisor_file()
function, and then to improve it a bit.

Compared to version 1 of this patch series, the only difference is
that patch 3/3 has been added to die() in case of error, instead of
ignoring it, when actually writing the content of the file or closing
it. Thanks to Peff and Taylor for their suggestions.

Discussion about V1:
  https://lore.kernel.org/git/20210112082159.2277214-1-chriscool@tuxfamily.org/

Christian Couder (3):
  fetch-pack: rename helper to create_promisor_file()
  fetch-pack: refactor writing promisor file
  pack-write: die on error in write_promisor_file()

 builtin/repack.c |  8 +++-----
 fetch-pack.c     | 16 +++++-----------
 pack-write.c     | 16 ++++++++++++++++
 pack.h           |  4 ++++
 4 files changed, 28 insertions(+), 16 deletions(-)

-- 
2.30.0.83.g36fd80b35a.dirty


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v2 1/3] fetch-pack: rename helper to create_promisor_file()
  2021-01-14 15:50 [PATCH v2 0/3] Refactor writing promisor file Christian Couder
@ 2021-01-14 15:50 ` Christian Couder
  2021-01-14 15:50 ` [PATCH v2 2/3] fetch-pack: refactor writing promisor file Christian Couder
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Christian Couder @ 2021-01-14 15:50 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, Christian Couder, Jonathan Tan, Jeff King, Taylor Blau

As we are going to refactor the code that actually writes
the promisor file into a separate function in a following
commit, let's rename the current write_promisor_file()
function to create_promisor_file().

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
---
 fetch-pack.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/fetch-pack.c b/fetch-pack.c
index 876f90c759..c5fa4992a6 100644
--- a/fetch-pack.c
+++ b/fetch-pack.c
@@ -772,8 +772,8 @@ static int sideband_demux(int in, int out, void *data)
 	return ret;
 }
 
-static void write_promisor_file(const char *keep_name,
-				struct ref **sought, int nr_sought)
+static void create_promisor_file(const char *keep_name,
+				 struct ref **sought, int nr_sought)
 {
 	struct strbuf promisor_name = STRBUF_INIT;
 	int suffix_stripped;
@@ -875,7 +875,7 @@ static int get_pack(struct fetch_pack_args *args,
 
 		if (args->from_promisor)
 			/*
-			 * write_promisor_file() may be called afterwards but
+			 * create_promisor_file() may be called afterwards but
 			 * we still need index-pack to know that this is a
 			 * promisor pack. For example, if transfer.fsckobjects
 			 * is true, index-pack needs to know that .gitmodules
@@ -943,7 +943,7 @@ static int get_pack(struct fetch_pack_args *args,
 	 * obtained .keep filename if necessary
 	 */
 	if (do_keep && pack_lockfiles && pack_lockfiles->nr && args->from_promisor)
-		write_promisor_file(pack_lockfiles->items[0].string, sought, nr_sought);
+		create_promisor_file(pack_lockfiles->items[0].string, sought, nr_sought);
 
 	return 0;
 }
-- 
2.30.0.83.g36fd80b35a.dirty


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v2 2/3] fetch-pack: refactor writing promisor file
  2021-01-14 15:50 [PATCH v2 0/3] Refactor writing promisor file Christian Couder
  2021-01-14 15:50 ` [PATCH v2 1/3] fetch-pack: rename helper to create_promisor_file() Christian Couder
@ 2021-01-14 15:50 ` Christian Couder
  2021-01-14 15:50 ` [PATCH v2 3/3] pack-write: die on error in write_promisor_file() Christian Couder
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Christian Couder @ 2021-01-14 15:50 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, Christian Couder, Jonathan Tan, Jeff King, Taylor Blau

Let's replace the 2 different pieces of code that write a
promisor file in 'builtin/repack.c' and 'fetch-pack.c'
with a new function called 'write_promisor_file()' in
'pack-write.c' and 'pack.h'.

This might also help us in the future, if we want to put
back the ref names and associated hashes that were in
the promisor files we are repacking in 'builtin/repack.c'
as suggested by a NEEDSWORK comment just above the code
we are refactoring.

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
---
 builtin/repack.c |  8 +++-----
 fetch-pack.c     |  8 +-------
 pack-write.c     | 12 ++++++++++++
 pack.h           |  4 ++++
 4 files changed, 20 insertions(+), 12 deletions(-)

diff --git a/builtin/repack.c b/builtin/repack.c
index 279be11a16..2158b48f4c 100644
--- a/builtin/repack.c
+++ b/builtin/repack.c
@@ -14,6 +14,7 @@
 #include "object-store.h"
 #include "promisor-remote.h"
 #include "shallow.h"
+#include "pack.h"
 
 static int delta_base_offset = 1;
 static int pack_kept_objects = -1;
@@ -263,7 +264,7 @@ static void repack_promisor_objects(const struct pack_objects_args *args,
 	while (strbuf_getline_lf(&line, out) != EOF) {
 		struct string_list_item *item;
 		char *promisor_name;
-		int fd;
+
 		if (line.len != the_hash_algo->hexsz)
 			die(_("repack: Expecting full hex object ID lines only from pack-objects."));
 		item = string_list_append(names, line.buf);
@@ -281,10 +282,7 @@ static void repack_promisor_objects(const struct pack_objects_args *args,
 		 */
 		promisor_name = mkpathdup("%s-%s.promisor", packtmp,
 					  line.buf);
-		fd = open(promisor_name, O_CREAT|O_EXCL|O_WRONLY, 0600);
-		if (fd < 0)
-			die_errno(_("unable to create '%s'"), promisor_name);
-		close(fd);
+		write_promisor_file(promisor_name, NULL, 0);
 
 		item->util = (void *)(uintptr_t)populate_pack_exts(item->string);
 
diff --git a/fetch-pack.c b/fetch-pack.c
index c5fa4992a6..1eaedcb5dc 100644
--- a/fetch-pack.c
+++ b/fetch-pack.c
@@ -777,8 +777,6 @@ static void create_promisor_file(const char *keep_name,
 {
 	struct strbuf promisor_name = STRBUF_INIT;
 	int suffix_stripped;
-	FILE *output;
-	int i;
 
 	strbuf_addstr(&promisor_name, keep_name);
 	suffix_stripped = strbuf_strip_suffix(&promisor_name, ".keep");
@@ -787,11 +785,7 @@ static void create_promisor_file(const char *keep_name,
 		    keep_name);
 	strbuf_addstr(&promisor_name, ".promisor");
 
-	output = xfopen(promisor_name.buf, "w");
-	for (i = 0; i < nr_sought; i++)
-		fprintf(output, "%s %s\n", oid_to_hex(&sought[i]->old_oid),
-			sought[i]->name);
-	fclose(output);
+	write_promisor_file(promisor_name.buf, sought, nr_sought);
 
 	strbuf_release(&promisor_name);
 }
diff --git a/pack-write.c b/pack-write.c
index 3513665e1e..db3ff9980f 100644
--- a/pack-write.c
+++ b/pack-write.c
@@ -1,6 +1,7 @@
 #include "cache.h"
 #include "pack.h"
 #include "csum-file.h"
+#include "remote.h"
 
 void reset_pack_idx_option(struct pack_idx_option *opts)
 {
@@ -367,3 +368,14 @@ void finish_tmp_packfile(struct strbuf *name_buffer,
 
 	free((void *)idx_tmp_name);
 }
+
+void write_promisor_file(const char *promisor_name, struct ref **sought, int nr_sought)
+{
+	int i;
+	FILE *output = xfopen(promisor_name, "w");
+
+	for (i = 0; i < nr_sought; i++)
+		fprintf(output, "%s %s\n", oid_to_hex(&sought[i]->old_oid),
+			sought[i]->name);
+	fclose(output);
+}
diff --git a/pack.h b/pack.h
index 9fc0945ac9..9ae640f417 100644
--- a/pack.h
+++ b/pack.h
@@ -87,6 +87,10 @@ off_t write_pack_header(struct hashfile *f, uint32_t);
 void fixup_pack_header_footer(int, unsigned char *, const char *, uint32_t, unsigned char *, off_t);
 char *index_pack_lockfile(int fd);
 
+struct ref;
+
+void write_promisor_file(const char *promisor_name, struct ref **sought, int nr_sought);
+
 /*
  * The "hdr" output buffer should be at least this big, which will handle sizes
  * up to 2^67.
-- 
2.30.0.83.g36fd80b35a.dirty


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v2 3/3] pack-write: die on error in write_promisor_file()
  2021-01-14 15:50 [PATCH v2 0/3] Refactor writing promisor file Christian Couder
  2021-01-14 15:50 ` [PATCH v2 1/3] fetch-pack: rename helper to create_promisor_file() Christian Couder
  2021-01-14 15:50 ` [PATCH v2 2/3] fetch-pack: refactor writing promisor file Christian Couder
@ 2021-01-14 15:50 ` Christian Couder
  2021-01-14 17:23 ` [PATCH v2 0/3] Refactor writing promisor file Taylor Blau
  2021-01-14 20:11 ` Jeff King
  4 siblings, 0 replies; 6+ messages in thread
From: Christian Couder @ 2021-01-14 15:50 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, Christian Couder, Jonathan Tan, Jeff King, Taylor Blau

write_promisor_file() already uses xfopen(), so it would die
if the file cannot be opened for writing. To be consistent
with this behavior and not overlook issues, let's also die if
there are errors when we are actually writing to the file.

Suggested-by: Jeff King <peff@peff.net>
Suggested-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
---
 pack-write.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/pack-write.c b/pack-write.c
index db3ff9980f..e9bb3fd949 100644
--- a/pack-write.c
+++ b/pack-write.c
@@ -371,11 +371,15 @@ void finish_tmp_packfile(struct strbuf *name_buffer,
 
 void write_promisor_file(const char *promisor_name, struct ref **sought, int nr_sought)
 {
-	int i;
+	int i, err;
 	FILE *output = xfopen(promisor_name, "w");
 
 	for (i = 0; i < nr_sought; i++)
 		fprintf(output, "%s %s\n", oid_to_hex(&sought[i]->old_oid),
 			sought[i]->name);
-	fclose(output);
+
+	err = ferror(output);
+	err |= fclose(output);
+	if (err)
+		die(_("could not write '%s' promisor file"), promisor_name);
 }
-- 
2.30.0.83.g36fd80b35a.dirty


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 0/3] Refactor writing promisor file
  2021-01-14 15:50 [PATCH v2 0/3] Refactor writing promisor file Christian Couder
                   ` (2 preceding siblings ...)
  2021-01-14 15:50 ` [PATCH v2 3/3] pack-write: die on error in write_promisor_file() Christian Couder
@ 2021-01-14 17:23 ` Taylor Blau
  2021-01-14 20:11 ` Jeff King
  4 siblings, 0 replies; 6+ messages in thread
From: Taylor Blau @ 2021-01-14 17:23 UTC (permalink / raw)
  To: Christian Couder
  Cc: git, Junio C Hamano, Christian Couder, Jonathan Tan, Jeff King,
	Taylor Blau

On Thu, Jan 14, 2021 at 04:50:13PM +0100, Christian Couder wrote:
> Compared to version 1 of this patch series, the only difference is
> that patch 3/3 has been added to die() in case of error, instead of
> ignoring it, when actually writing the content of the file or closing
> it. Thanks to Peff and Taylor for their suggestions.

Thanks, this version looks good to me.

Thanks,
Taylor

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 0/3] Refactor writing promisor file
  2021-01-14 15:50 [PATCH v2 0/3] Refactor writing promisor file Christian Couder
                   ` (3 preceding siblings ...)
  2021-01-14 17:23 ` [PATCH v2 0/3] Refactor writing promisor file Taylor Blau
@ 2021-01-14 20:11 ` Jeff King
  4 siblings, 0 replies; 6+ messages in thread
From: Jeff King @ 2021-01-14 20:11 UTC (permalink / raw)
  To: Christian Couder
  Cc: git, Junio C Hamano, Christian Couder, Jonathan Tan, Taylor Blau

On Thu, Jan 14, 2021 at 04:50:13PM +0100, Christian Couder wrote:

> This is a small patch series to refactor the code that actually writes
> a promisor file (<pack-name>.promisor) into a write_promisor_file()
> function, and then to improve it a bit.
> 
> Compared to version 1 of this patch series, the only difference is
> that patch 3/3 has been added to die() in case of error, instead of
> ignoring it, when actually writing the content of the file or closing
> it. Thanks to Peff and Taylor for their suggestions.

These look great to me. Thanks for adding the extra error handling.

-Peff

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2021-01-14 20:12 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-01-14 15:50 [PATCH v2 0/3] Refactor writing promisor file Christian Couder
2021-01-14 15:50 ` [PATCH v2 1/3] fetch-pack: rename helper to create_promisor_file() Christian Couder
2021-01-14 15:50 ` [PATCH v2 2/3] fetch-pack: refactor writing promisor file Christian Couder
2021-01-14 15:50 ` [PATCH v2 3/3] pack-write: die on error in write_promisor_file() Christian Couder
2021-01-14 17:23 ` [PATCH v2 0/3] Refactor writing promisor file Taylor Blau
2021-01-14 20:11 ` Jeff King

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).