diff options
Diffstat (limited to 'bin')
-rw-r--r-- | bin/autobuild.c | 56 | ||||
-rwxr-xr-x | bin/autobuild.sh | 88 | ||||
-rwxr-xr-x | bin/setup | 22 |
3 files changed, 166 insertions, 0 deletions
diff --git a/bin/autobuild.c b/bin/autobuild.c new file mode 100644 index 0000000..86d164c --- /dev/null +++ b/bin/autobuild.c @@ -0,0 +1,56 @@ +/* Copyright (C) 2014 Luke Shumaker <lukeshu@sbcglobal.net> + * + * 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 3 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/>. + */ + +#define _GNU_SOURCE /* for unsetenv(3) */ +#include <alloca.h> /* for alloca(3) */ +#include <errno.h> /* for errno */ +#include <error.h> /* for error(3) */ +#include <pwd.h> /* for getpwuid(3) */ +#include <stdio.h> /* for printf(3) */ +#include <stdlib.h> /* for unsetenv(3) */ +#include <string.h> /* for strlen(3), strcpy(3) */ +#include <unistd.h> /* for dup2(3), geteuid(3), execl(3) */ + +void +usage(const char *cmd) +{ + printf("Usage: %s PACKAGE\n", cmd); + printf("This command should be run from the git directory of the package source."); +} + +int +main(int argc, char **argv) +{ + if (argc != 2) { + dup2(2,1); + usage(argv[0]); + return 1; + } + + const char *home = getpwuid(geteuid())->pw_dir; + const char *script_suffix = "/bin/autobuild.sh"; + char *script = alloca(strlen(home)+strlen(script_suffix)); + strcpy(script, home); + strcpy(&(script[strlen(home)]), script_suffix); + + unsetenv("IFS"); + unsetenv("PATH"); + unsetenv("LD_PRELOAD"); + unsetenv("BASH_ENV"); + + execl(script, script, argv[1], NULL); + error(127, errno, "%s", script); +} diff --git a/bin/autobuild.sh b/bin/autobuild.sh new file mode 100755 index 0000000..ccf52ea --- /dev/null +++ b/bin/autobuild.sh @@ -0,0 +1,88 @@ +#!/bin/bash +# Copyright (C) 2014 Luke Shumaker <lukeshu@sbcglobal.net> +# +# 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 3 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/>. + +# Get the date as the *very* first thing +newpkgver_date=$(LC_ALL=C date -u +%Y%m%d) + +################################################################################ +. "$(librelib messages)" +setup_traps + +# Option parsing +if [[ $# != 1 ]]; then + die "%q takes exactly 1 argument" "$0" +fi +PACKAGE=$1 +package_re='^[^/]+/[^/]+$' +if ! [[ $PACKAGE =~ $package_re ]]; then + die "PACKAGE must be in the format REPO/PKGBASE: %s" "$PACKAGE" +fi + +# init +lock 9 "${HOME}/packages/lockdir/${PACKAGE}" "Waiting for previous run of %q to finish" "$0" + +. "$(librelib conf)" || exit 1 +load_files libretools || exit 1 +check_vars libretools WORKDIR ABSLIBRERECV ABSLIBRESEND || exit 1 + +if [[ $PWD != *.git ]]; then + die "should be run as a hook from a git repository" +fi +newgitver=$(git log -n1 --format='%H' master -- blacklist.txt) + +# Get the ABSLibre tree +gitget -f -p "$ABSLIBRESEND" checkout "$ABSLIBRERECV" "$WORKDIR/abslibre" +if [[ -f "${WORKDIR}/abslibre/${PACKAGE}/PKGBUILD" ]]; then + die "package does not exist in abslibre.git: %s" "$PACKAGE" +fi +cd "$WORKDIR/abslibre/${PACKAGE}" + +# Figure out info about the last version +oldgitver=$(sed -n 's/^_gitver=//p' PKGBUILD) +oldpkgver=$(sed -n 's/^pkgver=//p' PKGBUILD) +oldpkgver_date=${oldpkgver%%.*} +oldpkgver_rel=${oldpkgver#${oldpkgver_date}}; oldpkgver_rel=${oldpkgver_rel#.} oldpkgver_rel=${oldpkgver_rel:-0} + +# Make sure we actually have changes +if [[ "$newgitver" == "$oldgitver" ]]; then + msg 'blacklist.txt has not changed, nothing to do' + exit 0 +fi + +# Handle doing multiple versions in the same day +if [[ "$newpkgver_date" == "$oldpkgver_date" ]]; then + declare -i newpkgver_rel=${oldpkgver_rel}+1 + newpkgver=${newpkgver_date}.${newpkgver_rel} +else + newpkgver=${newpkgver_date} +fi + +# Update the PKGBUILD +sed -i -e 's|^pkgver=.*|pkgver=${newpkgver}|' \ + -e 's|^_gitver=.*|_gitver=${newgitver}|' \ + -e 's|^pkgrel=.*|pkgrel=1|' \ + PKGBUILD +updpkgsums +git add PKGBUILD +git commit -m 'Update libre/your-freedom' + +# Build the new package +makepkg +librestage libre + +# Publish the updates +git push +librerelease diff --git a/bin/setup b/bin/setup new file mode 100755 index 0000000..ea6b92c --- /dev/null +++ b/bin/setup @@ -0,0 +1,22 @@ +#!/usr/bin/make -f + +CFLAGS += -std=c99 -Wall -Wextra -Werror + +all: $(HOME)/bin/autobuild $(HOME)/.ssh/id_rsa $(HOME)/.ssh/id_rsa.pub $(HOME)/.gnupg/secring.gpg + +$(HOME)/bin/autobuild: $(HOME)/bin/autobuild.c + $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ && chmod 6755 $@ + +$(HOME)/.ssh/id_rsa $(HOME)/.ssh/id_rsa.pub: + ssh-keygen -N '' -f $@ + +$(HOME)/.gnupg/secring.gpg: + printf '%s\n' \ + 'Key-Type: default' \ + 'Subkey-Type: default' \ + 'Name-Real: Parabola automatic package builder' \ + 'Name-Email: dev@lists.parabolagnulinux.org' \ + 'Expire-Date: 0' \ + | gpg --gen-key --batch + +.DELETE_ON_ERROR: |