mkghrepo 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 61e3ebd4a68bfd47ba4e22e662fd79cd7bc2924b
4
+ data.tar.gz: 28333abba470929e76d353b0f2c466535b9a65f2
5
+ SHA512:
6
+ metadata.gz: ceb2dd85a69cbab50aea37804b2e9bba17505f905765dc9da980e92a5bd55968707c1f6b67db2e6c88e61ecad3378ea5ba53c8bedf46994c208db1cb6c3b17ad
7
+ data.tar.gz: aa9ef45714c0ba23c6d3dc49b39808f870145773116b91fe0c59588579e6fe0acf27a2e72ba78d71f726a3f5ea216561bcf8e229cd64d145191763a110e78dfe
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.test-file
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.1.4
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in mkghrepo.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,32 @@
1
+ # Mkghrepo
2
+ Quick and dirty tool to mass create repositories on Github.
3
+
4
+ To install: `gem install mkghrepo`
5
+
6
+ Help:
7
+
8
+ ```
9
+ Usage: mkghrepo [options] [<filename>]
10
+
11
+ Repository options:
12
+ -p, --private make the repository private
13
+ -t, --create-team creates a team called "<foo>-write", default is false
14
+ --token sets github token, defaults from GITHUB_TOKEN
15
+
16
+ Other options:
17
+ -h, --help print this help
18
+ -v, --version print the version
19
+ ```
20
+
21
+ `mkghrepo` accepts one repository per line as input, either stored in a file or passed through STDIN, the formats supported are:
22
+
23
+ `<org>/<repo> [<user1> <user2> ... <userN>]`
24
+
25
+ or
26
+
27
+ `<repo>`
28
+
29
+ If users are listed and the `-t` flag has been specified in the run, a team called `<repo>-write` will be created and those users added to it. The users must already be part of the organization or they will be skipped (a warning will be displayed).
30
+
31
+ ## Troubleshooting
32
+ By default, debug events are not logged, to see them, set `MKGHREPO_LOG` to `DEBUG` in your shell environment.
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require 'bundler/gem_tasks'
data/bin/mkghrepo ADDED
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env ruby
2
+ require 'mkghrepo'
3
+
4
+ # Instantiate new cli object.
5
+ cli = Mkghrepo::CLI.new
6
+
7
+ # Parse CLI options.
8
+ opts = cli.parse_options
9
+
10
+ # Log into Github and get a client
11
+ client = Mkghrepo::Repo.new(opts[:token])
12
+
13
+ # Main entrypoint into the actual program.
14
+ if opts.arguments.length < 1
15
+ # If no file arguments, start processing standard input.
16
+ cli.process_stdin(client, opts)
17
+ else
18
+ # If file argument is present, take the first one and parse it.
19
+ cli.process_file(opts.arguments[0], client, opts)
20
+ end
@@ -0,0 +1,184 @@
1
+ # encoding: UTF-8
2
+ require 'logger'
3
+ require 'slop'
4
+
5
+ module Mkghrepo
6
+ # CLI Class takes care of all the plubing related to the CLI commands and
7
+ # option parsing, consuming other classes to operate against Github Repos.
8
+ #
9
+ # Disabling ClassLength cop due to parse_options inflating the line numbers.
10
+ class CLI # rubocop:disable Metrics/ClassLength
11
+ def setup_logging(level)
12
+ start = Time.now
13
+ @logger = Logger.new(STDOUT)
14
+ @logger.level = level
15
+ @logger.datetime_format = '%Y-%m-%d %H:%M:%S'
16
+ @logger.formatter = proc do |severity, _datetime, _progname, msg|
17
+ now = Time.now
18
+ "[#{severity}][#{(now - start).round}] #{msg}\n"
19
+ end
20
+ end
21
+
22
+ def initialize
23
+ if ENV['MKGHREPO_LOG'].nil?
24
+ setup_logging(Logger::INFO)
25
+ else
26
+ setup_logging(Logger.const_get(ENV['MKGHREPO_LOG'].upcase))
27
+ end
28
+ end
29
+
30
+ # Parse CLI options with 'slop', disabling the MethodLength cop for this
31
+ # particular method as we can't really make it shorter.
32
+ def parse_options # rubocop:disable Metrics/MethodLength
33
+ opts = Slop.parse do |o|
34
+ o.banner = 'Usage: mkghrepo [options] <filename>'
35
+ o.separator ''
36
+ o.separator 'Repository options:'
37
+ o.bool '-p',
38
+ '--private',
39
+ 'make the repository private',
40
+ default: false
41
+ o.bool '-t',
42
+ '--create-team',
43
+ 'creates a team called "<foo>-write", default is false',
44
+ default: false
45
+ o.string '--token',
46
+ 'sets github token, defaults from GITHUB_TOKEN',
47
+ default: ENV['GITHUB_TOKEN']
48
+ o.separator ''
49
+ o.separator 'Other options:'
50
+ o.bool '-h', '--help', 'print this help'
51
+ o.on '-v', '--version', 'print the version' do
52
+ puts VERSION
53
+ exit
54
+ end
55
+ end
56
+
57
+ input_sanitization(opts)
58
+
59
+ opts
60
+ end
61
+
62
+ def input_sanitization(opts)
63
+ @logger.debug("Options: #{opts.to_hash} Arguments: #{opts.arguments}")
64
+
65
+ # if help is required, just print it and exit
66
+ if opts.help?
67
+ puts opts
68
+ exit
69
+ end
70
+
71
+ return unless opts[:token].nil?
72
+
73
+ # Fail if token is not available
74
+ @logger.fatal('Token is required')
75
+ puts opts
76
+ exit 1
77
+ end
78
+
79
+ def process_file(file, client, opts)
80
+ # We received one or more file arguments, let's open up the first one and
81
+ # start reading it.
82
+ @logger.debug("Opening #{file} for parsing...")
83
+ unless File.exist?(file)
84
+ # File not found, no point in continuing
85
+ @logger.fatal("File #{file} not found")
86
+ exit 1
87
+ end
88
+ File.open(file, 'r') do |f|
89
+ f.each_line do |a|
90
+ # Treat each line as a separate repo
91
+ process_lines(a, client, opts[:private], opts[:create_team])
92
+ end
93
+ end
94
+ end
95
+
96
+ def process_stdin(client, opts)
97
+ # We have no file arguments, start reading from STDIN and treat every line
98
+ # as a separate repo.
99
+ @logger.warn('No file arguments, reading from stdin...')
100
+ begin
101
+ STDIN.read.split("\n").each do |a|
102
+ # Treat each line as a separate repo
103
+ process_lines(a, client, opts[:private], opts[:create_team])
104
+ end
105
+ rescue Interrupt
106
+ # Trap a CTRL+C event and exit gracefully
107
+ @logger.warn('Exiting...')
108
+ exit 130
109
+ end
110
+ end
111
+
112
+ def process_lines(line, client, private, create_team)
113
+ # Split the line using space as delimiter, format is:
114
+ # <org>/<repo> <user1> <user2> ... <userN>
115
+ # or
116
+ # <repo>
117
+ @logger.debug("processing #{line.strip}")
118
+ matches = line.split(' ')
119
+ repo = matches[0]
120
+ create_repo(client, repo, private)
121
+
122
+ # If no users are specified or create_team was not enabled
123
+ return if matches.length < 2 || create_team == false
124
+ # create team and whatever
125
+ if repo.include? '/'
126
+ process_team(client, repo, matches[1..matches.count])
127
+ else
128
+ @logger.warn("Not creating Team for #{repo}, only orgs support teams")
129
+ end
130
+ end
131
+
132
+ def process_team(client, repo, users)
133
+ team = create_team(client, repo)
134
+ users.each do |user|
135
+ add_user_to_team(client, user, team.id)
136
+ end
137
+ end
138
+
139
+ def parse_error(object, e)
140
+ case
141
+ when !e.errors.first[:message].nil?
142
+ # Print a human readable error and carry on.
143
+ @logger.error("Can't process #{object}: #{e.errors.first[:message]}")
144
+ when e.errors.length > 0
145
+ # Can't find a human readable error, just dump the error hash and be
146
+ # done with it.
147
+ @logger.error("Can't process #{object}: #{e.errors}")
148
+ else
149
+ # Apparently some errors are not correctly formatted so we just dump
150
+ # the whole ugly message to screen.
151
+ @logger.error("Can't process #{object}: #{e.message}")
152
+ end
153
+ end
154
+
155
+ def create_repo(client, repo, private)
156
+ @logger.debug("Creating repo named: #{repo}")
157
+ client.create_repo(repo, private)
158
+ rescue Octokit::Error => e
159
+ parse_error(repo, e)
160
+ else
161
+ @logger.info("Succesfully created repository: #{repo}")
162
+ end
163
+
164
+ def create_team(client, repo)
165
+ team_name = repo.rpartition('/').last + '-write'
166
+ @logger.debug("Creating team named: #{team_name}")
167
+ team = client.create_team(repo, team_name, 'push')
168
+ rescue Octokit::Error => e
169
+ parse_error(team_name, e)
170
+ else
171
+ @logger.info("Succesfully created team '#{team_name}' for: #{repo}")
172
+ team
173
+ end
174
+
175
+ def add_user_to_team(client, user, team_id)
176
+ @logger.debug("Adding user #{user} to team id: #{team_id}")
177
+ client.add_user_to_team(user, team_id)
178
+ rescue Octokit::Error => e
179
+ parse_error(user, e)
180
+ else
181
+ @logger.info("Succesfully added user '#{user}' on team id: #{team_id}")
182
+ end
183
+ end
184
+ end
@@ -0,0 +1,42 @@
1
+ # encoding: UTF-8
2
+ require 'octokit'
3
+
4
+ module Mkghrepo
5
+ # Repo provides an interface to github repos
6
+ class Repo
7
+ def initialize(token)
8
+ # stack = Faraday::RackBuilder.new do |builder|
9
+ # builder.response :logger
10
+ # builder.use Octokit::Response::RaiseError
11
+ # builder.adapter Faraday.default_adapter
12
+ # end
13
+ # Octokit.middleware = stack
14
+ @client = Octokit::Client.new(access_token: token)
15
+ end
16
+
17
+ def create_repo(repo, private = false)
18
+ if repo.include? '/'
19
+ organization = repo.rpartition('/').first
20
+ repo = repo.rpartition('/').last
21
+ @client.create_repository(repo,
22
+ private: private,
23
+ organization: organization)
24
+ else
25
+ @client.create_repository(repo,
26
+ private: private)
27
+ end
28
+ end
29
+
30
+ def create_team(repo, team_name, permissions)
31
+ organization = repo.rpartition('/').first
32
+ @client.create_team(organization,
33
+ name: team_name,
34
+ repo_names: [repo],
35
+ permission: permissions)
36
+ end
37
+
38
+ def add_user_to_team(user, team_id)
39
+ @client.add_team_member(team_id, user)
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,5 @@
1
+ # encoding: UTF-8
2
+ # Set version for the Gem
3
+ module Mkghrepo
4
+ VERSION = '0.0.1'
5
+ end
data/lib/mkghrepo.rb ADDED
@@ -0,0 +1,4 @@
1
+ # encoding: UTF-8
2
+ require 'mkghrepo/cli'
3
+ require 'mkghrepo/repo'
4
+ require 'mkghrepo/version'
data/mkghrepo.gemspec ADDED
@@ -0,0 +1,28 @@
1
+ # encoding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'mkghrepo/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'mkghrepo'
8
+ spec.version = Mkghrepo::VERSION
9
+ spec.executables << 'mkghrepo'
10
+ spec.authors = ['Fabio Rapposelli']
11
+ spec.email = ['fabio@rapposelli.org']
12
+ spec.description = 'mkghrepo is a tool to facilitate mass repository creation'
13
+ spec.summary = 'mkghrepo is a tool to facilitate mass repository creation'
14
+ spec.homepage = 'https://github.com/frapposelli/mkghrepo'
15
+ spec.license = 'APL2'
16
+
17
+ spec.files = `git ls-files`.split($RS)
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.require_paths = ['lib']
21
+
22
+ spec.add_runtime_dependency 'octokit', '~> 4.0'
23
+ spec.add_runtime_dependency 'slop', '~> 4.0'
24
+
25
+ spec.add_development_dependency 'bundler', '~> 1.10'
26
+ spec.add_development_dependency 'rake'
27
+ spec.add_development_dependency 'rubocop'
28
+ end
metadata ADDED
@@ -0,0 +1,126 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mkghrepo
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Fabio Rapposelli
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-12-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: octokit
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: slop
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '4.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '4.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.10'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.10'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: mkghrepo is a tool to facilitate mass repository creation
84
+ email:
85
+ - fabio@rapposelli.org
86
+ executables:
87
+ - mkghrepo
88
+ extensions: []
89
+ extra_rdoc_files: []
90
+ files:
91
+ - ".gitignore"
92
+ - ".ruby-version"
93
+ - Gemfile
94
+ - README.md
95
+ - Rakefile
96
+ - bin/mkghrepo
97
+ - lib/mkghrepo.rb
98
+ - lib/mkghrepo/cli.rb
99
+ - lib/mkghrepo/repo.rb
100
+ - lib/mkghrepo/version.rb
101
+ - mkghrepo.gemspec
102
+ homepage: https://github.com/frapposelli/mkghrepo
103
+ licenses:
104
+ - APL2
105
+ metadata: {}
106
+ post_install_message:
107
+ rdoc_options: []
108
+ require_paths:
109
+ - lib
110
+ required_ruby_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ required_rubygems_version: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ requirements: []
121
+ rubyforge_project:
122
+ rubygems_version: 2.2.2
123
+ signing_key:
124
+ specification_version: 4
125
+ summary: mkghrepo is a tool to facilitate mass repository creation
126
+ test_files: []