Code

Merge branch 'jl/submodule-ignore-diff'
authorJunio C Hamano <gitster@pobox.com>
Sat, 4 Sep 2010 15:17:09 +0000 (08:17 -0700)
committerJunio C Hamano <gitster@pobox.com>
Sat, 4 Sep 2010 15:17:09 +0000 (08:17 -0700)
* jl/submodule-ignore-diff:
  checkout: Use submodule.*.ignore settings from .git/config and .gitmodules
  checkout: Add test for diff.ignoreSubmodules
  checkout: respect diff.ignoreSubmodules setting

Conflicts:
builtin/checkout.c

1  2 
Documentation/config.txt
builtin/checkout.c

diff --combined Documentation/config.txt
index 0510ac795c1d558b7f3a551ac5cc10ba1f1c8dff,01b7e0ae6c408ff03da177050d6ad3e3e0757af2..cda6721013ac3f01e7a3b6a7e770266852cef131
@@@ -128,7 -128,7 +128,7 @@@ advice.*:
                when writing commit messages. Default: true.
        commitBeforeMerge::
                Advice shown when linkgit:git-merge[1] refuses to
 -              merge to avoid overwritting local changes.
 +              merge to avoid overwriting local changes.
                Default: true.
        resolveConflict::
                Advices shown by various commands when conflicts
@@@ -418,7 -418,7 +418,7 @@@ Common unit suffixes of 'k', 'm', or 'g
  
  core.deltaBaseCacheLimit::
        Maximum number of bytes to reserve for caching base objects
 -      that multiple deltafied objects reference.  By storing the
 +      that may be referenced by multiple deltified objects.  By storing the
        entire decompressed base objects in a cache Git is able
        to avoid unpacking and decompressing frequently used base
        objects multiple times.
@@@ -563,7 -563,7 +563,7 @@@ not necessarily be the current director
  am.keepcr::
        If true, git-am will call git-mailsplit for patches in mbox format
        with parameter '--keep-cr'. In this case git-mailsplit will
 -      not remove `\r` from lines ending with `\r\n`. Can be overrriden
 +      not remove `\r` from lines ending with `\r\n`. Can be overridden
        by giving '--no-keep-cr' from the command line.
        See linkgit:git-am[1], linkgit:git-mailsplit[1].
  
@@@ -829,7 -829,8 +829,8 @@@ diff.renames:
  diff.ignoreSubmodules::
        Sets the default value of --ignore-submodules. Note that this
        affects only 'git diff' Porcelain, and not lower level 'diff'
-       commands such as 'git diff-files'.
+       commands such as 'git diff-files'. 'git checkout' also honors
+       this setting when reporting uncommitted changes.
  
  diff.suppressBlankEmpty::
        A boolean to inhibit the standard behavior of printing a space
@@@ -1007,7 -1008,7 +1008,7 @@@ gitcvs.usecrlfattr:
        If true, the server will look up the end-of-line conversion
        attributes for files to determine the '-k' modes to use. If
        the attributes force git to treat a file as text,
 -      the '-k' mode will be left blank so cvs clients will
 +      the '-k' mode will be left blank so CVS clients will
        treat it as text. If they suppress text conversion, the file
        will be set with '-kb' mode, which suppresses any newline munging
        the client might otherwise do. If the attributes do not allow
@@@ -1248,15 -1249,6 +1249,15 @@@ http.noEPSV:
        support EPSV mode. Can be overridden by the 'GIT_CURL_FTP_NO_EPSV'
        environment variable. Default is false (curl will use EPSV).
  
 +http.useragent::
 +      The HTTP USER_AGENT string presented to an HTTP server.  The default
 +      value represents the version of the client git such as git/1.7.1.
 +      This option allows you to override this value to a more common value
 +      such as Mozilla/4.0.  This may be necessary, for instance, if
 +      connecting through a firewall that restricts HTTP connections to a set
 +      of common USER_AGENT strings (but not including those like git/1.7.1).
 +      Can be overridden by the 'GIT_HTTP_USER_AGENT' environment variable.
 +
  i18n.commitEncoding::
        Character encoding the commit messages are stored in; git itself
        does not care per se, but this information is necessary e.g. when
@@@ -1289,9 -1281,7 +1290,9 @@@ instaweb.local:
        be bound to the local IP (127.0.0.1).
  
  instaweb.modulepath::
 -      The module path for an apache httpd used by linkgit:git-instaweb[1].
 +      The default module path for linkgit:git-instaweb[1] to use
 +      instead of /usr/lib/apache2/modules.  Only used if httpd
 +      is Apache.
  
  instaweb.port::
        The port number to bind the gitweb httpd to. See
@@@ -1305,11 -1295,10 +1306,11 @@@ interactive.singlekey:
        ignored if portable keystroke input is not available.
  
  log.date::
 -      Set default date-time mode for the log command. Setting log.date
 -      value is similar to using 'git log'\'s --date option. The value is one of the
 -      following alternatives: {relative,local,default,iso,rfc,short}.
 -      See linkgit:git-log[1].
 +      Set the default date-time mode for the 'log' command.
 +      Setting a value for log.date is similar to using 'git log''s
 +      `\--date` option.  Possible values are `relative`, `local`,
 +      `default`, `iso`, `rfc`, and `short`; see linkgit:git-log[1]
 +      for details.
  
  log.decorate::
        Print out the ref names of any commits that are shown by the log
@@@ -1550,9 -1539,6 +1551,9 @@@ rebase.stat:
        Whether to show a diffstat of what changed upstream since the last
        rebase. False by default.
  
 +rebase.autosquash::
 +      If set to true enable '--autosquash' option by default.
 +
  receive.autogc::
        By default, git-receive-pack will run "git-gc --auto" after
        receiving data from git-push and updating refs.  You can stop
@@@ -1578,10 -1564,6 +1579,10 @@@ receive.denyDeletes:
        If set to true, git-receive-pack will deny a ref update that deletes
        the ref. Use this to prevent such a ref deletion via a push.
  
 +receive.denyDeleteCurrent::
 +      If set to true, git-receive-pack will deny a ref update that
 +      deletes the currently checked out branch of a non-bare repository.
 +
  receive.denyCurrentBranch::
        If set to true or "refuse", git-receive-pack will deny a ref update
        to the currently checked out branch of a non-bare repository.
@@@ -1647,9 -1629,7 +1648,9 @@@ remote.<name>.tagopt:
        Setting this value to \--no-tags disables automatic tag following when
        fetching from remote <name>. Setting it to \--tags will fetch every
        tag from remote <name>, even if they are not reachable from remote
 -      branch heads.
 +      branch heads. Passing these flags directly to linkgit:git-fetch[1] can
 +      override this setting. See options \--tags and \--no-tags of
 +      linkgit:git-fetch[1].
  
  remote.<name>.vcs::
        Setting this to a value <vcs> will cause git to interact with
@@@ -1779,7 -1759,7 +1780,7 @@@ submodule.<name>.ignore:
        Using "none" (the default when this option is not set) also shows
        submodules that have untracked files in their work tree as changed.
        This setting overrides any setting made in .gitmodules for this submodule,
 -      both settings can be overriden on the command line by using the
 +      both settings can be overridden on the command line by using the
        "--ignore-submodules" option.
  
  tar.umask::
diff --combined builtin/checkout.c
index aae80c34cf79fa4fe04a03e48887d690db98047c,829442932f1711ecaea99180e7d3f6875f963832..560eae17159290c5adcefd2e2e2da5825ac6b75d
@@@ -18,6 -18,7 +18,7 @@@
  #include "xdiff-interface.h"
  #include "ll-merge.h"
  #include "resolve-undo.h"
+ #include "submodule.h"
  
  static const char * const checkout_usage[] = {
        "git checkout [options] <branch>",
@@@ -32,14 -33,11 +33,15 @@@ struct checkout_opts 
        int writeout_stage;
        int writeout_error;
  
 +      /* not set by parse_options */
 +      int branch_exists;
 +
        const char *new_branch;
 +      const char *new_branch_force;
        const char *new_orphan_branch;
        int new_branch_log;
        enum branch_track track;
+       struct diff_options diff_options;
  };
  
  static int post_checkout_hook(struct commit *old, struct commit *new,
@@@ -154,10 -152,6 +156,10 @@@ static int checkout_merged(int pos, str
        read_mmblob(&ours, active_cache[pos+1]->sha1);
        read_mmblob(&theirs, active_cache[pos+2]->sha1);
  
 +      /*
 +       * NEEDSWORK: re-create conflicts from merges with
 +       * merge.renormalize set, too
 +       */
        status = ll_merge(&result_buf, path, &ancestor, "base",
                          &ours, "ours", &theirs, "theirs", 0);
        free(ancestor.ptr);
@@@ -282,11 -276,13 +284,12 @@@ static int checkout_paths(struct tree *
        return errs;
  }
  
- static void show_local_changes(struct object *head)
+ static void show_local_changes(struct object *head, struct diff_options *opts)
  {
        struct rev_info rev;
        /* I think we want full paths, even if we're in a subdirectory. */
        init_revisions(&rev, NULL);
 -      rev.abbrev = 0;
+       rev.diffopt.flags = opts->flags;
        rev.diffopt.output_format |= DIFF_FORMAT_NAME_STATUS;
        if (diff_setup_done(&rev.diffopt) < 0)
                die("diff_setup_done failed");
@@@ -380,7 -376,7 +383,7 @@@ static int merge_working_tree(struct ch
                topts.src_index = &the_index;
                topts.dst_index = &the_index;
  
 -              topts.msgs.not_uptodate_file = "You have local changes to '%s'; cannot switch branches.";
 +              setup_unpack_trees_porcelain(&topts, "checkout");
  
                refresh_cache(REFRESH_QUIET);
  
                         */
  
                        add_files_to_cache(NULL, NULL, 0);
 +                      /*
 +                       * NEEDSWORK: carrying over local changes
 +                       * when branches have different end-of-line
 +                       * normalization (or clean+smudge rules) is
 +                       * a pain; plumb in an option to set
 +                       * o.renormalize?
 +                       */
                        init_merge_options(&o);
                        o.verbosity = 0;
                        work = write_tree_from_memory(&o);
                die("unable to write new index file");
  
        if (!opts->force && !opts->quiet)
-               show_local_changes(&new->commit->object);
+               show_local_changes(&new->commit->object, &opts->diff_options);
  
        return 0;
  }
@@@ -525,8 -514,7 +528,8 @@@ static void update_refs_for_switch(stru
                        }
                }
                else
 -                      create_branch(old->name, opts->new_branch, new->name, 0,
 +                      create_branch(old->name, opts->new_branch, new->name,
 +                                    opts->new_branch_force ? 1 : 0,
                                      opts->new_branch_log, opts->track);
                new->name = opts->new_branch;
                setup_branch_path(new);
                        if (old->path && !strcmp(new->path, old->path))
                                fprintf(stderr, "Already on '%s'\n",
                                        new->name);
 -                      else
 +                      else if (opts->new_branch)
                                fprintf(stderr, "Switched to%s branch '%s'\n",
 -                                      opts->new_branch ? " a new" : "",
 +                                      opts->branch_exists ? " and reset" : " a new",
 +                                      new->name);
 +                      else
 +                              fprintf(stderr, "Switched to branch '%s'\n",
                                        new->name);
                }
                if (old->path && old->name) {
@@@ -618,7 -603,16 +621,16 @@@ static int switch_branches(struct check
  
  static int git_checkout_config(const char *var, const char *value, void *cb)
  {
-       return git_xmerge_config(var, value, cb);
+       if (!strcmp(var, "diff.ignoresubmodules")) {
+               struct checkout_opts *opts = cb;
+               handle_ignore_submodules_arg(&opts->diff_options, value);
+               return 0;
+       }
+       if (!prefixcmp(var, "submodule."))
+               return parse_submodule_config_option(var, value);
+       return git_xmerge_config(var, value, NULL);
  }
  
  static int interactive_checkout(const char *revision, const char **pathspec,
@@@ -675,10 -669,7 +687,10 @@@ int cmd_checkout(int argc, const char *
        int dwim_new_local_branch = 1;
        struct option options[] = {
                OPT__QUIET(&opts.quiet),
 -              OPT_STRING('b', NULL, &opts.new_branch, "new branch", "branch"),
 +              OPT_STRING('b', NULL, &opts.new_branch, "branch",
 +                         "create and checkout a new branch"),
 +              OPT_STRING('B', NULL, &opts.new_branch_force, "branch",
 +                         "create/reset and checkout a branch"),
                OPT_BOOLEAN('l', NULL, &opts.new_branch_log, "log for new branch"),
                OPT_SET_INT('t', "track",  &opts.track, "track",
                        BRANCH_TRACK_EXPLICIT),
        memset(&opts, 0, sizeof(opts));
        memset(&new, 0, sizeof(new));
  
-       git_config(git_checkout_config, NULL);
+       gitmodules_config();
+       git_config(git_checkout_config, &opts);
  
        opts.track = BRANCH_TRACK_UNSPECIFIED;
  
        argc = parse_options(argc, argv, prefix, options, checkout_usage,
                             PARSE_OPT_KEEP_DASHDASH);
  
 +      /* we can assume from now on new_branch = !new_branch_force */
 +      if (opts.new_branch && opts.new_branch_force)
 +              die("-B cannot be used with -b");
 +
 +      /* copy -B over to -b, so that we can just check the latter */
 +      if (opts.new_branch_force)
 +              opts.new_branch = opts.new_branch_force;
 +
        if (patch_mode && (opts.track > 0 || opts.new_branch
                           || opts.new_branch_log || opts.merge || opts.force))
                die ("--patch is incompatible with all other options");
  
        if (opts.new_orphan_branch) {
                if (opts.new_branch)
 -                      die("--orphan and -b are mutually exclusive");
 +                      die("--orphan and -b|-B are mutually exclusive");
                if (opts.track > 0)
                        die("--orphan cannot be used with -t");
                opts.new_branch = opts.new_orphan_branch;
@@@ -887,12 -871,8 +900,12 @@@ no_reference
                if (strbuf_check_branch_ref(&buf, opts.new_branch))
                        die("git checkout: we do not like '%s' as a branch name.",
                            opts.new_branch);
 -              if (!get_sha1(buf.buf, rev))
 -                      die("git checkout: branch %s already exists", opts.new_branch);
 +              if (!get_sha1(buf.buf, rev)) {
 +                      opts.branch_exists = 1;
 +                      if (!opts.new_branch_force)
 +                              die("git checkout: branch %s already exists",
 +                                  opts.new_branch);
 +              }
                strbuf_release(&buf);
        }