1. 11 10月, 2016 6 次提交
    • J
      tmp-objdir: put quarantine information in the environment · e34c2e01
      Jeff King 提交于
      The presence of the GIT_QUARANTINE_PATH variable lets any
      called programs know that they're operating in a temporary
      object directory (and where that directory is).
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      e34c2e01
    • J
      alternates: store scratch buffer as strbuf · 38dbe5f0
      Jeff King 提交于
      We pre-size the scratch buffer to hold a loose object
      filename of the form "xx/yyyy...", which leads to allocation
      code that is hard to verify. We have to use some magic
      numbers during the initial allocation, and then writers must
      blindly assume that the buffer is big enough. Using a strbuf
      makes it more clear that we cannot overflow.
      
      Unfortunately, we do still need some magic numbers to grow
      our strbuf before calling fill_sha1_path(), but the strbuf
      growth is much closer to the point of use. This makes it
      easier to see that it's correct, and opens the possibility
      of pushing it even further down if fill_sha1_path() learns
      to work on strbufs.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      38dbe5f0
    • J
      alternates: use a separate scratch space · 597f9134
      Jeff King 提交于
      The alternate_object_database struct uses a single buffer
      both for storing the path to the alternate, and as a scratch
      buffer for forming object names. This is efficient (since
      otherwise we'd end up storing the path twice), but it makes
      life hard for callers who just want to know the path to the
      alternate. They have to remember to stop reading after
      "alt->name - alt->base" bytes, and to subtract one for the
      trailing '/'.
      
      It would be much simpler if they could simply access a
      NUL-terminated path string. We could encapsulate this in a
      function which puts a NUL in the scratch buffer and returns
      the string, but that opens up questions about the lifetime
      of the result. The first time another caller uses the
      alternate, the scratch buffer may get other data tacked onto
      it.
      
      Let's instead just store the root path separately from the
      scratch buffer. There aren't enough alternates being stored
      for the duplicated data to matter for performance, and this
      keeps things simple and safe for the callers.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      597f9134
    • J
      alternates: provide helper for allocating alternate · 7f0fa2c0
      Jeff King 提交于
      Allocating a struct alternate_object_database is tricky, as
      we must over-allocate the buffer to provide scratch space,
      and then put in particular '/' and NUL markers.
      
      Let's encapsulate this in a function so that the complexity
      doesn't leak into callers (and so that we can modify it
      later).
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      7f0fa2c0
    • J
      alternates: provide helper for adding to alternates list · a5b34d21
      Jeff King 提交于
      The submodule code wants to temporarily add an alternate
      object store to our in-memory alt_odb list, but does it
      manually. Let's provide a helper so it can reuse the code in
      link_alt_odb_entry().
      
      While we're adding our new add_to_alternates_memory(), let's
      document add_to_alternates_file(), as the two are related.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      a5b34d21
    • B
      git: make super-prefix option · 74866d75
      Brandon Williams 提交于
      Add a super-prefix environment variable 'GIT_INTERNAL_SUPER_PREFIX'
      which can be used to specify a path from above a repository down to its
      root.  When such a super-prefix is specified, the paths reported by Git
      are prefixed with it to make them relative to that directory "above".
      The paths given by the user on the command line
      (e.g. "git subcmd --output-file=path/to/a/file" and pathspecs) are taken
      relative to the directory "above" to match.
      
      The immediate use of this option is by commands which have a
      --recurse-submodule option in order to give context to submodules about
      how they were invoked.  This option is currently only allowed for
      builtins which support a super-prefix.
      Signed-off-by: NBrandon Williams <bmwill@google.com>
      Reviewed-by: NStefan Beller <sbeller@google.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      74866d75
  2. 28 9月, 2016 1 次提交
    • J
      get_short_sha1: make default disambiguation configurable · 5b33cb1f
      Jeff King 提交于
      When we find ambiguous short sha1s, we may get a
      disambiguation rule from our caller's context. But if we
      don't, we fall back to treating all sha1s the same, even
      though most projects will tend to refer only to commits by
      their short sha1s.
      
      This patch introduces a configuration option that lets the
      user pick a different fallback (e.g., only commits). It's
      possible that we may want to make this the default, but it's
      a good idea to start as a config option for two reasons:
      
        1. It lets people experiment with this and see if it's a
           good idea (i.e., the "tend to" above is an assumption;
           we don't really know if this will break some obscure
           cases).
      
        2. Even if we do flip the default, it gives people an
           escape hatch if it causes problems (you can sometimes
           override it by asking for "1234^{tree}", but not all
           combinations are possible).
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      5b33cb1f
  3. 27 9月, 2016 1 次提交
    • J
      get_sha1: detect buggy calls with multiple disambiguators · 259942f5
      Jeff King 提交于
      The get_sha1() family of functions takes a flags field, but
      some of the flags are mutually exclusive. In particular, we
      can only handle one disambiguating function, and the flags
      quietly override each other. Let's instead detect these as
      programming bugs.
      
      Technically some of the flags are supersets of the others,
      so treating COMMITTISH|TREEISH as just COMMITTISH is not
      wrong, but it's a good sign the caller is confused. And
      certainly asking for BLOB|TREE does not work.
      
      We can do the check easily with some bit-twiddling, and as a
      bonus, the bit-mask of disambiguators will come in handy in
      a future patch.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      259942f5
  4. 26 9月, 2016 1 次提交
  5. 23 9月, 2016 1 次提交
  6. 16 9月, 2016 2 次提交
  7. 14 9月, 2016 3 次提交
    • 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
      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
      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
  8. 08 9月, 2016 3 次提交
  9. 01 9月, 2016 2 次提交
    • J
      allow do_submodule_path to work even if submodule isn't checked out · 99b43a61
      Jacob Keller 提交于
      Currently, do_submodule_path will attempt locating the .git directory by
      using read_gitfile on <path>/.git. If this fails it just assumes the
      <path>/.git is actually a git directory.
      
      This is good because it allows for handling submodules which were cloned
      in a regular manner first before being added to the superproject.
      
      Unfortunately this fails if the <path> is not actually checked out any
      longer, such as by removing the directory.
      
      Fix this by checking if the directory we found is actually a gitdir. In
      the case it is not, attempt to lookup the submodule configuration and
      find the name of where it is stored in the .git/modules/ directory of
      the superproject.
      
      If we can't locate the submodule configuration, this might occur because
      for example a submodule gitlink was added but the corresponding
      .gitmodules file was not properly updated.  A die() here would not be
      pleasant to the users of submodule diff formats, so instead, modify
      do_submodule_path() to return an error code:
      
       - git_pathdup_submodule() returns NULL when we fail to find a path.
       - strbuf_git_path_submodule() propagates the error code to the caller.
      
      Modify the callers of these functions to check the error code and fail
      properly. This ensures we don't attempt to use a bad path that doesn't
      match the corresponding submodule.
      
      Because this change fixes add_submodule_odb() to work even if the
      submodule is not checked out, update the wording of the submodule log
      diff format to correctly display that the submodule is "not initialized"
      instead of "not checked out"
      
      Add tests to ensure this change works as expected.
      Signed-off-by: NJacob Keller <jacob.keller@gmail.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      99b43a61
    • J
      cache: add empty_tree_oid object and helper function · 8576fde6
      Jacob Keller 提交于
      Similar to is_null_oid(), and is_empty_blob_sha1() add an
      empty_tree_oid along with helper function is_empty_tree_oid(). For
      completeness, also add an "is_empty_tree_sha1()",
      "is_empty_blob_sha1()", "is_empty_tree_oid()" and "is_empty_blob_oid()"
      helpers.
      
      To ensure we only get one singleton, implement EMPTY_BLOB_SHA1_BIN as
      simply getting the hash of empty_blob_oid structure.
      Signed-off-by: NJacob Keller <jacob.keller@gmail.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      8576fde6
  10. 16 8月, 2016 1 次提交
  11. 12 8月, 2016 2 次提交
    • J
      sha1_file: make packed_object_info public · ca79c985
      Jeff King 提交于
      Some code may have a pack/offset pair for an object, but
      would like to look up more information. Using
      sha1_object_info() is too heavy-weight; it starts from the
      sha1 and has to find the pack again (so not only does it waste
      time, it might not even find the same instance).
      
      In some cases, this problem is solved by helpers like
      get_size_from_delta(), which is used by pack-objects to take
      a shortcut for objects whose packed representation has
      already been found. But there's no similar function for
      getting the object type, for instance. Rather than introduce
      one, let's just make the whole packed_object_info() available.
      It is smart enough to spend effort only on the items the
      caller wants.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      ca79c985
    • J
      provide an initializer for "struct object_info" · 27b5c1a0
      Jeff King 提交于
      An all-zero initializer is fine for this struct, but because
      the first element is a pointer, call sites need to know to
      use "NULL" instead of "0". Otherwise some static checkers
      like "sparse" will complain; see d099b717 (Fix some sparse
      warnings, 2013-07-18) for example.  So let's provide an
      initializer to make this easier to get right.
      
      But let's also comment that memset() to zero is explicitly
      OK[1]. One of the callers embeds object_info in another
      struct which is initialized via memset (expand_data in
      builtin/cat-file.c). Since our subset of C doesn't allow
      assignment from a compound literal, handling this in any
      other way is awkward, so we'd like to keep the ability to
      initialize by memset(). By documenting this property, it
      should make anybody who wants to change the initializer
      think twice before doing so.
      
      There's one other caller of interest. In parse_sha1_header(),
      we did not initialize the struct fully in the first place.
      This turned out not to be a bug because the sub-function it
      calls does not look at any other fields except the ones we
      did initialize. But that assumption might not hold in the
      future, so it's a dangerous construct. This patch switches
      it to initializing the whole struct, which protects us
      against unexpected reads of the other fields.
      
      [1] Obviously using memset() to initialize a pointer
          violates the C standard, but we long ago decided that it
          was an acceptable tradeoff in the real world.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      27b5c1a0
  12. 06 8月, 2016 1 次提交
    • J
      write_or_die: drop write_or_whine_pipe() · ca5c701c
      Jeff King 提交于
      This function has no callers, and is not likely to gain any
      because it's confusing to use.
      
      It unconditionally complains to stderr, but _doesn't_ die.
      Yet any caller which wants a "gentle" write would generally
      want to suppress the error message, because presumably
      they're going to write a better one, and/or try the
      operation again.
      
      And the check_pipe() call leads to confusing behaviors. It
      means we die for EPIPE, but not for other errors, which is
      confusing and pointless.
      
      On top of all that, it has unusual error return semantics,
      which makes it easy for callers to get it wrong.
      
      Let's drop the function, and if somebody ever needs to
      resurrect something like it, they can fix these warts.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      ca5c701c
  13. 02 8月, 2016 1 次提交
    • J
      am: reset cached ident date for each patch · 4d9c7e6f
      Jeff King 提交于
      When we compute the date to go in author/committer lines of
      commits, or tagger lines of tags, we get the current date
      once and then cache it for the rest of the program.  This is
      a good thing in some cases, like "git commit", because it
      means we do not racily assign different times to the
      author/committer fields of a single commit object.
      
      But as more programs start to make many commits in a single
      process (e.g., the recently builtin "git am"), it means that
      you'll get long strings of commits with identical committer
      timestamps (whereas before, we invoked "git commit" many
      times and got true timestamps).
      
      This patch addresses it by letting callers reset the cached
      time, which means they'll get a fresh time on their next
      call to git_committer_info() or git_author_info(). The first
      caller to do so is "git am", which resets the time for each
      patch it applies.
      
      It would be nice if we could just do this automatically
      before filling in the ident fields of commit and tag
      objects. Unfortunately, it's hard to know where a particular
      logical operation begins and ends.
      
      For instance, if commit_tree_extended() were to call
      reset_ident_date() before getting the committer/author
      ident, that doesn't quite work; sometimes the author info is
      passed in to us as a parameter, and it may or may not have
      come from a previous call to ident_default_date(). So in
      those cases, we lose the property that the committer and the
      author timestamp always match.
      
      You could similarly put a date-reset at the end of
      commit_tree_extended(). That actually works in the current
      code base, but it's fragile. It makes the assumption that
      after commit_tree_extended() finishes, the caller has no
      other operations that would logically want to fall into the
      same timestamp.
      
      So instead we provide the tool to easily do the reset, and
      let the high-level callers use it to annotate their own
      logical operations.
      
      There's no automated test, because it would be inherently
      racy (it depends on whether the program takes multiple
      seconds to run). But you can see the effect with something
      like:
      
        # make a fake 100-patch series
        top=$(git rev-parse HEAD)
        bottom=$(git rev-list --first-parent -100 HEAD | tail -n 1)
        git log --format=email --reverse --first-parent \
                --binary -m -p $bottom..$top >patch
      
        # now apply it; this presumably takes multiple seconds
        git checkout --detach $bottom
        git am <patch
      
        # now count the number of distinct committer times;
        # prior to this patch, there would only be one, but
        # now we'd typically see several.
        git log --format=%ct $bottom.. | sort -u
      Suggested-by: NLinus Torvalds <torvalds@linux-foundation.org>
      Helped-by: NPaul Tan <pyokagan@gmail.com>
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      4d9c7e6f
  14. 30 7月, 2016 2 次提交
    • J
      find_pack_entry: replace last_found_pack with MRU cache · a73cdd21
      Jeff King 提交于
      Each pack has an index for looking up entries in O(log n)
      time, but if we have multiple packs, we have to scan through
      them linearly. This can produce a measurable overhead for
      some operations.
      
      We dealt with this long ago in f7c22cc6 (always start looking
      up objects in the last used pack first, 2007-05-30), which
      keeps what is essentially a 1-element most-recently-used
      cache. In theory, we should be able to do better by keeping
      a similar but longer cache, that is the same length as the
      pack-list itself.
      
      Since we now have a convenient generic MRU structure, we can
      plug it in and measure. Here are the numbers for running
      p5303 against linux.git:
      
      Test                      HEAD^                HEAD
      ------------------------------------------------------------------------
      5303.3: rev-list (1)      31.56(31.28+0.27)    31.30(31.08+0.20) -0.8%
      5303.4: repack (1)        40.62(39.35+2.36)    40.60(39.27+2.44) -0.0%
      5303.6: rev-list (50)     31.31(31.06+0.23)    31.23(31.00+0.22) -0.3%
      5303.7: repack (50)       58.65(69.12+1.94)    58.27(68.64+2.05) -0.6%
      5303.9: rev-list (1000)   38.74(38.40+0.33)    31.87(31.62+0.24) -17.7%
      5303.10: repack (1000)    367.20(441.80+4.62)  342.00(414.04+3.72) -6.9%
      
      The main numbers of interest here are the rev-list ones
      (since that is exercising the normal object lookup code
      path).  The single-pack case shouldn't improve at all; the
      260ms speedup there is just part of the run-to-run noise
      (but it's important to note that we didn't make anything
      worse with the overhead of maintaining our cache). In the
      50-pack case, we see similar results. There may be a slight
      improvement, but it's mostly within the noise.
      
      The 1000-pack case does show a big improvement, though. That
      carries over to the repack case, as well. Even though we
      haven't touched its pack-search loop yet, it does still do a
      lot of normal object lookups (e.g., for the internal
      revision walk), and so improves.
      
      As a point of reference, I also ran the 1000-pack test
      against a version of HEAD^ with the last_found_pack
      optimization disabled. It takes ~60s, so that gives an
      indication of how much even the single-element cache is
      helping.
      
      For comparison, here's a smaller repository, git.git:
      
      Test                      HEAD^               HEAD
      ---------------------------------------------------------------------
      5303.3: rev-list (1)      1.56(1.54+0.01)    1.54(1.51+0.02) -1.3%
      5303.4: repack (1)        1.84(1.80+0.10)    1.82(1.80+0.09) -1.1%
      5303.6: rev-list (50)     1.58(1.55+0.02)    1.59(1.57+0.01) +0.6%
      5303.7: repack (50)       2.50(3.18+0.04)    2.50(3.14+0.04) +0.0%
      5303.9: rev-list (1000)   2.76(2.71+0.04)    2.24(2.21+0.02) -18.8%
      5303.10: repack (1000)    13.21(19.56+0.25)  11.66(18.01+0.21) -11.7%
      
      You can see that the percentage improvement is similar.
      That's because the lookup we are optimizing is roughly
      O(nr_objects * nr_packs). Since the number of packs is
      constant in both tests, we'd expect the improvement to be
      linear in the number of objects. But the whole process is
      also linear in the number of objects, so the improvement
      is a constant factor.
      
      The exact improvement does also depend on the contents of
      the packs. In p5303, the extra packs all have 5 first-parent
      commits in them, which is a reasonable simulation of a
      pushed-to repository. But it also means that only 250
      first-parent commits are in those packs (compared to almost
      50,000 total in linux.git), and the rest are in the huge
      "base" pack. So once we start looking at history in taht big
      pack, that's where we'll find most everything, and even the
      1-element cache gets close to 100% cache hits.  You could
      almost certainly show better numbers with a more
      pathological case (e.g., distributing the objects more
      evenly across the packs). But that's simply not that
      realistic a scenario, so it makes more sense to focus on
      these numbers.
      
      The implementation itself is a straightforward application
      of the MRU code. We provide an MRU-ordered list of packs
      that shadows the packed_git list. This is easy to do because
      we only create and revise the pack list in one place. The
      "reprepare" code path actually drops the whole MRU and
      replaces it for simplicity. It would be more efficient to
      just add new entries, but there's not much point in
      optimizing here; repreparing happens rarely, and only after
      doing a lot of other expensive work.  The key things to keep
      optimized are traversal (which is just a normal linked list,
      albeit with one extra level of indirection over the regular
      packed_git list), and marking (which is a constant number of
      pointer assignments, though slightly more than the old
      last_found_pack was; it doesn't seem to create a measurable
      slowdown, though).
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      a73cdd21
    • J
      sha1_file: drop free_pack_by_name · 3157c880
      Jeff King 提交于
      The point of this function is to drop an entry from the
      "packed_git" cache that points to a file we might be
      overwriting, because our contents may not be the same (and
      hence the only caller was pack-objects as it moved a
      temporary packfile into place).
      
      In older versions of git, this could happen because the
      names of packfiles were derived from the set of objects they
      contained, not the actual bits on disk. But since 1190a1ac
      (pack-objects: name pack files after trailer hash,
      2013-12-05), the name reflects the actual bits on disk, and
      any two packfiles with the same name can be used
      interchangeably.
      
      Dropping this function not only saves a few lines of code,
      it makes the lifetime of "struct packed_git" much easier to
      reason about: namely, we now do not ever free these structs.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      3157c880
  15. 29 7月, 2016 1 次提交
    • V
      i18n: config: unfold error messages marked for translation · 1b8132d9
      Vasco Almeida 提交于
      Introduced in 473166b9 ("config: add 'origin_type' to config_source
      struct", 2016-02-19), Git can inform the user about the origin of a
      config error, but the implementation does not allow translators to
      translate the keywords 'file', 'blob, 'standard input', and
      'submodule-blob'. Moreover, for the second message, a reason for the
      error is appended to the message, not allowing translators to translate
      that reason either.
      
      Unfold the message into several templates for each known origin_type.
      That would result in better translation at the expense of code
      verbosity.
      
      Add enum config_oringin_type to ease management of the various
      configuration origin types (blob, file, etc).  Previously origin type
      was considered from command line if cf->origin_type == NULL, i.e.,
      uninitialized. Now we set origin_type to CONFIG_ORIGIN_CMDLINE in
      git_config_from_parameters() and configset_add_value().
      
      For error message in git_parse_source(), use xstrfmt() function to
      prepare the message string, instead of doing something like it's done
      for die_bad_number(), because intelligibility and code conciseness are
      improved for that instance.
      Signed-off-by: NVasco Almeida <vascomalmeida@sapo.pt>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      1b8132d9
  16. 28 7月, 2016 1 次提交
    • J
      date: add "unix" format · 642833db
      Jeff King 提交于
      We already have "--date=raw", which is a Unix epoch
      timestamp plus a contextual timezone (either the author's or
      the local). But one may not care about the timezone and just
      want the epoch timestamp by itself. It's not hard to parse
      the two apart, but if you are using a pretty-print format,
      you may want git to show the "finished" form that the user
      will see.
      
      We can accomodate this by adding a new date format, "unix",
      which is basically "raw" without the timezone.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      642833db
  17. 14 7月, 2016 1 次提交
  18. 13 7月, 2016 1 次提交
    • J
      merge: avoid "safer crlf" during recording of merge results · 1335d76e
      Junio C Hamano 提交于
      When merge_recursive() decides what the correct blob object merge
      result for a path should be, it uses update_file_flags() helper
      function to write it out to a working tree file and then calls
      add_cacheinfo().  The add_cacheinfo() function in turn calls
      make_cache_entry() to create a new cache entry to replace the
      higher-stage entries for the path that represents the conflict.
      
      The make_cache_entry() function calls refresh_cache_entry() to fill
      in the cached stat information.  To mark a cache entry as
      up-to-date, the data is re-read from the file in the working tree,
      and goes through convert_to_git() conversion to be compared with the
      blob object name the new cache entry records.
      
      It is important to note that this happens while the higher-stage
      entries, which are going to be replaced with the new entry, are
      still in the index.  Unfortunately, the convert_to_git() conversion
      has a misguided "safer crlf" mechanism baked in, and looks at the
      existing cache entry for the path to decide how to convert the
      contents in the working tree file.  If our side (i.e. stage#2)
      records a text blob with CRLF in it, even when the system is
      configured to record LF in blobs and convert them to CRLF upon
      checkout (and back to LF upon checkin), the "safer crlf" mechanism
      stops us doing so.
      
      This especially poses a problem during a renormalizing merge, where
      the merge result for the path is computed by first "normalizing" the
      blobs involved in the merge by using convert_to_working_tree()
      followed by convert_to_git() with "safer crlf" disabled.  The merge
      result that is computed correctly and fed to add_cacheinfo() via
      update_file_flags() does _not_ match what refresh_cache_entry() sees
      by converting the working tree file via convert_to_git().
      
      We can work this around by not refreshing the new cache entry in
      make_cache_entry() called by add_cacheinfo().  After add_cacheinfo()
      adds the new entry, we can call refresh_cache_entry() on that,
      knowing that addition of this new cache entry would have removed the
      stale cache entries that had CRLF in stage #2 that were carried over
      before the renormalizing merge started and will not interfere with
      the correct recording of the result.
      
      The test update was taken from a series by Torsten Bögershausen
      that attempted to fix this with a different approach.
      Signed-off-by: NTorsten Bögershausen <tboegi@web.de>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      Reviewed-by: NTorsten Bögershausen <tboegi@web.de>
      1335d76e
  19. 09 7月, 2016 3 次提交
    • J
      write_file: add format attribute · e04d08a4
      Jeff King 提交于
      This gives us compile-time checking of our format strings,
      which is a good thing.
      
      I had also hoped it would help with confusing write_file()
      and write_file_buf(), since the former's "..." can make it
      match the signature of the latter. But given that the buffer
      for write_file_buf() is generally not a string literal, the
      compiler won't complain unless -Wformat-nonliteral is on,
      and that creates a ton of false positives elsewhere in the
      code base.
      
      While we're there, let's also give the function a docstring,
      which it never had.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      e04d08a4
    • J
      write_file: add pointer+len variant · 52563d7e
      Jeff King 提交于
      There are many callsites which could use write_file, but for
      which it is a little awkward because they have a strbuf or
      other pointer/len combo. Specifically:
      
       1. write_file() takes a format string, so we have to use
          "%s" or "%.*s", which are ugly.
      
       2. Using any form of "%s" does not handle embedded NULs in
          the output. That probably doesn't matter for our
          call-sites, but it's nicer not to have to worry.
      
       3. It's less efficient; we format into another strbuf
          just to do the write. That's probably not measurably
          slow for our uses, but it's simply inelegant.
      
      We can fix this by providing a helper to write out the
      formatted buffer, and just calling it from write_file().
      
      Note that we don't do the usual "complete with a newline"
      that write_file does. If the caller has their own buffer,
      there's a reasonable chance they're doing something more
      complicated than a single line, and they can call
      strbuf_complete_line() themselves.
      
      We could go even further and add strbuf_write_file(), but it
      doesn't save much:
      
        -  write_file_buf(path, sb.buf, sb.len);
        +  strbuf_write_file(&sb, path);
      
      It would also be somewhat asymmetric with strbuf_read_file,
      which actually returns errors rather than dying (and the
      error handling is most of the benefit of write_file() in the
      first place).
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      52563d7e
    • J
      write_file: drop "gently" form · ef22318c
      Jeff King 提交于
      There are no callers left of write_file_gently(). Let's drop
      it, as it doesn't seem likely for new callers to be added
      (since its inception, the only callers who wanted the gentle
      form generally just died immediately themselves, and have
      since been converted).
      
      While we're there, let's also drop the "int" return from
      write_file, as it is never meaningful (in the non-gentle
      form, we always either die or return 0).
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      ef22318c
  20. 29 6月, 2016 1 次提交
  21. 11 6月, 2016 1 次提交
  22. 08 6月, 2016 1 次提交
    • E
      add: add --chmod=+x / --chmod=-x options · 4e55ed32
      Edward Thomson 提交于
      The executable bit will not be detected (and therefore will not be
      set) for paths in a repository with `core.filemode` set to false,
      though the users may still wish to add files as executable for
      compatibility with other users who _do_ have `core.filemode`
      functionality.  For example, Windows users adding shell scripts may
      wish to add them as executable for compatibility with users on
      non-Windows.
      
      Although this can be done with a plumbing command
      (`git update-index --add --chmod=+x foo`), teaching the `git-add`
      command allows users to set a file executable with a command that
      they're already familiar with.
      Signed-off-by: NEdward Thomson <ethomson@edwardthomson.com>
      Helped-by: NJohannes Schindelin <johannes.schindelin@gmx.de>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      4e55ed32
  23. 28 5月, 2016 2 次提交
    • J
      config: add a notion of "scope" · 9acc5911
      Jeff King 提交于
      A config callback passed to git_config() doesn't know very
      much about the context in which it sees a variable. It can
      ask whether the variable comes from a file, and get the file
      name. But without analyzing the filename (which is hard to
      do accurately), it cannot tell whether it is in system-level
      config, user-level config, or repo-specific config.
      
      Generally this doesn't matter; the point of not passing this
      to the callback is that it should treat the config the same
      no matter where it comes from. But some programs, like
      upload-pack, are a special case: we should be able to run
      them in an untrusted repository, which means we cannot use
      any "dangerous" config from the repository config file (but
      it is OK to use it from system or user config).
      
      This patch teaches the config code to record the "scope" of
      each variable, and make it available inside config
      callbacks, similar to how we give access to the filename.
      The scope is the starting source for a particular parsing
      operation, and remains the same even if we include other
      files (so a .git/config which includes another file will
      remain CONFIG_SCOPE_REPO, as it would be similarly
      untrusted).
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      9acc5911
    • J
      config: return configset value for current_config_ functions · 0d44a2da
      Jeff King 提交于
      When 473166b9 (config: add 'origin_type' to config_source
      struct, 2016-02-19) added accessor functions for the origin
      type and name, it taught them only to look at the "cf"
      struct that is filled in while we are parsing the config.
      This is sufficient to make it work with git-config, which
      uses git_config_with_options() under the hood. That function
      freshly parses the config files and triggers the callback
      when it parses each key.
      
      Most git programs, however, use git_config(). This interface
      will populate a cache during the actual parse, and then
      serve values from the cache. Calling current_config_filename()
      in a callback here will find a NULL cf and produce an error.
      There are no such callers right now, but let's prepare for
      adding some by making this work.
      
      We already record source information in a struct attached to
      each value. We just need to make it globally available and
      then consult it from the accessor functions.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      0d44a2da
  24. 12 5月, 2016 1 次提交
    • J
      mingw: introduce the 'core.hideDotFiles' setting · f30afdab
      Johannes Schindelin 提交于
      On Unix (and Linux), files and directories whose names start with a dot
      are usually not shown by default. This convention is used by Git: the
      .git/ directory should be left alone by regular users, and only accessed
      through Git itself.
      
      On Windows, no such convention exists. Instead, there is an explicit flag
      to mark files or directories as hidden.
      
      In the early days, Git for Windows did not mark the .git/ directory (or
      for that matter, any file or directory whose name starts with a dot)
      hidden. This lead to quite a bit of confusion, and even loss of data.
      
      Consequently, Git for Windows introduced the core.hideDotFiles setting,
      with three possible values: true, false, and dotGitOnly, defaulting to
      marking only the .git/ directory as hidden.
      
      The rationale: users do not need to access .git/ directly, and indeed (as
      was demonstrated) should not really see that directory, either. However,
      not all dot files should be hidden by default, as e.g. Eclipse does not
      show them (and the user would therefore be unable to see, say, a
      .gitattributes file).
      
      In over five years since the last attempt to bring this patch into core
      Git, a slightly buggy version of this patch has served Git for Windows'
      users well: no single report indicated problems with the hidden .git/
      directory, and the stream of problems caused by the previously non-hidden
      .git/ directory simply stopped. The bugs have been fixed during the
      process of getting this patch upstream.
      
      Note that there is a funny quirk we have to pay attention to when
      creating hidden files: we use Win32's _wopen() function which
      transmogrifies its arguments and hands off to Win32's CreateFile()
      function. That latter function errors out with ERROR_ACCESS_DENIED (the
      equivalent of EACCES) when the equivalent of the O_CREAT flag was passed
      and the file attributes (including the hidden flag) do not match an
      existing file's. And _wopen() accepts no parameter that would be
      transmogrified into said hidden flag. Therefore, we simply try again
      without O_CREAT.
      
      A slightly different method is required for our fopen()/freopen()
      function as we cannot even *remove* the implicit O_CREAT flag.
      Therefore, we briefly mark existing files as unhidden when opening them
      via fopen()/freopen().
      
      The ERROR_ACCESS_DENIED error can also be triggered by opening a file
      that is marked as a system file (which is unlikely to be tracked in
      Git), and by trying to create a file that has *just* been deleted and is
      awaiting the last open handles to be released (which would be handled
      better by the "Try again?" logic, a story for a different patch series,
      though). In both cases, it does not matter much if we try again without
      the O_CREAT flag, read: it does not hurt, either.
      
      For details how ERROR_ACCESS_DENIED can be triggered, see
      https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858Original-patch-by: NErik Faye-Lund <kusmabite@gmail.com>
      Initial-Test-By: NPat Thoyts <patthoyts@users.sourceforge.net>
      Signed-off-by: NJohannes Schindelin <johannes.schindelin@gmx.de>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      f30afdab