aboutsummaryrefslogtreecommitdiff
path: root/exp/exp.sh
blob: 5e2d9beae94ae5739357ab1f9b85eea6cdde213f (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
#!/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

# 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

# Init borg dir
borg init -e none $BORG

# "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)

	# Save real size for this version
	log "save real size for this version"
	du -b --summarize $REPO_PATH > $(printf "%s.versions/%05d" $REAL $i)

	# Create tar.gz for this version
	log "create targ.gz for this version"
	tar -czf $(printf "%s/%05d.tar.gz" $TARGZ $i) $REPO_PATH

	# 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

	# 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

	# 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)

	# 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
	done

	if [[ $(( $i % $SKIP_CHECK )) == 0 ]]
	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


		# 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

	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)