summaryrefslogtreecommitdiff
path: root/node_modules/dir-compare/src/index.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/index.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/index.js')
-rw-r--r--node_modules/dir-compare/src/index.js204
1 files changed, 204 insertions, 0 deletions
diff --git a/node_modules/dir-compare/src/index.js b/node_modules/dir-compare/src/index.js
new file mode 100644
index 0000000..fb1b6b8
--- /dev/null
+++ b/node_modules/dir-compare/src/index.js
@@ -0,0 +1,204 @@
+var util = require('util')
+var pathUtils = require('path')
+var fs = require('fs')
+var compareSyncInternal = require('./compareSync')
+var compareAsyncInternal = require('./compareAsync')
+var defaultResultBuilderCallback = require('./resultBuilder/defaultResultBuilderCallback')
+var defaultFileCompare = require('./fileCompareHandler/defaultFileCompare')
+var lineBasedFileCompare = require('./fileCompareHandler/lineBasedFileCompare')
+var defaultNameCompare = require('./nameCompare/defaultNameCompare')
+var entryBuilder = require('./entry/entryBuilder')
+var statsLifecycle = require('./statistics/statisticsLifecycle')
+var loopDetector = require('./symlink/loopDetector')
+
+var ROOT_PATH = pathUtils.sep
+
+var compareSync = function (path1, path2, options) {
+ 'use strict'
+ // realpathSync() is necessary for loop detection to work properly
+ var absolutePath1 = pathUtils.normalize(pathUtils.resolve(fs.realpathSync(path1)))
+ var absolutePath2 = pathUtils.normalize(pathUtils.resolve(fs.realpathSync(path2)))
+ var diffSet
+ options = prepareOptions(options)
+ if (!options.noDiffSet) {
+ diffSet = []
+ }
+ var statistics = statsLifecycle.initStats(options)
+ compareSyncInternal(
+ entryBuilder.buildEntry(absolutePath1, path1, pathUtils.basename(absolutePath1)),
+ entryBuilder.buildEntry(absolutePath2, path2, pathUtils.basename(absolutePath2)),
+ 0, ROOT_PATH, options, statistics, diffSet, loopDetector.initSymlinkCache())
+ statsLifecycle.completeStatistics(statistics, options)
+ statistics.diffSet = diffSet
+
+ return statistics
+}
+
+var wrapper = {
+ realPath: function(path, options) {
+ return new Promise(function (resolve, reject) {
+ fs.realpath(path, options, function(err, resolvedPath) {
+ if(err){
+ reject(err)
+ } else {
+ resolve(resolvedPath)
+ }
+ })
+ })
+ }
+}
+
+var compareAsync = function (path1, path2, options) {
+ 'use strict'
+ var absolutePath1, absolutePath2
+ return Promise.resolve()
+ .then(function () {
+ return Promise.all([wrapper.realPath(path1), wrapper.realPath(path2)])
+ })
+ .then(function (realPaths) {
+ var realPath1 = realPaths[0]
+ var realPath2 = realPaths[1]
+ // realpath() is necessary for loop detection to work properly
+ absolutePath1 = pathUtils.normalize(pathUtils.resolve(realPath1))
+ absolutePath2 = pathUtils.normalize(pathUtils.resolve(realPath2))
+ })
+ .then(function () {
+ options = prepareOptions(options)
+ var asyncDiffSet
+ if (!options.noDiffSet) {
+ asyncDiffSet = []
+ }
+ var statistics = statsLifecycle.initStats(options)
+ return compareAsyncInternal(
+ entryBuilder.buildEntry(absolutePath1, path1, pathUtils.basename(path1)),
+ entryBuilder.buildEntry(absolutePath2, path2, pathUtils.basename(path2)),
+ 0, ROOT_PATH, options, statistics, asyncDiffSet, loopDetector.initSymlinkCache()).then(
+ function () {
+ statsLifecycle.completeStatistics(statistics, options)
+ if (!options.noDiffSet) {
+ var diffSet = []
+ rebuildAsyncDiffSet(statistics, asyncDiffSet, diffSet)
+ statistics.diffSet = diffSet
+ }
+ return statistics
+ })
+ })
+}
+
+var prepareOptions = function (options) {
+ options = options || {}
+ var clone = JSON.parse(JSON.stringify(options))
+ clone.resultBuilder = options.resultBuilder
+ clone.compareFileSync = options.compareFileSync
+ clone.compareFileAsync = options.compareFileAsync
+ clone.compareNameHandler = options.compareNameHandler
+ if (!clone.resultBuilder) {
+ clone.resultBuilder = defaultResultBuilderCallback
+ }
+ if (!clone.compareFileSync) {
+ clone.compareFileSync = defaultFileCompare.compareSync
+ }
+ if (!clone.compareFileAsync) {
+ clone.compareFileAsync = defaultFileCompare.compareAsync
+ }
+ if(!clone.compareNameHandler) {
+ clone.compareNameHandler = defaultNameCompare
+ }
+ clone.dateTolerance = clone.dateTolerance || 1000
+ clone.dateTolerance = Number(clone.dateTolerance)
+ if (isNaN(clone.dateTolerance)) {
+ throw new Error('Date tolerance is not a number')
+ }
+ return clone
+}
+
+
+// Async diffsets are kept into recursive structures.
+// This method transforms them into one dimensional arrays.
+var rebuildAsyncDiffSet = function (statistics, asyncDiffSet, diffSet) {
+ asyncDiffSet.forEach(function (rawDiff) {
+ if (!Array.isArray(rawDiff)) {
+ diffSet.push(rawDiff)
+ } else {
+ rebuildAsyncDiffSet(statistics, rawDiff, diffSet)
+ }
+ })
+}
+
+
+/**
+ * Options:
+ * compareSize: true/false - Compares files by size. Defaults to 'false'.
+ * compareDate: true/false - Compares files by date of modification (stat.mtime). Defaults to 'false'.
+ * dateTolerance: milliseconds - Two files are considered to have the same date if the difference between their modification dates fits within date tolerance. Defaults to 1000 ms.
+ * compareContent: true/false - Compares files by content. Defaults to 'false'.
+ * compareSymlink: true/false - Compares entries by symlink. Defaults to 'false'.
+ * skipSubdirs: true/false - Skips sub directories. Defaults to 'false'.
+ * skipSymlinks: true/false - Skips symbolic links. Defaults to 'false'.
+ * ignoreCase: true/false - Ignores case when comparing names. Defaults to 'false'.
+ * noDiffSet: true/false - Toggles presence of diffSet in output. If true, only statistics are provided. Use this when comparing large number of files to avoid out of memory situations. Defaults to 'false'.
+ * includeFilter: File name filter. Comma separated [minimatch](https://www.npmjs.com/package/minimatch) patterns.
+ * excludeFilter: File/directory name exclude filter. Comma separated [minimatch](https://www.npmjs.com/package/minimatch) patterns.
+ * resultBuilder: Callback for constructing result.
+ * function (entry1, entry2, state, level, relativePath, options, statistics, diffSet). Called for each compared entry pair. Updates 'statistics' and 'diffSet'.
+ * compareFileSync, compareFileAsync: Callbacks for file comparison.
+ * compareNameHandler: Callback for name comparison
+ *
+ * Result:
+ * same: true if directories are identical
+ * distinct: number of distinct entries
+ * equal: number of equal entries
+ * left: number of entries only in path1
+ * right: number of entries only in path2
+ * differences: total number of differences (distinct+left+right)
+ * total: total number of entries (differences+equal)
+ * distinctFiles: number of distinct files
+ * equalFiles: number of equal files
+ * leftFiles: number of files only in path1
+ * rightFiles: number of files only in path2
+ * differencesFiles: total number of different files (distinctFiles+leftFiles+rightFiles)
+ * totalFiles: total number of files (differencesFiles+equalFiles)
+ * distinctDirs: number of distinct directories
+ * equalDirs: number of equal directories
+ * leftDirs: number of directories only in path1
+ * rightDirs: number of directories only in path2
+ * differencesDirs: total number of different directories (distinctDirs+leftDirs+rightDirs)
+ * totalDirs: total number of directories (differencesDirs+equalDirs)
+ * brokenLinks:
+ * leftBrokenLinks: number of broken links only in path1
+ * rightBrokenLinks: number of broken links only in path2
+ * distinctBrokenLinks: number of broken links with same name appearing in both path1 and path2
+ * totalBrokenLinks: total number of broken links (leftBrokenLinks+rightBrokenLinks+distinctBrokenLinks)
+ * symlinks: Statistics available if 'compareSymlink' options is used
+ * distinctSymlinks: number of distinct links
+ * equalSymlinks: number of equal links
+ * leftSymlinks: number of links only in path1
+ * rightSymlinks: number of links only in path2
+ * differencesSymlinks: total number of different links (distinctSymlinks+leftSymlinks+rightSymlinks)
+ * totalSymlinks: total number of links (differencesSymlinks+equalSymlinks)
+ * diffSet - List of changes (present if Options.noDiffSet is false)
+ * path1: absolute path not including file/directory name,
+ * path2: absolute path not including file/directory name,
+ * relativePath: common path relative to root,
+ * name1: file/directory name
+ * name2: file/directory name
+ * state: one of equal, left, right, distinct,
+ * type1: one of missing, file, directory, broken-link
+ * type2: one of missing, file, directory, broken-link
+ * size1: file size
+ * size2: file size
+ * date1: modification date (stat.mtime)
+ * date2: modification date (stat.mtime)
+ * level: depth
+ * reason: Provides reason when two identically named entries are distinct
+ * Not available if entries are equal
+ * One of "different-size", "different-date", "different-content", "broken-link", "different-symlink"
+ */
+module.exports = {
+ compareSync: compareSync,
+ compare: compareAsync,
+ fileCompareHandlers: {
+ defaultFileCompare: defaultFileCompare,
+ lineBasedFileCompare: lineBasedFileCompare
+ }
+}