Skip to content

Commit

Permalink
Merge branch 'master' into no-ostruct
Browse files Browse the repository at this point in the history
  • Loading branch information
dduugg authored Dec 10, 2024
2 parents ce9216e + 29e9087 commit 69f2d3b
Show file tree
Hide file tree
Showing 14 changed files with 74 additions and 52 deletions.
3 changes: 0 additions & 3 deletions .github/workflows/actionlint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,13 @@ name: actionlint

on:
push:
branches:
- master
paths:
- '.github/workflows/*.ya?ml'
- '.github/actionlint.yaml'
pull_request:
paths:
- '.github/workflows/*.ya?ml'
- '.github/actionlint.yaml'
merge_group:

env:
HOMEBREW_DEVELOPER: 1
Expand Down
5 changes: 1 addition & 4 deletions .github/workflows/docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,6 @@ name: Docker

on:
pull_request:
push:
branches:
- master
merge_group:
release:
types:
Expand Down Expand Up @@ -75,7 +72,7 @@ jobs:
"homebrew/brew:latest"
)
fi
elif [[ "${GITHUB_EVENT_NAME}" == "push" &&
elif [[ "${GITHUB_EVENT_NAME}" == "merge_group" &&
"${GITHUB_REF}" == "refs/heads/master" &&
"${{ matrix.version }}" == "22.04" ]]; then
tags+=(
Expand Down
3 changes: 0 additions & 3 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
name: Documentation CI

on:
push:
branches:
- master
pull_request:
merge_group:

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/pkg-installer.yml
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ jobs:
fi
- name: Generate build provenance
uses: actions/attest-build-provenance@c4fbc648846ca6f503a13a2281a5e7b98aa57202 # v2.0.1
uses: actions/attest-build-provenance@7668571508540a607bdfd90a87a560489fe372eb # v2.1.0
with:
subject-path: Homebrew-${{ steps.homebrew-version.outputs.version }}.pkg

Expand Down
3 changes: 0 additions & 3 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
name: CI

on:
push:
branches:
- master
pull_request:
merge_group:

Expand Down
8 changes: 5 additions & 3 deletions Library/Homebrew/cask/artifact/abstract_uninstall.rb
Original file line number Diff line number Diff line change
Expand Up @@ -468,9 +468,7 @@ def trash_paths(*paths, command: nil, **_)
trashed = trashed.split(":")
untrashable = untrashable.split(":")

return trashed, untrashable if untrashable.empty?

untrashable.delete_if do |path|
trashed_with_permissions, untrashable = untrashable.partition do |path|
Utils.gain_permissions(path, ["-R"], SystemCommand) do
system_command! HOMEBREW_LIBRARY_PATH/"cask/utils/trash.swift",
args: [path],
Expand All @@ -482,6 +480,10 @@ def trash_paths(*paths, command: nil, **_)
false
end

trashed += trashed_with_permissions

return trashed, untrashable if untrashable.empty?

opoo "The following files could not be trashed, please do so manually:"
$stderr.puts untrashable

Expand Down
25 changes: 21 additions & 4 deletions Library/Homebrew/dev-cmd/tap-new.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
require "abstract_command"
require "fileutils"
require "tap"
require "utils/uid"

module Homebrew
module DevCmd
Expand Down Expand Up @@ -172,16 +173,32 @@ def run
write_path(tap, ".github/workflows/publish.yml", actions_publish)

unless args.no_git?
cd tap.path do
cd tap.path do |path|
Utils::Git.set_name_email!
Utils::Git.setup_gpg!

# Would be nice to use --initial-branch here but it's not available in
# older versions of Git that we support.
safe_system "git", "-c", "init.defaultBranch=#{branch}", "init"
safe_system "git", "add", "--all"
safe_system "git", "commit", "-m", "Create #{tap} tap"
safe_system "git", "branch", "-m", branch

args = []
git_owner = File.stat(File.join(path, ".git")).uid
if git_owner != Process.uid && git_owner == Process.euid
# Under Homebrew user model, EUID is permitted to execute commands under the UID.
# Root users are never allowed (see brew.sh).
args << "-c" << "safe.directory=#{path}"
end

# Use the configuration of the original user, which will have author information and signing keys.
Utils::UID.drop_euid do
env = { HOME: Utils::UID.uid_home }.compact
env[:TMPDIR] = nil if (tmpdir = ENV.fetch("TMPDIR", nil)) && !File.writable?(tmpdir)
with_env(env) do
safe_system "git", *args, "add", "--all"
safe_system "git", *args, "commit", "-m", "Create #{tap} tap"
safe_system "git", *args, "branch", "-m", branch
end
end
end
end

Expand Down
4 changes: 4 additions & 0 deletions Library/Homebrew/formula.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2005,6 +2005,8 @@ def time
# If called with no parameters, does this with all compatible
# universal binaries in a {Formula}'s {Keg}.
#
# Raises an error if no universal binaries are found to deuniversalize.
#
# @api public
sig { params(targets: T.nilable(T.any(Pathname, String))).void }
def deuniversalize_machos(*targets)
Expand All @@ -2014,6 +2016,8 @@ def deuniversalize_machos(*targets)
end
end

raise "No universal binaries found to deuniversalize" if targets.blank?

targets&.each do |target|
extract_macho_slice_from(Pathname(target), Hardware::CPU.arch)
end
Expand Down
10 changes: 5 additions & 5 deletions Library/Homebrew/livecheck/strategy/json.rb
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,10 @@ def self.parse_json(content)
end

# Parses JSON text and identifies versions using a `strategy` block.
# If a regex is provided, it will be passed as the second argument to
# the `strategy` block (after the parsed JSON data).
# If the block has two parameters, the parsed JSON data will be used as
# the first argument and the regex (if any) will be the second.
# Otherwise, only the parsed JSON data will be passed to the block.
#
# @param content [String] the JSON text to parse and check
# @param regex [Regexp, nil] a regex used for matching versions in the
# content
Expand All @@ -77,10 +79,8 @@ def self.versions_from_content(content, regex = nil, &block)
json = parse_json(content)
return [] if json.blank?

block_return_value = if regex.present?
block_return_value = if block.arity == 2
yield(json, regex)
elsif block.arity == 2
raise "Two arguments found in `strategy` block but no regex provided."
else
yield(json)
end
Expand Down
10 changes: 7 additions & 3 deletions Library/Homebrew/livecheck/strategy/pypi.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,14 @@ class Pypi

# The default `strategy` block used to extract version information when
# a `strategy` block isn't provided.
DEFAULT_BLOCK = T.let(proc do |json|
json.dig("info", "version").presence
DEFAULT_BLOCK = T.let(proc do |json, regex|
version = json.dig("info", "version")
next if version.blank?

regex ? version[regex, 1] : version
end.freeze, T.proc.params(
arg0: T::Hash[String, T.untyped],
json: T::Hash[String, T.untyped],
regex: T.nilable(Regexp),
).returns(T.nilable(String)))

# The `Regexp` used to extract the package name and suffix (e.g. file
Expand Down
5 changes: 0 additions & 5 deletions Library/Homebrew/test/livecheck/strategy/json_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -107,11 +107,6 @@
expect(json.versions_from_content(content_simple, regex) { next }).to eq([])
end

it "errors if a block uses two arguments but a regex is not given" do
expect { json.versions_from_content(content_simple) { |json, regex| json["version"][regex, 1] } }
.to raise_error("Two arguments found in `strategy` block but no regex provided.")
end

it "errors on an invalid return type from a block" do
expect { json.versions_from_content(content_simple, regex) { 123 } }
.to raise_error(TypeError, Homebrew::Livecheck::Strategy::INVALID_BLOCK_RETURN_VALUE_MSG)
Expand Down
26 changes: 19 additions & 7 deletions Library/Homebrew/test/livecheck/strategy/pypi_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
let(:pypi_url) { "https://files.pythonhosted.org/packages/ab/cd/efg/example-package-1.2.3.tar.gz" }
let(:non_pypi_url) { "https://brew.sh/test" }

let(:regex) { /^v?(\d+(?:\.\d+)+)$/i }
let(:regex) { /^v?(\d+(?:\.\d+)+)/i }

let(:generated) do
{
Expand All @@ -17,25 +17,26 @@
end

# This is a limited subset of a PyPI JSON API response object, for the sake
# of testing.
# of testing. Typical versions use a `1.2.3` format but this adds a suffix,
# so we can test regex matching.
let(:content) do
<<~JSON
{
"info": {
"version": "1.2.3"
"version": "1.2.3-456"
}
}
JSON
end

let(:matches) { ["1.2.3"] }
let(:matches) { ["1.2.3-456"] }

let(:find_versions_return_hash) do
{
matches: {
"1.2.3" => Version.new("1.2.3"),
"1.2.3-456" => Version.new("1.2.3-456"),
},
regex: nil,
regex:,
url: generated[:url],
}
end
Expand Down Expand Up @@ -76,10 +77,17 @@
{
cached:,
cached_default: cached.merge({ matches: {} }),
cached_regex: cached.merge({
matches: { "1.2.3" => Version.new("1.2.3") },
regex:,
}),
}
end

it "finds versions in provided content" do
expect(pypi.find_versions(url: pypi_url, regex:, provided_content: content))
.to eq(match_data[:cached_regex])

expect(pypi.find_versions(url: pypi_url, provided_content: content))
.to eq(match_data[:cached])
end
Expand All @@ -92,18 +100,22 @@
next if match.blank?

match[1]
end).to eq(match_data[:cached].merge({ regex: }))
end).to eq(match_data[:cached_regex])

expect(pypi.find_versions(url: pypi_url, provided_content: content) do |json|
json.dig("info", "version").presence
end).to eq(match_data[:cached])
end

it "returns default match_data when block doesn't return version information" do
no_match_regex = /will_not_match/i

expect(pypi.find_versions(url: pypi_url, provided_content: '{"info":{"version":""}}'))
.to eq(match_data[:cached_default])
expect(pypi.find_versions(url: pypi_url, provided_content: '{"other":true}'))
.to eq(match_data[:cached_default])
expect(pypi.find_versions(url: pypi_url, regex: no_match_regex, provided_content: content))
.to eq(match_data[:cached_default].merge({ regex: no_match_regex }))
end

it "returns default match_data when url is blank" do
Expand Down
13 changes: 2 additions & 11 deletions Library/Homebrew/utils/github/api.rb
Original file line number Diff line number Diff line change
Expand Up @@ -135,15 +135,6 @@ def initialize(github_message, errors)
JSON::ParserError,
].freeze

sig { returns(T.nilable(String)) }
private_class_method def self.uid_home
require "etc"
Etc.getpwuid(Process.uid)&.dir
rescue ArgumentError
# Cover for misconfigured NSS setups
nil
end

# Gets the token from the GitHub CLI for github.com.
sig { returns(T.nilable(String)) }
def self.github_cli_token
Expand All @@ -152,7 +143,7 @@ def self.github_cli_token
# Avoid `Formula["gh"].opt_bin` so this method works even with `HOMEBREW_DISABLE_LOAD_FORMULA`.
env = {
"PATH" => PATH.new(HOMEBREW_PREFIX/"opt/gh/bin", ENV.fetch("PATH")),
"HOME" => uid_home,
"HOME" => Utils::UID.uid_home,
}.compact
gh_out, _, result = system_command "gh",
args: ["auth", "token", "--hostname", "github.com"],
Expand All @@ -173,7 +164,7 @@ def self.keychain_username_password
git_credential_out, _, result = system_command "git",
args: ["credential-osxkeychain", "get"],
input: ["protocol=https\n", "host=github.com\n"],
env: { "HOME" => uid_home }.compact,
env: { "HOME" => Utils::UID.uid_home }.compact,
print_stderr: false
return unless result.success?

Expand Down
9 changes: 9 additions & 0 deletions Library/Homebrew/utils/uid.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,14 @@ def self.drop_euid(&_block)
Process::Sys.seteuid(original_euid)
end
end

sig { returns(T.nilable(String)) }
def self.uid_home
require "etc"
Etc.getpwuid(Process.uid)&.dir
rescue ArgumentError
# Cover for misconfigured NSS setups
nil
end
end
end

0 comments on commit 69f2d3b

Please sign in to comment.