diff options
26 files changed, 430 insertions, 20 deletions
diff --git a/src/diff_driver.c b/src/diff_driver.c index 9249d1415..4c9a0af65 100644 --- a/src/diff_driver.c +++ b/src/diff_driver.c @@ -437,6 +437,7 @@ static int diff_context_line__pattern_match( i = (pmatch[1].rm_so >= 0) ? 1 : 0; git_buf_consume(line, git_buf_cstr(line) + pmatch[i].rm_so); git_buf_truncate(line, pmatch[i].rm_eo - pmatch[i].rm_so); + git_buf_rtrim(line); return true; } diff --git a/src/userdiff.h b/src/userdiff.h index 93b4d0d58..2257035ac 100644 --- a/src/userdiff.h +++ b/src/userdiff.h @@ -193,9 +193,9 @@ PATTERNS("php", "|[-+*/<>%&^|=!]=|--|\\+\\+|<<=?|>>=?|&&|\\|\\||::|->"), PATTERNS("javascript", - "^[ \t]*(\(?function[ \t].*)$\n" - "^[ \t]*(var[ \t]+[a-zA-Z_][a-zA-Z0-9_]*[ \t]*=[ \t]*function[ \t\(].*)$\n" - "^[ \t]*([a-zA-Z_][a-zA-Z0-9_]*[ \t]*:[ \t]*function[ \t\(].*)$", + "^[ \t]*(function[ \t][a-zA-Z_][^\{]*)\n" + "^[ \t]*(var[ \t]+[a-zA-Z_][a-zA-Z0-9_]*[ \t]*=[ \t]*function[ \t\(][^\{]*)\n" + "^[ \t]*([a-zA-Z_][a-zA-Z0-9_]*[ \t]*:[ \t]*function[ \t\(][^\{]*)", /* -- */ "[a-zA-Z_][a-zA-Z0-9_]*" "|[-+0-9.e]+[fFlL]?|0[xX]?[0-9a-fA-F]+[lL]?" diff --git a/tests/diff/drivers.c b/tests/diff/drivers.c index 1cbf9e211..8b12368ea 100644 --- a/tests/diff/drivers.c +++ b/tests/diff/drivers.c @@ -180,22 +180,23 @@ void test_diff_drivers__builtins(void) git_patch *patch; git_buf file = GIT_BUF_INIT, actual = GIT_BUF_INIT, expected = GIT_BUF_INIT; git_diff_options opts = GIT_DIFF_OPTIONS_INIT; - int i; - static const char *files[] = { - "html", - NULL - }; + git_vector files = GIT_VECTOR_INIT; + size_t i; + char *path, *extension; g_repo = cl_git_sandbox_init("userdiff"); + cl_git_pass(git_path_dirload("userdiff/files", 9, 0, 0, &files)); + opts.interhunk_lines = 1; opts.context_lines = 1; opts.pathspec.count = 1; - for (i = 0; files[i]; ++i) { - git_buf_sets(&file, "files/file."); - git_buf_puts(&file, files[i]); - opts.pathspec.strings = &file.ptr; + git_vector_foreach(&files, i, path) { + if (git__prefixcmp(path, "files/file.")) + continue; + extension = path + strlen("files/file."); + opts.pathspec.strings = &path; /* do diff with no special driver */ @@ -205,7 +206,7 @@ void test_diff_drivers__builtins(void) cl_git_pass(git_patch_to_buf(&actual, patch)); git_buf_sets(&expected, "userdiff/expected/nodriver/diff."); - git_buf_puts(&expected, files[i]); + git_buf_puts(&expected, extension); cl_git_pass(git_futils_readbuffer(&expected, expected.ptr)); overwrite_filemode(expected.ptr, &actual); @@ -220,7 +221,7 @@ void test_diff_drivers__builtins(void) { FILE *fp = fopen("userdiff/.gitattributes", "w"); - fprintf(fp, "*.%s diff=%s\n", files[i], files[i]); + fprintf(fp, "*.%s diff=%s\n", extension, extension); fclose(fp); } @@ -230,7 +231,7 @@ void test_diff_drivers__builtins(void) cl_git_pass(git_patch_to_buf(&actual, patch)); git_buf_sets(&expected, "userdiff/expected/driver/diff."); - git_buf_puts(&expected, files[i]); + git_buf_puts(&expected, extension); cl_git_pass(git_futils_readbuffer(&expected, expected.ptr)); overwrite_filemode(expected.ptr, &actual); @@ -240,9 +241,12 @@ void test_diff_drivers__builtins(void) git_buf_clear(&actual); git_patch_free(patch); git_diff_free(diff); + + git__free(path); } git_buf_free(&file); git_buf_free(&actual); git_buf_free(&expected); + git_vector_free(&files); } diff --git a/tests/resources/userdiff/.gitted/index b/tests/resources/userdiff/.gitted/index Binary files differindex 9372411cd..df041cf72 100644 --- a/tests/resources/userdiff/.gitted/index +++ b/tests/resources/userdiff/.gitted/index diff --git a/tests/resources/userdiff/.gitted/info/refs b/tests/resources/userdiff/.gitted/info/refs new file mode 100644 index 000000000..261695f80 --- /dev/null +++ b/tests/resources/userdiff/.gitted/info/refs @@ -0,0 +1 @@ +802734c801bffc466d69876bc4814f747aaac4fe refs/heads/master diff --git a/tests/resources/userdiff/.gitted/objects/05/d669073b39d36847315e3a5b4512cf4cba4546 b/tests/resources/userdiff/.gitted/objects/05/d669073b39d36847315e3a5b4512cf4cba4546 Binary files differdeleted file mode 100644 index 3a9d75cc1..000000000 --- a/tests/resources/userdiff/.gitted/objects/05/d669073b39d36847315e3a5b4512cf4cba4546 +++ /dev/null diff --git a/tests/resources/userdiff/.gitted/objects/20/ab776b6ff3169fa0e5eff65df30d45187d22ba b/tests/resources/userdiff/.gitted/objects/20/ab776b6ff3169fa0e5eff65df30d45187d22ba Binary files differdeleted file mode 100644 index 3d57061ce..000000000 --- a/tests/resources/userdiff/.gitted/objects/20/ab776b6ff3169fa0e5eff65df30d45187d22ba +++ /dev/null diff --git a/tests/resources/userdiff/.gitted/objects/23/20e2f1e4d9e6201a8e15949a0c10a533fa51cd b/tests/resources/userdiff/.gitted/objects/23/20e2f1e4d9e6201a8e15949a0c10a533fa51cd Binary files differdeleted file mode 100644 index 6dbcafed4..000000000 --- a/tests/resources/userdiff/.gitted/objects/23/20e2f1e4d9e6201a8e15949a0c10a533fa51cd +++ /dev/null diff --git a/tests/resources/userdiff/.gitted/objects/2e/a4b8a16d737c180dfdd2b119dec9501592326c b/tests/resources/userdiff/.gitted/objects/2e/a4b8a16d737c180dfdd2b119dec9501592326c Binary files differdeleted file mode 100644 index e7d2fba41..000000000 --- a/tests/resources/userdiff/.gitted/objects/2e/a4b8a16d737c180dfdd2b119dec9501592326c +++ /dev/null diff --git a/tests/resources/userdiff/.gitted/objects/49/c0ff897b2b07a2ea0ed073e62a9dcd02704ba0 b/tests/resources/userdiff/.gitted/objects/49/c0ff897b2b07a2ea0ed073e62a9dcd02704ba0 Binary files differdeleted file mode 100644 index 49d59c11d..000000000 --- a/tests/resources/userdiff/.gitted/objects/49/c0ff897b2b07a2ea0ed073e62a9dcd02704ba0 +++ /dev/null diff --git a/tests/resources/userdiff/.gitted/objects/50/346bde7428a29c9845470a14d87b1634293d48 b/tests/resources/userdiff/.gitted/objects/50/346bde7428a29c9845470a14d87b1634293d48 deleted file mode 100644 index 9de1b3598..000000000 --- a/tests/resources/userdiff/.gitted/objects/50/346bde7428a29c9845470a14d87b1634293d48 +++ /dev/null @@ -1 +0,0 @@ -x+)JMU06g040031QHI(ahוL7rYMJ;8
\ No newline at end of file diff --git a/tests/resources/userdiff/.gitted/objects/5a/428e7dcffb41b65984517f1e6b8547babc8dff b/tests/resources/userdiff/.gitted/objects/5a/428e7dcffb41b65984517f1e6b8547babc8dff Binary files differdeleted file mode 100644 index 143a1cecf..000000000 --- a/tests/resources/userdiff/.gitted/objects/5a/428e7dcffb41b65984517f1e6b8547babc8dff +++ /dev/null diff --git a/tests/resources/userdiff/.gitted/objects/87/2d19663f32459389597b52beec6457c1dc971f b/tests/resources/userdiff/.gitted/objects/87/2d19663f32459389597b52beec6457c1dc971f Binary files differdeleted file mode 100644 index 415f40a66..000000000 --- a/tests/resources/userdiff/.gitted/objects/87/2d19663f32459389597b52beec6457c1dc971f +++ /dev/null diff --git a/tests/resources/userdiff/.gitted/objects/9d/b1d09ff9ad5190bcf12d72ea3c818ffca344c5 b/tests/resources/userdiff/.gitted/objects/9d/b1d09ff9ad5190bcf12d72ea3c818ffca344c5 deleted file mode 100644 index c0a03a241..000000000 --- a/tests/resources/userdiff/.gitted/objects/9d/b1d09ff9ad5190bcf12d72ea3c818ffca344c5 +++ /dev/null @@ -1,2 +0,0 @@ -xM F]sfJ+έ7g$P:_O{0,cN:VE -gRҚJ(l6x㠜I9R[sO⭻lPf3b)^{d39
\ No newline at end of file diff --git a/tests/resources/userdiff/.gitted/objects/d6/3c806de4f666369ed169495657bec24b558165 b/tests/resources/userdiff/.gitted/objects/d6/3c806de4f666369ed169495657bec24b558165 Binary files differdeleted file mode 100644 index 2c0fbcc09..000000000 --- a/tests/resources/userdiff/.gitted/objects/d6/3c806de4f666369ed169495657bec24b558165 +++ /dev/null diff --git a/tests/resources/userdiff/.gitted/objects/ef/1641511d6cb425c6b4f59ef1feffe7762e86e0 b/tests/resources/userdiff/.gitted/objects/ef/1641511d6cb425c6b4f59ef1feffe7762e86e0 deleted file mode 100644 index 223f3b380..000000000 --- a/tests/resources/userdiff/.gitted/objects/ef/1641511d6cb425c6b4f59ef1feffe7762e86e0 +++ /dev/null @@ -1 +0,0 @@ -x+)JMU06g040031QHLK(ar=q[dK`\v=Mr
\ No newline at end of file diff --git a/tests/resources/userdiff/.gitted/objects/info/packs b/tests/resources/userdiff/.gitted/objects/info/packs new file mode 100644 index 000000000..6970fd7b0 --- /dev/null +++ b/tests/resources/userdiff/.gitted/objects/info/packs @@ -0,0 +1,2 @@ +P pack-03f78c35e3ca74fffd9d6c2b6dcd60d6ab6a614a.pack + diff --git a/tests/resources/userdiff/.gitted/objects/pack/pack-03f78c35e3ca74fffd9d6c2b6dcd60d6ab6a614a.idx b/tests/resources/userdiff/.gitted/objects/pack/pack-03f78c35e3ca74fffd9d6c2b6dcd60d6ab6a614a.idx Binary files differnew file mode 100644 index 000000000..6d723f525 --- /dev/null +++ b/tests/resources/userdiff/.gitted/objects/pack/pack-03f78c35e3ca74fffd9d6c2b6dcd60d6ab6a614a.idx diff --git a/tests/resources/userdiff/.gitted/objects/pack/pack-03f78c35e3ca74fffd9d6c2b6dcd60d6ab6a614a.pack b/tests/resources/userdiff/.gitted/objects/pack/pack-03f78c35e3ca74fffd9d6c2b6dcd60d6ab6a614a.pack Binary files differnew file mode 100644 index 000000000..5b263e27d --- /dev/null +++ b/tests/resources/userdiff/.gitted/objects/pack/pack-03f78c35e3ca74fffd9d6c2b6dcd60d6ab6a614a.pack diff --git a/tests/resources/userdiff/.gitted/packed-refs b/tests/resources/userdiff/.gitted/packed-refs new file mode 100644 index 000000000..6d24ee4ed --- /dev/null +++ b/tests/resources/userdiff/.gitted/packed-refs @@ -0,0 +1,2 @@ +# pack-refs with: peeled fully-peeled +802734c801bffc466d69876bc4814f747aaac4fe refs/heads/master diff --git a/tests/resources/userdiff/.gitted/refs/heads/master b/tests/resources/userdiff/.gitted/refs/heads/master deleted file mode 100644 index 2ec79ec86..000000000 --- a/tests/resources/userdiff/.gitted/refs/heads/master +++ /dev/null @@ -1 +0,0 @@ -9db1d09ff9ad5190bcf12d72ea3c818ffca344c5 diff --git a/tests/resources/userdiff/after/file.javascript b/tests/resources/userdiff/after/file.javascript new file mode 100644 index 000000000..7cd3c5a8a --- /dev/null +++ b/tests/resources/userdiff/after/file.javascript @@ -0,0 +1,108 @@ +/* + Some code extracted from https://github.com/julianlloyd/scrollReveal.js + which happens to be a trending Javascript repo with an MIT license at + the time I was working on Javascript userdiff support in libgit2 + + I extracted just some of the code, so I suspect this is no longer valid + Javascript code, but it contains enough example patterns to work. +*/ +;(function (window) { + + 'use strict'; + + var docElem = window.document.documentElement; + + function getViewportH () { + var client = docElem['clientHeight'], + inner = window['innerHeight'], + sample = window['otherProperty']; + + return (client < inner) ? inner : client; + } + + function getOffset (el) { + var offsetTop = 0, + offsetLeft = 0; + + do { + if (!isNaN(el.offsetTop)) { + offsetTop += el.offsetTop + 1; + } + if (!isNaN(el.offsetLeft)) { + offsetLeft += el.offsetLeft; + } + } while (el = el.offsetParent) + + return { + top: offsetTop, + left: offsetLeft + } + } + + function isElementInViewport (el, h) { + var scrolled = window.pageYOffset, + viewed = scrolled + getViewportH(), + elTop = getOffset(el).top, + elBottom = elTop + el.offsetHeight, + h = h || 0; + + return (elTop + el.offsetHeight * h) <= viewed && (elBottom) >= scrolled; + } + + scrollReveal.prototype = { + + _init: function () { + + var self = this; + + this.elems = Array.prototype.slice.call(docElem.querySelectorAll('[data-scrollReveal]')); + this.scrolled = false; + + this.elems.forEach(function (el, i) { + self.animate(el); + }); + + var scrollHandler = function () { + if (!self.scrolled) { + self.scrolled = true; + setTimeout(function () { + self._scrollPage(); + }, 61); + } + }; + + var resizeHandler = function () { + function delayed() { + self._scrollPage(); + self.resizeTimeout = null; + } + if (self.resizeTimeout) { + clearTimeout(self.resizeTimeout); + } + self.resizeTimeout = setTimeout(delayed, 200); + }; + + window.addEventListener('scroll', scrollHandler, false); + window.addEventListener('resize', resizeHandler, false); + }, + + /*=============================================================================*/ + + _scrollPage: function () { + var self = this; + + this.elems.forEach(function (el, i) { + if (isElementInViewport(el, self.options.viewportFactor)) { + self.animate(el); + } + }); + this.scrolled = false; + this.tested = true; + }, + }; // end scrollReveal.prototype + + document.addEventListener("DOMContentLoaded", function (evt) { + window.scrollReveal = new scrollReveal(); + }); + +})(window); diff --git a/tests/resources/userdiff/before/file.javascript b/tests/resources/userdiff/before/file.javascript new file mode 100644 index 000000000..b9f1286e5 --- /dev/null +++ b/tests/resources/userdiff/before/file.javascript @@ -0,0 +1,109 @@ +/* + Some code extracted from https://github.com/julianlloyd/scrollReveal.js + which happens to be a trending Javascript repo with an MIT license at + the time I was working on Javascript userdiff support in libgit2 + + I extracted just some of the code, so I suspect this is no longer valid + Javascript code, but it contains enough example patterns to work. +*/ +;(function (window) { + + 'use strict'; + + var docElem = window.document.documentElement; + + function getViewportH () { + var client = docElem['clientHeight'], + inner = window['innerHeight']; + + return (client < inner) ? inner : client; + } + + function getOffset (el) { + var offsetTop = 0, + offsetLeft = 0; + + do { + if (!isNaN(el.offsetTop)) { + offsetTop += el.offsetTop; + } + if (!isNaN(el.offsetLeft)) { + offsetLeft += el.offsetLeft; + } + } while (el = el.offsetParent) + + return { + top: offsetTop, + left: offsetLeft + } + } + + function isElementInViewport (el, h) { + var scrolled = window.pageYOffset, + viewed = scrolled + getViewportH(), + elH = el.offsetHeight, + elTop = getOffset(el).top, + elBottom = elTop + elH, + h = h || 0; + + return (elTop + elH * h) <= viewed && (elBottom) >= scrolled; + } + + scrollReveal.prototype = { + + _init: function () { + + var self = this; + + this.elems = Array.prototype.slice.call(docElem.querySelectorAll('[data-scrollReveal]')); + this.scrolled = false; + + // Initialize all scrollreveals, triggering all + // reveals on visible elements. + this.elems.forEach(function (el, i) { + self.animate(el); + }); + + var scrollHandler = function () { + if (!self.scrolled) { + self.scrolled = true; + setTimeout(function () { + self._scrollPage(); + }, 60); + } + }; + + var resizeHandler = function () { + function delayed() { + self._scrollPage(); + self.resizeTimeout = null; + } + if (self.resizeTimeout) { + clearTimeout(self.resizeTimeout); + } + self.resizeTimeout = setTimeout(delayed, 200); + }; + + window.addEventListener('scroll', scrollHandler, false); + window.addEventListener('resize', resizeHandler, false); + }, + + /*=============================================================================*/ + + _scrollPage: function () { + var self = this; + + this.elems.forEach(function (el, i) { + if (isElementInViewport(el, self.options.viewportFactor)) { + self.animate(el); + } + }); + this.scrolled = false; + }, + }; // end scrollReveal.prototype + + document.addEventListener("DOMContentLoaded", function (evt) { + window.scrollReveal = new scrollReveal(); + }); + +})(window); diff --git a/tests/resources/userdiff/expected/driver/diff.javascript b/tests/resources/userdiff/expected/driver/diff.javascript new file mode 100644 index 000000000..4e65d0746 --- /dev/null +++ b/tests/resources/userdiff/expected/driver/diff.javascript @@ -0,0 +1,40 @@ +diff --git a/files/file.javascript b/files/file.javascript +index b9f1286..7cd3c5a 100644 +--- a/files/file.javascript ++++ b/files/file.javascript +@@ -16,3 +16,4 @@ function getViewportH () + var client = docElem['clientHeight'], +- inner = window['innerHeight']; ++ inner = window['innerHeight'], ++ sample = window['otherProperty']; + +@@ -27,3 +28,3 @@ function getOffset (el) + if (!isNaN(el.offsetTop)) { +- offsetTop += el.offsetTop; ++ offsetTop += el.offsetTop + 1; + } +@@ -43,8 +44,7 @@ function isElementInViewport (el, h) + viewed = scrolled + getViewportH(), +- elH = el.offsetHeight, + elTop = getOffset(el).top, +- elBottom = elTop + elH, ++ elBottom = elTop + el.offsetHeight, + h = h || 0; + +- return (elTop + elH * h) <= viewed && (elBottom) >= scrolled; ++ return (elTop + el.offsetHeight * h) <= viewed && (elBottom) >= scrolled; + } +@@ -60,4 +60,2 @@ _init: function () + +- // Initialize all scrollreveals, triggering all +- // reveals on visible elements. + this.elems.forEach(function (el, i) { +@@ -71,3 +69,3 @@ var scrollHandler = function () + self._scrollPage(); +- }, 60); ++ }, 61); + } +@@ -101,2 +99,3 @@ _scrollPage: function () + this.scrolled = false; ++ this.tested = true; + }, diff --git a/tests/resources/userdiff/expected/nodriver/diff.javascript b/tests/resources/userdiff/expected/nodriver/diff.javascript new file mode 100644 index 000000000..69afe4fd8 --- /dev/null +++ b/tests/resources/userdiff/expected/nodriver/diff.javascript @@ -0,0 +1,40 @@ +diff --git a/files/file.javascript b/files/file.javascript +index b9f1286..7cd3c5a 100644 +--- a/files/file.javascript ++++ b/files/file.javascript +@@ -16,3 +16,4 @@ + var client = docElem['clientHeight'], +- inner = window['innerHeight']; ++ inner = window['innerHeight'], ++ sample = window['otherProperty']; + +@@ -27,3 +28,3 @@ + if (!isNaN(el.offsetTop)) { +- offsetTop += el.offsetTop; ++ offsetTop += el.offsetTop + 1; + } +@@ -43,8 +44,7 @@ + viewed = scrolled + getViewportH(), +- elH = el.offsetHeight, + elTop = getOffset(el).top, +- elBottom = elTop + elH, ++ elBottom = elTop + el.offsetHeight, + h = h || 0; + +- return (elTop + elH * h) <= viewed && (elBottom) >= scrolled; ++ return (elTop + el.offsetHeight * h) <= viewed && (elBottom) >= scrolled; + } +@@ -60,4 +60,2 @@ + +- // Initialize all scrollreveals, triggering all +- // reveals on visible elements. + this.elems.forEach(function (el, i) { +@@ -71,3 +69,3 @@ + self._scrollPage(); +- }, 60); ++ }, 61); + } +@@ -101,2 +99,3 @@ + this.scrolled = false; ++ this.tested = true; + }, diff --git a/tests/resources/userdiff/files/file.javascript b/tests/resources/userdiff/files/file.javascript new file mode 100644 index 000000000..7cd3c5a8a --- /dev/null +++ b/tests/resources/userdiff/files/file.javascript @@ -0,0 +1,108 @@ +/* + Some code extracted from https://github.com/julianlloyd/scrollReveal.js + which happens to be a trending Javascript repo with an MIT license at + the time I was working on Javascript userdiff support in libgit2 + + I extracted just some of the code, so I suspect this is no longer valid + Javascript code, but it contains enough example patterns to work. +*/ +;(function (window) { + + 'use strict'; + + var docElem = window.document.documentElement; + + function getViewportH () { + var client = docElem['clientHeight'], + inner = window['innerHeight'], + sample = window['otherProperty']; + + return (client < inner) ? inner : client; + } + + function getOffset (el) { + var offsetTop = 0, + offsetLeft = 0; + + do { + if (!isNaN(el.offsetTop)) { + offsetTop += el.offsetTop + 1; + } + if (!isNaN(el.offsetLeft)) { + offsetLeft += el.offsetLeft; + } + } while (el = el.offsetParent) + + return { + top: offsetTop, + left: offsetLeft + } + } + + function isElementInViewport (el, h) { + var scrolled = window.pageYOffset, + viewed = scrolled + getViewportH(), + elTop = getOffset(el).top, + elBottom = elTop + el.offsetHeight, + h = h || 0; + + return (elTop + el.offsetHeight * h) <= viewed && (elBottom) >= scrolled; + } + + scrollReveal.prototype = { + + _init: function () { + + var self = this; + + this.elems = Array.prototype.slice.call(docElem.querySelectorAll('[data-scrollReveal]')); + this.scrolled = false; + + this.elems.forEach(function (el, i) { + self.animate(el); + }); + + var scrollHandler = function () { + if (!self.scrolled) { + self.scrolled = true; + setTimeout(function () { + self._scrollPage(); + }, 61); + } + }; + + var resizeHandler = function () { + function delayed() { + self._scrollPage(); + self.resizeTimeout = null; + } + if (self.resizeTimeout) { + clearTimeout(self.resizeTimeout); + } + self.resizeTimeout = setTimeout(delayed, 200); + }; + + window.addEventListener('scroll', scrollHandler, false); + window.addEventListener('resize', resizeHandler, false); + }, + + /*=============================================================================*/ + + _scrollPage: function () { + var self = this; + + this.elems.forEach(function (el, i) { + if (isElementInViewport(el, self.options.viewportFactor)) { + self.animate(el); + } + }); + this.scrolled = false; + this.tested = true; + }, + }; // end scrollReveal.prototype + + document.addEventListener("DOMContentLoaded", function (evt) { + window.scrollReveal = new scrollReveal(); + }); + +})(window); |