tazpkg annotate modules/recharge @ rev 955

modules/search: allow search file with dash at start: tazpkg -sf "-spi"
author Aleksej Bobylev <al.bobylev@gmail.com>
date Fri Dec 22 00:02:54 2017 +0200 (2017-12-22)
parents ce0db4329d29
children 9d683c983e2e
rev   line source
al@834 1 #!/bin/sh
al@834 2 # TazPkg - Tiny autonomous zone packages manager, hg.slitaz.org/tazpkg
al@834 3 # recharge - TazPkg module
al@834 4 # Recharge packages databases from a mirror
al@834 5
al@834 6
al@834 7 # Options:
al@834 8 # [main|<repository>] Repository name to recharge (all if empty)
al@834 9
al@834 10 # Environment variables:
al@834 11 # root Root of the packages DB
al@834 12 # UA User Agent string ("TazPkg-<version>")
al@834 13
al@834 14
al@834 15 # Connect function libraries
al@834 16 . /lib/libtaz.sh
al@834 17
al@836 18 # Get TazPkg working environment
al@840 19 . @@MODULES@@/getenv
al@834 20
al@834 21
al@836 22
al@836 23
al@834 24 # Functions
al@834 25 # ---------
al@834 26
al@834 27 # Download a file from specified mirror
al@834 28
al@836 29 get_from_mirror() {
al@857 30 debug "get_from_mirror($1)"
al@857 31 debug " mirror='$mirror'"
al@836 32 case "$mirror" in
al@836 33 http://* | https://* | ftp://*)
al@857 34 debug " wget -c -q -T 30 -U '$UA' '$mirror$1'"
al@846 35 wget -c -q -T 30 -U "$UA" "$mirror$1" 2>/dev/null;;
al@836 36 *)
al@889 37 debug " cp '$mirror$1' ."
al@889 38 cp "$mirror$1" .;;
al@836 39 esac
al@836 40 status
al@834 41 }
al@834 42
al@834 43
al@834 44 # When recharging errors occur
al@834 45
al@834 46 recharging_failed() {
al@834 47 # Restore database from bak files
al@834 48 action 'Restoring database files...'
al@834 49 [ -e 'ID' -a ! -e 'ID.bak' ] && rm ID
al@834 50 [ -e 'IDs' -a ! -e 'IDs.bak' ] && rm IDs
al@840 51 for file in $(ls "$1"/*.bak); do
al@840 52 mv -f "$file" "${file%.bak}"
al@834 53 done
al@834 54 status
al@834 55
al@834 56 footer "$(colorize 31 "$(_ 'Recharging failed')")"
al@834 57 }
al@834 58
al@834 59
al@834 60
al@834 61
al@834 62 REPO="$1"
al@834 63
al@834 64 # What to recharge: main, or all, or selected undigest
al@834 65 case "$REPO" in
al@834 66 main) repo_to_recharge="$PKGS_DB";;
al@834 67 '') repo_to_recharge="$PKGS_DB $PKGS_DB/undigest/*";;
al@834 68 *) repo_to_recharge="$PKGS_DB/undigest/$REPO"
al@834 69 if [ ! -d "$repo_to_recharge" ]; then
al@834 70 _ "Repository \"%s\" doesn't exist." "$repo_to_recharge" >&2
al@834 71 exit 1
al@834 72 fi
al@834 73 ;;
al@834 74 esac
al@834 75
al@834 76 for path in $repo_to_recharge; do
al@899 77 # skip?
al@899 78 [ ! -s "$path/mirror" ] && continue
al@840 79 cd "$path"
al@836 80 # Mirror URL will have a trailing slash
al@840 81 mirror=$(cat mirror); mirror="${mirror%/}/"
al@834 82
al@834 83 # Repository name
al@834 84 if [ "$path" == "$PKGS_DB" ]; then
al@834 85 repo_name='Main'
al@834 86 else
al@834 87 repo_name="$(_n 'Undigest %s' "$(basename "$path")")"
al@834 88 fi
al@834 89
al@834 90 title 'Recharging repository "%s"' "$repo_name"
al@834 91
al@834 92 # Don't let ID be a symlink when using local repository.
al@834 93 if [ -h ID ]; then mv -f ID ID.lnk; cat ID.lnk > ID; rm ID.lnk; fi
al@834 94 if [ -h IDs ]; then mv -f IDs IDs.lnk; cat IDs.lnk > IDs; rm IDs.lnk; fi
al@834 95
al@899 96 # Compatibility with "old" ID
al@899 97 [ -f ID ] && mv ID ID.bak
al@834 98 [ -f IDs ] && mv IDs IDs.bak
al@836 99 action 'Checking...'
al@836 100 get_from_mirror IDs
al@836 101
al@899 102 # Compatibility with "old" ID
al@899 103 [ -e 'IDs' ] && awk '{print $1}' IDs > ID
al@899 104 [ -e 'IDs' -a -z "$quiet" ] && \
al@899 105 _ 'Database timestamp: %s' "$(date -d "@$(awk '{print $2}' IDs)" "+%x %R")"
al@834 106
al@834 107 # Check if recharging is needed
al@840 108 if [ -f 'IDs' ] && [ -f 'packages.info' ] && [ -f 'files.list.lzma' ] && \
al@840 109 cmp -s IDs IDs.bak; then
al@834 110 footer "$(_ 'Repository "%s" is up to date.' "$repo_name")"
al@834 111 rm IDs.bak ID.bak
al@834 112 continue
al@834 113 fi
al@834 114 rm IDs.bak ID.bak 2>/dev/null
al@834 115
al@834 116 action 'Creating backup of the last packages list...'
al@834 117 for i in packages.desc packages.$SUM packages.txt packages.list \
al@834 118 packages.equiv files.list.lzma extra.list mirrors packages.info; do
al@834 119 [ -f "$i" ] && mv -f $i $i.bak 2>/dev/null
al@834 120 done
al@840 121 # Always "[ Done ]"
al@840 122 :; status
al@834 123
al@834 124 # Download and extract bundle: extra.list, mirrors, files-list.md5,
al@834 125 # packages.{info,desc,md5,txt,list,equiv}
al@834 126 bundle='bundle.tar.lzma'
al@840 127 action 'Getting "%s"...' "$bundle"
al@840 128 get_from_mirror "$bundle"
al@834 129 if [ -f "$bundle" ]; then
al@846 130 tar -xaf "$bundle"; rm "$bundle"
al@834 131 else
al@840 132 recharging_failed "$path"; continue
al@834 133 fi
al@834 134
al@834 135 # Download files.list.lzma
al@834 136 files_local='files.list.lzma'; files_remote='files-list.lzma'
al@834 137 if [ -e "$files_local.bak" ]; then
al@840 138 md5sum "$files_local.bak" | awk '{printf $1}' > files-list.md5.bak
al@834 139 if cmp -s files-list.md5 files-list.md5.bak; then
al@840 140 mv "$files_local.bak" "$files_remote"
al@834 141 else
al@840 142 action 'Getting "%s"...' "$files_remote"
al@840 143 get_from_mirror "$files_remote"
al@834 144 fi
al@834 145 else
al@840 146 action 'Getting "%s"...' "$files_remote"
al@840 147 get_from_mirror "$files_remote"
al@834 148 fi
al@834 149
al@834 150 if [ ! -e "$files_remote" ]; then
al@840 151 recharging_failed "$path"; continue
al@834 152 fi
al@840 153 mv -f "$files_remote" "$files_local"
al@834 154
al@834 155 # Remove old database files (but packages.list.bak, extra.list.bak)
al@834 156 for i in packages.desc packages.$SUM packages.txt packages.equiv \
al@834 157 files.list.lzma mirrors packages.info files-list.md5; do
al@834 158 [ -f "$i.bak" ] && rm $i.bak 2>/dev/null
al@834 159 done
al@834 160
al@834 161 footer "$(_ 'Last database is ready to use.')"
al@834 162
al@834 163 # Check diff
al@834 164 if [ -f 'packages.list.bak' ]; then
al@834 165 diff -u packages.list.bak packages.list | grep ^+[a-z] > packages.diff
al@834 166 rm packages.list.bak
al@834 167 if [ -f 'extra.list.bak' ]; then
al@834 168 if [ -f 'extra.list' ]; then
al@840 169 awk -F'|' '{print $1 " (extra)"}' extra.list > extra.list1
al@834 170 awk -F'|' '{print $1 " (extra)"}' extra.list.bak > extra.list1.bak
al@834 171 diff -u extra.list1.bak extra.list1 | grep ^+[a-z] >> packages.diff
al@834 172 rm extra.list.bak extra.list1 extra.list1.bak
al@834 173 else
al@834 174 mv extra.list.bak extra.list
al@834 175 fi
al@834 176 fi
al@834 177 sed -i s/+// packages.diff
al@834 178
al@834 179 new_pkgs=$(wc -l < packages.diff)
al@834 180 if [ "$new_pkgs" -gt 0 ]; then
al@834 181 title 'Mirrored packages diff'
al@834 182 cat packages.diff
al@834 183 footer "$(emsg "$(_p \
al@834 184 '%s new package on the mirror.' \
al@840 185 '%s new packages on the mirror.' "$new_pkgs" \
al@834 186 "<c 32>$new_pkgs</c>")")"
al@834 187 fi
al@834 188 else
al@834 189 longline "$(_ "Note that next time you recharge the list, a list of \
al@834 190 differences will be displayed to show new and upgradeable packages.")"
al@834 191 fi
al@834 192 done
al@834 193 newline
al@840 194
al@840 195 # Close tazpkg-notify
al@840 196 echo "quit" > /tmp/tazpkg-notify.fifo