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
@@ -27,7 +27,7 @@ typedef enum {
27
27
  typedef struct git_hash_ctx {
28
28
  union {
29
29
  git_hash_sha1_ctx sha1;
30
- };
30
+ } ctx;
31
31
  git_hash_algo_t algo;
32
32
  } git_hash_ctx;
33
33
 
@@ -17,7 +17,7 @@ typedef uint64_t hashsig_state;
17
17
  #define HASHSIG_SCALE 100
18
18
 
19
19
  #define HASHSIG_MAX_RUN 80
20
- #define HASHSIG_HASH_START 0x012345678ABCDEF0LL
20
+ #define HASHSIG_HASH_START INT64_C(0x012345678ABCDEF0)
21
21
  #define HASHSIG_HASH_SHIFT 5
22
22
 
23
23
  #define HASHSIG_HASH_MIX(S,CH) \
@@ -133,13 +133,13 @@ typedef struct {
133
133
  uint8_t ignore_ch[256];
134
134
  } hashsig_in_progress;
135
135
 
136
- static void hashsig_in_progress_init(
136
+ static int hashsig_in_progress_init(
137
137
  hashsig_in_progress *prog, git_hashsig *sig)
138
138
  {
139
139
  int i;
140
140
 
141
141
  /* no more than one can be set */
142
- assert(!(sig->opt & GIT_HASHSIG_IGNORE_WHITESPACE) ||
142
+ GIT_ASSERT(!(sig->opt & GIT_HASHSIG_IGNORE_WHITESPACE) ||
143
143
  !(sig->opt & GIT_HASHSIG_SMART_WHITESPACE));
144
144
 
145
145
  if (sig->opt & GIT_HASHSIG_IGNORE_WHITESPACE) {
@@ -153,6 +153,8 @@ static void hashsig_in_progress_init(
153
153
  } else {
154
154
  memset(prog, 0, sizeof(*prog));
155
155
  }
156
+
157
+ return 0;
156
158
  }
157
159
 
158
160
  static int hashsig_add_hashes(
@@ -251,7 +253,8 @@ int git_hashsig_create(
251
253
  git_hashsig *sig = hashsig_alloc(opts);
252
254
  GIT_ERROR_CHECK_ALLOC(sig);
253
255
 
254
- hashsig_in_progress_init(&prog, sig);
256
+ if ((error = hashsig_in_progress_init(&prog, sig)) < 0)
257
+ return error;
255
258
 
256
259
  error = hashsig_add_hashes(sig, (const uint8_t *)buf, buflen, &prog);
257
260
 
@@ -283,7 +286,10 @@ int git_hashsig_create_fromfile(
283
286
  return fd;
284
287
  }
285
288
 
286
- hashsig_in_progress_init(&prog, sig);
289
+ if ((error = hashsig_in_progress_init(&prog, sig)) < 0) {
290
+ p_close(fd);
291
+ return error;
292
+ }
287
293
 
288
294
  while (!error) {
289
295
  if ((buflen = p_read(fd, buf, sizeof(buf))) <= 0) {
@@ -318,7 +324,7 @@ static int hashsig_heap_compare(const hashsig_heap *a, const hashsig_heap *b)
318
324
  {
319
325
  int matches = 0, i, j, cmp;
320
326
 
321
- assert(a->cmp == b->cmp);
327
+ GIT_ASSERT_WITH_RETVAL(a->cmp == b->cmp, 0);
322
328
 
323
329
  /* hash heaps are sorted - just look for overlap vs total */
324
330
 
@@ -354,9 +360,16 @@ int git_hashsig_compare(const git_hashsig *a, const git_hashsig *b)
354
360
  /* if we have fewer than the maximum number of elements, then just use
355
361
  * one array since the two arrays will be the same
356
362
  */
357
- if (a->mins.size < HASHSIG_HEAP_SIZE)
363
+ if (a->mins.size < HASHSIG_HEAP_SIZE) {
358
364
  return hashsig_heap_compare(&a->mins, &b->mins);
359
- else
360
- return (hashsig_heap_compare(&a->mins, &b->mins) +
361
- hashsig_heap_compare(&a->maxs, &b->maxs)) / 2;
365
+ } else {
366
+ int mins, maxs;
367
+
368
+ if ((mins = hashsig_heap_compare(&a->mins, &b->mins)) < 0)
369
+ return mins;
370
+ if ((maxs = hashsig_heap_compare(&a->maxs, &b->maxs)) < 0)
371
+ return maxs;
372
+
373
+ return (mins + maxs) / 2;
374
+ }
362
375
  }
@@ -10,7 +10,6 @@
10
10
  #include "git2/sys/filter.h"
11
11
  #include "filter.h"
12
12
  #include "buffer.h"
13
- #include "buf_text.h"
14
13
 
15
14
  static int ident_find_id(
16
15
  const char **id_start, const char **id_end, const char *start, size_t len)
@@ -105,7 +104,7 @@ static int ident_apply(
105
104
  GIT_UNUSED(self); GIT_UNUSED(payload);
106
105
 
107
106
  /* Don't filter binary files */
108
- if (git_buf_text_is_binary(from))
107
+ if (git_buf_is_binary(from))
109
108
  return GIT_PASSTHROUGH;
110
109
 
111
110
  if (git_filter_source_mode(src) == GIT_FILTER_SMUDGE)
@@ -114,6 +113,17 @@ static int ident_apply(
114
113
  return ident_remove_id(to, from);
115
114
  }
116
115
 
116
+ static int ident_stream(
117
+ git_writestream **out,
118
+ git_filter *self,
119
+ void **payload,
120
+ const git_filter_source *src,
121
+ git_writestream *next)
122
+ {
123
+ return git_filter_buffered_stream_new(out,
124
+ self, ident_apply, NULL, payload, src, next);
125
+ }
126
+
117
127
  git_filter *git_ident_filter_new(void)
118
128
  {
119
129
  git_filter *f = git__calloc(1, sizeof(git_filter));
@@ -123,7 +133,7 @@ git_filter *git_ident_filter_new(void)
123
133
  f->version = GIT_FILTER_VERSION;
124
134
  f->attributes = "+ident"; /* apply to files with ident attribute set */
125
135
  f->shutdown = git_filter_free;
126
- f->apply = ident_apply;
136
+ f->stream = ident_stream;
127
137
 
128
138
  return f;
129
139
  }
@@ -101,7 +101,7 @@ static int does_negate_pattern(git_attr_fnmatch *rule, git_attr_fnmatch *neg)
101
101
  */
102
102
  static int does_negate_rule(int *out, git_vector *rules, git_attr_fnmatch *match)
103
103
  {
104
- int error = 0, wildmatch_flags;
104
+ int error = 0, wildmatch_flags, effective_flags;
105
105
  size_t i;
106
106
  git_attr_fnmatch *rule;
107
107
  char *path;
@@ -141,8 +141,17 @@ static int does_negate_rule(int *out, git_vector *rules, git_attr_fnmatch *match
141
141
  if (git_buf_oom(&buf))
142
142
  goto out;
143
143
 
144
+ /*
145
+ * if rule isn't for full path we match without PATHNAME flag
146
+ * as lines like *.txt should match something like dir/test.txt
147
+ * requiring * to also match /
148
+ */
149
+ effective_flags = wildmatch_flags;
150
+ if (!(rule->flags & GIT_ATTR_FNMATCH_FULLPATH))
151
+ effective_flags &= ~WM_PATHNAME;
152
+
144
153
  /* if we found a match, we want to keep this rule */
145
- if ((wildmatch(git_buf_cstr(&buf), path, wildmatch_flags)) == WM_MATCH) {
154
+ if ((wildmatch(git_buf_cstr(&buf), path, effective_flags)) == WM_MATCH) {
146
155
  *out = 1;
147
156
  error = 0;
148
157
  goto out;
@@ -238,11 +247,12 @@ static int push_ignore_file(
238
247
  const char *base,
239
248
  const char *filename)
240
249
  {
241
- int error = 0;
250
+ git_attr_file_source source = { GIT_ATTR_FILE_SOURCE_FILE, base, filename };
242
251
  git_attr_file *file = NULL;
252
+ int error = 0;
253
+
254
+ error = git_attr_cache__get(&file, ignores->repo, NULL, &source, parse_ignore_file, false);
243
255
 
244
- error = git_attr_cache__get(&file, ignores->repo, NULL, GIT_ATTR_FILE__FROM_FILE,
245
- base, filename, parse_ignore_file, false);
246
256
  if (error < 0)
247
257
  return error;
248
258
 
@@ -263,13 +273,13 @@ static int push_one_ignore(void *payload, const char *path)
263
273
 
264
274
  static int get_internal_ignores(git_attr_file **out, git_repository *repo)
265
275
  {
276
+ git_attr_file_source source = { GIT_ATTR_FILE_SOURCE_MEMORY, NULL, GIT_IGNORE_INTERNAL };
266
277
  int error;
267
278
 
268
279
  if ((error = git_attr_cache__init(repo)) < 0)
269
280
  return error;
270
281
 
271
- error = git_attr_cache__get(out, repo, NULL, GIT_ATTR_FILE__IN_MEMORY, NULL,
272
- GIT_IGNORE_INTERNAL, NULL, false);
282
+ error = git_attr_cache__get(out, repo, NULL, &source, NULL, false);
273
283
 
274
284
  /* if internal rules list is empty, insert default rules */
275
285
  if (!error && !(*out)->rules.length)
@@ -287,7 +297,9 @@ int git_ignore__for_path(
287
297
  const char *workdir = git_repository_workdir(repo);
288
298
  git_buf infopath = GIT_BUF_INIT;
289
299
 
290
- assert(repo && ignores && path);
300
+ GIT_ASSERT_ARG(repo);
301
+ GIT_ASSERT_ARG(ignores);
302
+ GIT_ASSERT_ARG(path);
291
303
 
292
304
  memset(ignores, 0, sizeof(*ignores));
293
305
  ignores->repo = repo;
@@ -307,12 +319,17 @@ int git_ignore__for_path(
307
319
  if ((error = git_path_dirname_r(&local, path)) < 0 ||
308
320
  (error = git_path_resolve_relative(&local, 0)) < 0 ||
309
321
  (error = git_path_to_dir(&local)) < 0 ||
310
- (error = git_buf_joinpath(&ignores->dir, workdir, local.ptr)) < 0)
311
- {;} /* Nothing, we just want to stop on the first error */
322
+ (error = git_buf_joinpath(&ignores->dir, workdir, local.ptr)) < 0 ||
323
+ (error = git_path_validate_workdir_buf(repo, &ignores->dir)) < 0) {
324
+ /* Nothing, we just want to stop on the first error */
325
+ }
326
+
312
327
  git_buf_dispose(&local);
313
328
  } else {
314
- error = git_buf_joinpath(&ignores->dir, path, "");
329
+ if (!(error = git_buf_joinpath(&ignores->dir, path, "")))
330
+ error = git_path_validate_filesystem(ignores->dir.ptr, ignores->dir.size);
315
331
  }
332
+
316
333
  if (error < 0)
317
334
  goto cleanup;
318
335
 
@@ -451,7 +468,7 @@ int git_ignore__lookup(
451
468
  *out = GIT_IGNORE_NOTFOUND;
452
469
 
453
470
  if (git_attr_path__init(
454
- &path, pathname, git_repository_workdir(ignores->repo), dir_flag) < 0)
471
+ &path, ignores->repo, pathname, git_repository_workdir(ignores->repo), dir_flag) < 0)
455
472
  return -1;
456
473
 
457
474
  /* first process builtins - success means path was found */
@@ -521,7 +538,9 @@ int git_ignore_path_is_ignored(
521
538
  git_attr_file *file;
522
539
  git_dir_flag dir_flag = GIT_DIR_FLAG_UNKNOWN;
523
540
 
524
- assert(repo && ignored && pathname);
541
+ GIT_ASSERT_ARG(repo);
542
+ GIT_ASSERT_ARG(ignored);
543
+ GIT_ASSERT_ARG(pathname);
525
544
 
526
545
  workdir = git_repository_workdir(repo);
527
546
 
@@ -533,7 +552,7 @@ int git_ignore_path_is_ignored(
533
552
  else if (git_repository_is_bare(repo))
534
553
  dir_flag = GIT_DIR_FLAG_FALSE;
535
554
 
536
- if ((error = git_attr_path__init(&path, pathname, workdir, dir_flag)) < 0 ||
555
+ if ((error = git_attr_path__init(&path, repo, pathname, workdir, dir_flag)) < 0 ||
537
556
  (error = git_ignore__for_path(repo, path.path, &ignores)) < 0)
538
557
  goto cleanup;
539
558
 
@@ -586,7 +605,7 @@ int git_ignore__check_pathspec_for_exact_ignores(
586
605
  git_attr_fnmatch *match;
587
606
  int ignored;
588
607
  git_buf path = GIT_BUF_INIT;
589
- const char *wd, *filename;
608
+ const char *filename;
590
609
  git_index *idx;
591
610
 
592
611
  if ((error = git_repository__ensure_not_bare(
@@ -594,8 +613,6 @@ int git_ignore__check_pathspec_for_exact_ignores(
594
613
  (error = git_repository_index(&idx, repo)) < 0)
595
614
  return error;
596
615
 
597
- wd = git_repository_workdir(repo);
598
-
599
616
  git_vector_foreach(vspec, i, match) {
600
617
  /* skip wildcard matches (if they are being used) */
601
618
  if ((match->flags & GIT_ATTR_FNMATCH_HASWILD) != 0 &&
@@ -608,7 +625,7 @@ int git_ignore__check_pathspec_for_exact_ignores(
608
625
  if (git_index_get_bypath(idx, filename, 0) != NULL)
609
626
  continue;
610
627
 
611
- if ((error = git_buf_joinpath(&path, wd, filename)) < 0)
628
+ if ((error = git_repository_workdir_path(&path, repo, filename)) < 0)
612
629
  break;
613
630
 
614
631
  /* is there a file on disk that matches this exactly? */
@@ -632,4 +649,3 @@ int git_ignore__check_pathspec_for_exact_ignores(
632
649
 
633
650
  return error;
634
651
  }
635
-
@@ -406,7 +406,7 @@ int git_index_open(git_index **index_out, const char *index_path)
406
406
  git_index *index;
407
407
  int error = -1;
408
408
 
409
- assert(index_out);
409
+ GIT_ASSERT_ARG(index_out);
410
410
 
411
411
  index = git__calloc(1, sizeof(git_index));
412
412
  GIT_ERROR_CHECK_ALLOC(index);
@@ -461,7 +461,8 @@ static void index_free(git_index *index)
461
461
  /* index iterators increment the refcount of the index, so if we
462
462
  * get here then there should be no outstanding iterators.
463
463
  */
464
- assert(!git_atomic_get(&index->readers));
464
+ if (git_atomic32_get(&index->readers))
465
+ return;
465
466
 
466
467
  git_index_clear(index);
467
468
  git_idxmap_free(index->entries_map);
@@ -487,14 +488,14 @@ void git_index_free(git_index *index)
487
488
  /* call with locked index */
488
489
  static void index_free_deleted(git_index *index)
489
490
  {
490
- int readers = (int)git_atomic_get(&index->readers);
491
+ int readers = (int)git_atomic32_get(&index->readers);
491
492
  size_t i;
492
493
 
493
494
  if (readers > 0 || !index->deleted.length)
494
495
  return;
495
496
 
496
497
  for (i = 0; i < index->deleted.length; ++i) {
497
- git_index_entry *ie = git__swap(index->deleted.contents[i], NULL);
498
+ git_index_entry *ie = git_atomic_swap(index->deleted.contents[i], NULL);
498
499
  index_entry_free(ie);
499
500
  }
500
501
 
@@ -515,7 +516,7 @@ static int index_remove_entry(git_index *index, size_t pos)
515
516
  error = git_vector_remove(&index->entries, pos);
516
517
 
517
518
  if (!error) {
518
- if (git_atomic_get(&index->readers) > 0) {
519
+ if (git_atomic32_get(&index->readers) > 0) {
519
520
  error = git_vector_insert(&index->deleted, entry);
520
521
  } else {
521
522
  index_entry_free(entry);
@@ -531,7 +532,7 @@ int git_index_clear(git_index *index)
531
532
  {
532
533
  int error = 0;
533
534
 
534
- assert(index);
535
+ GIT_ASSERT_ARG(index);
535
536
 
536
537
  index->dirty = 1;
537
538
  index->tree = NULL;
@@ -566,7 +567,7 @@ int git_index_set_caps(git_index *index, int caps)
566
567
  {
567
568
  unsigned int old_ignore_case;
568
569
 
569
- assert(index);
570
+ GIT_ASSERT_ARG(index);
570
571
 
571
572
  old_ignore_case = index->ignore_case;
572
573
 
@@ -778,14 +779,14 @@ done:
778
779
 
779
780
  unsigned git_index_version(git_index *index)
780
781
  {
781
- assert(index);
782
+ GIT_ASSERT_ARG(index);
782
783
 
783
784
  return index->version;
784
785
  }
785
786
 
786
787
  int git_index_set_version(git_index *index, unsigned int version)
787
788
  {
788
- assert(index);
789
+ GIT_ASSERT_ARG(index);
789
790
 
790
791
  if (version < INDEX_VERSION_NUMBER_LB ||
791
792
  version > INDEX_VERSION_NUMBER_UB) {
@@ -814,9 +815,9 @@ int git_index_write(git_index *index)
814
815
  return error;
815
816
  }
816
817
 
817
- const char * git_index_path(const git_index *index)
818
+ const char *git_index_path(const git_index *index)
818
819
  {
819
- assert(index);
820
+ GIT_ASSERT_ARG_WITH_RETVAL(index, NULL);
820
821
  return index->index_file_path;
821
822
  }
822
823
 
@@ -824,7 +825,8 @@ int git_index_write_tree(git_oid *oid, git_index *index)
824
825
  {
825
826
  git_repository *repo;
826
827
 
827
- assert(oid && index);
828
+ GIT_ASSERT_ARG(oid);
829
+ GIT_ASSERT_ARG(index);
828
830
 
829
831
  repo = INDEX_OWNER(index);
830
832
 
@@ -838,20 +840,25 @@ int git_index_write_tree(git_oid *oid, git_index *index)
838
840
  int git_index_write_tree_to(
839
841
  git_oid *oid, git_index *index, git_repository *repo)
840
842
  {
841
- assert(oid && index && repo);
843
+ GIT_ASSERT_ARG(oid);
844
+ GIT_ASSERT_ARG(index);
845
+ GIT_ASSERT_ARG(repo);
846
+
842
847
  return git_tree__write_index(oid, index, repo);
843
848
  }
844
849
 
845
850
  size_t git_index_entrycount(const git_index *index)
846
851
  {
847
- assert(index);
852
+ GIT_ASSERT_ARG(index);
853
+
848
854
  return index->entries.length;
849
855
  }
850
856
 
851
857
  const git_index_entry *git_index_get_byindex(
852
858
  git_index *index, size_t n)
853
859
  {
854
- assert(index);
860
+ GIT_ASSERT_ARG_WITH_RETVAL(index, NULL);
861
+
855
862
  git_vector_sort(&index->entries);
856
863
  return git_vector_get(&index->entries, n);
857
864
  }
@@ -862,7 +869,7 @@ const git_index_entry *git_index_get_bypath(
862
869
  git_index_entry key = {{ 0 }};
863
870
  git_index_entry *value;
864
871
 
865
- assert(index);
872
+ GIT_ASSERT_ARG_WITH_RETVAL(index, NULL);
866
873
 
867
874
  key.path = path;
868
875
  GIT_INDEX_ENTRY_STAGE_SET(&key, stage);
@@ -937,7 +944,7 @@ static int index_entry_create(
937
944
  if (st)
938
945
  mode = st->st_mode;
939
946
 
940
- if (!git_path_isvalid(repo, path, mode, path_valid_flags)) {
947
+ if (!git_path_validate(repo, path, mode, path_valid_flags)) {
941
948
  git_error_set(GIT_ERROR_INDEX, "invalid path: '%s'", path);
942
949
  return -1;
943
950
  }
@@ -981,7 +988,7 @@ static int index_entry_init(
981
988
  if (git_repository__ensure_not_bare(repo, "create blob from file") < 0)
982
989
  return GIT_EBAREREPO;
983
990
 
984
- if (git_buf_joinpath(&path, git_repository_workdir(repo), rel_path) < 0)
991
+ if (git_repository_workdir_path(&path, repo, rel_path) < 0)
985
992
  return -1;
986
993
 
987
994
  error = git_path_lstat(path.ptr, &st);
@@ -1039,23 +1046,24 @@ static int index_entry_reuc_init(git_index_reuc_entry **reuc_out,
1039
1046
  {
1040
1047
  git_index_reuc_entry *reuc = NULL;
1041
1048
 
1042
- assert(reuc_out && path);
1049
+ GIT_ASSERT_ARG(reuc_out);
1050
+ GIT_ASSERT_ARG(path);
1043
1051
 
1044
1052
  *reuc_out = reuc = reuc_entry_alloc(path);
1045
1053
  GIT_ERROR_CHECK_ALLOC(reuc);
1046
1054
 
1047
1055
  if ((reuc->mode[0] = ancestor_mode) > 0) {
1048
- assert(ancestor_oid);
1056
+ GIT_ASSERT(ancestor_oid);
1049
1057
  git_oid_cpy(&reuc->oid[0], ancestor_oid);
1050
1058
  }
1051
1059
 
1052
1060
  if ((reuc->mode[1] = our_mode) > 0) {
1053
- assert(our_oid);
1061
+ GIT_ASSERT(our_oid);
1054
1062
  git_oid_cpy(&reuc->oid[1], our_oid);
1055
1063
  }
1056
1064
 
1057
1065
  if ((reuc->mode[2] = their_mode) > 0) {
1058
- assert(their_oid);
1066
+ GIT_ASSERT(their_oid);
1059
1067
  git_oid_cpy(&reuc->oid[2], their_oid);
1060
1068
  }
1061
1069
 
@@ -1347,7 +1355,8 @@ static int index_insert(
1347
1355
  size_t path_length, position;
1348
1356
  int error;
1349
1357
 
1350
- assert(index && entry_ptr);
1358
+ GIT_ASSERT_ARG(index);
1359
+ GIT_ASSERT_ARG(entry_ptr);
1351
1360
 
1352
1361
  entry = *entry_ptr;
1353
1362
 
@@ -1472,7 +1481,8 @@ int git_index_add_from_buffer(
1472
1481
  int error = 0;
1473
1482
  git_oid id;
1474
1483
 
1475
- assert(index && source_entry->path);
1484
+ GIT_ASSERT_ARG(index);
1485
+ GIT_ASSERT_ARG(source_entry && source_entry->path);
1476
1486
 
1477
1487
  if (INDEX_OWNER(index) == NULL)
1478
1488
  return create_index_error(-1,
@@ -1522,7 +1532,7 @@ static int add_repo_as_submodule(git_index_entry **out, git_index *index, const
1522
1532
  struct stat st;
1523
1533
  int error;
1524
1534
 
1525
- if ((error = git_buf_joinpath(&abspath, git_repository_workdir(repo), path)) < 0)
1535
+ if ((error = git_repository_workdir_path(&abspath, repo, path)) < 0)
1526
1536
  return error;
1527
1537
 
1528
1538
  if ((error = p_stat(abspath.ptr, &st)) < 0) {
@@ -1557,7 +1567,8 @@ int git_index_add_bypath(git_index *index, const char *path)
1557
1567
  git_index_entry *entry = NULL;
1558
1568
  int ret;
1559
1569
 
1560
- assert(index && path);
1570
+ GIT_ASSERT_ARG(index);
1571
+ GIT_ASSERT_ARG(path);
1561
1572
 
1562
1573
  if ((ret = index_entry_init(&entry, index, path)) == 0)
1563
1574
  ret = index_insert(index, &entry, 1, false, false, true);
@@ -1609,7 +1620,8 @@ int git_index_remove_bypath(git_index *index, const char *path)
1609
1620
  {
1610
1621
  int ret;
1611
1622
 
1612
- assert(index && path);
1623
+ GIT_ASSERT_ARG(index);
1624
+ GIT_ASSERT_ARG(path);
1613
1625
 
1614
1626
  if (((ret = git_index_remove(index, path, 0)) < 0 &&
1615
1627
  ret != GIT_ENOTFOUND) ||
@@ -1629,7 +1641,7 @@ int git_index__fill(git_index *index, const git_vector *source_entries)
1629
1641
  int error = 0;
1630
1642
  size_t i;
1631
1643
 
1632
- assert(index);
1644
+ GIT_ASSERT_ARG(index);
1633
1645
 
1634
1646
  if (!source_entries->length)
1635
1647
  return 0;
@@ -1670,7 +1682,8 @@ int git_index_add(git_index *index, const git_index_entry *source_entry)
1670
1682
  git_index_entry *entry = NULL;
1671
1683
  int ret;
1672
1684
 
1673
- assert(index && source_entry && source_entry->path);
1685
+ GIT_ASSERT_ARG(index);
1686
+ GIT_ASSERT_ARG(source_entry && source_entry->path);
1674
1687
 
1675
1688
  if (!valid_filemode(source_entry->mode)) {
1676
1689
  git_error_set(GIT_ERROR_INDEX, "invalid entry mode");
@@ -1758,7 +1771,8 @@ int git_index_find_prefix(size_t *at_pos, git_index *index, const char *prefix)
1758
1771
  int git_index__find_pos(
1759
1772
  size_t *out, git_index *index, const char *path, size_t path_len, int stage)
1760
1773
  {
1761
- assert(index && path);
1774
+ GIT_ASSERT_ARG(index);
1775
+ GIT_ASSERT_ARG(path);
1762
1776
  return index_find(out, index, path, path_len, stage);
1763
1777
  }
1764
1778
 
@@ -1766,7 +1780,8 @@ int git_index_find(size_t *at_pos, git_index *index, const char *path)
1766
1780
  {
1767
1781
  size_t pos;
1768
1782
 
1769
- assert(index && path);
1783
+ GIT_ASSERT_ARG(index);
1784
+ GIT_ASSERT_ARG(path);
1770
1785
 
1771
1786
  if (git_vector_bsearch2(
1772
1787
  &pos, &index->entries, index->entries_search_path, path) < 0) {
@@ -1799,7 +1814,7 @@ int git_index_conflict_add(git_index *index,
1799
1814
  unsigned short i;
1800
1815
  int ret = 0;
1801
1816
 
1802
- assert (index);
1817
+ GIT_ASSERT_ARG(index);
1803
1818
 
1804
1819
  if ((ancestor_entry &&
1805
1820
  (ret = index_entry_dup(&entries[0], index, ancestor_entry)) < 0) ||
@@ -1870,7 +1885,10 @@ static int index_conflict__get_byindex(
1870
1885
  size_t count;
1871
1886
  int stage, len = 0;
1872
1887
 
1873
- assert(ancestor_out && our_out && their_out && index);
1888
+ GIT_ASSERT_ARG(ancestor_out);
1889
+ GIT_ASSERT_ARG(our_out);
1890
+ GIT_ASSERT_ARG(their_out);
1891
+ GIT_ASSERT_ARG(index);
1874
1892
 
1875
1893
  *ancestor_out = NULL;
1876
1894
  *our_out = NULL;
@@ -1916,7 +1934,11 @@ int git_index_conflict_get(
1916
1934
  size_t pos;
1917
1935
  int len = 0;
1918
1936
 
1919
- assert(ancestor_out && our_out && their_out && index && path);
1937
+ GIT_ASSERT_ARG(ancestor_out);
1938
+ GIT_ASSERT_ARG(our_out);
1939
+ GIT_ASSERT_ARG(their_out);
1940
+ GIT_ASSERT_ARG(index);
1941
+ GIT_ASSERT_ARG(path);
1920
1942
 
1921
1943
  *ancestor_out = NULL;
1922
1944
  *our_out = NULL;
@@ -1963,13 +1985,14 @@ static int index_conflict_remove(git_index *index, const char *path)
1963
1985
 
1964
1986
  int git_index_conflict_remove(git_index *index, const char *path)
1965
1987
  {
1966
- assert(index && path);
1988
+ GIT_ASSERT_ARG(index);
1989
+ GIT_ASSERT_ARG(path);
1967
1990
  return index_conflict_remove(index, path);
1968
1991
  }
1969
1992
 
1970
1993
  int git_index_conflict_cleanup(git_index *index)
1971
1994
  {
1972
- assert(index);
1995
+ GIT_ASSERT_ARG(index);
1973
1996
  return index_conflict_remove(index, NULL);
1974
1997
  }
1975
1998
 
@@ -1978,7 +2001,7 @@ int git_index_has_conflicts(const git_index *index)
1978
2001
  size_t i;
1979
2002
  git_index_entry *entry;
1980
2003
 
1981
- assert(index);
2004
+ GIT_ASSERT_ARG(index);
1982
2005
 
1983
2006
  git_vector_foreach(&index->entries, i, entry) {
1984
2007
  if (GIT_INDEX_ENTRY_STAGE(entry) > 0)
@@ -1995,7 +2018,8 @@ int git_index_iterator_new(
1995
2018
  git_index_iterator *it;
1996
2019
  int error;
1997
2020
 
1998
- assert(iterator_out && index);
2021
+ GIT_ASSERT_ARG(iterator_out);
2022
+ GIT_ASSERT_ARG(index);
1999
2023
 
2000
2024
  it = git__calloc(1, sizeof(git_index_iterator));
2001
2025
  GIT_ERROR_CHECK_ALLOC(it);
@@ -2015,7 +2039,8 @@ int git_index_iterator_next(
2015
2039
  const git_index_entry **out,
2016
2040
  git_index_iterator *it)
2017
2041
  {
2018
- assert(out && it);
2042
+ GIT_ASSERT_ARG(out);
2043
+ GIT_ASSERT_ARG(it);
2019
2044
 
2020
2045
  if (it->cur >= git_vector_length(&it->snap))
2021
2046
  return GIT_ITEROVER;
@@ -2039,7 +2064,8 @@ int git_index_conflict_iterator_new(
2039
2064
  {
2040
2065
  git_index_conflict_iterator *it = NULL;
2041
2066
 
2042
- assert(iterator_out && index);
2067
+ GIT_ASSERT_ARG(iterator_out);
2068
+ GIT_ASSERT_ARG(index);
2043
2069
 
2044
2070
  it = git__calloc(1, sizeof(git_index_conflict_iterator));
2045
2071
  GIT_ERROR_CHECK_ALLOC(it);
@@ -2059,7 +2085,10 @@ int git_index_conflict_next(
2059
2085
  const git_index_entry *entry;
2060
2086
  int len;
2061
2087
 
2062
- assert(ancestor_out && our_out && their_out && iterator);
2088
+ GIT_ASSERT_ARG(ancestor_out);
2089
+ GIT_ASSERT_ARG(our_out);
2090
+ GIT_ASSERT_ARG(their_out);
2091
+ GIT_ASSERT_ARG(iterator);
2063
2092
 
2064
2093
  *ancestor_out = NULL;
2065
2094
  *our_out = NULL;
@@ -2097,14 +2126,14 @@ void git_index_conflict_iterator_free(git_index_conflict_iterator *iterator)
2097
2126
 
2098
2127
  size_t git_index_name_entrycount(git_index *index)
2099
2128
  {
2100
- assert(index);
2129
+ GIT_ASSERT_ARG(index);
2101
2130
  return index->names.length;
2102
2131
  }
2103
2132
 
2104
2133
  const git_index_name_entry *git_index_name_get_byindex(
2105
2134
  git_index *index, size_t n)
2106
2135
  {
2107
- assert(index);
2136
+ GIT_ASSERT_ARG_WITH_RETVAL(index, NULL);
2108
2137
 
2109
2138
  git_vector_sort(&index->names);
2110
2139
  return git_vector_get(&index->names, n);
@@ -2125,7 +2154,7 @@ int git_index_name_add(git_index *index,
2125
2154
  {
2126
2155
  git_index_name_entry *conflict_name;
2127
2156
 
2128
- assert((ancestor && ours) || (ancestor && theirs) || (ours && theirs));
2157
+ GIT_ASSERT_ARG((ancestor && ours) || (ancestor && theirs) || (ours && theirs));
2129
2158
 
2130
2159
  conflict_name = git__calloc(1, sizeof(git_index_name_entry));
2131
2160
  GIT_ERROR_CHECK_ALLOC(conflict_name);
@@ -2148,7 +2177,7 @@ int git_index_name_clear(git_index *index)
2148
2177
  size_t i;
2149
2178
  git_index_name_entry *conflict_name;
2150
2179
 
2151
- assert(index);
2180
+ GIT_ASSERT_ARG(index);
2152
2181
 
2153
2182
  git_vector_foreach(&index->names, i, conflict_name)
2154
2183
  index_name_entry_free(conflict_name);
@@ -2162,7 +2191,7 @@ int git_index_name_clear(git_index *index)
2162
2191
 
2163
2192
  size_t git_index_reuc_entrycount(git_index *index)
2164
2193
  {
2165
- assert(index);
2194
+ GIT_ASSERT_ARG(index);
2166
2195
  return index->reuc.length;
2167
2196
  }
2168
2197
 
@@ -2179,8 +2208,9 @@ static int index_reuc_insert(
2179
2208
  {
2180
2209
  int res;
2181
2210
 
2182
- assert(index && reuc && reuc->path != NULL);
2183
- assert(git_vector_is_sorted(&index->reuc));
2211
+ GIT_ASSERT_ARG(index);
2212
+ GIT_ASSERT_ARG(reuc && reuc->path != NULL);
2213
+ GIT_ASSERT(git_vector_is_sorted(&index->reuc));
2184
2214
 
2185
2215
  res = git_vector_insert_sorted(&index->reuc, reuc, &index_reuc_on_dup);
2186
2216
  index->dirty = 1;
@@ -2196,7 +2226,8 @@ int git_index_reuc_add(git_index *index, const char *path,
2196
2226
  git_index_reuc_entry *reuc = NULL;
2197
2227
  int error = 0;
2198
2228
 
2199
- assert(index && path);
2229
+ GIT_ASSERT_ARG(index);
2230
+ GIT_ASSERT_ARG(path);
2200
2231
 
2201
2232
  if ((error = index_entry_reuc_init(&reuc, path, ancestor_mode,
2202
2233
  ancestor_oid, our_mode, our_oid, their_mode, their_oid)) < 0 ||
@@ -2215,12 +2246,14 @@ const git_index_reuc_entry *git_index_reuc_get_bypath(
2215
2246
  git_index *index, const char *path)
2216
2247
  {
2217
2248
  size_t pos;
2218
- assert(index && path);
2249
+
2250
+ GIT_ASSERT_ARG_WITH_RETVAL(index, NULL);
2251
+ GIT_ASSERT_ARG_WITH_RETVAL(path, NULL);
2219
2252
 
2220
2253
  if (!index->reuc.length)
2221
2254
  return NULL;
2222
2255
 
2223
- assert(git_vector_is_sorted(&index->reuc));
2256
+ GIT_ASSERT_WITH_RETVAL(git_vector_is_sorted(&index->reuc), NULL);
2224
2257
 
2225
2258
  if (git_index_reuc_find(&pos, index, path) < 0)
2226
2259
  return NULL;
@@ -2231,8 +2264,8 @@ const git_index_reuc_entry *git_index_reuc_get_bypath(
2231
2264
  const git_index_reuc_entry *git_index_reuc_get_byindex(
2232
2265
  git_index *index, size_t n)
2233
2266
  {
2234
- assert(index);
2235
- assert(git_vector_is_sorted(&index->reuc));
2267
+ GIT_ASSERT_ARG_WITH_RETVAL(index, NULL);
2268
+ GIT_ASSERT_WITH_RETVAL(git_vector_is_sorted(&index->reuc), NULL);
2236
2269
 
2237
2270
  return git_vector_get(&index->reuc, n);
2238
2271
  }
@@ -2242,7 +2275,8 @@ int git_index_reuc_remove(git_index *index, size_t position)
2242
2275
  int error;
2243
2276
  git_index_reuc_entry *reuc;
2244
2277
 
2245
- assert(git_vector_is_sorted(&index->reuc));
2278
+ GIT_ASSERT_ARG(index);
2279
+ GIT_ASSERT(git_vector_is_sorted(&index->reuc));
2246
2280
 
2247
2281
  reuc = git_vector_get(&index->reuc, position);
2248
2282
  error = git_vector_remove(&index->reuc, position);
@@ -2258,10 +2292,10 @@ int git_index_reuc_clear(git_index *index)
2258
2292
  {
2259
2293
  size_t i;
2260
2294
 
2261
- assert(index);
2295
+ GIT_ASSERT_ARG(index);
2262
2296
 
2263
2297
  for (i = 0; i < index->reuc.length; ++i)
2264
- index_entry_reuc_free(git__swap(index->reuc.contents[i], NULL));
2298
+ index_entry_reuc_free(git_atomic_swap(index->reuc.contents[i], NULL));
2265
2299
 
2266
2300
  git_vector_clear(&index->reuc);
2267
2301
 
@@ -2626,7 +2660,7 @@ static int parse_index(git_index *index, const char *buffer, size_t buffer_size)
2626
2660
 
2627
2661
  seek_forward(INDEX_HEADER_SIZE);
2628
2662
 
2629
- assert(!index->entries.length);
2663
+ GIT_ASSERT(!index->entries.length);
2630
2664
 
2631
2665
  if ((error = index_map_resize(index->entries_map, header.entry_count, index->ignore_case)) < 0)
2632
2666
  return error;
@@ -2799,7 +2833,8 @@ static int write_disk_entry(git_filebuf *file, git_index_entry *entry, const cha
2799
2833
  if (last) {
2800
2834
  varint_len = git_encode_varint((unsigned char *) path,
2801
2835
  disk_size, strlen(last) - same_len);
2802
- assert(varint_len > 0);
2836
+ GIT_ASSERT(varint_len > 0);
2837
+
2803
2838
  path += varint_len;
2804
2839
  disk_size -= varint_len;
2805
2840
 
@@ -2807,14 +2842,14 @@ static int write_disk_entry(git_filebuf *file, git_index_entry *entry, const cha
2807
2842
  * If using path compression, we are not allowed
2808
2843
  * to have additional trailing NULs.
2809
2844
  */
2810
- assert(disk_size == path_len + 1);
2845
+ GIT_ASSERT(disk_size == path_len + 1);
2811
2846
  } else {
2812
2847
  /*
2813
2848
  * If no path compression is used, we do have
2814
2849
  * NULs as padding. As such, simply assert that
2815
2850
  * we have enough space left to write the path.
2816
2851
  */
2817
- assert(disk_size > path_len);
2852
+ GIT_ASSERT(disk_size > path_len);
2818
2853
  }
2819
2854
 
2820
2855
  memcpy(path, path_start, path_len + 1);
@@ -3011,7 +3046,8 @@ static int write_index(git_oid *checksum, git_index *index, git_filebuf *file)
3011
3046
  bool is_extended;
3012
3047
  uint32_t index_version_number;
3013
3048
 
3014
- assert(index && file);
3049
+ GIT_ASSERT_ARG(index);
3050
+ GIT_ASSERT_ARG(file);
3015
3051
 
3016
3052
  if (index->version <= INDEX_VERSION_NUMBER_EXT) {
3017
3053
  is_extended = is_index_extended(index);
@@ -3162,7 +3198,7 @@ int git_index_read_tree(git_index *index, const git_tree *tree)
3162
3198
  /* well, this isn't good */;
3163
3199
  } else {
3164
3200
  git_vector_swap(&entries, &index->entries);
3165
- entries_map = git__swap(index->entries_map, entries_map);
3201
+ entries_map = git_atomic_swap(index->entries_map, entries_map);
3166
3202
  }
3167
3203
 
3168
3204
  index->dirty = 1;
@@ -3193,7 +3229,7 @@ static int git_index_read_iterator(
3193
3229
  size_t i;
3194
3230
  int error;
3195
3231
 
3196
- assert((new_iterator->flags & GIT_ITERATOR_DONT_IGNORE_CASE));
3232
+ GIT_ASSERT((new_iterator->flags & GIT_ITERATOR_DONT_IGNORE_CASE));
3197
3233
 
3198
3234
  if ((error = git_vector_init(&new_entries, new_length_hint, index->entries._cmp)) < 0 ||
3199
3235
  (error = git_vector_init(&remove_entries, index->entries.length, NULL)) < 0 ||
@@ -3296,7 +3332,7 @@ static int git_index_read_iterator(
3296
3332
  goto done;
3297
3333
 
3298
3334
  git_vector_swap(&new_entries, &index->entries);
3299
- new_entries_map = git__swap(index->entries_map, new_entries_map);
3335
+ new_entries_map = git_atomic_swap(index->entries_map, new_entries_map);
3300
3336
 
3301
3337
  git_vector_foreach(&remove_entries, i, entry) {
3302
3338
  if (index->tree)
@@ -3365,7 +3401,7 @@ int git_index_add_all(
3365
3401
  git_pathspec ps;
3366
3402
  bool no_fnmatch = (flags & GIT_INDEX_ADD_DISABLE_PATHSPEC_MATCH) != 0;
3367
3403
 
3368
- assert(index);
3404
+ GIT_ASSERT_ARG(index);
3369
3405
 
3370
3406
  repo = INDEX_OWNER(index);
3371
3407
  if ((error = git_repository__ensure_not_bare(repo, "index add all")) < 0)
@@ -3451,8 +3487,8 @@ static int index_apply_to_wd_diff(git_index *index, int action, const git_strarr
3451
3487
  payload,
3452
3488
  };
3453
3489
 
3454
- assert(index);
3455
- assert(action == INDEX_ACTION_UPDATE || action == INDEX_ACTION_ADDALL);
3490
+ GIT_ASSERT_ARG(index);
3491
+ GIT_ASSERT_ARG(action == INDEX_ACTION_UPDATE || action == INDEX_ACTION_ADDALL);
3456
3492
 
3457
3493
  repo = INDEX_OWNER(index);
3458
3494
 
@@ -3506,7 +3542,7 @@ static int index_apply_to_all(
3506
3542
  const char *match;
3507
3543
  git_buf path = GIT_BUF_INIT;
3508
3544
 
3509
- assert(index);
3545
+ GIT_ASSERT_ARG(index);
3510
3546
 
3511
3547
  if ((error = git_pathspec__init(&ps, paths)) < 0)
3512
3548
  return error;
@@ -3602,7 +3638,7 @@ int git_index_snapshot_new(git_vector *snap, git_index *index)
3602
3638
 
3603
3639
  GIT_REFCOUNT_INC(index);
3604
3640
 
3605
- git_atomic_inc(&index->readers);
3641
+ git_atomic32_inc(&index->readers);
3606
3642
  git_vector_sort(&index->entries);
3607
3643
 
3608
3644
  error = git_vector_dup(snap, &index->entries, index->entries._cmp);
@@ -3617,7 +3653,7 @@ void git_index_snapshot_release(git_vector *snap, git_index *index)
3617
3653
  {
3618
3654
  git_vector_free(snap);
3619
3655
 
3620
- git_atomic_dec(&index->readers);
3656
+ git_atomic32_dec(&index->readers);
3621
3657
 
3622
3658
  git_index_free(index);
3623
3659
  }