solutious-rudy 0.8.2 → 0.8.3

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/lib/rudy/scm/git.rb DELETED
@@ -1,217 +0,0 @@
1
-
2
- require 'date'
3
-
4
-
5
- module Rudy
6
- module SCM
7
- class GIT
8
- require 'grit'
9
- include Rudy::SCM::ObjectBase
10
- include Grit
11
-
12
- attr_accessor :base_uri
13
- attr_accessor :remote
14
- attr_accessor :branch
15
- attr_reader :repo
16
- attr_reader :rbox
17
- attr_reader :rtag
18
- attr_reader :user
19
- attr_reader :pkey
20
- attr_reader :changes
21
-
22
- # * +args+ a hash of params from the git block in the routines config
23
- #
24
- def initialize(args={})
25
- args = {
26
- :privatekey => nil,
27
- :remote => :origin,
28
- :branch => :master,
29
- :user => :root,
30
- :changes => :enforce,
31
- :path => nil
32
- }.merge(args)
33
- @remote, @branch, @path = args[:remote], args[:branch], args[:path]
34
- @user, @pkey, @changes = args[:user], args[:privatekey], args[:changes]
35
- @repo = Repo.new(Dir.pwd) if GIT.working_copy?
36
- end
37
-
38
- def engine; :git; end
39
-
40
- def liner_note
41
- "%-40s (git:%s:%s)" % [@rtag, @remote, @branch]
42
- end
43
-
44
- def create_release(username=nil, msg=nil)
45
- @rtag = find_next_rtag(username)
46
- msg ||= 'Another Release by Rudy!'
47
- msg.tr!("'", "''")
48
- ret = Rye.shell(:git, "tag", @rtag) # Use annotated? -a -m '#{msg}'
49
- raise ret.stderr.join($/) if ret.exit_code > 0
50
- ret = Rye.shell(:git, "push") if @remote
51
- raise ret.stderr.join($/) if ret.exit_code > 0
52
- ret = Rye.shell(:git, "push #{@remote} #{rtag}") if @remote
53
- raise ret.stderr.join($/) if ret.exit_code > 0
54
- @rtag
55
- end
56
-
57
- # rel-2009-03-05-user-rev
58
- def find_next_rtag(username=nil)
59
- now = Time.now
60
- mon = now.mon.to_s.rjust(2, '0')
61
- day = now.day.to_s.rjust(2, '0')
62
- rev = "01"
63
- criteria = ['rel', now.year, mon, day, rev]
64
- criteria.insert(-2, username) if username
65
- rev.succ! while valid_rtag?(criteria.join(Rudy::DELIM)) && rev.to_i < 50
66
- raise TooManyTags if rev.to_i >= 50
67
- criteria.join(Rudy::DELIM)
68
- end
69
-
70
- def delete_rtag(rtag=nil)
71
- rtag ||= @rtag
72
- ret = trap_rbox_errors { Rye.shell(:git, 'tag', :d, rtag) }
73
- raise ret.stderr.join($/) if ret.exit_code > 0 # TODO: retest
74
- # Equivalent to: "git push origin :tag-name" which deletes a remote tag
75
- ret = trap_rbox_errors { Rye.shell(:git, "push #{@remote} :#{rtag}") } if @remote
76
- raise ret.stderr.join($/) if ret.exit_code > 0
77
- true
78
- end
79
-
80
- def create_remote_checkout(rbox)
81
-
82
- # Make sure the directory above the clone path exists
83
- # and that it's owned by the request user.
84
- rbox.mkdir(:p, File.dirname(@path))
85
- rbox.chown(@user, File.dirname(@path))
86
-
87
- begin
88
- original_user = rbox.user
89
- rbox.switch_user(@user)
90
-
91
- if @pkey
92
- # Try when debugging: ssh -vi path/2/pkey git@github.com
93
- key = File.basename(@pkey)
94
- homedir = rbox.getenv['HOME']
95
- rbox.mkdir(:p, :m, '700', '.ssh') rescue nil # :p says keep quiet if it exists
96
- if rbox.file_exists?(".ssh/#{key}")
97
- puts " Remote private key #{key} already exists".colour(:red)
98
- else
99
- rbox.upload(@pkey, ".ssh/#{key}")
100
- end
101
-
102
- ## NOTE: The following are two attempts at telling git which
103
- ## private key to use. Both fail. The only thing I could get
104
- ## to work is modifying the ~/.ssh/config file.
105
- ##
106
- ## This runs fine, but "git clone" doesn't care.
107
- ## git config --global --replace-all http.sslKey /home/delano/.ssh/id_rsa
108
- ## rbox.git('config', '--global', '--replace-all', 'http.sslKey', "#{homedir}/.ssh/#{key}")
109
- ##
110
- ## "git clone" doesn't care about this either. Note that both these
111
- ## config attempts come directly from the git-config man page:
112
- ## http://www.kernel.org/pub/software/scm/git/docs/git-config.html
113
- ## export GIT_SSL_KEY=/home/delano/.ssh/id_rsa
114
- ## rbox.setenv("GIT_SSL_KEY", "#{homedir}/.ssh/#{key}")
115
-
116
- if rbox.file_exists?('.ssh/config')
117
- rbox.cp('.ssh/config', ".ssh/config-previous")
118
- ssh_config = rbox.download('.ssh/config')
119
- end
120
-
121
- ssh_config ||= StringIO.new
122
- ssh_config.puts $/, "IdentityFile #{homedir}/.ssh/#{key}"
123
- puts " Adding IdentityFile #{key} to #{homedir}/.ssh/config"
124
-
125
- rbox.upload(ssh_config, '.ssh/config')
126
- rbox.chmod('0600', '.ssh/config')
127
-
128
- end
129
-
130
- # We need to add the host keys to the user's known_hosts file
131
- # to prevent the git commands from failing when it raises the
132
- # "Host key verification failed." messsage.
133
- if rbox.file_exists?('.ssh/known_hosts')
134
- rbox.cp('.ssh/known_hosts', ".ssh/known_hosts-previous")
135
- known_hosts = rbox.download('.ssh/known_hosts')
136
- end
137
- known_hosts ||= StringIO.new
138
- remote = get_remote_uri
139
- host = URI.parse(remote).host rescue nil
140
- host ||= remote.scan(/\A.+?@(.+?)\:/).flatten.first
141
- known_hosts.puts $/, Rye.remote_host_keys(host)
142
- puts " Adding host key for #{host} to .ssh/known_hosts"
143
-
144
- rbox.upload(known_hosts, '.ssh/known_hosts')
145
- rbox.chmod('0600', '.ssh/known_hosts')
146
-
147
- trap_rbox_errors {
148
- rbox.git('clone', get_remote_uri, @path)
149
- }
150
- rbox.cd(@path)
151
- trap_rbox_errors {
152
- rbox.git('checkout', :b, @rtag)
153
- }
154
- rescue Rye::CommandError => ex
155
- puts ex.message
156
- ensure
157
- # Return to the original user and directory
158
- rbox.switch_user(original_user)
159
- rbox.cd
160
- end
161
-
162
- end
163
-
164
-
165
- def get_remote_uri
166
- ret = Rye.shell(:git, "config", "remote.#{@remote}.url")
167
- ret.stdout.first
168
- end
169
-
170
- # Check if the given remote is valid.
171
- #def has_remote?(remote)
172
- # success = false
173
- # (@repo.remotes || []).each do |r|
174
- # end
175
- # success
176
- #end
177
-
178
- def valid_rtag?(tag)
179
- # git tag -l tagname returns a 0 exit code and stdout is empty
180
- # when a tag does not exit. When it does exist, the exit code
181
- # is 0 and stdout contains the tagname.
182
- ret = Rye.shell(:git, 'tag', :l, tag)
183
- # change :l to :d for quick deleting above and return true
184
- # OR: just change to :d to always recreate the same tag
185
- (ret.exit_code == 0 && ret.stdout.to_s == tag)
186
- end
187
-
188
- # Are all local changes committed?
189
- def self.clean_working_copy?(path=Dir.pwd)
190
- Rye.shell(:git, 'diff').stdout == []
191
- end
192
- def clean_working_copy?; GIT.clean_working_copy?; end
193
-
194
- def self.working_copy?(path=Dir.pwd)
195
- (File.exists?(File.join(path, '.git')))
196
- end
197
- def working_copy?; GIT.working_copy?; end
198
-
199
- def raise_early_exceptions
200
- raise NotAWorkingCopy, :git unless working_copy?
201
- raise DirtyWorkingCopy, :git unless @changes.to_s == 'ignore' || clean_working_copy?
202
- raise NoRemoteURI, "remote.#{@remote}.url not set" if get_remote_uri.nil?
203
- raise NoRemotePath, :git if @path.nil?
204
- raise PrivateKeyNotFound, @pkey if @pkey && !File.exists?(@pkey)
205
- find_next_rtag # will raise exception is there's a problem
206
-
207
- # We can't check stuff that requires access to the machine b/c the
208
- # machine may not be running yet. These include:
209
- # * Remote checkout path already exists
210
- # * No git available
211
- # ...
212
- # If create_remote_checkout should fail, it should print a message
213
- # about the release that was created and how to install it manually
214
- end
215
- end
216
- end
217
- end
data/lib/rudy/scm/svn.rb DELETED
@@ -1,110 +0,0 @@
1
-
2
- require 'date'
3
-
4
- module Rudy
5
- module SCM
6
- class SVN
7
- attr_accessor :base_uri
8
-
9
- attr_reader :changes
10
-
11
- def initialize(args={})
12
- args = {
13
- :privatekey => nil,
14
- :base_uri => nil,
15
- :user => :root,
16
- :changes => :enforce,
17
- :path => nil
18
- }.merge(args)
19
- @base_uri, @path = args[:base_uri], args[:path]
20
- @user, @pkey, @changes = args[:user], args[:privatekey], args[:changes]
21
- end
22
-
23
- def engine; :svn; end
24
-
25
- def liner_note
26
- "%-40s (svn:%s:%s)" % [@rtag, @base_uri, @branch]
27
- end
28
-
29
- def create_release(username=nil, msg=nil)
30
- local_uri, local_revision = local_info
31
- rtag = find_next_rtag(username)
32
- release_uri = "#{@base_uri}/#{rtag}"
33
- msg ||= 'Another Release by Rudy!'
34
- msg.tr!("'", "\\'")
35
- cmd = "svn copy -m '#{msg}' #{local_uri} #{release_uri}"
36
-
37
- `#{cmd} 2>&1`
38
-
39
- release_uri
40
- end
41
-
42
- def switch_working_copy(tag)
43
- raise "Invalid release tag (#{tag})." unless valid_rtag?(tag)
44
- `svn switch #{tag}`
45
- end
46
-
47
- # rel-2009-03-05-user-rev
48
- def find_next_rtag(username=nil)
49
- now = Time.now
50
- mon = now.mon.to_s.rjust(2, '0')
51
- day = now.day.to_s.rjust(2, '0')
52
- rev = "01"
53
- criteria = ['rel', now.year, mon, day, rev]
54
- criteria.insert(-2, username) if username
55
- tag = criteria.join(Rudy::DELIM)
56
- # Keep incrementing the revision number until we find the next one.
57
- tag.succ! while (valid_rtag?("#{@base_uri}/#{tag}"))
58
- tag
59
- end
60
-
61
- def local_info
62
- ret = Rye.shell(:svn, "info").join
63
- # URL: http://some/uri/path
64
- # Repository Root: http://some/uri
65
- # Repository UUID: c5abe49d-53e4-4ea3-9314-89e1e25aa7e1
66
- # Revision: 921
67
- ret.scan(/URL: (http:.+?)\s*\n.+Revision: (\d+)/m).flatten
68
- end
69
-
70
- def working_copy?(path)
71
- (File.exists?(File.join(path, '.svn')))
72
- end
73
-
74
- def valid_rtag?(uri)
75
- ret = `svn info #{uri} 2>&1` || '' # Valid SVN URIs will return some info
76
- (ret =~ /Repository UUID/) ? true : false
77
- end
78
-
79
- # Are all local changes committed?
80
- def self.clean_working_copy?(path=Dir.pwd)
81
- Rye.shell(:svn, 'diff', '.').stdout == []
82
- end
83
- def clean_working_copy?; SVN.clean_working_copy?; end
84
-
85
- def self.working_copy?(path=Dir.pwd)
86
- (File.exists?(File.join(path, '.svn')))
87
- end
88
- def working_copy?; SVN.working_copy?; end
89
-
90
-
91
- def raise_early_exceptions
92
- raise NotAWorkingCopy, :svn unless working_copy?
93
- raise DirtyWorkingCopy, :svn unless @changes.to_s == 'ignore' || clean_working_copy?
94
- #raise NoRemoteURI, "remote.#{@remote}.url not set" if get_remote_uri.nil?
95
- raise NoRemotePath, :svn if @path.nil?
96
- raise PrivateKeyNotFound, @pkey if @pkey && !File.exists?(@pkey)
97
- find_next_rtag # will raise exception is there's a problem
98
-
99
- # We can't check stuff that requires access to the machine b/c the
100
- # machine may not be running yet. These include:
101
- # * Remote checkout path already exists
102
- # * No git available
103
- # ...
104
- # If create_remote_checkout should fail, it should print a message
105
- # about the release that was created and how to install it manually
106
- end
107
-
108
- end
109
- end
110
- end