tazpkg view modules/upgrade @ rev 836

Add module "upgrade"; make bullet-proof code to work with "root" ("recharge" and "upgrade" modules); re-make depends/rdepends commands.
author Aleksej Bobylev <al.bobylev@gmail.com>
date Sat Aug 15 17:41:08 2015 +0300 (2015-08-15)
parents
children a02e36d44d06
line source
1 #!/bin/sh
2 # TazPkg - Tiny autonomous zone packages manager, hg.slitaz.org/tazpkg
3 # upgrade - TazPkg module
4 # Check for upgrades and make system up-to-date
7 # Options:
9 # Environment variables:
10 # root Root of the packages DB
11 # check Only check for upgrades
12 # install Check and install all upgraded packages
15 # Connect function libraries
16 . /lib/libtaz.sh
21 # Get TazPkg working environment
22 # ------------------------------
24 [ ! -d "$root/etc/slitaz" ] && mkdir -p "$root/etc/slitaz"
25 [ ! -e "$root/etc/slitaz/slitaz.conf" ] && cp /etc/slitaz/slitaz.conf "$root/etc/slitaz"
26 [ ! -e "$root/etc/slitaz/tazpkg.conf" ] && cp /etc/slitaz/tazpkg.conf "$root/etc/slitaz"
27 [ ! -e "$root/etc/slitaz-release" ] && echo 'cooking' > "$root/etc/slitaz-release"
29 # Read configuration
30 if [ -n "$root" ]; then
31 # Patch external conf files to correctly handle --root value
32 slitaz_conf=$(mktemp); cp "$root/etc/slitaz/slitaz.conf" $slitaz_conf
33 tazpkg_conf=$(mktemp); cp "$root/etc/slitaz/tazpkg.conf" $tazpkg_conf
34 sed -i "s| /| $root/|g; s|\"/|\"$root/|g" $slitaz_conf $tazpkg_conf
35 . $slitaz_conf; . $tazpkg_conf; rm $slitaz_conf $tazpkg_conf
36 else
37 . /etc/slitaz/slitaz.conf; . /etc/slitaz/tazpkg.conf
38 fi
43 # Functions
44 # ---------
46 # Get repositories priority using $PKGS_DB/priority.
47 # In this file undigest repos are called by their names and main mirror
48 # by 'main'. Sort order: priority
50 look_for_priority() {
51 [ -s "$PKGS_DB/priority" ] && priority=$(cat $PKGS_DB/priority)
53 for rep in main $(ls $PKGS_DB/undigest 2>/dev/null); do
54 if [ ! -s "$PKGS_DB/priority" ] || ! grep -q ^$rep$ $PKGS_DB/priority; then
55 priority=$(echo -e "$priority\n$rep")
56 fi
57 done
59 priority=$(echo "$priority" | sed '/^$/d' | \
60 while read line; do
61 case $line in
62 (main) echo $PKGS_DB;;
63 (*) echo $PKGS_DB/undigest/$line;;
64 esac
65 done)
66 }
71 time="$(date +%s)"
73 # Recharge packages databases (if necessary) (respects "root" value)
74 tazpkg recharge >&2
76 echo -n > $UP_LIST
77 blocked_counter=$(mktemp)
78 tmp_up_list=$(mktemp)
80 look_for_priority
81 repo_number=1
82 for repo in $priority; do
83 if [ "$repo" == "$PKGS_DB" ]; then
84 repo_name='Main'
85 else
86 repo_name="$(basename "$repo")"
87 fi
89 [ ! -f "$repo/packages.info" ] && continue
90 {
91 cat $BLOCKED | awk '{printf "%s\t%s\n", $1, "b"}';
92 cat $PKGS_DB/installed.info | awk -F$'\t' '{printf "%s\t%s\t%s\t%s\n", $1, "i", $2, $9}';
93 cat $repo/packages.info | awk -F$'\t' '{printf "%s\t%s\t%s\t%s\n", $1, "p", $2, $9}'
94 } | sort -t$'\t' -k1,1 | awk -F$'\t' \
95 -vnewbuild="$(_ 'New build')" -vcolornewbuild="$(emsg '<c 34>')" \
96 -vnewver='→ ' -vcolornewver="$(emsg '<c 32>')" \
97 -vblocked=" ($(_ 'Blocked'))" -vcolorblocked="$(emsg '<c 31>')" \
98 -vcolor0="$(emsg '</c>')" \
99 -vreponum=$repo_number -vreponame=$repo_name \
100 -vuplist="$UP_LIST" -vblocked_counter="$blocked_counter" \
101 '{
103 if ($1 != p) {
104 if (vi && vp) {
105 bb = (b=="") ? "i" : "b"
106 if ("" vi != vp) { # important: compare as strings
107 startc = (b=="") ? colornewver : colorblocked;
108 printf "%s\t%s\t%s\t%s\t%s%s%s%s%s\t%s\n", p, vi, reponum, reponame, startc, newver, vp, b, color0, bb;
109 print p >> uplist;
110 if (b!="") printf 1 >> blocked_counter;
111 } else if (mi != mp) {
112 startc = (b=="") ? colornewbuild : colorblocked;
113 printf "%s\t%s\t%s\t%s\t%s%s%s%s\t%s\n", p, vi, reponum, reponame, startc, newbuild, b, color0, bb;
114 print p >> uplist;
115 if (b!="") printf 1 >> blocked_counter;
116 }
117 }
118 p = $1; b = b1 = b2 = vi = mi = vp = mp = "";
119 }
120 if ($2 == "b") { b = blocked; b1 = bl1; b2 = bl2; }
121 if ($2 == "i") { vi = $3; mi = $4; }
122 if ($2 == "p") { vp = $3; mp = $4; }
123 }' >> $tmp_up_list
125 repo_number=$((repo_number + 1))
127 done
129 case "$output" in
130 html)
131 cat <<EOT
132 <table class="wide zebra">
133 <thead>
134 <tr><td>$(_ 'Package')</td><td>$(_ 'Repository')</td><td>$(_ 'Version')</td><td>$(_ 'Status')</td></tr>
135 </thead>
136 <tbody>
137 EOT
138 sort -t$'\t' -k1,3 $tmp_up_list | awk -F$'\t' '{
139 if($4=="Main"){repoicon="slitaz"}else{repoicon="web"}
140 if($6=="b"){pkgicon="pkgib"}else{pkgicon="pkgi"}
142 printf "<tr><td><input type=\"checkbox\" name=\"pkg\" value=\"%s\"/>", $1;
143 printf "<a data-icon=\"%s\" href=\"?info=%s\">%s</a></td>", pkgicon, $1, $1;
144 printf "<td><span data-icon=\"%s\">%s</span></td>", repoicon, $4;
145 printf "<td>%s</td>", $2;
146 printf "<td>%s</td></tr>\n", $5;
147 }'
148 echo '</tbody></table>' ;;
149 *)
150 emsg "<n>$(_ 'Package')<i 26>$(_ 'Repository')<i 38>$(_ 'Version')<i 49>$(_ 'Status')<->"
151 sort -t$'\t' -k1,3 $tmp_up_list | awk -F$'\t' \
152 '{printf "%-24s %-11s %-10s %s\n", $1, $4, $2, $5}';;
153 esac
155 sed -i /^$/d $UP_LIST
156 upnb=$(wc -l < $UP_LIST)
157 pkgs=$(wc -l < $PKGS_DB/installed.info)
158 time=$(($(date +%s) - $time))
159 if [ "$upnb" -eq 0 ]; then
160 install="n"
161 _ 'System is up-to-date...'
162 fi
164 if [ "$upnb" -ne 0 ]; then
165 blocked_count="$(wc -m < $blocked_counter)"
167 blocked="$(_p \
168 '%s blocked' \
169 '%s blocked' $blocked_count \
170 $blocked_count)"
172 footer "$(_p \
173 'You have %s available upgrade (%s)' \
174 'You have %s available upgrades (%s)' $upnb \
175 $upnb "$blocked")"
176 fi
177 emsg "$(_p \
178 '%s installed package scanned in %ds' \
179 '%s installed packages scanned in %ds' $pkgs \
180 "<c 32>$pkgs</c>" $time)"
183 # Clean
184 rm $blocked_counter $tmp_up_list
186 # Pkgs to upgrade ? Skip, let install them all, or ask user
187 [ -n "$check" ] && exit 0
188 if [ "$upnb" -gt 0 ]; then
189 if [ -n "$install" ]; then
190 answer=0
191 else
192 confirm "$(_ 'Do you wish to install them now? (y/N)')"
193 answer=$?
194 fi
195 case "$answer" in
196 0)
197 for pkg in $(cat $UP_LIST); do
198 echo 'y' | tazpkg -gi "$pkg" --forced #--reason="upgrade"
199 done
200 # List is generated each time and must be cleaned so
201 # tazpkg-notify doesn't find upgrades anymore.
202 rm $UP_LIST; touch $UP_LIST ;;
203 *)
204 _ 'Leaving without any upgrades installed.'
205 newline
206 exit 0 ;;
207 esac
208 fi
209 newline