Merge branch 'cc/write-promisor-file'

A bit of code refactoring.

* cc/write-promisor-file:
  pack-write: die on error in write_promisor_file()
  fetch-pack: refactor writing promisor file
  fetch-pack: rename helper to create_promisor_file()
This commit is contained in:
Junio C Hamano 2021-01-25 14:19:19 -08:00
commit 7eefa1349b
4 changed files with 28 additions and 16 deletions

View File

@ -14,6 +14,7 @@
#include "object-store.h" #include "object-store.h"
#include "promisor-remote.h" #include "promisor-remote.h"
#include "shallow.h" #include "shallow.h"
#include "pack.h"
static int delta_base_offset = 1; static int delta_base_offset = 1;
static int pack_kept_objects = -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) { while (strbuf_getline_lf(&line, out) != EOF) {
struct string_list_item *item; struct string_list_item *item;
char *promisor_name; char *promisor_name;
int fd;
if (line.len != the_hash_algo->hexsz) if (line.len != the_hash_algo->hexsz)
die(_("repack: Expecting full hex object ID lines only from pack-objects.")); die(_("repack: Expecting full hex object ID lines only from pack-objects."));
item = string_list_append(names, line.buf); 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, promisor_name = mkpathdup("%s-%s.promisor", packtmp,
line.buf); line.buf);
fd = open(promisor_name, O_CREAT|O_EXCL|O_WRONLY, 0600); write_promisor_file(promisor_name, NULL, 0);
if (fd < 0)
die_errno(_("unable to create '%s'"), promisor_name);
close(fd);
item->util = (void *)(uintptr_t)populate_pack_exts(item->string); item->util = (void *)(uintptr_t)populate_pack_exts(item->string);

View File

@ -772,13 +772,11 @@ static int sideband_demux(int in, int out, void *data)
return ret; return ret;
} }
static void write_promisor_file(const char *keep_name, static void create_promisor_file(const char *keep_name,
struct ref **sought, int nr_sought) struct ref **sought, int nr_sought)
{ {
struct strbuf promisor_name = STRBUF_INIT; struct strbuf promisor_name = STRBUF_INIT;
int suffix_stripped; int suffix_stripped;
FILE *output;
int i;
strbuf_addstr(&promisor_name, keep_name); strbuf_addstr(&promisor_name, keep_name);
suffix_stripped = strbuf_strip_suffix(&promisor_name, ".keep"); suffix_stripped = strbuf_strip_suffix(&promisor_name, ".keep");
@ -787,11 +785,7 @@ static void write_promisor_file(const char *keep_name,
keep_name); keep_name);
strbuf_addstr(&promisor_name, ".promisor"); strbuf_addstr(&promisor_name, ".promisor");
output = xfopen(promisor_name.buf, "w"); write_promisor_file(promisor_name.buf, sought, nr_sought);
for (i = 0; i < nr_sought; i++)
fprintf(output, "%s %s\n", oid_to_hex(&sought[i]->old_oid),
sought[i]->name);
fclose(output);
strbuf_release(&promisor_name); strbuf_release(&promisor_name);
} }
@ -875,7 +869,7 @@ static int get_pack(struct fetch_pack_args *args,
if (args->from_promisor) 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 * we still need index-pack to know that this is a
* promisor pack. For example, if transfer.fsckobjects * promisor pack. For example, if transfer.fsckobjects
* is true, index-pack needs to know that .gitmodules * is true, index-pack needs to know that .gitmodules
@ -943,7 +937,7 @@ static int get_pack(struct fetch_pack_args *args,
* obtained .keep filename if necessary * obtained .keep filename if necessary
*/ */
if (do_keep && pack_lockfiles && pack_lockfiles->nr && args->from_promisor) 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; return 0;
} }

View File

@ -1,6 +1,7 @@
#include "cache.h" #include "cache.h"
#include "pack.h" #include "pack.h"
#include "csum-file.h" #include "csum-file.h"
#include "remote.h"
void reset_pack_idx_option(struct pack_idx_option *opts) void reset_pack_idx_option(struct pack_idx_option *opts)
{ {
@ -367,3 +368,18 @@ void finish_tmp_packfile(struct strbuf *name_buffer,
free((void *)idx_tmp_name); free((void *)idx_tmp_name);
} }
void write_promisor_file(const char *promisor_name, struct ref **sought, int nr_sought)
{
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);
err = ferror(output);
err |= fclose(output);
if (err)
die(_("could not write '%s' promisor file"), promisor_name);
}

4
pack.h
View File

@ -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); void fixup_pack_header_footer(int, unsigned char *, const char *, uint32_t, unsigned char *, off_t);
char *index_pack_lockfile(int fd); 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 * The "hdr" output buffer should be at least this big, which will handle sizes
* up to 2^67. * up to 2^67.