diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..d60a230bb --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,29 @@ +on: + pull_request: + +env: + NUSHELL_CARGO_PROFILE: ci + NU_LOG_LEVEL: DEBUG + +jobs: + nu-check: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: 'Fetch main branch' + run: | + git fetch origin main --depth 1 + - uses: hustcer/setup-nu@v3.9 + with: + version: '*' + check-latest: true + features: full # dataframe and extra included + - name: toolkit check pr + shell: nu {0} + run: | + nu -c "use toolkit.nu *; check pr" + - name: run nu-check on modified files + shell: nu {0} + run: | + nu ./check-files.nu diff --git a/.github/workflows/daily.yml b/.github/workflows/daily.yml new file mode 100644 index 000000000..366cc6b6c --- /dev/null +++ b/.github/workflows/daily.yml @@ -0,0 +1,33 @@ +on: + push: + branches: + - main + schedule: + - cron: '30 0 * * *' # every day at 00:30 AM UTC + +env: + NUSHELL_CARGO_PROFILE: ci + NU_LOG_LEVEL: DEBUG + +jobs: + nu-check: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: 'Fetch main branch' + run: | + git fetch origin main --depth 1 + - uses: hustcer/setup-nu@v3.9 + with: + version: '*' + check-latest: true + features: full # dataframe and extra included + - name: toolkit generate-file-list --full + shell: nu {0} + run: | + nu -c "use toolkit.nu *; generate-file-list --full" + - name: run nu-check on all files + shell: nu {0} + run: | + nu ./check-files.nu diff --git a/.gitignore b/.gitignore index 507f1f664..4f920f119 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ # ignore the git mailmap file .mailmap + +check-files.nu diff --git a/toolkit.nu b/toolkit.nu new file mode 100644 index 000000000..e038b651d --- /dev/null +++ b/toolkit.nu @@ -0,0 +1,64 @@ +# this module regroups a bunch of development tools to make the development +# process easier for anyone. +# +# the main purpose of `toolkit` is to offer an easy to use interface for the +# developer during a PR cycle. + + +# check that all the tests pass +export def test [ +] { + print "toolkit test: not implemented!" +} + +# run all the necessary checks and tests to submit a perfect PR +export def "check pr" [ +] { + generate-file-list + test +} + +export def main [] { help toolkit } + +export def generate-file-list [ --full ] { + let start = "let files = [" + + mut files = [""] + + if $full { + # all the *.nu files in the repo + # exept for `before_v0.60` + print "checking all files..." + mut $files = glob **/*.nu --exclude [before_v0.60/**] + } else { + # only the *.nu files changed in comparison with origin/main + $files = (git diff --name-only origin/main | lines | filter { str ends-with '.nu'} | each { path expand }) + } + + + let new_list = $files | str join ",\n" | append "]" + + let final = " + + mut exit_code = 0 + for file in $files { + let diagnostics_table = nu --ide-check 10 $file | to text | ['[', $in, ']'] | str join | from json + let result = $diagnostics_table | where type == \"diagnostic\" | is-empty + if $result { + print $\"✔ ($file) is ok\" + } else { + print $\"❌ ($file) has errors:\" + print ($diagnostics_table | where type == \"diagnostic\" | reject span) + $exit_code = 1 + } + } + print $\"💚 All files checked!\" + +exit $exit_code +" + + $start + | append $new_list + | append $final + | save "check-files.nu" --force +}