diff --git a/Library/Homebrew/dev-cmd/bump-formula-pr.rb b/Library/Homebrew/dev-cmd/bump-formula-pr.rb index c50ab97cfe..58cb293265 100644 --- a/Library/Homebrew/dev-cmd/bump-formula-pr.rb +++ b/Library/Homebrew/dev-cmd/bump-formula-pr.rb @@ -38,6 +38,8 @@ module Homebrew description: "Run `brew audit --strict` before opening the PR." switch "--no-browse", description: "Print the pull request URL instead of opening in a browser." + switch "--no-fork", + description: "Don't try to fork the repository." flag "--mirror=", description: "Use the specified as a mirror URL." flag "--version=", @@ -324,7 +326,7 @@ module Homebrew changed_files += alias_rename if alias_rename.present? if args.dry_run? - ohai "try to fork repository with GitHub API" + ohai "try to fork repository with GitHub API" unless args.no_fork? ohai "git fetch --unshallow origin" if shallow ohai "git add #{alias_rename.first} #{alias_rename.last}" if alias_rename.present? ohai "git checkout --no-track -b #{branch} #{origin_branch}" @@ -335,27 +337,11 @@ module Homebrew ohai "create pull request with GitHub API" else - begin - response = GitHub.create_fork(tap_full_name) - # GitHub API responds immediately but fork takes a few seconds to be ready. - sleep 3 - - if system("git", "config", "--get-regexp", "remote\..*\.url", "git@github.com:.*") - remote_url = response.fetch("ssh_url") - else - remote_url = response.fetch("clone_url") - end - username = response.fetch("owner").fetch("login") - rescue GitHub::AuthenticationFailedError => e - raise unless e.github_message.match?(/forking is disabled/) - - # If the repository is private, forking might be disabled. - # Create branches in the repository itself instead. + if args.no_fork? remote_url = Utils.popen_read("git remote get-url --push origin").chomp username = formula.tap.user - rescue *GitHub.api_errors => e - formula.path.atomic_write(backup_file) unless args.dry_run? - odie "Unable to fork: #{e.message}!" + else + remote_url, username = forked_repo_info(tap_full_name) end safe_system "git", "fetch", "--unshallow", "origin" if shallow @@ -394,6 +380,23 @@ module Homebrew end end + def forked_repo_info(tap_full_name) + response = GitHub.create_fork(tap_full_name) + rescue GitHub::AuthenticationFailedError, *GitHub.api_errors => e + formula.path.atomic_write(backup_file) + odie "Unable to fork: #{e.message}!" + else + # GitHub API responds immediately but fork takes a few seconds to be ready. + sleep 1 until GitHub.check_fork_exists(tap_full_name) + remote_url = if system("git", "config", "--local", "--get-regexp", "remote\..*\.url", "git@github.com:.*") + response.fetch("ssh_url") + else + response.fetch("clone_url") + end + username = response.fetch("owner").fetch("login") + [remote_url, username] + end + def inreplace_pairs(path, replacement_pairs) if args.dry_run? contents = path.open("r") { |f| Formulary.ensure_utf8_encoding(f).read } diff --git a/Library/Homebrew/utils/github.rb b/Library/Homebrew/utils/github.rb index 9a73d7b5d0..2e6695f4f4 100644 --- a/Library/Homebrew/utils/github.rb +++ b/Library/Homebrew/utils/github.rb @@ -340,6 +340,15 @@ module GitHub open_api(url, data: data, scopes: scopes) end + def check_fork_exists(repo) + _, username = api_credentials + _, reponame = repo.split("/") + json = open_api(url_to("repos", username, reponame)) + return false if json["message"] == "Not Found" + + true + end + def create_pull_request(repo, title, head, base, body) url = "#{API_URL}/repos/#{repo}/pulls" data = { title: title, head: head, base: base, body: body } diff --git a/docs/Manpage.md b/docs/Manpage.md index 208356dd96..f8ce7fd0c6 100644 --- a/docs/Manpage.md +++ b/docs/Manpage.md @@ -762,6 +762,8 @@ uses. Run `brew audit --strict` before opening the PR. * `--no-browse`: Print the pull request URL instead of opening in a browser. +* `--no-fork`: + Don't try to fork the repository. * `--mirror`: Use the specified *`URL`* as a mirror URL. * `--version`: diff --git a/manpages/brew.1 b/manpages/brew.1 index 5920a0fcd5..9b7d29e5b4 100644 --- a/manpages/brew.1 +++ b/manpages/brew.1 @@ -966,6 +966,10 @@ Run \fBbrew audit \-\-strict\fR before opening the PR\. Print the pull request URL instead of opening in a browser\. . .TP +\fB\-\-no\-fork\fR +Don\'t try to fork the repository\. +. +.TP \fB\-\-mirror\fR Use the specified \fIURL\fR as a mirror URL\. .