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
@@ -20,6 +20,14 @@
20
20
  #include "oidmap.h"
21
21
  #include "zstream.h"
22
22
 
23
+ /**
24
+ * Function type for callbacks from git_pack_foreach_entry_offset.
25
+ */
26
+ typedef int git_pack_foreach_entry_offset_cb(
27
+ const git_oid *id,
28
+ off64_t offset,
29
+ void *payload);
30
+
23
31
  #define GIT_PACK_FILE_MODE 0444
24
32
 
25
33
  #define PACK_SIGNATURE 0x5041434b /* "PACK" */
@@ -58,7 +66,7 @@ struct git_pack_idx_header {
58
66
 
59
67
  typedef struct git_pack_cache_entry {
60
68
  size_t last_usage; /* enough? */
61
- git_atomic refcount;
69
+ git_atomic32 refcount;
62
70
  git_rawobj raw;
63
71
  } git_pack_cache_entry;
64
72
 
@@ -85,8 +93,8 @@ typedef struct {
85
93
  struct git_pack_file {
86
94
  git_mwindow_file mwf;
87
95
  git_map index_map;
88
- git_mutex lock; /* protect updates to mwf and index_map */
89
- git_atomic refcount;
96
+ git_mutex lock; /* protect updates to index_map */
97
+ git_atomic32 refcount;
90
98
 
91
99
  uint32_t num_objects;
92
100
  uint32_t num_bad_objects;
@@ -133,14 +141,14 @@ typedef struct git_packfile_stream {
133
141
  git_mwindow *mw;
134
142
  } git_packfile_stream;
135
143
 
136
- size_t git_packfile__object_header(unsigned char *hdr, size_t size, git_object_t type);
144
+ int git_packfile__object_header(size_t *out, unsigned char *hdr, size_t size, git_object_t type);
137
145
 
138
146
  int git_packfile__name(char **out, const char *path);
139
147
 
140
148
  int git_packfile_unpack_header(
141
149
  size_t *size_p,
142
150
  git_object_t *type_p,
143
- git_mwindow_file *mwf,
151
+ struct git_pack_file *p,
144
152
  git_mwindow **w_curs,
145
153
  off64_t *curpos);
146
154
 
@@ -164,8 +172,7 @@ int get_delta_base(
164
172
  git_object_t type,
165
173
  off64_t delta_obj_offset);
166
174
 
167
- void git_packfile_close(struct git_pack_file *p, bool unlink_packfile);
168
- void git_packfile_free(struct git_pack_file *p);
175
+ void git_packfile_free(struct git_pack_file *p, bool unlink_packfile);
169
176
  int git_packfile_alloc(struct git_pack_file **pack_out, const char *path);
170
177
 
171
178
  int git_pack_entry_find(
@@ -177,5 +184,16 @@ int git_pack_foreach_entry(
177
184
  struct git_pack_file *p,
178
185
  git_odb_foreach_cb cb,
179
186
  void *data);
187
+ /**
188
+ * Similar to git_pack_foreach_entry, but:
189
+ * - It also provides the offset of the object within the
190
+ * packfile.
191
+ * - It does not sort the objects in any order.
192
+ * - It retains the lock while invoking the callback.
193
+ */
194
+ int git_pack_foreach_entry_offset(
195
+ struct git_pack_file *p,
196
+ git_pack_foreach_entry_offset_cb cb,
197
+ void *data);
180
198
 
181
199
  #endif
@@ -65,7 +65,7 @@ size_t git_patch_size(
65
65
  {
66
66
  size_t out;
67
67
 
68
- assert(patch);
68
+ GIT_ASSERT_ARG(patch);
69
69
 
70
70
  out = patch->content_size;
71
71
 
@@ -129,13 +129,13 @@ int git_patch_line_stats(
129
129
 
130
130
  const git_diff_delta *git_patch_get_delta(const git_patch *patch)
131
131
  {
132
- assert(patch);
132
+ GIT_ASSERT_ARG_WITH_RETVAL(patch, NULL);
133
133
  return patch->delta;
134
134
  }
135
135
 
136
136
  size_t git_patch_num_hunks(const git_patch *patch)
137
137
  {
138
- assert(patch);
138
+ GIT_ASSERT_ARG(patch);
139
139
  return git_array_size(patch->hunks);
140
140
  }
141
141
 
@@ -152,7 +152,7 @@ int git_patch_get_hunk(
152
152
  size_t hunk_idx)
153
153
  {
154
154
  git_patch_hunk *hunk;
155
- assert(patch);
155
+ GIT_ASSERT_ARG(patch);
156
156
 
157
157
  hunk = git_array_get(patch->hunks, hunk_idx);
158
158
 
@@ -170,7 +170,7 @@ int git_patch_get_hunk(
170
170
  int git_patch_num_lines_in_hunk(const git_patch *patch, size_t hunk_idx)
171
171
  {
172
172
  git_patch_hunk *hunk;
173
- assert(patch);
173
+ GIT_ASSERT_ARG(patch);
174
174
 
175
175
  if (!(hunk = git_array_get(patch->hunks, hunk_idx)))
176
176
  return patch_error_outofrange("hunk");
@@ -186,7 +186,7 @@ int git_patch_get_line_in_hunk(
186
186
  git_patch_hunk *hunk;
187
187
  git_diff_line *line;
188
188
 
189
- assert(patch);
189
+ GIT_ASSERT_ARG(patch);
190
190
 
191
191
  if (!(hunk = git_array_get(patch->hunks, hunk_idx))) {
192
192
  if (out) *out = NULL;
@@ -204,9 +204,16 @@ int git_patch_get_line_in_hunk(
204
204
  return 0;
205
205
  }
206
206
 
207
+ git_repository *git_patch_owner(const git_patch *patch)
208
+ {
209
+ return patch->repo;
210
+ }
211
+
207
212
  int git_patch_from_diff(git_patch **out, git_diff *diff, size_t idx)
208
213
  {
209
- assert(out && diff && diff->patch_fn);
214
+ GIT_ASSERT_ARG(out);
215
+ GIT_ASSERT_ARG(diff);
216
+ GIT_ASSERT_ARG(diff->patch_fn);
210
217
  return diff->patch_fn(out, diff, idx);
211
218
  }
212
219
 
@@ -561,7 +561,7 @@ static int patch_from_sources(
561
561
  patch_generated_with_delta *pd;
562
562
  git_xdiff_output xo;
563
563
 
564
- assert(out);
564
+ GIT_ASSERT_ARG(out);
565
565
  *out = NULL;
566
566
 
567
567
  if ((error = patch_generated_with_delta_alloc(
@@ -840,7 +840,7 @@ static int patch_generated_line_cb(
840
840
  GIT_UNUSED(hunk_);
841
841
 
842
842
  hunk = git_array_last(patch->base.hunks);
843
- assert(hunk); /* programmer error if no hunk is available */
843
+ GIT_ASSERT(hunk); /* programmer error if no hunk is available */
844
844
 
845
845
  line = git_array_alloc(patch->base.lines);
846
846
  GIT_ERROR_CHECK_ALLOC(line);
@@ -1168,7 +1168,8 @@ int git_patch_parse(
1168
1168
  size_t start, used;
1169
1169
  int error = 0;
1170
1170
 
1171
- assert(out && ctx);
1171
+ GIT_ASSERT_ARG(out);
1172
+ GIT_ASSERT_ARG(ctx);
1172
1173
 
1173
1174
  *out = NULL;
1174
1175
 
@@ -274,24 +274,6 @@ size_t git_path_basename_offset(git_buf *buffer)
274
274
  return 0;
275
275
  }
276
276
 
277
- const char *git_path_topdir(const char *path)
278
- {
279
- size_t len;
280
- ssize_t i;
281
-
282
- assert(path);
283
- len = strlen(path);
284
-
285
- if (!len || path[len - 1] != '/')
286
- return NULL;
287
-
288
- for (i = (ssize_t)len - 2; i >= 0; --i)
289
- if (path[i] == '/')
290
- break;
291
-
292
- return &path[i + 1];
293
- }
294
-
295
277
  int git_path_root(const char *path)
296
278
  {
297
279
  int offset = 0, prefix_len;
@@ -325,7 +307,9 @@ int git_path_root(const char *path)
325
307
  static void path_trim_slashes(git_buf *path)
326
308
  {
327
309
  int ceiling = git_path_root(path->ptr) + 1;
328
- assert(ceiling >= 0);
310
+
311
+ if (ceiling < 0)
312
+ return;
329
313
 
330
314
  while (path->size > (size_t)ceiling) {
331
315
  if (path->ptr[path->size-1] != '/')
@@ -341,7 +325,8 @@ int git_path_join_unrooted(
341
325
  {
342
326
  ssize_t root;
343
327
 
344
- assert(path && path_out);
328
+ GIT_ASSERT_ARG(path_out);
329
+ GIT_ASSERT_ARG(path);
345
330
 
346
331
  root = (ssize_t)git_path_root(path);
347
332
 
@@ -389,7 +374,8 @@ int git_path_prettify(git_buf *path_out, const char *path, const char *base)
389
374
  {
390
375
  char buf[GIT_PATH_MAX];
391
376
 
392
- assert(path && path_out);
377
+ GIT_ASSERT_ARG(path_out);
378
+ GIT_ASSERT_ARG(path);
393
379
 
394
380
  /* construct path if needed */
395
381
  if (base != NULL && git_path_root(path) < 0) {
@@ -440,7 +426,9 @@ void git_path_string_to_dir(char* path, size_t size)
440
426
  int git__percent_decode(git_buf *decoded_out, const char *input)
441
427
  {
442
428
  int len, hi, lo, i;
443
- assert(decoded_out && input);
429
+
430
+ GIT_ASSERT_ARG(decoded_out);
431
+ GIT_ASSERT_ARG(input);
444
432
 
445
433
  len = (int)strlen(input);
446
434
  git_buf_clear(decoded_out);
@@ -501,7 +489,8 @@ int git_path_fromurl(git_buf *local_path_out, const char *file_url)
501
489
  {
502
490
  int offset;
503
491
 
504
- assert(local_path_out && file_url);
492
+ GIT_ASSERT_ARG(local_path_out);
493
+ GIT_ASSERT_ARG(file_url);
505
494
 
506
495
  if ((offset = local_file_url_prefixlen(file_url)) < 0 ||
507
496
  file_url[offset] == '\0' || file_url[offset] == '/')
@@ -526,7 +515,8 @@ int git_path_walk_up(
526
515
  ssize_t stop = 0, scan;
527
516
  char oldc = '\0';
528
517
 
529
- assert(path && cb);
518
+ GIT_ASSERT_ARG(path);
519
+ GIT_ASSERT_ARG(cb);
530
520
 
531
521
  if (ceiling != NULL) {
532
522
  if (git__prefixcmp(path->ptr, ceiling) == 0)
@@ -581,7 +571,7 @@ int git_path_walk_up(
581
571
 
582
572
  bool git_path_exists(const char *path)
583
573
  {
584
- assert(path);
574
+ GIT_ASSERT_ARG_WITH_RETVAL(path, false);
585
575
  return p_access(path, F_OK) == 0;
586
576
  }
587
577
 
@@ -598,7 +588,7 @@ bool git_path_isfile(const char *path)
598
588
  {
599
589
  struct stat st;
600
590
 
601
- assert(path);
591
+ GIT_ASSERT_ARG_WITH_RETVAL(path, false);
602
592
  if (p_stat(path, &st) < 0)
603
593
  return false;
604
594
 
@@ -609,7 +599,7 @@ bool git_path_islink(const char *path)
609
599
  {
610
600
  struct stat st;
611
601
 
612
- assert(path);
602
+ GIT_ASSERT_ARG_WITH_RETVAL(path, false);
613
603
  if (p_lstat(path, &st) < 0)
614
604
  return false;
615
605
 
@@ -764,15 +754,13 @@ bool git_path_contains_file(git_buf *base, const char *file)
764
754
  return _check_dir_contents(base, file, &git_path_isfile);
765
755
  }
766
756
 
767
- int git_path_find_dir(git_buf *dir, const char *path, const char *base)
757
+ int git_path_find_dir(git_buf *dir)
768
758
  {
769
- int error = git_path_join_unrooted(dir, path, base, NULL);
759
+ int error = 0;
760
+ char buf[GIT_PATH_MAX];
770
761
 
771
- if (!error) {
772
- char buf[GIT_PATH_MAX];
773
- if (p_realpath(dir->ptr, buf) != NULL)
774
- error = git_buf_sets(dir, buf);
775
- }
762
+ if (p_realpath(dir->ptr, buf) != NULL)
763
+ error = git_buf_sets(dir, buf);
776
764
 
777
765
  /* call dirname if this is not a directory */
778
766
  if (!error) /* && git_path_isdir(dir->ptr) == false) */
@@ -1211,7 +1199,8 @@ int git_path_diriter_init(
1211
1199
  if (is_win7_or_later < 0)
1212
1200
  is_win7_or_later = git_has_win32_version(6, 1, 0);
1213
1201
 
1214
- assert(diriter && path);
1202
+ GIT_ASSERT_ARG(diriter);
1203
+ GIT_ASSERT_ARG(path);
1215
1204
 
1216
1205
  memset(diriter, 0, sizeof(git_path_diriter));
1217
1206
  diriter->handle = INVALID_HANDLE_VALUE;
@@ -1311,9 +1300,10 @@ int git_path_diriter_filename(
1311
1300
  size_t *out_len,
1312
1301
  git_path_diriter *diriter)
1313
1302
  {
1314
- assert(out && out_len && diriter);
1315
-
1316
- assert(diriter->path_utf8.size > diriter->parent_utf8_len);
1303
+ GIT_ASSERT_ARG(out);
1304
+ GIT_ASSERT_ARG(out_len);
1305
+ GIT_ASSERT_ARG(diriter);
1306
+ GIT_ASSERT(diriter->path_utf8.size > diriter->parent_utf8_len);
1317
1307
 
1318
1308
  *out = &diriter->path_utf8.ptr[diriter->parent_utf8_len+1];
1319
1309
  *out_len = diriter->path_utf8.size - diriter->parent_utf8_len - 1;
@@ -1325,7 +1315,9 @@ int git_path_diriter_fullpath(
1325
1315
  size_t *out_len,
1326
1316
  git_path_diriter *diriter)
1327
1317
  {
1328
- assert(out && out_len && diriter);
1318
+ GIT_ASSERT_ARG(out);
1319
+ GIT_ASSERT_ARG(out_len);
1320
+ GIT_ASSERT_ARG(diriter);
1329
1321
 
1330
1322
  *out = diriter->path_utf8.ptr;
1331
1323
  *out_len = diriter->path_utf8.size;
@@ -1334,7 +1326,8 @@ int git_path_diriter_fullpath(
1334
1326
 
1335
1327
  int git_path_diriter_stat(struct stat *out, git_path_diriter *diriter)
1336
1328
  {
1337
- assert(out && diriter);
1329
+ GIT_ASSERT_ARG(out);
1330
+ GIT_ASSERT_ARG(diriter);
1338
1331
 
1339
1332
  return git_win32__file_attribute_to_stat(out,
1340
1333
  (WIN32_FILE_ATTRIBUTE_DATA *)&diriter->current,
@@ -1361,7 +1354,8 @@ int git_path_diriter_init(
1361
1354
  const char *path,
1362
1355
  unsigned int flags)
1363
1356
  {
1364
- assert(diriter && path);
1357
+ GIT_ASSERT_ARG(diriter);
1358
+ GIT_ASSERT_ARG(path);
1365
1359
 
1366
1360
  memset(diriter, 0, sizeof(git_path_diriter));
1367
1361
 
@@ -1401,7 +1395,7 @@ int git_path_diriter_next(git_path_diriter *diriter)
1401
1395
  bool skip_dot = !(diriter->flags & GIT_PATH_DIR_INCLUDE_DOT_AND_DOTDOT);
1402
1396
  int error = 0;
1403
1397
 
1404
- assert(diriter);
1398
+ GIT_ASSERT_ARG(diriter);
1405
1399
 
1406
1400
  errno = 0;
1407
1401
 
@@ -1444,9 +1438,10 @@ int git_path_diriter_filename(
1444
1438
  size_t *out_len,
1445
1439
  git_path_diriter *diriter)
1446
1440
  {
1447
- assert(out && out_len && diriter);
1448
-
1449
- assert(diriter->path.size > diriter->parent_len);
1441
+ GIT_ASSERT_ARG(out);
1442
+ GIT_ASSERT_ARG(out_len);
1443
+ GIT_ASSERT_ARG(diriter);
1444
+ GIT_ASSERT(diriter->path.size > diriter->parent_len);
1450
1445
 
1451
1446
  *out = &diriter->path.ptr[diriter->parent_len+1];
1452
1447
  *out_len = diriter->path.size - diriter->parent_len - 1;
@@ -1458,7 +1453,9 @@ int git_path_diriter_fullpath(
1458
1453
  size_t *out_len,
1459
1454
  git_path_diriter *diriter)
1460
1455
  {
1461
- assert(out && out_len && diriter);
1456
+ GIT_ASSERT_ARG(out);
1457
+ GIT_ASSERT_ARG(out_len);
1458
+ GIT_ASSERT_ARG(diriter);
1462
1459
 
1463
1460
  *out = diriter->path.ptr;
1464
1461
  *out_len = diriter->path.size;
@@ -1467,7 +1464,8 @@ int git_path_diriter_fullpath(
1467
1464
 
1468
1465
  int git_path_diriter_stat(struct stat *out, git_path_diriter *diriter)
1469
1466
  {
1470
- assert(out && diriter);
1467
+ GIT_ASSERT_ARG(out);
1468
+ GIT_ASSERT_ARG(diriter);
1471
1469
 
1472
1470
  return git_path_lstat(diriter->path.ptr, out);
1473
1471
  }
@@ -1503,7 +1501,8 @@ int git_path_dirload(
1503
1501
  char *dup;
1504
1502
  int error;
1505
1503
 
1506
- assert(contents && path);
1504
+ GIT_ASSERT_ARG(contents);
1505
+ GIT_ASSERT_ARG(path);
1507
1506
 
1508
1507
  if ((error = git_path_diriter_init(&iter, path, flags)) < 0)
1509
1508
  return error;
@@ -1512,7 +1511,7 @@ int git_path_dirload(
1512
1511
  if ((error = git_path_diriter_fullpath(&name, &name_len, &iter)) < 0)
1513
1512
  break;
1514
1513
 
1515
- assert(name_len > prefix_len);
1514
+ GIT_ASSERT(name_len > prefix_len);
1516
1515
 
1517
1516
  dup = git__strndup(name + prefix_len, name_len - prefix_len);
1518
1517
  GIT_ERROR_CHECK_ALLOC(dup);
@@ -1561,8 +1560,8 @@ GIT_INLINE(bool) verify_dospath(
1561
1560
  static int32_t next_hfs_char(const char **in, size_t *len)
1562
1561
  {
1563
1562
  while (*len) {
1564
- int32_t codepoint;
1565
- int cp_len = git__utf8_iterate((const uint8_t *)(*in), (int)(*len), &codepoint);
1563
+ uint32_t codepoint;
1564
+ int cp_len = git_utf8_iterate(&codepoint, *in, *len);
1566
1565
  if (cp_len < 0)
1567
1566
  return -1;
1568
1567
 
@@ -1594,7 +1593,7 @@ static int32_t next_hfs_char(const char **in, size_t *len)
1594
1593
  * the ASCII range, which is perfectly fine, because the
1595
1594
  * git folder name can only be composed of ascii characters
1596
1595
  */
1597
- return git__tolower(codepoint);
1596
+ return git__tolower((int)codepoint);
1598
1597
  }
1599
1598
  return 0; /* NULL byte -- end of string */
1600
1599
  }
@@ -1876,7 +1875,7 @@ GIT_INLINE(unsigned int) dotgit_flags(
1876
1875
  return flags;
1877
1876
  }
1878
1877
 
1879
- bool git_path_isvalid(
1878
+ bool git_path_validate(
1880
1879
  git_repository *repo,
1881
1880
  const char *path,
1882
1881
  uint16_t mode,
@@ -1903,6 +1902,52 @@ bool git_path_isvalid(
1903
1902
  return verify_component(repo, start, (c - start), mode, flags);
1904
1903
  }
1905
1904
 
1905
+ #ifdef GIT_WIN32
1906
+ GIT_INLINE(bool) should_validate_longpaths(git_repository *repo)
1907
+ {
1908
+ int longpaths = 0;
1909
+
1910
+ if (repo &&
1911
+ git_repository__configmap_lookup(&longpaths, repo, GIT_CONFIGMAP_LONGPATHS) < 0)
1912
+ longpaths = 0;
1913
+
1914
+ return (longpaths == 0);
1915
+ }
1916
+
1917
+ #else
1918
+
1919
+ GIT_INLINE(bool) should_validate_longpaths(git_repository *repo)
1920
+ {
1921
+ GIT_UNUSED(repo);
1922
+
1923
+ return false;
1924
+ }
1925
+ #endif
1926
+
1927
+ int git_path_validate_workdir(git_repository *repo, const char *path)
1928
+ {
1929
+ if (should_validate_longpaths(repo))
1930
+ return git_path_validate_filesystem(path, strlen(path));
1931
+
1932
+ return 0;
1933
+ }
1934
+
1935
+ int git_path_validate_workdir_with_len(
1936
+ git_repository *repo,
1937
+ const char *path,
1938
+ size_t path_len)
1939
+ {
1940
+ if (should_validate_longpaths(repo))
1941
+ return git_path_validate_filesystem(path, path_len);
1942
+
1943
+ return 0;
1944
+ }
1945
+
1946
+ int git_path_validate_workdir_buf(git_repository *repo, git_buf *path)
1947
+ {
1948
+ return git_path_validate_workdir_with_len(repo, path->ptr, path->size);
1949
+ }
1950
+
1906
1951
  int git_path_normalize_slashes(git_buf *out, const char *path)
1907
1952
  {
1908
1953
  int error;