Ramkumar Ramachandra <[email protected]> writes:
>> Then rename() will move the submodule work tree just
>> like it moves a file.
>
> What is this rename() function you're talking about? I don't see it anywhere.
"man 2 rename"; it is called from a generic part of builtin/mv.c to
rename one path to another and can move both files and directories.
>> + if (first >= 0) {
>> + if
>> (!S_ISGITLINK(active_cache[first]->ce_mode))
>> + die (_("Huh? Directory %s is in
>> index and no submodule?"), src);
>
> I didn't understand this. Why does it have to be a gitlink if it is
> stored at index position >= 0?
The path is not in the middle of the conflict, but the index records
something that is not a gitlink. E.g. you start from A (regular file)
in the index, "rm A && mkdir A" and make it the top of a working
tree of a separate project. "git mv A elsewhere" will say "src_is_dir"
but the index still thinks A should be a regular file blob.
> I'm assuming the else-case has nothing to do with the actual moving
> but rather something specific to directories (enumerating entries in
> it?), which is why it doesn't get executed when we find a gitlink.
It wants to move all the paths in the directory to a new
destination, e.g. "git mv srcdir dstdir", and update
>> + } else {
>> + const char *src_w_slash = add_slash(src);
>> + int last, len_w_slash = length + 1;
>> +
>> + modes[i] = WORKING_DIRECTORY;
>> +
>> + first = cache_name_pos(src_w_slash,
>> len_w_slash);
>> + if (first >= 0)
>> + die (_("Huh? %.*s is in index?"),
>> + len_w_slash,
>> src_w_slash);
>> +
>> + first = -1 - first;
>> + for (last = first; last < active_nr; last++)
>> {
>> + const char *path =
>> active_cache[last]->name;
>> + if (strncmp(path, src_w_slash,
>> len_w_slash))
>> + break;
>> }
>
> Mostly unchanged, but I didn't understand the line first = -1 - first
> in the original. What is it doing? So, I'm guessing first is the
> cache position of the directory itself, and last stores the index of
> the "last" entry in the cache? What does that even mean?
cache_name_pos() either returns the position for a path at stage #0
that exists in the index, or the position the given path _would_ be
inserted if you were to add it to the index for a path that does not
exist in the index at stage #0 (I think this part of the code does
not consider that the given path is unmerged, either by being sloppy
or detecting that case much earlier---I didn't check), and when
doing the latter, it encodes the position by negating it and
offsetting it by 1 (otherwise you cannot tell "it would come at the
very beginning" and "it is at the very beginning", because negated
zero is still zero). The "-1 - first" is an idiom used everywhere
by callers of cache_name_pos() to recover the latter from the
returned value.
If you start at a position "src/" would have been inserted, and
iterate over the index while the entry's path prefix-matches with
"src/", you will find where the entries in the "src/" directory
ends.
>> + if (last - first < 1)
>> + bad = _("source directory is empty");
>
> This is exactly what was tripping us up earlier. Can you explain what
> last - first < 1 means?
I think the above covers it.
Asking questions to learn the basic part of Git internals on this
list, e.g. "I found this existing code, and I do not understand what
it is doing. Can somebody shed a light on it?", is perfectly fine,
but can you do so outside the review discussion?
It clutters the review discussions when such a request for education
is labeled as if it were a review or mixed with a message with
genuine review comments.
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html