stash-clone-tool 1.0.5 → 1.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +5 -4
- data/.overcommit.yml +15 -0
- data/.rubocop.yml +14 -0
- data/.travis.yml +4 -0
- data/Gemfile +1 -1
- data/README.md +17 -1
- data/Rakefile +11 -0
- data/bin/stash-clone-tool +17 -15
- data/lib/stash_clone_tool/clone_link.rb +1 -3
- data/lib/stash_clone_tool/project.rb +1 -2
- data/lib/stash_clone_tool/stash_api_client.rb +11 -6
- data/lib/stash_clone_tool/stash_cloner.rb +2 -5
- data/lib/stash_clone_tool/stash_exception.rb +2 -2
- data/lib/stash_clone_tool/stash_repository.rb +2 -2
- data/lib/stash_clone_tool/version.rb +1 -1
- data/stash-clone-tool.gemspec +6 -7
- metadata +62 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4b1ae15f4539ffe0fc37dfd2446290f97a35d4e7
|
4
|
+
data.tar.gz: 3ca8efa8ff5ddca48a3cbb7999b1723fc78f2e9c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '09b441285ec41e03cbd3e5cbe8200c7782f6761b1a7a72bf596003389c8fdd149ff11e0037ea98370dfab5e3a2d0ba9eaf4d22e2fe73740ffbc6e55f50434de7'
|
7
|
+
data.tar.gz: e97f16866ea5b34d55e0b5653934ff3a65d8c5d8a0280fc442a7b907f8601c0e83bf8222f0bdd2e75df903d7d256d4d78a8e830de361c63d3a103bec50d6a332
|
data/.gitignore
CHANGED
data/.overcommit.yml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
PreCommit:
|
2
|
+
BundleCheck:
|
3
|
+
enabled: true
|
4
|
+
FixMe:
|
5
|
+
enabled: true
|
6
|
+
keywords: ["FIXME", "TODO"]
|
7
|
+
exclude:
|
8
|
+
- .overcommit.yml
|
9
|
+
RuboCop:
|
10
|
+
enabled: true
|
11
|
+
on_warn: fail
|
12
|
+
command: ['bundle', 'exec', 'rubocop']
|
13
|
+
PrePush:
|
14
|
+
RSpec:
|
15
|
+
enabled: true
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
Metrics/LineLength:
|
2
|
+
Max: 120
|
3
|
+
Metrics/MethodLength:
|
4
|
+
Max: 40
|
5
|
+
Metrics/AbcSize:
|
6
|
+
Enabled: false
|
7
|
+
Documentation:
|
8
|
+
Enabled: false
|
9
|
+
Style/ClassAndModuleChildren:
|
10
|
+
Enabled: false
|
11
|
+
Style/AlignHash:
|
12
|
+
Enabled: false
|
13
|
+
Style/MultilineOperationIndentation:
|
14
|
+
Enabled: false
|
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
[![Build Status](https://travis-ci.org/paul-ridgway/stash-clone-tool.svg?branch=master)](https://travis-ci.org/paul-ridgway/stash-clone-tool)
|
2
|
+
|
1
3
|
# Stash Clone Tool
|
2
4
|
Clones all repositories in all projects a user has access to from a stash server.
|
3
5
|
|
@@ -5,7 +7,7 @@ Simple to use, enter the stash url, username and password.
|
|
5
7
|
|
6
8
|
Feel free to contribute at https://github.com/paul-ridgway/stash-clone-tool.
|
7
9
|
|
8
|
-
|
10
|
+
## Usage
|
9
11
|
Install the stash clone tool:
|
10
12
|
|
11
13
|
gem install stash-clone-tool
|
@@ -16,3 +18,17 @@ You can now clone all repositories in all the projects you have access to:
|
|
16
18
|
|
17
19
|
Omit the password argument (-p) to enter your password via masked standard input.
|
18
20
|
|
21
|
+
## Development
|
22
|
+
stash-clone-tool uses rubocop and overcommit to ensure build quality.
|
23
|
+
|
24
|
+
To enable overcommit:
|
25
|
+
|
26
|
+
$ overcommit && overcommit --sign
|
27
|
+
|
28
|
+
To check code style:
|
29
|
+
|
30
|
+
$ bundle exec rubocop
|
31
|
+
|
32
|
+
The project can be build (which also runs rubocop), using:
|
33
|
+
|
34
|
+
$ bundle exec rake
|
data/Rakefile
CHANGED
data/bin/stash-clone-tool
CHANGED
@@ -4,10 +4,10 @@ require 'bundler/setup'
|
|
4
4
|
require 'stash_clone_tool/stash_cloner'
|
5
5
|
require 'optparse'
|
6
6
|
require 'highline/import'
|
7
|
-
options = {directory: '.'}
|
7
|
+
options = { directory: '.' }
|
8
8
|
clone_options = {}
|
9
9
|
exclude = []
|
10
|
-
|
10
|
+
OptionParser.new do |opts|
|
11
11
|
opts.banner = 'Usage: stash-clone-tool [options]'
|
12
12
|
opts.on('-s', '--stash URL', 'Stash Server URL (required)') do |stash_url|
|
13
13
|
options[:stash_url] = stash_url
|
@@ -18,39 +18,41 @@ cli = OptionParser.new do |opts|
|
|
18
18
|
opts.on('-p', '--password PASSWORD', 'Stash password') do |password|
|
19
19
|
options[:password] = password
|
20
20
|
end
|
21
|
-
opts.on('-d', '--directory
|
21
|
+
opts.on('-d', '--directory PATH', 'Path to clone stash projects into (default: working directory).') do |directory|
|
22
22
|
options[:directory] = directory
|
23
23
|
end
|
24
24
|
opts.on('--depth DEPTH', 'Clone depth (assumes single branch unless --no-single-branch).') do |depth|
|
25
25
|
clone_options[:depth] = depth
|
26
26
|
end
|
27
|
-
opts.on(
|
27
|
+
opts.on('--exclude KEY1,KEY2,...', Array, 'Project keys to exclude') do |list|
|
28
28
|
list.each { |key| exclude << key }
|
29
29
|
end
|
30
30
|
end.parse!
|
31
31
|
|
32
|
-
|
33
|
-
|
32
|
+
raise 'Must specify Stash server URL (-s).' if options[:stash_url].nil?
|
33
|
+
raise 'Must specify Stash username (-u).' if options[:username].nil?
|
34
34
|
|
35
35
|
# Prompt for password if not provided on CLI
|
36
36
|
options[:password] ||= ask('Password: ') { |q| q.echo = '*' }
|
37
37
|
|
38
|
-
|
39
|
-
cloner = StashCloneTool::StashCloner.new(options[:stash_url], options[:username], options[:password],
|
38
|
+
last_project = nil
|
39
|
+
cloner = StashCloneTool::StashCloner.new(options[:stash_url], options[:username], options[:password],
|
40
|
+
options[:directory])
|
40
41
|
|
41
42
|
cloner.clone_stash(clone_options, exclude) do |on|
|
42
43
|
on.initialize_repository do |repository, folder|
|
43
|
-
if
|
44
|
+
if last_project != repository.project
|
44
45
|
puts " - #{repository.project.name} (#{repository.project.name}...".light_yellow
|
45
|
-
|
46
|
+
last_project = repository.project
|
46
47
|
end
|
47
48
|
puts " - #{repository.name}...".light_yellow
|
48
|
-
puts
|
49
|
+
puts ' Cloning '.light_blue + repository.clone_link(:ssh).light_white + ' to '.light_blue +
|
50
|
+
folder.light_white
|
49
51
|
end
|
50
|
-
on.success do |
|
51
|
-
puts
|
52
|
+
on.success do |_|
|
53
|
+
puts ' Cloned'.light_green
|
52
54
|
end
|
53
|
-
on.failure do |
|
55
|
+
on.failure do |_, message|
|
54
56
|
puts " #{message}".light_red
|
55
57
|
end
|
56
|
-
end
|
58
|
+
end
|
@@ -16,7 +16,9 @@ module StashCloneTool
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def get_repositories(project)
|
19
|
-
request("/rest/api/1.0/projects/#{project.key}/repos")['values'].map
|
19
|
+
request("/rest/api/1.0/projects/#{project.key}/repos?limit=100")['values'].map do |json|
|
20
|
+
StashRepository.new(project, json)
|
21
|
+
end
|
20
22
|
end
|
21
23
|
|
22
24
|
private
|
@@ -25,16 +27,19 @@ module StashCloneTool
|
|
25
27
|
uri = URI("#{@stash_url}#{url}")
|
26
28
|
req = Net::HTTP::Get.new(uri.to_s)
|
27
29
|
req.basic_auth @username, @password
|
28
|
-
response = Net::HTTP.start(uri.hostname, uri.port, :
|
30
|
+
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
|
29
31
|
http.request(req)
|
30
32
|
end
|
31
|
-
|
33
|
+
process_response(response.body)
|
34
|
+
end
|
35
|
+
|
36
|
+
def process_response(body)
|
37
|
+
json = JSON.parse(body)
|
32
38
|
if json['errors']
|
33
39
|
error_msg = json['errors'].map { |e| e['message'] }.join('. ')
|
34
|
-
raise StashException
|
40
|
+
raise StashException, error_msg
|
35
41
|
end
|
36
42
|
json
|
37
43
|
end
|
38
|
-
|
39
44
|
end
|
40
|
-
end
|
45
|
+
end
|
@@ -6,7 +6,6 @@ require 'stash_clone_tool/stash_api_client'
|
|
6
6
|
require 'stash_clone_tool/stash_repository'
|
7
7
|
require 'stash_clone_tool/stash_exception'
|
8
8
|
module StashCloneTool
|
9
|
-
|
10
9
|
class StashCloner
|
11
10
|
include StashCloneTool
|
12
11
|
|
@@ -23,16 +22,14 @@ module StashCloneTool
|
|
23
22
|
project.repositories.each do |repository|
|
24
23
|
folder = File.join(@directory, project.key, repository.slug)
|
25
24
|
wrapper.call(:initialize_repository, repository, folder)
|
26
|
-
|
27
|
-
if Dir.exists?(folder)
|
25
|
+
if Dir.exist?(folder)
|
28
26
|
wrapper.call(:failure, repository, 'Target already exists')
|
29
27
|
else
|
30
|
-
Git.clone(clone_link, folder, clone_options)
|
28
|
+
Git.clone(repository.clone_link(:ssh), folder, clone_options)
|
31
29
|
wrapper.call(:success, repository)
|
32
30
|
end
|
33
31
|
end
|
34
32
|
end
|
35
33
|
end
|
36
|
-
|
37
34
|
end
|
38
35
|
end
|
@@ -6,7 +6,7 @@ module StashCloneTool
|
|
6
6
|
|
7
7
|
def initialize(project, repo)
|
8
8
|
@name = repo['name']
|
9
|
-
@clone_links = repo['links']['clone'].map{ |link| CloneLink.new(link)}
|
9
|
+
@clone_links = repo['links']['clone'].map { |link| CloneLink.new(link) }
|
10
10
|
@slug = repo['slug']
|
11
11
|
@project = project
|
12
12
|
end
|
@@ -16,4 +16,4 @@ module StashCloneTool
|
|
16
16
|
cl.uri
|
17
17
|
end
|
18
18
|
end
|
19
|
-
end
|
19
|
+
end
|
data/stash-clone-tool.gemspec
CHANGED
@@ -13,13 +13,8 @@ Gem::Specification.new do |spec|
|
|
13
13
|
spec.description = 'Tool for cloning all projects from a Stash server.'
|
14
14
|
spec.homepage = 'https://github.com/paul-ridgway/stash-clone-tool'
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
if spec.respond_to?(:metadata)
|
19
|
-
spec.metadata['allowed_push_host'] = "https://rubygems.org"
|
20
|
-
else
|
21
|
-
fail 'RubyGems 2.0 or newer is required to protect against public gem pushes.'
|
22
|
-
end
|
16
|
+
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
17
|
+
raise 'RubyGems 2.0 or newer is required to protect against public gem pushes.' unless spec.respond_to?(:metadata)
|
23
18
|
|
24
19
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
25
20
|
spec.bindir = 'bin'
|
@@ -28,6 +23,10 @@ Gem::Specification.new do |spec|
|
|
28
23
|
|
29
24
|
spec.add_development_dependency 'bundler', '~> 1.10'
|
30
25
|
spec.add_development_dependency 'rake', '~> 10.0'
|
26
|
+
spec.add_development_dependency 'rubocop'
|
27
|
+
spec.add_development_dependency 'overcommit'
|
28
|
+
spec.add_development_dependency 'rspec'
|
29
|
+
spec.add_development_dependency 'simplecov'
|
31
30
|
spec.add_runtime_dependency 'colorize', '~> 0.7.7'
|
32
31
|
spec.add_runtime_dependency 'highline', '~> 1.7', '>= 1.7.3'
|
33
32
|
spec.add_runtime_dependency 'git', '~> 1.2', '>= 1.2.9.1'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stash-clone-tool
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul Ridgway
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2017-01-08 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
@@ -40,6 +40,62 @@ dependencies:
|
|
40
40
|
- - "~>"
|
41
41
|
- !ruby/object:Gem::Version
|
42
42
|
version: '10.0'
|
43
|
+
- !ruby/object:Gem::Dependency
|
44
|
+
name: rubocop
|
45
|
+
requirement: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0'
|
50
|
+
type: :development
|
51
|
+
prerelease: false
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
- !ruby/object:Gem::Dependency
|
58
|
+
name: overcommit
|
59
|
+
requirement: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
type: :development
|
65
|
+
prerelease: false
|
66
|
+
version_requirements: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: rspec
|
73
|
+
requirement: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
type: :development
|
79
|
+
prerelease: false
|
80
|
+
version_requirements: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '0'
|
85
|
+
- !ruby/object:Gem::Dependency
|
86
|
+
name: simplecov
|
87
|
+
requirement: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - ">="
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0'
|
92
|
+
type: :development
|
93
|
+
prerelease: false
|
94
|
+
version_requirements: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
43
99
|
- !ruby/object:Gem::Dependency
|
44
100
|
name: colorize
|
45
101
|
requirement: !ruby/object:Gem::Requirement
|
@@ -119,6 +175,9 @@ extensions: []
|
|
119
175
|
extra_rdoc_files: []
|
120
176
|
files:
|
121
177
|
- ".gitignore"
|
178
|
+
- ".overcommit.yml"
|
179
|
+
- ".rubocop.yml"
|
180
|
+
- ".travis.yml"
|
122
181
|
- Gemfile
|
123
182
|
- Gemfile.lock
|
124
183
|
- README.md
|
@@ -154,7 +213,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
154
213
|
version: '0'
|
155
214
|
requirements: []
|
156
215
|
rubyforge_project:
|
157
|
-
rubygems_version: 2.
|
216
|
+
rubygems_version: 2.6.8
|
158
217
|
signing_key:
|
159
218
|
specification_version: 4
|
160
219
|
summary: Tool for cloning all projects from a Stash server.
|