Re: [WIP v1 2/4] mv: add check_dir_in_index() and solve general dir check issue
- From
Derrick Stolee <derrickstolee@github.com>
- Date
- Apr 4, 2022, 12:43 UTC
- Message-ID
- <68e1703d-7a4a-cc83-f344-494533297e3d@github.com>
- In-Reply-To
- <CAJyCBOREzrGSwzjAz_89q1+O2X-qqa-qB2ywPVGU=q37O-QdzQ@mail.gmail.com>
On 4/4/2022 3:49 AM, Shaoxuan Yuan wrote:
Show 27 quoted lines
> On Mon, Apr 4, 2022 at 3:25 PM Shaoxuan Yuan <shaoxuan.yuan02@gmail.com> wrote: >> I read and think about this part a few times, but I'm still confused. >> >> As Victoria pointed out earlier, and I quote, "Sparse directories *only* appear >> when you're using a sparse index, so, theoretically, this shouldn't ever >> come up (and thus isn't testable) until you're using a sparse index." >> So I'm not so sure what do you mean by putting "full index" and "sparse >> directory" together. >> >> Thus, I go ahead and try to detect a directory that is outside of >> sparse-checkout cone, without sparse-index enabled. >> >> I found a problem that if you use cache_name_pos() to do this >> detection, I imagined the following example (I'm trying to imitate an >> output of "git ls-files -t"): >> >> H a >> H b >> S d/file1 >> H e/file1 >> >> So in this index, I use cache_name_pos() to find a directory "c/". I imagine the >> the value returned would be -3, which indicates this directory would be inserted >> at index position 2. However, the cache entry at position 2 is >> "d/file1", which is >> marked with SKIP_WORKTREE, and this fact cannot guarantee that "c/" is >> a sparse directory, since ''c/" is not in the index per se.
I was thinking more about the case where you find a tracked directory that has all contained files marked with SKIP_WORTKREE.
If you search for "d/" you will also get -3. Then, you will see that at position 2 the cache entry d/file1 has SKIP_WORKTREE. The directory "d/" should exist on disk if there are any entries starting with "d/" that do not have the SKIP_WORKTREE bit.
Interesting things happen if you are in the scenario where d/f is in the cone-mode sparse-checkout definition and you see this list of cache entries:
S d/a H d/f/b S d/g
Again, d/f/b should imply the existence of the directory d/ in the worktree.
>> Probably I'm missing something, or I'm just dumb. > > Though I think doing a strncmp() after the cache_name_pos() > can get the job done :)
I think this is the way to do it, including index_range_of_same_dir() in builtin/mv.c.
Thanks, -Stolee