diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/abslibre-tools/createworkdir | 6 | ||||
-rwxr-xr-x | src/abslibre-tools/librerelease | 2 | ||||
-rwxr-xr-x | src/abslibre-tools/librestage | 8 | ||||
-rw-r--r-- | src/lib/conf.sh | 14 | ||||
-rw-r--r-- | src/libretools.conf | 2 | ||||
-rw-r--r-- | src/xbs-abs/.gitignore | 1 | ||||
-rw-r--r-- | src/xbs-abs/Makefile | 12 | ||||
-rwxr-xr-x | src/xbs-abs/helper-abs | 183 | ||||
-rw-r--r-- | src/xbs-abs/xbs-abs.conf | 10 | ||||
-rw-r--r-- | src/xbs-abslibre/Makefile | 3 | ||||
-rwxr-xr-x | src/xbs-abslibre/helper-abslibre | 137 | ||||
-rw-r--r-- | src/xbs/Makefile | 2 | ||||
-rwxr-xr-x | src/xbs/xbs | 147 | ||||
-rw-r--r-- | src/xbs/xbs.conf | 1 |
14 files changed, 517 insertions, 11 deletions
diff --git a/src/abslibre-tools/createworkdir b/src/abslibre-tools/createworkdir index 8e5ebcd..8176cce 100755 --- a/src/abslibre-tools/createworkdir +++ b/src/abslibre-tools/createworkdir @@ -28,7 +28,7 @@ set -euE . libremessages . $(librelib conf.sh) load_files libretools -check_vars libretools WORKDIR REPOS ABSLIBRERECV ABSLIBRESEND +check_vars libretools WORKDIR ABSLIBRERECV ABSLIBRESEND # these are asked for by `xbs download` trap 'error "Aborting..."' EXIT @@ -38,7 +38,7 @@ mkdir -p "$WORKDIR" msg "Creating staging directory in WORKDIR..." mkdir -p "$WORKDIR/staging" -cmd=(gitget -f -p "$ABSLIBRESEND" checkout "$ABSLIBRERECV" "$WORKDIR/abslibre") +cmd=(xbs -b abslibre download) if ! "${cmd[@]}"; then error "Could not clone ABSLibre" plain "Try running this command:" @@ -49,6 +49,6 @@ if ! "${cmd[@]}"; then fi msg "Finished, your packaging directory tree looks like this now:" -ls --color=always "${WORKDIR}"/* +ls --color=auto "${WORKDIR}"/* trap -- EXIT diff --git a/src/abslibre-tools/librerelease b/src/abslibre-tools/librerelease index 03a57e0..e3869e9 100755 --- a/src/abslibre-tools/librerelease +++ b/src/abslibre-tools/librerelease @@ -1,6 +1,6 @@ #!/usr/bin/env bash # Librerelease -# Uploads packages into [staging] +# Uploads packages and releases them # Copyright (C) 2010-2012 Joshua Ismael Haase Hernández (xihh) <hahj87@gmail.com> # Copyright (C) 2010-2013 Nicolás Reynolds <fauno@parabola.nu> diff --git a/src/abslibre-tools/librestage b/src/abslibre-tools/librestage index 1e208c9..d566fa9 100755 --- a/src/abslibre-tools/librestage +++ b/src/abslibre-tools/librestage @@ -37,7 +37,7 @@ usage() { main() { if [[ -w / ]]; then - error "This program should be run as regular user" + error "This program should be run as a regular user" return 1 fi @@ -51,13 +51,13 @@ main() { repos=("$@") if [[ ${#repos[@]} -eq 0 ]]; then usage >&2 - return 1; + return 1 fi - [[ ! -e ./PKGBUILD ]] && { + if ! [[ -e ./PKGBUILD ]]; then error "PKGBUILD not found" return 1 - } + fi # Load configuration load_files libretools diff --git a/src/lib/conf.sh b/src/lib/conf.sh index 2730b57..1aa7b56 100644 --- a/src/lib/conf.sh +++ b/src/lib/conf.sh @@ -51,6 +51,14 @@ list_files() { echo "$LIBREHOME/.$slug.conf" fi ;; + xbs) + echo /etc/$slug.conf + echo "$XDG_CONFIG_HOME/$slug.conf" + ;; + xbs*) + echo /etc/xbs.d/$slug.conf + echo "$XDG_CONFIG_HOME/xbs.d/$slug.conf" + ;; libretools) echo /etc/$slug.conf echo "$XDG_CONFIG_HOME/libretools/$slug.conf" @@ -76,8 +84,10 @@ list_envvars() { GPGKEY PACKAGER ;; libretools) - printf '%s\n' \ - DIFFPROG + printf '%s\n' DIFFPROG + ;; + xbs) + printf '%s\n' BUILDSYSTEM ;; *) :;; esac diff --git a/src/libretools.conf b/src/libretools.conf index 12c4392..3999849 100644 --- a/src/libretools.conf +++ b/src/libretools.conf @@ -15,7 +15,7 @@ BLACKLIST=https://repo.parabolagnulinux.org/docs/blacklist.txt DIFFPROG=`which kdiff3 meld gvimdiff vimdiff colordiff diff 2>/dev/null|sed 's/\s.*//;1q'` ## The repos you'll be packaging for -## Used by `toru`, `createworkdir` +## Used by `toru` # Tip: As early repos take precedence on $REPOS loops, you can use this as # inverted order of precedence. Put testing repos first so fullpkg find new # PKGBUILDs first, for instance. Toru-path uses reverse order to enforce repo diff --git a/src/xbs-abs/.gitignore b/src/xbs-abs/.gitignore new file mode 100644 index 0000000..41ee0f5 --- /dev/null +++ b/src/xbs-abs/.gitignore @@ -0,0 +1 @@ +archrelease* diff --git a/src/xbs-abs/Makefile b/src/xbs-abs/Makefile new file mode 100644 index 0000000..7582592 --- /dev/null +++ b/src/xbs-abs/Makefile @@ -0,0 +1,12 @@ +pkgconfdir = $(sysconfdir)/xbs +bindir = $(libexecdir)/xbs +pkglibexecdir = $(libexecdir)/xbs/helper-abs.d +copy_files = archrelease.in +libs = archrelease +include ../../common.mk + +archrelease: %: %.in + @echo "GEN $@" + @$(edit) <"$<" >"$@" || { rm -f -- '$@'; false; } + @sed -i '/valid-tags\.sh/d' '$@' || { rm -f -- '$@'; false; } + @chmod 755 "$@" || { rm -f -- '$@'; false; } diff --git a/src/xbs-abs/helper-abs b/src/xbs-abs/helper-abs new file mode 100755 index 0000000..d2baf42 --- /dev/null +++ b/src/xbs-abs/helper-abs @@ -0,0 +1,183 @@ +#!/bin/bash + +# Copyright (C) 2013 Luke Shumaker <lukeshu@sbcglobal.net> +# +# For code from db-functions (arch_svn): +# Copyright (C) 2012 Pierre Schmitz <pierre@archlinux.de> +# For code from db-move+db-remove (move+unrelease): +# Copyright (C) 2008-2009 Aaron Griffin <aaronmgriffin@gmail.com> +# Copyright (C) 2009 Abhishek Dasgupta <abhidg@gmail.com> +# Copyright (C) 2009, 2011 Dan McGee <dan@archlinux.org> +# Copyright (C) 2009-2012 Pierre Schmitz <pierre@archlinux.de> +# For code just from db-move (move): +# Copyright (C) 2011 Rémy Oudompheng <remyoudompheng@gmail.com> +# Copyright (C) 2012 Florian Pritz <bluewind@xinu.at> +# For code just from db-remove (unrelease): +# Copyright (C) 2009 Eric Bélanger <snowmaniscool@gmail.com> +# Copyright (C) 2011 Florian Pritz <bluewind@xinu.at> +# +# License: GNU GPLv2+ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +load_config() { + . $(librelib conf.sh) + load_files xbs-abs + # SVNUSER is optional + check_vars SVNDIR SVNREPOS ARCHES || exit 1 +} + +# This is taken from dbscripts:db-fuctions +arch_svn() { + if [[ -z "${SVNUSER}" ]]; then + /usr/bin/svn "${@}" + else + sudo -u "${SVNUSER}" -- /usr/bin/svn --username "${USER}" "${@}" + fi +} + +pac2svn() { + local pacrepo=$1 + + # Figure out which svn repo we need + local svnrepoStr + for svnrepoStr in "${SVNREPOS[@]}"; do + local svnrepoAry=($svnrepoStr) + local svnrepo=${svnrepoAry[0]} + local svnurl=${svnrepoAry[1]} + local pacrepos=("${svnrepoAry[@]:2}") + + if in_array "$pacrepo" "${pacrepos[@]}"; then + echo "$svnrepo" + return 0 + fi + done + return 1 +} + +status() { + load_config + [[ -z $(arch_svn status -q) ]] +} + +download() { + load_config + + local svnrepoStr + for svnrepoStr in "${SVNREPOS[@]}"; do + local svnrepoAry=($svnrepoStr) + local svnrepo=${svnrepoAry[0]} + local svnurl=${svnrepoAry[1]} + local pacrepos=("${svnrepoAry[@]:2}") + + if [[ -d "$SVNDIR/$svnrepo/.svn" ]]; then + arch_svn -q up "$SVNDIR/$svnrepo"/* + else + # checkout non-recursive, then lazy load + # nescessary because: + # > DO NOT CHECK OUT THE ENTIRE SVN REPO. Your address + # > may be blocked. + arch_svn -q checkout -N "$svnurl" "$SVNDIR/$svnrepo" + fi + done +} + +release() { + local repo=$1 + local arch=$2 + + local tmpdir="$(mktemp -dt "xbs-abs-release.XXXXXXXXXX")" + trap "$(printf 'rm -rf -- %q' "$tmpdir")" EXIT + + printf '%s\n' \ + '#!/bin/bash' \ + "$(declare -f arch_svn)" \ + 'arch_svn "$@"' \ + > "$tmpdir/svn" + chmod 755 "$tmpdir/svn" + + PATH="$tmpdir:$PATH" "${0}.d/archrelease" -f "${repo}-${arch}" +} + +unrelease() { + local pkgbase=$1 + local repo=$2 + local arch=$3 + + local tag="$repo-$arch" + + load_config + local svndir="${SVNDIR}/$(pac2svn "$repo")/${pkgbase}" + arch_svn up -q "$svndir" + + # This is based off code from dbscripts:db-remove + arch_svn rm --force -q "${svndir}/repos/${tag}" + arch_svn commit -q "${svndir}" -m "${0##*/}: $pkgbase removed by $(id -un)" +} + +move() { + local repo_from=$1 + local repo_to=$2 + local pkgbase=$3 + + load_config + local svndir="${SVNDIR}/$(pac2svn "$repo")/${pkgbase}" + arch_svn up -q "$svndir" + + local tag_list="" + local pkgarch + local arches=() + # this is based off code from dbscripts:db-move + for pkgarch in "${ARCHES[@]}" 'any'; do + dir_from="${svndir}/repos/${repo_from}-${pkgarch}" + dir_to="${svndir}/repos/${repo_to}-${pkgarch}" + + if [ -f "${dir_from}/PKGBUILD" ]; then + if [ -d "${dir_to}" ]; then + for file in $(arch_svn ls "${dir_to}"); do + arch_svn rm -q "${dir_to}/$file@" + done + else + mkdir "${dir_to}" + arch_svn add -q "${dir_to}" + fi + + for file in $(arch_svn ls "${dir_from}"); do + arch_svn mv -q -r HEAD "${dir_from}/$file@" "${dir_to}/" + done + arch_svn rm --force -q "${dir_from}" + tag_list="$tag_list, $pkgarch" + arches+=("$pkgarch") + fi + done + tag_list="${tag_list#, }" + arch_svn commit -q "${svndir}" -m "${0##*/}: moved ${pkgbase} from [${repo_from}] to [${repo_to}] (${tag_list})" + echo "${arches[*]}" +} + +releasepath() { + local pkgbase=$1 + local repo=$2 + local arch=$3 + + load_config + local svndir="${SVNDIR}/$(pac2svn "$repo")/${pkgbase}" + arch_svn up -q "${svndir}" + echo "${svndir}/repos/${repo}-${arch}" +} + +case "$1" in + status|download|release|unrelease|move|releasepath) "$@";; + *) exit 127;; +esac diff --git a/src/xbs-abs/xbs-abs.conf b/src/xbs-abs/xbs-abs.conf new file mode 100644 index 0000000..3ceba6a --- /dev/null +++ b/src/xbs-abs/xbs-abs.conf @@ -0,0 +1,10 @@ +SVNDIR=/var/lib/xbs-abs +#SVNUSER= + +# name url repos... +SVNREPOS=( + 'packages svn://svn.archlinux.org/packages core extra testing' + 'commuity svn://svn.archlinux.org/community community community-testing multilib multilib-testing' +) + +ARCHES=(i686 x86_64) diff --git a/src/xbs-abslibre/Makefile b/src/xbs-abslibre/Makefile new file mode 100644 index 0000000..cbe09fa --- /dev/null +++ b/src/xbs-abslibre/Makefile @@ -0,0 +1,3 @@ +pkgconfdir = $(sysconfdir)/xbs +pkglibexecdir = $(libexecdir)/xbs +include ../../common.mk diff --git a/src/xbs-abslibre/helper-abslibre b/src/xbs-abslibre/helper-abslibre new file mode 100755 index 0000000..57d8369 --- /dev/null +++ b/src/xbs-abslibre/helper-abslibre @@ -0,0 +1,137 @@ +#!/bin/bash + +# Copyright (C) 2012-2013 Luke Shumaker <lukeshu@sbcglobal.net> +# +# License: GNU GPLv2+ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# Here's the idea: +# We have two sources of abslibre: +# - git - does not include packages imported directly from Arch Linux +# - rsync - is read-only +# They should be identical, except for the mentioned differences. +# + +status() { + [[ -z $(git status -s .) ]] +} + +download() { + . $(librelib conf) + load_files libretools + check_vars libretools WORKDIR ABSLIBRERECV || return 1 + + # Get the Parabola-added git repo + libregit "$ABSLIBRERECV" master "$WORKDIR/abslibre" || return 1 + # This bit configures a 'pushUrl' to use ssh, leaves plain https for + # 'url' (used for fetch). + if [[ -n ${ABSLIBRESEND:-} ]]; then + pushd "$WORKDIR/abslibre" >/dev/null + local pushUrl="$(git config --get remote.origin.pushUrl)" + if [[ $? != 0 ]]; then + git config remote.origin.pushUrl "$ABSLIBRESEND"; + elif [[ $pushUrl != "$ABSLIBRESEND" ]]; then + warning "A %s is configured for %s, but it doesn't match %s" pushUrl "$WORKDIR/abslibre" "$ABSLIBRESEND" + fi + popd >/dev/null + fi + + # Get the everything-included tree + abs +} + +release() { + local repo=$1 + local arch=$2 + + . libremessages + . $(librelib conf) + load_files libretools + check_vars libretools WORKDIR || return 1 + local lookupfile="${WORKDIR}/abslibre.xbs-lookup" + + read mode type sha1 file <<<"$(git ls-tree -d --full-tree HEAD "$(pwd)")" + + lock 9 "$lookupfile.lock" "Waiting for lock on %s" "$lookupfile" + { + sed "/^$repo $arch $pkgbase /d" < "$lookupfile" + echo "$repo $arch $pkgbase $sha1 $path" + } > "$lookupfile.$$" + mv "$lookupfile.$$" "$lookupfile" + lock_close 9 +} + +unrelease() { + local pkgbase=$1 + local repo=$2 + local arch=$3 + + . libremessages + . $(librelib conf) + load_files libretools + check_vars libretools WORKDIR || return 1 + local lookupfile="${WORKDIR}/abslibre.xbs-lookup" + + lock 9 "$lookupfile.lock" "Waiting for lock on %s" "$lookupfile" + sed -i "/^$repo $arch $pkgbase /d" "$lookupfile" + lock_close 9 +} + +move() { + local repo_from=$1 + local repo_to=$2 + local pkgbase=$3 + + . libremessages + . $(librelib conf) + load_files libretools + check_vars libretools WORKDIR || return 1 + local lookupfile="${WORKDIR}/abslibre.xbs-lookup" + + lock 9 "$lookupfile.lock" "Waiting for lock on %s" "$lookupfile" + sed -ri "s/^${repo_from} (\S+) $pkgbase /${repo_to} \1 $pkgbase/" "$lookupfile" + # TODO + lock_close 9 + return 1 +} + +releasepath() { + local pkgbase=$1 + local repo=$2 + local arch=$3 + + local r=0 + . $(librelib conf) + load_files libretools + check_vars libretools WORKDIR || r=$? + load_files abs + check_vars abs ABSROOT || r=$? + + local abstree + local dir + for abstree in "$WORKDIR/abslibre" "$ABSROOT"; do + dir="$abstree/$repo/$pkgbase" + if [[ -f "$dir/PKGBUILD" ]]; then + printf '%s\n' "$dir" + return 0 + fi + done + return 1 +} + +case "$1" in + status|download|release|unrelease|move|releasepath) "$@";; + *) exit 127;; +esac diff --git a/src/xbs/Makefile b/src/xbs/Makefile new file mode 100644 index 0000000..fcb8ac2 --- /dev/null +++ b/src/xbs/Makefile @@ -0,0 +1,2 @@ +pkgconfdir = $(sysconfdir) +include ../../common.mk diff --git a/src/xbs/xbs b/src/xbs/xbs new file mode 100755 index 0000000..6bd1af2 --- /dev/null +++ b/src/xbs/xbs @@ -0,0 +1,147 @@ +#!/bin/bash + +# Copyright (C) 2013 Luke Shumaker <lukeshu@sbcglobal.net> +# +# License: GNU GPLv2+ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +. libremessages +. $(librelib conf) + +errusage() { + if [[ $# -gt 0 ]]; then + error "$@" + fi + usage >&2 + exit 1 +} + +usage() { + print 'Usage: %s [-b SYSTEM|-h] COMMAND [ARGUMENTS]' "${0##*/}" + print 'Tool for working with arbitrary ABS-like build systems' + echo + prose 'This is a pluggable tool. The BUILDSYSTEM it uses is configured in:' + bullet '/etc/xbs.conf' + bullet '${XDG_CONFIG_HOME}/xbs.conf' + bullet 'with the `-b` flag' + prose 'Later items take precidence over earlier ones.' + echo + prose 'It looks for a helper program at `/lib/xbs/helper-${BUILDSYSTEM}`.' + echo + print 'Options:' + flag "-b $(_ BUILDSYSTEM)" 'BUILDSYSTEM instead of the one configured in + xbs.conf' + flag '-h' 'Show this message' + echo + print 'Commands:' + flag 'status' \ + 'Are there uncommited changes in `.`?' + flag 'download' \ + 'Download or update the tree' + flag "release $(_ 'REPO ARCH')" \ + 'Release `.`' + flag "unrelease $(_ 'PKGBASE REPO ARCH')" \ + 'Unrelease a pkgbase' + flag "move $(_ 'FROMREPO TOREPO PKGBASE')" \ + 'Move a pkgbase from one repo to another' + flag "releasepath $(_ 'PKGBASE REPO ARCH')" \ + 'Print the path to the staged version of pkgbase' +} + +status() { + if [[ ! -f PKGBUILD ]]; then + error 'PKGBUILD not found' + exit 1 + fi + "$HELPER" status "$@" +} + +download() { + "$HELPER" download "$@" +} + +release() { + if [[ ! -f PKGBUILD ]]; then + error 'PKGBUILD not found' + exit 1 + fi + if ! status; then + error 'You have not committed your changes yet!' + exit 1 + fi + "$HELPER" release "$@" +} + +unrelease() { + "$HELPER" unrelease "$@" +} + +move() { + "$HELPER" move "$@" +} + +releasepath() { + "$HELPER" releasepath "$@" +} + +main() { + BUILDSYSTEM='' + while getopts 'b:h' arg; do + case $arg in + b) BUILDSYSTEM=$OPTARG;; + h) usage; return 0;; + *) errusage;; + esac + done + shift $(($OPTIND - 1)) + + if [[ -z $BUILDSYSTEM ]]; then + load_files xbs || return 1 + check_vars xbs BUILDSYSTEM || return 1 + fi + + HELPER="/lib/xbs/helper-${BUILDSYSTEM}" + if [[ ! -x "$HELPER" ]]; then + error 'No helper for build system found: %s' "$BUILDSYSTEM" + return 1; + fi + + if [[ $# -lt 1 ]]; then + errusage "Must specify a command" + fi + + if [[ -w / ]]; then + error 'Run as a normal user' + fi + + local cmd=$1; shift + case "$cmd" in + status|download) + [[ $# -eq 0 ]] || errusage 'bad number of argments' + $cmd "$@" + ;; + release) + [[ $# -eq 2 ]] || errusage 'bad number of argments' + $cmd "$@" + ;; + move|unrelease|releasepath) + [[ $# -eq 3 ]] || errusage 'bad number of argments' + $cmd "$@" + ;; + *) errusage 'unknown command: %s' "$cmd";; + esac +} + +main "$@" diff --git a/src/xbs/xbs.conf b/src/xbs/xbs.conf new file mode 100644 index 0000000..caf8d8b --- /dev/null +++ b/src/xbs/xbs.conf @@ -0,0 +1 @@ +BUILDSYSTEM=abs |