rugged 1.1.1 → 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 (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
@@ -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,7 +155,7 @@ 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
160
  intptr_t configmap_cache[GIT_CONFIGMAP_CACHE_MAX];
158
161
  git_strmap *submodule_cache;
@@ -238,4 +241,12 @@ bool git_repository__reserved_names(
238
241
  */
239
242
  int git_repository_initialbranch(git_buf *out, git_repository *repo);
240
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
+
241
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
 
@@ -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
 
@@ -550,7 +550,7 @@ static int extract_path(git_buf *buf, const char *spec, size_t *pos)
550
550
  {
551
551
  git_buf_clear(buf);
552
552
 
553
- assert(spec[*pos] == ':');
553
+ GIT_ASSERT_ARG(spec[*pos] == ':');
554
554
 
555
555
  (*pos)++;
556
556
 
@@ -568,7 +568,7 @@ static int extract_how_many(int *n, const char *spec, size_t *pos)
568
568
  int parsed, accumulated;
569
569
  char kind = spec[*pos];
570
570
 
571
- assert(spec[*pos] == '^' || spec[*pos] == '~');
571
+ GIT_ASSERT_ARG(spec[*pos] == '^' || spec[*pos] == '~');
572
572
 
573
573
  accumulated = 0;
574
574
 
@@ -676,7 +676,10 @@ static int revparse(
676
676
 
677
677
  bool should_return_reference = true;
678
678
 
679
- 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);
680
683
 
681
684
  *object_out = NULL;
682
685
  *reference_out = NULL;
@@ -882,14 +885,16 @@ int git_revparse(
882
885
  const char *dotdot;
883
886
  int error = 0;
884
887
 
885
- assert(revspec && repo && spec);
888
+ GIT_ASSERT_ARG(revspec);
889
+ GIT_ASSERT_ARG(repo);
890
+ GIT_ASSERT_ARG(spec);
886
891
 
887
892
  memset(revspec, 0x0, sizeof(*revspec));
888
893
 
889
894
  if ((dotdot = strstr(spec, "..")) != NULL) {
890
895
  char *lstr;
891
896
  const char *rstr;
892
- revspec->flags = GIT_REVPARSE_RANGE;
897
+ revspec->flags = GIT_REVSPEC_RANGE;
893
898
 
894
899
  /*
895
900
  * Following git.git, don't allow '..' because it makes command line
@@ -905,7 +910,7 @@ int git_revparse(
905
910
  lstr = git__substrdup(spec, dotdot - spec);
906
911
  rstr = dotdot + 2;
907
912
  if (dotdot[2] == '.') {
908
- revspec->flags |= GIT_REVPARSE_MERGE_BASE;
913
+ revspec->flags |= GIT_REVSPEC_MERGE_BASE;
909
914
  rstr++;
910
915
  }
911
916
 
@@ -923,7 +928,7 @@ int git_revparse(
923
928
 
924
929
  git__free((void*)lstr);
925
930
  } else {
926
- revspec->flags = GIT_REVPARSE_SINGLE;
931
+ revspec->flags = GIT_REVSPEC_SINGLE;
927
932
  error = git_revparse_single(&revspec->from, repo, spec);
928
933
  }
929
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
  }
@@ -694,13 +709,14 @@ void git_revwalk_free(git_revwalk *walk)
694
709
 
695
710
  git_repository *git_revwalk_repository(git_revwalk *walk)
696
711
  {
697
- assert(walk);
712
+ GIT_ASSERT_ARG_WITH_RETVAL(walk, NULL);
713
+
698
714
  return walk->repo;
699
715
  }
700
716
 
701
717
  int git_revwalk_sorting(git_revwalk *walk, unsigned int sort_mode)
702
718
  {
703
- assert(walk);
719
+ GIT_ASSERT_ARG(walk);
704
720
 
705
721
  if (walk->walking)
706
722
  git_revwalk_reset(walk);
@@ -732,7 +748,8 @@ int git_revwalk_next(git_oid *oid, git_revwalk *walk)
732
748
  int error;
733
749
  git_commit_list_node *next;
734
750
 
735
- assert(walk && oid);
751
+ GIT_ASSERT_ARG(walk);
752
+ GIT_ASSERT_ARG(oid);
736
753
 
737
754
  if (!walk->walking) {
738
755
  if ((error = prepare_walk(walk)) < 0)
@@ -757,7 +774,7 @@ int git_revwalk_reset(git_revwalk *walk)
757
774
  {
758
775
  git_commit_list_node *commit;
759
776
 
760
- assert(walk);
777
+ GIT_ASSERT_ARG(walk);
761
778
 
762
779
  git_oidmap_foreach_value(walk->commits, commit, {
763
780
  commit->seen = 0;
@@ -787,7 +804,7 @@ int git_revwalk_add_hide_cb(
787
804
  git_revwalk_hide_cb hide_cb,
788
805
  void *payload)
789
806
  {
790
- assert(walk);
807
+ GIT_ASSERT_ARG(walk);
791
808
 
792
809
  if (walk->walking)
793
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
+ }