scm_workspace 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.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.rspec +3 -0
- data/.travis.yml +3 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/Rakefile +6 -0
- data/lib/scm_workspace/version.rb +3 -0
- data/lib/scm_workspace.rb +306 -0
- data/scm_workspace.gemspec +30 -0
- data/spec/scm_workspace_spec.rb +250 -0
- data/spec/spec_helper.rb +6 -0
- metadata +157 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 3297eb7e346c9ad8e2bf8603cbc40f18ff27da67
|
4
|
+
data.tar.gz: d403449591587f7d1b4e3d5b2697db5120104559
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e7783fc796f20487075f650a1c86ad0e578bdd41e4d80dc5e1c209e815caca20f6960cad999363cdc5cd79b95ae02cbb6bf10ad802c6c4162110cd1d5b97129e
|
7
|
+
data.tar.gz: a80bacb2fd7814502b52aad903c28e8f0f95ba02fd8d086f2c348698f03741a6231740543760c491dc6318a1fd432718cb9667d70d9d9719828b86192739a56a
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 akima
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# ScmWorkspace
|
2
|
+
|
3
|
+
TODO: Write a gem description
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'scm_workspace'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install scm_workspace
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
TODO: Write usage instructions here
|
22
|
+
|
23
|
+
## Contributing
|
24
|
+
|
25
|
+
1. Fork it
|
26
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
27
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
28
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
29
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,306 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'fileutils'
|
4
|
+
require 'yaml'
|
5
|
+
|
6
|
+
require 'tengine/support/core_ext/hash/deep_dup'
|
7
|
+
require 'tengine/support/null_logger'
|
8
|
+
|
9
|
+
require "scm_workspace/version"
|
10
|
+
|
11
|
+
class ScmWorkspace
|
12
|
+
|
13
|
+
attr_reader :root
|
14
|
+
attr_writer :logger
|
15
|
+
def initialize(config, options = {})
|
16
|
+
@root = config[:workspace]
|
17
|
+
@logger = options[:logger]
|
18
|
+
end
|
19
|
+
|
20
|
+
def logger
|
21
|
+
@logger ||= Tengine::Support::NullLogger.new
|
22
|
+
end
|
23
|
+
|
24
|
+
def puts_info(msg)
|
25
|
+
logger.info(msg)
|
26
|
+
$stdout.puts(msg)
|
27
|
+
end
|
28
|
+
|
29
|
+
def configure(url)
|
30
|
+
raise "#{repo_dir} is not empty. You must clear it" if configured?
|
31
|
+
raise "#{root} does not exist" unless Dir.exist?(root)
|
32
|
+
url, opt = url.split(/\s+/, 2)
|
33
|
+
scm_type = self.class.guess_scm_type(url)
|
34
|
+
options = opt ? parse_options(opt, scm_type) : {}
|
35
|
+
options['url'] = url
|
36
|
+
save_options(options)
|
37
|
+
case scm_type
|
38
|
+
when :git then
|
39
|
+
logger.info("*" * 100)
|
40
|
+
logger.info("SCM configure")
|
41
|
+
puts_info "git clone #{url} #{repo_dir}"
|
42
|
+
require 'git'
|
43
|
+
@git = Git.clone(url, repo_dir)
|
44
|
+
when :svn then
|
45
|
+
Dir.chdir(@root) do
|
46
|
+
cmd = "git svn clone #{url} #{repo_dir} #{opt} > /dev/null 2>&1"
|
47
|
+
logger.info("*" * 100)
|
48
|
+
logger.info("SCM configure")
|
49
|
+
puts_info "cd #{@root} && " + cmd
|
50
|
+
system(cmd)
|
51
|
+
end
|
52
|
+
@git = nil
|
53
|
+
else
|
54
|
+
raise "Unknown SCM type: #{url}"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def clear
|
59
|
+
FileUtils.remove_entry_secure(repo_dir) if Dir.exist?(repo_dir)
|
60
|
+
FileUtils.rm(options_path) if File.exist?(options_path)
|
61
|
+
end
|
62
|
+
|
63
|
+
def checkout(branch_name)
|
64
|
+
logger.info("-" * 100)
|
65
|
+
puts_info "git checkout #{branch_name}"
|
66
|
+
git.checkout(branch_name)
|
67
|
+
case scm_type
|
68
|
+
when :git then
|
69
|
+
puts_info "git reset --hard origin/#{branch_name}"
|
70
|
+
git.reset_hard("origin/#{branch_name}")
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def reset_hard(tag)
|
75
|
+
case scm_type
|
76
|
+
when :git then
|
77
|
+
logger.info("-" * 100)
|
78
|
+
puts_info("git reset --hard #{tag}")
|
79
|
+
git.reset_hard(tag)
|
80
|
+
when :svn then raise "Illegal operation for svn"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
alias_method :move, :reset_hard
|
84
|
+
|
85
|
+
def fetch
|
86
|
+
case scm_type
|
87
|
+
when :git then
|
88
|
+
logger.info("-" * 100)
|
89
|
+
puts_info("git fetch origin")
|
90
|
+
git.fetch("origin")
|
91
|
+
when :svn then in_repo_dir{ system("git svn fetch") }
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def status
|
96
|
+
case scm_type
|
97
|
+
when :git then
|
98
|
+
logger.info("-" * 100)
|
99
|
+
puts_info("git status")
|
100
|
+
status_text = in_repo_dir{ `git status` }
|
101
|
+
value = status_text.scan(/Your branch is behind 'origin\/#{current_branch_name}' by (\d+\s+commits)/)
|
102
|
+
if value && !value.empty?
|
103
|
+
"There is/are #{value.flatten.join}"
|
104
|
+
else
|
105
|
+
"everything is up-to-dated."
|
106
|
+
end
|
107
|
+
when :svn then
|
108
|
+
current_sha = git.log.first.sha
|
109
|
+
status_text = in_repo_dir{
|
110
|
+
cmd = "git log --branches --oneline #{current_sha}.."
|
111
|
+
puts_info cmd
|
112
|
+
`#{cmd}`
|
113
|
+
}
|
114
|
+
lines = status_text.split(/\n/)
|
115
|
+
if lines.empty?
|
116
|
+
"everything is up-to-dated."
|
117
|
+
else
|
118
|
+
latest_sha = lines.first
|
119
|
+
"There is/are #{lines.length} commits." + in_repo_dir{
|
120
|
+
" current revision: " << `git svn find-rev #{current_sha}`.strip <<
|
121
|
+
" latest revision: " << `git svn find-rev #{latest_sha}`.strip
|
122
|
+
}
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def current_commit_key
|
128
|
+
return nil unless configured?
|
129
|
+
result = git.log.first.sha
|
130
|
+
case scm_type
|
131
|
+
when :svn then
|
132
|
+
rev = nil
|
133
|
+
cnt = 0
|
134
|
+
while rev.nil?
|
135
|
+
rev = in_repo_dir{ `git svn find-rev #{result}`.strip }
|
136
|
+
cnt += 1
|
137
|
+
raise "failed to get svn revision for #{result}" if cnt > 10
|
138
|
+
end
|
139
|
+
result << ':' << rev
|
140
|
+
end
|
141
|
+
result
|
142
|
+
end
|
143
|
+
|
144
|
+
def branch_names
|
145
|
+
return nil unless configured?
|
146
|
+
case scm_type
|
147
|
+
when :git then
|
148
|
+
result = git.branches.remote.map(&:full).map{|path| path.sub(/\Aremotes\/origin\//, '')}
|
149
|
+
result.delete_if{|name| name =~ /\AHEAD ->/}
|
150
|
+
result
|
151
|
+
when :svn then
|
152
|
+
git.branches.remote.map(&:full).map{|path| path.sub(/\Aremotes\//, '')}
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
def tag_names
|
157
|
+
return nil unless configured?
|
158
|
+
git.tags.map(&:name).uniq
|
159
|
+
end
|
160
|
+
|
161
|
+
def url
|
162
|
+
return nil unless configured?
|
163
|
+
case scm_type
|
164
|
+
when :git then git.remote("origin").url
|
165
|
+
when :svn then svn_info[:repository_root]
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
def current_branch_name
|
170
|
+
return nil unless configured?
|
171
|
+
case scm_type
|
172
|
+
when :git then
|
173
|
+
logger.info("-" * 100)
|
174
|
+
r = git.log.first.name
|
175
|
+
logger.info("current_branch_name: #{r.inspect}")
|
176
|
+
r
|
177
|
+
when :svn then
|
178
|
+
info = svn_info
|
179
|
+
r = info[:url].sub(info[:repository_root], '')
|
180
|
+
r.sub!(/\A\//, '')
|
181
|
+
if branch_prefix = load_options['branches']
|
182
|
+
r.sub!(branch_prefix + "/", '')
|
183
|
+
end
|
184
|
+
r
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
def current_tag_names
|
189
|
+
return nil unless configured?
|
190
|
+
log = git.log.first
|
191
|
+
git.tags.select{|b| b.log.first.sha == log.sha}.map(&:name)
|
192
|
+
end
|
193
|
+
|
194
|
+
|
195
|
+
def repo_dir
|
196
|
+
File.join(@root, "workspace")
|
197
|
+
end
|
198
|
+
|
199
|
+
def options_path
|
200
|
+
File.join(@root, "options.yml")
|
201
|
+
end
|
202
|
+
|
203
|
+
def configured?
|
204
|
+
Dir.exist?(repo_dir)
|
205
|
+
end
|
206
|
+
|
207
|
+
def cleared?
|
208
|
+
!configured?
|
209
|
+
end
|
210
|
+
|
211
|
+
def git
|
212
|
+
require 'git'
|
213
|
+
@git ||= Git.open(repo_dir, log: logger)
|
214
|
+
end
|
215
|
+
|
216
|
+
CONFIGURE_OPTIONS = {
|
217
|
+
svn: {
|
218
|
+
"A" => "authors_file",
|
219
|
+
"b" => "branches",
|
220
|
+
"m!" => "minimize_rul",
|
221
|
+
"q+" => "quiet",
|
222
|
+
"r" => "revision",
|
223
|
+
"s" => "stdlayout",
|
224
|
+
"t" => "tags",
|
225
|
+
"T" => "trunk",
|
226
|
+
},
|
227
|
+
|
228
|
+
git: {
|
229
|
+
'n' => 'no_checkout',
|
230
|
+
'l' => 'local',
|
231
|
+
's' => 'shared',
|
232
|
+
'o' => 'origin',
|
233
|
+
'b' => 'branch',
|
234
|
+
'u' => 'upload_pack',
|
235
|
+
'c' => 'config',
|
236
|
+
}
|
237
|
+
}
|
238
|
+
|
239
|
+
def parse_options(opt, scm_type)
|
240
|
+
# "-T trunk --branches branches --tags tags -hoge --on" という文字列を
|
241
|
+
# [["-T", "trunk"], ["--branches", "branches"], ["--tags", "tags"], ["-hoge", nil], ["--on", nil]]
|
242
|
+
# という風に分割します
|
243
|
+
key_values = opt.scan(/(-[^\s]+)(?:\=|\s+)?([^-][^\s]+)?/)
|
244
|
+
result = key_values.each_with_object({}){|(k,v), d| d[k.sub(/\A-{1,2}/, '').gsub(/-/, '_')] = v }
|
245
|
+
CONFIGURE_OPTIONS[scm_type].each do |short_key, long_key|
|
246
|
+
if v = result.delete(short_key)
|
247
|
+
result[long_key] = v
|
248
|
+
end
|
249
|
+
end
|
250
|
+
result
|
251
|
+
end
|
252
|
+
|
253
|
+
def save_options(hash)
|
254
|
+
open(options_path, "w") do |f|
|
255
|
+
YAML.dump(hash, f)
|
256
|
+
end
|
257
|
+
end
|
258
|
+
|
259
|
+
def load_options
|
260
|
+
return {} unless File.readable?(options_path)
|
261
|
+
YAML.load_file(options_path)
|
262
|
+
end
|
263
|
+
alias_method :options, :load_options
|
264
|
+
|
265
|
+
def git_repo?
|
266
|
+
return nil unless configured?
|
267
|
+
!git.remotes.empty? rescue false
|
268
|
+
end
|
269
|
+
|
270
|
+
def svn_repo?
|
271
|
+
return nil unless configured?
|
272
|
+
Dir.exist?(File.join(repo_dir, '.git', 'svn'))
|
273
|
+
end
|
274
|
+
|
275
|
+
def scm_type
|
276
|
+
return nil unless configured?
|
277
|
+
return :git if git_repo?
|
278
|
+
return :svn if svn_repo?
|
279
|
+
nil
|
280
|
+
end
|
281
|
+
|
282
|
+
def svn_info
|
283
|
+
in_repo_dir do
|
284
|
+
txt = `git svn info`
|
285
|
+
return txt.scan(/^(.+?): (.*)$/).each_with_object({}){|(k,v), d| d[k.downcase.gsub(/\s/, '_').to_sym] = v }
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
def in_repo_dir
|
290
|
+
Dir.chdir(repo_dir) do
|
291
|
+
return yield
|
292
|
+
end
|
293
|
+
end
|
294
|
+
|
295
|
+
|
296
|
+
class << self
|
297
|
+
def guess_scm_type(url)
|
298
|
+
case url
|
299
|
+
when /\Agit:\/\//, /\Agit\@/, /\.git\Z/ then :git
|
300
|
+
when /svn/ then :svn
|
301
|
+
else nil
|
302
|
+
end
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'scm_workspace/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "scm_workspace"
|
8
|
+
spec.version = ScmWorkspace::VERSION
|
9
|
+
spec.authors = ["akima"]
|
10
|
+
spec.email = ["akima@groovenauts.jp"]
|
11
|
+
spec.description = %q{support loading scm repogitory into local workspace}
|
12
|
+
spec.summary = %q{support loading scm repogitory into local workspace}
|
13
|
+
spec.homepage = ""
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_runtime_dependency "git"
|
22
|
+
spec.add_runtime_dependency "tengine_support"
|
23
|
+
|
24
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
25
|
+
spec.add_development_dependency "rake"
|
26
|
+
spec.add_development_dependency "rspec", "~> 2.11.0"
|
27
|
+
|
28
|
+
spec.add_development_dependency "pry"
|
29
|
+
spec.add_development_dependency "fuubar"
|
30
|
+
end
|
@@ -0,0 +1,250 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
require 'tmpdir'
|
5
|
+
require 'fileutils'
|
6
|
+
|
7
|
+
# ApiServerモードでもScmWorkspaceクラスを使用するので、参照だけはできることを確認する。
|
8
|
+
describe ScmWorkspace do
|
9
|
+
|
10
|
+
before(:all){ @tmp_workspace = Dir.mktmpdir }
|
11
|
+
after(:all){ FileUtils.remove_entry_secure(@tmp_workspace) }
|
12
|
+
let(:tmp_workspace){ @tmp_workspace }
|
13
|
+
let(:scm_workspace){ ScmWorkspace.new(workspace: tmp_workspace) }
|
14
|
+
|
15
|
+
context "not depend on git" do
|
16
|
+
subject{ scm_workspace }
|
17
|
+
its(:repo_dir){ should_not == nil }
|
18
|
+
its(:options_path){ should_not == nil }
|
19
|
+
it{ subject.configured? }
|
20
|
+
it{ subject.cleared? }
|
21
|
+
end
|
22
|
+
|
23
|
+
context "git", git: true do
|
24
|
+
let(:url){ "git://github.com/akm/git_sandbox.git" }
|
25
|
+
|
26
|
+
context "before configuring" do
|
27
|
+
before do
|
28
|
+
FileUtils.remove_entry_secure(scm_workspace.repo_dir) if Dir.exist?(scm_workspace.repo_dir)
|
29
|
+
end
|
30
|
+
subject{ scm_workspace }
|
31
|
+
|
32
|
+
its(:configured?){ should == false}
|
33
|
+
its(:scm_type){ should == nil}
|
34
|
+
its(:url){ should == nil}
|
35
|
+
|
36
|
+
its(:scm_type){ should == nil}
|
37
|
+
its(:git_repo?){ should == nil }
|
38
|
+
its(:svn_repo?){ should == nil }
|
39
|
+
|
40
|
+
its(:branch_names){ should == nil }
|
41
|
+
its(:tag_names){ should == nil }
|
42
|
+
|
43
|
+
its(:current_branch_name){ should == nil }
|
44
|
+
its(:current_tag_names){ should == nil }
|
45
|
+
|
46
|
+
its(:current_commit_key){ should == nil }
|
47
|
+
end
|
48
|
+
|
49
|
+
context "after configuring" do
|
50
|
+
before(:all) do
|
51
|
+
FileUtils.remove_entry_secure(scm_workspace.repo_dir) if Dir.exist?(scm_workspace.repo_dir)
|
52
|
+
scm_workspace.configure(url)
|
53
|
+
end
|
54
|
+
subject{ scm_workspace }
|
55
|
+
|
56
|
+
its(:options){ should == {"url" => url} }
|
57
|
+
its(:configured?){ should == true}
|
58
|
+
its(:cleared?){ should == false }
|
59
|
+
its(:url){ should == url }
|
60
|
+
|
61
|
+
its(:scm_type){ should == :git}
|
62
|
+
its(:git_repo?){ should == true }
|
63
|
+
its(:svn_repo?){ should == false }
|
64
|
+
|
65
|
+
its(:branch_names){ should =~ %w[master develop 0.1 feature/function_d feature/function_e] }
|
66
|
+
its(:tag_names){ should =~ %w[v0.0.1 v0.0.2 v0.1.0] }
|
67
|
+
|
68
|
+
its(:current_branch_name){ should == "develop" }
|
69
|
+
its(:current_tag_names){ should =~ %w[v0.0.2] }
|
70
|
+
|
71
|
+
its(:current_commit_key){ should == "a0eaf8cca31080ca26edbae0daddaa9931edd6d6" }
|
72
|
+
|
73
|
+
it :fetch do
|
74
|
+
scm_workspace.fetch
|
75
|
+
end
|
76
|
+
|
77
|
+
context "duplicated configuration" do
|
78
|
+
it do
|
79
|
+
expect{
|
80
|
+
scm_workspace.configure(url)
|
81
|
+
}.to raise_error(/not empty/i)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe :checkout do
|
87
|
+
context "another branch" do
|
88
|
+
before(:all) do
|
89
|
+
FileUtils.remove_entry_secure(scm_workspace.repo_dir) if Dir.exist?(scm_workspace.repo_dir)
|
90
|
+
scm_workspace.configure(url)
|
91
|
+
scm_workspace.checkout("0.1")
|
92
|
+
end
|
93
|
+
subject{ scm_workspace }
|
94
|
+
its(:current_branch_name){ should == "0.1" }
|
95
|
+
its(:current_tag_names){ should =~ %w[v0.1.0] }
|
96
|
+
end
|
97
|
+
|
98
|
+
context "branch is updated" do
|
99
|
+
before(:all) do
|
100
|
+
FileUtils.remove_entry_secure(scm_workspace.repo_dir) if Dir.exist?(scm_workspace.repo_dir)
|
101
|
+
scm_workspace.configure(url)
|
102
|
+
Dir.chdir(scm_workspace.repo_dir) do
|
103
|
+
# バージョンを巻き戻す
|
104
|
+
system("git reset --hard a68a53610407e6ba30939326af743d3b734bb53d")
|
105
|
+
end
|
106
|
+
end
|
107
|
+
it "checkout again" do
|
108
|
+
scm_workspace.status.should =~ /7 commits/
|
109
|
+
scm_workspace.checkout("develop")
|
110
|
+
scm_workspace.status.should =~ /up-to-dated/
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
describe :move do # reset --hard
|
116
|
+
%w[v0.0.1 v0.0.2 v0.1.0].each do |tag|
|
117
|
+
context "#{tag} in develop" do
|
118
|
+
before(:all) do
|
119
|
+
FileUtils.remove_entry_secure(scm_workspace.repo_dir) if Dir.exist?(scm_workspace.repo_dir)
|
120
|
+
scm_workspace.configure(url)
|
121
|
+
scm_workspace.checkout("develop")
|
122
|
+
scm_workspace.move(tag)
|
123
|
+
end
|
124
|
+
subject{ scm_workspace }
|
125
|
+
its(:current_branch_name){ should == "develop" }
|
126
|
+
its(:current_tag_names){ should =~ [tag] }
|
127
|
+
end
|
128
|
+
end
|
129
|
+
context "reset to fix wrong reset" do
|
130
|
+
before(:all) do
|
131
|
+
FileUtils.remove_entry_secure(scm_workspace.repo_dir) if Dir.exist?(scm_workspace.repo_dir)
|
132
|
+
scm_workspace.configure(url)
|
133
|
+
scm_workspace.checkout("develop")
|
134
|
+
scm_workspace.move("v0.1.0")
|
135
|
+
end
|
136
|
+
subject{ scm_workspace }
|
137
|
+
it do
|
138
|
+
subject.current_branch_name.should == "develop"
|
139
|
+
subject.current_tag_names.should =~ ["v0.1.0"]
|
140
|
+
subject.checkout("develop")
|
141
|
+
subject.current_branch_name.should == "develop"
|
142
|
+
subject.current_tag_names.should =~ ["v0.0.2"]
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
describe :clear do
|
148
|
+
before(:all) do
|
149
|
+
FileUtils.remove_entry_secure(scm_workspace.repo_dir) if Dir.exist?(scm_workspace.repo_dir)
|
150
|
+
scm_workspace.configure(url)
|
151
|
+
end
|
152
|
+
|
153
|
+
it do
|
154
|
+
scm_workspace.cleared?.should == false
|
155
|
+
scm_workspace.clear
|
156
|
+
scm_workspace.cleared?.should == true
|
157
|
+
Dir.exist?(scm_workspace.repo_dir).should == false
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
end
|
162
|
+
|
163
|
+
context "svn", svn: true do
|
164
|
+
let(:base_url){ "http://rubeus.googlecode.com/svn" }
|
165
|
+
let(:cloning_url){ "#{base_url} -T trunk --branches branches --tags tags" }
|
166
|
+
|
167
|
+
context "after configuring" do
|
168
|
+
before(:all) do
|
169
|
+
FileUtils.remove_entry_secure(scm_workspace.repo_dir) if Dir.exist?(scm_workspace.repo_dir)
|
170
|
+
scm_workspace.configure(cloning_url)
|
171
|
+
end
|
172
|
+
subject{ scm_workspace }
|
173
|
+
|
174
|
+
its(:configured?){ should == true}
|
175
|
+
its(:cleared?){ should == false }
|
176
|
+
its(:url){ should == base_url }
|
177
|
+
its(:options){ should == {"url" => base_url, "trunk" => "trunk", "branches" => "branches", "tags" => "tags"} }
|
178
|
+
|
179
|
+
its(:scm_type){ should == :svn}
|
180
|
+
its(:git_repo?){ should == false }
|
181
|
+
its(:svn_repo?){ should == true }
|
182
|
+
|
183
|
+
its(:branch_names){ should =~ %w[jdbc_migration rakeable rmaven tags/0.0.8 tags/REL-0.0.2 tags/REL-0.0.3 trunk] }
|
184
|
+
its(:tag_names){ should == [] }
|
185
|
+
|
186
|
+
its(:current_branch_name){ should == "trunk" }
|
187
|
+
its(:current_tag_names){ should == [] }
|
188
|
+
|
189
|
+
# git svn だと SHAはcloneするたびに変わるので末尾のSVNのリビジョン番号をチェックします
|
190
|
+
its(:current_commit_key){ should =~ /\A[0-9a-f]{40}:247\Z/ }
|
191
|
+
|
192
|
+
it :fetch do
|
193
|
+
scm_workspace.fetch
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
context "duplicated configuration" do
|
198
|
+
before(:all) do
|
199
|
+
FileUtils.remove_entry_secure(scm_workspace.repo_dir) if Dir.exist?(scm_workspace.repo_dir)
|
200
|
+
scm_workspace.configure(cloning_url)
|
201
|
+
end
|
202
|
+
subject{ scm_workspace }
|
203
|
+
|
204
|
+
it do
|
205
|
+
expect{
|
206
|
+
scm_workspace.configure(cloning_url)
|
207
|
+
}.to raise_error(/not empty/i)
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
describe :checkout do
|
212
|
+
%w[rmaven tags/0.0.8].each do |branch_name|
|
213
|
+
|
214
|
+
context branch_name do
|
215
|
+
before(:all) do
|
216
|
+
FileUtils.remove_entry_secure(scm_workspace.repo_dir) if Dir.exist?(scm_workspace.repo_dir)
|
217
|
+
scm_workspace.configure(cloning_url)
|
218
|
+
scm_workspace.checkout(branch_name)
|
219
|
+
end
|
220
|
+
subject{ scm_workspace }
|
221
|
+
its(:current_branch_name){ should == branch_name }
|
222
|
+
its(:current_tag_names){ should == [] }
|
223
|
+
end
|
224
|
+
|
225
|
+
end
|
226
|
+
|
227
|
+
context "branch is updated" do
|
228
|
+
before(:all) do
|
229
|
+
FileUtils.remove_entry_secure(scm_workspace.repo_dir) if Dir.exist?(scm_workspace.repo_dir)
|
230
|
+
scm_workspace.configure(cloning_url)
|
231
|
+
scm_workspace.checkout("trunk")
|
232
|
+
Dir.chdir(scm_workspace.repo_dir) do
|
233
|
+
# バージョンを巻き戻す
|
234
|
+
system("git reset --hard HEAD~3")
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
it "checkout again" do
|
239
|
+
scm_workspace.current_commit_key.should =~ /\A[0-9a-f]{40}:244\Z/
|
240
|
+
scm_workspace.status.should =~ /3 commits.*current revision: 244.*latest revision: 247/
|
241
|
+
scm_workspace.checkout("trunk")
|
242
|
+
scm_workspace.current_commit_key.should =~ /\A[0-9a-f]{40}:247\Z/
|
243
|
+
scm_workspace.status.should =~ /up-to-dated/
|
244
|
+
end
|
245
|
+
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,157 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: scm_workspace
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- akima
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-09-26 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: git
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: tengine_support
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.3'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.3'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ~>
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 2.11.0
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ~>
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 2.11.0
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: pry
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: fuubar
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
description: support loading scm repogitory into local workspace
|
112
|
+
email:
|
113
|
+
- akima@groovenauts.jp
|
114
|
+
executables: []
|
115
|
+
extensions: []
|
116
|
+
extra_rdoc_files: []
|
117
|
+
files:
|
118
|
+
- .gitignore
|
119
|
+
- .rspec
|
120
|
+
- .travis.yml
|
121
|
+
- Gemfile
|
122
|
+
- LICENSE.txt
|
123
|
+
- README.md
|
124
|
+
- Rakefile
|
125
|
+
- lib/scm_workspace.rb
|
126
|
+
- lib/scm_workspace/version.rb
|
127
|
+
- scm_workspace.gemspec
|
128
|
+
- spec/scm_workspace_spec.rb
|
129
|
+
- spec/spec_helper.rb
|
130
|
+
homepage: ''
|
131
|
+
licenses:
|
132
|
+
- MIT
|
133
|
+
metadata: {}
|
134
|
+
post_install_message:
|
135
|
+
rdoc_options: []
|
136
|
+
require_paths:
|
137
|
+
- lib
|
138
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
139
|
+
requirements:
|
140
|
+
- - '>='
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: '0'
|
143
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
144
|
+
requirements:
|
145
|
+
- - '>='
|
146
|
+
- !ruby/object:Gem::Version
|
147
|
+
version: '0'
|
148
|
+
requirements: []
|
149
|
+
rubyforge_project:
|
150
|
+
rubygems_version: 2.0.3
|
151
|
+
signing_key:
|
152
|
+
specification_version: 4
|
153
|
+
summary: support loading scm repogitory into local workspace
|
154
|
+
test_files:
|
155
|
+
- spec/scm_workspace_spec.rb
|
156
|
+
- spec/spec_helper.rb
|
157
|
+
has_rdoc:
|