updates from MirBSD CVS
[shellsnippets/shellsnippets.git] / mksh / verscmp
1 #!/bin/mksh
2 # $MirOS: contrib/hosted/tg/verscmp,v 1.1 2013/01/03 22:15:00 tg Exp $
3 #-
4 # Copyright © 2013
5 #       Thorsten Glaser <tg@mirbsd.org>
6 #
7 # Provided that these terms and disclaimer and all copyright notices
8 # are retained or reproduced in an accompanying document, permission
9 # is granted to deal in this work without restriction, including un‐
10 # limited rights to use, publicly perform, distribute, sell, modify,
11 # merge, give away, or sublicence.
12 #
13 # This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
14 # the utmost extent permitted by applicable law, neither express nor
15 # implied; without malicious intent or gross negligence. In no event
16 # may a licensor, author or contributor be held liable for indirect,
17 # direct, other damage, loss, or other issues arising in any way out
18 # of dealing in the work, even if advised of the possibility of such
19 # damage or existence of a defect, except proven that it results out
20 # of said person’s immediate fault when using the work as intended.
21 #-
22 # Compare versions. Syntax: verscmp filea fileb
23 # Files contain IFS-separated: name, version, ignored
24
25 fa=$1; fb=$2
26 [[ -n $fa && -s $fa && -n $fb && -s $fb ]] || exit 1
27
28 py='# coding: utf-8'
29 nl=$'\n'
30
31 function pyadd {
32         local field=$1 file=$2 cola colb rest
33
34         py+=$nl"$field = {"
35         while read cola colb rest; do
36                 py+=$nl"'''${cola//\\/\\\\}''': '''${colb//\\/\\\\}''',"
37         done <"$file"
38         py+=$nl"}"
39 }
40
41 pyadd sidea "$fa"
42 pyadd sideb "$fb"
43
44 py+=$nl"q = '\"'"
45 py+='
46 comb = {}
47 ckeys = sidea.keys()
48 ckeys.extend(sideb.keys())
49 ckeys = set(ckeys)
50 for k in ckeys:
51         comb[k] = [None, None]
52 for k, v in sidea.iteritems():
53         comb[k][0] = v
54 for k, v in sideb.iteritems():
55         comb[k][1] = v
56 ckeys = list(ckeys)
57 ckeys.sort()
58 for k in ckeys:
59         va = comb[k][0]
60         vb = comb[k][1]
61         if va <> vb:
62                 if va is None:
63                         da = "None"
64                 else:
65                         da = q + va + q
66                 if vb is None:
67                         db = "None"
68                 else:
69                         db = q + vb + q
70                 print k, da, db
71 '
72 python <<<"$py"