# Maintainer: Yves G. # Choose which language(s) to package (in addition to “en-us”) # This is a “full-line” extended regular-expression, eg.: 'pt' if you want “pt” but not “pt-br” or “pt-pt” _I18N_EREGEX='.*' _pkgname=collabora-online-server-nodocker # taking version of loolwsd: pkgver=6.4.11 pkgrel=1 arch=('x86_64') url="https://www.collaboraoffice.com/code/" license=('MPL') makedepends=(curl fontconfig libcap) # ↑ excluding base (bzip2 coreutils gawk grep gzip sed systemd tar util-linux xz) optdepends=( 'hunspell: Use with language-specific hunspell dictionaries for LibreOffice spell-check' 'hyphen: Use with language-specific hyphen rules for LibreOffice hyphenation' ) # From Dockerfile’s install script, minus inotify-tools+psmisc: not actually part of CODE depends=() source=( 'https://www.collaboraoffice.com/repos/CollaboraOnline/CODE/Packages' install mkcert_example.sh sysusers tmpfiles ) sha1sums=( 'SKIP' '876319e04146b36bd53b06e14917c86cb8ec6acc' '3fe2db88f4f7ee203520c59760582103d3e41210' '2d271f9493ea14c675af1bfa76f6b654569dd51f' 'f9c102a06b2582548f13121e78790237e2cb38e1' ) # From deb’s conffiles backup=( etc/apache2/conf-available/loolwsd.conf etc/loolwsd/loolkitconfig.xcu etc/loolwsd/loolwsd.xml etc/nginx/snippets/loolwsd.conf etc/sysconfig/loolwsd ) # From deb’s pre/post scripts install=install # From Dockerfile (https://github.com/CollaboraOnline/Docker-CODE), minus i18n files _upstream_deps=(loolwsd code-brand) # DEBIAN–ARCHLINUX EQUIVALENCES # # In case of a new upstream release: # # 1. Move all lines from $_upstream_equiv to $_upstream_equiv_OLD. # # 2. Run `makepkg -s` iteratively: # * Each time a dependency is missing, move it back from $_upstream_equiv_OLD to $_upstream_equiv. # * If a dependency is new, add a new line in $_upstream_equiv with nothing after the “=” sign. # # 3. When the package is done, in a terminal run: ./missing-deps.sh # # 4. For each “not found” line: # * If the missing file should be provided by a new dependency in $_upstream_equiv, # then put after the “=” sign the name of an Archlinux package that provides this file; # you may need to create the package if it does not exist (usually old versions). # * Else the missing file is probably expected to be present on any Debian/Ubuntu system; # thus add the missing dependency in the $depends array. _upstream_equiv=' adduser = cpio = cpio expat = expat fontconfig = fontconfig init-system-helpers = libc6 = gcc-libs libcap2 = libcap libcap2-bin = libcap libgcc1 = gcc-libs libpam0g = pam libpng12-0 = libpng12 libssl1.0.0 = openssl-1.0 libstdc++6 = gcc-libs openssh-client = openssh systemd = systemd zlib1g = zlib ' _upstream_equiv_OLD=' locales-all = glibc ' _main_debs= _i18n_debs= declare -A __main_debs __i18n_debs # >>>> START OF DYNAMIC ADAPTATION OF PKGBUILD _upstream_handle_dep() { local dep="$2" local eqv="$(grep "^[[:blank:]]*$(sed 's/[.]/\\\0/g' <<<"$dep")[[:blank:]]*=" <<<"$_upstream_equiv")" local meta="$(awk -F$'\n' -vRS= "/^Package:[[:blank:]]*$(sed 's/[.]/\\\0/g' <<<"$dep")\\n/{print}" Packages)" local seen depurl if [ -n "$eqv" ]; then dep="$(sed 's/.*=[[:blank:]]*//' <<<"$eqv")" [ -n "$dep" ] || return for seen in "${depends[@]}"; do [ "$seen" == "$dep" ] && return done depends+=("$dep") elif [ -n "$meta" ]; then depurl="$(sed -rn "s#^Filename:[[:blank:]]*(.*/)?#${source[0]%Packages}#p" <<<"$meta")" for seen in "${source[@]}"; do [ "$seen" == "$depurl" ] && return done # when a new .DEB is needed, put it in the right array of dependencies [ $1 == main ] && __main_debs[$dep]="$depurl" || __i18n_debs[$dep]="$depurl" source+=("$depurl") sha1sums+=("$(sed -rn "s#^SHA1:[[:blank:]]*##p" <<<"$meta")") while read dep; do if [ -n "$dep" ]; then _upstream_handle_dep "$1" "$dep" fi; done < <( sed -rn "s#^Depends:[[:blank:]]*##p" <<<"$meta" \ | sed 's#([^)]*)##g; s#[[:blank:]]*,[[:blank:]]*#\n#g' ) else echo "Unknown dependency: $dep" >&2; exit 1 fi } if [ ${#source[*]} -eq 5 ]; then curl -s "${source[0]}" >Packages pkgver=$( awk -F$'\n' -vRS= '/^Package:[[:blank:]]*loolwsd\n/{print}' Packages \ | sed -n 's/^Version:[[:blank:]]*\(.*\)-.*/\1/p' ) # first register each .DEB as an unconfirmed main (i.e. not i18n) dependency for d in "${_upstream_deps[@]}"; do __main_debs[$d]=_pending_; done if [ -z "$_I18N_EREGEX" ]; then # go with that if no i18n has been requested pkgname=$_pkgname eval 'package() { _main_package; }' else # else register the function for building the main package, and dynamically discover i18n packages pkgname=($_pkgname) eval "package_$_pkgname() { _main_package; }" for p in $( \ sed -nr 's#^Package:[[:blank:]]*((collaboraoffice[0-9.]+-dict|collaboraofficebasis[0-9.]+)-[a-z]{2}(-[a-z]+)?)$#\1#p' Packages \ | grep -ve '-en-us$' \ | grep -E "[0-9.]+(-dict)?-($_I18N_EREGEX)\$") do # for each .DEB file found that matches the requested i18n regex, register that .DEB as a i18n one __i18n_debs[$p]=_pending_ done while read l; do # and register the function for building each of the i18n packages pkgname+=(${_pkgname}_${l}) eval "package_${_pkgname}_${l}() { _i18n_package $l; }" done < <( \ sed -nr 's#^Package:[[:blank:]]*(collaboraoffice[0-9.]+-dict-|collaboraofficebasis[0-9.]+-)([a-z]{2}(-[a-z]+)?)$#\2#p' Packages \ | grep -vxF en-us \ | sort -u \ | grep -Exe "$_I18N_EREGEX") fi for dep in "${!__main_debs[@]}"; do # recursive dependencies for the main package _upstream_handle_dep main "$dep" done for dep in "${!__i18n_debs[@]}"; do # recursive dependencies for the i18n packages _upstream_handle_dep i18n "$dep" done _main_debs="$(IFS='|'; echo "${__main_debs[*]}")" _i18n_debs="$(IFS='|'; echo "${__i18n_debs[*]}")" fi # some debug: echo "MAIN DEBs: $_main_debs" >&2 echo "I18N DEBs: $_i18n_debs" >&2 unset _upstream_handle_dep _upstream_equiv _upstream_deps __main_debs __i18n_debs # <<<< END OF DYNAMIC ADAPTATION OF PKGBUILD _i18n_package() { depends=() backup=() install= pkgdesc="Language ${1} internationalization files for Collabora CODE (LibreOffice Online)" local data f cd "$pkgdir" while read f; do [[ "$f" =~ [0-9.]+(-dict)?-$1 ]] || continue f="$srcdir/$(basename "$f")" data="$(ar t "$f" | grep ^data)" case "$data" in *.bz2) ar p "$f" "$data" | tar -xjf - ;; *.gz) ar p "$f" "$data" | tar -xzf - ;; *.xz) ar p "$f" "$data" | tar -xJf - ;; *) echo "Unknown file format: $data" >&2; exit 1 ;; esac done < <(tr '|' '\n' <<<"$_i18n_debs") chown -R $(id -nu):$(id -ng) . } _main_package() { pkgdesc="Collabora CODE (LibreOffice Online) server for Nextcloud or ownCloud, without Docker" local data f cd "$pkgdir" while read f; do f="$srcdir/$(basename "$f")" data="$(ar t "$f" | grep ^data)" case "$data" in *.bz2) ar p "$f" "$data" | tar -xjf - ;; *.gz) ar p "$f" "$data" | tar -xzf - ;; *.xz) ar p "$f" "$data" | tar -xJf - ;; *) echo "Unknown file format: $data" >&2; exit 1 ;; esac done < <(tr '|' '\n' <<<"$_main_debs") chown -R $(id -nu):$(id -ng) . # /lib is deprecated mv {lib,usr/lib} # use systemd for user allocation install -Dm0644 "$srcdir"/sysusers usr/lib/sysusers.d/$_pkgname.conf # replace cron with systemd rm -rf etc/cron.d install -Dm0644 "$srcdir"/tmpfiles usr/lib/tmpfiles.d/$_pkgname.conf # add dependency on systemd sed -i '/^\[Unit\]/ a \ After=systemd-tmpfiles-setup.service' usr/lib/systemd/system/loolwsd.service # keep the cert-making script from the Dockerfile for reference install -Dm0755 "$srcdir"/mkcert_example.sh usr/share/doc/loolwsd/example.mkcert.sh # do not provide libreoffice for the desktop (seems broken…) rm -rf opt/collaboraoffice6.4/share/xdg # fix lib + desktop files’ permissions chmod a+x opt/collaboraoffice6.4/program/lib*.so # https://github.com/CollaboraOnline/Docker-CODE/issues/32 [ -d etc/sysconfig ] || mkdir etc/sysconfig echo 'SLEEPFORDEBUGGER=0' >>etc/sysconfig/loolwsd }