diff --git a/README.md b/README.md index a3c8d3278..2109104e0 100644 --- a/README.md +++ b/README.md @@ -23,11 +23,18 @@ well-known). Features: * **Compatible with Git** - + Jujutsu has two backends. One of them is a Git backend (the other is a native one). This lets you use Jujutsu as an alternative interface to Git. The commits you create will look like regular Git commits. You can always switch back to Git. + +
+ Demo + + + +
* **The working copy is automatically committed** diff --git a/demos/demo_git_compat.sh b/demos/demo_git_compat.sh new file mode 100755 index 000000000..6fe30e77c --- /dev/null +++ b/demos/demo_git_compat.sh @@ -0,0 +1,25 @@ +#!/bin/bash +set -euo pipefail +. "$(dirname "$0")"/demo_helpers.sh +parse_args "$@" + +new_tmp_dir + +run_demo ' +expect_prompt +run_command "# Clone a Git repo:" +expect_prompt +run_command "jj git clone https://github.com/octocat/Hello-World" +expect_prompt +run_command "cd Hello-World" +expect_prompt +run_command "# Inspect it:" +expect_prompt +run_command "jj log" +expect_prompt +run_command "jj diff -r b1" +expect_prompt +run_command "# The repo is backed by the actual Git repo:" +expect_prompt +run_command "git --git-dir=.jj/store/git log --graph --all --decorate --oneline" +' diff --git a/demos/demo_helpers.sh b/demos/demo_helpers.sh new file mode 100644 index 000000000..0d83d62ec --- /dev/null +++ b/demos/demo_helpers.sh @@ -0,0 +1,77 @@ +#!/bin/bash +set -euo pipefail +BASE_DIR=$(realpath "$(dirname "$0")") + +UPLOAD=false +PREVIEW=false +DEBUG=false +parse_args() { + for arg in "$@"; do + case "$arg" in + -h|--help) + echo 'Run a given demo. +Arguments: + --preview: Preview the asciicast. + --upload: Upload to asciinema (after previewing, if necessary). + --debug: Show the asciicast as it is being recorded. Note that what you see + will not be exactly the same as what is recorded. +' + exit + ;; + --upload) + UPLOAD=true + ;; + --preview) + PREVIEW=true + ;; + --debug) + DEBUG=true + ;; + *) + echo "Unrecognized argument: $arg" + exit 1 + ;; + esac + done +} + +new_tmp_dir() { + local dirname + dirname=$(mktemp -d) + mkdir -p "$dirname" + cd "$dirname" + trap "rm -rf '$dirname'" EXIT +} + +run_demo() { + local expect_script="$1" + expect_script=$(printf "source $BASE_DIR/demo_helpers.tcl +spawn asciinema rec -c \"PS1='$ ' bash --norc\" +expect_prompt +%s +quit_and_dump_asciicast_path +" "$expect_script") + + if [[ "$DEBUG" == true ]]; then + echo "$expect_script" | /usr/bin/env expect + return + fi + + echo "Recording demo (terminal size is $(tput cols)x$(tput lines))..." + if [[ "$PREVIEW" == 'false' ]]; then + echo '(Pass --preview to play the demo automatically once done)' + fi + local asciicast_path + asciicast_path=$(echo "$expect_script" | /usr/bin/env expect | tail -1) + echo "$asciicast_path" + + if [[ "$PREVIEW" == 'true' ]]; then + asciinema play "$asciicast_path" + fi + if [[ "$UPLOAD" == 'true' ]]; then + if [[ "$PREVIEW" == 'true' ]] && ! confirm "Upload?"; then + return + fi + : asciinema upload "$asciicast_path" + fi +} diff --git a/demos/demo_helpers.tcl b/demos/demo_helpers.tcl new file mode 100644 index 000000000..e01d6c56a --- /dev/null +++ b/demos/demo_helpers.tcl @@ -0,0 +1,26 @@ +set send_human {0.1 0.3 1 0.05 1} +set timeout 2 + +proc expect_prompt {} { + expect "$ " +} + +proc run_command {cmd} { + send -h "$cmd" + send "\r" + expect -timeout 1 +} + +proc quit_and_dump_asciicast_path {} { + set CTRLC \003 + set CTRLD \004 + set ESC \033 + + send $CTRLD + expect "asciinema: recording finished" + sleep 1 + send $CTRLC + expect -re "asciicast saved to (.+)$ESC.*\r" { + send_user "$expect_out(1,string)\n" + } +}