Thinking about this issue a bit more, I realize that the earlier "git add -A"
change was done in a quite inefficient way (i.e. it is as unefficient as
"git add -u && git add ." modulo one fork/exec and read/write index). For
that matter, the original "git add ." could probably be more efficient
than it currently is.
The thing is, when the user asks "git add .", we do not have to examine
all paths we encounter and perform the excluded() and dir_add_name()
processing, both of which are slower code and use slower data structure by
git standard, especially when the index is already populated.
Instead, we should be able to implement "git add $pathspec..." as:
- read the index;
- read_directory() to process untracked, unignored files the current way,
that is, recursively doing readdir(), filtering them by pathspec and
excluded(), queueing them via dir_add_name() and finally do
add_files(); and
- iterate over the index, filtering them by pathspec, and update only the
modified/type changed paths but not deleted ones.
And "git add -A" will become exactly the same as above, modulo:
- missing $pathspec means "." instead of being an error; and
- "interate over the index" part handles deleted ones as well,
i.e. exactly what the current update_callback() in builtin-add.c does.
It is likely that I am too tired to do this right tonight, so I'll go to
bed and expect to find a nicely done patch in my mailbox by somebody else
;-).
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html