stash-clone-tool 1.0.0 → 1.0.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8a5b16ad7b2f2453bda2a6df8f5f598f28dfd62c
4
- data.tar.gz: 8f0051adefd7fd7d49ae4505379935807205b3cd
3
+ metadata.gz: 57e7254c897b6edd74c17ef9fe668fa7b429d4c5
4
+ data.tar.gz: 77b7e57fee79af28c6397993f2f63ed583650a84
5
5
  SHA512:
6
- metadata.gz: 17681e71932ff4700ac63cccddbaa697c8a3ca6833045abfa217bfead859335aae9a3176efa99a87dc1cb0207ddc047d196c719c35896429150c74201dfa6175
7
- data.tar.gz: 4c6a3764529733a25d2e27cd556a9c7f81256b7bdfceb85d161bca808d0c97516904760754e2ce90678798f5c7e6cc415c788d20ff166d5caa8f2000eb4b4ab4
6
+ metadata.gz: 20e0b175098d681c12d56a01fe9e31c82b5a7c34017139c00d0713031cc9eb47730def6c466092ae9ddd5a6cb983ed179797459b34d67eeb34433d20dce57161
7
+ data.tar.gz: f980a627bcaf9811c7bfe88350f4ce4cc2a5c76a93c3f16e6d3c0831c29a51d9057630a96ec4a2dccd23f5b4fdc4c412fe6293ec461c555a42fdcf4ce78d30b4
data/.gitignore CHANGED
@@ -5,3 +5,4 @@
5
5
  /pkg/
6
6
  /spec/reports/
7
7
  /tmp/
8
+ /*.gem
data/README.md ADDED
@@ -0,0 +1,18 @@
1
+ # Stash Clone Tool
2
+ Clones all repositories in all projects a user has access to from a stash server.
3
+
4
+ Simple to use, enter the stash url, username and password.
5
+
6
+ Feel free to contribute at https://github.com/paul-ridgway/stash-clone-tool.
7
+
8
+ # Usage
9
+ Install the stash clone tool:
10
+
11
+ gem install stash-clone-tool
12
+
13
+ You can now clone all repositories in all the projects you have access to:
14
+
15
+ $ stash-clone-tool -s http://stash.example.com -u stashuser -p letmein
16
+
17
+ Omit the password argument (-p) to enter your password via masked standard input.
18
+
data/bin/stash-clone-tool CHANGED
@@ -1,3 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
1
3
  require 'bundler/setup'
2
4
  require 'stash_clone_tool/stash_cloner'
3
5
  require 'optparse'
@@ -25,6 +27,22 @@ fail 'Must specify Stash username (-u).' if options[:username].nil?
25
27
  # Prompt for password if not provided on CLI
26
28
  options[:password] ||= ask('Password: ') { |q| q.echo = '*' }
27
29
 
28
- # TODO: Write CLI
30
+ @last_project = nil
29
31
  cloner = StashCloneTool::StashCloner.new(options[:stash_url], options[:username], options[:password], options[:directory])
30
- cloner.go
32
+
33
+ cloner.clone_stash do |on|
34
+ on.initialize_repository do |repository, folder|
35
+ if @last_project != repository.project
36
+ puts " - #{repository.project.name}...".light_yellow
37
+ @last_project = repository.project
38
+ end
39
+ puts " - #{repository.name}...".light_yellow
40
+ puts " Cloning ".light_blue + repository.clone_link(:ssh).light_white + " to ".light_blue + folder.light_white
41
+ end
42
+ on.success do |repository|
43
+ puts " Cloned".light_green
44
+ end
45
+ on.failure do |repository, message|
46
+ puts " #{message}".light_red
47
+ end
48
+ end
@@ -0,0 +1,12 @@
1
+ module StashCloneTool
2
+ class CloneLink
3
+
4
+ attr_reader :uri, :type
5
+
6
+ def initialize(link)
7
+ @uri = link['href']
8
+ @type = link['name'].to_sym
9
+ end
10
+
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ module StashCloneTool
2
+ class Project
3
+
4
+ attr_reader :name, :key, :repositories
5
+
6
+ def initialize(client, json)
7
+ @name = json['name']
8
+ @key = json['key']
9
+ @repositories = client.get_repositories(self)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,40 @@
1
+ require 'net/http'
2
+ require 'json'
3
+ require 'stash_clone_tool/project'
4
+ module StashCloneTool
5
+ class StashApiClient
6
+ include StashCloneTool
7
+
8
+ def initialize(stash_url, username, password)
9
+ @stash_url = stash_url
10
+ @username = username
11
+ @password = password
12
+ end
13
+
14
+ def projects
15
+ request('/rest/api/1.0/projects?limit=100')['values'].map { |json| Project.new(self, json) }
16
+ end
17
+
18
+ def get_repositories(project)
19
+ request("/rest/api/1.0/projects/#{project.key}/repos")['values'].map { |json| StashRepository.new(project, json) }
20
+ end
21
+
22
+ private
23
+
24
+ def request(url)
25
+ uri = URI("#{@stash_url}#{url}")
26
+ req = Net::HTTP::Get.new(uri.to_s)
27
+ req.basic_auth @username, @password
28
+ response = Net::HTTP.start(uri.hostname, uri.port, :use_ssl => uri.scheme == 'https') do |http|
29
+ http.request(req)
30
+ end
31
+ json = JSON.parse(response.body)
32
+ if json['errors']
33
+ error_msg = json['errors'].map { |e| e['message'] }.join('. ')
34
+ raise StashException.new(error_msg)
35
+ end
36
+ json
37
+ end
38
+
39
+ end
40
+ end
@@ -1,68 +1,36 @@
1
1
  # Stash Cloner
2
- require 'net/http'
3
- require 'json'
4
2
  require 'colorize'
3
+ require 'git'
4
+ require 'multiblock'
5
+ require 'stash_clone_tool/stash_api_client'
6
+ require 'stash_clone_tool/stash_repository'
5
7
  require 'stash_clone_tool/stash_exception'
6
8
  module StashCloneTool
9
+
7
10
  class StashCloner
11
+ include StashCloneTool
8
12
 
9
13
  def initialize(stash_url, username, password, directory)
10
- @stash_url = stash_url
11
- @username = username
12
- @password = password
14
+ @stash = StashApiClient.new(stash_url, username, password)
13
15
  @directory = directory
14
16
  end
15
17
 
16
- def go
17
- get_projects['values'].each do |project|
18
- process_project(project)
19
- end
20
- end
21
-
22
- private
23
-
24
- def process_project(prj)
25
- puts " - #{prj['name']}...".light_yellow
26
- project = request("/rest/api/1.0/projects/#{prj['key']}/repos")
27
- project['values'].each do |repo|
28
- process_repo(prj['key'], repo)
29
- end
30
- end
31
-
32
- def process_repo(project_key, repo)
33
- puts " - #{repo['name']}...".light_yellow
34
- clone_links = repo['links']['clone']
35
- clone_link = clone_links.select { |l| l['name'] == 'ssh' }.first['href']
36
- folder = File.join(@directory, project_key, repo['slug'])
37
- git_command = "git clone #{clone_link} #{folder}"
38
- puts " Cloning ".light_blue + clone_link.light_white + " to ".light_blue + folder.light_white
39
- if Dir.exists?(folder)
40
- puts " Target already exists".light_red
41
- else
42
- puts " #{git_command}".light_green
43
- puts
44
- system(git_command)
45
- puts
46
- end
47
- end
48
-
49
- def request(url)
50
- uri = URI("#{@stash_url}#{url}")
51
- req = Net::HTTP::Get.new(uri.to_s)
52
- req.basic_auth @username, @password
53
- response = Net::HTTP.start(uri.hostname, uri.port, :use_ssl => uri.scheme == 'https') do |http|
54
- http.request(req)
18
+ def clone_stash
19
+ wrapper = Multiblock.wrapper
20
+ yield(wrapper)
21
+ @stash.projects.each do |project|
22
+ project.repositories.each do |repository|
23
+ folder = File.join(@directory, project.key, repository.slug)
24
+ wrapper.call(:initialize_repository, repository, folder)
25
+ clone_link = repository.clone_link(:ssh)
26
+ if Dir.exists?(folder)
27
+ wrapper.call(:failure, repository, 'Target already exists')
28
+ else
29
+ Git.clone(clone_link, folder)
30
+ wrapper.call(:success, repository)
31
+ end
32
+ end
55
33
  end
56
- json = JSON.parse(response.body)
57
- if json['errors']
58
- error_msg = json['errors'].map { |e| e['message'] }.join('. ')
59
- raise StashException.new(error_msg)
60
- end
61
- json
62
- end
63
-
64
- def get_projects
65
- request('/rest/api/1.0/projects?limit=100')
66
34
  end
67
35
 
68
36
  end
@@ -0,0 +1,19 @@
1
+ require 'stash_clone_tool/clone_link'
2
+ module StashCloneTool
3
+ class StashRepository
4
+ include StashCloneTool
5
+ attr_reader :name, :slug, :project
6
+
7
+ def initialize(project, repo)
8
+ @name = repo['name']
9
+ @clone_links = repo['links']['clone'].map{ |link| CloneLink.new(link)}
10
+ @slug = repo['slug']
11
+ @project = project
12
+ end
13
+
14
+ def clone_link(type)
15
+ cl = @clone_links.select { |link| link.type == type }.first
16
+ cl.uri
17
+ end
18
+ end
19
+ end
@@ -1,4 +1,4 @@
1
1
  # Version
2
2
  module StashCloneTool
3
- VERSION = '1.0.0'
3
+ VERSION = '1.0.2'
4
4
  end
@@ -6,8 +6,8 @@ require 'stash_clone_tool/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = 'stash-clone-tool'
8
8
  spec.version = StashCloneTool::VERSION
9
- spec.authors = ['Paul Ridgway']
10
- spec.email = ['paul@thefloow.com']
9
+ spec.authors = ['Paul Ridgway', 'James Ridgway', 'Douglas Mills']
10
+ spec.email = ['paul@thefloow.com', 'james.ridgway@thefloow.com', 'douglas.mills@thefloow.com']
11
11
 
12
12
  spec.summary = 'Tool for cloning all projects from a Stash server.'
13
13
  spec.description = 'Tool for cloning all projects from a Stash server.'
@@ -16,7 +16,7 @@ Gem::Specification.new do |spec|
16
16
  # Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
17
17
  # delete this section to allow pushing this gem to any host.
18
18
  if spec.respond_to?(:metadata)
19
- spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
19
+ spec.metadata['allowed_push_host'] = "https://rubygems.org"
20
20
  else
21
21
  fail 'RubyGems 2.0 or newer is required to protect against public gem pushes.'
22
22
  end
@@ -30,4 +30,6 @@ Gem::Specification.new do |spec|
30
30
  spec.add_development_dependency 'rake', '~> 10.0'
31
31
  spec.add_dependency 'colorize'
32
32
  spec.add_dependency 'highline'
33
+ spec.add_dependency 'git'
34
+ spec.add_dependency 'multiblock'
33
35
  end
metadata CHANGED
@@ -1,112 +1,148 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stash-clone-tool
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Ridgway
8
+ - James Ridgway
9
+ - Douglas Mills
8
10
  autorequire:
9
11
  bindir: bin
10
12
  cert_chain: []
11
- date: 2015-08-12 00:00:00.000000000 Z
13
+ date: 2015-08-16 00:00:00.000000000 Z
12
14
  dependencies:
13
15
  - !ruby/object:Gem::Dependency
14
16
  name: bundler
15
17
  requirement: !ruby/object:Gem::Requirement
16
18
  requirements:
17
- - - ~>
19
+ - - "~>"
18
20
  - !ruby/object:Gem::Version
19
21
  version: '1.10'
20
22
  type: :development
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
23
25
  requirements:
24
- - - ~>
26
+ - - "~>"
25
27
  - !ruby/object:Gem::Version
26
28
  version: '1.10'
27
29
  - !ruby/object:Gem::Dependency
28
30
  name: rake
29
31
  requirement: !ruby/object:Gem::Requirement
30
32
  requirements:
31
- - - ~>
33
+ - - "~>"
32
34
  - !ruby/object:Gem::Version
33
35
  version: '10.0'
34
36
  type: :development
35
37
  prerelease: false
36
38
  version_requirements: !ruby/object:Gem::Requirement
37
39
  requirements:
38
- - - ~>
40
+ - - "~>"
39
41
  - !ruby/object:Gem::Version
40
42
  version: '10.0'
41
43
  - !ruby/object:Gem::Dependency
42
44
  name: colorize
43
45
  requirement: !ruby/object:Gem::Requirement
44
46
  requirements:
45
- - - '>='
47
+ - - ">="
46
48
  - !ruby/object:Gem::Version
47
49
  version: '0'
48
50
  type: :runtime
49
51
  prerelease: false
50
52
  version_requirements: !ruby/object:Gem::Requirement
51
53
  requirements:
52
- - - '>='
54
+ - - ">="
53
55
  - !ruby/object:Gem::Version
54
56
  version: '0'
55
57
  - !ruby/object:Gem::Dependency
56
58
  name: highline
57
59
  requirement: !ruby/object:Gem::Requirement
58
60
  requirements:
59
- - - '>='
61
+ - - ">="
60
62
  - !ruby/object:Gem::Version
61
63
  version: '0'
62
64
  type: :runtime
63
65
  prerelease: false
64
66
  version_requirements: !ruby/object:Gem::Requirement
65
67
  requirements:
66
- - - '>='
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ - !ruby/object:Gem::Dependency
72
+ name: git
73
+ requirement: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ type: :runtime
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: multiblock
87
+ requirement: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ type: :runtime
93
+ prerelease: false
94
+ version_requirements: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
67
97
  - !ruby/object:Gem::Version
68
98
  version: '0'
69
99
  description: Tool for cloning all projects from a Stash server.
70
100
  email:
71
101
  - paul@thefloow.com
102
+ - james.ridgway@thefloow.com
103
+ - douglas.mills@thefloow.com
72
104
  executables:
73
105
  - stash-clone-tool
74
106
  extensions: []
75
107
  extra_rdoc_files: []
76
108
  files:
77
- - .gitignore
109
+ - ".gitignore"
78
110
  - Gemfile
79
111
  - Gemfile.lock
80
- - README
112
+ - README.md
81
113
  - Rakefile
82
114
  - bin/console
83
115
  - bin/setup
84
116
  - bin/stash-clone-tool
117
+ - lib/stash_clone_tool/clone_link.rb
118
+ - lib/stash_clone_tool/project.rb
119
+ - lib/stash_clone_tool/stash_api_client.rb
85
120
  - lib/stash_clone_tool/stash_cloner.rb
86
121
  - lib/stash_clone_tool/stash_exception.rb
122
+ - lib/stash_clone_tool/stash_repository.rb
87
123
  - lib/stash_clone_tool/version.rb
88
124
  - stash-clone-tool.gemspec
89
125
  homepage: https://github.com/paul-ridgway/stash-clone-tool
90
126
  licenses: []
91
127
  metadata:
92
- allowed_push_host: 'TODO: Set to ''http://mygemserver.com'''
128
+ allowed_push_host: https://rubygems.org
93
129
  post_install_message:
94
130
  rdoc_options: []
95
131
  require_paths:
96
132
  - lib
97
133
  required_ruby_version: !ruby/object:Gem::Requirement
98
134
  requirements:
99
- - - '>='
135
+ - - ">="
100
136
  - !ruby/object:Gem::Version
101
137
  version: '0'
102
138
  required_rubygems_version: !ruby/object:Gem::Requirement
103
139
  requirements:
104
- - - '>='
140
+ - - ">="
105
141
  - !ruby/object:Gem::Version
106
142
  version: '0'
107
143
  requirements: []
108
144
  rubyforge_project:
109
- rubygems_version: 2.0.14
145
+ rubygems_version: 2.4.6
110
146
  signing_key:
111
147
  specification_version: 4
112
148
  summary: Tool for cloning all projects from a Stash server.
data/README DELETED
@@ -1,5 +0,0 @@
1
- Clones all repositories in all projects a user has access to from a stash server.
2
-
3
- Simple to use, enter the stash url, username and password.
4
-
5
- Feel free to contribute at https://github.com/paul-ridgway/stash-clone-tool.