Skip to content

Commit

Permalink
docs: store output of jj util markdown-help, render it on the website
Browse files Browse the repository at this point in the history
I am using a very hacky approach, using `insta` to generate the markdown help.
This is based on a lucky coincidence that `insta` chose to use a header
format for snapshot files that MkDocs interprets as a Markdown header (and
ignores).

I considered several other approaches, but I couldn't resist the facts that:

- This doesn't require new developers to install any extra tools or run any
extra commands.
- There is no need for a new CI check.
- There is no need to compile `jj` in the "Make HTML docs" GitHub action,
  which is currently very fast and cheap.

Downside: I'm not sure how well MkDocs will work on Windows, unless the
developer explicitly enables symbolic links (which IIUC is not trivial).

### Possible alternatives 

My next favorite approaches (which we could switch to later) would be:

#### `xtask`

Set up a CI check and a  [Cargo `xtask`](https://github.com/matklad/cargo-xtask
)  so that `cargo xtask cli-help-to-md` essentially runs `cargo run -- util
markdown-help > docs/cli-reference.md` from the project root.

Every developer would have to know to run `cargo xtask cli-help-to-md` if
they change the help text.

Eventually, we could have `cargo xtask preflight` that runs `cargo +nightly
fmt; cargo xtask cli-help-to-md; cargo nextest run`, or `cargo insta`.

[Cargo `xtask`]: https://github.com/matklad/cargo-xtask

#### Only generate markdown for CLI help when building the website, don't track it in Git.

I think that having the file in the repo will be nice to preview changes to
docs, and it'll allow people to consult the file on GitHub or in their repo.

The (currently) very fast job of building the website would now require
installing Rust and building `jj`. 

#### Same as the `xtask`, but use a shell script instead of an `xtask`

An `xtask` might seem like overkill, since it's Rust instead of a shell script. However, I don't want this to be a shell script so that new contributors on Windows can still easily run it ( since this will be necessary for the CI to pass) without us having to support a batch file.

### Non-alternatives 

#### Clap's new feature

`clap` recently obtained a similarly-sounding feature in
clap-rs/clap#5206. However, it only prints short help
for subcommands and can't be triggered by an option AFAICT, so it won't help us
too much.

#### Cargo Alias

My first attempt was to set up a cargo
[alias](https://doc.rust-lang.org/cargo/reference/config.html#alias) to run
this, but that doesn't support redirection (so I had to change the `jj util`
command to output to a file) and, worse, is incapable of executing the command
*in the project root* regardless of where in the project the current directory
is. Again, this seems to be too inconvenient for a command that every new PR
author would have to run to pass CI.

**Aside:** For reference, the alias was:
    
```toml
# .cargo/config.toml
alias.gen-cli-reference = "run -p jj-cli -- util markdown-help docs/cli-reference.md"
```
  • Loading branch information
ilyagr committed Jan 28, 2024
1 parent eb0725d commit 5fa3648
Show file tree
Hide file tree
Showing 5 changed files with 1,990 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitignore
Expand Up @@ -7,6 +7,7 @@ result
# generated by the insta crate
*.pending-snap
*.snap*
!cli/tests/cli-reference@.md.snap

# Editor specific ignores
.idea
Expand Down

0 comments on commit 5fa3648

Please sign in to comment.