Merge branch 'rj/add-chmod-error-message' into maint
authorJunio C Hamano <gitster@pobox.com>
Sun, 10 Sep 2017 08:03:00 +0000 (17:03 +0900)
committerJunio C Hamano <gitster@pobox.com>
Sun, 10 Sep 2017 08:03:00 +0000 (17:03 +0900)
Message fix.

* rj/add-chmod-error-message:
builtin/add: add detail to a 'cannot chmod' error message

1  2 
builtin/add.c
diff --combined builtin/add.c
index e888fb8c5f2a1fa2be33e834724460dec8072726,3979b34a708e55ef3ec57f339d207005ba736502..5d5773d5cd2fc9e713498a72da7b57b84fd25d19
@@@ -4,7 -4,6 +4,7 @@@
   * Copyright (C) 2006 Linus Torvalds
   */
  #include "cache.h"
 +#include "config.h"
  #include "builtin.h"
  #include "lockfile.h"
  #include "dir.h"
@@@ -18,7 -17,6 +18,7 @@@
  #include "revision.h"
  #include "bulk-checkin.h"
  #include "argv-array.h"
 +#include "submodule.h"
  
  static const char * const builtin_add_usage[] = {
        N_("git add [<options>] [--] <pathspec>..."),
@@@ -32,7 -30,7 +32,7 @@@ struct update_callback_data 
        int add_errors;
  };
  
- static void chmod_pathspec(struct pathspec *pathspec, int force_mode)
+ static void chmod_pathspec(struct pathspec *pathspec, char flip)
  {
        int i;
  
@@@ -42,8 -40,8 +42,8 @@@
                if (pathspec && !ce_path_match(ce, pathspec, NULL))
                        continue;
  
-               if (chmod_cache_entry(ce, force_mode) < 0)
-                       fprintf(stderr, "cannot chmod '%s'", ce->name);
+               if (chmod_cache_entry(ce, flip) < 0)
+                       fprintf(stderr, "cannot chmod %cx '%s'\n", flip, ce->name);
        }
  }
  
@@@ -137,7 -135,7 +137,7 @@@ static char *prune_directory(struct dir
                        *dst++ = entry;
        }
        dir->nr = dst - dir->entries;
 -      add_pathspec_matches_against_index(pathspec, seen);
 +      add_pathspec_matches_against_index(pathspec, &the_index, seen);
        return seen;
  }
  
@@@ -250,7 -248,6 +250,7 @@@ N_("The following paths are ignored by 
  
  static int verbose, show_only, ignored_too, refresh_only;
  static int ignore_add_errors, intent_to_add, ignore_missing;
 +static int warn_on_embedded_repo = 1;
  
  #define ADDREMOVE_DEFAULT 1
  static int addremove = ADDREMOVE_DEFAULT;
@@@ -284,8 -281,6 +284,8 @@@ static struct option builtin_add_option
        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_HIDDEN_BOOL(0, "warn-embedded-repo", &warn_on_embedded_repo,
 +                      N_("warn when adding an embedded repository")),
        OPT_END(),
  };
  
@@@ -299,45 -294,6 +299,45 @@@ static int add_config(const char *var, 
        return git_default_config(var, value, cb);
  }
  
 +static const char embedded_advice[] = N_(
 +"You've added another git repository inside your current repository.\n"
 +"Clones of the outer repository will not contain the contents of\n"
 +"the embedded repository and will not know how to obtain it.\n"
 +"If you meant to add a submodule, use:\n"
 +"\n"
 +"     git submodule add <url> %s\n"
 +"\n"
 +"If you added this path by mistake, you can remove it from the\n"
 +"index with:\n"
 +"\n"
 +"     git rm --cached %s\n"
 +"\n"
 +"See \"git help submodule\" for more information."
 +);
 +
 +static void check_embedded_repo(const char *path)
 +{
 +      struct strbuf name = STRBUF_INIT;
 +
 +      if (!warn_on_embedded_repo)
 +              return;
 +      if (!ends_with(path, "/"))
 +              return;
 +
 +      /* Drop trailing slash for aesthetics */
 +      strbuf_addstr(&name, path);
 +      strbuf_strip_suffix(&name, "/");
 +
 +      warning(_("adding embedded git repository: %s"), name.buf);
 +      if (advice_add_embedded_repo) {
 +              advise(embedded_advice, name.buf, name.buf);
 +              /* there may be multiple entries; advise only once */
 +              advice_add_embedded_repo = 0;
 +      }
 +
 +      strbuf_release(&name);
 +}
 +
  static int add_files(struct dir_struct *dir, int flags)
  {
        int i, exit_status = 0;
                exit_status = 1;
        }
  
 -      for (i = 0; i < dir->nr; i++)
 +      for (i = 0; i < dir->nr; i++) {
 +              check_embedded_repo(dir->entries[i]->name);
                if (add_file_to_index(&the_index, dir->entries[i]->name, flags)) {
                        if (!ignore_add_errors)
                                die(_("adding files failed"));
                        exit_status = 1;
                }
 +      }
        return exit_status;
  }
  
@@@ -407,7 -361,7 +407,7 @@@ int cmd_add(int argc, const char **argv
        add_new_files = !take_worktree_changes && !refresh_only;
        require_pathspec = !(take_worktree_changes || (0 < addremove_explicit));
  
 -      hold_locked_index(&lock_file, 1);
 +      hold_locked_index(&lock_file, LOCK_DIE_ON_ERROR);
  
        flags = ((verbose ? ADD_CACHE_VERBOSE : 0) |
                 (show_only ? ADD_CACHE_PRETEND : 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,
                       PATHSPEC_PREFER_FULL |
 -                     PATHSPEC_SYMLINK_LEADING_PATH |
 -                     PATHSPEC_STRIP_SUBMODULE_SLASH_EXPENSIVE,
 +                     PATHSPEC_SYMLINK_LEADING_PATH,
                       prefix, argv);
  
 +      die_path_inside_submodule(&the_index, &pathspec);
 +
        if (add_new_files) {
                int baselen;
  
                }
  
                /* This picks up the paths that are not tracked */
 -              baselen = fill_directory(&dir, &pathspec);
 +              baselen = fill_directory(&dir, &the_index, &pathspec);
                if (pathspec.nr)
                        seen = prune_directory(&dir, &pathspec, baselen);
        }
                int i;
  
                if (!seen)
 -                      seen = find_pathspecs_matching_against_index(&pathspec);
 +                      seen = find_pathspecs_matching_against_index(&pathspec, &the_index);
  
                /*
                 * file_exists() assumes exact match
                             !file_exists(path))) {
                                if (ignore_missing) {
                                        int dtype = DT_UNKNOWN;
 -                                      if (is_excluded(&dir, path, &dtype))
 -                                              dir_add_ignored(&dir, path, pathspec.items[i].len);
 +                                      if (is_excluded(&dir, &the_index, path, &dtype))
 +                                              dir_add_ignored(&dir, &the_index,
 +                                                              path, pathspec.items[i].len);
                                } else
                                        die(_("pathspec '%s' did not match any files"),
                                            pathspec.items[i].original);