disloku 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/disloku/BaseCommand.rb +79 -0
- data/lib/disloku/ChangeSet.rb +13 -1
- data/lib/disloku/CliAdapter.rb +36 -0
- data/lib/disloku/Constants.rb +4 -0
- data/lib/disloku/FileChange.rb +7 -2
- data/lib/disloku/Log.rb +39 -12
- data/lib/disloku/Repository.rb +10 -1
- data/lib/disloku/SysCmd.rb +2 -2
- data/lib/disloku/commands/Build.rb +30 -0
- data/lib/disloku/commands/Config.rb +17 -0
- data/lib/disloku/commands/Deploy.rb +38 -0
- data/lib/disloku/config/Connection.rb +34 -0
- data/lib/disloku/config/ConnectionStore.rb +19 -0
- data/lib/disloku/config/Mapping.rb +84 -0
- data/lib/disloku/config/MappingStore.rb +19 -0
- data/lib/disloku/config/NamedConfigStore.rb +41 -0
- data/lib/disloku/config/Options.rb +51 -0
- data/lib/disloku/config/Target.rb +37 -0
- data/lib/disloku/config/YamlConfig.rb +54 -0
- data/lib/disloku/git/ChangeSetProvider.rb +19 -6
- data/lib/disloku/git/Repository.rb +16 -2
- data/lib/disloku/svn/ChangeSetProvider.rb +44 -41
- data/lib/disloku/svn/Repository.rb +24 -21
- data/lib/disloku/tasks/FolderTask.rb +5 -5
- data/lib/disloku/tasks/NetSftpTask.rb +39 -29
- data/lib/disloku/util/File.rb +9 -3
- data/lib/disloku.rb +24 -10
- metadata +20 -15
- data/lib/disloku/Commit.rb +0 -7
- data/lib/disloku/Config.rb +0 -52
- data/lib/disloku/Connection.rb +0 -31
- data/lib/disloku/ConnectionStore.rb +0 -16
- data/lib/disloku/Disloku.rb +0 -103
- data/lib/disloku/Mapping.rb +0 -81
- data/lib/disloku/MappingStore.rb +0 -16
- data/lib/disloku/NamedConfigStore.rb +0 -39
- data/lib/disloku/Options.rb +0 -46
- data/lib/disloku/Target.rb +0 -35
- data/lib/disloku/tasks/PsFtpTask.rb +0 -58
data/lib/disloku/Disloku.rb
DELETED
@@ -1,103 +0,0 @@
|
|
1
|
-
require_relative('DislokuError')
|
2
|
-
require_relative('Config')
|
3
|
-
require_relative('Options')
|
4
|
-
require_relative('MappingStore')
|
5
|
-
require_relative('ConnectionStore')
|
6
|
-
require_relative('Target')
|
7
|
-
require_relative('git/Repository')
|
8
|
-
require_relative('tasks/FolderTask')
|
9
|
-
require_relative('tasks/NetSftpTask')
|
10
|
-
|
11
|
-
module Disloku
|
12
|
-
class Disloku
|
13
|
-
attr_accessor :repository, :config
|
14
|
-
|
15
|
-
def initialize(cliOptions)
|
16
|
-
@repository = Git::Repository.new(cliOptions[:dir])
|
17
|
-
@config = loadConfiguration()
|
18
|
-
@options = Options.new(@config["options"], cliOptions)
|
19
|
-
@mappingStore = MappingStore.new(@config["mappings"])
|
20
|
-
@connectionStore = ConnectionStore.new(@config["connections"])
|
21
|
-
end
|
22
|
-
|
23
|
-
def loadConfiguration()
|
24
|
-
repoConfig = File.join(repository.root, 'disloku.config')
|
25
|
-
if (!File.exists?(repoConfig))
|
26
|
-
raise DislokuError.new("There is no disloku.config file in #{repository.root}")
|
27
|
-
end
|
28
|
-
|
29
|
-
config = Config.new(repoConfig)
|
30
|
-
|
31
|
-
userHome = File.expand_path("~")
|
32
|
-
userConfig = File.join(userHome, ".disloku.config")
|
33
|
-
if (File.exists?(userConfig))
|
34
|
-
base = Config.new(userConfig)
|
35
|
-
config.merge(base)
|
36
|
-
end
|
37
|
-
|
38
|
-
return config
|
39
|
-
end
|
40
|
-
|
41
|
-
def buildPackage(from, to)
|
42
|
-
changesets = @repository.getChangeSets(from, to)
|
43
|
-
|
44
|
-
folderInput = {
|
45
|
-
:options => @options,
|
46
|
-
:allowOverride => false,
|
47
|
-
:changesets => changesets,
|
48
|
-
:target => nil,
|
49
|
-
}
|
50
|
-
|
51
|
-
resolveTargets([@options.target]).each() do |t|
|
52
|
-
folderInput[:target] = t
|
53
|
-
|
54
|
-
result = Tasks::FolderTask.new(folderInput).execute()
|
55
|
-
p(result)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def deployPackage(from, to)
|
60
|
-
changesets = @repository.getChangeSets(from, to)
|
61
|
-
|
62
|
-
folderInput = {
|
63
|
-
:options => @options,
|
64
|
-
:allowOverride => false,
|
65
|
-
:changesets => changesets,
|
66
|
-
:target => nil,
|
67
|
-
}
|
68
|
-
|
69
|
-
resolveTargets([@options.target]).each() do |t|
|
70
|
-
folderInput[:target] = t
|
71
|
-
|
72
|
-
result = Tasks::FolderTask.new(folderInput).execute()
|
73
|
-
|
74
|
-
sftpInput = result.merge({
|
75
|
-
:repository => @repository,
|
76
|
-
:options => @options,
|
77
|
-
:target => t,
|
78
|
-
})
|
79
|
-
|
80
|
-
result = Tasks::NetSftpTask.new(sftpInput).execute()
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
def resolveTargets(targets)
|
85
|
-
actualTargets = []
|
86
|
-
|
87
|
-
while (targets.count > 0)
|
88
|
-
current = targets.shift()
|
89
|
-
targetConfig = @config["targets"][current]
|
90
|
-
if (targetConfig != nil)
|
91
|
-
if (targetConfig["targets"] != nil)
|
92
|
-
targetConfig["targets"].value().each() { |x| targets.push(x.value()) }
|
93
|
-
next
|
94
|
-
end
|
95
|
-
|
96
|
-
actualTargets.push(Target.new(current, targetConfig, @mappingStore, @connectionStore))
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
return actualTargets
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
data/lib/disloku/Mapping.rb
DELETED
@@ -1,81 +0,0 @@
|
|
1
|
-
require_relative('util/Hash')
|
2
|
-
require_relative('util/File')
|
3
|
-
|
4
|
-
module Disloku
|
5
|
-
class Mapping
|
6
|
-
|
7
|
-
def initialize(config, mappingStore = nil, allowDefault = true)
|
8
|
-
@mapping = {}
|
9
|
-
|
10
|
-
mappingConfig = config["mapping"]
|
11
|
-
if (!mappingConfig.nil?)
|
12
|
-
mappingConfig.value().each() do |m|
|
13
|
-
node = @mapping
|
14
|
-
src = m["src"].value()
|
15
|
-
|
16
|
-
if (src.kind_of?(Symbol))
|
17
|
-
segments = [src]
|
18
|
-
else
|
19
|
-
segments = src.split(/#{Util::SPLIT_EXP}/)
|
20
|
-
|
21
|
-
segments[0..-2].each() do |segment|
|
22
|
-
if (!node.has_key?(segment))
|
23
|
-
node[segment] = {}
|
24
|
-
end
|
25
|
-
node = node[segment]
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
if (!m["block"].nil? && m["block"].value())
|
30
|
-
node[segments[-1]] = :block
|
31
|
-
else
|
32
|
-
dst = m["dst"].value()
|
33
|
-
if (dst.kind_of?(Symbol))
|
34
|
-
node[segments[-1]] = dst
|
35
|
-
else
|
36
|
-
node[segments[-1]] = m["dst"].value().split(/#{Util::SPLIT_EXP}/)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
elsif (allowDefault)
|
41
|
-
@mapping[:any] = :keep
|
42
|
-
end
|
43
|
-
|
44
|
-
baseMapping = config["baseMapping"].nil? ? nil : config["baseMapping"].value()
|
45
|
-
|
46
|
-
if (!baseMapping.nil?)
|
47
|
-
if (mappingStore.nil?)
|
48
|
-
raise ArgumentError.new("mapping has a base but no mapping manager was passed")
|
49
|
-
else
|
50
|
-
@mapping = mappingStore.get(baseMapping).getTree().recursive_merge(@mapping)
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def getTree()
|
56
|
-
return @mapping
|
57
|
-
end
|
58
|
-
|
59
|
-
def mapPath(pathSegments)
|
60
|
-
node = @mapping
|
61
|
-
for i in 0..pathSegments.count
|
62
|
-
if (node.has_key?(pathSegments[i]))
|
63
|
-
node = node[pathSegments[i]]
|
64
|
-
elsif (node.has_key?(:any))
|
65
|
-
node = node[:any]
|
66
|
-
else
|
67
|
-
return nil
|
68
|
-
end
|
69
|
-
|
70
|
-
if (node == :block)
|
71
|
-
return nil
|
72
|
-
elsif (node == :keep)
|
73
|
-
return pathSegments
|
74
|
-
elsif (node.kind_of?(Array))
|
75
|
-
return Array.new(node).concat(pathSegments[(i + 1)..-1])
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
end
|
81
|
-
end
|
data/lib/disloku/MappingStore.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
require_relative('NamedConfigStore')
|
2
|
-
require_relative('Mapping')
|
3
|
-
|
4
|
-
module Disloku
|
5
|
-
class MappingStore < NamedConfigStore
|
6
|
-
|
7
|
-
def initialize(config = nil)
|
8
|
-
super(config)
|
9
|
-
end
|
10
|
-
|
11
|
-
def transformConfig(configObject)
|
12
|
-
return Mapping.new(configObject, self, false)
|
13
|
-
end
|
14
|
-
|
15
|
-
end
|
16
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
require_relative('DislokuError')
|
2
|
-
require_relative('Connection')
|
3
|
-
|
4
|
-
module Disloku
|
5
|
-
class NamedConfigStore
|
6
|
-
|
7
|
-
def initialize(config = nil)
|
8
|
-
@store = {}
|
9
|
-
if (!config.nil?)
|
10
|
-
load(config)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def get(name)
|
15
|
-
if (@store.has_key?(name))
|
16
|
-
return @store[name]
|
17
|
-
else
|
18
|
-
raise DislokuError.new("There is no stored object with the name '#{name}' in this store")
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def add(name, configObject)
|
23
|
-
@store[name] = transformConfig(configObject)
|
24
|
-
end
|
25
|
-
|
26
|
-
def load(config)
|
27
|
-
if (!config.nil?)
|
28
|
-
config.value().each_key() do |key|
|
29
|
-
add(key, config[key])
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def transformConfig(configObject)
|
35
|
-
return configObject
|
36
|
-
end
|
37
|
-
|
38
|
-
end
|
39
|
-
end
|
data/lib/disloku/Options.rb
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
require_relative('Log')
|
2
|
-
require_relative('Config')
|
3
|
-
require_relative('util/Kernel')
|
4
|
-
require('tmpdir')
|
5
|
-
require('fileutils')
|
6
|
-
|
7
|
-
module Disloku
|
8
|
-
class Options
|
9
|
-
|
10
|
-
def initialize(config, cliOptions)
|
11
|
-
@options = {
|
12
|
-
:ignoreDeleteErrors => false,
|
13
|
-
:createDeletesFile => false,
|
14
|
-
:target => "default",
|
15
|
-
:packageDir => :temp,
|
16
|
-
}
|
17
|
-
|
18
|
-
@options.each_key() do |key|
|
19
|
-
if (cliOptions.has_key?(key.to_s()))
|
20
|
-
@options[key] = cliOptions[key.to_s()]
|
21
|
-
elsif (config[key.to_s()] != nil)
|
22
|
-
@options[key] = config[key.to_s()].value()
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
if (@options[:packageDir] == :temp)
|
27
|
-
@options[:packageDir] = Dir.mktmpdir("disloku")
|
28
|
-
Log.instance.debug("Creating tmp directory #{@options[:packageDir]}")
|
29
|
-
|
30
|
-
# make sure the temp directory is deleted when the program exists
|
31
|
-
at_exit {
|
32
|
-
Log.instance.debug("Removing tmp directory #{@options[:packageDir]}")
|
33
|
-
FileUtils.rm_r(@options[:packageDir], :force => true)
|
34
|
-
}
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def method_missing(name, *args, &block)
|
39
|
-
if (!@options.has_key?(name))
|
40
|
-
raise ArgumentError.new("There's no option '#{name}' here")
|
41
|
-
end
|
42
|
-
|
43
|
-
return @options[name]
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
data/lib/disloku/Target.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
require_relative('Mapping')
|
2
|
-
require_relative('Connection')
|
3
|
-
require_relative('util/File')
|
4
|
-
|
5
|
-
module Disloku
|
6
|
-
class Target
|
7
|
-
attr_accessor :name, :connection
|
8
|
-
|
9
|
-
def initialize(name, targetConfig, mappingStore, connectionStore)
|
10
|
-
@name = name
|
11
|
-
@config = targetConfig
|
12
|
-
|
13
|
-
if (@config["connection"].value().kind_of?(String))
|
14
|
-
@connection = connectionStore.get(@config["connection"].value())
|
15
|
-
else
|
16
|
-
@connection = Connection.new(@config["connection"])
|
17
|
-
end
|
18
|
-
|
19
|
-
@mapping = Mapping.new(@config, mappingStore)
|
20
|
-
end
|
21
|
-
|
22
|
-
def mapPath(pathSegments)
|
23
|
-
return @mapping.mapPath(pathSegments)
|
24
|
-
end
|
25
|
-
|
26
|
-
def method_missing(name, *args, &block)
|
27
|
-
if (!@config.has?(name.to_s()))
|
28
|
-
return nil
|
29
|
-
end
|
30
|
-
|
31
|
-
return @config[name.to_s()].value()
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
35
|
-
end
|
@@ -1,58 +0,0 @@
|
|
1
|
-
require_relative('../Log')
|
2
|
-
require_relative('../BaseTask')
|
3
|
-
require('open3')
|
4
|
-
|
5
|
-
module Disloku
|
6
|
-
module Tasks
|
7
|
-
# class PsFtpTask < BaseTask
|
8
|
-
# def initialize(stream, config, changesets)
|
9
|
-
# super(stream, changesets)
|
10
|
-
# @config = config.yaml["psftp"]
|
11
|
-
# end
|
12
|
-
|
13
|
-
# def beforeExecute()
|
14
|
-
# Log.instance.info(@config["path"])
|
15
|
-
# env = @config["env"][0]
|
16
|
-
# Log.instance.info(env)
|
17
|
-
# cmd = "\"#{@config['path']}\""
|
18
|
-
|
19
|
-
# if (env.has_key?("key"))
|
20
|
-
# cmd += " -i \"#{env['key']}\""
|
21
|
-
# else
|
22
|
-
# cmd += " -pw #{env['password']}"
|
23
|
-
# end
|
24
|
-
|
25
|
-
# cmd += " #{env['user']}@#{env['host']}"
|
26
|
-
|
27
|
-
# Log.instance.info(cmd)
|
28
|
-
|
29
|
-
# @stream, @output = Open3.popen2(cmd)
|
30
|
-
# writeLine("cd #{env['targetDir']}")
|
31
|
-
# end
|
32
|
-
|
33
|
-
# def executeTask(changeset)
|
34
|
-
# changeset.each() do |change|
|
35
|
-
# destination = change.file.segments.join("/")
|
36
|
-
# case change.changeType
|
37
|
-
# when :modified, :added
|
38
|
-
# path = change.file.getPathSegments().join('/')
|
39
|
-
# Log.instance.info("mkdir \"#{path}\"")
|
40
|
-
# writeLine("mkdir \"#{path}\"")
|
41
|
-
# Log.instance.info("put \"#{change.file.filePath}\" \"#{destination}\"")
|
42
|
-
# writeLine("put \"#{change.file.filePath}\" \"#{destination}\"")
|
43
|
-
# when :deleted
|
44
|
-
# writeLine("del \"#{destination}\"")
|
45
|
-
# else
|
46
|
-
# Log.instance.info("ignoring change type #{change.changeType}")
|
47
|
-
# end
|
48
|
-
# end
|
49
|
-
# end
|
50
|
-
|
51
|
-
# def afterExecute()
|
52
|
-
# writeLine("quit")
|
53
|
-
|
54
|
-
# @output.readlines.each(&Log.instance.method(:info))
|
55
|
-
# end
|
56
|
-
# end
|
57
|
-
end
|
58
|
-
end
|