github_copier 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f4f993114e8a40461a5937d56f84b580d62062fa
4
- data.tar.gz: 3dd6b2ef0b3d636610f30e2ce226d2e5c167b3a7
3
+ metadata.gz: f65a16009f22048a6d1efb93d734bd5c936e99ec
4
+ data.tar.gz: 2d6042100d7705c19166037abd9ada3eee891618
5
5
  SHA512:
6
- metadata.gz: ab4869300def7a4754ab104c1ae87cbffe02a83756bb402ed7123acf7c3d97b87e403933bc6c5e762af2021f257c53146ea123423c9643ab745a0a15c3c69a84
7
- data.tar.gz: 1422f1b597e56ce3fabafdde1fb3bf1ce678bfec128ee813922dd8d12cc543cbce7ff6f2155e95041ae918f1da758b3dd12cd5765090886b4de0d0820b7ce37b
6
+ metadata.gz: b45a11433cf42353184a92da6af9edb0dd983fa8ab88c1f824ab576e3df42f979b2f0d59db98877bffb1db3d1a916fee73c3b7a6f14c28df8bfbe62f7aff034c
7
+ data.tar.gz: 6c62d3a174b690fadd93d57f0c1928af00ed4031e63d9de9fe426ec6179567aa8bedb9dda55a38e9656276431eeb873d2dbea4eb812293a4c60dbdd1c700cf5d
data/CHANGELOG.md CHANGED
@@ -3,3 +3,9 @@
3
3
  #### 0.1.0
4
4
 
5
5
  - Initial release
6
+
7
+ #### 0.2.0
8
+ - Add option to group output by language by default
9
+ - Show list of repositories in the dry-run mode (--no-clone) option
10
+ - Improve the gemspec to add more context for the user
11
+ - Add some example to default option when the user type no argument
data/README.md CHANGED
@@ -38,18 +38,21 @@ You should see something like
38
38
  Usage: github_copier [options]
39
39
 
40
40
  Specific options:
41
- -b, --base-dir BASE_DIR Output directory where the repository will be cloned to
42
- -u, --user USER The github USER that will be cloned from
43
- -o, --org [ORG] The Github's organization name to be used if specified
44
- (where ORG is the organization that the user belongs to)
45
- -t, --oauth-token [OAUTH_TOKEN] The Github's oauth_token for authentication (required to list/clone private repositories)
46
- (where OAUTH_TOKEN is from the user's Github setting)
47
- -l, --language [LANG] Clone only project of type LANG
48
- (where LANG is main language as shown on Github)
41
+ -b, --base-dir BASE_DIR where BASE_DIR is the directory where the repositories will be cloned to (mandatory)
42
+ If not specified, current directory will be used
43
+ -u, --user USER The Github USER that will be cloned from (mandatory)
44
+ -o, --org [ORG] The Github's organization name to be used if specified (optional)
45
+ where ORG is the organization that the user belongs to
46
+ -t, --oauth-token [OAUTH_TOKEN] The Github's oauth_token for authentication (optional - only required to list/clone private repositories)
47
+ where OAUTH_TOKEN is from the user's Github setting
48
+ -l, --language [LANG] Clone only project of type LANG (optional)
49
+ where LANG is main language as shown on Github
49
50
  -a, --[no-]all-repos All repository only (optional)
50
- (default to original/non-fork repositories only)
51
+ default to original/non-forked repositories only
52
+ -g, --[no-]group-by-user Group the output by {BASE_DIR}/{USER}/{LANG}
53
+ default to {BASE_DIR}/{LANG}/{USER}
51
54
  -c, --[no-]clone Clone the repositories to the path specified (optional)
52
- (default to --no-clone e.g. dry-run only)
55
+ default to --no-clone e.g. dry-run only
53
56
 
54
57
  Common options:
55
58
  -h, --help Show this message
@@ -108,8 +111,7 @@ $github_copier --user awesome_user \
108
111
  - List repositories by a given user (dry-run)
109
112
 
110
113
  ```
111
- # Dry run option (list only)
112
- $github_copier -b ~/Desktop/projects -u littlebee -l CoffeeScript
114
+ $github_copier -b ~/Desktop/projects -u littlebee -l Ruby
113
115
  ------------------------------------------
114
116
  List of languages by littlebee
115
117
  Makefile
@@ -136,55 +138,52 @@ List of all repositories by littlebee
136
138
  14/15: littlebee/JavaScript/selectable-collection
137
139
  15/15: littlebee/Arduino/solar-sunflower
138
140
  ------------------------------------------
139
- Dry-run only, no action taken!
141
+ FYI: dry-run only, no action taken!!
142
+ Process 1 of 1 : git clone git@github.com:littlebee/got.git /Users/bchoomnuan/Desktop/projects/Ruby/littlebee/got
140
143
  ```
141
144
 
142
145
  - List and clone repositories for a given user (e.g. `--clone` option used)
143
146
 
144
147
  ```
145
- $github_copier git:(master) ✗ github_copier -b ~/Desktop/projects -u littlebee -l CoffeeScript -c
146
- ------------------------------------------
147
- List of languages by littlebee
148
- Makefile
149
- CoffeeScript
150
- Ruby
151
- JavaScript
152
- Arduino
153
- ------------------------------------------
154
- ------------------------------------------
155
- List of all repositories by littlebee
156
- 1/15: littlebee/Makefile/arduino-mk
157
- 2/15: littlebee/CoffeeScript/bumble-build
158
- 3/15: littlebee/CoffeeScript/bumble-docs
159
- 4/15: littlebee/CoffeeScript/bumble-strings
160
- 5/15: littlebee/CoffeeScript/bumble-test
161
- 6/15: littlebee/CoffeeScript/bumble-util
162
- 7/15: littlebee/CoffeeScript/git-log-utils
163
- 8/15: littlebee/CoffeeScript/git-status-utils
164
- 9/15: littlebee/CoffeeScript/git-time-machine
165
- 10/15: littlebee/CoffeeScript/notjs
166
- 11/15: littlebee/CoffeeScript/publish
167
- 12/15: littlebee/CoffeeScript/react-focus-trap-amd
168
- 13/15: littlebee/Ruby/got
169
- 14/15: littlebee/JavaScript/selectable-collection
170
- 15/15: littlebee/Arduino/solar-sunflower
171
- ------------------------------------------
172
- Process 1 of 11 => git clone git@github.com:littlebee/bumble-build.git /Users/bchoomnuan/Desktop/projects/littlebee/CoffeeScript/bumble-build
173
- Process 2 of 11 => git clone git@github.com:littlebee/bumble-docs.git /Users/bchoomnuan/Desktop/projects/littlebee/CoffeeScript/bumble-docs
174
- Process 3 of 11 => git clone git@github.com:littlebee/bumble-strings.git /Users/bchoomnuan/Desktop/projects/littlebee/CoffeeScript/bumble-strings
175
- Process 4 of 11 => git clone git@github.com:littlebee/bumble-test.git /Users/bchoomnuan/Desktop/projects/littlebee/CoffeeScript/bumble-test
176
- Process 5 of 11 => git clone git@github.com:littlebee/bumble-util.git /Users/bchoomnuan/Desktop/projects/littlebee/CoffeeScript/bumble-util
177
- Process 6 of 11 => git clone git@github.com:littlebee/git-log-utils.git /Users/bchoomnuan/Desktop/projects/littlebee/CoffeeScript/git-log-utils
178
- Process 7 of 11 => git clone git@github.com:littlebee/git-status-utils.git /Users/bchoomnuan/Desktop/projects/littlebee/CoffeeScript/git-status-utils
179
- Process 8 of 11 => git clone git@github.com:littlebee/git-time-machine.git /Users/bchoomnuan/Desktop/projects/littlebee/CoffeeScript/git-time-machine
180
- Process 9 of 11 => git clone git@github.com:littlebee/notjs.git /Users/bchoomnuan/Desktop/projects/littlebee/CoffeeScript/notjs
181
- Process 10 of 11 => git clone git@github.com:littlebee/publish.git /Users/bchoomnuan/Desktop/projects/littlebee/CoffeeScript/publish
182
- Process 11 of 11 => git clone git@github.com:littlebee/react-focus-trap-amd.git /Users/bchoomnuan/Desktop/projects/littlebee/CoffeeScript/react-focus-trap-amd
148
+ $github_copier -b ~/Desktop/projects -u littlebee -l Ruby -c
149
+ ------------------------------------------
150
+ List of languages by littlebee
151
+ Makefile
152
+ CoffeeScript
153
+ Ruby
154
+ JavaScript
155
+ Arduino
156
+ ------------------------------------------
157
+ ------------------------------------------
158
+ List of all repositories by littlebee
159
+ 1/15: littlebee/Makefile/arduino-mk
160
+ 2/15: littlebee/CoffeeScript/bumble-build
161
+ 3/15: littlebee/CoffeeScript/bumble-docs
162
+ 4/15: littlebee/CoffeeScript/bumble-strings
163
+ 5/15: littlebee/CoffeeScript/bumble-test
164
+ 6/15: littlebee/CoffeeScript/bumble-util
165
+ 7/15: littlebee/CoffeeScript/git-log-utils
166
+ 8/15: littlebee/CoffeeScript/git-status-utils
167
+ 9/15: littlebee/CoffeeScript/git-time-machine
168
+ 10/15: littlebee/CoffeeScript/notjs
169
+ 11/15: littlebee/CoffeeScript/publish
170
+ 12/15: littlebee/CoffeeScript/react-focus-trap-amd
171
+ 13/15: littlebee/Ruby/got
172
+ 14/15: littlebee/JavaScript/selectable-collection
173
+ 15/15: littlebee/Arduino/solar-sunflower
174
+ ------------------------------------------
175
+ Process 1 of 1 : git clone git@github.com:littlebee/got.git /Users/bchoomnuan/Desktop/projects/Ruby/littlebee/got
183
176
  ```
184
177
 
185
178
  ### TODO
186
179
 
187
180
  - Replace system call with the ruby library like [grit](https://github.com/mojombo/grit) or something similar
181
+ - Allow the `https` when performing the clone
182
+ - Implement the `FilenameCleaner.sanitize()` locally
183
+
184
+ ### Related Projects
185
+
186
+ - [github_cloner](https://github.com/nashby/github_cloner) by Vasiliy Ermolovich
188
187
 
189
188
  ### Contributing
190
189
 
data/bin/github_copier CHANGED
@@ -24,12 +24,13 @@ if options.language
24
24
  end
25
25
 
26
26
  args = {
27
- base_dir: options.base_dir, # mandatory
28
- oauth_token: options.oauth_token, # optional
29
- user: options.user, # optional if org is used?
30
- org: options.org, # optional if user is used?
31
- all_repos: options.all_repos, # optional
32
- clone_repos: options.clone_repos # optional
27
+ base_dir: options.base_dir, # mandatory
28
+ oauth_token: options.oauth_token, # optional required for private repos
29
+ user: options.user, # optional if org is used?
30
+ org: options.org, # optional if user is used?
31
+ all_repos: options.all_repos, # default to false
32
+ group_by_user: options.group_by_user, # default to false
33
+ clone_repos: options.clone_repos # default to false
33
34
  }
34
35
 
35
36
  repos = GithubCopier::GithubUtils.list_all(args)
@@ -53,14 +54,6 @@ if result && !result.empty?
53
54
  end
54
55
  puts "------------------------------------------"
55
56
 
56
- if args[:clone_repos]
57
- if language
58
- GithubCopier::GithubUtils.clone_all(result.keep_if { |i| i.split(File::SEPARATOR)[1] == language }, options.base_dir)
59
- else
60
- GithubCopier::GithubUtils.clone_all(result, options.base_dir)
61
- end
62
- else
63
- puts "Dry-run only, no action taken!"
64
- puts "------------------------------------------"
65
- end
57
+ result.keep_if { |i| i.split(File::SEPARATOR)[1] == language } if language
58
+ GithubCopier::GithubUtils.clone_all(result,args)
66
59
  end
@@ -8,7 +8,10 @@ Gem::Specification.new do |spec|
8
8
  spec.authors = ['Burin Choomnuan']
9
9
  spec.email = ['agilecreativity@gmail.com']
10
10
  spec.summary = %q{Clone/list Github repository for a given user/organization include private/public in one go}
11
- spec.description = %q{Clone/list Github repository for any user/organization including private repositories}
11
+ spec.description = %q(
12
+ Clone/list multiple Github repositories for a given user/organization including private repos easily.
13
+ e.g.$github_copier --base-dir ~/projects --user awesome_dev --language "Emacs Lisp" --clone
14
+ ).gsub(/^\s+/, " ")
12
15
  spec.homepage = 'https://github.com/agilecreativity/github_copier'
13
16
  spec.required_ruby_version = ">= 2.0.0"
14
17
  spec.license = 'MIT'
@@ -25,9 +28,9 @@ Gem::Specification.new do |spec|
25
28
  spec.require_paths = ['lib']
26
29
 
27
30
  spec.add_runtime_dependency 'github_api', '~> 0.13'
28
- spec.add_runtime_dependency 'awesome_print', '~> 1.6'
29
31
  spec.add_runtime_dependency 'filename_cleaner', '~> 0.4'
30
32
 
33
+ spec.add_development_dependency 'awesome_print', '~> 1.6'
31
34
  spec.add_development_dependency 'bundler', '~> 1.10'
32
35
  spec.add_development_dependency 'gem-ctags', '~> 1.0'
33
36
  spec.add_development_dependency 'guard', '~> 2.12'
data/lib/github_copier.rb CHANGED
@@ -3,5 +3,4 @@ require 'github_copier/opt_parser'
3
3
  require 'github_copier/github_copier'
4
4
  require 'github_api'
5
5
  require 'filename_cleaner'
6
- require 'ap'
7
6
  include GithubCopier
@@ -21,6 +21,7 @@ module GithubCopier
21
21
 
22
22
  # require this for only with org and with private repos
23
23
  args.merge!(oauth_token: args[:oauth_token]) if args[:oauth_token]
24
+ ##puts "FYI: your options #{args}"
24
25
 
25
26
  # Only required if we use oauth_token which allow use to list private repositories
26
27
  github = Github.new(args)
@@ -51,15 +52,14 @@ module GithubCopier
51
52
 
52
53
  # Clone list of repos of the following forms
53
54
  #
54
- # @params [Array<string>] projects list of project of the form '{org|user}/{language}/{repo_name}'
55
- # [ "magnars/clojure/project1", "magnars/clojure/tools.macro", ...]
56
- # @param [String] base_dir the base directory to save the clone result
57
- # default to current directory
58
- # The result will be saved to '/path/to/base_dir/{org_name}/{language}/{repo_name}'
59
- def clone_all(projects, base_dir = ".")
60
- base_path = File.expand_path(base_dir)
55
+ def clone_all(projects, args = {})
56
+ base_path = File.expand_path(args[:base_dir])
61
57
 
62
- FileUtils.mkdir_p(base_path)
58
+ if args[:clone_repos]
59
+ FileUtils.mkdir_p(base_path)
60
+ else
61
+ puts "FYI: dry-run only, no action taken!!" unless args[:clone_repos]
62
+ end
63
63
 
64
64
  projects.each_with_index do |project, i|
65
65
  org_name, language, repo_name = project.split(File::SEPARATOR)
@@ -67,10 +67,15 @@ module GithubCopier
67
67
  # Note: need to cleanup the language like 'Emacs Lisp' to 'Emacs_Lisp' or 'emacs_lisp'
68
68
  language = FilenameCleaner.sanitize(language, '_', false)
69
69
 
70
- output_path = [base_path, org_name, language, repo_name].join(File::SEPARATOR)
71
- puts "Process #{i+1} of #{projects.size} => git clone git@github.com:#{[org_name, repo_name].join(File::SEPARATOR)}.git #{output_path}"
72
- # TODO: may be allow `https` as well as `git`?
73
- output = system("git clone git@github.com:#{[org_name, repo_name].join(File::SEPARATOR)}.git #{output_path} 2> /dev/null")
70
+ if args[:group_by_user]
71
+ output_path = [base_path, org_name, language, repo_name].join(File::SEPARATOR)
72
+ else
73
+ output_path = [base_path, language, org_name, repo_name].join(File::SEPARATOR)
74
+ end
75
+ puts "Process #{i+1} of #{projects.size} : git clone git@github.com:#{[org_name, repo_name].join(File::SEPARATOR)}.git #{output_path}"
76
+ if args[:clone_repos]
77
+ system("git clone git@github.com:#{[org_name, repo_name].join(File::SEPARATOR)}.git #{output_path} 2> /dev/null")
78
+ end
74
79
  end
75
80
  end
76
81
 
@@ -5,14 +5,13 @@ module GithubCopier
5
5
  # Return a structure describing the options.
6
6
  def self.parse(args)
7
7
  # The options specified on the command line will be collected in *options*.
8
- # We set default values here.
9
8
  options = OpenStruct.new
10
9
 
11
- # The mandatory arguments
10
+ # Set the sensible default for the options explicitly
12
11
  options.base_dir = "."
13
-
14
- # The option arguments
15
- options.verbose = false
12
+ options.all_repos = false
13
+ options.group_by_user = false
14
+ options.clone_repos = false
16
15
 
17
16
  # The parser
18
17
  opt_parser = OptionParser.new do |opts|
@@ -23,44 +22,50 @@ module GithubCopier
23
22
 
24
23
  # Mandatory argument
25
24
  opts.on("-b", "--base-dir BASE_DIR",
26
- "Output directory where the repository will be cloned to") do |dir|
25
+ "where BASE_DIR is the directory where the repositories will be cloned to (mandatory)",
26
+ "If not specified, current directory will be used") do |dir|
27
27
  options.base_dir = dir
28
28
  end
29
29
 
30
30
  opts.on("-u", "--user USER",
31
- "The github USER that will be cloned from") do |user|
32
- # By default the id is assumed to be of a normal user not as organization
31
+ "The Github USER that will be cloned from (mandatory)") do |user|
33
32
  options.user = user
34
33
  end
35
34
 
36
35
  opts.on("-o", "--org [ORG]",
37
- "The Github's organization name to be used if specified",
38
- "(where ORG is the organization that the user belongs to)") do |org|
36
+ "The Github's organization name to be used if specified (optional)",
37
+ "where ORG is the organization that the user belongs to") do |org|
39
38
  options.org = org
40
39
  end
41
40
 
42
41
  opts.on("-t", "--oauth-token [OAUTH_TOKEN]",
43
- "The Github's oauth_token for authentication (required to list/clone private repositories)",
44
- "(where OAUTH_TOKEN is from the user's Github setting)") do |token|
42
+ "The Github's oauth_token for authentication (optional - only required to list/clone private repositories)",
43
+ "where OAUTH_TOKEN is from the user's Github setting") do |token|
45
44
  options.oauth_token = token
46
45
  end
47
46
 
48
47
  opts.on("-l", "--language [LANG]",
49
- "Clone only project of type LANG",
50
- "(where LANG is main language as shown on Github)") do |lang|
48
+ "Clone only project of type LANG (optional)",
49
+ "where LANG is main language as shown on Github") do |lang|
51
50
  options.language = lang
52
51
  end
53
52
 
54
53
  # Boolean switch.
55
54
  opts.on("-a", "--[no-]all-repos",
56
55
  "All repository only (optional)",
57
- "(default to original/non-fork repositories only)") do |a|
56
+ "default to original/non-forked repositories only") do |a|
58
57
  options.all_repos = a
59
58
  end
60
59
 
60
+ opts.on("-g", "--[no-]group-by-user",
61
+ "Group the output by {BASE_DIR}/{USER}/{LANG}",
62
+ "default to {BASE_DIR}/{LANG}/{USER}") do |gbu|
63
+ options.group_by_user = gbu
64
+ end
65
+
61
66
  opts.on( "-c", "--[no-]clone",
62
67
  "Clone the repositories to the path specified (optional)",
63
- "(default to --no-clone e.g. dry-run only)") do |c|
68
+ "default to --no-clone e.g. dry-run only") do |c|
64
69
  options.clone_repos = c
65
70
  end
66
71
 
@@ -68,9 +73,17 @@ module GithubCopier
68
73
  opts.separator "Common options:"
69
74
 
70
75
  # No argument, shows at tail. This will print an options summary.
71
- # Try it and see!
72
76
  opts.on_tail("-h", "--help", "Show this message") do
73
77
  puts opts
78
+ puts ""
79
+ puts "Example Usage:"
80
+ puts ""
81
+ puts "a) List the 'JavaScript' repositories for a given user (dry-run)"
82
+ puts "github_copier -b ~/Desktop/projects -u awesome_user -l JavaScript"
83
+ puts ""
84
+ puts "b) Clone the 'JavaScript' repositories for a given user (note: --clone or -c option)"
85
+ puts "github_copier -b ~/Desktop/projects -u awesome_user -l JavaScript -c"
86
+ puts ""
74
87
  exit
75
88
  end
76
89
  end
@@ -1,3 +1,3 @@
1
1
  module GithubCopier
2
- VERSION = '0.1.0'
2
+ VERSION = '0.2.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: github_copier
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Burin Choomnuan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-01 00:00:00.000000000 Z
11
+ date: 2016-04-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: github_api
@@ -25,33 +25,33 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0.13'
27
27
  - !ruby/object:Gem::Dependency
28
- name: awesome_print
28
+ name: filename_cleaner
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.6'
33
+ version: '0.4'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '1.6'
40
+ version: '0.4'
41
41
  - !ruby/object:Gem::Dependency
42
- name: filename_cleaner
42
+ name: awesome_print
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0.4'
48
- type: :runtime
47
+ version: '1.6'
48
+ type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0.4'
54
+ version: '1.6'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: bundler
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -206,8 +206,9 @@ dependencies:
206
206
  - - "~>"
207
207
  - !ruby/object:Gem::Version
208
208
  version: '0.8'
209
- description: Clone/list Github repository for any user/organization including private
210
- repositories
209
+ description: " Clone/list multiple Github repositories for a given user/organization
210
+ including private repos easily.\n e.g.$github_copier --base-dir ~/projects --user
211
+ awesome_dev --language \"Emacs Lisp\" --clone\n "
211
212
  email:
212
213
  - agilecreativity@gmail.com
213
214
  executables: