diff --git a/.gitattributes b/.gitattributes index 7c37579..4f89148 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,24 +1,8 @@ -# sln, csproj files (and friends) are always CRLF, even on linux -*.sln text eol=crlf -*.proj text eol=crlf -*.csproj text eol=crlf +# normalize by default +* text=auto encoding=UTF-8 +*.sh text eol=lf # These are windows specific files which we may as well ensure are # always crlf on checkout *.bat text eol=crlf *.cmd text eol=crlf - -# 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 - -# 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/release.yml b/.github/release.yml index 9a018cd..c178589 100644 --- a/.github/release.yml +++ b/.github/release.yml @@ -8,7 +8,6 @@ changelog: - invalid - wontfix - need info - - docs - techdebt authors: - devlooped-bot @@ -24,6 +23,7 @@ changelog: - title: πŸ“ Documentation updates labels: - docs + - documentation - title: πŸ”¨ Other labels: - '*' diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f4a9bc6..a109549 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -79,13 +79,12 @@ jobs: name: logs path: '*.binlog' - # Only push CI package to sleet feed if building on ubuntu (fastest) - name: πŸš€ sleet env: SLEET_CONNECTION: ${{ secrets.SLEET_CONNECTION }} if: env.SLEET_CONNECTION != '' run: | - dotnet tool install -g --version 4.0.18 sleet + dotnet tool update sleet -g --allow-downgrade --version $(curl -s --compressed ${{ vars.SLEET_FEED_URL }} | jq '.["sleet:version"]' -r) sleet push bin --config none -f --verbose -p "SLEET_FEED_CONTAINER=nuget" -p "SLEET_FEED_CONNECTIONSTRING=${{ secrets.SLEET_CONNECTION }}" -p "SLEET_FEED_TYPE=azure" || echo "No packages found" dotnet-format: diff --git a/.github/workflows/changelog.config b/.github/workflows/changelog.config index cd34ee7..e47bccd 100644 --- a/.github/workflows/changelog.config +++ b/.github/workflows/changelog.config @@ -1,7 +1,7 @@ usernames-as-github-logins=true issues_wo_labels=true pr_wo_labels=true -exclude-labels=bydesign,dependencies,duplicate,question,invalid,wontfix,need info,docs +exclude-labels=bydesign,dependencies,duplicate,discussion,question,invalid,wontfix,need info,docs enhancement-label=:sparkles: Implemented enhancements: bugs-label=:bug: Fixed bugs: issues-label=:hammer: Other: diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index a4be3ad..ae4240f 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -18,7 +18,7 @@ env: jobs: publish: - runs-on: ubuntu-latest + runs-on: ${{ vars.PUBLISH_AGENT || 'ubuntu-latest' }} steps: - name: 🀘 checkout uses: actions/checkout@v4 @@ -44,13 +44,14 @@ jobs: - name: πŸš€ nuget env: NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }} - if: env.NUGET_API_KEY != '' - run: dotnet nuget push ./bin/**/*.nupkg -s https://api.nuget.org/v3/index.json -k ${{secrets.NUGET_API_KEY}} --skip-duplicate + if: ${{ env.NUGET_API_KEY != '' && github.event.action != 'prereleased' }} + working-directory: bin + run: dotnet nuget push *.nupkg -s https://api.nuget.org/v3/index.json -k ${{secrets.NUGET_API_KEY}} --skip-duplicate - name: πŸš€ sleet env: SLEET_CONNECTION: ${{ secrets.SLEET_CONNECTION }} if: env.SLEET_CONNECTION != '' run: | - dotnet tool install -g --version 4.0.18 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" || echo "No packages found" \ No newline at end of file + dotnet tool update sleet -g --allow-downgrade --version $(curl -s --compressed ${{ vars.SLEET_FEED_URL }} | jq '.["sleet:version"]' -r) + sleet push bin --config none -f --verbose -p "SLEET_FEED_CONTAINER=nuget" -p "SLEET_FEED_CONNECTIONSTRING=${{ secrets.SLEET_CONNECTION }}" -p "SLEET_FEED_TYPE=azure" || echo "No packages found" diff --git a/.github/workflows/triage.yml b/.github/workflows/triage.yml new file mode 100644 index 0000000..56ff299 --- /dev/null +++ b/.github/workflows/triage.yml @@ -0,0 +1,103 @@ +name: 'triage' +on: + schedule: + - cron: '42 0 * * *' + + workflow_dispatch: + # Manual triggering through the GitHub UI, API, or CLI + inputs: + daysBeforeClose: + description: "Days before closing stale or need info issues" + required: true + default: "30" + daysBeforeStale: + description: "Days before labeling stale" + required: true + default: "180" + daysSinceClose: + description: "Days since close to lock" + required: true + default: "30" + daysSinceUpdate: + description: "Days since update to lock" + required: true + default: "30" + +permissions: + actions: write # For managing the operation state cache + issues: write + contents: read + +jobs: + stale: + # Do not run on forks + if: github.repository_owner == 'devlooped' + runs-on: ubuntu-latest + steps: + - name: βŒ› rate + shell: pwsh + if: github.event_name != 'workflow_dispatch' + env: + GH_TOKEN: ${{ secrets.DEVLOOPED_TOKEN }} + run: | + # add random sleep since we run on fixed schedule + $wait = get-random -max 180 + echo "Waiting random $wait seconds to start" + sleep $wait + # get currently authenticated user rate limit info + $rate = gh api rate_limit | convertfrom-json | select -expandproperty rate + # if we don't have at least 100 requests left, wait until reset + if ($rate.remaining -lt 100) { + $wait = ($rate.reset - (Get-Date (Get-Date).ToUniversalTime() -UFormat %s)) + echo "Rate limit remaining is $($rate.remaining), waiting for $($wait / 1000) seconds to reset" + sleep $wait + $rate = gh api rate_limit | convertfrom-json | select -expandproperty rate + echo "Rate limit has reset to $($rate.remaining) requests" + } + + - name: ✏️ stale labeler + # pending merge: https://github.com/actions/stale/pull/1176 + uses: kzu/stale@c8450312ba97b204bf37545cb249742144d6ca69 + with: + ascending: true # Process the oldest issues first + stale-issue-label: 'stale' + stale-issue-message: | + Due to lack of recent activity, this issue has been labeled as 'stale'. + It will be closed if no further activity occurs within ${{ fromJson(inputs.daysBeforeClose || 30 ) }} more days. + Any new comment will remove the label. + close-issue-message: | + This issue will now be closed since it has been labeled 'stale' without activity for ${{ fromJson(inputs.daysBeforeClose || 30 ) }} days. + days-before-stale: ${{ fromJson(inputs.daysBeforeStale || 180) }} + days-before-close: ${{ fromJson(inputs.daysBeforeClose || 30 ) }} + days-before-pr-close: -1 # Do not close PRs labeled as 'stale' + exempt-all-milestones: true + exempt-all-assignees: true + exempt-issue-labels: priority,sponsor,backed + exempt-authors: kzu + + - name: 🀘 checkout actions + uses: actions/checkout@v4 + with: + repository: 'microsoft/vscode-github-triage-actions' + ref: v42 + + - name: βš™ install actions + run: npm install --production + + - name: πŸ”’ issues locker + uses: ./locker + with: + token: ${{ secrets.DEVLOOPED_TOKEN }} + ignoredLabel: priority + daysSinceClose: ${{ fromJson(inputs.daysSinceClose || 30) }} + daysSinceUpdate: ${{ fromJson(inputs.daysSinceUpdate || 30) }} + + - name: πŸ”’ need info closer + uses: ./needs-more-info-closer + with: + token: ${{ secrets.DEVLOOPED_TOKEN }} + label: 'need info' + closeDays: ${{ fromJson(inputs.daysBeforeClose || 30) }} + closeComment: "This issue has been closed automatically because it needs more information and has not had recent activity.\n\nHappy Coding!" + pingDays: 80 + pingComment: "Hey @${assignee}, this issue might need further attention.\n\n@${author}, you can help us out by closing this issue if the problem no longer exists, or adding more information." \ No newline at end of file diff --git a/.netconfig b/.netconfig index c61416b..2375835 100644 --- a/.netconfig +++ b/.netconfig @@ -26,8 +26,9 @@ weak [file ".gitattributes"] url = https://github.com/devlooped/oss/blob/main/.gitattributes - sha = 0683ee777d7d878d4bf013d7deea352685135a05 - etag = 7acb32f5fa6d4ccd9c824605a7c2b8538497f0068c165567807d393dcf4d6bb7 + sha = 5f92a68e302bae675b394ef343114139c075993e + + etag = 338ba6d92c8d1774363396739c2be4257bfc58026f4b0fe92cb0ae4460e1eff7 weak [file ".github/FUNDING.yml"] url = https://github.com/devlooped/.github/blob/main/.github/FUNDING.yml @@ -39,8 +40,9 @@ skip [file ".github/workflows/build.yml"] url = https://github.com/devlooped/oss/blob/main/.github/workflows/build.yml - sha = b5bb972199aa6ff220dda196588b23c21bb2780f - etag = ce104e9b04fe6a54b90cdfd3d5c02f2e902f8ac878b1d059edc1b6bed70872be + sha = 5e17ad62ebb5241555a7a4d29e3ab15e5ba120d2 + + etag = f358acb1e45596bf0aad49996017da44939de30b805289c4ad205a7ccb6f99cb weak [file ".github/workflows/changelog.yml"] url = https://github.com/devlooped/oss/blob/main/.github/workflows/changelog.yml @@ -54,8 +56,9 @@ weak [file ".github/workflows/publish.yml"] url = https://github.com/devlooped/oss/blob/main/.github/workflows/publish.yml - sha = b5bb972199aa6ff220dda196588b23c21bb2780f - etag = 5a85d51e8c6cc6fbda43e12b3712a1e908a8e99b0908c4033ac9f4c66e5f233e + sha = 5e17ad62ebb5241555a7a4d29e3ab15e5ba120d2 + + etag = 2cc96046d8f28e7cbcde89ed56d3d89e1a70fb0de7846ee1827bee66b7dfbcf1 weak [file ".gitignore"] url = https://github.com/devlooped/oss/blob/main/.gitignore @@ -89,8 +92,9 @@ weak [file "src/Directory.Build.targets"] url = https://github.com/devlooped/oss/blob/main/src/Directory.Build.targets - sha = 33a20db26e47589769284817b271ce67ea9ccfd8 - etag = 1a3a0151b5771ee97ed8351254ff4c18a0ff568e0df5c33c6830f069bfbb067b + sha = a8b208093599263b7f2d1fe3854634c588ea5199 + + etag = 19087699f05396205e6b050d999a43b175bd242f6e8fac86f6df936310178b03 weak [file "src/kzu.snk"] url = https://github.com/devlooped/oss/blob/main/src/kzu.snk @@ -120,11 +124,19 @@ weak [file ".github/release.yml"] url = https://github.com/devlooped/oss/blob/main/.github/release.yml - sha = 1afd173fe8f81b510c597737b0d271218e81fa73 - etag = 482dc2c892fc7ce0cb3a01eb5d9401bee50ddfb067d8cb85873555ce63cf5438 + sha = 0c23e24704625cf75b2cb1fdc566cef7e20af313 + + etag = 310df162242c95ed19ed12e3c96a65f77e558b46dced676ad5255eb12caafe75 weak [file ".github/workflows/changelog.config"] url = https://github.com/devlooped/oss/blob/main/.github/workflows/changelog.config - sha = 055a8b7c94b74ae139cce919d60b83976d2a9942 - etag = ddb17acb5872e9e69a76f9dec0ca590f25382caa2ccf750df058dcabb674db2b + sha = 08d83cb510732f861416760d37702f9f55bd7f9e + + etag = 556a28914eeeae78ca924b1105726cdaa211af365671831887aec81f5f4301b4 + weak +[file ".github/workflows/triage.yml"] + url = https://github.com/devlooped/oss/blob/main/.github/workflows/triage.yml + sha = 33000c0c4ab4eb4e0e142fa54515b811a189d55c + + etag = 013a47739e348f06891f37c45164478cca149854e6cd5c5158e6f073f852b61a weak diff --git a/readme.md b/readme.md index 076f193..8e2f797 100644 --- a/readme.md +++ b/readme.md @@ -356,15 +356,12 @@ The versioning scheme for packages is: [![Clarius Org](https://raw.githubusercontent.com/devlooped/sponsors/main/.github/avatars/clarius.png "Clarius Org")](https://github.com/clarius) [![Kirill Osenkov](https://raw.githubusercontent.com/devlooped/sponsors/main/.github/avatars/KirillOsenkov.png "Kirill Osenkov")](https://github.com/KirillOsenkov) [![MFB Technologies, Inc.](https://raw.githubusercontent.com/devlooped/sponsors/main/.github/avatars/MFB-Technologies-Inc.png "MFB Technologies, Inc.")](https://github.com/MFB-Technologies-Inc) -[![Stephen Shaw](https://raw.githubusercontent.com/devlooped/sponsors/main/.github/avatars/decriptor.png "Stephen Shaw")](https://github.com/decriptor) [![Torutek](https://raw.githubusercontent.com/devlooped/sponsors/main/.github/avatars/torutek-gh.png "Torutek")](https://github.com/torutek-gh) [![DRIVE.NET, Inc.](https://raw.githubusercontent.com/devlooped/sponsors/main/.github/avatars/drivenet.png "DRIVE.NET, Inc.")](https://github.com/drivenet) -[![Ashley Medway](https://raw.githubusercontent.com/devlooped/sponsors/main/.github/avatars/AshleyMedway.png "Ashley Medway")](https://github.com/AshleyMedway) [![Keith Pickford](https://raw.githubusercontent.com/devlooped/sponsors/main/.github/avatars/Keflon.png "Keith Pickford")](https://github.com/Keflon) [![Thomas Bolon](https://raw.githubusercontent.com/devlooped/sponsors/main/.github/avatars/tbolon.png "Thomas Bolon")](https://github.com/tbolon) [![Kori Francis](https://raw.githubusercontent.com/devlooped/sponsors/main/.github/avatars/kfrancis.png "Kori Francis")](https://github.com/kfrancis) [![Toni Wenzel](https://raw.githubusercontent.com/devlooped/sponsors/main/.github/avatars/twenzel.png "Toni Wenzel")](https://github.com/twenzel) -[![Giorgi Dalakishvili](https://raw.githubusercontent.com/devlooped/sponsors/main/.github/avatars/Giorgi.png "Giorgi Dalakishvili")](https://github.com/Giorgi) [![Uno Platform](https://raw.githubusercontent.com/devlooped/sponsors/main/.github/avatars/unoplatform.png "Uno Platform")](https://github.com/unoplatform) [![Dan Siegel](https://raw.githubusercontent.com/devlooped/sponsors/main/.github/avatars/dansiegel.png "Dan Siegel")](https://github.com/dansiegel) [![Reuben Swartz](https://raw.githubusercontent.com/devlooped/sponsors/main/.github/avatars/rbnswartz.png "Reuben Swartz")](https://github.com/rbnswartz) @@ -374,7 +371,6 @@ The versioning scheme for packages is: [![Ix Technologies B.V.](https://raw.githubusercontent.com/devlooped/sponsors/main/.github/avatars/IxTechnologies.png "Ix Technologies B.V.")](https://github.com/IxTechnologies) [![David JENNI](https://raw.githubusercontent.com/devlooped/sponsors/main/.github/avatars/davidjenni.png "David JENNI")](https://github.com/davidjenni) [![Jonathan ](https://raw.githubusercontent.com/devlooped/sponsors/main/.github/avatars/Jonathan-Hickey.png "Jonathan ")](https://github.com/Jonathan-Hickey) -[![Oleg Kyrylchuk](https://raw.githubusercontent.com/devlooped/sponsors/main/.github/avatars/okyrylchuk.png "Oleg Kyrylchuk")](https://github.com/okyrylchuk) [![Charley Wu](https://raw.githubusercontent.com/devlooped/sponsors/main/.github/avatars/akunzai.png "Charley Wu")](https://github.com/akunzai) [![Jakob TikjΓΈb Andersen](https://raw.githubusercontent.com/devlooped/sponsors/main/.github/avatars/jakobt.png "Jakob TikjΓΈb Andersen")](https://github.com/jakobt) [![Seann Alexander](https://raw.githubusercontent.com/devlooped/sponsors/main/.github/avatars/seanalexander.png "Seann Alexander")](https://github.com/seanalexander) @@ -388,6 +384,7 @@ The versioning scheme for packages is: [![Vezel](https://raw.githubusercontent.com/devlooped/sponsors/main/.github/avatars/vezel-dev.png "Vezel")](https://github.com/vezel-dev) [![ChilliCream](https://raw.githubusercontent.com/devlooped/sponsors/main/.github/avatars/ChilliCream.png "ChilliCream")](https://github.com/ChilliCream) [![4OTC](https://raw.githubusercontent.com/devlooped/sponsors/main/.github/avatars/4OTC.png "4OTC")](https://github.com/4OTC) +[![Vincent Limo](https://raw.githubusercontent.com/devlooped/sponsors/main/.github/avatars/v-limo.png "Vincent Limo")](https://github.com/v-limo) diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets index 20d7f0b..6232750 100644 --- a/src/Directory.Build.targets +++ b/src/Directory.Build.targets @@ -34,23 +34,28 @@ + @@ -101,19 +106,17 @@ $(BUDDY_EXECUTION_BRANCH) - - - PrepareResources;$(CoreCompileDependsOn) + + + CoreResGen;$(CoreCompileDependsOn) - + - - - + + - MSBuild:Compile $(IntermediateOutputPath)\$([MSBuild]::ValueOrDefault('%(RelativeDir)', '').Replace('\', '.').Replace('/', '.'))%(Filename).g$(DefaultLanguageSourceExtension) $(Language) $(RootNamespace)