rugged 0.26.7 → 0.27.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.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/ext/rugged/rugged_blame.c +6 -3
- data/ext/rugged/rugged_branch_collection.c +3 -6
- data/ext/rugged/rugged_commit.c +56 -0
- data/ext/rugged/rugged_config.c +44 -9
- data/ext/rugged/rugged_diff.c +3 -14
- data/ext/rugged/rugged_diff_hunk.c +1 -3
- data/ext/rugged/rugged_index.c +1 -5
- data/ext/rugged/rugged_note.c +1 -4
- data/ext/rugged/rugged_patch.c +1 -4
- data/ext/rugged/rugged_reference_collection.c +1 -7
- data/ext/rugged/rugged_remote.c +5 -8
- data/ext/rugged/rugged_remote_collection.c +1 -6
- data/ext/rugged/rugged_repo.c +16 -48
- data/ext/rugged/rugged_revwalk.c +7 -16
- data/ext/rugged/rugged_settings.c +28 -0
- data/ext/rugged/rugged_submodule_collection.c +3 -4
- data/ext/rugged/rugged_tag_collection.c +1 -5
- data/ext/rugged/rugged_tree.c +2 -3
- data/lib/rugged/repository.rb +43 -0
- data/lib/rugged/version.rb +1 -1
- data/vendor/libgit2/AUTHORS +1 -0
- data/vendor/libgit2/CMakeLists.txt +61 -510
- data/vendor/libgit2/cmake/Modules/EnableWarnings.cmake +14 -0
- data/vendor/libgit2/cmake/Modules/FindCoreFoundation.cmake +25 -8
- data/vendor/libgit2/cmake/Modules/FindSecurity.cmake +27 -8
- data/vendor/libgit2/cmake/Modules/FindStatNsec.cmake +20 -0
- data/vendor/libgit2/cmake/Modules/IdeSplitSources.cmake +22 -0
- data/vendor/libgit2/deps/http-parser/CMakeLists.txt +3 -0
- data/vendor/libgit2/deps/regex/CMakeLists.txt +2 -0
- data/vendor/libgit2/deps/winhttp/CMakeLists.txt +26 -0
- data/vendor/libgit2/deps/zlib/CMakeLists.txt +4 -0
- data/vendor/libgit2/include/git2/config.h +29 -2
- data/vendor/libgit2/include/git2/describe.h +1 -1
- data/vendor/libgit2/include/git2/diff.h +59 -8
- data/vendor/libgit2/include/git2/graph.h +3 -0
- data/vendor/libgit2/include/git2/merge.h +6 -0
- data/vendor/libgit2/include/git2/message.h +43 -3
- data/vendor/libgit2/include/git2/notes.h +89 -0
- data/vendor/libgit2/include/git2/odb.h +8 -1
- data/vendor/libgit2/include/git2/patch.h +2 -2
- data/vendor/libgit2/include/git2/pathspec.h +35 -18
- data/vendor/libgit2/include/git2/refs.h +3 -0
- data/vendor/libgit2/include/git2/remote.h +34 -4
- data/vendor/libgit2/include/git2/repository.h +6 -6
- data/vendor/libgit2/include/git2/reset.h +4 -4
- data/vendor/libgit2/include/git2/status.h +4 -0
- data/vendor/libgit2/include/git2/sys/config.h +4 -1
- data/vendor/libgit2/include/git2/sys/odb_backend.h +2 -1
- data/vendor/libgit2/include/git2/tree.h +4 -3
- data/vendor/libgit2/include/git2/types.h +1 -0
- data/vendor/libgit2/include/git2/version.h +4 -4
- data/vendor/libgit2/include/git2/worktree.h +1 -1
- data/vendor/libgit2/src/CMakeLists.txt +463 -0
- data/vendor/libgit2/src/annotated_commit.c +1 -1
- data/vendor/libgit2/src/annotated_commit.h +2 -0
- data/vendor/libgit2/src/apply.c +2 -1
- data/vendor/libgit2/src/apply.h +2 -0
- data/vendor/libgit2/src/attr.c +24 -4
- data/vendor/libgit2/src/attr.h +2 -0
- data/vendor/libgit2/src/attr_file.c +9 -2
- data/vendor/libgit2/src/attr_file.h +2 -0
- data/vendor/libgit2/src/attrcache.c +9 -1
- data/vendor/libgit2/src/attrcache.h +2 -0
- data/vendor/libgit2/src/blame.c +1 -0
- data/vendor/libgit2/src/blame.h +2 -1
- data/vendor/libgit2/src/blame_git.c +1 -0
- data/vendor/libgit2/src/blame_git.h +2 -0
- data/vendor/libgit2/src/blob.c +2 -2
- data/vendor/libgit2/src/blob.h +2 -0
- data/vendor/libgit2/src/branch.c +8 -1
- data/vendor/libgit2/src/branch.h +2 -0
- data/vendor/libgit2/src/buf_text.c +7 -7
- data/vendor/libgit2/src/buf_text.h +3 -3
- data/vendor/libgit2/src/buffer.c +31 -1
- data/vendor/libgit2/src/buffer.h +3 -0
- data/vendor/libgit2/src/cache.c +2 -2
- data/vendor/libgit2/src/cache.h +2 -0
- data/vendor/libgit2/src/cc-compat.h +3 -3
- data/vendor/libgit2/src/checkout.c +30 -19
- data/vendor/libgit2/src/checkout.h +2 -0
- data/vendor/libgit2/src/cherrypick.c +1 -0
- data/vendor/libgit2/src/clone.c +2 -1
- data/vendor/libgit2/src/clone.h +4 -0
- data/vendor/libgit2/src/commit.c +2 -1
- data/vendor/libgit2/src/commit.h +2 -0
- data/vendor/libgit2/src/commit_list.c +1 -1
- data/vendor/libgit2/src/commit_list.h +2 -0
- data/vendor/libgit2/src/common.h +11 -5
- data/vendor/libgit2/src/config.c +12 -10
- data/vendor/libgit2/src/config.h +2 -0
- data/vendor/libgit2/src/config_cache.c +1 -0
- data/vendor/libgit2/src/config_file.c +287 -786
- data/vendor/libgit2/src/config_file.h +4 -3
- data/vendor/libgit2/src/config_parse.c +525 -0
- data/vendor/libgit2/src/config_parse.h +64 -0
- data/vendor/libgit2/src/crlf.c +2 -1
- data/vendor/libgit2/src/delta.c +28 -30
- data/vendor/libgit2/src/delta.h +1 -0
- data/vendor/libgit2/src/describe.c +3 -1
- data/vendor/libgit2/src/diff.c +148 -2
- data/vendor/libgit2/src/diff.h +3 -1
- data/vendor/libgit2/src/diff_driver.c +12 -9
- data/vendor/libgit2/src/diff_driver.h +4 -1
- data/vendor/libgit2/src/diff_file.c +7 -4
- data/vendor/libgit2/src/diff_file.h +1 -0
- data/vendor/libgit2/src/diff_generate.c +6 -3
- data/vendor/libgit2/src/diff_generate.h +6 -1
- data/vendor/libgit2/src/diff_parse.c +5 -4
- data/vendor/libgit2/src/diff_parse.h +2 -0
- data/vendor/libgit2/src/diff_print.c +2 -0
- data/vendor/libgit2/src/diff_stats.c +2 -0
- data/vendor/libgit2/src/diff_tform.c +2 -1
- data/vendor/libgit2/src/diff_tform.h +4 -1
- data/vendor/libgit2/src/diff_xdiff.c +5 -2
- data/vendor/libgit2/src/diff_xdiff.h +2 -0
- data/vendor/libgit2/src/errors.c +2 -0
- data/vendor/libgit2/src/features.h.in +36 -0
- data/vendor/libgit2/src/fetch.c +2 -2
- data/vendor/libgit2/src/fetch.h +4 -0
- data/vendor/libgit2/src/fetchhead.c +3 -3
- data/vendor/libgit2/src/fetchhead.h +3 -0
- data/vendor/libgit2/src/filebuf.c +2 -1
- data/vendor/libgit2/src/filebuf.h +2 -0
- data/vendor/libgit2/src/fileops.c +12 -1
- data/vendor/libgit2/src/fileops.h +7 -1
- data/vendor/libgit2/src/filter.c +2 -1
- data/vendor/libgit2/src/filter.h +1 -0
- data/vendor/libgit2/src/fnmatch.c +2 -2
- data/vendor/libgit2/src/fnmatch.h +3 -4
- data/vendor/libgit2/src/global.c +4 -3
- data/vendor/libgit2/src/global.h +1 -5
- data/vendor/libgit2/src/graph.c +2 -0
- data/vendor/libgit2/src/hash.c +0 -1
- data/vendor/libgit2/src/hash.h +3 -1
- data/vendor/libgit2/src/hash/hash_collisiondetect.h +3 -3
- data/vendor/libgit2/src/hash/hash_common_crypto.h +18 -5
- data/vendor/libgit2/src/hash/hash_generic.c +2 -2
- data/vendor/libgit2/src/hash/hash_generic.h +5 -3
- data/vendor/libgit2/src/hash/hash_openssl.h +3 -3
- data/vendor/libgit2/src/hash/hash_win32.c +57 -14
- data/vendor/libgit2/src/hash/hash_win32.h +4 -3
- data/vendor/libgit2/src/hashsig.c +3 -0
- data/vendor/libgit2/src/ident.c +2 -0
- data/vendor/libgit2/src/idxmap.h +2 -1
- data/vendor/libgit2/src/ignore.c +14 -2
- data/vendor/libgit2/src/ignore.h +2 -0
- data/vendor/libgit2/src/index.c +20 -40
- data/vendor/libgit2/src/index.h +2 -0
- data/vendor/libgit2/src/indexer.c +13 -5
- data/vendor/libgit2/src/indexer.h +5 -1
- data/vendor/libgit2/src/integer.h +1 -1
- data/vendor/libgit2/src/iterator.c +44 -3
- data/vendor/libgit2/src/iterator.h +3 -0
- data/vendor/libgit2/src/map.h +1 -1
- data/vendor/libgit2/src/merge.c +155 -33
- data/vendor/libgit2/src/merge.h +2 -0
- data/vendor/libgit2/src/merge_driver.c +2 -2
- data/vendor/libgit2/src/merge_driver.h +2 -0
- data/vendor/libgit2/src/merge_file.c +3 -0
- data/vendor/libgit2/src/message.h +3 -1
- data/vendor/libgit2/src/mwindow.c +1 -1
- data/vendor/libgit2/src/mwindow.h +2 -0
- data/vendor/libgit2/src/netops.c +75 -62
- data/vendor/libgit2/src/netops.h +2 -1
- data/vendor/libgit2/src/notes.c +164 -48
- data/vendor/libgit2/src/notes.h +1 -1
- data/vendor/libgit2/src/object.c +14 -3
- data/vendor/libgit2/src/object.h +4 -0
- data/vendor/libgit2/src/object_api.c +3 -2
- data/vendor/libgit2/src/odb.c +104 -38
- data/vendor/libgit2/src/odb.h +3 -1
- data/vendor/libgit2/src/odb_loose.c +414 -267
- data/vendor/libgit2/src/odb_mempack.c +1 -0
- data/vendor/libgit2/src/odb_pack.c +2 -1
- data/vendor/libgit2/src/offmap.h +1 -0
- data/vendor/libgit2/src/oid.c +2 -1
- data/vendor/libgit2/src/oid.h +3 -8
- data/vendor/libgit2/src/oidarray.c +2 -1
- data/vendor/libgit2/src/oidarray.h +1 -0
- data/vendor/libgit2/src/oidmap.h +1 -0
- data/vendor/libgit2/src/pack-objects.c +5 -1
- data/vendor/libgit2/src/pack-objects.h +1 -1
- data/vendor/libgit2/src/pack.c +2 -6
- data/vendor/libgit2/src/pack.h +2 -1
- data/vendor/libgit2/src/parse.c +121 -0
- data/vendor/libgit2/src/parse.h +61 -0
- data/vendor/libgit2/src/patch.c +9 -2
- data/vendor/libgit2/src/patch.h +2 -0
- data/vendor/libgit2/src/patch_generate.c +6 -5
- data/vendor/libgit2/src/patch_generate.h +1 -0
- data/vendor/libgit2/src/patch_parse.c +265 -276
- data/vendor/libgit2/src/patch_parse.h +6 -11
- data/vendor/libgit2/src/path.c +24 -181
- data/vendor/libgit2/src/path.h +14 -73
- data/vendor/libgit2/src/pathspec.c +2 -1
- data/vendor/libgit2/src/pathspec.h +2 -1
- data/vendor/libgit2/src/pool.c +8 -0
- data/vendor/libgit2/src/pool.h +1 -0
- data/vendor/libgit2/src/posix.c +2 -1
- data/vendor/libgit2/src/posix.h +1 -0
- data/vendor/libgit2/src/pqueue.c +1 -0
- data/vendor/libgit2/src/pqueue.h +2 -0
- data/vendor/libgit2/src/proxy.c +2 -1
- data/vendor/libgit2/src/proxy.h +3 -1
- data/vendor/libgit2/src/push.c +4 -171
- data/vendor/libgit2/src/push.h +2 -0
- data/vendor/libgit2/src/rebase.c +1 -0
- data/vendor/libgit2/src/refdb.c +2 -3
- data/vendor/libgit2/src/refdb.h +2 -0
- data/vendor/libgit2/src/refdb_fs.c +5 -3
- data/vendor/libgit2/src/refdb_fs.h +4 -0
- data/vendor/libgit2/src/reflog.c +1 -0
- data/vendor/libgit2/src/reflog.h +2 -1
- data/vendor/libgit2/src/refs.c +1 -0
- data/vendor/libgit2/src/refs.h +2 -1
- data/vendor/libgit2/src/refspec.c +2 -2
- data/vendor/libgit2/src/refspec.h +2 -0
- data/vendor/libgit2/src/remote.c +56 -10
- data/vendor/libgit2/src/remote.h +2 -0
- data/vendor/libgit2/src/repository.c +16 -14
- data/vendor/libgit2/src/repository.h +2 -0
- data/vendor/libgit2/src/reset.c +6 -5
- data/vendor/libgit2/src/revert.c +1 -0
- data/vendor/libgit2/src/revparse.c +3 -5
- data/vendor/libgit2/src/revwalk.c +2 -2
- data/vendor/libgit2/src/revwalk.h +2 -0
- data/vendor/libgit2/src/settings.c +6 -8
- data/vendor/libgit2/src/sha1_lookup.c +2 -216
- data/vendor/libgit2/src/sha1_lookup.h +2 -6
- data/vendor/libgit2/src/signature.c +8 -3
- data/vendor/libgit2/src/signature.h +2 -0
- data/vendor/libgit2/src/sortedcache.c +7 -0
- data/vendor/libgit2/src/sortedcache.h +2 -0
- data/vendor/libgit2/src/stash.c +1 -0
- data/vendor/libgit2/src/status.c +14 -9
- data/vendor/libgit2/src/status.h +2 -0
- data/vendor/libgit2/src/{curl_stream.c → streams/curl.c} +2 -0
- data/vendor/libgit2/src/{curl_stream.h → streams/curl.h} +4 -2
- data/vendor/libgit2/src/{openssl_stream.c → streams/openssl.c} +47 -18
- data/vendor/libgit2/src/{openssl_stream.h → streams/openssl.h} +6 -2
- data/vendor/libgit2/src/{socket_stream.c → streams/socket.c} +2 -2
- data/vendor/libgit2/src/{socket_stream.h → streams/socket.h} +4 -2
- data/vendor/libgit2/src/{stransport_stream.c → streams/stransport.c} +4 -2
- data/vendor/libgit2/src/{stransport_stream.h → streams/stransport.h} +4 -2
- data/vendor/libgit2/src/{tls_stream.c → streams/tls.c} +4 -3
- data/vendor/libgit2/src/{tls_stream.h → streams/tls.h} +4 -2
- data/vendor/libgit2/src/submodule.c +28 -80
- data/vendor/libgit2/src/submodule.h +2 -13
- data/vendor/libgit2/src/sysdir.c +75 -8
- data/vendor/libgit2/src/sysdir.h +2 -1
- data/vendor/libgit2/src/tag.c +2 -2
- data/vendor/libgit2/src/tag.h +2 -0
- data/vendor/libgit2/src/thread-utils.c +1 -0
- data/vendor/libgit2/src/thread-utils.h +1 -1
- data/vendor/libgit2/src/trace.c +2 -2
- data/vendor/libgit2/src/trace.h +2 -0
- data/vendor/libgit2/src/trailer.c +416 -0
- data/vendor/libgit2/src/transaction.c +2 -1
- data/vendor/libgit2/src/transport.c +2 -0
- data/vendor/libgit2/src/transports/auth.c +2 -1
- data/vendor/libgit2/src/transports/auth.h +4 -3
- data/vendor/libgit2/src/transports/auth_negotiate.c +2 -1
- data/vendor/libgit2/src/transports/auth_negotiate.h +3 -3
- data/vendor/libgit2/src/transports/cred.c +2 -0
- data/vendor/libgit2/src/transports/cred.h +4 -2
- data/vendor/libgit2/src/transports/cred_helpers.c +1 -0
- data/vendor/libgit2/src/transports/git.c +3 -1
- data/vendor/libgit2/src/transports/http.c +10 -14
- data/vendor/libgit2/src/transports/http.h +23 -0
- data/vendor/libgit2/src/transports/local.c +23 -5
- data/vendor/libgit2/src/transports/smart.c +3 -1
- data/vendor/libgit2/src/transports/smart.h +23 -16
- data/vendor/libgit2/src/transports/smart_pkt.c +114 -130
- data/vendor/libgit2/src/transports/smart_protocol.c +26 -22
- data/vendor/libgit2/src/transports/ssh.c +12 -7
- data/vendor/libgit2/src/transports/ssh.h +4 -2
- data/vendor/libgit2/src/transports/winhttp.c +19 -21
- data/vendor/libgit2/src/tree-cache.c +1 -0
- data/vendor/libgit2/src/tree-cache.h +1 -0
- data/vendor/libgit2/src/tree.c +20 -14
- data/vendor/libgit2/src/tree.h +2 -0
- data/vendor/libgit2/src/tsort.c +0 -1
- data/vendor/libgit2/src/unix/map.c +4 -1
- data/vendor/libgit2/src/unix/posix.h +8 -4
- data/vendor/libgit2/src/unix/pthread.h +1 -1
- data/vendor/libgit2/src/unix/realpath.c +4 -1
- data/vendor/libgit2/src/util.c +6 -5
- data/vendor/libgit2/src/util.h +39 -111
- data/vendor/libgit2/src/varint.c +0 -1
- data/vendor/libgit2/src/varint.h +2 -0
- data/vendor/libgit2/src/vector.c +1 -1
- data/vendor/libgit2/src/win32/dir.c +3 -0
- data/vendor/libgit2/src/win32/dir.h +4 -3
- data/vendor/libgit2/src/win32/error.c +1 -1
- data/vendor/libgit2/src/win32/error.h +4 -2
- data/vendor/libgit2/src/win32/findfile.c +2 -1
- data/vendor/libgit2/src/win32/findfile.h +4 -2
- data/vendor/libgit2/src/win32/map.c +2 -0
- data/vendor/libgit2/src/win32/mingw-compat.h +3 -3
- data/vendor/libgit2/src/win32/msvc-compat.h +3 -3
- data/vendor/libgit2/src/win32/path_w32.c +7 -12
- data/vendor/libgit2/src/win32/path_w32.h +3 -2
- data/vendor/libgit2/src/win32/posix.h +2 -2
- data/vendor/libgit2/src/win32/posix_w32.c +11 -5
- data/vendor/libgit2/src/win32/precompiled.h +2 -1
- data/vendor/libgit2/src/win32/reparse.h +2 -2
- data/vendor/libgit2/src/win32/thread.c +1 -0
- data/vendor/libgit2/src/win32/thread.h +2 -2
- data/vendor/libgit2/src/win32/utf-conv.c +0 -1
- data/vendor/libgit2/src/win32/utf-conv.h +4 -3
- data/vendor/libgit2/src/win32/w32_buffer.c +1 -1
- data/vendor/libgit2/src/win32/w32_buffer.h +4 -2
- data/vendor/libgit2/src/win32/w32_crtdbg_stacktrace.c +2 -1
- data/vendor/libgit2/src/win32/w32_crtdbg_stacktrace.h +85 -2
- data/vendor/libgit2/src/win32/w32_stack.c +2 -1
- data/vendor/libgit2/src/win32/w32_stack.h +5 -3
- data/vendor/libgit2/src/win32/w32_util.h +4 -2
- data/vendor/libgit2/src/win32/win32-compat.h +3 -3
- data/vendor/libgit2/src/worktree.c +4 -5
- data/vendor/libgit2/src/worktree.h +2 -0
- data/vendor/libgit2/src/xdiff/xdiff.h +22 -13
- data/vendor/libgit2/src/xdiff/xdiffi.c +523 -81
- data/vendor/libgit2/src/xdiff/xdiffi.h +2 -2
- data/vendor/libgit2/src/xdiff/xemit.c +63 -39
- data/vendor/libgit2/src/xdiff/xemit.h +2 -2
- data/vendor/libgit2/src/xdiff/xhistogram.c +0 -1
- data/vendor/libgit2/src/xdiff/xinclude.h +3 -2
- data/vendor/libgit2/src/xdiff/xmacros.h +2 -2
- data/vendor/libgit2/src/xdiff/xmerge.c +80 -20
- data/vendor/libgit2/src/xdiff/xpatience.c +41 -9
- data/vendor/libgit2/src/xdiff/xprepare.c +2 -2
- data/vendor/libgit2/src/xdiff/xprepare.h +2 -2
- data/vendor/libgit2/src/xdiff/xtypes.h +2 -2
- data/vendor/libgit2/src/xdiff/xutils.c +47 -27
- data/vendor/libgit2/src/xdiff/xutils.h +2 -5
- data/vendor/libgit2/src/zstream.c +65 -45
- data/vendor/libgit2/src/zstream.h +9 -2
- metadata +27 -13
- data/vendor/libgit2/include/git2/sys/remote.h +0 -16
data/vendor/libgit2/src/ignore.h
CHANGED
data/vendor/libgit2/src/index.c
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
* a Linking Exception. For full terms see the included COPYING file.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
#include "index.h"
|
|
9
|
+
|
|
8
10
|
#include <stddef.h>
|
|
9
11
|
|
|
10
|
-
#include "common.h"
|
|
11
12
|
#include "repository.h"
|
|
12
|
-
#include "index.h"
|
|
13
13
|
#include "tree.h"
|
|
14
14
|
#include "tree-cache.h"
|
|
15
15
|
#include "hash.h"
|
|
@@ -884,13 +884,11 @@ static int index_entry_create(
|
|
|
884
884
|
git_index_entry **out,
|
|
885
885
|
git_repository *repo,
|
|
886
886
|
const char *path,
|
|
887
|
-
struct stat *st,
|
|
888
887
|
bool from_workdir)
|
|
889
888
|
{
|
|
890
889
|
size_t pathlen = strlen(path), alloclen;
|
|
891
890
|
struct entry_internal *entry;
|
|
892
891
|
unsigned int path_valid_flags = GIT_PATH_REJECT_INDEX_DEFAULTS;
|
|
893
|
-
uint16_t mode = 0;
|
|
894
892
|
|
|
895
893
|
/* always reject placing `.git` in the index and directory traversal.
|
|
896
894
|
* when requested, disallow platform-specific filenames and upgrade to
|
|
@@ -898,10 +896,8 @@ static int index_entry_create(
|
|
|
898
896
|
*/
|
|
899
897
|
if (from_workdir)
|
|
900
898
|
path_valid_flags |= GIT_PATH_REJECT_WORKDIR_DEFAULTS;
|
|
901
|
-
if (st)
|
|
902
|
-
mode = st->st_mode;
|
|
903
899
|
|
|
904
|
-
if (!git_path_isvalid(repo, path,
|
|
900
|
+
if (!git_path_isvalid(repo, path, path_valid_flags)) {
|
|
905
901
|
giterr_set(GITERR_INDEX, "invalid path: '%s'", path);
|
|
906
902
|
return -1;
|
|
907
903
|
}
|
|
@@ -926,35 +922,15 @@ static int index_entry_init(
|
|
|
926
922
|
{
|
|
927
923
|
int error = 0;
|
|
928
924
|
git_index_entry *entry = NULL;
|
|
929
|
-
git_buf path = GIT_BUF_INIT;
|
|
930
925
|
struct stat st;
|
|
931
926
|
git_oid oid;
|
|
932
|
-
git_repository *repo;
|
|
933
927
|
|
|
934
928
|
if (INDEX_OWNER(index) == NULL)
|
|
935
929
|
return create_index_error(-1,
|
|
936
930
|
"could not initialize index entry. "
|
|
937
931
|
"Index is not backed up by an existing repository.");
|
|
938
932
|
|
|
939
|
-
|
|
940
|
-
* FIXME: this is duplicated with the work in
|
|
941
|
-
* git_blob__create_from_paths. It should accept an optional stat
|
|
942
|
-
* structure so we can pass in the one we have to do here.
|
|
943
|
-
*/
|
|
944
|
-
repo = INDEX_OWNER(index);
|
|
945
|
-
if (git_repository__ensure_not_bare(repo, "create blob from file") < 0)
|
|
946
|
-
return GIT_EBAREREPO;
|
|
947
|
-
|
|
948
|
-
if (git_buf_joinpath(&path, git_repository_workdir(repo), rel_path) < 0)
|
|
949
|
-
return -1;
|
|
950
|
-
|
|
951
|
-
error = git_path_lstat(path.ptr, &st);
|
|
952
|
-
git_buf_free(&path);
|
|
953
|
-
|
|
954
|
-
if (error < 0)
|
|
955
|
-
return error;
|
|
956
|
-
|
|
957
|
-
if (index_entry_create(&entry, INDEX_OWNER(index), rel_path, &st, true) < 0)
|
|
933
|
+
if (index_entry_create(&entry, INDEX_OWNER(index), rel_path, true) < 0)
|
|
958
934
|
return -1;
|
|
959
935
|
|
|
960
936
|
/* write the blob to disk and get the oid and stat info */
|
|
@@ -1040,7 +1016,7 @@ static int index_entry_dup(
|
|
|
1040
1016
|
git_index *index,
|
|
1041
1017
|
const git_index_entry *src)
|
|
1042
1018
|
{
|
|
1043
|
-
if (index_entry_create(out, INDEX_OWNER(index), src->path,
|
|
1019
|
+
if (index_entry_create(out, INDEX_OWNER(index), src->path, false) < 0)
|
|
1044
1020
|
return -1;
|
|
1045
1021
|
|
|
1046
1022
|
index_entry_cpy(*out, src);
|
|
@@ -1062,7 +1038,7 @@ static int index_entry_dup_nocache(
|
|
|
1062
1038
|
git_index *index,
|
|
1063
1039
|
const git_index_entry *src)
|
|
1064
1040
|
{
|
|
1065
|
-
if (index_entry_create(out, INDEX_OWNER(index), src->path,
|
|
1041
|
+
if (index_entry_create(out, INDEX_OWNER(index), src->path, false) < 0)
|
|
1066
1042
|
return -1;
|
|
1067
1043
|
|
|
1068
1044
|
index_entry_cpy_nocache(*out, src);
|
|
@@ -1420,12 +1396,16 @@ static int index_conflict_to_reuc(git_index *index, const char *path)
|
|
|
1420
1396
|
return ret;
|
|
1421
1397
|
}
|
|
1422
1398
|
|
|
1423
|
-
|
|
1399
|
+
GIT_INLINE(bool) is_file_or_link(const int filemode)
|
|
1424
1400
|
{
|
|
1425
1401
|
return (filemode == GIT_FILEMODE_BLOB ||
|
|
1426
1402
|
filemode == GIT_FILEMODE_BLOB_EXECUTABLE ||
|
|
1427
|
-
filemode == GIT_FILEMODE_LINK
|
|
1428
|
-
|
|
1403
|
+
filemode == GIT_FILEMODE_LINK);
|
|
1404
|
+
}
|
|
1405
|
+
|
|
1406
|
+
GIT_INLINE(bool) valid_filemode(const int filemode)
|
|
1407
|
+
{
|
|
1408
|
+
return (is_file_or_link(filemode) || filemode == GIT_FILEMODE_COMMIT);
|
|
1429
1409
|
}
|
|
1430
1410
|
|
|
1431
1411
|
int git_index_add_frombuffer(
|
|
@@ -1443,7 +1423,7 @@ int git_index_add_frombuffer(
|
|
|
1443
1423
|
"could not initialize index entry. "
|
|
1444
1424
|
"Index is not backed up by an existing repository.");
|
|
1445
1425
|
|
|
1446
|
-
if (!
|
|
1426
|
+
if (!is_file_or_link(source_entry->mode)) {
|
|
1447
1427
|
giterr_set(GITERR_INDEX, "invalid filemode");
|
|
1448
1428
|
return -1;
|
|
1449
1429
|
}
|
|
@@ -1481,6 +1461,9 @@ static int add_repo_as_submodule(git_index_entry **out, git_index *index, const
|
|
|
1481
1461
|
struct stat st;
|
|
1482
1462
|
int error;
|
|
1483
1463
|
|
|
1464
|
+
if (index_entry_create(&entry, INDEX_OWNER(index), path, true) < 0)
|
|
1465
|
+
return -1;
|
|
1466
|
+
|
|
1484
1467
|
if ((error = git_buf_joinpath(&abspath, git_repository_workdir(repo), path)) < 0)
|
|
1485
1468
|
return error;
|
|
1486
1469
|
|
|
@@ -1489,9 +1472,6 @@ static int add_repo_as_submodule(git_index_entry **out, git_index *index, const
|
|
|
1489
1472
|
return -1;
|
|
1490
1473
|
}
|
|
1491
1474
|
|
|
1492
|
-
if (index_entry_create(&entry, INDEX_OWNER(index), path, &st, true) < 0)
|
|
1493
|
-
return -1;
|
|
1494
|
-
|
|
1495
1475
|
git_index_entry__init_from_stat(entry, &st, !index->distrust_filemode);
|
|
1496
1476
|
|
|
1497
1477
|
if ((error = git_repository_open(&sub, abspath.ptr)) < 0)
|
|
@@ -1629,7 +1609,7 @@ int git_index_add(git_index *index, const git_index_entry *source_entry)
|
|
|
1629
1609
|
assert(index && source_entry && source_entry->path);
|
|
1630
1610
|
|
|
1631
1611
|
if (!valid_filemode(source_entry->mode)) {
|
|
1632
|
-
giterr_set(GITERR_INDEX, "invalid
|
|
1612
|
+
giterr_set(GITERR_INDEX, "invalid entry mode");
|
|
1633
1613
|
return -1;
|
|
1634
1614
|
}
|
|
1635
1615
|
|
|
@@ -2528,7 +2508,7 @@ static int parse_index(git_index *index, const char *buffer, size_t buffer_size)
|
|
|
2528
2508
|
|
|
2529
2509
|
/* Parse all the entries */
|
|
2530
2510
|
for (i = 0; i < header.entry_count && buffer_size > INDEX_FOOTER_SIZE; ++i) {
|
|
2531
|
-
git_index_entry *entry;
|
|
2511
|
+
git_index_entry *entry = NULL;
|
|
2532
2512
|
size_t entry_size;
|
|
2533
2513
|
|
|
2534
2514
|
if ((error = read_entry(&entry, &entry_size, index, buffer, buffer_size, last)) < 0) {
|
|
@@ -2985,7 +2965,7 @@ static int read_tree_cb(
|
|
|
2985
2965
|
if (git_buf_joinpath(&path, root, tentry->filename) < 0)
|
|
2986
2966
|
return -1;
|
|
2987
2967
|
|
|
2988
|
-
if (index_entry_create(&entry, INDEX_OWNER(data->index), path.ptr,
|
|
2968
|
+
if (index_entry_create(&entry, INDEX_OWNER(data->index), path.ptr, false) < 0)
|
|
2989
2969
|
return -1;
|
|
2990
2970
|
|
|
2991
2971
|
entry->mode = tentry->attr;
|
data/vendor/libgit2/src/index.h
CHANGED
|
@@ -5,10 +5,11 @@
|
|
|
5
5
|
* a Linking Exception. For full terms see the included COPYING file.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
#include "indexer.h"
|
|
9
|
+
|
|
8
10
|
#include "git2/indexer.h"
|
|
9
11
|
#include "git2/object.h"
|
|
10
12
|
|
|
11
|
-
#include "common.h"
|
|
12
13
|
#include "pack.h"
|
|
13
14
|
#include "mwindow.h"
|
|
14
15
|
#include "posix.h"
|
|
@@ -186,13 +187,17 @@ static int store_delta(git_indexer *idx)
|
|
|
186
187
|
return 0;
|
|
187
188
|
}
|
|
188
189
|
|
|
189
|
-
static
|
|
190
|
+
static int hash_header(git_hash_ctx *ctx, git_off_t len, git_otype type)
|
|
190
191
|
{
|
|
191
192
|
char buffer[64];
|
|
192
193
|
size_t hdrlen;
|
|
194
|
+
int error;
|
|
195
|
+
|
|
196
|
+
if ((error = git_odb__format_object_header(&hdrlen,
|
|
197
|
+
buffer, sizeof(buffer), (size_t)len, type)) < 0)
|
|
198
|
+
return error;
|
|
193
199
|
|
|
194
|
-
|
|
195
|
-
git_hash_update(ctx, buffer, hdrlen);
|
|
200
|
+
return git_hash_update(ctx, buffer, hdrlen);
|
|
196
201
|
}
|
|
197
202
|
|
|
198
203
|
static int hash_object_stream(git_indexer*idx, git_packfile_stream *stream)
|
|
@@ -620,7 +625,10 @@ int git_indexer_append(git_indexer *idx, const void *data, size_t size, git_tran
|
|
|
620
625
|
idx->have_delta = 1;
|
|
621
626
|
} else {
|
|
622
627
|
idx->have_delta = 0;
|
|
623
|
-
|
|
628
|
+
|
|
629
|
+
error = hash_header(&idx->hash_ctx, entry_size, type);
|
|
630
|
+
if (error < 0)
|
|
631
|
+
goto on_error;
|
|
624
632
|
}
|
|
625
633
|
|
|
626
634
|
idx->have_stream = 1;
|
|
@@ -7,6 +7,10 @@
|
|
|
7
7
|
#ifndef INCLUDE_indexer_h__
|
|
8
8
|
#define INCLUDE_indexer_h__
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
#include "common.h"
|
|
11
|
+
|
|
12
|
+
#include "git2/indexer.h"
|
|
13
|
+
|
|
14
|
+
extern void git_indexer__set_fsync(git_indexer *idx, int do_fsync);
|
|
11
15
|
|
|
12
16
|
#endif
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
#include "iterator.h"
|
|
9
|
+
|
|
9
10
|
#include "tree.h"
|
|
10
11
|
#include "index.h"
|
|
11
12
|
|
|
@@ -22,6 +23,7 @@
|
|
|
22
23
|
#define iterator__has_been_accessed(I) iterator__flag(I,FIRST_ACCESS)
|
|
23
24
|
#define iterator__honor_ignores(I) iterator__flag(I,HONOR_IGNORES)
|
|
24
25
|
#define iterator__ignore_dot_git(I) iterator__flag(I,IGNORE_DOT_GIT)
|
|
26
|
+
#define iterator__descend_symlinks(I) iterator__flag(I,DESCEND_SYMLINKS)
|
|
25
27
|
|
|
26
28
|
|
|
27
29
|
static void iterator_set_ignore_case(git_iterator *iter, bool ignore_case)
|
|
@@ -1456,10 +1458,15 @@ static void filesystem_iterator_set_current(
|
|
|
1456
1458
|
filesystem_iterator_entry *entry)
|
|
1457
1459
|
{
|
|
1458
1460
|
iter->entry.ctime.seconds = entry->st.st_ctime;
|
|
1459
|
-
iter->entry.ctime.nanoseconds = entry->st.st_ctime_nsec;
|
|
1460
|
-
|
|
1461
1461
|
iter->entry.mtime.seconds = entry->st.st_mtime;
|
|
1462
|
+
|
|
1463
|
+
#if defined(GIT_USE_NSEC)
|
|
1464
|
+
iter->entry.ctime.nanoseconds = entry->st.st_ctime_nsec;
|
|
1462
1465
|
iter->entry.mtime.nanoseconds = entry->st.st_mtime_nsec;
|
|
1466
|
+
#else
|
|
1467
|
+
iter->entry.ctime.nanoseconds = 0;
|
|
1468
|
+
iter->entry.mtime.nanoseconds = 0;
|
|
1469
|
+
#endif
|
|
1463
1470
|
|
|
1464
1471
|
iter->entry.dev = entry->st.st_dev;
|
|
1465
1472
|
iter->entry.ino = entry->st.st_ino;
|
|
@@ -1490,10 +1497,41 @@ static int filesystem_iterator_current(
|
|
|
1490
1497
|
return 0;
|
|
1491
1498
|
}
|
|
1492
1499
|
|
|
1500
|
+
static int filesystem_iterator_is_dir(
|
|
1501
|
+
bool *is_dir,
|
|
1502
|
+
const filesystem_iterator *iter,
|
|
1503
|
+
const filesystem_iterator_entry *entry)
|
|
1504
|
+
{
|
|
1505
|
+
struct stat st;
|
|
1506
|
+
git_buf fullpath = GIT_BUF_INIT;
|
|
1507
|
+
int error = 0;
|
|
1508
|
+
|
|
1509
|
+
if (S_ISDIR(entry->st.st_mode)) {
|
|
1510
|
+
*is_dir = 1;
|
|
1511
|
+
goto done;
|
|
1512
|
+
}
|
|
1513
|
+
|
|
1514
|
+
if (!iterator__descend_symlinks(iter) || !S_ISLNK(entry->st.st_mode)) {
|
|
1515
|
+
*is_dir = 0;
|
|
1516
|
+
goto done;
|
|
1517
|
+
}
|
|
1518
|
+
|
|
1519
|
+
if ((error = git_buf_joinpath(&fullpath, iter->root, entry->path)) < 0 ||
|
|
1520
|
+
(error = p_stat(fullpath.ptr, &st)) < 0)
|
|
1521
|
+
goto done;
|
|
1522
|
+
|
|
1523
|
+
*is_dir = S_ISDIR(st.st_mode);
|
|
1524
|
+
|
|
1525
|
+
done:
|
|
1526
|
+
git_buf_free(&fullpath);
|
|
1527
|
+
return error;
|
|
1528
|
+
}
|
|
1529
|
+
|
|
1493
1530
|
static int filesystem_iterator_advance(
|
|
1494
1531
|
const git_index_entry **out, git_iterator *i)
|
|
1495
1532
|
{
|
|
1496
1533
|
filesystem_iterator *iter = (filesystem_iterator *)i;
|
|
1534
|
+
bool is_dir;
|
|
1497
1535
|
int error = 0;
|
|
1498
1536
|
|
|
1499
1537
|
iter->base.flags |= GIT_ITERATOR_FIRST_ACCESS;
|
|
@@ -1518,7 +1556,10 @@ static int filesystem_iterator_advance(
|
|
|
1518
1556
|
entry = frame->entries.contents[frame->next_idx];
|
|
1519
1557
|
frame->next_idx++;
|
|
1520
1558
|
|
|
1521
|
-
if (
|
|
1559
|
+
if ((error = filesystem_iterator_is_dir(&is_dir, iter, entry)) < 0)
|
|
1560
|
+
break;
|
|
1561
|
+
|
|
1562
|
+
if (is_dir) {
|
|
1522
1563
|
if (iterator__do_autoexpand(iter)) {
|
|
1523
1564
|
error = filesystem_iterator_frame_push(iter, entry);
|
|
1524
1565
|
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
#define INCLUDE_iterator_h__
|
|
9
9
|
|
|
10
10
|
#include "common.h"
|
|
11
|
+
|
|
11
12
|
#include "git2/index.h"
|
|
12
13
|
#include "vector.h"
|
|
13
14
|
#include "buffer.h"
|
|
@@ -38,6 +39,8 @@ typedef enum {
|
|
|
38
39
|
GIT_ITERATOR_DONT_PRECOMPOSE_UNICODE = (1u << 5),
|
|
39
40
|
/** include conflicts */
|
|
40
41
|
GIT_ITERATOR_INCLUDE_CONFLICTS = (1u << 6),
|
|
42
|
+
/** descend into symlinked directories */
|
|
43
|
+
GIT_ITERATOR_DESCEND_SYMLINKS = (1u << 7),
|
|
41
44
|
} git_iterator_flag_t;
|
|
42
45
|
|
|
43
46
|
typedef enum {
|
data/vendor/libgit2/src/map.h
CHANGED
data/vendor/libgit2/src/merge.c
CHANGED
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
* a Linking Exception. For full terms see the included COPYING file.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
#include "
|
|
8
|
+
#include "merge.h"
|
|
9
|
+
|
|
9
10
|
#include "posix.h"
|
|
10
11
|
#include "buffer.h"
|
|
11
12
|
#include "repository.h"
|
|
12
13
|
#include "revwalk.h"
|
|
13
14
|
#include "commit_list.h"
|
|
14
|
-
#include "merge.h"
|
|
15
15
|
#include "path.h"
|
|
16
16
|
#include "refs.h"
|
|
17
17
|
#include "object.h"
|
|
@@ -32,6 +32,8 @@
|
|
|
32
32
|
#include "commit.h"
|
|
33
33
|
#include "oidarray.h"
|
|
34
34
|
#include "merge_driver.h"
|
|
35
|
+
#include "oidmap.h"
|
|
36
|
+
#include "array.h"
|
|
35
37
|
|
|
36
38
|
#include "git2/types.h"
|
|
37
39
|
#include "git2/repository.h"
|
|
@@ -1005,27 +1007,6 @@ struct merge_diff_similarity {
|
|
|
1005
1007
|
size_t other_idx;
|
|
1006
1008
|
};
|
|
1007
1009
|
|
|
1008
|
-
static int index_entry_similarity_exact(
|
|
1009
|
-
git_repository *repo,
|
|
1010
|
-
git_index_entry *a,
|
|
1011
|
-
size_t a_idx,
|
|
1012
|
-
git_index_entry *b,
|
|
1013
|
-
size_t b_idx,
|
|
1014
|
-
void **cache,
|
|
1015
|
-
const git_merge_options *opts)
|
|
1016
|
-
{
|
|
1017
|
-
GIT_UNUSED(repo);
|
|
1018
|
-
GIT_UNUSED(a_idx);
|
|
1019
|
-
GIT_UNUSED(b_idx);
|
|
1020
|
-
GIT_UNUSED(cache);
|
|
1021
|
-
GIT_UNUSED(opts);
|
|
1022
|
-
|
|
1023
|
-
if (git_oid__cmp(&a->id, &b->id) == 0)
|
|
1024
|
-
return 100;
|
|
1025
|
-
|
|
1026
|
-
return 0;
|
|
1027
|
-
}
|
|
1028
|
-
|
|
1029
1010
|
static int index_entry_similarity_calc(
|
|
1030
1011
|
void **out,
|
|
1031
1012
|
git_repository *repo,
|
|
@@ -1102,12 +1083,154 @@ static int index_entry_similarity_inexact(
|
|
|
1102
1083
|
return score;
|
|
1103
1084
|
}
|
|
1104
1085
|
|
|
1105
|
-
|
|
1086
|
+
/* Tracks deletes by oid for merge_diff_mark_similarity_exact(). This is a
|
|
1087
|
+
* non-shrinking queue where next_pos is the next position to dequeue.
|
|
1088
|
+
*/
|
|
1089
|
+
typedef struct {
|
|
1090
|
+
git_array_t(size_t) arr;
|
|
1091
|
+
size_t next_pos;
|
|
1092
|
+
size_t first_entry;
|
|
1093
|
+
} deletes_by_oid_queue;
|
|
1094
|
+
|
|
1095
|
+
static void deletes_by_oid_free(git_oidmap *map) {
|
|
1096
|
+
deletes_by_oid_queue *queue;
|
|
1097
|
+
|
|
1098
|
+
if (!map)
|
|
1099
|
+
return;
|
|
1100
|
+
|
|
1101
|
+
git_oidmap_foreach_value(map, queue, {
|
|
1102
|
+
git_array_clear(queue->arr);
|
|
1103
|
+
});
|
|
1104
|
+
git_oidmap_free(map);
|
|
1105
|
+
}
|
|
1106
|
+
|
|
1107
|
+
static int deletes_by_oid_enqueue(git_oidmap *map, git_pool* pool, const git_oid *id, size_t idx) {
|
|
1108
|
+
khint_t pos;
|
|
1109
|
+
deletes_by_oid_queue *queue;
|
|
1110
|
+
size_t *array_entry;
|
|
1111
|
+
int error;
|
|
1112
|
+
|
|
1113
|
+
pos = git_oidmap_lookup_index(map, id);
|
|
1114
|
+
if (!git_oidmap_valid_index(map, pos)) {
|
|
1115
|
+
queue = git_pool_malloc(pool, sizeof(deletes_by_oid_queue));
|
|
1116
|
+
GITERR_CHECK_ALLOC(queue);
|
|
1117
|
+
|
|
1118
|
+
git_array_init(queue->arr);
|
|
1119
|
+
queue->next_pos = 0;
|
|
1120
|
+
queue->first_entry = idx;
|
|
1121
|
+
|
|
1122
|
+
git_oidmap_insert(map, id, queue, &error);
|
|
1123
|
+
if (error < 0)
|
|
1124
|
+
return -1;
|
|
1125
|
+
} else {
|
|
1126
|
+
queue = git_oidmap_value_at(map, pos);
|
|
1127
|
+
array_entry = git_array_alloc(queue->arr);
|
|
1128
|
+
GITERR_CHECK_ALLOC(array_entry);
|
|
1129
|
+
*array_entry = idx;
|
|
1130
|
+
}
|
|
1131
|
+
|
|
1132
|
+
return 0;
|
|
1133
|
+
}
|
|
1134
|
+
|
|
1135
|
+
static int deletes_by_oid_dequeue(size_t *idx, git_oidmap *map, const git_oid *id) {
|
|
1136
|
+
khint_t pos;
|
|
1137
|
+
deletes_by_oid_queue *queue;
|
|
1138
|
+
size_t *array_entry;
|
|
1139
|
+
|
|
1140
|
+
pos = git_oidmap_lookup_index(map, id);
|
|
1141
|
+
|
|
1142
|
+
if (!git_oidmap_valid_index(map, pos))
|
|
1143
|
+
return GIT_ENOTFOUND;
|
|
1144
|
+
|
|
1145
|
+
queue = git_oidmap_value_at(map, pos);
|
|
1146
|
+
|
|
1147
|
+
if (queue->next_pos == 0) {
|
|
1148
|
+
*idx = queue->first_entry;
|
|
1149
|
+
} else {
|
|
1150
|
+
array_entry = git_array_get(queue->arr, queue->next_pos - 1);
|
|
1151
|
+
if (array_entry == NULL)
|
|
1152
|
+
return GIT_ENOTFOUND;
|
|
1153
|
+
|
|
1154
|
+
*idx = *array_entry;
|
|
1155
|
+
}
|
|
1156
|
+
|
|
1157
|
+
queue->next_pos++;
|
|
1158
|
+
return 0;
|
|
1159
|
+
}
|
|
1160
|
+
|
|
1161
|
+
static int merge_diff_mark_similarity_exact(
|
|
1162
|
+
git_merge_diff_list *diff_list,
|
|
1163
|
+
struct merge_diff_similarity *similarity_ours,
|
|
1164
|
+
struct merge_diff_similarity *similarity_theirs)
|
|
1165
|
+
{
|
|
1166
|
+
size_t i, j;
|
|
1167
|
+
git_merge_diff *conflict_src, *conflict_tgt;
|
|
1168
|
+
git_oidmap *ours_deletes_by_oid = NULL, *theirs_deletes_by_oid = NULL;
|
|
1169
|
+
int error = 0;
|
|
1170
|
+
|
|
1171
|
+
if (!(ours_deletes_by_oid = git_oidmap_alloc()) ||
|
|
1172
|
+
!(theirs_deletes_by_oid = git_oidmap_alloc())) {
|
|
1173
|
+
error = -1;
|
|
1174
|
+
goto done;
|
|
1175
|
+
}
|
|
1176
|
+
|
|
1177
|
+
/* Build a map of object ids to conflicts */
|
|
1178
|
+
git_vector_foreach(&diff_list->conflicts, i, conflict_src) {
|
|
1179
|
+
/* Items can be the source of a rename iff they have an item in the
|
|
1180
|
+
* ancestor slot and lack an item in the ours or theirs slot. */
|
|
1181
|
+
if (!GIT_MERGE_INDEX_ENTRY_EXISTS(conflict_src->ancestor_entry))
|
|
1182
|
+
continue;
|
|
1183
|
+
|
|
1184
|
+
if (!GIT_MERGE_INDEX_ENTRY_EXISTS(conflict_src->our_entry)) {
|
|
1185
|
+
error = deletes_by_oid_enqueue(ours_deletes_by_oid, &diff_list->pool, &conflict_src->ancestor_entry.id, i);
|
|
1186
|
+
if (error < 0)
|
|
1187
|
+
goto done;
|
|
1188
|
+
}
|
|
1189
|
+
|
|
1190
|
+
if (!GIT_MERGE_INDEX_ENTRY_EXISTS(conflict_src->their_entry)) {
|
|
1191
|
+
error = deletes_by_oid_enqueue(theirs_deletes_by_oid, &diff_list->pool, &conflict_src->ancestor_entry.id, i);
|
|
1192
|
+
if (error < 0)
|
|
1193
|
+
goto done;
|
|
1194
|
+
}
|
|
1195
|
+
}
|
|
1196
|
+
|
|
1197
|
+
git_vector_foreach(&diff_list->conflicts, j, conflict_tgt) {
|
|
1198
|
+
if (GIT_MERGE_INDEX_ENTRY_EXISTS(conflict_tgt->ancestor_entry))
|
|
1199
|
+
continue;
|
|
1200
|
+
|
|
1201
|
+
if (GIT_MERGE_INDEX_ENTRY_EXISTS(conflict_tgt->our_entry)) {
|
|
1202
|
+
if (deletes_by_oid_dequeue(&i, ours_deletes_by_oid, &conflict_tgt->our_entry.id) == 0) {
|
|
1203
|
+
similarity_ours[i].similarity = 100;
|
|
1204
|
+
similarity_ours[i].other_idx = j;
|
|
1205
|
+
|
|
1206
|
+
similarity_ours[j].similarity = 100;
|
|
1207
|
+
similarity_ours[j].other_idx = i;
|
|
1208
|
+
}
|
|
1209
|
+
}
|
|
1210
|
+
|
|
1211
|
+
if (GIT_MERGE_INDEX_ENTRY_EXISTS(conflict_tgt->their_entry)) {
|
|
1212
|
+
if (deletes_by_oid_dequeue(&i, theirs_deletes_by_oid, &conflict_tgt->their_entry.id) == 0) {
|
|
1213
|
+
similarity_theirs[i].similarity = 100;
|
|
1214
|
+
similarity_theirs[i].other_idx = j;
|
|
1215
|
+
|
|
1216
|
+
similarity_theirs[j].similarity = 100;
|
|
1217
|
+
similarity_theirs[j].other_idx = i;
|
|
1218
|
+
}
|
|
1219
|
+
}
|
|
1220
|
+
}
|
|
1221
|
+
|
|
1222
|
+
done:
|
|
1223
|
+
deletes_by_oid_free(ours_deletes_by_oid);
|
|
1224
|
+
deletes_by_oid_free(theirs_deletes_by_oid);
|
|
1225
|
+
|
|
1226
|
+
return error;
|
|
1227
|
+
}
|
|
1228
|
+
|
|
1229
|
+
static int merge_diff_mark_similarity_inexact(
|
|
1106
1230
|
git_repository *repo,
|
|
1107
1231
|
git_merge_diff_list *diff_list,
|
|
1108
1232
|
struct merge_diff_similarity *similarity_ours,
|
|
1109
1233
|
struct merge_diff_similarity *similarity_theirs,
|
|
1110
|
-
int (*similarity_fn)(git_repository *, git_index_entry *, size_t, git_index_entry *, size_t, void **, const git_merge_options *),
|
|
1111
1234
|
void **cache,
|
|
1112
1235
|
const git_merge_options *opts)
|
|
1113
1236
|
{
|
|
@@ -1132,7 +1255,7 @@ static int merge_diff_mark_similarity(
|
|
|
1132
1255
|
|
|
1133
1256
|
if (GIT_MERGE_INDEX_ENTRY_EXISTS(conflict_tgt->our_entry) &&
|
|
1134
1257
|
!GIT_MERGE_INDEX_ENTRY_EXISTS(conflict_src->our_entry)) {
|
|
1135
|
-
similarity =
|
|
1258
|
+
similarity = index_entry_similarity_inexact(repo, &conflict_src->ancestor_entry, i, &conflict_tgt->our_entry, our_idx, cache, opts);
|
|
1136
1259
|
|
|
1137
1260
|
if (similarity == GIT_EBUFS)
|
|
1138
1261
|
continue;
|
|
@@ -1158,7 +1281,7 @@ static int merge_diff_mark_similarity(
|
|
|
1158
1281
|
|
|
1159
1282
|
if (GIT_MERGE_INDEX_ENTRY_EXISTS(conflict_tgt->their_entry) &&
|
|
1160
1283
|
!GIT_MERGE_INDEX_ENTRY_EXISTS(conflict_src->their_entry)) {
|
|
1161
|
-
similarity =
|
|
1284
|
+
similarity = index_entry_similarity_inexact(repo, &conflict_src->ancestor_entry, i, &conflict_tgt->their_entry, their_idx, cache, opts);
|
|
1162
1285
|
|
|
1163
1286
|
if (similarity > similarity_theirs[i].similarity &&
|
|
1164
1287
|
similarity > similarity_theirs[j].similarity) {
|
|
@@ -1396,11 +1519,10 @@ int git_merge_diff_list__find_renames(
|
|
|
1396
1519
|
/* Calculate similarity between items that were deleted from the ancestor
|
|
1397
1520
|
* and added in the other branch.
|
|
1398
1521
|
*/
|
|
1399
|
-
if ((error =
|
|
1400
|
-
similarity_theirs, index_entry_similarity_exact, NULL, opts)) < 0)
|
|
1522
|
+
if ((error = merge_diff_mark_similarity_exact(diff_list, similarity_ours, similarity_theirs)) < 0)
|
|
1401
1523
|
goto done;
|
|
1402
1524
|
|
|
1403
|
-
if (diff_list->conflicts.length <= opts->target_limit) {
|
|
1525
|
+
if (opts->rename_threshold < 100 && diff_list->conflicts.length <= opts->target_limit) {
|
|
1404
1526
|
GITERR_CHECK_ALLOC_MULTIPLY(&cache_size, diff_list->conflicts.length, 3);
|
|
1405
1527
|
cache = git__calloc(cache_size, sizeof(void *));
|
|
1406
1528
|
GITERR_CHECK_ALLOC(cache);
|
|
@@ -1410,9 +1532,8 @@ int git_merge_diff_list__find_renames(
|
|
|
1410
1532
|
if (src_count > opts->target_limit || tgt_count > opts->target_limit) {
|
|
1411
1533
|
/* TODO: report! */
|
|
1412
1534
|
} else {
|
|
1413
|
-
if ((error =
|
|
1414
|
-
repo, diff_list, similarity_ours, similarity_theirs,
|
|
1415
|
-
index_entry_similarity_inexact, cache, opts)) < 0)
|
|
1535
|
+
if ((error = merge_diff_mark_similarity_inexact(
|
|
1536
|
+
repo, diff_list, similarity_ours, similarity_theirs, cache, opts)) < 0)
|
|
1416
1537
|
goto done;
|
|
1417
1538
|
}
|
|
1418
1539
|
}
|
|
@@ -1954,6 +2075,7 @@ int git_merge__iterators(
|
|
|
1954
2075
|
file_opts.our_label = "Temporary merge branch 1";
|
|
1955
2076
|
file_opts.their_label = "Temporary merge branch 2";
|
|
1956
2077
|
file_opts.flags |= GIT_MERGE_FILE_FAVOR__CONFLICTED;
|
|
2078
|
+
file_opts.marker_size = GIT_MERGE_CONFLICT_MARKER_SIZE + 2;
|
|
1957
2079
|
}
|
|
1958
2080
|
|
|
1959
2081
|
diff_list = git_merge_diff_list__alloc(repo);
|