rugged 0.16.0 → 0.17.0b1
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.
- data/README.md +373 -243
- data/Rakefile +22 -0
- data/ext/rugged/extconf.rb +9 -6
- data/ext/rugged/rugged.c +123 -31
- data/ext/rugged/rugged.h +11 -10
- data/ext/rugged/rugged_blob.c +181 -18
- data/ext/rugged/rugged_commit.c +196 -18
- data/ext/rugged/rugged_config.c +94 -5
- data/ext/rugged/rugged_object.c +54 -1
- data/ext/rugged/rugged_reference.c +203 -15
- data/ext/rugged/{remote.c → rugged_remote.c} +35 -10
- data/ext/rugged/rugged_repo.c +323 -81
- data/ext/rugged/rugged_revwalk.c +57 -4
- data/ext/rugged/rugged_signature.c +3 -3
- data/ext/rugged/rugged_tag.c +72 -1
- data/ext/rugged/rugged_tree.c +70 -2
- data/ext/rugged/vendor/libgit2-dist/deps/regex/config.h +7 -0
- data/ext/rugged/vendor/libgit2-dist/deps/regex/regcomp.c +3856 -0
- data/ext/rugged/vendor/libgit2-dist/deps/regex/regex.c +85 -0
- data/ext/rugged/vendor/libgit2-dist/deps/regex/regex.h +582 -0
- data/ext/rugged/vendor/libgit2-dist/deps/regex/regex_internal.c +1744 -0
- data/ext/rugged/vendor/libgit2-dist/deps/regex/regex_internal.h +810 -0
- data/ext/rugged/vendor/libgit2-dist/deps/regex/regexec.c +4369 -0
- data/ext/rugged/vendor/libgit2-dist/examples/diff.c +238 -0
- data/ext/rugged/vendor/libgit2-dist/examples/general.c +4 -4
- data/ext/rugged/vendor/libgit2-dist/examples/network/fetch.c +101 -85
- data/ext/rugged/vendor/libgit2-dist/examples/network/git2.c +7 -3
- data/ext/rugged/vendor/libgit2-dist/examples/network/index-pack.c +80 -25
- data/ext/rugged/vendor/libgit2-dist/examples/network/ls-remote.c +6 -6
- data/ext/rugged/vendor/libgit2-dist/include/git2/attr.h +224 -0
- data/ext/rugged/vendor/libgit2-dist/include/git2/blob.h +59 -5
- data/ext/rugged/vendor/libgit2-dist/include/git2/branch.h +114 -7
- data/ext/rugged/vendor/libgit2-dist/include/git2/commit.h +14 -7
- data/ext/rugged/vendor/libgit2-dist/include/git2/common.h +4 -3
- data/ext/rugged/vendor/libgit2-dist/include/git2/config.h +105 -27
- data/ext/rugged/vendor/libgit2-dist/include/git2/diff.h +409 -0
- data/ext/rugged/vendor/libgit2-dist/include/git2/errors.h +47 -82
- data/ext/rugged/vendor/libgit2-dist/include/git2/index.h +25 -10
- data/ext/rugged/vendor/libgit2-dist/include/git2/indexer.h +46 -1
- data/ext/rugged/vendor/libgit2-dist/include/git2/merge.h +35 -0
- data/ext/rugged/vendor/libgit2-dist/include/git2/net.h +1 -1
- data/ext/rugged/vendor/libgit2-dist/include/git2/notes.h +139 -0
- data/ext/rugged/vendor/libgit2-dist/include/git2/object.h +5 -5
- data/ext/rugged/vendor/libgit2-dist/include/git2/odb.h +13 -13
- data/ext/rugged/vendor/libgit2-dist/include/git2/odb_backend.h +8 -8
- data/ext/rugged/vendor/libgit2-dist/include/git2/oid.h +14 -9
- data/ext/rugged/vendor/libgit2-dist/include/git2/reflog.h +5 -5
- data/ext/rugged/vendor/libgit2-dist/include/git2/refs.h +37 -17
- data/ext/rugged/vendor/libgit2-dist/include/git2/refspec.h +17 -9
- data/ext/rugged/vendor/libgit2-dist/include/git2/remote.h +83 -16
- data/ext/rugged/vendor/libgit2-dist/include/git2/repository.h +24 -10
- data/ext/rugged/vendor/libgit2-dist/include/git2/reset.h +44 -0
- data/ext/rugged/vendor/libgit2-dist/include/git2/revparse.h +36 -0
- data/ext/rugged/vendor/libgit2-dist/include/git2/revwalk.h +74 -6
- data/ext/rugged/vendor/libgit2-dist/include/git2/signature.h +3 -3
- data/ext/rugged/vendor/libgit2-dist/include/git2/status.h +120 -19
- data/ext/rugged/vendor/libgit2-dist/include/git2/submodule.h +103 -0
- data/ext/rugged/vendor/libgit2-dist/include/git2/tag.h +28 -10
- data/ext/rugged/vendor/libgit2-dist/include/git2/threads.h +1 -1
- data/ext/rugged/vendor/libgit2-dist/include/git2/tree.h +13 -13
- data/ext/rugged/vendor/libgit2-dist/include/git2/types.h +16 -2
- data/ext/rugged/vendor/libgit2-dist/include/git2/version.h +3 -3
- data/ext/rugged/vendor/libgit2-dist/include/git2/windows.h +1 -1
- data/ext/rugged/vendor/libgit2-dist/include/git2.h +7 -2
- data/ext/rugged/vendor/libgit2-dist/src/attr.c +677 -0
- data/ext/rugged/vendor/libgit2-dist/src/attr.h +56 -0
- data/ext/rugged/vendor/libgit2-dist/src/attr_file.c +609 -0
- data/ext/rugged/vendor/libgit2-dist/src/attr_file.h +145 -0
- data/ext/rugged/vendor/libgit2-dist/src/blob.c +213 -60
- data/ext/rugged/vendor/libgit2-dist/src/blob.h +2 -1
- data/ext/rugged/vendor/libgit2-dist/src/branch.c +208 -0
- data/ext/rugged/vendor/libgit2-dist/src/branch.h +17 -0
- data/ext/rugged/vendor/libgit2-dist/src/bswap.h +1 -1
- data/ext/rugged/vendor/libgit2-dist/src/buffer.c +395 -46
- data/ext/rugged/vendor/libgit2-dist/src/buffer.h +112 -9
- data/ext/rugged/vendor/libgit2-dist/src/cache.c +37 -49
- data/ext/rugged/vendor/libgit2-dist/src/cache.h +7 -17
- data/ext/rugged/vendor/libgit2-dist/src/cc-compat.h +18 -16
- data/ext/rugged/vendor/libgit2-dist/src/commit.c +56 -90
- data/ext/rugged/vendor/libgit2-dist/src/commit.h +1 -1
- data/ext/rugged/vendor/libgit2-dist/src/common.h +12 -5
- data/ext/rugged/vendor/libgit2-dist/src/{win32 → compat}/fnmatch.c +1 -1
- data/ext/rugged/vendor/libgit2-dist/src/{win32 → compat}/fnmatch.h +3 -3
- data/ext/rugged/vendor/libgit2-dist/src/config.c +247 -158
- data/ext/rugged/vendor/libgit2-dist/src/config.h +10 -1
- data/ext/rugged/vendor/libgit2-dist/src/config_cache.c +94 -0
- data/ext/rugged/vendor/libgit2-dist/src/config_file.c +606 -496
- data/ext/rugged/vendor/libgit2-dist/src/config_file.h +31 -0
- data/ext/rugged/vendor/libgit2-dist/src/crlf.c +228 -0
- data/ext/rugged/vendor/libgit2-dist/src/date.c +876 -0
- data/ext/rugged/vendor/libgit2-dist/src/delta-apply.c +15 -9
- data/ext/rugged/vendor/libgit2-dist/src/delta-apply.h +2 -2
- data/ext/rugged/vendor/libgit2-dist/src/diff.c +814 -0
- data/ext/rugged/vendor/libgit2-dist/src/diff.h +43 -0
- data/ext/rugged/vendor/libgit2-dist/src/diff_output.c +794 -0
- data/ext/rugged/vendor/libgit2-dist/src/errors.c +89 -74
- data/ext/rugged/vendor/libgit2-dist/src/fetch.c +94 -66
- data/ext/rugged/vendor/libgit2-dist/src/fetch.h +5 -4
- data/ext/rugged/vendor/libgit2-dist/src/filebuf.c +157 -100
- data/ext/rugged/vendor/libgit2-dist/src/filebuf.h +22 -8
- data/ext/rugged/vendor/libgit2-dist/src/fileops.c +330 -206
- data/ext/rugged/vendor/libgit2-dist/src/fileops.h +82 -51
- data/ext/rugged/vendor/libgit2-dist/src/filter.c +165 -0
- data/ext/rugged/vendor/libgit2-dist/src/filter.h +119 -0
- data/ext/rugged/vendor/libgit2-dist/src/global.c +4 -4
- data/ext/rugged/vendor/libgit2-dist/src/global.h +4 -1
- data/ext/rugged/vendor/libgit2-dist/src/hash.c +1 -1
- data/ext/rugged/vendor/libgit2-dist/src/hash.h +1 -1
- data/ext/rugged/vendor/libgit2-dist/src/ignore.c +203 -0
- data/ext/rugged/vendor/libgit2-dist/src/ignore.h +38 -0
- data/ext/rugged/vendor/libgit2-dist/src/index.c +220 -169
- data/ext/rugged/vendor/libgit2-dist/src/index.h +5 -1
- data/ext/rugged/vendor/libgit2-dist/src/indexer.c +601 -102
- data/ext/rugged/vendor/libgit2-dist/src/iterator.c +748 -0
- data/ext/rugged/vendor/libgit2-dist/src/iterator.h +151 -0
- data/ext/rugged/vendor/libgit2-dist/src/khash.h +608 -0
- data/ext/rugged/vendor/libgit2-dist/src/map.h +6 -1
- data/ext/rugged/vendor/libgit2-dist/src/message.c +61 -0
- data/ext/rugged/vendor/libgit2-dist/src/message.h +14 -0
- data/ext/rugged/vendor/libgit2-dist/src/mwindow.c +27 -29
- data/ext/rugged/vendor/libgit2-dist/src/mwindow.h +4 -4
- data/ext/rugged/vendor/libgit2-dist/src/netops.c +375 -56
- data/ext/rugged/vendor/libgit2-dist/src/netops.h +12 -9
- data/ext/rugged/vendor/libgit2-dist/src/notes.c +548 -0
- data/ext/rugged/vendor/libgit2-dist/src/notes.h +28 -0
- data/ext/rugged/vendor/libgit2-dist/src/object.c +59 -21
- data/ext/rugged/vendor/libgit2-dist/src/odb.c +212 -175
- data/ext/rugged/vendor/libgit2-dist/src/odb.h +39 -2
- data/ext/rugged/vendor/libgit2-dist/src/odb_loose.c +238 -241
- data/ext/rugged/vendor/libgit2-dist/src/odb_pack.c +94 -106
- data/ext/rugged/vendor/libgit2-dist/src/oid.c +59 -60
- data/ext/rugged/vendor/libgit2-dist/src/oidmap.h +42 -0
- data/ext/rugged/vendor/libgit2-dist/src/pack.c +198 -170
- data/ext/rugged/vendor/libgit2-dist/src/pack.h +16 -9
- data/ext/rugged/vendor/libgit2-dist/src/path.c +496 -106
- data/ext/rugged/vendor/libgit2-dist/src/path.h +214 -20
- data/ext/rugged/vendor/libgit2-dist/src/pkt.c +88 -159
- data/ext/rugged/vendor/libgit2-dist/src/pkt.h +9 -5
- data/ext/rugged/vendor/libgit2-dist/src/pool.c +294 -0
- data/ext/rugged/vendor/libgit2-dist/src/pool.h +125 -0
- data/ext/rugged/vendor/libgit2-dist/src/posix.c +38 -16
- data/ext/rugged/vendor/libgit2-dist/src/posix.h +20 -2
- data/ext/rugged/vendor/libgit2-dist/src/ppc/sha1.c +1 -1
- data/ext/rugged/vendor/libgit2-dist/src/ppc/sha1.h +1 -1
- data/ext/rugged/vendor/libgit2-dist/src/pqueue.c +7 -7
- data/ext/rugged/vendor/libgit2-dist/src/pqueue.h +1 -1
- data/ext/rugged/vendor/libgit2-dist/src/protocol.c +21 -13
- data/ext/rugged/vendor/libgit2-dist/src/protocol.h +1 -1
- data/ext/rugged/vendor/libgit2-dist/src/reflog.c +125 -103
- data/ext/rugged/vendor/libgit2-dist/src/reflog.h +1 -1
- data/ext/rugged/vendor/libgit2-dist/src/refs.c +713 -640
- data/ext/rugged/vendor/libgit2-dist/src/refs.h +27 -3
- data/ext/rugged/vendor/libgit2-dist/src/refspec.c +51 -17
- data/ext/rugged/vendor/libgit2-dist/src/refspec.h +13 -1
- data/ext/rugged/vendor/libgit2-dist/src/remote.c +307 -119
- data/ext/rugged/vendor/libgit2-dist/src/remote.h +3 -2
- data/ext/rugged/vendor/libgit2-dist/src/repository.c +593 -442
- data/ext/rugged/vendor/libgit2-dist/src/repository.h +80 -2
- data/ext/rugged/vendor/libgit2-dist/src/reset.c +103 -0
- data/ext/rugged/vendor/libgit2-dist/src/revparse.c +753 -0
- data/ext/rugged/vendor/libgit2-dist/src/revwalk.c +434 -158
- data/ext/rugged/vendor/libgit2-dist/src/sha1.c +3 -3
- data/ext/rugged/vendor/libgit2-dist/src/sha1.h +2 -2
- data/ext/rugged/vendor/libgit2-dist/src/sha1_lookup.c +3 -2
- data/ext/rugged/vendor/libgit2-dist/src/sha1_lookup.h +1 -1
- data/ext/rugged/vendor/libgit2-dist/src/signature.c +69 -80
- data/ext/rugged/vendor/libgit2-dist/src/signature.h +1 -1
- data/ext/rugged/vendor/libgit2-dist/src/status.c +184 -638
- data/ext/rugged/vendor/libgit2-dist/src/strmap.h +64 -0
- data/ext/rugged/vendor/libgit2-dist/src/submodule.c +387 -0
- data/ext/rugged/vendor/libgit2-dist/src/tag.c +162 -137
- data/ext/rugged/vendor/libgit2-dist/src/tag.h +2 -1
- data/ext/rugged/vendor/libgit2-dist/src/thread-utils.c +1 -1
- data/ext/rugged/vendor/libgit2-dist/src/thread-utils.h +8 -8
- data/ext/rugged/vendor/libgit2-dist/src/transport.c +31 -19
- data/ext/rugged/vendor/libgit2-dist/src/transport.h +31 -11
- data/ext/rugged/vendor/libgit2-dist/src/transports/git.c +168 -193
- data/ext/rugged/vendor/libgit2-dist/src/transports/http.c +192 -241
- data/ext/rugged/vendor/libgit2-dist/src/transports/local.c +92 -86
- data/ext/rugged/vendor/libgit2-dist/src/tree-cache.c +32 -49
- data/ext/rugged/vendor/libgit2-dist/src/tree-cache.h +1 -1
- data/ext/rugged/vendor/libgit2-dist/src/tree.c +172 -145
- data/ext/rugged/vendor/libgit2-dist/src/tree.h +16 -2
- data/ext/rugged/vendor/libgit2-dist/src/tsort.c +16 -14
- data/ext/rugged/vendor/libgit2-dist/src/unix/map.c +8 -24
- data/ext/rugged/vendor/libgit2-dist/src/unix/posix.h +9 -3
- data/ext/rugged/vendor/libgit2-dist/src/util.c +94 -38
- data/ext/rugged/vendor/libgit2-dist/src/util.h +119 -13
- data/ext/rugged/vendor/libgit2-dist/src/vector.c +84 -31
- data/ext/rugged/vendor/libgit2-dist/src/vector.h +37 -4
- data/ext/rugged/vendor/libgit2-dist/src/win32/dir.c +81 -41
- data/ext/rugged/vendor/libgit2-dist/src/{dir.h → win32/dir.h} +4 -9
- data/ext/rugged/vendor/libgit2-dist/src/win32/map.c +19 -35
- data/ext/rugged/vendor/libgit2-dist/src/win32/mingw-compat.h +1 -1
- data/ext/rugged/vendor/libgit2-dist/src/win32/msvc-compat.h +5 -1
- data/ext/rugged/vendor/libgit2-dist/src/win32/posix.h +10 -8
- data/ext/rugged/vendor/libgit2-dist/src/win32/posix_w32.c +262 -118
- data/ext/rugged/vendor/libgit2-dist/src/win32/pthread.c +12 -9
- data/ext/rugged/vendor/libgit2-dist/src/win32/pthread.h +1 -1
- data/ext/rugged/vendor/libgit2-dist/src/win32/utf-conv.c +30 -26
- data/ext/rugged/vendor/libgit2-dist/src/win32/utf-conv.h +2 -1
- data/ext/rugged/vendor/libgit2-dist/src/xdiff/xdiff.h +135 -0
- data/ext/rugged/vendor/libgit2-dist/src/xdiff/xdiffi.c +572 -0
- data/ext/rugged/vendor/libgit2-dist/src/xdiff/xdiffi.h +63 -0
- data/ext/rugged/vendor/libgit2-dist/src/xdiff/xemit.c +253 -0
- data/ext/rugged/vendor/libgit2-dist/src/xdiff/xemit.h +36 -0
- data/ext/rugged/vendor/libgit2-dist/src/xdiff/xhistogram.c +371 -0
- data/ext/rugged/vendor/libgit2-dist/src/xdiff/xinclude.h +46 -0
- data/ext/rugged/vendor/libgit2-dist/src/xdiff/xmacros.h +54 -0
- data/ext/rugged/vendor/libgit2-dist/src/xdiff/xmerge.c +619 -0
- data/ext/rugged/vendor/libgit2-dist/src/xdiff/xpatience.c +358 -0
- data/ext/rugged/vendor/libgit2-dist/src/xdiff/xprepare.c +483 -0
- data/ext/rugged/vendor/libgit2-dist/src/xdiff/xprepare.h +34 -0
- data/ext/rugged/vendor/libgit2-dist/src/xdiff/xtypes.h +67 -0
- data/ext/rugged/vendor/libgit2-dist/src/xdiff/xutils.c +419 -0
- data/ext/rugged/vendor/libgit2-dist/src/xdiff/xutils.h +49 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/attr/attr_expect.h +43 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/attr/file.c +226 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/attr/flags.c +108 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/attr/lookup.c +262 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/attr/repo.c +273 -0
- data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/buf/basic.c +5 -5
- data/ext/rugged/vendor/libgit2-dist/tests-clar/clar_helpers.c +181 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/clar_libgit2.h +55 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/commit/commit.c +44 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/commit/parse.c +350 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/commit/signature.c +65 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/commit/write.c +140 -0
- data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/config/add.c +3 -3
- data/ext/rugged/vendor/libgit2-dist/tests-clar/config/multivar.c +151 -0
- data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/config/new.c +5 -5
- data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/config/read.c +44 -32
- data/ext/rugged/vendor/libgit2-dist/tests-clar/config/stress.c +61 -0
- data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/config/write.c +20 -5
- data/ext/rugged/vendor/libgit2-dist/tests-clar/core/buffer.c +613 -0
- data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/core/dirent.c +39 -26
- data/ext/rugged/vendor/libgit2-dist/tests-clar/core/env.c +115 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/core/errors.c +60 -0
- data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/core/filebuf.c +4 -18
- data/ext/rugged/vendor/libgit2-dist/tests-clar/core/hex.c +22 -0
- data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/core/oid.c +6 -6
- data/ext/rugged/vendor/libgit2-dist/tests-clar/core/path.c +420 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/core/pool.c +85 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/core/rmdir.c +68 -0
- data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/core/string.c +1 -1
- data/ext/rugged/vendor/libgit2-dist/tests-clar/core/strmap.c +102 -0
- data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/core/strtol.c +1 -1
- data/ext/rugged/vendor/libgit2-dist/tests-clar/core/vector.c +191 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/date/date.c +15 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/diff/blob.c +254 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/diff/diff_helpers.c +104 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/diff/diff_helpers.h +47 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/diff/index.c +92 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/diff/iterator.c +572 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/diff/patch.c +99 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/diff/tree.c +210 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/diff/workdir.c +543 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/index/read_tree.c +46 -0
- data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/index/rename.c +2 -12
- data/ext/rugged/vendor/libgit2-dist/tests-clar/index/tests.c +246 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/network/createremotethenload.c +33 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/network/remotelocal.c +137 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/network/remotes.c +183 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/notes/notes.c +133 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/notes/notesref.c +57 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/object/blob/filter.c +125 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/object/blob/fromchunks.c +87 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/object/blob/write.c +69 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/object/commit/commitstagedfile.c +126 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/object/lookup.c +63 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/object/message.c +171 -0
- data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/object/raw/chars.c +3 -14
- data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/object/raw/compare.c +4 -4
- data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/object/raw/convert.c +10 -10
- data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/object/raw/data.h +0 -0
- data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/object/raw/fromstr.c +1 -1
- data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/object/raw/hash.c +21 -17
- data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/object/raw/short.c +1 -1
- data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/object/raw/size.c +1 -1
- data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/object/raw/type2string.c +14 -14
- data/ext/rugged/vendor/libgit2-dist/tests-clar/object/raw/write.c +455 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/object/tag/peel.c +56 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/object/tag/read.c +130 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/object/tag/write.c +192 -0
- data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/object/tree/frompath.c +22 -16
- data/ext/rugged/vendor/libgit2-dist/tests-clar/object/tree/read.c +75 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/object/tree/write.c +84 -0
- data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/odb/loose.c +1 -1
- data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/odb/loose_data.h +0 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/odb/mixed.c +24 -0
- data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/odb/pack_data.h +0 -0
- data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/odb/packed.c +1 -1
- data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/odb/sorting.c +1 -1
- data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/branches/create.c +113 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/branches/delete.c +91 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/branches/listall.c +78 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/branches/move.c +72 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/crashes.c +17 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/create.c +149 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/delete.c +85 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/list.c +53 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/listall.c +36 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/lookup.c +42 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/normalize.c +200 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/overwrite.c +136 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/pack.c +67 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/read.c +194 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/reflog.c +123 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/rename.c +339 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/revparse.c +174 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/unicode.c +42 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/repo/discover.c +142 -0
- data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/repo/getters.c +19 -1
- data/ext/rugged/vendor/libgit2-dist/tests-clar/repo/init.c +235 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/repo/open.c +282 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/repo/setters.c +80 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/reset/mixed.c +47 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/reset/reset_helpers.c +10 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/reset/reset_helpers.h +6 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/reset/soft.c +102 -0
- data/ext/rugged/vendor/libgit2-dist/{tests/t05-revwalk.c → tests-clar/revwalk/basic.c} +85 -44
- data/ext/rugged/vendor/libgit2-dist/tests-clar/revwalk/mergebase.c +148 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/status/ignore.c +133 -0
- data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/status/single.c +2 -11
- data/ext/rugged/vendor/libgit2-dist/tests-clar/status/status_data.h +202 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/status/status_helpers.c +49 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/status/status_helpers.h +33 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/status/submodules.c +112 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/status/worktree.c +649 -0
- data/ext/rugged/vendor/libgit2-dist/tests-clar/threads/basic.c +20 -0
- data/ext/rugged/vendor/libgit2-dist.tar.gz +0 -0
- data/lib/rugged/commit.rb +35 -0
- data/lib/rugged/object.rb +7 -0
- data/lib/rugged/reference.rb +9 -0
- data/lib/rugged/repository.rb +99 -3
- data/lib/rugged/tag.rb +22 -0
- data/lib/rugged/tree.rb +8 -0
- data/lib/rugged/version.rb +1 -1
- data/lib/rugged.rb +4 -1
- data/test/blob_test.rb +2 -2
- data/test/commit_test.rb +27 -13
- data/test/config_test.rb +44 -0
- data/test/coverage/HEAD.json +1 -1
- data/test/fixtures/testrepo.git/config +2 -0
- data/test/fixtures/testrepo.git/objects/7f/043268ea43ce18e3540acaabf9e090c91965b0 +0 -0
- data/test/lib_test.rb +7 -0
- data/test/object_test.rb +3 -3
- data/test/reference_test.rb +46 -8
- data/test/remote_test.rb +8 -2
- data/test/repo_pack_test.rb +3 -3
- data/test/repo_test.rb +79 -11
- data/test/tag_test.rb +9 -2
- data/test/test_helper.rb +21 -0
- data/test/tree_test.rb +18 -6
- metadata +205 -81
- data/ext/rugged/vendor/libgit2-dist/include/git2/zlib.h +0 -40
- data/ext/rugged/vendor/libgit2-dist/src/hashtable.c +0 -243
- data/ext/rugged/vendor/libgit2-dist/src/hashtable.h +0 -80
- data/ext/rugged/vendor/libgit2-dist/tests/t00-core.c +0 -628
- data/ext/rugged/vendor/libgit2-dist/tests/t01-data.h +0 -322
- data/ext/rugged/vendor/libgit2-dist/tests/t01-rawobj.c +0 -638
- data/ext/rugged/vendor/libgit2-dist/tests/t03-data.h +0 -344
- data/ext/rugged/vendor/libgit2-dist/tests/t03-objwrite.c +0 -255
- data/ext/rugged/vendor/libgit2-dist/tests/t04-commit.c +0 -788
- data/ext/rugged/vendor/libgit2-dist/tests/t06-index.c +0 -219
- data/ext/rugged/vendor/libgit2-dist/tests/t07-hashtable.c +0 -192
- data/ext/rugged/vendor/libgit2-dist/tests/t08-tag.c +0 -357
- data/ext/rugged/vendor/libgit2-dist/tests/t09-tree.c +0 -221
- data/ext/rugged/vendor/libgit2-dist/tests/t10-refs.c +0 -1294
- data/ext/rugged/vendor/libgit2-dist/tests/t12-repo.c +0 -174
- data/ext/rugged/vendor/libgit2-dist/tests/t13-threads.c +0 -41
- data/ext/rugged/vendor/libgit2-dist/tests/t17-bufs.c +0 -61
- data/ext/rugged/vendor/libgit2-dist/tests/t18-status.c +0 -448
- data/ext/rugged/vendor/libgit2-dist/tests/test_helpers.c +0 -310
- data/ext/rugged/vendor/libgit2-dist/tests/test_helpers.h +0 -83
- data/ext/rugged/vendor/libgit2-dist/tests/test_lib.c +0 -198
- data/ext/rugged/vendor/libgit2-dist/tests/test_lib.h +0 -54
- data/ext/rugged/vendor/libgit2-dist/tests/test_main.c +0 -89
- data/ext/rugged/vendor/libgit2-dist/tests-clay/clay.h +0 -187
- data/ext/rugged/vendor/libgit2-dist/tests-clay/clay_libgit2.h +0 -28
- data/ext/rugged/vendor/libgit2-dist/tests-clay/clay_main.c +0 -1073
- data/ext/rugged/vendor/libgit2-dist/tests-clay/config/stress.c +0 -39
- data/ext/rugged/vendor/libgit2-dist/tests-clay/core/path.c +0 -139
- data/ext/rugged/vendor/libgit2-dist/tests-clay/core/rmdir.c +0 -50
- data/ext/rugged/vendor/libgit2-dist/tests-clay/core/vector.c +0 -66
- data/ext/rugged/vendor/libgit2-dist/tests-clay/network/remotes.c +0 -50
- data/ext/rugged/vendor/libgit2-dist/tests-clay/repo/init.c +0 -104
- data/ext/rugged/vendor/libgit2-dist/tests-clay/repo/open.c +0 -54
- data/ext/rugged/vendor/libgit2-dist/tests-clay/status/status_data.h +0 -48
- data/ext/rugged/vendor/libgit2-dist/tests-clay/status/worktree.c +0 -124
- data/lib/rugged/objects.rb +0 -45
- data/test/fixtures/testrepo.git/refs/heads/new_name +0 -1
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* Copyright (C) 2009-
|
2
|
+
* Copyright (C) 2009-2012 the libgit2 contributors
|
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.
|
@@ -115,7 +115,7 @@ static int git_mwindow_close_lru(git_mwindow_file *mwf)
|
|
115
115
|
unsigned int i;
|
116
116
|
git_mwindow *lru_w = NULL, *lru_l = NULL, **list = &mwf->windows;
|
117
117
|
|
118
|
-
/*
|
118
|
+
/* FIXME: Does this give us any advantage? */
|
119
119
|
if(mwf->windows)
|
120
120
|
git_mwindow_scan_lru(mwf, &lru_w, &lru_l);
|
121
121
|
|
@@ -127,22 +127,23 @@ static int git_mwindow_close_lru(git_mwindow_file *mwf)
|
|
127
127
|
list = &cur->windows;
|
128
128
|
}
|
129
129
|
|
130
|
-
if (lru_w) {
|
131
|
-
|
132
|
-
|
130
|
+
if (!lru_w) {
|
131
|
+
giterr_set(GITERR_OS, "Failed to close memory window. Couldn't find LRU");
|
132
|
+
return -1;
|
133
|
+
}
|
133
134
|
|
134
|
-
|
135
|
-
|
136
|
-
else
|
137
|
-
*list = lru_w->next;
|
135
|
+
ctl->mapped -= lru_w->window_map.len;
|
136
|
+
git_futils_mmap_free(&lru_w->window_map);
|
138
137
|
|
139
|
-
|
140
|
-
|
138
|
+
if (lru_l)
|
139
|
+
lru_l->next = lru_w->next;
|
140
|
+
else
|
141
|
+
*list = lru_w->next;
|
141
142
|
|
142
|
-
|
143
|
-
|
143
|
+
git__free(lru_w);
|
144
|
+
ctl->open_windows--;
|
144
145
|
|
145
|
-
return
|
146
|
+
return 0;
|
146
147
|
}
|
147
148
|
|
148
149
|
static git_mwindow *new_window(
|
@@ -158,7 +159,7 @@ static git_mwindow *new_window(
|
|
158
159
|
|
159
160
|
w = git__malloc(sizeof(*w));
|
160
161
|
if (w == NULL)
|
161
|
-
return
|
162
|
+
return NULL;
|
162
163
|
|
163
164
|
memset(w, 0x0, sizeof(*w));
|
164
165
|
w->offset = (offset / walign) * walign;
|
@@ -170,7 +171,7 @@ static git_mwindow *new_window(
|
|
170
171
|
ctl->mapped += (size_t)len;
|
171
172
|
|
172
173
|
while (_mw_options.mapped_limit < ctl->mapped &&
|
173
|
-
git_mwindow_close_lru(mwf) ==
|
174
|
+
git_mwindow_close_lru(mwf) == 0) /* nop */;
|
174
175
|
|
175
176
|
/*
|
176
177
|
* We treat _mw_options.mapped_limit as a soft limit. If we can't find a
|
@@ -178,8 +179,10 @@ static git_mwindow *new_window(
|
|
178
179
|
* window.
|
179
180
|
*/
|
180
181
|
|
181
|
-
if (git_futils_mmap_ro(&w->window_map, fd, w->offset, (size_t)len) <
|
182
|
-
|
182
|
+
if (git_futils_mmap_ro(&w->window_map, fd, w->offset, (size_t)len) < 0) {
|
183
|
+
git__free(w);
|
184
|
+
return NULL;
|
185
|
+
}
|
183
186
|
|
184
187
|
ctl->mmap_calls++;
|
185
188
|
ctl->open_windows++;
|
@@ -191,10 +194,6 @@ static git_mwindow *new_window(
|
|
191
194
|
ctl->peak_open_windows = ctl->open_windows;
|
192
195
|
|
193
196
|
return w;
|
194
|
-
|
195
|
-
cleanup:
|
196
|
-
git__free(w);
|
197
|
-
return NULL;
|
198
197
|
}
|
199
198
|
|
200
199
|
/*
|
@@ -205,19 +204,20 @@ unsigned char *git_mwindow_open(
|
|
205
204
|
git_mwindow_file *mwf,
|
206
205
|
git_mwindow **cursor,
|
207
206
|
git_off_t offset,
|
208
|
-
|
207
|
+
size_t extra,
|
209
208
|
unsigned int *left)
|
210
209
|
{
|
211
210
|
git_mwindow_ctl *ctl = &GIT_GLOBAL->mem_ctl;
|
212
211
|
git_mwindow *w = *cursor;
|
213
212
|
|
214
|
-
if (!w || !git_mwindow_contains(w, offset + extra)) {
|
213
|
+
if (!w || !(git_mwindow_contains(w, offset) && git_mwindow_contains(w, offset + extra))) {
|
215
214
|
if (w) {
|
216
215
|
w->inuse_cnt--;
|
217
216
|
}
|
218
217
|
|
219
218
|
for (w = mwf->windows; w; w = w->next) {
|
220
|
-
if (git_mwindow_contains(w, offset
|
219
|
+
if (git_mwindow_contains(w, offset) &&
|
220
|
+
git_mwindow_contains(w, offset + extra))
|
221
221
|
break;
|
222
222
|
}
|
223
223
|
|
@@ -242,7 +242,6 @@ unsigned char *git_mwindow_open(
|
|
242
242
|
}
|
243
243
|
|
244
244
|
offset -= w->offset;
|
245
|
-
assert(git__is_sizet(offset));
|
246
245
|
|
247
246
|
if (left)
|
248
247
|
*left = (unsigned int)(w->window_map.len - offset);
|
@@ -253,11 +252,10 @@ unsigned char *git_mwindow_open(
|
|
253
252
|
int git_mwindow_file_register(git_mwindow_file *mwf)
|
254
253
|
{
|
255
254
|
git_mwindow_ctl *ctl = &GIT_GLOBAL->mem_ctl;
|
256
|
-
int error;
|
257
255
|
|
258
256
|
if (ctl->windowfiles.length == 0 &&
|
259
|
-
|
260
|
-
return
|
257
|
+
git_vector_init(&ctl->windowfiles, 8, NULL) < 0)
|
258
|
+
return -1;
|
261
259
|
|
262
260
|
return git_vector_insert(&ctl->windowfiles, mwf);
|
263
261
|
}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* Copyright (C) 2009-
|
2
|
+
* Copyright (C) 2009-2012 the libgit2 contributors
|
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.
|
@@ -15,8 +15,8 @@ typedef struct git_mwindow {
|
|
15
15
|
struct git_mwindow *next;
|
16
16
|
git_map window_map;
|
17
17
|
git_off_t offset;
|
18
|
-
|
19
|
-
|
18
|
+
size_t last_used;
|
19
|
+
size_t inuse_cnt;
|
20
20
|
} git_mwindow;
|
21
21
|
|
22
22
|
typedef struct git_mwindow_file {
|
@@ -37,7 +37,7 @@ typedef struct git_mwindow_ctl {
|
|
37
37
|
|
38
38
|
int git_mwindow_contains(git_mwindow *win, git_off_t offset);
|
39
39
|
void git_mwindow_free_all(git_mwindow_file *mwf);
|
40
|
-
unsigned char *git_mwindow_open(git_mwindow_file *mwf, git_mwindow **cursor, git_off_t offset,
|
40
|
+
unsigned char *git_mwindow_open(git_mwindow_file *mwf, git_mwindow **cursor, git_off_t offset, size_t extra, unsigned int *left);
|
41
41
|
void git_mwindow_scan_lru(git_mwindow_file *mwf, git_mwindow **lru_w, git_mwindow **lru_l);
|
42
42
|
int git_mwindow_file_register(git_mwindow_file *mwf);
|
43
43
|
void git_mwindow_close(git_mwindow **w_cursor);
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* Copyright (C) 2009-
|
2
|
+
* Copyright (C) 2009-2012 the libgit2 contributors
|
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,45 +8,114 @@
|
|
8
8
|
# include <sys/types.h>
|
9
9
|
# include <sys/socket.h>
|
10
10
|
# include <sys/select.h>
|
11
|
+
# include <sys/time.h>
|
11
12
|
# include <netdb.h>
|
13
|
+
# include <arpa/inet.h>
|
12
14
|
#else
|
13
|
-
# define _WIN32_WINNT 0x0501
|
14
15
|
# include <winsock2.h>
|
15
|
-
# include <
|
16
|
+
# include <ws2tcpip.h>
|
16
17
|
# ifdef _MSC_VER
|
17
|
-
# pragma comment(lib, "
|
18
|
+
# pragma comment(lib, "ws2_32.lib")
|
18
19
|
# endif
|
19
20
|
#endif
|
20
21
|
|
22
|
+
#ifdef GIT_SSL
|
23
|
+
# include <openssl/ssl.h>
|
24
|
+
# include <openssl/x509v3.h>
|
25
|
+
#endif
|
21
26
|
|
27
|
+
#include <ctype.h>
|
22
28
|
#include "git2/errors.h"
|
23
29
|
|
24
30
|
#include "common.h"
|
25
31
|
#include "netops.h"
|
26
32
|
#include "posix.h"
|
33
|
+
#include "buffer.h"
|
34
|
+
#include "transport.h"
|
27
35
|
|
28
|
-
|
36
|
+
#ifdef GIT_WIN32
|
37
|
+
static void net_set_error(const char *str)
|
38
|
+
{
|
39
|
+
int size, error = WSAGetLastError();
|
40
|
+
LPSTR err_str = NULL;
|
41
|
+
|
42
|
+
size = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
|
43
|
+
0, error, 0, (LPSTR)&err_str, 0, 0);
|
44
|
+
|
45
|
+
giterr_set(GITERR_NET, "%s: %s", str, err_str);
|
46
|
+
LocalFree(err_str);
|
47
|
+
}
|
48
|
+
#else
|
49
|
+
static void net_set_error(const char *str)
|
50
|
+
{
|
51
|
+
giterr_set(GITERR_NET, "%s: %s", str, strerror(errno));
|
52
|
+
}
|
53
|
+
#endif
|
54
|
+
|
55
|
+
#ifdef GIT_SSL
|
56
|
+
static int ssl_set_error(gitno_ssl *ssl, int error)
|
57
|
+
{
|
58
|
+
int err;
|
59
|
+
err = SSL_get_error(ssl->ssl, error);
|
60
|
+
giterr_set(GITERR_NET, "SSL error: %s", ERR_error_string(err, NULL));
|
61
|
+
return -1;
|
62
|
+
}
|
63
|
+
#endif
|
64
|
+
|
65
|
+
void gitno_buffer_setup(git_transport *t, gitno_buffer *buf, char *data, unsigned int len)
|
29
66
|
{
|
30
67
|
memset(buf, 0x0, sizeof(gitno_buffer));
|
31
68
|
memset(data, 0x0, len);
|
32
69
|
buf->data = data;
|
33
70
|
buf->len = len;
|
34
71
|
buf->offset = 0;
|
35
|
-
buf->fd =
|
72
|
+
buf->fd = t->socket;
|
73
|
+
#ifdef GIT_SSL
|
74
|
+
if (t->encrypt)
|
75
|
+
buf->ssl = &t->ssl;
|
76
|
+
#endif
|
36
77
|
}
|
37
78
|
|
38
|
-
|
79
|
+
#ifdef GIT_SSL
|
80
|
+
static int ssl_recv(gitno_ssl *ssl, void *data, size_t len)
|
39
81
|
{
|
40
82
|
int ret;
|
41
83
|
|
42
|
-
|
84
|
+
do {
|
85
|
+
ret = SSL_read(ssl->ssl, data, len);
|
86
|
+
} while (SSL_get_error(ssl->ssl, ret) == SSL_ERROR_WANT_READ);
|
87
|
+
|
43
88
|
if (ret < 0)
|
44
|
-
return
|
45
|
-
if (ret == 0) /* Orderly shutdown, so exit */
|
46
|
-
return GIT_SUCCESS;
|
89
|
+
return ssl_set_error(ssl, ret);
|
47
90
|
|
48
|
-
|
91
|
+
return ret;
|
92
|
+
}
|
93
|
+
#endif
|
94
|
+
|
95
|
+
int gitno_recv(gitno_buffer *buf)
|
96
|
+
{
|
97
|
+
int ret;
|
98
|
+
|
99
|
+
#ifdef GIT_SSL
|
100
|
+
if (buf->ssl != NULL) {
|
101
|
+
if ((ret = ssl_recv(buf->ssl, buf->data + buf->offset, buf->len - buf->offset)) < 0)
|
102
|
+
return -1;
|
103
|
+
} else {
|
104
|
+
ret = p_recv(buf->fd, buf->data + buf->offset, buf->len - buf->offset, 0);
|
105
|
+
if (ret < 0) {
|
106
|
+
net_set_error("Error receiving socket data");
|
107
|
+
return -1;
|
108
|
+
}
|
109
|
+
}
|
110
|
+
#else
|
111
|
+
ret = p_recv(buf->fd, buf->data + buf->offset, buf->len - buf->offset, 0);
|
112
|
+
if (ret < 0) {
|
113
|
+
net_set_error("Error receiving socket data");
|
114
|
+
return -1;
|
115
|
+
}
|
116
|
+
#endif
|
49
117
|
|
118
|
+
buf->offset += ret;
|
50
119
|
return ret;
|
51
120
|
}
|
52
121
|
|
@@ -73,71 +142,325 @@ void gitno_consume_n(gitno_buffer *buf, size_t cons)
|
|
73
142
|
buf->offset -= cons;
|
74
143
|
}
|
75
144
|
|
76
|
-
int
|
145
|
+
int gitno_ssl_teardown(git_transport *t)
|
146
|
+
{
|
147
|
+
#ifdef GIT_SSL
|
148
|
+
int ret;
|
149
|
+
#endif
|
150
|
+
|
151
|
+
if (!t->encrypt)
|
152
|
+
return 0;
|
153
|
+
|
154
|
+
#ifdef GIT_SSL
|
155
|
+
|
156
|
+
do {
|
157
|
+
ret = SSL_shutdown(t->ssl.ssl);
|
158
|
+
} while (ret == 0);
|
159
|
+
if (ret < 0)
|
160
|
+
return ssl_set_error(&t->ssl, ret);
|
161
|
+
|
162
|
+
SSL_free(t->ssl.ssl);
|
163
|
+
SSL_CTX_free(t->ssl.ctx);
|
164
|
+
#endif
|
165
|
+
return 0;
|
166
|
+
}
|
167
|
+
|
168
|
+
|
169
|
+
#ifdef GIT_SSL
|
170
|
+
/* Match host names according to RFC 2818 rules */
|
171
|
+
static int match_host(const char *pattern, const char *host)
|
172
|
+
{
|
173
|
+
for (;;) {
|
174
|
+
char c = tolower(*pattern++);
|
175
|
+
|
176
|
+
if (c == '\0')
|
177
|
+
return *host ? -1 : 0;
|
178
|
+
|
179
|
+
if (c == '*') {
|
180
|
+
c = *pattern;
|
181
|
+
/* '*' at the end matches everything left */
|
182
|
+
if (c == '\0')
|
183
|
+
return 0;
|
184
|
+
|
185
|
+
/*
|
186
|
+
* We've found a pattern, so move towards the next matching
|
187
|
+
* char. The '.' is handled specially because wildcards aren't
|
188
|
+
* allowed to cross subdomains.
|
189
|
+
*/
|
190
|
+
|
191
|
+
while(*host) {
|
192
|
+
char h = tolower(*host);
|
193
|
+
if (c == h)
|
194
|
+
return match_host(pattern, host++);
|
195
|
+
if (h == '.')
|
196
|
+
return match_host(pattern, host);
|
197
|
+
host++;
|
198
|
+
}
|
199
|
+
return -1;
|
200
|
+
}
|
201
|
+
|
202
|
+
if (c != tolower(*host++))
|
203
|
+
return -1;
|
204
|
+
}
|
205
|
+
|
206
|
+
return -1;
|
207
|
+
}
|
208
|
+
|
209
|
+
static int check_host_name(const char *name, const char *host)
|
210
|
+
{
|
211
|
+
if (!strcasecmp(name, host))
|
212
|
+
return 0;
|
213
|
+
|
214
|
+
if (match_host(name, host) < 0)
|
215
|
+
return -1;
|
216
|
+
|
217
|
+
return 0;
|
218
|
+
}
|
219
|
+
|
220
|
+
static int verify_server_cert(git_transport *t, const char *host)
|
221
|
+
{
|
222
|
+
X509 *cert;
|
223
|
+
X509_NAME *peer_name;
|
224
|
+
ASN1_STRING *str;
|
225
|
+
unsigned char *peer_cn = NULL;
|
226
|
+
int matched = -1, type = GEN_DNS;
|
227
|
+
GENERAL_NAMES *alts;
|
228
|
+
struct in6_addr addr6;
|
229
|
+
struct in_addr addr4;
|
230
|
+
void *addr;
|
231
|
+
int i = -1,j;
|
232
|
+
|
233
|
+
|
234
|
+
/* Try to parse the host as an IP address to see if it is */
|
235
|
+
if (inet_pton(AF_INET, host, &addr4)) {
|
236
|
+
type = GEN_IPADD;
|
237
|
+
addr = &addr4;
|
238
|
+
} else {
|
239
|
+
if(inet_pton(AF_INET6, host, &addr6)) {
|
240
|
+
type = GEN_IPADD;
|
241
|
+
addr = &addr6;
|
242
|
+
}
|
243
|
+
}
|
244
|
+
|
245
|
+
|
246
|
+
cert = SSL_get_peer_certificate(t->ssl.ssl);
|
247
|
+
|
248
|
+
/* Check the alternative names */
|
249
|
+
alts = X509_get_ext_d2i(cert, NID_subject_alt_name, NULL, NULL);
|
250
|
+
if (alts) {
|
251
|
+
int num;
|
252
|
+
|
253
|
+
num = sk_GENERAL_NAME_num(alts);
|
254
|
+
for (i = 0; i < num && matched != 1; i++) {
|
255
|
+
const GENERAL_NAME *gn = sk_GENERAL_NAME_value(alts, i);
|
256
|
+
const char *name = (char *) ASN1_STRING_data(gn->d.ia5);
|
257
|
+
size_t namelen = (size_t) ASN1_STRING_length(gn->d.ia5);
|
258
|
+
|
259
|
+
/* Skip any names of a type we're not looking for */
|
260
|
+
if (gn->type != type)
|
261
|
+
continue;
|
262
|
+
|
263
|
+
if (type == GEN_DNS) {
|
264
|
+
/* If it contains embedded NULs, don't even try */
|
265
|
+
if (memchr(name, '\0', namelen))
|
266
|
+
continue;
|
267
|
+
|
268
|
+
if (check_host_name(name, host) < 0)
|
269
|
+
matched = 0;
|
270
|
+
else
|
271
|
+
matched = 1;
|
272
|
+
} else if (type == GEN_IPADD) {
|
273
|
+
/* Here name isn't so much a name but a binary representation of the IP */
|
274
|
+
matched = !!memcmp(name, addr, namelen);
|
275
|
+
}
|
276
|
+
}
|
277
|
+
}
|
278
|
+
GENERAL_NAMES_free(alts);
|
279
|
+
|
280
|
+
if (matched == 0)
|
281
|
+
goto on_error;
|
282
|
+
|
283
|
+
if (matched == 1)
|
284
|
+
return 0;
|
285
|
+
|
286
|
+
/* If no alternative names are available, check the common name */
|
287
|
+
peer_name = X509_get_subject_name(cert);
|
288
|
+
if (peer_name == NULL)
|
289
|
+
goto on_error;
|
290
|
+
|
291
|
+
if (peer_name) {
|
292
|
+
/* Get the index of the last CN entry */
|
293
|
+
while ((j = X509_NAME_get_index_by_NID(peer_name, NID_commonName, i)) >= 0)
|
294
|
+
i = j;
|
295
|
+
}
|
296
|
+
|
297
|
+
if (i < 0)
|
298
|
+
goto on_error;
|
299
|
+
|
300
|
+
str = X509_NAME_ENTRY_get_data(X509_NAME_get_entry(peer_name, i));
|
301
|
+
if (str == NULL)
|
302
|
+
goto on_error;
|
303
|
+
|
304
|
+
/* Work around a bug in OpenSSL whereby ASN1_STRING_to_UTF8 fails if it's already in utf-8 */
|
305
|
+
if (ASN1_STRING_type(str) == V_ASN1_UTF8STRING) {
|
306
|
+
int size = ASN1_STRING_length(str);
|
307
|
+
|
308
|
+
if (size > 0) {
|
309
|
+
peer_cn = OPENSSL_malloc(size + 1);
|
310
|
+
GITERR_CHECK_ALLOC(peer_cn);
|
311
|
+
memcpy(peer_cn, ASN1_STRING_data(str), size);
|
312
|
+
peer_cn[size] = '\0';
|
313
|
+
}
|
314
|
+
} else {
|
315
|
+
int size = ASN1_STRING_to_UTF8(&peer_cn, str);
|
316
|
+
GITERR_CHECK_ALLOC(peer_cn);
|
317
|
+
if (memchr(peer_cn, '\0', size))
|
318
|
+
goto cert_fail;
|
319
|
+
}
|
320
|
+
|
321
|
+
if (check_host_name((char *)peer_cn, host) < 0)
|
322
|
+
goto cert_fail;
|
323
|
+
|
324
|
+
OPENSSL_free(peer_cn);
|
325
|
+
|
326
|
+
return 0;
|
327
|
+
|
328
|
+
on_error:
|
329
|
+
OPENSSL_free(peer_cn);
|
330
|
+
return ssl_set_error(&t->ssl, 0);
|
331
|
+
|
332
|
+
cert_fail:
|
333
|
+
OPENSSL_free(peer_cn);
|
334
|
+
giterr_set(GITERR_SSL, "Certificate host name check failed");
|
335
|
+
return -1;
|
336
|
+
}
|
337
|
+
|
338
|
+
static int ssl_setup(git_transport *t, const char *host)
|
339
|
+
{
|
340
|
+
int ret;
|
341
|
+
|
342
|
+
SSL_library_init();
|
343
|
+
SSL_load_error_strings();
|
344
|
+
t->ssl.ctx = SSL_CTX_new(SSLv23_method());
|
345
|
+
if (t->ssl.ctx == NULL)
|
346
|
+
return ssl_set_error(&t->ssl, 0);
|
347
|
+
|
348
|
+
SSL_CTX_set_mode(t->ssl.ctx, SSL_MODE_AUTO_RETRY);
|
349
|
+
SSL_CTX_set_verify(t->ssl.ctx, SSL_VERIFY_PEER, NULL);
|
350
|
+
if (!SSL_CTX_set_default_verify_paths(t->ssl.ctx))
|
351
|
+
return ssl_set_error(&t->ssl, 0);
|
352
|
+
|
353
|
+
t->ssl.ssl = SSL_new(t->ssl.ctx);
|
354
|
+
if (t->ssl.ssl == NULL)
|
355
|
+
return ssl_set_error(&t->ssl, 0);
|
356
|
+
|
357
|
+
if((ret = SSL_set_fd(t->ssl.ssl, t->socket)) == 0)
|
358
|
+
return ssl_set_error(&t->ssl, ret);
|
359
|
+
|
360
|
+
if ((ret = SSL_connect(t->ssl.ssl)) <= 0)
|
361
|
+
return ssl_set_error(&t->ssl, ret);
|
362
|
+
|
363
|
+
if (t->check_cert && verify_server_cert(t, host) < 0)
|
364
|
+
return -1;
|
365
|
+
|
366
|
+
return 0;
|
367
|
+
}
|
368
|
+
#else
|
369
|
+
static int ssl_setup(git_transport *t, const char *host)
|
370
|
+
{
|
371
|
+
GIT_UNUSED(t);
|
372
|
+
GIT_UNUSED(host);
|
373
|
+
return 0;
|
374
|
+
}
|
375
|
+
#endif
|
376
|
+
|
377
|
+
int gitno_connect(git_transport *t, const char *host, const char *port)
|
77
378
|
{
|
78
|
-
struct addrinfo *info, *p;
|
379
|
+
struct addrinfo *info = NULL, *p;
|
79
380
|
struct addrinfo hints;
|
80
|
-
int ret
|
81
|
-
GIT_SOCKET s;
|
381
|
+
int ret;
|
382
|
+
GIT_SOCKET s = INVALID_SOCKET;
|
82
383
|
|
83
384
|
memset(&hints, 0x0, sizeof(struct addrinfo));
|
84
385
|
hints.ai_family = AF_UNSPEC;
|
85
386
|
hints.ai_socktype = SOCK_STREAM;
|
86
387
|
|
87
|
-
ret = getaddrinfo(host, port, &hints, &info)
|
88
|
-
|
89
|
-
|
90
|
-
info = NULL;
|
91
|
-
goto cleanup;
|
388
|
+
if ((ret = getaddrinfo(host, port, &hints, &info)) < 0) {
|
389
|
+
giterr_set(GITERR_NET, "Failed to resolve address for %s: %s", host, gai_strerror(ret));
|
390
|
+
return -1;
|
92
391
|
}
|
93
392
|
|
94
393
|
for (p = info; p != NULL; p = p->ai_next) {
|
95
394
|
s = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
|
96
|
-
#ifdef GIT_WIN32
|
97
395
|
if (s == INVALID_SOCKET) {
|
98
|
-
|
99
|
-
|
100
|
-
#endif
|
101
|
-
error = GIT_EOSERR;
|
102
|
-
goto cleanup;
|
396
|
+
net_set_error("error creating socket");
|
397
|
+
break;
|
103
398
|
}
|
104
399
|
|
105
|
-
|
106
|
-
|
107
|
-
if (ret < 0) {
|
108
|
-
continue;
|
109
|
-
}
|
400
|
+
if (connect(s, p->ai_addr, (socklen_t)p->ai_addrlen) == 0)
|
401
|
+
break;
|
110
402
|
|
111
|
-
/*
|
112
|
-
|
113
|
-
|
403
|
+
/* If we can't connect, try the next one */
|
404
|
+
gitno_close(s);
|
405
|
+
s = INVALID_SOCKET;
|
114
406
|
}
|
115
407
|
|
116
408
|
/* Oops, we couldn't connect to any address */
|
117
|
-
|
409
|
+
if (s == INVALID_SOCKET && p == NULL) {
|
410
|
+
giterr_set(GITERR_OS, "Failed to connect to %s", host);
|
411
|
+
return -1;
|
412
|
+
}
|
118
413
|
|
119
|
-
|
414
|
+
t->socket = s;
|
120
415
|
freeaddrinfo(info);
|
121
|
-
|
416
|
+
|
417
|
+
if (t->encrypt && ssl_setup(t, host) < 0)
|
418
|
+
return -1;
|
419
|
+
|
420
|
+
return 0;
|
122
421
|
}
|
123
422
|
|
124
|
-
|
423
|
+
#ifdef GIT_SSL
|
424
|
+
static int send_ssl(gitno_ssl *ssl, const char *msg, size_t len)
|
125
425
|
{
|
126
426
|
int ret;
|
127
427
|
size_t off = 0;
|
128
428
|
|
129
429
|
while (off < len) {
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
if (ret < 0)
|
134
|
-
return git__throw(GIT_EOSERR, "Error sending data: %s", strerror(errno));
|
430
|
+
ret = SSL_write(ssl->ssl, msg + off, len - off);
|
431
|
+
if (ret <= 0)
|
432
|
+
return ssl_set_error(ssl, ret);
|
135
433
|
|
136
434
|
off += ret;
|
137
435
|
}
|
138
436
|
|
139
437
|
return off;
|
140
438
|
}
|
439
|
+
#endif
|
440
|
+
|
441
|
+
int gitno_send(git_transport *t, const char *msg, size_t len, int flags)
|
442
|
+
{
|
443
|
+
int ret;
|
444
|
+
size_t off = 0;
|
445
|
+
|
446
|
+
#ifdef GIT_SSL
|
447
|
+
if (t->encrypt)
|
448
|
+
return send_ssl(&t->ssl, msg, len);
|
449
|
+
#endif
|
450
|
+
|
451
|
+
while (off < len) {
|
452
|
+
errno = 0;
|
453
|
+
ret = p_send(t->socket, msg + off, len - off, flags);
|
454
|
+
if (ret < 0) {
|
455
|
+
net_set_error("Error sending data");
|
456
|
+
return -1;
|
457
|
+
}
|
458
|
+
|
459
|
+
off += ret;
|
460
|
+
}
|
461
|
+
|
462
|
+
return (int)off;
|
463
|
+
}
|
141
464
|
|
142
465
|
|
143
466
|
#ifdef GIT_WIN32
|
@@ -164,35 +487,31 @@ int gitno_select_in(gitno_buffer *buf, long int sec, long int usec)
|
|
164
487
|
FD_SET(buf->fd, &fds);
|
165
488
|
|
166
489
|
/* The select(2) interface is silly */
|
167
|
-
return select(buf->fd + 1, &fds, NULL, NULL, &tv);
|
490
|
+
return select((int)buf->fd + 1, &fds, NULL, NULL, &tv);
|
168
491
|
}
|
169
492
|
|
170
493
|
int gitno_extract_host_and_port(char **host, char **port, const char *url, const char *default_port)
|
171
494
|
{
|
172
495
|
char *colon, *slash, *delim;
|
173
|
-
int error = GIT_SUCCESS;
|
174
496
|
|
175
497
|
colon = strchr(url, ':');
|
176
498
|
slash = strchr(url, '/');
|
177
499
|
|
178
|
-
if (slash == NULL)
|
179
|
-
|
500
|
+
if (slash == NULL) {
|
501
|
+
giterr_set(GITERR_NET, "Malformed URL: missing /");
|
502
|
+
return -1;
|
503
|
+
}
|
180
504
|
|
181
505
|
if (colon == NULL) {
|
182
506
|
*port = git__strdup(default_port);
|
183
507
|
} else {
|
184
508
|
*port = git__strndup(colon + 1, slash - colon - 1);
|
185
509
|
}
|
186
|
-
|
187
|
-
return GIT_ENOMEM;;
|
188
|
-
|
510
|
+
GITERR_CHECK_ALLOC(*port);
|
189
511
|
|
190
512
|
delim = colon == NULL ? slash : colon;
|
191
513
|
*host = git__strndup(url, delim - url);
|
192
|
-
|
193
|
-
git__free(*port);
|
194
|
-
error = GIT_ENOMEM;
|
195
|
-
}
|
514
|
+
GITERR_CHECK_ALLOC(*host);
|
196
515
|
|
197
|
-
return
|
516
|
+
return 0;
|
198
517
|
}
|