rugged 1.1.1 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (277) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -0
  3. data/README.md +1 -1
  4. data/ext/rugged/rugged.c +7 -4
  5. data/ext/rugged/rugged_object.c +1 -1
  6. data/ext/rugged/rugged_repo.c +3 -3
  7. data/lib/rugged/repository.rb +2 -2
  8. data/lib/rugged/version.rb +1 -1
  9. data/vendor/libgit2/CMakeLists.txt +11 -6
  10. data/vendor/libgit2/COPYING +109 -1
  11. data/vendor/libgit2/cmake/Findfutimens.cmake +14 -0
  12. data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +4 -0
  13. data/vendor/libgit2/cmake/SelectHashes.cmake +1 -0
  14. data/vendor/libgit2/deps/chromium-zlib/CMakeLists.txt +101 -0
  15. data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +17 -5
  16. data/vendor/libgit2/deps/ntlmclient/crypt.h +14 -9
  17. data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.c +20 -20
  18. data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.h +3 -3
  19. data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.c +37 -36
  20. data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.h +4 -3
  21. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +178 -51
  22. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.h +74 -5
  23. data/vendor/libgit2/deps/ntlmclient/ntlm.c +150 -118
  24. data/vendor/libgit2/deps/ntlmclient/ntlm.h +13 -9
  25. data/vendor/libgit2/deps/ntlmclient/ntlmclient.h +16 -3
  26. data/vendor/libgit2/deps/ntlmclient/unicode.h +10 -4
  27. data/vendor/libgit2/deps/ntlmclient/unicode_builtin.c +16 -27
  28. data/vendor/libgit2/deps/ntlmclient/unicode_builtin.h +20 -0
  29. data/vendor/libgit2/deps/ntlmclient/unicode_iconv.c +28 -52
  30. data/vendor/libgit2/deps/ntlmclient/unicode_iconv.h +22 -0
  31. data/vendor/libgit2/include/git2/attr.h +89 -0
  32. data/vendor/libgit2/include/git2/blame.h +93 -42
  33. data/vendor/libgit2/include/git2/blob.h +14 -2
  34. data/vendor/libgit2/include/git2/branch.h +25 -0
  35. data/vendor/libgit2/include/git2/cert.h +42 -5
  36. data/vendor/libgit2/include/git2/checkout.h +28 -12
  37. data/vendor/libgit2/include/git2/commit.h +35 -19
  38. data/vendor/libgit2/include/git2/common.h +14 -4
  39. data/vendor/libgit2/include/git2/deprecated.h +206 -6
  40. data/vendor/libgit2/include/git2/diff.h +34 -19
  41. data/vendor/libgit2/include/git2/errors.h +6 -6
  42. data/vendor/libgit2/include/git2/filter.h +57 -17
  43. data/vendor/libgit2/include/git2/graph.h +20 -2
  44. data/vendor/libgit2/include/git2/index.h +2 -2
  45. data/vendor/libgit2/include/git2/odb.h +29 -0
  46. data/vendor/libgit2/include/git2/patch.h +8 -0
  47. data/vendor/libgit2/include/git2/rebase.h +25 -1
  48. data/vendor/libgit2/include/git2/refs.h +6 -2
  49. data/vendor/libgit2/include/git2/remote.h +59 -6
  50. data/vendor/libgit2/include/git2/revparse.h +5 -5
  51. data/vendor/libgit2/include/git2/status.h +115 -59
  52. data/vendor/libgit2/include/git2/submodule.h +9 -0
  53. data/vendor/libgit2/include/git2/sys/commit_graph.h +174 -0
  54. data/vendor/libgit2/include/git2/sys/filter.h +49 -28
  55. data/vendor/libgit2/include/git2/sys/midx.h +74 -0
  56. data/vendor/libgit2/include/git2/sys/odb_backend.h +7 -0
  57. data/vendor/libgit2/include/git2/sys/transport.h +1 -0
  58. data/vendor/libgit2/include/git2/tag.h +12 -0
  59. data/vendor/libgit2/include/git2/tree.h +0 -14
  60. data/vendor/libgit2/include/git2/types.h +9 -0
  61. data/vendor/libgit2/include/git2/version.h +4 -4
  62. data/vendor/libgit2/include/git2/worktree.h +1 -0
  63. data/vendor/libgit2/src/CMakeLists.txt +25 -4
  64. data/vendor/libgit2/src/alloc.c +21 -8
  65. data/vendor/libgit2/src/allocators/failalloc.c +92 -0
  66. data/vendor/libgit2/src/allocators/failalloc.h +23 -0
  67. data/vendor/libgit2/src/allocators/stdalloc.c +41 -10
  68. data/vendor/libgit2/src/allocators/win32_leakcheck.c +118 -0
  69. data/vendor/libgit2/src/allocators/{win32_crtdbg.h → win32_leakcheck.h} +3 -3
  70. data/vendor/libgit2/src/annotated_commit.c +21 -9
  71. data/vendor/libgit2/src/apply.c +16 -7
  72. data/vendor/libgit2/src/array.h +11 -11
  73. data/vendor/libgit2/src/attr.c +181 -74
  74. data/vendor/libgit2/src/attr_file.c +84 -39
  75. data/vendor/libgit2/src/attr_file.h +32 -11
  76. data/vendor/libgit2/src/attrcache.c +42 -37
  77. data/vendor/libgit2/src/attrcache.h +4 -5
  78. data/vendor/libgit2/src/blame.c +11 -5
  79. data/vendor/libgit2/src/blob.c +35 -24
  80. data/vendor/libgit2/src/branch.c +69 -17
  81. data/vendor/libgit2/src/buffer.c +334 -25
  82. data/vendor/libgit2/src/buffer.h +153 -2
  83. data/vendor/libgit2/src/cache.c +2 -2
  84. data/vendor/libgit2/src/cache.h +7 -7
  85. data/vendor/libgit2/src/cc-compat.h +10 -2
  86. data/vendor/libgit2/src/checkout.c +48 -26
  87. data/vendor/libgit2/src/cherrypick.c +6 -2
  88. data/vendor/libgit2/src/clone.c +41 -47
  89. data/vendor/libgit2/src/commit.c +41 -28
  90. data/vendor/libgit2/src/commit_graph.c +1209 -0
  91. data/vendor/libgit2/src/commit_graph.h +162 -0
  92. data/vendor/libgit2/src/commit_list.c +46 -0
  93. data/vendor/libgit2/src/commit_list.h +2 -0
  94. data/vendor/libgit2/src/common.h +25 -2
  95. data/vendor/libgit2/src/config.c +37 -15
  96. data/vendor/libgit2/src/config_cache.c +5 -3
  97. data/vendor/libgit2/src/config_file.c +16 -8
  98. data/vendor/libgit2/src/config_parse.c +4 -6
  99. data/vendor/libgit2/src/crlf.c +16 -6
  100. data/vendor/libgit2/src/date.c +4 -3
  101. data/vendor/libgit2/src/delta.c +1 -1
  102. data/vendor/libgit2/src/describe.c +6 -3
  103. data/vendor/libgit2/src/diff.c +11 -8
  104. data/vendor/libgit2/src/diff_driver.c +21 -17
  105. data/vendor/libgit2/src/diff_file.c +2 -6
  106. data/vendor/libgit2/src/diff_generate.c +46 -17
  107. data/vendor/libgit2/src/diff_print.c +19 -6
  108. data/vendor/libgit2/src/diff_stats.c +7 -5
  109. data/vendor/libgit2/src/diff_tform.c +9 -8
  110. data/vendor/libgit2/src/diff_xdiff.c +4 -2
  111. data/vendor/libgit2/src/diff_xdiff.h +1 -1
  112. data/vendor/libgit2/src/errors.c +24 -19
  113. data/vendor/libgit2/src/features.h.in +5 -1
  114. data/vendor/libgit2/src/fetch.c +5 -2
  115. data/vendor/libgit2/src/fetchhead.c +8 -4
  116. data/vendor/libgit2/src/filebuf.c +9 -7
  117. data/vendor/libgit2/src/filter.c +206 -110
  118. data/vendor/libgit2/src/filter.h +24 -5
  119. data/vendor/libgit2/src/futils.c +5 -5
  120. data/vendor/libgit2/src/futils.h +1 -1
  121. data/vendor/libgit2/src/graph.c +64 -9
  122. data/vendor/libgit2/src/hash/sha1/collisiondetect.c +3 -3
  123. data/vendor/libgit2/src/hash/sha1/common_crypto.c +3 -3
  124. data/vendor/libgit2/src/hash/sha1/generic.h +1 -1
  125. data/vendor/libgit2/src/hash/sha1/mbedtls.c +12 -12
  126. data/vendor/libgit2/src/hash/sha1/openssl.c +3 -3
  127. data/vendor/libgit2/src/hash/sha1/sha1dc/sha1.c +0 -2
  128. data/vendor/libgit2/src/hash/sha1/win32.c +15 -11
  129. data/vendor/libgit2/src/hash.c +16 -13
  130. data/vendor/libgit2/src/hash.h +1 -1
  131. data/vendor/libgit2/src/hashsig.c +23 -10
  132. data/vendor/libgit2/src/ident.c +13 -3
  133. data/vendor/libgit2/src/ignore.c +35 -19
  134. data/vendor/libgit2/src/index.c +106 -70
  135. data/vendor/libgit2/src/index.h +1 -1
  136. data/vendor/libgit2/src/indexer.c +31 -29
  137. data/vendor/libgit2/src/integer.h +64 -2
  138. data/vendor/libgit2/src/iterator.c +36 -24
  139. data/vendor/libgit2/src/iterator.h +1 -1
  140. data/vendor/libgit2/src/khash.h +2 -11
  141. data/vendor/libgit2/src/{settings.c → libgit2.c} +117 -50
  142. data/vendor/libgit2/src/libgit2.h +15 -0
  143. data/vendor/libgit2/src/mailmap.c +23 -10
  144. data/vendor/libgit2/src/map.h +3 -3
  145. data/vendor/libgit2/src/merge.c +70 -30
  146. data/vendor/libgit2/src/merge.h +2 -1
  147. data/vendor/libgit2/src/merge_driver.c +19 -13
  148. data/vendor/libgit2/src/merge_file.c +11 -3
  149. data/vendor/libgit2/src/message.c +3 -1
  150. data/vendor/libgit2/src/midx.c +471 -10
  151. data/vendor/libgit2/src/midx.h +28 -1
  152. data/vendor/libgit2/src/mwindow.c +103 -59
  153. data/vendor/libgit2/src/mwindow.h +3 -3
  154. data/vendor/libgit2/src/net.c +127 -3
  155. data/vendor/libgit2/src/net.h +16 -2
  156. data/vendor/libgit2/src/netops.c +6 -4
  157. data/vendor/libgit2/src/netops.h +2 -2
  158. data/vendor/libgit2/src/notes.c +10 -10
  159. data/vendor/libgit2/src/object.c +22 -14
  160. data/vendor/libgit2/src/odb.c +285 -48
  161. data/vendor/libgit2/src/odb.h +16 -2
  162. data/vendor/libgit2/src/odb_loose.c +28 -18
  163. data/vendor/libgit2/src/odb_mempack.c +1 -1
  164. data/vendor/libgit2/src/odb_pack.c +391 -114
  165. data/vendor/libgit2/src/oid.c +5 -4
  166. data/vendor/libgit2/src/pack-objects.c +54 -48
  167. data/vendor/libgit2/src/pack.c +329 -119
  168. data/vendor/libgit2/src/pack.h +25 -7
  169. data/vendor/libgit2/src/patch.c +14 -7
  170. data/vendor/libgit2/src/patch_generate.c +2 -2
  171. data/vendor/libgit2/src/patch_parse.c +2 -1
  172. data/vendor/libgit2/src/path.c +98 -53
  173. data/vendor/libgit2/src/path.h +79 -6
  174. data/vendor/libgit2/src/pathspec.c +8 -8
  175. data/vendor/libgit2/src/pool.c +13 -7
  176. data/vendor/libgit2/src/posix.c +11 -3
  177. data/vendor/libgit2/src/reader.c +10 -6
  178. data/vendor/libgit2/src/rebase.c +93 -49
  179. data/vendor/libgit2/src/refdb.c +30 -13
  180. data/vendor/libgit2/src/refdb_fs.c +121 -69
  181. data/vendor/libgit2/src/reflog.c +19 -14
  182. data/vendor/libgit2/src/refs.c +76 -41
  183. data/vendor/libgit2/src/refspec.c +32 -12
  184. data/vendor/libgit2/src/remote.c +272 -102
  185. data/vendor/libgit2/src/remote.h +2 -1
  186. data/vendor/libgit2/src/repository.c +176 -103
  187. data/vendor/libgit2/src/repository.h +12 -1
  188. data/vendor/libgit2/src/reset.c +7 -6
  189. data/vendor/libgit2/src/revert.c +6 -2
  190. data/vendor/libgit2/src/revparse.c +14 -9
  191. data/vendor/libgit2/src/revwalk.c +32 -15
  192. data/vendor/libgit2/src/runtime.c +162 -0
  193. data/vendor/libgit2/src/runtime.h +62 -0
  194. data/vendor/libgit2/src/settings.h +11 -0
  195. data/vendor/libgit2/src/signature.c +6 -5
  196. data/vendor/libgit2/src/sortedcache.h +10 -8
  197. data/vendor/libgit2/src/stash.c +3 -1
  198. data/vendor/libgit2/src/status.c +7 -4
  199. data/vendor/libgit2/src/strarray.c +2 -1
  200. data/vendor/libgit2/src/streams/mbedtls.c +14 -17
  201. data/vendor/libgit2/src/streams/mbedtls.h +1 -1
  202. data/vendor/libgit2/src/streams/openssl.c +101 -201
  203. data/vendor/libgit2/src/streams/openssl.h +9 -1
  204. data/vendor/libgit2/src/streams/openssl_dynamic.c +309 -0
  205. data/vendor/libgit2/src/streams/openssl_dynamic.h +348 -0
  206. data/vendor/libgit2/src/streams/openssl_legacy.c +203 -0
  207. data/vendor/libgit2/src/streams/openssl_legacy.h +63 -0
  208. data/vendor/libgit2/src/streams/registry.c +5 -6
  209. data/vendor/libgit2/src/streams/socket.c +6 -2
  210. data/vendor/libgit2/src/streams/stransport.c +6 -3
  211. data/vendor/libgit2/src/streams/tls.c +5 -3
  212. data/vendor/libgit2/src/submodule.c +128 -62
  213. data/vendor/libgit2/src/submodule.h +9 -9
  214. data/vendor/libgit2/src/sysdir.c +4 -6
  215. data/vendor/libgit2/src/tag.c +47 -11
  216. data/vendor/libgit2/src/thread.c +140 -0
  217. data/vendor/libgit2/src/thread.h +479 -0
  218. data/vendor/libgit2/src/threadstate.c +83 -0
  219. data/vendor/libgit2/src/threadstate.h +24 -0
  220. data/vendor/libgit2/src/trace.c +2 -2
  221. data/vendor/libgit2/src/trace.h +17 -13
  222. data/vendor/libgit2/src/transaction.c +19 -8
  223. data/vendor/libgit2/src/transport.c +3 -3
  224. data/vendor/libgit2/src/transports/auth.c +1 -1
  225. data/vendor/libgit2/src/transports/auth_negotiate.c +11 -4
  226. data/vendor/libgit2/src/transports/auth_ntlm.c +10 -6
  227. data/vendor/libgit2/src/transports/credential.c +15 -7
  228. data/vendor/libgit2/src/transports/git.c +1 -3
  229. data/vendor/libgit2/src/transports/http.c +19 -17
  230. data/vendor/libgit2/src/transports/http.h +1 -0
  231. data/vendor/libgit2/src/transports/httpclient.c +53 -26
  232. data/vendor/libgit2/src/transports/httpclient.h +1 -1
  233. data/vendor/libgit2/src/transports/local.c +3 -3
  234. data/vendor/libgit2/src/transports/smart.c +12 -7
  235. data/vendor/libgit2/src/transports/smart.h +1 -1
  236. data/vendor/libgit2/src/transports/smart_protocol.c +11 -5
  237. data/vendor/libgit2/src/transports/ssh.c +51 -17
  238. data/vendor/libgit2/src/transports/winhttp.c +41 -31
  239. data/vendor/libgit2/src/tree.c +100 -77
  240. data/vendor/libgit2/src/tree.h +1 -0
  241. data/vendor/libgit2/src/tsort.c +0 -2
  242. data/vendor/libgit2/src/unix/map.c +3 -1
  243. data/vendor/libgit2/src/unix/pthread.h +2 -1
  244. data/vendor/libgit2/src/utf8.c +150 -0
  245. data/vendor/libgit2/src/utf8.h +52 -0
  246. data/vendor/libgit2/src/util.c +53 -129
  247. data/vendor/libgit2/src/util.h +33 -39
  248. data/vendor/libgit2/src/vector.c +23 -19
  249. data/vendor/libgit2/src/vector.h +4 -2
  250. data/vendor/libgit2/src/win32/findfile.c +4 -2
  251. data/vendor/libgit2/src/win32/map.c +1 -1
  252. data/vendor/libgit2/src/win32/msvc-compat.h +9 -1
  253. data/vendor/libgit2/src/win32/path_w32.c +22 -24
  254. data/vendor/libgit2/src/win32/path_w32.h +0 -1
  255. data/vendor/libgit2/src/win32/posix_w32.c +7 -1
  256. data/vendor/libgit2/src/win32/precompiled.h +0 -1
  257. data/vendor/libgit2/src/win32/reparse.h +4 -4
  258. data/vendor/libgit2/src/win32/thread.c +24 -15
  259. data/vendor/libgit2/src/win32/thread.h +1 -1
  260. data/vendor/libgit2/src/win32/w32_buffer.c +3 -3
  261. data/vendor/libgit2/src/win32/w32_common.h +18 -9
  262. data/vendor/libgit2/src/win32/{w32_crtdbg_stacktrace.c → w32_leakcheck.c} +269 -33
  263. data/vendor/libgit2/src/win32/w32_leakcheck.h +222 -0
  264. data/vendor/libgit2/src/win32/w32_util.h +6 -6
  265. data/vendor/libgit2/src/worktree.c +27 -16
  266. data/vendor/libgit2/src/zstream.c +1 -1
  267. metadata +32 -16
  268. data/vendor/libgit2/src/allocators/win32_crtdbg.c +0 -118
  269. data/vendor/libgit2/src/buf_text.c +0 -316
  270. data/vendor/libgit2/src/buf_text.h +0 -122
  271. data/vendor/libgit2/src/global.c +0 -363
  272. data/vendor/libgit2/src/global.h +0 -41
  273. data/vendor/libgit2/src/thread-utils.c +0 -58
  274. data/vendor/libgit2/src/thread-utils.h +0 -369
  275. data/vendor/libgit2/src/win32/w32_crtdbg_stacktrace.h +0 -127
  276. data/vendor/libgit2/src/win32/w32_stack.c +0 -188
  277. data/vendor/libgit2/src/win32/w32_stack.h +0 -140
@@ -129,7 +129,8 @@ int git_merge__bases_many(
129
129
  git_commit_list **out,
130
130
  git_revwalk *walk,
131
131
  git_commit_list_node *one,
132
- git_vector *twos);
132
+ git_vector *twos,
133
+ uint32_t minimum_generation);
133
134
 
134
135
  /*
135
136
  * Three-way tree differencing
@@ -8,7 +8,7 @@
8
8
  #include "merge_driver.h"
9
9
 
10
10
  #include "vector.h"
11
- #include "global.h"
11
+ #include "runtime.h"
12
12
  #include "merge.h"
13
13
  #include "git2/merge.h"
14
14
  #include "git2/sys/merge.h"
@@ -32,33 +32,38 @@ static struct merge_driver_registry merge_driver_registry;
32
32
 
33
33
  static void git_merge_driver_global_shutdown(void);
34
34
 
35
- git_repository* git_merge_driver_source_repo(const git_merge_driver_source *src)
35
+ git_repository *git_merge_driver_source_repo(
36
+ const git_merge_driver_source *src)
36
37
  {
37
- assert(src);
38
+ GIT_ASSERT_ARG_WITH_RETVAL(src, NULL);
38
39
  return src->repo;
39
40
  }
40
41
 
41
- const git_index_entry* git_merge_driver_source_ancestor(const git_merge_driver_source *src)
42
+ const git_index_entry *git_merge_driver_source_ancestor(
43
+ const git_merge_driver_source *src)
42
44
  {
43
- assert(src);
45
+ GIT_ASSERT_ARG_WITH_RETVAL(src, NULL);
44
46
  return src->ancestor;
45
47
  }
46
48
 
47
- const git_index_entry* git_merge_driver_source_ours(const git_merge_driver_source *src)
49
+ const git_index_entry *git_merge_driver_source_ours(
50
+ const git_merge_driver_source *src)
48
51
  {
49
- assert(src);
52
+ GIT_ASSERT_ARG_WITH_RETVAL(src, NULL);
50
53
  return src->ours;
51
54
  }
52
55
 
53
- const git_index_entry* git_merge_driver_source_theirs(const git_merge_driver_source *src)
56
+ const git_index_entry *git_merge_driver_source_theirs(
57
+ const git_merge_driver_source *src)
54
58
  {
55
- assert(src);
59
+ GIT_ASSERT_ARG_WITH_RETVAL(src, NULL);
56
60
  return src->theirs;
57
61
  }
58
62
 
59
- const git_merge_file_options* git_merge_driver_source_file_options(const git_merge_driver_source *src)
63
+ const git_merge_file_options *git_merge_driver_source_file_options(
64
+ const git_merge_driver_source *src)
60
65
  {
61
- assert(src);
66
+ GIT_ASSERT_ARG_WITH_RETVAL(src, NULL);
62
67
  return src->file_opts;
63
68
  }
64
69
 
@@ -209,7 +214,7 @@ int git_merge_driver_global_init(void)
209
214
  merge_driver_name__binary, &git_merge_driver__binary)) < 0)
210
215
  goto done;
211
216
 
212
- git__on_shutdown(git_merge_driver_global_shutdown);
217
+ error = git_runtime_shutdown_register(git_merge_driver_global_shutdown);
213
218
 
214
219
  done:
215
220
  if (error < 0)
@@ -262,7 +267,8 @@ int git_merge_driver_register(const char *name, git_merge_driver *driver)
262
267
  {
263
268
  int error;
264
269
 
265
- assert(name && driver);
270
+ GIT_ASSERT_ARG(name);
271
+ GIT_ASSERT_ARG(driver);
266
272
 
267
273
  if (git_rwlock_wrlock(&merge_driver_registry.lock) < 0) {
268
274
  git_error_set(GIT_ERROR_OS, "failed to lock merge driver registry");
@@ -36,7 +36,10 @@ static int merge_file_input_from_index(
36
36
  {
37
37
  int error = 0;
38
38
 
39
- assert(input_out && odb_object_out && odb && entry);
39
+ GIT_ASSERT_ARG(input_out);
40
+ GIT_ASSERT_ARG(odb_object_out);
41
+ GIT_ASSERT_ARG(odb);
42
+ GIT_ASSERT_ARG(entry);
40
43
 
41
44
  if ((error = git_odb_read(odb_object_out, odb, &entry->id)) < 0)
42
45
  goto done;
@@ -241,7 +244,9 @@ int git_merge_file(
241
244
  {
242
245
  git_merge_file_input inputs[3] = { {0} };
243
246
 
244
- assert(out && ours && theirs);
247
+ GIT_ASSERT_ARG(out);
248
+ GIT_ASSERT_ARG(ours);
249
+ GIT_ASSERT_ARG(theirs);
245
250
 
246
251
  memset(out, 0x0, sizeof(git_merge_file_result));
247
252
 
@@ -268,7 +273,10 @@ int git_merge_file_from_index(
268
273
  git_odb_object *odb_object[3] = { 0 };
269
274
  int error = 0;
270
275
 
271
- assert(out && repo && ours && theirs);
276
+ GIT_ASSERT_ARG(out);
277
+ GIT_ASSERT_ARG(repo);
278
+ GIT_ASSERT_ARG(ours);
279
+ GIT_ASSERT_ARG(theirs);
272
280
 
273
281
  memset(out, 0x0, sizeof(git_merge_file_result));
274
282
 
@@ -28,8 +28,10 @@ int git_message_prettify(git_buf *message_out, const char *message, int strip_co
28
28
  int consecutive_empty_lines = 0;
29
29
  size_t i, line_length, rtrimmed_line_length;
30
30
  char *next_newline;
31
+ int error;
31
32
 
32
- git_buf_sanitize(message_out);
33
+ if ((error = git_buf_sanitize(message_out)) < 0)
34
+ return error;
33
35
 
34
36
  for (i = 0; i < strlen(message); i += line_length) {
35
37
  next_newline = memchr(message + i, '\n', message_len - i);
@@ -7,13 +7,15 @@
7
7
 
8
8
  #include "midx.h"
9
9
 
10
+ #include "array.h"
10
11
  #include "buffer.h"
12
+ #include "filebuf.h"
11
13
  #include "futils.h"
12
14
  #include "hash.h"
13
15
  #include "odb.h"
14
16
  #include "pack.h"
15
-
16
- #define GIT_MIDX_FILE_MODE 0444
17
+ #include "path.h"
18
+ #include "repository.h"
17
19
 
18
20
  #define MIDX_SIGNATURE 0x4d494458 /* "MIDX" */
19
21
  #define MIDX_VERSION 1
@@ -38,6 +40,8 @@ struct git_midx_chunk {
38
40
  size_t length;
39
41
  };
40
42
 
43
+ typedef int (*midx_write_cb)(const char *buf, size_t size, void *cb_data);
44
+
41
45
  static int midx_error(const char *message)
42
46
  {
43
47
  git_error_set(GIT_ERROR_ODB, "invalid multi-pack-index file - %s", message);
@@ -116,7 +120,7 @@ static int midx_parse_oid_lookup(
116
120
  return midx_error("missing OID Lookup chunk");
117
121
  if (chunk_oid_lookup->length == 0)
118
122
  return midx_error("empty OID Lookup chunk");
119
- if (chunk_oid_lookup->length != idx->num_objects * 20)
123
+ if (chunk_oid_lookup->length != idx->num_objects * GIT_OID_RAWSZ)
120
124
  return midx_error("OID Lookup chunk has wrong length");
121
125
 
122
126
  idx->oid_lookup = oid = (git_oid *)(data + chunk_oid_lookup->offset);
@@ -181,9 +185,9 @@ int git_midx_parse(
181
185
  chunk_object_offsets = {0},
182
186
  chunk_object_large_offsets = {0};
183
187
 
184
- assert(idx);
188
+ GIT_ASSERT_ARG(idx);
185
189
 
186
- if (size < sizeof(struct git_midx_header) + 20)
190
+ if (size < sizeof(struct git_midx_header) + GIT_OID_RAWSZ)
187
191
  return midx_error("multi-pack index is too short");
188
192
 
189
193
  hdr = ((struct git_midx_header *)data);
@@ -203,7 +207,7 @@ int git_midx_parse(
203
207
  last_chunk_offset =
204
208
  sizeof(struct git_midx_header) +
205
209
  (1 + hdr->chunks) * 12;
206
- trailer_offset = size - 20;
210
+ trailer_offset = size - GIT_OID_RAWSZ;
207
211
  if (trailer_offset < last_chunk_offset)
208
212
  return midx_error("wrong index size");
209
213
  git_oid_cpy(&idx->checksum, (git_oid *)(data + trailer_offset));
@@ -309,6 +313,10 @@ int git_midx_open(
309
313
  idx = git__calloc(1, sizeof(git_midx_file));
310
314
  GIT_ERROR_CHECK_ALLOC(idx);
311
315
 
316
+ error = git_buf_sets(&idx->filename, path);
317
+ if (error < 0)
318
+ return error;
319
+
312
320
  error = git_futils_mmap_ro(&idx->index_map, fd, 0, idx_size);
313
321
  p_close(fd);
314
322
  if (error < 0) {
@@ -325,6 +333,41 @@ int git_midx_open(
325
333
  return 0;
326
334
  }
327
335
 
336
+ bool git_midx_needs_refresh(
337
+ const git_midx_file *idx,
338
+ const char *path)
339
+ {
340
+ git_file fd = -1;
341
+ struct stat st;
342
+ ssize_t bytes_read;
343
+ git_oid idx_checksum = {{0}};
344
+
345
+ /* TODO: properly open the file without access time using O_NOATIME */
346
+ fd = git_futils_open_ro(path);
347
+ if (fd < 0)
348
+ return true;
349
+
350
+ if (p_fstat(fd, &st) < 0) {
351
+ p_close(fd);
352
+ return true;
353
+ }
354
+
355
+ if (!S_ISREG(st.st_mode) ||
356
+ !git__is_sizet(st.st_size) ||
357
+ (size_t)st.st_size != idx->index_map.len) {
358
+ p_close(fd);
359
+ return true;
360
+ }
361
+
362
+ bytes_read = p_pread(fd, &idx_checksum, GIT_OID_RAWSZ, st.st_size - GIT_OID_RAWSZ);
363
+ p_close(fd);
364
+
365
+ if (bytes_read != GIT_OID_RAWSZ)
366
+ return true;
367
+
368
+ return !git_oid_equal(&idx_checksum, &idx->checksum);
369
+ }
370
+
328
371
  int git_midx_entry_find(
329
372
  git_midx_entry *e,
330
373
  git_midx_file *idx,
@@ -338,12 +381,12 @@ int git_midx_entry_find(
338
381
  const unsigned char *object_offset;
339
382
  off64_t offset;
340
383
 
341
- assert(idx);
384
+ GIT_ASSERT_ARG(idx);
342
385
 
343
386
  hi = ntohl(idx->oid_fanout[(int)short_oid->id[0]]);
344
387
  lo = ((short_oid->id[0] == 0x0) ? 0 : ntohl(idx->oid_fanout[(int)short_oid->id[0] - 1]));
345
388
 
346
- pos = git_pack__lookup_sha1(idx->oid_lookup, 20, lo, hi, short_oid->id);
389
+ pos = git_pack__lookup_sha1(idx->oid_lookup, GIT_OID_RAWSZ, lo, hi, short_oid->id);
347
390
 
348
391
  if (pos >= 0) {
349
392
  /* An object matching exactly the oid was found */
@@ -399,13 +442,34 @@ int git_midx_entry_find(
399
442
  return 0;
400
443
  }
401
444
 
402
- void git_midx_close(git_midx_file *idx)
445
+ int git_midx_foreach_entry(
446
+ git_midx_file *idx,
447
+ git_odb_foreach_cb cb,
448
+ void *data)
403
449
  {
404
- assert(idx);
450
+ size_t i;
451
+ int error;
452
+
453
+ GIT_ASSERT_ARG(idx);
454
+
455
+ for (i = 0; i < idx->num_objects; ++i) {
456
+ if ((error = cb(&idx->oid_lookup[i], data)) != 0)
457
+ return git_error_set_after_callback(error);
458
+ }
459
+
460
+ return error;
461
+ }
462
+
463
+ int git_midx_close(git_midx_file *idx)
464
+ {
465
+ GIT_ASSERT_ARG(idx);
405
466
 
406
467
  if (idx->index_map.data)
407
468
  git_futils_mmap_free(&idx->index_map);
469
+
408
470
  git_vector_free(&idx->packfile_names);
471
+
472
+ return 0;
409
473
  }
410
474
 
411
475
  void git_midx_free(git_midx_file *idx)
@@ -413,6 +477,403 @@ void git_midx_free(git_midx_file *idx)
413
477
  if (!idx)
414
478
  return;
415
479
 
480
+ git_buf_dispose(&idx->filename);
416
481
  git_midx_close(idx);
417
482
  git__free(idx);
418
483
  }
484
+
485
+ static int packfile__cmp(const void *a_, const void *b_)
486
+ {
487
+ const struct git_pack_file *a = a_;
488
+ const struct git_pack_file *b = b_;
489
+
490
+ return strcmp(a->pack_name, b->pack_name);
491
+ }
492
+
493
+ int git_midx_writer_new(
494
+ git_midx_writer **out,
495
+ const char *pack_dir)
496
+ {
497
+ git_midx_writer *w = git__calloc(1, sizeof(git_midx_writer));
498
+ GIT_ERROR_CHECK_ALLOC(w);
499
+
500
+ if (git_buf_sets(&w->pack_dir, pack_dir) < 0) {
501
+ git__free(w);
502
+ return -1;
503
+ }
504
+ git_path_squash_slashes(&w->pack_dir);
505
+
506
+ if (git_vector_init(&w->packs, 0, packfile__cmp) < 0) {
507
+ git_buf_dispose(&w->pack_dir);
508
+ git__free(w);
509
+ return -1;
510
+ }
511
+
512
+ *out = w;
513
+ return 0;
514
+ }
515
+
516
+ void git_midx_writer_free(git_midx_writer *w)
517
+ {
518
+ struct git_pack_file *p;
519
+ size_t i;
520
+
521
+ if (!w)
522
+ return;
523
+
524
+ git_vector_foreach (&w->packs, i, p)
525
+ git_mwindow_put_pack(p);
526
+ git_vector_free(&w->packs);
527
+ git_buf_dispose(&w->pack_dir);
528
+ git__free(w);
529
+ }
530
+
531
+ int git_midx_writer_add(
532
+ git_midx_writer *w,
533
+ const char *idx_path)
534
+ {
535
+ git_buf idx_path_buf = GIT_BUF_INIT;
536
+ int error;
537
+ struct git_pack_file *p;
538
+
539
+ error = git_path_prettify(&idx_path_buf, idx_path, git_buf_cstr(&w->pack_dir));
540
+ if (error < 0)
541
+ return error;
542
+
543
+ error = git_mwindow_get_pack(&p, git_buf_cstr(&idx_path_buf));
544
+ git_buf_dispose(&idx_path_buf);
545
+ if (error < 0)
546
+ return error;
547
+
548
+ error = git_vector_insert(&w->packs, p);
549
+ if (error < 0) {
550
+ git_mwindow_put_pack(p);
551
+ return error;
552
+ }
553
+
554
+ return 0;
555
+ }
556
+
557
+ typedef git_array_t(git_midx_entry) object_entry_array_t;
558
+
559
+ struct object_entry_cb_state {
560
+ uint32_t pack_index;
561
+ object_entry_array_t *object_entries_array;
562
+ };
563
+
564
+ static int object_entry__cb(const git_oid *oid, off64_t offset, void *data)
565
+ {
566
+ struct object_entry_cb_state *state = (struct object_entry_cb_state *)data;
567
+
568
+ git_midx_entry *entry = git_array_alloc(*state->object_entries_array);
569
+ GIT_ERROR_CHECK_ALLOC(entry);
570
+
571
+ git_oid_cpy(&entry->sha1, oid);
572
+ entry->offset = offset;
573
+ entry->pack_index = state->pack_index;
574
+
575
+ return 0;
576
+ }
577
+
578
+ static int object_entry__cmp(const void *a_, const void *b_)
579
+ {
580
+ const git_midx_entry *a = (const git_midx_entry *)a_;
581
+ const git_midx_entry *b = (const git_midx_entry *)b_;
582
+
583
+ return git_oid_cmp(&a->sha1, &b->sha1);
584
+ }
585
+
586
+ static int write_offset(off64_t offset, midx_write_cb write_cb, void *cb_data)
587
+ {
588
+ int error;
589
+ uint32_t word;
590
+
591
+ word = htonl((uint32_t)((offset >> 32) & 0xffffffffu));
592
+ error = write_cb((const char *)&word, sizeof(word), cb_data);
593
+ if (error < 0)
594
+ return error;
595
+ word = htonl((uint32_t)((offset >> 0) & 0xffffffffu));
596
+ error = write_cb((const char *)&word, sizeof(word), cb_data);
597
+ if (error < 0)
598
+ return error;
599
+
600
+ return 0;
601
+ }
602
+
603
+ static int write_chunk_header(int chunk_id, off64_t offset, midx_write_cb write_cb, void *cb_data)
604
+ {
605
+ uint32_t word = htonl(chunk_id);
606
+ int error = write_cb((const char *)&word, sizeof(word), cb_data);
607
+ if (error < 0)
608
+ return error;
609
+ return write_offset(offset, write_cb, cb_data);
610
+
611
+ return 0;
612
+ }
613
+
614
+ static int midx_write_buf(const char *buf, size_t size, void *data)
615
+ {
616
+ git_buf *b = (git_buf *)data;
617
+ return git_buf_put(b, buf, size);
618
+ }
619
+
620
+ struct midx_write_hash_context {
621
+ midx_write_cb write_cb;
622
+ void *cb_data;
623
+ git_hash_ctx *ctx;
624
+ };
625
+
626
+ static int midx_write_hash(const char *buf, size_t size, void *data)
627
+ {
628
+ struct midx_write_hash_context *ctx = (struct midx_write_hash_context *)data;
629
+ int error;
630
+
631
+ error = git_hash_update(ctx->ctx, buf, size);
632
+ if (error < 0)
633
+ return error;
634
+
635
+ return ctx->write_cb(buf, size, ctx->cb_data);
636
+ }
637
+
638
+ static int midx_write(
639
+ git_midx_writer *w,
640
+ midx_write_cb write_cb,
641
+ void *cb_data)
642
+ {
643
+ int error = 0;
644
+ size_t i;
645
+ struct git_pack_file *p;
646
+ struct git_midx_header hdr = {0};
647
+ uint32_t oid_fanout_count;
648
+ uint32_t object_large_offsets_count;
649
+ uint32_t oid_fanout[256];
650
+ off64_t offset;
651
+ git_buf packfile_names = GIT_BUF_INIT,
652
+ oid_lookup = GIT_BUF_INIT,
653
+ object_offsets = GIT_BUF_INIT,
654
+ object_large_offsets = GIT_BUF_INIT;
655
+ git_oid idx_checksum = {{0}};
656
+ git_midx_entry *entry;
657
+ object_entry_array_t object_entries_array = GIT_ARRAY_INIT;
658
+ git_vector object_entries = GIT_VECTOR_INIT;
659
+ git_hash_ctx ctx;
660
+ struct midx_write_hash_context hash_cb_data = {0};
661
+
662
+ hdr.signature = htonl(MIDX_SIGNATURE);
663
+ hdr.version = MIDX_VERSION;
664
+ hdr.object_id_version = MIDX_OBJECT_ID_VERSION;
665
+ hdr.base_midx_files = 0;
666
+
667
+ hash_cb_data.write_cb = write_cb;
668
+ hash_cb_data.cb_data = cb_data;
669
+ hash_cb_data.ctx = &ctx;
670
+
671
+ error = git_hash_ctx_init(&ctx);
672
+ if (error < 0)
673
+ return error;
674
+ cb_data = &hash_cb_data;
675
+ write_cb = midx_write_hash;
676
+
677
+ git_vector_sort(&w->packs);
678
+ git_vector_foreach (&w->packs, i, p) {
679
+ git_buf relative_index = GIT_BUF_INIT;
680
+ struct object_entry_cb_state state = {0};
681
+ size_t path_len;
682
+
683
+ state.pack_index = (uint32_t)i;
684
+ state.object_entries_array = &object_entries_array;
685
+
686
+ error = git_buf_sets(&relative_index, p->pack_name);
687
+ if (error < 0)
688
+ goto cleanup;
689
+ error = git_path_make_relative(&relative_index, git_buf_cstr(&w->pack_dir));
690
+ if (error < 0) {
691
+ git_buf_dispose(&relative_index);
692
+ goto cleanup;
693
+ }
694
+ path_len = git_buf_len(&relative_index);
695
+ if (path_len <= strlen(".pack") || git__suffixcmp(git_buf_cstr(&relative_index), ".pack") != 0) {
696
+ git_buf_dispose(&relative_index);
697
+ git_error_set(GIT_ERROR_INVALID, "invalid packfile name: '%s'", p->pack_name);
698
+ error = -1;
699
+ goto cleanup;
700
+ }
701
+ path_len -= strlen(".pack");
702
+
703
+ git_buf_put(&packfile_names, git_buf_cstr(&relative_index), path_len);
704
+ git_buf_puts(&packfile_names, ".idx");
705
+ git_buf_putc(&packfile_names, '\0');
706
+ git_buf_dispose(&relative_index);
707
+
708
+ error = git_pack_foreach_entry_offset(p, object_entry__cb, &state);
709
+ if (error < 0)
710
+ goto cleanup;
711
+ }
712
+
713
+ /* Sort the object entries. */
714
+ error = git_vector_init(&object_entries, git_array_size(object_entries_array), object_entry__cmp);
715
+ if (error < 0)
716
+ goto cleanup;
717
+ git_array_foreach (object_entries_array, i, entry) {
718
+ if ((error = git_vector_set(NULL, &object_entries, i, entry)) < 0)
719
+ goto cleanup;
720
+ }
721
+ git_vector_set_sorted(&object_entries, 0);
722
+ git_vector_sort(&object_entries);
723
+ git_vector_uniq(&object_entries, NULL);
724
+
725
+ /* Pad the packfile names so it is a multiple of four. */
726
+ while (git_buf_len(&packfile_names) & 3)
727
+ git_buf_putc(&packfile_names, '\0');
728
+
729
+ /* Fill the OID Fanout table. */
730
+ oid_fanout_count = 0;
731
+ for (i = 0; i < 256; i++) {
732
+ while (oid_fanout_count < git_vector_length(&object_entries) &&
733
+ ((const git_midx_entry *)git_vector_get(&object_entries, oid_fanout_count))->sha1.id[0] <= i)
734
+ ++oid_fanout_count;
735
+ oid_fanout[i] = htonl(oid_fanout_count);
736
+ }
737
+
738
+ /* Fill the OID Lookup table. */
739
+ git_vector_foreach (&object_entries, i, entry) {
740
+ error = git_buf_put(&oid_lookup, (const char *)&entry->sha1, sizeof(entry->sha1));
741
+ if (error < 0)
742
+ goto cleanup;
743
+ }
744
+
745
+ /* Fill the Object Offsets and Object Large Offsets tables. */
746
+ object_large_offsets_count = 0;
747
+ git_vector_foreach (&object_entries, i, entry) {
748
+ uint32_t word;
749
+
750
+ word = htonl((uint32_t)entry->pack_index);
751
+ error = git_buf_put(&object_offsets, (const char *)&word, sizeof(word));
752
+ if (error < 0)
753
+ goto cleanup;
754
+ if (entry->offset >= 0x80000000l) {
755
+ word = htonl(0x80000000u | object_large_offsets_count++);
756
+ if ((error = write_offset(entry->offset, midx_write_buf, &object_large_offsets)) < 0)
757
+ goto cleanup;
758
+ } else {
759
+ word = htonl((uint32_t)entry->offset & 0x7fffffffu);
760
+ }
761
+
762
+ error = git_buf_put(&object_offsets, (const char *)&word, sizeof(word));
763
+ if (error < 0)
764
+ goto cleanup;
765
+ }
766
+
767
+ /* Write the header. */
768
+ hdr.packfiles = htonl((uint32_t)git_vector_length(&w->packs));
769
+ hdr.chunks = 4;
770
+ if (git_buf_len(&object_large_offsets) > 0)
771
+ hdr.chunks++;
772
+ error = write_cb((const char *)&hdr, sizeof(hdr), cb_data);
773
+ if (error < 0)
774
+ goto cleanup;
775
+
776
+ /* Write the chunk headers. */
777
+ offset = sizeof(hdr) + (hdr.chunks + 1) * 12;
778
+ error = write_chunk_header(MIDX_PACKFILE_NAMES_ID, offset, write_cb, cb_data);
779
+ if (error < 0)
780
+ goto cleanup;
781
+ offset += git_buf_len(&packfile_names);
782
+ error = write_chunk_header(MIDX_OID_FANOUT_ID, offset, write_cb, cb_data);
783
+ if (error < 0)
784
+ goto cleanup;
785
+ offset += sizeof(oid_fanout);
786
+ error = write_chunk_header(MIDX_OID_LOOKUP_ID, offset, write_cb, cb_data);
787
+ if (error < 0)
788
+ goto cleanup;
789
+ offset += git_buf_len(&oid_lookup);
790
+ error = write_chunk_header(MIDX_OBJECT_OFFSETS_ID, offset, write_cb, cb_data);
791
+ if (error < 0)
792
+ goto cleanup;
793
+ offset += git_buf_len(&object_offsets);
794
+ if (git_buf_len(&object_large_offsets) > 0) {
795
+ error = write_chunk_header(MIDX_OBJECT_LARGE_OFFSETS_ID, offset, write_cb, cb_data);
796
+ if (error < 0)
797
+ goto cleanup;
798
+ offset += git_buf_len(&object_large_offsets);
799
+ }
800
+ error = write_chunk_header(0, offset, write_cb, cb_data);
801
+ if (error < 0)
802
+ goto cleanup;
803
+
804
+ /* Write all the chunks. */
805
+ error = write_cb(git_buf_cstr(&packfile_names), git_buf_len(&packfile_names), cb_data);
806
+ if (error < 0)
807
+ goto cleanup;
808
+ error = write_cb((const char *)oid_fanout, sizeof(oid_fanout), cb_data);
809
+ if (error < 0)
810
+ goto cleanup;
811
+ error = write_cb(git_buf_cstr(&oid_lookup), git_buf_len(&oid_lookup), cb_data);
812
+ if (error < 0)
813
+ goto cleanup;
814
+ error = write_cb(git_buf_cstr(&object_offsets), git_buf_len(&object_offsets), cb_data);
815
+ if (error < 0)
816
+ goto cleanup;
817
+ error = write_cb(git_buf_cstr(&object_large_offsets), git_buf_len(&object_large_offsets), cb_data);
818
+ if (error < 0)
819
+ goto cleanup;
820
+
821
+ /* Finalize the checksum and write the trailer. */
822
+ error = git_hash_final(&idx_checksum, &ctx);
823
+ if (error < 0)
824
+ goto cleanup;
825
+ error = write_cb((const char *)&idx_checksum, sizeof(idx_checksum), cb_data);
826
+ if (error < 0)
827
+ goto cleanup;
828
+
829
+ cleanup:
830
+ git_array_clear(object_entries_array);
831
+ git_vector_free(&object_entries);
832
+ git_buf_dispose(&packfile_names);
833
+ git_buf_dispose(&oid_lookup);
834
+ git_buf_dispose(&object_offsets);
835
+ git_buf_dispose(&object_large_offsets);
836
+ git_hash_ctx_cleanup(&ctx);
837
+ return error;
838
+ }
839
+
840
+ static int midx_write_filebuf(const char *buf, size_t size, void *data)
841
+ {
842
+ git_filebuf *f = (git_filebuf *)data;
843
+ return git_filebuf_write(f, buf, size);
844
+ }
845
+
846
+ int git_midx_writer_commit(
847
+ git_midx_writer *w)
848
+ {
849
+ int error;
850
+ int filebuf_flags = GIT_FILEBUF_DO_NOT_BUFFER;
851
+ git_buf midx_path = GIT_BUF_INIT;
852
+ git_filebuf output = GIT_FILEBUF_INIT;
853
+
854
+ error = git_buf_joinpath(&midx_path, git_buf_cstr(&w->pack_dir), "multi-pack-index");
855
+ if (error < 0)
856
+ return error;
857
+
858
+ if (git_repository__fsync_gitdir)
859
+ filebuf_flags |= GIT_FILEBUF_FSYNC;
860
+ error = git_filebuf_open(&output, git_buf_cstr(&midx_path), filebuf_flags, 0644);
861
+ git_buf_dispose(&midx_path);
862
+ if (error < 0)
863
+ return error;
864
+
865
+ error = midx_write(w, midx_write_filebuf, &output);
866
+ if (error < 0) {
867
+ git_filebuf_cleanup(&output);
868
+ return error;
869
+ }
870
+
871
+ return git_filebuf_commit(&output);
872
+ }
873
+
874
+ int git_midx_writer_dump(
875
+ git_buf *midx,
876
+ git_midx_writer *w)
877
+ {
878
+ return midx_write(w, midx_write_buf, midx);
879
+ }