Contributing Guide #

Getting started #

chezmoi is written in Go and development happens on GitHub. The rest of this document assumes that you’ve checked out chezmoi locally.

The Architecture Guide contains a high-level overview of chezmoi’s source code.

Developing locally #

chezmoi requires Go 1.17 or later.

chezmoi is a standard Go project, using standard Go tooling, with a few extra tools. Ensure that these extra tools are installed with:

$ make ensure-tools

Build chezmoi:

$ go build

Run all tests:

$ go test ./...

Run chezmoi:

$ go run .

Generated code #

chezmoi generates shell completions, the install script, and the website from a single source of truth. You must run

$ go generate

if you change includes any of the following:

  • Adds or modifies a command.
  • Adds or modifies a command’s flags.
  • Adds or modifies the list of supported OSs and architectures.
  • Modifies the install script template.

chezmoi’s continuous integration verifies that all generated files are up to date. Changes to generated files should be included in the commit that modifies the source of truth.

Contributing changes #

Bug reports, bug fixes, and documentation improvements are always welcome. Please open an issue or create a pull request with your report, fix, or improvement.

If you want to make a more significant change, please first open an issue to discuss the change that you want to make. Dave Cheney gives a good rationale as to why this is important.

All changes are made via pull requests. In your pull request, please make sure that:

  • All existing tests pass.

  • There are appropriate additional tests that demonstrate that your PR works as intended.

  • The documentation is updated, if necessary. For new features you should add an entry in docs/ and a complete description in docs/

  • All generated files are up to date. You can ensure this by running make generate and including any modified files in your commit.

  • The code is correctly formatted, according to gofumports. You can ensure this by running make format.

  • The code passes golangci-lint. You can ensure this by running make lint.

  • The commit messages match chezmoi’s convention, specifically that they begin with a capitalized verb in the imperative and give a short description of what the commit does. Detailed information or justification can be optionally included in the body of the commit message.

  • Commits are logically separate, with no merge or “fixup” commits.

  • The branch applies cleanly to master.

Managing releases #

Releases are managed with goreleaser.

To build a test release, without publishing, (Linux only) run:

$ make test-release

Publish a new release by creating and pushing a tag, e.g.:

$ git tag v1.2.3
$ git push --tags

This triggers a GitHub Action that builds and publishes archives, packages, and snaps, and creates a new GitHub Release.

Publishing Snaps requires a SNAPCRAFT_LOGIN repository secret. Snapcraft logins periodically expire. Create a new snapcraft login by running:

$ snapcraft export-login --snaps=chezmoi --channels=stable,candidate,beta,edge --acls=package_upload -

brew formula must be updated manually with the command:

$ brew bump-formula-pr --tag=v1.2.3 chezmoi

Packaging #

If you’re packaging chezmoi for an operating system or distribution:

  • chezmoi has no build or install dependencies other than the standard Go toolchain.

  • Please set the version number, git commit, and build time in the binary. This greatly assists debugging when end users report problems or ask for help. You can do this by passing the following flags to go build:

    -ldflags "-X main.version=$VERSION
              -X main.commit=$COMMIT
              -X main.builtBy=$BUILT_BY"

    $VERSION should be the chezmoi version, e.g. 1.7.3. Any v prefix is optional and will be stripped, so you can pass the git tag in directly. The command git describe --abbrev=0 --tags will return a suitable value.

    $COMMIT should be the full git commit hash at which chezmoi is built, e.g. 4d678ce6850c9d81c7ab2fe0d8f20c1547688b91. The command git rev-parse HEAD will return a suitable value.

    $DATE should be the date of the build in RFC3339 format, e.g. 2019-11-23T18:29:25Z. The command date -u +%Y-%m-%dT%H:%M:%SZ will return a suitable value.

    $BUILT_BY should be a string indicating what system was used to build the binary. Typically it should be the name of your packaging system, e.g. homebrew.

  • Please enable cgo, if possible. chezmoi can be built and run without cgo, but the .chezmoi.username and template variables may not be set correctly on some systems.

  • chezmoi includes an upgrade command which attempts to self-upgrade. You can remove this command completely by building chezmoi with the noupgrade build tag.

  • chezmoi includes shell completions in the completions directory. Please include these in the package and install them in the shell-appropriate directory, if possible.

  • If the instructions for installing chezmoi in chezmoi’s install guide are absent or incorrect, please open an issue or submit a PR to correct them.

Updating the website #

The website is generated with Hugo and served with GitHub pages from the gh-pages branch to GitHub.

Before building the website, you must download the Hugo Book Theme by running:

$ git submodule update --init

Test the website locally by running:

$ ( cd assets/ && hugo serve )

and visit http://localhost:1313/.

To build the website in a temporary directory, run:

$ ( cd assets/ && make )

From here you can run

$ git show

to show changes and

$ git push

to push them. You can only push changes if you have write permissions to the chezmoi GitHub repo.