packed-backend: rip out some now-unused code
Now the outside world interacts with the packed ref store only via the generic refs API plus a few lock-related functions. This allows us to delete some functions that are no longer used, thereby completing the encapsulation of the packed ref store. Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
dc39e09942
commit
9939b33d6a
|
@ -91,19 +91,6 @@ struct ref_store *packed_ref_store_create(const char *path,
|
||||||
return ref_store;
|
return ref_store;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Die if refs is not the main ref store. caller is used in any
|
|
||||||
* necessary error messages.
|
|
||||||
*/
|
|
||||||
static void packed_assert_main_repository(struct packed_ref_store *refs,
|
|
||||||
const char *caller)
|
|
||||||
{
|
|
||||||
if (refs->store_flags & REF_STORE_MAIN)
|
|
||||||
return;
|
|
||||||
|
|
||||||
die("BUG: operation %s only allowed for main ref store", caller);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Downcast `ref_store` to `packed_ref_store`. Die if `ref_store` is
|
* Downcast `ref_store` to `packed_ref_store`. Die if `ref_store` is
|
||||||
* not a `packed_ref_store`. Also die if `packed_ref_store` doesn't
|
* not a `packed_ref_store`. Also die if `packed_ref_store` doesn't
|
||||||
|
@ -321,40 +308,6 @@ static struct ref_dir *get_packed_refs(struct packed_ref_store *refs)
|
||||||
return get_packed_ref_dir(get_packed_ref_cache(refs));
|
return get_packed_ref_dir(get_packed_ref_cache(refs));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Add or overwrite a reference in the in-memory packed reference
|
|
||||||
* cache. This may only be called while the packed-refs file is locked
|
|
||||||
* (see packed_refs_lock()). To actually write the packed-refs file,
|
|
||||||
* call commit_packed_refs().
|
|
||||||
*/
|
|
||||||
void add_packed_ref(struct ref_store *ref_store,
|
|
||||||
const char *refname, const struct object_id *oid)
|
|
||||||
{
|
|
||||||
struct packed_ref_store *refs =
|
|
||||||
packed_downcast(ref_store, REF_STORE_WRITE,
|
|
||||||
"add_packed_ref");
|
|
||||||
struct ref_dir *packed_refs;
|
|
||||||
struct ref_entry *packed_entry;
|
|
||||||
|
|
||||||
if (!is_lock_file_locked(&refs->lock))
|
|
||||||
die("BUG: packed refs not locked");
|
|
||||||
|
|
||||||
if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL))
|
|
||||||
die("Reference has invalid format: '%s'", refname);
|
|
||||||
|
|
||||||
packed_refs = get_packed_refs(refs);
|
|
||||||
packed_entry = find_ref_entry(packed_refs, refname);
|
|
||||||
if (packed_entry) {
|
|
||||||
/* Overwrite the existing entry: */
|
|
||||||
oidcpy(&packed_entry->u.value.oid, oid);
|
|
||||||
packed_entry->flag = REF_ISPACKED;
|
|
||||||
oidclr(&packed_entry->u.value.peeled);
|
|
||||||
} else {
|
|
||||||
packed_entry = create_ref_entry(refname, oid, REF_ISPACKED);
|
|
||||||
add_ref_entry(packed_refs, packed_entry);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return the ref_entry for the given refname from the packed
|
* Return the ref_entry for the given refname from the packed
|
||||||
* references. If it does not exist, return NULL.
|
* references. If it does not exist, return NULL.
|
||||||
|
@ -596,152 +549,6 @@ int packed_refs_is_locked(struct ref_store *ref_store)
|
||||||
static const char PACKED_REFS_HEADER[] =
|
static const char PACKED_REFS_HEADER[] =
|
||||||
"# pack-refs with: peeled fully-peeled \n";
|
"# pack-refs with: peeled fully-peeled \n";
|
||||||
|
|
||||||
/*
|
|
||||||
* Write the current version of the packed refs cache from memory to
|
|
||||||
* disk. The packed-refs file must already be locked for writing (see
|
|
||||||
* packed_refs_lock()). Return zero on success. On errors, rollback
|
|
||||||
* the lockfile, write an error message to `err`, and return a nonzero
|
|
||||||
* value.
|
|
||||||
*/
|
|
||||||
int commit_packed_refs(struct ref_store *ref_store, struct strbuf *err)
|
|
||||||
{
|
|
||||||
struct packed_ref_store *refs =
|
|
||||||
packed_downcast(ref_store, REF_STORE_WRITE | REF_STORE_MAIN,
|
|
||||||
"commit_packed_refs");
|
|
||||||
struct packed_ref_cache *packed_ref_cache =
|
|
||||||
get_packed_ref_cache(refs);
|
|
||||||
int ok;
|
|
||||||
int ret = -1;
|
|
||||||
struct strbuf sb = STRBUF_INIT;
|
|
||||||
FILE *out;
|
|
||||||
struct ref_iterator *iter;
|
|
||||||
char *packed_refs_path;
|
|
||||||
|
|
||||||
if (!is_lock_file_locked(&refs->lock))
|
|
||||||
die("BUG: commit_packed_refs() called when unlocked");
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If packed-refs is a symlink, we want to overwrite the
|
|
||||||
* symlinked-to file, not the symlink itself. Also, put the
|
|
||||||
* staging file next to it:
|
|
||||||
*/
|
|
||||||
packed_refs_path = get_locked_file_path(&refs->lock);
|
|
||||||
strbuf_addf(&sb, "%s.new", packed_refs_path);
|
|
||||||
if (create_tempfile(&refs->tempfile, sb.buf) < 0) {
|
|
||||||
strbuf_addf(err, "unable to create file %s: %s",
|
|
||||||
sb.buf, strerror(errno));
|
|
||||||
strbuf_release(&sb);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
strbuf_release(&sb);
|
|
||||||
|
|
||||||
out = fdopen_tempfile(&refs->tempfile, "w");
|
|
||||||
if (!out) {
|
|
||||||
strbuf_addf(err, "unable to fdopen packed-refs tempfile: %s",
|
|
||||||
strerror(errno));
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fprintf(out, "%s", PACKED_REFS_HEADER) < 0) {
|
|
||||||
strbuf_addf(err, "error writing to %s: %s",
|
|
||||||
get_tempfile_path(&refs->tempfile), strerror(errno));
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
iter = cache_ref_iterator_begin(packed_ref_cache->cache, NULL, 0);
|
|
||||||
while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
|
|
||||||
struct object_id peeled;
|
|
||||||
int peel_error = ref_iterator_peel(iter, &peeled);
|
|
||||||
|
|
||||||
if (write_packed_entry(out, iter->refname, iter->oid->hash,
|
|
||||||
peel_error ? NULL : peeled.hash)) {
|
|
||||||
strbuf_addf(err, "error writing to %s: %s",
|
|
||||||
get_tempfile_path(&refs->tempfile),
|
|
||||||
strerror(errno));
|
|
||||||
ref_iterator_abort(iter);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ok != ITER_DONE) {
|
|
||||||
strbuf_addf(err, "unable to rewrite packed-refs file: "
|
|
||||||
"error iterating over old contents");
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rename_tempfile(&refs->tempfile, packed_refs_path)) {
|
|
||||||
strbuf_addf(err, "error replacing %s: %s",
|
|
||||||
refs->path, strerror(errno));
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = 0;
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
error:
|
|
||||||
delete_tempfile(&refs->tempfile);
|
|
||||||
|
|
||||||
out:
|
|
||||||
free(packed_refs_path);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Rewrite the packed-refs file, omitting any refs listed in
|
|
||||||
* 'refnames'. On error, leave packed-refs unchanged, write an error
|
|
||||||
* message to 'err', and return a nonzero value. The packed refs lock
|
|
||||||
* must be held when calling this function; it will still be held when
|
|
||||||
* the function returns.
|
|
||||||
*
|
|
||||||
* The refs in 'refnames' needn't be sorted. `err` must not be NULL.
|
|
||||||
*/
|
|
||||||
int repack_without_refs(struct ref_store *ref_store,
|
|
||||||
struct string_list *refnames, struct strbuf *err)
|
|
||||||
{
|
|
||||||
struct packed_ref_store *refs =
|
|
||||||
packed_downcast(ref_store, REF_STORE_WRITE | REF_STORE_MAIN,
|
|
||||||
"repack_without_refs");
|
|
||||||
struct ref_dir *packed;
|
|
||||||
struct string_list_item *refname;
|
|
||||||
int needs_repacking = 0, removed = 0;
|
|
||||||
|
|
||||||
packed_assert_main_repository(refs, "repack_without_refs");
|
|
||||||
assert(err);
|
|
||||||
|
|
||||||
if (!is_lock_file_locked(&refs->lock))
|
|
||||||
die("BUG: repack_without_refs called without holding lock");
|
|
||||||
|
|
||||||
/* Look for a packed ref */
|
|
||||||
for_each_string_list_item(refname, refnames) {
|
|
||||||
if (get_packed_ref(refs, refname->string)) {
|
|
||||||
needs_repacking = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Avoid locking if we have nothing to do */
|
|
||||||
if (!needs_repacking)
|
|
||||||
return 0; /* no refname exists in packed refs */
|
|
||||||
|
|
||||||
packed = get_packed_refs(refs);
|
|
||||||
|
|
||||||
/* Remove refnames from the cache */
|
|
||||||
for_each_string_list_item(refname, refnames)
|
|
||||||
if (remove_entry_from_dir(packed, refname->string) != -1)
|
|
||||||
removed = 1;
|
|
||||||
if (!removed) {
|
|
||||||
/*
|
|
||||||
* All packed entries disappeared while we were
|
|
||||||
* acquiring the lock.
|
|
||||||
*/
|
|
||||||
clear_packed_ref_cache(refs);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write what remains */
|
|
||||||
return commit_packed_refs(&refs->base, err);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int packed_init_db(struct ref_store *ref_store, struct strbuf *err)
|
static int packed_init_db(struct ref_store *ref_store, struct strbuf *err)
|
||||||
{
|
{
|
||||||
/* Nothing to do. */
|
/* Nothing to do. */
|
||||||
|
|
|
@ -23,12 +23,4 @@ int packed_refs_lock(struct ref_store *ref_store, int flags, struct strbuf *err)
|
||||||
void packed_refs_unlock(struct ref_store *ref_store);
|
void packed_refs_unlock(struct ref_store *ref_store);
|
||||||
int packed_refs_is_locked(struct ref_store *ref_store);
|
int packed_refs_is_locked(struct ref_store *ref_store);
|
||||||
|
|
||||||
void add_packed_ref(struct ref_store *ref_store,
|
|
||||||
const char *refname, const struct object_id *oid);
|
|
||||||
|
|
||||||
int commit_packed_refs(struct ref_store *ref_store, struct strbuf *err);
|
|
||||||
|
|
||||||
int repack_without_refs(struct ref_store *ref_store,
|
|
||||||
struct string_list *refnames, struct strbuf *err);
|
|
||||||
|
|
||||||
#endif /* REFS_PACKED_BACKEND_H */
|
#endif /* REFS_PACKED_BACKEND_H */
|
||||||
|
|
Loading…
Reference in New Issue