codebase 3.0.9 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,8 +1,7 @@
1
1
  $:.unshift File.dirname(__FILE__)
2
2
 
3
- require 'codebase_helpers/command_base'
4
- require 'codebase_helpers/command'
5
- require 'codebase_helpers/directory'
3
+ require 'codebase/command'
4
+ require 'codebase/directory'
6
5
 
7
6
  module Codebase
8
7
 
@@ -18,8 +17,10 @@ module Codebase
18
17
  if command.respond_to?(method)
19
18
  command.send(method, *args)
20
19
  else
21
- $stderr.puts "Command Not Found - please check http://help.codebasehq.com for documentation."
20
+ $stderr.puts "Command Not Found - please check http://docs.codebasehq.com/gem for documentation."
22
21
  end
22
+ rescue ArgumentError
23
+ $stderr.puts "Invalid arguments provided to method. Check documentation."
23
24
  rescue Codebase::Error => e
24
25
  $stderr.puts e.message
25
26
  end
@@ -1,6 +1,14 @@
1
+ require 'codebase/commands/launchers'
2
+ require 'codebase/commands/branches'
3
+ require 'codebase/commands/setup'
4
+
1
5
  module Codebase
2
- class CommandBase
3
-
6
+ class Command
7
+
8
+ include Codebase::Commands::Launchers
9
+ include Codebase::Commands::Branches
10
+ include Codebase::Commands::Setup
11
+
4
12
  attr_reader :directory, :args
5
13
 
6
14
  def initialize(directory, args)
@@ -11,12 +19,12 @@ module Codebase
11
19
 
12
20
  def launch(*args)
13
21
  begin
14
- gem 'launchy'
22
+ require 'rubygems'
15
23
  require 'launchy'
16
24
  url = "http://#{directory.domain}/" + args.join('/').gsub(/\?\z/, "")
17
25
  Launchy::Browser.new.visit(url)
18
26
  rescue Gem::LoadError
19
- raise Codebase::Error, "Sorry, you need to install launchy to do that - give 'gem install launchy' a go."
27
+ raise Codebase::Error, "Sorry, you need to install launchy to do that - give '[sudo] gem install launchy' a go."
20
28
  end
21
29
  end
22
30
 
@@ -0,0 +1,27 @@
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
@@ -0,0 +1,70 @@
1
+ module Codebase
2
+ module Commands
3
+ module Launchers
4
+
5
+ ## =========================================================================================================
6
+ ## Launchers
7
+ ## =========================================================================================================
8
+
9
+ def default
10
+ if directory.repository?
11
+ launch directory.project
12
+ else
13
+ launch
14
+ end
15
+ end
16
+ alias_method :dashboard, :default
17
+
18
+ def messages
19
+ launch 'messages'
20
+ end
21
+ alias_method :me, :messages
22
+
23
+ def tickets
24
+ launch directory.project, 'tickets'
25
+ end
26
+ alias_method :ti, :tickets
27
+
28
+ def new_ticket
29
+ launch directory.project, 'tickets', 'new'
30
+ end
31
+ alias_method :nti, :new_ticket
32
+
33
+ def milestones
34
+ launch directory.project, 'milestones'
35
+ end
36
+ alias_method :mi, :milestones
37
+
38
+ def time
39
+ launch directory.project, 'time'
40
+ end
41
+ alias_method :tm, :time
42
+
43
+ def wiki
44
+ launch directory.project, 'wiki'
45
+ end
46
+ alias_method :wi, :wiki
47
+
48
+ def browser
49
+ launch directory.project, directory.repository, 'tree', directory.working_branch
50
+ end
51
+ alias_method :br, :browser
52
+
53
+ def commits
54
+ launch directory.project, directory.repository, 'commits', directory.working_branch
55
+ end
56
+ alias_method :co, :commits
57
+
58
+ def deployments
59
+ launch directory.project, directory.repository, 'deployments'
60
+ end
61
+ alias_method :de, :deployments
62
+
63
+ def tasks
64
+ launch directory.project, directory.repository, 'tasks', directory.working_branch
65
+ end
66
+ alias_method :ta, :tasks
67
+
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,122 @@
1
+ module Codebase
2
+ module Commands
3
+ module Setup
4
+
5
+ require 'rubygems'
6
+ require 'highline/import'
7
+
8
+ def setup
9
+ puts "\e[33;44mWelcome to the CodebaseHQ Initial Setup Tool\e[0m"
10
+ puts "This tool will get your local computer configured to use your codebase account. It will automatically configure"
11
+ puts "the gem for API access as well as uploading your public key file to your Codebase user account."
12
+ puts
13
+
14
+ ## Is this configured?
15
+ if u = git_config_variable(:username)
16
+ puts "This system is already configured as \e[32m#{u}\e[0m."
17
+ domain = git_config_variable(:domain)
18
+ username = u
19
+ api_key = git_config_variable(:apikey)
20
+
21
+ unless agree("Are you sure you wish to continue with uploading your public keys?")
22
+ puts "OK, no problem."
23
+ return
24
+ end
25
+ else
26
+ ## Get some details
27
+ domain = ask_with_validation("CodebaseHQ domain (e.g. widgetinc.codebasehq.com): ", /\A(\w+).(codebasehq|cbhqdev).(com|local)\z/)
28
+ username = ask_with_validation("Username: ", /[\w\.]+/)
29
+ password = ask_for_password('Password: ')
30
+
31
+ ## Get the API key and save it...
32
+ user_properties_xml = api_request("http://#{domain}/users/#{username}", username, password)
33
+ if user_properties_xml && user_properties_xml.match(/\<api-key\>(\w{40})\<\/api-key>/)
34
+ api_key = $1
35
+ system("git config --global codebase.username #{username}")
36
+ system("git config --global codebase.apikey #{api_key}")
37
+ system("git config --global codebase.domain #{domain}")
38
+ puts "\e[32mConfigured Codebase API authentication properties.\e[0m"
39
+ else
40
+ puts "\e[37;41mAccess Denied. Please ensure you have entered your username & password correctly and try again.\e[0m"
41
+ return
42
+ end
43
+ end
44
+
45
+ ## Send the user's public key to the server if they don't already have keys...
46
+ key_file = File.expand_path(File.join('~', '.ssh', 'id_rsa.pub'))
47
+ if File.exist?(key_file)
48
+ key = File.read(key_file)
49
+ description = "Key from #{machine_hostname}"
50
+ if api_request("http://#{domain}/users/#{username}/public_keys", username, api_key, "<public-key><description>#{description}</description><key>#{key}</key></public-key>")
51
+ puts "\e[32mPublic key from #{key_file} uploaded to your Codebase account on #{domain}.\e[0m"
52
+ else
53
+ puts "\e[37;41mWe couldn't upload your public key at this file. Please try later and verify your API key is correct.\e[0m"
54
+ end
55
+
56
+ else
57
+ puts "No key file found at #{key_file}. Nothing to upload to Codebase."
58
+ end
59
+
60
+ end
61
+
62
+ def unsetup
63
+ system("git config --global --unset codebase.username")
64
+ system("git config --global --unset codebase.apikey")
65
+ system("git config --global --unset codebase.domain")
66
+ puts "System has been unsetup. API details have been removed from your configuration."
67
+ end
68
+
69
+ private
70
+
71
+ def git_config_variable(name)
72
+ r = `git config --global codebase.#{name.to_s}`.chomp
73
+ r.empty? ? nil : r
74
+ end
75
+
76
+ def ask_with_validation(question, regex)
77
+ ask(question) { |q| q.validate = regex }
78
+ end
79
+
80
+ def ask_for_password(question)
81
+ system("stty -echo")
82
+ password = ask(question)
83
+ system("stty echo")
84
+ puts
85
+ password
86
+ end
87
+
88
+ def api_request(url, username, password, data = nil)
89
+ require 'uri'
90
+ require 'net/http'
91
+ require 'net/https'
92
+ uri = URI.parse(url)
93
+ if data
94
+ req = Net::HTTP::Post.new(uri.path)
95
+ else
96
+ req = Net::HTTP::Get.new(uri.path)
97
+ end
98
+
99
+ req.basic_auth(username, password)
100
+ req.add_field("Accept", "application/xml")
101
+ req.add_field("Content-type", "application/xml")
102
+ res = Net::HTTP.new(uri.host, uri.port)
103
+ res = res.request(req, data)
104
+ case res
105
+ when Net::HTTPSuccess
106
+ return res.body
107
+ else
108
+ puts res.body
109
+ return false
110
+ end
111
+ end
112
+
113
+ def machine_hostname
114
+ require 'socket'
115
+ Socket.gethostname
116
+ rescue
117
+ "local computer"
118
+ end
119
+
120
+ end
121
+ end
122
+ end
@@ -37,7 +37,7 @@ module Codebase
37
37
  end
38
38
 
39
39
  def path
40
- File.dirname(__FILE__)
40
+ File.expand_path(File.dirname(__FILE__))
41
41
  end
42
42
 
43
43
  private
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: 3.0.9
4
+ version: 3.1.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-09-26 00:00:00 +01:00
12
+ date: 2009-10-26 00:00:00 +00:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -25,11 +25,13 @@ extra_rdoc_files: []
25
25
  files:
26
26
  - bin/cb
27
27
  - bin/codebase
28
+ - lib/codebase/command.rb
29
+ - lib/codebase/commands/branches.rb
30
+ - lib/codebase/commands/launchers.rb
31
+ - lib/codebase/commands/setup.rb
32
+ - lib/codebase/directory.rb
28
33
  - lib/codebase/recipes.rb
29
34
  - lib/codebase.rb
30
- - lib/codebase_helpers/command.rb
31
- - lib/codebase_helpers/command_base.rb
32
- - lib/codebase_helpers/directory.rb
33
35
  has_rdoc: true
34
36
  homepage: http://www.codebasehq.com
35
37
  licenses: []
@@ -1,124 +0,0 @@
1
- module Codebase
2
- class Command < CommandBase
3
-
4
- ## =========================================================================================================
5
- ## Launchers
6
- ## =========================================================================================================
7
-
8
- def default
9
- if directory.repository?
10
- launch directory.project
11
- else
12
- launch
13
- end
14
- end
15
- alias_method :dashboard, :default
16
-
17
- def messages
18
- launch 'messages'
19
- end
20
- alias_method :me, :messages
21
-
22
- def tickets
23
- launch directory.project, 'tickets'
24
- end
25
- alias_method :ti, :tickets
26
-
27
- def new_ticket
28
- launch directory.project, 'tickets', 'new'
29
- end
30
- alias_method :nti, :new_ticket
31
-
32
- def milestones
33
- launch directory.project, 'milestones'
34
- end
35
- alias_method :mi, :milestones
36
-
37
- def time
38
- launch directory.project, 'time'
39
- end
40
- alias_method :tm, :time
41
-
42
- def wiki
43
- launch directory.project, 'wiki'
44
- end
45
- alias_method :wi, :wiki
46
-
47
- def browser
48
- launch directory.project, directory.repository, 'tree', directory.working_branch
49
- end
50
- alias_method :br, :browser
51
-
52
- def commits
53
- launch directory.project, directory.repository, 'commits', directory.working_branch
54
- end
55
- alias_method :co, :commits
56
-
57
- def deployments
58
- launch directory.project, directory.repository, 'deployments'
59
- end
60
- alias_method :de, :deployments
61
-
62
- def tasks
63
- launch directory.project, directory.repository, 'tasks', directory.working_branch
64
- end
65
- alias_method :ta, :tasks
66
-
67
- ## =========================================================================================================
68
- ## Remote Branch Management
69
- ## =========================================================================================================
70
-
71
- def mkbranch(branch_name, source_branch = 'master')
72
- commands = []
73
- commands << "git push origin #{source_branch}:refs/heads/#{branch_name}"
74
- commands << "git fetch origin"
75
- commands << "git branch --track #{branch_name} origin/#{branch_name}"
76
- commands << "git checkout #{branch_name}"
77
- execute_commands(commands)
78
- end
79
-
80
- def rmbranch(branch_name)
81
- commands = []
82
- commands << "git push origin :#{branch_name}"
83
- commands << "git branch -d #{branch_name}"
84
- execute_commands(commands)
85
- end
86
-
87
- ## =========================================================================================================
88
- ## Commit Logger
89
- ## =========================================================================================================
90
-
91
- def log(message)
92
- current = directory.send(:git, :config, 'codebase.log').split("\\n")
93
- current << message
94
- directory.send(:git, :config, 'codebase.log', "\"#{current.join("\n")}\"")
95
- end
96
-
97
- def showlog
98
- output = directory.send(:git, :config, 'codebase.log').split("\n").map{|line| " * #{line}\n"}
99
- if output.empty?
100
- $stderr.puts "There is nothing in the Codebase Log at the moment. Add something using 'cb log \"My Message Here\"'"
101
- Process.exit(1)
102
- else
103
- puts output
104
- end
105
- end
106
-
107
- def clearlog
108
- directory.send(:git, :config, '--unset', 'codebase.log')
109
- puts "Codebase log cleared."
110
- end
111
-
112
- def commit(message = '')
113
- output = directory.send(:git, :config, 'codebase.log').split("\n").map{|line| " * #{line}\n"}
114
- if output.empty? || message.nil? || message == ''
115
- $stderr.puts "You haven't added a message and/or added log entries. You may want to use a normal commit using 'git commit -m ...'"
116
- Process.exit(1)
117
- else
118
- system("git commit -m '#{message}\n\n#{output}'")
119
- clearlog
120
- end
121
- end
122
-
123
- end
124
- end