diff options
author | Matthew Strapp <matt@mattstrapp.net> | 2024-10-28 13:37:20 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-28 13:37:20 -0500 |
commit | 7f1529eb1c6be69318f95f2ce90b09bcf0eec232 (patch) | |
tree | 72b1a2adb1ac248f6dda903b89e6c77ee84531a0 | |
download | scoop-7f1529eb1c6be69318f95f2ce90b09bcf0eec232.tar scoop-7f1529eb1c6be69318f95f2ce90b09bcf0eec232.tar.gz scoop-7f1529eb1c6be69318f95f2ce90b09bcf0eec232.tar.bz2 scoop-7f1529eb1c6be69318f95f2ce90b09bcf0eec232.tar.lz scoop-7f1529eb1c6be69318f95f2ce90b09bcf0eec232.tar.xz scoop-7f1529eb1c6be69318f95f2ce90b09bcf0eec232.tar.zst scoop-7f1529eb1c6be69318f95f2ce90b09bcf0eec232.zip |
Initial commit
29 files changed, 568 insertions, 0 deletions
diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..09a7419 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,16 @@ +# EditorConfig (is awesome): http://EditorConfig.org + +# * top-most EditorConfig file +root = true + +# default style settings +[*] +charset = utf-8 +end_of_line = crlf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.{yml,yaml}] +indent_size = 2 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..662a152 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +# Since Scoop is a Windows-only tool, we can safely use CRLF line endings for all text files. +# If Git decides that the content is text, its line endings will be normalized to CRLF in the working tree on checkout. +# In the Git index/repository the files will always be stored with LF line endings. This is fine. +* text=auto eol=crlf diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml new file mode 100644 index 0000000..9f313b0 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -0,0 +1,113 @@ +name: 🐛 Bug Report +description: Open an issue about a bug that needs fixing. +title: "[Bug]: " +labels: ["bug"] +body: +- type: checkboxes + attributes: + label: Prerequisites + options: + - label: I have written a descriptive issue title. + required: true + - label: I have searched all issues/PRs to ensure it has not already been reported or fixed. + required: true + - label: I have verified that I am using the latest version of Scoop and corresponding bucket. + required: true +- type: input + attributes: + label: Package Name + description: Name of package (install name) which has bug(s) + placeholder: e.g. 7zip (not '7-Zip') + validations: + required: true +- type: textarea + attributes: + label: Expected/Current Behaviour + description: A clear and concise description of what you expected to happen and what actually happen. + placeholder: I am experiencing a problem with X. I think Y should be happening but Z is actually happening. + validations: + required: true +- type: textarea + attributes: + label: Steps to Reproduce + description: List of steps, sample code or failing test that reproduces the behavior. + render: console + placeholder: | + PS> scoop install tests/meson + Installing 'meson' (0.61.1) [64bit] + Loading meson-0.61.1-64.msi from cache. + Checking hash of meson-0.61.1-64.msi ... ok. + Extracting meson-0.61.1-64.msi ... done. + Running installer script... + Linking D:\Scoop\apps\meson\current => D:\Scoop\apps\meson\0.61.1 + Creating shim for 'meson'. + Can't shim 'meson.exe': File doesn't exist. + validations: + required: true +- type: textarea + attributes: + label: Possible Solution + description: Do you have some suggestions on a fix for the bug? + placeholder: I am experiencing a problem with X. I think Y should be happening but Z is actually happening. + validations: + required: true +- type: textarea + attributes: + label: Scoop and Buckets Version + description: Paste verbatim output from `scoop --version` below. + render: console + placeholder: | + PS> scoop --version + Current Scoop version: + c60df9cd (HEAD -> develop, origin/develop) docs(changelog): Prepare for version 0.3.1 (#5248) + + 'extras' bucket: + ea314b213 (HEAD -> master, origin/master, origin/HEAD) lazygit: Update to version 0.36.0 + + 'main' bucket: + c6e688d4d (HEAD -> master, origin/master, origin/HEAD) x265: Update to version 3.5+68-40e37bc + validations: + required: true +- type: textarea + attributes: + label: Scoop Config + description: Paste verbatim output from `scoop config` below. + render: console + placeholder: | + PS> scoop config + + last_update : 2022/11/14 22:05:50 + scoop_repo : https://github.com/ScoopInstaller/Scoop + scoop_branch : develop + use_lessmsi : True + aria2-enabled : True + aria2-warning-enabled : False + validations: + required: true +- type: textarea + attributes: + label: PowerShell Version + description: Paste verbatim output from `$PSVersionTable` below. + render: console + placeholder: | + PS> $PSVersionTable + + Name Value + ---- ----- + PSVersion 7.3.0 + PSEdition Core + GitCommitId 7.3.0 + OS Microsoft Windows 10.0.25236 + Platform Win32NT + PSCompatibleVersions {1.0, 2.0, 3.0, 4.0…} + PSRemotingProtocolVersion 2.3 + SerializationVersion 1.1.0.1 + WSManStackVersion 3.0 + validations: + required: true +- type: textarea + attributes: + label: Additional Softwares + description: List any additional software that you are using and may be related to this bug. + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..2a2a0ff --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,6 @@ +# yaml-language-server: $schema=https://json.schemastore.org/github-issue-config.json +blank_issues_enabled: true +contact_links: + - name: Scoop Community Support + url: https://github.com/ScoopInstaller/Scoop/discussions + about: Please ask Scoop related questions here. diff --git a/.github/ISSUE_TEMPLATE/hash-error.yml b/.github/ISSUE_TEMPLATE/hash-error.yml new file mode 100644 index 0000000..0214fd8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/hash-error.yml @@ -0,0 +1,19 @@ +name: 🔢 Hash Error +description: Open an issue about a package's hash is incorrect. +labels: ["bug"] +body: +- type: checkboxes + attributes: + label: Prerequisites + options: + - label: I have used the predefined issue title. (e.g. "xxx@xxx: hash check failed") + required: true + - label: I have verified that I am using the latest version of Scoop and corresponding bucket. + required: true +- type: input + attributes: + label: Package Name and Version + description: Name and version of package (install name) which has incorrect hash. + placeholder: e.g. 7zip@21.00 (not '7-Zip') + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/package-request.yml b/.github/ISSUE_TEMPLATE/package-request.yml new file mode 100644 index 0000000..c86901e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/package-request.yml @@ -0,0 +1,52 @@ +name: 📦 Package Request +description: Open an issue about a missing package. +title: "[Request]: " +labels: ["package-request"] +body: +- type: checkboxes + attributes: + label: Prerequisites + options: + - label: I have searched all issues/PRs to ensure it has not already been reported or fixed. + required: true +- type: checkboxes + attributes: + label: Criteria + description: For a package to be acceptable in this bucket, it should be + options: + - label: Criteria 1 + required: true + - label: Criteria 2 + required: true + - label: Criteria 3 + required: true +- type: input + attributes: + label: Name + description: Name of the package + validations: + required: true +- type: input + attributes: + label: Description + description: Clear and concise details of what it is + validations: + required: true +- type: input + attributes: + label: Homepage + description: URI of the package's homepage + validations: + required: true +- type: input + attributes: + label: Download Link(s) + description: URI(s) of the package's download(s) + validations: + required: true +- type: textarea + attributes: + label: Some Indication of Popularity/Repute + description: GitHub stars/software reviews etc. + validations: + required: true diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..f7dd672 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,15 @@ +<!-- Provide a general summary of your changes in the title above --> + +<!-- + By opening this PR you confirm that you have searched for similar issues/PRs here already. + Failing to do so will most likely result in closing of this PR without any explanation. + It is also mandatory to open a relevant issue (either Package Request or Bug Report) for + discussion with the maintainers, before creating any new PR. + Read the contributing guide first to save both your and our time. +--> + +Closes #XXXX +<!-- or --> +Relates to #XXXX + +- [ ] I have read the [Contributing Guide](https://github.com/ScoopInstaller/.github/blob/main/.github/CONTRIBUTING.md). diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..7901b19 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,59 @@ +name: Tests + +on: + push: + branches: + - 'main' + - 'master' + pull_request: + workflow_dispatch: + +jobs: + test_powershell: + name: WindowsPowerShell + runs-on: windows-latest + steps: + - name: Checkout Bucket + uses: actions/checkout@main + with: + fetch-depth: 2 + path: my_bucket + - name: Checkout Scoop + uses: actions/checkout@main + with: + repository: ScoopInstaller/Scoop + path: scoop_core + - name: Init Test Suite + uses: potatoqualitee/psmodulecache@main + with: + modules-to-cache: BuildHelpers + shell: powershell + - name: Test Bucket + shell: powershell + run: | + $env:SCOOP_HOME="$(Convert-Path '.\scoop_core')" + .\my_bucket\bin\test.ps1 + test_pwsh: + name: PowerShell + runs-on: windows-latest + steps: + - name: Checkout Bucket + uses: actions/checkout@main + with: + fetch-depth: 2 + path: my_bucket + - name: Checkout Scoop + uses: actions/checkout@main + with: + repository: ScoopInstaller/Scoop + path: scoop_core + - name: Init Test Suite + uses: potatoqualitee/psmodulecache@main + with: + modules-to-cache: BuildHelpers + shell: pwsh + - name: Test Bucket + shell: pwsh + run: | + $env:SCOOP_HOME="$(Convert-Path '.\scoop_core')" + .\my_bucket\bin\test.ps1 diff --git a/.github/workflows/excavator.yml b/.github/workflows/excavator.yml new file mode 100644 index 0000000..e5279eb --- /dev/null +++ b/.github/workflows/excavator.yml @@ -0,0 +1,17 @@ +on: + workflow_dispatch: + schedule: + # run every 4 hours + - cron: '20 */4 * * *' +name: Excavator +jobs: + excavate: + name: Excavate + runs-on: windows-latest + steps: + - uses: actions/checkout@main + - name: Excavate + uses: ScoopInstaller/GithubActions@main + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SKIP_UPDATED: 1 diff --git a/.github/workflows/issue_comment.yml b/.github/workflows/issue_comment.yml new file mode 100644 index 0000000..24b9018 --- /dev/null +++ b/.github/workflows/issue_comment.yml @@ -0,0 +1,15 @@ +on: + issue_comment: + types: [created] +name: Commented Pull Request +jobs: + pullRequestHandler: + name: PullRequestHandler + runs-on: windows-latest + steps: + - uses: actions/checkout@main + - name: PullRequestHandler + uses: ScoopInstaller/GithubActions@main + if: startsWith(github.event.comment.body, '/verify') + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/issues.yml b/.github/workflows/issues.yml new file mode 100644 index 0000000..0c8b859 --- /dev/null +++ b/.github/workflows/issues.yml @@ -0,0 +1,15 @@ +on: + issues: + types: [opened, labeled] +name: Issues +jobs: + issueHandler: + name: IssueHandler + runs-on: windows-latest + steps: + - uses: actions/checkout@main + - name: IssueHandler + uses: ScoopInstaller/GithubActions@main + if: github.event.action == 'opened' || (github.event.action == 'labeled' && contains(github.event.issue.labels.*.name, 'verify')) + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml new file mode 100644 index 0000000..ad312d5 --- /dev/null +++ b/.github/workflows/pull_request.yml @@ -0,0 +1,14 @@ +on: + pull_request_target: + types: [opened] +name: Pull Requests +jobs: + pullRequestHandler: + name: PullRequestHandler + runs-on: windows-latest + steps: + - uses: actions/checkout@main + - name: PullRequestHandler + uses: ScoopInstaller/GithubActions@main + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c221b4a --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +*.sublime-workspace +*~ +._* +page.html +checkver-*.html diff --git a/.markdownlint.json b/.markdownlint.json new file mode 100644 index 0000000..ef592cf --- /dev/null +++ b/.markdownlint.json @@ -0,0 +1,6 @@ +{ + "MD013": false, + "MD024": { + "siblings_only": true + } +} diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..a9056e4 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,6 @@ +{ + "recommendations": [ + "EditorConfig.EditorConfig", + "ms-vscode.PowerShell" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..6a49c46 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,27 @@ +// Configure PSScriptAnalyzer settings +{ + "[powershell]": { + "editor.formatOnSave": true + }, + "powershell.scriptAnalysis.settingsPath": "PSScriptAnalyzerSettings.psd1", + "powershell.codeFormatting.preset": "OTBS", + "powershell.codeFormatting.alignPropertyValuePairs": true, + "powershell.codeFormatting.ignoreOneLineBlock": true, + "json.schemas": [ + { + "url": "https://raw.githubusercontent.com/ScoopInstaller/Scoop/master/schema.json", + "fileMatch": [ + "bucket/**/*.json" + ] + } + ], + "files.insertFinalNewline": true, + "files.exclude": { + "**/.git": true, + "**/.svn": true, + "**/.hg": true, + "**/CVS": true, + "**/.DS_Store": true, + "**/tmp": true + } +} @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to <https://unlicense.org> diff --git a/README.md b/README.md new file mode 100644 index 0000000..a53d3d7 --- /dev/null +++ b/README.md @@ -0,0 +1,42 @@ +# Scoop Bucket Template + +<!-- Uncomment the following line after replacing placeholders --> +<!-- [![Tests](https://github.com/<username>/<bucketname>/actions/workflows/ci.yml/badge.svg)](https://github.com/<username>/<bucketname>/actions/workflows/ci.yml) [![Excavator](https://github.com/<username>/<bucketname>/actions/workflows/excavator.yml/badge.svg)](https://github.com/<username>/<bucketname>/actions/workflows/excavator.yml) --> + +Template bucket for [Scoop](https://scoop.sh), the Windows command-line installer. + +## How do I use this template? + +1. Generate your own copy of this repository with the "Use this template" + button. +2. Allow all GitHub Actions: + - Navigate to `Settings` - `Actions` - `General` - `Actions permissions`. + - Select `Allow all actions and reusable workflows`. + - Then `Save`. +3. Allow writing to the repository from within GitHub Actions: + - Navigate to `Settings` - `Actions` - `General` - `Workflow permissions`. + - Select `Read and write permissions`. + - Then `Save`. +4. Document the bucket in `README.md`. +5. Replace the placeholder repository string in `bin/auto-pr.ps1`. +6. Create new manifests by copying `bucket/app-name.json.template` to + `bucket/<app-name>.json`. +7. Commit and push changes. +8. If you'd like your bucket to be indexed on `https://scoop.sh`, add the + topic `scoop-bucket` to your repository. + +## How do I install these manifests? + +After manifests have been committed and pushed, run the following: + +```pwsh +scoop bucket add <bucketname> https://github.com/<username>/<bucketname> +scoop install <bucketname>/<manifestname> +``` + +## How do I contribute new manifests? + +To make a new manifest contribution, please read the [Contributing +Guide](https://github.com/ScoopInstaller/.github/blob/main/.github/CONTRIBUTING.md) +and [App Manifests](https://github.com/ScoopInstaller/Scoop/wiki/App-Manifests) +wiki page. diff --git a/Scoop-Bucket.Tests.ps1 b/Scoop-Bucket.Tests.ps1 new file mode 100644 index 0000000..5e620e8 --- /dev/null +++ b/Scoop-Bucket.Tests.ps1 @@ -0,0 +1,2 @@ +if (!$env:SCOOP_HOME) { $env:SCOOP_HOME = Resolve-Path (scoop prefix scoop) } +. "$env:SCOOP_HOME\test\Import-Bucket-Tests.ps1" diff --git a/bin/auto-pr.ps1 b/bin/auto-pr.ps1 new file mode 100644 index 0000000..3a91818 --- /dev/null +++ b/bin/auto-pr.ps1 @@ -0,0 +1,9 @@ +param( + # overwrite upstream param + [String]$upstream = "<username>/<bucketname>:main" +) + +if (!$env:SCOOP_HOME) { $env:SCOOP_HOME = Convert-Path (scoop prefix scoop) } +$autopr = "$env:SCOOP_HOME/bin/auto-pr.ps1" +$dir = "$PSScriptRoot/../bucket" # checks the parent dir +& $autopr -Dir $dir -Upstream $Upstream @Args diff --git a/bin/checkhashes.ps1 b/bin/checkhashes.ps1 new file mode 100644 index 0000000..6e7e052 --- /dev/null +++ b/bin/checkhashes.ps1 @@ -0,0 +1,4 @@ +if (!$env:SCOOP_HOME) { $env:SCOOP_HOME = Convert-Path (scoop prefix scoop) } +$checkhashes = "$env:SCOOP_HOME/bin/checkhashes.ps1" +$dir = "$PSScriptRoot/../bucket" # checks the parent dir +& $checkhashes -Dir $dir @Args diff --git a/bin/checkurls.ps1 b/bin/checkurls.ps1 new file mode 100644 index 0000000..4895d54 --- /dev/null +++ b/bin/checkurls.ps1 @@ -0,0 +1,4 @@ +if (!$env:SCOOP_HOME) { $env:SCOOP_HOME = Convert-Path (scoop prefix scoop) } +$checkurls = "$env:SCOOP_HOME/bin/checkurls.ps1" +$dir = "$PSScriptRoot/../bucket" # checks the parent dir +& $checkurls -Dir $dir @Args diff --git a/bin/checkver.ps1 b/bin/checkver.ps1 new file mode 100644 index 0000000..9bce8b4 --- /dev/null +++ b/bin/checkver.ps1 @@ -0,0 +1,4 @@ +if (!$env:SCOOP_HOME) { $env:SCOOP_HOME = Convert-Path (scoop prefix scoop) } +$checkver = "$env:SCOOP_HOME/bin/checkver.ps1" +$dir = "$PSScriptRoot/../bucket" # checks the parent dir +& $checkver -Dir $dir @Args diff --git a/bin/formatjson.ps1 b/bin/formatjson.ps1 new file mode 100644 index 0000000..2766bbc --- /dev/null +++ b/bin/formatjson.ps1 @@ -0,0 +1,4 @@ +if (!$env:SCOOP_HOME) { $env:SCOOP_HOME = Convert-Path (scoop prefix scoop) } +$formatjson = "$env:SCOOP_HOME/bin/formatjson.ps1" +$path = "$PSScriptRoot/../bucket" # checks the parent dir +& $formatjson -Dir $path @Args diff --git a/bin/missing-checkver.ps1 b/bin/missing-checkver.ps1 new file mode 100644 index 0000000..e375704 --- /dev/null +++ b/bin/missing-checkver.ps1 @@ -0,0 +1,4 @@ +if (!$env:SCOOP_HOME) { $env:SCOOP_HOME = Convert-Path (scoop prefix scoop) } +$missing_checkver = "$env:SCOOP_HOME/bin/missing-checkver.ps1" +$dir = "$PSScriptRoot/../bucket" # checks the parent dir +& $missing_checkver -Dir $dir @Args diff --git a/bin/test.ps1 b/bin/test.ps1 new file mode 100644 index 0000000..5c64841 --- /dev/null +++ b/bin/test.ps1 @@ -0,0 +1,15 @@ +#Requires -Version 5.1 +#Requires -Modules @{ ModuleName = 'BuildHelpers'; ModuleVersion = '2.0.1' } +#Requires -Modules @{ ModuleName = 'Pester'; ModuleVersion = '5.2.0' } + +$pesterConfig = New-PesterConfiguration -Hashtable @{ + Run = @{ + Path = "$PSScriptRoot/.." + PassThru = $true + } + Output = @{ + Verbosity = 'Detailed' + } +} +$result = Invoke-Pester -Configuration $pesterConfig +exit $result.FailedCount diff --git a/bucket/app-name.json.template b/bucket/app-name.json.template new file mode 100644 index 0000000..e3bbbd2 --- /dev/null +++ b/bucket/app-name.json.template @@ -0,0 +1,63 @@ +{ + "##": "This file is a template. Fill the blanks and add or remove fields as necessary.", + "version": "", + "description": "", + "homepage": "", + "license": "", + "notes": "", + "architecture": { + "64bit": { + "url": "", + "hash": "" + }, + "32bit": { + "url": "", + "hash": "" + }, + "arm64": { + "url": "", + "hash": "" + } + }, + "pre_install": "", + "installer": { + "script": "" + }, + "post_install": [ + "", + "" + ], + "uninstaller": { + "script": "" + }, + "bin": "", + "env_add_path": [ + "", + "" + ], + "persist": [ + "", + "" + ], + "checkver": { + "url": "", + "regex": "" + }, + "autoupdate": { + "architecture": { + "64bit": { + "url": "" + }, + "32bit": { + "url": "" + }, + "arm64": { + "url": "" + } + }, + "hash": { + "url": "", + "regex": "" + } + } +} diff --git a/deprecated/.gitkeep b/deprecated/.gitkeep new file mode 100644 index 0000000..0a1c7c4 --- /dev/null +++ b/deprecated/.gitkeep @@ -0,0 +1,2 @@ +# This directory stores all the deprecated JSON manifests, which are not meant to be installed. +# Delete this '.gitkeep' file once this directory has any files. diff --git a/scripts/.gitkeep b/scripts/.gitkeep new file mode 100644 index 0000000..2f6a3f6 --- /dev/null +++ b/scripts/.gitkeep @@ -0,0 +1,2 @@ +# This directory stores helper files like shell scripts, registry entries etc. for installable applications. +# Delete this '.gitkeep' file once this directory has any files. |