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
@@ -10,7 +10,6 @@
10
10
  #include "repository.h"
11
11
  #include "filebuf.h"
12
12
  #include "attrcache.h"
13
- #include "buf_text.h"
14
13
  #include "git2/blob.h"
15
14
  #include "git2/tree.h"
16
15
  #include "blob.h"
@@ -34,7 +33,7 @@ static void attr_file_free(git_attr_file *file)
34
33
  int git_attr_file__new(
35
34
  git_attr_file **out,
36
35
  git_attr_file_entry *entry,
37
- git_attr_file_source source)
36
+ git_attr_file_source *source)
38
37
  {
39
38
  git_attr_file *attrs = git__calloc(1, sizeof(git_attr_file));
40
39
  GIT_ERROR_CHECK_ALLOC(attrs);
@@ -48,8 +47,8 @@ int git_attr_file__new(
48
47
  goto on_error;
49
48
 
50
49
  GIT_REFCOUNT_INC(attrs);
51
- attrs->entry = entry;
52
- attrs->source = source;
50
+ attrs->entry = entry;
51
+ memcpy(&attrs->source, source, sizeof(git_attr_file_source));
53
52
  *out = attrs;
54
53
  return 0;
55
54
 
@@ -109,11 +108,12 @@ int git_attr_file__load(
109
108
  git_repository *repo,
110
109
  git_attr_session *attr_session,
111
110
  git_attr_file_entry *entry,
112
- git_attr_file_source source,
111
+ git_attr_file_source *source,
113
112
  git_attr_file_parser parser,
114
113
  bool allow_macros)
115
114
  {
116
115
  int error = 0;
116
+ git_commit *commit = NULL;
117
117
  git_tree *tree = NULL;
118
118
  git_tree_entry *tree_entry = NULL;
119
119
  git_blob *blob = NULL;
@@ -123,17 +123,17 @@ int git_attr_file__load(
123
123
  struct stat st;
124
124
  bool nonexistent = false;
125
125
  int bom_offset;
126
- git_bom_t bom;
126
+ git_buf_bom_t bom;
127
127
  git_oid id;
128
128
  git_object_size_t blobsize;
129
129
 
130
130
  *out = NULL;
131
131
 
132
- switch (source) {
133
- case GIT_ATTR_FILE__IN_MEMORY:
132
+ switch (source->type) {
133
+ case GIT_ATTR_FILE_SOURCE_MEMORY:
134
134
  /* in-memory attribute file doesn't need data */
135
135
  break;
136
- case GIT_ATTR_FILE__FROM_INDEX: {
136
+ case GIT_ATTR_FILE_SOURCE_INDEX: {
137
137
  if ((error = attr_file_oid_from_index(&id, repo, entry->path)) < 0 ||
138
138
  (error = git_blob_lookup(&blob, repo, &id)) < 0)
139
139
  return error;
@@ -146,7 +146,7 @@ int git_attr_file__load(
146
146
  git_buf_put(&content, git_blob_rawcontent(blob), (size_t)blobsize);
147
147
  break;
148
148
  }
149
- case GIT_ATTR_FILE__FROM_FILE: {
149
+ case GIT_ATTR_FILE_SOURCE_FILE: {
150
150
  int fd = -1;
151
151
 
152
152
  /* For open or read errors, pretend that we got ENOTFOUND. */
@@ -163,10 +163,31 @@ int git_attr_file__load(
163
163
 
164
164
  break;
165
165
  }
166
- case GIT_ATTR_FILE__FROM_HEAD: {
167
- if ((error = git_repository_head_tree(&tree, repo)) < 0 ||
168
- (error = git_tree_entry_bypath(&tree_entry, tree, entry->path)) < 0 ||
169
- (error = git_blob_lookup(&blob, repo, git_tree_entry_id(tree_entry))) < 0)
166
+ case GIT_ATTR_FILE_SOURCE_COMMIT: {
167
+ if (source->commit_id) {
168
+ if ((error = git_commit_lookup(&commit, repo, source->commit_id)) < 0 ||
169
+ (error = git_commit_tree(&tree, commit)) < 0)
170
+ goto cleanup;
171
+ } else {
172
+ if ((error = git_repository_head_tree(&tree, repo)) < 0)
173
+ goto cleanup;
174
+ }
175
+
176
+ if ((error = git_tree_entry_bypath(&tree_entry, tree, entry->path)) < 0) {
177
+ /*
178
+ * If the attributes file does not exist, we can
179
+ * cache an empty file for this commit to prevent
180
+ * needless future lookups.
181
+ */
182
+ if (error == GIT_ENOTFOUND) {
183
+ error = 0;
184
+ break;
185
+ }
186
+
187
+ goto cleanup;
188
+ }
189
+
190
+ if ((error = git_blob_lookup(&blob, repo, git_tree_entry_id(tree_entry))) < 0)
170
191
  goto cleanup;
171
192
 
172
193
  /*
@@ -183,7 +204,7 @@ int git_attr_file__load(
183
204
  break;
184
205
  }
185
206
  default:
186
- git_error_set(GIT_ERROR_INVALID, "unknown file source %d", source);
207
+ git_error_set(GIT_ERROR_INVALID, "unknown file source %d", source->type);
187
208
  return -1;
188
209
  }
189
210
 
@@ -192,9 +213,9 @@ int git_attr_file__load(
192
213
 
193
214
  /* advance over a UTF8 BOM */
194
215
  content_str = git_buf_cstr(&content);
195
- bom_offset = git_buf_text_detect_bom(&bom, &content);
216
+ bom_offset = git_buf_detect_bom(&bom, &content);
196
217
 
197
- if (bom == GIT_BOM_UTF8)
218
+ if (bom == GIT_BUF_BOM_UTF8)
198
219
  content_str += bom_offset;
199
220
 
200
221
  /* store the key of the attr_reader; don't bother with cache
@@ -211,11 +232,11 @@ int git_attr_file__load(
211
232
  /* write cache breakers */
212
233
  if (nonexistent)
213
234
  file->nonexistent = 1;
214
- else if (source == GIT_ATTR_FILE__FROM_INDEX)
235
+ else if (source->type == GIT_ATTR_FILE_SOURCE_INDEX)
215
236
  git_oid_cpy(&file->cache_data.oid, git_blob_id(blob));
216
- else if (source == GIT_ATTR_FILE__FROM_HEAD)
237
+ else if (source->type == GIT_ATTR_FILE_SOURCE_COMMIT)
217
238
  git_oid_cpy(&file->cache_data.oid, git_tree_id(tree));
218
- else if (source == GIT_ATTR_FILE__FROM_FILE)
239
+ else if (source->type == GIT_ATTR_FILE_SOURCE_FILE)
219
240
  git_futils_filestamp_set_from_stat(&file->cache_data.stamp, &st);
220
241
  /* else always cacheable */
221
242
 
@@ -225,6 +246,7 @@ cleanup:
225
246
  git_blob_free(blob);
226
247
  git_tree_entry_free(tree_entry);
227
248
  git_tree_free(tree);
249
+ git_commit_free(commit);
228
250
  git_buf_dispose(&content);
229
251
 
230
252
  return error;
@@ -233,7 +255,8 @@ cleanup:
233
255
  int git_attr_file__out_of_date(
234
256
  git_repository *repo,
235
257
  git_attr_session *attr_session,
236
- git_attr_file *file)
258
+ git_attr_file *file,
259
+ git_attr_file_source *source)
237
260
  {
238
261
  if (!file)
239
262
  return 1;
@@ -246,15 +269,15 @@ int git_attr_file__out_of_date(
246
269
  else if (file->nonexistent)
247
270
  return 1;
248
271
 
249
- switch (file->source) {
250
- case GIT_ATTR_FILE__IN_MEMORY:
272
+ switch (file->source.type) {
273
+ case GIT_ATTR_FILE_SOURCE_MEMORY:
251
274
  return 0;
252
275
 
253
- case GIT_ATTR_FILE__FROM_FILE:
276
+ case GIT_ATTR_FILE_SOURCE_FILE:
254
277
  return git_futils_filestamp_check(
255
278
  &file->cache_data.stamp, file->entry->fullpath);
256
279
 
257
- case GIT_ATTR_FILE__FROM_INDEX: {
280
+ case GIT_ATTR_FILE_SOURCE_INDEX: {
258
281
  int error;
259
282
  git_oid id;
260
283
 
@@ -265,21 +288,34 @@ int git_attr_file__out_of_date(
265
288
  return (git_oid__cmp(&file->cache_data.oid, &id) != 0);
266
289
  }
267
290
 
268
- case GIT_ATTR_FILE__FROM_HEAD: {
269
- git_tree *tree;
291
+ case GIT_ATTR_FILE_SOURCE_COMMIT: {
292
+ git_tree *tree = NULL;
270
293
  int error;
271
294
 
272
- if ((error = git_repository_head_tree(&tree, repo)) < 0)
295
+ if (source->commit_id) {
296
+ git_commit *commit = NULL;
297
+
298
+ if ((error = git_commit_lookup(&commit, repo, source->commit_id)) < 0)
299
+ return error;
300
+
301
+ error = git_commit_tree(&tree, commit);
302
+
303
+ git_commit_free(commit);
304
+ } else {
305
+ error = git_repository_head_tree(&tree, repo);
306
+ }
307
+
308
+ if (error < 0)
273
309
  return error;
274
310
 
275
- error = git_oid__cmp(&file->cache_data.oid, git_tree_id(tree));
311
+ error = (git_oid__cmp(&file->cache_data.oid, git_tree_id(tree)) != 0);
276
312
 
277
313
  git_tree_free(tree);
278
314
  return error;
279
315
  }
280
316
 
281
317
  default:
282
- git_error_set(GIT_ERROR_INVALID, "invalid file type %d", file->source);
318
+ git_error_set(GIT_ERROR_INVALID, "invalid file type %d", file->source.type);
283
319
  return -1;
284
320
  }
285
321
  }
@@ -351,7 +387,9 @@ uint32_t git_attr_file__name_hash(const char *name)
351
387
  {
352
388
  uint32_t h = 5381;
353
389
  int c;
354
- assert(name);
390
+
391
+ GIT_ASSERT_ARG(name);
392
+
355
393
  while ((c = (int)*name++) != 0)
356
394
  h = ((h << 5) + h) + c;
357
395
  return h;
@@ -388,6 +426,7 @@ int git_attr_file__lookup_one(
388
426
  int git_attr_file__load_standalone(git_attr_file **out, const char *path)
389
427
  {
390
428
  git_buf content = GIT_BUF_INIT;
429
+ git_attr_file_source source = { GIT_ATTR_FILE_SOURCE_FILE };
391
430
  git_attr_file *file = NULL;
392
431
  int error;
393
432
 
@@ -399,9 +438,9 @@ int git_attr_file__load_standalone(git_attr_file **out, const char *path)
399
438
  * don't have to free it - freeing file+pool will free cache entry, too.
400
439
  */
401
440
 
402
- if ((error = git_attr_file__new(&file, NULL, GIT_ATTR_FILE__FROM_FILE)) < 0 ||
441
+ if ((error = git_attr_file__new(&file, NULL, &source)) < 0 ||
403
442
  (error = git_attr_file__parse_buffer(NULL, file, content.ptr, true)) < 0 ||
404
- (error = git_attr_cache__alloc_file_entry(&file->entry, NULL, path, &file->pool)) < 0)
443
+ (error = git_attr_cache__alloc_file_entry(&file->entry, NULL, NULL, path, &file->pool)) < 0)
405
444
  goto out;
406
445
 
407
446
  *out = file;
@@ -501,14 +540,19 @@ git_attr_assignment *git_attr_rule__lookup_assignment(
501
540
  }
502
541
 
503
542
  int git_attr_path__init(
504
- git_attr_path *info, const char *path, const char *base, git_dir_flag dir_flag)
543
+ git_attr_path *info,
544
+ git_repository *repo,
545
+ const char *path,
546
+ const char *base,
547
+ git_dir_flag dir_flag)
505
548
  {
506
549
  ssize_t root;
507
550
 
508
551
  /* build full path as best we can */
509
552
  git_buf_init(&info->full, 0);
510
553
 
511
- if (git_path_join_unrooted(&info->full, path, base, &root) < 0)
554
+ if (git_path_join_unrooted(&info->full, path, base, &root) < 0 ||
555
+ git_path_validate_workdir_buf(repo, &info->full) < 0)
512
556
  return -1;
513
557
 
514
558
  info->path = info->full.ptr + root;
@@ -660,7 +704,8 @@ int git_attr_fnmatch__parse(
660
704
  int slash_count, allow_space;
661
705
  bool escaped;
662
706
 
663
- assert(spec && base && *base);
707
+ GIT_ASSERT_ARG(spec);
708
+ GIT_ASSERT_ARG(base && *base);
664
709
 
665
710
  if (parse_optimized_patterns(spec, pool, *base))
666
711
  return 0;
@@ -828,7 +873,7 @@ int git_attr_assignment__parse(
828
873
  const char *scan = *base;
829
874
  git_attr_assignment *assign = NULL;
830
875
 
831
- assert(assigns && !assigns->length);
876
+ GIT_ASSERT_ARG(assigns && !assigns->length);
832
877
 
833
878
  git_vector_set_cmp(assigns, sort_by_hash_and_name);
834
879
 
@@ -954,10 +999,10 @@ void git_attr_rule__free(git_attr_rule *rule)
954
999
 
955
1000
  int git_attr_session__init(git_attr_session *session, git_repository *repo)
956
1001
  {
957
- assert(repo);
1002
+ GIT_ASSERT_ARG(repo);
958
1003
 
959
1004
  memset(session, 0, sizeof(*session));
960
- session->key = git_atomic_inc(&repo->attr_session_key);
1005
+ session->key = git_atomic32_inc(&repo->attr_session_key);
961
1006
 
962
1007
  return 0;
963
1008
  }
@@ -37,12 +37,30 @@
37
37
  (GIT_ATTR_FNMATCH_ALLOWSPACE | GIT_ATTR_FNMATCH_ALLOWNEG | GIT_ATTR_FNMATCH_ALLOWMACRO)
38
38
 
39
39
  typedef enum {
40
- GIT_ATTR_FILE__IN_MEMORY = 0,
41
- GIT_ATTR_FILE__FROM_FILE = 1,
42
- GIT_ATTR_FILE__FROM_INDEX = 2,
43
- GIT_ATTR_FILE__FROM_HEAD = 3,
40
+ GIT_ATTR_FILE_SOURCE_MEMORY = 0,
41
+ GIT_ATTR_FILE_SOURCE_FILE = 1,
42
+ GIT_ATTR_FILE_SOURCE_INDEX = 2,
43
+ GIT_ATTR_FILE_SOURCE_COMMIT = 3,
44
44
 
45
- GIT_ATTR_FILE_NUM_SOURCES = 4
45
+ GIT_ATTR_FILE_NUM_SOURCES = 4
46
+ } git_attr_file_source_t;
47
+
48
+ typedef struct {
49
+ /* The source location for the attribute file. */
50
+ git_attr_file_source_t type;
51
+
52
+ /*
53
+ * The filename of the attribute file to read (relative to the
54
+ * given base path).
55
+ */
56
+ const char *base;
57
+ const char *filename;
58
+
59
+ /*
60
+ * The commit ID when the given source type is a commit (or NULL
61
+ * for the repository's HEAD commit.)
62
+ */
63
+ git_oid *commit_id;
46
64
  } git_attr_file_source;
47
65
 
48
66
  extern const char *git_attr__true;
@@ -124,7 +142,7 @@ extern int git_attr_get_many_with_session(
124
142
  const char **values_out,
125
143
  git_repository *repo,
126
144
  git_attr_session *attr_session,
127
- uint32_t flags,
145
+ git_attr_options *opts,
128
146
  const char *path,
129
147
  size_t num_attr,
130
148
  const char **names);
@@ -142,7 +160,7 @@ typedef int (*git_attr_file_parser)(
142
160
  int git_attr_file__new(
143
161
  git_attr_file **out,
144
162
  git_attr_file_entry *entry,
145
- git_attr_file_source source);
163
+ git_attr_file_source *source);
146
164
 
147
165
  void git_attr_file__free(git_attr_file *file);
148
166
 
@@ -151,7 +169,7 @@ int git_attr_file__load(
151
169
  git_repository *repo,
152
170
  git_attr_session *attr_session,
153
171
  git_attr_file_entry *ce,
154
- git_attr_file_source source,
172
+ git_attr_file_source *source,
155
173
  git_attr_file_parser parser,
156
174
  bool allow_macros);
157
175
 
@@ -159,7 +177,7 @@ int git_attr_file__load_standalone(
159
177
  git_attr_file **out, const char *path);
160
178
 
161
179
  int git_attr_file__out_of_date(
162
- git_repository *repo, git_attr_session *session, git_attr_file *file);
180
+ git_repository *repo, git_attr_session *session, git_attr_file *file, git_attr_file_source *source);
163
181
 
164
182
  int git_attr_file__parse_buffer(
165
183
  git_repository *repo, git_attr_file *attrs, const char *data, bool allow_macros);
@@ -207,8 +225,11 @@ extern git_attr_assignment *git_attr_rule__lookup_assignment(
207
225
  typedef enum { GIT_DIR_FLAG_TRUE = 1, GIT_DIR_FLAG_FALSE = 0, GIT_DIR_FLAG_UNKNOWN = -1 } git_dir_flag;
208
226
 
209
227
  extern int git_attr_path__init(
210
- git_attr_path *info, const char *path, const char *base, git_dir_flag is_dir);
211
-
228
+ git_attr_path *out,
229
+ git_repository *repo,
230
+ const char *path,
231
+ const char *base,
232
+ git_dir_flag is_dir);
212
233
  extern void git_attr_path__free(git_attr_path *info);
213
234
 
214
235
  extern int git_attr_assignment__parse(
@@ -38,6 +38,7 @@ GIT_INLINE(git_attr_file_entry *) attr_cache_lookup_entry(
38
38
 
39
39
  int git_attr_cache__alloc_file_entry(
40
40
  git_attr_file_entry **out,
41
+ git_repository *repo,
41
42
  const char *base,
42
43
  const char *path,
43
44
  git_pool *pool)
@@ -65,6 +66,9 @@ int git_attr_cache__alloc_file_entry(
65
66
  }
66
67
  memcpy(&ce->fullpath[baselen], path, pathlen);
67
68
 
69
+ if (git_path_validate_workdir_with_len(repo, ce->fullpath, pathlen + baselen) < 0)
70
+ return -1;
71
+
68
72
  ce->path = &ce->fullpath[baselen];
69
73
  *out = ce;
70
74
 
@@ -79,8 +83,8 @@ static int attr_cache_make_entry(
79
83
  git_attr_file_entry *entry = NULL;
80
84
  int error;
81
85
 
82
- if ((error = git_attr_cache__alloc_file_entry(&entry, git_repository_workdir(repo),
83
- path, &cache->pool)) < 0)
86
+ if ((error = git_attr_cache__alloc_file_entry(&entry, repo,
87
+ git_repository_workdir(repo), path, &cache->pool)) < 0)
84
88
  return error;
85
89
 
86
90
  if ((error = git_strmap_set(cache->files, entry->path, entry)) < 0)
@@ -108,7 +112,7 @@ static int attr_cache_upsert(git_attr_cache *cache, git_attr_file *file)
108
112
  * Replace the existing value if another thread has
109
113
  * created it in the meantime.
110
114
  */
111
- old = git__swap(entry->file[file->source], file);
115
+ old = git_atomic_swap(entry->file[file->source.type], file);
112
116
 
113
117
  if (old) {
114
118
  GIT_REFCOUNT_OWN(old, NULL);
@@ -123,7 +127,7 @@ static int attr_cache_remove(git_attr_cache *cache, git_attr_file *file)
123
127
  {
124
128
  int error = 0;
125
129
  git_attr_file_entry *entry;
126
- git_attr_file *old = NULL;
130
+ git_attr_file *oldfile = NULL;
127
131
 
128
132
  if (!file)
129
133
  return 0;
@@ -132,13 +136,13 @@ static int attr_cache_remove(git_attr_cache *cache, git_attr_file *file)
132
136
  return error;
133
137
 
134
138
  if ((entry = attr_cache_lookup_entry(cache, file->entry->path)) != NULL)
135
- old = git__compare_and_swap(&entry->file[file->source], file, NULL);
139
+ oldfile = git_atomic_compare_and_swap(&entry->file[file->source.type], file, NULL);
136
140
 
137
141
  attr_cache_unlock(cache);
138
142
 
139
- if (old) {
140
- GIT_REFCOUNT_OWN(old, NULL);
141
- git_attr_file__free(old);
143
+ if (oldfile == file) {
144
+ GIT_REFCOUNT_OWN(file, NULL);
145
+ git_attr_file__free(file);
142
146
  }
143
147
 
144
148
  return error;
@@ -154,40 +158,42 @@ static int attr_cache_lookup(
154
158
  git_attr_file_entry **out_entry,
155
159
  git_repository *repo,
156
160
  git_attr_session *attr_session,
157
- git_attr_file_source source,
158
- const char *base,
159
- const char *filename)
161
+ git_attr_file_source *source)
160
162
  {
161
163
  int error = 0;
162
164
  git_buf path = GIT_BUF_INIT;
163
- const char *wd = git_repository_workdir(repo), *relfile;
165
+ const char *wd = git_repository_workdir(repo);
166
+ const char *filename;
164
167
  git_attr_cache *cache = git_repository_attr_cache(repo);
165
168
  git_attr_file_entry *entry = NULL;
166
169
  git_attr_file *file = NULL;
167
170
 
168
171
  /* join base and path as needed */
169
- if (base != NULL && git_path_root(filename) < 0) {
172
+ if (source->base != NULL && git_path_root(source->filename) < 0) {
170
173
  git_buf *p = attr_session ? &attr_session->tmp : &path;
171
174
 
172
- if (git_buf_joinpath(p, base, filename) < 0)
175
+ if (git_buf_joinpath(p, source->base, source->filename) < 0 ||
176
+ git_path_validate_workdir_buf(repo, p) < 0)
173
177
  return -1;
174
178
 
175
179
  filename = p->ptr;
180
+ } else {
181
+ filename = source->filename;
176
182
  }
177
183
 
178
- relfile = filename;
179
- if (wd && !git__prefixcmp(relfile, wd))
180
- relfile += strlen(wd);
184
+ if (wd && !git__prefixcmp(filename, wd))
185
+ filename += strlen(wd);
181
186
 
182
187
  /* check cache for existing entry */
183
188
  if ((error = attr_cache_lock(cache)) < 0)
184
189
  goto cleanup;
185
190
 
186
- entry = attr_cache_lookup_entry(cache, relfile);
187
- if (!entry)
188
- error = attr_cache_make_entry(&entry, repo, relfile);
189
- else if (entry->file[source] != NULL) {
190
- file = entry->file[source];
191
+ entry = attr_cache_lookup_entry(cache, filename);
192
+
193
+ if (!entry) {
194
+ error = attr_cache_make_entry(&entry, repo, filename);
195
+ } else if (entry->file[source->type] != NULL) {
196
+ file = entry->file[source->type];
191
197
  GIT_REFCOUNT_INC(file);
192
198
  }
193
199
 
@@ -205,9 +211,7 @@ int git_attr_cache__get(
205
211
  git_attr_file **out,
206
212
  git_repository *repo,
207
213
  git_attr_session *attr_session,
208
- git_attr_file_source source,
209
- const char *base,
210
- const char *filename,
214
+ git_attr_file_source *source,
211
215
  git_attr_file_parser parser,
212
216
  bool allow_macros)
213
217
  {
@@ -216,19 +220,21 @@ int git_attr_cache__get(
216
220
  git_attr_file_entry *entry = NULL;
217
221
  git_attr_file *file = NULL, *updated = NULL;
218
222
 
219
- if ((error = attr_cache_lookup(
220
- &file, &entry, repo, attr_session, source, base, filename)) < 0)
223
+ if ((error = attr_cache_lookup(&file, &entry, repo, attr_session, source)) < 0)
221
224
  return error;
222
225
 
223
226
  /* load file if we don't have one or if existing one is out of date */
224
- if (!file || (error = git_attr_file__out_of_date(repo, attr_session, file)) > 0)
225
- error = git_attr_file__load(&updated, repo, attr_session, entry, source, parser, allow_macros);
227
+ if (!file ||
228
+ (error = git_attr_file__out_of_date(repo, attr_session, file, source)) > 0)
229
+ error = git_attr_file__load(&updated, repo, attr_session,
230
+ entry, source, parser,
231
+ allow_macros);
226
232
 
227
233
  /* if we loaded the file, insert into and/or update cache */
228
234
  if (updated) {
229
- if ((error = attr_cache_upsert(cache, updated)) < 0)
235
+ if ((error = attr_cache_upsert(cache, updated)) < 0) {
230
236
  git_attr_file__free(updated);
231
- else {
237
+ } else {
232
238
  git_attr_file__free(file); /* offset incref from lookup */
233
239
  file = updated;
234
240
  }
@@ -255,7 +261,7 @@ int git_attr_cache__get(
255
261
 
256
262
  bool git_attr_cache__is_cached(
257
263
  git_repository *repo,
258
- git_attr_file_source source,
264
+ git_attr_file_source_t source_type,
259
265
  const char *filename)
260
266
  {
261
267
  git_attr_cache *cache = git_repository_attr_cache(repo);
@@ -268,7 +274,7 @@ bool git_attr_cache__is_cached(
268
274
  if ((entry = git_strmap_get(files, filename)) == NULL)
269
275
  return false;
270
276
 
271
- return entry && (entry->file[source] != NULL);
277
+ return entry && (entry->file[source_type] != NULL);
272
278
  }
273
279
 
274
280
 
@@ -321,7 +327,7 @@ static void attr_cache__free(git_attr_cache *cache)
321
327
 
322
328
  git_strmap_foreach_value(cache->files, entry, {
323
329
  for (i = 0; i < GIT_ATTR_FILE_NUM_SOURCES; ++i) {
324
- if ((file = git__swap(entry->file[i], NULL)) != NULL) {
330
+ if ((file = git_atomic_swap(entry->file[i], NULL)) != NULL) {
325
331
  GIT_REFCOUNT_OWN(file, NULL);
326
332
  git_attr_file__free(file);
327
333
  }
@@ -395,8 +401,7 @@ int git_attr_cache__init(git_repository *repo)
395
401
  (ret = git_pool_init(&cache->pool, 1)) < 0)
396
402
  goto cancel;
397
403
 
398
- cache = git__compare_and_swap(&repo->attrcache, NULL, cache);
399
- if (cache)
404
+ if (git_atomic_compare_and_swap(&repo->attrcache, NULL, cache) != NULL)
400
405
  goto cancel; /* raced with another thread, free this but no error */
401
406
 
402
407
  git_config_free(cfg);
@@ -417,7 +422,7 @@ int git_attr_cache_flush(git_repository *repo)
417
422
  /* this could be done less expensively, but for now, we'll just free
418
423
  * the entire attrcache and let the next use reinitialize it...
419
424
  */
420
- if (repo && (cache = git__swap(repo->attrcache, NULL)) != NULL)
425
+ if (repo && (cache = git_atomic_swap(repo->attrcache, NULL)) != NULL)
421
426
  attr_cache__free(cache);
422
427
 
423
428
  return 0;