|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
# This file:
# http://anggtwu.net/GIT/eevgitlib1.sh.html
# http://anggtwu.net/GIT/eevgitlib1.sh
# (find-angg "GIT/eevgitlib1.sh")
# (find-eevgit "eevgitlib1.sh")
# Author: Eduardo Ochs <eduardoochs@gmail.com>
# License: GPL3
# Version: 2024jan05
#
# This is the library that is used by:
# http://anggtwu.net/eev-intros/find-git-intro.html
# (find-git-intro)
# it defines lots of shell functions and does a few other things, like
# "N=0" and "export PAGER=cat".
#
# See: (find-git-intro)
# (find-git-intro "1. Preparation")
# http://anggtwu.net/2023-eev-git.html
#
# (defun e () (interactive) (find-eevgit "eevgitlib1.sh"))
# (find-eevgitfile "eevgitlib1.sh")
# (find-eevgitsh0 "cp -v eevgitlib1.sh $S/http/anggtwu.net/GIT/")
#
# Index:
# «.basic» (to "basic")
# «.basic-tests» (to "basic-tests")
# «.MakeTree1» (to "MakeTree1")
# «.MakeTree1-test» (to "MakeTree1-test")
# «.Time» (to "Time")
# «.Time-tests» (to "Time-tests")
# ____ _
# | __ ) __ _ ___(_) ___
# | _ \ / _` / __| |/ __|
# | |_) | (_| \__ \ | (__
# |____/ \__,_|___/_|\___|
#
# 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)
. eevgitlib1.sh
rm -Rfv /tmp/eevgit*
mkdir /tmp/eevgit-test1/
cd /tmp/eevgit-test1/
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
%%%%%
# __ __ _ _____ _
# | \/ | __ _| | ____|_ _| __ ___ ___/ |
# | |\/| |/ _` | |/ / _ \| || '__/ _ \/ _ \ |
# | | | | (_| | < __/| || | | __/ __/ |
# |_| |_|\__,_|_|\_\___||_||_| \___|\___|_|
#
# See:
# (find-git-intro "2. A first test")
# http://anggtwu.net/eev-intros/find-git-intro.html#2
# This creates a git repository whose tree of commits has this shape:
#
# G H I J
# \ / \ /
# D E F
# \ | / \
# \ | / |
# \|/ |
# B C
# \ /
# \ /
# A
#
# «MakeTree1» (to ".MakeTree1")
MakeTree1 () {
git init
Modify file1; git add file1
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
# «MakeTree1-test» (to ".MakeTree1-test")
: <<'%%%%%'
* (eepitch-bash)
* (eepitch-kill)
* (eepitch-bash)
. eevgitlib1.sh
rm -Rfv /tmp/eevgit-test1/
mkdir /tmp/eevgit-test1/
cd /tmp/eevgit-test1/
MakeTree1
Diagram
git show HEAD
git show HEAD:file1
git show-ref
git show brFI
git ls-files
git log
git log --oneline
# TODO: add more examples of interrogators!
# See: (find-gitdoc-links "show")
# (find-gitdoc-links "show-ref")
# (find-gitdoc-links "log")
# (find-gitdocfile "cmds-plumbinginterrogators.txt")
# (find-gitdocfile "" "cmds-plumbinginterrogators.txt")
%%%%%
# _____ _
# |_ _(_)_ __ ___ ___
# | | | | '_ ` _ \ / _ \
# | | | | | | | | | __/
# |_| |_|_| |_| |_|\___|
#
# 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")
# (find-git-intro "3. Timelines")
: <<'%%%%%'
* (eepitch-bash)
* (eepitch-kill)
* (eepitch-bash)
. eevgitlib1.sh
rm -Rfv /tmp/eevgit*
mkdir /tmp/eevgit-test1/
cd /tmp/eevgit-test1/
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
%%%%%
# Local Variables:
# mode: sh
# coding: utf-8-unix
# End: