rugged 1.3.2.3 → 1.4.2
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/ext/rugged/extconf.rb +1 -1
- data/ext/rugged/rugged_config.c +7 -2
- data/ext/rugged/rugged_remote.c +17 -0
- data/lib/rugged/version.rb +1 -1
- data/vendor/libgit2/CMakeLists.txt +103 -276
- data/vendor/libgit2/COPYING +36 -19
- data/vendor/libgit2/cmake/AddCFlagIfSupported.cmake +21 -21
- data/vendor/libgit2/cmake/DefaultCFlags.cmake +154 -0
- data/vendor/libgit2/cmake/EnableWarnings.cmake +13 -13
- data/vendor/libgit2/cmake/FindCoreFoundation.cmake +13 -13
- data/vendor/libgit2/cmake/FindGSSAPI.cmake +171 -287
- data/vendor/libgit2/cmake/FindGSSFramework.cmake +13 -13
- data/vendor/libgit2/cmake/{FindHTTP_Parser.cmake → FindHTTPParser.cmake} +17 -17
- data/vendor/libgit2/cmake/FindIconv.cmake +27 -27
- data/vendor/libgit2/cmake/FindLibSSH2.cmake +5 -5
- data/vendor/libgit2/cmake/FindPCRE.cmake +13 -13
- data/vendor/libgit2/cmake/FindPCRE2.cmake +12 -12
- data/vendor/libgit2/cmake/FindPkgLibraries.cmake +19 -19
- data/vendor/libgit2/cmake/FindSecurity.cmake +14 -14
- data/vendor/libgit2/cmake/FindStatNsec.cmake +12 -18
- data/vendor/libgit2/cmake/Findfutimens.cmake +8 -8
- data/vendor/libgit2/cmake/FindmbedTLS.cmake +63 -70
- data/vendor/libgit2/cmake/IdeSplitSources.cmake +18 -18
- data/vendor/libgit2/cmake/PkgBuildConfig.cmake +60 -60
- data/vendor/libgit2/cmake/SanitizeBool.cmake +20 -20
- data/vendor/libgit2/cmake/SelectGSSAPI.cmake +37 -37
- data/vendor/libgit2/cmake/SelectHTTPParser.cmake +19 -0
- data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +100 -100
- data/vendor/libgit2/cmake/SelectHashes.cmake +39 -49
- data/vendor/libgit2/cmake/SelectRegex.cmake +51 -0
- data/vendor/libgit2/cmake/SelectSSH.cmake +41 -0
- data/vendor/libgit2/cmake/SelectWinHTTP.cmake +17 -0
- data/vendor/libgit2/cmake/SelectZlib.cmake +34 -0
- data/vendor/libgit2/deps/chromium-zlib/CMakeLists.txt +6 -6
- data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +31 -31
- data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +1 -1
- data/vendor/libgit2/deps/ntlmclient/ntlm.c +4 -4
- data/vendor/libgit2/deps/ntlmclient/ntlm.h +4 -4
- data/vendor/libgit2/deps/ntlmclient/ntlmclient.h +2 -2
- data/vendor/libgit2/deps/pcre/CMakeLists.txt +88 -88
- data/vendor/libgit2/deps/winhttp/CMakeLists.txt +14 -16
- data/vendor/libgit2/deps/zlib/adler32.c +0 -7
- data/vendor/libgit2/deps/zlib/crc32.c +288 -975
- data/vendor/libgit2/deps/zlib/crc32.h +436 -9441
- data/vendor/libgit2/deps/zlib/deflate.c +31 -83
- data/vendor/libgit2/deps/zlib/deflate.h +15 -12
- data/vendor/libgit2/deps/zlib/gzguts.h +2 -3
- data/vendor/libgit2/deps/zlib/infback.c +1 -2
- data/vendor/libgit2/deps/zlib/inffast.c +14 -14
- data/vendor/libgit2/deps/zlib/inflate.c +8 -39
- data/vendor/libgit2/deps/zlib/inflate.h +2 -3
- data/vendor/libgit2/deps/zlib/inftrees.c +3 -3
- data/vendor/libgit2/deps/zlib/trees.c +48 -27
- data/vendor/libgit2/deps/zlib/zlib.h +100 -126
- data/vendor/libgit2/deps/zlib/zutil.c +2 -2
- data/vendor/libgit2/deps/zlib/zutil.h +9 -12
- data/vendor/libgit2/include/git2/apply.h +16 -2
- data/vendor/libgit2/include/git2/attr.h +11 -2
- data/vendor/libgit2/include/git2/blame.h +4 -1
- data/vendor/libgit2/include/git2/blob.h +14 -1
- data/vendor/libgit2/include/git2/branch.h +2 -0
- data/vendor/libgit2/include/git2/buffer.h +18 -78
- data/vendor/libgit2/include/git2/cert.h +2 -2
- data/vendor/libgit2/include/git2/checkout.h +5 -2
- data/vendor/libgit2/include/git2/clone.h +3 -3
- data/vendor/libgit2/include/git2/commit.h +2 -0
- data/vendor/libgit2/include/git2/common.h +5 -12
- data/vendor/libgit2/include/git2/config.h +19 -3
- data/vendor/libgit2/include/git2/credential.h +2 -1
- data/vendor/libgit2/include/git2/credential_helpers.h +1 -0
- data/vendor/libgit2/include/git2/deprecated.h +1 -1
- data/vendor/libgit2/include/git2/describe.h +7 -2
- data/vendor/libgit2/include/git2/diff.h +17 -9
- data/vendor/libgit2/include/git2/email.h +1 -1
- data/vendor/libgit2/include/git2/errors.h +1 -2
- data/vendor/libgit2/include/git2/filter.h +7 -2
- data/vendor/libgit2/include/git2/graph.h +1 -0
- data/vendor/libgit2/include/git2/ignore.h +1 -1
- data/vendor/libgit2/include/git2/index.h +11 -5
- data/vendor/libgit2/include/git2/indexer.h +19 -0
- data/vendor/libgit2/include/git2/merge.h +23 -3
- data/vendor/libgit2/include/git2/message.h +2 -0
- data/vendor/libgit2/include/git2/object.h +23 -0
- data/vendor/libgit2/include/git2/odb.h +37 -7
- data/vendor/libgit2/include/git2/odb_backend.h +1 -1
- data/vendor/libgit2/include/git2/pack.h +24 -8
- data/vendor/libgit2/include/git2/patch.h +8 -0
- data/vendor/libgit2/include/git2/pathspec.h +1 -1
- data/vendor/libgit2/include/git2/proxy.h +1 -1
- data/vendor/libgit2/include/git2/rebase.h +9 -1
- data/vendor/libgit2/include/git2/refdb.h +3 -0
- data/vendor/libgit2/include/git2/reflog.h +1 -1
- data/vendor/libgit2/include/git2/refs.h +2 -2
- data/vendor/libgit2/include/git2/remote.h +184 -37
- data/vendor/libgit2/include/git2/repository.h +14 -9
- data/vendor/libgit2/include/git2/reset.h +2 -2
- data/vendor/libgit2/include/git2/revparse.h +1 -1
- data/vendor/libgit2/include/git2/revwalk.h +4 -1
- data/vendor/libgit2/include/git2/signature.h +1 -1
- data/vendor/libgit2/include/git2/stash.h +3 -3
- data/vendor/libgit2/include/git2/status.h +9 -3
- data/vendor/libgit2/include/git2/submodule.h +7 -2
- data/vendor/libgit2/include/git2/sys/commit_graph.h +1 -1
- data/vendor/libgit2/include/git2/sys/odb_backend.h +2 -5
- data/vendor/libgit2/include/git2/sys/remote.h +31 -0
- data/vendor/libgit2/include/git2/sys/stream.h +1 -1
- data/vendor/libgit2/include/git2/sys/transport.h +25 -34
- data/vendor/libgit2/include/git2/tag.h +1 -0
- data/vendor/libgit2/include/git2/tree.h +4 -3
- data/vendor/libgit2/include/git2/types.h +7 -7
- data/vendor/libgit2/include/git2/version.h +3 -3
- data/vendor/libgit2/include/git2/worktree.h +12 -2
- data/vendor/libgit2/src/CMakeLists.txt +189 -315
- data/vendor/libgit2/src/annotated_commit.h +1 -1
- data/vendor/libgit2/src/apply.c +18 -18
- data/vendor/libgit2/src/apply.h +2 -2
- data/vendor/libgit2/src/attr.c +18 -18
- data/vendor/libgit2/src/attr_file.c +17 -17
- data/vendor/libgit2/src/attr_file.h +4 -4
- data/vendor/libgit2/src/attrcache.c +17 -12
- data/vendor/libgit2/src/blame_git.c +1 -1
- data/vendor/libgit2/src/blob.c +33 -26
- data/vendor/libgit2/src/blob.h +1 -1
- data/vendor/libgit2/src/branch.c +150 -109
- data/vendor/libgit2/src/branch.h +15 -3
- data/vendor/libgit2/src/buf.c +126 -0
- data/vendor/libgit2/src/buf.h +50 -0
- data/vendor/libgit2/src/cc-compat.h +1 -1
- data/vendor/libgit2/src/checkout.c +74 -68
- data/vendor/libgit2/src/cherrypick.c +10 -10
- data/vendor/libgit2/src/clone.c +66 -66
- data/vendor/libgit2/src/commit.c +128 -58
- data/vendor/libgit2/src/commit.h +24 -1
- data/vendor/libgit2/src/commit_graph.c +68 -53
- data/vendor/libgit2/src/commit_graph.h +10 -3
- data/vendor/libgit2/src/commit_list.c +2 -3
- data/vendor/libgit2/src/common.h +10 -3
- data/vendor/libgit2/src/config.c +99 -77
- data/vendor/libgit2/src/config.h +15 -2
- data/vendor/libgit2/src/config_file.c +103 -91
- data/vendor/libgit2/src/config_mem.c +9 -9
- data/vendor/libgit2/src/config_parse.c +27 -23
- data/vendor/libgit2/src/crlf.c +24 -21
- data/vendor/libgit2/src/date.c +10 -17
- data/vendor/libgit2/src/date.h +33 -0
- data/vendor/libgit2/src/describe.c +27 -19
- data/vendor/libgit2/src/diff.c +25 -8
- data/vendor/libgit2/src/diff.h +2 -4
- data/vendor/libgit2/src/diff_driver.c +34 -36
- data/vendor/libgit2/src/diff_driver.h +3 -3
- data/vendor/libgit2/src/diff_file.c +29 -20
- data/vendor/libgit2/src/diff_generate.c +30 -6
- data/vendor/libgit2/src/diff_generate.h +5 -3
- data/vendor/libgit2/src/diff_print.c +102 -95
- data/vendor/libgit2/src/diff_stats.c +40 -29
- data/vendor/libgit2/src/{message.h → diff_stats.h} +7 -6
- data/vendor/libgit2/src/diff_tform.c +9 -8
- data/vendor/libgit2/src/diff_xdiff.c +3 -8
- data/vendor/libgit2/src/email.c +54 -38
- data/vendor/libgit2/src/email.h +1 -1
- data/vendor/libgit2/src/errors.c +18 -18
- data/vendor/libgit2/src/features.h.in +6 -1
- data/vendor/libgit2/src/fetch.c +69 -24
- data/vendor/libgit2/src/fetch.h +1 -1
- data/vendor/libgit2/src/fetchhead.c +19 -19
- data/vendor/libgit2/src/filebuf.c +28 -28
- data/vendor/libgit2/src/filebuf.h +1 -1
- data/vendor/libgit2/src/filter.c +96 -52
- data/vendor/libgit2/src/filter.h +26 -5
- data/vendor/libgit2/src/fs_path.c +1912 -0
- data/vendor/libgit2/src/fs_path.h +752 -0
- data/vendor/libgit2/src/futils.c +91 -85
- data/vendor/libgit2/src/futils.h +26 -14
- data/vendor/libgit2/src/hash/sha1/collisiondetect.c +2 -2
- data/vendor/libgit2/src/hash/sha1/common_crypto.c +2 -2
- data/vendor/libgit2/src/hash/sha1/generic.c +2 -2
- data/vendor/libgit2/src/hash/sha1/mbedtls.c +2 -2
- data/vendor/libgit2/src/hash/sha1/openssl.c +2 -2
- data/vendor/libgit2/src/hash/sha1/sha1dc/sha1.c +1 -1
- data/vendor/libgit2/src/hash/sha1/win32.c +6 -6
- data/vendor/libgit2/src/hash/sha1.h +3 -1
- data/vendor/libgit2/src/hash.c +67 -35
- data/vendor/libgit2/src/hash.h +12 -12
- data/vendor/libgit2/src/ident.c +18 -18
- data/vendor/libgit2/src/ignore.c +35 -34
- data/vendor/libgit2/src/ignore.h +2 -2
- data/vendor/libgit2/src/index.c +79 -80
- data/vendor/libgit2/src/index.h +6 -3
- data/vendor/libgit2/src/indexer.c +75 -57
- data/vendor/libgit2/src/iterator.c +64 -56
- data/vendor/libgit2/src/iterator.h +5 -5
- data/vendor/libgit2/src/khash.h +1 -1
- data/vendor/libgit2/src/libgit2.c +22 -19
- data/vendor/libgit2/src/mailmap.c +38 -36
- data/vendor/libgit2/src/merge.c +27 -27
- data/vendor/libgit2/src/merge.h +1 -14
- data/vendor/libgit2/src/merge_driver.c +2 -2
- data/vendor/libgit2/src/merge_file.c +13 -3
- data/vendor/libgit2/src/message.c +21 -10
- data/vendor/libgit2/src/midx.c +83 -66
- data/vendor/libgit2/src/midx.h +3 -3
- data/vendor/libgit2/src/mwindow.c +1 -1
- data/vendor/libgit2/src/net.c +278 -68
- data/vendor/libgit2/src/net.h +10 -3
- data/vendor/libgit2/src/netops.c +1 -1
- data/vendor/libgit2/src/netops.h +1 -1
- data/vendor/libgit2/src/notes.c +20 -29
- data/vendor/libgit2/src/object.c +49 -9
- data/vendor/libgit2/src/object.h +1 -1
- data/vendor/libgit2/src/odb.c +35 -32
- data/vendor/libgit2/src/odb.h +1 -1
- data/vendor/libgit2/src/odb_loose.c +68 -68
- data/vendor/libgit2/src/odb_mempack.c +18 -5
- data/vendor/libgit2/src/odb_pack.c +43 -43
- data/vendor/libgit2/src/oid.c +11 -4
- data/vendor/libgit2/src/oid.h +15 -0
- data/vendor/libgit2/src/pack-objects.c +41 -26
- data/vendor/libgit2/src/pack-objects.h +11 -6
- data/vendor/libgit2/src/pack.c +10 -10
- data/vendor/libgit2/src/patch.c +3 -3
- data/vendor/libgit2/src/patch.h +1 -0
- data/vendor/libgit2/src/patch_generate.c +27 -11
- data/vendor/libgit2/src/patch_generate.h +5 -5
- data/vendor/libgit2/src/patch_parse.c +24 -24
- data/vendor/libgit2/src/path.c +76 -1951
- data/vendor/libgit2/src/path.h +34 -741
- data/vendor/libgit2/src/pathspec.c +6 -6
- data/vendor/libgit2/src/pathspec.h +2 -2
- data/vendor/libgit2/src/posix.c +3 -3
- data/vendor/libgit2/src/posix.h +1 -0
- data/vendor/libgit2/src/pqueue.h +1 -1
- data/vendor/libgit2/src/proxy.c +4 -1
- data/vendor/libgit2/src/proxy.h +1 -1
- data/vendor/libgit2/src/push.c +30 -35
- data/vendor/libgit2/src/push.h +4 -16
- data/vendor/libgit2/src/rand.c +226 -0
- data/vendor/libgit2/src/rand.h +37 -0
- data/vendor/libgit2/src/reader.c +8 -8
- data/vendor/libgit2/src/reader.h +2 -2
- data/vendor/libgit2/src/rebase.c +89 -88
- data/vendor/libgit2/src/refdb_fs.c +447 -173
- data/vendor/libgit2/src/refs.c +32 -32
- data/vendor/libgit2/src/refs.h +2 -2
- data/vendor/libgit2/src/refspec.c +32 -37
- data/vendor/libgit2/src/refspec.h +5 -2
- data/vendor/libgit2/src/regexp.c +1 -1
- data/vendor/libgit2/src/remote.c +713 -419
- data/vendor/libgit2/src/remote.h +15 -10
- data/vendor/libgit2/src/repository.c +350 -467
- data/vendor/libgit2/src/repository.h +11 -10
- data/vendor/libgit2/src/reset.c +8 -5
- data/vendor/libgit2/src/revert.c +10 -10
- data/vendor/libgit2/src/revparse.c +48 -35
- data/vendor/libgit2/src/revwalk.c +7 -7
- data/vendor/libgit2/src/signature.c +12 -6
- data/vendor/libgit2/src/signature.h +1 -1
- data/vendor/libgit2/src/sortedcache.c +1 -1
- data/vendor/libgit2/src/sortedcache.h +1 -1
- data/vendor/libgit2/src/stash.c +36 -37
- data/vendor/libgit2/src/status.c +4 -1
- data/vendor/libgit2/src/{buffer.c → str.c} +157 -151
- data/vendor/libgit2/src/str.h +357 -0
- data/vendor/libgit2/src/streams/mbedtls.c +8 -6
- data/vendor/libgit2/src/streams/openssl_dynamic.h +3 -3
- data/vendor/libgit2/src/submodule.c +171 -159
- data/vendor/libgit2/src/submodule.h +1 -1
- data/vendor/libgit2/src/sysdir.c +68 -52
- data/vendor/libgit2/src/sysdir.h +15 -10
- data/vendor/libgit2/src/tag.c +29 -27
- data/vendor/libgit2/src/thread.h +3 -3
- data/vendor/libgit2/src/threadstate.c +3 -3
- data/vendor/libgit2/src/threadstate.h +1 -1
- data/vendor/libgit2/src/trace.c +1 -14
- data/vendor/libgit2/src/trace.h +5 -22
- data/vendor/libgit2/src/trailer.c +1 -1
- data/vendor/libgit2/src/transaction.c +1 -1
- data/vendor/libgit2/src/transport.c +10 -10
- data/vendor/libgit2/src/transports/auth.c +7 -9
- data/vendor/libgit2/src/transports/auth.h +2 -3
- data/vendor/libgit2/src/transports/auth_negotiate.c +12 -13
- data/vendor/libgit2/src/transports/auth_ntlm.c +10 -10
- data/vendor/libgit2/src/transports/auth_ntlm.h +0 -1
- data/vendor/libgit2/src/transports/git.c +9 -11
- data/vendor/libgit2/src/transports/http.c +37 -17
- data/vendor/libgit2/src/transports/http.h +2 -3
- data/vendor/libgit2/src/transports/httpclient.c +65 -65
- data/vendor/libgit2/src/transports/local.c +124 -116
- data/vendor/libgit2/src/transports/smart.c +51 -139
- data/vendor/libgit2/src/transports/smart.h +25 -31
- data/vendor/libgit2/src/transports/smart_pkt.c +33 -33
- data/vendor/libgit2/src/transports/smart_protocol.c +57 -39
- data/vendor/libgit2/src/transports/ssh.c +47 -112
- data/vendor/libgit2/src/transports/winhttp.c +50 -56
- data/vendor/libgit2/src/tree-cache.c +5 -5
- data/vendor/libgit2/src/tree-cache.h +2 -2
- data/vendor/libgit2/src/tree.c +59 -48
- data/vendor/libgit2/src/tree.h +1 -1
- data/vendor/libgit2/src/unix/map.c +0 -2
- data/vendor/libgit2/src/unix/posix.h +1 -4
- data/vendor/libgit2/src/unix/realpath.c +0 -2
- data/vendor/libgit2/src/util.c +14 -14
- data/vendor/libgit2/src/util.h +2 -28
- data/vendor/libgit2/src/vector.h +1 -1
- data/vendor/libgit2/src/win32/findfile.c +172 -116
- data/vendor/libgit2/src/win32/findfile.h +7 -4
- data/vendor/libgit2/src/win32/path_w32.c +140 -9
- data/vendor/libgit2/src/win32/path_w32.h +2 -0
- data/vendor/libgit2/src/win32/posix.h +0 -1
- data/vendor/libgit2/src/win32/posix_w32.c +11 -27
- data/vendor/libgit2/src/win32/w32_buffer.c +2 -3
- data/vendor/libgit2/src/win32/w32_buffer.h +2 -3
- data/vendor/libgit2/src/win32/w32_leakcheck.c +1 -1
- data/vendor/libgit2/src/worktree.c +116 -94
- data/vendor/libgit2/src/worktree.h +1 -1
- data/vendor/libgit2/src/xdiff/git-xdiff.h +53 -0
- data/vendor/libgit2/src/xdiff/xdiff.h +15 -15
- data/vendor/libgit2/src/xdiff/xdiffi.c +134 -108
- data/vendor/libgit2/src/xdiff/xemit.c +23 -7
- data/vendor/libgit2/src/xdiff/xhistogram.c +87 -78
- data/vendor/libgit2/src/xdiff/xinclude.h +1 -12
- data/vendor/libgit2/src/xdiff/xmerge.c +104 -117
- data/vendor/libgit2/src/xdiff/xpatience.c +6 -17
- data/vendor/libgit2/src/xdiff/xprepare.c +15 -20
- data/vendor/libgit2/src/xdiff/xutils.c +18 -7
- data/vendor/libgit2/src/zstream.c +5 -5
- data/vendor/libgit2/src/zstream.h +4 -4
- metadata +25 -10
- data/vendor/libgit2/src/buffer.h +0 -374
|
@@ -27,6 +27,8 @@
|
|
|
27
27
|
extern "C" {
|
|
28
28
|
#endif /* #ifdef __cplusplus */
|
|
29
29
|
|
|
30
|
+
#include "git-xdiff.h"
|
|
31
|
+
|
|
30
32
|
/* xpparm_t.flags */
|
|
31
33
|
#define XDF_NEED_MINIMAL (1 << 0)
|
|
32
34
|
|
|
@@ -50,16 +52,9 @@ extern "C" {
|
|
|
50
52
|
|
|
51
53
|
/* xdemitconf_t.flags */
|
|
52
54
|
#define XDL_EMIT_FUNCNAMES (1 << 0)
|
|
55
|
+
#define XDL_EMIT_NO_HUNK_HDR (1 << 1)
|
|
53
56
|
#define XDL_EMIT_FUNCCONTEXT (1 << 2)
|
|
54
57
|
|
|
55
|
-
#define XDL_MMB_READONLY (1 << 0)
|
|
56
|
-
|
|
57
|
-
#define XDL_MMF_ATOMIC (1 << 0)
|
|
58
|
-
|
|
59
|
-
#define XDL_BDOP_INS 1
|
|
60
|
-
#define XDL_BDOP_CPY 2
|
|
61
|
-
#define XDL_BDOP_INSB 3
|
|
62
|
-
|
|
63
58
|
/* merge simplification levels */
|
|
64
59
|
#define XDL_MERGE_MINIMAL 0
|
|
65
60
|
#define XDL_MERGE_EAGER 1
|
|
@@ -73,20 +68,25 @@ extern "C" {
|
|
|
73
68
|
|
|
74
69
|
/* merge output styles */
|
|
75
70
|
#define XDL_MERGE_DIFF3 1
|
|
71
|
+
#define XDL_MERGE_ZEALOUS_DIFF3 2
|
|
76
72
|
|
|
77
73
|
typedef struct s_mmfile {
|
|
78
74
|
char *ptr;
|
|
79
|
-
|
|
75
|
+
long size;
|
|
80
76
|
} mmfile_t;
|
|
81
77
|
|
|
82
78
|
typedef struct s_mmbuffer {
|
|
83
79
|
char *ptr;
|
|
84
|
-
|
|
80
|
+
long size;
|
|
85
81
|
} mmbuffer_t;
|
|
86
82
|
|
|
87
83
|
typedef struct s_xpparam {
|
|
88
84
|
unsigned long flags;
|
|
89
85
|
|
|
86
|
+
/* -I<regex> */
|
|
87
|
+
xdl_regex_t **ignore_regex;
|
|
88
|
+
size_t ignore_regex_nr;
|
|
89
|
+
|
|
90
90
|
/* See Documentation/diff-options.txt. */
|
|
91
91
|
char **anchors;
|
|
92
92
|
size_t anchors_nr;
|
|
@@ -94,7 +94,11 @@ typedef struct s_xpparam {
|
|
|
94
94
|
|
|
95
95
|
typedef struct s_xdemitcb {
|
|
96
96
|
void *priv;
|
|
97
|
-
int (*
|
|
97
|
+
int (*out_hunk)(void *,
|
|
98
|
+
long old_begin, long old_nr,
|
|
99
|
+
long new_begin, long new_nr,
|
|
100
|
+
const char *func, long funclen);
|
|
101
|
+
int (*out_line)(void *, mmbuffer_t *, int);
|
|
98
102
|
} xdemitcb_t;
|
|
99
103
|
|
|
100
104
|
typedef long (*find_func_t)(const char *line, long line_len, char *buffer, long buffer_size, void *priv);
|
|
@@ -117,10 +121,6 @@ typedef struct s_bdiffparam {
|
|
|
117
121
|
} bdiffparam_t;
|
|
118
122
|
|
|
119
123
|
|
|
120
|
-
#define xdl_malloc(x) git__malloc(x)
|
|
121
|
-
#define xdl_free(ptr) git__free(ptr)
|
|
122
|
-
#define xdl_realloc(ptr,x) git__realloc(ptr,x)
|
|
123
|
-
|
|
124
124
|
void *xdl_mmfile_first(mmfile_t *mmf, long *size);
|
|
125
125
|
long xdl_mmfile_size(mmfile_t *mmf);
|
|
126
126
|
|
|
@@ -21,8 +21,6 @@
|
|
|
21
21
|
*/
|
|
22
22
|
|
|
23
23
|
#include "xinclude.h"
|
|
24
|
-
#include "integer.h"
|
|
25
|
-
|
|
26
24
|
|
|
27
25
|
#define XDL_MAX_COST_MIN 256
|
|
28
26
|
#define XDL_HEUR_MIN_COST 256
|
|
@@ -30,41 +28,19 @@
|
|
|
30
28
|
#define XDL_SNAKE_CNT 20
|
|
31
29
|
#define XDL_K_HEUR 4
|
|
32
30
|
|
|
33
|
-
/** Declare a function as always inlined. */
|
|
34
|
-
#if defined(_MSC_VER)
|
|
35
|
-
# define XDL_INLINE(type) static __inline type
|
|
36
|
-
#elif defined(__GNUC__)
|
|
37
|
-
# define XDL_INLINE(type) static __inline__ type
|
|
38
|
-
#else
|
|
39
|
-
# define XDL_INLINE(type) static type
|
|
40
|
-
#endif
|
|
41
|
-
|
|
42
31
|
typedef struct s_xdpsplit {
|
|
43
32
|
long i1, i2;
|
|
44
33
|
int min_lo, min_hi;
|
|
45
34
|
} xdpsplit_t;
|
|
46
35
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
static long xdl_split(unsigned long const *ha1, long off1, long lim1,
|
|
51
|
-
unsigned long const *ha2, long off2, long lim2,
|
|
52
|
-
long *kvdf, long *kvdb, int need_min, xdpsplit_t *spl,
|
|
53
|
-
xdalgoenv_t *xenv);
|
|
54
|
-
static xdchange_t *xdl_add_change(xdchange_t *xscr, long i1, long i2, long chg1, long chg2);
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
36
|
/*
|
|
61
37
|
* See "An O(ND) Difference Algorithm and its Variations", by Eugene Myers.
|
|
62
38
|
* Basically considers a "box" (off1, off2, lim1, lim2) and scan from both
|
|
63
39
|
* the forward diagonal starting from (off1, off2) and the backward diagonal
|
|
64
40
|
* starting from (lim1, lim2). If the K values on the same diagonal crosses
|
|
65
|
-
* returns the furthest point of reach. We might
|
|
66
|
-
*
|
|
67
|
-
*
|
|
41
|
+
* returns the furthest point of reach. We might encounter expensive edge cases
|
|
42
|
+
* using this algorithm, so a little bit of heuristic is needed to cut the
|
|
43
|
+
* search and to return a suboptimal point.
|
|
68
44
|
*/
|
|
69
45
|
static long xdl_split(unsigned long const *ha1, long off1, long lim1,
|
|
70
46
|
unsigned long const *ha2, long off2, long lim2,
|
|
@@ -87,11 +63,13 @@ static long xdl_split(unsigned long const *ha1, long off1, long lim1,
|
|
|
87
63
|
int got_snake = 0;
|
|
88
64
|
|
|
89
65
|
/*
|
|
90
|
-
* We need to
|
|
66
|
+
* We need to extend the diagonal "domain" by one. If the next
|
|
91
67
|
* values exits the box boundaries we need to change it in the
|
|
92
|
-
* opposite direction because (max - min) must be a power of
|
|
68
|
+
* opposite direction because (max - min) must be a power of
|
|
69
|
+
* two.
|
|
70
|
+
*
|
|
93
71
|
* Also we initialize the external K value to -1 so that we can
|
|
94
|
-
* avoid extra conditions check inside the core loop.
|
|
72
|
+
* avoid extra conditions in the check inside the core loop.
|
|
95
73
|
*/
|
|
96
74
|
if (fmin > dmin)
|
|
97
75
|
kvdf[--fmin - 1] = -1;
|
|
@@ -122,11 +100,13 @@ static long xdl_split(unsigned long const *ha1, long off1, long lim1,
|
|
|
122
100
|
}
|
|
123
101
|
|
|
124
102
|
/*
|
|
125
|
-
* We need to
|
|
103
|
+
* We need to extend the diagonal "domain" by one. If the next
|
|
126
104
|
* values exits the box boundaries we need to change it in the
|
|
127
|
-
* opposite direction because (max - min) must be a power of
|
|
105
|
+
* opposite direction because (max - min) must be a power of
|
|
106
|
+
* two.
|
|
107
|
+
*
|
|
128
108
|
* Also we initialize the external K value to -1 so that we can
|
|
129
|
-
* avoid extra conditions check inside the core loop.
|
|
109
|
+
* avoid extra conditions in the check inside the core loop.
|
|
130
110
|
*/
|
|
131
111
|
if (bmin > dmin)
|
|
132
112
|
kvdb[--bmin - 1] = XDL_LINE_MAX;
|
|
@@ -162,7 +142,7 @@ static long xdl_split(unsigned long const *ha1, long off1, long lim1,
|
|
|
162
142
|
/*
|
|
163
143
|
* If the edit cost is above the heuristic trigger and if
|
|
164
144
|
* we got a good snake, we sample current diagonals to see
|
|
165
|
-
* if some of
|
|
145
|
+
* if some of them have reached an "interesting" path. Our
|
|
166
146
|
* measure is a function of the distance from the diagonal
|
|
167
147
|
* corner (i1 + i2) penalized with the distance from the
|
|
168
148
|
* mid diagonal itself. If this value is above the current
|
|
@@ -220,8 +200,9 @@ static long xdl_split(unsigned long const *ha1, long off1, long lim1,
|
|
|
220
200
|
}
|
|
221
201
|
|
|
222
202
|
/*
|
|
223
|
-
* Enough is enough. We spent too much time here and now we
|
|
224
|
-
* the furthest reaching path using the (i1 + i2)
|
|
203
|
+
* Enough is enough. We spent too much time here and now we
|
|
204
|
+
* collect the furthest reaching path using the (i1 + i2)
|
|
205
|
+
* measure.
|
|
225
206
|
*/
|
|
226
207
|
if (ec >= xenv->mxcost) {
|
|
227
208
|
long fbest, fbest1, bbest, bbest1;
|
|
@@ -268,9 +249,9 @@ static long xdl_split(unsigned long const *ha1, long off1, long lim1,
|
|
|
268
249
|
|
|
269
250
|
|
|
270
251
|
/*
|
|
271
|
-
* Rule: "Divide et Impera". Recursively split the box in
|
|
272
|
-
* the box splitting function. Note that the real job
|
|
273
|
-
* is done in the two boundary reaching checks.
|
|
252
|
+
* Rule: "Divide et Impera" (divide & conquer). Recursively split the box in
|
|
253
|
+
* sub-boxes by calling the box splitting function. Note that the real job
|
|
254
|
+
* (marking changed lines) is done in the two boundary reaching checks.
|
|
274
255
|
*/
|
|
275
256
|
int xdl_recs_cmp(diffdata_t *dd1, long off1, long lim1,
|
|
276
257
|
diffdata_t *dd2, long off2, long lim2,
|
|
@@ -330,7 +311,7 @@ int xdl_recs_cmp(diffdata_t *dd1, long off1, long lim1,
|
|
|
330
311
|
|
|
331
312
|
int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
|
|
332
313
|
xdfenv_t *xe) {
|
|
333
|
-
|
|
314
|
+
long ndiags;
|
|
334
315
|
long *kvd, *kvdf, *kvdb;
|
|
335
316
|
xdalgoenv_t xenv;
|
|
336
317
|
diffdata_t dd1, dd2;
|
|
@@ -347,15 +328,14 @@ int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
|
|
|
347
328
|
}
|
|
348
329
|
|
|
349
330
|
/*
|
|
350
|
-
* Allocate and setup K vectors to be used by the differential
|
|
331
|
+
* Allocate and setup K vectors to be used by the differential
|
|
332
|
+
* algorithm.
|
|
333
|
+
*
|
|
351
334
|
* One is to store the forward path and one to store the backward path.
|
|
352
335
|
*/
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
GIT_ERROR_CHECK_ALLOC_ADD(&allocsize, allocsize, 2);
|
|
356
|
-
GIT_ERROR_CHECK_ALLOC_MULTIPLY(&allocsize, allocsize, sizeof(long));
|
|
336
|
+
ndiags = xe->xdf1.nreff + xe->xdf2.nreff + 3;
|
|
337
|
+
if (!(kvd = (long *) xdl_malloc((2 * ndiags + 2) * sizeof(long)))) {
|
|
357
338
|
|
|
358
|
-
if (!(kvd = (long *) xdl_malloc(allocsize))) {
|
|
359
339
|
xdl_free_env(xe);
|
|
360
340
|
return -1;
|
|
361
341
|
}
|
|
@@ -410,19 +390,16 @@ static xdchange_t *xdl_add_change(xdchange_t *xscr, long i1, long i2, long chg1,
|
|
|
410
390
|
}
|
|
411
391
|
|
|
412
392
|
|
|
413
|
-
static int recs_match(xrecord_t *rec1, xrecord_t *rec2
|
|
393
|
+
static int recs_match(xrecord_t *rec1, xrecord_t *rec2)
|
|
414
394
|
{
|
|
415
|
-
return (rec1->ha == rec2->ha
|
|
416
|
-
xdl_recmatch(rec1->ptr, rec1->size,
|
|
417
|
-
rec2->ptr, rec2->size,
|
|
418
|
-
flags));
|
|
395
|
+
return (rec1->ha == rec2->ha);
|
|
419
396
|
}
|
|
420
397
|
|
|
421
398
|
/*
|
|
422
399
|
* If a line is indented more than this, get_indent() just returns this value.
|
|
423
400
|
* This avoids having to do absurd amounts of work for data that are not
|
|
424
|
-
* human-readable text, and also ensures that the output of get_indent fits
|
|
425
|
-
* an int.
|
|
401
|
+
* human-readable text, and also ensures that the output of get_indent fits
|
|
402
|
+
* within an int.
|
|
426
403
|
*/
|
|
427
404
|
#define MAX_INDENT 200
|
|
428
405
|
|
|
@@ -456,9 +433,9 @@ static int get_indent(xrecord_t *rec)
|
|
|
456
433
|
}
|
|
457
434
|
|
|
458
435
|
/*
|
|
459
|
-
* If more than this number of consecutive blank rows are found, just return
|
|
460
|
-
* value. This avoids requiring O(N^2) work for pathological cases, and
|
|
461
|
-
* ensures that the output of score_split fits in an int.
|
|
436
|
+
* If more than this number of consecutive blank rows are found, just return
|
|
437
|
+
* this value. This avoids requiring O(N^2) work for pathological cases, and
|
|
438
|
+
* also ensures that the output of score_split fits in an int.
|
|
462
439
|
*/
|
|
463
440
|
#define MAX_BLANKS 20
|
|
464
441
|
|
|
@@ -470,8 +447,8 @@ struct split_measurement {
|
|
|
470
447
|
int end_of_file;
|
|
471
448
|
|
|
472
449
|
/*
|
|
473
|
-
* How much is the line immediately following the split indented (or -1
|
|
474
|
-
* the line is blank):
|
|
450
|
+
* How much is the line immediately following the split indented (or -1
|
|
451
|
+
* if the line is blank):
|
|
475
452
|
*/
|
|
476
453
|
int indent;
|
|
477
454
|
|
|
@@ -481,8 +458,8 @@ struct split_measurement {
|
|
|
481
458
|
int pre_blank;
|
|
482
459
|
|
|
483
460
|
/*
|
|
484
|
-
* How much is the nearest non-blank line above the split indented (or
|
|
485
|
-
* if there is no such line)?
|
|
461
|
+
* How much is the nearest non-blank line above the split indented (or
|
|
462
|
+
* -1 if there is no such line)?
|
|
486
463
|
*/
|
|
487
464
|
int pre_indent;
|
|
488
465
|
|
|
@@ -601,15 +578,20 @@ static void measure_split(const xdfile_t *xdf, long split,
|
|
|
601
578
|
*/
|
|
602
579
|
#define INDENT_WEIGHT 60
|
|
603
580
|
|
|
581
|
+
/*
|
|
582
|
+
* How far do we slide a hunk at most?
|
|
583
|
+
*/
|
|
584
|
+
#define INDENT_HEURISTIC_MAX_SLIDING 100
|
|
585
|
+
|
|
604
586
|
/*
|
|
605
587
|
* Compute a badness score for the hypothetical split whose measurements are
|
|
606
|
-
* stored in m. The weight factors were determined empirically using the tools
|
|
607
|
-
* corpus described in
|
|
588
|
+
* stored in m. The weight factors were determined empirically using the tools
|
|
589
|
+
* and corpus described in
|
|
608
590
|
*
|
|
609
591
|
* https://github.com/mhagger/diff-slider-tools
|
|
610
592
|
*
|
|
611
|
-
* Also see that project if you want to improve the weights based on, for
|
|
612
|
-
* a larger or more diverse corpus.
|
|
593
|
+
* Also see that project if you want to improve the weights based on, for
|
|
594
|
+
* example, a larger or more diverse corpus.
|
|
613
595
|
*/
|
|
614
596
|
static void score_add_split(const struct split_measurement *m, struct split_score *s)
|
|
615
597
|
{
|
|
@@ -741,7 +723,7 @@ static void group_init(xdfile_t *xdf, struct xdlgroup *g)
|
|
|
741
723
|
* Move g to describe the next (possibly empty) group in xdf and return 0. If g
|
|
742
724
|
* is already at the end of the file, do nothing and return -1.
|
|
743
725
|
*/
|
|
744
|
-
|
|
726
|
+
static inline int group_next(xdfile_t *xdf, struct xdlgroup *g)
|
|
745
727
|
{
|
|
746
728
|
if (g->end == xdf->nrec)
|
|
747
729
|
return -1;
|
|
@@ -757,7 +739,7 @@ XDL_INLINE(int) group_next(xdfile_t *xdf, struct xdlgroup *g)
|
|
|
757
739
|
* Move g to describe the previous (possibly empty) group in xdf and return 0.
|
|
758
740
|
* If g is already at the beginning of the file, do nothing and return -1.
|
|
759
741
|
*/
|
|
760
|
-
|
|
742
|
+
static inline int group_previous(xdfile_t *xdf, struct xdlgroup *g)
|
|
761
743
|
{
|
|
762
744
|
if (g->start == 0)
|
|
763
745
|
return -1;
|
|
@@ -774,10 +756,10 @@ XDL_INLINE(int) group_previous(xdfile_t *xdf, struct xdlgroup *g)
|
|
|
774
756
|
* following group, expand this group to include it. Return 0 on success or -1
|
|
775
757
|
* if g cannot be slid down.
|
|
776
758
|
*/
|
|
777
|
-
static int group_slide_down(xdfile_t *xdf, struct xdlgroup *g
|
|
759
|
+
static int group_slide_down(xdfile_t *xdf, struct xdlgroup *g)
|
|
778
760
|
{
|
|
779
761
|
if (g->end < xdf->nrec &&
|
|
780
|
-
recs_match(xdf->recs[g->start], xdf->recs[g->end]
|
|
762
|
+
recs_match(xdf->recs[g->start], xdf->recs[g->end])) {
|
|
781
763
|
xdf->rchg[g->start++] = 0;
|
|
782
764
|
xdf->rchg[g->end++] = 1;
|
|
783
765
|
|
|
@@ -795,10 +777,10 @@ static int group_slide_down(xdfile_t *xdf, struct xdlgroup *g, long flags)
|
|
|
795
777
|
* into a previous group, expand this group to include it. Return 0 on success
|
|
796
778
|
* or -1 if g cannot be slid up.
|
|
797
779
|
*/
|
|
798
|
-
static int group_slide_up(xdfile_t *xdf, struct xdlgroup *g
|
|
780
|
+
static int group_slide_up(xdfile_t *xdf, struct xdlgroup *g)
|
|
799
781
|
{
|
|
800
782
|
if (g->start > 0 &&
|
|
801
|
-
recs_match(xdf->recs[g->start - 1], xdf->recs[g->end - 1]
|
|
783
|
+
recs_match(xdf->recs[g->start - 1], xdf->recs[g->end - 1])) {
|
|
802
784
|
xdf->rchg[--g->start] = 1;
|
|
803
785
|
xdf->rchg[--g->end] = 0;
|
|
804
786
|
|
|
@@ -811,12 +793,6 @@ static int group_slide_up(xdfile_t *xdf, struct xdlgroup *g, long flags)
|
|
|
811
793
|
}
|
|
812
794
|
}
|
|
813
795
|
|
|
814
|
-
static void xdl_bug(const char *msg)
|
|
815
|
-
{
|
|
816
|
-
fprintf(stderr, "BUG: %s\n", msg);
|
|
817
|
-
exit(1);
|
|
818
|
-
}
|
|
819
|
-
|
|
820
796
|
/*
|
|
821
797
|
* Move back and forward change groups for a consistent and pretty diff output.
|
|
822
798
|
* This also helps in finding joinable change groups and reducing the diff
|
|
@@ -831,13 +807,16 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
|
|
|
831
807
|
group_init(xdfo, &go);
|
|
832
808
|
|
|
833
809
|
while (1) {
|
|
834
|
-
/*
|
|
810
|
+
/*
|
|
811
|
+
* If the group is empty in the to-be-compacted file, skip it:
|
|
812
|
+
*/
|
|
835
813
|
if (g.end == g.start)
|
|
836
814
|
goto next;
|
|
837
815
|
|
|
838
816
|
/*
|
|
839
817
|
* Now shift the change up and then down as far as possible in
|
|
840
|
-
* each direction. If it bumps into any other changes, merge
|
|
818
|
+
* each direction. If it bumps into any other changes, merge
|
|
819
|
+
* them.
|
|
841
820
|
*/
|
|
842
821
|
do {
|
|
843
822
|
groupsize = g.end - g.start;
|
|
@@ -851,9 +830,9 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
|
|
|
851
830
|
end_matching_other = -1;
|
|
852
831
|
|
|
853
832
|
/* Shift the group backward as much as possible: */
|
|
854
|
-
while (!group_slide_up(xdf, &g
|
|
833
|
+
while (!group_slide_up(xdf, &g))
|
|
855
834
|
if (group_previous(xdfo, &go))
|
|
856
|
-
|
|
835
|
+
XDL_BUG("group sync broken sliding up");
|
|
857
836
|
|
|
858
837
|
/*
|
|
859
838
|
* This is this highest that this group can be shifted.
|
|
@@ -866,10 +845,10 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
|
|
|
866
845
|
|
|
867
846
|
/* Now shift the group forward as far as possible: */
|
|
868
847
|
while (1) {
|
|
869
|
-
if (group_slide_down(xdf, &g
|
|
848
|
+
if (group_slide_down(xdf, &g))
|
|
870
849
|
break;
|
|
871
850
|
if (group_next(xdfo, &go))
|
|
872
|
-
|
|
851
|
+
XDL_BUG("group sync broken sliding down");
|
|
873
852
|
|
|
874
853
|
if (go.end > go.start)
|
|
875
854
|
end_matching_other = g.end;
|
|
@@ -880,40 +859,46 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
|
|
|
880
859
|
* If the group can be shifted, then we can possibly use this
|
|
881
860
|
* freedom to produce a more intuitive diff.
|
|
882
861
|
*
|
|
883
|
-
* The group is currently shifted as far down as possible, so
|
|
884
|
-
* heuristics below only have to handle upwards shifts.
|
|
862
|
+
* The group is currently shifted as far down as possible, so
|
|
863
|
+
* the heuristics below only have to handle upwards shifts.
|
|
885
864
|
*/
|
|
886
865
|
|
|
887
866
|
if (g.end == earliest_end) {
|
|
888
867
|
/* no shifting was possible */
|
|
889
868
|
} else if (end_matching_other != -1) {
|
|
890
869
|
/*
|
|
891
|
-
* Move the possibly merged group of changes back to
|
|
892
|
-
* up with the last group of changes from the
|
|
893
|
-
* that it can align with.
|
|
870
|
+
* Move the possibly merged group of changes back to
|
|
871
|
+
* line up with the last group of changes from the
|
|
872
|
+
* other file that it can align with.
|
|
894
873
|
*/
|
|
895
874
|
while (go.end == go.start) {
|
|
896
|
-
if (group_slide_up(xdf, &g
|
|
897
|
-
|
|
875
|
+
if (group_slide_up(xdf, &g))
|
|
876
|
+
XDL_BUG("match disappeared");
|
|
898
877
|
if (group_previous(xdfo, &go))
|
|
899
|
-
|
|
878
|
+
XDL_BUG("group sync broken sliding to match");
|
|
900
879
|
}
|
|
901
880
|
} else if (flags & XDF_INDENT_HEURISTIC) {
|
|
902
881
|
/*
|
|
903
882
|
* Indent heuristic: a group of pure add/delete lines
|
|
904
|
-
* implies two splits, one between the end of the
|
|
905
|
-
* context and the start of the group, and
|
|
906
|
-
* the end of the group and the
|
|
907
|
-
* context. Some splits are
|
|
908
|
-
* are worse. We compute
|
|
909
|
-
*
|
|
910
|
-
*
|
|
911
|
-
*
|
|
883
|
+
* implies two splits, one between the end of the
|
|
884
|
+
* "before" context and the start of the group, and
|
|
885
|
+
* another between the end of the group and the
|
|
886
|
+
* beginning of the "after" context. Some splits are
|
|
887
|
+
* aesthetically better and some are worse. We compute
|
|
888
|
+
* a badness "score" for each split, and add the scores
|
|
889
|
+
* for the two splits to define a "score" for each
|
|
890
|
+
* position that the group can be shifted to. Then we
|
|
891
|
+
* pick the shift with the lowest score.
|
|
912
892
|
*/
|
|
913
893
|
long shift, best_shift = -1;
|
|
914
894
|
struct split_score best_score;
|
|
915
895
|
|
|
916
|
-
|
|
896
|
+
shift = earliest_end;
|
|
897
|
+
if (g.end - groupsize - 1 > shift)
|
|
898
|
+
shift = g.end - groupsize - 1;
|
|
899
|
+
if (g.end - INDENT_HEURISTIC_MAX_SLIDING > shift)
|
|
900
|
+
shift = g.end - INDENT_HEURISTIC_MAX_SLIDING;
|
|
901
|
+
for (; shift <= g.end; shift++) {
|
|
917
902
|
struct split_measurement m;
|
|
918
903
|
struct split_score score = {0, 0};
|
|
919
904
|
|
|
@@ -930,10 +915,10 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
|
|
|
930
915
|
}
|
|
931
916
|
|
|
932
917
|
while (g.end > best_shift) {
|
|
933
|
-
if (group_slide_up(xdf, &g
|
|
934
|
-
|
|
918
|
+
if (group_slide_up(xdf, &g))
|
|
919
|
+
XDL_BUG("best shift unreached");
|
|
935
920
|
if (group_previous(xdfo, &go))
|
|
936
|
-
|
|
921
|
+
XDL_BUG("group sync broken sliding to blank line");
|
|
937
922
|
}
|
|
938
923
|
}
|
|
939
924
|
|
|
@@ -942,11 +927,11 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
|
|
|
942
927
|
if (group_next(xdf, &g))
|
|
943
928
|
break;
|
|
944
929
|
if (group_next(xdfo, &go))
|
|
945
|
-
|
|
930
|
+
XDL_BUG("group sync broken moving to next group");
|
|
946
931
|
}
|
|
947
932
|
|
|
948
933
|
if (!group_next(xdfo, &go))
|
|
949
|
-
|
|
934
|
+
XDL_BUG("group sync broken at end of file");
|
|
950
935
|
|
|
951
936
|
return 0;
|
|
952
937
|
}
|
|
@@ -992,8 +977,6 @@ static int xdl_call_hunk_func(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
|
|
|
992
977
|
{
|
|
993
978
|
xdchange_t *xch, *xche;
|
|
994
979
|
|
|
995
|
-
(void)xe;
|
|
996
|
-
|
|
997
980
|
for (xch = xscr; xch; xch = xche->next) {
|
|
998
981
|
xche = xdl_get_hunk(&xch, xecfg);
|
|
999
982
|
if (!xch)
|
|
@@ -1006,7 +989,7 @@ static int xdl_call_hunk_func(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
|
|
|
1006
989
|
return 0;
|
|
1007
990
|
}
|
|
1008
991
|
|
|
1009
|
-
static void
|
|
992
|
+
static void xdl_mark_ignorable_lines(xdchange_t *xscr, xdfenv_t *xe, long flags)
|
|
1010
993
|
{
|
|
1011
994
|
xdchange_t *xch;
|
|
1012
995
|
|
|
@@ -1027,6 +1010,46 @@ static void xdl_mark_ignorable(xdchange_t *xscr, xdfenv_t *xe, long flags)
|
|
|
1027
1010
|
}
|
|
1028
1011
|
}
|
|
1029
1012
|
|
|
1013
|
+
static int record_matches_regex(xrecord_t *rec, xpparam_t const *xpp) {
|
|
1014
|
+
xdl_regmatch_t regmatch;
|
|
1015
|
+
int i;
|
|
1016
|
+
|
|
1017
|
+
for (i = 0; i < xpp->ignore_regex_nr; i++)
|
|
1018
|
+
if (!xdl_regexec_buf(xpp->ignore_regex[i], rec->ptr, rec->size, 1,
|
|
1019
|
+
®match, 0))
|
|
1020
|
+
return 1;
|
|
1021
|
+
|
|
1022
|
+
return 0;
|
|
1023
|
+
}
|
|
1024
|
+
|
|
1025
|
+
static void xdl_mark_ignorable_regex(xdchange_t *xscr, const xdfenv_t *xe,
|
|
1026
|
+
xpparam_t const *xpp)
|
|
1027
|
+
{
|
|
1028
|
+
xdchange_t *xch;
|
|
1029
|
+
|
|
1030
|
+
for (xch = xscr; xch; xch = xch->next) {
|
|
1031
|
+
xrecord_t **rec;
|
|
1032
|
+
int ignore = 1;
|
|
1033
|
+
long i;
|
|
1034
|
+
|
|
1035
|
+
/*
|
|
1036
|
+
* Do not override --ignore-blank-lines.
|
|
1037
|
+
*/
|
|
1038
|
+
if (xch->ignore)
|
|
1039
|
+
continue;
|
|
1040
|
+
|
|
1041
|
+
rec = &xe->xdf1.recs[xch->i1];
|
|
1042
|
+
for (i = 0; i < xch->chg1 && ignore; i++)
|
|
1043
|
+
ignore = record_matches_regex(rec[i], xpp);
|
|
1044
|
+
|
|
1045
|
+
rec = &xe->xdf2.recs[xch->i2];
|
|
1046
|
+
for (i = 0; i < xch->chg2 && ignore; i++)
|
|
1047
|
+
ignore = record_matches_regex(rec[i], xpp);
|
|
1048
|
+
|
|
1049
|
+
xch->ignore = ignore;
|
|
1050
|
+
}
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1030
1053
|
int xdl_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
|
|
1031
1054
|
xdemitconf_t const *xecfg, xdemitcb_t *ecb) {
|
|
1032
1055
|
xdchange_t *xscr;
|
|
@@ -1046,7 +1069,10 @@ int xdl_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
|
|
|
1046
1069
|
}
|
|
1047
1070
|
if (xscr) {
|
|
1048
1071
|
if (xpp->flags & XDF_IGNORE_BLANK_LINES)
|
|
1049
|
-
|
|
1072
|
+
xdl_mark_ignorable_lines(xscr, &xe, xpp->flags);
|
|
1073
|
+
|
|
1074
|
+
if (xpp->ignore_regex)
|
|
1075
|
+
xdl_mark_ignorable_regex(xscr, &xe, xpp);
|
|
1050
1076
|
|
|
1051
1077
|
if (ef(&xe, xscr, ecb, xecfg) < 0) {
|
|
1052
1078
|
|
|
@@ -31,7 +31,7 @@ static long xdl_get_rec(xdfile_t *xdf, long ri, char const **rec) {
|
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
static int xdl_emit_record(xdfile_t *xdf, long ri, char const *pre, xdemitcb_t *ecb) {
|
|
34
|
-
long size, psize =
|
|
34
|
+
long size, psize = strlen(pre);
|
|
35
35
|
char const *rec;
|
|
36
36
|
|
|
37
37
|
size = xdl_get_rec(xdf, ri, &rec);
|
|
@@ -81,7 +81,7 @@ xdchange_t *xdl_get_hunk(xdchange_t **xscr, xdemitconf_t const *xecfg)
|
|
|
81
81
|
} else if (distance < max_ignorable && xch->ignore) {
|
|
82
82
|
ignored += xch->chg2;
|
|
83
83
|
} else if (lxch != xchp &&
|
|
84
|
-
xch->i1 + ignored - (lxch->i1 + lxch->chg1) >
|
|
84
|
+
xch->i1 + ignored - (lxch->i1 + lxch->chg1) > max_common) {
|
|
85
85
|
break;
|
|
86
86
|
} else if (!xch->ignore) {
|
|
87
87
|
lxch = xch;
|
|
@@ -97,8 +97,6 @@ xdchange_t *xdl_get_hunk(xdchange_t **xscr, xdemitconf_t const *xecfg)
|
|
|
97
97
|
|
|
98
98
|
static long def_ff(const char *rec, long len, char *buf, long sz, void *priv)
|
|
99
99
|
{
|
|
100
|
-
(void)priv;
|
|
101
|
-
|
|
102
100
|
if (len > 0 &&
|
|
103
101
|
(isalpha((unsigned char)*rec) || /* identifier? */
|
|
104
102
|
*rec == '_' || /* also identifier? */
|
|
@@ -174,10 +172,12 @@ int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
|
|
|
174
172
|
struct func_line func_line = { 0 };
|
|
175
173
|
|
|
176
174
|
for (xch = xscr; xch; xch = xche->next) {
|
|
175
|
+
xdchange_t *xchp = xch;
|
|
177
176
|
xche = xdl_get_hunk(&xch, xecfg);
|
|
178
177
|
if (!xch)
|
|
179
178
|
break;
|
|
180
179
|
|
|
180
|
+
pre_context_calculation:
|
|
181
181
|
s1 = XDL_MAX(xch->i1 - xecfg->ctxlen, 0);
|
|
182
182
|
s2 = XDL_MAX(xch->i2 - xecfg->ctxlen, 0);
|
|
183
183
|
|
|
@@ -212,8 +212,23 @@ int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
|
|
|
212
212
|
if (fs1 < 0)
|
|
213
213
|
fs1 = 0;
|
|
214
214
|
if (fs1 < s1) {
|
|
215
|
-
s2
|
|
215
|
+
s2 = XDL_MAX(s2 - (s1 - fs1), 0);
|
|
216
216
|
s1 = fs1;
|
|
217
|
+
|
|
218
|
+
/*
|
|
219
|
+
* Did we extend context upwards into an
|
|
220
|
+
* ignored change?
|
|
221
|
+
*/
|
|
222
|
+
while (xchp != xch &&
|
|
223
|
+
xchp->i1 + xchp->chg1 <= s1 &&
|
|
224
|
+
xchp->i2 + xchp->chg2 <= s2)
|
|
225
|
+
xchp = xchp->next;
|
|
226
|
+
|
|
227
|
+
/* If so, show it after all. */
|
|
228
|
+
if (xchp != xch) {
|
|
229
|
+
xch = xchp;
|
|
230
|
+
goto pre_context_calculation;
|
|
231
|
+
}
|
|
217
232
|
}
|
|
218
233
|
}
|
|
219
234
|
|
|
@@ -234,7 +249,7 @@ int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
|
|
|
234
249
|
if (fe1 < 0)
|
|
235
250
|
fe1 = xe->xdf1.nrec;
|
|
236
251
|
if (fe1 > e1) {
|
|
237
|
-
e2
|
|
252
|
+
e2 = XDL_MIN(e2 + (fe1 - e1), xe->xdf2.nrec);
|
|
238
253
|
e1 = fe1;
|
|
239
254
|
}
|
|
240
255
|
|
|
@@ -263,7 +278,8 @@ int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
|
|
|
263
278
|
s1 - 1, funclineprev);
|
|
264
279
|
funclineprev = s1 - 1;
|
|
265
280
|
}
|
|
266
|
-
if (
|
|
281
|
+
if (!(xecfg->flags & XDL_EMIT_NO_HUNK_HDR) &&
|
|
282
|
+
xdl_emit_hunk_hdr(s1 + 1, e1 - s1, s2 + 1, e2 - s2,
|
|
267
283
|
func_line.buf, func_line.len, ecb) < 0)
|
|
268
284
|
return -1;
|
|
269
285
|
|