diff --git a/.editorconfig b/.editorconfig index 234046b..26a8ca5 100644 --- a/.editorconfig +++ b/.editorconfig @@ -3,10 +3,6 @@ # top-most EditorConfig file root = true -# ignore submodule -[gcm/**] -generated_code = true - # Don't use tabs for indentation. [*] indent_style = space @@ -91,3 +87,11 @@ 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 + +# Test settings +[**/*Tests*/*{.cs,.vb}] +# xUnit1013: Public method should be marked as test. Allows using records as test classes +dotnet_diagnostic.xUnit1013.severity = none + +# VSTHRD200: Use "Async" suffix for async methods +dotnet_diagnostic.VSTHRD200.severity = none diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index a105ac5..0000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1 +0,0 @@ -github: devlooped diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md deleted file mode 100644 index 67f7595..0000000 --- a/.github/ISSUE_TEMPLATE/bug.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -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/dependabot.yml b/.github/dependabot.yml index 9bd9700..f551596 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -6,4 +6,4 @@ updates: - package-ecosystem: nuget directory: / schedule: - interval: weekly \ No newline at end of file + interval: daily diff --git a/.github/release.yml b/.github/release.yml new file mode 100644 index 0000000..2f3ce7f --- /dev/null +++ b/.github/release.yml @@ -0,0 +1,25 @@ +changelog: + exclude: + labels: + - bydesign + - dependencies + - duplicate + - question + - invalid + - wontfix + - need info + - docs + authors: + - devlooped-bot + - dependabot + - github-actions + categories: + - title: ✨ Implemented enhancements + labels: + - enhancement + - title: πŸ› Fixed bugs + labels: + - bug + - title: πŸ”¨ Other + labels: + - '*' diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ac505e2..831bb61 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -5,12 +5,13 @@ name: build on: workflow_dispatch: push: - branches: [ main, dev, 'feature/*', 'rel/*' ] + branches: [ main, dev, 'dev/*', 'feature/*', 'rel/*' ] paths-ignore: - changelog.md - code-of-conduct.md - security.md - support.md + - readme.md pull_request: types: [opened, synchronize, reopened] @@ -22,28 +23,29 @@ defaults: shell: bash jobs: - dotnet-format: + os-matrix: runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.lookup.outputs.matrix }} steps: - name: 🀘 checkout uses: actions/checkout@v2 - with: - submodules: recursive - fetch-depth: 0 - - - name: βœ“ ensure format + + - name: πŸ”Ž lookup + id: lookup + shell: pwsh run: | - dotnet tool update -g dotnet-format --version 5.0.* - dotnet restore - dotnet format --check -v:diag + $path = './.github/workflows/os-matrix.json' + $os = if (test-path $path) { cat $path } else { '["ubuntu-latest"]' } + echo "matrix=$os" >> $env:GITHUB_OUTPUT build: + needs: os-matrix name: build-${{ matrix.os }} - needs: dotnet-format runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-latest, windows-latest, macOS-latest] + os: ${{ fromJSON(needs.os-matrix.outputs.matrix) }} steps: - name: 🀘 checkout uses: actions/checkout@v2 @@ -54,8 +56,14 @@ jobs: - name: πŸ™ build run: dotnet build -m:1 -p:VersionLabel="$GITHUB_REF.$GITHUB_RUN_NUMBER" + - name: βš™ GNU grep + if: matrix.os == 'macOS-latest' + run: | + brew install grep + echo 'export PATH="/usr/local/opt/grep/libexec/gnubin:$PATH"' >> .bash_profile + - name: πŸ§ͺ test - run: dotnet test --no-build -m:1 --blame-hang --blame-hang-timeout 5m + uses: ./.github/workflows/test - name: πŸ“¦ pack run: dotnet pack -m:1 -p:VersionLabel="$GITHUB_REF.$GITHUB_RUN_NUMBER" @@ -68,3 +76,16 @@ jobs: 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" + + dotnet-format: + runs-on: ubuntu-latest + needs: build + steps: + - name: 🀘 checkout + uses: actions/checkout@v2 + with: + submodules: recursive + fetch-depth: 0 + + - name: βœ“ ensure format + run: dotnet format --verify-no-changes -v:diag --exclude ~/.nuget diff --git a/.github_changelog_generator b/.github/workflows/changelog.config similarity index 73% rename from .github_changelog_generator rename to .github/workflows/changelog.config index 7eeacb4..cd34ee7 100644 --- a/.github_changelog_generator +++ b/.github/workflows/changelog.config @@ -1,8 +1,7 @@ usernames-as-github-logins=true -header-label= issues_wo_labels=true pr_wo_labels=true -exclude-labels=dependencies,duplicate,question,invalid,wontfix,need info +exclude-labels=bydesign,dependencies,duplicate,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/changelog.yml b/.github/workflows/changelog.yml index b351081..b120b73 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -1,37 +1,39 @@ ο»Ώname: changelog on: + workflow_dispatch: release: types: [released] - workflow_dispatch: - -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: πŸ€– defaults + uses: devlooped/actions-bot@v1 + with: + name: ${{ secrets.BOT_NAME }} + email: ${{ secrets.BOT_EMAIL }} + gh_token: ${{ secrets.GH_TOKEN }} + github_token: ${{ secrets.GITHUB_TOKEN }} + - name: 🀘 checkout uses: actions/checkout@v2 with: fetch-depth: 0 ref: main token: ${{ env.GH_TOKEN }} + + - name: βš™ ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: 3.0.3 - name: βš™ changelog - uses: faberNovel/github-changelog-generator-action@master - with: - options: --token ${{ secrets.GITHUB_TOKEN }} --o changelog.md + run: | + gem install github_changelog_generator + github_changelog_generator --user ${GITHUB_REPOSITORY%/*} --project ${GITHUB_REPOSITORY##*/} --token $GH_TOKEN --o changelog.md --config-file .github/workflows/changelog.config - 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) || echo "Done" + (git commit -m "πŸ–‰ Update changelog with ${GITHUB_REF#refs/*/}" && git push) || echo "Done" \ No newline at end of file diff --git a/.github/workflows/combine-prs.yml b/.github/workflows/combine-prs.yml new file mode 100644 index 0000000..dcead42 --- /dev/null +++ b/.github/workflows/combine-prs.yml @@ -0,0 +1,154 @@ +name: 'β›™ combine-prs' + +on: + workflow_dispatch: + inputs: + branchExpression: + description: 'Regular expression to match against PR branches to find combinable PRs' + required: true + default: 'dependabot' + mustBeGreen: + description: 'Only combine PRs that are green (status is success)' + required: true + default: true + combineTitle: + description: 'Title of the combined PR' + required: true + default: '⬆️ Bump dependencies' + combineBranchName: + description: 'Name of the branch to combine PRs into' + required: true + default: 'combine-prs' + ignoreLabel: + description: 'Exclude PRs with this label' + required: true + default: 'nocombine' + +jobs: + combine-prs: + name: ${{ github.event.inputs.combineBranchName }} + runs-on: ubuntu-latest + steps: + - uses: actions/github-script@v6 + with: + github-token: ${{secrets.GITHUB_TOKEN}} + script: | + const pulls = await github.paginate('GET /repos/:owner/:repo/pulls', { + owner: context.repo.owner, + repo: context.repo.repo + }); + const branchRegExp = new RegExp(`${{github.event.inputs.branchExpression}}`); + let branchesAndPRStrings = []; + let baseBranch = null; + let baseBranchSHA = null; + for (const pull of pulls) { + const branch = pull['head']['ref']; + console.log('Pull for branch: ' + branch); + if (branchRegExp.test(branch)) { + console.log('Branch matched prefix: ' + branch); + let statusOK = true; + if(${{ github.event.inputs.mustBeGreen }}) { + console.log('Checking green status: ' + branch); + const stateQuery = `query($owner: String!, $repo: String!, $pull_number: Int!) { + repository(owner: $owner, name: $repo) { + pullRequest(number:$pull_number) { + commits(last: 1) { + nodes { + commit { + statusCheckRollup { + state + } + } + } + } + } + } + }` + const vars = { + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: pull['number'] + }; + const result = await github.graphql(stateQuery, vars); + const [{ commit }] = result.repository.pullRequest.commits.nodes; + const state = commit.statusCheckRollup.state + console.log('Validating status: ' + state); + if(state != 'SUCCESS') { + console.log('Discarding ' + branch + ' with status ' + state); + statusOK = false; + } + } + console.log('Checking labels: ' + branch); + const labels = pull['labels']; + for(const label of labels) { + const labelName = label['name']; + console.log('Checking label: ' + labelName); + if(labelName == '${{ github.event.inputs.ignoreLabel }}') { + console.log('Discarding ' + branch + ' with label ' + labelName); + statusOK = false; + } + } + if (statusOK) { + console.log('Adding branch to array: ' + branch); + const prString = '#' + pull['number'] + ' ' + pull['title']; + branchesAndPRStrings.push({ branch, prString }); + baseBranch = pull['base']['ref']; + baseBranchSHA = pull['base']['sha']; + } + } + } + if (branchesAndPRStrings.length == 0) { + core.setFailed('No PRs/branches matched criteria'); + return; + } + if (branchesAndPRStrings.length == 1) { + core.setFailed('Only one PR/branch matched criteria'); + return; + } + + try { + await github.rest.git.createRef({ + owner: context.repo.owner, + repo: context.repo.repo, + ref: 'refs/heads/' + '${{ github.event.inputs.combineBranchName }}', + sha: baseBranchSHA + }); + } catch (error) { + console.log(error); + core.setFailed('Failed to create combined branch - maybe a branch by that name already exists?'); + return; + } + + let combinedPRs = []; + let mergeFailedPRs = []; + for(const { branch, prString } of branchesAndPRStrings) { + try { + await github.rest.repos.merge({ + owner: context.repo.owner, + repo: context.repo.repo, + base: '${{ github.event.inputs.combineBranchName }}', + head: branch, + }); + console.log('Merged branch ' + branch); + combinedPRs.push(prString); + } catch (error) { + console.log('Failed to merge branch ' + branch); + mergeFailedPRs.push(prString); + } + } + + console.log('Creating combined PR'); + const combinedPRsString = combinedPRs.join('\n'); + let body = 'β›™ Combined PRs:\n' + combinedPRsString; + if(mergeFailedPRs.length > 0) { + const mergeFailedPRsString = mergeFailedPRs.join('\n'); + body += '\n\n⚠️ The following PRs were left out due to merge conflicts:\n' + mergeFailedPRsString + } + await github.rest.pulls.create({ + owner: context.repo.owner, + repo: context.repo.repo, + title: 'β›™ ${{github.event.inputs.combineTitle}}', + head: '${{ github.event.inputs.combineBranchName }}', + base: baseBranch, + body: body + }); diff --git a/.github/workflows/dotnet-file.yml b/.github/workflows/dotnet-file.yml index dba8e1d..818aa2c 100644 --- a/.github/workflows/dotnet-file.yml +++ b/.github/workflows/dotnet-file.yml @@ -1,4 +1,4 @@ -ο»Ώ# Synchronizes .netconfig-configured files with dotnet-file +# Synchronizes .netconfig-configured files with dotnet-file name: dotnet-file on: workflow_dispatch: @@ -9,18 +9,19 @@ on: env: DOTNET_NOLOGO: true - GH_TOKEN: ${{ secrets.GH_TOKEN }} jobs: sync: runs-on: windows-latest + continue-on-error: true steps: - - name: πŸ” GH_TOKEN - if: env.GH_TOKEN == '' - shell: bash - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: echo "GH_TOKEN=${GITHUB_TOKEN}" >> $GITHUB_ENV + - name: πŸ€– defaults + uses: devlooped/actions-bot@v1 + with: + name: ${{ secrets.BOT_NAME }} + email: ${{ secrets.BOT_EMAIL }} + gh_token: ${{ secrets.GH_TOKEN }} + github_token: ${{ secrets.GITHUB_TOKEN }} - name: 🀘 checkout uses: actions/checkout@v2 @@ -29,7 +30,24 @@ jobs: ref: main token: ${{ env.GH_TOKEN }} + - name: βŒ› rate + shell: pwsh + run: | + # add random sleep since we run on fixed schedule + sleep (get-random -max 60) + # 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 10) { + $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: πŸ”„ sync + shell: pwsh run: | dotnet tool update -g dotnet-gcm dotnet gcm store --protocol=https --host=github.com --username=$env:GITHUB_ACTOR --password=$env:GH_TOKEN @@ -46,16 +64,23 @@ jobs: echo 'No changelog was generated' } + - name: +Mᐁ includes + uses: devlooped/actions-include@v1 + with: + validate: false + - name: ✍ pull request - uses: peter-evans/create-pull-request@v3 + uses: peter-evans/create-pull-request@v4 with: base: main branch: dotnet-file-sync delete-branch: true labels: dependencies - commit-message: Bump files with dotnet-file sync + author: ${{ env.BOT_AUTHOR }} + committer: ${{ env.BOT_AUTHOR }} + commit-message: ⬆️ Bump files with dotnet-file sync ${{ env.CHANGES }} - title: "Bump files with dotnet-file sync" + title: "⬆️ Bump files with dotnet-file sync" body: ${{ env.CHANGES }} token: ${{ env.GH_TOKEN }} diff --git a/.github/workflows/includes.yml b/.github/workflows/includes.yml new file mode 100644 index 0000000..b806653 --- /dev/null +++ b/.github/workflows/includes.yml @@ -0,0 +1,43 @@ +name: +Mᐁ includes +on: + workflow_dispatch: + push: + branches: + - 'main' + paths: + - '**.md' + - '!changelog.md' + +jobs: + includes: + runs-on: ubuntu-latest + steps: + - name: πŸ€– defaults + uses: devlooped/actions-bot@v1 + with: + name: ${{ secrets.BOT_NAME }} + email: ${{ secrets.BOT_EMAIL }} + gh_token: ${{ secrets.GH_TOKEN }} + github_token: ${{ secrets.GITHUB_TOKEN }} + + - name: 🀘 checkout + uses: actions/checkout@v2 + with: + token: ${{ env.GH_TOKEN }} + + - name: +Mᐁ includes + uses: devlooped/actions-include@v1 + + - name: ✍ pull request + uses: peter-evans/create-pull-request@v4 + with: + base: main + branch: markdown-includes + delete-branch: true + labels: docs + author: ${{ env.BOT_AUTHOR }} + committer: ${{ env.BOT_AUTHOR }} + commit-message: +Mᐁ includes + title: +Mᐁ includes + body: +Mᐁ includes + token: ${{ env.GH_TOKEN }} diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index eea5601..421b6c1 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -1,14 +1,46 @@ +# Workflow to cross-post a jekyll site (or GitHub Pages) +# to another org/repo. +# Required secrets in repository consuming this workflow: +# - PAGES_ORGANIZATION: the target organization to publish +# pages to. +# - PAGES_ACCESS_TOKEN: a token that is valid in the target +# org/repo for pushing the resulting site +# - PAGES_REPOSITORY: optional repository name under the +# target organization. Defaults to source repo name. + name: pages on: + workflow_dispatch: push: branches: - main - pages + - docs + +env: + PAGES_ORGANIZATION: ${{ secrets.PAGES_ORGANIZATION }} + PAGES_REPOSITORY: ${{ secrets.PAGES_REPOSITORY }} jobs: gh-pages: runs-on: ubuntu-latest + env: + PAGES_ORGANIZATION: ${{ secrets.PAGES_ORGANIZATION }} + PAGES_REPOSITORY: ${{ secrets.PAGES_REPOSITORY }} + PAGES_ACCESS_TOKEN: ${{ secrets.PAGES_ACCESS_TOKEN }} steps: + - name: βœ… organization + if: env.PAGES_ORGANIZATION == '' + run: | + echo "::error title=PAGES_ORGANIZATION secret is required." + exit 1 + + - name: βœ… token + if: env.PAGES_ACCESS_TOKEN == '' + run: | + echo "::error title=PAGES_ACCESS_TOKEN secret is required." + exit 1 + - name: 🀘 checkout uses: actions/checkout@v2 @@ -17,11 +49,12 @@ jobs: sudo gem install bundler bundle install - - name: πŸ–‰ repo - run: echo "REPOSITORY=${GITHUB_REPOSITORY#*/}" >> $GITHUB_ENV + - name: πŸ–‰ default repo + if: env.PAGES_REPOSITORY == '' + run: echo "PAGES_REPOSITORY=${GITHUB_REPOSITORY#*/}" >> $GITHUB_ENV - name: πŸ™ build - run: bundle exec jekyll build -b ${{ env.REPOSITORY }} + run: bundle exec jekyll build -b ${{ env.PAGES_REPOSITORY }} env: JEKYLL_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -30,15 +63,15 @@ jobs: cd _site git init git add -A - git config --local user.email "hello@clarius.org" - git config --local user.name "GitHub Action" + git config --local user.email "bot@clarius.org" + git config --local user.name "bot@clarius.org" 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 }} + github_token: ${{ env.PAGES_ACCESS_TOKEN }} + repository: ${{ env.PAGES_ORGANIZATION }}/${{ env.PAGES_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 index 8317592..bd83ada 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -20,12 +20,12 @@ jobs: with: submodules: recursive fetch-depth: 0 - + - name: πŸ™ build run: dotnet build -m:1 -p:version=${GITHUB_REF#refs/*/v} - name: πŸ§ͺ test - run: dotnet test --no-build -m:1 + uses: ./.github/workflows/test - name: πŸ“¦ pack run: dotnet pack -m:1 -p:version=${GITHUB_REF#refs/*/v} diff --git a/.github/workflows/release-artifacts.yml b/.github/workflows/release-artifacts.yml deleted file mode 100644 index 17d4e0b..0000000 --- a/.github/workflows/release-artifacts.yml +++ /dev/null @@ -1,43 +0,0 @@ -# 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 -p:version=${GITHUB_REF#refs/*/v} - - - name: πŸ§ͺ test - run: dotnet test --no-build -m:1 - - - name: πŸ“¦ pack - run: dotnet pack -m:1 -p:version=${GITHUB_REF#refs/*/v} - - - 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 deleted file mode 100644 index 5781dd6..0000000 --- a/.github/workflows/release-notes.yml +++ /dev/null @@ -1,56 +0,0 @@ -# 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/sponsor.yml b/.github/workflows/sponsor.yml new file mode 100644 index 0000000..9e47191 --- /dev/null +++ b/.github/workflows/sponsor.yml @@ -0,0 +1,24 @@ +name: sponsor πŸ’œ +on: + issues: + types: [opened, edited, reopened] + pull_request: + types: [opened, edited, synchronize, reopened] + +jobs: + sponsor: + runs-on: ubuntu-latest + continue-on-error: true + env: + token: ${{ secrets.GH_TOKEN }} + if: ${{ !endsWith(github.event.sender.login, '[bot]') && !endsWith(github.event.sender.login, 'bot') }} + steps: + - name: 🀘 checkout + if: env.token != '' + uses: actions/checkout@v2 + + - name: πŸ’œ sponsor + if: env.token != '' + uses: devlooped/actions-sponsor@main + with: + token: ${{ env.token }} diff --git a/.github/workflows/sponsors.ps1 b/.github/workflows/sponsors.ps1 deleted file mode 100644 index 791fd7c..0000000 --- a/.github/workflows/sponsors.ps1 +++ /dev/null @@ -1,59 +0,0 @@ -$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' -} - -gh auth status - -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' diff --git a/.github/workflows/sponsors.yml b/.github/workflows/sponsors.yml deleted file mode 100644 index 1a3b119..0000000 --- a/.github/workflows/sponsors.yml +++ /dev/null @@ -1,23 +0,0 @@ -# Runs on new issues/PRs and applies sponsor labels - -name: sponsors -on: - 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 }} diff --git a/.github/workflows/test/action.yml b/.github/workflows/test/action.yml new file mode 100644 index 0000000..4a7dbae --- /dev/null +++ b/.github/workflows/test/action.yml @@ -0,0 +1,36 @@ +name: test +description: runs dotnet tests with retry +runs: + using: "composite" + steps: + - name: πŸ§ͺ test + shell: bash --noprofile --norc {0} + env: + LC_ALL: en_US.utf8 + run: | + [ -f .bash_profile ] && source .bash_profile + counter=0 + exitcode=0 + reset="\e[0m" + warn="\e[0;33m" + while [ $counter -lt 6 ] + do + # run test and forward output also to a file in addition to stdout (tee command) + if [ $filter ] + then + echo -e "${warn}Retry $counter for $filter ${reset}" + dotnet test --no-build -m:1 --blame-hang --blame-hang-timeout 5m --filter=$filter | tee ./output.log + else + dotnet test --no-build -m:1 --blame-hang --blame-hang-timeout 5m | tee ./output.log + fi + # capture dotnet test exit status, different from tee + exitcode=${PIPESTATUS[0]} + if [ $exitcode == 0 ] + then + exit 0 + fi + # cat output, get failed test names, remove trailing whitespace, sort+dedupe, join as FQN~TEST with |, remove trailing |. + filter=$(cat ./output.log | grep -o -P '(?<=\sFailed\s)[\w\._]*' | sed 's/ *$//g' | sort -u | awk 'BEGIN { ORS="|" } { print("FullyQualifiedName~" $0) }' | grep -o -P '.*(?=\|$)') + ((counter++)) + done + exit $exitcode diff --git a/.gitignore b/.gitignore index 043c7d4..242945b 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ bin obj artifacts pack +TestResults .vs .vscode @@ -12,9 +13,12 @@ pack *.nupkg *.metaproj *.tmp +*.log *.cache *.binlog *.zip +__azurite*.* +__*__ .nuget *.lock.json @@ -26,4 +30,4 @@ _site .jekyll-metadata .jekyll-cache Gemfile.lock -package-lock.json \ No newline at end of file +package-lock.json diff --git a/.netconfig b/.netconfig index f86811f..2192a68 100644 --- a/.netconfig +++ b/.netconfig @@ -1,88 +1,51 @@ [file] url = https://github.com/devlooped/oss - url = https://github.com/devlooped/.github + url = https://github.com/clarius/pages [file ".netconfig"] url = https://github.com/devlooped/oss/blob/main/.netconfig skip [file "readme.md"] url = https://github.com/devlooped/oss/blob/main/readme.md skip -[file "src/icon.png"] - url = https://github.com/devlooped/oss/blob/main/src/icon.png - skip -[file ".github/ISSUE_TEMPLATE/config.yml"] - url = https://github.com/devlooped/oss/blob/main/.github/ISSUE_TEMPLATE/config.yml - skip -[file "assets/images/sponsors.svg"] - url = https://github.com/devlooped/oss/blob/main/assets/images/sponsors.svg - skip -[file "assets/images/sponsors.png"] - url = https://github.com/devlooped/oss/blob/main/assets/images/sponsors.png - skip [file ".editorconfig"] url = https://github.com/devlooped/oss/blob/main/.editorconfig - sha = 0683ee777d7d878d4bf013d7deea352685135a05 - etag = 985aa022503959d35b03c870f07ae604cead7580d260775235ef6665aa9a6cbe + sha = 448cf45a26e068fe5d7164ea48d1dc8bf620df46 + etag = 897634b9ba05c00e8ef35b24533d31bc43a5299be5a64e240109ba4c00fcad15 weak [file ".gitattributes"] url = https://github.com/devlooped/oss/blob/main/.gitattributes sha = 0683ee777d7d878d4bf013d7deea352685135a05 etag = 7acb32f5fa6d4ccd9c824605a7c2b8538497f0068c165567807d393dcf4d6bb7 weak -[file ".github/FUNDING.yml"] - url = https://github.com/devlooped/.github/blob/main/.github/FUNDING.yml - sha = 39f4c591716ff50dd035d2fade35e5822489ab7f - etag = a944c728facd033bbdfb4ff8d0ef10d0b3a457c277dc499458df0ffc7e6409da - weak -[file ".github/ISSUE_TEMPLATE/bug.md"] - url = https://github.com/devlooped/oss/blob/main/.github/ISSUE_TEMPLATE/bug.md - sha = 0683ee777d7d878d4bf013d7deea352685135a05 - etag = 026852ba1f1921f3a043bb5e09cd7a2c3d9a33ec51f48e524dc3a2ab72de3141 - weak [file ".github/dependabot.yml"] url = https://github.com/devlooped/oss/blob/main/.github/dependabot.yml - sha = 0683ee777d7d878d4bf013d7deea352685135a05 - etag = 2fc8a0d2b47091b058ae3e1f68333492044b49a684621f4939a0bce5bff869d5 + sha = 4f070a477b4162a280f02722ae666376ae4fcc71 + etag = 35f2134fff3b0235ff8dac8618a76198c8ef533ad2f29628bbb435cd1134d638 weak [file ".github/workflows/build.yml"] url = https://github.com/devlooped/oss/blob/main/.github/workflows/build.yml - sha = fc5889d5387e2d5aa7aba279b2aa12251cf08cb2 - etag = 91e9a208cd134bd7b71d7419800c613bc50a30e21e605607528721f2acdeab86 + sha = 4b31891ab5ac32cda49b33fa5b487532be878fd5 + etag = 8c84cdd23cda71ed9c24be87b8a2f6ae16c97ade937ffe7a29dad5aae00148e3 weak [file ".github/workflows/changelog.yml"] url = https://github.com/devlooped/oss/blob/main/.github/workflows/changelog.yml - sha = 084aa7c36ee1c262ea2f9e83931068366a7b4312 - etag = 1e17c477f9e26f83367870a18e3727a71dcbb49cd31d85e0cfcfe092202d3a66 + sha = a4b66eb5f4dfb9704502f19f59ba33cb4855188c + etag = 54c0b571648b1055beb3ddac180b34e93a9869b9f0277de306901b2c1dbe0b2c weak [file ".github/workflows/dotnet-file.yml"] url = https://github.com/devlooped/oss/blob/main/.github/workflows/dotnet-file.yml - sha = 084aa7c36ee1c262ea2f9e83931068366a7b4312 - etag = 501f8bf58287fdd7467701342f7251a015bc29664b494e7d81a71c0c55bee61f + sha = f08c3f28e46e28eb31e70846d65e57aa9553ce56 + etag = 567444486383d032c1c5fbc538f07e860f92b1d08c66ac6ffb1db64ca539251c weak [file ".github/workflows/publish.yml"] url = https://github.com/devlooped/oss/blob/main/.github/workflows/publish.yml - sha = 55c0b32601e94e1eed35028a0cad510c6bcbb265 - etag = ad8681ee3f191f796944135772b74565c470e349464e793aa664c888f7784b7a - weak -[file ".github/workflows/release-artifacts.yml"] - url = https://github.com/devlooped/oss/blob/main/.github/workflows/release-artifacts.yml - sha = 55c0b32601e94e1eed35028a0cad510c6bcbb265 - etag = 53f2dd2465fd15a065828468139544449ab7ccc0ba40f9074d7ac92426bfd07b - weak -[file ".github/workflows/release-notes.yml"] - url = https://github.com/devlooped/oss/blob/main/.github/workflows/release-notes.yml - sha = 70bc909d2ce6924385a8bcc3a9fb1cff338a3fb7 - etag = c987e5b93b002c5a2a63304f677eb969b7b6e274b77ef4392aeef4d9ca7e10dd - weak -[file ".github_changelog_generator"] - url = https://github.com/devlooped/oss/blob/main/.github_changelog_generator - sha = a7ab5fe706fdfe1efb05d47d00ef4bb137088669 - etag = 44dc852588ec508eaed9cefe260618eb162f0db50495188fc3c4e266b41944e2 + sha = d3022567c9ef2bc9461511e53b8abe065afdf03b + etag = 58601b5a71c805647ab26e84053acdfb8d174eaa93330487af8a5503753c5707 weak [file ".gitignore"] url = https://github.com/devlooped/oss/blob/main/.gitignore - sha = fa83a5161ba52bc5d510ce0ba75ee0b1f8d4bc63 - etag = 925782b685859e07040442303b411bebd1c75b4fe4e075f547e067f33f323814 + sha = c78868eba59a3e04602434684f9eac241fef13fb + etag = 1c1705a3f0ed65e33c9133996ebaa100aa445a8b968b2904ad48fef938702006 weak [file "Directory.Build.rsp"] url = https://github.com/devlooped/oss/blob/main/Directory.Build.rsp @@ -96,59 +59,67 @@ weak [file "assets/css/style.scss"] url = https://github.com/devlooped/oss/blob/main/assets/css/style.scss - sha = b5583942b012f42f5ac2d06200427070cc18c250 - etag = 2c86a074a6c8c2f6af806908a57215439fad563830b4af8fbed1a3aabaede0cf - weak -[file "code-of-conduct.md"] - url = https://github.com/devlooped/oss/blob/main/code-of-conduct.md - sha = f72699c9d52f02e6a3411ef589f2a02007c5e5af - etag = 4857c01bb695f09bf6912d778951c3065d9dd565e5de3d0827f40432d0e4c613 + sha = 9db26e2710b084d219d6355339d822f159bf5780 + etag = f710d8919abfd5a8d00050b74ba7d0bb05c6d02e40842a3012eb96555c208504 weak [file "license.txt"] url = https://github.com/devlooped/oss/blob/main/license.txt sha = 0683ee777d7d878d4bf013d7deea352685135a05 etag = 2c6335b37e4ae05eea7c01f5d0c9d82b49c488f868a8b5ba7bff7c6ff01f3994 weak -[file "security.md"] - url = https://github.com/devlooped/oss/blob/main/security.md - sha = a0f58a6d63e48ae6e55944c556d0bc94476dc8df - etag = fc8101fd914820db3e6b42d608dc46aefbc60c830ac721ed3917daead3727dbd - weak [file "src/Directory.Build.props"] url = https://github.com/devlooped/oss/blob/main/src/Directory.Build.props - sha = 52d6c40aaa460ac48fc74c03324c6b1db7ae170d - etag = ae2606c157b9725ce8c707e30d9768fb0bad901ac34065d3cd75fc2bdbc5f8cf + sha = ef8e7fa7593ded91d871d30eeebd0dc79f679159 + etag = 1d5ec6bdb8b12c13635a11364dcfe54aefb82cc171f332a8d536aa35476222d5 weak [file "src/Directory.Build.targets"] url = https://github.com/devlooped/oss/blob/main/src/Directory.Build.targets - sha = 55c0b32601e94e1eed35028a0cad510c6bcbb265 - etag = 874f20853c983e6440ed67bb571d94927f9fb4cd4438585b07df7b420c664609 + sha = b9fb0a7d34d6c16fb404f9dff4aac6789ef08a00 + etag = 852b16129d2c681ad6ec86ff56b256541e0ce0961eb3a9492e0ead89ffe5a6bd weak [file "src/kzu.snk"] url = https://github.com/devlooped/oss/blob/main/src/kzu.snk skip -[file "support.md"] - url = https://github.com/devlooped/oss/blob/main/support.md - sha = a0f58a6d63e48ae6e55944c556d0bc94476dc8df - etag = 2d47e2fc4fdfa3515203d452674566e3df507461f9938f451a06d79deb687d24 - weak [file ".github/workflows/pages.yml"] - url = https://github.com/devlooped/.github/blob/main/.github/workflows/pages.yml - sha = f2dc1370469bec1b2d32d82faf659b050cdc7e2a - etag = f2bc91354dc634de00aa9f502eb69e34368c315bcdbe422cde95ddd850d31669 - weak -[file ".github/workflows/sponsors.ps1"] - url = https://github.com/devlooped/.github/blob/main/.github/workflows/sponsors.ps1 - sha = 11f5c27cfdb304436ef0b7ee27ff333cda31ef65 - etag = 57a303125f3367b68ad0700d89ff4ba57cb29b33b303903488c9c8638d0bf735 - weak -[file ".github/workflows/sponsors.yml"] - url = https://github.com/devlooped/.github/blob/main/.github/workflows/sponsors.yml - sha = 514760df24bd906b9e5d3a56deac0d18cba59a6d - etag = 0236ed96c1d11f69b26ac0e039e74107df5731574236e2de2a83152fee5df0a6 + url = https://github.com/clarius/pages/blob/main/.github/workflows/pages.yml + sha = d3b026ee6d3772debc989c4cec72156421336f94 + etag = 76f23752ceffc013040215aec5519e5069fec9cea1179828ef88d4e0652752f0 weak [file "Gemfile"] - url = https://github.com/devlooped/.github/blob/main/Gemfile - sha = f2dc1370469bec1b2d32d82faf659b050cdc7e2a - etag = d45832acd078778ffebf260000f6d25172a131f51684744d7e982da2a47170ce - weak + url = https://github.com/clarius/pages/blob/main/Gemfile + sha = 565a77f40db0863cb47ceb36f88790259a697c91 + etag = 24e482e91192e292b633e3c17c4f095286ffb5a041d299d761b2e6ef99ee7669 + weak +[file ".github/release.yml"] + url = https://github.com/devlooped/oss/blob/main/.github/release.yml + sha = 2c80ab026b7e70393630260335f8316afe8a5fbe + etag = 56173be25769857a078a27cbeb12cbf101b81d8075461ea3bd894df2ddd28677 + weak +[file ".github/workflows/changelog.config"] + url = https://github.com/devlooped/oss/blob/main/.github/workflows/changelog.config + sha = 055a8b7c94b74ae139cce919d60b83976d2a9942 + etag = ddb17acb5872e9e69a76f9dec0ca590f25382caa2ccf750df058dcabb674db2b + weak +[file ".github/workflows/combine-prs.yml"] + url = https://github.com/devlooped/oss/blob/main/.github/workflows/combine-prs.yml + sha = 74189b061850a3527676d76281de61044abc86a2 + etag = 10106929413a89658d22c36b5b934c598809e1deb8cdd994ec846f824195aac6 + weak +[file ".github/workflows/includes.yml"] + url = https://github.com/devlooped/oss/blob/main/.github/workflows/includes.yml + sha = f08c3f28e46e28eb31e70846d65e57aa9553ce56 + etag = 884175b3f80b39edc1a23c6a34d58aa3c481432d4f20938f9a834dd918ef283d + weak +[file ".github/workflows/sponsor.yml"] + url = https://github.com/devlooped/oss/blob/main/.github/workflows/sponsor.yml + sha = 8990ebb36199046e0b8098bad9e46dcef739c56e + etag = e1dc114d2e8b57d50649989d32dbf0c9080ec77da3738a4cc79e9256d6ca5d3e + weak +[file ".github/workflows/test/action.yml"] + url = https://github.com/devlooped/oss/blob/main/.github/workflows/test/action.yml + sha = 9a1b07589b9bde93bc12528e9325712a32dec418 + etag = b54216ac431a83ce5477828d391f02046527e7f6fffd21da1d03324d352c3efb + weak +[file "src/nuget.config"] + url = https://github.com/devlooped/oss/blob/main/src/nuget.config + skip \ No newline at end of file diff --git a/Gemfile b/Gemfile index 025f43f..ed99566 100644 --- a/Gemfile +++ b/Gemfile @@ -1,3 +1,3 @@ source 'https://rubygems.org' -gem 'github-pages', '~> 209', group: :jekyll_plugins \ No newline at end of file +gem 'github-pages', '~> 209', group: :jekyll_plugins diff --git a/assets/css/style.scss b/assets/css/style.scss index f83369c..5e165a3 100644 --- a/assets/css/style.scss +++ b/assets/css/style.scss @@ -14,4 +14,13 @@ pre, code { code { font-size: 0.80em; -} \ No newline at end of file +} + +h1 > img { + border: unset; + box-shadow: unset; + vertical-align: middle; + -moz-box-shadow: unset; + -o-box-shadow: unset; + -ms-box-shadow: unset; +} diff --git a/code-of-conduct.md b/code-of-conduct.md deleted file mode 100644 index 775f221..0000000 --- a/code-of-conduct.md +++ /dev/null @@ -1,6 +0,0 @@ -# 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/readme.md b/readme.md index d411c6c..9bf9a2a 100644 --- a/readme.md +++ b/readme.md @@ -3,6 +3,7 @@ [![Version](https://img.shields.io/nuget/v/dotnet-gcm.svg?color=royalblue)](https://www.nuget.org/packages/dotnet-gcm) [![Downloads](https://img.shields.io/nuget/dt/dotnet-gcm.svg?color=green)](https://www.nuget.org/packages/dotnet-gcm) [![License](https://img.shields.io/github/license/kzu/dotnet-gcm.svg?color=blue)](https://github.com//kzu/dotnet-gcm/blob/main/LICENSE) [![Build](https://github.com/kzu/dotnet-gcm/workflows/build/badge.svg?branch=main)](https://github.com/kzu/dotnet-gcm/actions) + A dotnet global tool for managing Git credentials using the Microsoft Git Credentials Manager Core. ``` @@ -77,3 +78,4 @@ Options: -?, -h, --help Show help and usage information ``` + \ No newline at end of file diff --git a/security.md b/security.md deleted file mode 100644 index 01b219a..0000000 --- a/security.md +++ /dev/null @@ -1,9 +0,0 @@ -# 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 f34a5b8..028c354 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -23,7 +23,13 @@ Copyright (C) Daniel Cazzulino and Contributors. All rights reserved. false MIT + + icon.png + readme.md + + icon.png + readme.md true true @@ -32,21 +38,15 @@ true - - https://pkg.kzu.io/index.json;https://api.nuget.org/v3/index.json;$(RestoreSources) - - - - - + + true + Release + true + false Latest @@ -55,7 +55,9 @@ embedded true enable - + + strict + $(MSBuildProjectName) $(MSBuildProjectName.IndexOf('.')) @@ -82,6 +84,9 @@ true + + + LatestMinor @@ -126,6 +131,8 @@ + + diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets index 1e26703..11b776b 100644 --- a/src/Directory.Build.targets +++ b/src/Directory.Build.targets @@ -5,6 +5,11 @@ CI;$(DefineConstants) + + true + true + + + + + + + + + + + + + @@ -82,8 +109,11 @@ + + + @@ -104,9 +134,17 @@ $(RepositorySha) + + + <_GitSourceRoot Include="@(SourceRoot -> WithMetadataValue('SourceControl', 'git'))" /> + + + + @(_GitSourceRoot) + + - $(RepositoryUrl) - $(Description) - -Built from $(RepositoryUrl)/tree/$(RepositorySha) - $(Description) $(RepositoryUrl)/blob/main/changelog.md @@ -126,54 +160,4 @@ Built from $(RepositoryUrl)/tree/$(RepositorySha) - - - - - - - - - - - - - - - - - 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/readme.md b/src/readme.md new file mode 100644 index 0000000..342851b --- /dev/null +++ b/src/readme.md @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/support.md b/support.md deleted file mode 100644 index cfde22d..0000000 --- a/support.md +++ /dev/null @@ -1,9 +0,0 @@ -# Support - -Support is typically available thorugh GitHub Discussions and Issues. - -**Found a bug? File an issue.** If you found something that isn't working as expected and you can reproduce it, go to the repo Issues tab and file an issue. - -**Want a new feature? Start a discussion.** It's always good to start a discussion (Discussion tab in the project, Ideas category) to explain the problem you're trying to solve before jumping in with the pull request. We may already have a solution in place or have an idea on ways to solve that issue. After the details are nailed down, we will migrate the discussion to a proper Issue (with the `enhancement`) label. At that point, we'd love to see your PRs :). - -Consider [sponsoring](https://github.com/sponsors/devlooped) the project to get priority support and many other perks!