Skip to content

Commit

Permalink
Merge branch 'jc/add-2.0-ignore-removal'
Browse files Browse the repository at this point in the history
"git add <pathspec>" is the same as "git add -A <pathspec>" now,
i.e. it does not ignore removals from the directory specified.
  • Loading branch information
gitster committed Mar 7, 2014
2 parents 053a6b1 + fdc97ab commit 160c4b1
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 64 deletions.
18 changes: 11 additions & 7 deletions Documentation/git-add.txt
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,14 @@ OPTIONS
Files to add content from. Fileglobs (e.g. `*.c`) can
be given to add all matching files. Also a
leading directory name (e.g. `dir` to add `dir/file1`
and `dir/file2`) can be given to add all files in the
directory, recursively.
and `dir/file2`) can be given to update the index to
match the current state of the directory as a whole (e.g.
specifying `dir` will record not just a file `dir/file1`
modified in the working tree, a file `dir/file2` added to
the working tree, but also a file `dir/file3` removed from
the working tree. Note that older versions of Git used
to ignore removed files; use `--no-all` option if you want
to add modified or new files but ignore removed ones.

-n::
--dry-run::
Expand Down Expand Up @@ -129,11 +135,9 @@ subdirectories).
files that have been removed from the working tree. This
option is a no-op when no <pathspec> is used.
+
This option is primarily to help the current users of Git, whose
"git add <pathspec>..." ignores removed files. In future versions
of Git, "git add <pathspec>..." will be a synonym to "git add -A
<pathspec>..." and "git add --ignore-removal <pathspec>..." will behave like
today's "git add <pathspec>...", ignoring removed files.
This option is primarily to help users who are used to older
versions of Git, whose "git add <pathspec>..." was a synonym
for "git add --no-all <pathspec>...", i.e. ignored removed files.

-N::
--intent-to-add::
Expand Down
69 changes: 12 additions & 57 deletions builtin/add.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,6 @@ static int take_worktree_changes;
struct update_callback_data {
int flags;
int add_errors;
/* only needed for 2.0 transition preparation */
int warn_add_would_remove;
};

static int fix_unmerged_status(struct diff_filepair *p,
Expand All @@ -51,24 +49,6 @@ static int fix_unmerged_status(struct diff_filepair *p,
return DIFF_STATUS_MODIFIED;
}

static const char *add_would_remove_warning = N_(
"You ran 'git add' with neither '-A (--all)' or '--ignore-removal',\n"
"whose behaviour will change in Git 2.0 with respect to paths you removed.\n"
"Paths like '%s' that are\n"
"removed from your working tree are ignored with this version of Git.\n"
"\n"
"* 'git add --ignore-removal <pathspec>', which is the current default,\n"
" ignores paths you removed from your working tree.\n"
"\n"
"* 'git add --all <pathspec>' will let you also record the removals.\n"
"\n"
"Run 'git status' to check the paths you removed from your working tree.\n");

static void warn_add_would_remove(const char *path)
{
warning(_(add_would_remove_warning), path);
}

static void update_callback(struct diff_queue_struct *q,
struct diff_options *opt, void *cbdata)
{
Expand All @@ -90,10 +70,6 @@ static void update_callback(struct diff_queue_struct *q,
}
break;
case DIFF_STATUS_DELETED:
if (data->warn_add_would_remove) {
warn_add_would_remove(path);
data->warn_add_would_remove = 0;
}
if (data->flags & ADD_CACHE_IGNORE_REMOVAL)
break;
if (!(data->flags & ADD_CACHE_PRETEND))
Expand All @@ -105,31 +81,24 @@ static void update_callback(struct diff_queue_struct *q,
}
}

static void update_files_in_cache(const char *prefix,
const struct pathspec *pathspec,
struct update_callback_data *data)
int add_files_to_cache(const char *prefix,
const struct pathspec *pathspec, int flags)
{
struct update_callback_data data;
struct rev_info rev;

memset(&data, 0, sizeof(data));
data.flags = flags;

init_revisions(&rev, prefix);
setup_revisions(0, NULL, &rev, NULL);
if (pathspec)
copy_pathspec(&rev.prune_data, pathspec);
rev.diffopt.output_format = DIFF_FORMAT_CALLBACK;
rev.diffopt.format_callback = update_callback;
rev.diffopt.format_callback_data = data;
rev.diffopt.format_callback_data = &data;
rev.max_count = 0; /* do not compare unmerged paths with stage #2 */
run_diff_files(&rev, DIFF_RACY_IS_MODIFIED);
}

int add_files_to_cache(const char *prefix,
const struct pathspec *pathspec, int flags)
{
struct update_callback_data data;

memset(&data, 0, sizeof(data));
data.flags = flags;
update_files_in_cache(prefix, pathspec, &data);
return !!data.add_errors;
}

Expand Down Expand Up @@ -265,7 +234,7 @@ N_("The following paths are ignored by one of your .gitignore files:\n");
static int verbose, show_only, ignored_too, refresh_only;
static int ignore_add_errors, intent_to_add, ignore_missing;

#define ADDREMOVE_DEFAULT 0 /* Change to 1 in Git 2.0 */
#define ADDREMOVE_DEFAULT 1
static int addremove = ADDREMOVE_DEFAULT;
static int addremove_explicit = -1; /* unspecified */

Expand Down Expand Up @@ -338,7 +307,6 @@ int cmd_add(int argc, const char **argv, const char *prefix)
int add_new_files;
int require_pathspec;
char *seen = NULL;
struct update_callback_data update_data;

git_config(add_config, NULL);

Expand All @@ -362,25 +330,14 @@ int cmd_add(int argc, const char **argv, const char *prefix)
if (addremove && take_worktree_changes)
die(_("-A and -u are mutually incompatible"));

/*
* Warn when "git add pathspec..." was given without "-u" or "-A"
* and pathspec... covers a removed path.
*/
memset(&update_data, 0, sizeof(update_data));
if (!take_worktree_changes && addremove_explicit < 0)
update_data.warn_add_would_remove = 1;

if (!take_worktree_changes && addremove_explicit < 0 && argc)
/*
* Turn "git add pathspec..." to "git add -A pathspec..."
* in Git 2.0 but not yet
*/
; /* addremove = 1; */
/* Turn "git add pathspec..." to "git add -A pathspec..." */
addremove = 1;

if (!show_only && ignore_missing)
die(_("Option --ignore-missing can only be used together with --dry-run"));

if ((addremove || take_worktree_changes) && !argc) {
if ((0 < addremove_explicit || take_worktree_changes) && !argc) {
static const char *whole[2] = { ":/", NULL };
argc = 1;
argv = whole;
Expand Down Expand Up @@ -478,10 +435,8 @@ int cmd_add(int argc, const char **argv, const char *prefix)

plug_bulk_checkin();

update_data.flags = flags;
update_files_in_cache(prefix, &pathspec, &update_data);
exit_status |= add_files_to_cache(prefix, &pathspec, flags);

exit_status |= !!update_data.add_errors;
if (add_new_files)
exit_status |= add_files(&dir, flags);

Expand Down

0 comments on commit 160c4b1

Please sign in to comment.