tazpkg rev 737
pkgs.cgi: rework sidebar; remove "My packages" button and "list" command. Now selection of "My packages/All packages", Category, Repository (+ lists of tags and categories) is done using sidebar.
author | Aleksej Bobylev <al.bobylev@gmail.com> |
---|---|
date | Wed Dec 31 05:34:56 2014 +0200 (2014-12-31) |
parents | b61d698144f5 |
children | a4c149977942 |
files | tazpanel/pkgs.cgi tazpanel/pkgs.css |
line diff
1.1 --- a/tazpanel/pkgs.cgi Tue Dec 30 04:15:55 2014 +0200 1.2 +++ b/tazpanel/pkgs.cgi Wed Dec 31 05:34:56 2014 +0200 1.3 @@ -160,9 +160,7 @@ 1.4 <p> 1.5 <input type="text" name="search" size="20"> 1.6 <input type="submit" value="$(gettext 'Search')"> 1.7 - <input class="radius" type="submit" name="files" 1.8 - value="$(_n 'Files')"> 1.9 - <input type="hidden" name="repo" value="$repo" /> 1.10 + <input class="radius" type="submit" name="files" value="$(_n 'Files')"> 1.11 </p> 1.12 </form> 1.13 </div> 1.14 @@ -187,43 +185,57 @@ 1.15 1.16 1.17 sidebar() { 1.18 - [ -z "$repo" ] && repo=Public 1.19 + [ -z "$repo" ] && repo='Public' 1.20 + my=$(GET my); cat=$(GET cat) 1.21 + row='<tr><td><input type="submit" name="cat" value="' 1.22 + 1.23 cat << EOT 1.24 +<form method="get" action=""> 1.25 + 1.26 <div id="sidebar"> 1.27 - <h4><a href="?cat">$(_ 'Categories')</a></h4> 1.28 - <a class="active_base-system" href="?cat=base-system&repo=$repo" >$(_ 'base-system')</a> 1.29 - <a class="active_x-window" href="?cat=x-window&repo=$repo" >$(_ 'x-window')</a> 1.30 - <a class="active_utilities" href="?cat=utilities&repo=$repo" >$(_ 'utilities')</a> 1.31 - <a class="active_network" href="?cat=network&repo=$repo" >$(_ 'network')</a> 1.32 - <a class="active_games" href="?cat=games&repo=$repo" >$(_ 'games')</a> 1.33 - <a class="active_graphics" href="?cat=graphics&repo=$repo" >$(_ 'graphics')</a> 1.34 - <a class="active_office" href="?cat=office&repo=$repo" >$(_ 'office')</a> 1.35 - <a class="active_multimedia" href="?cat=multimedia&repo=$repo" >$(_ 'multimedia')</a> 1.36 - <a class="active_development" href="?cat=development&repo=$repo" >$(_ 'development')</a> 1.37 - <a class="active_system-tools" href="?cat=system-tools&repo=$repo">$(_ 'system-tools')</a> 1.38 - <a class="active_security" href="?cat=security&repo=$repo" >$(_ 'security')</a> 1.39 - <a class="active_misc" href="?cat=misc&repo=$repo" >$(_ 'misc')</a> 1.40 - <a class="active_meta" href="?cat=meta&repo=$repo" >$(_ 'meta')</a> 1.41 - <a class="active_non-free" href="?cat=non-free&repo=$repo" >$(_ 'non-free')</a> 1.42 - <a class="active_all" href="?cat=all&repo=$repo" >$(_ 'all')</a> 1.43 - <a class="active_extra" href="?cat=extra&repo=$repo" >$(_ 'extra')</a> 1.44 + <select name="my" value="$my"> 1.45 + <option value="my" $([ "$my" ] && echo -n "selected")>$(_ 'My packages')</option> 1.46 + <option value="" $([ ! "$my" ] && echo -n "selected")>$(_ 'All packages')</option> 1.47 + </select> 1.48 + 1.49 + <h4>$(_ 'Categories')</h4> 1.50 + 1.51 + <table class="side"> 1.52 +${row}base-system" id="cat1"/><label for="cat1" class="a_base-system" >$(_ 'base-system')</label></td></tr> 1.53 +${row}x-window" id="cat2"/><label for="cat2" class="a_x-window" >$(_ 'x-window')</label></td></tr> 1.54 +${row}utilities" id="cat3"/><label for="cat3" class="a_utilities" >$(_ 'utilities')</label></td></tr> 1.55 +${row}network" id="cat4"/><label for="cat4" class="a_network" >$(_ 'network')</label></td></tr> 1.56 +${row}games" id="cat5"/><label for="cat5" class="a_games" >$(_ 'games')</label></td></tr> 1.57 +${row}graphics" id="cat6"/><label for="cat6" class="a_graphics" >$(_ 'graphics')</label></td></tr> 1.58 +${row}office" id="cat7"/><label for="cat7" class="a_office" >$(_ 'office')</label></td></tr> 1.59 +${row}multimedia" id="cat8"/><label for="cat8" class="a_multimedia" >$(_ 'multimedia')</label></td></tr> 1.60 +${row}development" id="cat9"/><label for="cat9" class="a_development" >$(_ 'development')</label></td></tr> 1.61 +${row}system-tools" id="cata"/><label for="cata" class="a_system-tools">$(_ 'system-tools')</label></td></tr> 1.62 +${row}security" id="catb"/><label for="catb" class="a_security" >$(_ 'security')</label></td></tr> 1.63 +${row}misc" id="catc"/><label for="catc" class="a_misc" >$(_ 'misc')</label></td></tr> 1.64 +${row}meta" id="catd"/><label for="catd" class="a_meta" >$(_ 'meta')</label></td></tr> 1.65 +${row}non-free" id="cate"/><label for="cate" class="a_non-free" >$(_ 'non-free')</label></td></tr> 1.66 +${row}all" id="catf"/><label for="catf" class="a_all" >$(_ 'all')</label></td></tr> 1.67 +${row}extra" id="catg"/><label for="catg" class="a_extra" >$(_ 'extra')</label></td></tr> 1.68 + </table> 1.69 EOT 1.70 1.71 if [ -d $PKGS_DB/undigest ]; then 1.72 - [ -z "$category" ] && category="base-system" 1.73 cat << EOT 1.74 - <h4>$(_ 'Repositories')</h4> 1.75 - <a class="repo_Public" href="?cat=$category&repo=Public">$(_ 'Public')</a> 1.76 -EOT 1.77 + <h4>$(_ 'Repository')</h4> 1.78 1.79 - for i in $(ls $PKGS_DB/undigest); do 1.80 - cat << EOT 1.81 - <a class="repo_$i" href="?cat=$category&repo=$i">$i</a> 1.82 -EOT 1.83 - done 1.84 + <select name="repo" value="$repo"> 1.85 + <option value="Public" $([ "$repo" == "Public" ] && echo -n "selected")>$(_ 'Public')</option> 1.86 + $(for i in $(ls $PKGS_DB/undigest); do 1.87 + echo -n "<option value=\"$i\"" 1.88 + [ "$repo" == "$i" ] && echo -n " selected" 1.89 + echo ">$i</option>" 1.90 + done) 1.91 + <option value="Any" $([ "$repo" == "Any" ] && echo -n "selected")>$(_ 'Any')</option> 1.92 + </select> 1.93 1.94 - cat << EOT 1.95 - <a class="repo_Any" href="?cat=$category&repo=Any">$(_ 'Any')</a> 1.96 + <input type="submit" name="tag" value="" id="tags"><label for="tags">$(_ 'All tags...')</label> 1.97 + <input type="submit" name="cat" value="" id="cats"><label for="cats">$(_ 'All categories...')</label> 1.98 EOT 1.99 fi 1.100 echo "</div>" 1.101 @@ -295,8 +307,8 @@ 1.102 done 1.103 [ -e "$i/blocked-packages.list" ] && cat $i/blocked-packages.list 1.104 sed 's|.*|&\ti|' $i/installed.info 1.105 - [ $1 == 'extra' ] || [ $1 == 'my' ] || cat $i/packages.info 1.106 - [ $1 == 'extra' ] && sed 's|.*|&\t-\textra\t-\thttp://mirror.slitaz.org/packages/get/&\t-\t-\t-|' $PKGS_DB/extra.list 1.107 + [ "$category" == 'extra' ] || [ $1 == 'my' ] || cat $i/packages.info 1.108 + [ "$category" == 'extra' ] && sed 's|.*|&\t-\textra\t-\thttp://mirror.slitaz.org/packages/get/&\t-\t-\t-|' $PKGS_DB/extra.list 1.109 } | sort -t$'\t' -k1,1 | sed '/^$/d' | awk -F$'\t' -vc="${category:--}" -vt="${tag:--}" ' 1.110 { 1.111 if (PKG && PKG != $1) { 1.112 @@ -319,13 +331,16 @@ 1.113 page=$(GET page); [ -z "$page" ] && page=1 1.114 1.115 pager="$(pager $cached)" 1.116 - echo "$pager" 1.117 + if [ "$pager" != "<p>$(_ 'Pages:') </p>" ]; then 1.118 + [ "$repo" != "Public" ] && echo "<h3>$(_ 'Repository: %s' $(repo_name $i))</h3>" 1.119 + echo "$pager" 1.120 1.121 - table_head 1.122 - tail -n+$((($page-1)*100+1)) $cached | head -n100 1.123 - echo "</tbody></table>" 1.124 + table_head 1.125 + tail -n+$((($page-1)*100+1)) $cached | head -n100 1.126 + echo "</tbody></table>" 1.127 1.128 - echo "$pager" 1.129 + echo "$pager" 1.130 + fi 1.131 rm -f $cached 1.132 } 1.133 1.134 @@ -350,36 +365,6 @@ 1.135 1.136 1.137 case " $(GET) " in 1.138 - *\ list\ *) 1.139 - # 1.140 - # List installed packages. 1.141 - # 1.142 - category=$(GET category) 1.143 - search_form 1.144 - sidebar 1.145 - LOADING_MSG="$(_ 'Listing packages...')" 1.146 - loading_msg 1.147 - cat << EOT 1.148 -<h2>$(_ 'My packages')</h2> 1.149 - 1.150 -<form method="get" action=""> 1.151 - <input type="hidden" name="do" value="Remove" /> 1.152 - <div id="actions"> 1.153 - <div class="float-left"> 1.154 - $(_ 'Selection:') 1.155 - <input type="submit" value="$(_ 'Remove')" /> 1.156 - </div> 1.157 - <div class="float-right"> 1.158 - $(show_button recharge) 1.159 - $(show_button up) 1.160 - </div> 1.161 - </div> 1.162 - $(i=$PKGS_DB; category=${category:-all}; show_list my) 1.163 -</form> 1.164 -EOT 1.165 - ;; 1.166 - 1.167 - 1.168 *\ linkable\ *) 1.169 # 1.170 # List linkable packages. 1.171 @@ -391,18 +376,17 @@ 1.172 cat << EOT 1.173 <h2>$(_ 'Linkable packages')</h2> 1.174 1.175 -<form method="get" action=""> 1.176 - <input type="hidden" name="do" value="Link" /> 1.177 - <div id="actions"> 1.178 - <div class="float-left"> 1.179 - $(_ 'Selection:') 1.180 - <input type="submit" value="$(_ 'Link')" /> 1.181 - </div> 1.182 - <div class="float-right"> 1.183 - $(show_button recharge) 1.184 - $(show_button up) 1.185 - </div> 1.186 +<input type="hidden" name="do" value="Link" /> 1.187 +<div id="actions"> 1.188 + <div class="float-left"> 1.189 + $(_ 'Selection:') 1.190 + <input type="submit" value="$(_ 'Link')" /> 1.191 </div> 1.192 + <div class="float-right"> 1.193 + $(show_button recharge) 1.194 + $(show_button up) 1.195 + </div> 1.196 +</div> 1.197 EOT 1.198 table_head 1.199 target=$(readlink $PKGS_DB/fslink) 1.200 @@ -429,24 +413,15 @@ 1.201 1.202 *\ cat\ *) 1.203 # 1.204 - # List all available packages by category on mirror. 1.205 + # List all packages by category. 1.206 # 1.207 - repo=$(GET repo) 1.208 - category=$(GET cat) 1.209 + my=$(GET my); category=$(GET cat); repo=$(GET repo) 1.210 search_form 1.211 - sidebar | sed "s/active_$category/active/;s/repo_$repo/active/" 1.212 + sidebar | sed "s/a_$category/active/;s/repo_$repo/active/" 1.213 if [ -z "$category" ] || [ "$category" == 'cat' ]; then 1.214 cat << EOT 1.215 <h2>$(_ 'Categories list')</h2> 1.216 1.217 -<form method="get" action=""> 1.218 - <div id="actions"> 1.219 - <div class="float-right"> 1.220 - $(show_button tag=) 1.221 - $(show_button list) 1.222 - </div> 1.223 - </div> 1.224 - 1.225 <table class="zebra outbox"> 1.226 <thead> 1.227 <tr> 1.228 @@ -457,6 +432,7 @@ 1.229 </thead> 1.230 <tbody> 1.231 EOT 1.232 + params="&my=$my&repo=$repo" # don't forget it unexpectedly 1.233 { 1.234 awk -F$'\t' '{print $3}' $PKGS_DB/packages.info | sort | uniq -c 1.235 awk -F$'\t' '{print $3}' $PKGS_DB/installed.info | sed 's|.*|& i|' | sort | uniq -c 1.236 @@ -467,8 +443,8 @@ 1.237 } 1.238 END { 1.239 for (n in c) print n, m[n], i[n] 1.240 - }' | sort | awk '{ 1.241 - printf "<tr><td><a href=\"?cat=%s\">%s</a></td><td>%d</td><td>%d</td></tr>", $1, $1, $2, $3 1.242 + }' | sort | awk -vp="$params" '{ 1.243 + printf "<tr><td><a href=\"?cat=%s%s\">%s</a></td><td>%d</td><td>%d</td></tr>", $1, p, $1, $2, $3 1.244 }' 1.245 echo '</tbody></table>' 1.246 else 1.247 @@ -477,24 +453,20 @@ 1.248 cat << EOT 1.249 <h2>$(_ 'Category: %s' $category)</h2> 1.250 1.251 -<form method="get" action=""> 1.252 - <div id="actions"> 1.253 - <div class="float-left"> 1.254 - $(_ 'Selection:') 1.255 - <input type="submit" name="do" value="Install" /> 1.256 - <input type="submit" name="do" value="Remove" /> 1.257 - <input type="hidden" name="repo" value="$repo" /> 1.258 - </div> 1.259 - <div class="float-right"> 1.260 - $(show_button recharge) 1.261 - $(show_button up) 1.262 - $(show_button list) 1.263 - </div> 1.264 +<div id="actions"> 1.265 + <div class="float-left"> 1.266 + $(_ 'Selection:') 1.267 + <input type="submit" name="do" value="Install" /> 1.268 + <input type="submit" name="do" value="Remove" /> 1.269 </div> 1.270 + <div class="float-right"> 1.271 + $(show_button recharge) 1.272 + $(show_button up) 1.273 + </div> 1.274 +</div> 1.275 EOT 1.276 for i in $(repo_list ""); do 1.277 - [ "$repo" != "Public" ] && echo "<h3>$(_ 'Repository: %s' $(repo_name $i))</h3>" 1.278 - show_list $category 1.279 + show_list $my 1.280 done 1.281 echo '</form>' 1.282 fi 1.283 @@ -516,21 +488,19 @@ 1.284 cat << EOT 1.285 <h2>$(_ 'Search packages')</h2> 1.286 1.287 -<form method="get" action=""> 1.288 - <div id="actions"> 1.289 - <div class="float-left"> 1.290 - $(_ 'Selection:') 1.291 - <input type="submit" name="do" value="Install" /> 1.292 - <input type="submit" name="do" value="Remove" /> 1.293 - <a href="$(cat $PANEL/lib/checkbox.js)">$(_ 'Toogle all')</a> 1.294 - </div> 1.295 - <div class="float-right"> 1.296 - $(show_button recharge) 1.297 - $(show_button up) 1.298 - $(show_button list) 1.299 - </div> 1.300 +<div id="actions"> 1.301 + <div class="float-left"> 1.302 + $(_ 'Selection:') 1.303 + <input type="submit" name="do" value="Install" /> 1.304 + <input type="submit" name="do" value="Remove" /> 1.305 + <a href="$(cat $PANEL/lib/checkbox.js)">$(_ 'Toogle all')</a> 1.306 </div> 1.307 - <input type="hidden" name="repo" value="$repo" /> 1.308 + <div class="float-right"> 1.309 + $(show_button recharge) 1.310 + $(show_button up) 1.311 + </div> 1.312 +</div> 1.313 +<input type="hidden" name="repo" value="$repo" /> 1.314 EOT 1.315 if [ -n "$(GET files)" ]; then 1.316 cat <<EOT 1.317 @@ -578,14 +548,12 @@ 1.318 cat << EOT 1.319 <h2>$(_ 'Recharge')</h2> 1.320 1.321 -<form method="get" action=""> 1.322 <div id="actions"> 1.323 <div class="float-left"> 1.324 <p>$(_ 'Recharge checks for new or updated packages')</p> 1.325 </div> 1.326 <div class="float-right"> 1.327 $(show_button up) 1.328 - $(show_button list) 1.329 </div> 1.330 </div> 1.331 <div class="wrapper"> 1.332 @@ -613,19 +581,17 @@ 1.333 cat << EOT 1.334 <h2>$(_ 'Up packages')</h2> 1.335 1.336 -<form method="get" action=""> 1.337 - <div id="actions"> 1.338 - <div class="float-left"> 1.339 - $(_ 'Selection:') 1.340 - <input type="submit" name="do" value="Install" /> 1.341 - <input type="submit" name="do" value="Remove" /> 1.342 - <a href="$(cat $PANEL/lib/checkbox.js)">$(_ 'Toogle all')</a> 1.343 - </div> 1.344 - <div class="float-right"> 1.345 - $(show_button recharge) 1.346 - $(show_button list) 1.347 - </div> 1.348 +<div id="actions"> 1.349 + <div class="float-left"> 1.350 + $(_ 'Selection:') 1.351 + <input type="submit" name="do" value="Install" /> 1.352 + <input type="submit" name="do" value="Remove" /> 1.353 + <a href="$(cat $PANEL/lib/checkbox.js)">$(_ 'Toogle all')</a> 1.354 </div> 1.355 + <div class="float-right"> 1.356 + $(show_button recharge) 1.357 + </div> 1.358 +</div> 1.359 EOT 1.360 tazpkg up --check >/dev/null 1.361 table_head 1.362 @@ -669,18 +635,14 @@ 1.363 cat << EOT 1.364 <h2>TazPkg: $cmd</h2> 1.365 1.366 -<form method="get" action=""> 1.367 - <div id="actions"> 1.368 - <div class="float-left"> 1.369 - <p>$(_ 'Performing tasks on packages')</p> 1.370 - </div> 1.371 - <div class="float-right"> 1.372 - $(show_button list) 1.373 - </div> 1.374 +<div id="actions"> 1.375 + <div class="float-left"> 1.376 + <p>$(_ 'Performing tasks on packages')</p> 1.377 </div> 1.378 - <div class="box"> 1.379 - $(_ 'Executing %s for: %s' $cmd $pkgs) 1.380 - </div> 1.381 +</div> 1.382 +<div class="box"> 1.383 + $(_ 'Executing %s for: %s' $cmd $pkgs) 1.384 +</div> 1.385 EOT 1.386 for pkg in $pkgs; do 1.387 echo '<pre>' 1.388 @@ -741,9 +703,6 @@ 1.389 cat << EOT 1.390 </p> 1.391 </div> 1.392 - <div class="float-right"> 1.393 - $(show_button list) 1.394 - </div> 1.395 </div> 1.396 <table class="zebra outbox"> 1.397 <tbody> 1.398 @@ -786,6 +745,7 @@ 1.399 # 1.400 # TazPkg configuration page 1.401 # 1.402 + echo '</form>' 1.403 cmd=$(GET admin) 1.404 case "$cmd" in 1.405 clean) 1.406 @@ -1087,38 +1047,33 @@ 1.407 # 1.408 search_form 1.409 sidebar 1.410 - tag=$(GET tag); repo=$(GET repo) 1.411 + tag=$(GET tag); repo=$(GET repo); my=$(GET my) 1.412 + [ -z "$repo" ] && repo='Any' 1.413 if [ -n "$tag" ]; then 1.414 cat << EOT 1.415 <h2>$(_ 'Tag "%s"' $tag)</h2> 1.416 1.417 -<form method="get" action=""> 1.418 <div id="actions"> 1.419 <div class="float-left"> 1.420 $(_ 'Selection:') 1.421 <input type="submit" name="do" value="Install" /> 1.422 <input type="submit" name="do" value="Remove" /> 1.423 - <input type="hidden" name="repo" value="$repo" /> 1.424 - </div> 1.425 - <div class="float-right"> 1.426 - $(show_button tag=) 1.427 - $(show_button list) 1.428 </div> 1.429 </div> 1.430 EOT 1.431 for i in $(repo_list ""); do 1.432 - [ "$repo" != "Public" ] && echo "<h3>$(_ 'Repository: %s' $(repo_name $i))</h3>" 1.433 show_list all 1.434 done 1.435 echo '</form>' 1.436 1.437 else 1.438 + params="&my=$my&repo=$repo" # don't forget it unexpectedly 1.439 echo "<h2>$(_ 'Tags list')</h2>" 1.440 echo "<p>" 1.441 TAGS="$(awk -F$'\t' '{if($6){print $6}}' $PKGS_DB/packages.info | tr ' ' $'\n' | sort | uniq -c)" 1.442 MAX="$(echo "$TAGS" | awk '{if ($1 > MAX) MAX = $1} END{print MAX}')" 1.443 - echo "$TAGS" | awk -vMAX=$MAX '{ 1.444 - printf "<a class=\"tag%s\" href=\"?tag=%s\" title=\"%s\">%s</a> ", int($1 * 7 / MAX + 1), $2, $1, $2 1.445 + echo "$TAGS" | awk -vMAX="$MAX" -vp="$params" '{ 1.446 + printf "<a class=\"tag%s\" href=\"?tag=%s%s\" title=\"%s\">%s</a> ", int($1 * 7 / MAX + 1), $2, p, $1, $2 1.447 }' 1.448 echo "</p>" 1.449 fi 1.450 @@ -1138,7 +1093,6 @@ 1.451 1.452 <div id="actions"> 1.453 EOT 1.454 - show_button list 1.455 fslink=$(readlink $PKGS_DB/fslink) 1.456 [ -n "$fslink" -a -d "$fslink/$INSTALLED" ] && show_button linkable 1.457 show_button recharge
2.1 --- a/tazpanel/pkgs.css Tue Dec 30 04:15:55 2014 +0200 2.2 +++ b/tazpanel/pkgs.css Wed Dec 31 05:34:56 2014 +0200 2.3 @@ -1,3 +1,68 @@ 2.4 + 2.5 +/* Sidebar menus */ 2.6 + 2.7 +#content-sidebar { margin: 20px 144px 20px 20px; } 2.8 + 2.9 +#sidebar { 2.10 + /*background-color: #FFF;*/ 2.11 + /*border: 1pt solid #888;*/ 2.12 + position: fixed; 2.13 + top: 80px; 2.14 + right: 5px; 2.15 + width: 132px; 2.16 +} 2.17 + 2.18 +#sidebar > a { 2.19 + display: block; 2.20 + padding: 0; 2.21 + margin: 0 0 0 0.5em; 2.22 +} 2.23 + 2.24 +#sidebar .active { 2.25 + color: #000; 2.26 + font-weight: bold; 2.27 +} 2.28 + 2.29 +#sidebar h4 { 2.30 + margin: 0; 2.31 + font-size: 16px; color: #222; 2.32 + text-align: center; 2.33 +} 2.34 + 2.35 +#sidebar input[type=submit] { display: none; } 2.36 + 2.37 +#sidebar label { 2.38 + display: inline-block; 2.39 + padding: 0 0 0 0.5em; margin: 0; 2.40 + color: #666; 2.41 + font-size: small; 2.42 + width: 100%; 2.43 +} 2.44 + 2.45 +#sidebar label:hover { color: #000; } 2.46 + 2.47 +table.side { 2.48 + background-color: #f8f8f8; 2.49 + border: none; border-collapse: collapse; 2.50 + padding: 0; margin: 0; 2.51 + 2.52 + border: 1pt solid #888; 2.53 + -moz-border-radius: 4px; 2.54 + -webkit-border-radius: 4px; 2.55 + border-radius: 4px; 2.56 +} 2.57 +table.side tr:nth-child(even) { 2.58 + background-color: rgba(0,0,0,0.05); 2.59 +} 2.60 + 2.61 +#sidebar select { 2.62 + margin: 0; padding: 0 0.5em; 2.63 + width: 100%; 2.64 + font-size: small; 2.65 +} 2.66 + 2.67 + 2.68 + 2.69 /* links classes: 2.70 * pkg - package (not installed); 2.71 * pkgi - package (installed);