Skip to content

Commit 97cbac5

Browse files
committed
feature: download all command
1 parent e3d2962 commit 97cbac5

File tree

4 files changed

+84
-0
lines changed

4 files changed

+84
-0
lines changed

lib/RemoteSync.coffee

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
DownloadAllCommand = require "./commands/DownloadAllCommand"
12
SettingsLocator = require "./SettingsLocator"
23
UploadListener = require "./UploadListener"
34
ScpTransport = require "./transports/ScpTransport"
@@ -15,3 +16,7 @@ class RemoteSync
1516
scp: new ScpTransport logger
1617

1718
new UploadListener logger, settingsLocator, transports
19+
20+
downloadAll = new DownloadAllCommand logger, settingsLocator, transports
21+
22+
atom.workspaceView.command "remote-sync:download-all", downloadAll.run.bind(downloadAll)
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
minimatch = require "minimatch"
2+
async = require "async"
3+
4+
5+
module.exports =
6+
class DownloadAllCommand
7+
constructor: (@logger, @settingsLocator, @transports) ->
8+
9+
run: ->
10+
buffer = atom.workspace.getActiveEditor().getBuffer()
11+
return unless buffer.file
12+
filePath = buffer.file.path
13+
@settingsLocator.locate filePath, (err, result) =>
14+
return if err
15+
16+
settings = result.settings
17+
18+
@transports[settings.transport].fetchFileTree settings, (err, files) =>
19+
return if err
20+
21+
if settings.ignore
22+
patterns = settings.ignore
23+
files = files.filter (file) ->
24+
for pattern in patterns
25+
if minimatch file, pattern
26+
return false
27+
return true
28+
29+
async.mapSeries files, (file, callback) =>
30+
@transports[settings.transport].download result.rootDirectory, file, settings, callback
31+
, (err) =>
32+
return @logger.error if err
33+
@logger.log "Downloaded all files"

lib/transports/ScpTransport.coffee

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{MessagePanelView, PlainMessageView} = require "atom-message-panel"
22
SSHConnection = require "ssh2"
3+
mkdirp = require "mkdirp"
34
path = require "path"
45

56

@@ -34,6 +35,50 @@ class ScpTransport
3435

3536
sftp.end()
3637
callback()
38+
@connections = {}
39+
40+
download: (rootDirectory, relativeFilePath, settings, callback) ->
41+
localFilePath = path.join(rootDirectory, relativeFilePath)
42+
targetFilePath = path.join(settings.target, relativeFilePath)
43+
44+
errorHandler = (err) =>
45+
@logger.error err
46+
callback()
47+
48+
@_getConnection settings.hostname, settings.username, settings.password, (err, c) =>
49+
return errorHandler err if err
50+
51+
@logger.log "Downloading: #{relativeFilePath}"
52+
53+
c.sftp (err, sftp) =>
54+
return errorHandler err if err
55+
56+
mkdirp path.dirname(localFilePath), (err) =>
57+
return errorHandler err if err
58+
59+
sftp.fastGet targetFilePath, localFilePath, (err) =>
60+
return errorHandler err if err
61+
62+
@logger.log "Downloaded: #{relativeFilePath}"
63+
64+
sftp.end()
65+
callback()
66+
67+
fetchFileTree: (settings, callback) ->
68+
@_getConnection settings.hostname, settings.username, settings.password, (err, c) =>
69+
return callback err if err
70+
71+
c.exec "find \"#{settings.target}\" -type f", (err, result) ->
72+
return callback err if err
73+
74+
buf = ""
75+
result.on "data", (data) -> buf += data.toString()
76+
result.on "end", ->
77+
targetRegexp = new RegExp "^#{settings.target}/"
78+
files = buf.split("\n")
79+
.filter((f) -> targetRegexp.test(f))
80+
.map((f) -> f.replace(targetRegexp, ""))
81+
callback null, files
3782

3883
_getConnection: (hostname, username, password, callback) ->
3984
key = "#{username}@#{hostname}"

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
"ssh2": "^0.2",
1414
"minimatch": "^0.2",
1515
"async": "^0.2",
16+
"mkdirp": "^0.3",
1617
"atom-message-panel": "git+https://github.com/vslinko/atom-message-panel.git#patch-1"
1718
}
1819
}

0 commit comments

Comments
 (0)