publicity 0.0.1

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