From caf4f582b2bb4d5582540aa49d29749b2600cd03 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Fri, 14 Oct 2005 21:56:46 -0700 Subject: [PATCH] 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 --- git-add.sh | 30 +++++++++++++++++------------- update-index.c | 34 ++++++++++++++++++++++++++++++++-- 2 files changed, 49 insertions(+), 15 deletions(-) diff --git a/git-add.sh b/git-add.sh index 3d364db25..a8498c729 100755 --- a/git-add.sh +++ b/git-add.sh @@ -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 diff --git a/update-index.c b/update-index.c index 1eeb45dbb..ef82b8620 100644 --- a/update-index.c +++ b/update-index.c @@ -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); -- 2.26.2