diff options
-rwxr-xr-x | git-add.sh | 30 | ||||
-rw-r--r-- | update-index.c | 34 |
2 files changed, 49 insertions, 15 deletions
diff --git a/git-add.sh b/git-add.sh index 3d364db251..a8498c729a 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 1eeb45dbb1..ef82b8620c 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); |