gitpusshuten 0.0.1
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/.bundle/config +2 -0
- data/.gitignore +4 -0
- data/Gemfile +9 -0
- data/Gemfile.lock +53 -0
- data/README.md +7 -0
- data/bin/gitpusshuten +4 -0
- data/bin/heavenly +4 -0
- data/bin/ten +4 -0
- data/gitpusshuten.gemspec +26 -0
- data/lib/gitpusshuten/cli.rb +78 -0
- data/lib/gitpusshuten/command.rb +147 -0
- data/lib/gitpusshuten/commands/base.rb +246 -0
- data/lib/gitpusshuten/commands/delete.rb +27 -0
- data/lib/gitpusshuten/commands/help.rb +36 -0
- data/lib/gitpusshuten/commands/initialize.rb +61 -0
- data/lib/gitpusshuten/commands/push.rb +54 -0
- data/lib/gitpusshuten/commands/remote.rb +29 -0
- data/lib/gitpusshuten/commands/user.rb +252 -0
- data/lib/gitpusshuten/commands/version.rb +21 -0
- data/lib/gitpusshuten/configuration.rb +122 -0
- data/lib/gitpusshuten/environment.rb +70 -0
- data/lib/gitpusshuten/gem.rb +33 -0
- data/lib/gitpusshuten/git.rb +111 -0
- data/lib/gitpusshuten/helpers/environment/installers.rb +59 -0
- data/lib/gitpusshuten/helpers/environment/packages.rb +21 -0
- data/lib/gitpusshuten/helpers/environment/scp.rb +57 -0
- data/lib/gitpusshuten/helpers/environment/ssh.rb +77 -0
- data/lib/gitpusshuten/helpers/environment/ssh_key.rb +79 -0
- data/lib/gitpusshuten/helpers/environment/user.rb +70 -0
- data/lib/gitpusshuten/helpers/spinner.rb +98 -0
- data/lib/gitpusshuten/hook.rb +26 -0
- data/lib/gitpusshuten/hooks.rb +147 -0
- data/lib/gitpusshuten/initializer.rb +95 -0
- data/lib/gitpusshuten/local.rb +35 -0
- data/lib/gitpusshuten/log.rb +83 -0
- data/lib/gitpusshuten/modules/active_record/hooks.rb +19 -0
- data/lib/gitpusshuten/modules/apache/command.rb +354 -0
- data/lib/gitpusshuten/modules/bundler/command.rb +43 -0
- data/lib/gitpusshuten/modules/bundler/hooks.rb +8 -0
- data/lib/gitpusshuten/modules/mysql/command.rb +192 -0
- data/lib/gitpusshuten/modules/nanoc/hooks.rb +9 -0
- data/lib/gitpusshuten/modules/nginx/command.rb +447 -0
- data/lib/gitpusshuten/modules/passenger/command.rb +310 -0
- data/lib/gitpusshuten/modules/passenger/hooks.rb +4 -0
- data/lib/gitpusshuten/modules/rvm/command.rb +277 -0
- data/lib/gitpusshuten.rb +21 -0
- data/lib/templates/config.rb +37 -0
- data/lib/templates/hooks.rb +40 -0
- data/spec/cli_spec.rb +83 -0
- data/spec/command_spec.rb +76 -0
- data/spec/configuration_spec.rb +45 -0
- data/spec/environment_spec.rb +64 -0
- data/spec/fixtures/combined_hooks.rb +23 -0
- data/spec/fixtures/config.rb +23 -0
- data/spec/fixtures/hooks.rb +37 -0
- data/spec/fixtures/passenger.json +1 -0
- data/spec/gem_spec.rb +28 -0
- data/spec/git_spec.rb +59 -0
- data/spec/gitpusshuten_spec.rb +9 -0
- data/spec/hook_spec.rb +48 -0
- data/spec/hooks_spec.rb +150 -0
- data/spec/initializer_spec.rb +26 -0
- data/spec/log_spec.rb +20 -0
- data/spec/spec_helper.rb +43 -0
- metadata +220 -0
@@ -0,0 +1,147 @@
|
|
1
|
+
module GitPusshuTen
|
2
|
+
class Hooks
|
3
|
+
|
4
|
+
##
|
5
|
+
# Contains the environment on the remote server name which
|
6
|
+
# is extracted from the selected configuration in the configuration file
|
7
|
+
attr_accessor :environment
|
8
|
+
|
9
|
+
##
|
10
|
+
# Contains the configuration object
|
11
|
+
attr_accessor :configuration
|
12
|
+
|
13
|
+
##
|
14
|
+
# Contains an array of GitPusshuTen::Hook objects for the current environment
|
15
|
+
attr_accessor :to_perform
|
16
|
+
|
17
|
+
##
|
18
|
+
# Contains an array of commands to run for the currently parsed hook
|
19
|
+
# This gets reset to [] every time a new hook is being parsed
|
20
|
+
attr_accessor :commands_to_run
|
21
|
+
|
22
|
+
##
|
23
|
+
# Initializes a new Hooks object
|
24
|
+
# Provide the environment (e.g. :staging, :production) to parse
|
25
|
+
def initialize(environment, configuration)
|
26
|
+
@environment = environment
|
27
|
+
@configuration = configuration
|
28
|
+
@to_perform = []
|
29
|
+
@commands_to_run = []
|
30
|
+
end
|
31
|
+
|
32
|
+
##
|
33
|
+
# Parses the configuration file and loads all the
|
34
|
+
# configuration values into the GitPusshuTen::Configuration instance
|
35
|
+
def parse!(hooks_file)
|
36
|
+
if File.exist?(hooks_file)
|
37
|
+
instance_eval(File.read(hooks_file))
|
38
|
+
else
|
39
|
+
GitPusshuTen::Log.warning "Could not locate the hooks.rb file in #{hooks_file}"
|
40
|
+
end
|
41
|
+
self
|
42
|
+
end
|
43
|
+
|
44
|
+
##
|
45
|
+
# Parses any modules that are set in the configuration (config.rb) file
|
46
|
+
def parse_modules!
|
47
|
+
configuration.additional_modules.each do |additional_module|
|
48
|
+
module_file = File.join(File.dirname(__FILE__), 'modules', additional_module.to_s, 'hooks.rb')
|
49
|
+
if File.exist?(module_file)
|
50
|
+
instance_eval(File.read(module_file))
|
51
|
+
end
|
52
|
+
end
|
53
|
+
self
|
54
|
+
end
|
55
|
+
|
56
|
+
##
|
57
|
+
# Perform On
|
58
|
+
# Helper method used to configure the hooks.rb file
|
59
|
+
def perform_on(*environments, &configuration)
|
60
|
+
if environments.flatten.include?(environment)
|
61
|
+
configuration.call
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
##
|
66
|
+
# Pre
|
67
|
+
# A method for setting pre-hooks inside the perform_on block
|
68
|
+
# Resets the "commands_to_run" variable to an empty array so that
|
69
|
+
# there's a clean array to work with the next set of commands.
|
70
|
+
# The "commands.call" invokes all the "run(<command>)" the user
|
71
|
+
# provided in the hooks.rb configuration file and extracts the strings
|
72
|
+
# of commands to run. This array is then passed into a newly made Hook object
|
73
|
+
# which is again stored into the "to_perform" array.
|
74
|
+
def pre(name, &commands)
|
75
|
+
@commands_to_run = []
|
76
|
+
commands.call
|
77
|
+
@to_perform << Hook.new({
|
78
|
+
:type => :pre,
|
79
|
+
:name => name,
|
80
|
+
:commands => commands_to_run
|
81
|
+
})
|
82
|
+
end
|
83
|
+
|
84
|
+
##
|
85
|
+
# Post
|
86
|
+
# A method for setting post-hooks inside the perform_on block
|
87
|
+
# Resets the "commands_to_run" variable to an empty array so that
|
88
|
+
# there's a clean array to work with the next set of commands.
|
89
|
+
# The "commands.call" invokes all the "run(<command>)" the user
|
90
|
+
# provided in the hooks.rb configuration file and extracts the strings
|
91
|
+
# of commands to run. This array is then passed into a newly made Hook object
|
92
|
+
# which is again stored into the "to_perform" array.
|
93
|
+
def post(name, &commands)
|
94
|
+
@commands_to_run = []
|
95
|
+
commands.call
|
96
|
+
@to_perform << Hook.new({
|
97
|
+
:type => :post,
|
98
|
+
:name => name,
|
99
|
+
:commands => commands_to_run
|
100
|
+
})
|
101
|
+
end
|
102
|
+
|
103
|
+
##
|
104
|
+
# Run
|
105
|
+
# A method for setting commands on a
|
106
|
+
# post-hook or pre-hook inside the perform_on block
|
107
|
+
def run(command)
|
108
|
+
@commands_to_run << command
|
109
|
+
end
|
110
|
+
|
111
|
+
##
|
112
|
+
# Pre Hooks
|
113
|
+
# Returns an array of pre-hooks
|
114
|
+
def pre_hooks
|
115
|
+
@to_perform.map do |hook|
|
116
|
+
next unless hook.type.eql? :pre
|
117
|
+
hook
|
118
|
+
end.compact
|
119
|
+
end
|
120
|
+
|
121
|
+
##
|
122
|
+
# Post Hooks
|
123
|
+
# Returns an array of post-hooks
|
124
|
+
def post_hooks
|
125
|
+
@to_perform.map do |hook|
|
126
|
+
next unless hook.type.eql? :post
|
127
|
+
hook
|
128
|
+
end.compact
|
129
|
+
end
|
130
|
+
|
131
|
+
##
|
132
|
+
# Takes an array of hooks and renders them a Hash that
|
133
|
+
# contains the name of the hook, as well as all the commands
|
134
|
+
# bundled in a single string, separated by semi-colons.
|
135
|
+
def render_commands(hooks)
|
136
|
+
hooks_hash = {}
|
137
|
+
hooks.each do |hook|
|
138
|
+
hooks_hash[hook.name] = ''
|
139
|
+
hook.commands.each do |command|
|
140
|
+
hooks_hash[hook.name] << "#{command};".gsub(/;{2,}/, ';')
|
141
|
+
end
|
142
|
+
end
|
143
|
+
hooks_hash
|
144
|
+
end
|
145
|
+
|
146
|
+
end
|
147
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
module GitPusshuTen
|
2
|
+
class Initializer
|
3
|
+
|
4
|
+
##
|
5
|
+
# Method to be called from CLI/Executable
|
6
|
+
def initialize(*args)
|
7
|
+
invoke_independent_command!(args)
|
8
|
+
|
9
|
+
if not File.exist?(configuration_file)
|
10
|
+
GitPusshuTen::Log.error "Couldn't find the GitPusshuTen configuration file in #{configuration_file}."
|
11
|
+
exit
|
12
|
+
end
|
13
|
+
|
14
|
+
##
|
15
|
+
# Parse the CLI arguments
|
16
|
+
cli = GitPusshuTen::CLI.new(args)
|
17
|
+
|
18
|
+
##
|
19
|
+
# Load in the requested environment and it's configuration
|
20
|
+
configuration = GitPusshuTen::Configuration.new(cli.environment).parse!(configuration_file)
|
21
|
+
|
22
|
+
##
|
23
|
+
# Load in hooks
|
24
|
+
hooks = GitPusshuTen::Hooks.new(cli.environment, configuration).parse!(hooks_file).parse_modules!
|
25
|
+
|
26
|
+
##
|
27
|
+
# Configure the environment connection establisher
|
28
|
+
environment = GitPusshuTen::Environment.new(configuration)
|
29
|
+
|
30
|
+
##
|
31
|
+
# Bootstrap the command
|
32
|
+
GitPusshuTen::Command.new(cli, configuration, hooks, environment).perform!
|
33
|
+
end
|
34
|
+
|
35
|
+
##
|
36
|
+
# Path to assumed configuration file
|
37
|
+
def configuration_file
|
38
|
+
gitpusshuten_root + '/config.rb'
|
39
|
+
end
|
40
|
+
|
41
|
+
##
|
42
|
+
# Path to assumed hooks file
|
43
|
+
def hooks_file
|
44
|
+
gitpusshuten_root + '/hooks.rb'
|
45
|
+
end
|
46
|
+
|
47
|
+
##
|
48
|
+
# Path to the assumed .gitpusshuten directory
|
49
|
+
def gitpusshuten_root
|
50
|
+
File.expand_path(File.join(Dir.pwd, '.gitpusshuten'))
|
51
|
+
end
|
52
|
+
|
53
|
+
##
|
54
|
+
# If a command that does not rely on an initialized
|
55
|
+
# environment, run it without attemping to parse environment
|
56
|
+
# specific files.
|
57
|
+
def invoke_independent_command!(args)
|
58
|
+
|
59
|
+
##
|
60
|
+
# Flatten Arguments to be able to test if the array is empty
|
61
|
+
# and not an empty array in an empty array
|
62
|
+
args.flatten!
|
63
|
+
|
64
|
+
##
|
65
|
+
# Parses the CLI
|
66
|
+
cli = GitPusshuTen::CLI.new(args)
|
67
|
+
|
68
|
+
##
|
69
|
+
# Parses the Configuration
|
70
|
+
if File.exist?(configuration_file)
|
71
|
+
configuration = GitPusshuTen::Configuration.new(cli.environment).parse!(configuration_file)
|
72
|
+
else
|
73
|
+
configuration = nil
|
74
|
+
end
|
75
|
+
|
76
|
+
##
|
77
|
+
# Initializes the help command by default if there aren't any arguments
|
78
|
+
if args.empty?
|
79
|
+
GitPusshuTen::Command.new(cli, configuration, nil, nil)
|
80
|
+
exit
|
81
|
+
end
|
82
|
+
|
83
|
+
##
|
84
|
+
# Append more arguments to the array below to allow more commands
|
85
|
+
# to invoke without initializing an environment
|
86
|
+
if %w[help version initialize].include? args.flatten.first
|
87
|
+
"GitPusshuTen::Commands::#{args.flatten.first.classify}".constantize.new(
|
88
|
+
cli, configuration, nil, nil
|
89
|
+
).perform!
|
90
|
+
exit
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module GitPusshuTen
|
2
|
+
class Local
|
3
|
+
|
4
|
+
##
|
5
|
+
# Performs a command on the local machien
|
6
|
+
def execute(command)
|
7
|
+
%x[#{command}]
|
8
|
+
end
|
9
|
+
|
10
|
+
##
|
11
|
+
# Returns the .gitpusshuten local directory
|
12
|
+
def gitpusshuten_dir
|
13
|
+
File.join(Dir.pwd, '.gitpusshuten')
|
14
|
+
end
|
15
|
+
|
16
|
+
##
|
17
|
+
# Returns the .gitpusshuten tmp directory
|
18
|
+
def tmp_dir
|
19
|
+
File.join(gitpusshuten_dir, 'tmp')
|
20
|
+
end
|
21
|
+
|
22
|
+
##
|
23
|
+
# Create tmp_dir
|
24
|
+
def create_tmp_dir!
|
25
|
+
%x[mkdir -p '#{tmp_dir}']
|
26
|
+
end
|
27
|
+
|
28
|
+
##
|
29
|
+
# Removes everything inside the tmp_dir
|
30
|
+
def remove_tmp_dir!
|
31
|
+
%x[rm -rf '#{tmp_dir}']
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module GitPusshuTen
|
3
|
+
class Log
|
4
|
+
|
5
|
+
##
|
6
|
+
# Displays a regular message without prefix
|
7
|
+
def self.standard(message)
|
8
|
+
puts message
|
9
|
+
to_file message
|
10
|
+
end
|
11
|
+
|
12
|
+
##
|
13
|
+
# Displays a regular message
|
14
|
+
def self.message(message)
|
15
|
+
message = "[message] ".color(:green) + message
|
16
|
+
puts message
|
17
|
+
to_file message
|
18
|
+
end
|
19
|
+
|
20
|
+
##
|
21
|
+
# Displays a warning message
|
22
|
+
def self.warning(message)
|
23
|
+
message = "[warning] ".color(:yellow) + message
|
24
|
+
puts message
|
25
|
+
to_file message
|
26
|
+
end
|
27
|
+
|
28
|
+
##
|
29
|
+
# Displays an error message
|
30
|
+
def self.error(message)
|
31
|
+
message = "[error] ".color(:red) + message
|
32
|
+
puts message
|
33
|
+
to_file message
|
34
|
+
end
|
35
|
+
|
36
|
+
##
|
37
|
+
# Silently logs messages
|
38
|
+
def self.silent(message)
|
39
|
+
to_file message
|
40
|
+
end
|
41
|
+
|
42
|
+
##
|
43
|
+
# Logs the message to the log file
|
44
|
+
def self.to_file(message)
|
45
|
+
return unless message.is_a?(String)
|
46
|
+
|
47
|
+
##
|
48
|
+
# Don't log if we're not working within the Gitpusshuten directory
|
49
|
+
if File.directory?(gitpusshuten_dir)
|
50
|
+
|
51
|
+
##
|
52
|
+
# Create the log directory if it doesn't exist
|
53
|
+
if not File.directory?(log_dir)
|
54
|
+
%x[mkdir -p '#{log_dir}']
|
55
|
+
end
|
56
|
+
|
57
|
+
##
|
58
|
+
# Remove all ANSI coloring codes for clean logging
|
59
|
+
message.gsub!(/\[\d+m/, '')
|
60
|
+
|
61
|
+
##
|
62
|
+
# Log the message to the file (append)
|
63
|
+
File.open(File.join(log_dir, 'gitpusshuten.log'), 'a') do |file|
|
64
|
+
file << "\n#{Time.now.strftime("[%m/%d/%Y %H:%M:%S]")} #{message}"
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
##
|
71
|
+
# Returns the Gitpusshuten directory path
|
72
|
+
def self.gitpusshuten_dir
|
73
|
+
File.join(Dir.pwd, '.gitpusshuten')
|
74
|
+
end
|
75
|
+
|
76
|
+
##
|
77
|
+
# Returns the Gitpusshuten log directory path
|
78
|
+
def self.log_dir
|
79
|
+
File.join(gitpusshuten_dir, 'log')
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
##
|
2
|
+
# Will check if the app_root/config/database.yml.<environment> exists
|
3
|
+
# if it does, it'll overwrite the database.yml with that environment database.
|
4
|
+
# If it does not exist, it'll leave the database.yml unchanged.
|
5
|
+
post "Setting proper database for environment. (Rails)" do
|
6
|
+
run "if [[ -f 'config/database.yml.#{environment}' ]]; then " +
|
7
|
+
"echo 'config/database.yml.#{environment} found! Using this one instead of config/database.yml';" +
|
8
|
+
"echo 'Overwriting config/database.yml with config/database.yml.#{environment}';" +
|
9
|
+
"mv 'config/database.yml.#{environment}' 'config/database.yml'; " +
|
10
|
+
"fi"
|
11
|
+
end
|
12
|
+
|
13
|
+
##
|
14
|
+
# Will create the database if it doesn't exist yet.
|
15
|
+
# Migrates the database.
|
16
|
+
post "Migrate Database (Active Record)" do
|
17
|
+
run "rake db:create"
|
18
|
+
run "rake db:migrate"
|
19
|
+
end
|