~ubuntu-branches/ubuntu/wily/installation-guide/wily

1 by Frans Pop
* Mention in copyright that full GPL is included in the manual.
1
#!/bin/bash
2
3
# This script will allow to check for changes in the original
4
# English docs for languages that use po files for translation.
5
# It combines the function of the old doc-check and rev-update
6
# scripts (resulting in the name rev-check :-)
7
8
# For each language, the last three revisions for which the
9
# translation has been updated are saved in a file.
10
# The current revision of English documents is checked against
11
# the most recent revisions in this file.
12
13
lang=""
14
default_lang="nl"
15
file=""
16
17
print_usage () {
18
    echo "Usage: $(basename $0) [options] [language] [file]"
19
    echo "   TODO: explanation of syntax and options"
20
}
21
22
print_usage_err () {
23
    print_usage
24
    exit 1
25
}
26
27
check_parm_lang () {
28
    # Check that directory exists won't work after conversion to po...
29
    if [ -d "$1" ] ; then
30
        lang="$1"
31
    else
32
        echo "Info: no valid language specified, using default '$default_lang'"
33
        if [ -d "$default_lang" ] ; then
34
            lang="$default_lang"
35
            return 1
36
        else
37
            echo "Error: directory for language '$default_lang' not found"
38
            print_usage_err
39
        fi
40
    fi
41
    return 0
42
}
43
44
check_parm_file () {
45
    file=$(echo "$1" | sed "s:^./::" | sed "s:^en/::")
46
    if [ ! -f "./en/$file" ] ; then
47
        echo "Error: file '$file' does not exist"
48
        return 1
49
    fi
50
    return 0
51
}
52
53
parse_opts () {
54
    command="check"
55
    do_diff=""
56
    do_all=""
57
    parm_count=0
58
59
    for opt in $@; do
60
        case "$opt" in
61
            --update|-u)
62
                [ $command = "check" ] || print_usage_err
63
                command="update"
64
                ;;
65
            --add|-a)
66
                [ $command = "check" ] || print_usage_err
67
                command="add"
68
                ;;
69
            --diff|-d)
70
                do_diff=1
71
                ;;
72
            --all|-A)
73
                do_all=1
74
                ;;
75
            --convert)
76
                [ $command = "check" ] || print_usage_err
77
                command="convert"
78
                ;;
79
            --help|-h)
80
                print_usage
81
                exit 0
82
                ;;
83
            -*)
84
                print_usage_err
85
                ;;
86
            *)
87
                parm_count=$(($parm_count + 1))
88
                if [ $parm_count -eq 1 ] ; then
89
                    check_parm_lang "$opt"
90
                    [ $? -ne 0 ] && parm_count=$(($parm_count + 1))
91
                fi
92
                if [ $parm_count -eq 2 ] ; then
93
                    check_parm_file "$opt"
94
                    [ $? -ne 0 ] && print_usage_err
95
                fi
96
97
                [ $parm_count -gt 2 ] && print_usage_err
98
                ;;
99
        esac
100
        
101
    done
102
103
    [ -z "$lang" ] && check_parm_lang "<none>"
104
105
    case $command in
106
        check)
107
            [ "$do_all" ] && print_usage_err
108
            ;;
109
        convert)
110
            [ "$do_all" ] && print_usage_err
111
            if [ -n "$file" ] ; then
112
                echo "Error: parameter [file] not allowed with --$command option"
113
                print_usage_err
114
            fi
115
            if [ ! -d $lang ] ; then
116
                echo "Error: directory for language '$lang' not found"
117
                exit 1
118
            fi
119
            ;;
120
        add|update)
121
            if [ ! "$do_all" ] && [ -z "$file" ] ; then
122
                echo "Error: parameter [file] missing, to update all files add --all option"
123
                print_usage_err
124
            fi
125
            if [ "$do_all" ] && [ ! -z "$file" ] ; then
126
                echo "Error: parameter [file] not allowed with --all option"
127
                print_usage_err
128
            fi
129
            ;;
130
    esac
131
}
132
133
get_rev () {
134
    local REV
135
    REV="$(egrep '^<\!--[[:space:]]*\$Id:' ./en/$1 | \
136
           sed 's/^.*$Id:[[:space:]]*//' | cut -d " " -f 2)"
137
    if [ -z "$REV" ] ; then
138
        echo "Error: could not determine revision of './en/$1'"
139
        return 1
140
    fi
141
    echo "$REV"
142
    return 0
143
}
144
145
get_trev () {
146
    local TREV
147
    [ "$2" = "all" ] && fields="2-" || fields="2"
148
    TREV="$(egrep "^$1" $rev_file | cut -f $fields)"
149
    if [ -z "$TREV" ] ; then
150
        return 1
151
    fi
152
    echo "$TREV"
153
    return 0
154
}
155
156
print_diff () {
157
    local TREV
158
    local TREV_PREV=""
159
    for TREV in $2; do
160
        [ "$TREV_PREV" ] && echo "Diff against revision $TREV_PREV failed, trying next oldest: $TREV"
161
        svn diff -r $TREV:$3 ./en/$1
162
        [ $? -eq 0 ] && break
163
        TREV_PREV=$TREV
164
    done
165
}
166
167
check_one () {
168
    REV=$(get_rev $1)
169
    [ $? -ne 0 ] && return 9
170
    TREV=$(get_trev $1)
171
    if [ $? -ne 0 ] ; then
172
        echo "$1: N/A -> $REV"
173
        return 2
174
    fi
175
176
    local RET=0
177
    if [ ! "$TREV" = "$REV" ] ; then
178
        RET=1
179
        echo "$1: $TREV -> $REV"
180
        if [ "$do_diff" ] ; then
181
            print_diff $1 "$(get_trev $1 all)" $REV
182
            echo
183
        fi
184
    fi
185
    return $RET
186
}
187
188
do_check () {
189
    local RESULT=0
190
    if [ -n "$file" ] ; then
191
        check_one $file
192
        RESULT=$?
193
    else
194
        for file in $(find ./en/ -name "*.xml" | sed "s:^./::" | sed "s:^en/::"); do
195
            check_one $file
196
            [ $? -eq 1 ] && RESULT=1
197
        done
198
    fi
199
    [ $RESULT -ne 1 ] && echo "No updates found"
200
}
201
202
update_revdata () {
203
    cp $rev_file $rev_file~
204
    egrep -v "^$1" $rev_file~ >$rev_file
205
206
    # Keep the last three revisions in $rev_file
207
    local REV
208
    local counter=1
209
    echo -n "$1" >>$rev_file
210
    for REV in $2; do
211
        echo -en "\t$REV" >>$rev_file
212
        counter=$(($counter + 1))
213
        [ $counter -gt 3 ] && break
214
    done
215
    echo >>$rev_file
216
    echo "   Revision updated"
217
}
218
219
update_one () {
220
    local file=$1
221
    check_one $file
222
    if [ $? -eq 1 ] ; then
223
        update_revdata $1 "$REV $(get_trev $1 all)"
224
    fi
225
}
226
227
do_update () {
228
    if [ -n "$file" ] ; then
229
        update_one $file
230
    else
231
        for file in $(find ./en/ -name "*.xml" | sed "s:^./::" | sed "s:^en/::"); do
232
            update_one $file
233
        done
234
    fi
235
}
236
237
do_add_one () {
238
    if egrep "^$file" $rev_file ; then
239
        echo "Error: revision data already has '$file'"
240
        exit 1
241
    fi
242
243
    REV=$(get_rev $1)
244
    [ $? -ne 0 ] && exit 1
245
246
    echo -e "$file\t$REV" >>$rev_file
247
}
248
249
do_add_all () {
250
    for file in $(find ./en/ -name "*.xml" | sed "s:^./::" | sed "s:^en/::"); do
251
        if [ -f $rev_file ] && egrep "^$file" $rev_file ; then
252
            continue
253
        fi
254
255
        REV=$(get_rev $file)
256
        [ $? -ne 0 ] && continue
257
258
        echo -e "$file\t$REV" >>$rev_file
259
        echo "Added '$file' at $REV"
260
    done
261
}
262
263
do_convert () {
264
    for file in $(find ./en/ -name "*.xml" | sed "s:^./::" | sed "s:^en/::"); do
265
        if [ -f ./$lang/$file ]; then
266
            REV="$(egrep '^<\!--[[:space:]]*original version:' ./$lang/$file | \
267
                   sed 's/^.*original version:[[:space:]]*//' | cut -d " " -f 1)"
268
            if [ -z "$REV" ] ; then
269
                echo "Warning: no revision comment found for './$lang/$file'"
270
            else
271
                echo -e "$file\t$REV" >>$rev_file
272
            fi
273
        else
274
            echo "Warning: file './$lang/$file' not found"
275
        fi
276
    done
277
}
278
279
280
## MAINLINE
281
282
[ -d ./po/revdata ] || exit 1
283
284
parse_opts "$@"
285
rev_file=./po/revdata/$lang.dat
286
287
if [ "$command" = "convert" ] || \
288
   ( [ "$command" = "add" ] && [ "$do_all" ] ) ; then
289
    if [ -s $rev_file ] ; then
290
        echo "Error: file with revision data already exists"
291
        exit 1
292
    fi
293
else
294
    if [ ! -s $rev_file ] ; then
295
        echo "Error: file with revision data does not exist"
296
        exit 1
297
    fi
298
fi
299
300
case $command in
301
    check)
302
        do_check
303
        ;;
304
    update)
305
        do_update
306
        ;;
307
    add)
308
        [ "$do_all" ] && do_add_all || do_add_one
309
        ;;
310
    convert)
311
        do_convert
312
        ;;
313
esac
314
315
exit 0