github_copier 0.1.0 → 0.2.0

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: 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: