diff --git a/DEBBUILD b/DEBBUILD new file mode 100644 index 0000000..9eece26 --- /dev/null +++ b/DEBBUILD @@ -0,0 +1,29 @@ +#/usr/bin/env bash + +pkgname="forgejo" +pkgrel=1 +pkgdesc="A painless selfhost git service." +url="https://codeberg.org/forgejo/forgejo" +maintainer="Leafee98 " + +source=( + "forgejo-1.19.0-2-linux-amd64.xz::https://codeberg.org/attachments/5f7f9d36-b85e-40db-b390-9bf39acbbbc5" + "bwifi.git::git+https://cgit.leafee98.com/bwifi.git/" + "frp-0.46.1.tar.gz::frp-0.46.1.tar.gz" + "pkg.zip::pkg.zip" + "t.sh::t.sh" +) + +function pkgver { + echo "0.0.2" +} + +function build { + install -D "${srcdir}/t.sh" "${pkgdir}/usr/bin/t.sh" + echo "building" +} + +function package { + echo "installing package, pkgdir: ${pkgdir}" +} + diff --git a/frp-0.46.1.tar.gz b/frp-0.46.1.tar.gz new file mode 100644 index 0000000..deb52d0 Binary files /dev/null and b/frp-0.46.1.tar.gz differ diff --git a/makedeb b/makedeb new file mode 100755 index 0000000..c0ec680 --- /dev/null +++ b/makedeb @@ -0,0 +1,319 @@ +#!/usr/bin/env bash + +WORKSPACE=$(pwd -P) + +export srcdir="${WORKSPACE}/src/" +export pkgdir="${WORKSPACE}/pkg/" + +FAKE_PACKAGE=0 +OVERRIDE_SOURCE=0 +OVERRIDE_VERSION="" +ACTION="" + + +# prefer terminal safe colored and bold text when tput is supported +if tput setaf 0 &>/dev/null; then + ALL_OFF="$(tput sgr0)" + BOLD="$(tput bold)" + BLUE="${BOLD}$(tput setaf 4)" + GREEN="${BOLD}$(tput setaf 2)" + RED="${BOLD}$(tput setaf 1)" + YELLOW="${BOLD}$(tput setaf 3)" +else + ALL_OFF="\e[0m" + BOLD="\e[1m" + BLUE="${BOLD}\e[34m" + GREEN="${BOLD}\e[32m" + RED="${BOLD}\e[31m" + YELLOW="${BOLD}\e[33m" +fi +readonly ALL_OFF BOLD BLUE GREEN RED YELLOW + +function msg { + local mesg=$1; shift + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" +} +function msg2 { + local mesg=$1; shift + printf "${BLUE} ->${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" +} +function err { + local mesg=$1; shift + printf "${RED} ->${ALL_OFF}${BOLD}${RED} ${mesg}${ALL_OFF}\n" "$@" >&2 +} + + + +function debian_control { + local install_size="$(du --bytes --summarize ${pkgdir} | cut -d $'\t' -f 1)" + + cat << EOF | envsubst +Package: ${pkgname} +Version: ${pkgver} +Architecture: all +Maintainer: ${maintainer} +Installed-Size: ${install_size} +Description: ${pkgdesc} +EOF +} + +function generate_deb { + ( + cd "${pkgdir}" + tar czf ../data.tar.gz [a-z]* + cd DEBIAN + tar czf ../../control.tar.gz * + cd ../.. + echo 2.0 > debian-binary + ar r "${pkgname}${pkgver:+-}${pkgver}.deb" debian-binary control.tar.gz data.tar.gz + rm debian-binary control.tar.gz data.tar.gz + ) +} + +function url_type { + if [[ "${url}" == git+* ]] ; then + echo "git" + elif [[ "${url}" == http://* ]] ; then + echo "http" + elif [[ "${url}" == https://* ]] ; then + echo "https" + elif [[ "${url}" == "file//*" ]]; then + echo "file" + elif [[ "${url}" != "*://*" ]] ; then + echo "file" + else + err "Unkown url schema: %s" "${url}" + err "Aborting..." + exit 1 + fi +} + +function retrive_source_single { + local file_name="$1" + local url="$2" + + case "$(url_type "${url}")" in + "git") + if [[ -d "${file_name}" ]]; then + git --git-dir="${WORKSPACE}/${file_name}" --work-tree="${srcdir}" pull + else + git clone --bare "${url##git+}" "${WORKSPACE}/${file_name}" + fi + ;; + "http"|"https") + if (( ! OVERRIDE_SOURCE )) && [[ -f "${WORKSPACE}/${file_name}" ]] ; then + msg2 "${file_name} already exists, skip download" + else + curl --location "${url}" --output "${WORKSPACE}/${file_name}" + fi + ;; + esac +} + +function extract_source_single { + local file_name="$1" + local url="$2" + local url_type="$(url_type "${url}")" + + case "${url_type}" in + "git") + local restore_source=HEAD + git --git-dir "${WORKSPACE}/${file_name}" --work-tree="${srcdir}" restore --source="${restore_source}" . + ;; + *) + ln --symbolic $(realpath "${file_name}") "${srcdir}/${file_name}" + decompress_source_file "${file_name}" + ;; + esac +} + +function decompress_source_file { + local file="$1" + case "${file}" in + *.tar|*.tar.gz|*.tgz|*.tar.Z|*.tar.bz2|*.tbz2|*.tar.lz|*.tlz|*.tar.xz|*.txz|*.tar.zst) + cmd="tar" ;; + *.gz|*.z|*.Z) + cmd="gzip" ;; + *.bz2|*.bz) + cmd="bzip2" ;; + *.xz) + cmd="xz" ;; + *.zst|*.zstd) + cmd="zstd" ;; + *.zip) + cmd="unzip" ;; + *) + msg2 "No need to decompress, skip %s" "${file}" + return + esac + + msg2 "Decompressing %s with %s" "${file}" "${cmd}" + local res=0 + case "$cmd" in + "tar") + $cmd -xf "$file" --directory="${srcdir}" || res=$? + ;; + "unzip") + $cmd "$file" -d "${srcdir}" || res=$? + ;; + *) + rm -f -- "${file%.*}" + $cmd -dcf -- "$file" > "${srcdir}/${file%.*}" || res=$? + ;; + esac + + # local ext="${file##*.}" + # local file_type="$(file --no-sandbox --brief --mime --uncompress "${file}")" + # case "$file_type" in + # *application/x-tar*|*application/zip*|*application/x-zip*) + # cmd="tar" ;; + # *application/x-gzip*|*application/gzip*) + # case "$ext" in + # gz|z|Z) cmd="gzip" ;; + # *) return;; + # esac ;; + # *application/x-bzip*) + # case "$ext" in + # bz2|bz) cmd="bzip2" ;; + # *) return;; + # esac ;; + # *application/x-xz*) + # case "$ext" in + # xz) cmd="xz" ;; + # *) return;; + # esac ;; + # *application/zstd*) + # case "$ext" in + # zst) cmd="zstd" ;; + # *) return;; + # esac ;; + # *) + # msg2 "No need to decompress, skip %s" "${file}" + # return + # ;; + # esac + + # local ret=0 + # msg2 "$(gettext "Extracting %s with %s")" "$file" "$cmd" + # if [[ $cmd = "tar" ]]; then + # $cmd -xf "$file" --directory="${srcdir}" || ret=$? + # else + # rm -f -- "${file%.*}" + # $cmd -dcf -- "$file" > "${srcdir}/${file%.*}" || ret=$? + # fi + # if (( ret )); then + # err "Failed to extract %s" "$file" + # err "Aborting..." + # exit 1 + # fi +} + +function is_function { + declare -F "$1" > /dev/null +} + + +set -o errtrace +set -o errexit +function err_occur { err "Build aborted in: %s" "$ACTION" ; } +trap err_occur ERR + +## +## Here start the build logic +## + +while (( $# >= 1 )); do + case "$1" in + -F) FAKE_PACKAGE=1 ;; + -OS) OVERRIDE_SOURCE=1 ;; + -OV) OVERRIDE_VERSION=$2; shift ;; + *) err "Unkown option $1"; break ;; + esac + shift +done + +source "${WORKSPACE}/DEBBUILD" + +# Run package and generate deb and exit +if (( FAKE_PACKAGE )); then + # version passed directly from parent shell + if [[ -n "${OVERRIDE_VERSION}" ]] ; then + pkgver="${OVERRIDE_VERSION}" + fi + + if is_function package; then + ACTION="package" + msg "run custom function: %s..." "package" + package + fi + + ACTION="generating deb" + msg "generating deb package..." + generate_deb + exit $? +fi + +ACTION="clean" +msg "cleaning..." +rm -rf "${srcdir}" "${pkgdir}" + +mkdir -p ${srcdir} ${pkgdir} + +ACTION="retrieve source" +msg "retrieving source..." +for s in "${source[@]}"; do + if grep "::" <<< "$s" > /dev/null; then + file_name="${s%%::*}" + url="${s##*::}" + else + err "source must contain \"::\" to specify file name" + exit 1 + fi + + retrive_source_single "${file_name}" "${url}" +done +msg "extracting source..." +for s in "${source[@]}"; do + if grep "::" <<< "$s" > /dev/null; then + file_name="${s%%::*}" + url="${s##*::}" + fi + + extract_source_single "${file_name}" "${url}" +done + +if is_function build; then + ACTION="build" + msg "run custom function: %s..." "build" + build +fi + +ACTION="pkgver" +if [[ -n "${OVERRIDE_VERSION}" ]] ; then + msg "Using override version: %s" "${OVERRIDE_VERSION}" + pkgver="${OVERRIDE_VERSION}" +elif is_function pkgver; then + msg "run custom function: %s..." "pkgver" + pkgver="$(pkgver)" +fi + +ACTION="generate control" +msg "generating control..." +mkdir -p "${pkgdir}/DEBIAN" +echo 9 > "${pkgdir}/DEBIAN/compat" +debian_control > "${pkgdir}/DEBIAN/control" + +function debian_hooks_warpper { is_function "$1" && "$1" > "$2" && chmod +x "$2" || true; } +debian_hooks_warpper debian_preinst ${pkgdir}/DEBIAN/preinst +debian_hooks_warpper debian_postinst ${pkgdir}/DEBIAN/postinst +debian_hooks_warpper debian_prerm ${pkgdir}/DEBIAN/prerm +debian_hooks_warpper debian_postrm ${pkgdir}/DEBIAN/postrm + +if is_function package; then + # recursive call self to run package in fakeroot + msg "Entering fakeroot environment..." + fakeroot -- bash -$- "${BASH_SOURCE[0]}" -F -OV "${pkgver}" "${ARGLIST[@]}" || exit $? + msg "Leaving fakeroot environment..." +fi + +msg "Builds has done" diff --git a/pkg.zip b/pkg.zip new file mode 100644 index 0000000..d02ddc6 Binary files /dev/null and b/pkg.zip differ diff --git a/t.sh b/t.sh new file mode 100644 index 0000000..9010f6d --- /dev/null +++ b/t.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +ls -l +fakeroot +ls -l