git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v3 01/44] refs.c: create a public version of verify_refname_available

From
Michael Haggerty <mhagger@alum.mit.edu>
Date
Oct 13, 2015, 02:28 UTC
Message-ID
<561C6C47.7090108@alum.mit.edu>
In-Reply-To
<1444686725-27660-2-git-send-email-dturner@twopensource.com>
On 10/12/2015 11:51 PM, David Turner wrote:
Show 63 quoted lines
> From: Ronnie Sahlberg <sahlberg@google.com>
> 
> Create a public version of verify_refname_available that backends can
> provide.
> 
> Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
> Signed-off-by: David Turner <dturner@twopensource.com>
> ---
>  refs.c | 65 ++++++++++++++++++++++++++++++-----------------------------------
>  refs.h | 17 +++++++++++++++++
>  2 files changed, 47 insertions(+), 35 deletions(-)
> 
> diff --git a/refs.c b/refs.c
> index 132eff5..fe71ea0 100644
> --- a/refs.c
> +++ b/refs.c
> @@ -279,7 +279,7 @@ struct ref_dir {
>   * presence of an empty subdirectory does not block the creation of a
>   * similarly-named reference.  (The fact that reference names with the
>   * same leading components can conflict *with each other* is a
> - * separate issue that is regulated by verify_refname_available().)
> + * separate issue that is regulated by verify_refname_available_dir().)
>   *
>   * Please note that the name field contains the fully-qualified
>   * reference (or subdirectory) name.  Space could be saved by only
> @@ -897,25 +897,13 @@ static int nonmatching_ref_fn(struct ref_entry *entry, void *vdata)
>  /*
>   * Return 0 if a reference named refname could be created without
>   * conflicting with the name of an existing reference in dir.
> - * Otherwise, return a negative value and write an explanation to err.
> - * If extras is non-NULL, it is a list of additional refnames with
> - * which refname is not allowed to conflict. If skip is non-NULL,
> - * ignore potential conflicts with refs in skip (e.g., because they
> - * are scheduled for deletion in the same operation). Behavior is
> - * undefined if the same name is listed in both extras and skip.
> - *
> - * Two reference names conflict if one of them exactly matches the
> - * leading components of the other; e.g., "refs/foo/bar" conflicts
> - * with both "refs/foo" and with "refs/foo/bar/baz" but not with
> - * "refs/foo/bar" or "refs/foo/barbados".
> - *
> - * extras and skip must be sorted.
> + * See verify_refname_available for details.
>   */
> -static int verify_refname_available(const char *refname,
> -				    const struct string_list *extras,
> -				    const struct string_list *skip,
> -				    struct ref_dir *dir,
> -				    struct strbuf *err)
> +static int verify_refname_available_dir(const char *refname,
> +					const struct string_list *extras,
> +					const struct string_list *skip,
> +					struct ref_dir *dir,
> +					struct strbuf *err)
>  {
>  	const char *slash;
>  	int pos;
> @@ -2464,9 +2452,12 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
>  		 */
>  		strbuf_git_path(&orig_ref_file, "%s", orig_refname);
>  		if (remove_empty_directories(&orig_ref_file)) {
> +			struct ref_dir *loose_refs;
> +			loose_refs = get_loose_refs(&ref_cache);
It's OK to initialize `loose_refs` on the line where it is declared.
Show 33 quoted lines
>  			last_errno = errno;
> -			if (!verify_refname_available(orig_refname, extras, skip,
> -						      get_loose_refs(&ref_cache), err))
> +			if (!verify_refname_available_dir(orig_refname, extras,
> +							  skip, loose_refs,
> +							  err))
>  				strbuf_addf(err, "there are still refs under '%s'",
>  					    orig_refname);
>  			goto error_return;
> [...]
> diff --git a/refs.h b/refs.h
> index 6d30c98..79ea220 100644
> --- a/refs.h
> +++ b/refs.h
> @@ -218,6 +218,23 @@ extern void warn_dangling_symrefs(FILE *fp, const char *msg_fmt, const struct st
>  int pack_refs(unsigned int flags);
>  
>  /*
> + * Return true iff a reference named refname could be created without
> + * conflicting with the name of an existing reference.  If
> + * skip is non-NULL, ignore potential conflicts with refs in skip
> + * (e.g., because they are scheduled for deletion in the same
> + * operation).
> + *
> + * Two reference names conflict if one of them exactly matches the
> + * leading components of the other; e.g., "foo/bar" conflicts with
> + * both "foo" and with "foo/bar/baz" but not with "foo/bar" or
> + * "foo/barbados".
> + *
> + * skip must be sorted.
> + */
> +int verify_refname_available(const char *newname, struct string_list *extra,
> +			     struct string_list *skip, struct strbuf *err);

This function has an `extra` parameter but the description of this parameter disappeared as the docstring was moved from refs.c to here.

Show 6 quoted lines
> +
> +/*
>   * Flags controlling ref_transaction_update(), ref_transaction_create(), etc.
>   * REF_NODEREF: act on the ref directly, instead of dereferencing
>   *              symbolic references.
> 
Michael
-- 
Michael Haggerty
mhagger@alum.mit.edu
Previous: David TurnerNext: David Turner
Message 3 of 71 in “alternate refs backends”
  1. 00/44 alternate refs backendsDavid Turner, Oct 12, 2015
  2. 01/44 refs.c: create a public version of verify_refname_availableDavid Turner, Oct 12, 2015
  3. Michael HaggertyOct 13, 2015
  4. 02/44 refs: make repack_without_refs and is_branch publicDavid Turner, Oct 12, 2015
  5. Michael HaggertyOct 13, 2015
  6. Michael HaggertyOct 13, 2015
  7. David TurnerOct 13, 2015
  8. 03/44 refs-be-files.c: rename refs to refs-be-filesDavid Turner, Oct 12, 2015
  9. 04/44 refs.c: add a new refs.c file to hold all common refs codeDavid Turner, Oct 12, 2015
  10. 05/44 refs.c: move update_ref to refs.cDavid Turner, Oct 12, 2015
  11. Michael HaggertyOct 13, 2015
  12. David TurnerOct 13, 2015
  13. David TurnerOct 14, 2015
  14. 06/44 refs.c: move delete_ref and delete_refs to the common codeDavid Turner, Oct 12, 2015
  15. Michael HaggertyOct 13, 2015
  16. 07/44 refs.c: move read_ref_at to the common refs fileDavid Turner, Oct 12, 2015
  17. 08/44 refs.c: move the hidden refs functions to the common codeDavid Turner, Oct 12, 2015
  18. 09/44 refs.c: move dwim and friend functions to the common refs codeDavid Turner, Oct 12, 2015
  19. 10/44 refs.c: move warn_if_dangling_symref* to the common codeDavid Turner, Oct 12, 2015
  20. 11/44 refs.c: move read_ref, read_ref_full and ref_exists to the common codeDavid Turner, Oct 12, 2015
  21. 12/44 refs.c: move resolve_refdup to commonDavid Turner, Oct 12, 2015
  22. 13/44 refs.c: move check_refname_format to the common codeDavid Turner, Oct 12, 2015
  23. 14/44 refs.c: move is_branch to the common codeDavid Turner, Oct 12, 2015
  24. 15/44 refs.c: move prettify_refname to the common codeDavid Turner, Oct 12, 2015
  25. 16/44 refs.c: move ref iterators to the common codeDavid Turner, Oct 12, 2015
  26. Michael HaggertyOct 13, 2015
  27. 17/44 refs.c: move head_ref_namespaced to the common codeDavid Turner, Oct 12, 2015
  28. 18/44 refs: move transaction functions into common codeDavid Turner, Oct 12, 2015
  29. Michael HaggertyOct 13, 2015
  30. Michael HaggertyOct 13, 2015
  31. David TurnerOct 13, 2015
  32. David TurnerOct 13, 2015
  33. 19/44 refs: add a backend method structure with transaction functionsDavid Turner, Oct 12, 2015
  34. 19/44 refs-be-files.c: add a backend method structure with transaction functionsDavid Turner, Oct 12, 2015
  35. David TurnerOct 12, 2015
  36. Michael HaggertyOct 13, 2015
  37. David TurnerOct 13, 2015
  38. Michael HaggertyOct 13, 2015
  39. 20/44 refs-be-files.c: add methods for misc ref operationsDavid Turner, Oct 12, 2015
  40. Michael HaggertyOct 13, 2015
  41. 21/44 refs-be-files.c: add methods for the ref iteratorsDavid Turner, Oct 12, 2015
  42. 22/44 refs-be-files.c: add method for for_each_reftype_...David Turner, Oct 12, 2015
  43. 23/44 refs-be-files.c: add do_for_each_per_worktree_refDavid Turner, Oct 12, 2015
  44. 24/44 refs.c: move refname_is_safe to the common codeDavid Turner, Oct 12, 2015
  45. 25/44 refs.h: document make refname_is_safe and add it to headerDavid Turner, Oct 12, 2015
  46. Michael HaggertyOct 13, 2015
  47. Michael HaggertyOct 13, 2015
  48. David TurnerOct 13, 2015
  49. 26/44 refs.c: move copy_msg to the common codeDavid Turner, Oct 12, 2015
  50. Michael HaggertyOct 13, 2015
  51. 27/44 refs.c: move peel_object to the common codeDavid Turner, Oct 12, 2015
  52. Michael HaggertyOct 13, 2015
  53. 28/44 refs.c: move should_autocreate_reflog to common codeDavid Turner, Oct 12, 2015
  54. 29/44 refs.c: add ref backend init functionDavid Turner, Oct 12, 2015
  55. 30/44 refs.c: add methods for reflogDavid Turner, Oct 12, 2015
  56. 31/44 refs.c: add method for initial ref transaction commitDavid Turner, Oct 12, 2015
  57. 32/44 initdb: move safe_create_dir into common codeDavid Turner, Oct 12, 2015
  58. 33/44 refs.c: add method for initializing refs dbDavid Turner, Oct 12, 2015
  59. 34/44 refs-be-files.c: add method to rename refsDavid Turner, Oct 12, 2015
  60. 35/44 refs: make lock genericDavid Turner, Oct 12, 2015
  61. 36/44 refs: make files_log_ref_write functions publicDavid Turner, Oct 12, 2015
  62. 37/44 refs: break out a ref conflict checkDavid Turner, Oct 12, 2015
  63. Michael HaggertyOct 13, 2015
  64. David TurnerOct 13, 2015
  65. 38/44 refs: move duplicate check to common codeDavid Turner, Oct 12, 2015
  66. 39/44 refs: always handle non-normal refs in files backendDavid Turner, Oct 12, 2015
  67. 40/44 refs: allow ref backend to be set for cloneDavid Turner, Oct 12, 2015
  68. 41/44 refs: add register_refs_backendDavid Turner, Oct 12, 2015
  69. 42/44 introduce "extensions" form of core.repositoryformatversionDavid Turner, Oct 12, 2015
  70. 43/44 refs: add LMDB refs backendDavid Turner, Oct 12, 2015
  71. 44/44 refs: tests for db backendDavid Turner, Oct 12, 2015

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.