Merge branch 'js/add-e-clear-patch-before-stating'
authorJunio C Hamano <gitster@pobox.com>
Tue, 29 Jan 2019 20:47:56 +0000 (12:47 -0800)
committerJunio C Hamano <gitster@pobox.com>
Tue, 29 Jan 2019 20:47:56 +0000 (12:47 -0800)
"git add -e" got confused when the change it wants to let the user
edit is smaller than the previous change that was left over in a
temporary file.

* js/add-e-clear-patch-before-stating:
add --edit: truncate the patch file

1  2 
builtin/add.c
diff --combined builtin/add.c
index 12247b48fd42d4a4b6955ff997fdf51a8785f9ae,160a4944fc088f04a644e6fe450132f13ac72e08..d461ba08b9b2663b4cadd9a1cb756523ffe8eb1f
@@@ -40,7 -40,7 +40,7 @@@ static void chmod_pathspec(struct paths
        for (i = 0; i < active_nr; i++) {
                struct cache_entry *ce = active_cache[i];
  
 -              if (pathspec && !ce_path_match(ce, pathspec, NULL))
 +              if (pathspec && !ce_path_match(&the_index, ce, pathspec, NULL))
                        continue;
  
                if (chmod_cache_entry(ce, flip) < 0)
@@@ -110,7 -110,7 +110,7 @@@ int add_files_to_cache(const char *pref
        memset(&data, 0, sizeof(data));
        data.flags = flags;
  
 -      init_revisions(&rev, prefix);
 +      repo_init_revisions(the_repository, &rev, prefix);
        setup_revisions(0, NULL, &rev, NULL);
        if (pathspec)
                copy_pathspec(&rev.prune_data, pathspec);
@@@ -135,7 -135,7 +135,7 @@@ static int renormalize_tracked_files(co
                        continue; /* do not touch unmerged paths */
                if (!S_ISREG(ce->ce_mode) && !S_ISLNK(ce->ce_mode))
                        continue; /* do not touch non blobs */
 -              if (pathspec && !ce_path_match(ce, pathspec, NULL))
 +              if (pathspec && !ce_path_match(&the_index, ce, pathspec, NULL))
                        continue;
                retval |= add_file_to_cache(ce->name, flags | HASH_RENORMALIZE);
        }
@@@ -155,7 -155,7 +155,7 @@@ static char *prune_directory(struct dir
        i = dir->nr;
        while (--i >= 0) {
                struct dir_entry *entry = *src++;
 -              if (dir_path_match(entry, pathspec, prefix, seen))
 +              if (dir_path_match(&the_index, entry, pathspec, prefix, seen))
                        *dst++ = entry;
        }
        dir->nr = dst - dir->entries;
@@@ -176,7 -176,7 +176,7 @@@ static void refresh(int verbose, const 
                        die(_("pathspec '%s' did not match any files"),
                            pathspec->items[i].match);
        }
 -        free(seen);
 +      free(seen);
  }
  
  int run_add_interactive(const char *revision, const char *patch_mode,
@@@ -232,14 -232,14 +232,14 @@@ static int edit_patch(int argc, const c
        if (read_cache() < 0)
                die(_("Could not read the index"));
  
 -      init_revisions(&rev, prefix);
 +      repo_init_revisions(the_repository, &rev, prefix);
        rev.diffopt.context = 7;
  
        argc = setup_revisions(argc, argv, &rev, NULL);
        rev.diffopt.output_format = DIFF_FORMAT_PATCH;
        rev.diffopt.use_color = 0;
        rev.diffopt.flags.ignore_dirty_submodules = 1;
-       out = open(file, O_CREAT | O_WRONLY, 0666);
+       out = open(file, O_CREAT | O_WRONLY | O_TRUNC, 0666);
        if (out < 0)
                die(_("Could not open '%s' for writing."), file);
        rev.diffopt.file = xfdopen(out, "w");
@@@ -304,8 -304,7 +304,8 @@@ static struct option builtin_add_option
        OPT_BOOL( 0 , "refresh", &refresh_only, N_("don't add, only refresh the index")),
        OPT_BOOL( 0 , "ignore-errors", &ignore_add_errors, N_("just skip files which cannot be added because of errors")),
        OPT_BOOL( 0 , "ignore-missing", &ignore_missing, N_("check if - even missing - files are ignored in dry run")),
 -      OPT_STRING( 0 , "chmod", &chmod_arg, N_("(+/-)x"), N_("override the executable bit of the listed files")),
 +      OPT_STRING(0, "chmod", &chmod_arg, "(+|-)x",
 +                 N_("override the executable bit of the listed files")),
        OPT_HIDDEN_BOOL(0, "warn-embedded-repo", &warn_on_embedded_repo,
                        N_("warn when adding an embedded repository")),
        OPT_END(),
@@@ -445,19 -444,20 +445,19 @@@ int cmd_add(int argc, const char **argv
                return 0;
        }
  
 -      if (read_cache() < 0)
 -              die(_("index file corrupt"));
 -
 -      die_in_unpopulated_submodule(&the_index, prefix);
 -
        /*
         * Check the "pathspec '%s' did not match any files" block
         * below before enabling new magic.
         */
 -      parse_pathspec(&pathspec, 0,
 +      parse_pathspec(&pathspec, PATHSPEC_ATTR,
                       PATHSPEC_PREFER_FULL |
                       PATHSPEC_SYMLINK_LEADING_PATH,
                       prefix, argv);
  
 +      if (read_cache_preload(&pathspec) < 0)
 +              die(_("index file corrupt"));
 +
 +      die_in_unpopulated_submodule(&the_index, prefix);
        die_path_inside_submodule(&the_index, &pathspec);
  
        if (add_new_files) {