object-store: move and rename `odb_pack_keep()`
The function `odb_pack_keep()` creates a file at the passed-in path. If this fails, then the function re-tries by first creating any potentially missing leading directories and then trying to create the file once again. As such, this function doesn't host any kind of logic that is specific to the object store, but is rather a generic helper function. Rename the function to `safe_create_file_with_leading_directories()` and move it into "path.c". While at it, refactor it so that it loses its dependency on `the_repository`. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>seen
parent
56ef85e82f
commit
0b8ed25b66
|
@ -811,7 +811,8 @@ static char *keep_pack(const char *curr_index_name)
|
||||||
int keep_fd;
|
int keep_fd;
|
||||||
|
|
||||||
odb_pack_name(pack_data->repo, &name, pack_data->hash, "keep");
|
odb_pack_name(pack_data->repo, &name, pack_data->hash, "keep");
|
||||||
keep_fd = odb_pack_keep(name.buf);
|
keep_fd = safe_create_file_with_leading_directories(pack_data->repo,
|
||||||
|
name.buf);
|
||||||
if (keep_fd < 0)
|
if (keep_fd < 0)
|
||||||
die_errno("cannot create keep file");
|
die_errno("cannot create keep file");
|
||||||
write_or_die(keep_fd, keep_msg, strlen(keep_msg));
|
write_or_die(keep_fd, keep_msg, strlen(keep_msg));
|
||||||
|
|
|
@ -1565,7 +1565,7 @@ static void write_special_file(const char *suffix, const char *msg,
|
||||||
else
|
else
|
||||||
filename = odb_pack_name(the_repository, &name_buf, hash, suffix);
|
filename = odb_pack_name(the_repository, &name_buf, hash, suffix);
|
||||||
|
|
||||||
fd = odb_pack_keep(filename);
|
fd = safe_create_file_with_leading_directories(the_repository, filename);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
if (errno != EEXIST)
|
if (errno != EEXIST)
|
||||||
die_errno(_("cannot write %s file '%s'"),
|
die_errno(_("cannot write %s file '%s'"),
|
||||||
|
|
|
@ -83,19 +83,6 @@ int odb_mkstemp(struct strbuf *temp_filename, const char *pattern)
|
||||||
return xmkstemp_mode(temp_filename->buf, mode);
|
return xmkstemp_mode(temp_filename->buf, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
int odb_pack_keep(const char *name)
|
|
||||||
{
|
|
||||||
int fd;
|
|
||||||
|
|
||||||
fd = open(name, O_RDWR|O_CREAT|O_EXCL, 0600);
|
|
||||||
if (0 <= fd)
|
|
||||||
return fd;
|
|
||||||
|
|
||||||
/* slow path */
|
|
||||||
safe_create_leading_directories_const(the_repository, name);
|
|
||||||
return open(name, O_RDWR|O_CREAT|O_EXCL, 0600);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return non-zero iff the path is usable as an alternate object database.
|
* Return non-zero iff the path is usable as an alternate object database.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -189,13 +189,6 @@ void raw_object_store_clear(struct raw_object_store *o);
|
||||||
*/
|
*/
|
||||||
int odb_mkstemp(struct strbuf *temp_filename, const char *pattern);
|
int odb_mkstemp(struct strbuf *temp_filename, const char *pattern);
|
||||||
|
|
||||||
/*
|
|
||||||
* Create a pack .keep file named "name" (which should generally be the output
|
|
||||||
* of odb_pack_name). Returns a file descriptor opened for writing, or -1 on
|
|
||||||
* error.
|
|
||||||
*/
|
|
||||||
int odb_pack_keep(const char *name);
|
|
||||||
|
|
||||||
void *map_loose_object(struct repository *r, const struct object_id *oid,
|
void *map_loose_object(struct repository *r, const struct object_id *oid,
|
||||||
unsigned long *size);
|
unsigned long *size);
|
||||||
|
|
||||||
|
|
14
path.c
14
path.c
|
@ -1011,6 +1011,20 @@ enum scld_error safe_create_leading_directories_const(struct repository *repo,
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int safe_create_file_with_leading_directories(struct repository *repo,
|
||||||
|
const char *path)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
fd = open(path, O_RDWR|O_CREAT|O_EXCL, 0600);
|
||||||
|
if (0 <= fd)
|
||||||
|
return fd;
|
||||||
|
|
||||||
|
/* slow path */
|
||||||
|
safe_create_leading_directories_const(repo, path);
|
||||||
|
return open(path, O_RDWR|O_CREAT|O_EXCL, 0600);
|
||||||
|
}
|
||||||
|
|
||||||
static int have_same_root(const char *path1, const char *path2)
|
static int have_same_root(const char *path1, const char *path2)
|
||||||
{
|
{
|
||||||
int is_abs1, is_abs2;
|
int is_abs1, is_abs2;
|
||||||
|
|
7
path.h
7
path.h
|
@ -266,6 +266,13 @@ enum scld_error safe_create_leading_directories_const(struct repository *repo,
|
||||||
const char *path);
|
const char *path);
|
||||||
enum scld_error safe_create_leading_directories_no_share(char *path);
|
enum scld_error safe_create_leading_directories_no_share(char *path);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create a file, potentially creating its leading directories in case they
|
||||||
|
* don't exist. Returns the return value of the open(3p) call.
|
||||||
|
*/
|
||||||
|
int safe_create_file_with_leading_directories(struct repository *repo,
|
||||||
|
const char *path);
|
||||||
|
|
||||||
# ifdef USE_THE_REPOSITORY_VARIABLE
|
# ifdef USE_THE_REPOSITORY_VARIABLE
|
||||||
# include "strbuf.h"
|
# include "strbuf.h"
|
||||||
# include "repository.h"
|
# include "repository.h"
|
||||||
|
|
Loading…
Reference in New Issue