Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions Library/Homebrew/dev-cmd/pr-publish.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# frozen_string_literal: true

require "cli/parser"
require "utils/github"

module Homebrew
module_function

def pr_publish_args
Homebrew::CLI::Parser.new do
usage_banner <<~EOS
`pr-publish` <pull_request>

Publishes bottles for a pull request with GitHub Actions.
Requires write access to the repository.
EOS
switch :verbose
end
end

def pr_publish
pr_publish_args.parse

odie "You need to specify a pull request number!" if Homebrew.args.named.empty?
Comment on lines +17 to +24
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
switch :verbose
end
end
def pr_publish
pr_publish_args.parse
odie "You need to specify a pull request number!" if Homebrew.args.named.empty?
switch :verbose
named 1
end
end
def pr_publish
pr_publish_args.parse

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jonchang This DSL would be preferable to use here


args.named.each do |arg|
arg = "#{CoreTap.instance.default_remote}/pull/#{arg}" if arg.to_i.positive?
url_match = arg.match HOMEBREW_PULL_OR_COMMIT_URL_REGEX
_, user, repo, issue = *url_match
tap = Tap.fetch(user, repo) if repo.match?(HOMEBREW_OFFICIAL_REPO_PREFIXES_REGEX)
odie "Not a GitHub pull request: #{arg}" unless issue
ohai "Dispatching #{tap} pull request ##{issue}"
GitHub.dispatch(user, repo, "Publish ##{issue}", pull_request: issue)
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could this (or a line after) output a URL that you can use to check progress? If not possible: no worries.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This unfortunately returns 204 No Content. We'd have to find it using another API call.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

😭. Even if it outputs the full PR URL somewhere that might be nice. Where does the "action" show up; just in the actions tab on the repo?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yup, just in the Actions tab. You can filter by actor and workflow type though which can help. In Linuxbrew/core we have @BrewTestBot ping the requestor when the upload job fails. This could be added to the workflow in Homebrew/core:

https://github.com/Homebrew/linuxbrew-core/blob/3d460c215425e7d1547865ad0c2f5b4b7bce7dd7/.github/workflows/upload-bottles.yml#L165-L173
https://github.com/Homebrew/linuxbrew-core/pull/19902#issuecomment-601881442

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeh, this would be great to have there too 👍

end
end
end
7 changes: 7 additions & 0 deletions Library/Homebrew/test/dev-cmd/pr-publish_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# frozen_string_literal: true

require "cmd/shared_examples/args_parse"

describe "Homebrew.pr_publish_args" do
it_behaves_like "parseable arguments"
end
7 changes: 7 additions & 0 deletions Library/Homebrew/utils/github.rb
Original file line number Diff line number Diff line change
Expand Up @@ -431,6 +431,13 @@ def issue_comment_exists?(user, repo, pr, body)
comments.any? { |comment| comment["body"].eql?(body) }
end

def dispatch(user, repo, event, **payload)
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
def dispatch(user, repo, event, **payload)
def repo_dispatch_event(user, repo, event, **payload)

or

Suggested change
def dispatch(user, repo, event, **payload)
def dispatch_event(user, repo, event, **payload)

url = "#{API_URL}/repos/#{user}/#{repo}/dispatches"
open_api(url, data: { event_type: event, client_payload: payload },
request_method: :POST,
scopes: CREATE_ISSUE_FORK_OR_PR_SCOPES)
end

def api_errors
[GitHub::AuthenticationFailedError, GitHub::HTTPNotFoundError,
GitHub::RateLimitExceededError, GitHub::Error, JSON::ParserError].freeze
Expand Down
5 changes: 5 additions & 0 deletions docs/Manpage.md
Original file line number Diff line number Diff line change
Expand Up @@ -880,6 +880,11 @@ Generate Homebrew's manpages.
* `--link`:
This is now done automatically by `brew update`.

### `pr-publish` *`pull_request`*

Publishes bottles for a pull request with GitHub Actions. Requires write access
to the repository.

### `prof` *`command`*

Run Homebrew with the Ruby profiler, e.g. `brew prof readall`.
Expand Down
3 changes: 3 additions & 0 deletions manpages/brew.1
Original file line number Diff line number Diff line change
Expand Up @@ -1120,6 +1120,9 @@ Return a failing status code if changes are detected in the manpage outputs\. Th
\fB\-\-link\fR
This is now done automatically by \fBbrew update\fR\.
.
.SS "\fBpr\-publish\fR \fIpull_request\fR"
Publishes bottles for a pull request with GitHub Actions\. Requires write access to the repository\.
.
.SS "\fBprof\fR \fIcommand\fR"
Run Homebrew with the Ruby profiler, e\.g\. \fBbrew prof readall\fR\.
.
Expand Down