tree-sitter/docs/section-6-contributing.md
Steven Kalt d35efd4608
feat(cli): support building WASM via podman
Previously, `tree-sitter build-wasm` had the ability to build WASM
by using docker to pull in an image with a complete emscripten toolchain.
This commit adds the ability to use podman to do the same thing.

Using podman requires two notable changes:
1. Using the fully-qualified image name. Docker defaults to prepending
    `docker.io` to the image name, but podman does not.
2. Podman will mount the `/src/` volume as belonging to root unless
  `--userns=keep-id` is passed. I think podman's different
  volume-ownership is related to podman's daemonless execution and
  `--uidmap` functionality, but I'm not 100% sure.

To test, I ran
```sh
script/fetch-fixtures
script/generate-fixtures
script/generate-fixtures-wasm # <- the important one!
```

which worked as well as the docker version.
2024-01-29 00:50:32 -05:00

5 KiB

title permalink
Contributing contributing

Contributing

Code of Conduct

Contributors to Tree-sitter should abide by the Contributor Covenant.

Developing Tree-sitter

Prerequisites

To make changes to Tree-sitter, you should have:

  1. A C compiler, for compiling the core library and the generated parsers.
  2. A Rust toolchain, for compiling the Rust bindings, the highlighting library, and the CLI.
  3. Node.js and NPM, for generating parsers from grammar.js files.
  4. Either Emscripten, Docker, or podman for compiling the library to WASM.

Building

Clone the repository:

git clone https://github.com/tree-sitter/tree-sitter
cd tree-sitter

Optionally, build the WASM library. If you skip this step, then the tree-sitter playground command will require an internet connection. If you have emscripten installed, this will use your emcc compiler. Otherwise, it will use Docker or Podman:

./script/build-wasm

Build the Rust libraries and the CLI:

cargo build --release

This will create the tree-sitter CLI executable in the target/release folder.

Testing

Before you can run the tests, you need to clone some grammars that are used for testing:

script/fetch-fixtures

To test any changes you've made to the CLI, you can regenerate these parsers using your current CLI code:

script/generate-fixtures

Then you can run the tests:

script/test

Similarly, to test the WASM binding, you need to compile these parsers to WASM:

script/generate-fixtures-wasm
script/test-wasm

Debugging

The test script has a number of useful flags. You can list them all by running script/test -h. Here are some of the main flags:

If you want to run a specific unit test, pass its name (or part of its name) as an argument:

script/test test_does_something

You can run the tests under the debugger (either lldb or gdb) using the -g flag:

script/test test_does_something -g

Part of the Tree-sitter test suite involves parsing the corpus tests for several different languages and performing randomized edits to each example in the corpus. If you just want to run the tests for a particular language, you can pass the -l flag. And if you want to run a particular example from the corpus, you can pass the -e flag:

script/test -l javascript -e Arrays

Published Packages

The main tree-sitter/tree-sitter repository contains the source code for several packages that are published to package registries for different languages:

There are also several other dependent repositories that contain other published packages:

Publishing New Releases

Publishing a new release of the CLI requires these steps:

  1. Commit and push all outstanding changes and verify that CI passes:

    git commit -m "Fix things"
    git push
    
  2. Create a new tag:

    script/version patch
    

    This will determine the current version, increment the patch version number, and update the Cargo.toml and package.json files for the Rust and Node CLI packages. It will then create a commit and a tag for the new version. For more information about the arguments that are allowed, see the documentation for the npm version command.

  3. Push the commit and the tag:

    git push
    git push --tags
    
  4. Wait for CI to pass. Because of the git tag, the CI jobs will publish artifacts to a GitHub release. The npm module of tree-sitter-cli works by downloading the appropriate binary from the corresponding GitHub release during installation. So it's best not to publish the npm package until the binaries are uploaded.

  5. Publish the npm package:

    cd cli/npm
    npm publish