From 429e134740e7a9f9f1ef1ec18f847b9ecc61f6c2 Mon Sep 17 00:00:00 2001 From: Simon Hampton Date: Sat, 2 Nov 2019 18:37:12 +0100 Subject: [PATCH 1/5] add time to parseLocal --- src/lib.js | 39 ++++++++++++++++++++++++++++++++++----- src/lib.spec.js | 46 ++++++++++++++++++++++++++++------------------ 2 files changed, 62 insertions(+), 23 deletions(-) diff --git a/src/lib.js b/src/lib.js index 8d66eb1..d9b7167 100644 --- a/src/lib.js +++ b/src/lib.js @@ -70,9 +70,12 @@ function parseLocal(includes, excludes, localRootDir, relDir) { const currItem = path.join(fullDir, item); const newRelDir = path.relative(localRootDir, currItem); - if (fs.lstatSync(currItem).isDirectory()) { + const stat = fs.lstatSync(currItem); + + if (stat.isDirectory()) { // currItem is a directory. Recurse and attach to accumulator let tmp = parseLocal(includes, excludes, localRootDir, newRelDir); + // remove any empty directories for (let key in tmp) { if (tmp[key].length == 0) { delete tmp[key]; @@ -83,8 +86,10 @@ function parseLocal(includes, excludes, localRootDir, relDir) { // currItem is a file // acc[relDir] is always created at previous iteration if (canIncludePath(includes, excludes, newRelDir)) { - // console.log("including", currItem); - acc[relDir].push(item); + let tmp = {}; + tmp[item] = stat.mtimeMs; + console.log("including", tmp); + acc[relDir].push(tmp); return acc; } } @@ -106,6 +111,28 @@ function parseLocal(includes, excludes, localRootDir, relDir) { return res; } +/* +simplify({ '/': [ { 'test-inside-root.txt': 1525592919000 } ], + inner: [ { 'test-inside-root.excl': 1550948905974.2664 } ] }) + +{ + "/": ["test-inside-root.txt"], + inner: ["test-inside-root.excl"] +} +*/ +var simplify = function(obj) { + let keys = Object.keys(obj); + console.log(keys); + return keys.reduce((acc, key) => { + console.log("*1", obj[key]); + acc[key] = obj[key].map(o => { + console.log("*2", Object.keys(o)); + return Object.keys(o)[0]; + }); + return acc; + }, {}); +}; + function countFiles(filemap) { return Object.values(filemap).reduce((acc, item) => acc.concat(item)) .length; @@ -133,10 +160,11 @@ mkDirExists = (ftp, dir) => { // Make the directory using recursive expand return ftp.mkdir(dir, true).catch(err => { if (err.message.startsWith("EEXIST")) { + // directory already exists - convert this to good news return Promise.resolve(); } else { + // something really went wrong console.log("[mkDirExists]", err.message); - // console.log(Object.getOwnPropertyNames(err)); return Promise.reject(err); } }); @@ -149,5 +177,6 @@ module.exports = { canIncludePath: canIncludePath, countFiles: countFiles, mkDirExists: mkDirExists, - deleteDir: deleteDir + deleteDir: deleteDir, + simplify }; diff --git a/src/lib.spec.js b/src/lib.spec.js index e8446ec..2475ae7 100644 --- a/src/lib.spec.js +++ b/src/lib.spec.js @@ -48,32 +48,40 @@ describe("canIncludePath", () => { }); }); -describe("dirParseSync", () => { +describe("parseLocal tests", () => { it("should throw on a bad start directory", () => { const testDir = "./throw"; - assert.throws(() => lib.parseLocal(["*"], testDir, testDir), Error); + assert.throws(() => + lib.simplify(lib.parseLocal(["*"], testDir, testDir), Error) + ); }); it("should traverse simple directory", () => { const rootDir = path.join(__dirname, "../test/simple"); - assert.deepEqual(lib.parseLocal(["*"], [], rootDir, "/"), { + console.log("***", lib.parseLocal(["*"], [], rootDir, "/")); + assert.deepEqual(lib.simplify(lib.parseLocal(["*"], [], rootDir, "/")), { "/": ["test-inside-root.txt"], inner: ["test-inside-root.excl"] }); }); it("should respect a negate (!)", () => { const rootDir = path.join(__dirname, "../test/simple"); - assert.deepEqual(lib.parseLocal(["!*.excl"], [], rootDir, "/"), { - "/": ["test-inside-root.txt"] - }); + assert.deepEqual( + lib.simplify(lib.parseLocal(["!*.excl"], [], rootDir, "/")), + { + "/": ["test-inside-root.txt"] + } + ); }); it("should respect excludes (directory)", () => { const rootDir = path.join(__dirname, "../test/local"); assert.deepEqual( - lib.parseLocal( - [".*", "*", "*/**"], - [".*", "*", "*/**"], - rootDir, - "/" + lib.simplify( + lib.parseLocal( + [".*", "*", "*/**"], + [".*", "*", "*/**"], + rootDir, + "/" + ) ), { "/": [] } ); @@ -81,13 +89,15 @@ describe("dirParseSync", () => { it("should exclude dot files/dirs", () => { const rootDir = path.join(__dirname, "../test/test2"); assert.deepEqual( - lib.parseLocal( - ["*", "*/**"], - ["n_modules/**/*", "n_modules/**/.*"], - rootDir, - "/" + lib.simplify( + lib.parseLocal( + ["*", "*/**"], + ["n_modules/**/*", "n_modules/**/.*"], + rootDir, + "/" + ) ), - { "/": [], src: [ 'index.js' ] } + { "/": [], src: ["index.js"] } ); }); it("should traverse test directory", () => { @@ -96,7 +106,7 @@ describe("dirParseSync", () => { "folderA/folderB/FolderC": ["test-inside-c.txt"] }); assert.deepEqual( - lib.parseLocal(["*"], [".excludeme/**/*"], rootDir, "/"), + lib.simplify(lib.parseLocal(["*"], [".excludeme/**/*"], rootDir, "/")), exp2 ); }); From d4777c20fbced735c697b27413300c1e05ef5fac Mon Sep 17 00:00:00 2001 From: Simon Hampton Date: Sun, 3 Nov 2019 10:19:05 +0100 Subject: [PATCH 2/5] change structure of local data --- src/ftp-deploy.js | 78 +++++++++++++++++++++++++++++++---------------- src/lib.js | 11 ++----- 2 files changed, 55 insertions(+), 34 deletions(-) diff --git a/src/ftp-deploy.js b/src/ftp-deploy.js index 0f1c55a..0f8d261 100644 --- a/src/ftp-deploy.js +++ b/src/ftp-deploy.js @@ -30,10 +30,13 @@ const FtpDeployer = function() { }; this.makeAllAndUpload = function(remoteDir, filemap) { - let keys = Object.keys(filemap); + // TODO pass on the full object + let filemap_ = lib.simplify(filemap); + + let keys = Object.keys(filemap_); return Promise.mapSeries(keys, key => { // console.log("Processing", key, filemap[key]); - return this.makeAndUpload(remoteDir, key, filemap[key]); + return this.makeAndUpload(remoteDir, key, filemap_[key]); }); }; @@ -47,31 +50,54 @@ const FtpDeployer = function() { // Creates a remote directory and uploads all of the files in it // Resolves a confirmation message on success this.makeAndUpload = (config, relDir, fnames) => { - let newDirectory = upath.join(config.remoteRoot, relDir); - return this.makeDir(newDirectory, true).then(() => { - // console.log("newDirectory", newDirectory); - return Promise.mapSeries(fnames, fname => { - let tmpFileName = upath.join(config.localRoot, relDir, fname); - let tmp = fs.readFileSync(tmpFileName); - this.eventObject["filename"] = upath.join(relDir, fname); - - this.emit("uploading", this.eventObject); - - return this.ftp - .put(tmp, upath.join(config.remoteRoot, relDir, fname)) - .then(() => { - this.eventObject.transferredFileCount++; - this.emit("uploaded", this.eventObject); - return Promise.resolve("uploaded " + tmpFileName); - }) - .catch(err => { - this.eventObject["error"] = err; - this.emit("upload-error", this.eventObject); - // if continue on error.... - return Promise.reject(err); - }); + let newRemoteDir = upath.join(config.remoteRoot, relDir); + console.log("newRemoteDir", newRemoteDir); + // ensure directory we need exists. Will resolve if dir already exists + return this.makeDir(newRemoteDir) + .then(() => { + return this.ftp.list(newRemoteDir).then(remoteStats => { + console.log("remoteStats", remoteStats); + return remoteStats.reduce((acc, item) => { + console.log(item); + acc[item.name] = { + size: item.size, + date: new Date(item.date).getTime() + }; + return acc; + }, {}); + }); + }) + .then(remoteStats => { + console.log("remoteStats", remoteStats); + return Promise.mapSeries(fnames, fname => { + let tmpLocalName = upath.join( + config.localRoot, + relDir, + fname + ); + let localFile = fs.readFileSync(tmpLocalName); + this.eventObject["filename"] = upath.join(relDir, fname); + + this.emit("uploading", this.eventObject); + + return this.ftp + .put( + localFile, + upath.join(config.remoteRoot, relDir, fname) + ) + .then(() => { + this.eventObject.transferredFileCount++; + this.emit("uploaded", this.eventObject); + return Promise.resolve("uploaded " + tmpLocalName); + }) + .catch(err => { + this.eventObject["error"] = err; + this.emit("upload-error", this.eventObject); + // if continue on error.... + return Promise.reject(err); + }); + }); }); - }); }; // connects to the server, Resolves the config on success diff --git a/src/lib.js b/src/lib.js index d9b7167..1c02658 100644 --- a/src/lib.js +++ b/src/lib.js @@ -86,9 +86,8 @@ function parseLocal(includes, excludes, localRootDir, relDir) { // currItem is a file // acc[relDir] is always created at previous iteration if (canIncludePath(includes, excludes, newRelDir)) { - let tmp = {}; - tmp[item] = stat.mtimeMs; - console.log("including", tmp); + let tmp = { fname: item, mtime: stat.mtimeMs, size: stat.size }; + // console.log("including", tmp); acc[relDir].push(tmp); return acc; } @@ -124,11 +123,7 @@ var simplify = function(obj) { let keys = Object.keys(obj); console.log(keys); return keys.reduce((acc, key) => { - console.log("*1", obj[key]); - acc[key] = obj[key].map(o => { - console.log("*2", Object.keys(o)); - return Object.keys(o)[0]; - }); + acc[key] = obj[key].map(o => o.fname); return acc; }, {}); }; From 9357439198cc8cfd00b84b06441b0e144a992d73 Mon Sep 17 00:00:00 2001 From: Simon Hampton Date: Sun, 3 Nov 2019 11:09:28 +0100 Subject: [PATCH 3/5] basically works --- package-lock.json | 2 +- package.json | 4 ++-- playground/test_script.js | 8 ++++---- src/ftp-deploy.js | 34 ++++++++++++++++++++++------------ src/lib.js | 33 +++++++-------------------------- src/lib.spec.js | 29 +++++++++++++++++++++++------ 6 files changed, 59 insertions(+), 51 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6d0ca85..3ca1886 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "ftp-deploy", - "version": "2.3.4", + "version": "2.3.5", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 9f2b21f..3d54756 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "ftp-deploy", "version": "2.3.5", "author": "Simon Hampton", - "description": "Ftp a folder from your local disk to an ftp destination", + "description": "Deploy files to a remote Ftp location", "main": "src/ftp-deploy", "scripts": { "test": "mocha **/**.spec.js", @@ -52,4 +52,4 @@ "prettier": { "tabWidth": 4 } -} \ No newline at end of file +} diff --git a/playground/test_script.js b/playground/test_script.js index 56038ba..ab3777b 100644 --- a/playground/test_script.js +++ b/playground/test_script.js @@ -9,10 +9,10 @@ const config = { host: "localhost", port: 2121, localRoot: path.join(__dirname, "local"), - remoteRoot: "/f", - deleteRemote: true, - exclude: [], - include: ["test-inside-root.txt"] + remoteRoot: "/ftp", + deleteRemote: false, + exclude: ["*/index.html"], + include: ["index.html", "folderA/*"] // include: ["**/*", "*", ".*"] }; diff --git a/src/ftp-deploy.js b/src/ftp-deploy.js index 0f8d261..56ecf32 100644 --- a/src/ftp-deploy.js +++ b/src/ftp-deploy.js @@ -31,12 +31,11 @@ const FtpDeployer = function() { this.makeAllAndUpload = function(remoteDir, filemap) { // TODO pass on the full object - let filemap_ = lib.simplify(filemap); - let keys = Object.keys(filemap_); + let keys = Object.keys(filemap); return Promise.mapSeries(keys, key => { // console.log("Processing", key, filemap[key]); - return this.makeAndUpload(remoteDir, key, filemap_[key]); + return this.makeAndUpload(remoteDir, key, filemap[key]); }); }; @@ -49,16 +48,14 @@ const FtpDeployer = function() { }; // Creates a remote directory and uploads all of the files in it // Resolves a confirmation message on success - this.makeAndUpload = (config, relDir, fnames) => { + this.makeAndUpload = (config, relDir, localFileMetas) => { let newRemoteDir = upath.join(config.remoteRoot, relDir); - console.log("newRemoteDir", newRemoteDir); + // console.log("newRemoteDir", newRemoteDir); // ensure directory we need exists. Will resolve if dir already exists return this.makeDir(newRemoteDir) .then(() => { return this.ftp.list(newRemoteDir).then(remoteStats => { - console.log("remoteStats", remoteStats); return remoteStats.reduce((acc, item) => { - console.log(item); acc[item.name] = { size: item.size, date: new Date(item.date).getTime() @@ -68,22 +65,35 @@ const FtpDeployer = function() { }); }) .then(remoteStats => { - console.log("remoteStats", remoteStats); - return Promise.mapSeries(fnames, fname => { + return Promise.mapSeries(localFileMetas, meta => { + // console.log("remoteStats", remoteStats[meta.fname], meta); let tmpLocalName = upath.join( config.localRoot, relDir, - fname + meta.fname ); + + if ( + remoteStats[meta.fname] && + remoteStats[meta.fname].size == meta.size && + remoteStats[meta.fname].date >= meta.mtime + ) { + this.emit("log", "skipping: " + meta.fname); + return Promise.resolve("skipped " + tmpLocalName); + } + let localFile = fs.readFileSync(tmpLocalName); - this.eventObject["filename"] = upath.join(relDir, fname); + this.eventObject["filename"] = upath.join( + relDir, + meta.fname + ); this.emit("uploading", this.eventObject); return this.ftp .put( localFile, - upath.join(config.remoteRoot, relDir, fname) + upath.join(config.remoteRoot, relDir, meta.fname) ) .then(() => { this.eventObject.transferredFileCount++; diff --git a/src/lib.js b/src/lib.js index 1c02658..8f97bc6 100644 --- a/src/lib.js +++ b/src/lib.js @@ -110,24 +110,6 @@ function parseLocal(includes, excludes, localRootDir, relDir) { return res; } -/* -simplify({ '/': [ { 'test-inside-root.txt': 1525592919000 } ], - inner: [ { 'test-inside-root.excl': 1550948905974.2664 } ] }) - -{ - "/": ["test-inside-root.txt"], - inner: ["test-inside-root.excl"] -} -*/ -var simplify = function(obj) { - let keys = Object.keys(obj); - console.log(keys); - return keys.reduce((acc, key) => { - acc[key] = obj[key].map(o => o.fname); - return acc; - }, {}); -}; - function countFiles(filemap) { return Object.values(filemap).reduce((acc, item) => acc.concat(item)) .length; @@ -166,12 +148,11 @@ mkDirExists = (ftp, dir) => { }; module.exports = { - checkIncludes: checkIncludes, - getPassword: getPassword, - parseLocal: parseLocal, - canIncludePath: canIncludePath, - countFiles: countFiles, - mkDirExists: mkDirExists, - deleteDir: deleteDir, - simplify + checkIncludes, + getPassword, + parseLocal, + canIncludePath, + countFiles, + mkDirExists, + deleteDir }; diff --git a/src/lib.spec.js b/src/lib.spec.js index 2475ae7..5f92586 100644 --- a/src/lib.spec.js +++ b/src/lib.spec.js @@ -52,13 +52,13 @@ describe("parseLocal tests", () => { it("should throw on a bad start directory", () => { const testDir = "./throw"; assert.throws(() => - lib.simplify(lib.parseLocal(["*"], testDir, testDir), Error) + simplify(lib.parseLocal(["*"], testDir, testDir), Error) ); }); it("should traverse simple directory", () => { const rootDir = path.join(__dirname, "../test/simple"); console.log("***", lib.parseLocal(["*"], [], rootDir, "/")); - assert.deepEqual(lib.simplify(lib.parseLocal(["*"], [], rootDir, "/")), { + assert.deepEqual(simplify(lib.parseLocal(["*"], [], rootDir, "/")), { "/": ["test-inside-root.txt"], inner: ["test-inside-root.excl"] }); @@ -66,7 +66,7 @@ describe("parseLocal tests", () => { it("should respect a negate (!)", () => { const rootDir = path.join(__dirname, "../test/simple"); assert.deepEqual( - lib.simplify(lib.parseLocal(["!*.excl"], [], rootDir, "/")), + simplify(lib.parseLocal(["!*.excl"], [], rootDir, "/")), { "/": ["test-inside-root.txt"] } @@ -75,7 +75,7 @@ describe("parseLocal tests", () => { it("should respect excludes (directory)", () => { const rootDir = path.join(__dirname, "../test/local"); assert.deepEqual( - lib.simplify( + simplify( lib.parseLocal( [".*", "*", "*/**"], [".*", "*", "*/**"], @@ -89,7 +89,7 @@ describe("parseLocal tests", () => { it("should exclude dot files/dirs", () => { const rootDir = path.join(__dirname, "../test/test2"); assert.deepEqual( - lib.simplify( + simplify( lib.parseLocal( ["*", "*/**"], ["n_modules/**/*", "n_modules/**/.*"], @@ -106,7 +106,7 @@ describe("parseLocal tests", () => { "folderA/folderB/FolderC": ["test-inside-c.txt"] }); assert.deepEqual( - lib.simplify(lib.parseLocal(["*"], [".excludeme/**/*"], rootDir, "/")), + simplify(lib.parseLocal(["*"], [".excludeme/**/*"], rootDir, "/")), exp2 ); }); @@ -121,3 +121,20 @@ let exp = { "test-inside-d-2.txt" ] }; + +/* +simplify({ '/': [ { 'test-inside-root.txt': 1525592919000 } ], + inner: [ { 'test-inside-root.excl': 1550948905974.2664 } ] }) + +{ + "/": ["test-inside-root.txt"], + inner: ["test-inside-root.excl"] +} +*/ +function simplify(obj) { + let keys = Object.keys(obj); + return keys.reduce((acc, key) => { + acc[key] = obj[key].map(o => o.fname); + return acc; + }, {}); +} From 966c634d586e476a16f0dcaabcfbde923c1b5e0c Mon Sep 17 00:00:00 2001 From: Simon Hampton Date: Sun, 3 Nov 2019 11:54:51 +0100 Subject: [PATCH 4/5] add config option for newFilesOnly --- README.md | 39 ++++++++++++++++++++++++--------------- playground/test_script.js | 1 + src/ftp-deploy.js | 24 +++++++++++++++--------- 3 files changed, 40 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index c195e00..fd0d904 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ npm install --save-dev ftp-deploy ## Usage The most basic usage: + ```js var FtpDeploy = require("ftp-deploy"); var ftpDeploy = new FtpDeploy(); @@ -25,12 +26,20 @@ var config = { port: 21, localRoot: __dirname + "/local-folder", remoteRoot: "/public_html/remote-folder/", - // include: ["*", "**/*"], // this would upload everything except dot files - include: ["*.php", "dist/*", ".*"], + // typical wordpress includes + include: ["*.php", "dist/*"], + // include: ["*", "**/*", ".*"], // upload everything, including dot files // e.g. exclude sourcemaps, and ALL files in node_modules (including dot files) - exclude: ["dist/**/*.map", "node_modules/**", "node_modules/**/.*", ".git/**"], - // delete ALL existing files at destination before uploading, if true + exclude: [ + "dist/**/*.map", + "node_modules/**", + "node_modules/**/.*", + ".git/**" + ], + // if true, delete ALL existing files (expcet dot files) at destination before uploading deleteRemote: false, + // if true, only uploads changed files (based on last modified date and file size) + newFilesOnly: false, // Passive mode is forced (EPSV command is not sent) forcePasv: true }; @@ -48,10 +57,11 @@ ftpDeploy.deploy(config, function(err, res) { }); ``` -**Note:** - - in version 2 the config file expects a field of `user` rather than `username` in 1.x. - - The config file is passed as-is to Promise-FTP. - - I create a file - e.g. deploy.js - in the root of my source code and add a script to its `package.json` so that I can `npm run deploy`. +**Note:** + +- in version 2 the config file expects a field of `user` rather than `username` in 1.x. +- The config file is passed as-is to [promise-ftp](https://github.com/realtymaps/promise-ftp) - see their docs for more options. +- I create a file - e.g. deploy.js - in the root of my source code and add a script to its `package.json` so that I can `npm run deploy`. ```json "scripts": { @@ -68,7 +78,7 @@ These are lists of [minimatch globs](https://github.com/isaacs/minimatch). ftp-d ## Events -ftp-deploy reports to clients using events. To get the output you need to implement watchers for "uploading", "uploaded" and "log": +ftp-deploy reports progress using events. These can be accessed - if desired - by registering listeners for "uploading", "uploaded", "upload-error" and "log": ```js ftpDeploy.on("uploading", function(data) { @@ -79,12 +89,12 @@ ftpDeploy.on("uploading", function(data) { ftpDeploy.on("uploaded", function(data) { console.log(data); // same data as uploading event }); -ftpDeploy.on("log", function(data) { - console.log(data); // same data as uploading event -}); ftpDeploy.on("upload-error", function(data) { console.log(data.err); // data will also include filename, relativePath, and other goodies }); +ftpDeploy.on("log", function(data) { + console.log(data); // same data as uploading event +}); ``` ## Testing @@ -105,6 +115,5 @@ npm test ## ToDo - - re-enable continueOnError - - update newer files only (PR welcome) - +- re-enable continueOnError +- update newer files only (PR welcome) diff --git a/playground/test_script.js b/playground/test_script.js index ab3777b..5eff939 100644 --- a/playground/test_script.js +++ b/playground/test_script.js @@ -11,6 +11,7 @@ const config = { localRoot: path.join(__dirname, "local"), remoteRoot: "/ftp", deleteRemote: false, + newFilesOnly: true, exclude: ["*/index.html"], include: ["index.html", "folderA/*"] // include: ["**/*", "*", ".*"] diff --git a/src/ftp-deploy.js b/src/ftp-deploy.js index 56ecf32..5d6e62b 100644 --- a/src/ftp-deploy.js +++ b/src/ftp-deploy.js @@ -54,15 +54,20 @@ const FtpDeployer = function() { // ensure directory we need exists. Will resolve if dir already exists return this.makeDir(newRemoteDir) .then(() => { - return this.ftp.list(newRemoteDir).then(remoteStats => { - return remoteStats.reduce((acc, item) => { - acc[item.name] = { - size: item.size, - date: new Date(item.date).getTime() - }; - return acc; - }, {}); - }); + if (config.newFilesOnly) { + return this.ftp.list(newRemoteDir).then(remoteStats => { + return remoteStats.reduce((acc, item) => { + acc[item.name] = { + size: item.size, + date: new Date(item.date).getTime() + }; + return acc; + }, {}); + }); + } else { + // as we will not be checking for new files, no need to stat the remote directory + return Promise.resolve({}); + } }) .then(remoteStats => { return Promise.mapSeries(localFileMetas, meta => { @@ -74,6 +79,7 @@ const FtpDeployer = function() { ); if ( + config.newFilesOnly && remoteStats[meta.fname] && remoteStats[meta.fname].size == meta.size && remoteStats[meta.fname].date >= meta.mtime From 34f37765948509078b9a65404b4167a411d549ab Mon Sep 17 00:00:00 2001 From: Simon Hampton Date: Fri, 3 Apr 2020 20:11:54 +0200 Subject: [PATCH 5/5] wip --- src/ftp-deploy.js | 1 + src/lib.spec.js | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ftp-deploy.js b/src/ftp-deploy.js index 5d6e62b..7713953 100644 --- a/src/ftp-deploy.js +++ b/src/ftp-deploy.js @@ -119,6 +119,7 @@ const FtpDeployer = function() { // connects to the server, Resolves the config on success this.connect = config => { this.ftp = new PromiseFtp(); + this.emit("log", "Attempting to connect to: " + config.host); return this.ftp.connect(config).then(serverMessage => { this.emit("log", "Connected to: " + config.host); diff --git a/src/lib.spec.js b/src/lib.spec.js index 5f92586..9da45b6 100644 --- a/src/lib.spec.js +++ b/src/lib.spec.js @@ -57,7 +57,6 @@ describe("parseLocal tests", () => { }); it("should traverse simple directory", () => { const rootDir = path.join(__dirname, "../test/simple"); - console.log("***", lib.parseLocal(["*"], [], rootDir, "/")); assert.deepEqual(simplify(lib.parseLocal(["*"], [], rootDir, "/")), { "/": ["test-inside-root.txt"], inner: ["test-inside-root.excl"]