]> icculus.org git repositories - divverent/nexuiz.git/blob - misc/zipdiff
add zipdiff script
[divverent/nexuiz.git] / misc / zipdiff
1 #!/bin/sh
2
3 usage()
4 {
5         cat <<EOF
6 Usage:
7   $0 -o difference.zip -f from.zip -t to.zip
8   $0 -f from.zip -t to.zip
9 EOF
10         exit 1
11 }
12
13 output=
14 from=
15 to=
16
17 while [ $# -gt 0 ]; do
18         o=$1
19         shift
20         case "$o" in
21                 -o)
22                         output=$1
23                         shift
24                         ;;
25                 -f)
26                         from=$1
27                         shift
28                         ;;
29                 -t)
30                         to=$1
31                         shift
32                         ;;
33                 *)
34                         usage
35                         ;;
36         esac
37 done
38
39 [ -n "$from" ] || usage
40 [ -n "$to" ] || usage
41
42 found()
43 {
44         type=$1
45         source=$2
46         echo >&2 "$type: $source"
47         case "$type" in
48                 new|changed|deleted)
49                         echo "$source"
50                         ;;
51                 deleted|*)
52                         echo >&2 " * Sorry, can't handle deletion of $source."
53                         ;;
54         esac
55 }
56
57 tempdir=`mktemp -d -t zipdiff.XXXXXX`
58
59 newline="
60 "
61 fromlist="$(zipinfo -1 "$from" | grep -v /\$)"
62 tolist="$(zipinfo -1 "$to" | grep -v /\$)"
63
64 diffit()
65 {
66         echo "$fromlist" | while IFS= read -r line; do
67                 case "$newline$tolist$newline" in
68                         *$newline$line$newline*)
69                                 ;;
70                         *)
71                                 found deleted "$line"
72                                 ;;
73                 esac
74         done
75         echo "$tolist" | while IFS= read -r line; do
76                 case "$newline$fromlist$newline" in
77                         *$newline$line$newline*)
78                                 # check if equal
79                                 unzip -p "$from" "$line" > "$tempdir/v1"
80                                 unzip -p "$to" "$line" > "$tempdir/v2"
81                                 if ! diff --brief "$tempdir/v1" "$tempdir/v2" >/dev/null 2>&1; then
82                                         found changed "$line"
83                                 fi
84                                 rm "$tempdir/v1"
85                                 rm "$tempdir/v2"
86                                 ;;
87                         *)
88                                 found new "$line"
89                                 ;;
90                 esac
91         done
92 }
93
94 result=`diffit`
95
96 case "$output" in
97         '')
98                 ;;
99         *)
100                 rm -f "$output"
101                 echo "$result" | while IFS= read -r line; do
102                         echo >&2 "extracting $line..."
103                         dline=./$line
104                         mkdir -p "$tempdir/${dline%/*}"
105                         unzip -p "$to" "$line" > "$tempdir/$line" # this may create an empty file - don't care, DP handles this as deletion
106                 done
107                 case "$output" in
108                         /*)
109                                 ;;
110                         *)
111                                 output=`pwd`/$output
112                                 ;;
113                 esac
114                 cd "$tempdir"
115                 #zip -9r "$output" .
116                 7za a -tzip -mx=9 "$output" .
117                 cd ..
118                 ;;
119 esac
120
121 rm -rf "$tempdir"