From b273aecc6551e354905446ba7ff16851f188bf6d Mon Sep 17 00:00:00 2001 From: Daniel Cazzulino Date: Fri, 12 Feb 2021 12:41:09 -0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=96=86=20Apply=20devlooped/oss=20template?= =?UTF-8?q?=20via=20dotnet-file?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Revamped workflows ensure (among many other things) that we never push debug builds to nuget.org. Fixes #17 Fixes #15 --- .editorconfig | 26 +-- .gitattributes | 81 +++------ .github/FUNDING.yml | 1 + .github/ISSUE_TEMPLATE/bug.md | 50 ++++++ .github/ISSUE_TEMPLATE/config.yml | 8 + .github/dependabot.yml | 3 + .github/workflows/build.yml | 61 +++++-- .github/workflows/changelog.yml | 37 +++++ .github/workflows/pages.yml | 44 +++++ .github/workflows/publish.yml | 40 +++++ .github/workflows/release-artifacts.yml | 49 ++++++ .github/workflows/release-notes.yml | 56 +++++++ .github/workflows/release.yml | 23 --- .github/workflows/sponsors.ps1 | 57 +++++++ .github/workflows/sponsors.yml | 25 +++ .gitignore | 34 ++-- .netconfig | 131 +++++++++++++++ Directory.Build.rsp | 5 + Gemfile | 3 + SmallSharp.sln | 11 +- _config.yml | 2 + assets/css/style.scss | 17 ++ assets/images/sponsors.png | Bin 0 -> 10411 bytes assets/images/sponsors.svg | 3 + code-of-conduct.md | 6 + global.json | 8 - LICENSE => license.txt | 5 +- README.md => readme.md | 0 security.md | 9 + src/Directory.Build.props | 134 ++++++++++++--- src/Directory.Build.targets | 154 ++++++++++++++++-- src/Directory.props | 10 ++ src/SmallSharp.Build/ActiveDocumentMonitor.cs | 2 +- src/SmallSharp.Build/OpenStartupFile.cs | 2 +- src/SmallSharp.Build/SmallSharp.Build.csproj | 1 + .../AnalyzerConfigOptionsExtensions.cs | 2 +- src/SmallSharp/SmallSharp.csproj | 3 +- src/icon.png | Bin 0 -> 9081 bytes src/kzu.snk | Bin 0 -> 596 bytes support.md | 9 + 40 files changed, 944 insertions(+), 168 deletions(-) create mode 100644 .github/FUNDING.yml create mode 100644 .github/ISSUE_TEMPLATE/bug.md create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/workflows/changelog.yml create mode 100644 .github/workflows/pages.yml create mode 100644 .github/workflows/publish.yml create mode 100644 .github/workflows/release-artifacts.yml create mode 100644 .github/workflows/release-notes.yml delete mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/sponsors.ps1 create mode 100644 .github/workflows/sponsors.yml create mode 100644 .netconfig create mode 100644 Directory.Build.rsp create mode 100644 Gemfile create mode 100644 assets/css/style.scss create mode 100644 assets/images/sponsors.png create mode 100644 assets/images/sponsors.svg create mode 100644 code-of-conduct.md delete mode 100644 global.json rename LICENSE => license.txt (93%) rename README.md => readme.md (100%) create mode 100644 security.md create mode 100644 src/Directory.props create mode 100644 src/icon.png create mode 100644 src/kzu.snk create mode 100644 support.md diff --git a/.editorconfig b/.editorconfig index ef69bbe..c434eb5 100644 --- a/.editorconfig +++ b/.editorconfig @@ -13,11 +13,11 @@ indent_style = space indent_size = 4 # Xml project files -[*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,projitems,shproj}] +[*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,projitems,shproj,msbuildproj,props,targets}] indent_size = 2 # Xml config files -[*.{props,targets,ruleset,config,nuspec,resx,vsixmanifest,vsct}] +[*.{ruleset,config,nuspec,resx,vsixmanifest,vsct}] indent_size = 2 # YAML files @@ -50,16 +50,23 @@ dotnet_style_null_propagation = true:suggestion dotnet_style_explicit_tuple_names = true:suggestion # CSharp code style settings: + +# IDE0040: Add accessibility modifiers +dotnet_style_require_accessibility_modifiers = omit_if_default:error + +# IDE0040: Add accessibility modifiers +dotnet_diagnostic.IDE0040.severity = error + [*.cs] # Prefer "var" everywhere csharp_style_var_for_built_in_types = true:suggestion csharp_style_var_when_type_is_apparent = true:suggestion csharp_style_var_elsewhere = true:suggestion -# Prefer method-like constructs to have a block body -csharp_style_expression_bodied_methods = false:none -csharp_style_expression_bodied_constructors = false:none -csharp_style_expression_bodied_operators = false:none +# Prefer method-like constructs to have an expression-body +csharp_style_expression_bodied_methods = true:none +csharp_style_expression_bodied_constructors = true:none +csharp_style_expression_bodied_operators = true:none # Prefer property-like constructs to have an expression-body csharp_style_expression_bodied_properties = true:none @@ -67,8 +74,8 @@ csharp_style_expression_bodied_indexers = true:none csharp_style_expression_bodied_accessors = true:none # Suggest more modern language features when available -csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion -csharp_style_pattern_matching_over_as_with_null_check = true:suggestion +csharp_style_pattern_matching_over_is_with_cast_check = true:error +csharp_style_pattern_matching_over_as_with_null_check = true:error csharp_style_inlined_variable_declaration = true:suggestion csharp_style_throw_expression = true:suggestion csharp_style_conditional_delegate_call = true:suggestion @@ -80,6 +87,3 @@ csharp_new_line_before_catch = true csharp_new_line_before_finally = true csharp_new_line_before_members_in_object_initializers = true csharp_new_line_before_members_in_anonymous_types = true - -# RS2008: Enable analyzer release tracking -dotnet_diagnostic.RS2008.severity = none diff --git a/.gitattributes b/.gitattributes index 1ff0c42..7c37579 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,63 +1,24 @@ -############################################################################### -# Set default behavior to automatically normalize line endings. -############################################################################### -* text=auto +# sln, csproj files (and friends) are always CRLF, even on linux +*.sln text eol=crlf +*.proj text eol=crlf +*.csproj text eol=crlf -############################################################################### -# Set default behavior for command prompt diff. -# -# This is need for earlier builds of msysgit that does not have it on by -# default for csharp files. -# Note: This is only used by command line -############################################################################### -#*.cs diff=csharp +# These are windows specific files which we may as well ensure are +# always crlf on checkout +*.bat text eol=crlf +*.cmd text eol=crlf -############################################################################### -# Set the merge driver for project and solution files -# -# Merging from the command prompt will add diff markers to the files if there -# are conflicts (Merging from VS is not affected by the settings below, in VS -# the diff markers are never inserted). Diff markers may cause the following -# file extensions to fail to load in VS. An alternative would be to treat -# these files as binary and thus will always conflict and require user -# intervention with every merge. To do so, just uncomment the entries below -############################################################################### -#*.sln merge=binary -#*.csproj merge=binary -#*.vbproj merge=binary -#*.vcxproj merge=binary -#*.vcproj merge=binary -#*.dbproj merge=binary -#*.fsproj merge=binary -#*.lsproj merge=binary -#*.wixproj merge=binary -#*.modelproj merge=binary -#*.sqlproj merge=binary -#*.wwaproj merge=binary +# Opt in known filetypes to always normalize line endings on checkin +# and always use native endings on checkout +*.c text +*.config text +*.h text +*.cs text +*.md text +*.tt text +*.txt text -############################################################################### -# behavior for image files -# -# image files are treated as binary by default. -############################################################################### -#*.jpg binary -#*.png binary -#*.gif binary - -############################################################################### -# diff behavior for common document formats -# -# Convert binary document formats to text before diffing them. This feature -# is only available from the command line. Turn it on by uncommenting the -# entries below. -############################################################################### -#*.doc diff=astextplain -#*.DOC diff=astextplain -#*.docx diff=astextplain -#*.DOCX diff=astextplain -#*.dot diff=astextplain -#*.DOT diff=astextplain -#*.pdf diff=astextplain -#*.PDF diff=astextplain -#*.rtf diff=astextplain -#*.RTF diff=astextplain +# Some must always be checked out as lf so enforce that for those files +# If these are not lf then bash/cygwin on windows will not be able to +# excute the files +*.sh text eol=lf \ No newline at end of file diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..a105ac5 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: devlooped diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md new file mode 100644 index 0000000..67f7595 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.md @@ -0,0 +1,50 @@ +--- +name: Bug Report +about: Create a report to help us fix a problem. +title: '' +labels: 'bug' +assignees: '' +--- + +## Describe the Bug + + + +## Steps to Reproduce + + + +```c# +public class ReproTest +{ + [Fact] + public void Repro() + { + // arrange + + // act + + // assert + } +} +``` + +## Expected Behavior + + + +## Exception with Stack Trace + + + +```text +Put the exception with stack trace here. +``` + +## Version Info + + + +## Additional Info + + diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..d29d9bf --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: false +contact_links: + - name: Questions + url: https://github.com/kzu/oss/discussions?discussions_q=category%3AQ%26A + about: Want to know how to do something? Check out the Discussions > Q&A area! + - name: Ideas + url: https://github.com/kzu/oss/discussions?discussions_q=category%3AIdeas + about: Suggest an idea to make the project better through the Discussions > Ideas area! diff --git a/.github/dependabot.yml b/.github/dependabot.yml index c8ca9b7..9bd9700 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,3 +1,6 @@ +# Please see the documentation for all configuration options: +# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + version: 2 updates: - package-ecosystem: nuget diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2ed592f..1b62350 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,7 +1,10 @@ -ο»Ώname: build +ο»Ώ# Builds and runs tests in all three supported OSes +# Pushes CI feed if secrets.SLEET_CONNECTION is provided + +name: build on: push: - branches: ['*'] + branches: [ main, dev, 'feature/*', 'rel/*' ] pull_request: types: [opened, synchronize, reopened] @@ -9,20 +12,58 @@ env: DOTNET_NOLOGO: true MSBUILDDISABLENODEREUSE: 1 +defaults: + run: + shell: bash + jobs: - build: + dotnet-format: runs-on: ubuntu-latest steps: - name: 🀘 checkout uses: actions/checkout@v2 - - name: βš™ dotnet 5.0.x - uses: actions/setup-dotnet@v1 - with: - dotnet-version: 5.0.x + - name: βœ“ ensure format + run: | + dotnet tool update -g dotnet-format --version 5.0.* --add-source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json + dotnet format --check -v:diag + + build: + name: build-${{ matrix.os }} + needs: dotnet-format + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macOS-latest] + steps: + - name: 🀘 checkout + uses: actions/checkout@v2 + with: + submodules: recursive + fetch-depth: 0 + - name: πŸ™ build - run: dotnet build -p:versionsuffix="$(git name-rev --name-only --refs=refs/heads/* HEAD).$GITHUB_RUN_NUMBER" + run: dotnet build -m:1 -bl:build.binlog -p:VersionLabel="$GITHUB_REF.$GITHUB_RUN_NUMBER" -p:RepositoryBranch=${GITHUB_REF#refs/*/} + + - name: πŸ§ͺ test + run: dotnet test --no-build -m:1 --blame-hang --blame-hang-timeout 5m -d $GITHUB_WORKSPACE/logs/${{ matrix.os }}.txt -r $GITHUB_WORKSPACE/logs + + - name: πŸ“¦ pack + run: dotnet pack -m:1 -bl:pack.binlog -p:VersionLabel="$GITHUB_REF.$GITHUB_RUN_NUMBER" -p:RepositoryBranch=${GITHUB_REF#refs/*/} + + - name: πŸ”Ό logs + if: always() + uses: actions/upload-artifact@v2 + with: + name: ${{ matrix.os }} + path: | + **/*.binlog + logs/**/*.* + + # Only push CI package to sleet feed if building on ubuntu (fastest) - name: πŸš€ sleet - if: ${{ !github.event.pull_request.head.repo.fork }} + env: + SLEET_CONNECTION: ${{ secrets.SLEET_CONNECTION }} + if: matrix.os == 'ubuntu-latest' && env.SLEET_CONNECTION != '' run: | dotnet tool install -g --version 3.2.0 sleet - sleet push bin --config none -f --verbose -p "SLEET_FEED_CONTAINER=nuget" -p "SLEET_FEED_CONNECTIONSTRING=${{ secrets.SLEET_CONNECTION }}" -p "SLEET_FEED_TYPE=azure" \ No newline at end of file + sleet push bin --config none -f --verbose -p "SLEET_FEED_CONTAINER=nuget" -p "SLEET_FEED_CONNECTIONSTRING=${{ secrets.SLEET_CONNECTION }}" -p "SLEET_FEED_TYPE=azure" diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml new file mode 100644 index 0000000..5bf5c0d --- /dev/null +++ b/.github/workflows/changelog.yml @@ -0,0 +1,37 @@ +ο»Ώname: changelog +on: + release: + types: [released] + +env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + +jobs: + changelog: + runs-on: ubuntu-latest + steps: + - name: πŸ” GH_TOKEN + if: env.GH_TOKEN == '' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: echo "GH_TOKEN=${GITHUB_TOKEN}" >> $GITHUB_ENV + + - name: 🀘 checkout + uses: actions/checkout@v2 + with: + fetch-depth: 0 + ref: main + token: ${{ env.GH_TOKEN }} + + - name: βš™ changelog + uses: faberNovel/github-changelog-generator-action@master + with: + options: --token ${{ secrets.GITHUB_TOKEN }} --o changelog.md + + - name: πŸš€ changelog + run: | + git config --local user.name github-actions + git config --local user.email github-actions@github.com + git add changelog.md + git commit -m "πŸ–‰ Update changelog with ${GITHUB_REF#refs/*/}" + git push \ No newline at end of file diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml new file mode 100644 index 0000000..eea5601 --- /dev/null +++ b/.github/workflows/pages.yml @@ -0,0 +1,44 @@ +name: pages +on: + push: + branches: + - main + - pages + +jobs: + gh-pages: + runs-on: ubuntu-latest + steps: + - name: 🀘 checkout + uses: actions/checkout@v2 + + - name: βš™ jekyll + run: | + sudo gem install bundler + bundle install + + - name: πŸ–‰ repo + run: echo "REPOSITORY=${GITHUB_REPOSITORY#*/}" >> $GITHUB_ENV + + - name: πŸ™ build + run: bundle exec jekyll build -b ${{ env.REPOSITORY }} + env: + JEKYLL_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: βœ“ commit + run: | + cd _site + git init + git add -A + git config --local user.email "hello@clarius.org" + git config --local user.name "GitHub Action" + git commit -m "Publish pages from ${GITHUB_REPOSITORY}@${GITHUB_SHA:0:9}" + + - name: πŸš€ push + uses: ad-m/github-push-action@v0.6.0 + with: + github_token: ${{ secrets.CLARIUS_ACCESS_TOKEN }} + repository: clarius/${{ env.REPOSITORY }} + branch: gh-pages + force: true + directory: ./_site \ No newline at end of file diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..f1e4867 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,40 @@ +ο»Ώ# Builds a final release version and pushes to nuget.org +# whenever a release is published. +# Requires: secrets.NUGET_API_KEY + +name: publish +on: + release: + types: [released] + +env: + DOTNET_NOLOGO: true + Configuration: Release + +jobs: + publish: + runs-on: ubuntu-latest + steps: + - name: 🀘 checkout + uses: actions/checkout@v2 + with: + submodules: recursive + fetch-depth: 0 + + - name: πŸ™ build + run: dotnet build -m:1 -bl:build.binlog -p:version=${GITHUB_REF#refs/*/v} -p:RepositoryBranch=${GITHUB_REF#refs/*/} + + - name: πŸ§ͺ test + run: dotnet test --no-build -m:1 + + - name: πŸ“¦ pack + run: dotnet pack -m:1 -bl:pack.binlog -p:version=${GITHUB_REF#refs/*/v} -p:RepositoryBranch=${GITHUB_REF#refs/*/} + + - name: πŸ”Ό logs + if: ${{ always() }} + uses: actions/upload-artifact@v2 + with: + path: '**/*.binlog' + + - name: πŸš€ nuget + run: dotnet nuget push ./bin/**/*.nupkg -s https://api.nuget.org/v3/index.json -k ${{secrets.NUGET_API_KEY}} --skip-duplicate diff --git a/.github/workflows/release-artifacts.yml b/.github/workflows/release-artifacts.yml new file mode 100644 index 0000000..9f96526 --- /dev/null +++ b/.github/workflows/release-artifacts.yml @@ -0,0 +1,49 @@ +# Builds a release version of the project and uploads +# as artifacts of the release for verification/history + +name: release-artifacts +on: + release: + types: [published] + +jobs: + release-artifacts: + runs-on: ubuntu-latest + steps: + - name: 🀘 checkout + uses: actions/checkout@v2 + with: + submodules: recursive + fetch-depth: 0 + + - name: 🏷 current + run: echo "CURRENT_TAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV + + - name: πŸ™ build + run: dotnet build -m:1 -bl:build.binlog -p:version=${GITHUB_REF#refs/*/v} -p:RepositoryBranch=${GITHUB_REF#refs/*/} + + - name: πŸ§ͺ test + run: dotnet test --no-build -m:1 + + - name: πŸ“¦ pack + run: dotnet pack -m:1 -bl:pack.binlog -p:version=${GITHUB_REF#refs/*/v} -p:RepositoryBranch=${GITHUB_REF#refs/*/} + + - name: πŸ”Ό logs + if: ${{ always() }} + uses: actions/upload-artifact@v2 + with: + path: '**/*.binlog' + + - name: πŸ”½ gh + run: | + sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key C99B11DEB97541F0 + sudo apt-add-repository https://cli.github.com/packages + sudo apt update + sudo apt install gh + + - name: πŸ”Ό artifacts + shell: pwsh + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gci .\bin -Recurse -Filter *.nupkg | %{ gh release upload --clobber $env:CURRENT_TAG $_ } \ No newline at end of file diff --git a/.github/workflows/release-notes.yml b/.github/workflows/release-notes.yml new file mode 100644 index 0000000..5781dd6 --- /dev/null +++ b/.github/workflows/release-notes.yml @@ -0,0 +1,56 @@ +# Updates a release with release notes +name: release-notes + +on: + release: + types: [published] + +jobs: + release-notes: + runs-on: ubuntu-latest + steps: + - name: 🀘 checkout + uses: actions/checkout@v2 + with: + submodules: recursive + fetch-depth: 0 + + - name: 🏷 current + run: echo "CURRENT_TAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV + - name: 🏷 since + run: echo "SINCE_TAG=$(git describe --abbrev=0 --tags $(git rev-list --tags --skip=1 --max-count=1))" >> $GITHUB_ENV + + - name: βš™ changelog + uses: faberNovel/github-changelog-generator-action@master + if: env.SINCE_TAG != '' + with: + options: --token ${{ secrets.GITHUB_TOKEN }} --since-tag ${{ env.SINCE_TAG }} --o changelog.md + + - name: βš™ changelog + uses: faberNovel/github-changelog-generator-action@master + if: env.SINCE_TAG == '' + with: + options: --token ${{ secrets.GITHUB_TOKEN }} --o changelog.md + + - name: πŸ–‰ release + shell: pwsh + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + $id = iwr "$env:GITHUB_API_URL/repos/$env:GITHUB_REPOSITORY/releases/tags/$env:CURRENT_TAG" | + select -ExpandProperty Content | + ConvertFrom-Json | + select -ExpandProperty id + + $notes = (Get-Content .\changelog.md | where { !($_ -like '\*') } | %{ $_.replace('\', '\\') }) -join '\n' + $headers = @{ 'Accept'='application/vnd.github.v3+json;charset=utf-8'; 'Authorization' = "bearer $env:GITHUB_TOKEN" } + $body = '{ "body":"' + $notes + '" }' + + # ensure we can convert to json + $body | ConvertFrom-Json | ConvertTo-Json + + # patch & render response nicely + iwr -Body $body "$env:GITHUB_API_URL/repos/$env:GITHUB_REPOSITORY/releases/$id" -Method PATCH -Headers $headers | + select -ExpandProperty Content | + ConvertFrom-Json | + ConvertTo-Json \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 07824bf..0000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,23 +0,0 @@ -ο»Ώname: release -on: - release: - types: [created] - -env: - DOTNET_NOLOGO: true - MSBUILDDISABLENODEREUSE: 1 - -jobs: - push: - runs-on: ubuntu-latest - steps: - - name: 🀘 checkout - uses: actions/checkout@v2 - - name: βš™ dotnet 5.0.x - uses: actions/setup-dotnet@v1 - with: - dotnet-version: 5.0.x - - name: πŸ™ build - run: dotnet build -p:version=${GITHUB_REF#refs/*/v} - - name: πŸš€ push - run: dotnet nuget push ./bin/**/*.nupkg -s https://api.nuget.org/v3/index.json -k ${{secrets.NUGET_API_KEY}} --skip-duplicate \ No newline at end of file diff --git a/.github/workflows/sponsors.ps1 b/.github/workflows/sponsors.ps1 new file mode 100644 index 0000000..52fe688 --- /dev/null +++ b/.github/workflows/sponsors.ps1 @@ -0,0 +1,57 @@ +$event = Get-Content -Path $env:GITHUB_EVENT_PATH | ConvertFrom-Json +$author = $event.issue ? $event.issue.user.node_id : $event.pull_request.user.node_id + +if ($author -eq $null) { + throw 'No user id found' +} + +echo "Looking up sponsorship from $env:GITHUB_ACTOR ..." + +$query = gh api graphql --paginate -f owner='devlooped' -f query=' +query($owner: String!, $endCursor: String) { + organization (login: $owner) { + sponsorshipsAsMaintainer (first: 100, after: $endCursor) { + nodes { + sponsorEntity { + ... on Organization { id, name } + ... on User { id, name } + } + tier { monthlyPriceInDollars } + } + pageInfo { + hasNextPage + endCursor + } + } + } +} +' + +$amount = + $query | + ConvertFrom-Json | + select @{ Name='nodes'; Expression={$_.data.organization.sponsorshipsAsMaintainer.nodes}} | + select -ExpandProperty nodes | + where { $_.sponsorEntity.id -eq $author } | + select -ExpandProperty tier | + select -ExpandProperty monthlyPriceInDollars + +if ($null -eq $amount) { + echo "Author is not a sponsor! Nothing left to do." + return +} + +echo "Author is a sponsor!" + +$headers = @{ 'Accept'='application/vnd.github.v3+json;charset=utf-8'; 'Authorization' = "bearer $env:GH_TOKEN" } + +# Try creating the labels, ignore errors (i.e. already created) +iwr -Body '{ "name":"sponsor :purple_heart:", "color":"ea4aaa", "description":"sponsor" }' "$env:GITHUB_API_URL/repos/$env:GITHUB_REPOSITORY/labels" -Method Post -Headers $headers -SkipHttpErrorCheck -UseBasicParsing | select -ExpandProperty StatusCode +iwr -Body '{ "name":"sponsor :yellow_heart:", "color":"ea4aaa", "description":"sponsor++" }' "$env:GITHUB_API_URL/repos/$env:GITHUB_REPOSITORY/labels" -Method Post -Headers $headers -SkipHttpErrorCheck -UseBasicParsing | select -ExpandProperty StatusCode + +$number = $event.issue ? $event.issue.number : $event.pull_request.number +$labels = $amount -ge 100 ? '{"labels":["sponsor :yellow_heart:"]}' : '{"labels":["sponsor :purple_heart:"]}' + +iwr -Body $labels "$env:GITHUB_API_URL/repos/$env:GITHUB_REPOSITORY/issues/$number/labels" -Method Post -Headers $headers -SkipHttpErrorCheck -UseBasicParsing | select -ExpandProperty StatusCode + +echo 'Label applied' \ No newline at end of file diff --git a/.github/workflows/sponsors.yml b/.github/workflows/sponsors.yml new file mode 100644 index 0000000..3e909f6 --- /dev/null +++ b/.github/workflows/sponsors.yml @@ -0,0 +1,25 @@ +# Runs on new issues/PRs and applies sponsor labels + +name: sponsors +on: + pull_request: + types: [opened] + issues: + types: [opened] + +jobs: + sponsors: + runs-on: windows-latest + steps: + - name: 🀘 checkout + uses: actions/checkout@v2 + + - name: πŸ”½ gh + run: | + iwr -useb get.scoop.sh | iex + scoop install gh + + - name: πŸ’› sponsors + run: ./.github/workflows/sponsors.ps1 + env: + GH_TOKEN: ${{ secrets.DEVLOOPED_TOKEN }} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 7fa12b6..043c7d4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,17 +1,29 @@ -.nuget -.vs -.idea -out bin obj -*.nupkg -*.lock.json -*.nuget.props -*.nuget.targets -dotnet-nugetize.items +artifacts +pack +.vs +.vscode + *.suo +*.sdf +*.userprefs *.user +*.nupkg +*.metaproj +*.tmp *.cache -*.log *.binlog -*.rsp \ No newline at end of file +*.zip + +.nuget +*.lock.json +*.nuget.props +*.nuget.targets + +node_modules +_site +.jekyll-metadata +.jekyll-cache +Gemfile.lock +package-lock.json \ No newline at end of file diff --git a/.netconfig b/.netconfig new file mode 100644 index 0000000..ad8019d --- /dev/null +++ b/.netconfig @@ -0,0 +1,131 @@ +[file] + url = https://github.com/devlooped/oss + url = https://github.com/devlooped/.github +[file ".editorconfig"] + url = https://github.com/devlooped/oss/blob/main/.editorconfig + etag = 985aa022503959d35b03c870f07ae604cead7580d260775235ef6665aa9a6cbe + weak +[file ".gitattributes"] + url = https://github.com/devlooped/oss/blob/main/.gitattributes + etag = 7acb32f5fa6d4ccd9c824605a7c2b8538497f0068c165567807d393dcf4d6bb7 + weak +[file ".github/FUNDING.yml"] + url = https://github.com/devlooped/.github/blob/main/.github/FUNDING.yml + etag = a944c728facd033bbdfb4ff8d0ef10d0b3a457c277dc499458df0ffc7e6409da + weak +[file ".github/ISSUE_TEMPLATE/bug.md"] + url = https://github.com/devlooped/oss/blob/main/.github/ISSUE_TEMPLATE/bug.md + etag = 026852ba1f1921f3a043bb5e09cd7a2c3d9a33ec51f48e524dc3a2ab72de3141 + weak +[file ".github/ISSUE_TEMPLATE/config.yml"] + url = https://github.com/devlooped/oss/blob/main/.github/ISSUE_TEMPLATE/config.yml + etag = b5ce64e6967276086eb89f86f57364da9c4deac988c7e0e04810a4f8caaa1400 + weak +[file ".github/dependabot.yml"] + url = https://github.com/devlooped/oss/blob/main/.github/dependabot.yml + etag = 2fc8a0d2b47091b058ae3e1f68333492044b49a684621f4939a0bce5bff869d5 + weak +[file ".github/workflows/build.yml"] + url = https://github.com/devlooped/oss/blob/main/.github/workflows/build.yml + etag = 337666cc9f17f0cf395df950370967381f6de5134cc215f61035d36f38fed3a3 + weak +[file ".github/workflows/changelog.yml"] + url = https://github.com/devlooped/oss/blob/main/.github/workflows/changelog.yml + etag = 7f5bb52dff2908e4a4b60e06b4f8f1d497864554076f916aa6e5e8c9b2c6b2d2 + weak +[file ".github/workflows/publish.yml"] + url = https://github.com/devlooped/oss/blob/main/.github/workflows/publish.yml + etag = 8067230717247263ad661c69780fdfdf4b6f140287517fee9c5d4e64d4b737af + weak +[file ".github/workflows/release-artifacts.yml"] + url = https://github.com/devlooped/oss/blob/main/.github/workflows/release-artifacts.yml + etag = 8be10a2fbeb9e6924d8b08e58a61a0f69138352c6f5477b53dcd34c26d8d35ef + weak +[file ".github/workflows/release-notes.yml"] + url = https://github.com/devlooped/oss/blob/main/.github/workflows/release-notes.yml + etag = c987e5b93b002c5a2a63304f677eb969b7b6e274b77ef4392aeef4d9ca7e10dd + weak +[file ".github_changelog_generator"] + url = https://github.com/devlooped/oss/blob/main/.github_changelog_generator + etag = a724e0cbbad99a04e6cd3738a5f3ec5416dd5f29ae7073e7afe5471e73107e42 + weak +[file ".gitignore"] + url = https://github.com/devlooped/oss/blob/main/.gitignore + etag = 925782b685859e07040442303b411bebd1c75b4fe4e075f547e067f33f323814 + weak +[file ".netconfig"] + url = https://github.com/devlooped/oss/blob/main/.netconfig + etag = 02de46ea12aee590c29d9c824b5a9ad067aa9d06b22c81d44505f1345d74fd81 + weak +[file "Directory.Build.rsp"] + url = https://github.com/devlooped/oss/blob/main/Directory.Build.rsp + etag = 6a6c6e1d3895df953abf14c82b0899e3eea75cdcd679f6212dcfea15183d73d6 + weak +[file "_config.yml"] + url = https://github.com/devlooped/oss/blob/main/_config.yml + etag = 9139148f845adf503fd3c3c140eb64421fc476a1f9c027fc50825c0efb05f557 + weak +[file "assets/css/style.scss"] + url = https://github.com/devlooped/oss/blob/main/assets/css/style.scss + etag = 2c86a074a6c8c2f6af806908a57215439fad563830b4af8fbed1a3aabaede0cf + weak +[file "assets/images/sponsors.png"] + url = https://github.com/devlooped/oss/blob/main/assets/images/sponsors.png + etag = f152d1038eb04cb1596a13377b032f18f2402c969130601384fb377ce5ddefbd + weak +[file "assets/images/sponsors.svg"] + url = https://github.com/devlooped/oss/blob/main/assets/images/sponsors.svg + etag = 182780a2d68bdba9069000aef75712ab81c307eee1317bcd29d35563f523ba98 + weak +[file "code-of-conduct.md"] + url = https://github.com/devlooped/oss/blob/main/code-of-conduct.md + etag = 4857c01bb695f09bf6912d778951c3065d9dd565e5de3d0827f40432d0e4c613 + weak +[file "license.txt"] + url = https://github.com/devlooped/oss/blob/main/license.txt + etag = 2c6335b37e4ae05eea7c01f5d0c9d82b49c488f868a8b5ba7bff7c6ff01f3994 + weak +[file "readme.md"] + url = https://github.com/devlooped/oss/blob/main/readme.md + etag = fb40c68e1ac60f454d9a87050b8bd8b6a0890d4c6949055d3eb04e260e4927a6 + weak +[file "security.md"] + url = https://github.com/devlooped/oss/blob/main/security.md + etag = fc8101fd914820db3e6b42d608dc46aefbc60c830ac721ed3917daead3727dbd + weak +[file "src/Directory.Build.props"] + url = https://github.com/devlooped/oss/blob/main/src/Directory.Build.props + etag = 16762b7a7fbdc00c1912c469962131c912856115826db7628167517eea918324 + weak +[file "src/Directory.Build.targets"] + url = https://github.com/devlooped/oss/blob/main/src/Directory.Build.targets + etag = f90be354c63f82bcfac68246648aee9a5a2842f1e4b66421b850939635610532 + weak +[file "src/icon.png"] + url = https://github.com/devlooped/oss/blob/main/src/icon.png + etag = 8b42109e3bd1da0fc50c67679c6d20aeac98f922870675e127cf19b8f2919971 + weak +[file "src/kzu.snk"] + url = https://github.com/devlooped/oss/blob/main/src/kzu.snk + etag = b8d789b5b6bea017cdcc8badcea888ad78de3e34298efca922054e9fb0e7b6b9 + weak +[file "support.md"] + url = https://github.com/devlooped/oss/blob/main/support.md + etag = 2d47e2fc4fdfa3515203d452674566e3df507461f9938f451a06d79deb687d24 + weak +[file ".github/workflows/pages.yml"] + url = https://github.com/devlooped/.github/blob/main/.github/workflows/pages.yml + etag = f2bc91354dc634de00aa9f502eb69e34368c315bcdbe422cde95ddd850d31669 + weak +[file ".github/workflows/sponsors.ps1"] + url = https://github.com/devlooped/.github/blob/main/.github/workflows/sponsors.ps1 + etag = 5e29155d35ab142150e900df391363e03e5a15a8be46e4adeeb4c6fd34013289 + weak +[file ".github/workflows/sponsors.yml"] + url = https://github.com/devlooped/.github/blob/main/.github/workflows/sponsors.yml + etag = 0142be767cd24215b54631593cfab08d711001b71ba4fc358e412f27c434a227 + weak +[file "Gemfile"] + url = https://github.com/devlooped/.github/blob/main/Gemfile + etag = d45832acd078778ffebf260000f6d25172a131f51684744d7e982da2a47170ce + weak diff --git a/Directory.Build.rsp b/Directory.Build.rsp new file mode 100644 index 0000000..7c0dbc1 --- /dev/null +++ b/Directory.Build.rsp @@ -0,0 +1,5 @@ +# See https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-response-files +-nr:false +-m:1 +-v:m +-clp:Summary;ForceNoAlign \ No newline at end of file diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..025f43f --- /dev/null +++ b/Gemfile @@ -0,0 +1,3 @@ +source 'https://rubygems.org' + +gem 'github-pages', '~> 209', group: :jekyll_plugins \ No newline at end of file diff --git a/SmallSharp.sln b/SmallSharp.sln index f620560..0f8204d 100644 --- a/SmallSharp.sln +++ b/SmallSharp.sln @@ -11,6 +11,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution .github\dependabot.yml = .github\dependabot.yml src\Directory.Build.props = src\Directory.Build.props src\Directory.Build.targets = src\Directory.Build.targets + src\Directory.props = src\Directory.props global.json = global.json README.md = README.md EndProjectSection @@ -18,10 +19,16 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{FFAB61A4-707D-4C79-A364-BF259FA865BB}" ProjectSection(SolutionItems) = preProject .github\workflows\build.yml = .github\workflows\build.yml - .github\workflows\release.yml = .github\workflows\release.yml + .github\workflows\changelog.yml = .github\workflows\changelog.yml + .github\workflows\pages.yml = .github\workflows\pages.yml + .github\workflows\publish.yml = .github\workflows\publish.yml + .github\workflows\release-artifacts.yml = .github\workflows\release-artifacts.yml + .github\workflows\release-notes.yml = .github\workflows\release-notes.yml + .github\workflows\sponsors.ps1 = .github\workflows\sponsors.ps1 + .github\workflows\sponsors.yml = .github\workflows\sponsors.yml EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SmallSharp.Build", "src\SmallSharp.Build\SmallSharp.Build.csproj", "{62834B0C-A2C2-4449-9E2A-00CC390A79BE}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SmallSharp.Build", "src\SmallSharp.Build\SmallSharp.Build.csproj", "{62834B0C-A2C2-4449-9E2A-00CC390A79BE}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/_config.yml b/_config.yml index f980e76..a61f7e0 100644 --- a/_config.yml +++ b/_config.yml @@ -1 +1,3 @@ theme: jekyll-theme-slate + +exclude: [ 'src/', '*.sln', 'Gemfile*', '*.rsp' ] \ No newline at end of file diff --git a/assets/css/style.scss b/assets/css/style.scss new file mode 100644 index 0000000..f83369c --- /dev/null +++ b/assets/css/style.scss @@ -0,0 +1,17 @@ +--- +--- + +@import "jekyll-theme-slate"; + +.inner { + max-width: 960px; +} + +pre, code { + background-color: unset; + font-size: unset; +} + + code { + font-size: 0.80em; +} \ No newline at end of file diff --git a/assets/images/sponsors.png b/assets/images/sponsors.png new file mode 100644 index 0000000000000000000000000000000000000000..f82f5bd2f0c134bfe02a211d9b7159dea73e6588 GIT binary patch literal 10411 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 F{{h$`a`pfK literal 0 HcmV?d00001 diff --git a/assets/images/sponsors.svg b/assets/images/sponsors.svg new file mode 100644 index 0000000..1a1d80f --- /dev/null +++ b/assets/images/sponsors.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/code-of-conduct.md b/code-of-conduct.md new file mode 100644 index 0000000..775f221 --- /dev/null +++ b/code-of-conduct.md @@ -0,0 +1,6 @@ +# Code of Conduct + +This project has adopted the code of conduct defined by the Contributor Covenant +to clarify expected behavior in our community. + +For more information, see the [.NET Foundation Code of Conduct](https://dotnetfoundation.org/code-of-conduct). diff --git a/global.json b/global.json deleted file mode 100644 index 16a4432..0000000 --- a/global.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "sdk": { - "version": "5.0.100-rc.1.20452.10" - }, - "tools": { - "dotnet": "5.0.100-rc.1.20452.10" - } -} \ No newline at end of file diff --git a/LICENSE b/license.txt similarity index 93% rename from LICENSE rename to license.txt index 0498a9a..83969dc 100644 --- a/LICENSE +++ b/license.txt @@ -1,6 +1,6 @@ -MIT License +The MIT License (MIT) -Copyright (c) 2020 Daniel Cazzulino +Copyright (c) Daniel Cazzulino and Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -19,3 +19,4 @@ AUTHORS OR COPYRIGHT HOLDERS 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. + diff --git a/README.md b/readme.md similarity index 100% rename from README.md rename to readme.md diff --git a/security.md b/security.md new file mode 100644 index 0000000..01b219a --- /dev/null +++ b/security.md @@ -0,0 +1,9 @@ +# Security Policy + +## Reporting a Vulnerability + +Security issues and bugs should be reported privately by emailing security@devlooped.com. +You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your +original message and ping [@devlooped](https://twitter.com/devlooped) on Twitter. + +Please do not open issues for anything you think might have a security implication. \ No newline at end of file diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 0d83ca7..f3523ae 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,44 +1,132 @@ + + + + false + + true + + + $(CI) + + + kzu - Copyright 2020 - Daniel Cazzulino + Copyright (C) Daniel Cazzulino and Contributors. All rights reserved. false MIT icon.png - dotnet - https://www.cazzulino.com/SmallSharp/ - - 42.42.42 - $(Version) true true - $([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)..\bin)) + $([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)..\bin')) - true + + true + + https://pkg.kzu.io/index.json;https://api.nuget.org/v3/index.json;$(RestoreSources) + + + + + + + + + Release + Latest + + + false + embedded true - Preview enable - false - $(DefaultItemExcludes);*.binlog;*.zip + + + $(MSBuildProjectName) + $(MSBuildProjectName.IndexOf('.')) + $(MSBuildProjectName.Substring(0, $(RootNamespaceDot))) + + + $(DefaultItemExcludes);*.binlog;*.zip;*.rsp;*.items;**/TestResults/**/*.* + + + $(MSBuildThisFileDirectory)kzu.snk + + 002400000480000094000000060200000024000052534131000400000100010051155fd0ee280be78d81cc979423f1129ec5dd28edce9cd94fd679890639cad54c121ebdb606f8659659cd313d3b3db7fa41e2271158dd602bb0039a142717117fa1f63d93a2d288a1c2f920ec05c4858d344a45d48ebd31c1368ab783596b382b611d8c92f9c1b3d338296aa21b12f3bc9f34de87756100c172c52a24bad2db + 00352124762f2aa5 + true + + true + true + true + true + + + true + + + false + + + NU5105;$(NoWarn) + + true - - false - true + + + 42.42.42 - - - - - - - - + + <_VersionLabel>$(VersionLabel.Replace('refs/heads/', '')) + + <_VersionLabel Condition="$(_VersionLabel.Contains('refs/pull/'))">$(VersionLabel.TrimEnd('.0123456789')) + + <_VersionLabel>$(_VersionLabel.Replace('refs/pull/', 'pr')) + + <_VersionLabel>$(_VersionLabel.Replace('/merge', '')) + + <_VersionLabel>$(_VersionLabel.Replace('/', '-')) + + + $(_VersionLabel) + + + + + + + + + - + + diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets index 3277fb2..018b2e5 100644 --- a/src/Directory.Build.targets +++ b/src/Directory.Build.targets @@ -1,25 +1,151 @@ + + + + + false + true + + + + + 1.0.0 + $(VersionPrefix)-$(VersionSuffix) + $(VersionPrefix) + + + + + $(PackFolder) + $(PackFolderPath.Replace('\$(TargetFramework)', '')) + $(IntermediateOutputPath)$(PackFolderPath)\ + $(OutputPath)$(PackFolderPath)\ + $(OutputPath) + + + + + $(DefineConstants);$(TargetFramework.ToUpperInvariant().TrimEnd('0').TrimEnd('.').Replace('.', '')) + - <_PackageFiles Include="$(MSBuildThisFileDirectory)_._" PackagePath="lib/netstandard2.0/_._" /> - + + + + - + + + + + + + + + + + + + + + + + + $(PrivateRepositoryUrl) + + + + $(SourceRevisionId) + $(SourceRevisionId.Substring(0, 9)) + + $(RepositorySha) + + + + + + - - $(Description) + $(RepositoryUrl) + $(Description) -Built from $(RepositoryUrl)/tree/$(SourceRevisionId.Substring(0, 9)) +Built from $(RepositoryUrl)/tree/$(RepositorySha) - $(Description) + $(Description) + $(RepositoryUrl)/blob/main/changelog.md - + + + + + + + + + + + + + + + + + + + + + i.ItemSpec)) + { + Log.LogMessage(MessageImportance.High, "{0}: {1}", itemName, item.ItemSpec); + foreach (var name in item.MetadataNames.OfType().OrderBy(_ => _)) + { + try + { + Log.LogMessage(MessageImportance.High, "\t{0}={1}", name, item.GetMetadata(name)); + } + catch { } + } + } + ]]> + + + + diff --git a/src/Directory.props b/src/Directory.props new file mode 100644 index 0000000..d242123 --- /dev/null +++ b/src/Directory.props @@ -0,0 +1,10 @@ + + + + false + dotnet csharp + true + NU1702;$(NoWarn) + + + diff --git a/src/SmallSharp.Build/ActiveDocumentMonitor.cs b/src/SmallSharp.Build/ActiveDocumentMonitor.cs index f770f77..900cba8 100644 --- a/src/SmallSharp.Build/ActiveDocumentMonitor.cs +++ b/src/SmallSharp.Build/ActiveDocumentMonitor.cs @@ -65,7 +65,7 @@ void ReloadProfiles() try { var json = JObject.Parse(File.ReadAllText(launchProfilesPath)); - if (json.Property("profiles") is not JProperty prop || + if (json.Property("profiles") is not JProperty prop || prop.Value is not JObject profiles) return; diff --git a/src/SmallSharp.Build/OpenStartupFile.cs b/src/SmallSharp.Build/OpenStartupFile.cs index 45b89ab..41e614f 100644 --- a/src/SmallSharp.Build/OpenStartupFile.cs +++ b/src/SmallSharp.Build/OpenStartupFile.cs @@ -10,7 +10,7 @@ public class OpenStartupFile : Task { [Required] public string? FlagFile { get; set; } - + public string? StartupFile { get; set; } public override bool Execute() diff --git a/src/SmallSharp.Build/SmallSharp.Build.csproj b/src/SmallSharp.Build/SmallSharp.Build.csproj index a9393f9..320f250 100644 --- a/src/SmallSharp.Build/SmallSharp.Build.csproj +++ b/src/SmallSharp.Build/SmallSharp.Build.csproj @@ -6,6 +6,7 @@ + diff --git a/src/SmallSharp/AnalyzerConfigOptionsExtensions.cs b/src/SmallSharp/AnalyzerConfigOptionsExtensions.cs index f2e1939..4875954 100644 --- a/src/SmallSharp/AnalyzerConfigOptionsExtensions.cs +++ b/src/SmallSharp/AnalyzerConfigOptionsExtensions.cs @@ -4,7 +4,7 @@ namespace SmallSharp { static class AnalyzerConfigOptionsExtensions { - public static bool IsEnabled(this AnalyzerOptions options, string optionName) + public static bool IsEnabled(this AnalyzerOptions options, string optionName) => IsEnabled(options.AnalyzerConfigOptionsProvider.GlobalOptions, optionName); public static bool IsEnabled(this AnalyzerConfigOptionsProvider options, string optionName) diff --git a/src/SmallSharp/SmallSharp.csproj b/src/SmallSharp/SmallSharp.csproj index cacedd4..016c170 100644 --- a/src/SmallSharp/SmallSharp.csproj +++ b/src/SmallSharp/SmallSharp.csproj @@ -4,7 +4,7 @@ netstandard2.0 SmallSharp Create, edit and run multiple C# 9.0 top-level programs in the same project 😍 - analyzers\cs + analyzers\dotnet\cs @@ -20,6 +20,7 @@ + diff --git a/src/icon.png b/src/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ac8dc3fcc81e0123f6f98c83f4cf705bb9bdc90b GIT binary patch literal 9081 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 literal 0 HcmV?d00001 diff --git a/src/kzu.snk b/src/kzu.snk new file mode 100644 index 0000000000000000000000000000000000000000..8e181aea272d85cb1f733b03ec744dc0b909aa76 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50096|6<^TqC=2I}fy|ebBk>ZR#oZ|F&Yam# z)_I8rIm*>c5+1#_2KZ%`SXhny3*T6 z*Hl98Gn760J$8)`H|s1CT;KcAJa&xIsA}XdJYoZDmrV!J#e! z{hX@1GFmPRLr@90Ht6Re*WT@R(h$oT(}Ndt0-9{N@~o!!Kb>)5mOJPZska|U$ddjN zmH)97_!+N{F_6dwE>D71OT9<$emvS2N+4V`-`=v6F+>zNj6c3mYfJvYYPSqjJQ(%* zqN8iz#aR{3iaTMs5!q+1Tcq+^XKsaK)tWrcS#R3ekawH3ZLi90fvZz`qr1uiS&H0- zV_Im+1%b)21TWLSobv+^6V|+Ktl;=fyLWocD?XAMmupcMg&VnbU-6{TIP}A$^sek8 zA`ia`b`%%>JEKjyqBDOAIxx|mg*}iZg0s5WxV`eu{0<1HRCWP|hZ2e41)OY;lo7rE isJbUAkndKa&zHpXW)3~Yn&^IbW*8