summaryrefslogtreecommitdiff
path: root/git-deltafy-script
blob: f63cf075ec3f350036c7654606424b5be5a2abbb (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
#!/bin/bash

# Script to deltafy an entire GIT repository based on the commit list.
# The most recent version of a file is the reference and previous versions
# are made delta against the best earlier version available. And so on for
# successive versions going back in time.  This way the delta overhead is
# pushed towards older version of any given file.
#
# NOTE: the "best earlier version" is not implemented in mkdelta yet
#       and therefore only the next eariler version is used at this time.
#
# TODO: deltafy tree objects as well.
#
# The -d argument allows to provide a limit on the delta chain depth.
# If 0 is passed then everything is undeltafied.

set -e

depth=
[ "$1" == "-d" ] && depth="--max-depth=$2" && shift 2

curr_file=""

git-rev-list HEAD |
git-diff-tree -r --stdin |
awk '/^:/ { if ($5 == "M" || $5 == "N") print $4, $6 }' |
LC_ALL=C sort -s -k 2 | uniq |
while read sha1 file; do
	if [ "$file" == "$curr_file" ]; then
		list="$list $sha1"
	else
		if [ "$list" ]; then
			echo "Processing $curr_file"
			echo "$head $list" | xargs git-mkdelta $depth -v
		fi
		curr_file="$file"
		list=""
		head="$sha1"
	fi
done