rugged 0.17.0.b7 → 0.18.0.b1

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 (310) hide show
  1. data/LICENSE +1 -1
  2. data/README.md +88 -32
  3. data/ext/rugged/extconf.rb +4 -2
  4. data/ext/rugged/rugged.c +72 -10
  5. data/ext/rugged/rugged.h +14 -10
  6. data/ext/rugged/rugged_blob.c +8 -10
  7. data/ext/rugged/rugged_branch.c +11 -14
  8. data/ext/rugged/rugged_commit.c +31 -24
  9. data/ext/rugged/rugged_config.c +2 -2
  10. data/ext/rugged/rugged_index.c +133 -198
  11. data/ext/rugged/rugged_note.c +372 -0
  12. data/ext/rugged/rugged_object.c +50 -22
  13. data/ext/rugged/rugged_reference.c +122 -130
  14. data/ext/rugged/rugged_remote.c +72 -29
  15. data/ext/rugged/rugged_repo.c +402 -20
  16. data/ext/rugged/rugged_revwalk.c +7 -3
  17. data/ext/rugged/rugged_settings.c +110 -0
  18. data/ext/rugged/rugged_signature.c +23 -7
  19. data/ext/rugged/rugged_tag.c +32 -16
  20. data/ext/rugged/rugged_tree.c +44 -15
  21. data/lib/rugged.rb +1 -0
  22. data/lib/rugged/index.rb +8 -0
  23. data/lib/rugged/remote.rb +13 -0
  24. data/lib/rugged/repository.rb +3 -3
  25. data/lib/rugged/version.rb +1 -1
  26. data/test/blob_test.rb +13 -15
  27. data/test/branch_test.rb +32 -67
  28. data/test/commit_test.rb +50 -12
  29. data/test/config_test.rb +12 -11
  30. data/test/coverage/HEAD.json +1 -1
  31. data/test/coverage/cover.rb +40 -21
  32. data/test/errors_test.rb +34 -0
  33. data/test/fixtures/alternate/objects/14/6ae76773c91e3b1d00cf7a338ec55ae58297e2 +0 -0
  34. data/test/fixtures/alternate/objects/14/9c32d47e99d0a3572ff1e70a2e0051bbf347a9 +0 -0
  35. data/test/fixtures/alternate/objects/14/fb3108588f9421bf764041e5e3ac305eb6277f +0 -0
  36. data/test/fixtures/testrepo.git/logs/refs/notes/commits +1 -0
  37. data/test/fixtures/testrepo.git/objects/44/1034f860c1d5d90e4188d11ae0d325176869a8 +1 -0
  38. data/test/fixtures/testrepo.git/objects/60/d415052a33de2150bf68757f6461df4f563ae4 +0 -0
  39. data/test/fixtures/testrepo.git/objects/68/8a8f4ef7496901d15322972f96e212a9e466cc +1 -0
  40. data/test/fixtures/testrepo.git/objects/94/eca2de348d5f672faf56b0decafa5937e3235e +0 -0
  41. data/test/fixtures/testrepo.git/objects/9b/7384fe1676186192842f5d3e129457b62db9e3 +0 -0
  42. data/test/fixtures/testrepo.git/objects/b7/4713326bc972cc15751ed504dca6f6f3b91f7a +3 -0
  43. data/test/fixtures/testrepo.git/refs/notes/commits +1 -0
  44. data/test/index_test.rb +65 -69
  45. data/test/lib_test.rb +76 -11
  46. data/test/note_test.rb +158 -0
  47. data/test/object_test.rb +8 -11
  48. data/test/reference_test.rb +77 -85
  49. data/test/remote_test.rb +86 -8
  50. data/test/repo_pack_test.rb +9 -7
  51. data/test/repo_reset_test.rb +80 -0
  52. data/test/repo_test.rb +176 -53
  53. data/test/tag_test.rb +44 -7
  54. data/test/test_helper.rb +63 -35
  55. data/test/tree_test.rb +34 -13
  56. data/test/walker_test.rb +14 -14
  57. data/vendor/libgit2/Makefile.embed +1 -1
  58. data/vendor/libgit2/deps/http-parser/http_parser.c +974 -578
  59. data/vendor/libgit2/deps/http-parser/http_parser.h +106 -70
  60. data/vendor/libgit2/deps/regex/regcomp.c +7 -6
  61. data/vendor/libgit2/deps/regex/regex_internal.c +1 -1
  62. data/vendor/libgit2/deps/regex/regex_internal.h +12 -3
  63. data/vendor/libgit2/deps/regex/regexec.c +5 -5
  64. data/vendor/libgit2/include/git2.h +5 -1
  65. data/vendor/libgit2/include/git2/attr.h +4 -2
  66. data/vendor/libgit2/include/git2/blob.h +39 -12
  67. data/vendor/libgit2/include/git2/branch.h +123 -35
  68. data/vendor/libgit2/include/git2/checkout.h +206 -48
  69. data/vendor/libgit2/include/git2/clone.h +72 -27
  70. data/vendor/libgit2/include/git2/commit.h +20 -17
  71. data/vendor/libgit2/include/git2/common.h +67 -1
  72. data/vendor/libgit2/include/git2/config.h +81 -60
  73. data/vendor/libgit2/include/git2/cred_helpers.h +53 -0
  74. data/vendor/libgit2/include/git2/diff.h +459 -150
  75. data/vendor/libgit2/include/git2/errors.h +9 -1
  76. data/vendor/libgit2/include/git2/graph.h +41 -0
  77. data/vendor/libgit2/include/git2/ignore.h +7 -6
  78. data/vendor/libgit2/include/git2/index.h +323 -97
  79. data/vendor/libgit2/include/git2/indexer.h +27 -59
  80. data/vendor/libgit2/include/git2/inttypes.h +4 -0
  81. data/vendor/libgit2/include/git2/merge.h +13 -3
  82. data/vendor/libgit2/include/git2/message.h +14 -8
  83. data/vendor/libgit2/include/git2/net.h +9 -7
  84. data/vendor/libgit2/include/git2/notes.h +88 -29
  85. data/vendor/libgit2/include/git2/object.h +16 -6
  86. data/vendor/libgit2/include/git2/odb.h +80 -17
  87. data/vendor/libgit2/include/git2/odb_backend.h +47 -11
  88. data/vendor/libgit2/include/git2/oid.h +26 -17
  89. data/vendor/libgit2/include/git2/pack.h +62 -8
  90. data/vendor/libgit2/include/git2/push.h +131 -0
  91. data/vendor/libgit2/include/git2/refdb.h +103 -0
  92. data/vendor/libgit2/include/git2/refdb_backend.h +109 -0
  93. data/vendor/libgit2/include/git2/reflog.h +30 -21
  94. data/vendor/libgit2/include/git2/refs.h +215 -193
  95. data/vendor/libgit2/include/git2/refspec.h +22 -2
  96. data/vendor/libgit2/include/git2/remote.h +158 -37
  97. data/vendor/libgit2/include/git2/repository.h +150 -31
  98. data/vendor/libgit2/include/git2/reset.h +43 -9
  99. data/vendor/libgit2/include/git2/revparse.h +48 -4
  100. data/vendor/libgit2/include/git2/revwalk.h +25 -10
  101. data/vendor/libgit2/include/git2/signature.h +20 -12
  102. data/vendor/libgit2/include/git2/stash.h +121 -0
  103. data/vendor/libgit2/include/git2/status.h +122 -53
  104. data/vendor/libgit2/include/git2/strarray.h +17 -11
  105. data/vendor/libgit2/include/git2/submodule.h +42 -7
  106. data/vendor/libgit2/include/git2/tag.h +72 -59
  107. data/vendor/libgit2/include/git2/threads.h +4 -2
  108. data/vendor/libgit2/include/git2/trace.h +68 -0
  109. data/vendor/libgit2/include/git2/transport.h +328 -0
  110. data/vendor/libgit2/include/git2/tree.h +149 -120
  111. data/vendor/libgit2/include/git2/types.h +13 -12
  112. data/vendor/libgit2/include/git2/version.h +3 -3
  113. data/vendor/libgit2/src/amiga/map.c +2 -2
  114. data/vendor/libgit2/src/attr.c +58 -48
  115. data/vendor/libgit2/src/attr.h +4 -18
  116. data/vendor/libgit2/src/attr_file.c +30 -6
  117. data/vendor/libgit2/src/attr_file.h +6 -8
  118. data/vendor/libgit2/src/attrcache.h +24 -0
  119. data/vendor/libgit2/src/blob.c +30 -7
  120. data/vendor/libgit2/src/blob.h +1 -1
  121. data/vendor/libgit2/src/branch.c +361 -68
  122. data/vendor/libgit2/src/branch.h +17 -0
  123. data/vendor/libgit2/src/bswap.h +1 -1
  124. data/vendor/libgit2/src/buf_text.c +291 -0
  125. data/vendor/libgit2/src/buf_text.h +122 -0
  126. data/vendor/libgit2/src/buffer.c +27 -101
  127. data/vendor/libgit2/src/buffer.h +54 -39
  128. data/vendor/libgit2/src/cache.c +15 -6
  129. data/vendor/libgit2/src/cache.h +1 -1
  130. data/vendor/libgit2/src/cc-compat.h +3 -1
  131. data/vendor/libgit2/src/checkout.c +1165 -222
  132. data/vendor/libgit2/src/checkout.h +24 -0
  133. data/vendor/libgit2/src/clone.c +171 -86
  134. data/vendor/libgit2/src/commit.c +44 -45
  135. data/vendor/libgit2/src/commit.h +3 -3
  136. data/vendor/libgit2/src/commit_list.c +194 -0
  137. data/vendor/libgit2/src/commit_list.h +49 -0
  138. data/vendor/libgit2/src/common.h +44 -10
  139. data/vendor/libgit2/src/compress.c +1 -1
  140. data/vendor/libgit2/src/compress.h +1 -1
  141. data/vendor/libgit2/src/config.c +211 -124
  142. data/vendor/libgit2/src/config.h +23 -4
  143. data/vendor/libgit2/src/config_cache.c +2 -2
  144. data/vendor/libgit2/src/config_file.c +129 -53
  145. data/vendor/libgit2/src/config_file.h +10 -8
  146. data/vendor/libgit2/src/crlf.c +66 -67
  147. data/vendor/libgit2/src/date.c +12 -12
  148. data/vendor/libgit2/src/delta-apply.c +14 -1
  149. data/vendor/libgit2/src/delta-apply.h +18 -1
  150. data/vendor/libgit2/src/delta.c +40 -107
  151. data/vendor/libgit2/src/delta.h +19 -17
  152. data/vendor/libgit2/src/diff.c +347 -496
  153. data/vendor/libgit2/src/diff.h +27 -1
  154. data/vendor/libgit2/src/diff_output.c +564 -249
  155. data/vendor/libgit2/src/diff_output.h +15 -8
  156. data/vendor/libgit2/src/diff_tform.c +687 -0
  157. data/vendor/libgit2/src/errors.c +27 -36
  158. data/vendor/libgit2/src/fetch.c +13 -351
  159. data/vendor/libgit2/src/fetch.h +13 -3
  160. data/vendor/libgit2/src/fetchhead.c +295 -0
  161. data/vendor/libgit2/src/fetchhead.h +34 -0
  162. data/vendor/libgit2/src/filebuf.c +42 -15
  163. data/vendor/libgit2/src/filebuf.h +4 -2
  164. data/vendor/libgit2/src/fileops.c +466 -113
  165. data/vendor/libgit2/src/fileops.h +154 -28
  166. data/vendor/libgit2/src/filter.c +3 -75
  167. data/vendor/libgit2/src/filter.h +1 -29
  168. data/vendor/libgit2/src/fnmatch.c +1 -1
  169. data/vendor/libgit2/src/fnmatch.h +1 -1
  170. data/vendor/libgit2/src/global.c +54 -10
  171. data/vendor/libgit2/src/global.h +10 -1
  172. data/vendor/libgit2/src/graph.c +178 -0
  173. data/vendor/libgit2/src/hash.c +25 -52
  174. data/vendor/libgit2/src/hash.h +21 -9
  175. data/vendor/libgit2/src/{sha1/sha1.c → hash/hash_generic.c} +20 -12
  176. data/vendor/libgit2/src/hash/hash_generic.h +24 -0
  177. data/vendor/libgit2/src/hash/hash_openssl.h +45 -0
  178. data/vendor/libgit2/src/hash/hash_win32.c +291 -0
  179. data/vendor/libgit2/src/hash/hash_win32.h +140 -0
  180. data/vendor/libgit2/src/hashsig.c +368 -0
  181. data/vendor/libgit2/src/hashsig.h +72 -0
  182. data/vendor/libgit2/src/ignore.c +22 -15
  183. data/vendor/libgit2/src/ignore.h +6 -1
  184. data/vendor/libgit2/src/index.c +770 -171
  185. data/vendor/libgit2/src/index.h +13 -5
  186. data/vendor/libgit2/src/indexer.c +286 -431
  187. data/vendor/libgit2/src/iterator.c +854 -466
  188. data/vendor/libgit2/src/iterator.h +134 -109
  189. data/vendor/libgit2/src/map.h +1 -1
  190. data/vendor/libgit2/src/merge.c +296 -0
  191. data/vendor/libgit2/src/merge.h +22 -0
  192. data/vendor/libgit2/src/message.c +1 -1
  193. data/vendor/libgit2/src/message.h +1 -1
  194. data/vendor/libgit2/src/mwindow.c +35 -30
  195. data/vendor/libgit2/src/mwindow.h +2 -2
  196. data/vendor/libgit2/src/netops.c +162 -98
  197. data/vendor/libgit2/src/netops.h +50 -15
  198. data/vendor/libgit2/src/notes.c +109 -58
  199. data/vendor/libgit2/src/notes.h +2 -1
  200. data/vendor/libgit2/src/object.c +46 -57
  201. data/vendor/libgit2/src/object.h +1 -8
  202. data/vendor/libgit2/src/odb.c +151 -40
  203. data/vendor/libgit2/src/odb.h +5 -1
  204. data/vendor/libgit2/src/odb_loose.c +4 -5
  205. data/vendor/libgit2/src/odb_pack.c +122 -80
  206. data/vendor/libgit2/src/offmap.h +65 -0
  207. data/vendor/libgit2/src/oid.c +12 -4
  208. data/vendor/libgit2/src/oidmap.h +1 -1
  209. data/vendor/libgit2/src/pack-objects.c +88 -61
  210. data/vendor/libgit2/src/pack-objects.h +8 -8
  211. data/vendor/libgit2/src/pack.c +293 -28
  212. data/vendor/libgit2/src/pack.h +49 -4
  213. data/vendor/libgit2/src/path.c +103 -14
  214. data/vendor/libgit2/src/path.h +23 -7
  215. data/vendor/libgit2/src/pathspec.c +168 -0
  216. data/vendor/libgit2/src/pathspec.h +40 -0
  217. data/vendor/libgit2/src/pool.c +29 -4
  218. data/vendor/libgit2/src/pool.h +8 -1
  219. data/vendor/libgit2/src/posix.c +26 -27
  220. data/vendor/libgit2/src/posix.h +2 -3
  221. data/vendor/libgit2/src/pqueue.c +23 -1
  222. data/vendor/libgit2/src/pqueue.h +23 -1
  223. data/vendor/libgit2/src/push.c +653 -0
  224. data/vendor/libgit2/src/push.h +51 -0
  225. data/vendor/libgit2/src/refdb.c +185 -0
  226. data/vendor/libgit2/src/refdb.h +46 -0
  227. data/vendor/libgit2/src/refdb_fs.c +1024 -0
  228. data/vendor/libgit2/src/refdb_fs.h +15 -0
  229. data/vendor/libgit2/src/reflog.c +77 -45
  230. data/vendor/libgit2/src/reflog.h +1 -3
  231. data/vendor/libgit2/src/refs.c +366 -1326
  232. data/vendor/libgit2/src/refs.h +22 -13
  233. data/vendor/libgit2/src/refspec.c +46 -7
  234. data/vendor/libgit2/src/refspec.h +11 -1
  235. data/vendor/libgit2/src/remote.c +758 -120
  236. data/vendor/libgit2/src/remote.h +10 -5
  237. data/vendor/libgit2/src/repo_template.h +6 -6
  238. data/vendor/libgit2/src/repository.c +315 -96
  239. data/vendor/libgit2/src/repository.h +5 -3
  240. data/vendor/libgit2/src/reset.c +99 -81
  241. data/vendor/libgit2/src/revparse.c +157 -84
  242. data/vendor/libgit2/src/revwalk.c +68 -470
  243. data/vendor/libgit2/src/revwalk.h +44 -0
  244. data/vendor/libgit2/src/sha1_lookup.c +1 -1
  245. data/vendor/libgit2/src/sha1_lookup.h +1 -1
  246. data/vendor/libgit2/src/signature.c +68 -200
  247. data/vendor/libgit2/src/signature.h +1 -1
  248. data/vendor/libgit2/src/stash.c +663 -0
  249. data/vendor/libgit2/src/status.c +101 -79
  250. data/vendor/libgit2/src/strmap.h +1 -1
  251. data/vendor/libgit2/src/submodule.c +67 -51
  252. data/vendor/libgit2/src/submodule.h +1 -1
  253. data/vendor/libgit2/src/tag.c +35 -29
  254. data/vendor/libgit2/src/tag.h +1 -1
  255. data/vendor/libgit2/src/thread-utils.c +1 -1
  256. data/vendor/libgit2/src/thread-utils.h +2 -2
  257. data/vendor/libgit2/src/trace.c +39 -0
  258. data/vendor/libgit2/src/trace.h +56 -0
  259. data/vendor/libgit2/src/transport.c +81 -34
  260. data/vendor/libgit2/src/transports/cred.c +60 -0
  261. data/vendor/libgit2/src/transports/cred_helpers.c +49 -0
  262. data/vendor/libgit2/src/transports/git.c +234 -127
  263. data/vendor/libgit2/src/transports/http.c +761 -433
  264. data/vendor/libgit2/src/transports/local.c +460 -64
  265. data/vendor/libgit2/src/transports/smart.c +345 -0
  266. data/vendor/libgit2/src/transports/smart.h +179 -0
  267. data/vendor/libgit2/src/{pkt.c → transports/smart_pkt.c} +131 -12
  268. data/vendor/libgit2/src/transports/smart_protocol.c +856 -0
  269. data/vendor/libgit2/src/transports/winhttp.c +1136 -0
  270. data/vendor/libgit2/src/tree-cache.c +2 -2
  271. data/vendor/libgit2/src/tree-cache.h +1 -1
  272. data/vendor/libgit2/src/tree.c +239 -166
  273. data/vendor/libgit2/src/tree.h +11 -2
  274. data/vendor/libgit2/src/tsort.c +39 -23
  275. data/vendor/libgit2/src/unix/map.c +1 -1
  276. data/vendor/libgit2/src/unix/posix.h +12 -2
  277. data/vendor/libgit2/src/unix/realpath.c +30 -0
  278. data/vendor/libgit2/src/util.c +250 -13
  279. data/vendor/libgit2/src/util.h +71 -14
  280. data/vendor/libgit2/src/vector.c +123 -60
  281. data/vendor/libgit2/src/vector.h +24 -22
  282. data/vendor/libgit2/src/win32/dir.c +1 -1
  283. data/vendor/libgit2/src/win32/dir.h +1 -1
  284. data/vendor/libgit2/src/win32/error.c +77 -0
  285. data/vendor/libgit2/src/win32/error.h +13 -0
  286. data/vendor/libgit2/src/win32/findfile.c +143 -54
  287. data/vendor/libgit2/src/win32/findfile.h +10 -6
  288. data/vendor/libgit2/src/win32/map.c +1 -1
  289. data/vendor/libgit2/src/win32/mingw-compat.h +1 -1
  290. data/vendor/libgit2/src/win32/msvc-compat.h +10 -1
  291. data/vendor/libgit2/src/win32/posix.h +10 -1
  292. data/vendor/libgit2/src/win32/posix_w32.c +132 -63
  293. data/vendor/libgit2/src/win32/precompiled.c +1 -1
  294. data/vendor/libgit2/src/win32/pthread.c +1 -1
  295. data/vendor/libgit2/src/win32/pthread.h +1 -1
  296. data/vendor/libgit2/src/win32/utf-conv.c +5 -5
  297. data/vendor/libgit2/src/win32/utf-conv.h +3 -3
  298. data/vendor/libgit2/src/win32/version.h +20 -0
  299. metadata +308 -252
  300. data/test/fixtures/testrepo.git/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 +0 -0
  301. data/test/fixtures/testrepo.git/objects/7f/043268ea43ce18e3540acaabf9e090c91965b0 +0 -0
  302. data/test/fixtures/testrepo.git/objects/a3/e05719b428a2d0ed7a55c4ce53dcc5768c6d5e +0 -0
  303. data/test/index_test.rb~ +0 -218
  304. data/vendor/libgit2/src/pkt.h +0 -91
  305. data/vendor/libgit2/src/ppc/sha1.c +0 -70
  306. data/vendor/libgit2/src/ppc/sha1.h +0 -26
  307. data/vendor/libgit2/src/protocol.c +0 -110
  308. data/vendor/libgit2/src/protocol.h +0 -21
  309. data/vendor/libgit2/src/sha1.h +0 -33
  310. data/vendor/libgit2/src/transport.h +0 -148
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (C) 2009-2012 the libgit2 contributors
2
+ * Copyright (C) the libgit2 contributors. All rights reserved.
3
3
  *
4
4
  * This file is part of libgit2, distributed under the GNU GPL v2 with
5
5
  * a Linking Exception. For full terms see the included COPYING file.
@@ -24,41 +24,38 @@ typedef struct git_vector {
24
24
  int git_vector_init(git_vector *v, size_t initial_size, git_vector_cmp cmp);
25
25
  void git_vector_free(git_vector *v);
26
26
  void git_vector_clear(git_vector *v);
27
- int git_vector_dup(git_vector *v, git_vector *src, git_vector_cmp cmp);
27
+ int git_vector_dup(git_vector *v, const git_vector *src, git_vector_cmp cmp);
28
28
  void git_vector_swap(git_vector *a, git_vector *b);
29
29
 
30
30
  void git_vector_sort(git_vector *v);
31
31
 
32
- int git_vector_search(git_vector *v, const void *entry);
33
- int git_vector_search2(git_vector *v, git_vector_cmp cmp, const void *key);
32
+ /** Linear search for matching entry using internal comparison function */
33
+ int git_vector_search(size_t *at_pos, const git_vector *v, const void *entry);
34
34
 
35
- int git_vector_bsearch3(
36
- unsigned int *at_pos, git_vector *v, git_vector_cmp cmp, const void *key);
35
+ /** Linear search for matching entry using explicit comparison function */
36
+ int git_vector_search2(size_t *at_pos, const git_vector *v, git_vector_cmp cmp, const void *key);
37
37
 
38
- GIT_INLINE(int) git_vector_bsearch(git_vector *v, const void *key)
39
- {
40
- return git_vector_bsearch3(NULL, v, v->_cmp, key);
41
- }
42
-
43
- GIT_INLINE(int) git_vector_bsearch2(
44
- git_vector *v, git_vector_cmp cmp, const void *key)
45
- {
46
- return git_vector_bsearch3(NULL, v, cmp, key);
47
- }
38
+ /**
39
+ * Binary search for matching entry using explicit comparison function that
40
+ * returns position where item would go if not found.
41
+ */
42
+ int git_vector_bsearch2(
43
+ size_t *at_pos, git_vector *v, git_vector_cmp cmp, const void *key);
48
44
 
49
- GIT_INLINE(void *) git_vector_get(git_vector *v, size_t position)
45
+ /** Binary search for matching entry using internal comparison function */
46
+ GIT_INLINE(int) git_vector_bsearch(size_t *at_pos, git_vector *v, const void *key)
50
47
  {
51
- return (position < v->length) ? v->contents[position] : NULL;
48
+ return git_vector_bsearch2(at_pos, v, v->_cmp, key);
52
49
  }
53
50
 
54
- GIT_INLINE(const void *) git_vector_get_const(const git_vector *v, size_t position)
51
+ GIT_INLINE(void *) git_vector_get(const git_vector *v, size_t position)
55
52
  {
56
53
  return (position < v->length) ? v->contents[position] : NULL;
57
54
  }
58
55
 
59
56
  #define GIT_VECTOR_GET(V,I) ((I) < (V)->length ? (V)->contents[(I)] : NULL)
60
57
 
61
- GIT_INLINE(void *) git_vector_last(git_vector *v)
58
+ GIT_INLINE(void *) git_vector_last(const git_vector *v)
62
59
  {
63
60
  return (v->length > 0) ? git_vector_get(v, v->length - 1) : NULL;
64
61
  }
@@ -67,13 +64,18 @@ GIT_INLINE(void *) git_vector_last(git_vector *v)
67
64
  for ((iter) = 0; (iter) < (v)->length && ((elem) = (v)->contents[(iter)], 1); (iter)++ )
68
65
 
69
66
  #define git_vector_rforeach(v, iter, elem) \
70
- for ((iter) = (v)->length; (iter) > 0 && ((elem) = (v)->contents[(iter)-1], 1); (iter)-- )
67
+ for ((iter) = (v)->length - 1; (iter) < SIZE_MAX && ((elem) = (v)->contents[(iter)], 1); (iter)-- )
71
68
 
72
69
  int git_vector_insert(git_vector *v, void *element);
73
70
  int git_vector_insert_sorted(git_vector *v, void *element,
74
71
  int (*on_dup)(void **old, void *new));
75
- int git_vector_remove(git_vector *v, unsigned int idx);
72
+ int git_vector_remove(git_vector *v, size_t idx);
76
73
  void git_vector_pop(git_vector *v);
77
74
  void git_vector_uniq(git_vector *v);
75
+ void git_vector_remove_matching(
76
+ git_vector *v, int (*match)(const git_vector *v, size_t idx));
77
+
78
+ int git_vector_resize_to(git_vector *v, size_t new_length);
79
+ int git_vector_set(void **old, git_vector *v, size_t position, void *value);
78
80
 
79
81
  #endif
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (C) 2009-2012 the libgit2 contributors
2
+ * Copyright (C) the libgit2 contributors. All rights reserved.
3
3
  *
4
4
  * This file is part of libgit2, distributed under the GNU GPL v2 with
5
5
  * a Linking Exception. For full terms see the included COPYING file.
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (C) 2009-2012 the libgit2 contributors
2
+ * Copyright (C) the libgit2 contributors. All rights reserved.
3
3
  *
4
4
  * This file is part of libgit2, distributed under the GNU GPL v2 with
5
5
  * a Linking Exception. For full terms see the included COPYING file.
@@ -0,0 +1,77 @@
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
+ #include "common.h"
9
+ #include "error.h"
10
+
11
+ #ifdef GIT_WINHTTP
12
+ # include <winhttp.h>
13
+ #endif
14
+
15
+ #define WC_ERR_INVALID_CHARS 0x80
16
+
17
+ char *git_win32_get_error_message(DWORD error_code)
18
+ {
19
+ LPWSTR lpMsgBuf = NULL;
20
+ HMODULE hModule = NULL;
21
+ char *utf8_msg = NULL;
22
+ int utf8_size;
23
+ DWORD dwFlags =
24
+ FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS;
25
+
26
+ if (!error_code)
27
+ return NULL;
28
+
29
+ #ifdef GIT_WINHTTP
30
+ /* Errors raised by WinHTTP are not in the system resource table */
31
+ if (error_code >= WINHTTP_ERROR_BASE &&
32
+ error_code <= WINHTTP_ERROR_LAST)
33
+ hModule = GetModuleHandleW(L"winhttp");
34
+ #endif
35
+
36
+ GIT_UNUSED(hModule);
37
+
38
+ if (hModule)
39
+ dwFlags |= FORMAT_MESSAGE_FROM_HMODULE;
40
+ else
41
+ dwFlags |= FORMAT_MESSAGE_FROM_SYSTEM;
42
+
43
+ if (FormatMessageW(dwFlags, hModule, error_code,
44
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
45
+ (LPWSTR)&lpMsgBuf, 0, NULL)) {
46
+
47
+ /* Invalid code point check supported on Vista+ only */
48
+ if (git_has_win32_version(6, 0))
49
+ dwFlags = WC_ERR_INVALID_CHARS;
50
+ else
51
+ dwFlags = 0;
52
+
53
+ utf8_size = WideCharToMultiByte(CP_UTF8, dwFlags,
54
+ lpMsgBuf, -1, NULL, 0, NULL, NULL);
55
+
56
+ if (!utf8_size) {
57
+ assert(0);
58
+ goto on_error;
59
+ }
60
+
61
+ utf8_msg = git__malloc(utf8_size);
62
+
63
+ if (!utf8_msg)
64
+ goto on_error;
65
+
66
+ if (!WideCharToMultiByte(CP_UTF8, dwFlags,
67
+ lpMsgBuf, -1, utf8_msg, utf8_size, NULL, NULL)) {
68
+ git__free(utf8_msg);
69
+ goto on_error;
70
+ }
71
+
72
+ on_error:
73
+ LocalFree(lpMsgBuf);
74
+ }
75
+
76
+ return utf8_msg;
77
+ }
@@ -0,0 +1,13 @@
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_git_win32_error_h__
9
+ #define INCLUDE_git_win32_error_h__
10
+
11
+ extern char *git_win32_get_error_message(DWORD error_code);
12
+
13
+ #endif
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (C) 2012 the libgit2 contributors
2
+ * Copyright (C) the libgit2 contributors. All rights reserved.
3
3
  *
4
4
  * This file is part of libgit2, distributed under the GNU GPL v2 with
5
5
  * a Linking Exception. For full terms see the included COPYING file.
@@ -9,23 +9,35 @@
9
9
  #include "path.h"
10
10
  #include "findfile.h"
11
11
 
12
+ #define REG_MSYSGIT_INSTALL_LOCAL L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Git_is1"
13
+
12
14
  #ifndef _WIN64
13
- #define REG_MSYSGIT_INSTALL L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Git_is1"
15
+ #define REG_MSYSGIT_INSTALL REG_MSYSGIT_INSTALL_LOCAL
14
16
  #else
15
17
  #define REG_MSYSGIT_INSTALL L"SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Git_is1"
16
18
  #endif
17
19
 
18
- int win32_expand_path(struct win32_path *s_root, const wchar_t *templ)
20
+ int git_win32__expand_path(struct git_win32__path *s_root, const wchar_t *templ)
19
21
  {
20
22
  s_root->len = ExpandEnvironmentStringsW(templ, s_root->path, MAX_PATH);
21
23
  return s_root->len ? 0 : -1;
22
24
  }
23
25
 
24
- int win32_find_file(git_buf *path, const struct win32_path *root, const char *filename)
26
+ static int win32_path_utf16_to_8(git_buf *path_utf8, const wchar_t *path_utf16)
27
+ {
28
+ char temp_utf8[GIT_PATH_MAX];
29
+
30
+ git__utf16_to_8(temp_utf8, path_utf16);
31
+ git_path_mkposix(temp_utf8);
32
+
33
+ return git_buf_sets(path_utf8, temp_utf8);
34
+ }
35
+
36
+ int git_win32__find_file(
37
+ git_buf *path, const struct git_win32__path *root, const char *filename)
25
38
  {
26
39
  size_t len, alloc_len;
27
40
  wchar_t *file_utf16 = NULL;
28
- char file_utf8[GIT_PATH_MAX];
29
41
 
30
42
  if (!root || !filename || (len = strlen(filename)) == 0)
31
43
  return GIT_ENOTFOUND;
@@ -49,15 +61,13 @@ int win32_find_file(git_buf *path, const struct win32_path *root, const char *fi
49
61
  return GIT_ENOTFOUND;
50
62
  }
51
63
 
52
- git__utf16_to_8(file_utf8, file_utf16);
53
- git_path_mkposix(file_utf8);
54
- git_buf_sets(path, file_utf8);
55
-
64
+ win32_path_utf16_to_8(path, file_utf16);
56
65
  git__free(file_utf16);
66
+
57
67
  return 0;
58
68
  }
59
69
 
60
- wchar_t* win32_nextpath(wchar_t *path, wchar_t *buf, size_t buflen)
70
+ static wchar_t* win32_walkpath(wchar_t *path, wchar_t *buf, size_t buflen)
61
71
  {
62
72
  wchar_t term, *base = path;
63
73
 
@@ -76,74 +86,153 @@ wchar_t* win32_nextpath(wchar_t *path, wchar_t *buf, size_t buflen)
76
86
  return (path != base) ? path : NULL;
77
87
  }
78
88
 
79
- int win32_find_system_file_using_path(git_buf *path, const char *filename)
89
+ static int win32_find_git_in_path(git_buf *buf, const wchar_t *gitexe)
80
90
  {
81
- wchar_t * env = NULL;
82
- struct win32_path root;
91
+ wchar_t *env = _wgetenv(L"PATH"), lastch;
92
+ struct git_win32__path root;
93
+ size_t gitexe_len = wcslen(gitexe);
83
94
 
84
- env = _wgetenv(L"PATH");
85
95
  if (!env)
86
96
  return -1;
87
97
 
88
- // search in all paths defined in PATH
89
- while ((env = win32_nextpath(env, root.path, MAX_PATH - 1)) != NULL && *root.path)
90
- {
91
- wchar_t * pfin = root.path + wcslen(root.path) - 1; // last char of the current path entry
98
+ while ((env = win32_walkpath(env, root.path, MAX_PATH-1)) && *root.path) {
99
+ root.len = (DWORD)wcslen(root.path);
100
+ lastch = root.path[root.len - 1];
101
+
102
+ /* ensure trailing slash (MAX_PATH-1 to walkpath guarantees space) */
103
+ if (lastch != L'/' && lastch != L'\\') {
104
+ root.path[root.len++] = L'\\';
105
+ root.path[root.len] = L'\0';
106
+ }
92
107
 
93
- // ensure trailing slash
94
- if (*pfin != L'/' && *pfin != L'\\')
95
- wcscpy(++pfin, L"\\"); // we have enough space left, MAX_PATH - 1 is used in nextpath above
108
+ if (root.len + gitexe_len >= MAX_PATH)
109
+ continue;
110
+ wcscpy(&root.path[root.len], gitexe);
96
111
 
97
- root.len = (DWORD)wcslen(root.path) + 1;
112
+ if (_waccess(root.path, F_OK) == 0 && root.len > 5) {
113
+ /* replace "bin\\" or "cmd\\" with "etc\\" */
114
+ wcscpy(&root.path[root.len - 4], L"etc\\");
98
115
 
99
- if (win32_find_file(path, &root, "git.cmd") == 0 || win32_find_file(path, &root, "git.exe") == 0) {
100
- // we found the cmd or bin directory of a git installaton
101
- if (root.len > 5) {
102
- wcscpy(root.path + wcslen(root.path) - 4, L"etc\\");
103
- if (win32_find_file(path, &root, filename) == 0)
104
- return 0;
105
- }
116
+ win32_path_utf16_to_8(buf, root.path);
117
+ return 0;
106
118
  }
107
119
  }
108
-
120
+
109
121
  return GIT_ENOTFOUND;
110
122
  }
111
123
 
112
- int win32_find_system_file_using_registry(git_buf *path, const char *filename)
124
+ static int win32_find_git_in_registry(
125
+ git_buf *buf, const HKEY hieve, const wchar_t *key)
113
126
  {
114
- struct win32_path root;
115
-
116
127
  HKEY hKey;
117
128
  DWORD dwType = REG_SZ;
118
- DWORD dwSize = MAX_PATH;
129
+ struct git_win32__path path16;
130
+
131
+ assert(buf);
132
+
133
+ path16.len = 0;
119
134
 
120
- root.len = 0;
121
- if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, REG_MSYSGIT_INSTALL, 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS)
122
- {
123
- if (RegQueryValueExW(hKey, L"InstallLocation", NULL, &dwType,(LPBYTE)&root.path, &dwSize) == ERROR_SUCCESS)
135
+ if (RegOpenKeyExW(hieve, key, 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS) {
136
+ if (RegQueryValueExW(hKey, L"InstallLocation", NULL, &dwType,
137
+ (LPBYTE)&path16.path, &path16.len) == ERROR_SUCCESS)
124
138
  {
125
- // InstallLocation points to the root of the msysgit directory
126
- if (dwSize + 4 > MAX_PATH) // 4 = wcslen(L"etc\\")
127
- {
128
- giterr_set(GITERR_OS, "Cannot locate the system's msysgit directory - path too long");
139
+ /* InstallLocation points to the root of the git directory */
140
+
141
+ if (path16.len + 4 > MAX_PATH) { /* 4 = wcslen(L"etc\\") */
142
+ giterr_set(GITERR_OS, "Cannot locate git - path too long");
129
143
  return -1;
130
144
  }
131
- wcscat(root.path, L"etc\\");
132
- root.len = (DWORD)wcslen(root.path) + 1;
145
+
146
+ wcscat(path16.path, L"etc\\");
147
+ path16.len += 4;
148
+
149
+ win32_path_utf16_to_8(buf, path16.path);
133
150
  }
134
- }
135
- RegCloseKey(hKey);
136
151
 
137
- if (!root.len) {
138
- giterr_set(GITERR_OS, "Cannot locate the system's msysgit directory");
139
- return -1;
152
+ RegCloseKey(hKey);
140
153
  }
141
154
 
142
- if (win32_find_file(path, &root, filename) < 0) {
143
- giterr_set(GITERR_OS, "The system file '%s' doesn't exist", filename);
144
- git_buf_clear(path);
145
- return GIT_ENOTFOUND;
155
+ return path16.len ? 0 : GIT_ENOTFOUND;
156
+ }
157
+
158
+ static int win32_find_existing_dirs(
159
+ git_buf *out, const wchar_t *tmpl[], char *temp[])
160
+ {
161
+ struct git_win32__path path16;
162
+ git_buf buf = GIT_BUF_INIT;
163
+
164
+ git_buf_clear(out);
165
+
166
+ for (; *tmpl != NULL; tmpl++) {
167
+ if (!git_win32__expand_path(&path16, *tmpl) &&
168
+ path16.path[0] != L'%' &&
169
+ !_waccess(path16.path, F_OK))
170
+ {
171
+ win32_path_utf16_to_8(&buf, path16.path);
172
+
173
+ if (buf.size)
174
+ git_buf_join(out, GIT_PATH_LIST_SEPARATOR, out->ptr, buf.ptr);
175
+ }
146
176
  }
147
177
 
148
- return 0;
178
+ git_buf_free(&buf);
179
+
180
+ return (git_buf_oom(out) ? -1 : 0);
149
181
  }
182
+
183
+ int git_win32__find_system_dirs(git_buf *out)
184
+ {
185
+ git_buf buf = GIT_BUF_INIT;
186
+
187
+ /* directories where git.exe & git.cmd are found */
188
+ if (!win32_find_git_in_path(&buf, L"git.exe") && buf.size)
189
+ git_buf_set(out, buf.ptr, buf.size);
190
+ else
191
+ git_buf_clear(out);
192
+
193
+ if (!win32_find_git_in_path(&buf, L"git.cmd") && buf.size)
194
+ git_buf_join(out, GIT_PATH_LIST_SEPARATOR, out->ptr, buf.ptr);
195
+
196
+ /* directories where git is installed according to registry */
197
+ if (!win32_find_git_in_registry(
198
+ &buf, HKEY_CURRENT_USER, REG_MSYSGIT_INSTALL_LOCAL) && buf.size)
199
+ git_buf_join(out, GIT_PATH_LIST_SEPARATOR, out->ptr, buf.ptr);
200
+
201
+ if (!win32_find_git_in_registry(
202
+ &buf, HKEY_LOCAL_MACHINE, REG_MSYSGIT_INSTALL) && buf.size)
203
+ git_buf_join(out, GIT_PATH_LIST_SEPARATOR, out->ptr, buf.ptr);
204
+
205
+ git_buf_free(&buf);
206
+
207
+ return (git_buf_oom(out) ? -1 : 0);
208
+ }
209
+
210
+ int git_win32__find_global_dirs(git_buf *out)
211
+ {
212
+ char *temp[3];
213
+ static const wchar_t *global_tmpls[4] = {
214
+ L"%HOME%\\",
215
+ L"%HOMEDRIVE%%HOMEPATH%\\",
216
+ L"%USERPROFILE%\\",
217
+ NULL,
218
+ };
219
+
220
+ return win32_find_existing_dirs(out, global_tmpls, temp);
221
+ }
222
+
223
+ int git_win32__find_xdg_dirs(git_buf *out)
224
+ {
225
+ char *temp[6];
226
+ static const wchar_t *global_tmpls[7] = {
227
+ L"%XDG_CONFIG_HOME%\\git",
228
+ L"%APPDATA%\\git",
229
+ L"%LOCALAPPDATA%\\git",
230
+ L"%HOME%\\.config\\git",
231
+ L"%HOMEDRIVE%%HOMEPATH%\\.config\\git",
232
+ L"%USERPROFILE%\\.config\\git",
233
+ NULL,
234
+ };
235
+
236
+ return win32_find_existing_dirs(out, global_tmpls, temp);
237
+ }
238
+