1. 26 9月, 2016 2 次提交
  2. 14 9月, 2016 16 次提交
    • J
      t1007: factor out repeated setup · 4d0efa10
      Jeff King 提交于
      We have a series of 3 CRLF tests that do exactly the same
      (long) setup sequence. Let's pull it out into a common setup
      test, which is shorter, more efficient, and will make it
      easier to add new tests.
      
      Note that we don't have to worry about cleaning up any of
      the setup which was previously per-test; we call pop_repo
      after the CRLF tests, which cleans up everything.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      4d0efa10
    • J
      init: reset cached config when entering new repo · 4543926b
      Jeff King 提交于
      After we copy the templates into place, we re-read the
      config in case we copied in a default config file. But since
      git_config() is backed by a cache these days, it's possible
      that the call will not actually touch the filesystem at all;
      we need to tell it that something has changed behind the
      scenes.
      
      Note that we also need to reset the shared_repository
      config. At first glance, it seems like this should probably
      just be folded into git_config_clear(). But unfortunately
      that is not quite right. The shared repository value may
      come from config, _or_ it may have been set manually. So
      only the caller who knows whether or not they set it is the
      one who can clear it (and indeed, if you _do_ put it into
      git_config_clear(), then many tests fail, as we have to
      clear the config cache any time we set a new config
      variable).
      
      There are three tests here. The first two actually pass
      already, though it's largely luck: they just don't happen to
      actually read any config before we enter the new repo.
      
      But the third one does fail without this patch; we look at
      core.sharedrepository while creating the directory, but need
      to make sure the value from the template config overrides
      it.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      4543926b
    • J
      init: expand comments explaining config trickery · 7c0a842b
      Jeff King 提交于
      git-init may copy "config" from the templates directory and
      then re-read it. There are some comments explaining what's
      going on here, but they are not grouped very well with the
      matching code. Let's rearrange and expand them.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      7c0a842b
    • J
      config: only read .git/config from configured repos · b9605bc4
      Jeff King 提交于
      When git_config() runs, it looks in the system, user-wide,
      and repo-level config files. It gets the latter by calling
      git_pathdup(), which in turn calls get_git_dir(). If we
      haven't set up the git repository yet, this may simply
      return ".git", and we will look at ".git/config".  This
      seems like it would be helpful (presumably we haven't set up
      the repository yet, so it tries to find it), but it turns
      out to be a bad idea for a few reasons:
      
        - it's not sufficient, and therefore hides bugs in a
          confusing way. Config will be respected if commands are
          run from the top-level of the working tree, but not from
          a subdirectory.
      
        - it's not always true that we haven't set up the
          repository _yet_; we may not want to do it at all. For
          instance, if you run "git init /some/path" from inside
          another repository, it should not load config from the
          existing repository.
      
        - there might be a path ".git/config", but it is not the
          actual repository we would find via setup_git_directory().
          This may happen, e.g., if you are storing a git
          repository inside another git repository, but have
          munged one of the files in such a way that the
          inner repository is not valid (e.g., by removing HEAD).
      
      We have at least two bugs of the second type in git-init,
      introduced by ae5f6776 (lazily load core.sharedrepository,
      2016-03-11). It causes init to use git_configset(), which
      loads all of the config, including values from the current
      repo (if any).  This shows up in two ways:
      
        1. If we happen to be in an existing repository directory,
           we'll read and respect core.sharedrepository from it,
           even though it should have no bearing on the new
           repository. A new test in t1301 covers this.
      
        2. Similarly, if we're in an existing repo that sets
           core.logallrefupdates, that will cause init to fail to
           set it in a newly created repository (because it thinks
           that the user's templates already did so). A new test
           in t0001 covers this.
      
      We also need to adjust an existing test in t1302, which
      gives another example of why this patch is an improvement.
      
      That test creates an embedded repository with a bogus
      core.repositoryformatversion of "99". It wants to make sure
      that we actually stop at the bogus repo rather than
      continuing upward to find the outer repo. So it checks that
      "git config core.repositoryformatversion" returns 99. But
      that only works because we blindly read ".git/config", even
      though we _know_ we're in a repository whose vintage we do
      not understand.
      
      After this patch, we avoid reading config from the unknown
      vintage repository at all, which is a safer choice.  But we
      need to tweak the test, since core.repositoryformatversion
      will not return 99; it will claim that it could not find the
      variable at all.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      b9605bc4
    • J
      test-config: setup git directory · 25a6c280
      Jeff King 提交于
      The t1308 test script uses our test-config helper to read
      repository-level config, but never actually sets up the
      repository. This works because git_config() blindly reads
      ".git/config" even if we have not configured a repository.
      
      This means that test-config won't work from a subdirectory,
      though since it's just a helper for the test scripts, that's
      not a big deal.
      
      More important is that the behavior of git_config() is going
      to change, and we want to make sure that t1308 continues to
      work. We can just use setup_git_directory(), and not the
      gentle form; there's no point in being flexible, as it's
      just a helper for the tests.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      25a6c280
    • J
      t1302: use "git -C" · 11ca4bec
      Jeff King 提交于
      This is shorter, and saves a subshell.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      11ca4bec
    • J
      pager: handle early config · eed27072
      Jeff King 提交于
      The pager code is often run early in the git.c startup,
      before we have actually found the repository. When we ask
      git_config() to look for values like core.pager, it doesn't
      know where to find the repo-level config, and will blindly
      examine ".git/config" if it exists. That's why t7006 shows
      that many pager-related features happen to work from the
      top-level of a repository, but not from a subdirectory.
      
      This patch pulls that ".git/config" hack explicitly into the
      pager code. There are two reasons for this:
      
        1. We'd like to clean up the git_config() behavior, as
           looking at ".git/config" when we do not have a
           configured repository is often the wrong thing to do.
           But we'd prefer not to break the pager config any worse
           than it already is.
      
        2. It's one very tiny step on the road to ultimately
           making the pager config work consistently. If we
           eventually get an equivalent of setup_git_directory()
           that _just_ finds the directory and doesn't chdir() or
           set up any global state, we could plug it in here
           (instead of blindly looking at ".git/config").
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      eed27072
    • J
      pager: use callbacks instead of configset · 6a1e1bc0
      Jeff King 提交于
      While the cached configset interface is more pleasant to
      use, it is not appropriate for "early" config like pager
      setup, which must sometimes do tricky things like reading
      from ".git/config" even when we have not set up the
      repository.
      
      As a preparatory step to handling these cases better, let's
      switch back to using the callback interface, which gives us
      more control.
      
      Note that this is essentially a revert of 586f414a (pager.c:
      replace `git_config()` with `git_config_get_value()`,
      2014-08-07), but with some minor style fixups and
      modernizations.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      6a1e1bc0
    • J
      pager: make pager_program a file-local static · c0c08897
      Jeff King 提交于
      This variable is only ever used by the routines in pager.c,
      and other parts of the code should always use those routines
      (like git_pager()) to make decisions about which pager to
      use. Let's reduce its scope to prevent accidents.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      c0c08897
    • J
      pager: stop loading git_default_config() · 4babb839
      Jeff King 提交于
      In git_pager(), we really only care about getting the value
      of core.pager. But to do so, we use the git_default_config()
      callback, which loads many other values. Ordinarily it
      isn't a big deal to load this config an extra time, as it
      simply overwrites the values from the previous run. But it's
      a bad idea here, for two reasons:
      
        1. The pager setup may be called very early in the
           program, before we have found the git repository. As a
           result, we may fail to read the correct repo-level
           config file.  This is a problem for core.pager, too,
           but we should at least try to minimize the pollution to
           other configured values.
      
        2. Because we call setup_pager() from git.c, basically
           every builtin command _may_ end up reading this config
           and getting an implicit git_default_config() setup.
      
           Which doesn't sound like a terrible thing, except that
           we don't do it consistently; it triggers only when
           stdout is a tty. So if a command forgets to load the
           default config itself (but depends on it anyway), it
           may appear to work, and then mysteriously fail when the
           pager is not in use.
      
      We can improve this by loading _just_ the core.pager config
      from git_pager().
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      4babb839
    • J
      pager: remove obsolete comment · 01e7e903
      Jeff King 提交于
      The comment at the top of pager.c claims that we've split
      the code out so that Windows can do something different.
      This dates back to f67b45f8 (Introduce trivial new pager.c
      helper infrastructure, 2006-02-28), because the original
      implementation used fork(). Later, we ended up sticking the
      Windows #ifdefs into this file anyway. And then even later,
      in ea27a18c (spawn pager via run_command interface,
      2008-07-22) we unified the implementations.
      
      So these days this comment is really saying nothing at all.
      Let's drop it.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      01e7e903
    • J
      diff: always try to set up the repository · 28a4e580
      Jeff King 提交于
      If we see an explicit "--no-index", we do not bother calling
      setup_git_directory_gently() at all. This means that we may
      miss out on reading repo-specific config.
      
      It's arguable whether this is correct or not. If we were
      designing from scratch, making "git diff --no-index"
      completely ignore the repository makes some sense. But we
      are nowhere near scratch, so let's look at the existing
      behavior:
      
        1. If you're in the top-level of a repository and run an
           explicit "diff --no-index", the config subsystem falls
           back to reading ".git/config", and we will respect repo
           config.
      
        2. If you're in a subdirectory of a repository, then we
           still try to read ".git/config", but it generally
           doesn't exist. So "diff --no-index" there does not
           respect repo config.
      
        3. If you have $GIT_DIR set in the environment, we read
           and respect $GIT_DIR/config,
      
        4. If you run "git diff /tmp/foo /tmp/bar" to get an
           implicit no-index, we _do_ run the repository setup,
           and set $GIT_DIR (or respect an existing $GIT_DIR
           variable). We find the repo config no matter where we
           started, and respect it.
      
      So we already respect the repository config in a number of
      common cases, and case (2) is the only one that does not.
      And at least one of our tests, t4034, depends on case (1)
      behaving as it does now (though it is just incidental, not
      an explicit test for this behavior).
      
      So let's bring case (2) in line with the others by always
      running the repository setup, even with an explicit
      "--no-index". We shouldn't need to change anything else, as the
      implicit case already handles the prefix.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      28a4e580
    • J
      diff: handle --no-index prefixes consistently · 7d8930d9
      Jeff King 提交于
      If we see an explicit "git diff --no-index ../foo ../bar",
      then we do not set up the git repository at all (we already
      know we are in --no-index mode, so do not have to check "are
      we in a repository?"), and hence have no "prefix" within the
      repository. A patch generated by this command will have the
      filenames "a/../foo" and "b/../bar", no matter which
      directory we are in with respect to any repository.
      
      However, in the implicit case, where we notice that the
      files are outside the repository, we will have chdir()'d to
      the top-level of the repository. We then feed the prefix
      back to the diff machinery. As a result, running the same
      diff from a subdirectory will result in paths that look like
      "a/subdir/../../foo".
      
      Besides being unnecessarily long, this may also be confusing
      to the user: they don't care about the subdir or the
      repository at all; it's just where they happened to be when
      running the command. We should treat this the same as the
      explicit --no-index case.
      
      One way to address this would be to chdir() back to the
      original path before running our diff. However, that's a bit
      hacky, as we would also need to adjust $GIT_DIR, which could
      be a relative path from our top-level.
      
      Instead, we can reuse the diff machinery's RELATIVE_NAME
      option, which automatically strips off the prefix. Note that
      this _also_ restricts the diff to this relative prefix, but
      that's OK for our purposes: we queue our own diff pairs
      manually, and do not rely on that part of the diff code.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      7d8930d9
    • J
      diff: skip implicit no-index check when given --no-index · 475b362c
      Jeff King 提交于
      We can invoke no-index mode in two ways: by an explicit
      request from the user, or implicitly by noticing that we
      have two paths, and at least one is outside the repository.
      
      If the user already told us --no-index, there is no need for
      us to do the implicit test at all.  However, we currently
      do, and downgrade our "explicit" to DIFF_NO_INDEX_IMPLICIT.
      
      This doesn't have any user-visible behavior, though it's not
      immediately obvious why. We only trigger the implicit check
      when we have exactly two non-option arguments. And the only
      code that cares about implicit versus explicit is an error
      message that we show when we _don't_ have two non-option
      arguments.
      
      However, it's worth fixing anyway. Besides being slightly
      more efficient, it makes the code easier to follow, which
      will help when we modify it in future patches.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      475b362c
    • J
      patch-id: use RUN_SETUP_GENTLY · 4a73aaaf
      Jeff King 提交于
      Patch-id does not require a repository because it is just
      processing the incoming diff on stdin, but it may look at
      git config for keys like patchid.stable.
      
      Even though we do not setup_git_directory(), this works from
      the top-level of a repository because we blindly look at
      ".git/config" in this case. But as the included test
      demonstrates, it does not work from a subdirectory.
      
      We can fix it by using RUN_SETUP_GENTLY. We do not take any
      filenames from the user on the command line, so there's no
      need to adjust them via prefix_filename().
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      4a73aaaf
    • J
      hash-object: always try to set up the git repository · 0e94ee94
      Jeff King 提交于
      When "hash-object" is run without "-w", we don't need to be
      in a git repository at all; we can just hash the object and
      write its sha1 to stdout. However, if we _are_ in a git
      repository, we would want to know that so we can follow the
      normal rules for respecting config, .gitattributes, etc.
      
      This happens to work at the top-level of a git repository
      because we blindly read ".git/config", but as the included
      test shows, it does not work when you are in a subdirectory.
      
      The solution is to just do a "gentle" setup in this case. We
      already take care to use prefix_filename() on any filename
      arguments we get (to handle the "-w" case), so we don't need
      to do anything extra to handle the side effects of repo
      setup.
      
      An alternative would be to specify RUN_SETUP_GENTLY for this
      command in git.c, and then die if "-w" is set but we are not
      in a repository. However, the error messages generated at
      the time of setup_git_directory() are more detailed, so it's
      better to find out which mode we are in, and then call the
      appropriate function.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      0e94ee94
  3. 07 6月, 2016 5 次提交
    • J
      Git 2.8.4 · 0b65a8db
      Junio C Hamano 提交于
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      0b65a8db
    • J
      Merge branch 'kb/msys2-tty' into maint · 1676827c
      Junio C Hamano 提交于
      The "are we talking with TTY, doing an interactive session?"
      detection has been updated to work better for "Git for Windows".
      
      * kb/msys2-tty:
        mingw: make isatty() recognize MSYS2's pseudo terminals (/dev/pty*)
      1676827c
    • J
      Merge branch 'da/difftool' into maint · 389c3289
      Junio C Hamano 提交于
      "git difftool" learned to handle unmerged paths correctly in
      dir-diff mode.
      
      * da/difftool:
        difftool: handle unmerged files in dir-diff mode
        difftool: initialize variables for readability
      389c3289
    • J
      Merge branch 'tb/core-eol-fix' into maint · 7dcbf891
      Junio C Hamano 提交于
      A couple of bugs around core.autocrlf have been fixed.
      
      * tb/core-eol-fix:
        convert.c: ident + core.autocrlf didn't work
        t0027: test cases for combined attributes
        convert: allow core.autocrlf=input and core.eol=crlf
        t0027: make commit_chk_wrnNNO() reliable
      7dcbf891
    • J
      Merge branch 'ar/diff-args-osx-precompose' into maint · 05781d37
      Junio C Hamano 提交于
      Many commands normalize command line arguments from NFD to NFC
      variant of UTF-8 on OSX, but commands in the "diff" family did
      not, causing "git diff $path" to complain that no such path is
      known to Git.  They have been taught to do the normalization.
      
      * ar/diff-args-osx-precompose:
        diff: run arguments through precompose_argv
      05781d37
  4. 01 6月, 2016 5 次提交
    • J
      More topics for 2.8.4 · 4b0891ff
      Junio C Hamano 提交于
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      4b0891ff
    • J
      Merge branch 'sb/submodule-deinit-all' into maint · 3296e1a9
      Junio C Hamano 提交于
      Correct faulty recommendation to use "git submodule deinit ." when
      de-initialising all submodules, which would result in a strange
      error message in a pathological corner case.
      
      * sb/submodule-deinit-all:
        submodule deinit: require '--all' instead of '.' for all submodules
      3296e1a9
    • J
      Merge branch 'bn/http-cookiefile-config' into maint · e646a82c
      Junio C Hamano 提交于
      "http.cookieFile" configuration variable clearly wants a pathname,
      but we forgot to treat it as such by e.g. applying tilde expansion.
      
      * bn/http-cookiefile-config:
        http: expand http.cookieFile as a path
        Documentation: config: improve word ordering for http.cookieFile
      e646a82c
    • J
      Merge branch 'jk/test-send-sh-x-trace-elsewhere' into maint · 68a6e976
      Junio C Hamano 提交于
      Running tests with '-x' option to trace the individual command
      executions is a useful way to debug test scripts, but some tests
      that capture the standard error stream and check what the command
      said can be broken with the trace output mixed in.  When running
      our tests under "bash", however, we can redirect the trace output
      to another file descriptor to keep the standard error of programs
      being tested intact.
      
      * jk/test-send-sh-x-trace-elsewhere:
        test-lib: set BASH_XTRACEFD automatically
      68a6e976
    • J
      Merge branch 'js/name-rev-use-oldest-ref' into maint · 9ee8f940
      Junio C Hamano 提交于
      "git describe --contains" often made a hard-to-justify choice of
      tag to give name to a given commit, because it tried to come up
      with a name with smallest number of hops from a tag, causing an old
      commit whose close descendant that is recently tagged were not
      described with respect to an old tag but with a newer tag.  It did
      not help that its computation of "hop" count was further tweaked to
      penalize being on a side branch of a merge.  The logic has been
      updated to favor using the tag with the oldest tagger date, which
      is a lot easier to explain to the end users: "We describe a commit
      in terms of the (chronologically) oldest tag that contains the
      commit."
      
      * js/name-rev-use-oldest-ref:
        name-rev: include taggerdate in considering the best name
      9ee8f940
  5. 27 5月, 2016 12 次提交