summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/diff_driver.c1
-rw-r--r--src/userdiff.h6
-rw-r--r--tests/diff/drivers.c28
-rw-r--r--tests/resources/userdiff/.gitted/indexbin456 -> 912 bytes
-rw-r--r--tests/resources/userdiff/.gitted/info/refs1
-rw-r--r--tests/resources/userdiff/.gitted/objects/05/d669073b39d36847315e3a5b4512cf4cba4546bin54 -> 0 bytes
-rw-r--r--tests/resources/userdiff/.gitted/objects/20/ab776b6ff3169fa0e5eff65df30d45187d22babin54 -> 0 bytes
-rw-r--r--tests/resources/userdiff/.gitted/objects/23/20e2f1e4d9e6201a8e15949a0c10a533fa51cdbin207 -> 0 bytes
-rw-r--r--tests/resources/userdiff/.gitted/objects/2e/a4b8a16d737c180dfdd2b119dec9501592326cbin228 -> 0 bytes
-rw-r--r--tests/resources/userdiff/.gitted/objects/49/c0ff897b2b07a2ea0ed073e62a9dcd02704ba0bin118 -> 0 bytes
-rw-r--r--tests/resources/userdiff/.gitted/objects/50/346bde7428a29c9845470a14d87b1634293d481
-rw-r--r--tests/resources/userdiff/.gitted/objects/5a/428e7dcffb41b65984517f1e6b8547babc8dffbin263 -> 0 bytes
-rw-r--r--tests/resources/userdiff/.gitted/objects/87/2d19663f32459389597b52beec6457c1dc971fbin178 -> 0 bytes
-rw-r--r--tests/resources/userdiff/.gitted/objects/9d/b1d09ff9ad5190bcf12d72ea3c818ffca344c52
-rw-r--r--tests/resources/userdiff/.gitted/objects/d6/3c806de4f666369ed169495657bec24b558165bin76 -> 0 bytes
-rw-r--r--tests/resources/userdiff/.gitted/objects/ef/1641511d6cb425c6b4f59ef1feffe7762e86e01
-rw-r--r--tests/resources/userdiff/.gitted/objects/info/packs2
-rw-r--r--tests/resources/userdiff/.gitted/objects/pack/pack-03f78c35e3ca74fffd9d6c2b6dcd60d6ab6a614a.idxbin0 -> 2192 bytes
-rw-r--r--tests/resources/userdiff/.gitted/objects/pack/pack-03f78c35e3ca74fffd9d6c2b6dcd60d6ab6a614a.packbin0 -> 5697 bytes
-rw-r--r--tests/resources/userdiff/.gitted/packed-refs2
-rw-r--r--tests/resources/userdiff/.gitted/refs/heads/master1
-rw-r--r--tests/resources/userdiff/after/file.javascript108
-rw-r--r--tests/resources/userdiff/before/file.javascript109
-rw-r--r--tests/resources/userdiff/expected/driver/diff.javascript40
-rw-r--r--tests/resources/userdiff/expected/nodriver/diff.javascript40
-rw-r--r--tests/resources/userdiff/files/file.javascript108
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
index 9372411cd..df041cf72 100644
--- a/tests/resources/userdiff/.gitted/index
+++ b/tests/resources/userdiff/.gitted/index
Binary files differ
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
deleted file mode 100644
index 3a9d75cc1..000000000
--- a/tests/resources/userdiff/.gitted/objects/05/d669073b39d36847315e3a5b4512cf4cba4546
+++ /dev/null
Binary files differ
diff --git a/tests/resources/userdiff/.gitted/objects/20/ab776b6ff3169fa0e5eff65df30d45187d22ba b/tests/resources/userdiff/.gitted/objects/20/ab776b6ff3169fa0e5eff65df30d45187d22ba
deleted file mode 100644
index 3d57061ce..000000000
--- a/tests/resources/userdiff/.gitted/objects/20/ab776b6ff3169fa0e5eff65df30d45187d22ba
+++ /dev/null
Binary files differ
diff --git a/tests/resources/userdiff/.gitted/objects/23/20e2f1e4d9e6201a8e15949a0c10a533fa51cd b/tests/resources/userdiff/.gitted/objects/23/20e2f1e4d9e6201a8e15949a0c10a533fa51cd
deleted file mode 100644
index 6dbcafed4..000000000
--- a/tests/resources/userdiff/.gitted/objects/23/20e2f1e4d9e6201a8e15949a0c10a533fa51cd
+++ /dev/null
Binary files differ
diff --git a/tests/resources/userdiff/.gitted/objects/2e/a4b8a16d737c180dfdd2b119dec9501592326c b/tests/resources/userdiff/.gitted/objects/2e/a4b8a16d737c180dfdd2b119dec9501592326c
deleted file mode 100644
index e7d2fba41..000000000
--- a/tests/resources/userdiff/.gitted/objects/2e/a4b8a16d737c180dfdd2b119dec9501592326c
+++ /dev/null
Binary files differ
diff --git a/tests/resources/userdiff/.gitted/objects/49/c0ff897b2b07a2ea0ed073e62a9dcd02704ba0 b/tests/resources/userdiff/.gitted/objects/49/c0ff897b2b07a2ea0ed073e62a9dcd02704ba0
deleted file mode 100644
index 49d59c11d..000000000
--- a/tests/resources/userdiff/.gitted/objects/49/c0ff897b2b07a2ea0ed073e62a9dcd02704ba0
+++ /dev/null
Binary files differ
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
deleted file mode 100644
index 143a1cecf..000000000
--- a/tests/resources/userdiff/.gitted/objects/5a/428e7dcffb41b65984517f1e6b8547babc8dff
+++ /dev/null
Binary files differ
diff --git a/tests/resources/userdiff/.gitted/objects/87/2d19663f32459389597b52beec6457c1dc971f b/tests/resources/userdiff/.gitted/objects/87/2d19663f32459389597b52beec6457c1dc971f
deleted file mode 100644
index 415f40a66..000000000
--- a/tests/resources/userdiff/.gitted/objects/87/2d19663f32459389597b52beec6457c1dc971f
+++ /dev/null
Binary files differ
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)^{d3 9 \ No newline at end of file
diff --git a/tests/resources/userdiff/.gitted/objects/d6/3c806de4f666369ed169495657bec24b558165 b/tests/resources/userdiff/.gitted/objects/d6/3c806de4f666369ed169495657bec24b558165
deleted file mode 100644
index 2c0fbcc09..000000000
--- a/tests/resources/userdiff/.gitted/objects/d6/3c806de4f666369ed169495657bec24b558165
+++ /dev/null
Binary files differ
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
new file mode 100644
index 000000000..6d723f525
--- /dev/null
+++ b/tests/resources/userdiff/.gitted/objects/pack/pack-03f78c35e3ca74fffd9d6c2b6dcd60d6ab6a614a.idx
Binary files differ
diff --git a/tests/resources/userdiff/.gitted/objects/pack/pack-03f78c35e3ca74fffd9d6c2b6dcd60d6ab6a614a.pack b/tests/resources/userdiff/.gitted/objects/pack/pack-03f78c35e3ca74fffd9d6c2b6dcd60d6ab6a614a.pack
new file mode 100644
index 000000000..5b263e27d
--- /dev/null
+++ b/tests/resources/userdiff/.gitted/objects/pack/pack-03f78c35e3ca74fffd9d6c2b6dcd60d6ab6a614a.pack
Binary files differ
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);