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
@@ -0,0 +1,162 @@
1
+ /*
2
+ * Copyright (C) the libgit2 contributors. All rights reserved.
3
+ *
4
+ * This file is part of libgit2, distributed under the GNU GPL v2 with
5
+ * a Linking Exception. For full terms see the included COPYING file.
6
+ */
7
+
8
+ #ifndef INCLUDE_commit_graph_h__
9
+ #define INCLUDE_commit_graph_h__
10
+
11
+ #include "common.h"
12
+
13
+ #include "git2/types.h"
14
+ #include "git2/sys/commit_graph.h"
15
+
16
+ #include "map.h"
17
+ #include "vector.h"
18
+
19
+ /**
20
+ * A commit-graph file.
21
+ *
22
+ * This file contains metadata about commits, particularly the generation
23
+ * number for each one. This can help speed up graph operations without
24
+ * requiring a full graph traversal.
25
+ *
26
+ * Support for this feature was added in git 2.19.
27
+ */
28
+ typedef struct git_commit_graph_file {
29
+ git_map graph_map;
30
+
31
+ /* The OID Fanout table. */
32
+ const uint32_t *oid_fanout;
33
+ /* The total number of commits in the graph. */
34
+ uint32_t num_commits;
35
+
36
+ /* The OID Lookup table. */
37
+ git_oid *oid_lookup;
38
+
39
+ /*
40
+ * The Commit Data table. Each entry contains the OID of the commit followed
41
+ * by two 8-byte fields in network byte order:
42
+ * - The indices of the first two parents (32 bits each).
43
+ * - The generation number (first 30 bits) and commit time in seconds since
44
+ * UNIX epoch (34 bits).
45
+ */
46
+ const unsigned char *commit_data;
47
+
48
+ /*
49
+ * The Extra Edge List table. Each 4-byte entry is a network byte order index
50
+ * of one of the i-th (i > 0) parents of commits in the `commit_data` table,
51
+ * when the commit has more than 2 parents.
52
+ */
53
+ const unsigned char *extra_edge_list;
54
+ /* The number of entries in the Extra Edge List table. Each entry is 4 bytes wide. */
55
+ size_t num_extra_edge_list;
56
+
57
+ /* The trailer of the file. Contains the SHA1-checksum of the whole file. */
58
+ git_oid checksum;
59
+ } git_commit_graph_file;
60
+
61
+ /**
62
+ * An entry in the commit-graph file. Provides a subset of the information that
63
+ * can be obtained from the commit header.
64
+ */
65
+ typedef struct git_commit_graph_entry {
66
+ /* The generation number of the commit within the graph */
67
+ size_t generation;
68
+
69
+ /* Time in seconds from UNIX epoch. */
70
+ git_time_t commit_time;
71
+
72
+ /* The number of parents of the commit. */
73
+ size_t parent_count;
74
+
75
+ /*
76
+ * The indices of the parent commits within the Commit Data table. The value
77
+ * of `GIT_COMMIT_GRAPH_MISSING_PARENT` indicates that no parent is in that
78
+ * position.
79
+ */
80
+ size_t parent_indices[2];
81
+
82
+ /* The index within the Extra Edge List of any parent after the first two. */
83
+ size_t extra_parents_index;
84
+
85
+ /* The SHA-1 hash of the root tree of the commit. */
86
+ git_oid tree_oid;
87
+
88
+ /* The SHA-1 hash of the requested commit. */
89
+ git_oid sha1;
90
+ } git_commit_graph_entry;
91
+
92
+ /* A wrapper for git_commit_graph_file to enable lazy loading in the ODB. */
93
+ struct git_commit_graph {
94
+ /* The path to the commit-graph file. Something like ".git/objects/info/commit-graph". */
95
+ git_buf filename;
96
+
97
+ /* The underlying commit-graph file. */
98
+ git_commit_graph_file *file;
99
+
100
+ /* Whether the commit-graph file was already checked for validity. */
101
+ bool checked;
102
+ };
103
+
104
+ /** Create a new commit-graph, optionally opening the underlying file. */
105
+ int git_commit_graph_new(git_commit_graph **cgraph_out, const char *objects_dir, bool open_file);
106
+
107
+ /** Open and validate a commit-graph file. */
108
+ int git_commit_graph_file_open(git_commit_graph_file **file_out, const char *path);
109
+
110
+ /*
111
+ * Attempt to get the git_commit_graph's commit-graph file. This object is
112
+ * still owned by the git_commit_graph. If the repository does not contain a commit graph,
113
+ * it will return GIT_ENOTFOUND.
114
+ *
115
+ * This function is not thread-safe.
116
+ */
117
+ int git_commit_graph_get_file(git_commit_graph_file **file_out, git_commit_graph *cgraph);
118
+
119
+ /* Marks the commit-graph file as needing a refresh. */
120
+ void git_commit_graph_refresh(git_commit_graph *cgraph);
121
+
122
+ /*
123
+ * A writer for `commit-graph` files.
124
+ */
125
+ struct git_commit_graph_writer {
126
+ /*
127
+ * The path of the `objects/info` directory where the `commit-graph` will be
128
+ * stored.
129
+ */
130
+ git_buf objects_info_dir;
131
+
132
+ /* The list of packed commits. */
133
+ git_vector commits;
134
+ };
135
+
136
+ /*
137
+ * Returns whether the git_commit_graph_file needs to be reloaded since the
138
+ * contents of the commit-graph file have changed on disk.
139
+ */
140
+ bool git_commit_graph_file_needs_refresh(
141
+ const git_commit_graph_file *file, const char *path);
142
+
143
+ int git_commit_graph_entry_find(
144
+ git_commit_graph_entry *e,
145
+ const git_commit_graph_file *file,
146
+ const git_oid *short_oid,
147
+ size_t len);
148
+ int git_commit_graph_entry_parent(
149
+ git_commit_graph_entry *parent,
150
+ const git_commit_graph_file *file,
151
+ const git_commit_graph_entry *entry,
152
+ size_t n);
153
+ int git_commit_graph_file_close(git_commit_graph_file *cgraph);
154
+ void git_commit_graph_file_free(git_commit_graph_file *cgraph);
155
+
156
+ /* This is exposed for use in the fuzzers. */
157
+ int git_commit_graph_file_parse(
158
+ git_commit_graph_file *file,
159
+ const unsigned char *data,
160
+ size_t size);
161
+
162
+ #endif
@@ -12,6 +12,24 @@
12
12
  #include "odb.h"
13
13
  #include "commit.h"
14
14
 
15
+ int git_commit_list_generation_cmp(const void *a, const void *b)
16
+ {
17
+ uint32_t generation_a = ((git_commit_list_node *) a)->generation;
18
+ uint32_t generation_b = ((git_commit_list_node *) b)->generation;
19
+
20
+ if (!generation_a || !generation_b) {
21
+ /* Fall back to comparing by timestamps if at least one commit lacks a generation. */
22
+ return git_commit_list_time_cmp(a, b);
23
+ }
24
+
25
+ if (generation_a < generation_b)
26
+ return 1;
27
+ if (generation_a > generation_b)
28
+ return -1;
29
+
30
+ return 0;
31
+ }
32
+
15
33
  int git_commit_list_time_cmp(const void *a, const void *b)
16
34
  {
17
35
  int64_t time_a = ((git_commit_list_node *) a)->time;
@@ -124,6 +142,7 @@ static int commit_quick_parse(
124
142
  return -1;
125
143
  }
126
144
 
145
+ node->generation = 0;
127
146
  node->time = commit->committer->when.time;
128
147
  node->out_degree = (uint16_t) git_array_size(commit->parent_ids);
129
148
  node->parents = alloc_parents(walk, node, node->out_degree);
@@ -143,11 +162,38 @@ static int commit_quick_parse(
143
162
  int git_commit_list_parse(git_revwalk *walk, git_commit_list_node *commit)
144
163
  {
145
164
  git_odb_object *obj;
165
+ git_commit_graph_file *cgraph_file = NULL;
146
166
  int error;
147
167
 
148
168
  if (commit->parsed)
149
169
  return 0;
150
170
 
171
+ /* Let's try to use the commit graph first. */
172
+ git_odb__get_commit_graph_file(&cgraph_file, walk->odb);
173
+ if (cgraph_file) {
174
+ git_commit_graph_entry e;
175
+
176
+ error = git_commit_graph_entry_find(&e, cgraph_file, &commit->oid, GIT_OID_RAWSZ);
177
+ if (error == 0 && git__is_uint16(e.parent_count)) {
178
+ size_t i;
179
+ commit->generation = (uint32_t)e.generation;
180
+ commit->time = e.commit_time;
181
+ commit->out_degree = (uint16_t)e.parent_count;
182
+ commit->parents = alloc_parents(walk, commit, commit->out_degree);
183
+ GIT_ERROR_CHECK_ALLOC(commit->parents);
184
+
185
+ for (i = 0; i < commit->out_degree; ++i) {
186
+ git_commit_graph_entry parent;
187
+ error = git_commit_graph_entry_parent(&parent, cgraph_file, &e, i);
188
+ if (error < 0)
189
+ return error;
190
+ commit->parents[i] = git_revwalk__commit_lookup(walk, &parent.sha1);
191
+ }
192
+ commit->parsed = 1;
193
+ return 0;
194
+ }
195
+ }
196
+
151
197
  if ((error = git_odb_read(&obj, walk->odb, &commit->oid)) < 0)
152
198
  return error;
153
199
 
@@ -26,6 +26,7 @@
26
26
  typedef struct git_commit_list_node {
27
27
  git_oid oid;
28
28
  int64_t time;
29
+ uint32_t generation;
29
30
  unsigned int seen:1,
30
31
  uninteresting:1,
31
32
  topo_delay:1,
@@ -45,6 +46,7 @@ typedef struct git_commit_list {
45
46
  } git_commit_list;
46
47
 
47
48
  git_commit_list_node *git_commit_list_alloc_node(git_revwalk *walk);
49
+ int git_commit_list_generation_cmp(const void *a, const void *b);
48
50
  int git_commit_list_time_cmp(const void *a, const void *b);
49
51
  void git_commit_list_free(git_commit_list **list_p);
50
52
  git_commit_list *git_commit_list_insert(git_commit_list_node *item, git_commit_list **list_p);
@@ -19,6 +19,8 @@
19
19
  # define GIT_INLINE(type) static __inline type
20
20
  #elif defined(__GNUC__)
21
21
  # define GIT_INLINE(type) static __inline__ type
22
+ #elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
23
+ # define GIT_INLINE(type) static inline type
22
24
  #else
23
25
  # define GIT_INLINE(type) static type
24
26
  #endif
@@ -28,6 +30,24 @@
28
30
  # define __has_builtin(x) 0
29
31
  #endif
30
32
 
33
+ /**
34
+ * Declare that a function's return value must be used.
35
+ *
36
+ * Used mostly to guard against potential silent bugs at runtime. This is
37
+ * recommended to be added to functions that:
38
+ *
39
+ * - Allocate / reallocate memory. This prevents memory leaks or errors where
40
+ * buffers are expected to have grown to a certain size, but could not be
41
+ * resized.
42
+ * - Acquire locks. When a lock cannot be acquired, that will almost certainly
43
+ * cause a data race / undefined behavior.
44
+ */
45
+ #if defined(__GNUC__)
46
+ # define GIT_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
47
+ #else
48
+ # define GIT_WARN_UNUSED_RESULT
49
+ #endif
50
+
31
51
  #include <assert.h>
32
52
  #include <errno.h>
33
53
  #include <limits.h>
@@ -63,7 +83,9 @@
63
83
  # include <pthread.h>
64
84
  # include <sched.h>
65
85
  # endif
66
- #define GIT_STDLIB_CALL
86
+
87
+ #define GIT_LIBGIT2_CALL
88
+ #define GIT_SYSTEM_CALL
67
89
 
68
90
  #ifdef GIT_USE_STAT_ATIMESPEC
69
91
  # define st_atim st_atimespec
@@ -78,9 +100,10 @@
78
100
  #include "git2/types.h"
79
101
  #include "git2/errors.h"
80
102
  #include "errors.h"
81
- #include "thread-utils.h"
103
+ #include "thread.h"
82
104
  #include "integer.h"
83
105
  #include "assert_safe.h"
106
+ #include "utf8.h"
84
107
 
85
108
  /*
86
109
  * Include the declarations for deprecated functions; this ensures
@@ -10,7 +10,6 @@
10
10
  #include "git2/config.h"
11
11
  #include "git2/sys/config.h"
12
12
 
13
- #include "buf_text.h"
14
13
  #include "config_backend.h"
15
14
  #include "regexp.h"
16
15
  #include "sysdir.h"
@@ -108,7 +107,8 @@ int git_config_add_file_ondisk(
108
107
  struct stat st;
109
108
  int res;
110
109
 
111
- assert(cfg && path);
110
+ GIT_ASSERT_ARG(cfg);
111
+ GIT_ASSERT_ARG(path);
112
112
 
113
113
  res = p_stat(path, &st);
114
114
  if (res < 0 && errno != ENOENT && errno != ENOTDIR) {
@@ -316,7 +316,8 @@ int git_config_add_backend(
316
316
  backend_internal *internal;
317
317
  int result;
318
318
 
319
- assert(cfg && backend);
319
+ GIT_ASSERT_ARG(cfg);
320
+ GIT_ASSERT_ARG(backend);
320
321
 
321
322
  GIT_ERROR_CHECK_VERSION(backend, GIT_CONFIG_BACKEND_VERSION, "git_config_backend");
322
323
 
@@ -514,7 +515,8 @@ int git_config_backend_foreach_match(
514
515
  git_regexp regex;
515
516
  int error = 0;
516
517
 
517
- assert(backend && cb);
518
+ GIT_ASSERT_ARG(backend);
519
+ GIT_ASSERT_ARG(cb);
518
520
 
519
521
  if (regexp && git_regexp_compile(&regex, regexp, 0) < 0)
520
522
  return -1;
@@ -886,7 +888,8 @@ int git_config_get_string_buf(
886
888
  int ret;
887
889
  const char *str;
888
890
 
889
- git_buf_sanitize(out);
891
+ if ((ret = git_buf_sanitize(out)) < 0)
892
+ return ret;
890
893
 
891
894
  ret = get_entry(&entry, cfg, name, true, GET_ALL_ERRORS);
892
895
  str = !ret ? (entry->value ? entry->value : "") : NULL;
@@ -1084,19 +1087,31 @@ void git_config_iterator_free(git_config_iterator *iter)
1084
1087
 
1085
1088
  int git_config_find_global(git_buf *path)
1086
1089
  {
1087
- git_buf_sanitize(path);
1090
+ int error;
1091
+
1092
+ if ((error = git_buf_sanitize(path)) < 0)
1093
+ return error;
1094
+
1088
1095
  return git_sysdir_find_global_file(path, GIT_CONFIG_FILENAME_GLOBAL);
1089
1096
  }
1090
1097
 
1091
1098
  int git_config_find_xdg(git_buf *path)
1092
1099
  {
1093
- git_buf_sanitize(path);
1100
+ int error;
1101
+
1102
+ if ((error = git_buf_sanitize(path)) < 0)
1103
+ return error;
1104
+
1094
1105
  return git_sysdir_find_xdg_file(path, GIT_CONFIG_FILENAME_XDG);
1095
1106
  }
1096
1107
 
1097
1108
  int git_config_find_system(git_buf *path)
1098
1109
  {
1099
- git_buf_sanitize(path);
1110
+ int error;
1111
+
1112
+ if ((error = git_buf_sanitize(path)) < 0)
1113
+ return error;
1114
+
1100
1115
  return git_sysdir_find_system_file(path, GIT_CONFIG_FILENAME_SYSTEM);
1101
1116
  }
1102
1117
 
@@ -1104,7 +1119,9 @@ int git_config_find_programdata(git_buf *path)
1104
1119
  {
1105
1120
  int ret;
1106
1121
 
1107
- git_buf_sanitize(path);
1122
+ if ((ret = git_buf_sanitize(path)) < 0)
1123
+ return ret;
1124
+
1108
1125
  ret = git_sysdir_find_programdata_file(path,
1109
1126
  GIT_CONFIG_FILENAME_PROGRAMDATA);
1110
1127
  if (ret != GIT_OK)
@@ -1182,7 +1199,7 @@ int git_config_lock(git_transaction **out, git_config *cfg)
1182
1199
  git_config_backend *backend;
1183
1200
  backend_internal *internal;
1184
1201
 
1185
- assert(cfg);
1202
+ GIT_ASSERT_ARG(cfg);
1186
1203
 
1187
1204
  internal = git_vector_get(&cfg->backends, 0);
1188
1205
  if (!internal || !internal->backend) {
@@ -1202,7 +1219,7 @@ int git_config_unlock(git_config *cfg, int commit)
1202
1219
  git_config_backend *backend;
1203
1220
  backend_internal *internal;
1204
1221
 
1205
- assert(cfg);
1222
+ GIT_ASSERT_ARG(cfg);
1206
1223
 
1207
1224
  internal = git_vector_get(&cfg->backends, 0);
1208
1225
  if (!internal || !internal->backend) {
@@ -1360,9 +1377,13 @@ fail_parse:
1360
1377
 
1361
1378
  int git_config_parse_path(git_buf *out, const char *value)
1362
1379
  {
1363
- assert(out && value);
1380
+ int error;
1364
1381
 
1365
- git_buf_sanitize(out);
1382
+ GIT_ASSERT_ARG(out);
1383
+ GIT_ASSERT_ARG(value);
1384
+
1385
+ if ((error = git_buf_sanitize(out)) < 0)
1386
+ return error;
1366
1387
 
1367
1388
  if (value[0] == '~') {
1368
1389
  if (value[1] != '\0' && value[1] != '/') {
@@ -1405,7 +1426,8 @@ int git_config__normalize_name(const char *in, char **out)
1405
1426
  {
1406
1427
  char *name, *fdot, *ldot;
1407
1428
 
1408
- assert(in && out);
1429
+ GIT_ASSERT_ARG(in);
1430
+ GIT_ASSERT_ARG(out);
1409
1431
 
1410
1432
  name = git__strdup(in);
1411
1433
  GIT_ERROR_CHECK_ALLOC(name);
@@ -1474,7 +1496,7 @@ int git_config_rename_section(
1474
1496
  int error = 0;
1475
1497
  struct rename_data data;
1476
1498
 
1477
- git_buf_text_puts_escape_regex(&pattern, old_section_name);
1499
+ git_buf_puts_escape_regex(&pattern, old_section_name);
1478
1500
 
1479
1501
  if ((error = git_buf_puts(&pattern, "\\..+")) < 0)
1480
1502
  goto cleanup;