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
@@ -67,8 +67,6 @@ extern int git_path_basename_r(git_buf *buffer, const char *path);
67
67
  */
68
68
  extern size_t git_path_basename_offset(git_buf *buffer);
69
69
 
70
- extern const char *git_path_topdir(const char *path);
71
-
72
70
  /**
73
71
  * Find offset to root of path if path has one.
74
72
  *
@@ -285,7 +283,7 @@ extern int git_path_prettify_dir(git_buf *path_out, const char *path, const char
285
283
  * appends the trailing '/'. If the path does not exist, it is
286
284
  * treated like a regular filename.
287
285
  */
288
- extern int git_path_find_dir(git_buf *dir, const char *path, const char *base);
286
+ extern int git_path_find_dir(git_buf *dir);
289
287
 
290
288
  /**
291
289
  * Resolve relative references within a path.
@@ -628,20 +626,95 @@ extern int git_path_from_url_or_path(git_buf *local_path_out, const char *url_or
628
626
  #define GIT_PATH_REJECT_INDEX_DEFAULTS \
629
627
  GIT_PATH_REJECT_TRAVERSAL | GIT_PATH_REJECT_DOT_GIT
630
628
 
631
- /*
632
- * Determine whether a path is a valid git path or not - this must not contain
629
+ /**
630
+ * Validate a "bare" git path. This ensures that the given path is legal
631
+ * to place in the index or a tree. This should be checked by mechanisms
632
+ * like `git_index_add` and `git_treebuilder_insert` when taking user
633
+ * data, and by `git_checkout` before constructing on-disk paths.
634
+ *
635
+ * This will ensure that a git path does not contain any "unsafe" components,
633
636
  * a '.' or '..' component, or a component that is ".git" (in any case).
634
637
  *
638
+ * (Note: if you take or construct an on-disk path -- a workdir path,
639
+ * a path to a git repository or a reference name that could be a loose
640
+ * ref -- you should _also_ validate that with `git_path_validate_workdir`.)
641
+ *
635
642
  * `repo` is optional. If specified, it will be used to determine the short
636
643
  * path name to reject (if `GIT_PATH_REJECT_DOS_SHORTNAME` is specified),
637
644
  * in addition to the default of "git~1".
638
645
  */
639
- extern bool git_path_isvalid(
646
+ extern bool git_path_validate(
640
647
  git_repository *repo,
641
648
  const char *path,
642
649
  uint16_t mode,
643
650
  unsigned int flags);
644
651
 
652
+ /**
653
+ * Validate an on-disk path, taking into account that it will have a
654
+ * suffix appended (eg, `.lock`).
655
+ */
656
+ GIT_INLINE(int) git_path_validate_filesystem_with_suffix(
657
+ const char *path,
658
+ size_t path_len,
659
+ size_t suffix_len)
660
+ {
661
+ #ifdef GIT_WIN32
662
+ size_t path_chars, total_chars;
663
+
664
+ path_chars = git_utf8_char_length(path, path_len);
665
+
666
+ if (GIT_ADD_SIZET_OVERFLOW(&total_chars, path_chars, suffix_len) ||
667
+ total_chars > MAX_PATH) {
668
+ git_error_set(GIT_ERROR_FILESYSTEM, "path too long: '%s'", path);
669
+ return -1;
670
+ }
671
+ return 0;
672
+ #else
673
+ GIT_UNUSED(path);
674
+ GIT_UNUSED(path_len);
675
+ GIT_UNUSED(suffix_len);
676
+ return 0;
677
+ #endif
678
+ }
679
+
680
+ /**
681
+ * Validate an path on the filesystem. This ensures that the given
682
+ * path is valid for the operating system/platform; for example, this
683
+ * will ensure that the given absolute path is smaller than MAX_PATH on
684
+ * Windows.
685
+ *
686
+ * For paths within the working directory, you should use ensure that
687
+ * `core.longpaths` is obeyed. Use `git_path_validate_workdir`.
688
+ */
689
+ GIT_INLINE(int) git_path_validate_filesystem(
690
+ const char *path,
691
+ size_t path_len)
692
+ {
693
+ return git_path_validate_filesystem_with_suffix(path, path_len, 0);
694
+ }
695
+
696
+ /**
697
+ * Validate a path relative to the repo's worktree. This ensures that
698
+ * the given working tree path is valid for the operating system/platform.
699
+ * This will ensure that an absolute path is smaller than MAX_PATH on
700
+ * Windows, while keeping `core.longpaths` configuration settings in mind.
701
+ *
702
+ * This should be checked by mechamisms like `git_checkout` after
703
+ * contructing on-disk paths and before trying to write them.
704
+ *
705
+ * If the repository is null, no repository configuration is applied.
706
+ */
707
+ extern int git_path_validate_workdir(
708
+ git_repository *repo,
709
+ const char *path);
710
+ extern int git_path_validate_workdir_with_len(
711
+ git_repository *repo,
712
+ const char *path,
713
+ size_t path_len);
714
+ extern int git_path_validate_workdir_buf(
715
+ git_repository *repo,
716
+ git_buf *buf);
717
+
645
718
  /**
646
719
  * Convert any backslashes into slashes
647
720
  */
@@ -9,7 +9,6 @@
9
9
 
10
10
  #include "git2/pathspec.h"
11
11
  #include "git2/diff.h"
12
- #include "buf_text.h"
13
12
  #include "attr_file.h"
14
13
  #include "iterator.h"
15
14
  #include "repository.h"
@@ -25,7 +24,7 @@ char *git_pathspec_prefix(const git_strarray *pathspec)
25
24
  const char *scan;
26
25
 
27
26
  if (!pathspec || !pathspec->count ||
28
- git_buf_text_common_prefix(&prefix, pathspec) < 0)
27
+ git_buf_common_prefix(&prefix, pathspec) < 0)
29
28
  return NULL;
30
29
 
31
30
  /* diff prefix will only be leading non-wildcards */
@@ -41,7 +40,7 @@ char *git_pathspec_prefix(const git_strarray *pathspec)
41
40
  return NULL;
42
41
  }
43
42
 
44
- git_buf_text_unescape(&prefix);
43
+ git_buf_unescape(&prefix);
45
44
 
46
45
  return git_buf_detach(&prefix);
47
46
  }
@@ -289,7 +288,8 @@ int git_pathspec_matches_path(
289
288
  bool no_fnmatch = (flags & GIT_PATHSPEC_NO_GLOB) != 0;
290
289
  bool casefold = (flags & GIT_PATHSPEC_IGNORE_CASE) != 0;
291
290
 
292
- assert(ps && path);
291
+ GIT_ASSERT_ARG(ps);
292
+ GIT_ASSERT_ARG(path);
293
293
 
294
294
  return (0 != git_pathspec__match(
295
295
  &ps->pathspec, path, no_fnmatch, casefold, NULL, NULL));
@@ -526,7 +526,7 @@ int git_pathspec_match_workdir(
526
526
  git_iterator_options iter_opts = GIT_ITERATOR_OPTIONS_INIT;
527
527
  int error = 0;
528
528
 
529
- assert(repo);
529
+ GIT_ASSERT_ARG(repo);
530
530
 
531
531
  iter_opts.flags = pathspec_match_iter_flags(flags);
532
532
 
@@ -548,7 +548,7 @@ int git_pathspec_match_index(
548
548
  git_iterator_options iter_opts = GIT_ITERATOR_OPTIONS_INIT;
549
549
  int error = 0;
550
550
 
551
- assert(index);
551
+ GIT_ASSERT_ARG(index);
552
552
 
553
553
  iter_opts.flags = pathspec_match_iter_flags(flags);
554
554
 
@@ -570,7 +570,7 @@ int git_pathspec_match_tree(
570
570
  git_iterator_options iter_opts = GIT_ITERATOR_OPTIONS_INIT;
571
571
  int error = 0;
572
572
 
573
- assert(tree);
573
+ GIT_ASSERT_ARG(tree);
574
574
 
575
575
  iter_opts.flags = pathspec_match_iter_flags(flags);
576
576
 
@@ -598,7 +598,7 @@ int git_pathspec_match_diff(
598
598
  const git_diff_delta *delta, **match;
599
599
  git_bitvec used_patterns;
600
600
 
601
- assert(diff);
601
+ GIT_ASSERT_ARG(diff);
602
602
 
603
603
  if (git_bitvec_init(&used_patterns, patterns->length) < 0)
604
604
  return -1;
@@ -36,8 +36,8 @@ int git_pool_global_init(void)
36
36
 
37
37
  int git_pool_init(git_pool *pool, size_t item_size)
38
38
  {
39
- assert(pool);
40
- assert(item_size >= 1);
39
+ GIT_ASSERT_ARG(pool);
40
+ GIT_ASSERT_ARG(item_size >= 1);
41
41
 
42
42
  memset(pool, 0, sizeof(git_pool));
43
43
  pool->item_size = item_size;
@@ -131,8 +131,8 @@ static int git_pool__ptr_cmp(const void * a, const void * b)
131
131
 
132
132
  int git_pool_init(git_pool *pool, size_t item_size)
133
133
  {
134
- assert(pool);
135
- assert(item_size >= 1);
134
+ GIT_ASSERT_ARG(pool);
135
+ GIT_ASSERT_ARG(item_size >= 1);
136
136
 
137
137
  memset(pool, 0, sizeof(git_pool));
138
138
  pool->item_size = item_size;
@@ -205,7 +205,9 @@ char *git_pool_strndup(git_pool *pool, const char *str, size_t n)
205
205
  {
206
206
  char *ptr = NULL;
207
207
 
208
- assert(pool && str && pool->item_size == sizeof(char));
208
+ GIT_ASSERT_ARG_WITH_RETVAL(pool, NULL);
209
+ GIT_ASSERT_ARG_WITH_RETVAL(str, NULL);
210
+ GIT_ASSERT_ARG_WITH_RETVAL(pool->item_size == sizeof(char), NULL);
209
211
 
210
212
  if (n == SIZE_MAX)
211
213
  return NULL;
@@ -220,7 +222,10 @@ char *git_pool_strndup(git_pool *pool, const char *str, size_t n)
220
222
 
221
223
  char *git_pool_strdup(git_pool *pool, const char *str)
222
224
  {
223
- assert(pool && str && pool->item_size == sizeof(char));
225
+ GIT_ASSERT_ARG_WITH_RETVAL(pool, NULL);
226
+ GIT_ASSERT_ARG_WITH_RETVAL(str, NULL);
227
+ GIT_ASSERT_ARG_WITH_RETVAL(pool->item_size == sizeof(char), NULL);
228
+
224
229
  return git_pool_strndup(pool, str, strlen(str));
225
230
  }
226
231
 
@@ -234,7 +239,8 @@ char *git_pool_strcat(git_pool *pool, const char *a, const char *b)
234
239
  void *ptr;
235
240
  size_t len_a, len_b, total;
236
241
 
237
- assert(pool && pool->item_size == sizeof(char));
242
+ GIT_ASSERT_ARG_WITH_RETVAL(pool, NULL);
243
+ GIT_ASSERT_ARG_WITH_RETVAL(pool->item_size == sizeof(char), NULL);
238
244
 
239
245
  len_a = a ? strlen(a) : 0;
240
246
  len_b = b ? strlen(b) : 0;
@@ -109,6 +109,13 @@ int p_open(const char *path, volatile int flags, ...)
109
109
  {
110
110
  mode_t mode = 0;
111
111
 
112
+ #ifdef GIT_DEBUG_STRICT_OPEN
113
+ if (strstr(path, "//") != NULL) {
114
+ errno = EACCES;
115
+ return -1;
116
+ }
117
+ #endif
118
+
112
119
  if (flags & O_CREAT) {
113
120
  va_list arg_list;
114
121
 
@@ -129,7 +136,8 @@ int p_getcwd(char *buffer_out, size_t size)
129
136
  {
130
137
  char *cwd_buffer;
131
138
 
132
- assert(buffer_out && size > 0);
139
+ GIT_ASSERT_ARG(buffer_out);
140
+ GIT_ASSERT_ARG(size > 0);
133
141
 
134
142
  cwd_buffer = getcwd(buffer_out, size);
135
143
 
@@ -196,7 +204,7 @@ int p_write(git_file fd, const void *buf, size_t cnt)
196
204
  while (cnt) {
197
205
  ssize_t r;
198
206
  #ifdef GIT_WIN32
199
- assert((size_t)((unsigned int)cnt) == cnt);
207
+ GIT_ASSERT((size_t)((unsigned int)cnt) == cnt);
200
208
  r = write(fd, b, (unsigned int)cnt);
201
209
  #else
202
210
  r = write(fd, b, cnt);
@@ -282,7 +290,7 @@ int p_mmap(git_map *out, size_t len, int prot, int flags, int fd, off64_t offset
282
290
 
283
291
  int p_munmap(git_map *map)
284
292
  {
285
- assert(map != NULL);
293
+ GIT_ASSERT_ARG(map);
286
294
  git__free(map->data);
287
295
 
288
296
  /* Initializing will help debug use-after-free */
@@ -61,7 +61,8 @@ int git_reader_for_tree(git_reader **out, git_tree *tree)
61
61
  {
62
62
  tree_reader *reader;
63
63
 
64
- assert(out && tree);
64
+ GIT_ASSERT_ARG(out);
65
+ GIT_ASSERT_ARG(tree);
65
66
 
66
67
  reader = git__calloc(1, sizeof(tree_reader));
67
68
  GIT_ERROR_CHECK_ALLOC(reader);
@@ -97,8 +98,7 @@ static int workdir_reader_read(
97
98
  git_oid id;
98
99
  int error;
99
100
 
100
- if ((error = git_buf_joinpath(&path,
101
- git_repository_workdir(reader->repo), filename)) < 0)
101
+ if ((error = git_repository_workdir_path(&path, reader->repo, filename)) < 0)
102
102
  goto done;
103
103
 
104
104
  if ((error = p_lstat(path.ptr, &st)) < 0) {
@@ -158,7 +158,8 @@ int git_reader_for_workdir(
158
158
  workdir_reader *reader;
159
159
  int error;
160
160
 
161
- assert(out && repo);
161
+ GIT_ASSERT_ARG(out);
162
+ GIT_ASSERT_ARG(repo);
162
163
 
163
164
  reader = git__calloc(1, sizeof(workdir_reader));
164
165
  GIT_ERROR_CHECK_ALLOC(reader);
@@ -223,7 +224,8 @@ int git_reader_for_index(
223
224
  index_reader *reader;
224
225
  int error;
225
226
 
226
- assert(out && repo);
227
+ GIT_ASSERT_ARG(out);
228
+ GIT_ASSERT_ARG(repo);
227
229
 
228
230
  reader = git__calloc(1, sizeof(index_reader));
229
231
  GIT_ERROR_CHECK_ALLOC(reader);
@@ -251,7 +253,9 @@ int git_reader_read(
251
253
  git_reader *reader,
252
254
  const char *filename)
253
255
  {
254
- assert(out && reader && filename);
256
+ GIT_ASSERT_ARG(out);
257
+ GIT_ASSERT_ARG(reader);
258
+ GIT_ASSERT_ARG(filename);
255
259
 
256
260
  return reader->read(out, out_id, out_filemode, reader, filename);
257
261
  }
@@ -186,8 +186,8 @@ static git_rebase_operation *rebase_operation_alloc(
186
186
  {
187
187
  git_rebase_operation *operation;
188
188
 
189
- assert((type == GIT_REBASE_OPERATION_EXEC) == !id);
190
- assert((type == GIT_REBASE_OPERATION_EXEC) == !!exec);
189
+ GIT_ASSERT_WITH_RETVAL((type == GIT_REBASE_OPERATION_EXEC) == !id, NULL);
190
+ GIT_ASSERT_WITH_RETVAL((type == GIT_REBASE_OPERATION_EXEC) == !!exec, NULL);
191
191
 
192
192
  if ((operation = git_array_alloc(rebase->operations)) == NULL)
193
193
  return NULL;
@@ -301,7 +301,7 @@ int git_rebase_open(
301
301
  size_t state_path_len;
302
302
  int error;
303
303
 
304
- assert(repo);
304
+ GIT_ASSERT_ARG(repo);
305
305
 
306
306
  if ((error = rebase_check_versions(given_opts)) < 0)
307
307
  return error;
@@ -701,7 +701,8 @@ int git_rebase_init(
701
701
  bool inmemory = (given_opts && given_opts->inmemory);
702
702
  int error;
703
703
 
704
- assert(repo && (upstream || onto));
704
+ GIT_ASSERT_ARG(repo);
705
+ GIT_ASSERT_ARG(upstream || onto);
705
706
 
706
707
  *out = NULL;
707
708
 
@@ -912,7 +913,8 @@ int git_rebase_next(
912
913
  {
913
914
  int error;
914
915
 
915
- assert(out && rebase);
916
+ GIT_ASSERT_ARG(out);
917
+ GIT_ASSERT_ARG(rebase);
916
918
 
917
919
  if ((error = rebase_movenext(rebase)) < 0)
918
920
  return error;
@@ -931,7 +933,9 @@ int git_rebase_inmemory_index(
931
933
  git_index **out,
932
934
  git_rebase *rebase)
933
935
  {
934
- assert(out && rebase && rebase->index);
936
+ GIT_ASSERT_ARG(out);
937
+ GIT_ASSERT_ARG(rebase);
938
+ GIT_ASSERT_ARG(rebase->index);
935
939
 
936
940
  GIT_REFCOUNT_INC(rebase->index);
937
941
  *out = rebase->index;
@@ -939,6 +943,54 @@ int git_rebase_inmemory_index(
939
943
  return 0;
940
944
  }
941
945
 
946
+ #ifndef GIT_DEPRECATE_HARD
947
+ static int create_signed(
948
+ git_oid *out,
949
+ git_rebase *rebase,
950
+ const git_signature *author,
951
+ const git_signature *committer,
952
+ const char *message_encoding,
953
+ const char *message,
954
+ git_tree *tree,
955
+ size_t parent_count,
956
+ const git_commit **parents)
957
+ {
958
+ git_buf commit_content = GIT_BUF_INIT,
959
+ commit_signature = GIT_BUF_INIT,
960
+ signature_field = GIT_BUF_INIT;
961
+ int error;
962
+
963
+ git_error_clear();
964
+
965
+ if ((error = git_commit_create_buffer(&commit_content,
966
+ rebase->repo, author, committer, message_encoding,
967
+ message, tree, parent_count, parents)) < 0)
968
+ goto done;
969
+
970
+ error = rebase->options.signing_cb(&commit_signature,
971
+ &signature_field, commit_content.ptr,
972
+ rebase->options.payload);
973
+
974
+ if (error) {
975
+ if (error != GIT_PASSTHROUGH)
976
+ git_error_set_after_callback_function(error, "signing_cb");
977
+
978
+ goto done;
979
+ }
980
+
981
+ error = git_commit_create_with_signature(out, rebase->repo,
982
+ commit_content.ptr,
983
+ commit_signature.size > 0 ? commit_signature.ptr : NULL,
984
+ signature_field.size > 0 ? signature_field.ptr : NULL);
985
+
986
+ done:
987
+ git_buf_dispose(&commit_signature);
988
+ git_buf_dispose(&signature_field);
989
+ git_buf_dispose(&commit_content);
990
+ return error;
991
+ }
992
+ #endif
993
+
942
994
  static int rebase_commit__create(
943
995
  git_commit **out,
944
996
  git_rebase *rebase,
@@ -953,10 +1005,6 @@ static int rebase_commit__create(
953
1005
  git_commit *current_commit = NULL, *commit = NULL;
954
1006
  git_tree *parent_tree = NULL, *tree = NULL;
955
1007
  git_oid tree_id, commit_id;
956
- git_buf commit_content = GIT_BUF_INIT, commit_signature = GIT_BUF_INIT,
957
- signature_field = GIT_BUF_INIT;
958
- const char *signature_field_string = NULL,
959
- *commit_signature_string = NULL;
960
1008
  int error;
961
1009
 
962
1010
  operation = git_array_get(rebase->operations, rebase->current);
@@ -987,37 +1035,32 @@ static int rebase_commit__create(
987
1035
  message = git_commit_message(current_commit);
988
1036
  }
989
1037
 
990
- if ((error = git_commit_create_buffer(&commit_content, rebase->repo, author, committer,
991
- message_encoding, message, tree, 1, (const git_commit **)&parent_commit)) < 0)
992
- goto done;
1038
+ git_error_clear();
1039
+ error = GIT_PASSTHROUGH;
993
1040
 
994
- if (rebase->options.signing_cb) {
995
- git_error_clear();
996
- error = git_error_set_after_callback_function(rebase->options.signing_cb(
997
- &commit_signature, &signature_field, git_buf_cstr(&commit_content),
998
- rebase->options.payload), "commit signing_cb failed");
999
- if (error == GIT_PASSTHROUGH) {
1000
- git_buf_dispose(&commit_signature);
1001
- git_buf_dispose(&signature_field);
1002
- git_error_clear();
1003
- error = GIT_OK;
1004
- } else if (error < 0)
1005
- goto done;
1006
- }
1041
+ if (rebase->options.commit_create_cb) {
1042
+ error = rebase->options.commit_create_cb(&commit_id,
1043
+ author, committer, message_encoding, message,
1044
+ tree, 1, (const git_commit **)&parent_commit,
1045
+ rebase->options.payload);
1007
1046
 
1008
- if (git_buf_is_allocated(&commit_signature)) {
1009
- assert(git_buf_contains_nul(&commit_signature));
1010
- commit_signature_string = git_buf_cstr(&commit_signature);
1047
+ git_error_set_after_callback_function(error,
1048
+ "commit_create_cb");
1011
1049
  }
1012
-
1013
- if (git_buf_is_allocated(&signature_field)) {
1014
- assert(git_buf_contains_nul(&signature_field));
1015
- signature_field_string = git_buf_cstr(&signature_field);
1050
+ #ifndef GIT_DEPRECATE_HARD
1051
+ else if (rebase->options.signing_cb) {
1052
+ error = create_signed(&commit_id, rebase, author,
1053
+ committer, message_encoding, message, tree,
1054
+ 1, (const git_commit **)&parent_commit);
1016
1055
  }
1056
+ #endif
1017
1057
 
1018
- if ((error = git_commit_create_with_signature(&commit_id, rebase->repo,
1019
- git_buf_cstr(&commit_content), commit_signature_string,
1020
- signature_field_string)))
1058
+ if (error == GIT_PASSTHROUGH)
1059
+ error = git_commit_create(&commit_id, rebase->repo, NULL,
1060
+ author, committer, message_encoding, message,
1061
+ tree, 1, (const git_commit **)&parent_commit);
1062
+
1063
+ if (error)
1021
1064
  goto done;
1022
1065
 
1023
1066
  if ((error = git_commit_lookup(&commit, rebase->repo, &commit_id)) < 0)
@@ -1029,9 +1072,6 @@ done:
1029
1072
  if (error < 0)
1030
1073
  git_commit_free(commit);
1031
1074
 
1032
- git_buf_dispose(&commit_signature);
1033
- git_buf_dispose(&signature_field);
1034
- git_buf_dispose(&commit_content);
1035
1075
  git_commit_free(current_commit);
1036
1076
  git_tree_free(parent_tree);
1037
1077
  git_tree_free(tree);
@@ -1055,7 +1095,7 @@ static int rebase_commit_merge(
1055
1095
  int error;
1056
1096
 
1057
1097
  operation = git_array_get(rebase->operations, rebase->current);
1058
- assert(operation);
1098
+ GIT_ASSERT(operation);
1059
1099
 
1060
1100
  if ((error = rebase_ensure_not_dirty(rebase->repo, false, true, GIT_EUNMERGED)) < 0 ||
1061
1101
  (error = git_repository_head(&head, rebase->repo)) < 0 ||
@@ -1095,9 +1135,9 @@ static int rebase_commit_inmemory(
1095
1135
  git_commit *commit = NULL;
1096
1136
  int error = 0;
1097
1137
 
1098
- assert(rebase->index);
1099
- assert(rebase->last_commit);
1100
- assert(rebase->current < rebase->operations.size);
1138
+ GIT_ASSERT_ARG(rebase->index);
1139
+ GIT_ASSERT_ARG(rebase->last_commit);
1140
+ GIT_ASSERT_ARG(rebase->current < rebase->operations.size);
1101
1141
 
1102
1142
  if ((error = rebase_commit__create(&commit, rebase, rebase->index,
1103
1143
  rebase->last_commit, author, committer, message_encoding, message)) < 0)
@@ -1125,7 +1165,8 @@ int git_rebase_commit(
1125
1165
  {
1126
1166
  int error;
1127
1167
 
1128
- assert(rebase && committer);
1168
+ GIT_ASSERT_ARG(rebase);
1169
+ GIT_ASSERT_ARG(committer);
1129
1170
 
1130
1171
  if (rebase->inmemory)
1131
1172
  error = rebase_commit_inmemory(
@@ -1145,7 +1186,7 @@ int git_rebase_abort(git_rebase *rebase)
1145
1186
  git_commit *orig_head_commit = NULL;
1146
1187
  int error;
1147
1188
 
1148
- assert(rebase);
1189
+ GIT_ASSERT_ARG(rebase);
1149
1190
 
1150
1191
  if (rebase->inmemory)
1151
1192
  return 0;
@@ -1358,7 +1399,7 @@ int git_rebase_finish(
1358
1399
  {
1359
1400
  int error = 0;
1360
1401
 
1361
- assert(rebase);
1402
+ GIT_ASSERT_ARG(rebase);
1362
1403
 
1363
1404
  if (rebase->inmemory)
1364
1405
  return 0;
@@ -1373,14 +1414,17 @@ int git_rebase_finish(
1373
1414
  }
1374
1415
 
1375
1416
  const char *git_rebase_orig_head_name(git_rebase *rebase) {
1417
+ GIT_ASSERT_ARG_WITH_RETVAL(rebase, NULL);
1376
1418
  return rebase->orig_head_name;
1377
1419
  }
1378
1420
 
1379
1421
  const git_oid *git_rebase_orig_head_id(git_rebase *rebase) {
1422
+ GIT_ASSERT_ARG_WITH_RETVAL(rebase, NULL);
1380
1423
  return &rebase->orig_head_id;
1381
1424
  }
1382
1425
 
1383
1426
  const char *git_rebase_onto_name(git_rebase *rebase) {
1427
+ GIT_ASSERT_ARG_WITH_RETVAL(rebase, NULL);
1384
1428
  return rebase->onto_name;
1385
1429
  }
1386
1430
 
@@ -1390,21 +1434,21 @@ const git_oid *git_rebase_onto_id(git_rebase *rebase) {
1390
1434
 
1391
1435
  size_t git_rebase_operation_entrycount(git_rebase *rebase)
1392
1436
  {
1393
- assert(rebase);
1437
+ GIT_ASSERT_ARG_WITH_RETVAL(rebase, 0);
1394
1438
 
1395
1439
  return git_array_size(rebase->operations);
1396
1440
  }
1397
1441
 
1398
1442
  size_t git_rebase_operation_current(git_rebase *rebase)
1399
1443
  {
1400
- assert(rebase);
1444
+ GIT_ASSERT_ARG_WITH_RETVAL(rebase, 0);
1401
1445
 
1402
1446
  return rebase->started ? rebase->current : GIT_REBASE_NO_OPERATION;
1403
1447
  }
1404
1448
 
1405
1449
  git_rebase_operation *git_rebase_operation_byindex(git_rebase *rebase, size_t idx)
1406
1450
  {
1407
- assert(rebase);
1451
+ GIT_ASSERT_ARG_WITH_RETVAL(rebase, NULL);
1408
1452
 
1409
1453
  return git_array_get(rebase->operations, idx);
1410
1454
  }