1. 08 1月, 2015 3 次提交
  2. 30 12月, 2014 1 次提交
    • J
      is_hfs_dotgit: loosen over-eager match of \u{..47} · 6aaf956b
      Jeff King 提交于
      Our is_hfs_dotgit function relies on the hackily-implemented
      next_hfs_char to give us the next character that an HFS+
      filename comparison would look at. It's hacky because it
      doesn't implement the full case-folding table of HFS+; it
      gives us just enough to see if the path matches ".git".
      
      At the end of next_hfs_char, we use tolower() to convert our
      32-bit code point to lowercase. Our tolower() implementation
      only takes an 8-bit char, though; it throws away the upper
      24 bits. This means we can't have any false negatives for
      is_hfs_dotgit. We only care about matching 7-bit ASCII
      characters in ".git", and we will correctly process 'G' or
      'g'.
      
      However, we _can_ have false positives. Because we throw
      away the upper bits, code point \u{0147} (for example) will
      look like 'G' and get downcased to 'g'. It's not known
      whether a sequence of code points whose truncation ends up
      as ".git" is meaningful in any language, but it does not
      hurt to be more accurate here. We can just pass out the full
      32-bit code point, and compare it manually to the upper and
      lowercase characters we care about.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      6aaf956b
  3. 18 12月, 2014 17 次提交
    • J
      Git 2.0.5 · 9a8c2b67
      Junio C Hamano 提交于
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      9a8c2b67
    • J
      Sync with v1.9.5 · 5e519fb8
      Junio C Hamano 提交于
      * maint-1.9:
        Git 1.9.5
        Git 1.8.5.6
        fsck: complain about NTFS ".git" aliases in trees
        read-cache: optionally disallow NTFS .git variants
        path: add is_ntfs_dotgit() helper
        fsck: complain about HFS+ ".git" aliases in trees
        read-cache: optionally disallow HFS+ .git variants
        utf8: add is_hfs_dotgit() helper
        fsck: notice .git case-insensitively
        t1450: refactor ".", "..", and ".git" fsck tests
        verify_dotfile(): reject .git case-insensitively
        read-tree: add tests for confusing paths like ".." and ".git"
        unpack-trees: propagate errors adding entries to the index
      5e519fb8
    • J
      Git 1.9.5 · 83332636
      Junio C Hamano 提交于
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      83332636
    • J
      Sync with v1.8.5.6 · 6898b797
      Junio C Hamano 提交于
      * maint-1.8.5:
        Git 1.8.5.6
        fsck: complain about NTFS ".git" aliases in trees
        read-cache: optionally disallow NTFS .git variants
        path: add is_ntfs_dotgit() helper
        fsck: complain about HFS+ ".git" aliases in trees
        read-cache: optionally disallow HFS+ .git variants
        utf8: add is_hfs_dotgit() helper
        fsck: notice .git case-insensitively
        t1450: refactor ".", "..", and ".git" fsck tests
        verify_dotfile(): reject .git case-insensitively
        read-tree: add tests for confusing paths like ".." and ".git"
        unpack-trees: propagate errors adding entries to the index
      6898b797
    • J
      Git 1.8.5.6 · 5c8213a7
      Junio C Hamano 提交于
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      5c8213a7
    • J
      Merge branch 'dotgit-case-maint-1.8.5' into maint-1.8.5 · 2aa91008
      Junio C Hamano 提交于
      * dotgit-case-maint-1.8.5:
        fsck: complain about NTFS ".git" aliases in trees
        read-cache: optionally disallow NTFS .git variants
        path: add is_ntfs_dotgit() helper
        fsck: complain about HFS+ ".git" aliases in trees
        read-cache: optionally disallow HFS+ .git variants
        utf8: add is_hfs_dotgit() helper
        fsck: notice .git case-insensitively
        t1450: refactor ".", "..", and ".git" fsck tests
        verify_dotfile(): reject .git case-insensitively
        read-tree: add tests for confusing paths like ".." and ".git"
        unpack-trees: propagate errors adding entries to the index
      2aa91008
    • J
      fsck: complain about NTFS ".git" aliases in trees · d08c13b9
      Johannes Schindelin 提交于
      Now that the index can block pathnames that can be mistaken
      to mean ".git" on NTFS and FAT32, it would be helpful for
      fsck to notice such problematic paths. This lets servers
      which use receive.fsckObjects block them before the damage
      spreads.
      
      Note that the fsck check is always on, even for systems
      without core.protectNTFS set. This is technically more
      restrictive than we need to be, as a set of users on ext4
      could happily use these odd filenames without caring about
      NTFS.
      
      However, on balance, it's helpful for all servers to block
      these (because the paths can be used for mischief, and
      servers which bother to fsck would want to stop the spread
      whether they are on NTFS themselves or not), and hardly
      anybody will be affected (because the blocked names are
      variants of .git or git~1, meaning mischief is almost
      certainly what the tree author had in mind).
      
      Ideally these would be controlled by a separate
      "fsck.protectNTFS" flag. However, it would be much nicer to
      be able to enable/disable _any_ fsck flag individually, and
      any scheme we choose should match such a system. Given the
      likelihood of anybody using such a path in practice, it is
      not unreasonable to wait until such a system materializes.
      Signed-off-by: NJohannes Schindelin <johannes.schindelin@gmx.de>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      d08c13b9
    • J
      read-cache: optionally disallow NTFS .git variants · 2b4c6efc
      Johannes Schindelin 提交于
      The point of disallowing ".git" in the index is that we
      would never want to accidentally overwrite files in the
      repository directory. But this means we need to respect the
      filesystem's idea of when two paths are equal. The prior
      commit added a helper to make such a comparison for NTFS
      and FAT32; let's use it in verify_path().
      
      We make this check optional for two reasons:
      
        1. It restricts the set of allowable filenames, which is
           unnecessary for people who are not on NTFS nor FAT32.
           In practice this probably doesn't matter, though, as
           the restricted names are rather obscure and almost
           certainly would never come up in practice.
      
        2. It has a minor performance penalty for every path we
           insert into the index.
      
      This patch ties the check to the core.protectNTFS config
      option. Though this is expected to be most useful on Windows,
      we allow it to be set everywhere, as NTFS may be mounted on
      other platforms. The variable does default to on for Windows,
      though.
      Signed-off-by: NJohannes Schindelin <johannes.schindelin@gmx.de>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      2b4c6efc
    • J
      path: add is_ntfs_dotgit() helper · 1d1d69bc
      Johannes Schindelin 提交于
      We do not allow paths with a ".git" component to be added to
      the index, as that would mean repository contents could
      overwrite our repository files. However, asking "is this
      path the same as .git" is not as simple as strcmp() on some
      filesystems.
      
      On NTFS (and FAT32), there exist so-called "short names" for
      backwards-compatibility: 8.3 compliant names that refer to the same files
      as their long names. As ".git" is not an 8.3 compliant name, a short name
      is generated automatically, typically "git~1".
      
      Depending on the Windows version, any combination of trailing spaces and
      periods are ignored, too, so that both "git~1." and ".git." still refer
      to the Git directory. The reason is that 8.3 stores file names shorter
      than 8 characters with trailing spaces. So literally, it does not matter
      for the short name whether it is padded with spaces or whether it is
      shorter than 8 characters, it is considered to be the exact same.
      
      The period is the separator between file name and file extension, and
      again, an empty extension consists just of spaces in 8.3 format. So
      technically, we would need only take care of the equivalent of this
      regex:
              (\.git {0,4}|git~1 {0,3})\. {0,3}
      
      However, there are indications that at least some Windows versions might
      be more lenient and accept arbitrary combinations of trailing spaces and
      periods and strip them out. So we're playing it real safe here. Besides,
      there can be little doubt about the intention behind using file names
      matching even the more lenient pattern specified above, therefore we
      should be fine with disallowing such patterns.
      
      Extra care is taken to catch names such as '.\\.git\\booh' because the
      backslash is marked as a directory separator only on Windows, and we want
      to use this new helper function also in fsck on other platforms.
      
      A big thank you goes to Ed Thomson and an unnamed Microsoft engineer for
      the detailed analysis performed to come up with the corresponding fixes
      for libgit2.
      
      This commit adds a function to detect whether a given file name can refer
      to the Git directory by mistake.
      Signed-off-by: NJohannes Schindelin <johannes.schindelin@gmx.de>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      1d1d69bc
    • J
      fsck: complain about HFS+ ".git" aliases in trees · a18fcc9f
      Jeff King 提交于
      Now that the index can block pathnames that case-fold to
      ".git" on HFS+, it would be helpful for fsck to notice such
      problematic paths. This lets servers which use
      receive.fsckObjects block them before the damage spreads.
      
      Note that the fsck check is always on, even for systems
      without core.protectHFS set. This is technically more
      restrictive than we need to be, as a set of users on ext4
      could happily use these odd filenames without caring about
      HFS+.
      
      However, on balance, it's helpful for all servers to block
      these (because the paths can be used for mischief, and
      servers which bother to fsck would want to stop the spread
      whether they are on HFS+ themselves or not), and hardly
      anybody will be affected (because the blocked names are
      variants of .git with invisible Unicode code-points mixed
      in, meaning mischief is almost certainly what the tree
      author had in mind).
      
      Ideally these would be controlled by a separate
      "fsck.protectHFS" flag. However, it would be much nicer to
      be able to enable/disable _any_ fsck flag individually, and
      any scheme we choose should match such a system. Given the
      likelihood of anybody using such a path in practice, it is
      not unreasonable to wait until such a system materializes.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      a18fcc9f
    • J
      read-cache: optionally disallow HFS+ .git variants · a42643aa
      Jeff King 提交于
      The point of disallowing ".git" in the index is that we
      would never want to accidentally overwrite files in the
      repository directory. But this means we need to respect the
      filesystem's idea of when two paths are equal. The prior
      commit added a helper to make such a comparison for HFS+;
      let's use it in verify_path.
      
      We make this check optional for two reasons:
      
        1. It restricts the set of allowable filenames, which is
           unnecessary for people who are not on HFS+. In practice
           this probably doesn't matter, though, as the restricted
           names are rather obscure and almost certainly would
           never come up in practice.
      
        2. It has a minor performance penalty for every path we
           insert into the index.
      
      This patch ties the check to the core.protectHFS config
      option. Though this is expected to be most useful on OS X,
      we allow it to be set everywhere, as HFS+ may be mounted on
      other platforms. The variable does default to on for OS X,
      though.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      a42643aa
    • J
      utf8: add is_hfs_dotgit() helper · 6162a1d3
      Jeff King 提交于
      We do not allow paths with a ".git" component to be added to
      the index, as that would mean repository contents could
      overwrite our repository files. However, asking "is this
      path the same as .git" is not as simple as strcmp() on some
      filesystems.
      
      HFS+'s case-folding does more than just fold uppercase into
      lowercase (which we already handle with strcasecmp). It may
      also skip past certain "ignored" Unicode code points, so
      that (for example) ".gi\u200ct" is mapped ot ".git".
      
      The full list of folds can be found in the tables at:
      
        https://www.opensource.apple.com/source/xnu/xnu-1504.15.3/bsd/hfs/hfscommon/Unicode/UCStringCompareData.h
      
      Implementing a full "is this path the same as that path"
      comparison would require us importing the whole set of
      tables.  However, what we want to do is much simpler: we
      only care about checking ".git". We know that 'G' is the
      only thing that folds to 'g', and so on, so we really only
      need to deal with the set of ignored code points, which is
      much smaller.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      6162a1d3
    • J
      fsck: notice .git case-insensitively · 76e86fc6
      Jeff King 提交于
      We complain about ".git" in a tree because it cannot be
      loaded into the index or checked out. Since we now also
      reject ".GIT" case-insensitively, fsck should notice the
      same, so that errors do not propagate.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      76e86fc6
    • J
      t1450: refactor ".", "..", and ".git" fsck tests · 450870cb
      Jeff King 提交于
      We check that fsck notices and complains about confusing
      paths in trees. However, there are a few shortcomings:
      
        1. We check only for these paths as file entries, not as
           intermediate paths (so ".git" and not ".git/foo").
      
        2. We check "." and ".." together, so it is possible that
           we notice only one and not the other.
      
        3. We repeat a lot of boilerplate.
      
      Let's use some loops to be more thorough in our testing, and
      still end up with shorter code.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      450870cb
    • J
      verify_dotfile(): reject .git case-insensitively · cc2fc7c2
      Jeff King 提交于
      We do not allow ".git" to enter into the index as a path
      component, because checking out the result to the working
      tree may causes confusion for subsequent git commands.
      However, on case-insensitive file systems, ".Git" or ".GIT"
      is the same. We should catch and prevent those, too.
      
      Note that technically we could allow this for repos on
      case-sensitive filesystems. But there's not much point. It's
      unlikely that anybody cares, and it creates a repository
      that is unexpectedly non-portable to other systems.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      cc2fc7c2
    • J
      read-tree: add tests for confusing paths like ".." and ".git" · 96b50cc1
      Jeff King 提交于
      We should prevent nonsense paths from entering the index in
      the first place, as they can cause confusing results if they
      are ever checked out into the working tree. We already do
      so, but we never tested it.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      96b50cc1
    • J
      unpack-trees: propagate errors adding entries to the index · 46169180
      Jeff King 提交于
      When unpack_trees tries to write an entry to the index,
      add_index_entry may report an error to stderr, but we ignore
      its return value. This leads to us returning a successful
      exit code for an operation that partially failed. Let's make
      sure to propagate this code.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      46169180
  4. 08 10月, 2014 3 次提交
  5. 31 7月, 2014 2 次提交
  6. 29 7月, 2014 10 次提交
    • J
      t4013: test diff-tree's --stdin commit formatting · d299e9e5
      Jeff King 提交于
      Once upon a time, git-log was just "rev-list | diff-tree",
      and we did not bother to test it separately. These days git-log
      is implemented internally, but we want to make sure that the
      rev-list to diff-tree pipeline continues to function. Let's
      add a basic sanity test.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      d299e9e5
    • J
      Merge branch 'jk/alloc-commit-id-maint' into maint · 5d7c37a1
      Junio C Hamano 提交于
      * jk/alloc-commit-id-maint:
        diff-tree: avoid lookup_unknown_object
        object_as_type: set commit index
        alloc: factor out commit index
        add object_as_type helper for casting objects
        parse_object_buffer: do not set object type
        move setting of object->type to alloc_* functions
        alloc: write out allocator definitions
        alloc.c: remove the alloc_raw_commit_node() function
      5d7c37a1
    • J
      diff-tree: avoid lookup_unknown_object · b794ebea
      Jeff King 提交于
      We generally want to avoid lookup_unknown_object, because it
      results in allocating more memory for the object than may be
      strictly necessary.
      
      In this case, it is used to check whether we have an
      already-parsed object before calling parse_object, to save
      us from reading the object from disk. Using lookup_object
      would be fine for that purpose, but we can take it a step
      further. Since this code was written, parse_object already
      learned the "check lookup_object" optimization, so we can
      simply call parse_object directly.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      b794ebea
    • J
      object_as_type: set commit index · 34dfe197
      Jeff King 提交于
      The point of the "index" field of struct commit is that
      every allocated commit would have one. It is supposed to be
      an invariant that whenever object->type is set to
      OBJ_COMMIT, we have a unique index.
      
      Commit 969eba63 (commit: push commit_index update into
      alloc_commit_node, 2014-06-10) covered this case for
      newly-allocated commits. However, we may also allocate an
      "unknown" object via lookup_unknown_object, and only later
      convert it to a commit. We must make sure that we set the
      commit index when we switch the type field.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      34dfe197
    • J
      alloc: factor out commit index · 5de7f500
      Jeff King 提交于
      We keep a static counter to set the commit index on newly
      allocated objects. However, since we also need to set the
      index on any_objects which are converted to commits, let's
      make the counter available as a public function.
      
      While we're moving it, let's make sure the counter is
      allocated as an unsigned integer to match the index field in
      "struct commit".
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      5de7f500
    • J
      add object_as_type helper for casting objects · c4ad00f8
      Jeff King 提交于
      When we call lookup_commit, lookup_tree, etc, the logic goes
      something like:
      
        1. Look for an existing object struct. If we don't have
           one, allocate and return a new one.
      
        2. Double check that any object we have is the expected
           type (and complain and return NULL otherwise).
      
        3. Convert an object with type OBJ_NONE (from a prior
           call to lookup_unknown_object) to the expected type.
      
      We can encapsulate steps 2 and 3 in a helper function which
      checks whether we have the expected object type, converts
      OBJ_NONE as appropriate, and returns the object.
      
      Not only does this shorten the code, but it also provides
      one central location for converting OBJ_NONE objects into
      objects of other types. Future patches will use that to
      enforce type-specific invariants.
      
      Since this is a refactoring, we would want it to behave
      exactly as the current code. It takes a little reasoning to
      see that this is the case:
      
        - for lookup_{commit,tree,etc} functions, we are just
          pulling steps 2 and 3 into a function that does the same
          thing.
      
        - for the call in peel_object, we currently only do step 3
          (but we want to consolidate it with the others, as
          mentioned above). However, step 2 is a noop here, as the
          surrounding conditional makes sure we have OBJ_NONE
          (which we want to keep to avoid an extraneous call to
          sha1_object_info).
      
        - for the call in lookup_commit_reference_gently, we are
          currently doing step 2 but not step 3. However, step 3
          is a noop here. The object we got will have just come
          from deref_tag, which must have figured out the type for
          each object in order to know when to stop peeling.
          Therefore the type will never be OBJ_NONE.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      c4ad00f8
    • J
      parse_object_buffer: do not set object type · fe0444b5
      Jeff King 提交于
      The only way that "obj" can be non-NULL is if it came from
      one of the lookup_* functions. These functions always ensure
      that the object has the expected type (and return NULL
      otherwise), so there is no need for us to set the type.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      fe0444b5
    • J
      move setting of object->type to alloc_* functions · fe24d396
      Jeff King 提交于
      The "struct object" type implements basic object
      polymorphism.  Individual instances are allocated as
      concrete types (or as a union type that can store any
      object), and a "struct object *" can be cast into its real
      type after examining its "type" enum.  This means it is
      dangerous to have a type field that does not match the
      allocation (e.g., setting the type field of a "struct blob"
      to "OBJ_COMMIT" would mean that a reader might read past the
      allocated memory).
      
      In most of the current code this is not a problem; the first
      thing we do after allocating an object is usually to set its
      type field by passing it to create_object. However, the
      virtual commits we create in merge-recursive.c do not ever
      get their type set. This does not seem to have caused
      problems in practice, though (presumably because we always
      pass around a "struct commit" pointer and never even look at
      the type).
      
      We can fix this oversight and also make it harder for future
      code to get it wrong by setting the type directly in the
      object allocation functions.
      
      This will also make it easier to fix problems with commit
      index allocation, as we know that any object allocated by
      alloc_commit_node will meet the invariant that an object
      with an OBJ_COMMIT type field will have a unique index
      number.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      fe24d396
    • J
      alloc: write out allocator definitions · 52604d71
      Jeff King 提交于
      Because the allocator functions for tree, blobs, etc are all
      very similar, we originally used a macro to avoid repeating
      ourselves. Since the prior commit, though, the heavy lifting
      is done by an inline helper function.  The macro does still
      save us a few lines, but at some readability cost.  It
      obfuscates the function definitions (and makes them hard to
      find via grep).
      
      Much worse, though, is the fact that it isn't used
      consistently for all allocators. Somebody coming later may
      be tempted to modify DEFINE_ALLOCATOR, but they would miss
      alloc_commit_node, which is treated specially.
      
      Let's just drop the macro and write everything out
      explicitly.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      52604d71
    • R
      alloc.c: remove the alloc_raw_commit_node() function · 8c3f3f28
      Ramsay Jones 提交于
      In order to encapsulate the setting of the unique commit index, commit
      969eba63 ("commit: push commit_index update into alloc_commit_node",
      10-06-2014) introduced a (logically private) intermediary allocator
      function. However, this function (alloc_raw_commit_node()) was declared
      as a public function, which undermines its entire purpose.
      
      Introduce an inline function, alloc_node(), which implements the main
      logic of the allocator used by DEFINE_ALLOCATOR, and redefine the macro
      in terms of the new function. In addition, use the new function in the
      implementation of the alloc_commit_node() allocator, rather than the
      intermediary allocator, which can now be removed.
      
      Noticed by sparse ("symbol 'alloc_raw_commit_node' was not declared.
      Should it be static?").
      Signed-off-by: NRamsay Jones <ramsay@ramsay1.demon.co.uk>
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      8c3f3f28
  7. 24 7月, 2014 3 次提交
  8. 23 7月, 2014 1 次提交