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 +17 -0
- data/.rspec +2 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +22 -0
- data/Rakefile +1 -0
- data/bin/publicity +8 -0
- data/lib/publicity/host_is_osx.rb +3 -0
- data/lib/publicity/prompt.rb +302 -0
- data/lib/publicity/version.rb +3 -0
- data/lib/publicity.rb +63 -0
- data/publicity.gemspec +30 -0
- metadata +191 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
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,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
|
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:
|