Re: [PATCH 06/10] refs: skip collision checks in initial transactions

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Patrick Steinhardt <ps@xxxxxx> writes:

[snip]

> diff --git a/refs.c b/refs.c
> index 0f10c565bbb4e0d91210c52a3221a224e4264d28..d690eb19b3fd7083a5309deb98738547e4f48040 100644
> --- a/refs.c
> +++ b/refs.c
> @@ -2324,6 +2324,7 @@ int refs_verify_refname_available(struct ref_store *refs,
>  				  const char *refname,
>  				  const struct string_list *extras,
>  				  const struct string_list *skip,
> +				  int initial_transaction,
>  				  struct strbuf *err)
>  {
>  	const char *slash;
> @@ -2332,8 +2333,6 @@ int refs_verify_refname_available(struct ref_store *refs,
>  	struct strbuf referent = STRBUF_INIT;
>  	struct object_id oid;
>  	unsigned int type;
> -	struct ref_iterator *iter;
> -	int ok;
>  	int ret = -1;
>
>  	/*
> @@ -2363,7 +2362,8 @@ int refs_verify_refname_available(struct ref_store *refs,
>  		if (skip && string_list_has_string(skip, dirname.buf))
>  			continue;
>
> -		if (!refs_read_raw_ref(refs, dirname.buf, &oid, &referent,
> +		if (!initial_transaction &&
> +		    !refs_read_raw_ref(refs, dirname.buf, &oid, &referent,

Nit: It would be nice to have a comment here, perhaps something like:
     /* in initial transaction there are no refs in the ref store */

>  				       &type, &ignore_errno)) {
>  			strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
>  				    dirname.buf, refname);
> @@ -2388,21 +2388,26 @@ int refs_verify_refname_available(struct ref_store *refs,
>  	strbuf_addstr(&dirname, refname + dirname.len);
>  	strbuf_addch(&dirname, '/');
>
> -	iter = refs_ref_iterator_begin(refs, dirname.buf, NULL, 0,
> -				       DO_FOR_EACH_INCLUDE_BROKEN);
> -	while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
> -		if (skip &&
> -		    string_list_has_string(skip, iter->refname))
> -			continue;
> +	if (!initial_transaction) {
> +		struct ref_iterator *iter;
> +		int ok;
>
> -		strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
> -			    iter->refname, refname);
> -		ref_iterator_abort(iter);
> -		goto cleanup;
> -	}
> +		iter = refs_ref_iterator_begin(refs, dirname.buf, NULL, 0,
> +					       DO_FOR_EACH_INCLUDE_BROKEN);
> +		while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
> +			if (skip &&
> +			    string_list_has_string(skip, iter->refname))
> +				continue;
>
> -	if (ok != ITER_DONE)
> -		BUG("error while iterating over references");
> +			strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
> +				    iter->refname, refname);
> +			ref_iterator_abort(iter);
> +			goto cleanup;
> +		}
> +
> +		if (ok != ITER_DONE)
> +			BUG("error while iterating over references");
> +	}
>
>  	extra_refname = find_descendant_ref(dirname.buf, extras, skip);
>  	if (extra_refname)
> diff --git a/refs.h b/refs.h
> index 024a370554e013d66febee635e4c0415ba061fe6..980bd20cf24e15144aeff991eeba8b27a936d386 100644
> --- a/refs.h
> +++ b/refs.h
> @@ -101,13 +101,16 @@ int refs_read_symbolic_ref(struct ref_store *ref_store, const char *refname,
>   * both "foo" and with "foo/bar/baz" but not with "foo/bar" or
>   * "foo/barbados".
>   *
> + * If `initial_transaction` is truish, then all collision checks with
> + * preexisting refs are skipped.
> + *

Okay we have it here, so this should do.

[snip]

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux