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

Re: [PATCH v3 0/5] refs: cleanup errno sideband ref related functions

From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date
Jul 6, 2021, 00:38 UTC
Message-ID
<87v95o5ku8.fsf@evledraar.gmail.com>
In-Reply-To
<pull.1012.v3.git.git.1625518566.gitgitgadget@gmail.com>
On Mon, Jul 05 2021, Han-Wen Nienhuys via GitGitGadget wrote:
> v5
v3?
Show 6 quoted lines
>  * address Ævar's comment; punt on clearing errno.
> [...]
>       
>           Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
>           Reviewed-by: Jonathan Tan <jonathantanmy@google.com>
>      +    Reviewed-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
FWIW per Documentation/SubmittingPatches:
    
    . `Reviewed-by:`, unlike the other tags, can only be offered by the
      reviewer and means that she is completely satisfied that the patch
      is ready for application.  It is usually offered only after a
      detailed review.

It's not that I'm hard to please, but I can honestly say that I don't quite understand some parts of what you're gonig for, so that trailer is probably premature :)

Show 63 quoted lines
>        ## refs/files-backend.c ##
>       @@ refs/files-backend.c: static int create_reflock(const char *path, void *cb)
>      @@ refs/files-backend.c: static struct ref_lock *lock_ref_oid_basic(struct files_re
>       -		last_errno = errno;
>       +		int last_errno = errno;
>        		if (last_errno != ENOTDIR ||
>      - 		    !refs_verify_refname_available(&refs->base, refname,
>      - 						   extras, skip, err))
>      +-		    !refs_verify_refname_available(&refs->base, refname,
>      +-						   extras, skip, err))
>      ++		    /* in case of D/F conflict, try to generate a better error
>      ++		     * message. If that fails, fall back to strerror(ENOTDIR).
>      ++		     */
>      ++		    !refs_verify_refname_available(&refs->base, refname, extras,
>      ++						   skip, err))
>      + 			strbuf_addf(err, "unable to resolve reference '%s': %s",
>      + 				    refname, strerror(last_errno));
>      + 
>       @@ refs/files-backend.c: static struct ref_lock *lock_ref_oid_basic(struct files_ref_store *refs,
>        	if (is_null_oid(&lock->old_oid) &&
>        	    refs_verify_refname_available(refs->packed_ref_store, refname,
>  3:  3e2831e59c8 ! 3:  b017caf54ba refs: make errno output explicit for read_raw_ref_fn
>      @@ Metadata
>        ## Commit message ##
>           refs: make errno output explicit for read_raw_ref_fn
>       
>      +    This makes it explicit how alternative ref backends should report errors in
>      +    read_raw_ref_fn.
>      +
>           read_raw_ref_fn needs to supply a credible errno for a number of cases. These
>           are primarily:
>       
>      @@ Commit message
>       
>           Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
>           Reviewed-by: Jonathan Tan <jonathantanmy@google.com>
>      +    Reviewed-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
>       
>        ## refs.c ##
>       @@ refs.c: int refs_read_raw_ref(struct ref_store *ref_store,
>        		      const char *refname, struct object_id *oid,
>        		      struct strbuf *referent, unsigned int *type)
>        {
>      -+	int result, failure;
>      ++	int result;
>      ++	int failure_errno;
>        	if (!strcmp(refname, "FETCH_HEAD") || !strcmp(refname, "MERGE_HEAD")) {
>        		return refs_read_special_head(ref_store, refname, oid, referent,
>        					      type);
>      @@ refs.c: int refs_read_raw_ref(struct ref_store *ref_store,
>        
>       -	return ref_store->be->read_raw_ref(ref_store, refname, oid, referent,
>       -					   type);
>      -+	failure = 0;
>      ++	failure_errno = 0;
>       +	result = ref_store->be->read_raw_ref(ref_store, refname, oid, referent,
>      -+					     type, &failure);
>      -+	errno = failure;
>      ++					     type, &failure_errno);
>      ++	if (failure_errno)
>      ++		errno = failure_errno;
>       +	return result;
>        }

To rephrase my comment on the v2 to hopefully better get at the point/question I had.

It wasn't that I don't get why you wouldn't save/restore errno in general.

It's that the pattern of doing so seems backwards to me. I.e. surely the goal here should be to one function at a time, and from the bottom-up, figure out where we rely on "errno" and convert that to a "failure_errno".

Instead not even files_read_raw_ref() resets "errno = 0" at the end, so the errno /there/ can propagate upwards, and in this v3 we're not clearing it at all.

I'm all for clearing it as mentioned in another mail, surely that should be the point of this whole thing, i.e. to refactor this part of the API so that we're assured that nothing upstream of us relies on errno & prep things for reftable (which won't set it at all, except to fake it).

Having dug a bit further, it seems what you're doing, whether it's intentional or not, is relying on the parse_loose_ref_contents() setting EINVAL, but you clobber your *failure_errno with it whether it returned -1 or not.

Seemingly to make that logic work in files_read_raw_ref() you, after getting an errno, assigned it "errno", instead of to a saved_errno". Thus requiring an inverse of the pattern where you need a "saved_errno" dance to save away an errno you explicitly don't care about (because you didn't save the one you wanted earlier).

I think something like the following diff on top, this whole dance was only needed because you didn't pass the failure_errno down to refs_read_special_head() and parse_loose_ref_contents().

diff --git a/refs.c b/refs.c
index 25d80e544d0..eca7310e7a4 100644
--- a/refs.c
+++ b/refs.c
@@ -1653,7 +1653,8 @@ int for_each_fullref_in_prefixes(const char *namespace,
 
 static int refs_read_special_head(struct ref_store *ref_store,
 				  const char *refname, struct object_id *oid,
-				  struct strbuf *referent, unsigned int *type)
+				  struct strbuf *referent, unsigned int *type,
+				  int *failure_errno)
 {
 	struct strbuf full_path = STRBUF_INIT;
 	struct strbuf content = STRBUF_INIT;
@@ -1663,7 +1664,8 @@ static int refs_read_special_head(struct ref_store *ref_store,
 	if (strbuf_read_file(&content, full_path.buf, 0) < 0)
 		goto done;
 
-	result = parse_loose_ref_contents(content.buf, oid, referent, type);
+	result = parse_loose_ref_contents(content.buf, oid, referent, type,
+					  failure_errno);
 
 done:
 	strbuf_release(&full_path);
@@ -1683,7 +1685,7 @@ int refs_read_raw_ref(struct ref_store *ref_store, const char *refname,
 
 	if (!strcmp(refname, "FETCH_HEAD") || !strcmp(refname, "MERGE_HEAD")) {
 		return refs_read_special_head(ref_store, refname, oid, referent,
-					      type);
+					      type, failure_errno);
 	}
 
 	return ref_store->be->read_raw_ref(ref_store, refname, oid, referent,
diff --git a/refs/files-backend.c b/refs/files-backend.c
index 8506c8b3bde..823325cc97f 100644
--- a/refs/files-backend.c
+++ b/refs/files-backend.c
@@ -381,11 +381,12 @@ static int files_read_raw_ref(struct ref_store *ref_store, const char *refname,
 		goto out;
 
 	if (lstat(path, &st) < 0) {
-		if (errno != ENOENT)
+		*failure_errno = errno;
+		if (*failure_errno != ENOENT)
 			goto out;
 		if (refs_read_raw_ref(refs->packed_ref_store, refname, oid,
 				      referent, type, NULL)) {
-			errno = ENOENT;
+			*failure_errno = ENOENT;
 			goto out;
 		}
 		ret = 0;
@@ -396,7 +397,8 @@ static int files_read_raw_ref(struct ref_store *ref_store, const char *refname,
 	if (S_ISLNK(st.st_mode)) {
 		strbuf_reset(&sb_contents);
 		if (strbuf_readlink(&sb_contents, path, st.st_size) < 0) {
-			if (errno == ENOENT || errno == EINVAL)
+			*failure_errno = errno;
+			if (*failure_errno == ENOENT || *failure_errno == EINVAL)
 				/* inconsistent with lstat; retry */
 				goto stat_ref;
 			else
@@ -425,7 +427,7 @@ static int files_read_raw_ref(struct ref_store *ref_store, const char *refname,
 		 */
 		if (refs_read_raw_ref(refs->packed_ref_store, refname, oid,
 				      referent, type, NULL)) {
-			errno = EISDIR;
+			*failure_errno = errno = EISDIR;
 			goto out;
 		}
 		ret = 0;
@@ -438,7 +440,7 @@ static int files_read_raw_ref(struct ref_store *ref_store, const char *refname,
 	 */
 	fd = open(path, O_RDONLY);
 	if (fd < 0) {
-		if (errno == ENOENT && !S_ISLNK(st.st_mode))
+		if (*failure_errno == ENOENT && !S_ISLNK(st.st_mode))
 			/* inconsistent with lstat; retry */
 			goto stat_ref;
 		else
@@ -446,26 +448,25 @@ static int files_read_raw_ref(struct ref_store *ref_store, const char *refname,
 	}
 	strbuf_reset(&sb_contents);
 	if (strbuf_read(&sb_contents, fd, 256) < 0) {
-		int save_errno = errno;
 		close(fd);
-		errno = save_errno;
 		goto out;
 	}
 	close(fd);
 	strbuf_rtrim(&sb_contents);
 	buf = sb_contents.buf;
 
-	ret = parse_loose_ref_contents(buf, oid, referent, type);
+	ret = parse_loose_ref_contents(buf, oid, referent, type, failure_errno);
 
 out:
-	*failure_errno = errno;
+	errno = 0; /* saved in *failure_errno */
 	strbuf_release(&sb_path);
 	strbuf_release(&sb_contents);
 	return ret;
 }
 
 int parse_loose_ref_contents(const char *buf, struct object_id *oid,
-			     struct strbuf *referent, unsigned int *type)
+			     struct strbuf *referent, unsigned int *type,
+			     int *failure_errno)
 {
 	const char *p;
 	if (skip_prefix(buf, "ref:", &buf)) {
@@ -484,7 +485,7 @@ int parse_loose_ref_contents(const char *buf, struct object_id *oid,
 	if (parse_oid_hex(buf, oid, &p) ||
 	    (*p != '\0' && !isspace(*p))) {
 		*type |= REF_ISBROKEN;
-		errno = EINVAL;
+		*failure_errno = EINVAL;
 		return -1;
 	}
 	return 0;
diff --git a/refs/refs-internal.h b/refs/refs-internal.h
index c52a64b081b..530999f50df 100644
--- a/refs/refs-internal.h
+++ b/refs/refs-internal.h
@@ -700,7 +700,8 @@ struct ref_store {
  * Parse contents of a loose ref file.
  */
 int parse_loose_ref_contents(const char *buf, struct object_id *oid,
-			     struct strbuf *referent, unsigned int *type);
+			     struct strbuf *referent, unsigned int *type,
+			     int *failure_errno);
 
 /*
  * Fill in the generic part of refs and add it to our collection of
Previous: Han-Wen Nienhuys via GitGitGadgetNext: Han-Wen Nienhuys
Message 60 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.