|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
#!/bin/bash
# This file:
# http://anggtwu.net/bin/eevgitlib1.sh.html
# http://anggtwu.net/bin/eevgitlib1.sh
# (find-angg "bin/eevgitlib1.sh")
# Author: Eduardo Ochs <eduardoochs@gmail.com>
#
# (defun e () (interactive) (find-angg "bin/eevgitlib1.sh"))
# (defun c () (interactive) (find-sh0 "cp -v ~/bin/eevgitlib1.sh $S/http/anggtwu.net/bin/"))
# (find-sh0 "cp -v ~/bin/eevgitlib1.sh $S/http/anggtwu.net/bin/")
# Based on: (find-angg "bin/git-defs")
# Usage on my machine:
# . ~/bin/eevgitlib1.sh
# Usage elsewhere:
# . /tmp/eevgitlib1.sh
#
# Used by: (find-es "git" "git-animations")
# (find-es "git" "git-test-2")
# (find-gitdoc-links "log")
# (find-gitdoc-links "commit")
# (find-gitdoc-links "branch")
# (find-gitdoc-links "checkout")
# (find-gitdoc-links "merge")
# (find-git-intro)
# Index:
# «.basic» (to "basic")
# «.basic-tests» (to "basic-tests")
# «.Time» (to "Time")
# «.Time-tests» (to "Time-tests")
# «.MakeTree1» (to "MakeTree1")
# «.eval» (to "eval")
# «.eval-test» (to "eval-test")
# ____ _
# | __ ) __ _ ___(_) ___
# | _ \ / _` / __| |/ __|
# | |_) | (_| \__ \ | (__
# |____/ \__,_|___/_|\___|
#
# Basic commands, all implemented as shell functions.
# All of them start with an uppercase letter, except for "++N".
# Several of them use the environment variable N as a counter.
# «basic» (to ".basic")
N=0
N () { echo $N; }
++N () { N=$[$N+1]; echo $N; }
Dump1 () { echo $1 \($(cat $1)\); }
Dumps () { for i in $*; do Dump1 $i; done; }
Dump () { Dumps $(find * -type f | sort); }
Modify1 () { ++N >> $1; }
Modify () { for i in $*; do Modify1 $i; done; }
Commit () { git commit -a -m $(N); }
Commit () { git commit -a -m ${1:-$N}; }
Diagram () { git log --oneline --graph --decorate --all $*; }
Diagram () { git log --oneline --graph --decorate --all --date-order $*; }
Log1 () { git log --oneline -1 $*; }
Branch () { git branch $*; }
Checkout () { git checkout $*; }
Merge () { git merge $*; }
MergeOurs () { git merge -s ours $*; }
# «basic-tests» (to ".basic-tests")
: <<'%%%%%'
* (eepitch-bash)
* (eepitch-kill)
* (eepitch-bash)
rm -Rfv /tmp/eevgit*
mkdir /tmp/eevgit-test1/
cd /tmp/eevgit-test1/
cp -v $S/http/anggtwu.net/bin/eevgitlib1.sh /tmp/
. /tmp/eevgitlib1.sh
N; ++N; N
Modify file1 file1 file1 file2
ls -lAF
cat file1
cat file2
Dump
git init
git add file1 file2
Diagram
Commit A; Diagram
Modify file1; Commit B; Diagram
Diagram
%%%%%
# _____ _
# |_ _(_)_ __ ___ ___
# | | | | '_ ` _ \ / _ \
# | | | | | | | | | __/
# |_| |_|_| |_| |_|\___|
#
# Commands for recording how a repository changes through time.
# Look at this flipbook animation:
#
# http://anggtwu.net/LATEX/2023loeliger.pdf
# http://anggtwu.net/IMAGES/2023loeliger.gif
#
# It shows how to build "_the_ Loelinger diagram" step by step - each
# page shows a step. More precisely, each page shows the Loelinger
# diagram of that step, and the small label at the right of each
# diagram is the timestamp of that step.
#
# A command like "Time 4:20" in a script means "it's 4:20 now", or "at
# this point of the script the timestamp is 4:20", or - as an action -
# "take a low-resolution picture of the git repository and save it in
# the file /tmp/eevgit_4:20". I usually use timestamps like "A1",
# "C1.5" and "D0", and my convention is that "E1" means "we're just
# after Commit E".
#
# The command "Timeline" cats all saved pictures and outputs them, in
# alphabetical/asciibetical/chronological order, to stdout.
#
# «Time» (to ".Time")
Time0 () { echo "Time: $1"; Diagram; echo; }
Time () { Time0 $1 | tee /tmp/eevgit_$1; }
Timeline () { cat /tmp/eevgit_*; }
# «Time-tests» (to ".Time-tests")
: <<'%%%%%'
* (eepitch-bash)
* (eepitch-kill)
* (eepitch-bash)
rm -Rfv /tmp/eevgit*
mkdir /tmp/eevgit-test1/
cd /tmp/eevgit-test1/
cp -v $S/http/anggtwu.net/bin/eevgitlib1.sh /tmp/
. /tmp/eevgitlib1.sh
T () { Time $*; }
Chk () { Checkout $*; }
git init
Modify file1; git add file1
T A0; Commit A; T A1; Branch brAC; T A2
Modify file1; T B0; Commit B; T B1; Branch brBDG; T B2; Chk brAC; T B3
Modify file1; T C0; Commit C; T C1; Chk brBDG; T C3
Modify file1; T D0; Commit D; T D1; Chk HEAD^ -b brE; T D4
Modify file1; T E0; Commit E; T E1; Chk HEAD^; T E3
MergeOurs brAC -m F; T F1; Branch brFI; T F2; Chk brBDG; T F3
Modify file1; T G0; Commit G; T G1; Chk HEAD^ -b brH; T G4
Modify file1; T H0; Commit H; T H1; Chk brFI; T H3
Modify file1; T I0; Commit I; T I1; Chk HEAD^ -b brJ; T I4
Modify file1; T J0; Commit J; T J1;
Timeline
Timeline | tee /tmp/all
%%%%%
# (find-gitdocfile "revisions.txt")
# (find-gitdocfile "revisions.txt" "illustration, by Jon Loeliger")
#
# G H I J
# \ / \ /
# D E F
# \ | / \
# \ | / |
# \|/ |
# B C
# \ /
# \ /
# A
# «MakeTree1» (to ".MakeTree1")
MakeTree1 () {
git init
Modify file1; Modify file2; git add file1 file2
Commit A; Branch brAC
Modify file1; Commit B; Branch brBDG; Checkout brAC
Modify file1; Commit C; Checkout brBDG
Modify file1; Commit D; Checkout HEAD^ -b brE
Modify file1; Commit E; Checkout HEAD^
MergeOurs brAC -m F; Branch brFI; Checkout brBDG
Modify file1; Commit G; Checkout HEAD^ -b brH
Modify file1; Commit H; Checkout brFI
Modify file1; Commit I; Checkout HEAD^ -b brJ
Modify file1; Commit J
}
export PAGER=cat
: <<'%%%%%'
* (eepitch-bash)
* (eepitch-kill)
* (eepitch-bash)
. eevgitlib1.sh
rm -Rfv /tmp/eevgit-test1/
mkdir /tmp/eevgit-test1/
cd /tmp/eevgit-test1/
MakeTree1
Diagram
Modify file1; Modify file2; git add file1 file2
Commit A; Branch brAC
Modify file1; Commit B; Branch brBDG; Checkout brAC
Modify file1; Commit C; Checkout brBDG
Modify file1; Commit D; Checkout HEAD^ -b brE
Modify file1; Commit E; Checkout HEAD^
MergeOurs brAC -m F; Branch brFI; Checkout brBDG
Modify file1; Commit G; Checkout HEAD^ -b brH
Modify file1; Commit H; Checkout brFI
Modify file1; Commit I; Checkout HEAD^ -b brJ
Modify file1; Commit J
Diagram
Dumps file1 file2
git ls-files
Log1
# (find-man "1 gitk")
gitk /tmp/eevgit-test1/
gitk --date-order /tmp/eevgit-test1/
gitk --date-order --all /tmp/eevgit-test1/
gitk --decorate --date-order --all /tmp/eevgit-test1/
--date-order
# (find-gitk "/tmp/eevgit-test1/")
# (find-git-intro)
%%%%%
# «eval» (to ".eval")
# (find-angg ".emacs" "find-gitdiag")
eval $1
# «eval-test» (to ".eval-test")
: <<'%%%%%'
* (eepitch-bash)
* (eepitch-kill)
* (eepitch-bash)
rm -v /tmp/eevgitlib1.sh
laf eevgitlib1.sh
laf /tmp/eevgitlib1.sh
cp -v eevgitlib1.sh /tmp/
laf /tmp/eevgitlib1.sh
. /tmp/eevgitlib1.sh
rm -Rfv /tmp/eevgit-test1/
mkdir /tmp/eevgit-test1/
cd /tmp/eevgit-test1/
git init
Modify file1 file2
/tmp/eevgitlib1.sh "Dump; echo; Diagram"
%%%%%
# Local Variables:
# mode: sh
# End: