Re: [PATCH] [BUG FIXED] git-add (-a|-u) and -n support
- From
Michael Witten <mfwitten@mit.edu>
- Date
- Oct 14, 2007, 12:11 UTC
- Message-ID
- <0458D1DA-6261-4DA6-91B0-739F4D35AADF@mit.edu>
- In-Reply-To
- <E1DCA1D1-1ED3-498A-A919-9EBAF3BA0870@mit.edu>
On 14 Oct 2007, at 6:26:28 AM, Michael Witten wrote:
Show 12 quoted lines
> Hello, > > The git-add command doesn't handle -n when using -u. > > I fixed this and added -a for adding ALL files, not > just those below the current directory (just like > git-commit). > > The patch is below, but you can also download it from > http://web.mit.edu/mfwitten/git/0001-git-add-now-understands-two- > kinds-of-update.patch >
Unfortunately, I introduced a bug. The following:
> + if (show_only)
> + remove_file_from_cache(path);
> + if (verbose)
> + printf("remove '%s'\n", path);Should be:
> + if (!show_only)
> + remove_file_from_cache(path);
> + if (verbose)
> + printf("remove '%s'\n", path);The new patch is listed below: (http://web.mit.edu/mfwitten/git/0001-git-add-now-understands-two- kinds-of-update.patch)
From 6d7480062b1e1c513441d4bbc17a9a8b5d9b1c8f Mon Sep 17 00:00:00 2001 From: Michael Witten <mfwitten@mit.edu> Date: Sun, 14 Oct 2007 06:13:20 -0400 Subject: [PATCH] git-add now understands two kinds of update:
-u: update as before -a: update all as in a true 'git commit -a'
Also, -n works correctly now with the above options.
Signed-off-by: Michael Witten <mfwitten@mit.edu> --- builtin-add.c | 69 +++++++++++++++++++++++++++++++++++++ +------------------- 1 files changed, 46 insertions(+), 23 deletions(-)
diff --git a/builtin-add.c b/builtin-add.c index f9a6580..f180afe 100644 --- a/builtin-add.c +++ b/builtin-add.c @@ -13,10 +13,11 @@ #include "commit.h" #include "revision.h" +enum update_type {NONE, ALL, CURRENT_DIRECTORY}; + static const char builtin_add_usage[] = "git-add [-n] [-v] [-f] [--interactive | -i] [-u] [--refresh] [--] <filepattern>..."; -static int take_worktree_changes; static const char *excludes_file; static void prune_directory(struct dir_struct *dir, const char **pathspec, int prefix) @@ -83,40 +84,57 @@ static void fill_directory(struct dir_struct *dir, const char **pathspec, static void update_callback(struct diff_queue_struct *q, struct diff_options *opt, void *cbdata) { - int i, verbose; - - verbose = *((int *)cbdata); + int i; + + int* options = (int*)cbdata; + int verbose = options[0]; + int show_only = options[1]; + for (i = 0; i < q->nr; i++) { struct diff_filepair *p = q->queue[i]; const char *path = p->one->path; - switch (p->status) { - default: - die("unexpected diff status %c", p->status); - case DIFF_STATUS_UNMERGED: - case DIFF_STATUS_MODIFIED: - case DIFF_STATUS_TYPE_CHANGED: - add_file_to_cache(path, verbose); - break; - case DIFF_STATUS_DELETED: - remove_file_from_cache(path); - if (verbose) - printf("remove '%s'\n", path); - break; + + switch (p->status) { + case DIFF_STATUS_UNMERGED: + case DIFF_STATUS_MODIFIED: + case DIFF_STATUS_TYPE_CHANGED: + if (show_only) + printf("add '%s'\n", path); + else + add_file_to_cache(path, verbose); + break; + + case DIFF_STATUS_DELETED: + if (verbose) + printf("remove '%s'\n", path); + if (!show_only) + remove_file_from_cache(path); + break; + + default: + die("unexpected diff status %c", p->status); } } } -static void update(int verbose, const char *prefix, const char **files) +static void update(enum update_type type, int verbose, int show_only, + const char *prefix, const char **files) { struct rev_info rev; + int callback_options[] = {verbose, show_only}; + init_revisions(&rev, prefix); setup_revisions(0, NULL, &rev, NULL); - rev.prune_data = get_pathspec(prefix, files); + + rev.prune_data = type == ALL ? NULL : get_pathspec(prefix, files); + rev.diffopt.output_format = DIFF_FORMAT_CALLBACK; rev.diffopt.format_callback = update_callback; - rev.diffopt.format_callback_data = &verbose; + rev.diffopt.format_callback_data = callback_options; + if (read_cache() < 0) die("index file corrupt"); + run_diff_files(&rev, 0); } @@ -158,6 +176,7 @@ int cmd_add(int argc, const char **argv, const char *prefix) { int i, newfd; int verbose = 0, show_only = 0, ignored_too = 0, refresh_only = 0; + enum update_type update_type = NONE; const char **pathspec; struct dir_struct dir; int add_interactive = 0; @@ -201,8 +220,12 @@ int cmd_add(int argc, const char **argv, const char *prefix) verbose = 1; continue; } + if (!strcmp(arg, "-a")) { + update_type = ALL; + continue; + } if (!strcmp(arg, "-u")) { - take_worktree_changes = 1; + update_type = CURRENT_DIRECTORY; continue; } if (!strcmp(arg, "--refresh")) { @@ -212,8 +235,8 @@ int cmd_add(int argc, const char **argv, const char *prefix) usage(builtin_add_usage); } - if (take_worktree_changes) { - update(verbose, prefix, argv + i); + if (update_type) { + update(update_type, verbose, show_only, prefix, argv + i); goto finish; }
-- 1.5.3.4.206.g58ba4-dirty