git_cloner 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.coveralls.yml +1 -0
- data/.gitignore +0 -1
- data/.rubocop.yml +0 -2
- data/.travis.yml +8 -0
- data/Gemfile +3 -1
- data/README.md +76 -15
- data/Rakefile +8 -1
- data/bin/gitcloner +5 -2
- data/git_cloner.gemspec +29 -29
- data/lib/copier.rb +41 -0
- data/lib/git_cloner/version.rb +2 -1
- data/lib/git_cloner_core.rb +133 -124
- data/lib/git_cloner_dsl.rb +3 -2
- data/lib/git_cloner_dsl_model.rb +1 -1
- data/spec/copier_spec.rb +83 -0
- data/spec/git_cloner_core_spec.rb +195 -339
- data/spec/spec_helper.rb +9 -1
- metadata +55 -33
- data/rubocop-todo.yml +0 -48
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 60d71c9a9712cf1a9c2138219fa6980bdf9b986b
|
4
|
+
data.tar.gz: bc70e7ec2625f927b3ca2bbc907d14181276ca7c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e923a21ab30f06606788f93dd177538901d4b63c0f6abf4b5da9bfa8085c71c7d59598e4f3f6cd444cfadf4cc1e59e02c9c654d97c87ee885291d99c1c2355bf
|
7
|
+
data.tar.gz: b6271e55decb35a1f97d2db5eefbe7643ee296eedd108681315eba8f95dcc6f68143b07e160ba9abe9064885e8490fd3ef86cede117c7c85a9f900c753dfa6de
|
data/.coveralls.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
service_name: travis-ci
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,14 @@
|
|
1
1
|
# GitCloner
|
2
2
|
|
3
|
+
[![Build Status](https://travis-ci.org/tbpgr/git_cloner.png?branch=master)](https://travis-ci.org/tbpgr/git_cloner)
|
4
|
+
[![Coverage Status](https://coveralls.io/repos/tbpgr/git_cloner/badge.png)](https://coveralls.io/r/tbpgr/git_cloner)
|
5
|
+
[![Code Climate](https://codeclimate.com/github/tbpgr/git_cloner.png)](https://codeclimate.com/github/tbpgr/git_cloner)
|
6
|
+
|
3
7
|
GitCloner clone git repositoris from Gitclonerfile settings.
|
4
8
|
|
9
|
+
## Dependency
|
10
|
+
GitCloner depends on git. GitCloner use 'git clone' command.
|
11
|
+
|
5
12
|
## Installation
|
6
13
|
|
7
14
|
Add this line to your application's Gemfile:
|
@@ -16,7 +23,13 @@ Or install it yourself as:
|
|
16
23
|
|
17
24
|
$ gem install git_cloner
|
18
25
|
|
19
|
-
## CLI
|
26
|
+
## CLI Usage
|
27
|
+
|
28
|
+
### show help
|
29
|
+
|
30
|
+
~~~bash
|
31
|
+
gitcloner h
|
32
|
+
~~~
|
20
33
|
|
21
34
|
### generate Gitclonerfile
|
22
35
|
|
@@ -24,11 +37,18 @@ Or install it yourself as:
|
|
24
37
|
gitcloner init
|
25
38
|
~~~
|
26
39
|
|
40
|
+
or
|
41
|
+
|
42
|
+
~~~bash
|
43
|
+
gitcloner i
|
44
|
+
~~~
|
45
|
+
|
46
|
+
Gitclonerfile contents is...
|
47
|
+
|
27
48
|
~~~ruby
|
28
49
|
# encoding: utf-8
|
29
50
|
|
30
51
|
# default_output place
|
31
|
-
# default_output is required
|
32
52
|
# default_output allow only String
|
33
53
|
# default_output's default value => "./"
|
34
54
|
default_output "./"
|
@@ -72,31 +92,36 @@ repos [
|
|
72
92
|
]
|
73
93
|
~~~
|
74
94
|
|
75
|
-
### execute clone
|
95
|
+
### execute clone repositories
|
76
96
|
|
77
97
|
~~~bash
|
78
98
|
gitcloner clone
|
79
99
|
~~~
|
80
100
|
|
101
|
+
or
|
102
|
+
|
103
|
+
~~~bash
|
104
|
+
gitcloner c
|
105
|
+
~~~
|
106
|
+
|
81
107
|
### confirm clone result
|
82
108
|
|
83
109
|
~~~bash
|
84
110
|
$ tree
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
└many files...
|
111
|
+
┠helper
|
112
|
+
┃ ┗spec_helper.rb
|
113
|
+
┠rspec_piccolo
|
114
|
+
┃ ┗many files...
|
115
|
+
┠sample
|
116
|
+
┃ ┠rspec_piccolo_spec.rb
|
117
|
+
┃ ┗spec_helper.rb
|
118
|
+
┠tmp
|
119
|
+
┃ ┗rspec_piccolo
|
120
|
+
┗tbpgr_utils
|
96
121
|
~~~
|
97
122
|
|
98
123
|
## Direct Usage
|
99
|
-
if you want to use GitCloner directry, you can use like this sample.
|
124
|
+
if you want to use GitCloner directry in your ruby logic, you can use like this sample.
|
100
125
|
|
101
126
|
~~~ruby
|
102
127
|
require 'git_cloner_core'
|
@@ -120,7 +145,43 @@ repos = [
|
|
120
145
|
GitCloner::Core.new.clone default_output, repos
|
121
146
|
~~~
|
122
147
|
|
148
|
+
## Sample Usage
|
149
|
+
You want to copy chef cookbooks(cookbook1, cookbook2) to cookbooks directory.
|
150
|
+
|
151
|
+
generate Gitclonerfile
|
152
|
+
|
153
|
+
~~~
|
154
|
+
gitcloner i
|
155
|
+
~~~
|
156
|
+
|
157
|
+
edit Gitclonerfile
|
158
|
+
|
159
|
+
~~~ruby
|
160
|
+
# encoding: utf-8
|
161
|
+
default_output "./cookbooks"
|
162
|
+
repos [
|
163
|
+
{place: "https://github.com/some_account/cookbook1.git"},
|
164
|
+
{place: "https://github.com/some_account/cookbook2.git"},
|
165
|
+
]
|
166
|
+
~~~
|
167
|
+
|
168
|
+
execute clone repositories
|
169
|
+
|
170
|
+
~~~bash
|
171
|
+
gitcloner c
|
172
|
+
~~~
|
173
|
+
|
174
|
+
confirm results
|
175
|
+
|
176
|
+
~~~
|
177
|
+
$ tree
|
178
|
+
┗cookbooks
|
179
|
+
┠cookbook1
|
180
|
+
┗cookbook2
|
181
|
+
~~~
|
182
|
+
|
123
183
|
## History
|
184
|
+
* version 0.0.4 : fix exit status.
|
124
185
|
* version 0.0.3 : enable direct call clone.
|
125
186
|
* version 0.0.2 : add files,directories copy.
|
126
187
|
* version 0.0.1 : first release.
|
data/Rakefile
CHANGED
data/bin/gitcloner
CHANGED
@@ -11,9 +11,12 @@ module GitCloner
|
|
11
11
|
class_option :help, type: :boolean, aliases: '-h', desc: 'help message.'
|
12
12
|
class_option :version, type: :boolean, desc: 'version'
|
13
13
|
|
14
|
-
desc 'clone', 'clone git repositories from Gitclonerfile'
|
14
|
+
desc 'clone', 'clone git repositories from Gitclonerfile settings'
|
15
15
|
def clone
|
16
|
-
GitCloner::Core.new.
|
16
|
+
GitCloner::Core.new.clone
|
17
|
+
rescue => e
|
18
|
+
warn(e.message)
|
19
|
+
exit(false)
|
17
20
|
end
|
18
21
|
|
19
22
|
desc 'init', 'generate Gitclonerfile'
|
data/git_cloner.gemspec
CHANGED
@@ -1,29 +1,29 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
lib = File.expand_path('../lib', __FILE__)
|
3
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require 'git_cloner/version'
|
5
|
-
|
6
|
-
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
8
|
-
spec.version = GitCloner::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
11
|
-
spec.description = %q
|
12
|
-
spec.summary = %q
|
13
|
-
spec.homepage =
|
14
|
-
spec.license =
|
15
|
-
|
16
|
-
spec.files = `git ls-files`.split(
|
17
|
-
spec.executables = spec.files.grep(
|
18
|
-
spec.test_files = spec.files.grep(
|
19
|
-
spec.require_paths = [
|
20
|
-
|
21
|
-
spec.add_runtime_dependency
|
22
|
-
spec.add_runtime_dependency
|
23
|
-
spec.add_runtime_dependency
|
24
|
-
|
25
|
-
spec.add_development_dependency
|
26
|
-
spec.add_development_dependency
|
27
|
-
spec.add_development_dependency
|
28
|
-
spec.add_development_dependency
|
29
|
-
end
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'git_cloner/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'git_cloner'
|
8
|
+
spec.version = GitCloner::VERSION
|
9
|
+
spec.authors = ['tbpgr']
|
10
|
+
spec.email = ['tbpgr@tbpgr.jp']
|
11
|
+
spec.description = %q(GitCloner clone git repositoris from Gitclonerfile settings)
|
12
|
+
spec.summary = %q(GitCloner clone git repositoris from Gitclonerfile settings)
|
13
|
+
spec.homepage = 'https://github.com/tbpgr/git_cloner'
|
14
|
+
spec.license = 'MIT'
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
17
|
+
spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(/^(test|spec|features)\//)
|
19
|
+
spec.require_paths = ['lib']
|
20
|
+
|
21
|
+
spec.add_runtime_dependency 'activesupport', '~> 4.0.1'
|
22
|
+
spec.add_runtime_dependency 'activemodel', '~> 4.0.2'
|
23
|
+
spec.add_runtime_dependency 'thor', '~> 0.18.1'
|
24
|
+
|
25
|
+
spec.add_development_dependency 'bundler', '~> 1.3'
|
26
|
+
spec.add_development_dependency 'rake'
|
27
|
+
spec.add_development_dependency 'rspec', '~> 2.14.1'
|
28
|
+
spec.add_development_dependency 'simplecov', '~> 0.8.2'
|
29
|
+
end
|
data/lib/copier.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module GitCloner
|
4
|
+
# Copier
|
5
|
+
class Copier
|
6
|
+
class << self
|
7
|
+
def copy(copies)
|
8
|
+
return if copies.nil?
|
9
|
+
copies.each { |copy_dir|copy_target(copy_dir) }
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def copy_target(copy_dir)
|
15
|
+
check_copy_dir_from(copy_dir[:from])
|
16
|
+
check_copy_dir_to(copy_dir[:to])
|
17
|
+
make_copy_dir_if_not_exists(copy_dir[:to])
|
18
|
+
copy_target_files(copy_dir[:from], copy_dir[:to])
|
19
|
+
end
|
20
|
+
|
21
|
+
def check_copy_dir_from(from)
|
22
|
+
return if from
|
23
|
+
fail ArgumentError, 'invalid repos. copies must have from'
|
24
|
+
end
|
25
|
+
|
26
|
+
def check_copy_dir_to(to)
|
27
|
+
return if to
|
28
|
+
fail ArgumentError, 'invalid repos. copies must have from'
|
29
|
+
end
|
30
|
+
|
31
|
+
def make_copy_dir_if_not_exists(to)
|
32
|
+
return if Dir.exist?(File.dirname(to))
|
33
|
+
FileUtils.mkdir_p(to)
|
34
|
+
end
|
35
|
+
|
36
|
+
def copy_target_files(from, to)
|
37
|
+
FileUtils.cp_r(from, to)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/git_cloner/version.rb
CHANGED
data/lib/git_cloner_core.rb
CHANGED
@@ -1,124 +1,133 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require 'git_cloner_dsl'
|
3
|
-
require
|
4
|
-
require 'fileutils'
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
# default_output
|
15
|
-
# default_output allow only String
|
16
|
-
# default_output's default value => "./"
|
17
|
-
default_output "./"
|
18
|
-
|
19
|
-
# git repositries
|
20
|
-
# repos allow only Array(in Array, Hash[:place, :output, :copies])
|
21
|
-
# copies is option.
|
22
|
-
# copies must have Array[Hash{:from, :to}].
|
23
|
-
# you can copy files or directories.
|
24
|
-
# repos's default value => []
|
25
|
-
repos [
|
26
|
-
{
|
27
|
-
place: 'https://github.com/tbpgr/rspec_piccolo.git',
|
28
|
-
output: './tmp',
|
29
|
-
copies: [
|
30
|
-
{from: "./tmp/rspec_piccolo/lib/rspec_piccolo", to: "./"},
|
31
|
-
{from: "./tmp/rspec_piccolo/spec", to: "./sample"}
|
32
|
-
]
|
33
|
-
}
|
34
|
-
]
|
35
|
-
EOS
|
36
|
-
|
37
|
-
|
38
|
-
def init
|
39
|
-
File.open(GIT_CLONER_FILE,
|
40
|
-
end
|
41
|
-
|
42
|
-
|
43
|
-
def
|
44
|
-
|
45
|
-
|
46
|
-
default_output =
|
47
|
-
|
48
|
-
|
49
|
-
end
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'git_cloner_dsl'
|
3
|
+
require 'uri'
|
4
|
+
require 'fileutils'
|
5
|
+
require 'copier'
|
6
|
+
|
7
|
+
module GitCloner
|
8
|
+
# GitCloner Core
|
9
|
+
class Core
|
10
|
+
GIT_CLONER_FILE = 'Gitclonerfile'
|
11
|
+
GIT_CLONER_TEMPLATE = <<-EOS
|
12
|
+
# encoding: utf-8
|
13
|
+
|
14
|
+
# default_output place
|
15
|
+
# default_output allow only String
|
16
|
+
# default_output's default value => "./"
|
17
|
+
default_output "./"
|
18
|
+
|
19
|
+
# git repositries
|
20
|
+
# repos allow only Array(in Array, Hash[:place, :output, :copies])
|
21
|
+
# copies is option.
|
22
|
+
# copies must have Array[Hash{:from, :to}].
|
23
|
+
# you can copy files or directories.
|
24
|
+
# repos's default value => []
|
25
|
+
repos [
|
26
|
+
{
|
27
|
+
place: 'https://github.com/tbpgr/rspec_piccolo.git',
|
28
|
+
output: './tmp',
|
29
|
+
copies: [
|
30
|
+
{from: "./tmp/rspec_piccolo/lib/rspec_piccolo", to: "./"},
|
31
|
+
{from: "./tmp/rspec_piccolo/spec", to: "./sample"}
|
32
|
+
]
|
33
|
+
}
|
34
|
+
]
|
35
|
+
EOS
|
36
|
+
|
37
|
+
# == generate Gitclonerfile to current directory.
|
38
|
+
def init
|
39
|
+
File.open(GIT_CLONER_FILE, 'w') { |f|f.puts(GIT_CLONER_TEMPLATE) }
|
40
|
+
end
|
41
|
+
|
42
|
+
# == clone git repositories
|
43
|
+
def clone
|
44
|
+
settings = read_settings
|
45
|
+
base_dir = Dir.pwd
|
46
|
+
default_output = settings.default_output
|
47
|
+
repos = settings.repos
|
48
|
+
clone_repositories(default_output, repos, base_dir)
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def read_settings
|
54
|
+
src = read_dsl
|
55
|
+
dsl = GitCloner::Dsl.new
|
56
|
+
dsl.instance_eval src
|
57
|
+
dsl.git_cloner
|
58
|
+
end
|
59
|
+
|
60
|
+
def read_dsl
|
61
|
+
File.open(GIT_CLONER_FILE) { |f|f.read }
|
62
|
+
end
|
63
|
+
|
64
|
+
def clone_repositories(default_output, repos, base_dir)
|
65
|
+
check_repos(repos)
|
66
|
+
repos.each { |repo|clone_repository(default_output, repo, base_dir) }
|
67
|
+
end
|
68
|
+
|
69
|
+
def check_repos(repos)
|
70
|
+
return if repos.is_a? Array
|
71
|
+
fail ArgumentError, 'invalid repos. repos must be Array.'
|
72
|
+
end
|
73
|
+
|
74
|
+
def clone_repository(default_output, repo, base_dir)
|
75
|
+
check_repos_hash(repo)
|
76
|
+
check_repos_hash_key(repo)
|
77
|
+
output_dir = get_output_dir(repo[:output], default_output)
|
78
|
+
make_output_dir(output_dir)
|
79
|
+
move_to_output_dir(output_dir)
|
80
|
+
execute_git_clone(repo[:place])
|
81
|
+
back_to_base_dir(base_dir)
|
82
|
+
Copier.copy(repo[:copies])
|
83
|
+
end
|
84
|
+
|
85
|
+
def check_repos_hash(repo)
|
86
|
+
return if repo.is_a?(Hash)
|
87
|
+
fail ArgumentError, 'invalid repos. repos-Array must have Hash'
|
88
|
+
end
|
89
|
+
|
90
|
+
def check_repos_hash_key(repo)
|
91
|
+
return if repo.key?(:place)
|
92
|
+
fail ArgumentError, 'invalid key. Hash must contain :place key'
|
93
|
+
end
|
94
|
+
|
95
|
+
def get_repo_name(place)
|
96
|
+
uri = URI(place)
|
97
|
+
uri.path.gsub(/.*\//, '').gsub('.git', '')
|
98
|
+
end
|
99
|
+
|
100
|
+
def get_output_dir(output, default_output)
|
101
|
+
output.nil? ? default_output : output
|
102
|
+
end
|
103
|
+
|
104
|
+
def make_output_dir(output_dir)
|
105
|
+
FileUtils.mkdir_p(output_dir) unless Dir.exist?(output_dir)
|
106
|
+
end
|
107
|
+
|
108
|
+
def move_to_output_dir(output_dir)
|
109
|
+
Dir.chdir(output_dir)
|
110
|
+
end
|
111
|
+
|
112
|
+
def execute_git_clone(url)
|
113
|
+
result = system("git clone #{url} --depth=1")
|
114
|
+
repo_name = get_repo_name(url)
|
115
|
+
remove_dot_git_directory repo_name
|
116
|
+
show_result_message(result, repo_name)
|
117
|
+
end
|
118
|
+
|
119
|
+
def back_to_base_dir(base_dir)
|
120
|
+
Dir.chdir(base_dir)
|
121
|
+
end
|
122
|
+
|
123
|
+
def remove_dot_git_directory(repo_name)
|
124
|
+
Dir.chdir("./#{repo_name}")
|
125
|
+
FileUtils.rm_rf('.git') if Dir.exist?('.git')
|
126
|
+
end
|
127
|
+
|
128
|
+
def show_result_message(result, repo_name)
|
129
|
+
result_msg = result ? 'complete' : 'fail'
|
130
|
+
puts("clone #{Dir.pwd}/#{repo_name} #{result_msg}")
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|