rugged 0.26.7 → 0.27.0
Sign up to get free protection for your applications and to get access to all the features.
- 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);
|