rugged 1.4.2 → 1.5.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 (439) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +34 -2
  3. data/ext/rugged/extconf.rb +1 -0
  4. data/ext/rugged/rugged.c +16 -0
  5. data/ext/rugged/rugged.h +4 -0
  6. data/ext/rugged/rugged_remote.c +10 -10
  7. data/ext/rugged/rugged_repo.c +2 -7
  8. data/ext/rugged/rugged_settings.c +5 -0
  9. data/lib/rugged/tree.rb +4 -0
  10. data/lib/rugged/version.rb +1 -1
  11. data/vendor/libgit2/CMakeLists.txt +16 -3
  12. data/vendor/libgit2/COPYING +40 -0
  13. data/vendor/libgit2/cmake/AddClarTest.cmake +7 -0
  14. data/vendor/libgit2/cmake/FindPCRE.cmake +3 -4
  15. data/vendor/libgit2/cmake/FindPCRE2.cmake +1 -1
  16. data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +1 -1
  17. data/vendor/libgit2/cmake/SelectHashes.cmake +62 -14
  18. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +3 -1
  19. data/vendor/libgit2/deps/zlib/adler32.c +7 -0
  20. data/vendor/libgit2/deps/zlib/crc32.c +975 -288
  21. data/vendor/libgit2/deps/zlib/crc32.h +9441 -436
  22. data/vendor/libgit2/deps/zlib/deflate.c +83 -31
  23. data/vendor/libgit2/deps/zlib/deflate.h +12 -15
  24. data/vendor/libgit2/deps/zlib/gzguts.h +3 -2
  25. data/vendor/libgit2/deps/zlib/infback.c +2 -1
  26. data/vendor/libgit2/deps/zlib/inffast.c +14 -14
  27. data/vendor/libgit2/deps/zlib/inflate.c +39 -8
  28. data/vendor/libgit2/deps/zlib/inflate.h +3 -2
  29. data/vendor/libgit2/deps/zlib/inftrees.c +3 -3
  30. data/vendor/libgit2/deps/zlib/trees.c +27 -48
  31. data/vendor/libgit2/deps/zlib/zlib.h +126 -100
  32. data/vendor/libgit2/deps/zlib/zutil.c +2 -2
  33. data/vendor/libgit2/deps/zlib/zutil.h +12 -9
  34. data/vendor/libgit2/include/git2/branch.h +2 -2
  35. data/vendor/libgit2/include/git2/common.h +22 -1
  36. data/vendor/libgit2/include/git2/config.h +6 -6
  37. data/vendor/libgit2/include/git2/deprecated.h +2 -0
  38. data/vendor/libgit2/include/git2/errors.h +19 -4
  39. data/vendor/libgit2/include/git2/merge.h +1 -1
  40. data/vendor/libgit2/include/git2/status.h +5 -2
  41. data/vendor/libgit2/include/git2/sys/remote.h +15 -0
  42. data/vendor/libgit2/include/git2/sys/transport.h +9 -5
  43. data/vendor/libgit2/include/git2/version.h +27 -6
  44. data/vendor/libgit2/src/CMakeLists.txt +104 -214
  45. data/vendor/libgit2/src/README.md +12 -0
  46. data/vendor/libgit2/src/cli/CMakeLists.txt +53 -0
  47. data/vendor/libgit2/src/cli/README.md +26 -0
  48. data/vendor/libgit2/src/cli/cli.h +20 -0
  49. data/vendor/libgit2/src/cli/cmd.c +21 -0
  50. data/vendor/libgit2/src/cli/cmd.h +33 -0
  51. data/vendor/libgit2/src/cli/cmd_cat_file.c +204 -0
  52. data/vendor/libgit2/src/cli/cmd_clone.c +176 -0
  53. data/vendor/libgit2/src/cli/cmd_hash_object.c +135 -0
  54. data/vendor/libgit2/src/cli/cmd_help.c +86 -0
  55. data/vendor/libgit2/src/cli/error.h +51 -0
  56. data/vendor/libgit2/src/cli/main.c +106 -0
  57. data/vendor/libgit2/src/cli/opt.c +669 -0
  58. data/vendor/libgit2/src/cli/opt.h +349 -0
  59. data/vendor/libgit2/src/cli/opt_usage.c +194 -0
  60. data/vendor/libgit2/src/cli/opt_usage.h +35 -0
  61. data/vendor/libgit2/src/cli/progress.c +345 -0
  62. data/vendor/libgit2/src/cli/progress.h +117 -0
  63. data/vendor/libgit2/src/cli/sighandler.h +20 -0
  64. data/vendor/libgit2/src/cli/unix/sighandler.c +36 -0
  65. data/vendor/libgit2/src/{win32 → cli/win32}/precompiled.c +0 -0
  66. data/vendor/libgit2/src/cli/win32/precompiled.h +3 -0
  67. data/vendor/libgit2/src/cli/win32/sighandler.c +37 -0
  68. data/vendor/libgit2/src/features.h.in +9 -0
  69. data/vendor/libgit2/src/libgit2/CMakeLists.txt +131 -0
  70. data/vendor/libgit2/src/{annotated_commit.c → libgit2/annotated_commit.c} +0 -0
  71. data/vendor/libgit2/src/{annotated_commit.h → libgit2/annotated_commit.h} +0 -0
  72. data/vendor/libgit2/src/{apply.c → libgit2/apply.c} +0 -0
  73. data/vendor/libgit2/src/{apply.h → libgit2/apply.h} +0 -0
  74. data/vendor/libgit2/src/{attr.c → libgit2/attr.c} +0 -0
  75. data/vendor/libgit2/src/{attr.h → libgit2/attr.h} +0 -0
  76. data/vendor/libgit2/src/{attr_file.c → libgit2/attr_file.c} +0 -0
  77. data/vendor/libgit2/src/{attr_file.h → libgit2/attr_file.h} +0 -0
  78. data/vendor/libgit2/src/{attrcache.c → libgit2/attrcache.c} +0 -0
  79. data/vendor/libgit2/src/{attrcache.h → libgit2/attrcache.h} +0 -0
  80. data/vendor/libgit2/src/{blame.c → libgit2/blame.c} +0 -0
  81. data/vendor/libgit2/src/{blame.h → libgit2/blame.h} +0 -0
  82. data/vendor/libgit2/src/{blame_git.c → libgit2/blame_git.c} +0 -0
  83. data/vendor/libgit2/src/{blame_git.h → libgit2/blame_git.h} +0 -0
  84. data/vendor/libgit2/src/{blob.c → libgit2/blob.c} +1 -1
  85. data/vendor/libgit2/src/{blob.h → libgit2/blob.h} +0 -0
  86. data/vendor/libgit2/src/{branch.c → libgit2/branch.c} +14 -9
  87. data/vendor/libgit2/src/{branch.h → libgit2/branch.h} +0 -0
  88. data/vendor/libgit2/src/{buf.c → libgit2/buf.c} +0 -0
  89. data/vendor/libgit2/src/{buf.h → libgit2/buf.h} +0 -0
  90. data/vendor/libgit2/src/{cache.c → libgit2/cache.c} +0 -0
  91. data/vendor/libgit2/src/{cache.h → libgit2/cache.h} +0 -0
  92. data/vendor/libgit2/src/{checkout.c → libgit2/checkout.c} +0 -0
  93. data/vendor/libgit2/src/{checkout.h → libgit2/checkout.h} +0 -0
  94. data/vendor/libgit2/src/{cherrypick.c → libgit2/cherrypick.c} +0 -0
  95. data/vendor/libgit2/src/{clone.c → libgit2/clone.c} +0 -0
  96. data/vendor/libgit2/src/{clone.h → libgit2/clone.h} +0 -0
  97. data/vendor/libgit2/src/{commit.c → libgit2/commit.c} +0 -0
  98. data/vendor/libgit2/src/{commit.h → libgit2/commit.h} +0 -0
  99. data/vendor/libgit2/src/{commit_graph.c → libgit2/commit_graph.c} +20 -17
  100. data/vendor/libgit2/src/{commit_graph.h → libgit2/commit_graph.h} +1 -1
  101. data/vendor/libgit2/src/{commit_list.c → libgit2/commit_list.c} +0 -0
  102. data/vendor/libgit2/src/{commit_list.h → libgit2/commit_list.h} +0 -0
  103. data/vendor/libgit2/src/libgit2/common.h +55 -0
  104. data/vendor/libgit2/src/{config.c → libgit2/config.c} +14 -7
  105. data/vendor/libgit2/src/{config.h → libgit2/config.h} +0 -0
  106. data/vendor/libgit2/src/{config_backend.h → libgit2/config_backend.h} +0 -0
  107. data/vendor/libgit2/src/{config_cache.c → libgit2/config_cache.c} +0 -0
  108. data/vendor/libgit2/src/{config_entries.c → libgit2/config_entries.c} +0 -0
  109. data/vendor/libgit2/src/{config_entries.h → libgit2/config_entries.h} +0 -0
  110. data/vendor/libgit2/src/{config_file.c → libgit2/config_file.c} +0 -0
  111. data/vendor/libgit2/src/{config_mem.c → libgit2/config_mem.c} +0 -0
  112. data/vendor/libgit2/src/{config_parse.c → libgit2/config_parse.c} +0 -0
  113. data/vendor/libgit2/src/{config_parse.h → libgit2/config_parse.h} +0 -0
  114. data/vendor/libgit2/src/{config_snapshot.c → libgit2/config_snapshot.c} +0 -0
  115. data/vendor/libgit2/src/{crlf.c → libgit2/crlf.c} +0 -0
  116. data/vendor/libgit2/src/{delta.c → libgit2/delta.c} +0 -0
  117. data/vendor/libgit2/src/{delta.h → libgit2/delta.h} +0 -0
  118. data/vendor/libgit2/src/{describe.c → libgit2/describe.c} +0 -0
  119. data/vendor/libgit2/src/{diff.c → libgit2/diff.c} +0 -0
  120. data/vendor/libgit2/src/{diff.h → libgit2/diff.h} +0 -0
  121. data/vendor/libgit2/src/{diff_driver.c → libgit2/diff_driver.c} +0 -0
  122. data/vendor/libgit2/src/{diff_driver.h → libgit2/diff_driver.h} +0 -0
  123. data/vendor/libgit2/src/{diff_file.c → libgit2/diff_file.c} +0 -0
  124. data/vendor/libgit2/src/{diff_file.h → libgit2/diff_file.h} +0 -0
  125. data/vendor/libgit2/src/{diff_generate.c → libgit2/diff_generate.c} +0 -0
  126. data/vendor/libgit2/src/{diff_generate.h → libgit2/diff_generate.h} +0 -0
  127. data/vendor/libgit2/src/{diff_parse.c → libgit2/diff_parse.c} +0 -0
  128. data/vendor/libgit2/src/{diff_parse.h → libgit2/diff_parse.h} +0 -0
  129. data/vendor/libgit2/src/{diff_print.c → libgit2/diff_print.c} +5 -0
  130. data/vendor/libgit2/src/{diff_stats.c → libgit2/diff_stats.c} +0 -0
  131. data/vendor/libgit2/src/{diff_stats.h → libgit2/diff_stats.h} +0 -0
  132. data/vendor/libgit2/src/{diff_tform.c → libgit2/diff_tform.c} +0 -0
  133. data/vendor/libgit2/src/{diff_tform.h → libgit2/diff_tform.h} +0 -0
  134. data/vendor/libgit2/src/{diff_xdiff.c → libgit2/diff_xdiff.c} +1 -0
  135. data/vendor/libgit2/src/{diff_xdiff.h → libgit2/diff_xdiff.h} +0 -0
  136. data/vendor/libgit2/src/{email.c → libgit2/email.c} +0 -0
  137. data/vendor/libgit2/src/{email.h → libgit2/email.h} +0 -0
  138. data/vendor/libgit2/src/{errors.c → libgit2/errors.c} +0 -0
  139. data/vendor/libgit2/src/{errors.h → libgit2/errors.h} +1 -2
  140. data/vendor/libgit2/src/{fetch.c → libgit2/fetch.c} +5 -2
  141. data/vendor/libgit2/src/{fetch.h → libgit2/fetch.h} +0 -0
  142. data/vendor/libgit2/src/{fetchhead.c → libgit2/fetchhead.c} +0 -0
  143. data/vendor/libgit2/src/{fetchhead.h → libgit2/fetchhead.h} +0 -0
  144. data/vendor/libgit2/src/{filter.c → libgit2/filter.c} +31 -1
  145. data/vendor/libgit2/src/{filter.h → libgit2/filter.h} +0 -0
  146. data/vendor/libgit2/src/{win32 → libgit2}/git2.rc +0 -0
  147. data/vendor/libgit2/src/{graph.c → libgit2/graph.c} +0 -0
  148. data/vendor/libgit2/src/{hashsig.c → libgit2/hashsig.c} +0 -0
  149. data/vendor/libgit2/src/{ident.c → libgit2/ident.c} +0 -0
  150. data/vendor/libgit2/src/{idxmap.c → libgit2/idxmap.c} +0 -0
  151. data/vendor/libgit2/src/{idxmap.h → libgit2/idxmap.h} +0 -0
  152. data/vendor/libgit2/src/{ignore.c → libgit2/ignore.c} +0 -0
  153. data/vendor/libgit2/src/{ignore.h → libgit2/ignore.h} +0 -0
  154. data/vendor/libgit2/src/{index.c → libgit2/index.c} +6 -6
  155. data/vendor/libgit2/src/{index.h → libgit2/index.h} +0 -0
  156. data/vendor/libgit2/src/{indexer.c → libgit2/indexer.c} +2 -2
  157. data/vendor/libgit2/src/{indexer.h → libgit2/indexer.h} +0 -0
  158. data/vendor/libgit2/src/{iterator.c → libgit2/iterator.c} +3 -3
  159. data/vendor/libgit2/src/{iterator.h → libgit2/iterator.h} +0 -0
  160. data/vendor/libgit2/src/{libgit2.c → libgit2/libgit2.c} +13 -0
  161. data/vendor/libgit2/src/{libgit2.h → libgit2/libgit2.h} +0 -0
  162. data/vendor/libgit2/src/{mailmap.c → libgit2/mailmap.c} +0 -0
  163. data/vendor/libgit2/src/{mailmap.h → libgit2/mailmap.h} +0 -0
  164. data/vendor/libgit2/src/{merge.c → libgit2/merge.c} +0 -0
  165. data/vendor/libgit2/src/{merge.h → libgit2/merge.h} +0 -0
  166. data/vendor/libgit2/src/{merge_driver.c → libgit2/merge_driver.c} +0 -0
  167. data/vendor/libgit2/src/{merge_driver.h → libgit2/merge_driver.h} +0 -0
  168. data/vendor/libgit2/src/{merge_file.c → libgit2/merge_file.c} +0 -0
  169. data/vendor/libgit2/src/{message.c → libgit2/message.c} +0 -0
  170. data/vendor/libgit2/src/{midx.c → libgit2/midx.c} +28 -26
  171. data/vendor/libgit2/src/{midx.h → libgit2/midx.h} +2 -1
  172. data/vendor/libgit2/src/{mwindow.c → libgit2/mwindow.c} +9 -9
  173. data/vendor/libgit2/src/{mwindow.h → libgit2/mwindow.h} +1 -1
  174. data/vendor/libgit2/src/{netops.c → libgit2/netops.c} +0 -1
  175. data/vendor/libgit2/src/{netops.h → libgit2/netops.h} +0 -0
  176. data/vendor/libgit2/src/{notes.c → libgit2/notes.c} +0 -0
  177. data/vendor/libgit2/src/{notes.h → libgit2/notes.h} +0 -0
  178. data/vendor/libgit2/src/{object.c → libgit2/object.c} +1 -0
  179. data/vendor/libgit2/src/{object.h → libgit2/object.h} +0 -0
  180. data/vendor/libgit2/src/{object_api.c → libgit2/object_api.c} +0 -0
  181. data/vendor/libgit2/src/{odb.c → libgit2/odb.c} +2 -2
  182. data/vendor/libgit2/src/{odb.h → libgit2/odb.h} +0 -0
  183. data/vendor/libgit2/src/{odb_loose.c → libgit2/odb_loose.c} +0 -0
  184. data/vendor/libgit2/src/{odb_mempack.c → libgit2/odb_mempack.c} +0 -0
  185. data/vendor/libgit2/src/{odb_pack.c → libgit2/odb_pack.c} +0 -0
  186. data/vendor/libgit2/src/{offmap.c → libgit2/offmap.c} +0 -0
  187. data/vendor/libgit2/src/{offmap.h → libgit2/offmap.h} +0 -0
  188. data/vendor/libgit2/src/{oid.c → libgit2/oid.c} +2 -21
  189. data/vendor/libgit2/src/{oid.h → libgit2/oid.h} +35 -2
  190. data/vendor/libgit2/src/{oidarray.c → libgit2/oidarray.c} +0 -0
  191. data/vendor/libgit2/src/{oidarray.h → libgit2/oidarray.h} +0 -0
  192. data/vendor/libgit2/src/{oidmap.c → libgit2/oidmap.c} +1 -1
  193. data/vendor/libgit2/src/{oidmap.h → libgit2/oidmap.h} +0 -0
  194. data/vendor/libgit2/src/{pack-objects.c → libgit2/pack-objects.c} +0 -0
  195. data/vendor/libgit2/src/{pack-objects.h → libgit2/pack-objects.h} +0 -0
  196. data/vendor/libgit2/src/{pack.c → libgit2/pack.c} +24 -18
  197. data/vendor/libgit2/src/{pack.h → libgit2/pack.h} +3 -2
  198. data/vendor/libgit2/src/{parse.c → libgit2/parse.c} +0 -0
  199. data/vendor/libgit2/src/{parse.h → libgit2/parse.h} +0 -0
  200. data/vendor/libgit2/src/{patch.c → libgit2/patch.c} +0 -0
  201. data/vendor/libgit2/src/{patch.h → libgit2/patch.h} +0 -0
  202. data/vendor/libgit2/src/{patch_generate.c → libgit2/patch_generate.c} +0 -0
  203. data/vendor/libgit2/src/{patch_generate.h → libgit2/patch_generate.h} +0 -0
  204. data/vendor/libgit2/src/{patch_parse.c → libgit2/patch_parse.c} +0 -0
  205. data/vendor/libgit2/src/{patch_parse.h → libgit2/patch_parse.h} +0 -0
  206. data/vendor/libgit2/src/{path.c → libgit2/path.c} +1 -0
  207. data/vendor/libgit2/src/{path.h → libgit2/path.h} +0 -0
  208. data/vendor/libgit2/src/{pathspec.c → libgit2/pathspec.c} +0 -0
  209. data/vendor/libgit2/src/{pathspec.h → libgit2/pathspec.h} +0 -0
  210. data/vendor/libgit2/src/{proxy.c → libgit2/proxy.c} +0 -0
  211. data/vendor/libgit2/src/{proxy.h → libgit2/proxy.h} +0 -0
  212. data/vendor/libgit2/src/{push.c → libgit2/push.c} +0 -0
  213. data/vendor/libgit2/src/{push.h → libgit2/push.h} +0 -0
  214. data/vendor/libgit2/src/{reader.c → libgit2/reader.c} +0 -0
  215. data/vendor/libgit2/src/{reader.h → libgit2/reader.h} +0 -0
  216. data/vendor/libgit2/src/{rebase.c → libgit2/rebase.c} +11 -1
  217. data/vendor/libgit2/src/{refdb.c → libgit2/refdb.c} +0 -0
  218. data/vendor/libgit2/src/{refdb.h → libgit2/refdb.h} +0 -0
  219. data/vendor/libgit2/src/{refdb_fs.c → libgit2/refdb_fs.c} +6 -2
  220. data/vendor/libgit2/src/{reflog.c → libgit2/reflog.c} +0 -0
  221. data/vendor/libgit2/src/{reflog.h → libgit2/reflog.h} +0 -0
  222. data/vendor/libgit2/src/{refs.c → libgit2/refs.c} +0 -0
  223. data/vendor/libgit2/src/{refs.h → libgit2/refs.h} +0 -0
  224. data/vendor/libgit2/src/{refspec.c → libgit2/refspec.c} +0 -0
  225. data/vendor/libgit2/src/{refspec.h → libgit2/refspec.h} +0 -0
  226. data/vendor/libgit2/src/{remote.c → libgit2/remote.c} +6 -3
  227. data/vendor/libgit2/src/{remote.h → libgit2/remote.h} +1 -1
  228. data/vendor/libgit2/src/{repo_template.h → libgit2/repo_template.h} +0 -0
  229. data/vendor/libgit2/src/{repository.c → libgit2/repository.c} +155 -22
  230. data/vendor/libgit2/src/{repository.h → libgit2/repository.h} +1 -0
  231. data/vendor/libgit2/src/{reset.c → libgit2/reset.c} +0 -0
  232. data/vendor/libgit2/src/{revert.c → libgit2/revert.c} +0 -0
  233. data/vendor/libgit2/src/{revparse.c → libgit2/revparse.c} +0 -0
  234. data/vendor/libgit2/src/{revwalk.c → libgit2/revwalk.c} +0 -0
  235. data/vendor/libgit2/src/{revwalk.h → libgit2/revwalk.h} +0 -0
  236. data/vendor/libgit2/src/{settings.h → libgit2/settings.h} +0 -0
  237. data/vendor/libgit2/src/{signature.c → libgit2/signature.c} +0 -0
  238. data/vendor/libgit2/src/{signature.h → libgit2/signature.h} +0 -0
  239. data/vendor/libgit2/src/{stash.c → libgit2/stash.c} +0 -0
  240. data/vendor/libgit2/src/{status.c → libgit2/status.c} +0 -0
  241. data/vendor/libgit2/src/{status.h → libgit2/status.h} +0 -0
  242. data/vendor/libgit2/src/{strarray.c → libgit2/strarray.c} +0 -0
  243. data/vendor/libgit2/src/{stream.h → libgit2/stream.h} +0 -0
  244. data/vendor/libgit2/src/{streams → libgit2/streams}/mbedtls.c +0 -0
  245. data/vendor/libgit2/src/{streams → libgit2/streams}/mbedtls.h +0 -0
  246. data/vendor/libgit2/src/{streams → libgit2/streams}/openssl.c +0 -0
  247. data/vendor/libgit2/src/{streams → libgit2/streams}/openssl.h +0 -0
  248. data/vendor/libgit2/src/{streams → libgit2/streams}/openssl_dynamic.c +0 -0
  249. data/vendor/libgit2/src/{streams → libgit2/streams}/openssl_dynamic.h +0 -0
  250. data/vendor/libgit2/src/{streams → libgit2/streams}/openssl_legacy.c +0 -0
  251. data/vendor/libgit2/src/{streams → libgit2/streams}/openssl_legacy.h +0 -0
  252. data/vendor/libgit2/src/{streams → libgit2/streams}/registry.c +0 -0
  253. data/vendor/libgit2/src/{streams → libgit2/streams}/registry.h +0 -0
  254. data/vendor/libgit2/src/{streams → libgit2/streams}/socket.c +0 -0
  255. data/vendor/libgit2/src/{streams → libgit2/streams}/socket.h +0 -0
  256. data/vendor/libgit2/src/{streams → libgit2/streams}/stransport.c +0 -0
  257. data/vendor/libgit2/src/{streams → libgit2/streams}/stransport.h +0 -0
  258. data/vendor/libgit2/src/{streams → libgit2/streams}/tls.c +0 -0
  259. data/vendor/libgit2/src/{streams → libgit2/streams}/tls.h +0 -0
  260. data/vendor/libgit2/src/{submodule.c → libgit2/submodule.c} +0 -0
  261. data/vendor/libgit2/src/{submodule.h → libgit2/submodule.h} +0 -0
  262. data/vendor/libgit2/src/{sysdir.c → libgit2/sysdir.c} +0 -0
  263. data/vendor/libgit2/src/{sysdir.h → libgit2/sysdir.h} +0 -0
  264. data/vendor/libgit2/src/{tag.c → libgit2/tag.c} +15 -5
  265. data/vendor/libgit2/src/{tag.h → libgit2/tag.h} +0 -0
  266. data/vendor/libgit2/src/{threadstate.c → libgit2/threadstate.c} +0 -0
  267. data/vendor/libgit2/src/{threadstate.h → libgit2/threadstate.h} +0 -0
  268. data/vendor/libgit2/src/{trace.c → libgit2/trace.c} +0 -0
  269. data/vendor/libgit2/src/{trace.h → libgit2/trace.h} +0 -0
  270. data/vendor/libgit2/src/{trailer.c → libgit2/trailer.c} +0 -0
  271. data/vendor/libgit2/src/{transaction.c → libgit2/transaction.c} +0 -0
  272. data/vendor/libgit2/src/{transaction.h → libgit2/transaction.h} +0 -0
  273. data/vendor/libgit2/src/{transport.c → libgit2/transport.c} +0 -0
  274. data/vendor/libgit2/src/{transports → libgit2/transports}/auth.c +0 -0
  275. data/vendor/libgit2/src/{transports → libgit2/transports}/auth.h +0 -0
  276. data/vendor/libgit2/src/{transports → libgit2/transports}/auth_negotiate.c +0 -0
  277. data/vendor/libgit2/src/{transports → libgit2/transports}/auth_negotiate.h +0 -0
  278. data/vendor/libgit2/src/{transports → libgit2/transports}/auth_ntlm.c +0 -0
  279. data/vendor/libgit2/src/{transports → libgit2/transports}/auth_ntlm.h +0 -0
  280. data/vendor/libgit2/src/{transports → libgit2/transports}/credential.c +0 -0
  281. data/vendor/libgit2/src/{transports → libgit2/transports}/credential_helpers.c +0 -0
  282. data/vendor/libgit2/src/{transports → libgit2/transports}/git.c +0 -0
  283. data/vendor/libgit2/src/{transports → libgit2/transports}/http.c +0 -0
  284. data/vendor/libgit2/src/{transports → libgit2/transports}/http.h +0 -0
  285. data/vendor/libgit2/src/{transports → libgit2/transports}/httpclient.c +1 -1
  286. data/vendor/libgit2/src/{transports → libgit2/transports}/httpclient.h +0 -0
  287. data/vendor/libgit2/src/{transports → libgit2/transports}/local.c +0 -0
  288. data/vendor/libgit2/src/{transports → libgit2/transports}/smart.c +12 -0
  289. data/vendor/libgit2/src/{transports → libgit2/transports}/smart.h +0 -0
  290. data/vendor/libgit2/src/{transports → libgit2/transports}/smart_pkt.c +0 -0
  291. data/vendor/libgit2/src/{transports → libgit2/transports}/smart_protocol.c +0 -0
  292. data/vendor/libgit2/src/{transports → libgit2/transports}/ssh.c +0 -0
  293. data/vendor/libgit2/src/{transports → libgit2/transports}/ssh.h +0 -0
  294. data/vendor/libgit2/src/{transports → libgit2/transports}/winhttp.c +0 -0
  295. data/vendor/libgit2/src/{tree-cache.c → libgit2/tree-cache.c} +1 -1
  296. data/vendor/libgit2/src/{tree-cache.h → libgit2/tree-cache.h} +0 -0
  297. data/vendor/libgit2/src/{tree.c → libgit2/tree.c} +16 -23
  298. data/vendor/libgit2/src/{tree.h → libgit2/tree.h} +1 -1
  299. data/vendor/libgit2/src/{userdiff.h → libgit2/userdiff.h} +0 -0
  300. data/vendor/libgit2/src/{worktree.c → libgit2/worktree.c} +0 -0
  301. data/vendor/libgit2/src/{worktree.h → libgit2/worktree.h} +0 -0
  302. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/git-xdiff.h +0 -0
  303. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xdiff.h +0 -0
  304. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xdiffi.c +0 -0
  305. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xdiffi.h +0 -0
  306. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xemit.c +0 -0
  307. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xemit.h +0 -0
  308. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xhistogram.c +0 -0
  309. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xinclude.h +0 -0
  310. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xmacros.h +0 -0
  311. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xmerge.c +0 -0
  312. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xpatience.c +0 -0
  313. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xprepare.c +0 -0
  314. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xprepare.h +0 -0
  315. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xtypes.h +0 -0
  316. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xutils.c +0 -0
  317. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xutils.h +0 -0
  318. data/vendor/libgit2/src/util/CMakeLists.txt +74 -0
  319. data/vendor/libgit2/src/{alloc.c → util/alloc.c} +0 -0
  320. data/vendor/libgit2/src/{alloc.h → util/alloc.h} +0 -0
  321. data/vendor/libgit2/src/{allocators → util/allocators}/failalloc.c +0 -0
  322. data/vendor/libgit2/src/{allocators → util/allocators}/failalloc.h +1 -1
  323. data/vendor/libgit2/src/{allocators → util/allocators}/stdalloc.c +0 -0
  324. data/vendor/libgit2/src/{allocators → util/allocators}/stdalloc.h +1 -1
  325. data/vendor/libgit2/src/{allocators → util/allocators}/win32_leakcheck.c +0 -0
  326. data/vendor/libgit2/src/{allocators → util/allocators}/win32_leakcheck.h +1 -1
  327. data/vendor/libgit2/src/{array.h → util/array.h} +1 -1
  328. data/vendor/libgit2/src/{assert_safe.h → util/assert_safe.h} +16 -0
  329. data/vendor/libgit2/src/{bitvec.h → util/bitvec.h} +0 -0
  330. data/vendor/libgit2/src/{cc-compat.h → util/cc-compat.h} +0 -0
  331. data/vendor/libgit2/src/{date.c → util/date.c} +4 -3
  332. data/vendor/libgit2/src/{date.h → util/date.h} +0 -0
  333. data/vendor/libgit2/src/{filebuf.c → util/filebuf.c} +1 -1
  334. data/vendor/libgit2/src/{filebuf.h → util/filebuf.h} +1 -1
  335. data/vendor/libgit2/src/{fs_path.c → util/fs_path.c} +219 -65
  336. data/vendor/libgit2/src/{fs_path.h → util/fs_path.h} +47 -9
  337. data/vendor/libgit2/src/{futils.c → util/futils.c} +44 -2
  338. data/vendor/libgit2/src/{futils.h → util/futils.h} +2 -1
  339. data/vendor/libgit2/src/{common.h → util/git2_util.h} +13 -59
  340. data/vendor/libgit2/src/util/hash/builtin.c +53 -0
  341. data/vendor/libgit2/src/{hash/sha1/openssl.h → util/hash/builtin.h} +6 -6
  342. data/vendor/libgit2/src/{hash/sha1 → util/hash}/collisiondetect.c +1 -1
  343. data/vendor/libgit2/src/{hash/sha1 → util/hash}/collisiondetect.h +3 -3
  344. data/vendor/libgit2/src/{hash/sha1 → util/hash}/common_crypto.c +55 -0
  345. data/vendor/libgit2/src/{hash/sha1 → util/hash}/common_crypto.h +11 -3
  346. data/vendor/libgit2/src/{hash/sha1 → util/hash}/mbedtls.c +46 -0
  347. data/vendor/libgit2/src/{hash/sha1 → util/hash}/mbedtls.h +14 -4
  348. data/vendor/libgit2/src/util/hash/openssl.c +194 -0
  349. data/vendor/libgit2/src/util/hash/openssl.h +45 -0
  350. data/vendor/libgit2/src/util/hash/rfc6234/sha.h +355 -0
  351. data/vendor/libgit2/src/util/hash/rfc6234/sha224-256.c +601 -0
  352. data/vendor/libgit2/src/util/hash/sha.h +70 -0
  353. data/vendor/libgit2/src/{hash/sha1 → util/hash}/sha1dc/sha1.c +0 -0
  354. data/vendor/libgit2/src/{hash/sha1 → util/hash}/sha1dc/sha1.h +0 -0
  355. data/vendor/libgit2/src/{hash/sha1 → util/hash}/sha1dc/ubc_check.c +0 -0
  356. data/vendor/libgit2/src/{hash/sha1 → util/hash}/sha1dc/ubc_check.h +0 -0
  357. data/vendor/libgit2/src/util/hash/win32.c +549 -0
  358. data/vendor/libgit2/src/util/hash/win32.h +60 -0
  359. data/vendor/libgit2/src/{hash.c → util/hash.c} +17 -1
  360. data/vendor/libgit2/src/{hash.h → util/hash.h} +5 -3
  361. data/vendor/libgit2/src/{integer.h → util/integer.h} +0 -0
  362. data/vendor/libgit2/src/{khash.h → util/khash.h} +0 -0
  363. data/vendor/libgit2/src/{map.h → util/map.h} +1 -1
  364. data/vendor/libgit2/src/{net.c → util/net.c} +0 -1
  365. data/vendor/libgit2/src/{net.h → util/net.h} +1 -1
  366. data/vendor/libgit2/src/{pool.c → util/pool.c} +0 -0
  367. data/vendor/libgit2/src/{pool.h → util/pool.h} +1 -1
  368. data/vendor/libgit2/src/{posix.c → util/posix.c} +0 -0
  369. data/vendor/libgit2/src/{posix.h → util/posix.h} +1 -1
  370. data/vendor/libgit2/src/{pqueue.c → util/pqueue.c} +0 -0
  371. data/vendor/libgit2/src/{pqueue.h → util/pqueue.h} +1 -1
  372. data/vendor/libgit2/src/{rand.c → util/rand.c} +7 -3
  373. data/vendor/libgit2/src/{rand.h → util/rand.h} +1 -1
  374. data/vendor/libgit2/src/{regexp.c → util/regexp.c} +0 -0
  375. data/vendor/libgit2/src/{regexp.h → util/regexp.h} +1 -1
  376. data/vendor/libgit2/src/{runtime.c → util/runtime.c} +1 -1
  377. data/vendor/libgit2/src/{runtime.h → util/runtime.h} +1 -1
  378. data/vendor/libgit2/src/{sortedcache.c → util/sortedcache.c} +0 -0
  379. data/vendor/libgit2/src/{sortedcache.h → util/sortedcache.h} +1 -1
  380. data/vendor/libgit2/src/{str.c → util/str.c} +0 -0
  381. data/vendor/libgit2/src/{str.h → util/str.h} +1 -1
  382. data/vendor/libgit2/src/{strmap.c → util/strmap.c} +0 -0
  383. data/vendor/libgit2/src/{strmap.h → util/strmap.h} +1 -1
  384. data/vendor/libgit2/src/{strnlen.h → util/strnlen.h} +0 -0
  385. data/vendor/libgit2/src/{thread.c → util/thread.c} +1 -1
  386. data/vendor/libgit2/src/{thread.h → util/thread.h} +0 -0
  387. data/vendor/libgit2/src/{tsort.c → util/tsort.c} +1 -1
  388. data/vendor/libgit2/src/{unix → util/unix}/map.c +1 -1
  389. data/vendor/libgit2/src/{unix → util/unix}/posix.h +1 -1
  390. data/vendor/libgit2/src/{unix → util/unix}/pthread.h +0 -0
  391. data/vendor/libgit2/src/{unix → util/unix}/realpath.c +1 -1
  392. data/vendor/libgit2/src/{utf8.c → util/utf8.c} +1 -1
  393. data/vendor/libgit2/src/{utf8.h → util/utf8.h} +1 -1
  394. data/vendor/libgit2/src/{util.c → util/util.c} +1 -1
  395. data/vendor/libgit2/src/{util.h → util/util.h} +1 -1
  396. data/vendor/libgit2/src/{varint.c → util/varint.c} +0 -0
  397. data/vendor/libgit2/src/{varint.h → util/varint.h} +1 -1
  398. data/vendor/libgit2/src/{vector.c → util/vector.c} +0 -0
  399. data/vendor/libgit2/src/{vector.h → util/vector.h} +1 -1
  400. data/vendor/libgit2/src/{wildmatch.c → util/wildmatch.c} +0 -0
  401. data/vendor/libgit2/src/{wildmatch.h → util/wildmatch.h} +1 -1
  402. data/vendor/libgit2/src/{win32 → util/win32}/dir.c +0 -0
  403. data/vendor/libgit2/src/{win32 → util/win32}/dir.h +1 -1
  404. data/vendor/libgit2/src/{win32 → util/win32}/error.c +0 -0
  405. data/vendor/libgit2/src/{win32 → util/win32}/error.h +1 -1
  406. data/vendor/libgit2/src/{win32 → util/win32}/findfile.c +0 -0
  407. data/vendor/libgit2/src/{win32 → util/win32}/findfile.h +1 -1
  408. data/vendor/libgit2/src/{win32 → util/win32}/map.c +1 -1
  409. data/vendor/libgit2/src/{win32 → util/win32}/mingw-compat.h +0 -0
  410. data/vendor/libgit2/src/{win32 → util/win32}/msvc-compat.h +0 -0
  411. data/vendor/libgit2/src/{win32 → util/win32}/path_w32.c +0 -0
  412. data/vendor/libgit2/src/{win32 → util/win32}/path_w32.h +1 -1
  413. data/vendor/libgit2/src/{win32 → util/win32}/posix.h +1 -1
  414. data/vendor/libgit2/src/{win32 → util/win32}/posix_w32.c +1 -1
  415. data/vendor/libgit2/src/util/win32/precompiled.c +1 -0
  416. data/vendor/libgit2/src/{win32 → util/win32}/precompiled.h +1 -1
  417. data/vendor/libgit2/src/{win32 → util/win32}/reparse.h +0 -0
  418. data/vendor/libgit2/src/{win32 → util/win32}/thread.c +0 -0
  419. data/vendor/libgit2/src/{win32 → util/win32}/thread.h +1 -1
  420. data/vendor/libgit2/src/{win32 → util/win32}/utf-conv.c +0 -0
  421. data/vendor/libgit2/src/{win32 → util/win32}/utf-conv.h +1 -1
  422. data/vendor/libgit2/src/{win32 → util/win32}/version.h +0 -0
  423. data/vendor/libgit2/src/{win32 → util/win32}/w32_buffer.c +0 -0
  424. data/vendor/libgit2/src/{win32 → util/win32}/w32_buffer.h +1 -1
  425. data/vendor/libgit2/src/{win32 → util/win32}/w32_common.h +0 -0
  426. data/vendor/libgit2/src/{win32 → util/win32}/w32_leakcheck.c +0 -0
  427. data/vendor/libgit2/src/{win32 → util/win32}/w32_leakcheck.h +1 -1
  428. data/vendor/libgit2/src/{win32 → util/win32}/w32_util.c +0 -0
  429. data/vendor/libgit2/src/{win32 → util/win32}/w32_util.h +1 -1
  430. data/vendor/libgit2/src/{win32 → util/win32}/win32-compat.h +0 -0
  431. data/vendor/libgit2/src/{zstream.c → util/zstream.c} +0 -0
  432. data/vendor/libgit2/src/{zstream.h → util/zstream.h} +1 -1
  433. metadata +394 -365
  434. data/vendor/libgit2/src/hash/sha1/generic.c +0 -300
  435. data/vendor/libgit2/src/hash/sha1/generic.h +0 -19
  436. data/vendor/libgit2/src/hash/sha1/openssl.c +0 -59
  437. data/vendor/libgit2/src/hash/sha1/win32.c +0 -333
  438. data/vendor/libgit2/src/hash/sha1/win32.h +0 -128
  439. data/vendor/libgit2/src/hash/sha1.h +0 -40
@@ -7,8 +7,9 @@
7
7
 
8
8
  #include "fs_path.h"
9
9
 
10
+ #include "git2_util.h"
11
+ #include "futils.h"
10
12
  #include "posix.h"
11
- #include "repository.h"
12
13
  #ifdef GIT_WIN32
13
14
  #include "win32/posix.h"
14
15
  #include "win32/w32_buffer.h"
@@ -21,6 +22,13 @@
21
22
  #include <stdio.h>
22
23
  #include <ctype.h>
23
24
 
25
+ #define ensure_error_set(code) do { \
26
+ const git_error *e = git_error_last(); \
27
+ if (!e || !e->message) \
28
+ git_error_set(e ? e->klass : GIT_ERROR_CALLBACK, \
29
+ "filesystem callback returned %d", code); \
30
+ } while(0)
31
+
24
32
  static int dos_drive_prefix_length(const char *path)
25
33
  {
26
34
  int i;
@@ -101,7 +109,7 @@ int git_fs_path_basename_r(git_str *buffer, const char *path)
101
109
  /* Empty or NULL string gets treated as "." */
102
110
  if (path == NULL || *path == '\0') {
103
111
  startp = ".";
104
- len = 1;
112
+ len = 1;
105
113
  goto Exit;
106
114
  }
107
115
 
@@ -113,7 +121,7 @@ int git_fs_path_basename_r(git_str *buffer, const char *path)
113
121
  /* All slashes becomes "/" */
114
122
  if (endp == path && *endp == '/') {
115
123
  startp = "/";
116
- len = 1;
124
+ len = 1;
117
125
  goto Exit;
118
126
  }
119
127
 
@@ -185,8 +193,7 @@ int git_fs_path_dirname_r(git_str *buffer, const char *path)
185
193
 
186
194
  if (endp - path + 1 > INT_MAX) {
187
195
  git_error_set(GIT_ERROR_INVALID, "path too long");
188
- len = -1;
189
- goto Exit;
196
+ return -1;
190
197
  }
191
198
 
192
199
  if ((len = win32_prefix_length(path, (int)(endp - path + 1))) > 0) {
@@ -211,8 +218,7 @@ int git_fs_path_dirname_r(git_str *buffer, const char *path)
211
218
 
212
219
  if (endp - path + 1 > INT_MAX) {
213
220
  git_error_set(GIT_ERROR_INVALID, "path too long");
214
- len = -1;
215
- goto Exit;
221
+ return -1;
216
222
  }
217
223
 
218
224
  if ((len = win32_prefix_length(path, (int)(endp - path + 1))) > 0) {
@@ -530,7 +536,7 @@ int git_fs_path_walk_up(
530
536
  if (!scan) {
531
537
  error = cb(data, "");
532
538
  if (error)
533
- git_error_set_after_callback(error);
539
+ ensure_error_set(error);
534
540
  return error;
535
541
  }
536
542
 
@@ -543,7 +549,7 @@ int git_fs_path_walk_up(
543
549
  iter.ptr[scan] = oldc;
544
550
 
545
551
  if (error) {
546
- git_error_set_after_callback(error);
552
+ ensure_error_set(error);
547
553
  break;
548
554
  }
549
555
 
@@ -563,7 +569,7 @@ int git_fs_path_walk_up(
563
569
  if (!error && stop == 0 && iter.ptr[0] != '/') {
564
570
  error = cb(data, "");
565
571
  if (error)
566
- git_error_set_after_callback(error);
572
+ ensure_error_set(error);
567
573
  }
568
574
 
569
575
  return error;
@@ -1167,7 +1173,7 @@ int git_fs_path_direach(
1167
1173
  /* Only set our own error if the callback did not set one already */
1168
1174
  if (error != 0) {
1169
1175
  if (!git_error_last())
1170
- git_error_set_after_callback(error);
1176
+ ensure_error_set(error);
1171
1177
 
1172
1178
  break;
1173
1179
  }
@@ -1779,80 +1785,228 @@ done:
1779
1785
  return supported;
1780
1786
  }
1781
1787
 
1782
- int git_fs_path_validate_system_file_ownership(const char *path)
1788
+ static git_fs_path_owner_t mock_owner = GIT_FS_PATH_OWNER_NONE;
1789
+
1790
+ void git_fs_path__set_owner(git_fs_path_owner_t owner)
1791
+ {
1792
+ mock_owner = owner;
1793
+ }
1794
+
1795
+ #ifdef GIT_WIN32
1796
+ static PSID *sid_dup(PSID sid)
1797
+ {
1798
+ DWORD len;
1799
+ PSID dup;
1800
+
1801
+ len = GetLengthSid(sid);
1802
+
1803
+ if ((dup = git__malloc(len)) == NULL)
1804
+ return NULL;
1805
+
1806
+ if (!CopySid(len, dup, sid)) {
1807
+ git_error_set(GIT_ERROR_OS, "could not duplicate sid");
1808
+ git__free(dup);
1809
+ return NULL;
1810
+ }
1811
+
1812
+ return dup;
1813
+ }
1814
+
1815
+ static int current_user_sid(PSID *out)
1783
1816
  {
1784
- #ifndef GIT_WIN32
1785
- GIT_UNUSED(path);
1786
- return GIT_OK;
1787
- #else
1788
- git_win32_path buf;
1789
- PSID owner_sid;
1790
- PSECURITY_DESCRIPTOR descriptor = NULL;
1791
- HANDLE token;
1792
1817
  TOKEN_USER *info = NULL;
1793
- DWORD err, len;
1794
- int ret;
1818
+ HANDLE token = NULL;
1819
+ DWORD len = 0;
1820
+ int error = -1;
1795
1821
 
1796
- if (git_win32_path_from_utf8(buf, path) < 0)
1797
- return -1;
1822
+ if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token)) {
1823
+ git_error_set(GIT_ERROR_OS, "could not lookup process information");
1824
+ goto done;
1825
+ }
1798
1826
 
1799
- err = GetNamedSecurityInfoW(buf, SE_FILE_OBJECT,
1800
- OWNER_SECURITY_INFORMATION |
1801
- DACL_SECURITY_INFORMATION,
1802
- &owner_sid, NULL, NULL, NULL, &descriptor);
1827
+ if (GetTokenInformation(token, TokenUser, NULL, 0, &len) ||
1828
+ GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
1829
+ git_error_set(GIT_ERROR_OS, "could not lookup token metadata");
1830
+ goto done;
1831
+ }
1803
1832
 
1804
- if (err == ERROR_FILE_NOT_FOUND || err == ERROR_PATH_NOT_FOUND) {
1805
- ret = GIT_ENOTFOUND;
1806
- goto cleanup;
1833
+ info = git__malloc(len);
1834
+ GIT_ERROR_CHECK_ALLOC(info);
1835
+
1836
+ if (!GetTokenInformation(token, TokenUser, info, len, &len)) {
1837
+ git_error_set(GIT_ERROR_OS, "could not lookup current user");
1838
+ goto done;
1807
1839
  }
1808
1840
 
1809
- if (err != ERROR_SUCCESS) {
1841
+ if ((*out = sid_dup(info->User.Sid)))
1842
+ error = 0;
1843
+
1844
+ done:
1845
+ if (token)
1846
+ CloseHandle(token);
1847
+
1848
+ git__free(info);
1849
+ return error;
1850
+ }
1851
+
1852
+ static int file_owner_sid(PSID *out, const char *path)
1853
+ {
1854
+ git_win32_path path_w32;
1855
+ PSECURITY_DESCRIPTOR descriptor = NULL;
1856
+ PSID owner_sid;
1857
+ DWORD ret;
1858
+ int error = -1;
1859
+
1860
+ if (git_win32_path_from_utf8(path_w32, path) < 0)
1861
+ return -1;
1862
+
1863
+ ret = GetNamedSecurityInfoW(path_w32, SE_FILE_OBJECT,
1864
+ OWNER_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION,
1865
+ &owner_sid, NULL, NULL, NULL, &descriptor);
1866
+
1867
+ if (ret == ERROR_FILE_NOT_FOUND || ret == ERROR_PATH_NOT_FOUND)
1868
+ error = GIT_ENOTFOUND;
1869
+ else if (ret != ERROR_SUCCESS)
1810
1870
  git_error_set(GIT_ERROR_OS, "failed to get security information");
1811
- ret = GIT_ERROR;
1812
- goto cleanup;
1871
+ else if (!IsValidSid(owner_sid))
1872
+ git_error_set(GIT_ERROR_OS, "file owner is not valid");
1873
+ else if ((*out = sid_dup(owner_sid)))
1874
+ error = 0;
1875
+
1876
+ if (descriptor)
1877
+ LocalFree(descriptor);
1878
+
1879
+ return error;
1880
+ }
1881
+
1882
+ int git_fs_path_owner_is(
1883
+ bool *out,
1884
+ const char *path,
1885
+ git_fs_path_owner_t owner_type)
1886
+ {
1887
+ PSID owner_sid = NULL, user_sid = NULL;
1888
+ BOOL is_admin, admin_owned;
1889
+ int error;
1890
+
1891
+ if (mock_owner) {
1892
+ *out = ((mock_owner & owner_type) != 0);
1893
+ return 0;
1813
1894
  }
1814
1895
 
1815
- if (!IsValidSid(owner_sid)) {
1816
- git_error_set(GIT_ERROR_INVALID, "programdata configuration file owner is unknown");
1817
- ret = GIT_ERROR;
1818
- goto cleanup;
1896
+ if ((error = file_owner_sid(&owner_sid, path)) < 0)
1897
+ goto done;
1898
+
1899
+ if ((owner_type & GIT_FS_PATH_OWNER_CURRENT_USER) != 0) {
1900
+ if ((error = current_user_sid(&user_sid)) < 0)
1901
+ goto done;
1902
+
1903
+ if (EqualSid(owner_sid, user_sid)) {
1904
+ *out = true;
1905
+ goto done;
1906
+ }
1819
1907
  }
1820
1908
 
1821
- if (IsWellKnownSid(owner_sid, WinBuiltinAdministratorsSid) ||
1822
- IsWellKnownSid(owner_sid, WinLocalSystemSid)) {
1823
- ret = GIT_OK;
1824
- goto cleanup;
1909
+ admin_owned =
1910
+ IsWellKnownSid(owner_sid, WinBuiltinAdministratorsSid) ||
1911
+ IsWellKnownSid(owner_sid, WinLocalSystemSid);
1912
+
1913
+ if (admin_owned &&
1914
+ (owner_type & GIT_FS_PATH_OWNER_ADMINISTRATOR) != 0) {
1915
+ *out = true;
1916
+ goto done;
1825
1917
  }
1826
1918
 
1827
- /* Obtain current user's SID */
1828
- if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token) &&
1829
- !GetTokenInformation(token, TokenUser, NULL, 0, &len)) {
1830
- info = git__malloc(len);
1831
- GIT_ERROR_CHECK_ALLOC(info);
1832
- if (!GetTokenInformation(token, TokenUser, info, len, &len)) {
1833
- git__free(info);
1834
- info = NULL;
1835
- }
1919
+ if (admin_owned &&
1920
+ (owner_type & GIT_FS_PATH_USER_IS_ADMINISTRATOR) != 0 &&
1921
+ CheckTokenMembership(NULL, owner_sid, &is_admin) &&
1922
+ is_admin) {
1923
+ *out = true;
1924
+ goto done;
1836
1925
  }
1837
1926
 
1838
- /*
1839
- * If the file is owned by the same account that is running the current
1840
- * process, it's okay to read from that file.
1841
- */
1842
- if (info && EqualSid(owner_sid, info->User.Sid))
1843
- ret = GIT_OK;
1844
- else {
1845
- git_error_set(GIT_ERROR_INVALID, "programdata configuration file owner is not valid");
1846
- ret = GIT_ERROR;
1927
+ *out = false;
1928
+
1929
+ done:
1930
+ git__free(owner_sid);
1931
+ git__free(user_sid);
1932
+ return error;
1933
+ }
1934
+
1935
+ #else
1936
+
1937
+ static int sudo_uid_lookup(uid_t *out)
1938
+ {
1939
+ git_str uid_str = GIT_STR_INIT;
1940
+ int64_t uid;
1941
+ int error;
1942
+
1943
+ if ((error = git__getenv(&uid_str, "SUDO_UID")) == 0 &&
1944
+ (error = git__strntol64(&uid, uid_str.ptr, uid_str.size, NULL, 10)) == 0 &&
1945
+ uid == (int64_t)((uid_t)uid)) {
1946
+ *out = (uid_t)uid;
1847
1947
  }
1848
- git__free(info);
1849
1948
 
1850
- cleanup:
1851
- if (descriptor)
1852
- LocalFree(descriptor);
1949
+ git_str_dispose(&uid_str);
1950
+ return error;
1951
+ }
1952
+
1953
+ int git_fs_path_owner_is(
1954
+ bool *out,
1955
+ const char *path,
1956
+ git_fs_path_owner_t owner_type)
1957
+ {
1958
+ struct stat st;
1959
+ uid_t euid, sudo_uid;
1960
+
1961
+ if (mock_owner) {
1962
+ *out = ((mock_owner & owner_type) != 0);
1963
+ return 0;
1964
+ }
1965
+
1966
+ euid = geteuid();
1967
+
1968
+ if (p_lstat(path, &st) != 0) {
1969
+ if (errno == ENOENT)
1970
+ return GIT_ENOTFOUND;
1971
+
1972
+ git_error_set(GIT_ERROR_OS, "could not stat '%s'", path);
1973
+ return -1;
1974
+ }
1975
+
1976
+ if ((owner_type & GIT_FS_PATH_OWNER_CURRENT_USER) != 0 &&
1977
+ st.st_uid == euid) {
1978
+ *out = true;
1979
+ return 0;
1980
+ }
1981
+
1982
+ if ((owner_type & GIT_FS_PATH_OWNER_ADMINISTRATOR) != 0 &&
1983
+ st.st_uid == 0) {
1984
+ *out = true;
1985
+ return 0;
1986
+ }
1987
+
1988
+ if ((owner_type & GIT_FS_PATH_OWNER_RUNNING_SUDO) != 0 &&
1989
+ euid == 0 &&
1990
+ sudo_uid_lookup(&sudo_uid) == 0 &&
1991
+ st.st_uid == sudo_uid) {
1992
+ *out = true;
1993
+ return 0;
1994
+ }
1995
+
1996
+ *out = false;
1997
+ return 0;
1998
+ }
1853
1999
 
1854
- return ret;
1855
2000
  #endif
2001
+
2002
+ int git_fs_path_owner_is_current_user(bool *out, const char *path)
2003
+ {
2004
+ return git_fs_path_owner_is(out, path, GIT_FS_PATH_OWNER_CURRENT_USER);
2005
+ }
2006
+
2007
+ int git_fs_path_owner_is_system(bool *out, const char *path)
2008
+ {
2009
+ return git_fs_path_owner_is(out, path, GIT_FS_PATH_OWNER_ADMINISTRATOR);
1856
2010
  }
1857
2011
 
1858
2012
  int git_fs_path_find_executable(git_str *fullpath, const char *executable)
@@ -7,7 +7,7 @@
7
7
  #ifndef INCLUDE_fs_path_h__
8
8
  #define INCLUDE_fs_path_h__
9
9
 
10
- #include "common.h"
10
+ #include "git2_util.h"
11
11
 
12
12
  #include "posix.h"
13
13
  #include "str.h"
@@ -731,17 +731,55 @@ int git_fs_path_normalize_slashes(git_str *out, const char *path);
731
731
 
732
732
  bool git_fs_path_supports_symlinks(const char *dir);
733
733
 
734
+ typedef enum {
735
+ GIT_FS_PATH_OWNER_NONE = 0,
736
+
737
+ /** The file must be owned by the current user. */
738
+ GIT_FS_PATH_OWNER_CURRENT_USER = (1 << 0),
739
+
740
+ /** The file must be owned by the system account. */
741
+ GIT_FS_PATH_OWNER_ADMINISTRATOR = (1 << 1),
742
+
743
+ /**
744
+ * The file may be owned by a system account if the current
745
+ * user is in an administrator group. Windows only; this is
746
+ * a noop on non-Windows systems.
747
+ */
748
+ GIT_FS_PATH_USER_IS_ADMINISTRATOR = (1 << 2),
749
+
750
+ /**
751
+ * The file is owned by the current user, who is running `sudo`.
752
+ */
753
+ GIT_FS_PATH_OWNER_RUNNING_SUDO = (1 << 3),
754
+
755
+ /** The file may be owned by another user. */
756
+ GIT_FS_PATH_OWNER_OTHER = (1 << 4)
757
+ } git_fs_path_owner_t;
758
+
759
+ /**
760
+ * Sets the mock ownership for files; subsequent calls to
761
+ * `git_fs_path_owner_is_*` functions will return this data until
762
+ * cleared with `GIT_FS_PATH_OWNER_NONE`.
763
+ */
764
+ void git_fs_path__set_owner(git_fs_path_owner_t owner);
765
+
766
+ /** Verify that the file in question is owned by the given owner. */
767
+ int git_fs_path_owner_is(
768
+ bool *out,
769
+ const char *path,
770
+ git_fs_path_owner_t owner_type);
771
+
734
772
  /**
735
- * Validate a system file's ownership
736
- *
737
773
  * Verify that the file in question is owned by an administrator or system
738
- * account, or at least by the current user.
739
- *
740
- * This function returns 0 if successful. If the file is not owned by any of
741
- * these, or any other if there have been problems determining the file
742
- * ownership, it returns -1.
774
+ * account.
743
775
  */
744
- int git_fs_path_validate_system_file_ownership(const char *path);
776
+ int git_fs_path_owner_is_system(bool *out, const char *path);
777
+
778
+ /**
779
+ * Verify that the file in question is owned by the current user;
780
+ */
781
+
782
+ int git_fs_path_owner_is_current_user(bool *out, const char *path);
745
783
 
746
784
  /**
747
785
  * Search the current PATH for the given executable, returning the full
@@ -167,18 +167,60 @@ int git_futils_readbuffer_fd(git_str *buf, git_file fd, size_t len)
167
167
  /* p_read loops internally to read len bytes */
168
168
  read_size = p_read(fd, buf->ptr, len);
169
169
 
170
- if (read_size != (ssize_t)len) {
170
+ if (read_size < 0) {
171
171
  git_error_set(GIT_ERROR_OS, "failed to read descriptor");
172
172
  git_str_dispose(buf);
173
173
  return -1;
174
174
  }
175
175
 
176
+ if ((size_t)read_size != len) {
177
+ git_error_set(GIT_ERROR_FILESYSTEM, "could not read (expected %" PRIuZ " bytes, read %" PRIuZ ")", len, (size_t)read_size);
178
+ git_str_dispose(buf);
179
+ return -1;
180
+ }
181
+
176
182
  buf->ptr[read_size] = '\0';
177
183
  buf->size = read_size;
178
184
 
179
185
  return 0;
180
186
  }
181
187
 
188
+ int git_futils_readbuffer_fd_full(git_str *buf, git_file fd)
189
+ {
190
+ static size_t blocksize = 10240;
191
+ size_t alloc_len = 0, total_size = 0;
192
+ ssize_t read_size = 0;
193
+
194
+ git_str_clear(buf);
195
+
196
+ while (true) {
197
+ GIT_ERROR_CHECK_ALLOC_ADD(&alloc_len, alloc_len, blocksize);
198
+
199
+ if (git_str_grow(buf, alloc_len) < 0)
200
+ return -1;
201
+
202
+ /* p_read loops internally to read blocksize bytes */
203
+ read_size = p_read(fd, buf->ptr, blocksize);
204
+
205
+ if (read_size < 0) {
206
+ git_error_set(GIT_ERROR_OS, "failed to read descriptor");
207
+ git_str_dispose(buf);
208
+ return -1;
209
+ }
210
+
211
+ total_size += read_size;
212
+
213
+ if ((size_t)read_size < blocksize) {
214
+ break;
215
+ }
216
+ }
217
+
218
+ buf->ptr[total_size] = '\0';
219
+ buf->size = total_size;
220
+
221
+ return 0;
222
+ }
223
+
182
224
  int git_futils_readbuffer_updated(
183
225
  git_str *out,
184
226
  const char *path,
@@ -856,7 +898,7 @@ int git_futils_fake_symlink(const char *target, const char *path)
856
898
  static int cp_by_fd(int ifd, int ofd, bool close_fd_when_done)
857
899
  {
858
900
  int error = 0;
859
- char buffer[FILEIO_BUFSIZE];
901
+ char buffer[GIT_BUFSIZE_FILEIO];
860
902
  ssize_t len = 0;
861
903
 
862
904
  while (!error && (len = p_read(ifd, buffer, sizeof(buffer))) > 0)
@@ -7,7 +7,7 @@
7
7
  #ifndef INCLUDE_futils_h__
8
8
  #define INCLUDE_futils_h__
9
9
 
10
- #include "common.h"
10
+ #include "git2_util.h"
11
11
 
12
12
  #include "map.h"
13
13
  #include "posix.h"
@@ -27,6 +27,7 @@ extern int git_futils_readbuffer_updated(
27
27
  const char *path,
28
28
  unsigned char checksum[GIT_HASH_SHA1_SIZE],
29
29
  int *updated);
30
+ extern int git_futils_readbuffer_fd_full(git_str *obj, git_file fd);
30
31
  extern int git_futils_readbuffer_fd(git_str *obj, git_file fd, size_t len);
31
32
 
32
33
  /* Additional constants for `git_futils_writebuffer`'s `open_flags`. We
@@ -4,8 +4,8 @@
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.
6
6
  */
7
- #ifndef INCLUDE_common_h__
8
- #define INCLUDE_common_h__
7
+ #ifndef INCLUDE_git2_util_h__
8
+ #define INCLUDE_git2_util_h__
9
9
 
10
10
  #ifndef LIBGIT2_NO_FEATURES_H
11
11
  # include "git2/sys/features.h"
@@ -14,13 +14,13 @@
14
14
  #include "git2/common.h"
15
15
  #include "cc-compat.h"
16
16
 
17
+ typedef struct git_str git_str;
18
+
17
19
  /** Declare a function as always inlined. */
18
20
  #if defined(_MSC_VER)
19
21
  # define GIT_INLINE(type) static __inline type
20
22
  #elif defined(__GNUC__)
21
23
  # define GIT_INLINE(type) static __inline__ type
22
- #elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
23
- # define GIT_INLINE(type) static inline type
24
24
  #else
25
25
  # define GIT_INLINE(type) static type
26
26
  #endif
@@ -67,12 +67,12 @@
67
67
  # include <ws2tcpip.h>
68
68
  # include "win32/msvc-compat.h"
69
69
  # include "win32/mingw-compat.h"
70
- # include "win32/w32_common.h"
71
70
  # include "win32/win32-compat.h"
72
- # include "win32/error.h"
71
+ # include "win32/w32_common.h"
73
72
  # include "win32/version.h"
73
+ # include "win32/error.h"
74
74
  # ifdef GIT_THREADS
75
- # include "win32/thread.h"
75
+ # include "win32/thread.h"
76
76
  # endif
77
77
 
78
78
  #else
@@ -99,24 +99,17 @@
99
99
 
100
100
  #include "git2/types.h"
101
101
  #include "git2/errors.h"
102
- #include "errors.h"
103
102
  #include "thread.h"
104
103
  #include "integer.h"
105
104
  #include "assert_safe.h"
106
- #include "utf8.h"
107
-
108
- /*
109
- * Include the declarations for deprecated functions; this ensures
110
- * that they're decorated with the proper extern/visibility attributes.
111
- */
112
- #include "git2/deprecated.h"
113
105
 
114
106
  #include "posix.h"
115
107
 
116
- #define DEFAULT_BUFSIZE 65536
117
- #define FILEIO_BUFSIZE DEFAULT_BUFSIZE
118
- #define FILTERIO_BUFSIZE DEFAULT_BUFSIZE
119
- #define NETIO_BUFSIZE DEFAULT_BUFSIZE
108
+ #define GIT_BUFSIZE_DEFAULT 65536
109
+ #define GIT_BUFSIZE_FILEIO GIT_BUFSIZE_DEFAULT
110
+ #define GIT_BUFSIZE_FILTERIO GIT_BUFSIZE_DEFAULT
111
+ #define GIT_BUFSIZE_NETIO GIT_BUFSIZE_DEFAULT
112
+
120
113
 
121
114
  /**
122
115
  * Check a pointer allocation result, returning -1 if it failed.
@@ -126,7 +119,7 @@
126
119
  } while(0)
127
120
 
128
121
  /**
129
- * Check a string buffer allocation result, returning -1 if it failed.
122
+ * Check a buffer allocation result, returning -1 if it failed.
130
123
  */
131
124
  #define GIT_ERROR_CHECK_ALLOC_STR(buf) do { \
132
125
  if ((void *)(buf) == NULL || git_str_oom(buf)) { return -1; } \
@@ -138,40 +131,6 @@
138
131
  #define GIT_ERROR_CHECK_ERROR(code) \
139
132
  do { int _err = (code); if (_err) return _err; } while (0)
140
133
 
141
- /**
142
- * Check a versioned structure for validity
143
- */
144
- GIT_INLINE(int) git_error__check_version(const void *structure, unsigned int expected_max, const char *name)
145
- {
146
- unsigned int actual;
147
-
148
- if (!structure)
149
- return 0;
150
-
151
- actual = *(const unsigned int*)structure;
152
- if (actual > 0 && actual <= expected_max)
153
- return 0;
154
-
155
- git_error_set(GIT_ERROR_INVALID, "invalid version %d on %s", actual, name);
156
- return -1;
157
- }
158
- #define GIT_ERROR_CHECK_VERSION(S,V,N) if (git_error__check_version(S,V,N) < 0) return -1
159
-
160
- /**
161
- * Initialize a structure with a version.
162
- */
163
- GIT_INLINE(void) git__init_structure(void *structure, size_t len, unsigned int version)
164
- {
165
- memset(structure, 0, len);
166
- *((int*)structure) = version;
167
- }
168
- #define GIT_INIT_STRUCTURE(S,V) git__init_structure(S, sizeof(*S), V)
169
-
170
- #define GIT_INIT_STRUCTURE_FROM_TEMPLATE(PTR,VERSION,TYPE,TPL) do { \
171
- TYPE _tmpl = TPL; \
172
- GIT_ERROR_CHECK_VERSION(&(VERSION), _tmpl.version, #TYPE); \
173
- memcpy((PTR), &_tmpl, sizeof(_tmpl)); } while (0)
174
-
175
134
 
176
135
  /** Check for additive overflow, setting an error if would occur. */
177
136
  #define GIT_ADD_SIZET_OVERFLOW(out, one, two) \
@@ -204,11 +163,6 @@ GIT_INLINE(void) git__init_structure(void *structure, size_t len, unsigned int v
204
163
  #define GIT_ERROR_CHECK_ALLOC_MULTIPLY(out, nelem, elsize) \
205
164
  if (GIT_MULTIPLY_SIZET_OVERFLOW(out, nelem, elsize)) { return -1; }
206
165
 
207
- /* NOTE: other git_error functions are in the public errors.h header file */
208
-
209
- /* Forward declare git_str */
210
- typedef struct git_str git_str;
211
-
212
166
  #include "util.h"
213
167
 
214
168
  #endif