Compare commits

...

85 Commits

Author SHA1 Message Date
Pierre Schmitz
3c7dbe0ea2 prepare release 2011-12-20 23:12:49 +01:00
Tom Gundersen
130227546a mkarchroot: do not create /etc/mtab
As of filesystem-2011.12 this is not needed anylonger, and indeed blocks the
chroot from being upgraded. As a workaround, recreating the chroot fixes the
problem.

Fixes FS#27640.

Reported-by: Andrea Scarpino <andrea@archlinux.org>
Signed-off-by: Tom Gundersen <teg@jklm.no>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-12-20 23:05:44 +01:00
Timothy Redaelli
594f972666 Use #!/bin/bash instead of #!/bin/sh
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-12-20 23:05:38 +01:00
Dave Reisner
0e32334cca archbuild: exec makechrootpkg to preserve exit value
This fixes a compound command such as the one below from continuing even
if the first fails.

  extra-x86_64-build && extra-i686-build

The problem is that 'cleanup 0' is triggered in archbuild even after an
unsucessful call to makechrootpkg. Since both archbuild and
makechrootpkg share the exact same cleanup function (from lib/common),
we simply force the shell to exit with the true return value by exec'ing
the call to makechrootpkg.

Signed-off-by: Dave Reisner <dreisner@archlinux.org>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-12-04 18:13:13 +01:00
Allan McRae
58d0ccc4f8 makearchroot: source /etc/profile before building
This ensures the PATH used when building is the default path and
not the value set by the user calling makechrootpkg.

Signed-off-by: Allan McRae <allan@archlinux.org>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-12-04 18:04:47 +01:00
Lukas Fleischer
bfd2862bc4 Makefile: Remove output files before replacing them
This one fixes all the "Permission denied" errors we got when invoking
make(1) after modifying a source file and removes the need to delete the
generated scripts manually.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-12-04 18:01:51 +01:00
Lukas Fleischer
56d4dec19f Use double brackets everywhere
We already fixed a couple of these in previous patches - this one should
replace all remaining uses of single brackets ("[") by double brackets.
Also, use arithmetic evaluation instead of conditional expressions where
appropriate and make use of "-z" and "-n" instead of comparing variables
to empty strings.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
2011-12-04 18:00:57 +01:00
Pierre Schmitz
f62f307c84 Add support for kde-unstable and gnome-unstable 2011-12-04 17:48:46 +01:00
Pierre Schmitz
8efe61b4e2 Skip archrelease for missing architectures 2011-11-21 10:24:29 +01:00
Pierre Schmitz
8ffc2e44ee prepare release 2011-11-11 22:06:17 +01:00
Ionut Biru
a628c1a006 makechrootpkg: fix repack
repack is defined as a boolean. set it true when -R is passed

/usr/sbin/makechrootpkg: line 295: 1: command not found

Signed-off-by: Ionut Biru <ibiru@archlinux.org>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-11-09 20:32:29 +01:00
Pierre Schmitz
8ba91b0574 prepare release 2011-11-06 10:38:39 +01:00
Pierre Schmitz
671643053d archbuild: Always use recent makepkg.conf and pacman.conf; Run namcap by default 2011-11-06 10:32:55 +01:00
Pierre Schmitz
bf96c9f949 makechrootpkg: Create separate namcap log for every single file 2011-11-06 10:31:37 +01:00
Pierre Schmitz
a030cdc532 mkarchroot: Respect makepkg.conf and pacman.conf when running a command 2011-11-06 10:27:55 +01:00
Lukas Fleischer
b7a3c74c50 commitpkg: Fix commit message
Move the message template before the if block. We moved this to the else
branch in commit aaa68e49e8 which lead to
"msgtemplate" being unset if one specifies a commit message on the
command line, thus stripping the "upgpkg:" part.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-11-04 19:38:11 +01:00
Eric Bélanger
a33ee6e78d commitpkg: Make svn quieter
Signed-off-by: Eric Bélanger <snowmaniscool@gmail.com>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-11-04 19:34:50 +01:00
Lukas Fleischer
1f24380a31 Makefile: Add common library to build dependencies
Add "lib/common.sh" to the build dependencies of our scripts to ensure
everything gets rebuilt when we modify a common function. Also, add
"Makefile" itself to enforce a rebuild if the edit command changes.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-11-04 19:34:13 +01:00
Lukas Fleischer
fbbcc30e3d lib/common.sh: Revise setup_workdir()
* Honor TMPDIR variable (just like we did in commit a0c6bf45).
* Quote path properly.
* Avoid unnecessary use of basename(1).

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-11-04 19:34:00 +01:00
Lukas Fleischer
c1752bd716 lib/common.sh: Use double brackets
Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-11-04 19:33:51 +01:00
Eric Bélanger
42d821ef7b Capitalize output messages
Some of the output/error messages were capitalized, some were
not. This patch capitalize everything for consistency sake. Other
minor changes were done to the messages like removing the superfluous
"error:" from die messages and adding a final period to messages that
were complete sentences as appropriate.

Signed-off-by: Eric Bélanger <snowmaniscool@gmail.com>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-11-04 19:33:29 +01:00
Pierre Schmitz
aea075d817 Change version to date 2011-11-01 21:36:33 +01:00
Pierre Schmitz
aaa68e49e8 Move common functions to a shared file
* common.sh is included on build time
* most functions are copied from makepkg
2011-11-01 15:33:08 +01:00
Florian Pritz
7c78599a61 add libdepends script
Signed-off-by: Florian Pritz <bluewind@xinu.at>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-10-31 22:57:12 +01:00
Pierre Schmitz
89950ccd70 Create signature for devtools source package 2011-10-31 14:04:35 +01:00
Pierre Schmitz
c238cfafa0 commitpkg: Require signatures for packages 2011-10-31 13:53:43 +01:00
Pierre Schmitz
0e58198f36 commitpkg: Check signature if available 2011-10-31 13:14:16 +01:00
Pierre Schmitz
e07d318c54 commitpkg: Skip signing if signature already exists 2011-10-31 12:53:50 +01:00
Pierre Schmitz
a06ac2451a makechrootpkg: Handle install and changelog file the same way as in commitpkg 2011-10-31 12:43:16 +01:00
Pierre Schmitz
fbdcf6e309 makechrootpkg: Do not export LANG
This is done by /etc/profile.d/locale.sh. By this we also ensure compatibility with systemd.
2011-10-31 12:02:46 +01:00
Pierre Schmitz
01f5cdf33d prepare release 2011-10-29 21:53:36 +02:00
Pierre Schmitz
e333a4da81 temporary workaround until pacman 4.0 moves to [core]
Pacman 3 refuses to work with the pacman 4 SigLevel config entry

Also related: https://bugs.archlinux.org/task/26555
2011-10-29 21:46:19 +02:00
Pierre Schmitz
86045b965e makechrootpkg: Make host pubring.gpg available to check signed sources 2011-10-29 20:37:28 +02:00
Lukas Fleischer
bea69043fb commitpkg: Sync changelog/install check with makepkg(8)
makepkg(8) currently uses a smarter method to extract all changelog and
install files from a PKGBUILD. Sync commitpkg to use the same code (with
small modifications). This also adds support for changelog/install files
that contain a whitespace.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-10-29 13:19:10 +02:00
Pierre Schmitz
521c4ceec3 makechrootpkg: Set the C locale system wide
makepkg sources /etc/profile before calling build(). This will change the
locale from C to en_US.UTF8.
2011-10-29 13:05:09 +02:00
Pierre Schmitz
3a684f667b prepare release 2011-10-14 10:18:56 +02:00
Pierre Schmitz
ae7b13646e Disable pacman's CheckSpace option as it fails within a chroot 2011-10-14 10:16:55 +02:00
Pierre Schmitz
6cf9332896 prepare release 2011-10-14 10:06:33 +02:00
Pierre Schmitz
f10d88e029 Call locale-gen with full path in chroot environment
Thanks to Peter Schuller for this hint
2011-10-14 09:55:28 +02:00
Pierre Schmitz
5c6c2d532e makechrootpkg: Avoid running namcap on non-package file like signatures
We only use .xz or .gz compression for pacakges so we can be more specific and avoid a match of e.g. *.pkg.tar.xz.sig etc.
2011-10-14 09:35:39 +02:00
Pierre Schmitz
b06b9f6010 Merge remote-tracking branch 'cryptocrack/for-pierre' 2011-10-14 09:33:07 +02:00
Pierre Schmitz
9715ddbe9d Apply pacman 4.0 changes to our copies of makepkg.conf and pacman.conf
Note: Signature checks are disabled for now until we provide a keyring package.
2011-10-14 09:09:46 +02:00
Lukas Fleischer
a0c6bf4556 Honor TMPDIR environment variable
Replace all mktemp(1) invocations that hardcode "/tmp" with `mktemp
--tmpdir` and change templates accordingly.

Note that "--tmpdir" is GNU-ish which is okay given that we currently
support Arch Linux only anyway.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
2011-10-13 11:10:09 +02:00
Lukas Fleischer
dcb80e7b5c finddeps: Unset optdepends
The optdepends array should be unset before sourcing the PKGBUILD to avoid
dangling optional depends.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
2011-10-13 08:23:36 +02:00
Lukas Fleischer
84b789f760 finddeps: Use read builtin to iterate over packages
Using parameter substitution might result in unpredictable behaviour
when directories contain whitespaces here. The read shell builtin is the
proper way to read single lines.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
2011-10-13 08:23:35 +02:00
Lukas Fleischer
8edb443c12 finddeps: Remove redundant cd(1)
Source the PKGBUILD using the correct path (relative to our base
directory) instead of using cd(1) to switch to the ABS base directory
first and to the package directory afterwards.

This is very useful when trying to track errors, also:

    $ ~/src/devtools/finddeps libdaq
    ./community/snort (depends)
    PKGBUILD: line 17: ruby: command not found
    PKGBUILD: line 19: [: =: unary operator expected

Versus:

    $ ~/src/devtools/finddeps libdaq
    ./community/snort (depends)
    ./community/ruby-pkgconfig/PKGBUILD: line 17: ruby: command not found
    ./community/lmms/PKGBUILD: line 19: [: =: unary operator expected

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
2011-10-13 08:23:34 +02:00
Lukas Fleischer
4800be25c2 finddeps: Proper quoting, use double brackets
Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
2011-10-13 08:23:33 +02:00
Lukas Fleischer
fe2040cd14 archrelease: Fix SVN error when repository is empty
If trash is empty, `svn rm -q "${trash[@]}"` fails with:

    svn: Try 'svn help' for more info and then
    svn: Not enough arguments provided

This doesn't result in any further malfunction but is kind of confusing
and unexpected. Skipping `svn rm` on an empty trash fixes this.

Reported-by: Alexander Rødseth <rodseth@gmail.com>
Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
2011-10-12 16:53:08 +02:00
Allan McRae
a991c9a71f Always log builds in makechrootpkg
It is very helpful to always log the build output in makechrootpkg
so pass "-L" as a standard option to makepkg.

Signed-off-by: Allan McRae <allan@archlinux.org>
Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
2011-10-07 21:53:04 +02:00
Dan McGee
022cd3d523 archrelease: call 'svn copy' once for all files
We don't need to invoke svn copy on each file; it accepts multiple
arguments. This cut Allan's time releasing one patch-friendly package
from 5 minutes to 2 minutes.

Signed-off-by: Dan McGee <dan@archlinux.org>
Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
2011-10-07 21:53:04 +02:00
Jan Alexander Steffens (heftig)
a790c39c7d makechrootpkg: If chroot is missing, exit instead of usage
I'm not sure why this was handled differently than the other
error conditions.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
2011-10-07 21:53:04 +02:00
Jan Alexander Steffens (heftig)
e66a1f3cd8 makechrootpkg: Add option to explicitly run namcap
Installs namcap if needed, *after* building the package,
contrary to the former way of having to have namcap installed,
e.g. via makedepends.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
2011-10-07 21:53:03 +02:00
Jan Alexander Steffens (heftig)
7a9f808a0f makechrootpkg: Source PKGBUILD only once
Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
2011-10-07 21:53:03 +02:00
Jan Alexander Steffens (heftig)
b9070bf0b8 makechrootpkg: Use nullglob
Use nullglob instead of checking for existence. If the glob doesn't
match any files, it will be removed instead of staying unexpanded.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
2011-10-07 21:53:03 +02:00
Jan Alexander Steffens (heftig)
1df6799747 makechrootpkg: Always set PKGDEST and SRCDEST
Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
2011-10-07 21:53:03 +02:00
Jan Alexander Steffens (heftig)
e41deee5e5 makechrootpkg: Replace $workdir with . ($PWD)
$workdir is never used when we change directory, so it's superfluous.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
2011-10-07 21:53:03 +02:00
Jan Alexander Steffens (heftig)
004ced2a33 makechrootpkg: Eliminate appname, only used once
Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
2011-10-07 21:53:03 +02:00
Jan Alexander Steffens (heftig)
733668f4cc makechrootpkg: Bashify syntax
No functional change. Eliminates unused variables RUN and FORCE.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
2011-10-07 21:53:03 +02:00
Lukas Fleischer
21daec135a Makefile: Add a cleanup target
Allows for using `make clean` to remove any output files generated by
make(1).

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
2011-10-07 21:53:02 +02:00
Lukas Fleischer
46c4def073 Support non-standard install locations
This build system overhaul allows for adding (define-style) macros to
our scripts. All source files are now suffixed with ".in" to clarify
that they might contain unprocessed defines. The Makefile provides a new
rule to preprocess source files and generate proper output scripts.

Also, add a "@pkgdatadir@" define (as used in GNU Autotools) and use it
instead of hardcoded paths to "/usr/share/devtools" everywhere. We
missed this when adding PREFIX support to the build system in commit
35fc83ce7d.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
2011-10-07 21:53:02 +02:00
Lukas Fleischer
142b032212 zsh_completion: Fix package completion
Make use of _devtools_completions_all_packages() instead of using
_devtools_completions_installed_packages(). The latter was removed
during an earlier review of the patch adding ZSH completion (now
6350ec04 in master) but we forgot to change two references.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-29 13:59:55 +02:00
Lukas Fleischer
5f8458f197 commitpkg: Avoid unnecessary use of basename(1)
Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-29 13:58:50 +02:00
Lukas Fleischer
50c311c261 archbuild: Avoid unnecessary use of basename(1)
Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-29 13:58:49 +02:00
Lukas Fleischer
ef10f6c799 archbuild: Proper quoting, use double brackets
Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-29 13:58:49 +02:00
Lukas Fleischer
d70918d18a archbuild: Use array for base packages
Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-29 13:58:49 +02:00
Pierre Schmitz
6da47a8f6a prepare release 2011-08-25 21:39:49 +02:00
Lukas Fleischer
6350ec0461 Add ZSH completion
Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-25 19:26:12 +02:00
Lukas Fleischer
3da3a5486f checkpkg: Use a pipe to sort package lists
No need to do this after we already wrote the package list to a file.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-25 11:22:13 +02:00
Lukas Fleischer
7020d2351b checkpkg: Use read builtin to get new ".so" files
The read shell builtin is the proper way to read single lines. Also,
simplify grep(1) and awk(1) invocations and use a single awk(1)
expression, that supports extracting file names with spaces, instead.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-25 11:21:24 +02:00
Lukas Fleischer
7952d6fbfc checkpkg: Avoid unnecessary use of grep(1)/basename(1)
Use parameter expansion instead of invoking external binaries here.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-25 11:20:41 +02:00
Lukas Fleischer
3c175e98bd checkpkg: Avoid unnecessary use of sed(1) and cut(1)
We already use `pacman -Sddp` here which should always only return a
single package URL for regular packages. No need to extract the first
field of the last line. Also, specify "--print-format '%l'" explicitly
to make this consistent even if pacman(8)'s default value changes some
day.

Use bash parameter expansion instead of sed(1) to extract the file name
from the URL.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-25 11:20:08 +02:00
Lukas Fleischer
ddb08cb9a1 checkpkg: Proper quoting, use double brackets
Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-25 11:18:36 +02:00
Lukas Fleischer
88a929cfc0 archrelease: Fix behaviour with non-standard trunk name
Do not hardcode the name of the package trunk directory and accept
varying directory names, such as "gnome-unstable". Regression introduced
in 8384ad849d.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-25 11:17:19 +02:00
Lukas Fleischer
c24209028a archrelease: Copy new files from trunk
Currently, files that have just been added to trunk are not copied to
the repositories when invoking archrelease, as `svn ls` does not list
them if we don't `svn update` explicitly before. Use `svn ls -r HEAD` to
include everything from current HEAD. Fixes FS#25680.

Reported-by: Eric Bélanger <snowmaniscool@gmail.com>
Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-25 11:16:26 +02:00
Lukas Fleischer
61010062ff commitpkg: Release to all repositories at once
Make use of archrelease's multi-tag capability invoke it once instead of
re-launching it for for each individual tag.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-25 11:14:33 +02:00
Lukas Fleischer
6ef4d5f30b archrelease: Accept multiple tags
This allows for releasing to multiple repositories with a single commit:

----
$ archrelease community-{i686,x86_64}
copying trunk to community-i686...done
copying trunk to community-x86_64...done
releasing package...done
----

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-25 11:13:45 +02:00
Lukas Fleischer
40ddf4d44f archrelease: Check for subdirectories early
Ensure we do not mess with version control if there are any
subdirectories in the package trunk.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-25 11:10:30 +02:00
Lukas Fleischer
b445920d55 archrelease: Remove redundant directory check
Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-25 11:09:01 +02:00
Lukas Fleischer
7887d9bb47 archco: Fix usage message
Point out that we allow passing more than two packages here.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-25 10:59:00 +02:00
Dave Reisner
35573fe147 archrelease: declare known_files as an array
Signed-off-by: Dave Reisner <dreisner@archlinux.org>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-18 10:11:27 +02:00
Dave Reisner
5688152f41 archrelease: use bashier syntax
Signed-off-by: Dave Reisner <dreisner@archlinux.org>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-18 10:11:27 +02:00
Dave Reisner
e1312ec493 archrelease: call svn rm only once
Signed-off-by: Dave Reisner <dreisner@archlinux.org>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-18 10:11:27 +02:00
Dave Reisner
e652dc8085 commitpkg: use getopts to parse options
Signed-off-by: Dave Reisner <d@falconindy.com>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-18 10:11:27 +02:00
Dave Reisner
ba4f28cc43 commitpkg: declare rsyncopts as an array
Signed-off-by: Dave Reisner <d@falconindy.com>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-18 10:11:27 +02:00
Lukas Fleischer
dc7b96e917 commitpkg: Fix leading whitespace in commit messages
Commit c51cc8d365 erroneously introduced a
tab character that is prepended to the body of each commit message. Fix
this by using C-style newline escape sequences which will avoid further
whitespace issues caused by re-indentation of code at this point.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-15 17:01:31 +02:00
31 changed files with 1507 additions and 878 deletions

14
.gitignore vendored
View File

@@ -1,2 +1,16 @@
*~
devtools-*.tar.gz
archbuild
archco
archrelease
archrm
bash_completion
checkpkg
commitpkg
finddeps
lddd
makechrootpkg
mkarchroot
rebuildpkgs
zsh_completion
find-libdeps

View File

@@ -1,4 +1,4 @@
V=0.9.26
V=20111220
PREFIX = /usr/local
@@ -11,7 +11,8 @@ BINPROGS = \
archbuild \
lddd \
finddeps \
rebuildpkgs
rebuildpkgs \
find-libdeps
SBINPROGS = \
mkarchroot \
@@ -24,7 +25,9 @@ CONFIGFILES = \
pacman-testing.conf \
pacman-staging.conf \
pacman-multilib.conf \
pacman-multilib-testing.conf
pacman-multilib-testing.conf \
pacman-kde-unstable.conf \
pacman-gnome-unstable.conf
COMMITPKG_LINKS = \
extrapkg \
@@ -35,7 +38,9 @@ COMMITPKG_LINKS = \
community-testingpkg \
community-stagingpkg \
multilibpkg \
multilib-testingpkg
multilib-testingpkg \
kde-unstablepkg \
gnome-unstablepkg
ARCHBUILD_LINKS = \
extra-i686-build \
@@ -45,9 +50,25 @@ ARCHBUILD_LINKS = \
staging-i686-build \
staging-x86_64-build \
multilib-build \
multilib-testing-build
multilib-testing-build \
kde-unstable-i686-build \
kde-unstable-x86_64-build \
gnome-unstable-i686-build \
gnome-unstable-x86_64-build
all:
all: $(BINPROGS) $(SBINPROGS) bash_completion zsh_completion
edit = sed -e "s|@pkgdatadir[@]|$(DESTDIR)$(PREFIX)/share/devtools|g"
%: %.in Makefile lib/common.sh
@echo "GEN $@"
@$(RM) "$@"
@m4 -P $@.in | $(edit) >$@
@chmod a-w "$@"
@chmod +x "$@"
clean:
rm -f $(BINPROGS) $(SBINPROGS) bash_completion zsh_completion
install:
install -dm0755 $(DESTDIR)$(PREFIX)/bin
@@ -58,7 +79,9 @@ install:
install -m0644 ${CONFIGFILES} $(DESTDIR)$(PREFIX)/share/devtools
for l in ${COMMITPKG_LINKS}; do ln -sf commitpkg $(DESTDIR)$(PREFIX)/bin/$$l; done
for l in ${ARCHBUILD_LINKS}; do ln -sf archbuild $(DESTDIR)$(PREFIX)/bin/$$l; done
ln -sf find-libdeps $(DESTDIR)$(PREFIX)/bin/find-libprovides
install -Dm0644 bash_completion $(DESTDIR)/etc/bash_completion.d/devtools
install -Dm0644 zsh_completion $(DESTDIR)$(PREFIX)/share/zsh/site-functions/_devtools
ln -sf archco $(DESTDIR)$(PREFIX)/bin/communityco
uninstall:
@@ -68,12 +91,15 @@ uninstall:
for l in ${COMMITPKG_LINKS}; do rm -f $(DESTDIR)$(PREFIX)/bin/$$l; done
for l in ${ARCHBUILD_LINKS}; do rm -f $(DESTDIR)$(PREFIX)/bin/$$l; done
rm $(DESTDIR)/etc/bash_completion.d/devtools
rm $(DESTDIR)$(PREFIX)/share/zsh/site-functions/_devtools
rm -f $(DESTDIR)$(PREFIX)/bin/communityco
rm -f $(DESTDIR)$(PREFIX)/bin/find-libprovides
dist:
git archive --format=tar --prefix=devtools-$(V)/ $(V) | gzip -9 > devtools-$(V).tar.gz
gpg --detach-sign --use-agent devtools-$(V).tar.gz
upload:
scp devtools-$(V).tar.gz gerolde.archlinux.org:/srv/ftp/other/devtools/
scp devtools-$(V).tar.gz devtools-$(V).tar.gz.sig gerolde.archlinux.org:/srv/ftp/other/devtools/
.PHONY: all install uninstall dist upload
.PHONY: all clean install uninstall dist upload

View File

@@ -1,67 +0,0 @@
#!/bin/bash
base_packages='base base-devel sudo'
cmd="$(basename "${0%-build}")"
if [ "${cmd%-*}" == 'multilib' ]; then
repo="${cmd}"
arch='x86_64'
base_packages+=' multilib-devel'
else
repo=${cmd%-*}
arch=${cmd##*-}
fi
chroots='/var/tmp/archbuild'
clean_first=false
usage() {
echo "usage $(basename "$0")"
echo ' -c Recreate the chroot before building'
echo ' -r <dir> Create chroots in this directory'
exit 1
}
while getopts 'cr:' arg; do
case "${arg}" in
c) clean_first=true ;;
r) chroots="$OPTARG" ;;
*) usage ;;
esac
done
if [ "$EUID" != '0' ]; then
echo 'This script must be run as root.'
exit 1
fi
if ${clean_first} || [ ! -d "${chroots}/${repo}-${arch}" ]; then
echo "Creating chroot for [${repo}] (${arch})..."
for copy in ${chroots}/${repo}-${arch}/*; do
[[ -d $copy ]] || continue
echo "Deleting chroot copy '$(basename "${copy}")'..."
# Lock the copy
exec 9>${copy}.lock
flock 9
{ type -P btrfs && btrfs subvolume delete ${copy}; } &>/dev/null
rm -rf ${copy}
done
exec 9>&-
rm -rf ${chroots}/${repo}-${arch}
mkdir -p ${chroots}/${repo}-${arch}
setarch ${arch} mkarchroot \
-C /usr/share/devtools/pacman-${repo}.conf \
-M /usr/share/devtools/makepkg-${arch}.conf \
${chroots}/${repo}-${arch}/root \
${base_packages}
else
setarch ${arch} mkarchroot \
-u \
${chroots}/${repo}-${arch}/root
fi
echo "Building in chroot for [${repo}] (${arch})..."
setarch ${arch} makechrootpkg -c -r ${chroots}/${repo}-${arch}

86
archbuild.in Normal file
View File

@@ -0,0 +1,86 @@
#!/bin/bash
m4_include(lib/common.sh)
# FIXME: temporary added curl until pacman 4.0 moves to [core]
base_packages=(base base-devel sudo curl)
cmd="${0##*/}"
if [[ "${cmd%%-*}" == 'multilib' ]]; then
repo="${cmd%-build}"
arch='x86_64'
base_packages+=(multilib-devel)
else
tag="${cmd%-build}"
repo=${tag%-*}
arch=${tag##*-}
fi
chroots='/var/tmp/archbuild'
clean_first=false
usage() {
echo "usage $cmd"
echo ' -c Recreate the chroot before building'
echo ' -r <dir> Create chroots in this directory'
exit 1
}
while getopts 'cr:' arg; do
case "${arg}" in
c) clean_first=true ;;
r) chroots="$OPTARG" ;;
*) usage ;;
esac
done
if [[ "$EUID" != '0' ]]; then
die 'This script must be run as root.'
fi
if ${clean_first} || [[ ! -d "${chroots}/${repo}-${arch}" ]]; then
msg "Creating chroot for [${repo}] (${arch})..."
for copy in "${chroots}/${repo}-${arch}"/*; do
[[ -d $copy ]] || continue
msg2 "Deleting chroot copy '$(basename "${copy}")'..."
# Lock the copy
exec 9>"${copy}.lock"
flock 9
{ type -P btrfs && btrfs subvolume delete "${copy}"; } &>/dev/null
rm -rf "${copy}"
done
exec 9>&-
# FIXME: temporary workaround until pacman 4.0 moves to [core]
if pacman -V | grep -q 'v4.' && ( [[ "$repo" == 'extra' || "$repo" == 'multilib' ]] ); then
pacman_conf=$(mktemp)
cp "@pkgdatadir@/pacman-${repo}.conf" "${pacman_conf}"
sed -r 's/^#(SigLevel = Never)/\1/' -i "${pacman_conf}"
else
pacman_conf="@pkgdatadir@/pacman-${repo}.conf"
fi
rm -rf "${chroots}/${repo}-${arch}"
mkdir -p "${chroots}/${repo}-${arch}"
setarch "${arch}" mkarchroot \
-C "${pacman_conf}" \
-M "@pkgdatadir@/makepkg-${arch}.conf" \
"${chroots}/${repo}-${arch}/root" \
"${base_packages[@]}"
# FIXME: temporary workaround until pacman 4.0 moves to [core]
if pacman -V | grep -q 'v4.' && ( [[ "$repo" == 'extra' || "$repo" == 'multilib' ]] ); then
cp "@pkgdatadir@/pacman-${repo}.conf" "${chroots}/${repo}-${arch}/root/etc/pacman.conf"
fi
else
setarch ${arch} mkarchroot \
-u \
-C "@pkgdatadir@/pacman-${repo}.conf" \
-M "@pkgdatadir@/makepkg-${arch}.conf" \
"${chroots}/${repo}-${arch}/root"
fi
msg "Building in chroot for [${repo}] (${arch})..."
exec setarch "${arch}" makechrootpkg -c -n -r "${chroots}/${repo}-${arch}"

9
archco → archco.in Executable file → Normal file
View File

@@ -1,9 +1,11 @@
#!/bin/bash
m4_include(lib/common.sh)
scriptname=${0##*/}
if [ "$1" = '' ]; then
echo 'Usage: '$scriptname' <package name> [<package name>]'
if [[ -z $1 ]]; then
echo 'Usage: '$scriptname' <package name>...'
exit 1
fi
@@ -13,8 +15,7 @@ case $scriptname in
communityco)
SVNURL="svn+ssh://aur.archlinux.org/srv/svn-packages";;
*)
echo "error: couldn't find svn url for $scriptname"
exit 1
die "Couldn't find svn url for $scriptname"
;;
esac

View File

@@ -1,56 +0,0 @@
#!/bin/bash
abort() {
echo ${1:-'archrelease: Cancelled'}
exit 1
}
if [ "$1" = '' ]; then
abort 'Usage: archrelease <repo>'
fi
# TODO: validate repo is really repo-arch
if [ ! -f PKGBUILD ]; then
abort 'archrelease: PKGBUILD not found'
fi
trunk=$(basename $(pwd))
# Normally this should be trunk, but it may be something
# such as 'gnome-unstable'
if [ "$(basename $(dirname $(pwd)))" == "repos" ]; then
abort 'archrelease: Should not be in repos dir (try from trunk/)'
fi
if [ ! -z "$(svn status -q)" ]; then
abort 'archrelease: You have not committed your changes yet!'
fi
echo -n "releasing package to ${1}..."
pushd .. >/dev/null
if [ -d "repos/${1}" ]; then
for file in $(svn ls "repos/${1}"); do
svn rm -q "repos/${1}/$file"
done
fi
if [ ! -d repos ]; then
mkdir repos
svn add -q repos
fi
if [ ! -d "repos/${1}" ]; then
mkdir "repos/${1}"
svn add -q "repos/${1}"
fi
known_files=$(svn ls "trunk")
for file in $known_files; do
if [ "$file" != "${file%/}" ]; then
abort "archrelease: subdirectories are not supported in package directories!"
fi
done
for file in $known_files; do
svn copy -q -r HEAD "trunk/$file" "repos/${1}/"
done
svn commit -q -m "archrelease: copy trunk to ${1}" || abort
popd >/dev/null
echo 'done'

64
archrelease.in Normal file
View File

@@ -0,0 +1,64 @@
#!/bin/bash
m4_include(lib/common.sh)
if [[ -z $1 ]]; then
echo 'Usage: archrelease <repo>...'
exit 1
fi
# TODO: validate repo is really repo-arch
if [[ ! -f PKGBUILD ]]; then
die 'archrelease: PKGBUILD not found'
fi
trunk=${PWD##*/}
# Normally this should be trunk, but it may be something
# such as 'gnome-unstable'
IFS='/' read -r -d '' -a parts <<< "$PWD"
if [[ "${parts[@]:(-2):1}" == "repos" ]]; then
die 'archrelease: Should not be in repos dir (try from trunk/)'
fi
unset parts
if [[ $(svn status -q) ]]; then
die 'archrelease: You have not committed your changes yet!'
fi
pushd .. >/dev/null
IFS=$'\n' read -r -d '' -a known_files < <(svn ls -r HEAD "$trunk")
for file in "${known_files[@]}"; do
if [[ ${file:(-1)} = '/' ]]; then
die "archrelease: subdirectories are not supported in package directories!"
fi
done
for tag in "$@"; do
stat_busy "Copying ${trunk} to ${tag}"
if [[ -d repos/$tag ]]; then
declare -a trash
trash=()
while read -r file; do
trash+=("repos/$tag/$file")
done < <(svn ls "repos/$tag")
[[ $trash ]] && svn rm -q "${trash[@]}"
else
mkdir -p "repos/$tag"
svn add --parents -q "repos/$tag"
fi
# copy all files at once from trunk to the subdirectory in repos/
svn copy -q -r HEAD ${known_files[@]/#/$trunk/} "repos/$tag/"
stat_done
done
stat_busy "Releasing package"
printf -v tag_list ", %s" "$@"; tag_list="${tag_list#, }"
svn commit -q -m "archrelease: copy ${trunk} to $tag_list" || abort
stat_done
popd >/dev/null

4
archrm → archrm.in Executable file → Normal file
View File

@@ -1,6 +1,8 @@
#!/bin/bash
if [ "$1" = '' ]; then
m4_include(lib/common.sh)
if [[ -z $1 ]]; then
echo 'Usage: archrm <path to checkout>'
exit 1
fi

View File

@@ -1,99 +0,0 @@
#!/bin/bash
# Source makepkg.conf; fail if it is not found
if [ -r '/etc/makepkg.conf' ]; then
source '/etc/makepkg.conf'
else
echo '/etc/makepkg.conf not found!'
exit 1
fi
# Source user-specific makepkg.conf overrides
if [ -r ~/.makepkg.conf ]; then
source ~/.makepkg.conf
fi
strip_url() {
echo $1 | sed 's|^.*://.*/||g'
}
if [ ! -f PKGBUILD ]; then
echo 'This must be run in the directory of a built package.'
exit 1
fi
. PKGBUILD
if [ "$arch" == 'any' ]; then
CARCH='any'
fi
STARTDIR=$(pwd)
TEMPDIR=$(mktemp -d /tmp/checkpkg-script.XXXX)
cd $TEMPDIR
for _pkgname in ${pkgname[@]}; do
if [ -z ${epoch} ] ; then
pkgfile=${_pkgname}-${pkgver}-${pkgrel}-${CARCH}${PKGEXT}
else
pkgfile=${_pkgname}-${epoch}:${pkgver}-${pkgrel}-${CARCH}${PKGEXT}
fi
if [ -f "$STARTDIR/$pkgfile" ]; then
ln -s "$STARTDIR/$pkgfile" "$pkgfile"
elif [ -f "$PKGDEST/$pkgfile" ]; then
ln -s "$PKGDEST/$pkgfile" "$pkgfile"
else
echo "File \"$pkgfile\" doesn't exist"
exit 1
fi
tmp=$(pacman -Spdd --noconfirm $_pkgname)
if [ $? -ne 0 ]; then
echo "Couldn't download previous package for $_pkgname."
exit 1
fi
pkgurl=$(echo $tmp | rev | cut -d ' ' -f 1 | rev)
oldpkg=$(strip_url $pkgurl)
if [ "$(basename $oldpkg)" = "$(basename $pkgfile)" ]; then
echo "The built package ($_pkgname) is the one in the repo right now!"
exit 1
fi
if [ ! -f $oldpkg ]; then
if echo $pkgurl | grep '^file:///' > /dev/null 2>&1; then
ln -s "${pkgurl#file://}" $(basename "${pkgurl#file://}")
elif [ -f "$PKGDEST/$oldpkg" ]; then
ln -s "$PKGDEST/$oldpkg" "$oldpkg"
elif [ -f "$STARTDIR/$oldpkg" ]; then
ln -s "$STARTDIR/$oldpkg" "$oldpkg"
else
wget --quiet $pkgurl
fi
fi
bsdtar tf $oldpkg > filelist-$_pkgname-old
bsdtar tf "$pkgfile" > filelist-$_pkgname
sort -o filelist-$_pkgname filelist-$_pkgname
sort -o filelist-$_pkgname-old filelist-$_pkgname-old
sdiff -s filelist-$_pkgname-old filelist-$_pkgname
if diff filelist-$_pkgname-old filelist-$_pkgname | grep '\.so' > /dev/null 2>&1; then
mkdir -p pkg
cd pkg
bsdtar xf ../"$pkgfile" > /dev/null
for i in $(diff ../filelist-$_pkgname-old ../filelist-$_pkgname | grep \> | grep '\.so' | awk '{print $2}'); do
echo "${i}: " "$(objdump -p $i | grep SONAME)"
done
cd ..
else
echo "No soname differences for $_pkgname."
fi
done
echo "Files saved to $TEMPDIR"

83
checkpkg.in Normal file
View File

@@ -0,0 +1,83 @@
#!/bin/bash
m4_include(lib/common.sh)
# Source makepkg.conf; fail if it is not found
if [[ -r '/etc/makepkg.conf' ]]; then
source '/etc/makepkg.conf'
else
die '/etc/makepkg.conf not found!'
fi
# Source user-specific makepkg.conf overrides
if [[ -r ~/.makepkg.conf ]]; then
source ~/.makepkg.conf
fi
if [[ ! -f PKGBUILD ]]; then
die 'This must be run in the directory of a built package.'
fi
. PKGBUILD
if [[ $arch == 'any' ]]; then
CARCH='any'
fi
STARTDIR=$(pwd)
TEMPDIR=$(mktemp -d --tmpdir checkpkg-script.XXXX)
cd "$TEMPDIR"
for _pkgname in "${pkgname[@]}"; do
pkgfile=${_pkgname}-$(get_full_version $_pkgname)-${CARCH}${PKGEXT}
if [[ -f "$STARTDIR/$pkgfile" ]]; then
ln -s "$STARTDIR/$pkgfile" "$pkgfile"
elif [[ -f "$PKGDEST/$pkgfile" ]]; then
ln -s "$PKGDEST/$pkgfile" "$pkgfile"
else
die "File \"$pkgfile\" doesn't exist"
fi
pkgurl=$(pacman -Spdd --print-format '%l' --noconfirm "$_pkgname")
if [[ $? -ne 0 ]]; then
die "Couldn't download previous package for $_pkgname."
fi
oldpkg=${pkgurl##*://*/}
if [[ ${oldpkg##*/} = ${pkgfile##*/} ]]; then
die "The built package ($_pkgname) is the one in the repo right now!"
fi
if [[ ! -f $oldpkg ]]; then
if [[ $pkgurl = file://* ]]; then
ln -s "${pkgurl#file://}" "${pkgurl##file://*/}"
elif [[ -f "$PKGDEST/$oldpkg" ]]; then
ln -s "$PKGDEST/$oldpkg" "$oldpkg"
elif [[ -f "$STARTDIR/$oldpkg" ]]; then
ln -s "$STARTDIR/$oldpkg" "$oldpkg"
else
wget --quiet "$pkgurl"
fi
fi
bsdtar tf "$oldpkg" | sort > "filelist-$_pkgname-old"
bsdtar tf "$pkgfile" | sort > "filelist-$_pkgname"
sdiff -s "filelist-$_pkgname-old" "filelist-$_pkgname"
if diff "filelist-$_pkgname-old" "filelist-$_pkgname" | grep '\.so' > /dev/null 2>&1; then
mkdir -p pkg
cd pkg
bsdtar xf ../"$pkgfile" > /dev/null
diff "../filelist-$_pkgname-old" "../filelist-$_pkgname" | awk '/>.*\.so/{$1 = ""; print $0}' | while read i; do
echo "${i}: " "$(objdump -p "$i" | grep SONAME)"
done
cd ..
else
msg "No soname differences for $_pkgname."
fi
done
msg "Files saved to $TEMPDIR"

202
commitpkg
View File

@@ -1,202 +0,0 @@
#!/bin/bash
abort() {
echo ${1:-'Cancelled'}
exit 1
}
getpkgfile() {
if [[ ${#} -ne 1 ]]; then
echo 'ERROR: No canonical package found!' >&2
exit 1
elif [ ! -f "${1}" ]; then
echo "ERROR: Package ${1} not found!" >&2
exit 1
fi
echo ${1}
}
##
# usage : get_full_version( $epoch, $pkgver, $pkgrel )
# return : full version spec, including epoch (if necessary), pkgver, pkgrel
##
get_full_version() {
if [[ $1 -eq 0 ]]; then
# zero epoch case, don't include it in version
echo $2-$3
else
echo $1:$2-$3
fi
}
# Source makepkg.conf; fail if it is not found
if [ -r '/etc/makepkg.conf' ]; then
source '/etc/makepkg.conf'
else
abort '/etc/makepkg.conf not found!'
fi
# Source user-specific makepkg.conf overrides
if [ -r ~/.makepkg.conf ]; then
. ~/.makepkg.conf
fi
cmd=$(basename "$0")
if [ ! -f PKGBUILD ]; then
abort 'No PKGBUILD file'
fi
. PKGBUILD
pkgbase=${pkgbase:-$pkgname}
case "$cmd" in
commitpkg)
if [ $# -eq 0 ]; then
abort 'usage: commitpkg <reponame> [-l limit] [-a arch] [commit message]'
fi
repo="$1"
shift
;;
*pkg)
repo="${cmd%pkg}"
;;
*)
abort 'usage: commitpkg <reponame> [-l limit] [-a arch] [commit message]'
;;
esac
case "$repo" in
core|extra|testing|staging)
server='gerolde.archlinux.org' ;;
community*|multilib*)
server='aur.archlinux.org' ;;
*)
server='gerolde.archlinux.org'
echo "Non-standard repository $repo in use, defaulting to server $server" ;;
esac
# check if all local source files are under version control
for s in "${source[@]}"; do
if [[ $s != *://* ]] && ! svn status -v "$s" | grep -q '^[ AMRX~]'; then
abort "$s is not under version control"
fi
done
# check if changelog and install files are under version control
for i in 'changelog' 'install'; do
filelist=$(sed -n "s/^[[:space:]]*$i=//p" PKGBUILD)
for file in $filelist; do
# evaluate any bash variables used
eval file=${file}
if ! svn status -v "${file}" | grep -q '^[ AMRX~]'; then
abort "${file} is not under version control"
fi
done
done
# see if any limit options were passed, we'll send them to rsync
rsyncopts='-e ssh -p --chmod=ug=rw,o=r -c -h -L --progress --partial -y'
if [ "$1" = '-l' ]; then
rsyncopts="$rsyncopts --bwlimit=$2"
shift 2
fi
if [ "$1" = "-a" ]; then
commit_arch=$2
shift 2
fi
if [ -n "$(svn status -q)" ]; then
echo -n 'committing changes to trunk...'
msgtemplate="upgpkg: $pkgbase $(get_full_version ${epoch:-0} $pkgver $pkgrel)
"
if [ -n "$1" ]; then
svn commit -q -m "${msgtemplate}${1}" || abort
else
msgfile="$(mktemp)"
echo "$msgtemplate" > "$msgfile"
if [ -n "$SVN_EDITOR" ]; then
$SVN_EDITOR "$msgfile"
elif [ -n "$VISUAL" ]; then
$VISUAL "$msgfile"
elif [ -n "$EDITOR" ]; then
$EDITOR "$msgfile"
else
vi "$msgfile"
fi
[ -s "$msgfile" ] || abort
svn commit -q -F "$msgfile" || abort
unlink "$msgfile"
fi
echo 'done'
fi
declare -a uploads
for _arch in ${arch[@]}; do
if [ -n "$commit_arch" ] && [ "${_arch}" != "$commit_arch" ]; then
echo "skipping ${_arch}"
continue
fi
for _pkgname in ${pkgname[@]}; do
fullver=$(get_full_version ${epoch:-0} $pkgver $pkgrel)
pkgfile=$(getpkgfile "$_pkgname-$fullver-${_arch}".pkg.tar.?z 2>/dev/null)
pkgdestfile=$(getpkgfile "$PKGDEST/$_pkgname-$fullver-${_arch}".pkg.tar.?z 2>/dev/null)
if [ -f "$pkgfile" ]; then
pkgfile="./$pkgfile"
elif [ -f "$pkgdestfile" ]; then
pkgfile="$pkgdestfile"
else
echo "skipping ${_arch}"
continue 2
fi
uploads+=("$pkgfile")
if [[ $SIGNPKG == 'y' ]]; then
echo "Signing package ${pkgfile}..."
if [[ -n $GPGKEY ]]; then
SIGNWITHKEY="-u ${GPGKEY}"
fi
gpg --detach-sign --use-agent ${SIGNWITHKEY} "${pkgfile}" || abort
fi
sigfile="${pkgfile}.sig"
if [ -f "${sigfile}" ]; then
uploads+=("$sigfile")
elif [[ $SIGNPKG == 'y' ]]; then
abort "Signature ${pkgfile}.sig was not found"
fi
done
archrelease $repo-${_arch} || abort
done
if [[ ${#uploads[*]} -gt 0 ]]; then
echo 'uploading all package and signature files'
rsync $rsyncopts "${uploads[@]}" "$server:staging/$repo/" || abort
fi
if [ "${arch[*]}" == 'any' ]; then
if [ -d ../repos/$repo-i686 -a -d ../repos/$repo-x86_64 ]; then
pushd ../repos/ >/dev/null
echo "removing $repo-i686 and $repo-x86_64..."
svn rm $repo-i686
svn rm $repo-x86_64
svn commit -q -m "removed $repo-i686 and $repo-x86_64 for $pkgname"
echo 'done'
popd >/dev/null
fi
else
if [ -d ../repos/$repo-any ]; then
pushd ../repos/ >/dev/null
echo "removing $repo-any..."
svn rm $repo-any
svn commit -q -m "removed $repo-any for $pkgname"
echo 'done'
popd >/dev/null
fi
fi

194
commitpkg.in Normal file
View File

@@ -0,0 +1,194 @@
#!/bin/bash
m4_include(lib/common.sh)
getpkgfile() {
if [[ ${#} -ne 1 ]]; then
die 'No canonical package found!'
elif [[ ! -f $1 ]]; then
die "Package ${1} not found!"
fi
echo ${1}
}
# Source makepkg.conf; fail if it is not found
if [[ -r '/etc/makepkg.conf' ]]; then
source '/etc/makepkg.conf'
else
die '/etc/makepkg.conf not found!'
fi
# Source user-specific makepkg.conf overrides
if [[ -r ~/.makepkg.conf ]]; then
. ~/.makepkg.conf
fi
cmd=${0##*/}
if [[ ! -f PKGBUILD ]]; then
die 'No PKGBUILD file'
fi
. PKGBUILD
pkgbase=${pkgbase:-$pkgname}
case "$cmd" in
commitpkg)
if (( $# == 0 )); then
die 'usage: commitpkg <reponame> [-l limit] [-a arch] [commit message]'
fi
repo="$1"
shift
;;
*pkg)
repo="${cmd%pkg}"
;;
*)
die 'usage: commitpkg <reponame> [-l limit] [-a arch] [commit message]'
;;
esac
case "$repo" in
core|extra|testing|staging|kde-unstable|gnome-unstable)
server='gerolde.archlinux.org' ;;
community*|multilib*)
server='aur.archlinux.org' ;;
*)
server='gerolde.archlinux.org'
msg "Non-standard repository $repo in use, defaulting to server $server" ;;
esac
# check if all local source files are under version control
for s in "${source[@]}"; do
if [[ $s != *://* ]] && ! svn status -v "$s" | grep -q '^[ AMRX~]'; then
die "$s is not under version control"
fi
done
# check if changelog and install files are under version control
for i in 'changelog' 'install'; do
while read -r file; do
# evaluate any bash variables used
eval file=\"$(sed 's/^\(['\''"]\)\(.*\)\1$/\2/' <<< "$file")\"
if ! svn status -v "${file}" | grep -q '^[ AMRX~]'; then
die "${file} is not under version control"
fi
done < <(sed -n "s/^[[:space:]]*$i=//p" PKGBUILD)
done
# see if any limit options were passed, we'll send them to rsync
rsyncopts=(-e ssh -p --chmod=ug=rw,o=r -c -h -L --progress --partial -y)
while getopts ':l:a:' flag; do
case $flag in
l) rsyncopts+=("--bwlimit=$2") ;;
a) commit_arch=$2 ;;
:) die "Option requires an argument -- '$OPTARG'" ;;
\?) die "Invalid option -- '$OPTARG'" ;;
esac
done
shift $(( OPTIND - 1 ))
if [[ -n $(svn status -q) ]]; then
msgtemplate="upgpkg: $pkgbase $(get_full_version)"$'\n\n'
if [[ -n $1 ]]; then
stat_busy 'Committing changes to trunk'
svn commit -q -m "${msgtemplate}${1}" || die
stat_done
else
msgfile="$(mktemp)"
echo "$msgtemplate" > "$msgfile"
if [[ -n $SVN_EDITOR ]]; then
$SVN_EDITOR "$msgfile"
elif [[ -n $VISUAL ]]; then
$VISUAL "$msgfile"
elif [[ -n $EDITOR ]]; then
$EDITOR "$msgfile"
else
vi "$msgfile"
fi
[[ -s $msgfile ]] || die
stat_busy 'Committing changes to trunk'
svn commit -q -F "$msgfile" || die
unlink "$msgfile"
stat_done
fi
fi
declare -a uploads
declare -a commit_arches
declare -a skip_arches
for _arch in ${arch[@]}; do
if [[ -n $commit_arch && ${_arch} != "$commit_arch" ]]; then
skip_arches+=($_arch)
continue
fi
for _pkgname in ${pkgname[@]}; do
fullver=$(get_full_version $_pkgname)
pkgfile=$(getpkgfile "$_pkgname-$fullver-${_arch}".pkg.tar.?z 2>/dev/null)
pkgdestfile=$(getpkgfile "$PKGDEST/$_pkgname-$fullver-${_arch}".pkg.tar.?z 2>/dev/null)
if [[ -f $pkgfile ]]; then
pkgfile="./$pkgfile"
elif [[ -f $pkgdestfile ]]; then
pkgfile="$pkgdestfile"
else
warning "Could not find ${pkgfile}. Skipping ${_arch}"
skip_arches+=($_arch)
continue 2
fi
uploads+=("$pkgfile")
sigfile="${pkgfile}.sig"
if [[ $SIGNPKG == 'y' && ! -f $sigfile ]]; then
msg "Signing package ${pkgfile}..."
if [[ -n $GPGKEY ]]; then
SIGNWITHKEY="-u ${GPGKEY}"
fi
gpg --detach-sign --use-agent ${SIGNWITHKEY} "${pkgfile}" || die
fi
if [[ -f $sigfile ]]; then
if ! gpg --verify "$sigfile" >/dev/null 2>&1; then
die "Signature ${pkgfile}.sig is incorrect!"
fi
uploads+=("$sigfile")
else
die "Signature ${pkgfile}.sig was not found"
fi
done
done
for _arch in ${arch[@]}; do
if ! in_array $_arch ${skip_arches[@]}; then
commit_arches+=($_arch)
fi
done
archrelease "${commit_arches[@]/#/$repo-}" || die
if [[ ${#uploads[*]} -gt 0 ]]; then
msg 'Uploading all package and signature files'
rsync "${rsyncopts[@]}" "${uploads[@]}" "$server:staging/$repo/" || die
fi
if [[ "${arch[*]}" == 'any' ]]; then
if [[ -d ../repos/$repo-i686 && -d ../repos/$repo-x86_64 ]]; then
pushd ../repos/ >/dev/null
stat_busy "Removing $repo-i686 and $repo-x86_64"
svn rm -q $repo-i686
svn rm -q $repo-x86_64
svn commit -q -m "Removed $repo-i686 and $repo-x86_64 for $pkgname"
stat_done
popd >/dev/null
fi
else
if [[ -d ../repos/$repo-any ]]; then
pushd ../repos/ >/dev/null
stat_busy "Removing $repo-any"
svn rm -q $repo-any
svn commit -q -m "Removed $repo-any for $pkgname"
stat_done
popd >/dev/null
fi
fi

86
find-libdeps.in Normal file
View File

@@ -0,0 +1,86 @@
#!/bin/bash
m4_include(lib/common.sh)
set -e
IGNORE_INTERNAL=0
if [[ $1 = "--ignore-internal" ]]; then
IGNORE_INTERNAL=1
shift
fi
script_mode=${0##*/find-lib}
case $script_mode in
deps|provides) true;;
*) die "Unknown mode $script_mode" ;;
esac
if [[ -z $1 ]]; then
echo "${0##*/} [options] <package file|extracted package dir>"
echo "Options:"
echo " --ignore-internal ignore internal libraries"
exit 1
fi
if [[ -d $1 ]]; then
pushd $1 >/dev/null
else
setup_workdir
case ${script_mode} in
deps) bsdtar -C $WORKDIR -xf "$1";;
provides) bsdtar -C $WORKDIR -xf "$1" --include="*.so*";;
esac
pushd $WORKDIR >/dev/null
fi
process_sofile() {
# extract the library name: libfoo.so
soname="${sofile%%\.so\.*}.so"
# extract the major version: 1
soversion="${sofile##*\.so\.}"
if [[ "$soversion" = "$sofile" ]] && (($IGNORE_INTERNAL)); then
continue
fi
if ! in_array "${soname}=${soversion}-${soarch}" ${soobjects[@]}; then
# libfoo.so=1-64
echo "${soname}=${soversion}-${soarch}"
soobjects=(${soobjects[@]} "${soname}=${soversion}-${soarch}")
fi
}
case $script_mode in
deps) find_args="-perm -u+x";;
provides) find_args="-name *.so*";;
esac
find . -type f $find_args | while read filename; do
if [[ $script_mode = "provides" ]]; then
# ignore if we don't have a shared object
if ! LC_ALL=C readelf -h "$filename" 2>/dev/null | grep -q '.*Type:.*DYN (Shared object file).*'; then
continue
fi
fi
# get architecture of the file; if soarch is empty it's not an ELF binary
soarch=$(LC_ALL=C readelf -h "$filename" 2>/dev/null | sed -n 's/.*Class.*ELF\(32\|64\)/\1/p')
[[ -n $soarch ]] || continue
if [[ $script_mode = "provides" ]]; then
# get the string binaries link to: libfoo.so.1.2 -> libfoo.so.1
sofile=$(LC_ALL=C readelf -d "$filename" 2>/dev/null | sed -n 's/.*Library soname: \[\(.*\)\].*/\1/p')
[[ -z $sofile" ]] && sofile="${filename##*/}"
process_sofile
elif [[ $script_mode = "deps" ]]; then
# process all libraries needed by the binary
for sofile in $(LC_ALL=C readelf -d "$filename" 2>/dev/null | sed -nr 's/.*Shared library: \[(.*)\].*/\1/p'); do
process_sofile
done
fi
done
popd >/dev/null

33
finddeps → finddeps.in Executable file → Normal file
View File

@@ -3,44 +3,37 @@
# finddeps - find packages that depend on a given depname
#
if [ "$1" = '' ]; then
m4_include(lib/common.sh)
match=$1
if [[ -z $match ]]; then
echo 'usage: finddeps <depname>'
echo ''
echo 'Find packages that depend on a given depname.'
echo 'Run this script from the top-level directory of your ABS tree.'
echo ''
exit 0
exit 1
fi
match=$1
tld=$(pwd)
for d in $(find . -type d); do
cd $d
if [ -f PKGBUILD ]; then
unset pkgname depends makedepends
. PKGBUILD
find . -type d | while read d; do
if [[ -f "$d/PKGBUILD" ]]; then
unset pkgname depends makedepends optdepends
. "$d/PKGBUILD"
for dep in "${depends[@]}"; do
# lose the version comparator, if any
depname=${dep%%[<>=]*}
if [ "$depname" = "$match" ]; then
echo "$d (depends)"
fi
[[ $depname = $match ]] && echo "$d (depends)"
done
for dep in "${makedepends[@]}"; do
# lose the version comparator, if any
depname=${dep%%[<>=]*}
if [ "$depname" = "$match" ]; then
echo "$d (makedepends)"
fi
[[ $depname = $match ]] && echo "$d (makedepends)"
done
for dep in "${optdepends[@]/:*}"; do
# lose the version comaparator, if any
depname=${dep%%[<>=]*}
if [ "$depname" = "$match" ]; then
echo "$d (optdepends)"
fi
[[ $depname = $match ]] && echo "$d (optdepends)"
done
fi
cd $tld
done

16
lddd → lddd.in Executable file → Normal file
View File

@@ -1,20 +1,22 @@
#!/bin/sh
#!/bin/bash
#
# lddd - find broken library links on your machine
#
m4_include(lib/common.sh)
ifs=$IFS
IFS="${IFS}:"
libdirs="/lib /usr/lib /usr/local/lib $(cat /etc/ld.so.conf.d/*)"
extras=
TEMPDIR=$(mktemp -d /tmp/lddd-script.XXXX)
TEMPDIR=$(mktemp -d --tmpdir lddd-script.XXXX)
echo 'Go out and drink some tea, this will take a while :) ...'
msg 'Go out and drink some tea, this will take a while :) ...'
# Check ELF binaries in the PATH and specified dir trees.
for tree in $PATH $libdirs $extras; do
echo DIR $tree
msg2 "DIR $tree"
# Get list of files in tree.
files=$(find $tree -type f ! -name '*.a' ! -name '*.la' ! -name '*.py*' ! -name '*.txt' ! -name '*.h' ! -name '*.ttf' ! \
@@ -25,9 +27,9 @@ for tree in $PATH $libdirs $extras; do
-name '*.mcopclass' ! -name '*.mcoptype')
IFS=$ifs
for i in $files; do
if [ $(file $i | grep -c 'ELF') -ne 0 ]; then
if (( $(file $i | grep -c 'ELF') != 0 )); then
# Is an ELF binary.
if [ $(ldd $i 2>/dev/null | grep -c 'not found') -ne 0 ]; then
if (( $(ldd $i 2>/dev/null | grep -c 'not found') != 0 )); then
# Missing lib.
echo "$i:" >> $TEMPDIR/raw.txt
ldd $i 2>/dev/null | grep 'not found' >> $TEMPDIR/raw.txt
@@ -43,4 +45,4 @@ done
# clean list
sort -u $TEMPDIR/pacman.txt >> $TEMPDIR/possible-rebuilds.txt
echo "Files saved to $TEMPDIR"
msg "Files saved to $TEMPDIR"

124
lib/common.sh Normal file
View File

@@ -0,0 +1,124 @@
# Avoid any encoding problems
export LANG=C
# check if messages are to be printed using color
unset ALL_OFF BOLD BLUE GREEN RED YELLOW
if [[ -t 2 ]]; then
# 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[1;0m"
BOLD="\e[1;1m"
BLUE="${BOLD}\e[1;34m"
GREEN="${BOLD}\e[1;32m"
RED="${BOLD}\e[1;31m"
YELLOW="${BOLD}\e[1;33m"
fi
fi
readonly ALL_OFF BOLD BLUE GREEN RED YELLOW
plain() {
local mesg=$1; shift
printf "${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
}
msg() {
local mesg=$1; shift
printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
}
msg2() {
local mesg=$1; shift
printf "${BLUE} ->${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
}
warning() {
local mesg=$1; shift
printf "${YELLOW}==> WARNING:${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
}
error() {
local mesg=$1; shift
printf "${RED}==> ERROR:${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
}
stat_busy() {
local mesg=$1; shift
printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" >&2
}
stat_done() {
printf "${BOLD}done${ALL_OFF}\n" >&2
}
setup_workdir() {
[[ -z $WORKDIR ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX")
}
cleanup() {
trap - EXIT INT QUIT TERM
[[ -n $WORKDIR ]] && rm -rf "$WORKDIR"
[[ $1 ]] && exit $1
}
abort() {
msg 'Aborting...'
cleanup 0
}
die() {
error "$*"
cleanup 1
}
trap abort INT QUIT TERM HUP
trap 'cleanup 0' EXIT
##
# usage : in_array( $needle, $haystack )
# return : 0 - found
# 1 - not found
##
in_array() {
local needle=$1; shift
local item
for item in "$@"; do
[[ $item = $needle ]] && return 0 # Found
done
return 1 # Not Found
}
##
# usage : get_full_version( [$pkgname] )
# return : full version spec, including epoch (if necessary), pkgver, pkgrel
##
get_full_version() {
# set defaults if they weren't specified in buildfile
pkgbase=${pkgbase:-${pkgname[0]}}
epoch=${epoch:-0}
if [[ -z $1 ]]; then
if [[ $epoch ]] && (( ! $epoch )); then
echo $pkgver-$pkgrel
else
echo $epoch:$pkgver-$pkgrel
fi
else
for i in pkgver pkgrel epoch; do
local indirect="${i}_override"
eval $(declare -f package_$1 | sed -n "s/\(^[[:space:]]*$i=\)/${i}_override=/p")
[[ -z ${!indirect} ]] && eval ${indirect}=\"${!i}\"
done
if (( ! $epoch_override )); then
echo $pkgver_override-$pkgrel_override
else
echo $epoch_override:$pkgver_override-$pkgrel_override
fi
fi
}

View File

@@ -1,305 +0,0 @@
#!/bin/bash
# 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; version 2 of the License.
#
# 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.
FORCE='n'
RUN=''
MAKEPKG_ARGS='-s --noconfirm'
REPACK=''
WORKDIR=$PWD
update_first='0'
clean_first='0'
install_pkg=''
add_to_db=0
chrootdir=''
APPNAME=$(basename "${0}")
default_copy=$USER
[[ -n $SUDO_USER ]] && default_copy=$SUDO_USER
[[ -z $default_copy || $default_copy = root ]] && default_copy=copy
usage() {
echo "usage ${APPNAME} [options] -r <chrootdir> [--] [makepkg args]"
echo ' Run this script in a PKGBUILD dir to build a package inside a'
echo ' clean chroot. All unrecognized arguments passed to this script'
echo ' will be passed to makepkg.'
echo ''
echo ' The chroot dir consists of the following directories:'
echo ' <chrootdir>/{root, copy} but only "root" is required'
echo ' by default. The working copy will be created as needed'
echo ''
echo 'The chroot "root" directory must be created via the following'
echo 'command:'
echo ' mkarchroot <chrootdir>/root base base-devel sudo'
echo ''
echo "Default makepkg args: $MAKEPKG_ARGS"
echo ''
echo 'Flags:'
echo '-h This help'
echo '-c Clean the chroot before building'
echo '-u Update the working copy of the chroot before building'
echo ' This is useful for rebuilds without dirtying the pristine'
echo ' chroot'
echo '-d Add the package to a local db at /repo after building'
echo '-r <dir> The chroot dir to use'
echo '-I <pkg> Install a package into the working copy of the chroot'
echo '-l <copy> The directory to use as the working copy of the chroot'
echo ' Useful for maintaining multiple copies.'
echo " Default: $default_copy"
exit 1
}
while getopts 'hcudr:I:l:' arg; do
case "${arg}" in
h) usage ;;
c) clean_first=1 ;;
u) update_first=1 ;;
d) add_to_db=1 ;;
r) chrootdir="$OPTARG" ;;
I) install_pkg="$OPTARG" ;;
l) copy="$OPTARG" ;;
*) MAKEPKG_ARGS="$MAKEPKG_ARGS -$arg $OPTARG" ;;
esac
done
# Canonicalize chrootdir, getting rid of trailing /
chrootdir=$(readlink -e "$chrootdir")
if [[ ${copy:0:1} = "/" ]]; then
copydir=$copy
else
[[ -z $copy ]] && copy=$default_copy
copydir="$chrootdir/$copy"
fi
# Pass all arguments after -- right to makepkg
MAKEPKG_ARGS="$MAKEPKG_ARGS ${*:$OPTIND}"
# See if -R was passed to makepkg
for arg in ${*:$OPTIND}; do
if [ "$arg" = '-R' ]; then
REPACK=1
break;
fi
done
if [ "$EUID" != '0' ]; then
echo 'This script must be run as root.'
exit 1
fi
if [ ! -f PKGBUILD -a -z "$install_pkg" ]; then
echo 'This must be run in a directory containing a PKGBUILD.'
exit 1
fi
if [ ! -d "$chrootdir" ]; then
echo "No chroot dir defined, or invalid path '$chrootdir'"
exit 1
fi
if [ ! -d "$chrootdir/root" ]; then
echo 'Missing chroot dir root directory.'
echo "Try using: mkarchroot $chrootdir/root base base-devel sudo"
usage
fi
umask 0022
# Lock the chroot we want to use. We'll keep this lock until we exit.
# Note this is the same FD number as in mkarchroot
exec 9>"$copydir.lock"
if ! flock -n 9; then
echo -n "locking chroot copy '$copy'..."
flock 9
echo "done"
fi
if [ ! -d "$copydir" -o "$clean_first" -eq "1" ]; then
# Get a read lock on the root chroot to make
# sure we don't clone a half-updated chroot
exec 8>"$chrootdir/root.lock"
if ! flock -sn 8; then
echo -n "locking clean chroot..."
flock -s 8
echo "done"
fi
echo -n 'creating clean working copy...'
use_rsync=false
if type -P btrfs >/dev/null; then
[ -d $copydir ] && btrfs subvolume delete "$copydir" &>/dev/null
btrfs subvolume snapshot "$chrootdir/root" "$copydir" &>/dev/null || use_rsync=true
else
use_rsync=true
fi
if $use_rsync; then
mkdir -p "$copydir"
rsync -a --delete -q -W -x "$chrootdir/root/" "$copydir"
fi
echo 'done'
# Drop the read lock again
exec 8>&-
fi
if [ -n "$install_pkg" ]; then
pkgname="$(basename "$install_pkg")"
cp "$install_pkg" "$copydir/$pkgname"
mkarchroot -r "pacman -U /$pkgname --noconfirm" "$copydir"
ret=$?
rm "$copydir/$pkgname"
# Exit early, we've done all we need to
exit $ret
fi
if [ $update_first -eq 1 ]; then
mkarchroot -u "$copydir"
fi
[ -d "$copydir/build" ] || mkdir "$copydir/build"
if [ "$REPACK" != "1" ]; then
# Remove anything in there UNLESS -R (repack) was passed to makepkg
rm -rf "$copydir/build/"*
fi
# Read .makepkg.conf even if called via sudo
if [ -n "${SUDO_USER}" ]; then
makepkg_conf="/$(eval echo ~${SUDO_USER})/.makepkg.conf"
else
makepkg_conf="~/.makepkg.conf"
fi
# Get SRC/PKGDEST from makepkg.conf
if [ -f "${makepkg_conf}" ]; then
eval $(grep '^SRCDEST=' "${makepkg_conf}")
eval $(grep '^PKGDEST=' "${makepkg_conf}")
eval $(grep '^MAKEFLAGS=' "${makepkg_conf}")
eval $(grep '^PACKAGER=' "${makepkg_conf}")
fi
[ -z "${SRCDEST}" ] && eval $(grep '^SRCDEST=' /etc/makepkg.conf)
[ -z "${PKGDEST}" ] && eval $(grep '^PKGDEST=' /etc/makepkg.conf)
[ -d "$copydir/pkgdest" ] || mkdir "$copydir/pkgdest"
if ! grep 'PKGDEST="/pkgdest"' "$copydir/etc/makepkg.conf" >/dev/null 2>&1; then
echo 'PKGDEST="/pkgdest"' >> "$copydir/etc/makepkg.conf"
fi
[ -d "$copydir/srcdest" ] || mkdir "$copydir/srcdest"
if ! grep 'SRCDEST="/srcdest"' "$copydir/etc/makepkg.conf" >/dev/null 2>&1; then
echo 'SRCDEST="/srcdest"' >> "$copydir/etc/makepkg.conf"
fi
[ -z "${MAKEFLAGS}" ] && eval $(grep '^MAKEFLAGS=' /etc/makepkg.conf)
if [ -n "${MAKEFLAGS}" ]; then
sed -i '/^MAKEFLAGS=/d' "$copydir/etc/makepkg.conf"
echo "MAKEFLAGS='${MAKEFLAGS}'" >> "$copydir/etc/makepkg.conf"
fi
[ -z "${PACKAGER}" ] && eval $(grep '^PACKAGER=' /etc/makepkg.conf)
if [ -n "${PACKAGER}" ]; then
sed -i '/^PACKAGER=/d' "$copydir/etc/makepkg.conf"
echo "PACKAGER='${PACKAGER}'" >> "$copydir/etc/makepkg.conf"
fi
# Set target CARCH as it might be used within the PKGBUILD to select correct sources
eval $(grep '^CARCH=' "$copydir/etc/makepkg.conf")
export CARCH
# Copy PKGBUILD and sources
source=($(. PKGBUILD; echo ${source[@]}))
cp PKGBUILD "$copydir/build/"
for f in ${source[@]}; do
basef=$(echo $f | sed 's|::.*||' | sed 's|^.*://.*/||g')
if [ -f "$basef" ]; then
cp "$basef" "$copydir/srcdest/"
elif [ -f "$SRCDEST/$basef" ]; then
cp "$SRCDEST/$basef" "$copydir/srcdest/"
fi
done
( . PKGBUILD
for i in 'changelog' 'install'; do
filelist=$(sed -n "s/^[[:space:]]*$i=//p" PKGBUILD)
for file in $filelist; do
# evaluate any bash variables used
eval file=${file}
if [[ -f "$file" ]]; then
cp "$file" "$copydir/build/"
fi
done
done
)
chown -R nobody "$copydir/build"
chown -R nobody "$copydir/srcdest"
chown -R nobody "$copydir/pkgdest"
echo 'nobody ALL = NOPASSWD: /usr/bin/pacman' > "$copydir/etc/sudoers.d/nobody-pacman"
chmod 440 "$copydir/etc/sudoers.d/nobody-pacman"
#This is a little gross, but this way the script is recreated every time in the
#working copy
(cat <<EOF
#!/bin/bash
export LANG=C
cd /build
export HOME=/build
sudo -u nobody makepkg $MAKEPKG_ARGS || touch BUILD_FAILED
[ -f BUILD_FAILED ] && exit 1
which namcap &>/dev/null && namcap /build/PKGBUILD /pkgdest/*.pkg.tar.* > /build/namcap.log
exit 0
EOF
) > "$copydir/chrootbuild"
chmod +x "$copydir/chrootbuild"
if mkarchroot -r "/chrootbuild" "$copydir"; then
for pkgfile in "${copydir}"/pkgdest/*.pkg.tar.*; do
[ -e "$pkgfile" ] || continue
if [ "$add_to_db" -eq "1" ]; then
mkdir -p "${copydir}/repo"
pushd "${copydir}/repo" >/dev/null
cp "$pkgfile" .
repo-add repo.db.tar.gz "$(basename "$pkgfile")"
popd >/dev/null
fi
if [ -d "$PKGDEST" ]; then
mv "$pkgfile" "${PKGDEST}"
else
mv "$pkgfile" "${WORKDIR}"
fi
done
for l in "${copydir}"/build/{namcap,*-{build,check,package,package_*}}.log; do
[ -f "$l" ] && mv "$l" "${WORKDIR}"
done
else
#just in case. We returned 1, make sure we fail
touch "${copydir}/build/BUILD_FAILED"
fi
for f in "${copydir}"/srcdest/*; do
[ -e "$f" ] || continue
if [ -d "$SRCDEST" ]; then
mv "$f" "${SRCDEST}"
else
mv "$f" "${WORKDIR}"
fi
done
if [ -e "${copydir}/build/BUILD_FAILED" ]; then
echo "Build failed, check $copydir/build"
rm "${copydir}/build/BUILD_FAILED"
exit 1
fi

316
makechrootpkg.in Normal file
View File

@@ -0,0 +1,316 @@
#!/bin/bash
# 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; version 2 of the License.
#
# 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.
m4_include(lib/common.sh)
shopt -s nullglob
makepkg_args='-s --noconfirm -L'
repack=false
update_first=false
clean_first=false
install_pkg=
add_to_db=false
run_namcap=false
chrootdir=
default_copy=$USER
[[ -n $SUDO_USER ]] && default_copy=$SUDO_USER
[[ -z $default_copy || $default_copy = root ]] && default_copy=copy
usage() {
echo "usage ${0##*/} [options] -r <chrootdir> [--] [makepkg args]"
echo ' Run this script in a PKGBUILD dir to build a package inside a'
echo ' clean chroot. All unrecognized arguments passed to this script'
echo ' will be passed to makepkg.'
echo ''
echo ' The chroot dir consists of the following directories:'
echo ' <chrootdir>/{root, copy} but only "root" is required'
echo ' by default. The working copy will be created as needed'
echo ''
echo 'The chroot "root" directory must be created via the following'
echo 'command:'
echo ' mkarchroot <chrootdir>/root base base-devel sudo'
echo ''
echo "Default makepkg args: $makepkg_args"
echo ''
echo 'Flags:'
echo '-h This help'
echo '-c Clean the chroot before building'
echo '-u Update the working copy of the chroot before building'
echo ' This is useful for rebuilds without dirtying the pristine'
echo ' chroot'
echo '-d Add the package to a local db at /repo after building'
echo '-r <dir> The chroot dir to use'
echo '-I <pkg> Install a package into the working copy of the chroot'
echo '-l <copy> The directory to use as the working copy of the chroot'
echo ' Useful for maintaining multiple copies.'
echo '-n Run namcap on the package'
echo " Default: $default_copy"
exit 1
}
while getopts 'hcudr:I:l:n' arg; do
case "$arg" in
h) usage ;;
c) clean_first=true ;;
u) update_first=true ;;
d) add_to_db=true ;;
r) chrootdir="$OPTARG" ;;
I) install_pkg="$OPTARG" ;;
l) copy="$OPTARG" ;;
n) run_namcap=true ;;
*) makepkg_args="$makepkg_args -$arg $OPTARG" ;;
esac
done
# Canonicalize chrootdir, getting rid of trailing /
chrootdir=$(readlink -e "$chrootdir")
if [[ ${copy:0:1} = / ]]; then
copydir=$copy
else
[[ -z $copy ]] && copy=$default_copy
copydir="$chrootdir/$copy"
fi
# Pass all arguments after -- right to makepkg
makepkg_args="$makepkg_args ${*:$OPTIND}"
# See if -R was passed to makepkg
for arg in ${*:$OPTIND}; do
if [[ $arg = -R ]]; then
repack=true
break
fi
done
if (( EUID )); then
die 'This script must be run as root.'
fi
if [[ ! -f PKGBUILD && -z $install_pkg ]]; then
die 'This must be run in a directory containing a PKGBUILD.'
fi
if [[ ! -d $chrootdir ]]; then
die "No chroot dir defined, or invalid path '$chrootdir'"
fi
if [[ ! -d $chrootdir/root ]]; then
die "Missing chroot dir root directory. Try using: mkarchroot $chrootdir/root base base-devel sudo"
fi
umask 0022
# Lock the chroot we want to use. We'll keep this lock until we exit.
# Note this is the same FD number as in mkarchroot
exec 9>"$copydir.lock"
if ! flock -n 9; then
stat_busy "Locking chroot copy '$copy'"
flock 9
stat_done
fi
if [[ ! -d $copydir ]] || $clean_first; then
# Get a read lock on the root chroot to make
# sure we don't clone a half-updated chroot
exec 8>"$chrootdir/root.lock"
if ! flock -sn 8; then
stat_busy "Locking clean chroot"
flock -s 8
stat_done
fi
stat_busy 'Creating clean working copy'
use_rsync=false
if type -P btrfs >/dev/null; then
[[ -d $copydir ]] && btrfs subvolume delete "$copydir" &>/dev/null
btrfs subvolume snapshot "$chrootdir/root" "$copydir" &>/dev/null ||
use_rsync=true
else
use_rsync=true
fi
if $use_rsync; then
mkdir -p "$copydir"
rsync -a --delete -q -W -x "$chrootdir/root/" "$copydir"
fi
stat_done
# Drop the read lock again
exec 8>&-
fi
if [[ -n $install_pkg ]]; then
pkgname="${install_pkg##*/}"
cp "$install_pkg" "$copydir/$pkgname"
mkarchroot -r "pacman -U /$pkgname --noconfirm" "$copydir"
ret=$?
rm "$copydir/$pkgname"
# Exit early, we've done all we need to
exit $ret
fi
$update_first && mkarchroot -u "$copydir"
mkdir -p "$copydir/build"
# Remove anything in there UNLESS -R (repack) was passed to makepkg
$repack || rm -rf "$copydir"/build/*
# Read .makepkg.conf and .gnupg/pubring.gpg even if called via sudo
if [[ -n $SUDO_USER ]]; then
SUDO_HOME="$(eval echo ~$SUDO_USER)"
makepkg_conf="$SUDO_HOME/.makepkg.conf"
if [[ -r "$SUDO_HOME/.gnupg/pubring.gpg" ]]; then
install -D "$SUDO_HOME/.gnupg/pubring.gpg" "$copydir/build/.gnupg/pubring.gpg"
fi
else
makepkg_conf="$HOME/.makepkg.conf"
if [[ -r "$HOME/.gnupg/pubring.gpg" ]]; then
install -D "$HOME/.gnupg/pubring.gpg" "$copydir/build/.gnupg/pubring.gpg"
fi
fi
# Get SRC/PKGDEST from makepkg.conf
if [[ -f $makepkg_conf ]]; then
eval $(grep '^SRCDEST=' "$makepkg_conf")
eval $(grep '^PKGDEST=' "$makepkg_conf")
eval $(grep '^MAKEFLAGS=' "$makepkg_conf")
eval $(grep '^PACKAGER=' "$makepkg_conf")
fi
[[ -z $SRCDEST ]] && eval $(grep '^SRCDEST=' /etc/makepkg.conf)
[[ -z $PKGDEST ]] && eval $(grep '^PKGDEST=' /etc/makepkg.conf)
[[ -z $MAKEFLAGS ]] && eval $(grep '^MAKEFLAGS=' /etc/makepkg.conf)
[[ -z $PACKAGER ]] && eval $(grep '^PACKAGER=' /etc/makepkg.conf)
# Use PKGBUILD directory if PKGDEST or SRCDEST don't exist
[[ -d $PKGDEST ]] || PKGDEST=.
[[ -d $SRCDEST ]] || SRCDEST=.
mkdir -p "$copydir/pkgdest"
if ! grep -q 'PKGDEST="/pkgdest"' "$copydir/etc/makepkg.conf"; then
echo 'PKGDEST="/pkgdest"' >> "$copydir/etc/makepkg.conf"
fi
mkdir -p "$copydir/srcdest"
if ! grep -q 'SRCDEST="/srcdest"' "$copydir/etc/makepkg.conf"; then
echo 'SRCDEST="/srcdest"' >> "$copydir/etc/makepkg.conf"
fi
if [[ -n $MAKEFLAGS ]]; then
sed -i '/^MAKEFLAGS=/d' "$copydir/etc/makepkg.conf"
echo "MAKEFLAGS='${MAKEFLAGS}'" >> "$copydir/etc/makepkg.conf"
fi
if [[ -n $PACKAGER ]]; then
sed -i '/^PACKAGER=/d' "$copydir/etc/makepkg.conf"
echo "PACKAGER='${PACKAGER}'" >> "$copydir/etc/makepkg.conf"
fi
# Set target CARCH as it might be used within the PKGBUILD to select correct sources
eval $(grep '^CARCH=' "$copydir/etc/makepkg.conf")
export CARCH
# Copy PKGBUILD and sources
cp PKGBUILD "$copydir/build/"
(
source PKGBUILD
for file in "${source[@]}"; do
file="${file%%::*}"
file="${file##*://*/}"
if [[ -f $file ]]; then
cp "$file" "$copydir/srcdest/"
elif [[ -f $SRCDEST/$file ]]; then
cp "$SRCDEST/$file" "$copydir/srcdest/"
fi
done
# Find all changelog and install files, even inside functions
for i in 'changelog' 'install'; do
while read -r file; do
# evaluate any bash variables used
eval file=\"$(sed 's/^\(['\''"]\)\(.*\)\1$/\2/' <<< "$file")\"
[[ -f $file ]] && cp "$file" "$copydir/build/"
done < <(sed -n "s/^[[:space:]]*$i=//p" PKGBUILD)
done
)
chown -R nobody "$copydir"/{build,pkgdest,srcdest}
cat > "$copydir/etc/sudoers.d/nobody-pacman" <<EOF
Defaults env_keep += "HOME"
nobody ALL = NOPASSWD: /usr/bin/pacman
EOF
chmod 440 "$copydir/etc/sudoers.d/nobody-pacman"
# Set this system wide as makepkg will source /etc/profile before calling build()
echo 'LANG=C' > "$copydir/etc/locale.conf"
# This is a little gross, but this way the script is recreated every time in the
# working copy
cat >"$copydir/chrootbuild" <<EOF
#!/bin/bash
. /etc/profile
export LANG=C
export HOME=/build
cd /build
sudo -u nobody makepkg $makepkg_args || touch BUILD_FAILED
[[ -f BUILD_FAILED ]] && exit 1
if $run_namcap; then
pacman -S --needed --noconfirm namcap
for pkgfile in /build/PKGBUILD /pkgdest/*.pkg.tar.?z; do
echo "Checking \${pkgfile##*/}"
namcap "\$pkgfile" 2>&1 | tee "/build/\${pkgfile##*/}-namcap.log"
done
fi
exit 0
EOF
chmod +x "$copydir/chrootbuild"
if mkarchroot -r "/chrootbuild" "$copydir"; then
for pkgfile in "$copydir"/pkgdest/*.pkg.tar.?z; do
if $add_to_db; then
mkdir -p "$copydir/repo"
pushd "$copydir/repo" >/dev/null
cp "$pkgfile" .
repo-add repo.db.tar.gz "${pkgfile##*/}"
popd >/dev/null
fi
mv "$pkgfile" "$PKGDEST"
done
for l in "$copydir"/build/*-{build,check,namcap,package,package_*}.log; do
[[ -f $l ]] && mv "$l" .
done
else
# Just in case. We returned 1, make sure we fail
touch "$copydir/build/BUILD_FAILED"
fi
for f in "$copydir"/srcdest/*; do
mv "$f" "$SRCDEST"
done
if [[ -e $copydir/build/BUILD_FAILED ]]; then
rm "$copydir/build/BUILD_FAILED"
die "Build failed, check $copydir/build"
fi

View File

@@ -8,16 +8,16 @@
#
#-- The download utilities that makepkg should use to acquire sources
# Format: 'protocol::agent'
DLAGENTS=('ftp::/usr/bin/wget -c --passive-ftp -t 3 --waitretry=3 -O %o %u'
'http::/usr/bin/wget -c -t 3 --waitretry=3 -O %o %u'
'https::/usr/bin/wget -c -t 3 --waitretry=3 --no-check-certificate -O %o %u'
DLAGENTS=('ftp::/usr/bin/curl -fC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %u'
'http::/usr/bin/curl -fLC - --retry 3 --retry-delay 3 -o %o %u'
'https::/usr/bin/curl -fLC - --retry 3 --retry-delay 3 -o %o %u'
'rsync::/usr/bin/rsync -z %u %o'
'scp::/usr/bin/scp -C %u %o')
# Other common tools:
# /usr/bin/snarf
# /usr/bin/lftpget -c
# /usr/bin/curl
# /usr/bin/wget
#########################################################################
# ARCHITECTURE, COMPILE FLAGS
@@ -26,7 +26,7 @@ DLAGENTS=('ftp::/usr/bin/wget -c --passive-ftp -t 3 --waitretry=3 -O %o %u'
CARCH="i686"
CHOST="i686-pc-linux-gnu"
#-- Exclusive: will only run on i686
#-- Compiler and Linker Flags
# -march (or -mcpu) builds exclusively for an architecture
# -mtune optimizes for an architecture, but builds for whole processor family
CFLAGS="-march=i686 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2"
@@ -39,7 +39,7 @@ LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro,--hash-style=gnu"
# BUILD ENVIRONMENT
#########################################################################
#
# Defaults: BUILDENV=(fakeroot !distcc color !ccache check)
# Defaults: BUILDENV=(fakeroot !distcc color !ccache check !sign)
# A negated environment option will do the opposite of the comments below.
#
#-- fakeroot: Allow building packages as a non-root user
@@ -47,19 +47,23 @@ LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro,--hash-style=gnu"
#-- color: Colorize output messages
#-- ccache: Use ccache to cache compilation
#-- check: Run the check() function if present in the PKGBUILD
#-- sign: Generate PGP signature file
#
BUILDENV=(fakeroot !distcc color !ccache check)
BUILDENV=(fakeroot !distcc color !ccache check !sign)
#
#-- If using DistCC, your MAKEFLAGS will also need modification. In addition,
#-- specify a space-delimited list of hosts running in the DistCC cluster.
#DISTCC_HOSTS=""
#
#-- Specify a directory for package building.
#BUILDDIR=/tmp/makepkg
#########################################################################
# GLOBAL PACKAGE OPTIONS
# These are default values for the options=() settings
#########################################################################
#
# Default: OPTIONS=(strip docs libtool emptydirs zipman purge)
# Default: OPTIONS=(strip docs libtool emptydirs zipman purge !upx)
# A negated option will do the opposite of the comments below.
#
#-- strip: Strip symbols from binaries/libraries
@@ -68,8 +72,9 @@ BUILDENV=(fakeroot !distcc color !ccache check)
#-- emptydirs: Leave empty directories in packages
#-- zipman: Compress manual (man and info) pages in MAN_DIRS with gzip
#-- purge: Remove files specified by PURGE_TARGETS
#-- upx: Compress binary executable files using UPX
#
OPTIONS=(strip docs libtool emptydirs zipman purge)
OPTIONS=(strip docs libtool emptydirs zipman purge !upx)
#-- File integrity checks to use. Valid: md5, sha1, sha256, sha384, sha512
INTEGRITY_CHECK=(md5)
@@ -100,6 +105,8 @@ PURGE_TARGETS=(usr/{,share}/info/dir .packlist *.pod)
#SRCPKGDEST=/home/srcpackages
#-- Packager: name/email of the person or organization building packages
#PACKAGER="John Doe <john@doe.com>"
#-- Specify a key to use for package signing
#GPGKEY=""
#########################################################################
# EXTENSION DEFAULTS

View File

@@ -8,16 +8,16 @@
#
#-- The download utilities that makepkg should use to acquire sources
# Format: 'protocol::agent'
DLAGENTS=('ftp::/usr/bin/wget -c --passive-ftp -t 3 --waitretry=3 -O %o %u'
'http::/usr/bin/wget -c -t 3 --waitretry=3 -O %o %u'
'https::/usr/bin/wget -c -t 3 --waitretry=3 --no-check-certificate -O %o %u'
DLAGENTS=('ftp::/usr/bin/curl -fC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %u'
'http::/usr/bin/curl -fLC - --retry 3 --retry-delay 3 -o %o %u'
'https::/usr/bin/curl -fLC - --retry 3 --retry-delay 3 -o %o %u'
'rsync::/usr/bin/rsync -z %u %o'
'scp::/usr/bin/scp -C %u %o')
# Other common tools:
# /usr/bin/snarf
# /usr/bin/lftpget -c
# /usr/bin/curl
# /usr/bin/wget
#########################################################################
# ARCHITECTURE, COMPILE FLAGS
@@ -26,7 +26,7 @@ DLAGENTS=('ftp::/usr/bin/wget -c --passive-ftp -t 3 --waitretry=3 -O %o %u'
CARCH="x86_64"
CHOST="x86_64-unknown-linux-gnu"
#-- Exclusive: will only run on x86_64
#-- Compiler and Linker Flags
# -march (or -mcpu) builds exclusively for an architecture
# -mtune optimizes for an architecture, but builds for whole processor family
CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2"
@@ -39,7 +39,7 @@ LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro,--hash-style=gnu"
# BUILD ENVIRONMENT
#########################################################################
#
# Defaults: BUILDENV=(fakeroot !distcc color !ccache check)
# Defaults: BUILDENV=(fakeroot !distcc color !ccache check !sign)
# A negated environment option will do the opposite of the comments below.
#
#-- fakeroot: Allow building packages as a non-root user
@@ -47,19 +47,23 @@ LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro,--hash-style=gnu"
#-- color: Colorize output messages
#-- ccache: Use ccache to cache compilation
#-- check: Run the check() function if present in the PKGBUILD
#-- sign: Generate PGP signature file
#
BUILDENV=(fakeroot !distcc color !ccache check)
BUILDENV=(fakeroot !distcc color !ccache check !sign)
#
#-- If using DistCC, your MAKEFLAGS will also need modification. In addition,
#-- specify a space-delimited list of hosts running in the DistCC cluster.
#DISTCC_HOSTS=""
#
#-- Specify a directory for package building.
#BUILDDIR=/tmp/makepkg
#########################################################################
# GLOBAL PACKAGE OPTIONS
# These are default values for the options=() settings
#########################################################################
#
# Default: OPTIONS=(strip docs libtool emptydirs zipman purge)
# Default: OPTIONS=(strip docs libtool emptydirs zipman purge !upx)
# A negated option will do the opposite of the comments below.
#
#-- strip: Strip symbols from binaries/libraries
@@ -68,8 +72,9 @@ BUILDENV=(fakeroot !distcc color !ccache check)
#-- emptydirs: Leave empty directories in packages
#-- zipman: Compress manual (man and info) pages in MAN_DIRS with gzip
#-- purge: Remove files specified by PURGE_TARGETS
#-- upx: Compress binary executable files using UPX
#
OPTIONS=(strip docs libtool emptydirs zipman purge)
OPTIONS=(strip docs libtool emptydirs zipman purge !upx)
#-- File integrity checks to use. Valid: md5, sha1, sha256, sha384, sha512
INTEGRITY_CHECK=(md5)
@@ -100,6 +105,8 @@ PURGE_TARGETS=(usr/{,share}/info/dir .packlist *.pod)
#SRCPKGDEST=/home/srcpackages
#-- Packager: name/email of the person or organization building packages
#PACKAGER="John Doe <john@doe.com>"
#-- Specify a key to use for package signing
#GPGKEY=""
#########################################################################
# EXTENSION DEFAULTS

106
mkarchroot → mkarchroot.in Executable file → Normal file
View File

@@ -8,6 +8,8 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
m4_include(lib/common.sh)
FORCE='n'
RUN=''
NOCOPY='n'
@@ -28,7 +30,7 @@ usage() {
echo ' -n Do not copy config files into the chroot'
echo ' -c <dir> Set pacman cache. Default: /var/cache/pacman/pkg'
echo ' -h This message'
exit $1
exit 1
}
while getopts 'r:ufnhC:M:c:' arg; do
@@ -41,41 +43,38 @@ while getopts 'r:ufnhC:M:c:' arg; do
n) NOCOPY='y' ;;
c) cache_dir="$OPTARG" ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
*) error "invalid argument '${arg}'"; usage ;;
esac
done
if [ "$EUID" != '0' ]; then
echo 'error: this script must be run as root.'
exit 1
if (( $EUID != 0 )); then
die 'This script must be run as root.'
fi
shift $(($OPTIND - 1))
if [ "$RUN" = '' -a $# -lt 2 ]; then
echo 'you must specify a directory and one or more packages'
usage 1
elif [ $# -lt 1 ]; then
echo 'you must specify a directory'
usage 1
if [[ -z $RUN ]] && (( $# < 2 )); then
die 'You must specify a directory and one or more packages.'
elif (( $# < 1 )); then
die 'You must specify a directory.'
fi
working_dir="$(readlink -f ${1})"
shift 1
[ "${working_dir}" = '' ] && echo 'error: please specify a working directory' && usage 1
[[ -z $working_dir ]] && die 'Please specify a working directory.'
if [ -z "$cache_dir" ]; then
if [[ -z $cache_dir ]]; then
cache_conf=${working_dir}/etc/pacman.conf
[ ! -f $cache_conf ] && cache_conf=${pac_conf:-/etc/pacman.conf}
[[ ! -f $cache_conf ]] && cache_conf=${pac_conf:-/etc/pacman.conf}
cache_dir=$( (grep -m 1 '^CacheDir' $cache_conf || echo 'CacheDir = /var/cache/pacman/pkg') | sed 's/CacheDir\s*=\s*//')
unset cache_conf
fi
if [ -f /etc/pacman.d/mirrorlist ]; then
if [[ -f /etc/pacman.d/mirrorlist ]]; then
host_mirror=$(pacman -Sddp extra/devtools 2>/dev/null | sed -E 's#(.*/)extra/os/.*#\1$repo/os/$arch#')
fi
if [ -z "${host_mirror}" ]; then
if [[ -z $host_mirror ]]; then
host_mirror='http://mirrors.kernel.org/archlinux/$repo/os/$arch'
fi
if echo "${host_mirror}" | grep -q 'file://'; then
@@ -84,13 +83,13 @@ fi
# {{{ functions
chroot_mount() {
[ -e "${working_dir}/sys" ] || mkdir "${working_dir}/sys"
[[ -e "${working_dir}/sys" ]] || mkdir "${working_dir}/sys"
mount -t sysfs sysfs "${working_dir}/sys"
[ -e "${working_dir}/proc" ] || mkdir "${working_dir}/proc"
[[ -e "${working_dir}/proc" ]] || mkdir "${working_dir}/proc"
mount -t proc proc "${working_dir}/proc"
[ -e "${working_dir}/dev" ] || mkdir "${working_dir}/dev"
[[ -e "${working_dir}/dev" ]] || mkdir "${working_dir}/dev"
mount -t tmpfs dev "${working_dir}/dev" -o mode=0755,size=10M,nosuid
mknod -m 666 "${working_dir}/dev/null" c 1 3
mknod -m 666 "${working_dir}/dev/zero" c 1 5
@@ -106,19 +105,19 @@ chroot_mount() {
ln -s /proc/self/fd/1 "${working_dir}/dev/stdout"
ln -s /proc/self/fd/2 "${working_dir}/dev/stderr"
[ -e "${working_dir}/dev/shm" ] || mkdir "${working_dir}/dev/shm"
[[ -e "${working_dir}/dev/shm" ]] || mkdir "${working_dir}/dev/shm"
mount -t tmpfs shm "${working_dir}/dev/shm" -o nodev,nosuid,size=128M
[ -e "${working_dir}/dev/pts" ] || mkdir "${working_dir}/dev/pts"
[[ -e "${working_dir}/dev/pts" ]] || mkdir "${working_dir}/dev/pts"
mount -t devpts devpts "${working_dir}/dev/pts" -o newinstance,ptmxmode=666
ln -s pts/ptmx "${working_dir}/dev/ptmx"
[ -e "${cache_dir}" ] || mkdir -p "${cache_dir}"
[ -e "${working_dir}/${cache_dir}" ] || mkdir -p "${working_dir}/${cache_dir}"
[[ -e $cache_dir ]] || mkdir -p "${cache_dir}"
[[ -e "${working_dir}/${cache_dir}" ]] || mkdir -p "${working_dir}/${cache_dir}"
mount -o bind "${cache_dir}" "${working_dir}/${cache_dir}"
if [ -n "${host_mirror_path}" ]; then
[ -e "${working_dir}/${host_mirror_path}" ] || mkdir -p "${working_dir}/${host_mirror_path}"
if [[ -n $host_mirror_path ]]; then
[[ -e "${working_dir}/${host_mirror_path}" ]] || mkdir -p "${working_dir}/${host_mirror_path}"
mount -o bind "${host_mirror_path}" "${working_dir}/${host_mirror_path}"
mount -o remount,ro,bind "${host_mirror_path}" "${working_dir}/${host_mirror_path}"
fi
@@ -127,9 +126,16 @@ chroot_mount() {
}
copy_hostconf () {
chroot "${working_dir}" /bin/findmnt -rnu -o SOURCE,TARGET,FSTYPE,OPTIONS > "${working_dir}/etc/mtab"
cp /etc/resolv.conf "${working_dir}/etc/resolv.conf"
echo "Server = ${host_mirror}" > ${working_dir}/etc/pacman.d/mirrorlist
if [[ -n $pac_conf && $NOCOPY = 'n' ]]; then
cp ${pac_conf} ${working_dir}/etc/pacman.conf
fi
if [[ -n $makepkg_conf && $NOCOPY = 'n' ]]; then
cp ${makepkg_conf} ${working_dir}/etc/makepkg.conf
fi
}
chroot_umount () {
@@ -139,32 +145,30 @@ chroot_umount () {
umount "${working_dir}/dev/shm"
umount "${working_dir}/dev"
umount "${working_dir}/${cache_dir}"
[ -n "${host_mirror_path}" ] && umount "${working_dir}/${host_mirror_path}"
[[ -n $host_mirror_path ]] && umount "${working_dir}/${host_mirror_path}"
}
chroot_lock () {
# Only reopen the FD if it wasn't handed to us
if [ "$(readlink -f /dev/fd/9)" != "${working_dir}.lock" ]; then
if [[ $(readlink -f /dev/fd/9) != "${working_dir}.lock" ]]; then
exec 9>"${working_dir}.lock"
fi
# Lock the chroot. Take note of the FD number.
if ! flock -n 9; then
echo -n "locking chroot..."
stat_busy "Locking chroot"
flock 9
echo "done"
stat_done
fi
}
# }}}
umask 0022
if [ "$RUN" != "" ]; then
if [[ -n $RUN ]]; then
# run chroot {{{
#Sanity check
if [ ! -f "${working_dir}/.arch-chroot" ]; then
echo "error: '${working_dir}' does not appear to be a Arch chroot"
echo ' please build the image using mkarchroot'
exit 1
if [[ ! -f "${working_dir}/.arch-chroot" ]]; then
die "'${working_dir}' does not appear to be a Arch chroot."
fi
chroot_lock
@@ -176,9 +180,8 @@ if [ "$RUN" != "" ]; then
# }}}
else
# {{{ build chroot
if [ -e "${working_dir}" -a "${FORCE}" = "n" ]; then
echo "error: working dir '${working_dir}' already exists - try using -f"
exit 1
if [[ -e $working_dir && $FORCE = 'n' ]]; then
die "Working directory '${working_dir}' already exists - try using -f"
fi
if { type -P btrfs && btrfs subvolume create "${working_dir}"; } &>/dev/null; then
@@ -192,39 +195,32 @@ else
chroot_mount
pacargs="--noconfirm --root=${working_dir} --cachedir=${cache_dir}"
if [ "$pac_conf" != "" ]; then
if [[ -n $pac_conf ]]; then
pacargs="$pacargs --config=${pac_conf}"
fi
if [ $# -ne 0 ]; then
if (( $# != 0 )); then
op='-Sy'
if [ "$FORCE" = "y" ]; then
if [[ $FORCE = 'y' ]]; then
op="${op}f"
fi
if ! pacman ${op} ${pacargs} $@; then
echo 'error: failed to install all packages'
exit 1
die 'Failed to install all packages'
fi
fi
if [ -d "${working_dir}/lib/modules" ]; then
if [[ -d "${working_dir}/lib/modules" ]]; then
ldconfig -r "${working_dir}"
fi
if [ "$pac_conf" != "" -a "$NOCOPY" = "n" ]; then
cp ${pac_conf} ${working_dir}/etc/pacman.conf
fi
if [ "$makepkg_conf" != "" -a "$NOCOPY" = "n" ]; then
cp ${makepkg_conf} ${working_dir}/etc/makepkg.conf
fi
if [ -e "${working_dir}/etc/locale.gen" ]; then
if [[ -e "${working_dir}/etc/locale.gen" ]]; then
sed -i 's@^#\(en_US\|de_DE\)\(\.UTF-8\)@\1\2@' "${working_dir}/etc/locale.gen"
chroot "${working_dir}" locale-gen
chroot "${working_dir}" /usr/sbin/locale-gen
fi
if [ ! -e "${working_dir}/.arch-chroot" ]; then
copy_hostconf
if [[ ! -e "${working_dir}/.arch-chroot" ]]; then
date +%s > "${working_dir}/.arch-chroot"
fi
# }}}

View File

@@ -13,11 +13,12 @@
#DBPath = /var/lib/pacman/
#CacheDir = /var/cache/pacman/pkg/
#LogFile = /var/log/pacman.log
#GPGDir = /etc/pacman.d/gnupg/
HoldPkg = pacman glibc
# If upgrades are available for these packages they will be asked for first
SyncFirst = pacman
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#XferCommand = /usr/bin/curl -C - -f %u > %o
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
Architecture = auto
@@ -28,12 +29,26 @@ Architecture = auto
#NoUpgrade =
#NoExtract =
# Misc options (all disabled by default)
# Misc options
#UseSyslog
#ShowSize
#UseDelta
#TotalDownload
# We cannot check disk space from within a chroot environment
#CheckSpace
#VerbosePkgLists
# PGP signature checking
# NOTE: None of this will work without running `pacman-key --init` first.
# The compiled in default is equivalent to the following line. This requires
# you to locally sign and trust packager keys using `pacman-key` for them to be
# considered valid.
#SigLevel = Optional TrustedOnly
# If you wish to check signatures but avoid local sign and trust issues, use
# the following line. This will treat any key imported into pacman's keyring as
# trusted.
#SigLevel = Optional TrustAll
# Disable signature checks for now
#SigLevel = Never
#
# REPOSITORIES
@@ -76,5 +91,6 @@ Include = /etc/pacman.d/mirrorlist
# An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories.
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs

View File

@@ -0,0 +1,99 @@
#
# /etc/pacman.conf
#
# See the pacman.conf(5) manpage for option and repository directives
#
# GENERAL OPTIONS
#
[options]
# The following paths are commented out with their default values listed.
# If you wish to use different paths, uncomment and update the paths.
#RootDir = /
#DBPath = /var/lib/pacman/
#CacheDir = /var/cache/pacman/pkg/
#LogFile = /var/log/pacman.log
#GPGDir = /etc/pacman.d/gnupg/
HoldPkg = pacman glibc
# If upgrades are available for these packages they will be asked for first
SyncFirst = pacman
#XferCommand = /usr/bin/curl -C - -f %u > %o
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
Architecture = auto
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
#IgnorePkg =
#IgnoreGroup =
#NoUpgrade =
#NoExtract =
# Misc options
#UseSyslog
#UseDelta
#TotalDownload
# We cannot check disk space from within a chroot environment
#CheckSpace
#VerbosePkgLists
# PGP signature checking
# NOTE: None of this will work without running `pacman-key --init` first.
# The compiled in default is equivalent to the following line. This requires
# you to locally sign and trust packager keys using `pacman-key` for them to be
# considered valid.
#SigLevel = Optional TrustedOnly
# If you wish to check signatures but avoid local sign and trust issues, use
# the following line. This will treat any key imported into pacman's keyring as
# trusted.
#SigLevel = Optional TrustAll
# Disable signature checks for now
SigLevel = Never
#
# REPOSITORIES
# - can be defined here or included from another file
# - pacman will search repositories in the order defined here
# - local/custom mirrors can be added here or in separate files
# - repositories listed first will take precedence when packages
# have identical names, regardless of version number
# - URLs will have $repo replaced by the name of the current repo
# - URLs will have $arch replaced by the name of the architecture
#
# Repository entries are of the format:
# [repo-name]
# Server = ServerName
# Include = IncludePath
#
# The header [repo-name] is crucial - it must be present and
# uncommented to enable the repo.
#
# The testing repositories are disabled by default. To enable, uncomment the
# repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors.
[gnome-unstable]
Include = /etc/pacman.d/mirrorlist
[testing]
Include = /etc/pacman.d/mirrorlist
[core]
Include = /etc/pacman.d/mirrorlist
[extra]
Include = /etc/pacman.d/mirrorlist
[community-testing]
Include = /etc/pacman.d/mirrorlist
[community]
Include = /etc/pacman.d/mirrorlist
# An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories.
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs

99
pacman-kde-unstable.conf Normal file
View File

@@ -0,0 +1,99 @@
#
# /etc/pacman.conf
#
# See the pacman.conf(5) manpage for option and repository directives
#
# GENERAL OPTIONS
#
[options]
# The following paths are commented out with their default values listed.
# If you wish to use different paths, uncomment and update the paths.
#RootDir = /
#DBPath = /var/lib/pacman/
#CacheDir = /var/cache/pacman/pkg/
#LogFile = /var/log/pacman.log
#GPGDir = /etc/pacman.d/gnupg/
HoldPkg = pacman glibc
# If upgrades are available for these packages they will be asked for first
SyncFirst = pacman
#XferCommand = /usr/bin/curl -C - -f %u > %o
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
Architecture = auto
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
#IgnorePkg =
#IgnoreGroup =
#NoUpgrade =
#NoExtract =
# Misc options
#UseSyslog
#UseDelta
#TotalDownload
# We cannot check disk space from within a chroot environment
#CheckSpace
#VerbosePkgLists
# PGP signature checking
# NOTE: None of this will work without running `pacman-key --init` first.
# The compiled in default is equivalent to the following line. This requires
# you to locally sign and trust packager keys using `pacman-key` for them to be
# considered valid.
#SigLevel = Optional TrustedOnly
# If you wish to check signatures but avoid local sign and trust issues, use
# the following line. This will treat any key imported into pacman's keyring as
# trusted.
#SigLevel = Optional TrustAll
# Disable signature checks for now
SigLevel = Never
#
# REPOSITORIES
# - can be defined here or included from another file
# - pacman will search repositories in the order defined here
# - local/custom mirrors can be added here or in separate files
# - repositories listed first will take precedence when packages
# have identical names, regardless of version number
# - URLs will have $repo replaced by the name of the current repo
# - URLs will have $arch replaced by the name of the architecture
#
# Repository entries are of the format:
# [repo-name]
# Server = ServerName
# Include = IncludePath
#
# The header [repo-name] is crucial - it must be present and
# uncommented to enable the repo.
#
# The testing repositories are disabled by default. To enable, uncomment the
# repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors.
[kde-unstable]
Include = /etc/pacman.d/mirrorlist
[testing]
Include = /etc/pacman.d/mirrorlist
[core]
Include = /etc/pacman.d/mirrorlist
[extra]
Include = /etc/pacman.d/mirrorlist
[community-testing]
Include = /etc/pacman.d/mirrorlist
[community]
Include = /etc/pacman.d/mirrorlist
# An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories.
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs

View File

@@ -13,11 +13,12 @@
#DBPath = /var/lib/pacman/
#CacheDir = /var/cache/pacman/pkg/
#LogFile = /var/log/pacman.log
#GPGDir = /etc/pacman.d/gnupg/
HoldPkg = pacman glibc
# If upgrades are available for these packages they will be asked for first
SyncFirst = pacman
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#XferCommand = /usr/bin/curl -C - -f %u > %o
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
Architecture = auto
@@ -28,12 +29,26 @@ Architecture = auto
#NoUpgrade =
#NoExtract =
# Misc options (all disabled by default)
# Misc options
#UseSyslog
#ShowSize
#UseDelta
#TotalDownload
# We cannot check disk space from within a chroot environment
#CheckSpace
#VerbosePkgLists
# PGP signature checking
# NOTE: None of this will work without running `pacman-key --init` first.
# The compiled in default is equivalent to the following line. This requires
# you to locally sign and trust packager keys using `pacman-key` for them to be
# considered valid.
#SigLevel = Optional TrustedOnly
# If you wish to check signatures but avoid local sign and trust issues, use
# the following line. This will treat any key imported into pacman's keyring as
# trusted.
#SigLevel = Optional TrustAll
# Disable signature checks for now
SigLevel = Never
#
# REPOSITORIES
@@ -76,6 +91,7 @@ Include = /etc/pacman.d/mirrorlist
# If you want to run 32 bit applications on your x86_64 system,
# enable the multilib repository here.
[multilib-testing]
#SigLevel = Optional TrustAll
Include = /etc/pacman.d/mirrorlist
[multilib]

View File

@@ -13,11 +13,12 @@
#DBPath = /var/lib/pacman/
#CacheDir = /var/cache/pacman/pkg/
#LogFile = /var/log/pacman.log
#GPGDir = /etc/pacman.d/gnupg/
HoldPkg = pacman glibc
# If upgrades are available for these packages they will be asked for first
SyncFirst = pacman
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#XferCommand = /usr/bin/curl -C - -f %u > %o
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
Architecture = auto
@@ -28,12 +29,26 @@ Architecture = auto
#NoUpgrade =
#NoExtract =
# Misc options (all disabled by default)
# Misc options
#UseSyslog
#ShowSize
#UseDelta
#TotalDownload
# We cannot check disk space from within a chroot environment
#CheckSpace
#VerbosePkgLists
# PGP signature checking
# NOTE: None of this will work without running `pacman-key --init` first.
# The compiled in default is equivalent to the following line. This requires
# you to locally sign and trust packager keys using `pacman-key` for them to be
# considered valid.
#SigLevel = Optional TrustedOnly
# If you wish to check signatures but avoid local sign and trust issues, use
# the following line. This will treat any key imported into pacman's keyring as
# trusted.
#SigLevel = Optional TrustAll
# Disable signature checks for now
#SigLevel = Never
#
# REPOSITORIES
@@ -76,6 +91,7 @@ Include = /etc/pacman.d/mirrorlist
# If you want to run 32 bit applications on your x86_64 system,
# enable the multilib repository here.
[multilib]
#SigLevel = Optional TrustAll
Include = /etc/pacman.d/mirrorlist
# An example of a custom package repository. See the pacman manpage for

View File

@@ -13,11 +13,12 @@
#DBPath = /var/lib/pacman/
#CacheDir = /var/cache/pacman/pkg/
#LogFile = /var/log/pacman.log
#GPGDir = /etc/pacman.d/gnupg/
HoldPkg = pacman glibc
# If upgrades are available for these packages they will be asked for first
SyncFirst = pacman
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#XferCommand = /usr/bin/curl -C - -f %u > %o
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
Architecture = auto
@@ -28,12 +29,26 @@ Architecture = auto
#NoUpgrade =
#NoExtract =
# Misc options (all disabled by default)
# Misc options
#UseSyslog
#ShowSize
#UseDelta
#TotalDownload
# We cannot check disk space from within a chroot environment
#CheckSpace
#VerbosePkgLists
# PGP signature checking
# NOTE: None of this will work without running `pacman-key --init` first.
# The compiled in default is equivalent to the following line. This requires
# you to locally sign and trust packager keys using `pacman-key` for them to be
# considered valid.
#SigLevel = Optional TrustedOnly
# If you wish to check signatures but avoid local sign and trust issues, use
# the following line. This will treat any key imported into pacman's keyring as
# trusted.
#SigLevel = Optional TrustAll
# Disable signature checks for now
SigLevel = Never
#
# REPOSITORIES
@@ -76,6 +91,7 @@ Include = /etc/pacman.d/mirrorlist
[community-testing]
Include = /etc/pacman.d/mirrorlist
#SigLevel = Optional TrustAll
[community]
Include = /etc/pacman.d/mirrorlist

View File

@@ -13,11 +13,12 @@
#DBPath = /var/lib/pacman/
#CacheDir = /var/cache/pacman/pkg/
#LogFile = /var/log/pacman.log
#GPGDir = /etc/pacman.d/gnupg/
HoldPkg = pacman glibc
# If upgrades are available for these packages they will be asked for first
SyncFirst = pacman
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#XferCommand = /usr/bin/curl -C - -f %u > %o
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
Architecture = auto
@@ -28,12 +29,26 @@ Architecture = auto
#NoUpgrade =
#NoExtract =
# Misc options (all disabled by default)
# Misc options
#UseSyslog
#ShowSize
#UseDelta
#TotalDownload
# We cannot check disk space from within a chroot environment
#CheckSpace
#VerbosePkgLists
# PGP signature checking
# NOTE: None of this will work without running `pacman-key --init` first.
# The compiled in default is equivalent to the following line. This requires
# you to locally sign and trust packager keys using `pacman-key` for them to be
# considered valid.
#SigLevel = Optional TrustedOnly
# If you wish to check signatures but avoid local sign and trust issues, use
# the following line. This will treat any key imported into pacman's keyring as
# trusted.
#SigLevel = Optional TrustAll
# Disable signature checks for now
SigLevel = Never
#
# REPOSITORIES
@@ -76,5 +91,6 @@ Include = /etc/pacman.d/mirrorlist
# An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories.
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs

38
rebuildpkgs → rebuildpkgs.in Executable file → Normal file
View File

@@ -9,25 +9,21 @@
# Currently uses $(pwd)/rebuilds as the directory for rebuilding...
# TODO make this work for community too
if [ $# -le 1 ]; then
m4_include(lib/common.sh)
if (( $# < 1 )); then
echo "usage: $(basename $0) <chrootdir> <packages to rebuild>"
echo " example: $(basename $0) ~/chroot readline bash foo bar baz"
exit 1
fi
# Source makepkg.conf; fail if it is not found
if [ -r '/etc/makepkg.conf' ]; then
if [[ -r '/etc/makepkg.conf' ]]; then
source '/etc/makepkg.conf'
else
echo '/etc/makepkg.conf not found!'
exit 1
die '/etc/makepkg.conf not found!'
fi
die () {
echo $@ >&2
exit 1
}
bump_pkgrel() {
# Get the current pkgrel from SVN and update the working copy with it
# This prevents us from incrementing out of control :)
@@ -53,7 +49,7 @@ pkgs="$@"
SVNPATH='svn+ssh://gerolde.archlinux.org/srv/svn-packages'
echo ":: Work will be done in $(pwd)/rebuilds"
msg "Work will be done in $(pwd)/rebuilds"
REBUILD_ROOT="$(pwd)/rebuilds"
mkdir -p "$REBUILD_ROOT"
@@ -65,11 +61,11 @@ FAILED=""
for pkg in $pkgs; do
cd "$REBUILD_ROOT/svn-packages"
echo ":: Building '$pkg'"
msg2 "Building '$pkg'"
/usr/bin/svn update "$pkg"
if [ ! -d "$pkg/trunk" ]; then
if [[ ! -d "$pkg/trunk" ]]; then
FAILED="$FAILED $pkg"
echo ":: $pkg does not exist in SVN"
warning "$pkg does not exist in SVN"
continue
fi
cd "$pkg/trunk/"
@@ -78,24 +74,24 @@ for pkg in $pkgs; do
if ! sudo makechrootpkg -u -d -r "$chrootdir" -- --noconfirm; then
FAILED="$FAILED $pkg"
echo ":: $pkg Failed!"
error "$pkg Failed!"
else
pkgfile=$(pkg_from_pkgbuild)
if [ -e "$pkgfile" ]; then
echo ":: $pkg Complete"
if [[ -e $pkgfile ]]; then
msg2 "$pkg Complete"
else
FAILED="$FAILED $pkg"
echo ":: $pkg Failed, no package built!"
error "$pkg Failed, no package built!"
fi
fi
done
cd "$REBUILD_ROOT"
if [ "$FAILED" != "" ]; then
echo 'Packages failed:'
if [[ -n $FAILED ]]; then
msg 'Packages failed:'
for pkg in $FAILED; do
echo -e "\t$pkg"
msg2 "$pkg"
done
fi
echo 'SVN pkgbumps in svn-packages/ - commit when ready'
msg 'SVN pkgbumps in svn-packages/ - commit when ready'

83
zsh_completion.in Normal file
View File

@@ -0,0 +1,83 @@
#compdef archbuild archco archrelease archrm commitpkg finddeps makechrootpkg mkarchroot rebuildpkgs extrapkg=commitpkg corepkg=commitpkg testingpkg=commitpkg stagingpkg=commitpkg communitypkg=commitpkg community-testingpkg=commitpkg community-stagingpkg=commitpkg multilibpkg=commitpkg multilib-testingpkg=commitpkg extra-i686-build=archbuild extra-x86_64-build=archbuild testing-i686-build=archbuild testing-x86_64-build=archbuild staging-i686-build=archbuild staging-x86_64-build=archbuild multilib-build=archbuild multilib-testing-build=archbuild kde-unstable-i686-build=archbuild kde-unstable-x86_64-build=archbuild gnome-unstable-i686-build=archbuild gnome-unstable-x86_64-build=archbuild communityco=archco
_arch=(i686 x86_64 any)
_tags=(
core-i686 core-x86_64 core-any
extra-i686 extra-x86_64 extra-any
multilib-i686 multilib-x86_64 multilib-any
staging-i686 staging-x86_64 staging-any
testing-i686 testing-x86_64 testing-any
multilib-testing-i686 multilib-testing-x86_64 multilib-testing-any
community-i686 community-x86_64 community-any
community-staging-i686 community-staging-x86_64 community-staging-any
community-testing-i686 community-testing-x86_64 community-testing-any
kde-unstable-i686 kde-unstable-x86_64 kde-unstable-any
gnome-unstable-i686 gnome-unstable-x86_64 gnome-unstable-any
)
_archbuild_args=(
'-c[Recreate the chroot before building]'
'-r[Create chroots in this directory]:base_dir:_files -/'
)
_archco_args=(
'*:packages:_devtools_completions_all_packages'
)
_archrelease_args=(
"*:arch:($_tags[*])"
)
_archrm_args=(
'1:path:_files -/'
)
_commitpkg_args=(
"-a[Release to a specific architecture only]:arch:($_arch[*])"
'-l[Set bandwidth limit]:limit'
'1:commit_msg'
)
_finddeps_args=(
'1:packages:_devtools_completions_all_packages'
)
_makechrootpkg_args=(
'-I[Install a package into the working copy]:target:_files -g "*.pkg.tar.*(.)"'
'-c[Clean the chroot before building]'
'-d[Add the package to a local db at /repo after building]'
'-h[Display usage]'
'-l[The directory to use as the working copy]:copy_dir:_files -/'
'-r[The chroot dir to use]:chroot_dir:_files -/'
'-u[Update the working copy of the chroot before building]'
)
_mkarchroot_args=(
'-r[Run a program within the context of the chroot]:app'
'-u[Update the chroot via pacman]'
'-f[Force overwrite of files in the working-dir]'
'-C[Location of a pacman config file]:pacman_config:_files'
'-M[Location of a makepkg config file]:makepkg_config:_files'
'-n[Do not copy config files into the chroot]'
'-c[Set pacman cache]:pacman_cache:_files -/'
'-h[Display usage]'
)
_rebuildpkgs_args=(
'1:chroot_dir:_files -/'
'*:packages:_devtools_completions_all_packages'
)
_devtools_completions_all_packages() {
typeset -U packages
packages=($(_call_program packages pacman -Sql))
compadd - "${(@)packages}"
}
_devtools() {
local argname="_${service}_args[@]"
_arguments -s "${(P)argname}"
}
_devtools