Improve "git add" again.

This makes it possible to add paths that have funny characters (TAB
and LF) in them, and makes adding many paths more efficient in
general.

New flag "--stdin" to update-index was initially added for different
purpose, but it turns out to be a perfect match for feeding "ls-files
--others -z" output to improve "git add".

It also adds "--verbose" flag to update-index for use with "git add"
command.

Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Junio C Hamano 2005-10-14 21:56:46 -07:00
parent 22ddf71979
commit caf4f582b2
2 changed files with 49 additions and 15 deletions

View File

@ -6,10 +6,9 @@ while : ; do
case "$1" in
-n)
show_only=true
verbose=true
;;
-v)
verbose=true
verbose=--verbose
;;
*)
break
@ -19,14 +18,19 @@ while : ; do
done
GIT_DIR=$(git-rev-parse --git-dir) || exit
global_exclude=
if [ -f "$GIT_DIR/info/exclude" ]; then
global_exclude="--exclude-from=$GIT_DIR/info/exclude"
fi
for i in $(git-ls-files --others \
$global_exclude --exclude-per-directory=.gitignore \
"$@")
do
[ "$verbose" ] && echo " $i"
[ "$show_only" ] || git-update-index --add -- "$i" || exit
done
if test -f "$GIT_DIR/info/exclude"
then
git-ls-files -z \
--exclude-from="$GIT_DIR/info/exclude" \
--others --exclude-per-directory=.gitignore "$@"
else
git-ls-files -z \
--others --exclude-per-directory=.gitignore "$@"
fi |
case "$show_only" in
true)
xargs -0 echo ;;
*)
git-update-index --add $verbose -z --stdin ;;
esac

View File

@ -13,8 +13,15 @@
* like "git-update-index *" and suddenly having all the object
* files be revision controlled.
*/
static int allow_add = 0, allow_remove = 0, allow_replace = 0, allow_unmerged = 0, not_new = 0, quiet = 0, info_only = 0;
static int allow_add;
static int allow_remove;
static int allow_replace;
static int allow_unmerged; /* --refresh needing merge is not error */
static int not_new; /* --refresh not having working tree files is not error */
static int quiet; /* --refresh needing update is not error */
static int info_only;
static int force_remove;
static int verbose;
/* Three functions to allow overloaded pointer return; see linux/err.h */
static inline void *ERR_PTR(long error)
@ -32,6 +39,19 @@ static inline long IS_ERR(const void *ptr)
return (unsigned long)ptr > (unsigned long)-1000L;
}
static void report(const char *fmt, ...)
{
va_list vp;
if (!verbose)
return;
va_start(vp, fmt);
vprintf(fmt, vp);
putchar('\n');
va_end(vp);
}
static int add_file_to_cache(const char *path)
{
int size, namelen, option, status;
@ -260,7 +280,11 @@ static int add_cacheinfo(const char *arg1, const char *arg2, const char *arg3)
ce->ce_mode = create_ce_mode(mode);
option = allow_add ? ADD_CACHE_OK_TO_ADD : 0;
option |= allow_replace ? ADD_CACHE_OK_TO_REPLACE : 0;
return add_cache_entry(ce, option);
if (add_cache_entry(ce, option))
return error("%s: cannot add to the index - missing --add option?",
arg3);
report("add '%s'", arg3);
return 0;
}
static int chmod_path(int flip, const char *path)
@ -300,10 +324,12 @@ static void update_one(const char *path, const char *prefix, int prefix_length)
if (force_remove) {
if (remove_file_from_cache(p))
die("git-update-index: unable to remove %s", path);
report("remove '%s'", path);
return;
}
if (add_file_to_cache(p))
die("Unable to process file %s", path);
report("add '%s'", path);
}
static void read_index_info(int line_termination)
@ -447,6 +473,10 @@ int main(int argc, const char **argv)
not_new = 1;
continue;
}
if (!strcmp(path, "--verbose")) {
verbose = 1;
continue;
}
die("unknown option %s", path);
}
update_one(path, prefix, prefix_length);