On Fri, Apr 1, 2022 at 10:49 PM Derrick Stolee <derrickstolee@xxxxxxxxxx> wrote: > > On 4/1/2022 8:49 AM, Shaoxuan Yuan wrote:> On Fri, Apr 1, 2022 at 5:28 AM Victoria Dye <vdye@xxxxxxxxxx> wrote: > >> > >> Shaoxuan Yuan wrote: > >>> Originally, moving a <source> directory which is not on-disk due > >>> to its existence outside of sparse-checkout cone, "giv mv" command > >>> errors out with "bad source". > >>> > >>> Add a helper check_dir_in_index() function to see if a directory > >>> name exists in the index. Also add a SPARSE_DIRECTORY bit to mark > >>> such directories. > >>> > >> > >> Hmm, I think this patch would fit better in your eventual "sparse index > >> integration" series than this "prerequisite fixes to sparse-checkout" > >> series. 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. > > > > After reading your feedback, I realized that I totally misused > > the phrase "sparse directory". Clearly, this patch series does not > > deal with sparse- > > index yet, as "sparse directory" is a cache entry that points to a > > tree, if sparse-index > > is enabled. Silly me ;) > > > > What I was *actually* trying to say is: I want to change the checking > > logic of moving > > a "directory that exists outside of sparse-checkout cone", and I > > apparently misused > > "sparse directory" to reference such a thing. > > In the case of a full index (or an expanded sparse index, which is > currently always the case for `git mv`), you detect a sparse directory > by looking for the directory in the index, _not_ finding it, and then > seeing if the cache entry at the position where the directory _would_ > exist is marked with the SKIP_WORKTREE bit. > > This works in cone mode and the old mode because I assume you've already > checked for the existence of the directory, so if there _was_ any > non-SKIP_WORKTREE cache entry within the directory, then the directory > would exist in the worktree. > > (These are good details to include in the commit message.) 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. Probably I'm missing something, or I'm just dumb. > Thanks, > -Stolee -- Thanks & Regards, Shaoxuan