Commit 898fe7c8 by Johannes Zellner

Fix file deletion and add dry-run option

1 parent d755925f
......@@ -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);
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);
}
});
}
......@@ -24,6 +24,8 @@ program.command('get [file]')
.action(actions.get);
program.command('del <file>')
.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);
......
......@@ -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",
......
......@@ -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'));
});
});
}
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!