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

Re: [PATCH v2 5/8] refs: use refs_resolve_ref_unsafe_with_errno() where needed

From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date
Jul 1, 2021, 11:58 UTC
Message-ID
<87bl7mdysf.fsf@evledraar.gmail.com>
In-Reply-To
<005ee8e6fb2a0f1a38801bed1dfe082999bfec14.1623329869.git.gitgitgadget@gmail.com>
On Thu, Jun 10 2021, Han-Wen Nienhuys via GitGitGadget wrote:
Show 56 quoted lines
> From: Han-Wen Nienhuys <hanwen@google.com>
>
> lock_ref_oid_basic() in files-backend.c is the only caller of refs_resolve_ref()
> that needs error information to make logic decisions.
>
> Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
> Reviewed-by: Jonathan Tan <jonathantanmy@google.com>
> ---
>  refs/files-backend.c | 19 ++++++++++---------
>  1 file changed, 10 insertions(+), 9 deletions(-)
>
> diff --git a/refs/files-backend.c b/refs/files-backend.c
> index 8f969c8f711f..5a430aabf623 100644
> --- a/refs/files-backend.c
> +++ b/refs/files-backend.c
> @@ -924,6 +924,7 @@ static struct ref_lock *lock_ref_oid_basic(struct files_ref_store *refs,
>  	int mustexist = (old_oid && !is_null_oid(old_oid));
>  	int resolve_flags = RESOLVE_REF_NO_RECURSE;
>  	int resolved;
> +	int resolve_errno = 0;
>  
>  	files_assert_main_repository(refs, "lock_ref_oid_basic");
>  	assert(err);
> @@ -936,10 +937,11 @@ static struct ref_lock *lock_ref_oid_basic(struct files_ref_store *refs,
>  		resolve_flags |= RESOLVE_REF_ALLOW_BAD_NAME;
>  
>  	files_ref_path(refs, &ref_file, refname);
> -	resolved = !!refs_resolve_ref_unsafe(&refs->base,
> -					     refname, resolve_flags,
> -					     &lock->old_oid, type);
> -	if (!resolved && errno == EISDIR) {
> +	resolved = !!refs_resolve_ref_unsafe_with_errno(&refs->base, refname,
> +							resolve_flags,
> +							&lock->old_oid, type,
> +							&resolve_errno);
> +	if (!resolved && resolve_errno == EISDIR) {
>  		/*
>  		 * we are trying to lock foo but we used to
>  		 * have foo/bar which now does not exist;
> @@ -959,12 +961,11 @@ static struct ref_lock *lock_ref_oid_basic(struct files_ref_store *refs,
>  						     &lock->old_oid, type);
>  	}
>  	if (!resolved) {
> -		int last_errno = errno;
> -		if (last_errno != ENOTDIR ||
> -		    !refs_verify_refname_available(&refs->base, refname,
> -						   extras, skip, err))
> +		if (resolve_errno != ENOTDIR ||
> +		    !refs_verify_refname_available(&refs->base, refname, extras,
> +						   skip, err))
>  			strbuf_addf(err, "unable to resolve reference '%s': %s",
> -				    refname, strerror(last_errno));
> +				    refname, strerror(resolve_errno));
>  
>  		goto error_return;
>  	}

So, having read 4/8 and this I wonder why refs_resolve_ref_unsafe_with_errno() is needed at all. It's just a wrapper that sets errno to a variable you give it, but we could just document that tha caller should check errno.

So far I haven't seen anything that suggests the below diff-on-top wouldn't be OK (and all tests pass with it). It steps on the toes of some of my earlier suggestions, but I'm doing these one-at-a-time.

In any case the comment I adjusted seems like something you should adjust to. It looks like a TODO for having the sort of function you've just implemented in refs_resolve_ref_unsafe_with_errno().

	diff --git a/refs.c b/refs.c
	index 64e2d55adcf..a07d852fcdc 100644
	--- a/refs.c
	+++ b/refs.c
	@@ -1688,7 +1688,10 @@ int refs_read_raw_ref(struct ref_store *ref_store,
	 	return result;
	 }
	 
	-/* This function needs to return a meaningful errno on failure */
	+/*
	+ * This function clears errno at the beginning. If it fails the errno
	+ * will be meaningful.
	+ */
	 const char *refs_resolve_ref_unsafe(struct ref_store *refs,
	 				    const char *refname,
	 				    int resolve_flags,
	@@ -1698,6 +1701,7 @@ const char *refs_resolve_ref_unsafe(struct ref_store *refs,
	 	struct object_id unused_oid;
	 	int unused_flags;
	 	int symref_count;
	+	errno = 0;
	 
	 	if (!oid)
	 		oid = &unused_oid;
	@@ -1781,18 +1785,6 @@ const char *refs_resolve_ref_unsafe(struct ref_store *refs,
	 	return NULL;
	 }
	 
	-const char *refs_resolve_ref_unsafe_with_errno(struct ref_store *refs,
	-					       const char *refname,
	-					       int resolve_flags,
	-					       struct object_id *oid,
	-					       int *flags, int *failure_errno)
	-{
	-	const char *result = refs_resolve_ref_unsafe(refs, refname,
	-						     resolve_flags, oid, flags);
	-	*failure_errno = errno;
	-	return result;
	-}
	-
	 /* backend functions */
	 int refs_init_db(struct strbuf *err)
	 {
	diff --git a/refs/files-backend.c b/refs/files-backend.c
	index 5a430aabf62..5a400e55cbf 100644
	--- a/refs/files-backend.c
	+++ b/refs/files-backend.c
	@@ -924,7 +924,6 @@ static struct ref_lock *lock_ref_oid_basic(struct files_ref_store *refs,
	 	int mustexist = (old_oid && !is_null_oid(old_oid));
	 	int resolve_flags = RESOLVE_REF_NO_RECURSE;
	 	int resolved;
	-	int resolve_errno = 0;
	 
	 	files_assert_main_repository(refs, "lock_ref_oid_basic");
	 	assert(err);
	@@ -937,11 +936,10 @@ static struct ref_lock *lock_ref_oid_basic(struct files_ref_store *refs,
	 		resolve_flags |= RESOLVE_REF_ALLOW_BAD_NAME;
	 
	 	files_ref_path(refs, &ref_file, refname);
	-	resolved = !!refs_resolve_ref_unsafe_with_errno(&refs->base, refname,
	-							resolve_flags,
	-							&lock->old_oid, type,
	-							&resolve_errno);
	-	if (!resolved && resolve_errno == EISDIR) {
	+	resolved = !!refs_resolve_ref_unsafe(&refs->base, refname,
	+					     resolve_flags,
	+					     &lock->old_oid, type);
	+	if (!resolved && errno == EISDIR) {
	 		/*
	 		 * we are trying to lock foo but we used to
	 		 * have foo/bar which now does not exist;
	@@ -961,11 +959,11 @@ static struct ref_lock *lock_ref_oid_basic(struct files_ref_store *refs,
	 						     &lock->old_oid, type);
	 	}
	 	if (!resolved) {
	-		if (resolve_errno != ENOTDIR ||
	+		if (errno != ENOTDIR ||
	 		    !refs_verify_refname_available(&refs->base, refname, extras,
	 						   skip, err))
	 			strbuf_addf(err, "unable to resolve reference '%s': %s",
	-				    refname, strerror(resolve_errno));
	+				    refname, strerror(errno));
	 
	 		goto error_return;
	 	}
	
Previous: Han-Wen Nienhuys via GitGitGadgetNext: Han-Wen Nienhuys via GitGitGadget
Message 33 of 148 in “refs: cleanup errno sideband ref related functions”
  1. 0/8 refs: cleanup errno sideband ref related functionsHan-Wen Nienhuys via GitGitGadget, Apr 29, 2021
  2. 1/8 refs: remove EINVAL specification from the errno sideband in read_raw_ref_fnHan-Wen Nienhuys via GitGitGadget, Apr 29, 2021
  3. Junio C HamanoApr 30, 2021
  4. Han-Wen NienhuysMay 19, 2021
  5. Jonathan TanJun 3, 2021
  6. Han-Wen NienhuysJun 9, 2021
  7. 2/8 refs/files-backend: stop setting errno from lock_ref_oid_basicHan-Wen Nienhuys via GitGitGadget, Apr 29, 2021
  8. Junio C HamanoApr 30, 2021
  9. Han-Wen NienhuysMay 19, 2021
  10. Jonathan TanJun 3, 2021
  11. Han-Wen NienhuysJun 10, 2021
  12. 4/8 refs: make errno output explicit for refs_resolve_ref_unsafeHan-Wen Nienhuys via GitGitGadget, Apr 29, 2021
  13. Jonathan TanJun 3, 2021
  14. Han-Wen NienhuysJun 10, 2021
  15. 5/8 refs: add failure_errno to refs_read_raw_ref() signatureHan-Wen Nienhuys via GitGitGadget, Apr 29, 2021
  16. 3/8 refs: make errno output explicit for read_raw_ref_fnHan-Wen Nienhuys via GitGitGadget, Apr 29, 2021
  17. Junio C HamanoApr 30, 2021
  18. Junio C HamanoApr 30, 2021
  19. Han-Wen NienhuysMay 19, 2021
  20. Jonathan TanJun 3, 2021
  21. Han-Wen NienhuysJun 10, 2021
  22. 8/8 refs: explicitly propagate errno from refs_read_raw_refHan-Wen Nienhuys via GitGitGadget, Apr 29, 2021
  23. 6/8 refs: clear errno return in refs_resolve_ref_unsafe()Han-Wen Nienhuys via GitGitGadget, Apr 29, 2021
  24. Jonathan TanJun 3, 2021
  25. Han-Wen NienhuysJun 10, 2021
  26. 7/8 refs: stop setting EINVAL and ELOOP in symref resolutionHan-Wen Nienhuys via GitGitGadget, Apr 29, 2021
  27. Jonathan TanJun 3, 2021
  28. Han-Wen NienhuysJun 10, 2021
  29. Jonathan TanJun 3, 2021
  30. Han-Wen NienhuysJun 9, 2021
  31. 0/8 refs: cleanup errno sideband ref related functionsHan-Wen Nienhuys via GitGitGadget, Jun 10, 2021
  32. 5/8 refs: use refs_resolve_ref_unsafe_with_errno() where neededHan-Wen Nienhuys via GitGitGadget, Jun 10, 2021
  33. Ævar Arnfjörð BjarmasonJul 1, 2021
  34. 4/8 refs: make errno output explicit for refs_resolve_ref_unsafeHan-Wen Nienhuys via GitGitGadget, Jun 10, 2021
  35. Ævar Arnfjörð BjarmasonJul 1, 2021
  36. 8/8 refs: explicitly propagate errno from refs_read_raw_refHan-Wen Nienhuys via GitGitGadget, Jun 10, 2021
  37. Ævar Arnfjörð BjarmasonJul 1, 2021
  38. Han-Wen NienhuysJul 5, 2021
  39. Ævar Arnfjörð BjarmasonJul 5, 2021
  40. Han-Wen NienhuysJul 5, 2021
  41. 1/8 refs: remove EINVAL errno output from specification of read_raw_ref_fnHan-Wen Nienhuys via GitGitGadget, Jun 10, 2021
  42. 2/8 refs/files-backend: stop setting errno from lock_ref_oid_basicHan-Wen Nienhuys via GitGitGadget, Jun 10, 2021
  43. Ævar Arnfjörð BjarmasonJul 1, 2021
  44. Han-Wen NienhuysJul 5, 2021
  45. 3/8 refs: make errno output explicit for read_raw_ref_fnHan-Wen Nienhuys via GitGitGadget, Jun 10, 2021
  46. Ævar Arnfjörð BjarmasonJul 1, 2021
  47. Han-Wen NienhuysJul 5, 2021
  48. 6/8 refs: add failure_errno to refs_read_raw_ref() signatureHan-Wen Nienhuys via GitGitGadget, Jun 10, 2021
  49. Ævar Arnfjörð BjarmasonJul 1, 2021
  50. 7/8 refs: clear errno return in refs_resolve_ref_unsafe()Han-Wen Nienhuys via GitGitGadget, Jun 10, 2021
  51. Ævar Arnfjörð BjarmasonJul 1, 2021
  52. Han-Wen NienhuysJun 14, 2021
  53. 0/5 refs: cleanup errno sideband ref related functionsHan-Wen Nienhuys via GitGitGadget, Jul 5, 2021
  54. 1/5 refs: remove EINVAL errno output from specification of read_raw_ref_fnHan-Wen Nienhuys via GitGitGadget, Jul 5, 2021
  55. 2/5 refs/files-backend: stop setting errno from lock_ref_oid_basicHan-Wen Nienhuys via GitGitGadget, Jul 5, 2021
  56. 3/5 refs: make errno output explicit for read_raw_ref_fnHan-Wen Nienhuys via GitGitGadget, Jul 5, 2021
  57. 4/5 refs: add failure_errno to refs_read_raw_ref() signatureHan-Wen Nienhuys via GitGitGadget, Jul 5, 2021
  58. Junio C HamanoJul 6, 2021
  59. 5/5 refs: make errno output explicit for refs_resolve_ref_unsafeHan-Wen Nienhuys via GitGitGadget, Jul 5, 2021
  60. Ævar Arnfjörð BjarmasonJul 6, 2021
  61. Han-Wen NienhuysJul 6, 2021
  62. Ævar Arnfjörð BjarmasonJul 6, 2021
  63. Han-Wen NienhuysJul 6, 2021
  64. 0/6 refs: cleanup errno sideband ref related functionsHan-Wen Nienhuys via GitGitGadget, Jul 6, 2021
  65. 1/6 refs: remove EINVAL errno output from specification of read_raw_ref_fnHan-Wen Nienhuys via GitGitGadget, Jul 6, 2021
  66. 2/6 refs/files-backend: stop setting errno from lock_ref_oid_basicHan-Wen Nienhuys via GitGitGadget, Jul 6, 2021
  67. 5/6 refs: explicitly return failure_errno from parse_loose_ref_contentsHan-Wen Nienhuys via GitGitGadget, Jul 6, 2021
  68. Junio C HamanoJul 6, 2021
  69. Han-Wen NienhuysJul 7, 2021
  70. 3/6 refs: make errno output explicit for read_raw_ref_fnHan-Wen Nienhuys via GitGitGadget, Jul 6, 2021
  71. 4/6 refs: add failure_errno to refs_read_raw_ref() signatureHan-Wen Nienhuys via GitGitGadget, Jul 6, 2021
  72. Junio C HamanoJul 6, 2021
  73. 6/6 refs: make errno output explicit for refs_resolve_ref_unsafeHan-Wen Nienhuys via GitGitGadget, Jul 6, 2021
  74. 0/6 refs: cleanup errno sideband ref related functionsHan-Wen Nienhuys via GitGitGadget, Jul 7, 2021
  75. 1/6 refs: remove EINVAL errno output from specification of read_raw_ref_fnHan-Wen Nienhuys via GitGitGadget, Jul 7, 2021
  76. 2/6 refs/files-backend: stop setting errno from lock_ref_oid_basicHan-Wen Nienhuys via GitGitGadget, Jul 7, 2021
  77. Ævar Arnfjörð BjarmasonJul 11, 2021
  78. Han-Wen NienhuysJul 13, 2021
  79. 3/6 refs: make errno output explicit for read_raw_ref_fnHan-Wen Nienhuys via GitGitGadget, Jul 7, 2021
  80. Ævar Arnfjörð BjarmasonJul 11, 2021
  81. 4/6 refs: add failure_errno to refs_read_raw_ref() signatureHan-Wen Nienhuys via GitGitGadget, Jul 7, 2021
  82. Ævar Arnfjörð BjarmasonJul 11, 2021
  83. Han-Wen NienhuysJul 13, 2021
  84. 5/6 refs: explicitly return failure_errno from parse_loose_ref_contentsHan-Wen Nienhuys via GitGitGadget, Jul 7, 2021
  85. Ævar Arnfjörð BjarmasonJul 11, 2021
  86. 6/6 refs: make errno output explicit for refs_resolve_ref_unsafeHan-Wen Nienhuys via GitGitGadget, Jul 7, 2021
  87. Junio C HamanoJul 7, 2021
  88. 00/17 refs API: get rid of errno setting entirelyÆvar Arnfjörð Bjarmason, Jul 11, 2021
  89. 01/17 refs: remove EINVAL errno output from specification of read_raw_ref_fnÆvar Arnfjörð Bjarmason, Jul 11, 2021
  90. 03/17 refs: make errno output explicit for read_raw_ref_fnÆvar Arnfjörð Bjarmason, Jul 11, 2021
  91. 02/17 refs/files-backend: stop setting errno from lock_ref_oid_basicÆvar Arnfjörð Bjarmason, Jul 11, 2021
  92. 04/17 refs: add failure_errno to refs_read_raw_ref() signatureÆvar Arnfjörð Bjarmason, Jul 11, 2021
  93. 05/17 refs: explicitly return failure_errno from parse_loose_ref_contentsÆvar Arnfjörð Bjarmason, Jul 11, 2021
  94. 06/17 refs: make errno output explicit for refs_resolve_ref_unsafeÆvar Arnfjörð Bjarmason, Jul 11, 2021
  95. 07/17 refs: make errno ignoring explicit in lock_ref_oid_basic()Ævar Arnfjörð Bjarmason, Jul 11, 2021
  96. 10/17 refs API: remove refs_read_ref_full() wrapperÆvar Arnfjörð Bjarmason, Jul 11, 2021
  97. 11/17 refs API: make resolve_gitlink_ref() not set errnoÆvar Arnfjörð Bjarmason, Jul 11, 2021
  98. 08/17 refs file-backend.c: stop setting "EBUSY" in verify_lock()Ævar Arnfjörð Bjarmason, Jul 11, 2021
  99. Han-Wen NienhuysJul 13, 2021
  100. 09/17 refs file-backend.c: deal with errno directly in verify_lock()Ævar Arnfjörð Bjarmason, Jul 11, 2021
  101. 12/17 refs API: make refs_resolve_ref_unsafe() staticÆvar Arnfjörð Bjarmason, Jul 11, 2021
  102. 13/17 refs API: make refs_resolve_refdup() not set errnoÆvar Arnfjörð Bjarmason, Jul 11, 2021
  103. 14/17 refs API: make refs_ref_exists() not set errnoÆvar Arnfjörð Bjarmason, Jul 11, 2021
  104. 15/17 refs API: make resolve_ref_unsafe() not set errnoÆvar Arnfjörð Bjarmason, Jul 11, 2021
  105. Han-Wen NienhuysJul 13, 2021
  106. Ævar Arnfjörð BjarmasonJul 14, 2021
  107. 17/17 refs API: don't leak "errno" in run_transaction_hook()Ævar Arnfjörð Bjarmason, Jul 11, 2021
  108. 16/17 refs API: make expand_ref() and repo_dwim_log() not set errnoÆvar Arnfjörð Bjarmason, Jul 11, 2021
  109. Han-Wen NienhuysJul 13, 2021
  110. Ævar Arnfjörð BjarmasonJul 13, 2021
  111. Ævar Arnfjörð BjarmasonJul 14, 2021
  112. Han-Wen NienhuysJul 14, 2021
  113. 0/6 refs: cleanup errno sideband ref related functionsÆvar Arnfjörð Bjarmason, Jul 14, 2021
  114. 1/6 refs: remove EINVAL errno output from specification of read_raw_ref_fnÆvar Arnfjörð Bjarmason, Jul 14, 2021
  115. 2/6 refs/files-backend: stop setting errno from lock_ref_oid_basicÆvar Arnfjörð Bjarmason, Jul 14, 2021
  116. 3/6 refs: make errno output explicit for read_raw_ref_fnÆvar Arnfjörð Bjarmason, Jul 14, 2021
  117. 4/6 refs: add failure_errno to refs_read_raw_ref() signatureÆvar Arnfjörð Bjarmason, Jul 14, 2021
  118. 5/6 refs: explicitly return failure_errno from parse_loose_ref_contentsÆvar Arnfjörð Bjarmason, Jul 14, 2021
  119. 6/6 refs: make errno output explicit for refs_resolve_ref_unsafeÆvar Arnfjörð Bjarmason, Jul 14, 2021
  120. 0/7 refs: cleanup errno sideband ref related functionsÆvar Arnfjörð Bjarmason, Jul 16, 2021
  121. 1/7 refs file backend: move raceproof_create_file() hereÆvar Arnfjörð Bjarmason, Jul 16, 2021
  122. 3/7 refs/files-backend: stop setting errno from lock_ref_oid_basicÆvar Arnfjörð Bjarmason, Jul 16, 2021
  123. 2/7 refs: remove EINVAL errno output from specification of read_raw_ref_fnÆvar Arnfjörð Bjarmason, Jul 16, 2021
  124. 4/7 refs: make errno output explicit for read_raw_ref_fnÆvar Arnfjörð Bjarmason, Jul 16, 2021
  125. 5/7 refs: add failure_errno to refs_read_raw_ref() signatureÆvar Arnfjörð Bjarmason, Jul 16, 2021
  126. 6/7 refs: explicitly return failure_errno from parse_loose_ref_contentsÆvar Arnfjörð Bjarmason, Jul 16, 2021
  127. 7/7 refs: make errno output explicit for refs_resolve_ref_unsafeÆvar Arnfjörð Bjarmason, Jul 16, 2021
  128. 0/7 refs: cleanup errno sideband ref related functionsÆvar Arnfjörð Bjarmason, Jul 20, 2021
  129. 1/7 refs file backend: move raceproof_create_file() hereÆvar Arnfjörð Bjarmason, Jul 20, 2021
  130. 2/7 refs: remove EINVAL errno output from specification of read_raw_ref_fnÆvar Arnfjörð Bjarmason, Jul 20, 2021
  131. 3/7 refs/files-backend: stop setting errno from lock_ref_oid_basicÆvar Arnfjörð Bjarmason, Jul 20, 2021
  132. 4/7 refs: make errno output explicit for read_raw_ref_fnÆvar Arnfjörð Bjarmason, Jul 20, 2021
  133. Han-Wen NienhuysAug 16, 2021
  134. 5/7 refs: add failure_errno to refs_read_raw_ref() signatureÆvar Arnfjörð Bjarmason, Jul 20, 2021
  135. 6/7 refs: explicitly return failure_errno from parse_loose_ref_contentsÆvar Arnfjörð Bjarmason, Jul 20, 2021
  136. Jonathan TanAug 13, 2021
  137. 7/7 refs: make errno output explicit for refs_resolve_ref_unsafeÆvar Arnfjörð Bjarmason, Jul 20, 2021
  138. Ævar Arnfjörð BjarmasonJul 26, 2021
  139. Junio C HamanoJul 27, 2021
  140. 0/8 refs: cleanup errno sideband ref related functionsÆvar Arnfjörð Bjarmason, Aug 23, 2021
  141. 1/8 refs file backend: move raceproof_create_file() hereÆvar Arnfjörð Bjarmason, Aug 23, 2021
  142. 2/8 refs: remove EINVAL errno output from specification of read_raw_ref_fnÆvar Arnfjörð Bjarmason, Aug 23, 2021
  143. 3/8 refs/files-backend: stop setting errno from lock_ref_oid_basicÆvar Arnfjörð Bjarmason, Aug 23, 2021
  144. 4/8 refs: make errno output explicit for read_raw_ref_fnÆvar Arnfjörð Bjarmason, Aug 23, 2021
  145. 5/8 refs: add failure_errno to refs_read_raw_ref() signatureÆvar Arnfjörð Bjarmason, Aug 23, 2021
  146. 6/8 branch tests: test for errno propagating on failing readÆvar Arnfjörð Bjarmason, Aug 23, 2021
  147. 7/8 refs: explicitly return failure_errno from parse_loose_ref_contentsÆvar Arnfjörð Bjarmason, Aug 23, 2021
  148. 8/8 refs: make errno output explicit for refs_resolve_ref_unsafeÆvar Arnfjörð Bjarmason, Aug 23, 2021

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.