Skip to content

Commit

Permalink
Improve "git add" again.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Junio C Hamano committed Oct 18, 2005
1 parent 22ddf71 commit caf4f58
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 15 deletions.
30 changes: 17 additions & 13 deletions git-add.sh
Expand Up @@ -6,10 +6,9 @@ while : ; do
case "$1" in
-n)
show_only=true
verbose=true
;;
-v)
verbose=true
verbose=--verbose
;;
*)
break
Expand All @@ -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
34 changes: 32 additions & 2 deletions update-index.c
Expand Up @@ -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)
Expand All @@ -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;
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit caf4f58

Please sign in to comment.