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.
|
@@ -14,13 +14,46 @@
|
|
14
14
|
|
15
15
|
static const size_t WRITE_BUFFER_SIZE = (4096 * 2);
|
16
16
|
|
17
|
+
enum buferr_t {
|
18
|
+
BUFERR_OK = 0,
|
19
|
+
BUFERR_WRITE,
|
20
|
+
BUFERR_ZLIB,
|
21
|
+
BUFERR_MEM
|
22
|
+
};
|
23
|
+
|
24
|
+
#define ENSURE_BUF_OK(buf) if ((buf)->last_error != BUFERR_OK) { return -1; }
|
25
|
+
|
26
|
+
static int verify_last_error(git_filebuf *file)
|
27
|
+
{
|
28
|
+
switch (file->last_error) {
|
29
|
+
case BUFERR_WRITE:
|
30
|
+
giterr_set(GITERR_OS, "Failed to write out file");
|
31
|
+
return -1;
|
32
|
+
|
33
|
+
case BUFERR_MEM:
|
34
|
+
giterr_set_oom();
|
35
|
+
return -1;
|
36
|
+
|
37
|
+
case BUFERR_ZLIB:
|
38
|
+
giterr_set(GITERR_ZLIB,
|
39
|
+
"Buffer error when writing out ZLib data");
|
40
|
+
return -1;
|
41
|
+
|
42
|
+
default:
|
43
|
+
return 0;
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
17
47
|
static int lock_file(git_filebuf *file, int flags)
|
18
48
|
{
|
19
|
-
if (
|
49
|
+
if (git_path_exists(file->path_lock) == true) {
|
20
50
|
if (flags & GIT_FILEBUF_FORCE)
|
21
51
|
p_unlink(file->path_lock);
|
22
|
-
else
|
23
|
-
|
52
|
+
else {
|
53
|
+
giterr_set(GITERR_OS,
|
54
|
+
"Failed to lock file '%s' for writing", file->path_lock);
|
55
|
+
return -1;
|
56
|
+
}
|
24
57
|
}
|
25
58
|
|
26
59
|
/* create path to the file buffer is required */
|
@@ -32,16 +65,22 @@ static int lock_file(git_filebuf *file, int flags)
|
|
32
65
|
}
|
33
66
|
|
34
67
|
if (file->fd < 0)
|
35
|
-
return
|
68
|
+
return -1;
|
69
|
+
|
70
|
+
file->fd_is_open = true;
|
36
71
|
|
37
|
-
if ((flags & GIT_FILEBUF_APPEND) &&
|
72
|
+
if ((flags & GIT_FILEBUF_APPEND) && git_path_exists(file->path_original) == true) {
|
38
73
|
git_file source;
|
39
74
|
char buffer[2048];
|
40
75
|
size_t read_bytes;
|
41
76
|
|
42
77
|
source = p_open(file->path_original, O_RDONLY);
|
43
|
-
if (source < 0)
|
44
|
-
|
78
|
+
if (source < 0) {
|
79
|
+
giterr_set(GITERR_OS,
|
80
|
+
"Failed to open file '%s' for reading",
|
81
|
+
file->path_original);
|
82
|
+
return -1;
|
83
|
+
}
|
45
84
|
|
46
85
|
while ((read_bytes = p_read(source, buffer, 2048)) > 0) {
|
47
86
|
p_write(file->fd, buffer, read_bytes);
|
@@ -52,15 +91,15 @@ static int lock_file(git_filebuf *file, int flags)
|
|
52
91
|
p_close(source);
|
53
92
|
}
|
54
93
|
|
55
|
-
return
|
94
|
+
return 0;
|
56
95
|
}
|
57
96
|
|
58
97
|
void git_filebuf_cleanup(git_filebuf *file)
|
59
98
|
{
|
60
|
-
if (file->fd >= 0)
|
99
|
+
if (file->fd_is_open && file->fd >= 0)
|
61
100
|
p_close(file->fd);
|
62
101
|
|
63
|
-
if (file->
|
102
|
+
if (file->fd_is_open && file->path_lock && git_path_exists(file->path_lock))
|
64
103
|
p_unlink(file->path_lock);
|
65
104
|
|
66
105
|
if (file->digest)
|
@@ -91,22 +130,28 @@ GIT_INLINE(int) flush_buffer(git_filebuf *file)
|
|
91
130
|
return result;
|
92
131
|
}
|
93
132
|
|
94
|
-
|
133
|
+
int git_filebuf_flush(git_filebuf *file)
|
95
134
|
{
|
96
|
-
|
135
|
+
return flush_buffer(file);
|
136
|
+
}
|
97
137
|
|
138
|
+
static int write_normal(git_filebuf *file, void *source, size_t len)
|
139
|
+
{
|
98
140
|
if (len > 0) {
|
99
|
-
|
141
|
+
if (p_write(file->fd, (void *)source, len) < 0) {
|
142
|
+
file->last_error = BUFERR_WRITE;
|
143
|
+
return -1;
|
144
|
+
}
|
145
|
+
|
100
146
|
if (file->digest)
|
101
147
|
git_hash_update(file->digest, source, len);
|
102
148
|
}
|
103
149
|
|
104
|
-
return
|
150
|
+
return 0;
|
105
151
|
}
|
106
152
|
|
107
153
|
static int write_deflate(git_filebuf *file, void *source, size_t len)
|
108
154
|
{
|
109
|
-
int result = Z_OK;
|
110
155
|
z_stream *zs = &file->zs;
|
111
156
|
|
112
157
|
if (len > 0 || file->flush_mode == Z_FINISH) {
|
@@ -119,14 +164,17 @@ static int write_deflate(git_filebuf *file, void *source, size_t len)
|
|
119
164
|
zs->next_out = file->z_buf;
|
120
165
|
zs->avail_out = (uInt)file->buf_size;
|
121
166
|
|
122
|
-
|
123
|
-
|
124
|
-
return
|
167
|
+
if (deflate(zs, file->flush_mode) == Z_STREAM_ERROR) {
|
168
|
+
file->last_error = BUFERR_ZLIB;
|
169
|
+
return -1;
|
170
|
+
}
|
125
171
|
|
126
172
|
have = file->buf_size - (size_t)zs->avail_out;
|
127
173
|
|
128
|
-
if (p_write(file->fd, file->z_buf, have) <
|
129
|
-
|
174
|
+
if (p_write(file->fd, file->z_buf, have) < 0) {
|
175
|
+
file->last_error = BUFERR_WRITE;
|
176
|
+
return -1;
|
177
|
+
}
|
130
178
|
|
131
179
|
} while (zs->avail_out == 0);
|
132
180
|
|
@@ -136,38 +184,39 @@ static int write_deflate(git_filebuf *file, void *source, size_t len)
|
|
136
184
|
git_hash_update(file->digest, source, len);
|
137
185
|
}
|
138
186
|
|
139
|
-
return
|
187
|
+
return 0;
|
140
188
|
}
|
141
189
|
|
142
190
|
int git_filebuf_open(git_filebuf *file, const char *path, int flags)
|
143
191
|
{
|
144
|
-
int
|
192
|
+
int compression;
|
145
193
|
size_t path_len;
|
146
194
|
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
195
|
+
/* opening an already open buffer is a programming error;
|
196
|
+
* assert that this never happens instead of returning
|
197
|
+
* an error code */
|
198
|
+
assert(file && path && file->buffer == NULL);
|
151
199
|
|
152
200
|
memset(file, 0x0, sizeof(git_filebuf));
|
153
201
|
|
202
|
+
if (flags & GIT_FILEBUF_DO_NOT_BUFFER)
|
203
|
+
file->do_not_buffer = true;
|
204
|
+
|
154
205
|
file->buf_size = WRITE_BUFFER_SIZE;
|
155
206
|
file->buf_pos = 0;
|
156
207
|
file->fd = -1;
|
208
|
+
file->last_error = BUFERR_OK;
|
157
209
|
|
158
210
|
/* Allocate the main cache buffer */
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
goto cleanup;
|
211
|
+
if (!file->do_not_buffer) {
|
212
|
+
file->buffer = git__malloc(file->buf_size);
|
213
|
+
GITERR_CHECK_ALLOC(file->buffer);
|
163
214
|
}
|
164
215
|
|
165
216
|
/* If we are hashing on-write, allocate a new hash context */
|
166
217
|
if (flags & GIT_FILEBUF_HASH_CONTENTS) {
|
167
|
-
|
168
|
-
|
169
|
-
goto cleanup;
|
170
|
-
}
|
218
|
+
file->digest = git_hash_new_ctx();
|
219
|
+
GITERR_CHECK_ALLOC(file->digest);
|
171
220
|
}
|
172
221
|
|
173
222
|
compression = flags >> GIT_FILEBUF_DEFLATE_SHIFT;
|
@@ -176,16 +225,13 @@ int git_filebuf_open(git_filebuf *file, const char *path, int flags)
|
|
176
225
|
if (compression != 0) {
|
177
226
|
/* Initialize the ZLib stream */
|
178
227
|
if (deflateInit(&file->zs, compression) != Z_OK) {
|
179
|
-
|
228
|
+
giterr_set(GITERR_ZLIB, "Failed to initialize zlib");
|
180
229
|
goto cleanup;
|
181
230
|
}
|
182
231
|
|
183
232
|
/* Allocate the Zlib cache buffer */
|
184
233
|
file->z_buf = git__malloc(file->buf_size);
|
185
|
-
|
186
|
-
error = GIT_ENOMEM;
|
187
|
-
goto cleanup;
|
188
|
-
}
|
234
|
+
GITERR_CHECK_ALLOC(file->z_buf);
|
189
235
|
|
190
236
|
/* Never flush */
|
191
237
|
file->flush_mode = Z_NO_FLUSH;
|
@@ -196,107 +242,105 @@ int git_filebuf_open(git_filebuf *file, const char *path, int flags)
|
|
196
242
|
|
197
243
|
/* If we are writing to a temp file */
|
198
244
|
if (flags & GIT_FILEBUF_TEMPORARY) {
|
199
|
-
|
245
|
+
git_buf tmp_path = GIT_BUF_INIT;
|
200
246
|
|
201
247
|
/* Open the file as temporary for locking */
|
202
|
-
file->fd = git_futils_mktmp(tmp_path, path);
|
248
|
+
file->fd = git_futils_mktmp(&tmp_path, path);
|
249
|
+
|
203
250
|
if (file->fd < 0) {
|
204
|
-
|
251
|
+
git_buf_free(&tmp_path);
|
205
252
|
goto cleanup;
|
206
253
|
}
|
254
|
+
file->fd_is_open = true;
|
207
255
|
|
208
256
|
/* No original path */
|
209
257
|
file->path_original = NULL;
|
210
|
-
file->path_lock =
|
211
|
-
|
212
|
-
if (file->path_lock == NULL) {
|
213
|
-
error = GIT_ENOMEM;
|
214
|
-
goto cleanup;
|
215
|
-
}
|
258
|
+
file->path_lock = git_buf_detach(&tmp_path);
|
259
|
+
GITERR_CHECK_ALLOC(file->path_lock);
|
216
260
|
} else {
|
217
261
|
path_len = strlen(path);
|
218
262
|
|
219
263
|
/* Save the original path of the file */
|
220
264
|
file->path_original = git__strdup(path);
|
221
|
-
|
222
|
-
error = GIT_ENOMEM;
|
223
|
-
goto cleanup;
|
224
|
-
}
|
265
|
+
GITERR_CHECK_ALLOC(file->path_original);
|
225
266
|
|
226
267
|
/* create the locking path by appending ".lock" to the original */
|
227
268
|
file->path_lock = git__malloc(path_len + GIT_FILELOCK_EXTLENGTH);
|
228
|
-
|
229
|
-
error = GIT_ENOMEM;
|
230
|
-
goto cleanup;
|
231
|
-
}
|
269
|
+
GITERR_CHECK_ALLOC(file->path_lock);
|
232
270
|
|
233
271
|
memcpy(file->path_lock, file->path_original, path_len);
|
234
272
|
memcpy(file->path_lock + path_len, GIT_FILELOCK_EXTENSION, GIT_FILELOCK_EXTLENGTH);
|
235
273
|
|
236
274
|
/* open the file for locking */
|
237
|
-
if (
|
275
|
+
if (lock_file(file, flags) < 0)
|
238
276
|
goto cleanup;
|
239
277
|
}
|
240
278
|
|
241
|
-
return
|
279
|
+
return 0;
|
242
280
|
|
243
281
|
cleanup:
|
244
282
|
git_filebuf_cleanup(file);
|
245
|
-
return
|
283
|
+
return -1;
|
246
284
|
}
|
247
285
|
|
248
286
|
int git_filebuf_hash(git_oid *oid, git_filebuf *file)
|
249
287
|
{
|
250
|
-
int error;
|
251
|
-
|
252
288
|
assert(oid && file && file->digest);
|
253
289
|
|
254
|
-
|
255
|
-
|
290
|
+
flush_buffer(file);
|
291
|
+
|
292
|
+
if (verify_last_error(file) < 0)
|
293
|
+
return -1;
|
256
294
|
|
257
295
|
git_hash_final(oid, file->digest);
|
258
296
|
git_hash_free_ctx(file->digest);
|
259
297
|
file->digest = NULL;
|
260
298
|
|
261
|
-
return
|
299
|
+
return 0;
|
262
300
|
}
|
263
301
|
|
264
302
|
int git_filebuf_commit_at(git_filebuf *file, const char *path, mode_t mode)
|
265
303
|
{
|
266
304
|
git__free(file->path_original);
|
267
305
|
file->path_original = git__strdup(path);
|
268
|
-
|
269
|
-
return GIT_ENOMEM;
|
306
|
+
GITERR_CHECK_ALLOC(file->path_original);
|
270
307
|
|
271
308
|
return git_filebuf_commit(file, mode);
|
272
309
|
}
|
273
310
|
|
274
311
|
int git_filebuf_commit(git_filebuf *file, mode_t mode)
|
275
312
|
{
|
276
|
-
int error;
|
277
|
-
|
278
313
|
/* temporary files cannot be committed */
|
279
314
|
assert(file && file->path_original);
|
280
315
|
|
281
316
|
file->flush_mode = Z_FINISH;
|
282
|
-
|
283
|
-
|
317
|
+
flush_buffer(file);
|
318
|
+
|
319
|
+
if (verify_last_error(file) < 0)
|
320
|
+
goto on_error;
|
284
321
|
|
285
322
|
p_close(file->fd);
|
286
323
|
file->fd = -1;
|
324
|
+
file->fd_is_open = false;
|
287
325
|
|
288
326
|
if (p_chmod(file->path_lock, mode)) {
|
289
|
-
|
290
|
-
goto
|
327
|
+
giterr_set(GITERR_OS, "Failed to set attributes for file at '%s'", file->path_lock);
|
328
|
+
goto on_error;
|
291
329
|
}
|
292
330
|
|
293
|
-
|
331
|
+
p_unlink(file->path_original);
|
294
332
|
|
295
|
-
|
333
|
+
if (p_rename(file->path_lock, file->path_original) < 0) {
|
334
|
+
giterr_set(GITERR_OS, "Failed to rename lockfile to '%s'", file->path_original);
|
335
|
+
goto on_error;
|
336
|
+
}
|
337
|
+
|
338
|
+
git_filebuf_cleanup(file);
|
339
|
+
return 0;
|
340
|
+
|
341
|
+
on_error:
|
296
342
|
git_filebuf_cleanup(file);
|
297
|
-
|
298
|
-
return git__rethrow(error, "Failed to commit locked file from buffer");
|
299
|
-
return GIT_SUCCESS;
|
343
|
+
return -1;
|
300
344
|
}
|
301
345
|
|
302
346
|
GIT_INLINE(void) add_to_cache(git_filebuf *file, const void *buf, size_t len)
|
@@ -307,22 +351,25 @@ GIT_INLINE(void) add_to_cache(git_filebuf *file, const void *buf, size_t len)
|
|
307
351
|
|
308
352
|
int git_filebuf_write(git_filebuf *file, const void *buff, size_t len)
|
309
353
|
{
|
310
|
-
int error;
|
311
354
|
const unsigned char *buf = buff;
|
312
355
|
|
356
|
+
ENSURE_BUF_OK(file);
|
357
|
+
|
358
|
+
if (file->do_not_buffer)
|
359
|
+
return file->write(file, (void *)buff, len);
|
360
|
+
|
313
361
|
for (;;) {
|
314
362
|
size_t space_left = file->buf_size - file->buf_pos;
|
315
363
|
|
316
364
|
/* cache if it's small */
|
317
365
|
if (space_left > len) {
|
318
366
|
add_to_cache(file, buf, len);
|
319
|
-
return
|
367
|
+
return 0;
|
320
368
|
}
|
321
369
|
|
322
370
|
add_to_cache(file, buf, space_left);
|
323
|
-
|
324
|
-
|
325
|
-
return git__rethrow(error, "Failed to write to buffer");
|
371
|
+
if (flush_buffer(file) < 0)
|
372
|
+
return -1;
|
326
373
|
|
327
374
|
len -= space_left;
|
328
375
|
buf += space_left;
|
@@ -331,32 +378,37 @@ int git_filebuf_write(git_filebuf *file, const void *buff, size_t len)
|
|
331
378
|
|
332
379
|
int git_filebuf_reserve(git_filebuf *file, void **buffer, size_t len)
|
333
380
|
{
|
334
|
-
int error;
|
335
381
|
size_t space_left = file->buf_size - file->buf_pos;
|
336
382
|
|
337
383
|
*buffer = NULL;
|
338
384
|
|
339
|
-
|
340
|
-
|
385
|
+
ENSURE_BUF_OK(file);
|
386
|
+
|
387
|
+
if (len > file->buf_size) {
|
388
|
+
file->last_error = BUFERR_MEM;
|
389
|
+
return -1;
|
390
|
+
}
|
341
391
|
|
342
392
|
if (space_left <= len) {
|
343
|
-
if (
|
344
|
-
return
|
393
|
+
if (flush_buffer(file) < 0)
|
394
|
+
return -1;
|
345
395
|
}
|
346
396
|
|
347
397
|
*buffer = (file->buffer + file->buf_pos);
|
348
398
|
file->buf_pos += len;
|
349
399
|
|
350
|
-
return
|
400
|
+
return 0;
|
351
401
|
}
|
352
402
|
|
353
403
|
int git_filebuf_printf(git_filebuf *file, const char *format, ...)
|
354
404
|
{
|
355
405
|
va_list arglist;
|
356
406
|
size_t space_left;
|
357
|
-
int len,
|
407
|
+
int len, res;
|
358
408
|
char *tmp_buffer;
|
359
409
|
|
410
|
+
ENSURE_BUF_OK(file);
|
411
|
+
|
360
412
|
space_left = file->buf_size - file->buf_pos;
|
361
413
|
|
362
414
|
do {
|
@@ -364,24 +416,28 @@ int git_filebuf_printf(git_filebuf *file, const char *format, ...)
|
|
364
416
|
len = p_vsnprintf((char *)file->buffer + file->buf_pos, space_left, format, arglist);
|
365
417
|
va_end(arglist);
|
366
418
|
|
367
|
-
if (len < 0)
|
368
|
-
|
419
|
+
if (len < 0) {
|
420
|
+
file->last_error = BUFERR_MEM;
|
421
|
+
return -1;
|
422
|
+
}
|
369
423
|
|
370
424
|
if ((size_t)len + 1 <= space_left) {
|
371
425
|
file->buf_pos += len;
|
372
|
-
return
|
426
|
+
return 0;
|
373
427
|
}
|
374
428
|
|
375
|
-
if (
|
376
|
-
return
|
429
|
+
if (flush_buffer(file) < 0)
|
430
|
+
return -1;
|
377
431
|
|
378
432
|
space_left = file->buf_size - file->buf_pos;
|
379
433
|
|
380
434
|
} while ((size_t)len + 1 <= space_left);
|
381
435
|
|
382
436
|
tmp_buffer = git__malloc(len + 1);
|
383
|
-
if (!tmp_buffer)
|
384
|
-
|
437
|
+
if (!tmp_buffer) {
|
438
|
+
file->last_error = BUFERR_MEM;
|
439
|
+
return -1;
|
440
|
+
}
|
385
441
|
|
386
442
|
va_start(arglist, format);
|
387
443
|
len = p_vsnprintf(tmp_buffer, len + 1, format, arglist);
|
@@ -389,12 +445,13 @@ int git_filebuf_printf(git_filebuf *file, const char *format, ...)
|
|
389
445
|
|
390
446
|
if (len < 0) {
|
391
447
|
git__free(tmp_buffer);
|
392
|
-
|
448
|
+
file->last_error = BUFERR_MEM;
|
449
|
+
return -1;
|
393
450
|
}
|
394
451
|
|
395
|
-
|
452
|
+
res = git_filebuf_write(file, tmp_buffer, len);
|
396
453
|
git__free(tmp_buffer);
|
397
454
|
|
398
|
-
return
|
455
|
+
return res;
|
399
456
|
}
|
400
457
|
|
@@ -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.
|
@@ -9,7 +9,7 @@
|
|
9
9
|
|
10
10
|
#include "fileops.h"
|
11
11
|
#include "hash.h"
|
12
|
-
#include
|
12
|
+
#include <zlib.h>
|
13
13
|
|
14
14
|
#ifdef GIT_THREADS
|
15
15
|
# define GIT_FILEBUF_THREADS
|
@@ -19,7 +19,8 @@
|
|
19
19
|
#define GIT_FILEBUF_APPEND (1 << 2)
|
20
20
|
#define GIT_FILEBUF_FORCE (1 << 3)
|
21
21
|
#define GIT_FILEBUF_TEMPORARY (1 << 4)
|
22
|
-
#define
|
22
|
+
#define GIT_FILEBUF_DO_NOT_BUFFER (1 << 5)
|
23
|
+
#define GIT_FILEBUF_DEFLATE_SHIFT (6)
|
23
24
|
|
24
25
|
#define GIT_FILELOCK_EXTENSION ".lock\0"
|
25
26
|
#define GIT_FILELOCK_EXTLENGTH 6
|
@@ -40,25 +41,37 @@ struct git_filebuf {
|
|
40
41
|
|
41
42
|
size_t buf_size, buf_pos;
|
42
43
|
git_file fd;
|
44
|
+
bool fd_is_open;
|
45
|
+
bool do_not_buffer;
|
46
|
+
int last_error;
|
43
47
|
};
|
44
48
|
|
45
49
|
typedef struct git_filebuf git_filebuf;
|
46
50
|
|
47
51
|
#define GIT_FILEBUF_INIT {0}
|
48
52
|
|
49
|
-
/*
|
53
|
+
/*
|
54
|
+
* The git_filebuf object lifecycle is:
|
50
55
|
* - Allocate git_filebuf, preferably using GIT_FILEBUF_INIT.
|
56
|
+
*
|
51
57
|
* - Call git_filebuf_open() to initialize the filebuf for use.
|
58
|
+
*
|
52
59
|
* - Make as many calls to git_filebuf_write(), git_filebuf_printf(),
|
53
|
-
* git_filebuf_reserve() as you like.
|
60
|
+
* git_filebuf_reserve() as you like. The error codes for these
|
61
|
+
* functions don't need to be checked. They are stored internally
|
62
|
+
* by the file buffer.
|
63
|
+
*
|
54
64
|
* - While you are writing, you may call git_filebuf_hash() to get
|
55
|
-
* the hash of all you have written so far.
|
65
|
+
* the hash of all you have written so far. This function will
|
66
|
+
* fail if any of the previous writes to the buffer failed.
|
67
|
+
*
|
56
68
|
* - To close the git_filebuf, you may call git_filebuf_commit() or
|
57
69
|
* git_filebuf_commit_at() to save the file, or
|
58
70
|
* git_filebuf_cleanup() to abandon the file. All of these will
|
59
|
-
*
|
71
|
+
* free the git_filebuf object. Likewise, all of these will fail
|
72
|
+
* if any of the previous writes to the buffer failed, and set
|
73
|
+
* an error code accordingly.
|
60
74
|
*/
|
61
|
-
|
62
75
|
int git_filebuf_write(git_filebuf *lock, const void *buff, size_t len);
|
63
76
|
int git_filebuf_reserve(git_filebuf *file, void **buff, size_t len);
|
64
77
|
int git_filebuf_printf(git_filebuf *file, const char *format, ...) GIT_FORMAT_PRINTF(2, 3);
|
@@ -68,5 +81,6 @@ int git_filebuf_commit(git_filebuf *lock, mode_t mode);
|
|
68
81
|
int git_filebuf_commit_at(git_filebuf *lock, const char *path, mode_t mode);
|
69
82
|
void git_filebuf_cleanup(git_filebuf *lock);
|
70
83
|
int git_filebuf_hash(git_oid *oid, git_filebuf *file);
|
84
|
+
int git_filebuf_flush(git_filebuf *file);
|
71
85
|
|
72
86
|
#endif
|