Brad King <[email protected]> writes:
> Generalize repack_without_ref as repack_without_refs to support a list
> of refs and implement the former in terms of the latter.
>
> Signed-off-by: Brad King <[email protected]>
> ---
> refs.c | 29 ++++++++++++++++++++++-------
> 1 file changed, 22 insertions(+), 7 deletions(-)
>
> diff --git a/refs.c b/refs.c
> index 5908648..5a6c14e 100644
> --- a/refs.c
> +++ b/refs.c
> @@ -2414,25 +2414,35 @@ static int curate_packed_ref_fn(struct ref_entry
> *entry, void *cb_data)
> return 0;
> }
>
> -static int repack_without_ref(const char *refname)
> +static int repack_without_refs(const char **refnames, int n)
> {
> struct ref_dir *packed;
> struct string_list refs_to_delete = STRING_LIST_INIT_DUP;
> struct string_list_item *ref_to_delete;
> + int i, removed = 0;
> +
> + /* Look for a packed ref: */
> + for (i = 0; i < n; ++i)
> + if (get_packed_ref(refnames[i]))
> + break;
>
> - if (!get_packed_ref(refname))
> - return 0; /* refname does not exist in packed refs */
> + /* Avoid locking if we have nothing to do: */
> + if(i == n)
Style:
if (i == n)
> + return 0; /* no refname exists in packed refs */
>
> if (lock_packed_refs(0)) {
> unable_to_lock_error(git_path("packed-refs"), errno);
> - return error("cannot delete '%s' from packed refs", refname);
> + return error("cannot delete '%s' from packed refs",
> refnames[i]);
> }
> packed = get_packed_refs(&ref_cache);
>
> - /* Remove refname from the cache: */
> - if (remove_entry(packed, refname) == -1) {
> + /* Remove refnames from the cache: */
> + for (i = 0; i < n; ++i)
> + if (remove_entry(packed, refnames[i]) != -1)
> + removed = 1;
> + if (!removed) {
> /*
> - * The packed entry disappeared while we were
> + * All packed entries disappeared while we were
> * acquiring the lock.
> */
> rollback_packed_refs();
... and this is not an error; somebody else did the work we wanted
to do for us, which is good ;-)
> @@ -2450,6 +2460,11 @@ static int repack_without_ref(const char *refname)
> return commit_packed_refs();
> }
>
> +static int repack_without_ref(const char *refname)
> +{
> + return repack_without_refs(&refname, 1);
> +}
> +
> static int delete_ref_loose(struct ref_lock *lock, int type)
> {
> int err, i, ret = 0;
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html