summaryrefslogtreecommitdiff
path: root/node_modules/dir-compare/src/fileCompareHandler/defaultFileCompare.js
diff options
context:
space:
mode:
authorLinuxWizard42 <computerwizard@linuxmail.org>2022-10-12 22:54:37 +0300
committerLinuxWizard42 <computerwizard@linuxmail.org>2022-10-12 22:54:37 +0300
commit703e03aba33f234712206769f57717ba7d92d23d (patch)
tree0041f04ccb75bd5379c764e9fe42249fffe75fc3 /node_modules/dir-compare/src/fileCompareHandler/defaultFileCompare.js
parentab6e257e6e9d9a483d7e86f220d8b209a2cd7753 (diff)
downloadFlashRunner-703e03aba33f234712206769f57717ba7d92d23d.tar.gz
FlashRunner-703e03aba33f234712206769f57717ba7d92d23d.tar.zst
Added export_allowed file to make repository visible in cgit
Diffstat (limited to 'node_modules/dir-compare/src/fileCompareHandler/defaultFileCompare.js')
-rw-r--r--node_modules/dir-compare/src/fileCompareHandler/defaultFileCompare.js113
1 files changed, 113 insertions, 0 deletions
diff --git a/node_modules/dir-compare/src/fileCompareHandler/defaultFileCompare.js b/node_modules/dir-compare/src/fileCompareHandler/defaultFileCompare.js
new file mode 100644
index 0000000..26188ca
--- /dev/null
+++ b/node_modules/dir-compare/src/fileCompareHandler/defaultFileCompare.js
@@ -0,0 +1,113 @@
+var fs = require('fs')
+var bufferEqual = require('buffer-equal')
+var FileDescriptorQueue = require('../fs/FileDescriptorQueue')
+var closeFilesSync = require('./closeFile').closeFilesSync
+var closeFilesAsync = require('./closeFile').closeFilesAsync
+var fsPromise = require('../fs/fsPromise')
+var BufferPool = require('../fs/BufferPool')
+
+var MAX_CONCURRENT_FILE_COMPARE = 8
+var BUF_SIZE = 100000
+var fdQueue = new FileDescriptorQueue(MAX_CONCURRENT_FILE_COMPARE * 2)
+var bufferPool = new BufferPool(BUF_SIZE, MAX_CONCURRENT_FILE_COMPARE); // fdQueue guarantees there will be no more than MAX_CONCURRENT_FILE_COMPARE async processes accessing the buffers concurrently
+
+
+/**
+ * Compares two partial buffers.
+ */
+var compareBuffers = function (buf1, buf2, contentSize) {
+ return bufferEqual(buf1.slice(0, contentSize), buf2.slice(0, contentSize))
+}
+
+/**
+ * Compares two files by content.
+ */
+var compareSync = function (path1, stat1, path2, stat2, options) {
+ var fd1, fd2
+ if (stat1.size !== stat2.size) {
+ return false
+ }
+ var bufferPair = bufferPool.allocateBuffers()
+ try {
+ fd1 = fs.openSync(path1, 'r')
+ fd2 = fs.openSync(path2, 'r')
+ var buf1 = bufferPair.buf1
+ var buf2 = bufferPair.buf2
+ var progress = 0
+ while (true) {
+ var size1 = fs.readSync(fd1, buf1, 0, BUF_SIZE, null)
+ var size2 = fs.readSync(fd2, buf2, 0, BUF_SIZE, null)
+ if (size1 !== size2) {
+ return false
+ } else if (size1 === 0) {
+ // End of file reached
+ return true
+ } else if (!compareBuffers(buf1, buf2, size1)) {
+ return false
+ }
+ }
+ } finally {
+ closeFilesSync(fd1, fd2)
+ bufferPool.freeBuffers(bufferPair)
+ }
+}
+
+
+/**
+ * Compares two files by content
+ */
+var compareAsync = function (path1, stat1, path2, stat2, options) {
+ var fd1, fd2
+ var bufferPair
+ if (stat1.size !== stat2.size) {
+ return Promise.resolve(false)
+ }
+ return Promise.all([fdQueue.promises.open(path1, 'r'), fdQueue.promises.open(path2, 'r')])
+ .then(function (fds) {
+ bufferPair = bufferPool.allocateBuffers()
+ fd1 = fds[0]
+ fd2 = fds[1]
+ var buf1 = bufferPair.buf1
+ var buf2 = bufferPair.buf2
+ var progress = 0
+ var compareAsyncInternal = function () {
+ return Promise.all([
+ fsPromise.read(fd1, buf1, 0, BUF_SIZE, null),
+ fsPromise.read(fd2, buf2, 0, BUF_SIZE, null)
+ ]).then(function (bufferSizes) {
+ var size1 = bufferSizes[0]
+ var size2 = bufferSizes[1]
+ if (size1 !== size2) {
+ return false
+ } else if (size1 === 0) {
+ // End of file reached
+ return true
+ } else if (!compareBuffers(buf1, buf2, size1)) {
+ return false
+ } else {
+ return compareAsyncInternal()
+ }
+ })
+ }
+ return compareAsyncInternal()
+ })
+ .then(
+ // 'finally' polyfill for node 8 and below
+ function (res) {
+ return finalizeAsync(fd1, fd2, bufferPair).then(() => res)
+ },
+ function (err) {
+ return finalizeAsync(fd1, fd2, bufferPair).then(() => { throw err; })
+ }
+ )
+}
+
+function finalizeAsync(fd1, fd2, bufferPair) {
+ bufferPool.freeBuffers(bufferPair)
+ return closeFilesAsync(fd1, fd2, fdQueue)
+}
+
+module.exports = {
+ compareSync: compareSync,
+ compareAsync: compareAsync
+}