Hello.
This is an unimportant topic that may or may not be useful and can be skipped :)

Tatsuki Makino wrote on 2023/01/20 17:40:
> poudriere: I don't want to rebuild rust with PORTREVISION bump of curl

Some of the same kind of stories include :)
I don't want to rebuild gcc12 with update of binutils
I don't want to rebuild llvm15 with update of python39

And today's will be as follows :)
I don't want to rebuild *webkit* with update of sqlite3

As a solution to it... The tools for it were made :)
It will have been attached to this email.
In this case, it can be used as follows

sh the_attachment.sh -d sqlite3-3.41.2,1.pkg qt5-webkit-5.212.0.a4_12.pkg

If it is used with multiple files at the same time, I don't know if it is 
working properly :)

sh the_attachment.sh -d sqlite3-3.41.2,1.pkg webkit2-gtk*.pkg

I think there are people who can make something better, but for the time being, 
I will release it as a reference material. :)

Regards.

#! /bin/sh

#set -x

compact_manifest="+COMPACT_MANIFEST"
manifest="+MANIFEST"

if ! JQ="$(which jq)" ; then
        echo "textproc/jq must be installed" 1>&2
        exit 1
fi

usage ()
{
        set +x
        {
                echo "${0} [-n] [-t tmpdir] -d deppkg pkgfile ..."
        } 1>&2
        exit ${1:-1}
}

wrkdir=""
deppkg=""
dryrun="0"

sig_exit ()
{
        case "${dryrun:-}" in   # (
        1)
                if [ -n "${wrkdir:-}" -a -d "${wrkdir}" ] ; then
                        stat -f "%SN is kept" -- "${wrkdir}"
                fi
                ;;      # (
        *)
                if [ -n "${wrkdir:-}" -a -d "${wrkdir}" ] ; then
                        rm -r -i -- "${wrkdir}"
                        [ ! -d "${wrkdir}" ] ||
                                stat -f "%SN still exists" -- "${wrkdir}"
                fi
                ;;
        esac
}

builtin trap 'sig_exit' EXIT

extract ()
{
        local wrkdir
        local pkgfile
        pkgfile="${1:-}"
        shift 1

        if [ -z "${pkgfile}" -o ! -f "${pkgfile}" ] ; then
                usage 1
        fi

        [ -e "${wrkdir}/${compact_manifest}.orig" ] &&
                rm -f -v -- "${wrkdir}/${compact_manifest}.orig"
        [ -e "${wrkdir}/${manifest}.orig" ] &&
                rm -f -v -- "${wrkdir}/${manifest}.orig"

        tar -x -v -f "${pkgfile}" -C "${wrkdir}" -- "${compact_manifest}" 
"${manifest}"
        install -l as -- "${pkgfile}" "${wrkdir}/src.pkg"
}

update_deps ()
{
        local IFS _i _m wrkdir
        local deppkg_n deppkg_o deppkg_v deps_json
        local pkgfile pkg_n_v deppkg
        pkgfile="${1:-}"
        shift 1

        if [ -z "${pkgfile}" -o ! -f "${pkgfile}" ] ; then
                usage 1
        fi
        pkg_n_v="$(pkg query -F "${pkgfile}" '%n-%v')"
        : ${pkg_n_v:=orig}

        [ ! -e "${wrkdir}/${compact_manifest}.${pkg_n_v}" ] &&
                cp -p -v -- "${wrkdir}/${compact_manifest}" 
"${wrkdir}/${compact_manifest}.${pkg_n_v}"
        [ ! -e "${wrkdir}/${manifest}.${pkg_n_v}" ] &&
                cp -p -v -- "${wrkdir}/${manifest}" 
"${wrkdir}/${manifest}.${pkg_n_v}"

        echo "${deppkg}" | while IFS=$'\n' read _i
        do
                if [ ! -f "${_i}" ] ; then
                        continue 1
                fi
                deppkg_n="$(pkg query -F "${_i}" '%n')"
                deppkg_o="$(pkg query -F "${_i}" '%o')"
                deppkg_v="$(pkg query -F "${_i}" '%v')"
                if [ ${?:--1} -ne 0 ] ; then
                        continue 1
                fi
                for _m in "${wrkdir}/${compact_manifest}" 
"${wrkdir}/${manifest}"
                do
                        if ! deps_json="$("${JQ}" -c -j '.deps|keys_unsorted' 
"${_m}")" ; then
                                continue 1
                        fi
                        case "${deps_json}" in  # (
                        *\""${deppkg_n}"\"*)
                                "${JQ}" -c -j '.deps|["'"${deppkg_n}"'"]' 
"${_m}"
                                "${JQ}" -c -j '.deps["'"${deppkg_n}"'"]' "${_m}"
                                echo

                                cat "${_m}" > "${_m}.tmp"
                                #"${JQ}" -c -j 
'.deps["'"${deppkg_n}"'"].origin|="'"${deppkg_o}"'"' "${_m}.tmp" > 
"${_m}.tmp.json"
                                #mv -v -- "${_m}.tmp.json" "${_m}.tmp"
                                "${JQ}" -c -j 
'.deps["'"${deppkg_n}"'"].version|="'"${deppkg_v}"'"' "${_m}.tmp" > 
"${_m}.tmp.json"
                                mv -v -- "${_m}.tmp.json" "${_m}.tmp"

                                "${JQ}" -c -j '.deps|["'"${deppkg_n}"'"]' 
"${_m}.tmp"
                                "${JQ}" -c -j '.deps["'"${deppkg_n}"'"]' 
"${_m}.tmp"
                                echo

                                mv -v -- "${_m}.tmp" "${_m}"
                                ;;      # (
                        *)
                                #echo "${deps_json}"
                                # or new dependency?
                                ;;
                        esac
                done
        done
}

repack ()
{
        local wrkdir
        local pkgfile
        pkgfile="${1:-}"
        shift 1

        if [ -z "${pkgfile:-}" -o ! \( "${pkgfile}" -ef "${wrkdir}/src.pkg" \) 
] ; then
                {
                        stat -f "%SN%SY" "${pkgfile}" "${wrkdir}"/src.pkg
                } 1>&2
                usage 1
        fi
        touch -t `date -r 0 +%C%y%m%d%H%M.%S` -- 
"${wrkdir}/${compact_manifest}" "${wrkdir}/${manifest}"
        chmod a=r,u+w "${wrkdir}/${compact_manifest}" "${wrkdir}/${manifest}"
        chown 0:0 "${wrkdir}/${compact_manifest}" "${wrkdir}/${manifest}"
        tar -c -f - --exclude "${compact_manifest}" --exclude "${manifest}" 
"@${pkgfile}" |
                tar -c -v -f "${wrkdir}/tmp.pkg" -J -C "${wrkdir}" 
"${compact_manifest}" "${manifest}" @-
        chmod `stat -f %Mp%Lp "${pkgfile}"` "${wrkdir}/tmp.pkg"
        chown `stat -f %u:%g "${pkgfile}"` "${wrkdir}/tmp.pkg"
        case "${dryrun:-}" in   # (
        1)
                mv -v -- "${wrkdir}/tmp.pkg" "${wrkdir}/$(pkg query -F 
"${wrkdir}/tmp.pkg" "%n-%v.pkg")"
                ;;      # (
        *)
                mv -v -- "${wrkdir}/tmp.pkg" "${pkgfile}"
                ;;
        esac
}

if !  euid="$(id -u)" || [ 0${euid} -ne 0 ] ; then
        echo It must be run by root to generate the correct package.
fi

while [ ${#} -gt 0 ]
do
        OPTIND=1
        while getopts 'd:nt:' ch
        do      case "${ch}" in # (
                d)
                        deppkg="$(printf "${deppkg:+${deppkg}\n}%s" 
"${OPTARG}")"
                        ;;      # (
                n)
                        dryrun="1"
                        ;;      # (
                t)
                        case "${OPTARG}" in     # (
                        ?*)
                                if [ -d "${OPTARG}" -a -w "${OPTARG}" ] ; then
                                        TMPDIR="${OPTARG}"
                                        export TMPDIR
                                else
                                        usage 1
                                fi
                                ;;      # (
                        ''|*)
                                unset TMPDIR
                                ;;
                        esac
                        ;;      # (
                [\?:]|*)
                        ;;
                esac
        done
        unset ch
        shift $((OPTIND - 1))
        if : ; then
                break 1
        fi
done

if [ -z "${wrkdir:-}" -o ! -d "${wrkdir}" ] ; then
        if ! wrkdir="$(mktemp -d -t "${0##*/}")" ; then
                usage 1
        fi
fi

for pkgfile
do
        if [ -z "${pkgfile:-}" -o ! -f "${pkgfile}" ] ; then
                usage 1
        fi

        extract "${pkgfile}"
        update_deps "${pkgfile}"
        repack "${pkgfile}"
done

Reply via email to