publicity 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
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
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in deanswerify.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Nathan Houle
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,22 @@
1
+ # Publicity
2
+
3
+ Publicize all your (private) forks of Hack Reactor projects.
4
+
5
+ ## Installation
6
+
7
+ Install it by executing:
8
+
9
+ $ gem install publicity
10
+
11
+ ## Usage
12
+
13
+ Execute `publicity` from any directory and follow the command-line prompt,
14
+ answering any questions until everything is done.
15
+
16
+ ## Contributing
17
+
18
+ 1. Fork it
19
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
20
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
21
+ 4. Push to the branch (`git push origin my-new-feature`)
22
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/bin/publicity ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ # Command-line parser for Publicity.
3
+
4
+ THIS_FILE = File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__
5
+ require File.dirname(THIS_FILE) + '/../lib/publicity'
6
+
7
+ opts = Publicity::Exec.new(ARGV)
8
+ opts.parse!
@@ -0,0 +1,3 @@
1
+ module Publicity
2
+ HOST_IS_OSX = RbConfig::CONFIG['host_os'] =~ /darwin/
3
+ end
@@ -0,0 +1,302 @@
1
+ require 'andand'
2
+ require 'fileutils'
3
+ require 'highline/import'
4
+ require 'github_api'
5
+ require 'rugged'
6
+ require 'keychain'
7
+
8
+ module Publicity
9
+ class Main
10
+ def initialize
11
+ @credential_helper = `git config --global credential.helper`.delete("\n")
12
+ @github = nil
13
+ @username = nil
14
+ @auth_type = nil
15
+
16
+ prompt
17
+ end
18
+
19
+ def prompt
20
+ puts <<EOS
21
+ PUBLICITY
22
+ =========
23
+
24
+ Hello! I'm a script that will publicize all of your forked repositories.
25
+
26
+ EOS
27
+ ask("Press enter when you're ready.") { |q| q.echo = '' }
28
+
29
+ # Clear the screen
30
+ print "\e[2J\e[f"
31
+
32
+ puts "I'll need your GitHub credentials to get started.", ''
33
+ get_github_credentials!
34
+
35
+ puts <<EOS
36
+
37
+ Thanks.
38
+
39
+ One more thing--this script will create a new readme for each of your projects.
40
+ The readme will point to a project you think shows off your skills; you should
41
+ pick a project you're proud of, and you should avoid picking a group project.
42
+
43
+ EOS
44
+ project = get_project_info
45
+
46
+ # Gather a list of the user's repos which are forked from the hackreactor
47
+ # organization and are private. Ask the user which of those repos they'd like
48
+ # to publicize.
49
+ remote_repos = Array.new
50
+ private_repos = get_private_repos
51
+ if private_repos.length === 0
52
+ puts "Sorry, doesn't look like you have any private forks. Exiting..."
53
+ exit 0
54
+ end
55
+
56
+ private_repos.each do |private_repo|
57
+ response = ask("Would you like to publicize the #{private_repo[:name]} repository? (y/n): ") do |q|
58
+ q.validate = /^(y|n)$/i
59
+ q.responses[:not_valid] = "Sorry, that's an invalid option. Please enter either y or n: "
60
+ end
61
+ remote_repos.push(private_repo) if response === 'y'
62
+ end
63
+
64
+ # Create a scratch directory where we'll clone all our repos. This repo
65
+ # will get cleaned up after the begin block.
66
+ tmpdir = Dir.mktmpdir(nil, '/tmp')
67
+ begin
68
+ if @auth_type === 'basic'
69
+ # If the user is using basic auth, we'll need to put their credentials
70
+ # somewhere Git can access.
71
+ `git config --global credential.helper store`
72
+ tmpcreds = File.open("#{Dir.home}/.git-credentials", 'w', 0664) do |f|
73
+ f.write("https://#{@username}:#{@github.current_options[:password]}@github.com")
74
+ f
75
+ end
76
+ elsif @auth_type === 'keychain'
77
+ `git config --global credential.helper osxkeychain`
78
+ else
79
+ raise StandardError, "Unknown credential helper"
80
+ end
81
+
82
+ remote_repos.each do |remote_repo|
83
+ puts "Cloning down #{remote_repo[:name]}..."
84
+
85
+ dir = "#{tmpdir}/#{remote_repo[:name]}.git"
86
+
87
+ # Clone the original repo
88
+ `git clone --bare #{remote_repo.clone_url} #{dir} 1> /dev/null`
89
+
90
+ puts "Finished cloning."
91
+
92
+ # Wrap the cloned git directory in a libgit wrapper
93
+ local_repo = Rugged::Repository.new(dir)
94
+
95
+ # Get a list of all the branches, and filter out irrelevant branches
96
+ regex = /(#{Regexp.quote(@username)}|master)/
97
+ branches = Rugged::Branch.each_name(local_repo).sort.select { |branch| branch =~ regex }
98
+
99
+ # Ask the user which branch they want to keep; we'll end up deleting
100
+ # all other branches. Skip over this prompt if the repo only has a
101
+ # :master branch.
102
+ puts <<EOS
103
+
104
+ I'll now take a branch of your choosing and make it your master branch. This
105
+ way, anyone who looks at your repository will see your code right away, rather
106
+ than the repository's boilerplate code.
107
+
108
+ EOS
109
+ if branches.include?('master') and branches.length === 1
110
+ branch_name = 'master'
111
+ puts "Only found branch `#{branch_name}`. Using that one."
112
+ else
113
+ puts "Here's a list of the branches you can keep:", ''
114
+ branches.each { |branch| puts branch }
115
+ puts ''
116
+
117
+ branch_name = ask("Please enter the name of the branch you'd like to keep: ") do |q|
118
+ # Validate that the string isn't just whitespace and that it's a
119
+ # valid branch name. First check is sort of redundant, but whatev.
120
+ q.validate = lambda { |p| p =~ /^(?!\s*$).+/ and branches.include?(p) }
121
+ q.responses[:not_valid] = "Sorry, that's an invalid branch name. Please enter the name of the branch you'd like to keep: "
122
+ end
123
+ end
124
+
125
+ # Replace the master branch with the user's branch. This ensures that
126
+ # anyone viewing the repo on GitHub is first presented with the user's
127
+ # code, not some empty boilerplate project.
128
+ if not branch_name =~ /^master$/
129
+ Rugged::Branch.lookup(local_repo, branch_name)
130
+ end
131
+
132
+ # Delete all remote branches
133
+ Rugged::Branch.each_name(local_repo, :remote).sort.each do |r|
134
+ if not r =~ /^master$/
135
+ Rugged::Branch.lookup(local_repo, r).delete!
136
+ end
137
+ end
138
+
139
+ # Generate a readme and commit it to the repository.
140
+ create_readme!(local_repo, project)
141
+
142
+ # Rename the source repo on GitHub to make way for the (nicenamed) new
143
+ # repository.
144
+ @github.repos.edit @username, "#{remote_repo[:name]}",
145
+ :name => "#{remote_repo[:name]}.old",
146
+ :private => true
147
+
148
+ # Create an endpoint for the new repository.
149
+ options = {
150
+ :name => remote_repo[:name],
151
+ :description => 'A project I did at Hack Reactor',
152
+ :homepage => 'http://hackreactor.com',
153
+ :has_issues => false,
154
+ :has_wiki => false
155
+ }
156
+ @github.repos.create options
157
+
158
+ # Push the processed repository back up
159
+ puts '', 'Pushing up your processed repository...'
160
+ Dir.chdir(dir)
161
+ # Write to ~/.netrc and ensure delete afterward. Move mktmpdir into
162
+ # that block.
163
+ `git push -u #{remote_repo[:clone_url]} master 1> /dev/null`
164
+
165
+ # Display a different message if this is the last item
166
+ if remote_repos.index(remote_repo) === remote_repos.length - 1
167
+ puts "Finished with #{remote_repo[:name]}. Moving on to the next repository...", ''
168
+ else
169
+ puts "Finished with #{remote_repo[:name]}. All repos processed.", ''
170
+ end
171
+ end
172
+ # Each user currently has two versions of each repo up on GitHub--a
173
+ # private one called reponame.old, and a public one without the .old
174
+ # suffix. Offer to delete all the old, private repos.
175
+ puts <<EOS
176
+ All your repos have been pushed up to GitHub. Please review all your newly
177
+ pushed repos to make sure they look okay.
178
+
179
+ EOS
180
+ delete_branches = ask("Would you like me to delete the old, private versions of your repos? (y/n) ") do |q|
181
+ q.validate = /^(y|n)$/i
182
+ q.responses[:not_valid] = "Sorry, that's an invalid option. Please enter either y or n: "
183
+ end
184
+
185
+ if delete_branches === 'y'
186
+ remote_repos.each do |private_repo|
187
+ @github.repos.delete(@username, "#{private_repo[:name]}.old")
188
+ end
189
+ end
190
+ ensure
191
+ # Make sure we tidy up after ourselves
192
+ `git config --global credential.helper '#{@credential_helper}'`
193
+ FileUtils.remove_entry(tmpdir) if tmpdir
194
+ FileUtils.remove_entry("#{Dir.home}/.git-credentials") if tmpcreds
195
+ end
196
+ puts <<EOS
197
+
198
+ All your repos are now public. Please note that any of the repos this script
199
+ processed are now out of sync with your local versions; before making any
200
+ changes to local copies of these repos, please refresh from GitHub.
201
+
202
+ Enjoy!
203
+ EOS
204
+ end
205
+
206
+ def get_github_credentials
207
+ # TODO: Set a flag guarding Keychain access. If we try to access GitHub and the
208
+ # user's credentials fail, this will prevent us from looping over invalid
209
+ # keychain credentials over and over.
210
+
211
+ # If we're on OS X and can retrieve GitHub credentials from the keychain,
212
+ # use those. If the keychain is unavailable, or if we weren't able to
213
+ # retrieve GitHub credentials from it, we'll prompt the user for their
214
+ # credentials.
215
+ if Publicity::HOST_IS_OSX
216
+ item = Keychain.items.find { |i| i.label =~ /github\.com/ }
217
+ end
218
+
219
+ # Create an instance of the GitHub API. We'll use this to make all GitHub
220
+ # requests
221
+ @github = Github.new do |config|
222
+ if item
223
+ @auth_type = 'keychain'
224
+ config.login = item.account
225
+ config.password = item.password
226
+ else
227
+ @auth_type = 'basic'
228
+ config.login = ask("Enter your GitHub username: ") { |q| q.echo = true }
229
+ config.password = ask("And your password: ") { |q| q.echo = "*" }
230
+ end
231
+ end
232
+ end
233
+
234
+ def get_github_credentials!
235
+ begin
236
+ get_github_credentials
237
+ # Try to access something that requires credentials to test if these
238
+ # credentials are valid
239
+ @github.authorizations.list
240
+ rescue
241
+ puts '', "Sorry, login to GitHub failed. Please re-enter your credentials."
242
+ retry
243
+ end
244
+ @username = @github.current_options[:login]
245
+ @github
246
+ end
247
+
248
+ def get_project_info
249
+ project = Hash.new
250
+ project[:name] = ask("Please enter the name of that project: ")
251
+ project[:url] = ask("Please enter the URL to that project's GitHub repository, or to where it's hosted:")
252
+ puts ''
253
+ project
254
+ end
255
+
256
+ def get_private_repos
257
+ result = Array.new
258
+
259
+ @github.repos.list do |repo|
260
+ # The version of repo that comes with github.repos.list only has a
261
+ # limited subset of the repo's metadata--get the full version
262
+ repo = @github.repos.get(@username, repo[:name])
263
+
264
+ # If the repo is still private and it's a fork of a Hack Reactor repo,
265
+ # it qualifies for liberation
266
+ if repo[:private] and repo[:parent].andand[:owner].andand[:login] === 'hackreactor'
267
+ result.push repo
268
+ end
269
+ end
270
+
271
+ result
272
+ end
273
+
274
+ def create_readme!(repo, data)
275
+ text = <<EOS
276
+ ##{data[:name]}
277
+
278
+ This is a copy of the work I did on a private repo, originally a project from
279
+ the [Hack Reactor](http://hackreactor.com) curriculum. This project was worked
280
+ on with a pair, and as such is representative of the kind of problems that I've
281
+ tackled, but not of my solo work.
282
+
283
+ For a better perspective on my own work, please see #{data[:name]}(#{data[:url]}).
284
+ EOS
285
+
286
+ oid = repo.write(text, :blob)
287
+ index = Rugged::Index.new
288
+ index.add(:path => "README.md", :oid => oid, :mode => 0100644)
289
+
290
+ options = {}
291
+ options[:tree] = index.write_tree(repo)
292
+
293
+ options[:author] = { :email => "accounts@hackreactor.com", :name => 'Hack Reactor', :time => Time.now }
294
+ options[:committer] = { :email => "accounts@hackreactor.com", :name => 'Hack Reactor', :time => Time.now }
295
+ options[:message] ||= "Added an automatically generated readme"
296
+ options[:parents] = repo.empty? ? [] : [ repo.head.target ].compact
297
+ options[:update_ref] = 'HEAD'
298
+
299
+ Rugged::Commit.create(repo, options)
300
+ end
301
+ end
302
+ end
@@ -0,0 +1,3 @@
1
+ module Publicity
2
+ VERSION = "0.0.1"
3
+ end
data/lib/publicity.rb ADDED
@@ -0,0 +1,63 @@
1
+ require 'optparse'
2
+ require 'publicity/host_is_osx'
3
+ require 'publicity/prompt'
4
+ require 'publicity/version'
5
+
6
+ module Publicity
7
+ # Kicks off the parsing process by parsing command-line arguments and calling
8
+ # the method that parses each input file.
9
+ class Exec
10
+ # @param args [Array<String>] All command-line arguments
11
+ def initialize(args)
12
+ @args = args
13
+ @options = {}
14
+ end
15
+
16
+ # Parses the command-line arguments and begins parsing the files.
17
+ #
18
+ # @see #parse
19
+ def parse!
20
+ parse
21
+ exit 0
22
+ end
23
+
24
+ # Parses the command-line arguments and begins parsing the files.
25
+ #
26
+ # @see #parse!
27
+ def parse
28
+ @opts = OptionParser.new(&method(:set_opts))
29
+ @opts.parse!(@args)
30
+
31
+ process_result
32
+ end
33
+
34
+ # Takes the command-line arguments and parses them for optparse.
35
+ #
36
+ # @param opts [OptionParser]
37
+ def set_opts(opts)
38
+ opts.banner = <<EOS
39
+ publicity v#{Publicity::VERSION}
40
+
41
+ Description:
42
+
43
+ TODO
44
+
45
+ Usage (from within a .git repository):
46
+
47
+ publicity [options]
48
+
49
+ Options:
50
+ EOS
51
+
52
+ opts.on_tail( '-h', '--help', 'Display this screen' ) do
53
+ puts opts
54
+ exit
55
+ end
56
+ end
57
+
58
+ # Kickstarts the script prompt
59
+ def process_result
60
+ Publicity::Main.new
61
+ end
62
+ end
63
+ end
data/publicity.gemspec ADDED
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'publicity/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "publicity"
8
+ spec.version = Publicity::VERSION
9
+ spec.authors = ["Nathan Houle"]
10
+ spec.email = ["nathan@nathanhoule.com"]
11
+ spec.description = %q{Publicize private forks of Hack Reactor project repositories}
12
+ spec.summary = %q{This script will go through a user's GitHub profile, prompting the user to make public any private forks of Hack Reactor repositories. It'll then move those private repos out of the way and push up a new repository that contains a new readme and is public. It'll then offer to remove the user's old repos.}
13
+ spec.homepage = "https://github.com/hackreactor/publicity"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rspec", "~> 2.13.0"
23
+ spec.add_development_dependency "rake"
24
+
25
+ spec.add_runtime_dependency "andand", "~> 1.3.3"
26
+ spec.add_runtime_dependency "highline", "~> 1.6.18"
27
+ spec.add_runtime_dependency "github_api", "~> 0.9.7"
28
+ spec.add_runtime_dependency "keychain_services", "~> 0.1.1"
29
+ spec.add_runtime_dependency "rugged", "0.18.0.b1"
30
+ end
metadata ADDED
@@ -0,0 +1,191 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: publicity
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Nathan Houle
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-05-03 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.3'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.3'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rspec
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 2.13.0
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 2.13.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: andand
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 1.3.3
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 1.3.3
78
+ - !ruby/object:Gem::Dependency
79
+ name: highline
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: 1.6.18
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: 1.6.18
94
+ - !ruby/object:Gem::Dependency
95
+ name: github_api
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ~>
100
+ - !ruby/object:Gem::Version
101
+ version: 0.9.7
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: 0.9.7
110
+ - !ruby/object:Gem::Dependency
111
+ name: keychain_services
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: 0.1.1
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: 0.1.1
126
+ - !ruby/object:Gem::Dependency
127
+ name: rugged
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - '='
132
+ - !ruby/object:Gem::Version
133
+ version: 0.18.0.b1
134
+ type: :runtime
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - '='
140
+ - !ruby/object:Gem::Version
141
+ version: 0.18.0.b1
142
+ description: Publicize private forks of Hack Reactor project repositories
143
+ email:
144
+ - nathan@nathanhoule.com
145
+ executables:
146
+ - publicity
147
+ extensions: []
148
+ extra_rdoc_files: []
149
+ files:
150
+ - .gitignore
151
+ - .rspec
152
+ - Gemfile
153
+ - LICENSE.txt
154
+ - README.md
155
+ - Rakefile
156
+ - bin/publicity
157
+ - lib/publicity.rb
158
+ - lib/publicity/host_is_osx.rb
159
+ - lib/publicity/prompt.rb
160
+ - lib/publicity/version.rb
161
+ - publicity.gemspec
162
+ homepage: https://github.com/hackreactor/publicity
163
+ licenses:
164
+ - MIT
165
+ post_install_message:
166
+ rdoc_options: []
167
+ require_paths:
168
+ - lib
169
+ required_ruby_version: !ruby/object:Gem::Requirement
170
+ none: false
171
+ requirements:
172
+ - - ! '>='
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ required_rubygems_version: !ruby/object:Gem::Requirement
176
+ none: false
177
+ requirements:
178
+ - - ! '>='
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ requirements: []
182
+ rubyforge_project:
183
+ rubygems_version: 1.8.23
184
+ signing_key:
185
+ specification_version: 3
186
+ summary: This script will go through a user's GitHub profile, prompting the user to
187
+ make public any private forks of Hack Reactor repositories. It'll then move those
188
+ private repos out of the way and push up a new repository that contains a new readme
189
+ and is public. It'll then offer to remove the user's old repos.
190
+ test_files: []
191
+ has_rdoc: