ghbulk 0.1.0

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
+ SHA256:
3
+ metadata.gz: eea0c66a66064566820f5426ce299cfc9d9de5d3e24bbb5b70f9df26564433c6
4
+ data.tar.gz: 0dfa890c22ac6edee1f46e48b7bbeacfaf8d64c9102c69784f79164207b052f9
5
+ SHA512:
6
+ metadata.gz: 4dfa54a871236983205198a902636952fe130543b25852af02cbe04a64a81b84169391d1af2ef12123151ceef8cc640ac98a1b547b23d259669a3deb453691cc
7
+ data.tar.gz: d35a779fb3c3139d6e2fb14cb9440a46d84dd8c38345ce32051b64f81afa683fb67907d9693adfb0cf28a0654dccae787bb93a05c19256ebd24612ef3d1e0f02
data/.gitattributes ADDED
@@ -0,0 +1,2 @@
1
+ # Just override github
2
+ * linguist-language=Ruby
data/.gitignore ADDED
@@ -0,0 +1,21 @@
1
+ .idea
2
+ ab-results*
3
+
4
+ /.bundle/
5
+ /.yardoc
6
+ /_yardoc/
7
+ /coverage/
8
+ /doc/
9
+ /pkg/
10
+ /spec/reports/
11
+ /tmp/
12
+
13
+ /Gemfile.lock
14
+
15
+ *.gem
16
+
17
+ # rspec failure tracking
18
+ .rspec_status
19
+
20
+ .lock
21
+
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,41 @@
1
+ Layout/IndentationWidth:
2
+ Width: 4
3
+
4
+ Layout/LineLength:
5
+ Enabled: false
6
+
7
+ Metrics/AbcSize:
8
+ Enabled: false
9
+
10
+ Metrics/BlockLength:
11
+ Enabled: false
12
+
13
+ Metrics/ClassLength:
14
+ Enabled: false
15
+
16
+ Metrics/CyclomaticComplexity:
17
+ Enabled: false
18
+
19
+ Metrics/MethodLength:
20
+ Enabled: false
21
+
22
+ Metrics/PerceivedComplexity:
23
+ Enabled: false
24
+
25
+ Style/FrozenStringLiteralComment:
26
+ Enabled: false
27
+
28
+ Style/HashSyntax:
29
+ Enabled: false
30
+
31
+ Style/RedundantParentheses:
32
+ Enabled: false
33
+
34
+ Style/RedundantBegin:
35
+ Enabled: false
36
+
37
+ Style/RedundantReturn:
38
+ Enabled: false
39
+
40
+ Style/SpecialGlobalVars:
41
+ Enabled: false
data/.travis.yml ADDED
@@ -0,0 +1,68 @@
1
+ matrix:
2
+ include:
3
+ - language: ruby
4
+ name: "Bundler (rvm 2.4 & bundler 1.17.3)"
5
+ rvm: 2.4
6
+ before_install:
7
+ - gem install bundler -v 1.17.3
8
+ - language: ruby
9
+ name: "Bundler (rvm 2.4 & bundler 2.0.1)"
10
+ rvm: 2.4
11
+ before_install:
12
+ - gem install bundler -v 2.0.1
13
+ - language: ruby
14
+ name: "Bundler (rvm 2.5 & bundler 2.0.1)"
15
+ rvm: 2.5
16
+ before_install:
17
+ - gem install bundler -v 2.0.1
18
+ - language: ruby
19
+ name: "Bundler (rvm 2.6 & bundler 2.0.1)"
20
+ rvm: 2.6
21
+ before_install:
22
+ - gem install bundler -v 2.0.1
23
+ - language: ruby
24
+ name: "Rubocop (rvm 2.4)"
25
+ env: SKIP_INTERPRETER=true
26
+ rvm: 2.4
27
+ before_install:
28
+ - git clone https://github.com/TravisToolbox/rubocop-travis.git
29
+ install:
30
+ - ./rubocop-travis/install.sh
31
+ script:
32
+ - ./rubocop-travis/scan.sh
33
+ - language: ruby
34
+ name: "Rubocop (rvm 2.5)"
35
+ env: SKIP_INTERPRETER=true
36
+ rvm: 2.5
37
+ before_install:
38
+ - git clone https://github.com/TravisToolbox/rubocop-travis.git
39
+ install:
40
+ - ./rubocop-travis/install.sh
41
+ script:
42
+ - ./rubocop-travis/scan.sh
43
+ - language: ruby
44
+ name: "Rubocop (rvm 2.6)"
45
+ env: SKIP_INTERPRETER=true
46
+ rvm: 2.6
47
+ before_install:
48
+ - git clone https://github.com/TravisToolbox/rubocop-travis.git
49
+ install:
50
+ - ./rubocop-travis/install.sh
51
+ script:
52
+ - ./rubocop-travis/scan.sh
53
+ - language: ruby
54
+ name: Link Checking (rvm 2.6)
55
+ rvm: 2.6
56
+ env:
57
+ - WHITELIST="https://github.com/WolfSoftware/ghbulk,https://rubygems.org,https://img.shields.io"
58
+ before_install:
59
+ - mkdir travis
60
+ - git clone https://github.com/TravisToolbox/awesomebot-travis.git travis/awesomebot
61
+ install:
62
+ - "./travis/awesomebot/install.sh"
63
+ script:
64
+ - "./travis/awesomebot/scan.sh"
65
+ notifications:
66
+ email: false
67
+ slack:
68
+ secure: pu6TcL6di8LeEkIQQcO1MO7BuuP6IFJlyNqkmYugoAWe9M0P1sJodEttch8k9uvxrjgzE3f7dFn2vhgLnU762OFuBF3pLmIeJbq/jtIRXu2Az65Yz7eCktFmLmBeziu5hAYgPxdAIYFvbg/uBMzHSuqFebwt/swBuCuVqiRarUV5K7k04797VT1L9aof0nJrxYSC0JKtJZDIbsyOJfMgObl5D9jNx5jDKOP3K5oyTWwhXTd/NxcoqC9rYYXP+Q/m3wo7X/GDfU6H4KM9Q3X1NknhJmVRbWfHNiVcHwG2FY6rJpqOyRZSJKDXEQlK7WjmgtKULRbpmq2DkRdC87HpT+yPT1wZIfG/7OiLw2z0Rz72e/DHD2AHummFfjJChgKa3HUAt0T6NeHgSiXgL6ElbQK+09R0Tnb3JpQsd7w49p+CyYDLtEAzWaNcG0Nnv5tVkKYsUyvK5434L79x3Y0zx8Q9lti9IcmiFZpv0ZpZKPy7Yb3ychip4Wf7Ag3yTU1cyMK6pnXve1jy3Rwc3FiCYZ6cyYW52E5GkZAci6/3USw+bwsvExgtrYcallcrLLgipzYbIutB8fpUWPTwFBnyYWbDEilRSNtdFfHBNIw6JTXCIVVFsvItmDQknwxkIkkYb4BMGoM0eXuhlpVD31X0otw9H7lQlIAtfZB6aVOooNY=
data/CHANGELOG.md ADDED
@@ -0,0 +1,20 @@
1
+ # ghbulk Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ For further info see our [changelogs](https://github.com/WolfSoftware/changelogs) guide.
8
+
9
+ ## [Unreleased]
10
+
11
+
12
+ ## [v1.0.0] - { release date }
13
+
14
+ * Initial Release ([@TGWolf][])
15
+
16
+
17
+ [@TGWolf]: https://github.com/TGWolf
18
+
19
+ [unreleased]: https://github.com/WolfSoftware/ghbulk/compare/v1.0.0...HEAD
20
+ [v1.0.0]: https://github.com/WolfSoftware/ghbulk/releases/tag/v1.0.0
data/CODEOWNERS ADDED
@@ -0,0 +1,7 @@
1
+ # The codeowners file:
2
+ #
3
+ # For more information please read: https://help.github.com/articles/about-codeowners/
4
+
5
+ # These owners will be the default owners for everything in
6
+ # the repo. Unless a later match takes precedence,
7
+ * @WolfSoftware/reviewers
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,3 @@
1
+ # Contributing
2
+
3
+ Please refer to the [contributing](https://github.com/WolfSoftware/contributing) documentation.
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in ghbulk.gemspec
6
+ gemspec
data/LICENSE.md ADDED
@@ -0,0 +1,25 @@
1
+ The MIT License (MIT)
2
+ =====================
3
+
4
+ Copyright © `2009-2020` `Wolf Software Limited`
5
+
6
+ Permission is hereby granted, free of charge, to any person
7
+ obtaining a copy of this software and associated documentation
8
+ files (the “Software”), to deal in the Software without
9
+ restriction, including without limitation the rights to use,
10
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ copies of the Software, and to permit persons to whom the
12
+ Software is furnished to do so, subject to the following
13
+ conditions:
14
+
15
+ The above copyright notice and this permission notice shall be
16
+ included in all copies or substantial portions of the Software.
17
+
18
+ THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND,
19
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
20
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
22
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
23
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25
+ OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,94 @@
1
+ [![Build Status](https://img.shields.io/travis/WolfSoftware/ghbulk/master?style=for-the-badge&logo=travis)](https://travis-ci.org/WolfSoftware/ghbulk)
2
+ [![Software License](https://img.shields.io/badge/license-MIT-blue?style=for-the-badge)](LICENSE.md)
3
+ [![Release](https://img.shields.io/github/release/WolfSoftware/ghbulk?color=blue&style=for-the-badge&logo=github&label=Latest%20Release)](https://github.com/WolfSoftware/c/releases/latest)
4
+ [![Last Release](https://img.shields.io/github/release-date/WolfSoftware/ghbulk?color=blue&style=for-the-badge&logo=github)](https://github.com/WolfSoftware/ghbulk/releases/latest)
5
+ [![Github commits (since latest release)](https://img.shields.io/github/commits-since/WolfSoftware/ghbulk/latest?color=blue&style=for-the-badge&logo=github)](https://github.com/WolfSoftware/ghbulk/commits)
6
+ [![Last Commit](https://img.shields.io/github/last-commit/WolfSoftware/ghbulk?color=blue&style=for-the-badge&logo=github)](https://github.com/WolfSoftware/ghbulk/commits/master)
7
+ [![Code Size](https://img.shields.io/github/languages/code-size/WolfSoftware/ghbulk?color=blue&style=for-the-badge&logo=github)](#)
8
+ [![Repo Size](https://img.shields.io/github/repo-size/WolfSoftware/ghbulk?color=blue&style=for-the-badge&logo=github)](#)
9
+ [![Contributors](https://img.shields.io/github/contributors/WolfSoftware/ghbulk?color=blue&style=for-the-badge&logo=github)](https://github.com/WolfSoftware/ghbulk/graphs/contributors)
10
+ [![WolfSoftware](https://img.shields.io/badge/Created%20By-Wolf%20Software%20Ltd.-blue?style=for-the-badge)](https://github.com/WolfSoftware)
11
+
12
+ # GHBulk
13
+
14
+ GHBulk is a GitHub bulk respostiory creator, it works by reading a yaml file which contains the repository information.
15
+
16
+ ## Installation
17
+
18
+ Installing GHBulk is very simple, just execute the following command.
19
+
20
+ ```
21
+ gem install ghbulk
22
+ ```
23
+
24
+ ## Command line usage
25
+
26
+ ```
27
+ Usage: ghbulk
28
+ -h, --help Display this screen
29
+ -f, --filename string The file where the repository details are stored.
30
+ -t, --token string The GitHub token to use.
31
+ ```
32
+
33
+ > Default filename is repositories.yml
34
+
35
+ ## File format
36
+
37
+ The file should contain valid YAML.
38
+
39
+ ### Example File
40
+
41
+ ```
42
+ repos:
43
+ - name: ghbulk
44
+ organization: WolfSoftware
45
+ description: A small gem for bulk creation of GitHub repositories
46
+ has_issues: true
47
+ has_projects: false
48
+ has_wiki: false
49
+ license_template: mit
50
+ ```
51
+
52
+ ### File options
53
+
54
+ | Name | Type | Default | Description |
55
+ | ---- |:----:|:-------:| ----------- |
56
+ | action | string | create | The action to be performed. |
57
+ | allow\_merge\_commit | boolean | true | Either true to allow merging pull requests with a merge commit, or false to prevent merging pull requests with merge commits. |
58
+ | allow\_rebase_merge | boolean | true | Either true to allow rebase-merging pull requests, or false to prevent rebase-merging. |
59
+ | allow\_squash\_merge | boolean | true | Either true to allow squash-merging pull requests, or false to prevent squash-merging. |
60
+ | auto\_init | boolean | false | Pass true to create an initial commit with empty README. |
61
+ | delete\_branch\_on\_merge | boolean | false | Either true to allow automatically deleting head branches when pull requests are merged, or false to prevent automatic deletion |
62
+ | description | string | | A short description of the repository. |
63
+ | gitignore\_template | string | | Desired language or platform .gitignore template to apply. Use the name of the template without the extension. For example, "Haskell". |
64
+ | has\_issues | boolean | true | Either true to enable issues for this repository or false to disable them. |
65
+ | has\_projects | boolean | true | Either true to enable projects for this repository or false to disable them. If you're creating a repository in an organization that has disabled repository projects, the default is false, and if you pass true, the API returns an error. |
66
+ | has\_wiki | boolean | true | Either true to enable the wiki for this repository or false to disable it. |
67
+ | homepage | string | | A URL with more information about the repository. |
68
+ | is\_template | boolean | false | Either true to make this repo available as a template repository or false to prevent it. |
69
+ | license_template | string | | Choose an open source license template that best suits your needs, and then use the license keyword as the license_template string. For example, "mit" or "mpl-2.0". |
70
+ | name | string | | The name of the repository. |
71
+ | private | boolean | false | Either true to create a private repository or false to create a public one. Creating private repositories requires a paid GitHub account. |
72
+ | team\_id | integer | | The id of the team that will be granted access to this repository. This is only valid when creating a repository in an organization. |
73
+
74
+
75
+ > The only 'required' parameter is 'name'.
76
+
77
+ ## Contributing to GHBulk
78
+
79
+ ### Setup
80
+
81
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
82
+
83
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will
84
+ create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
85
+
86
+ ### Testing
87
+
88
+ For local testing make sure that you run `bundle exec rspec spec` and then `rake install` to install the gem locally.
89
+
90
+ For further information please refer to the [contributing](https://github.com/WolfSoftware/contributing) documentation.
91
+
92
+ # To-Do List
93
+
94
+ - [ ] Better validation
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/VERSION.txt ADDED
@@ -0,0 +1 @@
1
+ v0.1.0
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'ghbulk'
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require 'irb'
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/exe/ghbulk ADDED
@@ -0,0 +1,83 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'optparse'
4
+ require 'ghbulk'
5
+
6
+ # -------------------------------------------------------------------------------- #
7
+ # Create Repositories #
8
+ # -------------------------------------------------------------------------------- #
9
+
10
+ def create_repositories(options)
11
+ begin
12
+ ghbulk = GHBulk.new
13
+ ghbulk.create_repositories(options[:token], options[:filename])
14
+ rescue StandardError => e
15
+ puts "Error: #{e}"
16
+ puts e.backtrace
17
+ exit(1)
18
+ end
19
+ end
20
+
21
+ # -------------------------------------------------------------------------------- #
22
+ # Process Arguments #
23
+ # -------------------------------------------------------------------------------- #
24
+ # This function will process the input from the command line and work out what it #
25
+ # is that the user wants to see. #
26
+ # #
27
+ # This is the main processing function where all the processing logic is handled. #
28
+ # -------------------------------------------------------------------------------- #
29
+
30
+ def process_arguments
31
+ options = { :filename => 'repositories.yml' }
32
+ # Enforce the presence of
33
+ mandatory = %I[filename token]
34
+
35
+ optparse = OptionParser.new do |opts|
36
+ opts.banner = "Usage: #{$PROGRAM_NAME}"
37
+
38
+ opts.on('-h', '--help', 'Display this screen') do
39
+ puts opts
40
+ exit(1)
41
+ end
42
+
43
+ opts.on('-f', '--filename string', 'The file where the repository details are stored. [default: repositories.yml]') do |filename|
44
+ options[:filename] = filename
45
+ end
46
+
47
+ opts.on('-t', '--token string', 'The GitHub token to use.') do |token|
48
+ options[:token] = token
49
+ end
50
+ end
51
+
52
+ begin
53
+ optparse.parse!
54
+ missing = mandatory.select { |param| options[param].nil? }
55
+ raise OptionParser::MissingArgument, (missing.join(', ')) unless missing.empty?
56
+ rescue OptionParser::InvalidOption, OptionParser::MissingArgument => e
57
+ puts e.to_s
58
+ puts optparse
59
+ exit
60
+ end
61
+
62
+ exit 0 if create_repositories(options)
63
+
64
+ exit 1
65
+ end
66
+
67
+ # -------------------------------------------------------------------------------- #
68
+ # Main() #
69
+ # -------------------------------------------------------------------------------- #
70
+ # The main function where all of the heavy lifting and script config is done. #
71
+ # -------------------------------------------------------------------------------- #
72
+
73
+ def main
74
+ process_arguments
75
+ end
76
+
77
+ main
78
+
79
+ # -------------------------------------------------------------------------------- #
80
+ # End of Script #
81
+ # -------------------------------------------------------------------------------- #
82
+ # This is the end - nothing more to see here. #
83
+ # -------------------------------------------------------------------------------- #
data/ghbulk.gemspec ADDED
@@ -0,0 +1,30 @@
1
+ lib = File.expand_path('lib', __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'ghbulk/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'ghbulk'
7
+ spec.version = GHBulk::VERSION
8
+ spec.authors = ['Tim Gurney aka Wolf']
9
+ spec.email = ['wolf@tgwolf.com']
10
+
11
+ spec.summary = 'A simple gem for bulk GitHub repository creation'
12
+ spec.description = 'A simple gem for bulk creation of GitHub Repositories.'
13
+ spec.homepage = 'https://github.com/WolfSoftware/ghbulk'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+
18
+ spec.bindir = 'exe'
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ['lib']
21
+
22
+ spec.add_development_dependency 'bundler', '>= 1.17', '< 3.0'
23
+ spec.add_development_dependency 'colorize', '~> 0.8.1'
24
+ spec.add_development_dependency 'octokit', '~> 4.15.0'
25
+ spec.add_development_dependency 'rake', '~> 10.0'
26
+ spec.add_development_dependency 'rspec', '~> 3.0'
27
+
28
+ spec.add_runtime_dependency 'colorize', '~> 0.8.1'
29
+ spec.add_runtime_dependency 'octokit', '~> 4.15.0'
30
+ end
data/lib/ghbulk.rb ADDED
@@ -0,0 +1,142 @@
1
+ require 'ghbulk/version'
2
+
3
+ require 'colorize'
4
+ require 'octokit'
5
+ require 'yaml'
6
+
7
+ #
8
+ # The class definition
9
+ #
10
+ class GHBulk
11
+ def abort_script(message)
12
+ puts message.colorize(:light_red)
13
+ abort
14
+ end
15
+
16
+ def show_error(message)
17
+ puts message.colorize(:light_red)
18
+ end
19
+
20
+ def show_warning(message)
21
+ puts message.colorize(:light_yellow)
22
+ end
23
+
24
+ def show_success(message)
25
+ puts message.colorize(:light_green)
26
+ end
27
+
28
+ def read_file(filename)
29
+ contents = nil
30
+
31
+ begin
32
+ File.open(filename, 'r') do |f|
33
+ contents = f.read
34
+ end
35
+ rescue SystemCallError
36
+ abort_script("Error reading file: #{filename} - Aborting")
37
+ end
38
+ return contents
39
+ end
40
+
41
+ def create_payload(repo)
42
+ payload = {}
43
+
44
+ payload[:allow_merge_commit] = repo['allow_merge_commit'] if repo.key?('allow_merge_commit')
45
+ payload[:allow_rebase_merge] = repo['allow_rebase_merge'] if repo.key?('allow_rebase_merge')
46
+ payload[:allow_squash_merge] = repo['allow_squash_merge'] if repo.key?('allow_squash_merge')
47
+ payload[:archived] = repo['archived'] if repo.key?('archived')
48
+ payload[:auto_init] = repo['auto_init'] if repo.key?('auto_init')
49
+ payload[:delete_branch_on_merge] = repo['delete_branch_on_merge'] if repo.key?('delete_branch_on_merge')
50
+ payload[:description] = repo['description'] if repo.key?('description')
51
+ payload[:gitignore_template] = repo['gitignore_template'] if repo.key?('gitignore_template')
52
+ payload[:has_issues] = repo['has_issues'] if repo.key?('has_issues')
53
+ payload[:has_projects] = repo['has_projects'] if repo.key?('has_projects')
54
+ payload[:has_wiki] = repo['has_wiki'] if repo.key?('has_wiki')
55
+ payload[:homepage] = repo['homepage'] if repo.key?('homepage')
56
+ payload[:is_template] = repo['is_template'] if repo.key?('is_template')
57
+ payload[:license_template] = repo['license_template'] if repo.key?('license_template')
58
+ payload[:organization] = repo['organization'] if repo.key?('organization')
59
+ payload[:private] = repo['private'] if repo.key?('private')
60
+ payload[:team_id] = repo['team_id'] if repo.key?('team_id')
61
+
62
+ return payload
63
+ end
64
+
65
+ def does_repo_exist(client, repo_name)
66
+ return client.repository?(repo_name)
67
+ end
68
+
69
+ def create_repository(client, repo_name, full_repo_name, payload)
70
+ if does_repo_exist(client, full_repo_name)
71
+ puts "Updating: #{full_repo_name}"
72
+ begin
73
+ client.update_repository(full_repo_name, payload)
74
+ rescue Octokit::UnprocessableEntity
75
+ show_error('Error updating repo')
76
+ else
77
+ show_success("Repo #{full_repo_name} has been updated")
78
+ end
79
+ else
80
+ puts "Creating: #{repo_name}"
81
+ begin
82
+ client.create_repository(repo_name, payload)
83
+ rescue Octokit::UnprocessableEntity
84
+ show_error('Error creating repo')
85
+ else
86
+ show_success("Repo #{repo_name} has been created")
87
+ end
88
+ end
89
+ end
90
+
91
+ def delete_repository(client, full_repo_name)
92
+ if does_repo_exist(client, full_repo_name)
93
+ client.delete_repository(full_repo_name)
94
+ show_error("Repository #{full_repo_name} has been deleted")
95
+ else
96
+ show_warning("Cannot delete - #{full_repo_name} doesn't exist")
97
+ end
98
+ end
99
+
100
+ def load_config(filename)
101
+ config = read_file(filename)
102
+
103
+ return if config.nil?
104
+
105
+ yaml_hash = YAML.safe_load(config)
106
+
107
+ abort('Repos not located - check file symtax and try again') unless yaml_hash.key?('repos')
108
+
109
+ return yaml_hash['repos']
110
+ end
111
+
112
+ def connect_client(gh_token)
113
+ return Octokit::Client.new(:access_token => gh_token)
114
+ end
115
+
116
+ def create_repositories(gh_token, filename)
117
+ repo_list = load_config(filename)
118
+
119
+ client = connect_client(gh_token)
120
+ begin
121
+ username = client.user.login
122
+ rescue Octokit::Error
123
+ abort('Inavlid Token')
124
+ end
125
+ repo_list.each do |repo|
126
+ payload = create_payload(repo)
127
+
128
+ repo_name = repo['name']
129
+ full_repo_name = if repo.key?('organization')
130
+ "#{repo['organization']}/#{repo['name']}"
131
+ else
132
+ "#{username}/#{repo['name']}"
133
+ end
134
+
135
+ if repo['action'] && repo['action'] == 'delete'
136
+ delete_repository(client, full_repo_name)
137
+ else
138
+ create_repository(client, repo_name, full_repo_name, payload)
139
+ end
140
+ end
141
+ end
142
+ end
@@ -0,0 +1,3 @@
1
+ class GHBulk
2
+ VERSION = '0.1.0'.freeze
3
+ end
@@ -0,0 +1,5 @@
1
+ RSpec.describe GHBulk do
2
+ it 'has a version number' do
3
+ expect(GHBulk::VERSION).not_to be nil
4
+ end
5
+ end
@@ -0,0 +1,14 @@
1
+ require 'bundler/setup'
2
+ require 'ghbulk'
3
+
4
+ RSpec.configure do |config|
5
+ # Enable flags like --only-failures and --next-failure
6
+ config.example_status_persistence_file_path = '.rspec_status'
7
+
8
+ # Disable RSpec exposing methods globally on `Module` and `main`
9
+ config.disable_monkey_patching!
10
+
11
+ config.expect_with :rspec do |c|
12
+ c.syntax = :expect
13
+ end
14
+ end
data/stale.yml ADDED
@@ -0,0 +1,17 @@
1
+ # Number of days of inactivity before an issue becomes stale
2
+ daysUntilStale: 60
3
+ # Number of days of inactivity before a stale issue is closed
4
+ daysUntilClose: 7
5
+ # Issues with these labels will never be considered stale
6
+ exemptLabels:
7
+ - pinned
8
+ - security
9
+ # Label to use when marking an issue as stale
10
+ staleLabel: wontfix
11
+ # Comment to post when marking an issue as stale. Set to `false` to disable
12
+ markComment: >
13
+ This issue has been automatically marked as stale because it has not had
14
+ recent activity. It will be closed if no further activity occurs. Thank you
15
+ for your contributions.
16
+ # Comment to post when closing a stale issue. Set to `false` to disable
17
+ closeComment: true
data/testing/ghbulk ADDED
@@ -0,0 +1,86 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.unshift('./lib')
4
+
5
+ require 'bundler/setup'
6
+ require 'optparse'
7
+ require 'ghbulk'
8
+
9
+ # -------------------------------------------------------------------------------- #
10
+ # Create Repositories #
11
+ # -------------------------------------------------------------------------------- #
12
+
13
+ def create_repositories(options)
14
+ begin
15
+ ghbulk = GHBulk.new
16
+ ghbulk.create_repositories(options[:token], options[:filename])
17
+ rescue StandardError => e
18
+ puts "Error: #{e}"
19
+ puts e.backtrace
20
+ exit(1)
21
+ end
22
+ end
23
+
24
+ # -------------------------------------------------------------------------------- #
25
+ # Process Arguments #
26
+ # -------------------------------------------------------------------------------- #
27
+ # This function will process the input from the command line and work out what it #
28
+ # is that the user wants to see. #
29
+ # #
30
+ # This is the main processing function where all the processing logic is handled. #
31
+ # -------------------------------------------------------------------------------- #
32
+
33
+ def process_arguments
34
+ options = { :filename => 'repositories.yml' }
35
+ # Enforce the presence of
36
+ mandatory = %I[filename token]
37
+
38
+ optparse = OptionParser.new do |opts|
39
+ opts.banner = "Usage: #{$PROGRAM_NAME}"
40
+
41
+ opts.on('-h', '--help', 'Display this screen') do
42
+ puts opts
43
+ exit(1)
44
+ end
45
+
46
+ opts.on('-f', '--filename string', 'The file where the repository details are stored. [default: repositories.yml]') do |filename|
47
+ options[:filename] = filename
48
+ end
49
+
50
+ opts.on('-t', '--token string', 'The GitHub token to use.') do |token|
51
+ options[:token] = token
52
+ end
53
+ end
54
+
55
+ begin
56
+ optparse.parse!
57
+ missing = mandatory.select { |param| options[param].nil? }
58
+ raise OptionParser::MissingArgument, (missing.join(', ')) unless missing.empty?
59
+ rescue OptionParser::InvalidOption, OptionParser::MissingArgument => e
60
+ puts e.to_s
61
+ puts optparse
62
+ exit
63
+ end
64
+
65
+ exit 0 if create_repositories(options)
66
+
67
+ exit 1
68
+ end
69
+
70
+ # -------------------------------------------------------------------------------- #
71
+ # Main() #
72
+ # -------------------------------------------------------------------------------- #
73
+ # The main function where all of the heavy lifting and script config is done. #
74
+ # -------------------------------------------------------------------------------- #
75
+
76
+ def main
77
+ process_arguments
78
+ end
79
+
80
+ main
81
+
82
+ # -------------------------------------------------------------------------------- #
83
+ # End of Script #
84
+ # -------------------------------------------------------------------------------- #
85
+ # This is the end - nothing more to see here. #
86
+ # -------------------------------------------------------------------------------- #
metadata ADDED
@@ -0,0 +1,174 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ghbulk
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Tim Gurney aka Wolf
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-02-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '1.17'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '3.0'
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '1.17'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '3.0'
33
+ - !ruby/object:Gem::Dependency
34
+ name: colorize
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: 0.8.1
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: 0.8.1
47
+ - !ruby/object:Gem::Dependency
48
+ name: octokit
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: 4.15.0
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: 4.15.0
61
+ - !ruby/object:Gem::Dependency
62
+ name: rake
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '10.0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '10.0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: rspec
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '3.0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '3.0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: colorize
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: 0.8.1
96
+ type: :runtime
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: 0.8.1
103
+ - !ruby/object:Gem::Dependency
104
+ name: octokit
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: 4.15.0
110
+ type: :runtime
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: 4.15.0
117
+ description: A simple gem for bulk creation of GitHub Repositories.
118
+ email:
119
+ - wolf@tgwolf.com
120
+ executables:
121
+ - ghbulk
122
+ extensions: []
123
+ extra_rdoc_files: []
124
+ files:
125
+ - ".gitattributes"
126
+ - ".gitignore"
127
+ - ".rspec"
128
+ - ".rspec_status"
129
+ - ".rubocop.yml"
130
+ - ".travis.yml"
131
+ - CHANGELOG.md
132
+ - CODEOWNERS
133
+ - CONTRIBUTING.md
134
+ - Gemfile
135
+ - Gemfile.lock
136
+ - LICENSE.md
137
+ - README.md
138
+ - Rakefile
139
+ - VERSION.txt
140
+ - bin/console
141
+ - bin/setup
142
+ - exe/ghbulk
143
+ - ghbulk.gemspec
144
+ - lib/ghbulk.rb
145
+ - lib/ghbulk/version.rb
146
+ - pkg/ghbulk-0.1.0.gem
147
+ - spec/ghbulk_spec.rb
148
+ - spec/spec_helper.rb
149
+ - stale.yml
150
+ - testing/ghbulk
151
+ homepage: https://github.com/WolfSoftware/ghbulk
152
+ licenses:
153
+ - MIT
154
+ metadata: {}
155
+ post_install_message:
156
+ rdoc_options: []
157
+ require_paths:
158
+ - lib
159
+ required_ruby_version: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - ">="
162
+ - !ruby/object:Gem::Version
163
+ version: '0'
164
+ required_rubygems_version: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - ">="
167
+ - !ruby/object:Gem::Version
168
+ version: '0'
169
+ requirements: []
170
+ rubygems_version: 3.1.2
171
+ signing_key:
172
+ specification_version: 4
173
+ summary: A simple gem for bulk GitHub repository creation
174
+ test_files: []