forkreadme 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 @@
1
+ Gemfile.lock
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ # vim: et ts=2 sw=2
3
+
4
+ source "https://rubygems.org"
5
+ gemspec
data/bin/forkreadme ADDED
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+ # vim: et ts=2 sw=2
3
+
4
+ require "forkreadme"
5
+ require "thor"
6
+
7
+ module ForkReadme
8
+ class App < Thor
9
+
10
+ desc "generate [DIR]", "Generate a README for a GitHub fork repo"
11
+ method_option :path, :default=>"."
12
+ def generate path=""
13
+ begin
14
+ dir = File.expand_path path, Dir.pwd
15
+ puts Generator.new(dir).readme
16
+
17
+ rescue ForkReadme::Error => err
18
+ $stderr.puts err
19
+ exit false
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ ForkReadme::App.start
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env ruby
2
+ # vim: et ts=2 sw=2
3
+
4
+ require File.expand_path("../lib/forkreadme/version", __FILE__)
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "forkreadme"
8
+ gem.version = ForkReadme::VERSION
9
+
10
+ gem.authors = ["Adam Mckaig"]
11
+ gem.email = ["adam.mckaig@gmail.com"]
12
+ gem.summary = %q{Generate useful READMEs for GitHub forks}
13
+ gem.homepage = "https://github.com/adammck/forkreadme"
14
+
15
+ gem.add_dependency "thor", "~> 0.14.6"
16
+ gem.add_dependency "octokit", "~> 1.0.2"
17
+
18
+ gem.files = `git ls-files`.split($\)
19
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
20
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
21
+ gem.require_paths = ["lib"]
22
+ end
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+ # vim: et ts=2 sw=2
3
+
4
+ module ForkReadme
5
+ class Error < StandardError
6
+ end
7
+
8
+ class NotRepo < Error
9
+ end
10
+
11
+ class NotFork < Error
12
+ end
13
+ end
@@ -0,0 +1,119 @@
1
+ #!/usr/bin/env ruby
2
+ # vim: et ts=2 sw=2
3
+
4
+ require "uri"
5
+ require "octokit"
6
+
7
+ module ForkReadme
8
+ class Generator
9
+ include URI::REGEXP::PATTERN
10
+
11
+ def initialize dir
12
+ @dir = dir
13
+ end
14
+
15
+ def readme
16
+ repo_name = github_repo_name @dir
17
+
18
+ if repo_name.empty?
19
+ raise NotRepo.new "Not a GitHub repo: #{@dir}"
20
+ end
21
+
22
+ repo = octokit.repo repo_name
23
+
24
+ unless repo.fork
25
+ raise NotFork.new "Not a GitHub fork: #{repo_name}"
26
+ end
27
+
28
+ parent_name = full_name repo.parent
29
+ parent = octokit.repo parent_name
30
+
31
+ s = []
32
+ s << "This is a fork of [#{parent.name}] (#{parent.html_url}), with pull requests:"
33
+ s << ""
34
+
35
+ logins = collaborator_logins repo
36
+ my_pulls = pull_requests(parent).select do |pull|
37
+ pull.user and logins.include?(pull.user.login)
38
+ end
39
+
40
+ my_pulls.each do |short_pull|
41
+ pull = pull_request(parent, short_pull.number)
42
+ if repo_name == full_name(pull.head.repo)
43
+ s << " * [#{pull.title}] (#{pull.html_url})"
44
+ end
45
+ end
46
+
47
+ s.join "\n"
48
+ end
49
+
50
+
51
+ private
52
+
53
+ # Private: Returns an Array containing the logins of all collaborators for an
54
+ # Octokit repo.
55
+ def collaborator_logins repo
56
+ octokit.collabs(full_name repo).map do |user|
57
+ user.login
58
+ end
59
+ end
60
+
61
+ # Private: Returns all pull request summaries (as returned by the "List pull
62
+ # requests" API, and wrapped by Octokit) for an Octokit repo.
63
+ def pull_requests repo
64
+ name = full_name repo
65
+
66
+ %w[open closed].reduce([]) do |memo, state|
67
+ memo | octokit.pulls(name, state, :per_page=>100)
68
+ end
69
+ end
70
+
71
+ # Private: Return full pull request (as returned by the "Get a single pull
72
+ # request" API, and wrapped by Octokit) to an Octokit repo and pull number.
73
+ def pull_request repo, number
74
+ octokit.pull full_name(repo), number
75
+ end
76
+
77
+ # Private: Returns the full GitHub repo name of a Git working directory.
78
+ def github_repo_name path
79
+ clone_url = parse_url remote_url path
80
+ chop_extension clone_url.path
81
+ end
82
+
83
+ # Private: Returns the full GitHub repo name of an Octokit repo.
84
+ def full_name repo
85
+ "#{repo.owner.login}/#{repo.name}"
86
+ end
87
+
88
+ # Private: Returns a configured Octokit client.
89
+ def octokit
90
+ @ok ||= Octokit.new(:auto_traversal=>true)
91
+ end
92
+
93
+ # Private: Returns the remote url of a Git working directory.
94
+ def remote_url path
95
+ %x{git config --file #{path}/.git/config --get remote.origin.url}
96
+ end
97
+
98
+ # Private: Returns a parsed URL. Wraps `URI.parse` with support for Git's
99
+ # SCP-like syntax (look like: git@github.com:adammck/whatever.git).
100
+ def parse_url url
101
+ begin
102
+ URI.parse(url)
103
+
104
+ rescue URI::InvalidURIError
105
+ if m = url.match("^(#{USERINFO})@(#{HOST}):(#{REL_PATH})$")
106
+ URI::Generic.new "ssh", m[1], m[2], 22, nil, m[3], nil, nil, nil
107
+
108
+ else
109
+ raise
110
+ end
111
+ end
112
+ end
113
+
114
+ # Private: Returns a filename with the extension removed.
115
+ def chop_extension filename
116
+ filename.sub /\.\w+$/, ""
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # vim: et ts=2 sw=2
3
+
4
+ module ForkReadme
5
+ VERSION = "0.0.1"
6
+ end
data/lib/forkreadme.rb ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+ # vim: et ts=2 sw=2
3
+
4
+ module ForkReadme
5
+ end
6
+
7
+ require "forkreadme/errors"
8
+ require "forkreadme/generator"
9
+ require "forkreadme/version"
metadata ADDED
@@ -0,0 +1,76 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: forkreadme
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Adam Mckaig
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-04-26 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: thor
16
+ requirement: &70204084253700 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 0.14.6
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70204084253700
25
+ - !ruby/object:Gem::Dependency
26
+ name: octokit
27
+ requirement: &70204084253100 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: 1.0.2
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70204084253100
36
+ description:
37
+ email:
38
+ - adam.mckaig@gmail.com
39
+ executables:
40
+ - forkreadme
41
+ extensions: []
42
+ extra_rdoc_files: []
43
+ files:
44
+ - .gitignore
45
+ - Gemfile
46
+ - bin/forkreadme
47
+ - forkreadme.gemspec
48
+ - lib/forkreadme.rb
49
+ - lib/forkreadme/errors.rb
50
+ - lib/forkreadme/generator.rb
51
+ - lib/forkreadme/version.rb
52
+ homepage: https://github.com/adammck/forkreadme
53
+ licenses: []
54
+ post_install_message:
55
+ rdoc_options: []
56
+ require_paths:
57
+ - lib
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ! '>='
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ requirements: []
71
+ rubyforge_project:
72
+ rubygems_version: 1.8.15
73
+ signing_key:
74
+ specification_version: 3
75
+ summary: Generate useful READMEs for GitHub forks
76
+ test_files: []