metacon 0.0.1 → 0.1.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.
data/Gemfile CHANGED
@@ -1,5 +1,6 @@
1
1
  source "http://rubygems.org"
2
2
  gem "god", "~> 0.11.0"
3
+ gem "highline", "~> 1.6.2"
3
4
 
4
5
  # Development dependencies
5
6
  # Including everything needed to run rake, tests, features, etc.
data/Gemfile.lock CHANGED
@@ -3,6 +3,7 @@ GEM
3
3
  specs:
4
4
  git (1.2.5)
5
5
  god (0.11.0)
6
+ highline (1.6.2)
6
7
  jeweler (1.6.4)
7
8
  bundler (~> 1.0)
8
9
  git (>= 1.2.5)
@@ -18,6 +19,7 @@ PLATFORMS
18
19
  DEPENDENCIES
19
20
  bundler (~> 1.0.0)
20
21
  god (~> 0.11.0)
22
+ highline (~> 1.6.2)
21
23
  jeweler (~> 1.6.4)
22
24
  minitest
23
25
  rcov
data/README.rdoc CHANGED
@@ -5,6 +5,20 @@ development work but might be more generalizable later. For controlling a
5
5
  complex project repository. (Where controlling = developing, deploying,
6
6
  running/supervising, branching, aggregating, etc.)
7
7
 
8
+ == Commands
9
+
10
+ == Configs
11
+ === Standard families / families w/ special functionality
12
+ ==== dependencies
13
+ Define the overall dependencies for meta-environments
14
+ ==== osenv
15
+ Sets up misc. os (bash) environment variables for meta-environments (probably
16
+ won't be able to guarantee they're set except in specific run contexts)
17
+
18
+ ==== deployment
19
+
20
+ ==== runtime
21
+
8
22
  == Description
9
23
  === Context: A random walk through changing your project environment
10
24
  (while iterating/working on a single project, using mostly ruby and python as
data/TODO.md CHANGED
@@ -1,20 +1,9 @@
1
-
2
-
3
- # Installation
4
- (gem -> basic libraries used by commands)
5
- (installer ->
6
- - Basic install-script (similar to rvm installation procedure)
7
- - Install/ensure dependencies
8
- - git
9
- - rvm
10
- - god
11
- - pythonbrew
12
- - Install shell shim
13
-
14
1
  # Components
15
2
  ## General Commandline
16
- - Figure out how to load various dependency tools?
3
+
17
4
  ## Commands
5
+ - init
6
+
18
7
  - st / stat -> environment + versions of dependencies, state of submodules,
19
8
  current git state, running state, etc.
20
9
  - env [-l[ist] || new\_env]
@@ -35,10 +24,15 @@
35
24
  - Allow a ~/.metacon-config for filling in general things not specified in
36
25
  project directory.
37
26
  - project.config > home.config > default.config
38
- - Make sure there is general (sane) config stuff for supervisord
27
+ - Make sure there is general (sane) config stuff for basic ruby-god stuff
39
28
 
40
29
  ## Shell Prompt (PS1) for Bash/ZSH
41
30
 
42
31
  ## Autocomplete
43
32
 
44
33
 
34
+
35
+ ## Context Changes
36
+ *
37
+
38
+
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.1.0
data/lib/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.1.0
data/lib/metacon.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  module MetaCon
2
2
  require 'metacon/cli_helpers'
3
3
  require 'metacon/command'
4
+ require 'metacon/project'
4
5
  VERSION = File.exist?(File.join(File.dirname(__FILE__),'VERSION')) ?
5
6
  File.read(File.join(File.dirname(__FILE__),'VERSION')) : ""
6
7
  class << self
@@ -2,6 +2,7 @@ class String; def as_version; MetaCon::CLIHelpers::SymVer.new(self) end end
2
2
 
3
3
  module MetaCon
4
4
  module CLIHelpers
5
+ def included(by); by.extend(self) end
5
6
 
6
7
  class SymVer
7
8
  include Comparable
@@ -45,12 +46,13 @@ module MetaCon
45
46
  puts str if emit
46
47
  return str
47
48
  end
49
+ alias :cputs :color_puts
48
50
 
49
- def cwarn(str) color_puts("---|{brown Warning:} #{str}") end
50
- def cfail(str) color_puts("---|{red Fail:} #{str}") end
51
+ def cwarn(str) color_puts("|{brown Warning:} #{str}") end
52
+ def cfail(str) color_puts("|{red Fail:} #{str}") end
51
53
 
52
- def status(str) color_puts("\n---|{== #{str}}") end
53
- def result(str) color_puts(" |{green #{str}}\n") end
54
+ def status(str) color_puts("\n|{== #{str}}") end
55
+ def result(str) color_puts(" |{green #{str}}\n") end
54
56
 
55
57
  def fj(*args) File.expand_path(File.join(args)) end # Shortcut for File.join
56
58
 
@@ -105,6 +107,7 @@ module MetaCon
105
107
  return prof[0] unless prof.size == 0
106
108
  return nil
107
109
  end
110
+ extend self
108
111
  end
109
112
  end
110
113
 
@@ -1,10 +1,72 @@
1
1
  module MetaCon
2
2
  class Command
3
3
  require 'optparse'
4
+ require 'metacon/cli_helpers'
5
+ require 'highline'
6
+ require 'metacon/init'
7
+ require 'metacon/stat'
8
+ require 'metacon/switch'
9
+ include MetaCon::CLIHelpers
10
+ CMD_ALIASES = {
11
+ :init => :init,
12
+ :initialize => :init,
13
+
14
+ :st => :stat,
15
+ :stat => :stat,
16
+ :status => :stat,
17
+ :statistics => :stat,
18
+
19
+ :c => :curr,
20
+ :curr => :curr,
21
+ :current => :curr,
22
+
23
+ :role => :role,
24
+
25
+ :rtc => :rtc,
26
+ :rctx => :rtc,
27
+ :runtime => :rtc,
28
+ :runtimecontext => :rtc,
29
+
30
+ :os => :os,
31
+ :operatingsystem => :os,
32
+
33
+ :host => :host,
34
+ :machine => :host,
35
+ :computer => :host,
36
+ :server => :host,
37
+
38
+ :conf => :conf,
39
+ :config => :conf,
40
+ :configuration=> :conf
41
+ }
42
+ COMMANDS = [[:init, {:args => ['[DIRECTORY]'],
43
+ :desc => 'Init metacon project dir, default ./, create if necessary',
44
+ :handler => MetaCon::Init}],
45
+ [:stat, {:args => ['[STAT-NAME]'],
46
+ :desc => 'Status of / information about the current context',
47
+ :handler => MetaCon::Stat}],
48
+ [:curr, {:args => ['[KIND]'],
49
+ :desc => 'Display current metacontext (or specified part)',
50
+ :handler => MetaCon::Stat}],
51
+ [:role, {:args => ['[SWITCH-TO]'],
52
+ :desc => 'Show current role in list, or switch to new.',
53
+ :handler => MetaCon::Switch}],
54
+ [:rtc, {:args => ['[SWITCH-TO]'],
55
+ :desc => 'Show current runtime-context in list, or switch to new.',
56
+ :handler => MetaCon::Switch}],
57
+ [:os, {:args => ['[SWITCH-TO]'],
58
+ :desc => 'Show current OS in list, or try to switch to new.',
59
+ :handler => MetaCon::Switch}],
60
+ [:host, {:args => ['[SWITCH-TO]'],
61
+ :desc => 'Show current host/machine in list, or try to switch to new.',
62
+ :handler => MetaCon::Switch}],
63
+ [:conf, {:args => ['[FAMILY]'],
64
+ :desc => 'Output the currently applicable configuration',
65
+ :handler => MetaCon::Command}] ]
4
66
  def self.run
5
67
  banner = "metacon\n"+
6
68
  "MetaController version #{MetaCon::VERSION}\n" +
7
- "Usage: metacon [command] [options]"
69
+ "Usage: metacon [COMMAND] [OPTIONS]"
8
70
  options = {}
9
71
  opts = OptionParser.new do |o|
10
72
  o.version = MetaCon.version
@@ -18,16 +80,42 @@ module MetaCon
18
80
  o.separator ''
19
81
  o.separator 'commands '
20
82
  o.separator '------------------'
21
- o.separator commands.map{|c,p| "#{c.to_s.ljust(15)}#{p[:desc]}"}
83
+ cmds = COMMANDS.map do |c,p|
84
+ args = p[:args].join(' ')
85
+ "#{(c.to_s + ' ' + args).ljust(36)} #{p[:desc]}"
86
+ end
87
+ o.separator cmds
22
88
  end
89
+ rest = opts.parse(ARGV)
23
90
 
24
- files = opts.parse(ARGV)
91
+ if rest.size == 0
92
+ puts opts
93
+ exit
94
+ end
95
+ command_key = rest.shift.strip.downcase
96
+ command = CMD_ALIASES[command_key.to_sym]
97
+
98
+ if command.nil?
99
+ cfail "Command #{command_key} not found. Use -h to see the list of commands."
100
+ exit 2
101
+ end
102
+ $cli = HighLine.new
103
+ $cli.extend(MetaCon::CLIHelpers)
104
+ unless command == :init
105
+ $proj = MetaCon::Project.new
106
+ $cli.cfail 'Not a metacon project. Use `metacon init`' and exit(5) unless $proj.valid
107
+ end
108
+
109
+ command_info = COMMANDS.select{|k,v| k == command}[0][1]
110
+ command_info[:handler].send :handle, command, rest
25
111
  end
26
112
 
27
- def self.commands
28
- [[:init, {:desc=>'Initialize ./ or specified directory as a metacon directory, creating it if necessary.',
29
- :opt_arg=>'[DIRECTORY]'}]
30
- ]
113
+ def self.handle(cmd,opts)
114
+ if cmd == :conf
115
+ conf = $proj.conf
116
+ conf = Hash[opts.map{|fam| [fam, conf[fam]]}] if opts.size > 0
117
+ puts conf.to_yaml
118
+ end
31
119
  end
32
120
  end
33
121
  end
@@ -0,0 +1,62 @@
1
+ module MetaCon
2
+ class Config
3
+ attr_accessor :data, :declared
4
+ def initialize(root)
5
+ # TODO: Ability to explicitly set mconf files in .metacon settings
6
+ require 'yaml'
7
+ conf_files = Dir[root + '/**/*.mconf']
8
+ @data = []
9
+ @declared = {:rtc=>{}, :role=>{}, :os=>{}, :host=>{}}
10
+ conf_files.each{|cf| update_with(cf) }
11
+ end
12
+
13
+ def [](context)
14
+ rtc,role,os,host = [:rtc,:role,:os,:host].map{|k| context.delete(k) || '*'}
15
+ relevant = @data.select do |keys,fc|
16
+ (rtc == '*' || keys[0] == '*' || rtc == keys[0]) &&
17
+ (role== '*' || keys[1] == '*' || role== keys[1]) &&
18
+ (os == '*' || keys[2] == '*' || os == keys[2]) &&
19
+ (host== '*' || keys[3] == '*' || host== keys[3])
20
+ end
21
+ res = {}
22
+ relevant.each do |k, fc|
23
+ fam, content = fc
24
+ if res.has_key?(fam)
25
+ currv = res[fam]
26
+ if content.is_a?(Array) && currv.is_a?(Array)
27
+ res[fam] = currv | content
28
+ elsif content.is_a?(Hash) && currv.is_a?(Hash)
29
+ res[fam] = currv.merge(content)
30
+ else
31
+ # TODO: Think through more merge scenarios
32
+ raise "Could not combine conf parameters for #{fam}"
33
+ end
34
+ else res[fam] = content end
35
+ end
36
+ return res
37
+ end
38
+
39
+ protected
40
+
41
+ def update_with(fname)
42
+ default_family = File.basename(fname,'.mconf')
43
+ content = YAML.load_file(fname)
44
+ return unless content
45
+ content.each{|k,v| update_group(default_family, k, v)}
46
+ end
47
+
48
+ def update_group(default_family, key, content)
49
+ if key.start_with? '/'
50
+ # TODO: Actually parse these- negative namespaces, regex, etc.
51
+ rtc, role, os, host = key.split('/').map{|v| v.strip}[1..-1]
52
+ @declared[:rtc][rtc] = true unless rtc == '*'
53
+ @declared[:role][role] = true unless role == '*'
54
+ @declared[:os][os] = true unless os == '*'
55
+ @declared[:host][host] = true unless host == '*'
56
+ @data << [[rtc,role,os,host],[default_family, content]]
57
+ elsif content.is_a?(Hash)
58
+ content.each{|k,v| update_group(key,k,v) }
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,39 @@
1
+ module MetaCon
2
+ class Init
3
+ require 'fileutils'
4
+ def self.handle(_cmd, opts)
5
+ dir = opts.shift
6
+ dir ||= './'
7
+ # Find out if different roles are specified. If none- default to primary.
8
+ # Default to dev
9
+ # Run context-shift/verify
10
+
11
+ if MetaCon::Project.initialized?(dir)
12
+ exit(3) unless $cli.agree('This is already part of a metacon project. Continue? (y/n)', true)
13
+ end
14
+
15
+ already_there = false
16
+ mcd = File.join(dir,'.metacon')
17
+ if File.directory?(dir)
18
+ already_there = File.directory?(mcd)
19
+ else FileUtils.mkdir_p(dir) end
20
+ if already_there
21
+ exit(3) unless $cli.agree('Refresh existing .metacon directory? (y/n) ', true)
22
+ `rm -rf "#{mcd}"`
23
+ end
24
+ FileUtils.mkdir(mcd)
25
+
26
+ $cli.status "Initializing..."
27
+ mcp = MetaCon::Project.new(mcd)
28
+
29
+ init_role = mcp.list(:role)[0] || 'main'
30
+ init_rtc = mcp.list(:rtc)[0] || 'dev'
31
+ switch_res = mcp.switch(:role => init_role, :rtc => init_rtc)
32
+ if switch_res == :impossible
33
+ $cli.cfail 'Cannot initialize the metacontext- submodules need to have files committed.'
34
+ exit 4
35
+ end
36
+ $cli.result "\"#{dir}\" is now a metacon project"
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,164 @@
1
+ module MetaCon
2
+ class Project
3
+ require 'metacon/config'
4
+ attr_accessor :mc_dir, :rel_dir, :root_dir, :valid
5
+ def self.initialized?(relative_to='./')
6
+ ! find_mc_dir(relative_to).nil?
7
+ end
8
+
9
+ def initialize(relative_to='./')
10
+ @rel_dir = File.expand_path(relative_to)
11
+ @mc_dir = Project.find_mc_dir(@rel_dir)
12
+ if @mc_dir.nil?
13
+ @root_dir = nil
14
+ @valid = false
15
+ @state = nil
16
+ else
17
+ @root_dir = File.expand_path(File.join(@mc_dir, '..'))
18
+ @valid = true
19
+ @state = SavedState.new(@mc_dir)
20
+ end
21
+ end
22
+
23
+ def conf_obj
24
+ refresh_conf if @config.nil?
25
+ @config
26
+ end
27
+
28
+ def conf
29
+ refresh_conf if @config.nil?
30
+ @config[current_state]
31
+ end
32
+
33
+ def this_os; `uname -s`.strip.downcase end
34
+ def this_host; `uname -n`.strip end
35
+
36
+ def different_os?
37
+
38
+ end
39
+
40
+ def atomic(&block)
41
+ @state.atomic do |s|
42
+ yield self, s
43
+ end
44
+ end
45
+
46
+ def switch(changes={})
47
+ return :nochange if changes=={}
48
+ return :impossible unless can_switch?
49
+ changed = false
50
+ @state.atomic do |s|
51
+ changes.each do |key, val|
52
+ s[key] = val unless s[key] == val
53
+ end
54
+ changed = s.dirty
55
+ end
56
+ if changed
57
+ return setup_context
58
+ else
59
+ return :nochange
60
+ end
61
+ end
62
+
63
+ def can_switch?
64
+ # TODO: make sure submodules don't have stuff to stash etc.
65
+ return true
66
+ end
67
+
68
+ def current_state
69
+ st = @state.readonly
70
+ st[:os] = this_os if (st[:os] == '(this)' || st[:os] == '.')
71
+ st[:host] = this_host if (st[:host] == '(this)' || st[:host] == '.')
72
+ return st
73
+ end
74
+
75
+ def list(to_list)
76
+ return nil unless @valid
77
+ refresh_conf
78
+ cs = current_state
79
+ @config.declared[to_list].keys | [cs[to_list]]
80
+ end
81
+
82
+ protected
83
+
84
+ def self.find_mc_dir(relative_to='./')
85
+ d = relative_to.dup
86
+ while ! File.directory?(File.join(d,'.metacon'))
87
+ d = File.expand_path(File.join(d,'..'))
88
+ return nil if d == '/'
89
+ end
90
+ return File.join(d,'.metacon')
91
+ end
92
+
93
+ def refresh_conf; @config = Config.new(@root_dir) end
94
+
95
+ def setup_context
96
+ # Dependencies loaded in for:
97
+ # - ruby
98
+ # - gems
99
+ # - bundler Gemfiles
100
+ # - python
101
+ # - pips
102
+ # - submodules
103
+ # - (general tools)
104
+ # Use different classes for each to encourage adding more
105
+
106
+ return :switched
107
+ end
108
+ end
109
+
110
+ class SavedState
111
+ require 'yaml'
112
+ attr_accessor :dirty
113
+ def initialize(mcdir)
114
+ raise "#{mcdir} not found" unless File.directory?(mcdir)
115
+ @fstate = File.join(mcdir,'current_state')
116
+ @in_atomic = @dirty = false
117
+ end
118
+
119
+ def blank_initial_state
120
+ @dirty = true
121
+ {:role => 'main',
122
+ :rtc => 'dev',
123
+ :os => '(this)',
124
+ :host => '(this)'}
125
+ end
126
+
127
+ def atomic(&block)
128
+ @in_atomic = true
129
+ `touch #{@fstate}` # Guarantee exists and change timestamps
130
+ File.open(@fstate,'r+') do |f|
131
+ f.flock File::LOCK_EX
132
+ @state = YAML::load(f.read)
133
+ @state ||= blank_initial_state
134
+ yield self
135
+ if @dirty
136
+ f.pos = 0
137
+ f.print @state.to_yaml
138
+ f.truncate(f.pos)
139
+ end
140
+ end
141
+ @dirty = false
142
+ @in_atomic = false
143
+ end
144
+
145
+ def readonly
146
+ res = YAML::load_file(@fstate)
147
+ res ||= blank_initial_state
148
+ return res
149
+ end
150
+
151
+ def [](key)
152
+ if @in_atomic
153
+ @state[key]
154
+ end
155
+ end
156
+
157
+ def []=(key,val)
158
+ if @in_atomic
159
+ @state[key] = val
160
+ @dirty = true
161
+ end
162
+ end
163
+ end
164
+ end
@@ -0,0 +1,29 @@
1
+ module MetaCon
2
+ class Stat
3
+ def self.handle(cmd, opts)
4
+ case cmd
5
+ when :stat; stat(opts)
6
+ when :curr; curr(opts)
7
+ end
8
+ end
9
+
10
+ def self.stat(opts)
11
+ puts '(not yet implemented)'
12
+ puts curr(opts)
13
+ end
14
+
15
+ def self.curr(opts=[], proj=nil)
16
+ proj ||= $proj
17
+ $cli.cfail 'Not a metacon project. Use `metacon init`' and exit(5) unless proj.valid
18
+ state = proj.current_state
19
+ os = state[:os] == proj.this_os ? '.' : state[:os]
20
+ host = state[:host] == proj.this_host ? '.' : state[:host]
21
+ if opts.size == 0
22
+ puts "/#{state[:rtc]}/#{state[:role]}/#{os}/#{host}/"
23
+ else
24
+ # TODO: check for valid types
25
+ opts.each{|o| puts state[o.to_sym]}
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,28 @@
1
+ module MetaCon
2
+ class Switch
3
+ def self.handle(cmd, opts)
4
+ if opts.nil? or opts.size == 0
5
+ all = $proj.list(cmd)
6
+ current = $proj.current_state[cmd]
7
+ all.sort.each do |avail|
8
+ if avail == current
9
+ $cli.cputs "* |{green #{avail}}"
10
+ else
11
+ puts " #{avail}"
12
+ end
13
+ end
14
+ else
15
+ res = $proj.switch({cmd=>opts[0]})
16
+ case res
17
+ when :nochange
18
+ $cli.cwarn 'Nothing changed'
19
+ when :switched
20
+ $cli.result "Switched #{cmd} to '#{opts[0]}'"
21
+ when :impossible
22
+ $cli.cfail 'Cannot switch. Probably because submodules need committing.'
23
+ end
24
+ MetaCon::Stat.curr
25
+ end
26
+ end
27
+ end
28
+ end
data/metacon.gemspec ADDED
@@ -0,0 +1,104 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{metacon}
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Joseph Wecker"]
12
+ s.date = %q{2011-10-18}
13
+ s.description = %q{Tool with some similarities to puppet but specializing in fast development iteration and continuous deployment. Specifically initially for use with justin.tv / twitch.tv project clusters.}
14
+ s.email = %q{jwecker@justin.tv}
15
+ s.executables = ["metacon-install", "metacon"]
16
+ s.extra_rdoc_files = [
17
+ "LICENSE.txt",
18
+ "README.rdoc"
19
+ ]
20
+ s.files = [
21
+ ".attic/old/.cmd_common",
22
+ ".attic/old/Gemfile",
23
+ ".attic/old/Gemfile.lock",
24
+ ".attic/old/README",
25
+ ".attic/old/Rakefile",
26
+ ".attic/old/build",
27
+ ".attic/old/initialize",
28
+ ".attic/old/rake_help.rb",
29
+ ".attic/old/rebuild",
30
+ ".attic/old/restart",
31
+ ".attic/old/sync",
32
+ ".attic/old/test",
33
+ ".attic/old/update_submodules",
34
+ ".attic/old/workers_help.sh",
35
+ ".document",
36
+ "Gemfile",
37
+ "Gemfile.lock",
38
+ "LICENSE.txt",
39
+ "README.rdoc",
40
+ "Rakefile",
41
+ "TODO.md",
42
+ "VERSION",
43
+ "bin/metacon",
44
+ "bin/metacon-install",
45
+ "lib/VERSION",
46
+ "lib/metacon.rb",
47
+ "lib/metacon/cli_helpers.rb",
48
+ "lib/metacon/command.rb",
49
+ "lib/metacon/config.rb",
50
+ "lib/metacon/init.rb",
51
+ "lib/metacon/project.rb",
52
+ "lib/metacon/self_install.rb",
53
+ "lib/metacon/stat.rb",
54
+ "lib/metacon/switch.rb",
55
+ "metacon.gemspec",
56
+ "notes-dependency-tool.md",
57
+ "notes.rdoc",
58
+ "shelp/metacon.bashrc",
59
+ "test/helper.rb",
60
+ "test/test_metacon.rb"
61
+ ]
62
+ s.homepage = %q{http://github.com/josephwecker/metacon}
63
+ s.licenses = ["MIT"]
64
+ s.post_install_message = %q{
65
+
66
+ --- Please run metacon-install to check dependencies & finish the installation --- 
67
+
68
+ }
69
+ s.require_paths = ["lib"]
70
+ s.requirements = ["git, v1.7.4.1 or greater", "rvm, v1.8.2 or greater", "pythonbrew, v1.1 or greater"]
71
+ s.rubygems_version = %q{1.6.2}
72
+ s.summary = %q{Metacontroller for organizing aggregate projects}
73
+
74
+ if s.respond_to? :specification_version then
75
+ s.specification_version = 3
76
+
77
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
78
+ s.add_runtime_dependency(%q<god>, ["~> 0.11.0"])
79
+ s.add_runtime_dependency(%q<highline>, ["~> 1.6.2"])
80
+ s.add_development_dependency(%q<minitest>, [">= 0"])
81
+ s.add_development_dependency(%q<yard>, ["~> 0.6.0"])
82
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
83
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
84
+ s.add_development_dependency(%q<rcov>, [">= 0"])
85
+ else
86
+ s.add_dependency(%q<god>, ["~> 0.11.0"])
87
+ s.add_dependency(%q<highline>, ["~> 1.6.2"])
88
+ s.add_dependency(%q<minitest>, [">= 0"])
89
+ s.add_dependency(%q<yard>, ["~> 0.6.0"])
90
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
91
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
92
+ s.add_dependency(%q<rcov>, [">= 0"])
93
+ end
94
+ else
95
+ s.add_dependency(%q<god>, ["~> 0.11.0"])
96
+ s.add_dependency(%q<highline>, ["~> 1.6.2"])
97
+ s.add_dependency(%q<minitest>, [">= 0"])
98
+ s.add_dependency(%q<yard>, ["~> 0.6.0"])
99
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
100
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
101
+ s.add_dependency(%q<rcov>, [">= 0"])
102
+ end
103
+ end
104
+
@@ -1,17 +1,16 @@
1
- # Meta-dependencies (depended on by metacon)
2
- - git
3
- - ruby
4
- - rvm
5
- - god
6
- - supervisord(?)
7
- (and if there are any python / pip dependencies or subs that need them):
8
- - python
9
- - pythonbrew
10
-
11
- (Perhaps only installed lazily as needed by the conf options?)
12
- (also something inserted into .bashrc etc. for autocompletion and ps1
13
- alterations)
14
-
1
+ # Tool stack
2
+
3
+ * sanity-test
4
+ * pre-deploy-build
5
+ * pre-deploy-rebuild
6
+ * sync
7
+ * build
8
+ * rebuild
9
+ * test
10
+ * start
11
+ * restart
12
+ * hard-restart
13
+ * stop
15
14
 
16
15
  # Installation type
17
16
  ## 1. general
data/shelp/metacon.bashrc CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env bash
2
-
2
+ # NOTE: make sure not to show role in prompt if no role differentiation is
3
+ # used.
3
4
 
4
5
  echo 'hello'
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metacon
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 0
9
8
  - 1
10
- version: 0.0.1
9
+ - 0
10
+ version: 0.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Joseph Wecker
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-10-12 00:00:00 -07:00
18
+ date: 2011-10-18 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -35,8 +35,24 @@ dependencies:
35
35
  version_requirements: *id001
36
36
  prerelease: false
37
37
  - !ruby/object:Gem::Dependency
38
- type: :development
38
+ type: :runtime
39
39
  requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ~>
43
+ - !ruby/object:Gem::Version
44
+ hash: 11
45
+ segments:
46
+ - 1
47
+ - 6
48
+ - 2
49
+ version: 1.6.2
50
+ name: highline
51
+ version_requirements: *id002
52
+ prerelease: false
53
+ - !ruby/object:Gem::Dependency
54
+ type: :development
55
+ requirement: &id003 !ruby/object:Gem::Requirement
40
56
  none: false
41
57
  requirements:
42
58
  - - ">="
@@ -46,11 +62,11 @@ dependencies:
46
62
  - 0
47
63
  version: "0"
48
64
  name: minitest
49
- version_requirements: *id002
65
+ version_requirements: *id003
50
66
  prerelease: false
51
67
  - !ruby/object:Gem::Dependency
52
68
  type: :development
53
- requirement: &id003 !ruby/object:Gem::Requirement
69
+ requirement: &id004 !ruby/object:Gem::Requirement
54
70
  none: false
55
71
  requirements:
56
72
  - - ~>
@@ -62,11 +78,11 @@ dependencies:
62
78
  - 0
63
79
  version: 0.6.0
64
80
  name: yard
65
- version_requirements: *id003
81
+ version_requirements: *id004
66
82
  prerelease: false
67
83
  - !ruby/object:Gem::Dependency
68
84
  type: :development
69
- requirement: &id004 !ruby/object:Gem::Requirement
85
+ requirement: &id005 !ruby/object:Gem::Requirement
70
86
  none: false
71
87
  requirements:
72
88
  - - ~>
@@ -78,11 +94,11 @@ dependencies:
78
94
  - 0
79
95
  version: 1.0.0
80
96
  name: bundler
81
- version_requirements: *id004
97
+ version_requirements: *id005
82
98
  prerelease: false
83
99
  - !ruby/object:Gem::Dependency
84
100
  type: :development
85
- requirement: &id005 !ruby/object:Gem::Requirement
101
+ requirement: &id006 !ruby/object:Gem::Requirement
86
102
  none: false
87
103
  requirements:
88
104
  - - ~>
@@ -94,11 +110,11 @@ dependencies:
94
110
  - 4
95
111
  version: 1.6.4
96
112
  name: jeweler
97
- version_requirements: *id005
113
+ version_requirements: *id006
98
114
  prerelease: false
99
115
  - !ruby/object:Gem::Dependency
100
116
  type: :development
101
- requirement: &id006 !ruby/object:Gem::Requirement
117
+ requirement: &id007 !ruby/object:Gem::Requirement
102
118
  none: false
103
119
  requirements:
104
120
  - - ">="
@@ -108,7 +124,7 @@ dependencies:
108
124
  - 0
109
125
  version: "0"
110
126
  name: rcov
111
- version_requirements: *id006
127
+ version_requirements: *id007
112
128
  prerelease: false
113
129
  description: Tool with some similarities to puppet but specializing in fast development iteration and continuous deployment. Specifically initially for use with justin.tv / twitch.tv project clusters.
114
130
  email: jwecker@justin.tv
@@ -149,7 +165,13 @@ files:
149
165
  - lib/metacon.rb
150
166
  - lib/metacon/cli_helpers.rb
151
167
  - lib/metacon/command.rb
168
+ - lib/metacon/config.rb
169
+ - lib/metacon/init.rb
170
+ - lib/metacon/project.rb
152
171
  - lib/metacon/self_install.rb
172
+ - lib/metacon/stat.rb
173
+ - lib/metacon/switch.rb
174
+ - metacon.gemspec
153
175
  - notes-dependency-tool.md
154
176
  - notes.rdoc
155
177
  - shelp/metacon.bashrc