blob: 6071a4633416975a76a55968ffb7fbb0c0ccb386 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
|
#!/bin/bash
# Copyright (C) 2021 Nicolas Peugnet <n.peugnet@free.fr>
# This file is part of dna-backup.
# dna-backup is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# dna-backup is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with dna-backup. If not, see <https://www.gnu.org/licenses/>. */
# This script expects the following variables to be exported:
# - DNA_BACKUP: the path to dna-backup binary
# - DNA_PARAMS: the path of the files that desscribes the multiple parameters to test
# - REPO_PATH: the path of the repo the experiment is based on
# - GIT_PATH: the path of the repo git-dir
# - MAX_VERSION: the max number for versions for the experiment
# - SKIP_CHECK: the number of versions to skip checking
# - COMMITS: the name of the file that contains the lists of versions
# - TARGZ: the path of the tar.gz dir
# - DIFFS: the path of the git diff dir
# - REAL: the path of the real size dir
# - BORG: the path to borg dir
# - GIT_NOPACK: the path of the git nopack dir
log() {
echo -e "\033[90m$(date +%T.%3N)\033[0m" $*
}
set-git-dir() {
echo gitdir: $1 > $REPO_PATH/.git
}
GITC="git -C $REPO_PATH"
OUT=/tmp/dna-backup-exp-out
if [ -n "$GIT_NOPACK" ]
then
# Init git nopack dir
rm $REPO_PATH/.git
$GITC init --separate-git-dir=$GIT_NOPACK
$GITC --git-dir=$GIT_NOPACK config gc.auto 0
set-git-dir $GIT_PATH
fi
if [ -n "$BORG" ]
then
# Init borg dir
borg init -e none $BORG
fi
# "empty tree" commit
prev="4b825dc642cb6eb9a060e54bf8d69288fbee4904"
last=$(tail --lines=1 $COMMITS | cut -f1)
i=0
head -n $MAX_VERSION $COMMITS | while read line
do
# Get hash
hash=$(echo "$line" | cut -f1)
# Check out repo
log "check out $hash"
$GITC checkout $hash 2> $OUT \
|| (log "error checking out"; cat $OUT; exit 1)
if [ -n "$REAL" ]
then
# Save real size for this version
log "save real size for this version"
du -b --summarize $REPO_PATH > $(printf "%s.versions/%05d" $REAL $i)
fi
if [ -n "$TARGZ" ]
then
# Create tar.gz for this version
log "create targ.gz for this version"
tar -czf $(printf "%s/%05d.tar.gz" $TARGZ $i) $REPO_PATH
fi
if [ -n "$DIFFS" ]
then
# Create git diff for this version
log "create git diff for this version"
diff=$(printf "%s/%05d.diff.gz" $DIFFS $i)
$GITC diff --minimal --binary --unified=0 -l0 $prev \
| gzip \
> $diff
fi
if [ -n "$GIT_NOPACK" ]
then
# Create git nopack for this version
log "create git nopack for this version"
set-git-dir $GIT_NOPACK
$GITC add .
$GITC commit -m $hash &> $OUT \
|| (log "error commiting to nopack"; cat $OUT; exit 1)
ls $GIT_NOPACK/objects/pack
find $GIT_NOPACK -type f -exec du -ba {} + \
> $(printf "%s.versions/%05d" $GIT_NOPACK $i)
set-git-dir $GIT_PATH
fi
if [ -n "$BORG" ]
then
# Create borg backup for this versions
log "create borg backup for this versions"
borg create $BORG::$i $REPO_PATH
find $BORG/data -type f -exec du -ba {} + \
| cut -f1 \
| paste -sd+ \
| bc \
> $(printf "%s.versions/%05d" $BORG $i)
fi
if [ -n "$DNA_PARAMS" ]
then
# Create dna backups for this version
cat $DNA_PARAMS | while read name flags
do
log "create $name backup for this version"
$DNA_BACKUP commit -v 2 $flags $REPO_PATH $name
log "create $name export for this version"
export=/tmp/dna-backup-exp-export
rm -rf $export
$DNA_BACKUP export -v 2 $flags $name $export
find $export -type f -exec du -ba {} + \
| cut -f1 \
| paste -sd+ \
| bc \
> $(printf "%s_export.versions/%05d" $name $i)
done
fi
if [[ $(( $i % $SKIP_CHECK )) == 0 ]]
then
if [ -n "$DIFFS" ]
then
# Check restore from git diffs
log "restore from git diffs"
TEMP=$(mktemp -d)
for n in $(seq 0 $i)
do
diff=$(printf "%s/%05d.diff.gz" $DIFFS $n)
cat $diff \
| gzip --decompress \
| git -C $TEMP apply --binary --unidiff-zero --whitespace=nowarn -
done
cp $REPO_PATH/.git $TEMP/
log "check restore from diffs"
diff --brief --recursive $REPO_PATH $TEMP \
|| log "git patchs restore do not match source"
rm -rf $TEMP
fi
if [ -n "$DNA_PARAMS" ]
then
# Check restore from dna backups
cat $DNA_PARAMS | while read name flags
do
log "restore from $name backup"
TEMP=$(mktemp -d)
$DNA_BACKUP restore -v 2 $flags $name $TEMP
log "check restore from backup"
diff --brief --recursive $REPO_PATH $TEMP \
|| log "dna backup restore do not match source"
rm -rf $TEMP
done
fi
fi
prev=$hash
let i++
done
# cleanup
log "clean up $REPO_PATH"
$GITC checkout $last 2> $OUT \
|| (log "error checking out back to latest commit"; cat $OUT; exit 2)
|