#!/bin/sh set -e # TODO: Source code line counting. mirrordir="$HOME/sortix/mirror" portsdir="$HOME/sortix/ports" porttixdir="$HOME/src/porttix" srctixdir="$HOME/src/srctix" mkdir -p "$mirrordir" mkdir -p "$portsdir" cd "$portsdir" ports=$(ls "$porttixdir" | grep -E '\.porttix\.tar\.xz$' | grep -Eo '^[^.]*') for port in $ports; do cd "$portsdir" # TODO: Retain non-free ports somewhere. case "$port" in quake|quake-shareware) continue;; esac # TODO: Publish imported OpenBSD stuff as Sortix provided tarballs. case "$port" in cut|ed|video-player|xargs) no_upstream=true;; *) no_upstream=false;; esac if [ -e "$portsdir/$port/$port.info" ]; then continue fi tar -xf "$porttixdir/$port.porttix.tar.xz" tar -xf "$srctixdir/$port.srctix.tar.xz" "$port/tixbuildinfo" cd "$portsdir/$port" nolib=$(echo "$port" | sed -E 's/^lib//') build_libraries=$(grep -E '^pkg\.build-libraries=' tixbuildinfo | sed -E 's/^[^=]*=//') source_package=$(grep -E '^pkg\.source-package=' tixbuildinfo | sed -E 's/^[^=]*=//') rm -f "$port.info.new" echo "NAME='$port'" >> "$port.info.new" if [ -n "$source_package" ]; then rm -f "$port.tar.xz" files= echo "SOURCE_PACKAGE='$source_package'" >> "$port.info.new" else files=$(grep -E '^tar_extract ' porttixinfo | sed -E 's/^tar_extract //') echo "BUILD_LIBRARIES='$build_libraries'" >> "$port.info.new" fi if [ "$files" = SDL-1.2.15.tar.gz ]; then rm SDL-1.2.15.tar.gz wget https://pub.sortix.org/fork/libSDL/sortix-libSDL-1.2.15.tar.xz -O sortix-libSDL-1.2.15.tar.xz tar -xf sortix-libSDL-1.2.15.tar.xz mv sortix-libSDL-1.2.15 "$port.normalized" (cd $srctixdir && git checkout staging) tar -xf "$srctixdir/$port.srctix.tar.xz" (cd $srctixdir && git checkout -) mv "$port" "$port.srctix" diff --no-dereference -Naur "$port.normalized" "$port.srctix" > "patch.patch" || true tix-execdiff "$port.normalized" "$port.srctix" > "patch.execpatch" true > "patch.normalize" rm -rf "$port.normalized" rm -rf "$port.srctix" files="sortix-libSDL-1.2.15.tar.xz" fi NEED_WRITABLE= case "$port" in bison|grep|tar|wget) echo "rm -rf -- 'doc/stamp-vti'" >> "patch.normalize" ;; emacs) echo "rm -rf -- 'admin/charsets/charsets.stamp'" >> "patch.normalize" echo "rm -rf -- 'etc/charsets/JISX2131.map'" >> "patch.normalize" ;; grub) echo "rm -rf -- 'docs/stamp-1'" >> "patch.normalize" echo "rm -rf -- 'docs/stamp-vti'" >> "patch.normalize" ;; libidn) echo "rm -rf -- 'doc/Makefile.gdoc'" >> "patch.normalize" echo "rm -rf -- 'doc/stamp-vti'" >> "patch.normalize" ;; texinfo) echo "rm -rf -- 'doc/Makefile.gdoc'" >> "patch.normalize" echo "rm -rf -- 'doc/stamp-1'" >> "patch.normalize" echo "rm -rf -- 'doc/stamp-vti'" >> "patch.normalize" ;; libglib) echo "rm -rf -- 'tests/gobject/testmarshal.h'" >> "patch.normalize" echo "rm -rf -- 'tests/gobject/testmarshal.c'" >> "patch.normalize" ;; python) echo "rm -rf -- 'Python/graminit.c'" >> "patch.normalize" # This file has to exist and be writeable. Sigh. #echo "rm -rf -- 'Include/graminit.h'" >> "patch.normalize" NEED_WRITABLE=true echo "rm -rf -- 'Python/importlib_external.h'" >> "patch.normalize" echo "rm -rf -- 'Python/importlib.h'" >> "patch.normalize" ;; nyancat) sed -Ei 's,^(\+include )(\.\./\.\./build-aux/),\1../\2,' "patch.patch" ;; esac if $no_upstream; then mkdir "$port.normalized" mkdir "$port.srctix" for file in $files; do tar -C "$port.srctix" --strip-components=1 -xf "$file" rm -f "$file" done files= sed -Ei 's,^(include )(\.\./\.\./build-aux/),\1../\2,' "$port.srctix/Makefile" diff --no-dereference -Naur "$port.normalized" "$port.srctix" > "patch.patch" || true true > "patch.execpatch" true > "patch.normalize" rmdir "$port.normalized" rm -rf "$port.srctix" fi # TODO: Extract post-install.sortix from patch. file_number=0 for file in $files; do file_number=$(expr $file_number + 1) if [ $file_number = 1 ]; then file_number_suffix= else file_number_suffix=_$file_number fi mirror_file="$file" distname=$(echo "$file" | sed -E 's,\.tar.*,,') if [ "$port" = vim -a "$file" = vim-8.0.tar.bz2 -a "$(sha256sum -- "$file")" = "acab24b07d9e87a1c1581cf5ecfe0439562ff7e111d0d2dbd274260490cb64e8 $file" ]; then version=vim-8.0.002 mirror_file="$version.tar.bz2" fi version=$(echo "$distname" | sed -E 's/.*-([0-9]+\..*)/\1/') version_major=$(echo "$version" | sed -E 's/([^.]+).*/\1/') version_minor=$(echo "$version" | sed -E 's/([^.]+\.){1}([^.]+).*/\2/') version_patch=$(echo "$version" | sed -E 's/([^.]+\.){2}([^.]+).*/\2/') case "$port" in ag) mirrors="https://geoff.greer.fm/ag/releases";; binutils|gcc|libstdc++|grub) mirrors="https://pub.sortix.org/sortix/toolchain";; bochs) mirrors="https://sourceforge.net/projects/bochs/files/bochs/$version";; bzip2) mirrors="https://sourceware.org/pub/bzip2";; dash) mirrors="http://gondor.apana.org.au/~herbert/dash/files";; e2fsprogs) mirrors="https://kernel.org/pub/linux/kernel/people/tytso/e2fsprogs/v$version";; ffmpeg) mirrors="https://ffmpeg.org/releases";; flex) mirrors="https://sourceforge.net/projects/flex/files https://github.com/westes/flex/releases/download/v$version";; git) mirrors="https://www.kernel.org/pub/software/scm/git";; libcairo|libpixman) mirrors="https://www.cairographics.org/releases";; libcurl) mirrors="https://curl.se/download";; libcurses) mirrors="https://github.com/sabotage-linux/netbsd-curses/releases/download/v$version";; libdbus) mirrors="https://dbus.freedesktop.org/releases/dbus";; libevent) mirrors="https://github.com/libevent/libevent/releases/download/release-$version";; libexpat) mirrors="https://github.com/libexpat/libexpat/releases/download/R_${version_major}_${version_minor}_${version_patch}";; libffi) mirrors="https://github.com/libffi/libffi/releases/download/v$version https://sourceware.org/pub/libffi";; libfontconfig) mirrors="https://www.freedesktop.org/software/fontconfig/release";; libfreetype) mirrors="https://download.savannah.gnu.org/releases/freetype";; libglib) mirrors="https://download.gnome.org/sources/glib/$version_major.$version_minor";; # TODO: Checksum issues because the upstream file changed. # libjpeg) mirrors="https://ijg.org/files";; libjpeg) mirrors="https://pub.sortix.org/mirror/libjpeg";; libogg|libtheora|libvorbis) mirrors="https://ftp.osuosl.org/pub/xiph/releases/$nolib";; libpcre) mirrors="https://sourceforge.net/projects/pcre/files/pcre/$version";; libpng) mirrors="https://download.sourceforge.net/libpng";; #libSDL) mirrors="https://www.libsdl.org/release";; libSDL) mirrors="https://pub.sortix.org/fork/libSDL";; libssl) mirrors="https://ftp.openbsd.org/pub/OpenBSD/LibreSSL";; libxkbcommon) mirrors="https://xkbcommon.org/download";; libxml2) mirrors="ftp://xmlsoft.org/libxml2";; libz) mirrors="https://pub.sortix.org/libz/release";; lua) mirrors="https://www.lua.org/ftp";; mdocml) mirrors="https://mandoc.bsd.lv/snapshots";; nasm) mirrors="https://www.nasm.us/pub/nasm/releasebuilds/$version";; nyancat) mirrors="https://github.com/klange/nyancat/archive/refs/tags"; mirror_file="$version.tar.gz";; perl) case "$file" in perl-cross-*) mirrors="https://github.com/arsv/perl-cross/releases/download/$version";; *) mirrors="https://www.cpan.org/src/5.0";; esac;; pkg-config) mirrors="https://pkgconfig.freedesktop.org/releases";; python) mirrors="https://www.python.org/ftp/python/$version";; qemu) mirrors="https://download.qemu.org";; vim) mirrors="ftp://ftp.vim.org/pub/vim/unix";; xz) mirrors="https://tukaani.org/xz";; *) mirrors="https://ftp.gnu.org/gnu/$port https://ftp.gnu.org/gnu/$nolib";; esac mirrors="$(echo "$mirrors" | tr ' ' '\n' | uniq)" found_mirror= for mirror in $mirrors; do echo trying "$mirror/$mirror_file" if wget -q "$mirror/$mirror_file" -O $file.dl; then cmp "$file" "$file.dl" rm "$file.dl" found_mirror="$mirror" break fi done if [ -z "$found_mirror" ]; then echo "$port failed to find $file" exit 1 else sha256sum=$(sha256sum "$file" | grep -Eo '^[^ ]*') echo "VERSION${file_number_suffix}='$version'" >> "$port.info.new" echo "DISTNAME${file_number_suffix}='$distname'" >> "$port.info.new" echo "ARCHIVE${file_number_suffix}='$file'" >> "$port.info.new" echo "SHA256SUM${file_number_suffix}='$sha256sum'" >> "$port.info.new" echo "UPSTREAM_SITE${file_number_suffix}='$found_mirror'" >> "$port.info.new" echo "UPSTREAM_ARCHIVE${file_number_suffix}='$mirror_file'" >> "$port.info.new" mkdir -p "$mirrordir/$port" mv "$file" "$mirrordir/$port/$file" echo "$found_mirror/$mirror_file" > "$mirrordir/$port/$file.url" touch -r "$mirrordir/$port/$file" "$mirrordir/$port/$file.url" echo "$sha256sum $file" > "$mirrordir/$port/$file.sha256sum" touch -r "$mirrordir/$port/$file" "$mirrordir/$port/$file.sha256sum" touch -r "$mirrordir/$port/$file" "$mirrordir/$port" fi done case "$port" in ag) cat << \EOF RELEASE_SEARCH_PAGE="https://geoff.greer.fm/ag/" EOF ;; bochs) cat << \EOF RELEASE_SEARCH_PAGE="https://sourceforge.net/projects/bochs/files/bochs/" RELEASE_SEARCH_REGEX="([0-9]+\.[0-9]+(\.[0-9]+)*)/" UPSTREAM_SITE_TEMPLATE="https://sourceforge.net/projects/bochs/files/bochs/%v" EOF ;; e2fsprogs) cat << \EOF RELEASE_SEARCH_PAGE="https://mirrors.edge.kernel.org/pub/linux/kernel/people/tytso/e2fsprogs/" RELEASE_SEARCH_REGEX="v([0-9]+\.[0-9]+(\.[0-9]+)*)/" UPSTREAM_SITE_TEMPLATE="https://mirrors.edge.kernel.org/pub/linux/kernel/people/tytso/e2fsprogs/v%v" EOF ;; binutils|gcc|grub|libstdc++) cat << \EOF VERSION_REGEX="([0-9]+\.[0-9]+(\.[0-9]+)*(-rc[0-9]+)?)" EOF ;; libcurses) cat << \EOF UPSTREAM_SITE="https://ftp.barfooze.de/pub/sabotage/tarballs" EOF ;; libevent) cat << \EOF VERSION_REGEX="([0-9]+\\.[0-9]+(\\.[0-9]+)*-stable)" UPSTREAM_SITE_TEMPLATE="https://github.com/libevent/libevent/releases/download/release-%v" UPSTREAM_ARCHIVE_TEMPLATE="libevent-%v%e" EOF ;; libexpat) cat << \EOF UPSTREAM_SITE_TEMPLATE="https://github.com/libexpat/libexpat/releases/download/R_%M_%m_%p" EOF ;; libjpeg) cat << \EOF UPSTREAM_SITE="https://www.ijg.org/files" # TODO: The last letter is optional but sort -V before the first release. VERSION_REGEX="([0-9]+[a-z])" RELEASE_REGEX="jpegsrc\.v$VERSION_REGEX" UPSTREAM_ARCHIVE_TEMPLATE="jpegsrc.v%v%e" EOF ;; libgmp) cat << \EOF # TODO: Remove after upgrading past 6.0.0a. VERSION_REGEX="([0-9]+\.[0-9]+(\.[0-9]+)*a?)" EOF ;; libpcre) cat << \EOF RELEASE_SEARCH_PAGE="https://sourceforge.net/projects/pcre/files/pcre/" RELEASE_SEARCH_REGEX="([0-9]+\.[0-9]+(\.[0-9]+)*)/" UPSTREAM_SITE_TEMPLATE="https://sourceforge.net/projects/pcre/files/pcre/%v" EOF ;; libpng) cat << \EOF RELEASE_SEARCH_PAGE="http://libpng.org/pub/png/libpng.html" EOF ;; nasm) cat << \EOF RELEASE_SEARCH_PAGE="https://www.nasm.us/pub/nasm/releasebuilds/" RELEASE_SEARCH_REGEX="([0-9]+\.[0-9]+(\.[0-9]+)*)/" UPSTREAM_SITE_TEMPLATE="https://www.nasm.us/pub/nasm/releasebuilds/%v" EOF ;; nyancat) cat << \EOF RELEASE_SEARCH_PAGE="https://github.com/klange/nyancat/tags" EOF ;; python) cat << \EOF RELEASE_SEARCH_PAGE="https://www.python.org/downloads/source/" RELEASE_SEARCH_REGEX="Python-([0-9]+\.[0-9]+(\.[0-9]+)*)(\.tar(\.(gz|bz2|xz)))" UPSTREAM_SITE_TEMPLATE="https://www.python.org/ftp/python/%v" EOF ;; esac >> "$port.info.new" if [ -n "$NEED_WRITABLE" ]; then echo "NEED_WRITABLE=$NEED_WRITABLE" >> "$port.info.new" fi rm -f "$portsdir/$port/porttixinfo" rm -f "$portsdir/$port/tixbuildinfo" if [ "$port" != patch ]; then mv "$portsdir/$port/patch.patch" "$portsdir/$port/$port.patch" mv "$portsdir/$port/patch.execpatch" "$portsdir/$port/$port.execpatch" mv "$portsdir/$port/patch.normalize" "$portsdir/$port/$port.normalize" fi if [ ! -s "$portsdir/$port/$port.execpatch" ]; then rm -f "$portsdir/$port/$port.execpatch" fi if [ ! -s "$portsdir/$port/$port.normalize" ]; then rm -f "$portsdir/$port/$port.normalize" fi mv "$port.info.new" "$port.info" done