From: Johannes Zellner Date: Tue, 1 Mar 2016 12:04:12 +0000 (+0100) Subject: Fix file deletion and add dry-run option X-Git-Url: https://git.immae.eu/?p=perso%2FImmae%2FProjets%2FNodejs%2FSurfer.git;a=commitdiff_plain;h=898fe7c8bb0b04eea2e91d92f275c95713e8ec79 Fix file deletion and add dry-run option --- diff --git a/cli/actions.js b/cli/actions.js index d10e154..8a8624e 100644 --- a/cli/actions.js +++ b/cli/actions.js @@ -180,16 +180,27 @@ function get(filePath) { // }); } -function del(filePath) { +function del(filePath, options) { checkConfig(); + var query = safe.JSON.parse(safe.JSON.stringify(gQuery)); + query.recursive = options.recursive; + query.dryRun = options.dryRun; + var relativeFilePath = path.resolve(filePath).slice(process.cwd().length + 1); - superagent.del(config.server() + API + relativeFilePath).query(gQuery).end(function (error, result) { - if (error && error.status === 401) return console.log('Login failed'); + superagent.del(config.server() + API + relativeFilePath).query(query).end(function (error, result) { + if (error && error.status === 401) return console.log('Login failed'.red); if (error && error.status === 404) return console.log('No such file or directory'); - if (error && error.status === 403) return console.log('No such file or directory'); + if (error && error.status === 403) return console.log('Failed. Target is a directory. Use %s to delete directories.', '--recursive'.yellow); if (error) return console.log('Failed', result ? result.body : error); - console.log('Success. Removed %s files.', result.body.entries.length); + if (options.dryRun) { + console.log('This would remove %s files:', result.body.entries.length); + result.body.entries.forEach(function (entry) { + console.log('\t %s', entry); + }); + } else { + console.log('Success. Removed %s files.', result.body.entries.length); + } }); } diff --git a/cli/surfer.js b/cli/surfer.js index 278724d..4c096d3 100755 --- a/cli/surfer.js +++ b/cli/surfer.js @@ -24,6 +24,8 @@ program.command('get [file]') .action(actions.get); program.command('del ') + .option('-r --recursive', 'Recursive delete directories.', false) + .option('-d --dry-run', 'Only list files to delete.', false) .description('Delete a file or directory') .action(actions.del); diff --git a/package.json b/package.json index cf47f54..5fab285 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "connect-timeout": "^1.6.2", "cookie-parser": "^1.4.1", "debug": "^2.2.0", - "del": "^1.2.0", + "del": "^2.2.0", "ejs": "^2.4.1", "express": "^4.13.4", "express-session": "^1.13.0", diff --git a/src/files.js b/src/files.js index c2a4e0f..2214449 100644 --- a/src/files.js +++ b/src/files.js @@ -60,6 +60,10 @@ function getAbsolutePath(filePath) { return absoluteFilePath; } +function removeBasePath(filePath) { + return filePath.slice(gBasePath.length); +} + function get(req, res, next) { var filePath = req.params[0]; var absoluteFilePath = getAbsolutePath(filePath); @@ -104,18 +108,29 @@ function put(req, res, next) { function del(req, res, next) { var filePath = req.params[0]; + var recursive = !!req.query.recursive; + var dryRun = !!req.query.dryRun; + var absoluteFilePath = getAbsolutePath(filePath); if (!absoluteFilePath) return next(new HttpError(404, 'Not found')); // absoltueFilePath has to have the base path prepended - if (absoluteFilePath.length <= gBasePath.length) return next(new HttpError(403, 'Forbidden')); + if (absoluteFilePath.length <= gBasePath.length) return next(new HttpError(404, 'Not found')); fs.stat(absoluteFilePath, function (error, result) { if (error) return next(new HttpError(404, error)); - rm(absoluteFilePath, function (error, result) { - if (error) return next(new HttpError(500, 'Unable to remove')); + if (result.isDirectory() && !recursive) return next(new HttpError(403, 'Is directory')); + + // add globs to get file listing + if (result.isDirectory()) absoluteFilePath += '/**'; + + rm(absoluteFilePath, { dryRun: dryRun }).then(function (result) { + result = result.map(removeBasePath); next(new HttpSuccess(200, { entries: result })); + }, function (error) { + console.error(error); + next(new HttpError(500, 'Unable to remove')); }); }); }