Subject: Re: [PATCH v3 3/3] correct ce_compare_data() in a middle of a merge

From: Junio C Hamano <[email-masked]>
Date: Wed, 06 Jul 2016 07:57:00 -0700

Torsten Bögershausen <[email-masked]> writes:

> At some point inside the merge, Git calls read-cache.c/ce_compare_data(),
>   to check if the path named "file" is clean.
>   According to the tree information, the path "file" has the sha1 99b633.
>   #Note:
>   #sha1 99b633 is "first line\nsame line\n"

I thought your scenario was that our side had CRLF both in the blob
and in the working tree.  So this is a different example?  Our side
has LF in the blob that is checked out with CRLF in the working tree,
and their side has CRLF in the blob?

> ce_compare_data() starts the work:
> OK, lets run index_fd(...,ce->name,...)
> # index_fd will simulate a "git add"  and return the sha1 (via the sha1 pointer)
> # after the hashing.
>
> # ce_compare_data() will later compare ce->sha1 with the result stored in
> # the local sha1. That's why a sha1 is in the parameter list.
> # To return the resulting hash:
>
> ce_compare_data() calls index_fd(sha1, ..., ce->name, ...)
>
> #Down in index_fd():
>
> sha1_file.c/index_fd() calls index_core() (after consulting the attributes)
> index_core() reads the file from the working tree into memory using
> read_in_full(), and after that index_mem() calls hash_sha1_file(buf)
> to calculate the sha1.
>
> Before the hashing is done, index_mem() runs
> convert_to_git(path, buf, size, &nbuf, SAFE_CRLF_FALSE)
> to convert  "blobs to git internal format".
>
>
> Here, convert_to_git() consults the .gitattributes (again) to find out that
> crlf_action is CRLF_AUTO in our case.
> The "new safer autocrlf handling" says that if a blob as any CR, don't convert
> CRLFs at "git add".
>
> convert.c/crlf_to_git() starts to do it's job:
> - look at buf (It has CRLF, conversion may be needed)
> - consult blob_has_cr()
>   # Note: Before this patch, has_cr_in_index(path)) was used
>
> #Again, before this patch,
> has_cr_in_index(path) calls read_blob_data_from_cache(path, &sz) to read the
> blob into memory.
>
> Now read_blob_data_from_cache() is a macro, and we end up in
> read_blob_data_from_index(&the_index, (path), (sz))
>
> read-cache.c/read_blob_data_from_index() starts its work:
> 	pos = index_name_pos(istate, path, len);
> 	if (pos < 0) {
> 		/*
> 		 * We might be in the middle of a merge, in which
> 		 * case we would read stage #2 (ours).
> 		 */
>
> # And here, and this is important to notice, "ours" is sha1 ad55e2,
> # which corresponds to "first line\r\nsame line\r\n"

Where did 99b633 come from then?  There still is something missing
in this description.

Puzzled...