[PATCH] Optimize diff-tree -[CM] --stdin
[git.git] / git-deltafy-script
1 #!/bin/bash
2
3 # Script to deltafy an entire GIT repository based on the commit list.
4 # The most recent version of a file is the reference and previous versions
5 # are made delta against the best earlier version available. And so on for
6 # successive versions going back in time.  This way the delta overhead is
7 # pushed towards older version of any given file.
8 #
9 # NOTE: the "best earlier version" is not implemented in mkdelta yet
10 #       and therefore only the next eariler version is used at this time.
11 #
12 # TODO: deltafy tree objects as well.
13 #
14 # The -d argument allows to provide a limit on the delta chain depth.
15 # If 0 is passed then everything is undeltafied.
16
17 set -e
18
19 depth=
20 [ "$1" == "-d" ] && depth="--max-depth=$2" && shift 2
21
22 curr_file=""
23
24 git-rev-list HEAD |
25 git-diff-tree -r --stdin |
26 awk '/^:/ { if ($5 == "M" || $5 == "N") print $4, $6 }' |
27 LC_ALL=C sort -s -k 2 | uniq |
28 while read sha1 file; do
29         if [ "$file" == "$curr_file" ]; then
30                 list="$list $sha1"
31         else
32                 if [ "$list" ]; then
33                         echo "Processing $curr_file"
34                         echo "$head $list" | xargs git-mkdelta $depth -v
35                 fi
36                 curr_file="$file"
37                 list=""
38                 head="$sha1"
39         fi
40 done