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) 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.
@@ -8,16 +8,20 @@
8
8
  #ifndef INCLUDE_git_findfile_h__
9
9
  #define INCLUDE_git_findfile_h__
10
10
 
11
- struct win32_path {
11
+ struct git_win32__path {
12
12
  wchar_t path[MAX_PATH];
13
13
  DWORD len;
14
14
  };
15
15
 
16
- int win32_expand_path(struct win32_path *s_root, const wchar_t *templ);
16
+ extern int git_win32__expand_path(
17
+ struct git_win32__path *s_root, const wchar_t *templ);
17
18
 
18
- int win32_find_file(git_buf *path, const struct win32_path *root, const char *filename);
19
- int win32_find_system_file_using_path(git_buf *path, const char *filename);
20
- int win32_find_system_file_using_registry(git_buf *path, const char *filename);
19
+ extern int git_win32__find_file(
20
+ git_buf *path, const struct git_win32__path *root, const char *filename);
21
+
22
+ extern int git_win32__find_system_dirs(git_buf *out);
23
+ extern int git_win32__find_global_dirs(git_buf *out);
24
+ extern int git_win32__find_xdg_dirs(git_buf *out);
21
25
 
22
26
  #endif
23
27
 
@@ -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.
@@ -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.
@@ -37,6 +37,15 @@
37
37
  /* MSVC doesn't define ssize_t at all */
38
38
  typedef SSIZE_T ssize_t;
39
39
 
40
+ /* define snprintf using variadic macro support if available */
41
+ #if _MSC_VER >= 1400
42
+ # define snprintf(BUF, SZ, FMT, ...) _snprintf_s(BUF, SZ, _TRUNCATE, FMT, __VA_ARGS__)
43
+ #else
44
+ # define snprintf _snprintf
40
45
  #endif
41
46
 
47
+ #endif
48
+
49
+ #define GIT_STDLIB_CALL __cdecl
50
+
42
51
  #endif /* INCLUDE_msvc_compat__ */
@@ -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.
@@ -48,5 +48,14 @@ extern int p_getcwd(char *buffer_out, size_t size);
48
48
  extern int p_rename(const char *from, const char *to);
49
49
  extern int p_recv(GIT_SOCKET socket, void *buffer, size_t length, int flags);
50
50
  extern int p_send(GIT_SOCKET socket, const void *buffer, size_t length, int flags);
51
+ extern int p_inet_pton(int af, const char* src, void* dst);
52
+
53
+ /* p_lstat is almost but not quite POSIX correct. Specifically, the use of
54
+ * ENOTDIR is wrong, in that it does not mean precisely that a non-directory
55
+ * entry was encountered. Making it correct is potentially expensive,
56
+ * however, so this is a separate version of p_lstat to use when correct
57
+ * POSIX ENOTDIR semantics is required.
58
+ */
59
+ extern int p_lstat_posixly(const char *filename, struct stat *buf);
51
60
 
52
61
  #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.
@@ -11,7 +11,7 @@
11
11
  #include <errno.h>
12
12
  #include <io.h>
13
13
  #include <fcntl.h>
14
-
14
+ #include <ws2tcpip.h>
15
15
 
16
16
  int p_unlink(const char *path)
17
17
  {
@@ -52,17 +52,32 @@ GIT_INLINE(time_t) filetime_to_time_t(const FILETIME *ft)
52
52
  return (time_t)winTime;
53
53
  }
54
54
 
55
- static int do_lstat(const char *file_name, struct stat *buf)
55
+ #define WIN32_IS_WSEP(CH) ((CH) == L'/' || (CH) == L'\\')
56
+
57
+ static int do_lstat(
58
+ const char *file_name, struct stat *buf, int posix_enotdir)
56
59
  {
57
60
  WIN32_FILE_ATTRIBUTE_DATA fdata;
58
- wchar_t fbuf[GIT_WIN_PATH];
59
- DWORD last_error;
60
-
61
- git__utf8_to_16(fbuf, GIT_WIN_PATH, file_name);
61
+ wchar_t fbuf[GIT_WIN_PATH], lastch;
62
+ int flen;
63
+
64
+ flen = git__utf8_to_16(fbuf, GIT_WIN_PATH, file_name);
65
+
66
+ /* truncate trailing slashes */
67
+ for (; flen > 0; --flen) {
68
+ lastch = fbuf[flen - 1];
69
+ if (WIN32_IS_WSEP(lastch))
70
+ fbuf[flen - 1] = L'\0';
71
+ else if (lastch != L'\0')
72
+ break;
73
+ }
62
74
 
63
75
  if (GetFileAttributesExW(fbuf, GetFileExInfoStandard, &fdata)) {
64
76
  int fMode = S_IREAD;
65
77
 
78
+ if (!buf)
79
+ return 0;
80
+
66
81
  if (fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
67
82
  fMode |= S_IFDIR;
68
83
  else
@@ -84,48 +99,60 @@ static int do_lstat(const char *file_name, struct stat *buf)
84
99
  buf->st_atime = filetime_to_time_t(&(fdata.ftLastAccessTime));
85
100
  buf->st_mtime = filetime_to_time_t(&(fdata.ftLastWriteTime));
86
101
  buf->st_ctime = filetime_to_time_t(&(fdata.ftCreationTime));
87
- return 0;
88
- }
89
102
 
90
- last_error = GetLastError();
91
- if (last_error == ERROR_FILE_NOT_FOUND)
92
- errno = ENOENT;
93
- else if (last_error == ERROR_PATH_NOT_FOUND)
94
- errno = ENOTDIR;
103
+ /* Windows symlinks have zero file size, call readlink to determine
104
+ * the length of the path pointed to, which we expect everywhere else
105
+ */
106
+ if (S_ISLNK(fMode)) {
107
+ char target[GIT_WIN_PATH];
108
+ int readlink_result;
95
109
 
96
- return -1;
97
- }
110
+ readlink_result = p_readlink(file_name, target, GIT_WIN_PATH);
98
111
 
99
- int p_lstat(const char *file_name, struct stat *buf)
100
- {
101
- int error;
102
- size_t namelen;
103
- char *alt_name;
112
+ if (readlink_result == -1)
113
+ return -1;
104
114
 
105
- if (do_lstat(file_name, buf) == 0)
106
- return 0;
115
+ buf->st_size = strlen(target);
116
+ }
107
117
 
108
- /* if file_name ended in a '/', Windows returned ENOENT;
109
- * try again without trailing slashes
110
- */
111
- namelen = strlen(file_name);
112
- if (namelen && file_name[namelen-1] != '/')
113
- return -1;
118
+ return 0;
119
+ }
114
120
 
115
- while (namelen && file_name[namelen-1] == '/')
116
- --namelen;
121
+ errno = ENOENT;
117
122
 
118
- if (!namelen)
119
- return -1;
123
+ /* We need POSIX behavior, then ENOTDIR must set when any of the folders in the
124
+ * file path is a regular file,otherwise ENOENT must be set.
125
+ */
126
+ if (posix_enotdir) {
127
+ /* scan up path until we find an existing item */
128
+ while (1) {
129
+ /* remove last directory component */
130
+ for (--flen; flen > 0 && !WIN32_IS_WSEP(fbuf[flen]); --flen);
131
+
132
+ if (flen <= 0)
133
+ break;
134
+
135
+ fbuf[flen] = L'\0';
136
+
137
+ if (GetFileAttributesExW(fbuf, GetFileExInfoStandard, &fdata)) {
138
+ if (!(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
139
+ errno = ENOTDIR;
140
+ break;
141
+ }
142
+ }
143
+ }
120
144
 
121
- alt_name = git__strndup(file_name, namelen);
122
- if (!alt_name)
123
- return -1;
145
+ return -1;
146
+ }
124
147
 
125
- error = do_lstat(alt_name, buf);
148
+ int p_lstat(const char *filename, struct stat *buf)
149
+ {
150
+ return do_lstat(filename, buf, 0);
151
+ }
126
152
 
127
- git__free(alt_name);
128
- return error;
153
+ int p_lstat_posixly(const char *filename, struct stat *buf)
154
+ {
155
+ return do_lstat(filename, buf, 1);
129
156
  }
130
157
 
131
158
  int p_readlink(const char *link, char *target, size_t target_len)
@@ -145,10 +172,10 @@ int p_readlink(const char *link, char *target, size_t target_len)
145
172
  * it is not available in platforms older than Vista
146
173
  */
147
174
  if (pGetFinalPath == NULL) {
148
- HINSTANCE library = LoadLibrary("kernel32");
175
+ HMODULE module = GetModuleHandle("kernel32");
149
176
 
150
- if (library != NULL)
151
- pGetFinalPath = (fpath_func)GetProcAddress(library, "GetFinalPathNameByHandleW");
177
+ if (module != NULL)
178
+ pGetFinalPath = (fpath_func)GetProcAddress(module, "GetFinalPathNameByHandleW");
152
179
 
153
180
  if (pGetFinalPath == NULL) {
154
181
  giterr_set(GITERR_OS,
@@ -268,7 +295,7 @@ int p_getcwd(char *buffer_out, size_t size)
268
295
 
269
296
  int p_stat(const char* path, struct stat* buf)
270
297
  {
271
- return do_lstat(path, buf);
298
+ return do_lstat(path, buf, 0);
272
299
  }
273
300
 
274
301
  int p_chdir(const char* path)
@@ -301,46 +328,42 @@ int p_hide_directory__w32(const char *path)
301
328
 
302
329
  char *p_realpath(const char *orig_path, char *buffer)
303
330
  {
304
- int ret, buffer_sz = 0;
331
+ int ret;
305
332
  wchar_t orig_path_w[GIT_WIN_PATH];
306
333
  wchar_t buffer_w[GIT_WIN_PATH];
307
334
 
308
335
  git__utf8_to_16(orig_path_w, GIT_WIN_PATH, orig_path);
336
+
337
+ /* Implicitly use GetCurrentDirectory which can be a threading issue */
309
338
  ret = GetFullPathNameW(orig_path_w, GIT_WIN_PATH, buffer_w, NULL);
310
339
 
311
340
  /* According to MSDN, a return value equals to zero means a failure. */
312
- if (ret == 0 || ret > GIT_WIN_PATH) {
341
+ if (ret == 0 || ret > GIT_WIN_PATH)
342
+ buffer = NULL;
343
+
344
+ else if (GetFileAttributesW(buffer_w) == INVALID_FILE_ATTRIBUTES) {
313
345
  buffer = NULL;
314
- goto done;
346
+ errno = ENOENT;
315
347
  }
316
348
 
317
- if (buffer == NULL) {
318
- buffer_sz = WideCharToMultiByte(CP_UTF8, 0, buffer_w, -1, NULL, 0, NULL, NULL);
349
+ else if (buffer == NULL) {
350
+ int buffer_sz = WideCharToMultiByte(
351
+ CP_UTF8, 0, buffer_w, -1, NULL, 0, NULL, NULL);
319
352
 
320
353
  if (!buffer_sz ||
321
354
  !(buffer = (char *)git__malloc(buffer_sz)) ||
322
- !WideCharToMultiByte(CP_UTF8, 0, buffer_w, -1, buffer, buffer_sz, NULL, NULL))
355
+ !WideCharToMultiByte(
356
+ CP_UTF8, 0, buffer_w, -1, buffer, buffer_sz, NULL, NULL))
323
357
  {
324
358
  git__free(buffer);
325
359
  buffer = NULL;
326
- goto done;
327
- }
328
- } else {
329
- if (!WideCharToMultiByte(CP_UTF8, 0, buffer_w, -1, buffer, GIT_PATH_MAX, NULL, NULL)) {
330
- buffer = NULL;
331
- goto done;
332
360
  }
333
361
  }
334
362
 
335
- if (!git_path_exists(buffer)) {
336
- if (buffer_sz > 0)
337
- git__free(buffer);
338
-
363
+ else if (!WideCharToMultiByte(
364
+ CP_UTF8, 0, buffer_w, -1, buffer, GIT_PATH_MAX, NULL, NULL))
339
365
  buffer = NULL;
340
- errno = ENOENT;
341
- }
342
366
 
343
- done:
344
367
  if (buffer)
345
368
  git_path_mkposix(buffer);
346
369
 
@@ -352,7 +375,8 @@ int p_vsnprintf(char *buffer, size_t count, const char *format, va_list argptr)
352
375
  #ifdef _MSC_VER
353
376
  int len;
354
377
 
355
- if (count == 0 || (len = _vsnprintf(buffer, count, format, argptr)) < 0)
378
+ if (count == 0 ||
379
+ (len = _vsnprintf_s(buffer, count, _TRUNCATE, format, argptr)) < 0)
356
380
  return _vscprintf(format, argptr);
357
381
 
358
382
  return len;
@@ -464,11 +488,14 @@ p_gmtime_r (const time_t *timer, struct tm *result)
464
488
  #define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL
465
489
  #endif
466
490
 
491
+ #ifndef _TIMEZONE_DEFINED
492
+ #define _TIMEZONE_DEFINED
467
493
  struct timezone
468
494
  {
469
495
  int tz_minuteswest; /* minutes W of Greenwich */
470
496
  int tz_dsttime; /* type of dst correction */
471
497
  };
498
+ #endif
472
499
 
473
500
  int p_gettimeofday(struct timeval *tv, struct timezone *tz)
474
501
  {
@@ -504,3 +531,45 @@ int p_gettimeofday(struct timeval *tv, struct timezone *tz)
504
531
 
505
532
  return 0;
506
533
  }
534
+
535
+ int p_inet_pton(int af, const char* src, void* dst)
536
+ {
537
+ union {
538
+ struct sockaddr_in6 sin6;
539
+ struct sockaddr_in sin;
540
+ } sa;
541
+ int srcsize;
542
+
543
+ switch(af)
544
+ {
545
+ case AF_INET:
546
+ sa.sin.sin_family = AF_INET;
547
+ srcsize = (int)sizeof(sa.sin);
548
+ break;
549
+ case AF_INET6:
550
+ sa.sin6.sin6_family = AF_INET6;
551
+ srcsize = (int)sizeof(sa.sin6);
552
+ break;
553
+ default:
554
+ errno = WSAEPFNOSUPPORT;
555
+ return -1;
556
+ }
557
+
558
+ if (WSAStringToAddress((LPSTR)src, af, NULL, (struct sockaddr *) &sa, &srcsize) != 0)
559
+ {
560
+ errno = WSAGetLastError();
561
+ return -1;
562
+ }
563
+
564
+ switch(af)
565
+ {
566
+ case AF_INET:
567
+ memcpy(dst, &sa.sin.sin_addr, sizeof(sa.sin.sin_addr));
568
+ break;
569
+ case AF_INET6:
570
+ memcpy(dst, &sa.sin6.sin6_addr, sizeof(sa.sin6.sin6_addr));
571
+ break;
572
+ }
573
+
574
+ return 1;
575
+ }
@@ -1 +1 @@
1
- #include "precompiled.h"
1
+ #include "precompiled.h"
@@ -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.
@@ -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.
@@ -70,12 +70,12 @@ void git__utf8_to_16(wchar_t *dest, size_t length, const char *src)
70
70
  }
71
71
  #endif
72
72
 
73
- void git__utf8_to_16(wchar_t *dest, size_t length, const char *src)
73
+ int git__utf8_to_16(wchar_t *dest, size_t length, const char *src)
74
74
  {
75
- MultiByteToWideChar(CP_UTF8, 0, src, -1, dest, (int)length);
75
+ return MultiByteToWideChar(CP_UTF8, 0, src, -1, dest, (int)length);
76
76
  }
77
77
 
78
- void git__utf16_to_8(char *out, const wchar_t *input)
78
+ int git__utf16_to_8(char *out, const wchar_t *input)
79
79
  {
80
- WideCharToMultiByte(CP_UTF8, 0, input, -1, out, GIT_WIN_PATH, NULL, NULL);
80
+ return WideCharToMultiByte(CP_UTF8, 0, input, -1, out, GIT_WIN_PATH, NULL, NULL);
81
81
  }
@@ -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.
@@ -12,8 +12,8 @@
12
12
 
13
13
  #define GIT_WIN_PATH (260 + 1)
14
14
 
15
- void git__utf8_to_16(wchar_t *dest, size_t length, const char *src);
16
- void git__utf16_to_8(char *dest, const wchar_t *src);
15
+ int git__utf8_to_16(wchar_t *dest, size_t length, const char *src);
16
+ int git__utf16_to_8(char *dest, const wchar_t *src);
17
17
 
18
18
  #endif
19
19