aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2005-10-14 21:56:46 -0700
committerJunio C Hamano <junkio@cox.net>2005-10-17 17:41:55 -0700
commitcaf4f582b2bb4d5582540aa49d29749b2600cd03 (patch)
tree563d5d779fd36156ce5543f22f046907d5b78c9b
parent22ddf7197958337a8c254122eae4efcd8a54098a (diff)
downloadgit-caf4f582b2bb4d5582540aa49d29749b2600cd03.tar.gz
git-caf4f582b2bb4d5582540aa49d29749b2600cd03.tar.xz
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>
-rwxr-xr-xgit-add.sh30
-rw-r--r--update-index.c34
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);