├── .ruby-version ├── .github ├── zizmor.yml ├── codeql │ └── extensions │ │ └── homebrew-actions.yml ├── dependabot.yml ├── DISCUSSION_TEMPLATE │ ├── everyday-usage.yml │ ├── getting-started.yml │ ├── writing-formulae-casks.yml │ ├── tap-maintenance-and-brew-development.yml │ ├── casks.yml │ └── linux.yml └── workflows │ ├── stale-issues.yml │ └── actionlint.yml ├── README.md └── .rubocop.yml /.ruby-version: -------------------------------------------------------------------------------- 1 | 3.4.8 2 | -------------------------------------------------------------------------------- /.github/zizmor.yml: -------------------------------------------------------------------------------- 1 | # This file is synced from the `.github` repository, do not modify it directly. 2 | rules: 3 | unpinned-uses: 4 | config: 5 | policies: 6 | Homebrew/actions/*: ref-pin 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Homebrew/discussions 2 | 3 | Public open-ended discussions. Replacement for our, now deprecated, [Discourse](https://discourse.brew.sh). 4 | 5 | [💬 View Discussions](https://github.com/Homebrew/discussions/discussions) 6 | -------------------------------------------------------------------------------- /.github/codeql/extensions/homebrew-actions.yml: -------------------------------------------------------------------------------- 1 | # This file is synced from the `.github` repository, do not modify it directly. 2 | extensions: 3 | - addsTo: 4 | pack: codeql/actions-all 5 | extensible: trustedActionsOwnerDataModel 6 | data: 7 | - ["Homebrew"] 8 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # This file is synced from the `.github` repository, do not modify it directly. 2 | --- 3 | version: 2 4 | updates: 5 | - package-ecosystem: github-actions 6 | directory: "/" 7 | schedule: 8 | interval: weekly 9 | day: friday 10 | time: '08:00' 11 | timezone: Etc/UTC 12 | groups: 13 | github-actions: 14 | patterns: 15 | - "*" 16 | allow: 17 | - dependency-type: all 18 | cooldown: 19 | default-days: 7 20 | 21 | -------------------------------------------------------------------------------- /.github/DISCUSSION_TEMPLATE/everyday-usage.yml: -------------------------------------------------------------------------------- 1 | title: Everyday Usage 2 | labels: ["everyday-usage", "simple"] 3 | body: 4 | - type: textarea 5 | attributes: 6 | label: Output of `brew config` 7 | render: shell 8 | validations: 9 | required: true 10 | - type: textarea 11 | attributes: 12 | label: Output of `brew doctor` 13 | render: shell 14 | validations: 15 | required: true 16 | - type: textarea 17 | attributes: 18 | label: Description of issue 19 | validations: 20 | required: true 21 | -------------------------------------------------------------------------------- /.github/DISCUSSION_TEMPLATE/getting-started.yml: -------------------------------------------------------------------------------- 1 | title: Getting Started 2 | labels: ["simple", "getting-started"] 3 | body: 4 | - type: textarea 5 | attributes: 6 | label: Output of `brew config` 7 | render: shell 8 | validations: 9 | required: true 10 | - type: textarea 11 | attributes: 12 | label: Output of `brew doctor` 13 | render: shell 14 | validations: 15 | required: true 16 | - type: textarea 17 | attributes: 18 | label: Description of issue 19 | validations: 20 | required: true 21 | -------------------------------------------------------------------------------- /.github/DISCUSSION_TEMPLATE/writing-formulae-casks.yml: -------------------------------------------------------------------------------- 1 | title: Developing formulae or casks 2 | labels: ["advanced", "writing-formulae-casks"] 3 | body: 4 | - type: textarea 5 | attributes: 6 | label: Output of `brew config` 7 | render: shell 8 | validations: 9 | required: true 10 | - type: textarea 11 | attributes: 12 | label: Output of `brew doctor` 13 | render: shell 14 | validations: 15 | required: true 16 | - type: textarea 17 | attributes: 18 | label: Description of issue 19 | validations: 20 | required: true 21 | -------------------------------------------------------------------------------- /.github/DISCUSSION_TEMPLATE/tap-maintenance-and-brew-development.yml: -------------------------------------------------------------------------------- 1 | title: Tap maintenance and Homebrew development 2 | labels: ["advanced", "tap-maintenance-and-brew-development"] 3 | body: 4 | - type: textarea 5 | attributes: 6 | label: Output of `brew config` 7 | render: shell 8 | validations: 9 | required: true 10 | - type: textarea 11 | attributes: 12 | label: Output of `brew doctor` 13 | render: shell 14 | validations: 15 | required: true 16 | - type: textarea 17 | attributes: 18 | label: Description of issue 19 | validations: 20 | required: true 21 | -------------------------------------------------------------------------------- /.github/DISCUSSION_TEMPLATE/casks.yml: -------------------------------------------------------------------------------- 1 | title: Cask 2 | labels: ["casks"] 3 | body: 4 | - type: textarea 5 | attributes: 6 | label: Output of `brew config` 7 | render: shell 8 | validations: 9 | required: true 10 | - type: textarea 11 | attributes: 12 | label: Output of `brew doctor` 13 | render: shell 14 | validations: 15 | required: true 16 | - type: textarea 17 | attributes: 18 | label: Description of issue 19 | validations: 20 | required: true 21 | - type: input 22 | attributes: 23 | label: Relevant casks 24 | validations: 25 | required: true 26 | -------------------------------------------------------------------------------- /.github/DISCUSSION_TEMPLATE/linux.yml: -------------------------------------------------------------------------------- 1 | title: Linux 2 | labels: ["linux"] 3 | body: 4 | - type: checkboxes 5 | attributes: 6 | label: Additional Info 7 | options: 8 | - label: I am using Windows Subsystem for Linux 9 | required: false 10 | - type: textarea 11 | attributes: 12 | label: Output of `brew config` 13 | render: shell 14 | validations: 15 | required: true 16 | - type: textarea 17 | attributes: 18 | label: Output of `brew doctor` 19 | render: shell 20 | validations: 21 | required: true 22 | - type: textarea 23 | attributes: 24 | label: Description of issue 25 | validations: 26 | required: true 27 | -------------------------------------------------------------------------------- /.github/workflows/stale-issues.yml: -------------------------------------------------------------------------------- 1 | # This file is synced from the `.github` repository, do not modify it directly. 2 | name: Manage stale issues 3 | 4 | on: 5 | push: 6 | paths: 7 | - .github/workflows/stale-issues.yml 8 | branches-ignore: 9 | - dependabot/** 10 | schedule: 11 | # Once every day at midnight UTC 12 | - cron: "0 0 * * *" 13 | issue_comment: 14 | 15 | permissions: {} 16 | 17 | defaults: 18 | run: 19 | shell: bash -xeuo pipefail {0} 20 | 21 | concurrency: 22 | group: stale-issues 23 | cancel-in-progress: ${{ github.event_name != 'issue_comment' }} 24 | 25 | jobs: 26 | stale: 27 | if: > 28 | github.repository_owner == 'Homebrew' && ( 29 | github.event_name != 'issue_comment' || ( 30 | contains(github.event.issue.labels.*.name, 'stale') || 31 | contains(github.event.pull_request.labels.*.name, 'stale') 32 | ) 33 | ) 34 | runs-on: ubuntu-slim 35 | permissions: 36 | contents: write 37 | issues: write 38 | pull-requests: write 39 | steps: 40 | - name: Mark/Close Stale Issues and Pull Requests 41 | uses: actions/stale@997185467fa4f803885201cee163a9f38240193d # v10.1.1 42 | with: 43 | repo-token: ${{ secrets.GITHUB_TOKEN }} 44 | days-before-stale: 21 45 | days-before-close: 7 46 | stale-issue-message: > 47 | This issue has been automatically marked as stale because it has not had 48 | recent activity. It will be closed if no further activity occurs. 49 | stale-pr-message: > 50 | This pull request has been automatically marked as stale because it has not had 51 | recent activity. It will be closed if no further activity occurs. 52 | exempt-issue-labels: "gsoc-outreachy,help wanted,in progress" 53 | exempt-pr-labels: "gsoc-outreachy,help wanted,in progress" 54 | delete-branch: true 55 | 56 | bump-pr-stale: 57 | if: > 58 | github.repository_owner == 'Homebrew' && ( 59 | github.event_name != 'issue_comment' || ( 60 | contains(github.event.issue.labels.*.name, 'stale') || 61 | contains(github.event.pull_request.labels.*.name, 'stale') 62 | ) 63 | ) 64 | runs-on: ubuntu-slim 65 | permissions: 66 | contents: write 67 | issues: write 68 | pull-requests: write 69 | steps: 70 | - name: Mark/Close Stale `bump-formula-pr` and `bump-cask-pr` Pull Requests 71 | uses: actions/stale@997185467fa4f803885201cee163a9f38240193d # v10.1.1 72 | with: 73 | repo-token: ${{ secrets.GITHUB_TOKEN }} 74 | days-before-stale: 2 75 | days-before-close: 1 76 | stale-pr-message: > 77 | This pull request has been automatically marked as stale because it has not had 78 | recent activity. It will be closed if no further activity occurs. To keep this 79 | pull request open, add a `help wanted` or `in progress` label. 80 | exempt-pr-labels: "help wanted,in progress" 81 | any-of-labels: "bump-formula-pr,bump-cask-pr" 82 | delete-branch: true 83 | -------------------------------------------------------------------------------- /.github/workflows/actionlint.yml: -------------------------------------------------------------------------------- 1 | # This file is synced from the `.github` repository, do not modify it directly. 2 | name: Actionlint 3 | 4 | on: 5 | push: 6 | branches: 7 | - main 8 | - master 9 | pull_request: 10 | 11 | defaults: 12 | run: 13 | shell: bash -xeuo pipefail {0} 14 | 15 | concurrency: 16 | group: "actionlint-${{ github.ref }}" 17 | cancel-in-progress: ${{ github.event_name == 'pull_request' }} 18 | 19 | env: 20 | HOMEBREW_DEVELOPER: 1 21 | HOMEBREW_NO_AUTO_UPDATE: 1 22 | HOMEBREW_NO_ENV_HINTS: 1 23 | 24 | permissions: {} 25 | 26 | jobs: 27 | workflow_syntax: 28 | if: github.repository_owner == 'Homebrew' 29 | runs-on: ubuntu-latest 30 | permissions: 31 | contents: read 32 | container: 33 | image: ghcr.io/homebrew/ubuntu22.04:main 34 | steps: 35 | - name: Set up Homebrew 36 | id: setup-homebrew 37 | uses: Homebrew/actions/setup-homebrew@main 38 | with: 39 | core: false 40 | cask: false 41 | 42 | - name: Install tools 43 | run: brew install actionlint shellcheck zizmor 44 | 45 | - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 46 | with: 47 | persist-credentials: false 48 | 49 | - run: zizmor --format sarif . > results.sarif 50 | env: 51 | GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} 52 | 53 | - name: Upload SARIF file 54 | uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 55 | # We can't use the SARIF file when triggered by `merge_group` so we don't upload it. 56 | if: always() && github.event_name != 'merge_group' 57 | with: 58 | name: results.sarif 59 | path: results.sarif 60 | 61 | - name: Set up actionlint 62 | run: | 63 | # In homebrew-core, setting `shell: /bin/bash` prevents shellcheck from running on 64 | # those steps, so let's change them to `shell: bash` temporarily for better linting. 65 | sed -i 's|shell: /bin/bash -x|shell: bash -x|' .github/workflows/*.y*ml 66 | 67 | # In homebrew-core, the JSON matcher needs to be accessible to the container host. 68 | cp "$(brew --repository)/.github/actionlint-matcher.json" "$HOME" 69 | 70 | echo "::add-matcher::$HOME/actionlint-matcher.json" 71 | 72 | - run: actionlint 73 | 74 | upload_sarif: 75 | needs: workflow_syntax 76 | # We want to always upload this even if `actionlint` failed. 77 | # This is only available on public repositories. 78 | if: > 79 | always() && 80 | !contains(fromJSON('["cancelled", "skipped"]'), needs.workflow_syntax.result) && 81 | !github.event.repository.private && 82 | github.event_name != 'merge_group' 83 | runs-on: ubuntu-slim 84 | permissions: 85 | contents: read 86 | security-events: write 87 | steps: 88 | - name: Download SARIF file 89 | uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 90 | with: 91 | name: results.sarif 92 | path: results.sarif 93 | 94 | - name: Upload SARIF file 95 | uses: github/codeql-action/upload-sarif@fdbfb4d2750291e159f0156def62b853c2798ca2 # v4.31.5 96 | with: 97 | sarif_file: results.sarif 98 | category: zizmor 99 | -------------------------------------------------------------------------------- /.rubocop.yml: -------------------------------------------------------------------------------- 1 | # This file is synced from `Homebrew/brew` by the `.github` repository, do not modify it directly. 2 | --- 3 | AllCops: 4 | TargetRubyVersion: 3.4 5 | NewCops: enable 6 | Include: 7 | - "**/*.rbi" 8 | Exclude: 9 | - Homebrew/sorbet/rbi/{annotations,dsl,gems}/**/*.rbi 10 | - Homebrew/sorbet/rbi/parser*.rbi 11 | - Homebrew/bin/* 12 | - Homebrew/vendor/**/* 13 | - Taps/*/*/vendor/**/* 14 | - "**/.github/copilot-instructions.md" 15 | - "**/vendor/**/*" 16 | SuggestExtensions: 17 | rubocop-minitest: false 18 | Layout/ArgumentAlignment: 19 | Exclude: 20 | - Taps/*/*/*.rb 21 | - "/**/Formula/**/*.rb" 22 | - "**/Formula/**/*.rb" 23 | Layout/CaseIndentation: 24 | EnforcedStyle: end 25 | Layout/EmptyLinesAfterModuleInclusion: 26 | Enabled: false 27 | Layout/FirstArrayElementIndentation: 28 | EnforcedStyle: consistent 29 | Layout/FirstHashElementIndentation: 30 | EnforcedStyle: consistent 31 | Layout/EndAlignment: 32 | EnforcedStyleAlignWith: start_of_line 33 | Layout/HashAlignment: 34 | EnforcedHashRocketStyle: table 35 | EnforcedColonStyle: table 36 | Layout/LeadingCommentSpace: 37 | Exclude: 38 | - Taps/*/*/cmd/*.rb 39 | Layout/LineLength: 40 | Max: 118 41 | AllowedPatterns: 42 | - "#: " 43 | - ' url "' 44 | - ' mirror "' 45 | - " plist_options " 46 | - ' executable: "' 47 | - ' font "' 48 | - ' homepage "' 49 | - ' name "' 50 | - ' pkg "' 51 | - ' pkgutil: "' 52 | - " sha256 cellar: " 53 | - " sha256 " 54 | - "#{language}" 55 | - "#{version." 56 | - ' "/Library/Application Support/' 57 | - "\"/Library/Caches/" 58 | - "\"/Library/PreferencePanes/" 59 | - ' "~/Library/Application Support/' 60 | - "\"~/Library/Caches/" 61 | - "\"~/Library/Containers" 62 | - "\"~/Application Support" 63 | - " was verified as official when first introduced to the cask" 64 | Layout/SpaceAroundOperators: 65 | Enabled: false 66 | Layout/SpaceBeforeBrackets: 67 | Exclude: 68 | - "**/*_spec.rb" 69 | - Taps/*/*/*.rb 70 | - "/**/{Formula,Casks}/**/*.rb" 71 | - "**/{Formula,Casks}/**/*.rb" 72 | Lint/AmbiguousBlockAssociation: 73 | Enabled: false 74 | Lint/DuplicateBranch: 75 | Exclude: 76 | - Taps/*/*/*.rb 77 | - "/**/{Formula,Casks}/**/*.rb" 78 | - "**/{Formula,Casks}/**/*.rb" 79 | Lint/ParenthesesAsGroupedExpression: 80 | Exclude: 81 | - Taps/*/*/*.rb 82 | - "/**/Formula/**/*.rb" 83 | - "**/Formula/**/*.rb" 84 | Lint/UnusedMethodArgument: 85 | AllowUnusedKeywordArguments: true 86 | Metrics: 87 | Enabled: false 88 | Naming/BlockForwarding: 89 | Enabled: false 90 | Naming/FileName: 91 | Regex: !ruby/regexp /^[\w\@\-\+\.]+(\.rb)?$/ 92 | Naming/HeredocDelimiterNaming: 93 | ForbiddenDelimiters: 94 | - END, EOD, EOF 95 | Naming/InclusiveLanguage: 96 | CheckStrings: true 97 | FlaggedTerms: 98 | slave: 99 | AllowedRegex: 100 | - gitslave 101 | - log_slave 102 | - ssdb_slave 103 | - var_slave 104 | - patches/13_fix_scope_for_show_slave_status_data.patch 105 | Naming/MethodName: 106 | AllowedPatterns: 107 | - "\\A(fetch_)?HEAD\\?\\Z" 108 | Naming/MethodParameterName: 109 | inherit_mode: 110 | merge: 111 | - AllowedNames 112 | Naming/PredicateMethod: 113 | AllowBangMethods: true 114 | Naming/VariableNumber: 115 | Enabled: false 116 | Style/AndOr: 117 | EnforcedStyle: always 118 | Style/ArgumentsForwarding: 119 | Enabled: false 120 | Style/AutoResourceCleanup: 121 | Enabled: true 122 | Style/BarePercentLiterals: 123 | EnforcedStyle: percent_q 124 | Style/BlockDelimiters: 125 | BracesRequiredMethods: 126 | - sig 127 | Style/ClassAndModuleChildren: 128 | Exclude: 129 | - "**/*.rbi" 130 | Style/CollectionMethods: 131 | Enabled: true 132 | Style/DisableCopsWithinSourceCodeDirective: 133 | Enabled: true 134 | Include: 135 | - Taps/*/*/*.rb 136 | - "/**/{Formula,Casks}/**/*.rb" 137 | - "**/{Formula,Casks}/**/*.rb" 138 | Style/Documentation: 139 | Exclude: 140 | - Taps/**/* 141 | - "/**/{Formula,Casks}/**/*.rb" 142 | - "**/{Formula,Casks}/**/*.rb" 143 | - "**/*.rbi" 144 | Style/EmptyMethod: 145 | Exclude: 146 | - "**/*.rbi" 147 | Style/FetchEnvVar: 148 | Exclude: 149 | - Taps/*/*/*.rb 150 | - "/**/Formula/**/*.rb" 151 | - "**/Formula/**/*.rb" 152 | Style/FrozenStringLiteralComment: 153 | EnforcedStyle: always 154 | Exclude: 155 | - Taps/*/*/*.rb 156 | - "/**/{Formula,Casks}/**/*.rb" 157 | - "**/{Formula,Casks}/**/*.rb" 158 | - Homebrew/test/**/Casks/**/*.rb 159 | - "**/*.rbi" 160 | - "**/Brewfile" 161 | Style/GuardClause: 162 | Exclude: 163 | - Taps/*/*/*.rb 164 | - "/**/{Formula,Casks}/**/*.rb" 165 | - "**/{Formula,Casks}/**/*.rb" 166 | Style/HashAsLastArrayItem: 167 | Exclude: 168 | - Taps/*/*/*.rb 169 | - "/**/Formula/**/*.rb" 170 | - "**/Formula/**/*.rb" 171 | Style/InverseMethods: 172 | InverseMethods: 173 | :blank?: :present? 174 | Style/InvertibleUnlessCondition: 175 | Enabled: true 176 | InverseMethods: 177 | :==: :!= 178 | :zero?: 179 | :blank?: :present? 180 | Style/ItBlockParameter: 181 | Enabled: false 182 | Style/MutableConstant: 183 | EnforcedStyle: strict 184 | Style/NumericLiteralPrefix: 185 | EnforcedOctalStyle: zero_only 186 | Style/NumericLiterals: 187 | MinDigits: 11 188 | Strict: true 189 | Style/OpenStructUse: 190 | Exclude: 191 | - Taps/**/* 192 | Style/OptionalBooleanParameter: 193 | AllowedMethods: 194 | - respond_to? 195 | - respond_to_missing? 196 | Style/RescueStandardError: 197 | EnforcedStyle: implicit 198 | Style/ReturnNil: 199 | Enabled: true 200 | Style/StderrPuts: 201 | Enabled: false 202 | Style/StringConcatenation: 203 | Exclude: 204 | - Taps/*/*/*.rb 205 | - "/**/{Formula,Casks}/**/*.rb" 206 | - "**/{Formula,Casks}/**/*.rb" 207 | Style/StringLiterals: 208 | EnforcedStyle: double_quotes 209 | Style/StringLiteralsInInterpolation: 210 | EnforcedStyle: double_quotes 211 | Style/StringMethods: 212 | Enabled: true 213 | Style/SuperWithArgsParentheses: 214 | Enabled: false 215 | Style/SymbolArray: 216 | EnforcedStyle: brackets 217 | Style/TernaryParentheses: 218 | EnforcedStyle: require_parentheses_when_complex 219 | Style/TopLevelMethodDefinition: 220 | Enabled: true 221 | Exclude: 222 | - Taps/**/* 223 | Style/TrailingCommaInArguments: 224 | EnforcedStyleForMultiline: comma 225 | Style/TrailingCommaInArrayLiteral: 226 | EnforcedStyleForMultiline: comma 227 | Style/TrailingCommaInHashLiteral: 228 | EnforcedStyleForMultiline: comma 229 | Style/UnlessLogicalOperators: 230 | Enabled: true 231 | EnforcedStyle: forbid_logical_operators 232 | Style/WordArray: 233 | MinSize: 4 234 | 235 | --------------------------------------------------------------------------------