diff --git a/src/index.js b/src/index.js index 278582e..41086b0 100644 --- a/src/index.js +++ b/src/index.js @@ -43,9 +43,8 @@ exports.build = function (opts, done) { { title: 'Cleaning up', enabled: (ctx) => opts.cleanup, - skip: () => opts.dryRun, task: (ctx) => { - return steps.cleanup(ctx.files, opts.output) + return steps.cleanup(ctx.files, opts.output, opts.dryRun) } }, { diff --git a/src/steps/step-cleanup.js b/src/steps/step-cleanup.js index eab1c4c..18e7ff9 100644 --- a/src/steps/step-cleanup.js +++ b/src/steps/step-cleanup.js @@ -1,10 +1,11 @@ const _ = require('lodash') const fs = require('fs') +const debug = require('debug')('thumbsup:debug') const Observable = require('zen-observable') const path = require('path') const readdir = require('fs-readdir-recursive') -exports.run = function (fileCollection, outputRoot) { +exports.run = function (fileCollection, outputRoot, dryRun) { return new Observable(observer => { const mediaRoot = path.join(outputRoot, 'media') const diskFiles = readdir(mediaRoot).map(f => path.join(mediaRoot, f)) @@ -18,8 +19,13 @@ exports.run = function (fileCollection, outputRoot) { const useless = _.difference(diskFiles, requiredFiles) if (useless.length) { useless.forEach(f => { - observer.next(path.relative(outputRoot, f)) - fs.unlinkSync(f) + const relativePath = path.relative(outputRoot, f) + if (dryRun) { + debug(`Dry run, would delete: ${relativePath}`) + } else { + observer.next(relativePath) + fs.unlinkSync(f) + } }) } observer.complete() diff --git a/test/steps/step-cleanup.spec.js b/test/steps/step-cleanup.spec.js index ca45fed..fc1eacd 100644 --- a/test/steps/step-cleanup.spec.js +++ b/test/steps/step-cleanup.spec.js @@ -1,5 +1,6 @@ const fs = require('fs') const sinon = require('sinon') +const debug = require('debug') const should = require('should/as-function') const cleanup = require('../../src/steps/step-cleanup') const fixtures = require('../fixtures') @@ -33,10 +34,10 @@ describe('Steps: cleanup', () => { 'output/media/large/paris/IMG_0001.jpg': '', 'output/media/large/london/IMG_0002.jpg': '' }) - const obs = cleanup.run(input, 'output') + const obs = cleanup.run(input, 'output', false) obs.reduce(toArray, []).subscribe(deletedFiles => { should(deletedFiles).deepEqual([]) - should(fs.unlinkSync.args).deepEqual([]) + should(fs.unlinkSync.called).equal(false) testEnd() }) }) @@ -51,14 +52,34 @@ describe('Steps: cleanup', () => { 'output/media/large/london/IMG_0002.jpg': '', 'output/media/large/newyork/IMG_0003.jpg': '' }) - const obs = cleanup.run(input, 'output') + const obs = cleanup.run(input, 'output', false) const extraFile = 'media/large/newyork/IMG_0003.jpg' obs.reduce(toArray, []).subscribe(deletedFiles => { should(deletedFiles).deepEqual([ospath(extraFile)]) + should(fs.unlinkSync.called).equal(true) should(fs.unlinkSync.args).deepEqual([[ospath(`output/${extraFile}`)]]) testEnd() }) }) + + it('prints the name but does not delete in dry-run mode', testEnd => { + const input = [ + fixtures.file({ path: 'paris/IMG_0001.jpg' }), + fixtures.file({ path: 'london/IMG_0002.jpg' }) + ] + mock({ + 'output/media/large/paris/IMG_0001.jpg': '', + 'output/media/large/london/IMG_0002.jpg': '', + 'output/media/large/newyork/IMG_0003.jpg': '' + }) + const obs = cleanup.run(input, 'output', true) + obs.reduce(toArray, []).subscribe(deletedFiles => { + should(deletedFiles).deepEqual([]) + should(fs.unlinkSync.called).equal(false) + debug.assertContains('would delete: media/large/newyork/IMG_0003.jpg') + testEnd() + }) + }) }) function toArray (list, item) {