Skip to content

Compare two file-trees, get a list of changes, then apply left or right

Notifications You must be signed in to change notification settings

pfrazee/diff-file-tree

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

31 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

diff-file-tree

Compare two file-trees, get a list of changes, then apply left or right.

npm install diff-file-tree

Usage

var dft = require('diff-file-tree')

var changes = await dft.diff('/home/alice/stuff', '/home/alice/things')
console.log(changes) /* => [
  {change: 'mod', type: 'file', path: '/hello.txt'},
  {change: 'add', type: 'dir',  path: '/pics'},
  {change: 'add', type: 'file', path: '/pics/kitty.png'},
  {change: 'del', type: 'file', path: '/backup/hello.txt'},
  {change: 'del', type: 'dir',  path: '/backup'},
  {change: 'del', type: 'file', path: '/hello.txt'},
]*/

// make 'things' a copy of 'stuff' 
await dft.applyRight('/home/alice/stuff', '/home/alice/things', changes)
// -or-
// make 'stuff' a copy of 'things'
await dft.applyLeft('/home/alice/stuff', '/home/alice/things', changes)

Known issues

Files with equal size and mtimes will show as equal, even if their content is different. This is caused by an optimization which can sometimes give false positives.

API

var changes = await dft.diff(left, right[, opts])

Get the differences between left and right.

Options include:

{
  filter: null // optional function to ignore files (function (path) => bool)
  shallow: false // dont recurse into folders that need to be added or removed
  sizeLimit: {
    maxSize: undefined // max number of bytes before comparison aborts
    assumeEq: false // assume == (true) or assume != (false)
  }
  compareContent: false // set to true to compare by content instead of mtime & size
  compareContentCache: undefined // provide an object to cache file equality tests in memory
}

If you are using a custom fs module (like graceful-fs or hyperdrive) you can pass that in with the left or right like this:

dft.diff({path: '/Users/alice/stuff', fs: customFs}, {path: '/', fs: hyperdriveArchive})

await dft.applyRight(left, right, changes)

Make right equivalent to left using the given changes. Both left and right can be an object with custom {path:, fs:} as with diff().

await dft.applyLeft(left, right, changes)

Make left equivalent to right using the given changes. Both left and right can be an object with custom {path:, fs:} as with diff().

dft.applyRightStream(left, right, changes)

Make right equivalent to left using the given changes. Both left and right can be an object with custom {path:, fs:} as with diff().

Returns a stream which emits each operation as {op: String, path: String}. You can cancel the merge-operation by destroying the stream.

About

Compare two file-trees, get a list of changes, then apply left or right

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published