diff --git a/update-repo.sh b/update-repo.sh new file mode 100755 index 0000000..a4d0ff8 --- /dev/null +++ b/update-repo.sh @@ -0,0 +1,174 @@ +#!/bin/sh -e + +gpgkey='' +timestamp="$(LC_ALL=C date -u)" +cachedir='.cache' + +# Cleanup +if [ "$1" = 'clean' ]; then + rm -rf "$cachedir" ChangeLog.txt PACKAGES.TXT MANIFEST.bz2 FILELIST.TXT CHECKSUMS.md5 CHECKSUMS.md5.asc GPG-KEY + find . -regex '.*\.t[bglx]z$' | while read -r package; do + pkgbase="$(echo "$package" | sed 's?.*/??;s/\.t[bglx]z$//')" + rm -f "$(dirname "$package")/$pkgbase.txt" + rm -f "$package.asc" + done + + exit +fi + +mkdir -p "$cachedir" + +# Process all packages +find . -regex '.*\.t[bglx]z$' | while read -r package; do + case "$package" in + *.tgz) + tool=gzip + ;; + *.tbz) + tool=bzip2 + ;; + *.tlz) + tool=lzma + ;; + *.txz) + tool=xz + ;; + esac + + # See the pkgbase and package_name functions in /sbin/installpkg + pkgbase="$(echo "$package" | sed 's?.*/??;s/\.t[bglx]z$//')" + pkgdir="$(dirname "$package")" + pkgname="$(echo "$pkgbase" | sed 's?-[^-]*-[^-]*-[^-]*$??')" + + pkgtxt="$pkgdir/$pkgbase.txt" + pkgmeta="$cachedir/$pkgdir/$pkgbase.meta" + pkgmanifest="$cachedir/$pkgdir/$pkgbase.manifest" + pkgsize="$cachedir/$pkgdir/$pkgbase.size" + pkgusize="$cachedir/$pkgdir/$pkgbase.usize" + + [ -f "$pkgtxt" -a \ + -f "$pkgmeta" -a \ + -f "$pkgmanifest" -a \ + -f "$pkgsize" -a \ + -f "$pkgusize" ] && continue + [ "$gpgkey" -a -f "$package.asc" ] && continue + + echo "Adding $package..." + mkdir -p "$cachedir/$pkgdir" + + # Decompress the package + tmppkg="$(mktemp)" + $tool -cd "$package" > "$tmppkg" + + # Get package size + du -k "$package" | cut -f 1 > "$pkgsize" + du -k "$tmppkg" | cut -f 1 > "$pkgusize" + + # Generate .txt file (see /usr/bin/slackdtxt) + (tar xOf "$tmppkg" install/slack-desc 2> /dev/null || echo "$pkgname:") | egrep -v '^($|#| *\|)' > "$pkgtxt" + + # Create manifest for this package + cat > "$pkgmanifest" << EOF +++======================================== +|| +|| Package: $package +|| +++======================================== +$(tar tvvf "$tmppkg") + + +EOF + + # Create metadata for this package + # Source for the sed line: https://stackoverflow.com/questions/1444406/how-can-i-delete-duplicate-lines-in-a-file-in-unix#1444433 + cat > "$pkgmeta" << EOF +PACKAGE NAME: $(basename "$package") +PACKAGE LOCATION: $pkgdir +PACKAGE SIZE (compressed): $(cat "$pkgsize" | xargs) K +PACKAGE SIZE (uncompressed): $(cat "$pkgusize" | xargs) K +PACKAGE DESCRIPTION: +$(cat "$pkgtxt" | sed -e '$!N; /^\(.*\)\n\1$/!P; D') + +EOF + + # Sign the package + rm -f "$package.asc" + [ "$gpgkey" ] && gpg -bas --use-agent --batch -u "$gpgkey" "$package" + + # Remove decompressed package + rm -f "$tmppkg" +done + +# Generate shitty ChangeLog.txt +echo "$timestamp" > ChangeLog.txt + +# Create GPG-KEY +if [ "$gpgkey" ]; then + gpg --list-keys "$gpgkey" > GPG-KEY + gpg -a --export "$gpgkey" >> GPG-KEY +fi + +# Generate PACKAGES.TXT +echo "Generating PACKAGES.TXT..." + +cat > PACKAGES.TXT << EOF + +PACKAGES.TXT; $timestamp + +This file provides details on the Slackware packages found +in this directory. + +Total size of all packages (compressed): $(expr \( 0$(find "$cachedir" -type f -name '*.size' | xargs cat | xargs printf ' + %s') \) / 1024 || true) MB +Total size of all packages (uncompressed): $(expr \( 0$(find "$cachedir" -type f -name '*.usize' | xargs cat | xargs printf ' + %s') \) / 1024 || true) MB + + +EOF + +# https://stackoverflow.com/questions/4255603/sort-files-by-basename#4256095 +find "$cachedir" -type f -name '*.meta' | perl -e 'print sort{($p=$a)=~s!.*/!!;($q=$b)=~s!.*/!!;$p cmp$q}<>' | xargs cat >> PACKAGES.TXT + +echo >> PACKAGES.TXT + +# Generate MANIFEST.bz2 +echo "Generating MANIFEST.bz2..." +find "$cachedir" -type f -name '*.manifest' | sort | xargs cat | bzip2 -9 -z > MANIFEST.bz2 + +# Generate FILELIST.TXT +echo "Generating FILELIST.TXT..." + +cat > FILELIST.TXT << EOF +$timestamp + +Here is the file list for this directory. If you are using a +mirror site and find missing or extra files in the disk +subdirectories, please have the archive administrator refresh +the mirror. + +EOF +find . ! -path "./$cachedir/*" -a ! -name "$cachedir" | sort | xargs fakeroot ls -ld --time-style=long-iso > FILELIST.TXT + +# Generate CHECKSUMS.md5 +echo "Generating CHECKSUMS.md5..." + +cat > CHECKSUMS.md5 << EOF +These are the MD5 message digests for the files in this directory. +If you want to test your files, use 'md5sum' and compare the values to +the ones listed here. + +To test all these files, use this command: + +tail +13 CHECKSUMS.md5 | md5sum -c --quiet - | less + +'md5sum' can be found in the GNU coreutils package on ftp.gnu.org in +/pub/gnu, or at any GNU mirror site. + +MD5 message digest Filename +EOF +find . -type f -a ! -path "./$cachedir/*" | sort | xargs md5sum >> CHECKSUMS.md5 + +# Sign CHECKSUMS.md5 +rm -f CHECKSUMS.md5.asc +[ "$gpgkey" ] && gpg -bas --use-agent --batch -u "$gpgkey" CHECKSUMS.md5 + +# Remove tmpdir +rm -rf "$tmpdir"