read Summary
if get -o /tmp/put.a$$ $1 # previous version
thenΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β # merge pieces
Β cp $1 /tmp/put.b$$Β Β Β Β Β Β # current version
Β echo"@@@ `getname` `date` $Summary" >>/tmp/put.b$$
Β diff -e $1 /tmp/put.a$$ >>/tmp/put.b$$Β Β # latest diffs
Β sed -n '/^@@@/,$p' <$HIST >>/tmp/put.b$$ # old diffs
Β overwrite $HIST cat /tmp/put.b$$ # put it back
else # make a new one
Β echo "put: creating $HIST"
Β cp $1 $HIST
Β echo "@@@ `getname` `date` $Summary" >>$HIST
fi
rm -f /tmp/put.[ab]$$
ΠΠΎΡΠ»Π΅ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΡΠ²ΠΎΠ΄ΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°
put
ΠΎΠ±ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΊ
get
Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ Π²Π΅ΡΡΠΈΠΈ ΡΠ°ΠΉΠ»Π° ΠΈΠ· ΡΠ°ΠΉΠ»Π° ΠΈΡΡΠΎΡΠΈΠΈ. Π€Π»Π°Π³
-ΠΎ
ΠΊΠΎΠΌΠ°Π½Π΄Ρ
get
ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π²ΡΡ
ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°. Π ΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, ΠΊΠΎΠ³Π΄Π°
get
Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π½Π°ΠΉΡΠΈ ΡΠ°ΠΉΠ» ΠΈΡΡΠΎΡΠΈΠΈ, ΠΎΠ½Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΊΠΎΠ΄ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΊΠΈ, ΠΈ
put
ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠ°ΠΉΠ» ΠΈΡΡΠΎΡΠΈΠΈ. ΠΡΠ»ΠΈ ΡΠ°ΠΉΠ» ΠΈΡΡΠΎΡΠΈΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, ΡΠΎ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ
ΠΏΠΎΡΠ»Π΅
then
ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ ΡΠ°ΠΉΠ» ΡΠ°ΠΊΠΎΠ³ΠΎ ΡΠΎΡΠΌΠ°ΡΠ°: ΡΠ°ΠΌΠ°Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ Π²Π΅ΡΡΠΈΡ, ΡΡΡΠΎΠΊΠ°
@@@
, ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ° Π΄Π»Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΡΡ, ΡΡΠ°ΡΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ° ΠΈ ΡΡΡΠΎΠΊΠΈ Π ΠΊΠΎΠ½ΡΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ ΡΠ°ΠΉΠ» ΠΊΠΎΠΏΠΈΡΡΠ΅ΡΡΡ Π² ΡΠ°ΠΉΠ» ΠΈΡΡΠΎΡΠΈΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
overwrite
.
ΠΠΎΠΌΠ°Π½Π΄Π°
get
Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ
put
Π²ΠΊΠ»ΡΡΠ°Π΅Ρ ΡΠ»Π°Π³ΠΈ:
# get: extract file from history
PATH=/bin:/usr/bin
VERSION=0
while test "$1" != ""
do
Β case "$1" in
Β -i) INPUT=$2; shift ;;
Β -o) OUTPUT=$2; shift ;;
Β -[0-9]) VERSION=$1 ;;
Β -*) echo "get: Unknown argument $i" 1>&2; exit 1 ;;
Β *) case "$OUTPUT" in
Β "") OUTPUT=$1 ;;
Β *) INPUT=$1.H ;;
Β esac
Β esac
Β shift
done
OUTPUT=${OUTPUT?"Usage: get [-o outfile] [-i file.H] file"}
INPUT=${INPUT-$OUTPUT.H}
test -r $INPUT || { echo "get: no file $INPUT" 1>&2; exit 1; }
trap 'rm -f /tmp/get.[ab]$$; exit 1' 1 2 15
# split into current version and editing commands
sed <$INPUT -n '1,/^@@@/w /tmp/get.a'$$'
/^@@@/,$w /tmp/get.b'$$
# perform the edits
awk </tmp/get.b$$ '
Β <a href="">/^@@@/</a> { count++ }
Β !/^@@@/ && count > 0 && count <= - "$VERSION"
Β END { print "$d"; print "w", "'$OUTPUT'" }
' | ed - /tmp/get.a$$
rm -f /tmp/get.[ab]$$
Π€Π»Π°Π³ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΎΠ±ΡΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ:
-i
ΠΈ
-ΠΎ
Π·Π°Π΄Π°ΡΡ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π²Ρ
ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Π²ΡΡ
ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ², β
-[0-9]
ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Π²Π΅ΡΡΠΈΡ:
-0
β Π½ΠΎΠ²Π°Ρ Π²Π΅ΡΡΠΈΡ (Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ),
-1
β ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ°Ρ Π²Π΅ΡΡΠΈΡ ΠΈ Ρ.Π΄.). Π¦ΠΈΠΊΠ» ΠΏΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌ ΠΎΡΠ³Π°Π½ΠΈΠ·ΡΠ΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄
while
,
test
ΠΈ
shift
, Π° Π½Π΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ
for
, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ»Π°Π³ΠΈ (
-i
,
-ΠΎ
) ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ, ΠΈ ΠΏΠΎΡΡΠΎΠΌΡ Π½ΡΠΆΠ½ΠΎ ΡΠ΄Π²ΠΈΠ³Π°ΡΡ ΠΈΡ
ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ
shift
, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠ»ΠΎΡ
ΠΎ ΡΠΎΠ³Π»Π°ΡΡΠ΅ΡΡΡ Ρ ΡΠΈΠΊΠ»ΠΎΠΌ
for
, Π΅ΡΠ»ΠΈ ΠΎΠ½Π° Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π²Π½ΡΡΡΠΈ Π½Π΅Π³ΠΎ. Π€Π»Π°Π³ ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ°
ed
ΠΎΡΠΊΠ»ΡΡΠ°Π΅Ρ Π²ΡΠ²ΠΎΠ΄ ΡΠΈΡΠ»Π° ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ², ΠΎΠ±ΡΡΠ½ΡΠΉ ΠΏΡΠΈ ΡΡΠ΅Π½ΠΈΠΈ ΠΈ Π·Π°ΠΏΠΈΡΠΈ Π² ΡΠ°ΠΉΠ».
Π‘ΡΡΠΎΠΊΠ°
test -r $INPUT || {echo "get: no file $INPUT" 1>&2; exit 1;}
ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½Π° ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ
if test ! -r $INPUT
then
Β echo "get: no file $INPUT" 1>&2
Β exit 1
fi
(ΡΠ°ΠΊΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅
put
), Π½ΠΎ Π·Π°ΠΏΠΈΡΡ Π΅Π΅ ΠΊΠΎΡΠΎΡΠ΅, ΠΈ ΠΎΠ½Π° ΠΏΠΎΠ½ΡΡΠ½Π΅Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠ°ΠΌ, Ρ
ΠΎΡΠΎΡΠΎ Π·Π½Π°ΠΊΠΎΠΌΡΠΌ Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ΅ΠΉ
||
. ΠΠΎΠΌΠ°Π½Π΄Ρ, Π·Π°ΠΊΠ»ΡΡΠ΅Π½Π½ΡΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ
{
ΠΈ
}
, Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π½Π΅ ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½Π½ΡΠΌ, Π° ΠΈΡΡ
ΠΎΠ΄Π½ΡΠΌ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠΎΠΌ. ΠΡΠΎ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°
exit
ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π»Π° Π²ΡΡ
ΠΎΠ΄ ΠΈΠ·
get
, Π° Π½Π΅ ΠΈΠ· ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ°. Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ
{
ΠΈ
}
ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ
do
ΠΈ
done
β ΠΎΠ½ΠΈ ΠΏΡΠΈΠΎΠ±ΡΠ΅ΡΠ°ΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, Π΅ΡΠ»ΠΈ ΡΠ»Π΅Π΄ΡΡΡ Π·Π° ΡΠΎΡΠΊΠΎΠΉ Ρ Π·Π°ΠΏΡΡΠΎΠΉ, ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π° ΡΡΡΠΎΠΊΠΈ ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΈΠΌ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ.
Π Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π²
get
, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈ ΡΠ΅ΡΠ°ΡΡ Π·Π°Π΄Π°ΡΡ. ΠΠ½Π°ΡΠ°Π»Π΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ°
sed
ΡΠ°ΠΉΠ» ΠΈΡΡΠΎΡΠΈΠΈ ΡΠ°Π·Π±ΠΈΠ²Π°Π΅ΡΡΡ Π½Π° Π΄Π²Π΅ ΡΠ°ΡΡΠΈ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠ΅ ΡΠ°ΠΌΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ Π²Π΅ΡΡΠΈΡ ΠΈ Π½Π°Π±ΠΎΡ ΠΊΠΎΠΌΠ°Π½Π΄ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠ°ΡΠ΅ΠΌ Π²
awk
-ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ. Π‘ΡΡΠΎΠΊΠΈ
@@@
ΠΏΠΎΠ΄ΡΡΠΈΡΡΠ²Π°ΡΡΡΡ (Π½ΠΎ Π½Π΅ ΠΏΠ΅ΡΠ°ΡΠ°ΡΡΡΡ), ΠΈ Π΄ΠΎ ΡΠ΅Ρ
ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΠΈΡ
ΡΠΈΡΠ»ΠΎ Π½Π΅ ΠΏΡΠ΅Π²ΡΡΠ°Π΅Ρ Π½ΠΎΠΌΠ΅ΡΠ° Π½ΡΠΆΠ½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ, ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΠΏΡΡΠΊΠ°ΡΡΡΡ (Π½Π°ΠΏΠΎΠΌΠ½ΠΈΠΌ, ΡΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅, ΠΏΡΠΈΠ½ΡΡΠΎΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π²
awk
-ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΡΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΊ Π²ΡΠ²ΠΎΠ΄Ρ Π²Ρ
ΠΎΠ΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ). Π ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ· ΡΠ°ΠΉΠ»Π° ΠΈΡΡΠΎΡΠΈΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ Π΅ΡΠ΅ Π΄Π²Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
ed
:
$d
ΡΠ΄Π°Π»ΡΠ΅Ρ ΠΎΠ΄Π½Ρ ΡΡΡΠΎΠΊΡ
@@@
, ΠΊΠΎΡΠΎΡΡΡ ΡΠ΅Π΄Π°ΠΊΡΠΎΡ
sed
ΠΎΡΡΠ°Π²ΠΈΠ» Π² ΡΠ΅ΠΊΡΡΠ΅ΠΉ Π²Π΅ΡΡΠΈΠΈ, Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°
w
ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ ΡΠ°ΠΉΠ» Π² ΠΎΡΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ Π΅ΠΌΡ ΠΌΠ΅ΡΡΠΎ. ΠΠΎΠΌΠ°Π½Π΄Π°
overwrite
Π·Π΄Π΅ΡΡ Π½Π΅ Π½ΡΠΆΠ½Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²
get
ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π²Π΅ΡΡΠΈΡ ΡΠ°ΠΉΠ»Π°, Π° Π½Π΅ ΡΠ°ΠΌ ΡΠ°ΠΉΠ» ΠΈΡΡΠΎΡΠΈΠΈ.