rugged 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (338) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -0
  3. data/README.md +3 -3
  4. data/ext/rugged/rugged.c +7 -4
  5. data/ext/rugged/rugged_commit.c +1 -1
  6. data/ext/rugged/rugged_config.c +1 -1
  7. data/ext/rugged/rugged_object.c +1 -1
  8. data/ext/rugged/rugged_remote.c +32 -2
  9. data/ext/rugged/rugged_repo.c +13 -3
  10. data/lib/rugged/commit.rb +17 -4
  11. data/lib/rugged/repository.rb +7 -8
  12. data/lib/rugged/submodule_collection.rb +4 -4
  13. data/lib/rugged/version.rb +1 -1
  14. data/vendor/libgit2/CMakeLists.txt +41 -74
  15. data/vendor/libgit2/COPYING +109 -1
  16. data/vendor/libgit2/cmake/{Modules/AddCFlagIfSupported.cmake → AddCFlagIfSupported.cmake} +0 -0
  17. data/vendor/libgit2/cmake/{Modules/EnableWarnings.cmake → EnableWarnings.cmake} +0 -0
  18. data/vendor/libgit2/cmake/{Modules/FindCoreFoundation.cmake → FindCoreFoundation.cmake} +0 -0
  19. data/vendor/libgit2/cmake/{Modules/FindGSSAPI.cmake → FindGSSAPI.cmake} +0 -0
  20. data/vendor/libgit2/cmake/{Modules/FindGSSFramework.cmake → FindGSSFramework.cmake} +0 -0
  21. data/vendor/libgit2/cmake/{Modules/FindHTTP_Parser.cmake → FindHTTP_Parser.cmake} +0 -0
  22. data/vendor/libgit2/cmake/{Modules/FindIconv.cmake → FindIconv.cmake} +0 -0
  23. data/vendor/libgit2/cmake/{Modules/FindPCRE.cmake → FindPCRE.cmake} +0 -0
  24. data/vendor/libgit2/cmake/{Modules/FindPCRE2.cmake → FindPCRE2.cmake} +0 -0
  25. data/vendor/libgit2/cmake/{Modules/FindPkgLibraries.cmake → FindPkgLibraries.cmake} +0 -0
  26. data/vendor/libgit2/cmake/{Modules/FindSecurity.cmake → FindSecurity.cmake} +0 -0
  27. data/vendor/libgit2/cmake/{Modules/FindStatNsec.cmake → FindStatNsec.cmake} +0 -0
  28. data/vendor/libgit2/cmake/Findfutimens.cmake +14 -0
  29. data/vendor/libgit2/cmake/{Modules/FindmbedTLS.cmake → FindmbedTLS.cmake} +0 -0
  30. data/vendor/libgit2/cmake/{Modules/IdeSplitSources.cmake → IdeSplitSources.cmake} +0 -0
  31. data/vendor/libgit2/cmake/{Modules/PkgBuildConfig.cmake → PkgBuildConfig.cmake} +0 -0
  32. data/vendor/libgit2/cmake/{Modules/SanitizeBool.cmake → SanitizeBool.cmake} +0 -0
  33. data/vendor/libgit2/cmake/{Modules/SelectGSSAPI.cmake → SelectGSSAPI.cmake} +18 -26
  34. data/vendor/libgit2/cmake/{Modules/SelectHTTPSBackend.cmake → SelectHTTPSBackend.cmake} +29 -32
  35. data/vendor/libgit2/cmake/{Modules/SelectHashes.cmake → SelectHashes.cmake} +21 -28
  36. data/vendor/libgit2/deps/chromium-zlib/CMakeLists.txt +101 -0
  37. data/vendor/libgit2/deps/http-parser/CMakeLists.txt +4 -3
  38. data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +24 -10
  39. data/vendor/libgit2/deps/ntlmclient/compat.h +0 -27
  40. data/vendor/libgit2/deps/ntlmclient/crypt.h +14 -9
  41. data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.c +20 -20
  42. data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.h +3 -3
  43. data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.c +37 -36
  44. data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.h +4 -3
  45. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +178 -51
  46. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.h +74 -5
  47. data/vendor/libgit2/deps/ntlmclient/ntlm.c +164 -135
  48. data/vendor/libgit2/deps/ntlmclient/ntlm.h +13 -9
  49. data/vendor/libgit2/deps/ntlmclient/ntlmclient.h +16 -3
  50. data/vendor/libgit2/deps/ntlmclient/unicode.h +10 -4
  51. data/vendor/libgit2/deps/ntlmclient/unicode_builtin.c +16 -27
  52. data/vendor/libgit2/deps/ntlmclient/unicode_builtin.h +20 -0
  53. data/vendor/libgit2/deps/ntlmclient/unicode_iconv.c +28 -52
  54. data/vendor/libgit2/deps/ntlmclient/unicode_iconv.h +22 -0
  55. data/vendor/libgit2/deps/ntlmclient/util.c +15 -1
  56. data/vendor/libgit2/deps/ntlmclient/util.h +2 -1
  57. data/vendor/libgit2/deps/pcre/LICENCE +93 -0
  58. data/vendor/libgit2/deps/pcre/pcre.h +2 -2
  59. data/vendor/libgit2/deps/pcre/pcre_compile.c +29 -17
  60. data/vendor/libgit2/deps/pcre/pcre_jit_compile.c +4 -4
  61. data/vendor/libgit2/deps/pcre/pcreposix.c +2 -3
  62. data/vendor/libgit2/deps/zlib/CMakeLists.txt +6 -5
  63. data/vendor/libgit2/deps/zlib/deflate.c +1 -0
  64. data/vendor/libgit2/include/git2/annotated_commit.h +1 -1
  65. data/vendor/libgit2/include/git2/apply.h +2 -0
  66. data/vendor/libgit2/include/git2/attr.h +89 -0
  67. data/vendor/libgit2/include/git2/blame.h +95 -42
  68. data/vendor/libgit2/include/git2/blob.h +31 -3
  69. data/vendor/libgit2/include/git2/branch.h +25 -0
  70. data/vendor/libgit2/include/git2/cert.h +42 -5
  71. data/vendor/libgit2/include/git2/checkout.h +28 -12
  72. data/vendor/libgit2/include/git2/commit.h +35 -19
  73. data/vendor/libgit2/include/git2/common.h +33 -6
  74. data/vendor/libgit2/include/git2/config.h +1 -1
  75. data/vendor/libgit2/include/git2/deprecated.h +248 -8
  76. data/vendor/libgit2/include/git2/diff.h +35 -20
  77. data/vendor/libgit2/include/git2/errors.h +8 -7
  78. data/vendor/libgit2/include/git2/filter.h +57 -17
  79. data/vendor/libgit2/include/git2/graph.h +20 -2
  80. data/vendor/libgit2/include/git2/index.h +4 -5
  81. data/vendor/libgit2/include/git2/indexer.h +2 -1
  82. data/vendor/libgit2/include/git2/odb.h +44 -20
  83. data/vendor/libgit2/include/git2/pack.h +1 -1
  84. data/vendor/libgit2/include/git2/patch.h +8 -0
  85. data/vendor/libgit2/include/git2/rebase.h +25 -1
  86. data/vendor/libgit2/include/git2/refs.h +9 -5
  87. data/vendor/libgit2/include/git2/remote.h +59 -6
  88. data/vendor/libgit2/include/git2/repository.h +95 -52
  89. data/vendor/libgit2/include/git2/revparse.h +5 -5
  90. data/vendor/libgit2/include/git2/status.h +115 -59
  91. data/vendor/libgit2/include/git2/strarray.h +6 -10
  92. data/vendor/libgit2/include/git2/submodule.h +9 -0
  93. data/vendor/libgit2/include/git2/sys/commit_graph.h +174 -0
  94. data/vendor/libgit2/include/git2/sys/filter.h +49 -28
  95. data/vendor/libgit2/include/git2/sys/midx.h +74 -0
  96. data/vendor/libgit2/include/git2/sys/odb_backend.h +7 -0
  97. data/vendor/libgit2/include/git2/sys/transport.h +1 -0
  98. data/vendor/libgit2/include/git2/tag.h +12 -0
  99. data/vendor/libgit2/include/git2/transport.h +1 -1
  100. data/vendor/libgit2/include/git2/tree.h +2 -14
  101. data/vendor/libgit2/include/git2/types.h +9 -0
  102. data/vendor/libgit2/include/git2/version.h +3 -3
  103. data/vendor/libgit2/include/git2/worktree.h +1 -0
  104. data/vendor/libgit2/src/CMakeLists.txt +77 -44
  105. data/vendor/libgit2/src/alloc.c +21 -8
  106. data/vendor/libgit2/src/allocators/failalloc.c +92 -0
  107. data/vendor/libgit2/src/allocators/failalloc.h +23 -0
  108. data/vendor/libgit2/src/allocators/stdalloc.c +41 -10
  109. data/vendor/libgit2/src/allocators/win32_leakcheck.c +118 -0
  110. data/vendor/libgit2/src/allocators/{win32_crtdbg.h → win32_leakcheck.h} +3 -3
  111. data/vendor/libgit2/src/annotated_commit.c +21 -9
  112. data/vendor/libgit2/src/apply.c +21 -8
  113. data/vendor/libgit2/src/array.h +11 -11
  114. data/vendor/libgit2/src/assert_safe.h +58 -0
  115. data/vendor/libgit2/src/attr.c +181 -74
  116. data/vendor/libgit2/src/attr_file.c +92 -42
  117. data/vendor/libgit2/src/attr_file.h +32 -11
  118. data/vendor/libgit2/src/attrcache.c +44 -40
  119. data/vendor/libgit2/src/attrcache.h +4 -5
  120. data/vendor/libgit2/src/blame.c +28 -15
  121. data/vendor/libgit2/src/blame_git.c +6 -3
  122. data/vendor/libgit2/src/blob.c +46 -24
  123. data/vendor/libgit2/src/branch.c +87 -37
  124. data/vendor/libgit2/src/buffer.c +339 -27
  125. data/vendor/libgit2/src/buffer.h +153 -2
  126. data/vendor/libgit2/src/cache.c +3 -24
  127. data/vendor/libgit2/src/cache.h +7 -7
  128. data/vendor/libgit2/src/cc-compat.h +10 -2
  129. data/vendor/libgit2/src/checkout.c +97 -98
  130. data/vendor/libgit2/src/cherrypick.c +8 -2
  131. data/vendor/libgit2/src/clone.c +104 -29
  132. data/vendor/libgit2/src/commit.c +41 -28
  133. data/vendor/libgit2/src/commit_graph.c +1209 -0
  134. data/vendor/libgit2/src/commit_graph.h +162 -0
  135. data/vendor/libgit2/src/commit_list.c +46 -0
  136. data/vendor/libgit2/src/commit_list.h +2 -0
  137. data/vendor/libgit2/src/common.h +26 -2
  138. data/vendor/libgit2/src/config.c +40 -22
  139. data/vendor/libgit2/src/config_cache.c +9 -4
  140. data/vendor/libgit2/src/config_entries.c +35 -27
  141. data/vendor/libgit2/src/config_file.c +25 -8
  142. data/vendor/libgit2/src/config_parse.c +5 -7
  143. data/vendor/libgit2/src/config_snapshot.c +2 -1
  144. data/vendor/libgit2/src/crlf.c +16 -6
  145. data/vendor/libgit2/src/date.c +4 -3
  146. data/vendor/libgit2/src/delta.c +1 -1
  147. data/vendor/libgit2/src/describe.c +11 -4
  148. data/vendor/libgit2/src/diff.c +23 -19
  149. data/vendor/libgit2/src/diff_driver.c +21 -17
  150. data/vendor/libgit2/src/diff_file.c +5 -7
  151. data/vendor/libgit2/src/diff_generate.c +56 -28
  152. data/vendor/libgit2/src/diff_parse.c +2 -3
  153. data/vendor/libgit2/src/diff_print.c +81 -65
  154. data/vendor/libgit2/src/diff_stats.c +19 -16
  155. data/vendor/libgit2/src/diff_tform.c +13 -13
  156. data/vendor/libgit2/src/diff_xdiff.c +4 -2
  157. data/vendor/libgit2/src/diff_xdiff.h +1 -1
  158. data/vendor/libgit2/src/errors.c +26 -19
  159. data/vendor/libgit2/src/features.h.in +5 -1
  160. data/vendor/libgit2/src/fetch.c +7 -2
  161. data/vendor/libgit2/src/fetchhead.c +8 -4
  162. data/vendor/libgit2/src/filebuf.c +9 -7
  163. data/vendor/libgit2/src/filter.c +209 -113
  164. data/vendor/libgit2/src/filter.h +24 -5
  165. data/vendor/libgit2/src/futils.c +8 -8
  166. data/vendor/libgit2/src/futils.h +4 -4
  167. data/vendor/libgit2/src/graph.c +64 -9
  168. data/vendor/libgit2/src/hash/sha1/collisiondetect.c +3 -3
  169. data/vendor/libgit2/src/hash/sha1/common_crypto.c +3 -3
  170. data/vendor/libgit2/src/hash/sha1/generic.h +1 -1
  171. data/vendor/libgit2/src/hash/sha1/mbedtls.c +12 -12
  172. data/vendor/libgit2/src/hash/sha1/openssl.c +3 -3
  173. data/vendor/libgit2/src/hash/sha1/sha1dc/sha1.c +0 -2
  174. data/vendor/libgit2/src/hash/sha1/win32.c +15 -11
  175. data/vendor/libgit2/src/hash.c +16 -13
  176. data/vendor/libgit2/src/hash.h +1 -1
  177. data/vendor/libgit2/src/hashsig.c +23 -10
  178. data/vendor/libgit2/src/ident.c +13 -3
  179. data/vendor/libgit2/src/idxmap.c +0 -22
  180. data/vendor/libgit2/src/ignore.c +35 -19
  181. data/vendor/libgit2/src/index.c +126 -84
  182. data/vendor/libgit2/src/index.h +1 -1
  183. data/vendor/libgit2/src/indexer.c +60 -36
  184. data/vendor/libgit2/src/integer.h +79 -2
  185. data/vendor/libgit2/src/iterator.c +40 -28
  186. data/vendor/libgit2/src/iterator.h +1 -1
  187. data/vendor/libgit2/src/khash.h +2 -11
  188. data/vendor/libgit2/src/{settings.c → libgit2.c} +125 -49
  189. data/vendor/libgit2/src/libgit2.h +15 -0
  190. data/vendor/libgit2/src/mailmap.c +23 -10
  191. data/vendor/libgit2/src/map.h +3 -3
  192. data/vendor/libgit2/src/merge.c +108 -46
  193. data/vendor/libgit2/src/merge.h +2 -1
  194. data/vendor/libgit2/src/merge_driver.c +19 -13
  195. data/vendor/libgit2/src/merge_file.c +15 -9
  196. data/vendor/libgit2/src/message.c +3 -1
  197. data/vendor/libgit2/src/midx.c +879 -0
  198. data/vendor/libgit2/src/midx.h +110 -0
  199. data/vendor/libgit2/src/mwindow.c +214 -95
  200. data/vendor/libgit2/src/mwindow.h +3 -3
  201. data/vendor/libgit2/src/net.c +133 -4
  202. data/vendor/libgit2/src/net.h +16 -2
  203. data/vendor/libgit2/src/netops.c +6 -4
  204. data/vendor/libgit2/src/netops.h +2 -2
  205. data/vendor/libgit2/src/notes.c +10 -10
  206. data/vendor/libgit2/src/object.c +24 -15
  207. data/vendor/libgit2/src/odb.c +298 -57
  208. data/vendor/libgit2/src/odb.h +16 -2
  209. data/vendor/libgit2/src/odb_loose.c +31 -21
  210. data/vendor/libgit2/src/odb_mempack.c +3 -1
  211. data/vendor/libgit2/src/odb_pack.c +391 -114
  212. data/vendor/libgit2/src/oid.c +7 -4
  213. data/vendor/libgit2/src/pack-objects.c +83 -69
  214. data/vendor/libgit2/src/pack.c +383 -150
  215. data/vendor/libgit2/src/pack.h +44 -9
  216. data/vendor/libgit2/src/patch.c +14 -7
  217. data/vendor/libgit2/src/patch_generate.c +3 -5
  218. data/vendor/libgit2/src/patch_parse.c +6 -3
  219. data/vendor/libgit2/src/path.c +102 -57
  220. data/vendor/libgit2/src/path.h +79 -6
  221. data/vendor/libgit2/src/pathspec.c +12 -11
  222. data/vendor/libgit2/src/pool.c +34 -22
  223. data/vendor/libgit2/src/pool.h +9 -1
  224. data/vendor/libgit2/src/posix.c +43 -12
  225. data/vendor/libgit2/src/posix.h +9 -0
  226. data/vendor/libgit2/src/proxy.c +2 -0
  227. data/vendor/libgit2/src/push.c +2 -0
  228. data/vendor/libgit2/src/reader.c +10 -6
  229. data/vendor/libgit2/src/rebase.c +95 -49
  230. data/vendor/libgit2/src/refdb.c +165 -13
  231. data/vendor/libgit2/src/refdb.h +69 -0
  232. data/vendor/libgit2/src/refdb_fs.c +144 -152
  233. data/vendor/libgit2/src/reflog.c +21 -20
  234. data/vendor/libgit2/src/refs.c +151 -231
  235. data/vendor/libgit2/src/refs.h +2 -20
  236. data/vendor/libgit2/src/refspec.c +80 -44
  237. data/vendor/libgit2/src/regexp.c +2 -2
  238. data/vendor/libgit2/src/remote.c +312 -121
  239. data/vendor/libgit2/src/remote.h +2 -1
  240. data/vendor/libgit2/src/repository.c +351 -189
  241. data/vendor/libgit2/src/repository.h +23 -29
  242. data/vendor/libgit2/src/reset.c +7 -6
  243. data/vendor/libgit2/src/revert.c +8 -2
  244. data/vendor/libgit2/src/revparse.c +19 -13
  245. data/vendor/libgit2/src/revwalk.c +35 -20
  246. data/vendor/libgit2/src/runtime.c +162 -0
  247. data/vendor/libgit2/src/runtime.h +62 -0
  248. data/vendor/libgit2/src/{refdb_fs.h → settings.h} +3 -11
  249. data/vendor/libgit2/src/signature.c +6 -5
  250. data/vendor/libgit2/src/sortedcache.c +2 -3
  251. data/vendor/libgit2/src/sortedcache.h +10 -8
  252. data/vendor/libgit2/src/stash.c +7 -3
  253. data/vendor/libgit2/src/status.c +9 -4
  254. data/vendor/libgit2/src/strarray.c +64 -0
  255. data/vendor/libgit2/src/streams/mbedtls.c +14 -17
  256. data/vendor/libgit2/src/streams/mbedtls.h +1 -1
  257. data/vendor/libgit2/src/streams/openssl.c +113 -207
  258. data/vendor/libgit2/src/streams/openssl.h +9 -1
  259. data/vendor/libgit2/src/streams/openssl_dynamic.c +309 -0
  260. data/vendor/libgit2/src/streams/openssl_dynamic.h +348 -0
  261. data/vendor/libgit2/src/streams/openssl_legacy.c +203 -0
  262. data/vendor/libgit2/src/streams/openssl_legacy.h +63 -0
  263. data/vendor/libgit2/src/streams/registry.c +10 -9
  264. data/vendor/libgit2/src/streams/socket.c +6 -2
  265. data/vendor/libgit2/src/streams/stransport.c +6 -3
  266. data/vendor/libgit2/src/streams/tls.c +5 -3
  267. data/vendor/libgit2/src/submodule.c +134 -66
  268. data/vendor/libgit2/src/submodule.h +9 -9
  269. data/vendor/libgit2/src/sysdir.c +8 -26
  270. data/vendor/libgit2/src/sysdir.h +0 -11
  271. data/vendor/libgit2/src/tag.c +49 -11
  272. data/vendor/libgit2/src/thread.c +140 -0
  273. data/vendor/libgit2/src/thread.h +479 -0
  274. data/vendor/libgit2/src/threadstate.c +83 -0
  275. data/vendor/libgit2/src/threadstate.h +24 -0
  276. data/vendor/libgit2/src/trace.c +2 -2
  277. data/vendor/libgit2/src/trace.h +17 -13
  278. data/vendor/libgit2/src/transaction.c +21 -9
  279. data/vendor/libgit2/src/transport.c +3 -3
  280. data/vendor/libgit2/src/transports/auth.c +1 -1
  281. data/vendor/libgit2/src/transports/auth_negotiate.c +11 -4
  282. data/vendor/libgit2/src/transports/auth_ntlm.c +10 -6
  283. data/vendor/libgit2/src/transports/credential.c +17 -7
  284. data/vendor/libgit2/src/transports/credential_helpers.c +2 -0
  285. data/vendor/libgit2/src/transports/git.c +1 -3
  286. data/vendor/libgit2/src/transports/http.c +19 -17
  287. data/vendor/libgit2/src/transports/http.h +1 -0
  288. data/vendor/libgit2/src/transports/httpclient.c +84 -42
  289. data/vendor/libgit2/src/transports/httpclient.h +1 -1
  290. data/vendor/libgit2/src/transports/local.c +5 -5
  291. data/vendor/libgit2/src/transports/smart.c +14 -9
  292. data/vendor/libgit2/src/transports/smart.h +1 -1
  293. data/vendor/libgit2/src/transports/smart_protocol.c +11 -5
  294. data/vendor/libgit2/src/transports/ssh.c +51 -17
  295. data/vendor/libgit2/src/transports/winhttp.c +156 -88
  296. data/vendor/libgit2/src/tree.c +100 -77
  297. data/vendor/libgit2/src/tree.h +1 -0
  298. data/vendor/libgit2/src/tsort.c +0 -2
  299. data/vendor/libgit2/src/unix/map.c +3 -1
  300. data/vendor/libgit2/src/unix/posix.h +16 -1
  301. data/vendor/libgit2/src/unix/pthread.h +2 -1
  302. data/vendor/libgit2/src/utf8.c +150 -0
  303. data/vendor/libgit2/src/utf8.h +52 -0
  304. data/vendor/libgit2/src/util.c +74 -183
  305. data/vendor/libgit2/src/util.h +33 -39
  306. data/vendor/libgit2/src/vector.c +23 -19
  307. data/vendor/libgit2/src/vector.h +4 -2
  308. data/vendor/libgit2/src/win32/findfile.c +4 -2
  309. data/vendor/libgit2/src/win32/git2.rc +18 -3
  310. data/vendor/libgit2/src/win32/map.c +1 -1
  311. data/vendor/libgit2/src/win32/msvc-compat.h +9 -1
  312. data/vendor/libgit2/src/win32/path_w32.c +23 -25
  313. data/vendor/libgit2/src/win32/path_w32.h +0 -1
  314. data/vendor/libgit2/src/win32/posix_w32.c +77 -1
  315. data/vendor/libgit2/src/win32/precompiled.h +0 -1
  316. data/vendor/libgit2/src/win32/reparse.h +4 -4
  317. data/vendor/libgit2/src/win32/thread.c +24 -15
  318. data/vendor/libgit2/src/win32/thread.h +1 -1
  319. data/vendor/libgit2/src/win32/w32_buffer.c +3 -3
  320. data/vendor/libgit2/src/win32/w32_common.h +18 -9
  321. data/vendor/libgit2/src/win32/{w32_crtdbg_stacktrace.c → w32_leakcheck.c} +269 -33
  322. data/vendor/libgit2/src/win32/w32_leakcheck.h +222 -0
  323. data/vendor/libgit2/src/win32/w32_util.h +6 -6
  324. data/vendor/libgit2/src/worktree.c +37 -15
  325. data/vendor/libgit2/src/zstream.c +1 -1
  326. metadata +56 -38
  327. data/vendor/libgit2/cmake/Modules/CheckPrototypeDefinition.c.in +0 -29
  328. data/vendor/libgit2/cmake/Modules/CheckPrototypeDefinition.cmake +0 -96
  329. data/vendor/libgit2/src/allocators/win32_crtdbg.c +0 -118
  330. data/vendor/libgit2/src/buf_text.c +0 -316
  331. data/vendor/libgit2/src/buf_text.h +0 -122
  332. data/vendor/libgit2/src/global.c +0 -361
  333. data/vendor/libgit2/src/global.h +0 -41
  334. data/vendor/libgit2/src/thread-utils.c +0 -58
  335. data/vendor/libgit2/src/thread-utils.h +0 -246
  336. data/vendor/libgit2/src/win32/w32_crtdbg_stacktrace.h +0 -127
  337. data/vendor/libgit2/src/win32/w32_stack.c +0 -188
  338. data/vendor/libgit2/src/win32/w32_stack.h +0 -140
@@ -51,6 +51,7 @@ typedef enum {
51
51
  GIT_CONFIGMAP_PROTECTHFS, /* core.protectHFS */
52
52
  GIT_CONFIGMAP_PROTECTNTFS, /* core.protectNTFS */
53
53
  GIT_CONFIGMAP_FSYNCOBJECTFILES, /* core.fsyncObjectFiles */
54
+ GIT_CONFIGMAP_LONGPATHS, /* core.longpaths */
54
55
  GIT_CONFIGMAP_CACHE_MAX
55
56
  } git_configmap_item;
56
57
 
@@ -116,6 +117,8 @@ typedef enum {
116
117
  GIT_PROTECTNTFS_DEFAULT = GIT_CONFIGMAP_TRUE,
117
118
  /* core.fsyncObjectFiles */
118
119
  GIT_FSYNCOBJECTFILES_DEFAULT = GIT_CONFIGMAP_FALSE,
120
+ /* core.longpaths */
121
+ GIT_LONGPATHS_DEFAULT = GIT_CONFIGMAP_FALSE,
119
122
  } git_configmap_value;
120
123
 
121
124
  /* internal repository init flags */
@@ -152,9 +155,9 @@ struct git_repository {
152
155
 
153
156
  unsigned int lru_counter;
154
157
 
155
- git_atomic attr_session_key;
158
+ git_atomic32 attr_session_key;
156
159
 
157
- git_configmap_value configmap_cache[GIT_CONFIGMAP_CACHE_MAX];
160
+ intptr_t configmap_cache[GIT_CONFIGMAP_CACHE_MAX];
158
161
  git_strmap *submodule_cache;
159
162
  };
160
163
 
@@ -166,34 +169,11 @@ GIT_INLINE(git_attr_cache *) git_repository_attr_cache(git_repository *repo)
166
169
  int git_repository_head_tree(git_tree **tree, git_repository *repo);
167
170
  int git_repository_create_head(const char *git_dir, const char *ref_name);
168
171
 
169
- /*
170
- * Called for each HEAD.
171
- *
172
- * Can return either 0, causing the iteration over HEADs to
173
- * continue, or a non-0 value causing the iteration to abort. The
174
- * return value is passed back to the caller of
175
- * `git_repository_foreach_head`
176
- */
177
- typedef int (*git_repository_foreach_head_cb)(git_repository *repo, const char *path, void *payload);
172
+ typedef int (*git_repository_foreach_worktree_cb)(git_repository *, void *);
178
173
 
179
- enum {
180
- /* Skip enumeration of the main repository HEAD */
181
- GIT_REPOSITORY_FOREACH_HEAD_SKIP_REPO = (1u << 0),
182
- /* Skip enumeration of worktree HEADs */
183
- GIT_REPOSITORY_FOREACH_HEAD_SKIP_WORKTREES = (1u << 1),
184
- };
185
-
186
- /*
187
- * Iterate over repository and all worktree HEADs.
188
- *
189
- * This function will be called for the repository HEAD and for
190
- * all HEADS of linked worktrees. For each HEAD, the callback is
191
- * executed with the given payload. The return value equals the
192
- * return value of the last executed callback function.
193
- */
194
- int git_repository_foreach_head(git_repository *repo,
195
- git_repository_foreach_head_cb cb,
196
- int flags, void *payload);
174
+ int git_repository_foreach_worktree(git_repository *repo,
175
+ git_repository_foreach_worktree_cb cb,
176
+ void *payload);
197
177
 
198
178
  /*
199
179
  * Weak pointers to repository internals.
@@ -255,4 +235,18 @@ extern size_t git_repository__reserved_names_posix_len;
255
235
  bool git_repository__reserved_names(
256
236
  git_buf **out, size_t *outlen, git_repository *repo, bool include_ntfs);
257
237
 
238
+ /*
239
+ * The default branch for the repository; the `init.defaultBranch`
240
+ * configuration option, if set, or `master` if it is not.
241
+ */
242
+ int git_repository_initialbranch(git_buf *out, git_repository *repo);
243
+
244
+ /*
245
+ * Given a relative `path`, this makes it absolute based on the
246
+ * repository's working directory. This will perform validation
247
+ * to ensure that the path is not longer than MAX_PATH on Windows
248
+ * (unless `core.longpaths` is set in the repo config).
249
+ */
250
+ int git_repository_workdir_path(git_buf *out, git_repository *repo, const char *path);
251
+
258
252
  #endif
@@ -33,7 +33,7 @@ int git_reset_default(
33
33
  int error;
34
34
  git_index *index = NULL;
35
35
 
36
- assert(pathspecs != NULL && pathspecs->count > 0);
36
+ GIT_ASSERT_ARG(pathspecs && pathspecs->count > 0);
37
37
 
38
38
  memset(&entry, 0, sizeof(git_index_entry));
39
39
 
@@ -62,10 +62,10 @@ int git_reset_default(
62
62
  for (i = 0, max_i = git_diff_num_deltas(diff); i < max_i; ++i) {
63
63
  const git_diff_delta *delta = git_diff_get_delta(diff, i);
64
64
 
65
- assert(delta->status == GIT_DELTA_ADDED ||
66
- delta->status == GIT_DELTA_MODIFIED ||
67
- delta->status == GIT_DELTA_CONFLICTED ||
68
- delta->status == GIT_DELTA_DELETED);
65
+ GIT_ASSERT(delta->status == GIT_DELTA_ADDED ||
66
+ delta->status == GIT_DELTA_MODIFIED ||
67
+ delta->status == GIT_DELTA_CONFLICTED ||
68
+ delta->status == GIT_DELTA_DELETED);
69
69
 
70
70
  error = git_index_conflict_remove(index, delta->old_file.path);
71
71
  if (error < 0) {
@@ -113,7 +113,8 @@ static int reset(
113
113
  git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT;
114
114
  git_buf log_message = GIT_BUF_INIT;
115
115
 
116
- assert(repo && target);
116
+ GIT_ASSERT_ARG(repo);
117
+ GIT_ASSERT_ARG(target);
117
118
 
118
119
  if (checkout_opts)
119
120
  opts = *checkout_opts;
@@ -129,7 +129,10 @@ int git_revert_commit(
129
129
  git_tree *parent_tree = NULL, *our_tree = NULL, *revert_tree = NULL;
130
130
  int parent = 0, error = 0;
131
131
 
132
- assert(out && repo && revert_commit && our_commit);
132
+ GIT_ASSERT_ARG(out);
133
+ GIT_ASSERT_ARG(repo);
134
+ GIT_ASSERT_ARG(revert_commit);
135
+ GIT_ASSERT_ARG(our_commit);
133
136
 
134
137
  if (git_commit_parentcount(revert_commit) > 1) {
135
138
  if (!mainline)
@@ -180,7 +183,8 @@ int git_revert(
180
183
  git_indexwriter indexwriter = GIT_INDEXWRITER_INIT;
181
184
  int error;
182
185
 
183
- assert(repo && commit);
186
+ GIT_ASSERT_ARG(repo);
187
+ GIT_ASSERT_ARG(commit);
184
188
 
185
189
  GIT_ERROR_CHECK_VERSION(given_opts, GIT_REVERT_OPTIONS_VERSION, "git_revert_options");
186
190
 
@@ -231,7 +235,9 @@ int git_revert_options_init(git_revert_options *opts, unsigned int version)
231
235
  return 0;
232
236
  }
233
237
 
238
+ #ifndef GIT_DEPRECATE_HARD
234
239
  int git_revert_init_options(git_revert_options *opts, unsigned int version)
235
240
  {
236
241
  return git_revert_options_init(opts, version);
237
242
  }
243
+ #endif
@@ -317,7 +317,7 @@ static int handle_at_syntax(git_object **out, git_reference **ref, const char *s
317
317
  git_buf identifier = GIT_BUF_INIT;
318
318
  git_time_t timestamp;
319
319
 
320
- assert(*out == NULL);
320
+ GIT_ASSERT(*out == NULL);
321
321
 
322
322
  if (git_buf_put(&identifier, spec, identifier_len) < 0)
323
323
  return -1;
@@ -524,7 +524,7 @@ static int extract_curly_braces_content(git_buf *buf, const char *spec, size_t *
524
524
  {
525
525
  git_buf_clear(buf);
526
526
 
527
- assert(spec[*pos] == '^' || spec[*pos] == '@');
527
+ GIT_ASSERT_ARG(spec[*pos] == '^' || spec[*pos] == '@');
528
528
 
529
529
  (*pos)++;
530
530
 
@@ -537,7 +537,8 @@ static int extract_curly_braces_content(git_buf *buf, const char *spec, size_t *
537
537
  if (spec[*pos] == '\0')
538
538
  return GIT_EINVALIDSPEC;
539
539
 
540
- git_buf_putc(buf, spec[(*pos)++]);
540
+ if (git_buf_putc(buf, spec[(*pos)++]) < 0)
541
+ return -1;
541
542
  }
542
543
 
543
544
  (*pos)++;
@@ -549,7 +550,7 @@ static int extract_path(git_buf *buf, const char *spec, size_t *pos)
549
550
  {
550
551
  git_buf_clear(buf);
551
552
 
552
- assert(spec[*pos] == ':');
553
+ GIT_ASSERT_ARG(spec[*pos] == ':');
553
554
 
554
555
  (*pos)++;
555
556
 
@@ -567,7 +568,7 @@ static int extract_how_many(int *n, const char *spec, size_t *pos)
567
568
  int parsed, accumulated;
568
569
  char kind = spec[*pos];
569
570
 
570
- assert(spec[*pos] == '^' || spec[*pos] == '~');
571
+ GIT_ASSERT_ARG(spec[*pos] == '^' || spec[*pos] == '~');
571
572
 
572
573
  accumulated = 0;
573
574
 
@@ -585,7 +586,7 @@ static int extract_how_many(int *n, const char *spec, size_t *pos)
585
586
  *pos = end_ptr - spec;
586
587
  }
587
588
 
588
- } while (spec[(*pos)] == kind && kind == '~');
589
+ } while (spec[(*pos)] == kind && kind == '~');
589
590
 
590
591
  *n = accumulated;
591
592
 
@@ -659,7 +660,7 @@ static int ensure_left_hand_identifier_is_not_known_yet(git_object *object, git_
659
660
  return GIT_EINVALIDSPEC;
660
661
  }
661
662
 
662
- int revparse__ext(
663
+ static int revparse(
663
664
  git_object **object_out,
664
665
  git_reference **reference_out,
665
666
  size_t *identifier_len_out,
@@ -675,7 +676,10 @@ int revparse__ext(
675
676
 
676
677
  bool should_return_reference = true;
677
678
 
678
- assert(object_out && reference_out && repo && spec);
679
+ GIT_ASSERT_ARG(object_out);
680
+ GIT_ASSERT_ARG(reference_out);
681
+ GIT_ASSERT_ARG(repo);
682
+ GIT_ASSERT_ARG(spec);
679
683
 
680
684
  *object_out = NULL;
681
685
  *reference_out = NULL;
@@ -835,7 +839,7 @@ int git_revparse_ext(
835
839
  git_object *obj = NULL;
836
840
  git_reference *ref = NULL;
837
841
 
838
- if ((error = revparse__ext(&obj, &ref, &identifier_len, repo, spec)) < 0)
842
+ if ((error = revparse(&obj, &ref, &identifier_len, repo, spec)) < 0)
839
843
  goto cleanup;
840
844
 
841
845
  *object_out = obj;
@@ -881,14 +885,16 @@ int git_revparse(
881
885
  const char *dotdot;
882
886
  int error = 0;
883
887
 
884
- assert(revspec && repo && spec);
888
+ GIT_ASSERT_ARG(revspec);
889
+ GIT_ASSERT_ARG(repo);
890
+ GIT_ASSERT_ARG(spec);
885
891
 
886
892
  memset(revspec, 0x0, sizeof(*revspec));
887
893
 
888
894
  if ((dotdot = strstr(spec, "..")) != NULL) {
889
895
  char *lstr;
890
896
  const char *rstr;
891
- revspec->flags = GIT_REVPARSE_RANGE;
897
+ revspec->flags = GIT_REVSPEC_RANGE;
892
898
 
893
899
  /*
894
900
  * Following git.git, don't allow '..' because it makes command line
@@ -904,7 +910,7 @@ int git_revparse(
904
910
  lstr = git__substrdup(spec, dotdot - spec);
905
911
  rstr = dotdot + 2;
906
912
  if (dotdot[2] == '.') {
907
- revspec->flags |= GIT_REVPARSE_MERGE_BASE;
913
+ revspec->flags |= GIT_REVSPEC_MERGE_BASE;
908
914
  rstr++;
909
915
  }
910
916
 
@@ -922,7 +928,7 @@ int git_revparse(
922
928
 
923
929
  git__free((void*)lstr);
924
930
  } else {
925
- revspec->flags = GIT_REVPARSE_SINGLE;
931
+ revspec->flags = GIT_REVSPEC_SINGLE;
926
932
  error = git_revparse_single(&revspec->from, repo, spec);
927
933
  }
928
934
 
@@ -99,7 +99,8 @@ int git_revwalk_push(git_revwalk *walk, const git_oid *oid)
99
99
  {
100
100
  git_revwalk__push_options opts = GIT_REVWALK__PUSH_OPTIONS_INIT;
101
101
 
102
- assert(walk && oid);
102
+ GIT_ASSERT_ARG(walk);
103
+ GIT_ASSERT_ARG(oid);
103
104
 
104
105
  return git_revwalk__push_commit(walk, oid, &opts);
105
106
  }
@@ -108,7 +109,9 @@ int git_revwalk_push(git_revwalk *walk, const git_oid *oid)
108
109
  int git_revwalk_hide(git_revwalk *walk, const git_oid *oid)
109
110
  {
110
111
  git_revwalk__push_options opts = GIT_REVWALK__PUSH_OPTIONS_INIT;
111
- assert(walk && oid);
112
+
113
+ GIT_ASSERT_ARG(walk);
114
+ GIT_ASSERT_ARG(oid);
112
115
 
113
116
  opts.uninteresting = 1;
114
117
  return git_revwalk__push_commit(walk, oid, &opts);
@@ -133,7 +136,8 @@ int git_revwalk__push_glob(git_revwalk *walk, const char *glob, const git_revwal
133
136
  git_reference_iterator *iter;
134
137
  size_t wildcard;
135
138
 
136
- assert(walk && glob);
139
+ GIT_ASSERT_ARG(walk);
140
+ GIT_ASSERT_ARG(glob);
137
141
 
138
142
  if (given_opts)
139
143
  memcpy(&opts, given_opts, sizeof(opts));
@@ -172,7 +176,9 @@ out:
172
176
  int git_revwalk_push_glob(git_revwalk *walk, const char *glob)
173
177
  {
174
178
  git_revwalk__push_options opts = GIT_REVWALK__PUSH_OPTIONS_INIT;
175
- assert(walk && glob);
179
+
180
+ GIT_ASSERT_ARG(walk);
181
+ GIT_ASSERT_ARG(glob);
176
182
 
177
183
  return git_revwalk__push_glob(walk, glob, &opts);
178
184
  }
@@ -180,7 +186,9 @@ int git_revwalk_push_glob(git_revwalk *walk, const char *glob)
180
186
  int git_revwalk_hide_glob(git_revwalk *walk, const char *glob)
181
187
  {
182
188
  git_revwalk__push_options opts = GIT_REVWALK__PUSH_OPTIONS_INIT;
183
- assert(walk && glob);
189
+
190
+ GIT_ASSERT_ARG(walk);
191
+ GIT_ASSERT_ARG(glob);
184
192
 
185
193
  opts.uninteresting = 1;
186
194
  return git_revwalk__push_glob(walk, glob, &opts);
@@ -189,7 +197,8 @@ int git_revwalk_hide_glob(git_revwalk *walk, const char *glob)
189
197
  int git_revwalk_push_head(git_revwalk *walk)
190
198
  {
191
199
  git_revwalk__push_options opts = GIT_REVWALK__PUSH_OPTIONS_INIT;
192
- assert(walk);
200
+
201
+ GIT_ASSERT_ARG(walk);
193
202
 
194
203
  return git_revwalk__push_ref(walk, GIT_HEAD_FILE, &opts);
195
204
  }
@@ -197,7 +206,8 @@ int git_revwalk_push_head(git_revwalk *walk)
197
206
  int git_revwalk_hide_head(git_revwalk *walk)
198
207
  {
199
208
  git_revwalk__push_options opts = GIT_REVWALK__PUSH_OPTIONS_INIT;
200
- assert(walk);
209
+
210
+ GIT_ASSERT_ARG(walk);
201
211
 
202
212
  opts.uninteresting = 1;
203
213
  return git_revwalk__push_ref(walk, GIT_HEAD_FILE, &opts);
@@ -206,7 +216,9 @@ int git_revwalk_hide_head(git_revwalk *walk)
206
216
  int git_revwalk_push_ref(git_revwalk *walk, const char *refname)
207
217
  {
208
218
  git_revwalk__push_options opts = GIT_REVWALK__PUSH_OPTIONS_INIT;
209
- assert(walk && refname);
219
+
220
+ GIT_ASSERT_ARG(walk);
221
+ GIT_ASSERT_ARG(refname);
210
222
 
211
223
  return git_revwalk__push_ref(walk, refname, &opts);
212
224
  }
@@ -226,7 +238,7 @@ int git_revwalk_push_range(git_revwalk *walk, const char *range)
226
238
  goto out;
227
239
  }
228
240
 
229
- if (revspec.flags & GIT_REVPARSE_MERGE_BASE) {
241
+ if (revspec.flags & GIT_REVSPEC_MERGE_BASE) {
230
242
  /* TODO: support "<commit>...<commit>" */
231
243
  git_error_set(GIT_ERROR_INVALID, "symmetric differences not implemented in revwalk");
232
244
  error = GIT_EINVALIDSPEC;
@@ -249,7 +261,10 @@ out:
249
261
  int git_revwalk_hide_ref(git_revwalk *walk, const char *refname)
250
262
  {
251
263
  git_revwalk__push_options opts = GIT_REVWALK__PUSH_OPTIONS_INIT;
252
- assert(walk && refname);
264
+
265
+ GIT_ASSERT_ARG(walk);
266
+ GIT_ASSERT_ARG(refname);
267
+
253
268
  opts.uninteresting = 1;
254
269
  return git_revwalk__push_ref(walk, refname, &opts);
255
270
  }
@@ -659,13 +674,11 @@ int git_revwalk_new(git_revwalk **revwalk_out, git_repository *repo)
659
674
  git_revwalk *walk = git__calloc(1, sizeof(git_revwalk));
660
675
  GIT_ERROR_CHECK_ALLOC(walk);
661
676
 
662
- if (git_oidmap_new(&walk->commits) < 0)
677
+ if (git_oidmap_new(&walk->commits) < 0 ||
678
+ git_pqueue_init(&walk->iterator_time, 0, 8, git_commit_list_time_cmp) < 0 ||
679
+ git_pool_init(&walk->commit_pool, COMMIT_ALLOC) < 0)
663
680
  return -1;
664
681
 
665
- if (git_pqueue_init(&walk->iterator_time, 0, 8, git_commit_list_time_cmp) < 0)
666
- return -1;
667
-
668
- git_pool_init(&walk->commit_pool, COMMIT_ALLOC);
669
682
  walk->get_next = &revwalk_next_unsorted;
670
683
  walk->enqueue = &revwalk_enqueue_unsorted;
671
684
 
@@ -696,13 +709,14 @@ void git_revwalk_free(git_revwalk *walk)
696
709
 
697
710
  git_repository *git_revwalk_repository(git_revwalk *walk)
698
711
  {
699
- assert(walk);
712
+ GIT_ASSERT_ARG_WITH_RETVAL(walk, NULL);
713
+
700
714
  return walk->repo;
701
715
  }
702
716
 
703
717
  int git_revwalk_sorting(git_revwalk *walk, unsigned int sort_mode)
704
718
  {
705
- assert(walk);
719
+ GIT_ASSERT_ARG(walk);
706
720
 
707
721
  if (walk->walking)
708
722
  git_revwalk_reset(walk);
@@ -734,7 +748,8 @@ int git_revwalk_next(git_oid *oid, git_revwalk *walk)
734
748
  int error;
735
749
  git_commit_list_node *next;
736
750
 
737
- assert(walk && oid);
751
+ GIT_ASSERT_ARG(walk);
752
+ GIT_ASSERT_ARG(oid);
738
753
 
739
754
  if (!walk->walking) {
740
755
  if ((error = prepare_walk(walk)) < 0)
@@ -759,7 +774,7 @@ int git_revwalk_reset(git_revwalk *walk)
759
774
  {
760
775
  git_commit_list_node *commit;
761
776
 
762
- assert(walk);
777
+ GIT_ASSERT_ARG(walk);
763
778
 
764
779
  git_oidmap_foreach_value(walk->commits, commit, {
765
780
  commit->seen = 0;
@@ -789,7 +804,7 @@ int git_revwalk_add_hide_cb(
789
804
  git_revwalk_hide_cb hide_cb,
790
805
  void *payload)
791
806
  {
792
- assert(walk);
807
+ GIT_ASSERT_ARG(walk);
793
808
 
794
809
  if (walk->walking)
795
810
  git_revwalk_reset(walk);
@@ -0,0 +1,162 @@
1
+ /*
2
+ * Copyright (C) the libgit2 contributors. All rights reserved.
3
+ *
4
+ * This file is part of libgit2, distributed under the GNU GPL v2 with
5
+ * a Linking Exception. For full terms see the included COPYING file.
6
+ */
7
+
8
+ #include "common.h"
9
+ #include "runtime.h"
10
+
11
+ static git_runtime_shutdown_fn shutdown_callback[32];
12
+ static git_atomic32 shutdown_callback_count;
13
+
14
+ static git_atomic32 init_count;
15
+
16
+ static int init_common(git_runtime_init_fn init_fns[], size_t cnt)
17
+ {
18
+ size_t i;
19
+ int ret;
20
+
21
+ /* Initialize subsystems that have global state */
22
+ for (i = 0; i < cnt; i++) {
23
+ if ((ret = init_fns[i]()) != 0)
24
+ break;
25
+ }
26
+
27
+ GIT_MEMORY_BARRIER;
28
+
29
+ return ret;
30
+ }
31
+
32
+ static void shutdown_common(void)
33
+ {
34
+ git_runtime_shutdown_fn cb;
35
+ int pos;
36
+
37
+ for (pos = git_atomic32_get(&shutdown_callback_count);
38
+ pos > 0;
39
+ pos = git_atomic32_dec(&shutdown_callback_count)) {
40
+ cb = git_atomic_swap(shutdown_callback[pos - 1], NULL);
41
+
42
+ if (cb != NULL)
43
+ cb();
44
+ }
45
+ }
46
+
47
+ int git_runtime_shutdown_register(git_runtime_shutdown_fn callback)
48
+ {
49
+ int count = git_atomic32_inc(&shutdown_callback_count);
50
+
51
+ if (count > (int)ARRAY_SIZE(shutdown_callback) || count == 0) {
52
+ git_error_set(GIT_ERROR_INVALID,
53
+ "too many shutdown callbacks registered");
54
+ git_atomic32_dec(&shutdown_callback_count);
55
+ return -1;
56
+ }
57
+
58
+ shutdown_callback[count - 1] = callback;
59
+
60
+ return 0;
61
+ }
62
+
63
+ #if defined(GIT_THREADS) && defined(GIT_WIN32)
64
+
65
+ /*
66
+ * On Win32, we use a spinlock to provide locking semantics. This is
67
+ * lighter-weight than a proper critical section.
68
+ */
69
+ static volatile LONG init_spinlock = 0;
70
+
71
+ GIT_INLINE(int) init_lock(void)
72
+ {
73
+ while (InterlockedCompareExchange(&init_spinlock, 1, 0)) { Sleep(0); }
74
+ return 0;
75
+ }
76
+
77
+ GIT_INLINE(int) init_unlock(void)
78
+ {
79
+ InterlockedExchange(&init_spinlock, 0);
80
+ return 0;
81
+ }
82
+
83
+ #elif defined(GIT_THREADS) && defined(_POSIX_THREADS)
84
+
85
+ /*
86
+ * On POSIX, we need to use a proper mutex for locking. We might prefer
87
+ * a spinlock here, too, but there's no static initializer for a
88
+ * pthread_spinlock_t.
89
+ */
90
+ static pthread_mutex_t init_mutex = PTHREAD_MUTEX_INITIALIZER;
91
+
92
+ GIT_INLINE(int) init_lock(void)
93
+ {
94
+ return pthread_mutex_lock(&init_mutex) == 0 ? 0 : -1;
95
+ }
96
+
97
+ GIT_INLINE(int) init_unlock(void)
98
+ {
99
+ return pthread_mutex_unlock(&init_mutex) == 0 ? 0 : -1;
100
+ }
101
+
102
+ #elif defined(GIT_THREADS)
103
+ # error unknown threading model
104
+ #else
105
+
106
+ # define init_lock() git__noop()
107
+ # define init_unlock() git__noop()
108
+
109
+ #endif
110
+
111
+ int git_runtime_init(git_runtime_init_fn init_fns[], size_t cnt)
112
+ {
113
+ int ret;
114
+
115
+ if (init_lock() < 0)
116
+ return -1;
117
+
118
+ /* Only do work on a 0 -> 1 transition of the refcount */
119
+ if ((ret = git_atomic32_inc(&init_count)) == 1) {
120
+ if (init_common(init_fns, cnt) < 0)
121
+ ret = -1;
122
+ }
123
+
124
+ if (init_unlock() < 0)
125
+ return -1;
126
+
127
+ return ret;
128
+ }
129
+
130
+ int git_runtime_init_count(void)
131
+ {
132
+ int ret;
133
+
134
+ if (init_lock() < 0)
135
+ return -1;
136
+
137
+ ret = git_atomic32_get(&init_count);
138
+
139
+ if (init_unlock() < 0)
140
+ return -1;
141
+
142
+ return ret;
143
+ }
144
+
145
+ int git_runtime_shutdown(void)
146
+ {
147
+ int ret;
148
+
149
+ /* Enter the lock */
150
+ if (init_lock() < 0)
151
+ return -1;
152
+
153
+ /* Only do work on a 1 -> 0 transition of the refcount */
154
+ if ((ret = git_atomic32_dec(&init_count)) == 0)
155
+ shutdown_common();
156
+
157
+ /* Exit the lock */
158
+ if (init_unlock() < 0)
159
+ return -1;
160
+
161
+ return ret;
162
+ }