Skip to content

Commit

Permalink
repack: refactor pack deletion for future use
Browse files Browse the repository at this point in the history
The repack builtin deletes redundant pack-files and their
associated .idx, .promisor, .bitmap, and .keep files. We will want
to re-use this logic in the future for other types of repack, so
pull the logic into 'unlink_pack_path()' in packfile.c.

The 'ignore_keep' parameter is enabled for the use in repack, but
will be important for a future caller.

Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
  • Loading branch information
derrickstolee authored and dscho committed Jun 8, 2019
1 parent bbbea4e commit 322f9eb
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 12 deletions.
14 changes: 2 additions & 12 deletions builtin/repack.c
Original file line number Diff line number Diff line change
Expand Up @@ -129,19 +129,9 @@ static void get_non_kept_pack_filenames(struct string_list *fname_list,

static void remove_redundant_pack(const char *dir_name, const char *base_name)
{
const char *exts[] = {".pack", ".idx", ".keep", ".bitmap", ".promisor"};
int i;
struct strbuf buf = STRBUF_INIT;
size_t plen;

strbuf_addf(&buf, "%s/%s", dir_name, base_name);
plen = buf.len;

for (i = 0; i < ARRAY_SIZE(exts); i++) {
strbuf_setlen(&buf, plen);
strbuf_addstr(&buf, exts[i]);
unlink(buf.buf);
}
strbuf_addf(&buf, "%s/%s.pack", dir_name, base_name);
unlink_pack_path(buf.buf, 1);
strbuf_release(&buf);
}

Expand Down
28 changes: 28 additions & 0 deletions packfile.c
Original file line number Diff line number Diff line change
Expand Up @@ -355,6 +355,34 @@ void close_object_store(struct raw_object_store *o)
close_commit_graph(o);
}

void unlink_pack_path(const char *pack_name, int force_delete)
{
static const char *exts[] = {".pack", ".idx", ".keep", ".bitmap", ".promisor"};
int i;
struct strbuf buf = STRBUF_INIT;
size_t plen;

strbuf_addstr(&buf, pack_name);
strip_suffix_mem(buf.buf, &buf.len, ".pack");
plen = buf.len;

if (!force_delete) {
strbuf_addstr(&buf, ".keep");
if (!access(buf.buf, F_OK)) {
strbuf_release(&buf);
return;
}
}

for (i = 0; i < ARRAY_SIZE(exts); i++) {
strbuf_setlen(&buf, plen);
strbuf_addstr(&buf, exts[i]);
unlink(buf.buf);
}

strbuf_release(&buf);
}

/*
* The LRU pack is the one with the oldest MRU window, preferring packs
* with no used windows, or the oldest mtime if it has no windows allocated.
Expand Down
7 changes: 7 additions & 0 deletions packfile.h
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,13 @@ void unuse_pack(struct pack_window **);
void clear_delta_base_cache(void);
struct packed_git *add_packed_git(const char *path, size_t path_len, int local);

/*
* Unlink the .pack and associated extension files.
* Does not unlink if 'force_delete' is false and the pack-file is
* marked as ".keep".
*/
extern void unlink_pack_path(const char *pack_name, int force_delete);

/*
* Make sure that a pointer access into an mmap'd index file is within bounds,
* and can provide at least 8 bytes of data.
Expand Down

0 comments on commit 322f9eb

Please sign in to comment.