codebase 3.2.1 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/cb +1 -1
- data/bin/codebase +1 -1
- data/lib/codebase.rb +108 -27
- data/lib/codebase/command.rb +23 -20
- data/lib/commands/branches.rb +28 -0
- data/lib/commands/clone.rb +66 -0
- data/lib/commands/keys.rb +30 -0
- data/lib/commands/setup.rb +66 -0
- metadata +17 -8
- data/lib/codebase/commands/branches.rb +0 -27
- data/lib/codebase/commands/clone.rb +0 -65
- data/lib/codebase/commands/keys.rb +0 -36
- data/lib/codebase/commands/setup.rb +0 -88
- data/lib/codebase/recipes.rb +0 -76
data/bin/cb
CHANGED
data/bin/codebase
CHANGED
data/lib/codebase.rb
CHANGED
@@ -2,48 +2,129 @@ $:.unshift File.dirname(__FILE__)
|
|
2
2
|
|
3
3
|
require 'rubygems'
|
4
4
|
require 'json'
|
5
|
-
require 'highline/import'
|
6
|
-
HighLine.track_eof = false
|
7
5
|
|
8
6
|
require 'codebase/command'
|
9
7
|
|
10
8
|
trap("INT") { puts; exit }
|
11
9
|
|
12
10
|
module Codebase
|
13
|
-
|
11
|
+
extend self
|
14
12
|
|
15
13
|
class Error < RuntimeError; end
|
16
14
|
class NotConfiguredError < StandardError; end
|
17
15
|
class MustBeInRepositoryError < StandardError; end
|
18
16
|
|
19
|
-
|
20
|
-
|
21
|
-
def run(args)
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
if command.
|
27
|
-
command
|
28
|
-
|
29
|
-
$stderr.puts "Command Not Found - please check http://docs.codebasehq.com/gem for documentation."
|
17
|
+
VERSION = "4.0.0"
|
18
|
+
|
19
|
+
def run(command, args = [])
|
20
|
+
load_commands
|
21
|
+
command = 'help' if command.nil?
|
22
|
+
if @commands[command]
|
23
|
+
options = parse_options(args)
|
24
|
+
if args.size < @commands[command][:required_args].to_i
|
25
|
+
puts "error: #{@commands[command][:usage]}"
|
26
|
+
puts "See 'cb help #{command}' for usage."
|
30
27
|
Process.exit(1)
|
31
28
|
end
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
Process.exit(1)
|
36
|
-
rescue Codebase::NotConfiguredError
|
37
|
-
puts "[Error] You have not configured the Codebase gem yet. Run 'cb setup' to run the setup tool."
|
38
|
-
Process.exit(1)
|
39
|
-
rescue Codebase::MustBeInRepositoryError
|
40
|
-
puts "[Error] You must be inside a Codebase repository to run this command."
|
41
|
-
Process.exit(1)
|
42
|
-
rescue Codebase::Error => e
|
43
|
-
$stderr.puts e.message
|
44
|
-
Process.exit(1)
|
29
|
+
@commands[command][:block].call(options, *args)
|
30
|
+
else
|
31
|
+
puts "Command not found. Check 'cb help' for full information."
|
45
32
|
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def command(command, options = {}, &block)
|
36
|
+
@commands = Hash.new if @commands.nil?
|
37
|
+
@commands[command] = Hash.new
|
38
|
+
@commands[command][:description] = @next_description
|
39
|
+
@commands[command][:usage] = @next_usage
|
40
|
+
@commands[command][:flags] = @next_flags
|
41
|
+
@commands[command][:required_args] = (options[:required_args] || 0)
|
42
|
+
@commands[command][:block] = Command.new(block)
|
43
|
+
@next_usage, @next_description, @next_flags = nil, nil, nil
|
44
|
+
end
|
45
|
+
|
46
|
+
def commands
|
47
|
+
@commands
|
48
|
+
end
|
49
|
+
|
50
|
+
def desc(value)
|
51
|
+
@next_description = Array.new if @next_description.nil?
|
52
|
+
@next_description << value
|
53
|
+
end
|
54
|
+
|
55
|
+
def usage(value)
|
56
|
+
@next_usage = value
|
57
|
+
end
|
58
|
+
|
59
|
+
def flags(key, value)
|
60
|
+
@next_flags = Hash.new if @next_flags.nil?
|
61
|
+
@next_flags[key] = value
|
62
|
+
end
|
63
|
+
|
64
|
+
def load_commands
|
65
|
+
Dir[File.join(File.dirname(__FILE__), 'commands', '*.rb')].each do |path|
|
66
|
+
Codebase.module_eval File.read(path), path
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def parse_options(args)
|
71
|
+
idx = 0
|
72
|
+
args.clone.inject({}) do |memo, arg|
|
73
|
+
case arg
|
74
|
+
when /^--(.+?)=(.*)/
|
75
|
+
args.delete_at(idx)
|
76
|
+
memo.merge($1.to_sym => $2)
|
77
|
+
when /^--(.+)/
|
78
|
+
args.delete_at(idx)
|
79
|
+
memo.merge($1.to_sym => true)
|
80
|
+
when "--"
|
81
|
+
args.delete_at(idx)
|
82
|
+
return memo
|
83
|
+
else
|
84
|
+
idx += 1
|
85
|
+
memo
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
46
91
|
|
92
|
+
Codebase.desc "Displays this help message"
|
93
|
+
Codebase.usage "cb help [command]"
|
94
|
+
Codebase.command "help" do |command|
|
95
|
+
if command.nil?
|
96
|
+
puts "The Codebase Gem allows you to easily access your Codebase account functions from the"
|
97
|
+
puts "command line. The functions below outline the options which are currently available."
|
98
|
+
puts
|
99
|
+
for key, command in Codebase.commands.sort_by{|k,v| k}
|
100
|
+
puts " #{key.ljust(15)} #{command[:description].first}"
|
101
|
+
end
|
102
|
+
puts
|
103
|
+
puts "For more information see http://docs.codebasehq.com/gem"
|
104
|
+
puts "See 'cb help [command]' for usage information."
|
105
|
+
else
|
106
|
+
if c = Codebase.commands[command]
|
107
|
+
puts c[:description]
|
108
|
+
if c[:usage]
|
109
|
+
puts
|
110
|
+
puts "Usage:"
|
111
|
+
puts " #{c[:usage]}"
|
112
|
+
end
|
113
|
+
if c[:flags]
|
114
|
+
puts
|
115
|
+
puts "Options:"
|
116
|
+
for key, value in c[:flags]
|
117
|
+
puts " #{key.ljust(15)} #{value}"
|
118
|
+
end
|
119
|
+
end
|
120
|
+
else
|
121
|
+
puts "Command Not Found. Check 'point help' for a full list of commands available to you."
|
122
|
+
end
|
47
123
|
end
|
124
|
+
end
|
48
125
|
|
126
|
+
Codebase.desc "Displays the current version number"
|
127
|
+
Codebase.usage "cb version"
|
128
|
+
Codebase.command "version" do
|
129
|
+
puts "Codebase Gem Version #{Codebase::VERSION}"
|
49
130
|
end
|
data/lib/codebase/command.rb
CHANGED
@@ -1,28 +1,31 @@
|
|
1
|
-
require 'codebase/commands/setup'
|
2
|
-
require 'codebase/commands/clone'
|
3
|
-
require 'codebase/commands/branches'
|
4
|
-
require 'codebase/commands/keys'
|
5
|
-
|
6
1
|
module Codebase
|
7
2
|
class Command
|
8
3
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
include Codebase::Commands::Keys
|
4
|
+
def initialize(block)
|
5
|
+
(class << self;self end).send :define_method, :command, &block
|
6
|
+
end
|
13
7
|
|
14
|
-
def
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
else
|
20
|
-
puts "-> Not configured yet. Run 'cb setup' to configure your local computer."
|
21
|
-
end
|
8
|
+
def call(options, *args)
|
9
|
+
@options = options
|
10
|
+
arity = method(:command).arity
|
11
|
+
args << nil while args.size < arity
|
12
|
+
send :command, *args
|
22
13
|
end
|
23
14
|
|
24
|
-
|
15
|
+
def use_hirb
|
16
|
+
begin
|
17
|
+
require 'hirb'
|
18
|
+
extend Hirb::Console
|
19
|
+
rescue LoadError
|
20
|
+
puts "Hirb is not installed. Install hirb using '[sudo] gem install hirb' to get cool ASCII tables"
|
21
|
+
Process.exit(1)
|
22
|
+
end
|
23
|
+
end
|
25
24
|
|
25
|
+
def options
|
26
|
+
@options || Hash.new
|
27
|
+
end
|
28
|
+
|
26
29
|
def configured?
|
27
30
|
domain && username && apikey
|
28
31
|
end
|
@@ -118,6 +121,6 @@ module Codebase
|
|
118
121
|
def api(path, data = nil)
|
119
122
|
api_request("http://#{domain}/#{path}", git_config_variable(:username), git_config_variable(:apikey), data)
|
120
123
|
end
|
121
|
-
|
124
|
+
|
122
125
|
end
|
123
|
-
end
|
126
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
desc "Create a new branch locally and on the remote"
|
2
|
+
usage "cb mkbranch [new_branch_name] (source_branch)"
|
3
|
+
flags "--origin", "The origin to use when pushing to remote"
|
4
|
+
command "mkbranch", :required_args => 1 do |branch_name, source_branch|
|
5
|
+
source_branch = "master" if source_branch.nil?
|
6
|
+
remote_origin = "origin" if @options[:origin].nil?
|
7
|
+
commands = []
|
8
|
+
commands << "git push origin #{source_branch}:refs/heads/#{branch_name}"
|
9
|
+
commands << "git fetch origin"
|
10
|
+
commands << "git branch --track #{branch_name} origin/#{branch_name}"
|
11
|
+
commands << "git checkout #{branch_name}"
|
12
|
+
execute_commands(commands)
|
13
|
+
end
|
14
|
+
|
15
|
+
desc "Remove a branch from the remote service and remove it locally if it exists."
|
16
|
+
usage "cb rmbranch [branch_name]"
|
17
|
+
command "rmbranch", :required_args => 1 do |branch_name|
|
18
|
+
commands = []
|
19
|
+
commands << "git push origin :#{branch_name}"
|
20
|
+
unless `git for-each-ref refs/heads/#{branch_name}`.empty?
|
21
|
+
current_branch = `git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'`.chomp.split(/\s+/).last
|
22
|
+
if branch_name == current_branch
|
23
|
+
commands << "git checkout master" ## assume master...
|
24
|
+
end
|
25
|
+
commands << "git branch -d #{branch_name}"
|
26
|
+
end
|
27
|
+
execute_commands(commands)
|
28
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
desc "Clone a repository."
|
2
|
+
desc "The application will ask you to choose a project & repository before cloning the repository to your clone computer."
|
3
|
+
usage "cb clone"
|
4
|
+
flags "--path", "The path to export your repository to (optional)"
|
5
|
+
command "clone" do
|
6
|
+
require 'rubygems'
|
7
|
+
require 'json'
|
8
|
+
require 'highline/import'
|
9
|
+
HighLine.track_eof = false
|
10
|
+
|
11
|
+
raise Codebase::NotConfiguredError unless configured?
|
12
|
+
|
13
|
+
projects = JSON.parse(api('projects'))
|
14
|
+
projects = projects.select{|p| p["project"]["status"].first == 'active'}.map{|p| p['project']}
|
15
|
+
|
16
|
+
## Please somebody tell me there is a better way to do this using highline...
|
17
|
+
project_hash = {}
|
18
|
+
project_id = choose do |menu|
|
19
|
+
menu.select_by = :index
|
20
|
+
menu.prompt = "Please select a project: "
|
21
|
+
count = 0
|
22
|
+
for project in projects
|
23
|
+
project_hash[project['name']] = project['permalink']
|
24
|
+
menu.choice(project['name'])
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
project = project_hash[project_id]
|
29
|
+
|
30
|
+
repositories = JSON.parse(api("#{project}/repositories"))
|
31
|
+
repositories = repositories.map{|r| r['repository']}
|
32
|
+
|
33
|
+
repos_hash = {}
|
34
|
+
repo_id = choose do |menu|
|
35
|
+
menu.select_by = :index
|
36
|
+
menu.prompt = "Please select a repository:"
|
37
|
+
for repository in repositories
|
38
|
+
repos_hash[repository['name']] = repository
|
39
|
+
menu.choice(repository['name'])
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
repository = repos_hash[repo_id]['permalink']
|
44
|
+
clone_url = repos_hash[repo_id]['clone_url']
|
45
|
+
scm = repos_hash[repo_id]['scm']
|
46
|
+
|
47
|
+
if @options[:path]
|
48
|
+
export_path = @options[:path]
|
49
|
+
else
|
50
|
+
export_path = File.join(project, repository)
|
51
|
+
folder = ask("Where would you like to clone this repository to? (default: #{export_path})")
|
52
|
+
unless folder.nil? || folder.empty?
|
53
|
+
export_path = folder
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
system("mkdir -p #{export_path}")
|
58
|
+
|
59
|
+
case scm
|
60
|
+
when 'git' then exec("git clone #{clone_url} #{export_path}")
|
61
|
+
when 'hg' then exec("hg clone ssh://#{clone_url} #{export_path}")
|
62
|
+
when 'svn' then exec("svn checkout #{clone_url} #{export_path}")
|
63
|
+
else
|
64
|
+
puts "Unsupported SCM."
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
desc "View a list of all keys assigned to your user account. All keys are displayed in a table."
|
2
|
+
usage "cb keys"
|
3
|
+
command "keys" do
|
4
|
+
require 'rubygems'
|
5
|
+
use_hirb
|
6
|
+
|
7
|
+
keys = api("users/#{username}/public_keys")
|
8
|
+
keys = JSON.parse(keys).map{|k| k['public_key_join']}
|
9
|
+
keys = keys.map{|k| {:description => k['description'], :key => k['key'][0, 50] + '...' }}
|
10
|
+
table keys, :fields => [:description, :key], :headers => {:description => 'Description', :key => 'Key'}
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "Add a new key to your Codebase user account. "
|
14
|
+
desc "By default, it will use the key located in '~/.ssh/id_rsa.pub' otherwise it'll use the key you specify."
|
15
|
+
flags "--description", "Description to use when uploading the key. Defaults to 'Key'"
|
16
|
+
usage "cb keys:add (path/to/key)"
|
17
|
+
command "keys:add" do |path|
|
18
|
+
path = File.expand_path(".ssh/id_rsa.pub", "~") if path.nil?
|
19
|
+
unless File.exist?(path)
|
20
|
+
puts "Key file not found at '#{path}'"
|
21
|
+
Process.exit(1)
|
22
|
+
end
|
23
|
+
|
24
|
+
data = {'public_key' => {'description' => (options[:description] || "Key"), 'key' => File.read(path)}}.to_json
|
25
|
+
if api("users/#{username}/public_keys", data)
|
26
|
+
puts "Successfully added key."
|
27
|
+
else
|
28
|
+
puts "An error occured while adding your key."
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
desc "Setup the Codebase gem for your user account"
|
2
|
+
desc "This tool will automatically prompt you for your login details and then download your"
|
3
|
+
desc "details (including API key) and configure your local computer to use them."
|
4
|
+
usage "cb setup"
|
5
|
+
command "setup" do
|
6
|
+
|
7
|
+
require 'highline/import'
|
8
|
+
|
9
|
+
## We need git...
|
10
|
+
unless `which git` && $?.success?
|
11
|
+
puts "To use the Codebase gem you must have Git installed on your local computer. Git is used to store"
|
12
|
+
puts "important configuration variables which allow the gem to function."
|
13
|
+
Process.exit(1)
|
14
|
+
end
|
15
|
+
|
16
|
+
puts "\e[33;44mWelcome to the CodebaseHQ Initial Setup Tool\e[0m"
|
17
|
+
puts "This tool will get your local computer configured to use your codebase account. It will automatically configure"
|
18
|
+
puts "the gem for API access so you can use many of the gem functions."
|
19
|
+
puts
|
20
|
+
|
21
|
+
## Are you in a repository?
|
22
|
+
global = '--global'
|
23
|
+
if in_repository?
|
24
|
+
puts "You are currently in a repository directory."
|
25
|
+
if agree("Would you like to only apply configuration to actions carried out from within this directory?")
|
26
|
+
global = ''
|
27
|
+
puts "OK, we'll add your API details to this repository only."
|
28
|
+
else
|
29
|
+
puts "OK, we'll configure your API details for your whole user account."
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
## Is this configured?
|
34
|
+
if configured? && !global.empty?
|
35
|
+
puts
|
36
|
+
puts "This system is already configured as \e[32m#{username}\e[0m."
|
37
|
+
unless agree("Do you wish to continue?")
|
38
|
+
Process.exit(0)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
puts
|
43
|
+
|
44
|
+
## Get some details
|
45
|
+
domain = ask("CodebaseHQ domain (e.g. widgetinc.codebasehq.com): ") { |q| q.validate = /\A(\w+).(codebasehq|cbhqdev).(com|local)\z/ }
|
46
|
+
username = ask("Username: ") { |q| q.validate = /[\w\.]+/ }
|
47
|
+
password = ask("Password: ") { |q| q.echo = false }
|
48
|
+
|
49
|
+
## Get the API key and save it...
|
50
|
+
user_properties = api_request("https://#{domain}/profile", username, password)
|
51
|
+
|
52
|
+
if user_properties
|
53
|
+
user = JSON.parse(user_properties)["user"]
|
54
|
+
system("git config #{global} codebase.username #{username}")
|
55
|
+
system("git config #{global} codebase.apikey #{user['api_key']}")
|
56
|
+
system("git config #{global} codebase.domain #{domain}")
|
57
|
+
system("git config #{global} user.name '#{user['first_name']} #{user['last_name']}'")
|
58
|
+
puts "Set user.name to '#{user['first_name']} #{user['last_name']}'"
|
59
|
+
system("git config #{global} user.email #{user['email_address']}")
|
60
|
+
puts "Set user.email to '#{user['email_address']}'"
|
61
|
+
puts "\e[32mConfigured Codebase API authentication properties successfully.\e[0m"
|
62
|
+
else
|
63
|
+
puts "\e[37;41mAccess Denied. Please ensure you have entered your username & password correctly and try again.\e[0m"
|
64
|
+
return
|
65
|
+
end
|
66
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: codebase
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Cooke
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-10-
|
12
|
+
date: 2009-10-28 00:00:00 +00:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -32,6 +32,16 @@ dependencies:
|
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 1.1.5
|
34
34
|
version:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: hirb
|
37
|
+
type: :runtime
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 0.2.7
|
44
|
+
version:
|
35
45
|
description:
|
36
46
|
email: adam@atechmedia.com
|
37
47
|
executables:
|
@@ -45,12 +55,11 @@ files:
|
|
45
55
|
- bin/cb
|
46
56
|
- bin/codebase
|
47
57
|
- lib/codebase/command.rb
|
48
|
-
- lib/codebase/commands/branches.rb
|
49
|
-
- lib/codebase/commands/clone.rb
|
50
|
-
- lib/codebase/commands/keys.rb
|
51
|
-
- lib/codebase/commands/setup.rb
|
52
|
-
- lib/codebase/recipes.rb
|
53
58
|
- lib/codebase.rb
|
59
|
+
- lib/commands/branches.rb
|
60
|
+
- lib/commands/clone.rb
|
61
|
+
- lib/commands/keys.rb
|
62
|
+
- lib/commands/setup.rb
|
54
63
|
has_rdoc: true
|
55
64
|
homepage: http://www.codebasehq.com
|
56
65
|
licenses: []
|
@@ -78,6 +87,6 @@ rubyforge_project:
|
|
78
87
|
rubygems_version: 1.3.5
|
79
88
|
signing_key:
|
80
89
|
specification_version: 3
|
81
|
-
summary:
|
90
|
+
summary: Gem companion for your Codebase account. Including interactive cloning, key management and more
|
82
91
|
test_files: []
|
83
92
|
|
@@ -1,27 +0,0 @@
|
|
1
|
-
module Codebase
|
2
|
-
module Commands
|
3
|
-
module Branches
|
4
|
-
|
5
|
-
## =========================================================================================================
|
6
|
-
## Remote Branch Management
|
7
|
-
## =========================================================================================================
|
8
|
-
|
9
|
-
def mkbranch(branch_name, source_branch = 'master')
|
10
|
-
commands = []
|
11
|
-
commands << "git push origin #{source_branch}:refs/heads/#{branch_name}"
|
12
|
-
commands << "git fetch origin"
|
13
|
-
commands << "git branch --track #{branch_name} origin/#{branch_name}"
|
14
|
-
commands << "git checkout #{branch_name}"
|
15
|
-
execute_commands(commands)
|
16
|
-
end
|
17
|
-
|
18
|
-
def rmbranch(branch_name)
|
19
|
-
commands = []
|
20
|
-
commands << "git push origin :#{branch_name}"
|
21
|
-
commands << "git branch -d #{branch_name}"
|
22
|
-
execute_commands(commands)
|
23
|
-
end
|
24
|
-
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,65 +0,0 @@
|
|
1
|
-
module Codebase
|
2
|
-
module Commands
|
3
|
-
module Clone
|
4
|
-
|
5
|
-
## =========================================================================================================
|
6
|
-
## Interactive Clone
|
7
|
-
## =========================================================================================================
|
8
|
-
|
9
|
-
def clone
|
10
|
-
raise Codebase::NotConfiguredError unless configured?
|
11
|
-
|
12
|
-
projects = JSON.parse(api('projects'))
|
13
|
-
projects = projects.select{|p| p["project"]["status"].first == 'active'}.map{|p| p['project']}
|
14
|
-
|
15
|
-
## Please somebody tell me there is a better way to do this using highline...
|
16
|
-
project_hash = {}
|
17
|
-
project_id = choose do |menu|
|
18
|
-
menu.select_by = :index
|
19
|
-
menu.prompt = "Please select a project: "
|
20
|
-
count = 0
|
21
|
-
for project in projects
|
22
|
-
project_hash[project['name']] = project['permalink']
|
23
|
-
menu.choice(project['name'])
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
project = project_hash[project_id]
|
28
|
-
|
29
|
-
repositories = JSON.parse(api("#{project}/repositories"))
|
30
|
-
repositories = repositories.map{|r| r['repository']}
|
31
|
-
|
32
|
-
repos_hash = {}
|
33
|
-
repo_id = choose do |menu|
|
34
|
-
menu.select_by = :index
|
35
|
-
menu.prompt = "Please select a repository:"
|
36
|
-
for repository in repositories
|
37
|
-
repos_hash[repository['name']] = repository
|
38
|
-
menu.choice(repository['name'])
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
repository = repos_hash[repo_id]['permalink']
|
43
|
-
clone_url = repos_hash[repo_id]['clone_url']
|
44
|
-
scm = repos_hash[repo_id]['scm']
|
45
|
-
|
46
|
-
export_path = File.join(project, repository)
|
47
|
-
folder = ask("Where would you like to clone this repository to? (default: #{export_path})")
|
48
|
-
unless folder.nil? || folder.empty?
|
49
|
-
export_path = folder
|
50
|
-
end
|
51
|
-
|
52
|
-
system("mkdir -p #{export_path}")
|
53
|
-
|
54
|
-
case scm
|
55
|
-
when 'git' then exec("git clone #{clone_url} #{export_path}")
|
56
|
-
when 'hg' then exec("hg clone ssh://#{clone_url} #{export_path}")
|
57
|
-
when 'svn' then exec("svn checkout #{clone_url} #{export_path}")
|
58
|
-
else
|
59
|
-
puts "Unsupported SCM."
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
@@ -1,36 +0,0 @@
|
|
1
|
-
module Codebase
|
2
|
-
module Commands
|
3
|
-
module Keys
|
4
|
-
|
5
|
-
## =========================================================================================================
|
6
|
-
## Keys
|
7
|
-
## =========================================================================================================
|
8
|
-
|
9
|
-
require 'hirb'
|
10
|
-
include Hirb::Console
|
11
|
-
|
12
|
-
def keys
|
13
|
-
keys = api("users/#{username}/public_keys")
|
14
|
-
keys = JSON.parse(keys).map{|k| k['public_key_join']}
|
15
|
-
keys = keys.map{|k| {:description => k['description'], :key => k['key'][0, 50] + '...' }}
|
16
|
-
table keys, :fields => [:description, :key], :headers => {:description => 'Description', :key => 'Key'}
|
17
|
-
end
|
18
|
-
|
19
|
-
def add_key(path = nil)
|
20
|
-
path = File.expand_path(".ssh/id_rsa.pub", "~") if path.nil?
|
21
|
-
unless File.exist?(path)
|
22
|
-
puts "Key file not found at '#{path}'"
|
23
|
-
Process.exit(1)
|
24
|
-
end
|
25
|
-
|
26
|
-
data = {'public_key' => {'description' => "Key", 'key' => File.read(path)}}.to_json
|
27
|
-
if api("users/#{username}/public_keys", data)
|
28
|
-
puts "Successfully added key."
|
29
|
-
else
|
30
|
-
puts "An error occured while adding your key."
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
@@ -1,88 +0,0 @@
|
|
1
|
-
module Codebase
|
2
|
-
module Commands
|
3
|
-
module Setup
|
4
|
-
|
5
|
-
## =========================================================================================================
|
6
|
-
## API Setup Tools
|
7
|
-
## =========================================================================================================
|
8
|
-
|
9
|
-
def setup
|
10
|
-
|
11
|
-
## We need git...
|
12
|
-
unless `which git` && $?.success?
|
13
|
-
puts "To use the Codebase gem you must have Git installed on your local computer. Git is used to store"
|
14
|
-
puts "important configuration variables which allow the gem to function."
|
15
|
-
Process.exit(1)
|
16
|
-
end
|
17
|
-
|
18
|
-
puts "\e[33;44mWelcome to the CodebaseHQ Initial Setup Tool\e[0m"
|
19
|
-
puts "This tool will get your local computer configured to use your codebase account. It will automatically configure"
|
20
|
-
puts "the gem for API access so you can use many of the gem functions."
|
21
|
-
puts
|
22
|
-
|
23
|
-
## Are you in a repository?
|
24
|
-
global = '--global'
|
25
|
-
if in_repository?
|
26
|
-
puts "You are currently in a repository directory."
|
27
|
-
if agree("Would you like to only apply configuration to actions carried out from within this directory?")
|
28
|
-
global = ''
|
29
|
-
puts "OK, we'll add your API details to this repository only."
|
30
|
-
else
|
31
|
-
puts "OK, we'll configure your API details for your whole user account."
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
## Is this configured?
|
36
|
-
if configured? && !global.empty?
|
37
|
-
puts
|
38
|
-
puts "This system is already configured as \e[32m#{username}\e[0m."
|
39
|
-
unless agree("Do you wish to continue?")
|
40
|
-
Process.exit(0)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
puts
|
45
|
-
|
46
|
-
## Get some details
|
47
|
-
domain = ask_with_validation("CodebaseHQ domain (e.g. widgetinc.codebasehq.com): ", /\A(\w+).(codebasehq|cbhqdev).(com|local)\z/)
|
48
|
-
username = ask_with_validation("Username: ", /[\w\.]+/)
|
49
|
-
password = ask("Password: ") { |q| q.echo = false }
|
50
|
-
|
51
|
-
## Get the API key and save it...
|
52
|
-
user_properties = api_request("https://#{domain}/profile", username, password)
|
53
|
-
|
54
|
-
if user_properties
|
55
|
-
user = JSON.parse(user_properties)["user"]
|
56
|
-
system("git config #{global} codebase.username #{username}")
|
57
|
-
system("git config #{global} codebase.apikey #{user['api_key']}")
|
58
|
-
system("git config #{global} codebase.domain #{domain}")
|
59
|
-
system("git config #{global} user.name '#{user['first_name']} #{user['last_name']}'")
|
60
|
-
puts "Set user.name to '#{user['first_name']} #{user['last_name']}'"
|
61
|
-
system("git config #{global} user.email #{user['email_address']}")
|
62
|
-
puts "Set user.email to '#{user['email_address']}'"
|
63
|
-
puts "\e[32mConfigured Codebase API authentication properties successfully.\e[0m"
|
64
|
-
else
|
65
|
-
puts "\e[37;41mAccess Denied. Please ensure you have entered your username & password correctly and try again.\e[0m"
|
66
|
-
return
|
67
|
-
end
|
68
|
-
|
69
|
-
end
|
70
|
-
|
71
|
-
def unsetup
|
72
|
-
['', '--global'].each do |type|
|
73
|
-
system("git config #{type} --unset codebase.username")
|
74
|
-
system("git config #{type} --unset codebase.apikey")
|
75
|
-
system("git config #{type} --unset codebase.domain")
|
76
|
-
end
|
77
|
-
puts "System has been unsetup. API details have been removed from your configuration."
|
78
|
-
end
|
79
|
-
|
80
|
-
private
|
81
|
-
|
82
|
-
def ask_with_validation(question, regex)
|
83
|
-
ask(question) { |q| q.validate = regex }
|
84
|
-
end
|
85
|
-
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
data/lib/codebase/recipes.rb
DELETED
@@ -1,76 +0,0 @@
|
|
1
|
-
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
-
|
3
|
-
after "deploy:symlink", :add_deployment_to_codebase
|
4
|
-
|
5
|
-
task :add_deployment_to_codebase do
|
6
|
-
|
7
|
-
username = `git config codebase.username`.chomp.strip
|
8
|
-
api_key = `git config codebase.apikey`.chomp.strip
|
9
|
-
|
10
|
-
regex = /git\@(gitbase|codebasehq)\.com:(.*)\/(.*)\/(.*)\.git/
|
11
|
-
unless m = repository.match(regex)
|
12
|
-
puts " * \e[31mYour repository URL does not a match a valid CodebaseHQ Clone URL\e[0m"
|
13
|
-
else
|
14
|
-
url = "#{m[2]}.codebasehq.com"
|
15
|
-
project = m[3]
|
16
|
-
repository = m[4]
|
17
|
-
|
18
|
-
puts " * \e[44;33mAdding Deployment to your CodebaseHQ account\e[0m"
|
19
|
-
puts " - Account......: #{url}"
|
20
|
-
puts " - Username.....: #{username}"
|
21
|
-
puts " - API Key......: #{api_key[0,10]}..."
|
22
|
-
|
23
|
-
puts " - Project......: #{project}"
|
24
|
-
puts " - Repository...: #{repository}"
|
25
|
-
|
26
|
-
|
27
|
-
environment_to_send = begin
|
28
|
-
env = (self.environment rescue self.rails_env).dup
|
29
|
-
env.gsub!(/\W+/, ' ')
|
30
|
-
env.strip!
|
31
|
-
env.downcase!
|
32
|
-
env.gsub!(/\ +/, '-')
|
33
|
-
|
34
|
-
puts " - Environment..: #{env}" unless env.blank?
|
35
|
-
|
36
|
-
env
|
37
|
-
rescue
|
38
|
-
''
|
39
|
-
end
|
40
|
-
|
41
|
-
servers = roles.values.collect{|r| r.servers}.flatten.collect{|s| s.host}.uniq.join(', ') rescue ''
|
42
|
-
|
43
|
-
puts " - Servers......: #{servers}"
|
44
|
-
puts " - Revision.....: #{real_revision}"
|
45
|
-
puts " - Branch.......: #{branch}"
|
46
|
-
|
47
|
-
xml = []
|
48
|
-
xml << "<deployment>"
|
49
|
-
xml << "<servers>#{servers}</servers>"
|
50
|
-
xml << "<revision>#{real_revision}</revision>"
|
51
|
-
xml << "<environment>#{environment_to_send}</environment>"
|
52
|
-
xml << "<branch>#{branch}</branch>"
|
53
|
-
xml << "</deployment>"
|
54
|
-
|
55
|
-
require 'net/http'
|
56
|
-
require 'uri'
|
57
|
-
|
58
|
-
real_url = "http://#{url}/#{project}/#{repository}/deployments"
|
59
|
-
puts " - URL..........: #{real_url}"
|
60
|
-
|
61
|
-
url = URI.parse(real_url)
|
62
|
-
|
63
|
-
req = Net::HTTP::Post.new(url.path)
|
64
|
-
req.basic_auth(username, api_key)
|
65
|
-
req.add_field('Content-type', 'application/xml')
|
66
|
-
req.add_field('Accept', 'application/xml')
|
67
|
-
res = Net::HTTP.new(url.host, url.port).start { |http| http.request(req, xml.join) }
|
68
|
-
case res
|
69
|
-
when Net::HTTPCreated then puts " * \e[32mAdded deployment to Codebase\e[0m"
|
70
|
-
else
|
71
|
-
puts " * \e[31mSorry, your deployment was not logged in Codebase - please check your config above.\e[0m"
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
end
|
76
|
-
end
|