forked from mirrors/jj
demos: add automated demo of cloning Git repo
The automation is mostly copied from https://github.com/arxanas/git-branchless/tree/master/demos, so big thanks to @arxanas for writing that!
This commit is contained in:
parent
f35f2f0c97
commit
234cb15ff8
4 changed files with 136 additions and 1 deletions
|
@ -29,6 +29,13 @@ Features:
|
||||||
The commits you create will look like regular Git commits. You can always
|
The commits you create will look like regular Git commits. You can always
|
||||||
switch back to Git.
|
switch back to Git.
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Demo</summary>
|
||||||
|
<a href="https://asciinema.org/a/3LEDzGEmEGnf0sTsvyHm41Jgu" target="_blank">
|
||||||
|
<img src="https://asciinema.org/a/3LEDzGEmEGnf0sTsvyHm41Jgu.svg" />
|
||||||
|
</a>
|
||||||
|
</details>
|
||||||
|
|
||||||
* **The working copy is automatically committed**
|
* **The working copy is automatically committed**
|
||||||
|
|
||||||
Most Jujutsu commands automatically commit the working copy. This leads to a
|
Most Jujutsu commands automatically commit the working copy. This leads to a
|
||||||
|
|
25
demos/demo_git_compat.sh
Executable file
25
demos/demo_git_compat.sh
Executable file
|
@ -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"
|
||||||
|
'
|
77
demos/demo_helpers.sh
Normal file
77
demos/demo_helpers.sh
Normal file
|
@ -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
|
||||||
|
}
|
26
demos/demo_helpers.tcl
Normal file
26
demos/demo_helpers.tcl
Normal file
|
@ -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"
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue