publicity 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|