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
From acc846f5243d26a96aaf0bf1c4f04ecc021385a2 Mon Sep 17 00:00:00 2001
From: Michael Witten <mfwitten@xxxxxxx>
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@xxxxxxx>
---
builtin-add.c | 69 +++++++++++++++++++++++++++++++++++++
+-------------------
1 files changed, 46 insertions(+), 23 deletions(-)
diff --git a/builtin-add.c b/builtin-add.c
index f9a6580..24887c7 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 (show_only)
+ remove_file_from_cache(path);
+ if (verbose)
+ printf("remove '%s'\n", 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
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html