1. 07 Nov, 2011 11 commits
  2. 06 Nov, 2011 6 commits
    • refs: Partial rewrite for read-only refs · d4a0b124
      This new version of the references code is significantly faster and
      hopefully easier to read.
      
      External API stays the same. A new method `git_reference_reload()` has
      been added to force updating a memory reference from disk. In-memory
      references are no longer updated automagically -- this was killing us.
      
      If a reference is deleted externally and the user doesn't reload the
      memory object, nothing critical happens: any functions using that
      reference should fail gracefully (e.g. deletion, renaming, and so on).
      
      All generated references from the API are read only and must be free'd
      by the user. There is no reference counting and no traces of generated
      references are kept in the library.
      
      There is no longer an internal representation for references. There is
      only one reference struct `git_reference`, and symbolic/oid targets are
      stored inside an union.
      
      Packfile references are stored using an optimized struct with flex array
      for reference names. This should significantly reduce the memory cost of
      loading the packfile from disk.
      Vicent Marti committed
    • git_reference_rename: cleanup reference renaming · 549bbd13
      git_reference_rename() didn't properly cleanup old references given by
      the user to not break some ugly old tests. Since references don't point
      to libgit's internal cache anymore we can cleanup git_reference_rename()
      to be somewhat less messy.
      
      Signed-off-by: schu <schu-github@schulog.org>
      schu committed
    • Free all used references in the source tree · 75abd2b9
      Since references are not owned by the repository anymore we have to free
      them manually now.
      
      Signed-off-by: schu <schu-github@schulog.org>
      schu committed
    • refs: add test case checking "immutable" references · 4fd89fa0
      Signed-off-by: schu <schu-github@schulog.org>
      schu committed
    • refs: split internal and external references · a46ec457
      Currently libgit2 shares pointers to its internal reference cache with
      the user. This leads to several problems like invalidation of reference
      pointers when reordering the cache or manipulation of the cache from
      user side.
      
      Give each user its own git_reference instead of leaking the internal
      representation (struct reference).
      
      Add the following new API functions:
      
      	* git_reference_free
      	* git_reference_is_packed
      
      Signed-off-by: schu <schu-github@schulog.org>
      schu committed
  3. 05 Nov, 2011 1 commit
  4. 30 Oct, 2011 1 commit
    • test_helpers: do not rely on assert · ec907944
      The functions loose_object_mode and loose_object_dir_mode call stat
      inside an assert statement which isn't evaluated when compiling in
      Release mode (NDEBUG) and leads to failing tests. Replace it.
      
      Signed-off-by: schu <schu-github@schulog.org>
      schu committed
  5. 29 Oct, 2011 6 commits
  6. 28 Oct, 2011 2 commits
  7. 27 Oct, 2011 8 commits
  8. 24 Oct, 2011 3 commits
    • tests-clay: move t01-rawobj.c to clay · 9ff46db9
      Signed-off-by: schu <schu-github@schulog.org>
      schu committed
    • Merge pull request #464 from rtyley/development · c2fbe423
      Tolerate zlib deflation with window size < 32Kb
      Vicent Martí committed
    • Tolerate zlib deflation with window size < 32Kb · c51065e3
      libgit2 currently identifies loose objects as corrupt if they've been
      deflated using a window size less than 32Kb, because the
      is_zlib_compressed_data() function doesn't recognise the header
      byte as a zlib header. This patch makes the method tolerant of
      all valid window sizes (15-bit to 8-bit) - but doesn't sacrifice
      it's accuracy in distingushing the standard loose-object format
      from the experimental (now abandoned) format. It's based on a patch
      which has been merged into C-Git master branch:
      
      https://github.com/git/git/commit/7f684a2aff636f44a506
      
      On memory constrained systems zlib may use a much smaller window
      size - working on Agit, I found that Android uses a 4KB window;
      giving a header byte of 0x48, not 0x78. Consequently all loose
      objects generated by the Android platform appear 'corrupt' :(
      
      It might appear that this patch changes isStandardFormat() to the
      point where it could incorrectly identify the experimental format as
      the standard one, but the two criteria (bitmask & checksum) can only
      give a false result for an experimental object where both of the
      following are true:
      
      1) object size is exactly 8 bytes when uncompressed (bitmask)
      2) [single-byte in-pack git type&size header] * 256
         + [1st byte of the following zlib header] % 31 = 0 (checksum)
      
      As it happens, for all possible combinations of valid object type
      (1-4) and window bits (0-7), the only time when the checksum will be
      divisible by 31 is for 0x1838 - ie object type *1*, a Commit - which,
      due the fields all Commit objects must contain, could never be as
      small as 8 bytes in size.
      
      Given this, the combination of the two criteria (bitmask & checksum)
      always correctly determines the buffer format, and is more tolerant
      than the previous version.
      
      References:
      
      Android uses a 4KB window for deflation:
      http://android.git.kernel.org/?p=platform/libcore.git;a=blob;f=luni/src/main/native/java_util_zip_Deflater.cpp;h=c0b2feff196e63a7b85d97cf9ae5bb258
      
      Code snippet searching for false positives with the zlib checksum:
      https://gist.github.com/1118177
      
      Change-Id: Ifd84cd2bd6b46f087c9984fb4cbd8309f483dec0
      Roberto Tyley committed
  9. 22 Oct, 2011 1 commit
  10. 20 Oct, 2011 1 commit