1. 14 9月, 2013 1 次提交
  2. 31 8月, 2013 1 次提交
    • J
      has_sha1_file: re-check pack directory before giving up · 45e8a748
      Jeff King 提交于
      When we read a sha1 file, we first look for a packed
      version, then a loose version, and then re-check the pack
      directory again before concluding that we cannot find it.
      This lets us handle a process that is writing to the
      repository simultaneously (e.g., receive-pack writing a new
      pack followed by a ref update, or git-repack packing
      existing loose objects into a new pack).
      
      However, we do not do the same trick with has_sha1_file; we
      only check the packed objects once, followed by loose
      objects. This means that we might incorrectly report that we
      do not have an object, even though we could find it if we
      simply re-checked the pack directory.
      
      By itself, this is usually not a big deal. The other process
      is running simultaneously, so we may run has_sha1_file
      before it writes, anyway. It is a race whether we see the
      object or not.  However, we may also see other things
      the writing process has done (like updating refs); and in
      that case, we must be able to also see the new objects.
      
      For example, imagine we are doing a for_each_ref iteration,
      and somebody simultaneously pushes. Receive-pack may write
      the pack and update a ref after we have examined the
      objects/pack directory, but before the iteration gets to the
      updated ref. When we do finally see the updated ref,
      for_each_ref will call has_sha1_file to check whether the
      ref is broken. If has_sha1_file returns the wrong answer, we
      erroneously will think that the ref is broken.
      
      For a normal iteration without DO_FOR_EACH_INCLUDE_BROKEN,
      this means that the caller does not see the ref at all
      (neither the old nor the new value).  So not only will we
      fail to see the new value of the ref (which is acceptable,
      since we are running simultaneously with the writer, and we
      might well read the ref before the writer commits its
      write), but we will not see the old value either. For
      programs that act on reachability like pack-objects or
      prune, this can cause data loss, as we may see the objects
      referenced by the original ref value as dangling (and either
      omit them from the pack, or delete them via prune).
      
      There's no test included here, because the success case is
      two processes running simultaneously forever. But you can
      replicate the issue with:
      
        # base.sh
        # run this in one terminal; it creates and pushes
        # repeatedly to a repository
        git init parent &&
        (cd parent &&
      
          # create a base commit that will trigger us looking at
          # the objects/pack directory before we hit the updated ref
          echo content >file &&
          git add file &&
          git commit -m base &&
      
          # set the unpack limit abnormally low, which
          # lets us simulate full-size pushes using tiny ones
          git config receive.unpackLimit 1
        ) &&
        git clone parent child &&
        cd child &&
        n=0 &&
        while true; do
          echo $n >file && git add file && git commit -m $n &&
          git push origin HEAD:refs/remotes/child/master &&
          n=$(($n + 1))
        done
      
        # fsck.sh
        # now run this simultaneously in another terminal; it
        # repeatedly fscks, looking for us to consider the
        # newly-pushed ref broken. We cannot use for-each-ref
        # here, as it uses DO_FOR_EACH_INCLUDE_BROKEN, which
        # skips the has_sha1_file check (and if it wants
        # more information on the object, it will actually read
        # the object, which does the proper two-step lookup)
        cd parent &&
        while true; do
          broken=`git fsck 2>&1 | grep remotes/child`
          if test -n "$broken"; then
            echo $broken
            exit 1
          fi
        done
      
      Without this patch, the fsck loop fails within a few seconds
      (and almost instantly if the test repository actually has a
      large number of refs). With it, the two can run
      indefinitely.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      45e8a748
  3. 03 8月, 2013 1 次提交
    • B
      Don't close pack fd when free'ing pack windows · 7c3ecb32
      Brandon Casey 提交于
      Now that close_one_pack() has been introduced to handle file
      descriptor pressure, it is not strictly necessary to close the
      pack file descriptor in unuse_one_window() when we're under memory
      pressure.
      
      Jeff King provided a justification for leaving the pack file open:
      
         If you close packfile descriptors, you can run into racy situations
         where somebody else is repacking and deleting packs, and they go away
         while you are trying to access them. If you keep a descriptor open,
         you're fine; they last to the end of the process. If you don't, then
         they disappear from under you.
      
         For normal object access, this isn't that big a deal; we just rescan
         the packs and retry. But if you are packing yourself (e.g., because
         you are a pack-objects started by upload-pack for a clone or fetch),
         it's much harder to recover (and we print some warnings).
      
      Let's do so (or uh, not do so).
      Signed-off-by: NBrandon Casey <drafnel@gmail.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      7c3ecb32
  4. 02 8月, 2013 1 次提交
    • B
      sha1_file: introduce close_one_pack() to close packs on fd pressure · 88d0db55
      Brandon Casey 提交于
      When the number of open packs exceeds pack_max_fds, unuse_one_window()
      is called repeatedly to attempt to release the least-recently-used
      pack windows, which, as a side-effect, will also close a pack file
      after closing its last open window.  If a pack file has been opened,
      but no windows have been allocated into it, it will never be selected
      by unuse_one_window() and hence its file descriptor will not be
      closed.  When this happens, git may exceed the number of file
      descriptors permitted by the system.
      
      This latter situation can occur in show-ref or receive-pack during ref
      advertisement.  During ref advertisement, receive-pack will iterate
      over every ref in the repository and advertise it to the client after
      ensuring that the ref exists in the local repository.  If the ref is
      located inside a pack, then the pack is opened to ensure that it
      exists, but since the object is not actually read from the pack, no
      mmap windows are allocated.  When the number of open packs exceeds
      pack_max_fds, unuse_one_window() will not be able to find any windows to
      free and will not be able to close any packs.  Once the per-process
      file descriptor limit is exceeded, receive-pack will produce a warning,
      not an error, for each pack it cannot open, and will then most likely
      fail with an error to spawn rev-list or index-pack like:
      
         error: cannot create standard input pipe for rev-list: Too many open files
         error: Could not run 'git rev-list'
      
      This may also occur during upload-pack when refs are packed (in the
      packed-refs file) and the number of packs that must be opened to
      verify that these packed refs exist exceeds the file descriptor
      limit.  If the refs are loose, then upload-pack will read each ref
      from the object database (if the object is in a pack, allocating one
      or more mmap windows for it) in order to peel tags and advertise the
      underlying object.  But when the refs are packed and peeled,
      upload-pack will use the peeled sha1 in the packed-refs file and
      will not need to read from the pack files, so no mmap windows will
      be allocated and just like with receive-pack, unuse_one_window()
      will never select these opened packs to close.
      
      When we have file descriptor pressure, we just need to find an open
      pack to close.  We can leave the existing mmap windows open.  If
      additional windows need to be mapped into the pack file, it will be
      reopened when necessary.  If the pack file has been rewritten in the
      mean time, open_packed_git_1() should notice when it compares the file
      size or the pack's sha1 checksum to what was previously read from the
      pack index, and reject it.
      
      Let's introduce a new function close_one_pack() designed specifically
      for this purpose to search for and close the least-recently-used pack,
      where LRU is defined as (in order of preference):
      
         * pack with oldest mtime and no allocated mmap windows
         * pack with the least-recently-used windows, i.e. the pack
           with the oldest most-recently-used window, where none of
           the windows are in use
         * pack with the least-recently-used windows
      Signed-off-by: NBrandon Casey <drafnel@gmail.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      88d0db55
  5. 19 7月, 2013 1 次提交
  6. 13 7月, 2013 6 次提交
    • J
      sha1_object_info_extended: pass object_info to helpers · 23c339c0
      Jeff King 提交于
      We take in a "struct object_info" which contains pointers to
      storage for items the caller cares about. But then rather
      than pass the whole object to the low-level loose/packed
      helper functions, we pass the individual pointers.
      
      Let's pass the whole struct instead, which will make adding
      more items later easier.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      23c339c0
    • J
      sha1_object_info_extended: make type calculation optional · 5b086407
      Jeff King 提交于
      Each caller of sha1_object_info_extended sets up an
      object_info struct to tell the function which elements of
      the object it wants to get. Until now, getting the type of
      the object has always been required (and it is returned via
      the return type rather than a pointer in object_info).
      
      This can involve actually opening a loose object file to
      determine its type, or following delta chains to determine a
      packed file's base type. These effects produce a measurable
      slow-down when doing a "cat-file --batch-check" that does
      not include %(objecttype).
      
      This patch adds a "typep" query to struct object_info, so
      that it can be optionally queried just like size and
      disk_size. As a result, the return type of the function is
      no longer the object type, but rather 0/-1 for success/error.
      
      As there are only three callers total, we just fix up each
      caller rather than keep a compatibility wrapper:
      
        1. The simpler sha1_object_info wrapper continues to
           always ask for and return the type field.
      
        2. The istream_source function wants to know the type, and
           so always asks for it.
      
        3. The cat-file batch code asks for the type only when
           %(objecttype) is part of the format string.
      
      On linux.git, the best-of-five for running:
      
        $ git rev-list --objects --all >objects
        $ time git cat-file --batch-check='%(objectsize:disk)'
      
      on a fully packed repository goes from:
      
        real    0m8.680s
        user    0m8.160s
        sys     0m0.512s
      
      to:
      
        real    0m7.205s
        user    0m6.580s
        sys     0m0.608s
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      5b086407
    • J
      packed_object_info: make type lookup optional · 412916ee
      Jeff King 提交于
      Currently, packed_object_info can save some work by not
      calculating the size or disk_size of the object if the
      caller is not interested. However, it always calculates the
      true object type, whether the caller cares or not, and only
      optionally returns the easy-to-get "representation type".
      
      Let's swap these types. The function will now return the
      representation type (or OBJ_BAD on failure), and will only
      optionally fill in the true type.
      
      There should be no behavior change yet, as the only caller,
      sha1_object_info_extended, will always feed it a type
      pointer.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      412916ee
    • J
      packed_object_info: hoist delta type resolution to helper · 90191d37
      Jeff King 提交于
      To calculate the type of a packed object, we must walk down
      its delta chain until we hit a true base object with a real
      type. Most of the code in packed_object_info is for handling
      this case.
      
      Let's hoist it out into a separate helper function, which
      will make it easier to make the type-lookup optional in the
      future (and keep our indentation level sane).
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      90191d37
    • J
      sha1_loose_object_info: make type lookup optional · 052fe5ea
      Jeff King 提交于
      Until recently, the only items to request from
      sha1_object_info_extended were type and size. This meant
      that we always had to open a loose object file to determine
      one or the other.  But with the addition of the disk_size
      query, it's possible that we can fulfill the query without
      even opening the object file at all. However, since the
      function interface always returns the type, we have no way
      of knowing whether the caller cares about it or not.
      
      This patch only modified sha1_loose_object_info to make type
      lookup optional using an out-parameter, similar to the way
      the size is handled (and the return value is "0" or "-1" for
      success or error, respectively).
      
      There should be no functional change yet, though, as
      sha1_object_info_extended, the only caller, will always ask
      for a type.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      052fe5ea
    • J
      sha1_object_info_extended: rename "status" to "type" · f2f57e31
      Jeff King 提交于
      The value we get from each low-level object_info function
      (e.g., loose, packed) is actually the object type (or -1 for
      error). Let's explicitly call it "type", which will make
      further refactorings easier to read.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      f2f57e31
  7. 08 7月, 2013 2 次提交
    • J
      teach sha1_object_info_extended a "disk_size" query · 161f00e7
      Jeff King 提交于
      Using sha1_object_info_extended, a caller can find out the
      type of an object, its size, and information about where it
      is stored. In addition to the object's "true" size, it can
      also be useful to know the size that the object takes on
      disk (e.g., to generate statistics about which refs consume
      space).
      
      This patch adds a "disk_sizep" field to "struct object_info",
      and fills it in during sha1_object_info_extended if it is
      non-NULL.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      161f00e7
    • J
      zero-initialize object_info structs · 7c07385d
      Jeff King 提交于
      The sha1_object_info_extended function expects the caller to
      provide a "struct object_info" which contains pointers to
      "query" items that will be filled in. The purpose of
      providing pointers rather than storing the response directly
      in the struct is so that callers can choose not to incur the
      expense in finding particular fields that they do not care
      about.
      
      Right now the only query item is "sizep", and all callers
      set it explicitly to choose whether or not to query it; they
      can then leave the rest of the struct uninitialized.
      
      However, as we add new query items, each caller will have to
      be updated to explicitly turn off the new ones (by setting
      them to NULL).  Instead, let's teach each caller to
      zero-initialize the struct, so that they do not have to
      learn about each new query item added.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      7c07385d
  8. 15 6月, 2013 1 次提交
    • J
      unpack_entry: do not die when we fail to apply a delta · 1ee886c1
      Jeff King 提交于
      When we try to load an object from disk and fail, our
      general strategy is to see if we can get it from somewhere
      else (e.g., a loose object). That lets users fix corruption
      problems by copying known-good versions of objects into the
      object database.
      
      We already handle the case where we were not able to read
      the delta from disk. However, when we find that the delta we
      read does not apply, we simply die.  This case is harder to
      trigger, as corruption in the delta data itself would
      trigger a crc error from zlib.  However, a corruption that
      pointed us at the wrong delta base might cause it.
      
      We can do the same "fail and try to find the object
      elsewhere" trick instead of dying. This not only gives us a
      chance to recover, but also puts us on code paths that will
      alert the user to the problem (with the current message,
      they do not even know which sha1 caused the problem).
      
      Note that unlike some other pack corruptions, we do not
      recover automatically from this case when doing a repack.
      There is nothing apparently wrong with the delta, as it
      points to a valid, accessible object, and we realize the
      error only when the resulting size does not match up. And in
      theory, one could even have a case where the corrupted size
      is the same, and the problem would only be noticed by
      recomputing the sha1.
      
      We can get around this by recomputing the deltas with
      --no-reuse-delta, which our test does (and this is probably
      good advice for anyone recovering from pack corruption).
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      1ee886c1
  9. 10 6月, 2013 1 次提交
  10. 04 6月, 2013 2 次提交
    • T
      sha1_file: silence sha1_loose_object_info · dbea72a8
      Thomas Rast 提交于
      sha1_object_info() returns -1 (OBJ_BAD) if it cannot find the object
      for some reason, which suggests that it wants the _caller_ to report
      this error.  However, part of its work happens in
      sha1_loose_object_info, which _does_ report errors itself.  This is
      doubly strange because:
      
      * packed_object_info(), which is the other half of the duo, does _not_
        report this.
      
      * In the event that an object is packed and pruned while
        sha1_object_info_extended() goes looking for it, we would
        erroneously show the error -- even though the code of the latter
        function purports to handle this case gracefully.
      
      * A caller might invoke sha1_object_info() to find the type of an
        object even if that object is not known to exist.
      
      Silence this error.  The others remain untouched as a corrupt object
      is a much more grave error than it merely being absent.
      Signed-off-by: NThomas Rast <trast@inf.ethz.ch>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      dbea72a8
    • F
      4b8f772c
  11. 01 5月, 2013 1 次提交
    • T
      unpack_entry: avoid freeing objects in base cache · 756a0426
      Thomas Rast 提交于
      In the !delta_data error path of unpack_entry(), we run free(base).
      This became a window for use-after-free() in abe601bb (sha1_file:
      remove recursion in unpack_entry, 2013-03-27), as follows:
      
      Before abe601bb, we got the 'base' from cache_or_unpack_entry(..., 0);
      keep_cache=0 tells it to also remove that entry.  So the 'base' is at
      this point not cached, and freeing it in the error path is the right
      thing.
      
      After abe601bb, the structure changed: we use a three-phase approach
      where phase 1 finds the innermost base or a base that is already in
      the cache.  In phase 3 we therefore know that all bases we unpack are
      not part of the delta cache yet.  (Observe that we pop from the cache
      in phase 1, so this is also true for the very first base.)  So we make
      no further attempts to look up the bases in the cache, and just call
      add_delta_base_cache() on every base object we have assembled.
      
      But the !delta_data error path remained unchanged, and now calls
      free() on a base that has already been entered in the cache.  This
      means that there is a use-after-free if we later use the same base
      again.
      
      So remove that free(); we are still going to use that data.
      Reported-by: NNguyễn Thái Ngọc Duy <pclouds@gmail.com>
      Signed-off-by: NThomas Rast <trast@inf.ethz.ch>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      756a0426
  12. 28 3月, 2013 3 次提交
  13. 27 3月, 2013 1 次提交
  14. 26 3月, 2013 1 次提交
    • T
      sha1_file: remove recursion in packed_object_info · 790d96c0
      Thomas Rast 提交于
      packed_object_info() and packed_delta_info() were mutually recursive.
      The former would handle ordinary types and defer deltas to the latter;
      the latter would use the former to resolve the delta base.
      
      This arrangement, however, leads to trouble with threaded index-pack
      and long delta chains on platforms where thread stacks are small, as
      happened on OS X (512kB thread stacks by default) with the chromium
      repo.
      
      The task of the two functions is not all that hard to describe without
      any recursion, however.  It proceeds in three steps:
      
      - determine the representation type and size, based on the outermost
        object (delta or not)
      
      - follow through the delta chain, if any
      
      - determine the object type from what is found at the end of the delta
        chain
      
      The only complication stems from the error recovery.  If parsing fails
      at any step, we want to mark that object (within the pack) as bad and
      try getting the corresponding SHA1 from elsewhere.  If that also
      fails, we want to repeat this process back up the delta chain until we
      find a reasonable solution or conclude that there is no way to
      reconstruct the object.  (This is conveniently checked by t5303.)
      
      To achieve that within the pack, we keep track of the entire delta
      chain in a stack.  When things go sour, we process that stack from the
      top, marking entries as bad and attempting to re-resolve by sha1.  To
      avoid excessive malloc(), the stack starts out with a small
      stack-allocated array.  The choice of 64 is based on the default of
      pack.depth, which is 50, in the hope that it covers "most" delta
      chains without any need for malloc().
      
      It's much harder to make the actual re-resolving by sha1 nonrecursive,
      so we skip that.  If you can't afford *that* recursion, your
      corruption problems are more serious than your stack size problems.
      Reported-by: NStefan Zager <szager@google.com>
      Signed-off-by: NThomas Rast <trast@student.ethz.ch>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      790d96c0
  15. 16 2月, 2013 1 次提交
  16. 13 2月, 2013 1 次提交
  17. 09 11月, 2012 2 次提交
  18. 25 8月, 2012 1 次提交
  19. 30 7月, 2012 1 次提交
    • H
      link_alt_odb_entry: fix read over array bounds reported by valgrind · cb2912c3
      Heiko Voigt 提交于
      pfxlen can be longer than the path in objdir when relative_base
      contains the path to gits object directory.  Here we are interested
      in checking if ent->base[] (the part that corresponds to .git/objects)
      is the same string as objdir, and the code NUL-terminated ent->base[]
      to
      
      	LEADING PATH\0XX/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\0
      
      in preparation for these "duplicate check" step (before we return
      from the function, the first NUL is turned into '/' so that we can
      fill XX when probing for loose objects).  All we need to do is to
      compare the string with the path to our object directory.
      Signed-off-by: NHeiko Voigt <hvoigt@hvoigt.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      cb2912c3
  20. 15 5月, 2012 1 次提交
  21. 01 5月, 2012 2 次提交
  22. 08 3月, 2012 1 次提交
    • N
      parse_object: avoid putting whole blob in core · 090ea126
      Nguyễn Thái Ngọc Duy 提交于
      Traditionally, all the callers of check_sha1_signature() first
      called read_sha1_file() to prepare the whole object data in core,
      and called this function.  The function is used to revalidate what
      we read from the object database actually matches the object name we
      used to ask for the data from the object database.
      
      Update the API to allow callers to pass NULL as the object data, and
      have the function read and hash the object data using streaming API
      to recompute the object name, without having to hold everything in
      core at the same time.  This is most useful in parse_object() that
      parses a blob object, because this caller does not have to keep the
      actual blob data around in memory after a "struct blob" is returned.
      Signed-off-by: NNguyễn Thái Ngọc Duy <pclouds@gmail.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      090ea126
  23. 25 2月, 2012 1 次提交
    • J
      do not stream large files to pack when filters are in use · 4f22b101
      Jeff King 提交于
      Because git's object format requires us to specify the
      number of bytes in the object in its header, we must know
      the size before streaming a blob into the object database.
      This is not a problem when adding a regular file, as we can
      get the size from stat(). However, when filters are in use
      (such as autocrlf, or the ident, filter, or eol
      gitattributes), we have no idea what the ultimate size will
      be.
      
      The current code just punts on the whole issue and ignores
      filter configuration entirely for files larger than
      core.bigfilethreshold. This can generate confusing results
      if you use filters for large binary files, as the filter
      will suddenly stop working as the file goes over a certain
      size.  Rather than try to handle unknown input sizes with
      streaming, this patch just turns off the streaming
      optimization when filters are in use.
      
      This has a slight performance regression in a very specific
      case: if you have autocrlf on, but no gitattributes, a large
      binary file will avoid the streaming code path because we
      don't know beforehand whether it will need conversion or
      not. But if you are handling large binary files, you should
      be marking them as such via attributes (or at least not
      using autocrlf, and instead marking your text files as
      such). And the flip side is that if you have a large
      _non_-binary file, there is a correctness improvement;
      before we did not apply the conversion at all.
      
      The first half of the new t1051 script covers these failures
      on input. The second half tests the matching output code
      paths. These already work correctly, and do not need any
      adjustment.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      4f22b101
  24. 07 2月, 2012 1 次提交
    • M
      fsck: give accurate error message on empty loose object files · 33e42de0
      Matthieu Moy 提交于
      Since 3ba7a065 (A loose object is not corrupt if it
      cannot be read due to EMFILE), "git fsck" on a repository with an empty
      loose object file complains with the error message
      
        fatal: failed to read object <sha1>: Invalid argument
      
      This comes from a failure of mmap on this empty file, which sets errno to
      EINVAL. Instead of calling xmmap on empty file, we display a clean error
      message ourselves, and return a NULL pointer. The new message is
      
        error: object file .git/objects/09/<rest-of-sha1> is empty
        fatal: loose object <sha1> (stored in .git/objects/09/<rest-of-sha1>) is corrupt
      
      The second line was already there before the regression in 3ba7a065,
      and the first is an additional message, that should help diagnosing the
      problem for the user.
      Signed-off-by: NMatthieu Moy <Matthieu.Moy@imag.fr>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      33e42de0
  25. 02 2月, 2012 2 次提交
  26. 22 12月, 2011 1 次提交
    • Æ
      Appease Sun Studio by renaming "tmpfile" · ab1900a3
      Ævar Arnfjörð Bjarmason 提交于
      On Solaris the system headers define the "tmpfile" name, which'll
      cause Git compiled with Sun Studio 12 Update 1 to whine about us
      redefining the name:
      
          "pack-write.c", line 76: warning: name redefined by pragma redefine_extname declared static: tmpfile     (E_PRAGMA_REDEFINE_STATIC)
          "sha1_file.c", line 2455: warning: name redefined by pragma redefine_extname declared static: tmpfile    (E_PRAGMA_REDEFINE_STATIC)
          "fast-import.c", line 858: warning: name redefined by pragma redefine_extname declared static: tmpfile   (E_PRAGMA_REDEFINE_STATIC)
          "builtin/index-pack.c", line 175: warning: name redefined by pragma redefine_extname declared static: tmpfile    (E_PRAGMA_REDEFINE_STATIC)
      
      Just renaming the "tmpfile" variable to "tmp_file" in the relevant
      places is the easiest way to fix this.
      Signed-off-by: NÆvar Arnfjörð Bjarmason <avarab@gmail.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      ab1900a3
  27. 02 12月, 2011 1 次提交
  28. 16 11月, 2011 1 次提交