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

Re: [PATCH v4 4/5] ref: add symref content check for files backend

From
shejialuo <shejialuo@gmail.com>
Date
Sep 22, 2024, 15:53 UTC
Message-ID
<ZvA9agbGaGnF6nxW@ArchLinux>
In-Reply-To
<xmqqldzobtq6.fsf@gitster.g>
On Wed, Sep 18, 2024 at 01:19:13PM -0700, Junio C Hamano wrote:
Show 14 quoted lines
> shejialuo <shejialuo@gmail.com> writes:
> 
> Expect that people do not read the body of the message as completing
> a paragrpah the title started.  I.e. ...
> 
> > We have already introduced the checks for regular refs. There is no need
> > to check the consistency of the target which the symref points to.
> > Instead, we just need to check the content of the symref itself.
> 
> ... this needs a bit of preamble, like
> 
>     We have code that check regular ref contents, but we do not yet
>     check contents of symbolic refs.
> 
Thanks, I will improve this in the next version.
Show 23 quoted lines
> > A regular file is accepted as a textual symref if it begins with
> > "ref:", followed by zero or more whitespaces, followed by the full
> > refname, followed only by whitespace characters. We always write
> > a single SP after "ref:" and a single LF after the refname, but
> > third-party reimplementations of Git may have taken advantage of the
> > looser syntax. Put it more specific, we accept the following contents
> > of the symref:
> >
> > 1. "ref: refs/heads/master   "
> > 2. "ref: refs/heads/master   \n  \n"
> > 3. "ref: refs/heads/master\n\n"
> >
> > Thus, we could reuse "refMissingNewline" and "trailingRefContent"
> > FSCK_INFOs to do the same retroactive tightening as we introduce for
> > regular references.
> >
> > But we do not allow any other trailing garbage. The followings are bad
> > symref contents which will be reported as fsck error by "git-fsck(1)".
> 
> This description needs to be updated, as it is unclear if you are
> talking about errors we already detect, or if you are planning to
> update fsck to notice and report these errors.
> 

Yes, When I was writing this part, I felt a little painful to express my words. I have thought how could I express the connection between the current patch and the previous one.

Show 24 quoted lines
> > And we will remember the untrimmed length of the "referent" and call
> > "strbuf_rtrim()" on "referent". Then, we will call "check_refname_format"
> > to check whether the trimmed referent format is valid. If not, we will
> > report to the user that the symref points to referent which has invalid
> > format. If it is valid, we will compare the untrimmed length and trimmed
> > length, if they are not the same, we need to warn the user there is some
> > trailing garbage in the symref content.
> 
> That is an implementation detail of what you did.  But if the
> implementation were buggy and did not exactly what you intended to
> do, the above description gives no information to help others to fix
> it up so that it works as you intended it to work, because you do
> not explain it.
> 
> So what did you want to achieve in the third step (the first being
> "limit to refs/ hiararchy", the second being "no incomplete lines
> allowed")?
> 
>     Third, we want to make sure that the contents of a textual
>     symref MUST have a single LF after the target refname and
>     NOTHING ELSE.
> 
> or something.
> 

From the above comments, I need to organize the commit message of this patch to make things clear here.

Show 25 quoted lines
> "a directory" -> "an existing directory"?
> 
> I am not comfortable to see the word "directory" used in this
> proposed log message, as some refs could be stored in the packed
> backend and are referenced by the symbolic ref you are inspecting
> (this comment also refers to the "refs/ directory" you mentioned
> earlier as "the first check").
> 
>     Lastly, a symbolic ref MUST either point to an existing ref,
>     or if the referent does not exist, it MUST NOT be a leading
>     subpath for another existing ref (e.g., when "refs/heads/main"
>     exists, a symbolic ref that points at "refs/heads" is a no-no).
> 
> or something (but again, I am open to a phrasing better than
> "subpath").
> 
> Design question.  What do we want to do when we have no loose refs
> under the "refs/heads/historical/" hiearchy, (i.e. all of them are
> in packed-refs file) hence ".git/refs/heads/historical" directory
> does not exist on the filesystem.  And a symbolic ref points at
> "refs/heads/historical".  Shouldn't we give the same error whether
> the .git/refs/heads/historical directory exist or not, as long as
> the refs/heads/historical/main branch exists (in the packed-refs
> backend)?
> 

I guess I need to think carefully here. Actually, my intention is that I want to concentrate on the loose refs and then take consideration about the packed refs.

However, from what you have said above, it seems I could not do this. They are connected. But at current, I am not so familiar with packed refs behavior, I could not answer all the questions above.

I decide to understand what packed-ref done. So, this series may be stalled sometime until I have a good knowledge and re-think the design here.

Show 8 quoted lines
> > +`escapeReferent`::
> > +	(ERROR) The referent of a symref is outside the "ref" directory.
> 
> I am not sure starting this as ERROR is wise.  Users and third-party
> tools make creative uses of the system and I cannot offhand think of
> an argument why it should be forbidden to create a symbolic link to
> our own HEAD or to some worktree-specific ref in another worktree.
> 

Do we allow this cross-access (hack)? It might cause some trouble from my perspective.

Show 6 quoted lines
> > +	if (referent->buf[referent->len - 1] != '\n') {
> 
> As you initialized "len" to "referent->len-1" earlier, wouldn't it
> more natural to use it here?  That would match the incrementing of
> len++ later in this block.
> 
Yes, exactly.
Show 21 quoted lines
> > +		ret = fsck_report_ref(o, report,
> > +				      FSCK_MSG_REF_MISSING_NEWLINE,
> > +				      "missing newline");
> > +		len++;
> > +	}
> 
> Having said that, the above should be simplified more like:
> 
>  * declare but not initialize "len".  better yet, declare "orig_len"
>    and leave it uninitialized.
> 
>  * do not touch "len++" in the above block (actually, you can
>    discard the above "if(it does not end with LF)" block, see
>    below).
> 
>  * instead grab "referent->len" in "len" (or "orig_len") immediately
>    before you first modify referent, i.e. before strbuf_rtrim() call.
> 
> 	orig_len = referent->len;
> 	orig_last_byte = referent->buf[orig_len - 1];
> 
I agree.
Show 12 quoted lines
> > +	strbuf_rtrim(referent);
> > +	if (check_refname_format(referent->buf, 0)) {
> > +		ret = fsck_report_ref(o, report,
> > +				      FSCK_MSG_BAD_REFERENT_NAME,
> > +				      "points to refname with invalid format");
> 
> Similar to an earlier step, the message does not give any more
> information than the enum.  Wouldn't the user who got this error
> want to learn what referent->buf said and which part of it was bad
> in the same message, instead of having to look it up on their own
> after fsck finishes?
> 
Yes, I agree. I will improve this.
Show 20 quoted lines
> > +		goto out;
> > +	}
> 
> At this point we know check_refname_format() is happy with what is
> left after rtrimming the referent.  There are four cases:
> 
>  - rtrim() did not trim anything (orig_len == referent->len); the file
>    lacked the terminating LF.
> 
>  - rtrim() trimmed one byte (orig_len - 1 == referent->len) and
>    the byte was not LF (orig_last_byte != '\n').  The file lacked
>    the terminating LF.
> 
>  - rtrim() trimmed exactly one byte (orig_len - 1 == referent->len)
>    and the byte was LF (orig_last_byte == '\n').  There is no error.
> 
>  - all other cases, i.e., rtrim() trimmed two or more bytes.  The
>    file had trailing whitespaces after a valid referent that passed
>    check_refname_format().
> 
That's so clear. My implementation is not good compared with this.
Show 22 quoted lines
> So in short,
> 
> 	if (referent->len == orig_len ||
> 	    referent->len == orig_len - 1 && orig_last_byte != '\n') {
> 		FSCK_MSG_REF_MISSING_NEWLINE;
> 	} else if (referent->len < orig_len - 1) {
> 		FSCK_MSG_REF_TRAILING_WHITESPACE;
> 	}
> 
> can replace the next block you wrote, and we can also remove the
> earlier "it is an error if it does not end with '\n'", I think.
> 
> > +	if (len != referent->len) {
> > +		ret = fsck_report_ref(o, report,
> > +				      FSCK_MSG_TRAILING_REF_CONTENT,
> > +				      "trailing garbage in ref");
> 
> As check_refname_format() was happy, the difference between orig_len
> and referent->len are only coming from trailing whitespaces, i.e. it
> is not that it had arbitrary garbage.  Shouldn't we be more explicit
> about that?
> 

Yes, I made a lot of mistakes when calling the "fsck_report_ref". I will report the exact garbage content to the user.

Show 27 quoted lines
> > +	/*
> > +	 * Dangling symrefs are common and so we don't report them.
> > +	 */
> > +	if (lstat(referent_path->buf, &st)) {
> > +		if (errno != ENOENT) {
> > +			ret = error_errno(_("unable to stat '%s'"),
> > +					  referent_path->buf);
> > +		}
> > +		goto out;
> > +	}
> > +
> > +	/*
> > +	 * We cannot distinguish whether "refs/heads/a" is a directory or not by
> > +	 * using "check_refname_format(referent->buf, 0)". Instead, we need to
> > +	 * check the file type of the target.
> > +	 */
> > +	if (S_ISDIR(st.st_mode)) {
> > +		ret = fsck_report_ref(o, report,
> > +				      FSCK_MSG_BAD_REFERENT_FILETYPE,
> > +				      "points to the directory");
> > +		goto out;
> > +	}
> 
> If referent_path->buf refers to "refs/heads/historical/", and all
> the branches under the hierarchy have been sent to packed-refs,
> then this check will not trigger.
> 
Yes, because "refs/heads/historical" will not appear in the filesystem.
Show 17 quoted lines
> I wonder if this check is the right thing to enforce in the first
> place, though.
> 
> As far as the end user is concerned, refs/heads/historical/master
> branch stil exists, and there is no refs/heads/historical branch, so
> such a symbolic ref, for all intents and purposes, is the same as
> any other dangling symbolic refs, no?
> 
> Of course, "git update-ref SUCH_A_SYMREF HEAD" will complain because
> there is refs/heads/historical, with something like 
> 
>     "refs/heads/historical/master" exists, cannot create "refs/heads/historical"
> 
> but that is to be expected.  If you remove the last branch in the
> refs/heads/historical hierarchy, you should be able to do such an
> update-ref to instanciate refs/heads/historical as a regular ref.
> 

I am a little shocked here. I do this in action and find the directory will be automatically converted to a regular file in the filesystem. So, I agree with you here. We should never check this, because we allow symref to point to a directory. As long as there is no loose refs and packed refs under this directory, we could use "git update-ref" for this symref.

Thanks,
Show 22 quoted lines
> > @@ -3484,12 +3553,24 @@ static int files_fsck_refs_content(struct ref_store *ref_store,
> >  					      "trailing garbage in ref");
> >  			goto cleanup;
> >  		}
> > +	} else {
> > +		strbuf_addf(&referent_path, "%s/%s",
> > +			    ref_store->gitdir, referent.buf);
> > +		/*
> > +		 * the referent may contain the spaces and the newline, need to
> > +		 * trim for path.
> > +		 */
> > +		strbuf_rtrim(&referent_path);
> 
> I doubt this is a good design.  We have referent, and the symbolic
> ref checker knows that the true referent refname may be followed by
> whitespaces, so instead of inventing referent _path here, it would
> be a better design to let the files_fsck_symref_target() to decide
> what file to open and check based on referent, no?  Give it the
> refstore or refstore's gitdir and have the concatenation with the
> rtrimmed contents in the referent->buf after it inspected it
> instead, perhaps?
> 

Yes, I agree with you here. We should use "files_fsck_symref_target" to do this.

----

From this review, I think I need to understand more behaviors about files backend and packed backend. Thanks for your so dedicated reviews. I may spend more time to send the next version. And there may be some delay.

Thanks, Jialuo

Previous: Junio C HamanoNext: Junio C Hamano
Message 92 of 209 in “[RFC] Implement ref content consistency check”
  1. shejialuoAug 13, 2024
  2. karthik nayakAug 15, 2024
  3. shejialuoAug 15, 2024
  4. Patrick SteinhardtAug 16, 2024
  5. Junio C HamanoAug 16, 2024
  6. 0/4 add ref content check for files backendshejialuo, Aug 18, 2024
  7. 1/4 fsck: introduce "FSCK_REF_REPORT_DEFAULT" macroshejialuo, Aug 18, 2024
  8. Junio C HamanoAug 20, 2024
  9. shejialuoAug 21, 2024
  10. 2/4 ref: add regular ref content check for files backendshejialuo, Aug 18, 2024
  11. Junio C HamanoAug 20, 2024
  12. shejialuoAug 21, 2024
  13. Patrick SteinhardtAug 22, 2024
  14. Junio C HamanoAug 22, 2024
  15. Junio C HamanoAug 22, 2024
  16. Patrick SteinhardtAug 23, 2024
  17. shejialuoAug 23, 2024
  18. Patrick SteinhardtAug 22, 2024
  19. shejialuoAug 22, 2024
  20. 3/4 ref: add symbolic ref content check for files backendshejialuo, Aug 18, 2024
  21. Patrick SteinhardtAug 22, 2024
  22. shejialuoAug 22, 2024
  23. Patrick SteinhardtAug 23, 2024
  24. shejialuoAug 23, 2024
  25. 4/4 ref: add symlink ref consistency check for files backendshejialuo, Aug 18, 2024
  26. 0/4 add ref content check for files backendshejialuo, Aug 27, 2024
  27. 1/4 ref: initialize "fsck_ref_report" with zeroshejialuo, Aug 27, 2024
  28. Junio C HamanoAug 27, 2024
  29. 2/4 ref: add regular ref content check for files backendshejialuo, Aug 27, 2024
  30. shejialuoAug 27, 2024
  31. Junio C HamanoAug 27, 2024
  32. Patrick SteinhardtAug 28, 2024
  33. Junio C HamanoAug 28, 2024
  34. Patrick SteinhardtAug 29, 2024
  35. shejialuoAug 28, 2024
  36. Junio C HamanoAug 28, 2024
  37. Patrick SteinhardtAug 28, 2024
  38. shejialuoAug 28, 2024
  39. Junio C HamanoAug 28, 2024
  40. 3/4 ref: add symbolic ref content check for files backendshejialuo, Aug 27, 2024
  41. Junio C HamanoAug 27, 2024
  42. shejialuoAug 28, 2024
  43. Patrick SteinhardtAug 28, 2024
  44. shejialuoAug 28, 2024
  45. Junio C HamanoAug 28, 2024
  46. Patrick SteinhardtAug 29, 2024
  47. 4/4 ref: add symlink ref check for files backendshejialuo, Aug 27, 2024
  48. SQUASH??? remove unused parametersJunio C Hamano, Aug 28, 2024
  49. Junio C HamanoAug 28, 2024
  50. Jeff KingAug 29, 2024
  51. Junio C HamanoAug 29, 2024
  52. Patrick SteinhardtAug 29, 2024
  53. Junio C HamanoAug 29, 2024
  54. Jeff KingAug 29, 2024
  55. shejialuoAug 29, 2024
  56. Junio C HamanoAug 29, 2024
  57. 8/6 CodingGuidelines: also mention MAYBE_UNUSEDJunio C Hamano, Aug 29, 2024
  58. Jeff KingAug 29, 2024
  59. Junio C HamanoAug 29, 2024
  60. CodingGuidelines: also mention MAYBE_UNUSEDJunio C Hamano, Aug 29, 2024
  61. 9/6 git-compat-util: guard definition of MAYBE_UNUSED with __GNUC__Junio C Hamano, Aug 29, 2024
  62. Jeff KingAug 29, 2024
  63. Junio C HamanoAug 29, 2024
  64. Jeff KingAug 29, 2024
  65. 0/4 add ref content check for files backendshejialuo, Sep 3, 2024
  66. 1/4 ref: initialize "fsck_ref_report" with zeroshejialuo, Sep 3, 2024
  67. 2/4 ref: add regular ref content check for files backendshejialuo, Sep 3, 2024
  68. Patrick SteinhardtSep 9, 2024
  69. shejialuoSep 10, 2024
  70. karthik nayakSep 10, 2024
  71. shejialuoSep 13, 2024
  72. 3/4 ref: add symref content check for files backendshejialuo, Sep 3, 2024
  73. Patrick SteinhardtSep 9, 2024
  74. shejialuoSep 10, 2024
  75. karthik nayakSep 10, 2024
  76. shejialuoSep 12, 2024
  77. 4/4 ref: add symlink ref content check for files backendshejialuo, Sep 3, 2024
  78. Patrick SteinhardtSep 9, 2024
  79. shejialuoSep 10, 2024
  80. 0/5 add ref content check for files backendshejialuo, Sep 13, 2024
  81. 1/5 ref: initialize "fsck_ref_report" with zeroshejialuo, Sep 13, 2024
  82. Junio C HamanoSep 18, 2024
  83. 2/5 ref: port git-fsck(1) regular refs check for files backendshejialuo, Sep 13, 2024
  84. Junio C HamanoSep 18, 2024
  85. shejialuoSep 22, 2024
  86. 3/5 ref: add more strict checks for regular refsshejialuo, Sep 13, 2024
  87. Junio C HamanoSep 18, 2024
  88. shejialuoSep 22, 2024
  89. Junio C HamanoSep 22, 2024
  90. 4/5 ref: add symref content check for files backendshejialuo, Sep 13, 2024
  91. Junio C HamanoSep 18, 2024
  92. shejialuoSep 22, 2024
  93. Junio C HamanoSep 22, 2024
  94. 5/5 ref: add symlink ref content check for files backendshejialuo, Sep 13, 2024
  95. Junio C HamanoSep 18, 2024
  96. Junio C HamanoSep 18, 2024
  97. 0/9 add ref content check for files backendshejialuo, Sep 29, 2024
  98. 1/9 ref: initialize "fsck_ref_report" with zeroshejialuo, Sep 29, 2024
  99. Karthik NayakOct 8, 2024
  100. 2/9 builtin/refs: support multiple worktrees check for refs.shejialuo, Sep 29, 2024
  101. Patrick SteinhardtOct 7, 2024
  102. shejialuoOct 7, 2024
  103. Patrick SteinhardtOct 7, 2024
  104. shejialuoOct 7, 2024
  105. 3/9 ref: port git-fsck(1) regular refs check for files backendshejialuo, Sep 29, 2024
  106. Patrick SteinhardtOct 7, 2024
  107. shejialuoOct 7, 2024
  108. Patrick SteinhardtOct 7, 2024
  109. shejialuoOct 7, 2024
  110. Karthik NayakOct 8, 2024
  111. shejialuoOct 8, 2024
  112. Junio C HamanoOct 8, 2024
  113. Patrick SteinhardtOct 9, 2024
  114. shejialuoOct 9, 2024
  115. Patrick SteinhardtOct 10, 2024
  116. Junio C HamanoOct 10, 2024
  117. shejialuoOct 9, 2024
  118. 4/9 ref: add more strict checks for regular refsshejialuo, Sep 29, 2024
  119. Patrick SteinhardtOct 7, 2024
  120. shejialuoOct 7, 2024
  121. Patrick SteinhardtOct 7, 2024
  122. shejialuoOct 7, 2024
  123. 5/9 ref: add basic symref content check for files backendshejialuo, Sep 29, 2024
  124. Karthik NayakOct 8, 2024
  125. shejialuoOct 8, 2024
  126. 6/9 ref: add escape check for the referent of symrefshejialuo, Sep 29, 2024
  127. Patrick SteinhardtOct 7, 2024
  128. shejialuoOct 7, 2024
  129. Patrick SteinhardtOct 7, 2024
  130. 7/9 ref: enhance escape situation for worktreesshejialuo, Sep 29, 2024
  131. Patrick SteinhardtOct 7, 2024
  132. shejialuoOct 7, 2024
  133. 8/9 t0602: add ref content checks for worktreesshejialuo, Sep 29, 2024
  134. Patrick SteinhardtOct 7, 2024
  135. shejialuoOct 7, 2024
  136. 9/9 ref: add symlink ref content check for files backendshejialuo, Sep 29, 2024
  137. Patrick SteinhardtOct 7, 2024
  138. shejialuoOct 7, 2024
  139. Junio C HamanoSep 30, 2024
  140. shejialuoOct 1, 2024
  141. shejialuoOct 7, 2024
  142. 0/9 add ref content check for files backendshejialuo, Oct 21, 2024
  143. 1/9 ref: initialize "fsck_ref_report" with zeroshejialuo, Oct 21, 2024
  144. 2/9 ref: check the full refname instead of basenameshejialuo, Oct 21, 2024
  145. karthik nayakOct 21, 2024
  146. shejialuoOct 22, 2024
  147. Patrick SteinhardtNov 5, 2024
  148. shejialuoNov 6, 2024
  149. 3/9 ref: initialize target name outside of check functionsshejialuo, Oct 21, 2024
  150. karthik nayakOct 21, 2024
  151. Patrick SteinhardtNov 5, 2024
  152. shejialuoNov 6, 2024
  153. Patrick SteinhardtNov 6, 2024
  154. 4/9 ref: support multiple worktrees check for refsshejialuo, Oct 21, 2024
  155. karthik nayakOct 21, 2024
  156. shejialuoOct 22, 2024
  157. Patrick SteinhardtNov 5, 2024
  158. shejialuoNov 5, 2024
  159. Patrick SteinhardtNov 6, 2024
  160. shejialuoNov 6, 2024
  161. 5/9 ref: port git-fsck(1) regular refs check for files backendshejialuo, Oct 21, 2024
  162. Patrick SteinhardtNov 5, 2024
  163. 6/9 ref: add more strict checks for regular refsshejialuo, Oct 21, 2024
  164. 7/9 ref: add basic symref content check for files backendshejialuo, Oct 21, 2024
  165. 8/9 ref: check whether the target of the symref is a refshejialuo, Oct 21, 2024
  166. 9/9 ref: add symlink ref content check for files backendshejialuo, Oct 21, 2024
  167. Taylor BlauOct 21, 2024
  168. shejialuoOct 22, 2024
  169. Taylor BlauOct 21, 2024
  170. 0/9 add ref content check for files backendshejialuo, Nov 10, 2024
  171. 1/9 ref: initialize "fsck_ref_report" with zeroshejialuo, Nov 10, 2024
  172. 2/9 ref: check the full refname instead of basenameshejialuo, Nov 10, 2024
  173. 3/9 ref: initialize ref name outside of check functionsshejialuo, Nov 10, 2024
  174. 4/9 ref: support multiple worktrees check for refsshejialuo, Nov 10, 2024
  175. 5/9 ref: port git-fsck(1) regular refs check for files backendshejialuo, Nov 10, 2024
  176. Patrick SteinhardtNov 13, 2024
  177. shejialuoNov 14, 2024
  178. 6/9 ref: add more strict checks for regular refsshejialuo, Nov 10, 2024
  179. 7/9 ref: add basic symref content check for files backendshejialuo, Nov 10, 2024
  180. 8/9 ref: check whether the target of the symref is a refshejialuo, Nov 10, 2024
  181. 9/9 ref: add symlink ref content check for files backendshejialuo, Nov 10, 2024
  182. Patrick SteinhardtNov 13, 2024
  183. shejialuoNov 14, 2024
  184. Patrick SteinhardtNov 13, 2024
  185. 0/9 add ref content check for files backendshejialuo, Nov 14, 2024
  186. 1/9 ref: initialize "fsck_ref_report" with zeroshejialuo, Nov 14, 2024
  187. 2/9 ref: check the full refname instead of basenameshejialuo, Nov 14, 2024
  188. 3/9 ref: initialize ref name outside of check functionsshejialuo, Nov 14, 2024
  189. 4/9 ref: support multiple worktrees check for refsshejialuo, Nov 14, 2024
  190. 5/9 ref: port git-fsck(1) regular refs check for files backendshejialuo, Nov 14, 2024
  191. Patrick SteinhardtNov 15, 2024
  192. shejialuoNov 15, 2024
  193. 6/9 ref: add more strict checks for regular refsshejialuo, Nov 14, 2024
  194. 7/9 ref: add basic symref content check for files backendshejialuo, Nov 14, 2024
  195. 8/9 ref: check whether the target of the symref is a refshejialuo, Nov 14, 2024
  196. 9/9 ref: add symlink ref content check for files backendshejialuo, Nov 14, 2024
  197. shejialuoNov 15, 2024
  198. 0/9 add ref content check for files backendshejialuo, Nov 20, 2024
  199. 1/9 ref: initialize "fsck_ref_report" with zeroshejialuo, Nov 20, 2024
  200. 2/9 ref: check the full refname instead of basenameshejialuo, Nov 20, 2024
  201. 3/9 ref: initialize ref name outside of check functionsshejialuo, Nov 20, 2024
  202. 4/9 ref: support multiple worktrees check for refsshejialuo, Nov 20, 2024
  203. 5/9 ref: port git-fsck(1) regular refs check for files backendshejialuo, Nov 20, 2024
  204. 6/9 ref: add more strict checks for regular refsshejialuo, Nov 20, 2024
  205. 7/9 ref: add basic symref content check for files backendshejialuo, Nov 20, 2024
  206. 8/9 ref: check whether the target of the symref is a refshejialuo, Nov 20, 2024
  207. 9/9 ref: add symlink ref content check for files backendshejialuo, Nov 20, 2024
  208. Patrick SteinhardtNov 20, 2024
  209. Junio C HamanoNov 20, 2024

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.