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
@@ -101,12 +101,6 @@ struct git_submodule {
101
101
  git_oid wd_oid;
102
102
  };
103
103
 
104
- /* Force revalidation of submodule data cache (alloc as needed) */
105
- extern int git_submodule_cache_refresh(git_repository *repo);
106
-
107
- /* Release all submodules */
108
- extern void git_submodule_cache_free(git_repository *repo);
109
-
110
104
  /* Additional flags on top of public GIT_SUBMODULE_STATUS values */
111
105
  enum {
112
106
  GIT_SUBMODULE_STATUS__WD_SCANNED = (1u << 20),
@@ -122,9 +116,15 @@ enum {
122
116
  #define GIT_SUBMODULE_STATUS__CLEAR_INTERNAL(S) \
123
117
  ((S) & ~(0xFFFFFFFFu << 20))
124
118
 
125
- /* Internal lookup does not attempt to refresh cached data */
126
- extern int git_submodule__lookup(
127
- git_submodule **out, git_repository *repo, const char *path);
119
+ /* Initialize an external submodule cache for the provided repo. */
120
+ extern int git_submodule_cache_init(git_strmap **out, git_repository *repo);
121
+
122
+ /* Release the resources of the submodule cache. */
123
+ extern int git_submodule_cache_free(git_strmap *cache);
124
+
125
+ /* Submodule lookup with an explicit cache */
126
+ extern int git_submodule__lookup_with_cache(
127
+ git_submodule **out, git_repository *repo, const char *path, git_strmap *cache);
128
128
 
129
129
  /* Internal status fn returns status and optionally the various OIDs */
130
130
  extern int git_submodule__status(
@@ -7,7 +7,7 @@
7
7
 
8
8
  #include "sysdir.h"
9
9
 
10
- #include "global.h"
10
+ #include "runtime.h"
11
11
  #include "buffer.h"
12
12
  #include "path.h"
13
13
  #include <ctype.h>
@@ -45,7 +45,7 @@ static int get_passwd_home(git_buf *out, uid_t uid)
45
45
  long buflen;
46
46
  int error;
47
47
 
48
- assert(out);
48
+ GIT_ASSERT_ARG(out);
49
49
 
50
50
  if ((buflen = sysconf(_SC_GETPW_R_SIZE_MAX)) == -1)
51
51
  buflen = 1024;
@@ -189,9 +189,7 @@ int git_sysdir_global_init(void)
189
189
  for (i = 0; !error && i < ARRAY_SIZE(git_sysdir__dirs); i++)
190
190
  error = git_sysdir__dirs[i].guess(&git_sysdir__dirs[i].buf);
191
191
 
192
- git__on_shutdown(git_sysdir_global_shutdown);
193
-
194
- return error;
192
+ return git_runtime_shutdown_register(git_sysdir_global_shutdown);
195
193
  }
196
194
 
197
195
  static int git_sysdir_check_selector(git_sysdir_t which)
@@ -206,7 +204,7 @@ static int git_sysdir_check_selector(git_sysdir_t which)
206
204
 
207
205
  int git_sysdir_get(const git_buf **out, git_sysdir_t which)
208
206
  {
209
- assert(out);
207
+ GIT_ASSERT_ARG(out);
210
208
 
211
209
  *out = NULL;
212
210
 
@@ -216,25 +214,6 @@ int git_sysdir_get(const git_buf **out, git_sysdir_t which)
216
214
  return 0;
217
215
  }
218
216
 
219
- int git_sysdir_get_str(
220
- char *out,
221
- size_t outlen,
222
- git_sysdir_t which)
223
- {
224
- const git_buf *path = NULL;
225
-
226
- GIT_ERROR_CHECK_ERROR(git_sysdir_check_selector(which));
227
- GIT_ERROR_CHECK_ERROR(git_sysdir_get(&path, which));
228
-
229
- if (!out || path->size >= outlen) {
230
- git_error_set(GIT_ERROR_NOMEMORY, "buffer is too short for the path");
231
- return GIT_EBUFS;
232
- }
233
-
234
- git_buf_copy_cstr(out, outlen, path);
235
- return 0;
236
- }
237
-
238
217
  #define PATH_MAGIC "$PATH"
239
218
 
240
219
  int git_sysdir_set(git_sysdir_t which, const char *search_path)
@@ -317,8 +296,11 @@ static int git_sysdir_find_in_dirlist(
317
296
  }
318
297
 
319
298
  done:
299
+ if (name)
300
+ git_error_set(GIT_ERROR_OS, "the %s file '%s' doesn't exist", label, name);
301
+ else
302
+ git_error_set(GIT_ERROR_OS, "the %s directory doesn't exist", label);
320
303
  git_buf_dispose(path);
321
- git_error_set(GIT_ERROR_OS, "the %s file '%s' doesn't exist", label, name);
322
304
  return GIT_ENOTFOUND;
323
305
  }
324
306
 
@@ -93,17 +93,6 @@ extern int git_sysdir_global_init(void);
93
93
  */
94
94
  extern int git_sysdir_get(const git_buf **out, git_sysdir_t which);
95
95
 
96
- /**
97
- * Get search path into a preallocated buffer
98
- *
99
- * @param out String buffer to write into
100
- * @param outlen Size of string buffer
101
- * @param which Which search path to return
102
- * @return 0 on success, GIT_EBUFS if out is too small, <0 on other failure
103
- */
104
-
105
- extern int git_sysdir_get_str(char *out, size_t outlen, git_sysdir_t which);
106
-
107
96
  /**
108
97
  * Set search paths for global/system/xdg files
109
98
  *
@@ -27,25 +27,25 @@ void git_tag__free(void *_tag)
27
27
 
28
28
  int git_tag_target(git_object **target, const git_tag *t)
29
29
  {
30
- assert(t);
30
+ GIT_ASSERT_ARG(t);
31
31
  return git_object_lookup(target, t->object.repo, &t->target, t->type);
32
32
  }
33
33
 
34
34
  const git_oid *git_tag_target_id(const git_tag *t)
35
35
  {
36
- assert(t);
36
+ GIT_ASSERT_ARG_WITH_RETVAL(t, NULL);
37
37
  return &t->target;
38
38
  }
39
39
 
40
40
  git_object_t git_tag_target_type(const git_tag *t)
41
41
  {
42
- assert(t);
42
+ GIT_ASSERT_ARG_WITH_RETVAL(t, GIT_OBJECT_INVALID);
43
43
  return t->type;
44
44
  }
45
45
 
46
46
  const char *git_tag_name(const git_tag *t)
47
47
  {
48
- assert(t);
48
+ GIT_ASSERT_ARG_WITH_RETVAL(t, NULL);
49
49
  return t->tag_name;
50
50
  }
51
51
 
@@ -56,7 +56,7 @@ const git_signature *git_tag_tagger(const git_tag *t)
56
56
 
57
57
  const char *git_tag_message(const git_tag *t)
58
58
  {
59
- assert(t);
59
+ GIT_ASSERT_ARG_WITH_RETVAL(t, NULL);
60
60
  return t->message;
61
61
  }
62
62
 
@@ -259,8 +259,10 @@ static int git_tag_create__internal(
259
259
 
260
260
  int error;
261
261
 
262
- assert(repo && tag_name && target);
263
- assert(!create_tag_annotation || (tagger && message));
262
+ GIT_ASSERT_ARG(repo);
263
+ GIT_ASSERT_ARG(tag_name);
264
+ GIT_ASSERT_ARG(target);
265
+ GIT_ASSERT_ARG(!create_tag_annotation || (tagger && message));
264
266
 
265
267
  if (git_object_owner(target) != repo) {
266
268
  git_error_set(GIT_ERROR_INVALID, "the given target does not belong to this repository");
@@ -313,7 +315,12 @@ int git_tag_annotation_create(
313
315
  const git_signature *tagger,
314
316
  const char *message)
315
317
  {
316
- assert(oid && repo && tag_name && target && tagger && message);
318
+ GIT_ASSERT_ARG(oid);
319
+ GIT_ASSERT_ARG(repo);
320
+ GIT_ASSERT_ARG(tag_name);
321
+ GIT_ASSERT_ARG(target);
322
+ GIT_ASSERT_ARG(tagger);
323
+ GIT_ASSERT_ARG(message);
317
324
 
318
325
  return write_tag_annotation(oid, repo, tag_name, target, tagger, message);
319
326
  }
@@ -339,7 +346,8 @@ int git_tag_create_from_buffer(git_oid *oid, git_repository *repo, const char *b
339
346
  git_reference *new_ref = NULL;
340
347
  git_buf ref_name = GIT_BUF_INIT;
341
348
 
342
- assert(oid && buffer);
349
+ GIT_ASSERT_ARG(oid);
350
+ GIT_ASSERT_ARG(buffer);
343
351
 
344
352
  memset(&tag, 0, sizeof(tag));
345
353
 
@@ -454,7 +462,8 @@ int git_tag_foreach(git_repository *repo, git_tag_foreach_cb cb, void *cb_data)
454
462
  {
455
463
  tag_cb_data data;
456
464
 
457
- assert(repo && cb);
465
+ GIT_ASSERT_ARG(repo);
466
+ GIT_ASSERT_ARG(cb);
458
467
 
459
468
  data.cb = cb;
460
469
  data.cb_data = cb_data;
@@ -493,7 +502,9 @@ int git_tag_list_match(git_strarray *tag_names, const char *pattern, git_reposit
493
502
  tag_filter_data filter;
494
503
  git_vector taglist;
495
504
 
496
- assert(tag_names && repo && pattern);
505
+ GIT_ASSERT_ARG(tag_names);
506
+ GIT_ASSERT_ARG(repo);
507
+ GIT_ASSERT_ARG(pattern);
497
508
 
498
509
  if ((error = git_vector_init(&taglist, 8, NULL)) < 0)
499
510
  return error;
@@ -522,9 +533,36 @@ int git_tag_peel(git_object **tag_target, const git_tag *tag)
522
533
  return git_object_peel(tag_target, (const git_object *)tag, GIT_OBJECT_ANY);
523
534
  }
524
535
 
536
+ int git_tag_name_is_valid(int *valid, const char *name)
537
+ {
538
+ git_buf ref_name = GIT_BUF_INIT;
539
+ int error = 0;
540
+
541
+ GIT_ASSERT(valid);
542
+
543
+ /*
544
+ * Discourage tag name starting with dash,
545
+ * https://github.com/git/git/commit/4f0accd638b8d2
546
+ */
547
+ if (!name || name[0] == '-')
548
+ goto done;
549
+
550
+ if ((error = git_buf_puts(&ref_name, GIT_REFS_TAGS_DIR)) < 0 ||
551
+ (error = git_buf_puts(&ref_name, name)) < 0)
552
+ goto done;
553
+
554
+ error = git_reference_name_is_valid(valid, ref_name.ptr);
555
+
556
+ done:
557
+ git_buf_dispose(&ref_name);
558
+ return error;
559
+ }
560
+
525
561
  /* Deprecated Functions */
526
562
 
563
+ #ifndef GIT_DEPRECATE_HARD
527
564
  int git_tag_create_frombuffer(git_oid *oid, git_repository *repo, const char *buffer, int allow_ref_overwrite)
528
565
  {
529
566
  return git_tag_create_from_buffer(oid, repo, buffer, allow_ref_overwrite);
530
567
  }
568
+ #endif
@@ -0,0 +1,140 @@
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
+
10
+ #if !defined(GIT_THREADS)
11
+
12
+ #define TLSDATA_MAX 16
13
+
14
+ typedef struct {
15
+ void *value;
16
+ void (GIT_SYSTEM_CALL *destroy_fn)(void *);
17
+ } tlsdata_value;
18
+
19
+ static tlsdata_value tlsdata_values[TLSDATA_MAX];
20
+ static int tlsdata_cnt = 0;
21
+
22
+ int git_tlsdata_init(git_tlsdata_key *key, void (GIT_SYSTEM_CALL *destroy_fn)(void *))
23
+ {
24
+ if (tlsdata_cnt >= TLSDATA_MAX)
25
+ return -1;
26
+
27
+ tlsdata_values[tlsdata_cnt].value = NULL;
28
+ tlsdata_values[tlsdata_cnt].destroy_fn = destroy_fn;
29
+
30
+ *key = tlsdata_cnt;
31
+ tlsdata_cnt++;
32
+
33
+ return 0;
34
+ }
35
+
36
+ int git_tlsdata_set(git_tlsdata_key key, void *value)
37
+ {
38
+ if (key < 0 || key > tlsdata_cnt)
39
+ return -1;
40
+
41
+ tlsdata_values[key].value = value;
42
+ return 0;
43
+ }
44
+
45
+ void *git_tlsdata_get(git_tlsdata_key key)
46
+ {
47
+ if (key < 0 || key > tlsdata_cnt)
48
+ return NULL;
49
+
50
+ return tlsdata_values[key].value;
51
+ }
52
+
53
+ int git_tlsdata_dispose(git_tlsdata_key key)
54
+ {
55
+ void *value;
56
+ void (*destroy_fn)(void *) = NULL;
57
+
58
+ if (key < 0 || key > tlsdata_cnt)
59
+ return -1;
60
+
61
+ value = tlsdata_values[key].value;
62
+ destroy_fn = tlsdata_values[key].destroy_fn;
63
+
64
+ tlsdata_values[key].value = NULL;
65
+ tlsdata_values[key].destroy_fn = NULL;
66
+
67
+ if (value && destroy_fn)
68
+ destroy_fn(value);
69
+
70
+ return 0;
71
+ }
72
+
73
+ #elif defined(GIT_WIN32)
74
+
75
+ int git_tlsdata_init(git_tlsdata_key *key, void (GIT_SYSTEM_CALL *destroy_fn)(void *))
76
+ {
77
+ DWORD fls_index = FlsAlloc(destroy_fn);
78
+
79
+ if (fls_index == FLS_OUT_OF_INDEXES)
80
+ return -1;
81
+
82
+ *key = fls_index;
83
+ return 0;
84
+ }
85
+
86
+ int git_tlsdata_set(git_tlsdata_key key, void *value)
87
+ {
88
+ if (!FlsSetValue(key, value))
89
+ return -1;
90
+
91
+ return 0;
92
+ }
93
+
94
+ void *git_tlsdata_get(git_tlsdata_key key)
95
+ {
96
+ return FlsGetValue(key);
97
+ }
98
+
99
+ int git_tlsdata_dispose(git_tlsdata_key key)
100
+ {
101
+ if (!FlsFree(key))
102
+ return -1;
103
+
104
+ return 0;
105
+ }
106
+
107
+ #elif defined(_POSIX_THREADS)
108
+
109
+ int git_tlsdata_init(git_tlsdata_key *key, void (GIT_SYSTEM_CALL *destroy_fn)(void *))
110
+ {
111
+ if (pthread_key_create(key, destroy_fn) != 0)
112
+ return -1;
113
+
114
+ return 0;
115
+ }
116
+
117
+ int git_tlsdata_set(git_tlsdata_key key, void *value)
118
+ {
119
+ if (pthread_setspecific(key, value) != 0)
120
+ return -1;
121
+
122
+ return 0;
123
+ }
124
+
125
+ void *git_tlsdata_get(git_tlsdata_key key)
126
+ {
127
+ return pthread_getspecific(key);
128
+ }
129
+
130
+ int git_tlsdata_dispose(git_tlsdata_key key)
131
+ {
132
+ if (pthread_key_delete(key) != 0)
133
+ return -1;
134
+
135
+ return 0;
136
+ }
137
+
138
+ #else
139
+ # error unknown threading model
140
+ #endif
@@ -0,0 +1,479 @@
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
+ #ifndef INCLUDE_thread_h__
8
+ #define INCLUDE_thread_h__
9
+
10
+ #if defined(GIT_THREADS)
11
+
12
+ #if defined(__clang__)
13
+
14
+ # if (__clang_major__ < 3 || (__clang_major__ == 3 && __clang_minor__ < 1))
15
+ # error Atomic primitives do not exist on this version of clang; configure libgit2 with -DTHREADSAFE=OFF
16
+ # else
17
+ # define GIT_BUILTIN_ATOMIC
18
+ # endif
19
+
20
+ #elif defined(__GNUC__)
21
+
22
+ # if (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 1))
23
+ # error Atomic primitives do not exist on this version of gcc; configure libgit2 with -DTHREADSAFE=OFF
24
+ # elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7))
25
+ # define GIT_BUILTIN_ATOMIC
26
+ # else
27
+ # define GIT_BUILTIN_SYNC
28
+ # endif
29
+
30
+ #endif
31
+
32
+ #endif /* GIT_THREADS */
33
+
34
+ /* Common operations even if threading has been disabled */
35
+ typedef struct {
36
+ #if defined(GIT_WIN32)
37
+ volatile long val;
38
+ #else
39
+ volatile int val;
40
+ #endif
41
+ } git_atomic32;
42
+
43
+ #ifdef GIT_ARCH_64
44
+
45
+ typedef struct {
46
+ #if defined(GIT_WIN32)
47
+ volatile __int64 val;
48
+ #else
49
+ volatile int64_t val;
50
+ #endif
51
+ } git_atomic64;
52
+
53
+ typedef git_atomic64 git_atomic_ssize;
54
+
55
+ #define git_atomic_ssize_set git_atomic64_set
56
+ #define git_atomic_ssize_add git_atomic64_add
57
+ #define git_atomic_ssize_get git_atomic64_get
58
+
59
+ #else
60
+
61
+ typedef git_atomic32 git_atomic_ssize;
62
+
63
+ #define git_atomic_ssize_set git_atomic32_set
64
+ #define git_atomic_ssize_add git_atomic32_add
65
+ #define git_atomic_ssize_get git_atomic32_get
66
+
67
+ #endif
68
+
69
+ #ifdef GIT_THREADS
70
+
71
+ #ifdef GIT_WIN32
72
+ # include "win32/thread.h"
73
+ #else
74
+ # include "unix/pthread.h"
75
+ #endif
76
+
77
+ /*
78
+ * Atomically sets the contents of *a to be val.
79
+ */
80
+ GIT_INLINE(void) git_atomic32_set(git_atomic32 *a, int val)
81
+ {
82
+ #if defined(GIT_WIN32)
83
+ InterlockedExchange(&a->val, (LONG)val);
84
+ #elif defined(GIT_BUILTIN_ATOMIC)
85
+ __atomic_store_n(&a->val, val, __ATOMIC_SEQ_CST);
86
+ #elif defined(GIT_BUILTIN_SYNC)
87
+ __sync_lock_test_and_set(&a->val, val);
88
+ #else
89
+ # error "Unsupported architecture for atomic operations"
90
+ #endif
91
+ }
92
+
93
+ /*
94
+ * Atomically increments the contents of *a by 1, and stores the result back into *a.
95
+ * @return the result of the operation.
96
+ */
97
+ GIT_INLINE(int) git_atomic32_inc(git_atomic32 *a)
98
+ {
99
+ #if defined(GIT_WIN32)
100
+ return InterlockedIncrement(&a->val);
101
+ #elif defined(GIT_BUILTIN_ATOMIC)
102
+ return __atomic_add_fetch(&a->val, 1, __ATOMIC_SEQ_CST);
103
+ #elif defined(GIT_BUILTIN_SYNC)
104
+ return __sync_add_and_fetch(&a->val, 1);
105
+ #else
106
+ # error "Unsupported architecture for atomic operations"
107
+ #endif
108
+ }
109
+
110
+ /*
111
+ * Atomically adds the contents of *a and addend, and stores the result back into *a.
112
+ * @return the result of the operation.
113
+ */
114
+ GIT_INLINE(int) git_atomic32_add(git_atomic32 *a, int32_t addend)
115
+ {
116
+ #if defined(GIT_WIN32)
117
+ return InterlockedAdd(&a->val, addend);
118
+ #elif defined(GIT_BUILTIN_ATOMIC)
119
+ return __atomic_add_fetch(&a->val, addend, __ATOMIC_SEQ_CST);
120
+ #elif defined(GIT_BUILTIN_SYNC)
121
+ return __sync_add_and_fetch(&a->val, addend);
122
+ #else
123
+ # error "Unsupported architecture for atomic operations"
124
+ #endif
125
+ }
126
+
127
+ /*
128
+ * Atomically decrements the contents of *a by 1, and stores the result back into *a.
129
+ * @return the result of the operation.
130
+ */
131
+ GIT_INLINE(int) git_atomic32_dec(git_atomic32 *a)
132
+ {
133
+ #if defined(GIT_WIN32)
134
+ return InterlockedDecrement(&a->val);
135
+ #elif defined(GIT_BUILTIN_ATOMIC)
136
+ return __atomic_sub_fetch(&a->val, 1, __ATOMIC_SEQ_CST);
137
+ #elif defined(GIT_BUILTIN_SYNC)
138
+ return __sync_sub_and_fetch(&a->val, 1);
139
+ #else
140
+ # error "Unsupported architecture for atomic operations"
141
+ #endif
142
+ }
143
+
144
+ /*
145
+ * Atomically gets the contents of *a.
146
+ * @return the contents of *a.
147
+ */
148
+ GIT_INLINE(int) git_atomic32_get(git_atomic32 *a)
149
+ {
150
+ #if defined(GIT_WIN32)
151
+ return (int)InterlockedCompareExchange(&a->val, 0, 0);
152
+ #elif defined(GIT_BUILTIN_ATOMIC)
153
+ return __atomic_load_n(&a->val, __ATOMIC_SEQ_CST);
154
+ #elif defined(GIT_BUILTIN_SYNC)
155
+ return __sync_val_compare_and_swap(&a->val, 0, 0);
156
+ #else
157
+ # error "Unsupported architecture for atomic operations"
158
+ #endif
159
+ }
160
+
161
+ GIT_INLINE(void *) git_atomic__compare_and_swap(
162
+ void * volatile *ptr, void *oldval, void *newval)
163
+ {
164
+ #if defined(GIT_WIN32)
165
+ return InterlockedCompareExchangePointer((volatile PVOID *)ptr, newval, oldval);
166
+ #elif defined(GIT_BUILTIN_ATOMIC)
167
+ void *foundval = oldval;
168
+ __atomic_compare_exchange(ptr, &foundval, &newval, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
169
+ return foundval;
170
+ #elif defined(GIT_BUILTIN_SYNC)
171
+ return __sync_val_compare_and_swap(ptr, oldval, newval);
172
+ #else
173
+ # error "Unsupported architecture for atomic operations"
174
+ #endif
175
+ }
176
+
177
+ GIT_INLINE(volatile void *) git_atomic__swap(
178
+ void * volatile *ptr, void *newval)
179
+ {
180
+ #if defined(GIT_WIN32)
181
+ return InterlockedExchangePointer(ptr, newval);
182
+ #elif defined(GIT_BUILTIN_ATOMIC)
183
+ void * volatile foundval = NULL;
184
+ __atomic_exchange(ptr, &newval, &foundval, __ATOMIC_SEQ_CST);
185
+ return foundval;
186
+ #elif defined(GIT_BUILTIN_SYNC)
187
+ return (volatile void *)__sync_lock_test_and_set(ptr, newval);
188
+ #else
189
+ # error "Unsupported architecture for atomic operations"
190
+ #endif
191
+ }
192
+
193
+ GIT_INLINE(volatile void *) git_atomic__load(void * volatile *ptr)
194
+ {
195
+ #if defined(GIT_WIN32)
196
+ void *newval = NULL, *oldval = NULL;
197
+ return (volatile void *)InterlockedCompareExchangePointer((volatile PVOID *)ptr, newval, oldval);
198
+ #elif defined(GIT_BUILTIN_ATOMIC)
199
+ return (volatile void *)__atomic_load_n(ptr, __ATOMIC_SEQ_CST);
200
+ #elif defined(GIT_BUILTIN_SYNC)
201
+ return (volatile void *)__sync_val_compare_and_swap(ptr, 0, 0);
202
+ #else
203
+ # error "Unsupported architecture for atomic operations"
204
+ #endif
205
+ }
206
+
207
+ #ifdef GIT_ARCH_64
208
+
209
+ /*
210
+ * Atomically adds the contents of *a and addend, and stores the result back into *a.
211
+ * @return the result of the operation.
212
+ */
213
+ GIT_INLINE(int64_t) git_atomic64_add(git_atomic64 *a, int64_t addend)
214
+ {
215
+ #if defined(GIT_WIN32)
216
+ return InterlockedAdd64(&a->val, addend);
217
+ #elif defined(GIT_BUILTIN_ATOMIC)
218
+ return __atomic_add_fetch(&a->val, addend, __ATOMIC_SEQ_CST);
219
+ #elif defined(GIT_BUILTIN_SYNC)
220
+ return __sync_add_and_fetch(&a->val, addend);
221
+ #else
222
+ # error "Unsupported architecture for atomic operations"
223
+ #endif
224
+ }
225
+
226
+ /*
227
+ * Atomically sets the contents of *a to be val.
228
+ */
229
+ GIT_INLINE(void) git_atomic64_set(git_atomic64 *a, int64_t val)
230
+ {
231
+ #if defined(GIT_WIN32)
232
+ InterlockedExchange64(&a->val, val);
233
+ #elif defined(GIT_BUILTIN_ATOMIC)
234
+ __atomic_store_n(&a->val, val, __ATOMIC_SEQ_CST);
235
+ #elif defined(GIT_BUILTIN_SYNC)
236
+ __sync_lock_test_and_set(&a->val, val);
237
+ #else
238
+ # error "Unsupported architecture for atomic operations"
239
+ #endif
240
+ }
241
+
242
+ /*
243
+ * Atomically gets the contents of *a.
244
+ * @return the contents of *a.
245
+ */
246
+ GIT_INLINE(int64_t) git_atomic64_get(git_atomic64 *a)
247
+ {
248
+ #if defined(GIT_WIN32)
249
+ return (int64_t)InterlockedCompareExchange64(&a->val, 0, 0);
250
+ #elif defined(GIT_BUILTIN_ATOMIC)
251
+ return __atomic_load_n(&a->val, __ATOMIC_SEQ_CST);
252
+ #elif defined(GIT_BUILTIN_SYNC)
253
+ return __sync_val_compare_and_swap(&a->val, 0, 0);
254
+ #else
255
+ # error "Unsupported architecture for atomic operations"
256
+ #endif
257
+ }
258
+
259
+ #endif
260
+
261
+ #else
262
+
263
+ #define git_threads_global_init git__noop
264
+
265
+ #define git_thread unsigned int
266
+ #define git_thread_create(thread, start_routine, arg) git__noop()
267
+ #define git_thread_join(id, status) git__noop()
268
+
269
+ /* Pthreads Mutex */
270
+ #define git_mutex unsigned int
271
+ #define git_mutex_init(a) git__noop()
272
+ #define git_mutex_init(a) git__noop()
273
+ #define git_mutex_lock(a) git__noop()
274
+ #define git_mutex_unlock(a) git__noop()
275
+ #define git_mutex_free(a) git__noop()
276
+
277
+ /* Pthreads condition vars */
278
+ #define git_cond unsigned int
279
+ #define git_cond_init(c) git__noop()
280
+ #define git_cond_free(c) git__noop()
281
+ #define git_cond_wait(c, l) git__noop()
282
+ #define git_cond_signal(c) git__noop()
283
+ #define git_cond_broadcast(c) git__noop()
284
+
285
+ /* Pthreads rwlock */
286
+ #define git_rwlock unsigned int
287
+ #define git_rwlock_init(a) git__noop()
288
+ #define git_rwlock_rdlock(a) git__noop()
289
+ #define git_rwlock_rdunlock(a) git__noop()
290
+ #define git_rwlock_wrlock(a) git__noop()
291
+ #define git_rwlock_wrunlock(a) git__noop()
292
+ #define git_rwlock_free(a) git__noop()
293
+ #define GIT_RWLOCK_STATIC_INIT 0
294
+
295
+
296
+ GIT_INLINE(void) git_atomic32_set(git_atomic32 *a, int val)
297
+ {
298
+ a->val = val;
299
+ }
300
+
301
+ GIT_INLINE(int) git_atomic32_inc(git_atomic32 *a)
302
+ {
303
+ return ++a->val;
304
+ }
305
+
306
+ GIT_INLINE(int) git_atomic32_add(git_atomic32 *a, int32_t addend)
307
+ {
308
+ a->val += addend;
309
+ return a->val;
310
+ }
311
+
312
+ GIT_INLINE(int) git_atomic32_dec(git_atomic32 *a)
313
+ {
314
+ return --a->val;
315
+ }
316
+
317
+ GIT_INLINE(int) git_atomic32_get(git_atomic32 *a)
318
+ {
319
+ return (int)a->val;
320
+ }
321
+
322
+ GIT_INLINE(void *) git_atomic__compare_and_swap(
323
+ void * volatile *ptr, void *oldval, void *newval)
324
+ {
325
+ void *foundval = *ptr;
326
+ if (foundval == oldval)
327
+ *ptr = newval;
328
+ return foundval;
329
+ }
330
+
331
+ GIT_INLINE(volatile void *) git_atomic__swap(
332
+ void * volatile *ptr, void *newval)
333
+ {
334
+ volatile void *old = *ptr;
335
+ *ptr = newval;
336
+ return old;
337
+ }
338
+
339
+ GIT_INLINE(volatile void *) git_atomic__load(void * volatile *ptr)
340
+ {
341
+ return *ptr;
342
+ }
343
+
344
+ #ifdef GIT_ARCH_64
345
+
346
+ GIT_INLINE(int64_t) git_atomic64_add(git_atomic64 *a, int64_t addend)
347
+ {
348
+ a->val += addend;
349
+ return a->val;
350
+ }
351
+
352
+ GIT_INLINE(void) git_atomic64_set(git_atomic64 *a, int64_t val)
353
+ {
354
+ a->val = val;
355
+ }
356
+
357
+ GIT_INLINE(int64_t) git_atomic64_get(git_atomic64 *a)
358
+ {
359
+ return (int64_t)a->val;
360
+ }
361
+
362
+ #endif
363
+
364
+ #endif
365
+
366
+ /*
367
+ * Atomically replace the contents of *ptr (if they are equal to oldval) with
368
+ * newval. ptr must point to a pointer or a value that is the same size as a
369
+ * pointer. This is semantically compatible with:
370
+ *
371
+ * #define git_atomic_compare_and_swap(ptr, oldval, newval) \
372
+ * ({ \
373
+ * void *foundval = *ptr; \
374
+ * if (foundval == oldval) \
375
+ * *ptr = newval; \
376
+ * foundval; \
377
+ * })
378
+ *
379
+ * @return the original contents of *ptr.
380
+ */
381
+ #define git_atomic_compare_and_swap(ptr, oldval, newval) \
382
+ git_atomic__compare_and_swap((void * volatile *)ptr, oldval, newval)
383
+
384
+ /*
385
+ * Atomically replace the contents of v with newval. v must be the same size as
386
+ * a pointer. This is semantically compatible with:
387
+ *
388
+ * #define git_atomic_swap(v, newval) \
389
+ * ({ \
390
+ * volatile void *old = v; \
391
+ * v = newval; \
392
+ * old; \
393
+ * })
394
+ *
395
+ * @return the original contents of v.
396
+ */
397
+ #define git_atomic_swap(v, newval) \
398
+ (void *)git_atomic__swap((void * volatile *)&(v), newval)
399
+
400
+ /*
401
+ * Atomically reads the contents of v. v must be the same size as a pointer.
402
+ * This is semantically compatible with:
403
+ *
404
+ * #define git_atomic_load(v) v
405
+ *
406
+ * @return the contents of v.
407
+ */
408
+ #define git_atomic_load(v) \
409
+ (void *)git_atomic__load((void * volatile *)&(v))
410
+
411
+ #if defined(GIT_THREADS)
412
+
413
+ # if defined(GIT_WIN32)
414
+ # define GIT_MEMORY_BARRIER MemoryBarrier()
415
+ # elif defined(GIT_BUILTIN_ATOMIC)
416
+ # define GIT_MEMORY_BARRIER __atomic_thread_fence(__ATOMIC_SEQ_CST)
417
+ # elif defined(GIT_BUILTIN_SYNC)
418
+ # define GIT_MEMORY_BARRIER __sync_synchronize()
419
+ # endif
420
+
421
+ #else
422
+
423
+ # define GIT_MEMORY_BARRIER /* noop */
424
+
425
+ #endif
426
+
427
+ /* Thread-local data */
428
+
429
+ #if !defined(GIT_THREADS)
430
+ # define git_tlsdata_key int
431
+ #elif defined(GIT_WIN32)
432
+ # define git_tlsdata_key DWORD
433
+ #elif defined(_POSIX_THREADS)
434
+ # define git_tlsdata_key pthread_key_t
435
+ #else
436
+ # error unknown threading model
437
+ #endif
438
+
439
+ /**
440
+ * Create a thread-local data key. The destroy function will be
441
+ * called upon thread exit. On some platforms, it may be called
442
+ * when all threads have deleted their keys.
443
+ *
444
+ * Note that the tlsdata functions do not set an error message on
445
+ * failure; this is because the error handling in libgit2 is itself
446
+ * handled by thread-local data storage.
447
+ *
448
+ * @param key the tlsdata key
449
+ * @param destroy_fn function pointer called upon thread exit
450
+ * @return 0 on success, non-zero on failure
451
+ */
452
+ int git_tlsdata_init(git_tlsdata_key *key, void (GIT_SYSTEM_CALL *destroy_fn)(void *));
453
+
454
+ /**
455
+ * Set a the thread-local value for the given key.
456
+ *
457
+ * @param key the tlsdata key to store data on
458
+ * @param value the pointer to store
459
+ * @return 0 on success, non-zero on failure
460
+ */
461
+ int git_tlsdata_set(git_tlsdata_key key, void *value);
462
+
463
+ /**
464
+ * Get the thread-local value for the given key.
465
+ *
466
+ * @param key the tlsdata key to retrieve the value of
467
+ * @return the pointer stored with git_tlsdata_set
468
+ */
469
+ void *git_tlsdata_get(git_tlsdata_key key);
470
+
471
+ /**
472
+ * Delete the given thread-local key.
473
+ *
474
+ * @param key the tlsdata key to dispose
475
+ * @return 0 on success, non-zero on failure
476
+ */
477
+ int git_tlsdata_dispose(git_tlsdata_key key);
478
+
479
+ #endif