What's was your first pull request?
$ gem install ruby-progressbar octokit
$ ruby first_pull_request.rb <github-username> <github-password>What's was your first pull request?
$ gem install ruby-progressbar octokit
$ ruby first_pull_request.rb <github-username> <github-password>| require 'ruby-progressbar' | |
| require 'octokit' | |
| FirstPullRequest = Struct.new(:username, :password) do | |
| def url | |
| first_pull_request.html_url | |
| end | |
| private | |
| def first_pull_request | |
| sorted_closed_issues.find { |issue| issue.pull_request.html_url } | |
| end | |
| def sorted_closed_issues | |
| closed_issues.select(&:created_at).sort do |l, r| | |
| l.created_at <=> r.created_at | |
| end | |
| end | |
| def closed_issues | |
| with_progress_bar 'Fetching Issues', parent_repo_names.count do |bar| | |
| parent_repo_names.map do |name| | |
| bar.progress += 1 | |
| begin | |
| github.issues name, state: 'closed', creator: username | |
| rescue Octokit::NotFound | |
| [] # repo no longer exists | |
| end | |
| end.flatten | |
| end | |
| end | |
| def parent_repo_names | |
| @parent_repo_names ||= forked_repos.map { |repo| repo.parent.full_name } | |
| end | |
| def forked_repos | |
| with_progress_bar('Fetching Repos', forked_repo_names.size) do |bar| | |
| forked_repo_names.map do |name| | |
| bar.progress += 1 | |
| github.repository name | |
| end | |
| end | |
| end | |
| def forked_repo_names | |
| @forked_repo_names ||= begin | |
| with_count('were forked') { repos.select(&:fork).map(&:full_name) } | |
| end | |
| end | |
| def repos | |
| with_count('repositories') { github.repositories } | |
| end | |
| def github | |
| Octokit::Client.new( | |
| login: username, | |
| password: password, | |
| auto_traversal: true | |
| ) | |
| end | |
| def with_count(message) | |
| yield.tap do |response| | |
| puts %{#{"%02d" % response.count} #{message}} | |
| end | |
| end | |
| def with_progress_bar(title, size) | |
| yield( | |
| ProgressBar.create( | |
| title: title, | |
| format: '%t: |%B| %p%%', | |
| total: size | |
| ) | |
| ) | |
| end | |
| end | |
| FirstPullRequest.new(ARGV.shift, ARGV.shift).url.tap do |first_pr_url| | |
| puts "First pull request: #{first_pr_url}" | |
| `open #{first_pr_url}` | |
| end |
Please let me know if there's a better way to do this! This seems like a lot of work for finding my first pull request.