metacon 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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