Compare commits

...

403 Commits

Author SHA1 Message Date
Levente Polyak
1b808b8e32 chore(release): version v1.0.1 2023-05-24 03:19:26 +02:00
Chih-Hsuan Yen
e4c40a9802 fix(completion): incorporate repo layout into offload-build completion
Use new repo names for build targets. This follows /usr/bin/*-build
links other than x86_64_v3 ones.
2023-05-24 03:06:03 +02:00
Levente Polyak
a08bc2acf4 feature(clone): add protocol option to force cloning over HTTPS
This is a rather quick and simple implementation to override the current
logic and force clone with HTTPS. Allowing to explicitly clone over HTTPS
is currently required to unblock reproducible builds where no ssh keys
and GitLab user accounts are set up as of now. Hence this quick solution
comes into play to mitigate the regression on reproducible builds
builders.

Revisit the overall auto detection and protocol logic approach for a
later release related to some ideas floating around in pending
merge-requests.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-24 02:50:08 +02:00
Morten Linderud
f11cb9018e feature(commitpkg): auto generate .SRCINFO if present
This currently makes .SRCINFO files opt-in and helps to keep the file up
to date if already present.

Signed-off-by: Morten Linderud <foxboron@archlinux.org>
2023-05-23 03:03:39 +02:00
Jan Alexander Steffens (heftig)
d759eadb50 fix(diffpkg): Fix scoping of DIFFOPTIONS when comparing split pkgs
`diff_pkgs` needs to use a local variable for its options, otherwise
they will accumulate for each package diffed.

Whem comparing split packages this lead to earlier mutated DIFFOPTIONS
containing too many labels which resulted in a failure.
2023-05-23 02:20:03 +02:00
Jan Alexander Steffens (heftig)
1c399778f9 fix(commitpkg): reliably check tree status regardless of configuration
Check git status --porcelain, not --short.

`--short` is influenced by user configuration like `status.branch`
making it non-empty even on a clean tree. Use `--porcelain` to avoid
this.
2023-05-23 01:47:00 +02:00
Levente Polyak
edc14ef19c Version 1.0.0 2023-05-21 12:25:44 +02:00
Levente Polyak
6ce666a166 feature(parallel): run up to N jobs in parallel for repo clone/configure
Run up to N jobs in parallel. By default the number of jobs is equal to the
number of available processing units. For sequential processing this option
needs to be passed with 1.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 16:12:45 +02:00
Levente Polyak
bf61b8472a chore(archroot): force build chroot recreation to adapt new configs
Bumping the chroot version will result in the chroots checking against
the local version and force recreation in case they do not match.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 15:11:16 +02:00
Levente Polyak
80a8cdcba2 chore(git): use default ssh port 22 url scheme
We only need to specifically use ssh:// protocol prefix if we want to
specify a special port. As we moved to support pulling directly over
port 22 from out GitLab instance we can change the url scheme to the
simple variant.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 12:20:36 +02:00
Levente Polyak
41d4624879 fix(archroot): pass along the real command and argv by the caller
Before modularizing the repo layout, we used m4_include to assemble
together sources into a single file. Now, we properly use a library
layout without assembling multiple files, which means we cannot anymore
rely on BASH_SOURCE inside the library file. Hence, pass along the
actual command and argv from the check_root caller.

Fixes: src: modularize repo layout into a library

Signed-off-by: Morten Linderud <foxboron@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:20:41 +02:00
Felix Yan
4d3ab0b489 config: update pacman configs for new repository layout
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:13 +02:00
Levente Polyak
830dcde2d8 pkgctl build: support worker slots for none tty builds
Allow overriding the worker slot with a dedicated option. Furthermore
detect if the current tty is no pts and fall back to choosing a random
worker slot between 1 and number of available processing units.

Fixes #137

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:13 +02:00
Caleb Maclennan
1da97a8b36 doc: Fixup formatting issues in asciidoc man pages 2023-05-20 00:08:13 +02:00
Alexander Epaneshnikov
9330671825 archrelease: fix mangled release package status output
Git push will print its status, hence switch from a busy line
indicator to a single line message and allow Git to print its status
accordingly.

Otherwise we get:
==> Releasing package...Enumerating objects: 6, done.
2023-05-20 00:08:13 +02:00
Christian Heusel
8e3b6bcc5b pkgctl repo clone: add option to switch working tree
Add an option to call the switch command after clone. Switch to a
specified version. The working tree and the index are updated to match
the version.

Signed-off-by: Christian Heusel <christian@heusel.eu>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:13 +02:00
Christian Heusel
4289be212b build: allow release options only in combination with --release
It leads to weird expectations when using --db-update or --message
without --release. Make the behavior more user friendly, by aborting the
operation and explaining that release options only work in conjunction
with the release option.

Fixes #131

Signed-off-by: Christian Heusel <christian@heusel.eu>
2023-05-20 00:08:13 +02:00
Christian Heusel
ed96635141 pkgctl repo: introduce the switch subcommand
Signed-off-by: Christian Heusel <christian@heusel.eu>
Co-Authored-By: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:13 +02:00
Levente Polyak
f961e2e948 completion: implemented structured declarative bash completions
This will make it tremendously easier to add arguments, subcommands and
special positional option handling. Instead of the need to code the
nested structure via bash and switch cases, we can simply declare
functions and arrays with the matching names according to the
subcommands or argument labels.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:13 +02:00
Christian Heusel
645a5a9f04 pkgctl: introduce the version subcommand
Related to https://gitlab.archlinux.org/archlinux/devtools/-/issues/125

Closes #125

Signed-off-by: Christian Heusel <christian@heusel.eu>
Co-Authored-By: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:12 +02:00
Levente Polyak
e1142935e5 completion: zsh: allow args even when the command has subcommands
This allows to show arguments on root level of commands that themselves
have subcommands available. Complete those when any - is used in the
completion word.
2023-05-20 00:08:12 +02:00
Levente Polyak
bc182032eb config: fixup file permissions to be more strict
Normally the default in Arch is that all home directories are private.
However, this may have been changed locally. To make sure we never
expose secrets, lets use a umask of 0077 when writing the config.

Additionally add some temporary fixup code to migrate the file and
directory permissions of already existing paths.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:12 +02:00
Levente Polyak
f3518e248c build: support nocheck for initial bootstrap builds
Output a warning when this option is used to remind packagers to rebuild
the packages with checks once the bootstrap cycle has been completed.
2023-05-20 00:08:12 +02:00
Levente Polyak
6c2498750e doc: add dependency declaration to the README.md
This will help to make sure dependencies are explicitly stated and
reflected in the PKGBUILD.
2023-05-20 00:08:12 +02:00
Christian Heusel
5e22e4f81e config: allow suppying the gitlab token via env var
This would allow to supply the gitlab tokens via the env var
DEVTOOLS_GITLAB_TOKEN and therefore allow users to choose whatever
program they want to fill this env var.

Closes #113

Signed-off-by: Christian Heusel <christian@heusel.eu>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:12 +02:00
Campbell Jones
a981ef40e8 edit: improve editor presence checking
Adds a check for the configured Git editor (git config core.editor) in
both commitpkg and build.sh.

Additionally, instead of blindly executing vi when all other options are
exhausted, remove it instead as it is a none standard installed editor
anyway.

Closes #106

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:12 +02:00
Levente Polyak
fe2eb3076d rebuildpkgs: drop legacy script, will be replaced with a smarter UX
Instead of trying to port this ancient script, which doesn't even seem
to work with community, let's instead remove it. We will be adding a
replacement script in pkgctl soon with a smarter and more convenient UX.
2023-05-20 00:08:12 +02:00
Levente Polyak
4ae857e665 doc: update manpage footer for GitLab and remove static list of maintainers
The list of all maintainers that have worked so far on devtools is
exceeding a sane amount making each manpage convulsed. The authors can
be pulled from GitLab directly without occupying lots of space on every
manpage. We would like to express gratitude to all our maintainers.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:12 +02:00
Levente Polyak
eda3a4aea0 gitlab: add project path function to map special chars
Automatic path conversion is limited to GitLab API v4 and will be
removed in the future. It's expected that the caller does the path
conversion on caller side and only passes a valid path to the API within
its limitations.

Hence convert project names to valid paths:
  1. replace single '+' between word boundaries with '-'
  2. replace any other '+' with literal 'plus'
  3. replace any special chars other than '_', '-' and '.' with '-'
  4. replace consecutive '_-' chars with a single '-'
  5. replace 'tree' with 'unix-tree' due to GitLab reserved keyword

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:12 +02:00
Levente Polyak
f669a71e84 repo-configure: automatically determine protocol from packager identity
The remote protocol is automatically determined from the author email
address by choosing SSH for all official packager identities and
read-only HTTPS otherwise.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:11 +02:00
Levente Polyak
1d7f997215 build: command to build packages inside a clean chroot 2023-05-20 00:08:11 +02:00
Levente Polyak
7954382401 commitpkg: error out if the repo is not configured to latest specs
This ensures the repository we try to commit and release from uses the
latest distro specs for its local git config. The check errors out early
before touching anything and prints a recommendation how to update the
repo.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:11 +02:00
Levente Polyak
1ae09b43af commitpkg: print deprecation warning when executed directly 2023-05-20 00:08:11 +02:00
Levente Polyak
d402d5f308 archrelease: print deprecation warning when executed directly 2023-05-20 00:08:11 +02:00
Levente Polyak
c839d52793 test: added pkgctl devel wrapper for convenient development testing
For local development testing, there is a convenience wrapper for
`pkgctl` that will automatically build the project using make and proxy
all calls to the local build directory.

Either `./test/bin/pkgctl` can be run directly or the `test/bin`
directory can be added to the PATH.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:11 +02:00
Levente Polyak
cddba60958 archrelease: add checks for valid remote and up-to-date branch ref
It's safest to probe for the validity of the remote origin and abort
early otherwise. This also allows to print some hints how to create or
configure new repositories at appropriate times.
Additionally fetch remote changes and check the local branch contains
the remote branch ref, otherwise abort and print a hint how to pull and
update the branch.

This should add all check needed for the average failure case that may
lead to a weird state or creation of a local tag that may not be
pushable.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:11 +02:00
Levente Polyak
f1673c60ad build: replace m4 defines with sed scripts during build
There is no reason anymore to use m4 since we got rid of the includes by
using library files. Let's replace the last usage of m4 and completely
red rid of it.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:11 +02:00
Levente Polyak
e0307c7925 conf: move makepkg and pacman config into separate conf.d dirs
We have used the datadir like a kitchen sink, lets clean up a bit by
having a better and well structured layout. Put makepkg and pacman
configs in separate directories: makepkg.conf.d and pacman.conf.d.
2023-05-20 00:08:11 +02:00
Levente Polyak
5752488ef1 release: command to commit, tag and upload build artifacts
This is a smart and more convenient invocation of the classical
commitpkg and archrelease with auto-discovery for target repositories
and a shorthand option to directly call db-update.
2023-05-19 22:27:13 +02:00
Levente Polyak
b9db6160a2 git: convert repos and tags config to new repo layout 2023-05-19 22:27:13 +02:00
Levente Polyak
f834fc4700 db: command for Pacman database modification like update, move etc 2023-05-19 22:27:13 +02:00
Levente Polyak
8b5bcd01b4 commitpkg: add exported pgp keys with git 2023-05-19 22:27:13 +02:00
Levente Polyak
2a59c32bf4 repo: added command to create a new packaging repository 2023-05-19 22:27:13 +02:00
Levente Polyak
77d800eab2 auth: implemented module to authenticate against our GitLab
This helps to have a convenient way to manage and test our personal
GitLab tokens. Those are used for certain API calls like creating new
repositories.

prefill the access token web view as per
https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html#prefill-personal-access-token-name-and-scopes

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-19 22:27:12 +02:00
Levente Polyak
d2245b1943 gitlab: implemented module for required API calls
We need to use API calls as we can't create repositories in protected
namespaces by simply pushing a none existing repository. For privacy
reasons this is limited to private personal repositories in GitLab.
2023-05-19 22:27:12 +02:00
Levente Polyak
f63d343e40 config: implemented simple config module to store token and settings 2023-05-19 22:27:12 +02:00
Levente Polyak
b5d5402e43 src: modularize repo layout into a library
This will greatly help us to structure the functionality and commands in
a more sane way. We will distribute the sources as actual libraries and
reuse code with imports instead of processing everything with m4 and
duplicating a lot of code.
2023-05-19 22:27:12 +02:00
Levente Polyak
a8be7423ef pkgctl: add a unified command-line frontend for devtools
This is the first step of a simple and highly structured unified
interface to devtools commands in a single wrapper.

The split is based on groups like `repo`, `build` and `diff`

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-19 22:27:12 +02:00
Levente Polyak
d15bd29a9d pkgrepo: add subcommand to open the packaging repository's website
This can be quite handy if a packager quickly wants to check the GitLab
page for merge requests or but reports. Quickly calling a cli command
inside the current packaging clone or with the pkgname provided will
open the remote location inside the browser.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-19 22:27:12 +02:00
Levente Polyak
95424a88eb pkgrepo: add option to clone all existing packages
This can be very handy for cache warming on the repo server or
to perform mass operations on all PKGBUILDs.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-19 22:27:12 +02:00
Levente Polyak
3d3176beb6 pkgrepo: rename archco as a general purpose tool for packaging repos
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-19 22:27:12 +02:00
Levente Polyak
6aa42e1f6e commitpkg: use library location for common server and remote properties
It makes a lot of sense to have them in a central place that can be
swapped and also re-used across different execution units. Hence lets
move the repos.archlinux.org host to lib/common.sh

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-19 22:27:12 +02:00
Levente Polyak
30616c4fde archco: add option to clone all packages of a maintainer
Query Archweb to retrieve a list of all packages of a maintainer by
their pkgbase. AFterwards loop through all packages and clone them.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-19 22:27:11 +02:00
Levente Polyak
5eb09a9cc9 archco: implement clone and configure subcommands
Manages Git packaging repositories and helps with their configuration
according to distro specs.

Git author information and the used signing key is set up from
makepkg.conf read from any valid location like /etc or XDG_CONFIG_HOME.

The configure command can be used to synchronize the distro specs and
makepkg.conf settings for previously cloned repositories.

The unprivileged option can be used for cloning packaging repositories
without SSH access using read-only HTTPS.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-19 22:27:11 +02:00
Levente Polyak
6675894159 archco: convert tool to git clone 2023-03-19 22:02:04 +01:00
Levente Polyak
bb72473529 crossrepomove: drop support as this is not needed anymore
We unified the source repositories to a single location. Having to cross
repo move them between physical locations is not required anymore.
2023-03-19 22:02:04 +01:00
Levente Polyak
1f4ca51ca1 commitpkg: omit pkgbase in commit msg as git repos are per pkgbase 2023-03-19 22:02:04 +01:00
Levente Polyak
b9d20c10a9 archrelease: fix git tag conversion and use library function for it
This allows us to reuse the code and have the conversion in a single
place instead of cluttering rules across different execution units.

It also fixes the implementations according to the specs of
git-check-ref-format.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-03-19 22:02:04 +01:00
Levente Polyak
1844418956 archrelease: explicitly push the main refspec 2023-03-19 22:02:04 +01:00
Morten Linderud
f0946c65f5 archrelease: Added pkgver to git tag conversion
Signed-off-by: Morten Linderud <foxboron@archlinux.org>
2023-03-19 22:02:04 +01:00
Morten Linderud
f7d122044b archrelease: ensure we check the checksum of the package
Signed-off-by: Morten Linderud <foxboron@archlinux.org>
2023-03-19 22:02:04 +01:00
Morten Linderud
b6f5220bed commitpkg: ensure we always stage and rm files
Signed-off-by: Morten Linderud <foxboron@archlinux.org>
2023-03-19 22:02:04 +01:00
Morten Linderud
f4213f9c36 commitpkg: ensure we always use the main branch
Signed-off-by: Morten Linderud <foxboron@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-03-19 22:02:04 +01:00
Morten Linderud
90aba4f84b git: first iteration of git support
Signed-off-by: Morten Linderud <foxboron@archlinux.org>
Adjusted-by: Levente Polyak <anthraxx@archlinux.org>
2023-03-19 22:02:04 +01:00
Jelle van der Waa
9297eb344e commitpkg: disallow weak hashing algorithms
Do not allow uploads of source=() with only weak cryptographic hashing
algorithms but require at least one strong algorithm.

This doesn't 100% enforce it ofcourse, but it allows for an early
failure instead of failing in `db-update`.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-03-19 21:57:30 +01:00
nl6720
b34814419d sogrep: do not hardcode the mirror
Use the first mirror that is configured for each repo in pacman.conf.
With the default configuration, this means to use the first mirror from /etc/pacman.d/mirrorlist.

If a repo is not configured in pacman.conf, fall back to https://geo.mirror.pkgbuild.com.
2023-03-16 19:03:56 +02:00
Levente Polyak
6dd7be3fd4 Version 20230307 2023-03-07 01:51:40 +01:00
Tobias Powalowski
0365edb264 fix: enable extglob before func definition for bash-5.2 compatibility
The `extglob` option changes the behavior of the shell parser, since
extended glob patterns would otherwise be syntax errors. bash-5.2
changed the way a function definition is processed by calling the parser
instead of relying on the ad-hoc code in bash-5.1 and earlier versions.
This means, in bash-5.2 the shell function was parsed without `extglob`
being enabled because the `shopt` command to enable it was part of the
function body.

Add `shopt` options for `extglob` around function definitions to address
this issue and allow bash-5.2 to correctly parse the function.

Co-authored-by: Frédéric Pierret (fepitre) <frederic.pierret@qubes-os.org>
Co-authored-by: Levente Polyak <anthraxx@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-03-06 21:51:27 +01:00
Celeste Liu
4ff7aa0d8a archbuild: add doc for bind mount config
Signed-off-by: Celeste Liu <CoelacanthusHex@gmail.com>
2023-03-06 21:06:59 +01:00
Evangelos Foutras
320c1fd0ac mkarchroot: stop adding C.UTF-8 to locale.gen
Adding such an entry is problematic as it results in locale -a showing:

  C
  C.UTF-8
  C.utf8
  POSIX
  (other locales)

In the above, C.UTF-8 is built-in whereas C.utf8 comes from locale.gen.

The duplicate locale has the potential to expose undesired behavior in
upstream software: https://github.com/sudo-project/sudo/issues/241
2023-02-15 22:51:40 +02:00
Levente Polyak
7b209b63a7 commitpkg: abort execution if msg file editor exits none-successfully
Previously the script execution did not abort if the msg file editor
exited none-successfully leading to undesired commits with a potentially
unfinished message. Instead abort the commit if the msg file editor is
deliberately terminated with a failure code.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-01-17 00:48:24 +01:00
Levente Polyak
d45e77738b commitpkg: properly cleanup commit msg file on abort
Use the workdir location which gets cleaned up automatically. Previously
this was leaking tmpfiles if the commitpkg command got aborted after
file creation.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-01-17 00:47:20 +01:00
Celeste Liu
009c58f7c9 archbuild: add architecture-specific mount config
config path: @pkgdatadir@/mount.d/${arch}

config format:
Each line will start with 'ro' and 'rw' will be used, other lines will
be ignore, rest of line is out/path:in/path. e.g.

```
ro /some/path:/proc/cpuinfo
rw /some/some/path:/var/cache/pacman/pkg
```

For example, in the RISC-V port, if we use qemu-user to build, we need
to pass a parameter to makechrootpkg to map a correct /proc/cpuinfo, so
that software that relies on /proc/cpuinfo to obtain information can be
built normally.

Signed-off-by: Celeste Liu <CoelacanthusHex@gmail.com>
2023-01-06 16:58:29 +01:00
Felix Yan
112026580d makechrootpkg: make /tmp inside nspawn larger
systemd by default limits the /tmp folder to be 10% of the host memory:
6f2cea06bf/src/shared/mount-util.h (L33)

This is problematic to our builds because many toolchains opt to put
build artifacts in /tmp, and expecting the host memory to be 10 times
larger is not optimal or even realistic sometimes.

This MR attempts to enlarge it to 50% memory as the host machine's
default value of /tmp. This should be a fair compromise between being
overly conservative and taking up too much memory to crash the system.
2023-01-06 16:25:46 +01:00
Levente Polyak
f870ab6864 Version 20230105 2023-01-05 16:20:42 +01:00
Levente Polyak
ea782a8ab7 makepkg.conf: enable rust debuginfo
This enables DEBUG_RUSTFLAGS with the appropriate debuginfo settings.

The empty RUSTFLAGS variable is required workaround to avoid double
compilation during package function call. The issue is that the
behavior of the current implementation of buildenv_debugflags is not
idempotent, so consecutive calls will append the same flags again
leading to cargo consider the build inputs to have changed.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-01-03 23:23:43 +01:00
Morten Linderud
a510331698 mkarchroot: remove deprecated -d option
It's been deprecated for a few years now.

91562aa99c

Signed-off-by: Morten Linderud <foxboron@archlinux.org>
2022-11-21 21:48:22 +01:00
Hugo Osvaldo Barrera
dca8f91d26 makerepropkg: Use $CARCH instead of hardcoded x86_64
`makerepropkg` has a hardcoded "x86_64", so fails to run on other
[unofficial] architectures, because it tries to use an x86_64-specific
makepkg config, which overrides CARCH=x86_64.

This patch addresses hardcoded half of the problem; ArchLinux derivates
still needs to ship a custom `devtools` package with their own
`makepkg-$CARCH.conf`. Usually, the only thing that really needs to be
changed in the per-architecture custom makepkg.conf is CARCH and CHOST.

See: https://lists.archlinux.org/archives/list/arch-projects@lists.archlinux.org/thread/XEEW5LXYFN3XXI5YXAUY5E4LZLMKOFTL/
2022-11-08 22:25:32 +01:00
Morten Linderud
b64d8ebacf makepkg.conf: Include debug option by default
Signed-off-by: Morten Linderud <foxboron@archlinux.org>
2022-11-07 22:11:35 +01:00
Levente Polyak
248cdf7ff2 Version 20221012 2022-10-12 21:40:39 +02:00
Levente Polyak
04a821dddf common: prevent globbing and word splitting in find_cached_package
We changed the glob in 5d02c6df7f
but we forgot to quote the newly introduced variables.
2022-10-12 21:29:30 +02:00
Mike Yuan
d82bc69716 makechrootpkg: fix short option handling for makepkg_args
Currently, when multiple short options are passed as a single argument,
only the one that matches the first case statement will be parsed. This
shall be fixed by using switch-case resume.
2022-10-13 00:10:17 +08:00
Felix Yan
5d02c6df7f common: improve performance of find_cached_package
find_cached_package was unnecessarily looping over all packages which
uses a lot of CPU and could be exceptionally slow when PKGDEST contains
a lot of packages.

Fix this by adding the target pkgname, pkgver and arch to the glob and
only process potential candidates.
2022-10-11 20:25:08 +02:00
Levente Polyak
20f89df443 Version 20221002 2022-10-02 22:21:36 +02:00
Levente Polyak
fcaf3ecec0 fix: do not set extglob globally to avoid side-effects
Instead only enable it for whatever operation requires them.

Example sides effects:
commitpkg can accidently execute PKGBUILD functions when sourcing the
PKGBUILD that has function names like package_libsigc++()

Fixes #87
2022-09-01 23:40:21 +02:00
Levente Polyak
280ef10d37 make: declare lib files as build dependencies for bash src scripts 2022-09-01 23:40:21 +02:00
Levente Polyak
f8d2ad9a7d diffpkg: pass the --color option appropriately to diffoscope
Diffoscope has a different option, called --text-color which only
understands the verbose options. Hence we extend the --color shorthand
for --color=auto and pass the changed option name to diffoscope.
2022-09-01 23:38:44 +02:00
Levente Polyak
2e4060445a crossrepomove: fix moving debug packages to the target repo
We did not copy over the optional debug packages to the staging
environment before db-updating the moved state. Afterwards the db-remove
call removed the debug packages from the source repo. This lead to
dropping debug packages when using crossrepomove.

This approach ensures we have a uniform shell to avoid shell glob
behavior inconsistencies. The copy of the package path is mandatory and
will error out if missing while the debug package path is optional as
reflected by a subshell that succeeds either way.

Fixes #92
2022-08-31 23:55:05 +02:00
morganamilo
1e23bbc164 makechrootpkg: support -A makepkg flag 2022-08-31 23:38:13 +02:00
Levente Polyak
53be0527e2 fix: properly check for invalid argument in checkpkg and diffpkg
The option switch case only matches by splitting via '|' instead of ','
2022-08-31 02:26:47 +02:00
Levente Polyak
f4e8047d65 diffpkg: prefer to search inside the pool dir if available
On certain packaging machines where the pacman cache gets updated very
infrequently, the behavior of diffpkg may not function correctly as old
packages were to be downloaded as diff target. In such cases we look for
a pool directory first and search via a glob for an available pool
package sorted by version.

The pool search glob has three glob segments each disallowing the dash
delimiter to split across pkgrel, pkgver and arch. This will return the
correct package from the pool without considering overly eager wildcards
that potentially match different pkgnames.

The default pool search directory is /srv/ftp/pool
2022-08-31 02:26:47 +02:00
Levente Polyak
70a3041ff8 diffpkg: allow to set column width for side-by-side view
The magic values `columns` and `auto` allow to set specific aspects,
with 'auto' as the default value:

- auto: Set width to the maximum line length of all input files
- columns: Set width to the shell defined $COLUMNS env var

Furthermore any number can be passed to set a static width.
2022-08-31 02:26:47 +02:00
Levente Polyak
ba070f1ca9 diffpkg: add colored output option with default of auto 2022-08-23 20:23:51 +02:00
Levente Polyak
b9dadc5576 diffpkg: allow to choose between unified context and two columns 2022-08-23 20:23:22 +02:00
Greg Land
6bd7e70e68 doc: Fixed spelling error in devtools man page 2022-08-13 15:23:14 +02:00
Levente Polyak
626aecb472 make: split out man page files into doc/man folder 2022-06-22 01:05:03 +02:00
Levente Polyak
2088244564 make: use GEN message for all generated content 2022-06-22 01:05:03 +02:00
Levente Polyak
37df0765d2 cleanup: move PKGBUILD.proto to contrib folder 2022-06-22 01:05:03 +02:00
Levente Polyak
6d946989f3 doc: update links and references after moving to GitLab 2022-06-22 01:05:03 +02:00
Levente Polyak
5e680513e6 make: automatically collect man pages via wildcard 2022-06-22 01:05:02 +02:00
Levente Polyak
d94badcd0b make: split out source files into src folder 2022-06-22 01:05:02 +02:00
Levente Polyak
e1a51770b2 make: split out config files into conf directory 2022-06-22 01:05:02 +02:00
Levente Polyak
bb1a89a837 make: split out completion scripts from root worktree 2022-06-22 01:05:02 +02:00
Levente Polyak
225bac5a49 make: properly handle build target prerequisites
- Use wildcard for the lib directory for all binprogs
- Fix individual man page prerequisites for asciidoc.conf and footer
- Require all as prerequisite for the install target
2022-06-22 01:05:02 +02:00
Levente Polyak
6f5aa9f438 make: use build dir as target instead of polluting root workdir
This introduces a BUILDDIR make variable that is used as the target
directory. This gives us more flexibility and easier control of a none
dirty worktree by not polluting the main workdirs.
2022-06-22 01:05:02 +02:00
Levente Polyak
b7f2f4935d chore: remove executable bit from *.in source files
Those files should not be executable, its simply a wrong bit on the
files as they are useless without preprocessing.
2022-06-22 01:04:56 +02:00
Levente Polyak
b8d9a2b4fd Version 20220621 2022-06-22 00:58:19 +02:00
Levente Polyak
f386c13142 export-pkgbuild-keys: fix export for packages without validpgpkeys
In case the validpgpkeys array is empty or undefined, the empty printf
line only included a single line break which lead to mapfile -t
consuming it as an array with 1 element consisting of an empty string.

Fix this by only calling the printf in case the validpgpkeys array is
not empty. Without any output, the mapfile -t will simply produce an
empty array.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2022-06-22 00:51:22 +02:00
Levente Polyak
49d889cb8d Version 20220620 2022-06-20 22:54:34 +02:00
Levente Polyak
ac222ae004 archrelease: support subdirectories in package directories
We need to support subdirectories for the `keys` directory used to
distribute PGP keys alongside the packaging sources.

This is achieved by using `svn ls` to list the files and directories
in the packaging root and leverage the behavior of `svn copy` to
consider subdirectories inside the root but only copy over files and
directories under the subdirectory that are already tracked by svn.
As a step in between, we now use `svn ls --recursive` to list all
tracked svn files in the current repos directory and remove all tracked
files in the staging area. Hence the `svn copy` in combination with the
`svn rm` will result in a sync behavior from the packaging root to the
repos directory.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2022-06-10 16:51:52 +02:00
Allan McRae
cde012d25e Add x86_64_v3 builders
Signed-off-by: Allan McRae <allan@archlinux.org>
2022-06-10 16:31:45 +02:00
Levente Polyak
383cfa7e60 Version 20220609 2022-06-09 21:29:10 +02:00
Levente Polyak
7a8f101498 doc/export-pkgbuild-keys.1: fix filename to detect manpage location
The manpage doc has been added without a suffix which fails during
install.
2022-06-09 21:25:10 +02:00
Levente Polyak
01b6196883 export-pkgbuild-keys: use TEMPDIR while exporting key
This avoids the possibility to pollute the keys directory with temporary
files if the script is aborted in between.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2022-06-09 21:10:03 +02:00
Levente Polyak
8d4c46d368 export-pkgbuild-keys: add simple success export messages
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2022-06-09 21:06:38 +02:00
Allan McRae
d00a28ea0e Export source PGPs from PKGBUILD on commit
Provide a tool to export keys listed in the PKGBUILDs validpgpkeys to
keys/pgp/$fingerprint.asc.

The presense of the "keys" directory alongside the PKGBUILD in trunk/
is tested during commitpkg.  If the directory is abscent, keys are
exported and added to the commit.  If the directory is present, a
check is made to ensure all valid PGP keys are provided.

Signed-off-by: Allan McRae <allan@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2022-06-09 20:41:18 +02:00
Felix Yan
5e98478344 mkarchroot: generate and use C.UTF-8 by default
systemd >= 251 is forcing nspawns to use LANG=C.UTF-8:
b626f6959b

It makes sense to generate the C.UTF-8 locate here when using it as the
default LANG value.

Related to: https://bugs.archlinux.org/task/74864
2022-06-09 01:07:43 +02:00
Felix Yan
0c61761f33 mkarchroot: unshare mount namespace to avoid broken root chroot creation
While `extra-x86_64-build -c` is running `pacstrap` and has
`/var/lib/archbuild/extra-x86_64/root/run` mounted, another user logs
in, thus creating a new mountpoint `/run/user/$uid` that propagates into
`/var/lib/archbuild/extra-x86_64/root/run/user/$uid` leading to a broken
root chroot.

Successive `extra-x86_64-build -c` calls will result in cleanup errors:

```
$ extra-x86_64-build -c
==> Creating chroot for [extra] (x86_64)...
-> Deleting chroot copy 'root'...
rm: skipping '/var/lib/archbuild/extra-x86_64/root/run', since it's on a different device
rm: skipping '/var/lib/archbuild/extra-x86_64/root/run', since it's on a different device
==> ERROR: Working directory '/var/lib/archbuild/extra-x86_64/root' already exists
==> ERROR: Aborting...
```

Reported by and patch adjusted from archlinuxcn.

Fixes FS#64698
2022-06-09 00:56:41 +02:00
Levente Polyak
c2f163b640 diffpkg: support comparing two given package archives
This adds support similar to diffpkg from the infrastructure repo
that is based on the assumption that two archives can be passed
to the tooling in order to compare them.
2022-05-17 21:03:44 +02:00
Levente Polyak
c339536a37 diffpkg: support multiple diff modes to compare with
This adds support for the following diff modes:

- content list (default)
- diffoscope
- .PKGINFO diff
- .BUILDINFO diff
2022-05-17 21:03:44 +02:00
Jelle van der Waa
11edc45048 diffpkg - diff repo vs. build package
Include a new tool as alternative to checkpkg, this runs diffoscope on a
newly build package and the current repository package. This can be
useful for finding new files / binaries.
2022-05-17 21:03:43 +02:00
Levente Polyak
f42b032c5e make: respect PREFIX for bash completion instead of hardcoded /usr 2022-05-17 21:02:10 +02:00
Levente Polyak
c52fab2562 make: remove bash completion symlinks on uninstall 2022-05-17 20:57:32 +02:00
Leonidas Spyropoulos
54acc5872c build: enable gitlab-ci
Closes #85

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2022-04-28 19:10:59 +02:00
Haochen Tong
82cb6756aa sogrep: fail if links database cannot be retrieved
If the links database (for some reason) does not exist on the mirror,
curl will save the html 404 page as ${repo}.links.tar.gz in the cache,
and sogrep will later fail with a decompression error from bsdtar.

This patch adds -f to curl so it doesn't save the error page, and exit
after displaying an error in such case.

Fixes !88

Signed-off-by: Haochen Tong <i@hexchain.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2022-04-06 00:11:16 +02:00
Evangelos Foutras
74164e348b makepkg.conf: set LTOFLAGS="-flto=auto"
For use with pacman 6.0.1-4 which backports support for LTOFLAGS in
order to speed up builds that use gcc as the compiler. This is less
useful when clang is used, though a hack would be to specify in the
PKGBUILD `LTOFLAGS="-flto=thin"` (outside of any function).
2022-03-07 15:41:17 +02:00
Levente Polyak
a17c9c6a70 Version 20220207 2022-02-07 23:28:03 +01:00
Evangelos Foutras
065c00ad8f makepkg.conf: drop -fvar-tracking-assignments flag
According to gcc(1), this flag (like -fvar-tracking) is enabled by
default when compiling with optimization and debugging information.

As an additional benefit, packages building with the clang compiler
will work with the default flags without having to remove this flag
due to not being recognized by clang.
2022-01-31 16:34:07 +02:00
Levente Polyak
ea162ef041 make: use gzip option to get reproducible tar dist like GitLab 2022-01-26 22:44:09 +01:00
Levente Polyak
648ab0ad5e Version 20220126 2022-01-26 22:30:51 +01:00
Morten Linderud
63ad548818 commitpkg: Implement debug package handling
This implements the logic we need to properly figure out debug packages
when finding packages we are suppose to upload towards
repos.archlinux.org.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2022-01-26 21:31:37 +01:00
Morten Linderud
39a99e1664 common: Implement helper functions from dbscripts
This implements our current debug package detection logic.
Mostly taken from our dbscripts project.

Signed-off-by: Morten Linderud <foxboron@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2022-01-26 21:31:32 +01:00
Morten Linderud
95d06e0f60 commitpkg: Split signature check into own loop
This allows us to extend the uploads array without having to duplicate
the current signing logic.

This doesn't change anything as we still exit on any failed packages.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2022-01-26 21:31:27 +01:00
Morten Linderud
ec16d6e4bd common: implement validity as a function
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2022-01-26 21:31:21 +01:00
Felix Yan
fa5afbc30b checkpkg: set makepkg vars from build root to support none host archs
When building for an architecture different from the host, the correct
old package was downloaded as "$copydir"'s pacman was configured with
the target CARCH, but checkpkg doesn't know this and tries to search the
cache for host CARCH instead, producing the following error:

`==> ERROR: tarball not found for package: xxx`

This change fixes this by passing the appropriate makepkg config
explicitly, so that checkpkg behaves consistently.

Co-Authored-by: Levente Polyak <anthraxx@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2022-01-22 01:12:32 +01:00
Levente Polyak
412d032c26 Version 20211129 2021-11-29 20:43:22 +01:00
Levente Polyak
16b7a0e7e8 makepkg.conf: enable LTO option by default
Enable link time optimization (LTO) of packages by default by adding the
-flto flag. This provides smaller, faster executables/DSOs, and improves
GCC diagnostics.

This commit implements RFC 0004
https://gitlab.archlinux.org/archlinux/rfcs/-/blob/master/rfcs/0004-lto-by-default.rst
2021-11-28 14:33:52 +01:00
Levente Polyak
cc6cf65ef9 makerepropkg: support parallel runs in dedicated namespaces
This adds proper namespace locking as well to fix screwing up the
running makerepropkg process.
2021-11-18 20:31:23 +01:00
Levente Polyak
dacde204c9 makerepropkg: use correct devtools makepkg.conf files from dist
Use the recorded buildtool in order to download the matching dist
package and use the appropriate makepkg.conf for reproducing the
package. This is required as the flags are not recorded in the BUILDINFO
hence we need to provide the matching config that declared those flags.
2021-11-18 20:31:23 +01:00
Jan Alexander Steffens (heftig)
1f1f6be889 Revert "Layer gnome-unstable above staging, not testing"
This reverts commit 3231cf8c36.
2021-11-17 02:32:34 +01:00
Evangelos Foutras
a23dcb0391 makepkg.conf: Sync with pacman 6.0.1-2: Pass -q as first option to curl
Includes the following hotfix:

> upgpkg: pacman 6.0.1-2: makepkg.conf: Pass -q as the first option to curl
>
> This is needed to disable reading the curlrc config file (if it exists).
>
> Same change submitted to upstream pacman:
> https://lists.archlinux.org/pipermail/pacman-dev/2021-September/025348.html
2021-11-16 22:49:44 +01:00
David Runge
7dd29dff46 lddd: Use bash instead of sh
lddd.in:
As all of the devtools scripts are based on bash, we need to use
/bin/bash and not posix sh.
2021-10-29 09:20:43 +02:00
David Runge
d783cb511c Revert "Use #!/bin/bash instead of #!/bin/sh"
This reverts commit 594f972666.

We have not received a reply for the relicensing to GPL-3.0-or-later
from its author @drizzt, which is why we are removing this commit.
2021-10-29 09:19:28 +02:00
David Runge
539f09761c Add GPL-3.0-or-later SPDX identifier to all scripts
Add the SPDX license identifier GPL-3.0-or-later to the header of all
scripts without a specific license and upgrading those that are stated
as GPL-2.0 to become GPL-3.0-or-later.
2021-10-29 09:16:13 +02:00
David Runge
da7f267ef2 Add license statement to README
README.md:
Add license statement to README, specifying that devtools is licensed
under the terms of the GPL-3.0-or-later.
2021-10-29 09:16:11 +02:00
David Runge
4ee3f5c8dd Add GPL-3.0 license file
LICENSE:
Add GPL-3.0 license.
2021-10-29 09:16:05 +02:00
Benjamin Denhartog
be80928384 makechrootpkg: preserve SSH_AUTH_SOCK to support ssh operations
This commit introduces the preservation of SSH_AUTH_SOCK within the
chroot environment, to support SSH-based operations, such as cloning
repositories via SSH.
2021-10-21 21:41:11 +02:00
yoursweetie
9028302ac7 doc: Add arch-nspawn man page 2021-09-08 22:13:36 +02:00
Jelle van der Waa
a9bf4789b3 Sort man page links in man 7 devtools 2021-09-07 22:37:25 +02:00
tsuibin
fd17f53cef doc: Add archbuild man page 2021-09-07 22:23:32 +02:00
yoursweetie
80e8c1fc70 doc: Add makechrootpkg man page 2021-09-07 20:55:42 +02:00
Felix Yan
6535ac9b99 Fix CI and switch to GitHub CI (#68) 2021-09-04 22:19:59 +08:00
bartus
c5c5dbc64f Drop pacutils:pacconf fallback
As of pacman:5.2 `pacman-conf` obsoletes `pacconf`
2021-07-17 23:10:30 +02:00
Levente Polyak
0a0e66a784 feat: support exposing buildtool to aid reproducible builds configs
This helps to map the correct build tool configs that are required to
reproduce a specific package and have the appropriate *FLAGS etc.
2021-07-17 22:56:11 +02:00
Levente Polyak
60e96c9d4b makerepropkg: avoid competing redirects into the same makepkg.conf file 2021-07-17 22:45:21 +02:00
Erich Eckner
30ed6920c7 allow to call setarch with a different value than $CARCH
Introduce setarch-aliases.d/ which gets installed inside
/usr/share/devtools. This allows to assign aliases which map one CARCH
to a different name which gets provided as argument for setarch. This is
necessary on archlinuxarm ("armv6h" -> "armv6l", "armv7h" -> "armv7l")
and allows for more fine-grained architectures (e.g. archlinux32 has
"i686" and "pentium4", which differ in the required cpu capabilities).

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2021-07-17 22:35:04 +02:00
Chih-Hsuan Yen
4602659068 zsh-completion: complete makechrootpkg arguments after *-build -- 2021-07-01 20:25:38 +02:00
Levente Polyak
43d58212c5 pacman.conf: enable ParallelDownloads and NoProgressBar
The progress bar feature creates noisy log files, especially with
parallel downloads. Lets disable the progress bar and instead use
parallel downloads.
2021-06-19 22:26:25 +02:00
Levente Polyak
6a628af422 pacman.conf: enable VerbosePkgLists for easier log consumption 2021-06-19 21:18:37 +02:00
Levente Polyak
0635f0c5ec sync pacman.conf with the pacman 6.0.0-3 package
This effectively does nothing but keep the commented options in sync to
not deviate from the original file for no reason.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2021-06-17 00:05:06 +02:00
Levente Polyak
04af0374f3 sync makepkg.conf with the pacman 6.0.0-3 package
The only effective difference is that -Wp,-D_GLIBCXX_ASSERTIONS is now
only defined for CXXFLAGS as of pacman 6.0.0-1

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2021-06-17 00:04:52 +02:00
Eli Schwartz
54e03641a3 sync makepkg.conf with the pacman package
Aside for comments, this implements the buildflags RFC from:

https://lists.archlinux.org/pipermail/arch-dev-public/2021-March/030374.html
https://gitlab.archlinux.org/archlinux/rfcs/-/merge_requests/3
Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
2021-06-16 23:42:23 +02:00
Evangelos Foutras
385b47e56e sogrep: refresh if any database is over a day old
Outdated sogrep cache has already bit us once in the past. Finding one
or more databases older than a day is a good indication that a refresh
is in order, so do that automatically.
2021-06-16 23:37:10 +02:00
Evangelos Foutras
9d39abbefe sogrep: store unextracted *.links.tar.gz databases
Extracting these databases is painfully slow on HDDs (especially laptop
ones). There shouldn't be a drawback to keeping the tarballs around and
extracting them to a temporary directory (usually tmpfs) to parse them.

The implemented update logic tries to avoid redownloading unchanged dbs.
2021-06-16 23:37:06 +02:00
Levente Polyak
90ba07d9be Version 20210202 2021-02-02 00:51:57 +01:00
Levente Polyak
8c26438df8 makechrootpkg: only expose failed build logs instead of products
After further followups always moving all products isn't actually
desired as they can theoretically be broken in various ways if
arch-nspawn exists non successful.

However, as we would like to always preserve the produced log files we
instead split out the logfiles into an own function and call that for
unsuccessful buils.

Fixes 4f305aa3
2021-01-31 23:44:11 +01:00
Christian Hesse
a49bcf2097 doc: update default build host
Commit 09e169b741 changed the default
build host from dragon.archlinux.org to build.archlinux.org - match
in documentation.

Signed-off-by: Christian Hesse <mail@eworm.de>
2021-01-31 02:16:44 +01:00
Eli Schwartz
0883f45b3a makerepropkg: allow specifying the package in pacman -S format
We now accept:

1) # nothing

    in which case we'll use the PKGBUILD to retrieve...

2) name, or repo/name

    in which case we'll use pacman to cache the package and retrieve...

3) a filename

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
2021-01-27 00:56:48 +01:00
Eli Schwartz
99c2020d47 makerepropkg: do fast cache lookups
Teach get_pkgfile to call itself in local-only mode and find a cached
file no matter what its extension is. Avoids repetitively trying to curl
random files, fail with 404 errors, and proceed to discover a cache hit
under a different file extension.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
2021-01-27 00:56:48 +01:00
Christian Hesse
00f7a6a415 makepkg.conf: make rsync use new-style compression in makepkg.conf
Our rsync package is no longer built with bundled zlib, so old-style
compression is no longer supported.

https://www.archlinux.org/news/rsync-compatibility/

Signed-off-by: Christian Hesse <mail@eworm.de>
2021-01-26 20:56:46 +01:00
bartoszek
4f305aa316 makechrootpkg: Expose failed build logs/products
Since move_products() function is fairly robust we can make it run for
failed build also to expose logs for packages that fails in build(),
prepare() or package(). It also exposes partially packaged split
packages if they fail in latter package_xxx().
2021-01-26 20:43:29 +01:00
Levente Polyak
09e169b741 offload-build: change default host to build.archlinux.org 2021-01-26 20:40:47 +01:00
Jelle van der Waa
360a7611a8 doc: add devtools.7 man page
Signed-off-by: Jelle van der Waa <jelle@vdwaa.nl>
2021-01-26 20:39:06 +01:00
Konstantin Gizdov
d507db9490 offload-build: respect SRCEXT from makepkg.conf 2021-01-26 20:38:53 +01:00
Levente Polyak
aff81d34fd Version 20200407 2020-04-07 19:46:10 +02:00
Levente Polyak
5b1123e11f offload-build: retrieve the PKGBUILD in case makepkg changes it via pkgver
Building a package may change the PKGBUILD during update_pkgver. Let's
retrieve the PKGBUILD after building to ensure we have the very same
file as the one we used to build the package. Otherwise this may lead to
the inability to distribute the package during commitpkg in case the
expected and the actual hashsum mismatch.
2020-03-09 23:27:03 +01:00
Levente Polyak
a0f79fcce0 makerepropkg: prioritize downloading .zst packages over legacy format
First try a .zst location before falling back to legacy variants. This
should slightly speed up downloading of dependencies, especially over
time as .zst packages are or will be the dominant format.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2020-03-09 23:27:03 +01:00
Eli Schwartz
94b0413e13 arch-nspawn: fix up host_mirrors cachedir handling
This was incorrectly implemented in commit
0067176529, which added the host_mirrors
root directory as a cachedir, when we actually want to use the pool/*
subdirectories (the same ones installed on the build server's
/etc/pacman.conf).

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2020-02-27 14:50:27 +01:00
Eli Schwartz
e963b6da9e makechrootpkg: use the chroot database to find checkpkg packages
We don't want to check against the current version known to the host
system, because that will be incorrect in a wide variety of situations,
including:
- the build host hasn't done a full system upgrade yet
- we're building against staging, and want to see the delta between
  different staging versions
- we're building against extra, but the host runs testing which carries
  changes we don't want to visualize right now
- the chroot has a configured database not available to the host, and
  the package is only available there

Essentially, it's rarely 100% correct to run checkpkg on the host, but
we already have a database we *know* is correct, and that is the one we
just built the package against. So let's use that.

This also fixes a bug in the current logic, where in order to try
downloading fresh databases, we work in a non-cached temporary working
database to download the package files, but then let checkpkg default to
comparing packages in the system database. Since we are explicitly
trying to compare against packages that differ from the host's pacman
database, we need to pass the package files as options to checkpkg,
using the additional modes added in commit c14338c0fe

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2020-02-27 14:50:19 +01:00
Eli Schwartz
b2cbb8628e checkpkg: fix support for http:// url comparisons
Broken in commit c14338c0fe.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2020-02-27 14:50:14 +01:00
Eli Schwartz
6d273f79c3 zsh-completion: update for new makerepropkg options
Thanks to anthraxx for the guidance.

Original-patch-by: Levente Polyak <anthraxx@archlinux.org>
Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2020-02-27 14:50:05 +01:00
Eli Schwartz
51842a1676 makerepropkg: support checking multiple split packages
By specifying multiple package files, we assume they are all from the
same PKGBUILD, and try to check them all against the produced artifacts.
Since the buildinfo should be comparable for all of them, we simply use
the first one passed on the command line.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2020-02-27 14:49:54 +01:00
Eli Schwartz
53fe5c67a1 makerepropkg: add support to check unreproducible packages using diffoscope
Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2020-02-27 14:49:48 +01:00
Eli Schwartz
21d9984acc makerepropkg: fix wonky indent
Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2020-02-27 14:49:33 +01:00
Levente Polyak
cb6484fe45 Version 20200213 2020-02-13 01:53:45 +01:00
Levente Polyak
bcb1b4a163 offload-build: handle user specific makepkg.conf on the remote host
This ensures we take user specific config values for PKGDEST into
account when printing the package list. This is required as devtools
archbuild_cmd puts packages potentially into the user defined PKGDEST
which the package list would otherwise miss.
2020-02-12 00:05:00 +01:00
Levente Polyak
57fb44b976 offload-build: take makepkg.conf from devtools for appropriate packagelist
This fixes an issue with the usage of makepkg --packagelist to get the
produced artifacts filenames according to the PKGEXT used in devtools'
makepkg.conf instead of the one defined in pacman.

One goal we want to preserve is that devtools configuration should be
self contained and not require any editing of non owned files like
the host /etc/makepkg.conf to produce expected results.

Additionally modify the archbuild_cmd override for multilib builds to
use an independent variable and not fiddle with the actual arch
variable to select the appropriate cmd.
2020-02-11 01:42:17 +01:00
Levente Polyak
9b4d8ae930 offload-build: convert to in-prog so we can perform pre-processing 2020-02-10 23:02:41 +01:00
Levente Polyak
4c206ab549 makerepropkg: take makepkg.conf from devtools pkgdatadir location
This ensures we use the same configuration for reproducing packages as
we use for building them via devtools.
One example of why we care about this are the COMPRESS* settings that
may differ from the guest's pacman shipped makepkg.conf that affect the
reproducibility of packages.
2020-02-10 23:02:16 +01:00
Eli Schwartz
4c08847bfa makerepropkg: correctly reproduce a pkgfile with any compression type
We don't want the default PKGEXT in the current version of devtools, we
want the PKGEXT we *know* the input file used.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-12-27 18:54:26 +01:00
Levente Polyak
74d7a70915 Version 20191227 2019-12-27 16:06:30 +01:00
Robin Broda
5eacb475cd makerepopkg: fix zstd extension (.zstd -> .zst) 2019-12-27 16:05:14 +01:00
Robin Broda
bcda211dd8 makepkg.conf: change default compression method to zstd 2019-12-27 16:04:56 +01:00
Levente Polyak
d4546c59ce Version 20191212 2019-12-12 01:01:44 +01:00
Levente Polyak
d6866e0544 lib: support arbitrary compressed package files
We need to modify the matching of valid package files to support formats
like zstd. Let's try to use an eager approach instead of a simple
whitelist in order to be functional for arbitrary formats that may be
introduced in the future without the need to adjust any code.

Allow any single fragment word as compression type but filter out known
non-package content like signature files.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-12-08 20:59:11 +01:00
Eli Schwartz
8edad22616 offload-build: return failure if no package files were found
This means that the remote command died at some stage earlier than the
printing of created files.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
2019-12-05 23:34:23 +01:00
Levente Polyak
f20435643f makechrootpkg: sync databases for checkpkg off-site
Use pacman's --dbpath feature to sync fresh databases inside an isolated
location and split up the database sync and package location calls to
remove the need of weird grep calls.

It isn't nice of makechrootpkg to modify the host database state just by
building packages. No foreign program shall automatically modify
the host database other than by the explicit will of a system
maintainer, which is the major reason this changes get incorporated.

However, there is certain indoctrinated believe that using -Sy is
the prime evil. In fact it has been declared as a social rule to a
technical problem of not getting into potential partial upgrade states.
This is not a proper loophole less solution as there are multiple ways
and use cases that lead to such a state, like aborting a -Syu on the
prompt for whatever reason, what really matters is that it is not a
technically bullet proof solution to solve the problem.

Databases shall have the freedom to be as up to date as databases or
their owner wishes, allowing querying on latest database state without
fear. The only loophole-less contract that _really_ is from importance
is always using -Su instead of plain -S to install packages. Installing
packages is what actually brings one into a potential partial upgrade
state and by using -Su an outstanding upgrade is forced when installing
a new package. This properly solves all edge cases in a technical
manner instead of declaring people who abort the prompt of -Syu to be
the problem. In fact, using this simple contract allows whatever system
maintenance workflow a host owner wants to follow, which may still be to
always use -Syu and deal with system upgrades explicitly instead of the
time when installing new packages, but the -Su contract is the real safe
guard to guarantee no edge case can ever slip in. This magically also
opens up the freedom to people who wish to use -Sy to simply query on up
to date data as the currently indoctrinated "never do -Sy" stone plates
not only are not rock solid in technical terms but also make certain use
cases simply impossible and hence cripple the functionality without at
the very least being fully loophole free.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-12-05 22:50:11 +01:00
Levente Polyak
8d99df602d makechrootpkg: double quote array expansions for checkpkg locations
Avoid re-splitting remotepkg elements used for checkpkg conditions.
2019-11-30 13:44:02 +01:00
Levente Polyak
4c803b9db8 Version 20191130 2019-11-30 13:30:34 +01:00
Levente Polyak
104c5bc90e makechrootpkg: sync database for checkpkg to avoid nonexistent targets
For build servers or similar infrastructure its relatively common to not
sync/update the database regularly. This leads to problems properly
running checkpkg duo to nonexistent target files that we try to
download. As building on build servers is a very common use case, lets
ensure we sync the local database before trying to resolve the package
locations.
2019-11-30 13:25:06 +01:00
Levente Polyak
cee28a1b13 makechrootpkg: check local pkg versions before downloading for checkpkg
Avoid always trying to download and output the according message.
Add checks for packages either not being available in the repo or
all variants have up to date versions stored in the local cache.
2019-11-30 13:25:06 +01:00
Levente Polyak
e0f82d3947 completion: add makerepropkg zsh completion 2019-11-30 13:25:06 +01:00
Levente Polyak
74313db9ee completion: reflect new -U mkarchchroot option 2019-11-30 13:25:06 +01:00
Ivy Foster
2c611d20bd lib/common.sh: do not use colors when running on a dumb terminal 2019-11-30 13:25:05 +01:00
Eli Schwartz
ca4d348c86 doc: add manpage for the new makerepropkg tool
Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
2019-11-30 13:21:23 +01:00
Eli Schwartz
2fb1cc2dd2 makerepropkg: add new program to try to reproducibly build a package
This attempts to recreate a package that was probably created using
makechrootpkg, and see if it conforms to the
https://reproducible-builds.org/ specification.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
2019-11-30 13:21:23 +01:00
Eli Schwartz
bcba566405 mkarchroot: support wrapping pacstrap -U
Needed to support reproducible builds.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
2019-11-30 13:21:23 +01:00
Eli Schwartz
f8f2f02028 archbuild: use better umask
In commit 40a90e2cab we tried to protect
against system umasks resulting in unreadable chroots. However, we tried
to do this in a targeted manner due to not wanting to fiddle with
permissions for user-owned files. Unfortuantely, mkdir -p -m755 does not
actually work that way -- the parent directory is created with broken
permissions. We need umask.

Run umask and mkdir in a subshell to prevent leakage.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
2019-11-30 13:21:23 +01:00
Eli Schwartz
68f0bff172 commitpkg: clearly delineate the commit message template and the rationale
In commit 75d23eec94 we moved to include
commitpkg arguments as the first line of the svn commit message, but we
simply dumped the result after the version number without separating the
two, increasing the cognitive burden of parsing the rationale. Since the
whole point of the change was to make it easier to see what happened
when using git log --oneline (reducing the cognitive burden of parsing
'pretty' output with author/date info), it makes sense to also delineate
the reason correctly.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
2019-11-30 13:21:23 +01:00
Eli Schwartz
f85a58a0a6 arch-nspawn: rely on deduplication to avoid making multiple host_mirror mounts
Instead of comparing exact mirror urls to see if they are in
host_mirrors in order to "skip" the official mirrors

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
2019-11-30 13:21:23 +01:00
Levente Polyak
20eec484fa offload-build: remove empty src dir when SRCDEST is set
Right now there is a bug in makepkg that leaves back an empty src
directory if SRCDEST is set. This is purely cosmetic, but lets just
politely try to rmdir it and fail silently if its empty or non-existent.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-11-30 13:21:23 +01:00
Levente Polyak
6fffbfbc8a offload-build: catch more signals to be sure SRCPKGDEST gets cleaned
It may be not enough to just listen on EXIT depending on the shell used
so lets make sure we clean up SRCPKGDEST by listening to more sigs.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-11-30 13:21:22 +01:00
Eli Schwartz
0017263379 Makefile: sort program names
Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-11-07 21:28:23 +01:00
Eli Schwartz
751093eff2 use libmakepkg to find and use variables in makepkg.conf
- drop homebrew function in makechrootpkg
- use better mock to find invoking user's $HOME
- make offload-build respect makepkg.conf to determine where to sync
  files, matching the behavior of makechrootpkg

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-11-07 21:28:21 +01:00
Eli Schwartz
f43a86ee8a arch-nspawn: simplify cachedir/host_mirror parsing
consolidate logic flows in the same area for parsing and building
arrays. Don't bother having a special function just to build the
mount_args array, since we now use the same handling for adding any
cachedir (including host mirrors) to the mount arguments, this becomes a
trivial for loop -- and it really did not need to be delayed until after
the sanity check, anyway.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-11-07 21:28:20 +01:00
Eli Schwartz
0067176529 arch-nspawn: restore cachedir handling for host_mirrors
In commit 27ff286ee7, we moved from
sourcing the primary cachedir via /etc/pacman.conf, to using the
pacman.conf in the workdir. One unanticipated side effect of this was
breaking the special host mirrors magic we used to turn a host mirror
into a cachedir. It was still processed as a server, but we relied on it
being in the host's cachedirs in order to be persisted, and this no
longer occurred.

Solve this by explicitly adding each host mirror root as a cachedir.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-11-07 21:28:19 +01:00
Daniel M. Capella
75d23eec94 commitpkg: Include commit msg arg in first line
Commit messages belong on the first line, with optional "explanatory
text" starting after a blank line:
https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html

Referencing commit ee970f0bde

Signed-off-by: Daniel M. Capella <polyzen@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-11-07 21:28:17 +01:00
Daniel M. Capella
6679c28625 conf: Sync with pacman 5.2.0-2
Signed-off-by: Daniel M. Capella <polyzen@archlinux.org>
2019-11-06 01:14:05 +01:00
Levente Polyak
2edee89b62 Version 20191016 2019-10-16 00:52:33 +02:00
Levente Polyak
901581936a ci: fix travis build using undocumented but reserved keyword
https://github.com/mikkeloscar/arch-travis/issues/65
2019-10-15 23:50:52 +02:00
jelle van der Waa
29c6fa8537 sogrep: redirect to destination mirror (#25)
Some mirrors redirect consumers to a near by mirror which isn't handled
by sogrep.
2019-10-15 23:30:23 +02:00
Levente Polyak
74f65db396 zsh_completion: add offload-build completion
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-09-28 00:16:25 +02:00
Levente Polyak
64b7d99504 zsh_completion: add sogrep completions
Transform sogrep into an in-prog so we can benefit from the m4 macro
to specify valid repos in a single place of truth.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-09-28 00:16:09 +02:00
Levente Polyak
f32a264796 commitpkg: prefer explicit signature+data parameters for gpg --verify
Lets prefer the explicit variant of gpg --verify by providing both, the
signature and the data file as parameters.
For the unlikely case there is a matching signature file already present
that was created outside of the toolchain and has an embedded signature
with data, we at least could detect it early with this check.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-09-28 00:16:07 +02:00
Levente Polyak
fd6e801cfb commitpkg: disallow if PKGBUILD hash mismatches package's enclosed hash
Several cases showed that we release packages that were built with
different PKGBUILDs than the one commited to the source tree. This is
bad for obvious reasons plus sploils reproducible builds.

We, under no circumstances, want to allow using commitpkg to publish and
release a packages whose PKGBUILD doesn't match the one to be commited.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-09-28 00:16:04 +02:00
Levente Polyak
a3868cf542 commitpkg: fix wrongly ordered find_cached_package call
The unknown packager check didn't worked so far as the wrongly ordered
call to find_cached_package lead to the enclosing block never being
executed.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-09-28 00:16:02 +02:00
Levente Polyak
62a2f118ce make: add target to tag a new version
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-09-28 00:15:56 +02:00
Levente Polyak
723ad23b48 zsh_completion: overhaul all completions to match actual options
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-09-28 00:15:54 +02:00
Levente Polyak
5dd90ef848 checkpkg: add option to print a warning in case of differences
Sometimes its desired to be explicitly made aware of differences
reporter by checkpkg via printing a warning instead of a regular
message.

Automatically use --warn for makechrootpkg builds so packagers are made
visibly aware of a soname bump by simply looking out for colors
indicating non success messages.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-09-28 00:15:51 +02:00
Levente Polyak
5246cb9aa5 checkpkg: add option to avoid keeping the tmp dir
In some cases, like default makechrootpkg execution, the temporary
directory used to assemble the differences is not required. Add an
option to checkpkg that allows to get rid of that directory after
run and call it automatically like that in makechrootpkg.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-09-28 00:15:48 +02:00
Levente Polyak
144f896660 makechrootpkg: run checkpkg automatically after build
Cache previous versions required for checkpkg via pacman to avoid
multiple downloads when running multiple times.

In case we can't download the packages, like while building out of repo
packages, print a warning instead of running checkpkg

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-09-28 00:15:33 +02:00
Levente Polyak
bbcff883d5 Version 20190912 2019-09-12 23:03:12 +02:00
Eli Schwartz
6e466ca654 Revert "makechrootpkg: with -n, check if the package failed to install"
This reverts commit be44b9cde1.

This was a nice idea in theory, because it means that we can catch
conflicting files before releasing them into the repos. In practice,
there were unanticipated side effects: single-package installs which
conflict against their own makedepends cannot be installed either.
Examples include:
- kernel modules which makedepend on their dkms equivalent
- jack2, which makedepends/optdepends on portaudio, which requires
  jack... but jack2 is a drop-in provides/conflicts jack.

We cannot reliably detect when makepkg --install will error out because
of dependency conflicts vs. packages which are simply broken. So, back
out this change for now.

Revisit this once pacutils has a new release, because it will add the
option --resolve-conflicts=all, allowing for much better scripted
responses to "foo conflicts with bar, remove bar? [y/N]" than simply
"--noconfirm and fail".

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-09-12 21:29:42 +02:00
Levente Polyak
d8d2e23247 Version 20190821 2019-08-21 19:23:03 +02:00
Eli Schwartz
be44b9cde1 makechrootpkg: with -n, check if the package failed to install
We previously whitelisted this return code because split packages can
frequently conflict each other, so makepkg -i is *expected* to fail in
such a case. However, there is no good reason to let this succeed if the
pkgbase only builds one pkgname -- that will always be a severe issue.

Add a check for how many split

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-08-09 19:41:54 +02:00
Eli Schwartz
7b0a11677a makechrootpkg: make the -U option work for the first time ever
The -U option was initially introduced in commit
cda9cf436b in order to enable running
makechrootpkg as root, delegating to another, manually selected, user to
perform various non-root tasks (given that makepkg was modified to throw
fatal errors when run as root without the option of --asroot to disable
that). However, it was only ever implemented for the --verifysource
option outside of the chroot, and the builduser inside the chroot is
created with the same uid as the makechrootpkg invoker. It needs to run
as the same uid, because it needs rw access to $startdir and $SRCDEST!
Additionally this lets the invoking user more easily inspect the build
directory in case of problems...

The correct solution for this is to properly implement the initial
intention of the -U option, and make it override the autodetection of
the "invoking user" which is normally done by inspecting $SUDO_USER.
This is then used as the single source of truth for "who am I pretending
to be".

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-08-09 19:41:53 +02:00
Eli Schwartz
93dbb14ab9 archrelease: actually fail in failure conditions
When svn ls fails due to network timeouts, this currently results in
archrelease deleting all files, then committing this as the changeset.
This causes data loss...

With bash 4.4 and using wait $! we can get return the return code of the
last backgrounded command -- which process substitution qualifies as.
Key off of this to make sure that `svn ls` actually succeeded.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-08-09 19:41:53 +02:00
Eli Schwartz
10c6efc440 archbuild: prefer repo/arch-specific configs if they exist
When mixing and matching different repos and architectures not present
in mainline archlinux, it is sometimes desirable to set up differing
presets with more granularity than devtools currently allows.

One example of this is when building for architectures that are only
supported by another project -- in order to coexist on a mainline
archlinux host, a different mirrorlist needs to be used.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-08-09 19:41:53 +02:00
Eli Schwartz
8e4293034b makechrootpkg: also downgrade packages when updating chroots
Packages should never be getting downgraded... unless a package is
pulled from testing, e.g. for example if gcc9 totally breaks the linux
kernel. In such cases, the master repo says there is a downgrade, so
we'd better go with that. Basically, ensure that packages match the repo
they are being built against. Consistency at all costs!

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-08-09 19:41:53 +02:00
Eli Schwartz
b7893a2ca8 makechrootpkg: when installing with -I, ensure package is installed
noconfirm is wrong here, as we don't want to accept the default answer
-- we want to install the new package, even if it conflicts and provides
an existing one. After all, we explicitly asked for it.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-08-09 19:41:53 +02:00
Eli Schwartz
bec29e632b arch-nspawn: unshare the gpg namespace to prevent zombie processes
gpg-agent is really annoying and leaves useless copies of itself around.
Using unshare ensures that all such processes are killed as soon as the
main gpg process dies.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-08-09 19:41:53 +02:00
Eli Schwartz
70f3b8ddb8 finddeps: suppress error messages for unreadable directories
If the find command cannot descend into a directory in order to search
for a PKGBUILD, it is likely a "$pkgdir" which makepkg sets as
unreadable. As far as finddeps is concerned, this error message is not
needed.

Also convert to using null-delimited paths on general principle to
prevent read from splitting on odd paths.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-08-09 19:41:53 +02:00
Eli Schwartz
5fcd90a212 makechrootpkg: accept arguments useful to verifysource
And pass them on to download_sources outside the chroot.

Fixes FS#35652

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-08-09 19:41:52 +02:00
Eli Schwartz
f6f4da26cb makechrootpkg: fix breakage in makepkg option parsing
In commit bd826752c9, support for short
options was added to the heuristic for --noextract, but in the process,
we changed to loop over the set of user options plus the builtin
defaults for inside the chroot. This was wrong, as we only care about
the user options -- moreover, it prevents us from adding verifysource
support *outside* the chroot, for options that are also chroot options,
like --holdver.

Also remove uselessly duplicated line.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-08-09 19:41:52 +02:00
Eli Schwartz
40a90e2cab ensure that sane umask is used where needed
If a user umask is restrictive, a chroot may be created as root without the
ability for the user to read it, which then causes makepkg
--verifysource to fail.

Do not set this in lib/common.sh, where it would apply to all scripts,
as we do not want to override the user's policy for things like $SRCDEST
files, svn checkouts, etc.

Fixes FS#47625

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-08-09 19:41:52 +02:00
Eli Schwartz
74a6641946 Escape paths with ":" that are passed to systemd-nspawn --bind
When parsing paths to automatically make available to the container, the
":" is used internally by systemd-nspawn to signify destinations in the
container. Replace automatically with "\:" for the mounts that we set
up, in order to safely handle a working directory etc. that contains
this character.

For bind options exposed to the user, it is assumed the user takes care
of passing systemd-nspawn compatible paths themselves.

Fixes FS#60845

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-08-09 19:41:52 +02:00
Eli Schwartz
69112171e5 arch-nspawn: support bind-mounting custom file:/// repositories
Fixes FS#45882

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-08-09 19:41:52 +02:00
Eli Schwartz
c14338c0fe checkpkg: implement comparison against alternative targets
This allows comparing the currently built set of packages against
targets named by filename, url, or pkgname. One example use is to
compare a package against a different version that was never in the
repos; another example use is to compare a *-git package against the
non-git version.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-08-09 19:41:52 +02:00
Eli Schwartz
8dbf95cdd4 makechrootpkg: check truthiness using shell arithmetic
Using the literal strings "true" and "false" is inaccurate and may
result in uncertainty of whether it is set when doing string comparison,
or simply rely on the shell implementation of treating the string as a
command builtin, then executing the value as a shell command. Emulate
makepkg, which makes heavy use of shell arithmetic for this purpose.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-08-09 19:41:52 +02:00
Eli Schwartz
46d614d91a Revert "makechrootpkg: Have functions be more function-y."
This reverts (the bulk of) commit 2fd5931a8c.

Reducing globals makes little sense in in a oneshot bash script, but
reduces code clarity and in fact resulted in bugs because even the
commit author couldn't keep track of the script state.

An exit was changed to a return, even though that made no sense outside
of a function, and has been duly returned to being an exit. This was
never tested and later papered over by wrapping the entire script in a
main() function and then calling the function for hysterical raisins.

The functiony nature of sync_chroot/delete_chroot is preserved, as those
functions demonstrate meaningfully standalone functionality -- who
knows? we may want to reuse this. Everything else is tightly bound to
the internal logic of makechrootpkg.

Completely separate functionality that was silently implemented in the
original commit is also preserved:
- declare a couple of variables as locals
- move the abort-on-no-PKGBUILD outside the install_packages function

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-08-09 19:41:51 +02:00
Eli Schwartz
df0d6b867b Revert "makechrootpkg: Avoid having code floating around outside of a function."
This reverts commit 49088b0860.

The fundamental intention was flawed and broken, it caused annoying
issues and regressions, and the self-avowed sole purpose of the change
was so that a downstream project could *post-modify the script and
source it as a library*.

That is not okay. You don't wrap non-factorable code in a function
called main() and call it a library. The only possible use for this is
to treat makechrootpkg *internals* as a library, which is not supported.

Downstream projects that wish to use the functionality of makechrootpkg
should treat makepkg as a command with a public API in the form of
command line options. That is kind of how commands of all kinds work,
since forever. That is how all users of makechrootpkg *except for
parabola* use it.

Arguments that "it saves us the cost of fork+exec to bash" are simply
invalid.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-08-09 19:41:51 +02:00
Eli Schwartz
8f5a02b23d Don't rely on $0 to determine script names.
Programs can freely define the value of argv0 and thus it means nothing.
Instead, use the bash-specific variable explicitly designed to safely
and accurately reference the name of the currently sourced file.

This also fixes the case where simple debugging mechanisms like using
"bash -x foo" tried to treat "foo" as the unqualified $0 and therefore
broke horribly due to lack of pathnames.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-08-09 19:41:51 +02:00
Eli Schwartz
e76d560477 Revert "mkarchroot: Don't let the environment affect pacstrap (sans proxy settings)."
This reverts commit 578a62f1e0.

mkarchroot is run as root (via check_root if needed) so the environment
should already be clean. If not, the user has broken their root
environment, and we cannot support this. It's unclear what environment
settings may or may not be messing with anything, ever, but the original
bug report happened on Parabola who perform extensive patching to
"libretools" such that the code no longer resembles devtools at all.
It's therefore likely any such bug is parabola specific, but we will
never know since the original commit message states that they don't know
why they do it either.

Parsing the user's entire exported environment via both sed and grep is
overkill for a non-bug, especially when it doesn't work for variables
declared -rx and doesn't work for things like:

export fooled_you=$'wow such hax\ndeclare -x http_proxy=lol'

Also if done properly this would rely on compgen -e to print all
exported shell variables. Or even better, loop through /proc/$$/environ
which is both null-delimited and easily parsed with the read builtin and
[[ ]]

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-08-09 19:41:51 +02:00
Brian Bidulock
27ff286ee7 arch-nspawn should not take pacman cache from host
Previously, arch-nspawn was using the hosts' pacman cache in
the chroot even when the chroot was set up with a different
cache by mkarchroot, unless specified with the -c flag.
Problem is that makechrootpkg passes no -C, -M nor -c flags
to arch-nspawn, so all values must be obtained from the
working directory.

This change take the cache directories from the pacman.conf
specified with the -C option unless the -c option was given
(as is the case when the chroot is set up with mkarchroot),
and, when neither -C nor -c is given (as is the case when
invoked by makechrootpkg), the cache directory is taken
from the pacman.conf in the working directory.

This wasn't such an issue when i686 was mainline, however,
which building packages in a chroot against archlinux32 on
an x86_64 platform, the cache of the host should _never_ be
used.

Rebased by eschwartz on top of cachedir reworking.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-08-09 19:41:51 +02:00
Eli Schwartz
2180aabc81 arch-nspawn: don't delete the guest gpg configuration
It's important to ensure the guest has up to date data because updating
a chroot after quite some time can potentially rely on updated
archlinux-keyring, something which the host machine either kept up to
date on or manually fixed, but it kills automation to mess around with
chroot configs like that. Alternatively, signed packages added with -I
need to work, and we assume the host is configured to accept these.

That is *not* a good reason to completely nuke whatever is in the guest,
though. A guest might have been manually configured to accept keys which
aren't accepted by the host; one example of this happening in practice,
is archlinux32 when building 32-bit packages from an archlinux host.

The right solution is to append to, rather thna overwrite, the chrooted
guest's pacman keyring.

To do this, we will use gpg's native facility to dump the keyring from
one GNUPGHOME and import it into another. We'd use pacman-key's --import
option directly, but this doesn't support passing custom options like
--import-options import-local-sigs
Finally use pacman-key's native facility to import the trust status from
the host.

While we are at it, fix a bug where we didn't respect the host's
pacman.conf settings for the GpgDir. While it isn't wildly likely a user
will choose to customize this, it is a valid and supported use case and
we must think about this ourselves.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-08-09 19:41:51 +02:00
Eli Schwartz
2f929c961f fixup commit "arch-nspawn: get all mirrors from host"
In commit d9b7350448, a line was deleted
that had a shellcheck ignore marker, but the marker itself was left in
(and had nothing to do). So, remove it.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-08-09 19:40:05 +02:00
Eli Schwartz
c2bbcbed64 mkarchroot: don't create a broken chroot by default
It's incorrect to make pacman completely useless inside the chroot by
starting off with no pacman keyring. Assuming that the only consumers of
a new chroot will be arch-nspawn (which copies over the hostconf) is
bad design, and furthermore makes it impossible to fix other issues in
arch-nspawn itself.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-08-09 19:40:05 +02:00
Eli Schwartz
b7ce90fefc makechrootpkg: load makepkg.conf variables correctly
Since makepkg.conf is a bash-compatible configuration file, it must be
sourced.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-08-09 19:40:05 +02:00
Eli Schwartz
f52002955c Makefile: don't inject DESTDIR into the pkgdatadir
In commit 46c4def073, we added support for
nonstandard PREFIX installations, but DESTDIR was and is never supposed
to be a part of that. While DESTDIR isn't terribly likely to be used
during `make all` invocations, that's no reason to break horribly if it
is used for some reason.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-08-09 19:40:05 +02:00
Eli Schwartz
58374246c4 Migrate pacman.conf CacheDir parsing to pacman-conf
And while we're at it, make this more consistent. Currently we
unnecessarily support only one -c /path/to/cachedir option.

This requires slightly more thorough handling in mkarchroot to ensure
all custom cachedirs are passed on to arch-nspawn. Rework
to simply forward all arguments to arch-nspawn (minus final arguments
used for pacman -Sy packagelist).

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2019-08-09 19:39:45 +02:00
Levente Polyak
f522ce2277 offload-build: disable shellcheck false-positive for shell-escape 2019-06-13 00:17:11 +02:00
Eli Schwartz via arch-projects
7747749610 doc: add manpage for the new offload-build tool
Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
2019-06-12 23:42:10 +02:00
Eli Schwartz via arch-projects
25b4ef2799 Add new tool: offload-build
This tool is useful for running makechrootpkg on a remote build server,
and is by default hooked up to send a PKGBUILD and initiate a build on
our shiny new build server "dragon".

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
2019-06-12 23:42:10 +02:00
Eli Schwartz via arch-projects
ad4b66830a Revert "makechrootpkg: sync_chroot: Make more general."
This reverts commit 6d1992909c.

It has never worked. In commit c86823a2d4
it was noted that it compared the device numbers for [[ $1 = $1 ]] which
was a useless check and always returned true, for *any* btrfs
filesystem. Now that the function is corrected to compare [[ $1 = $2 ]]
the check is still useless, but this time because it always returns
false -- btrfs subvolumes on the same filesystem do *not* share device
numbers.

So let's go back to the original working implementation that only
matters in terms of makechrootpkg, and just checks if makechrootpkg's
root working directory is btrfs (in which case we know it will be a
subvolume because mkarchroot will create it that way).

This restores our special support for the btrfs filesystem.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
2019-06-12 23:42:05 +02:00
Erich Eckner
321e998020 fix whitespace/indentation errors
Some lines are indented by spaces, while adjacent lines are indentet by tabs.
We should use tabs on both.

Signed-off-by: Erich Eckner <git@eckner.net>
2019-04-20 17:58:55 +02:00
Erich Eckner
c86823a2d4 is_same_fs() in lib/archroot.sh should use $1 and $2, not $1 and $1
The old behaviour would always evaluate to true - this is certainly not
what that function should do.

Signed-off-by: Erich Eckner <git@eckner.net>
2019-04-20 17:55:31 +02:00
Levente Polyak
a49f55cbed Version 20190329 2019-03-29 21:40:28 +01:00
Levente Polyak
5c016c38f2 readme: fix faulty whitespace in release commands 2019-03-29 21:40:28 +01:00
Levente Polyak
1d4a60874b make: fix faulty install targets
This fixes a regression introduced in eeb1c0e59e
2019-03-29 21:40:28 +01:00
Eli Schwartz via arch-projects
b66ce081e7 fix up sogrep manpage to correspond with current sogrep command
Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
2019-03-28 21:17:55 +01:00
Eli Schwartz via arch-projects
1ab9b34c4c add sogrep command
This is the new and improved, canonical sogrep command, now with a valid
license.

The previous version of sogrep had several issues and inefficiencies,
and ultimately wasn't really the finished project I wanted it to be. Due
to a mistake in communication, I was totally unaware it was in the
process of being merged at all, nor that there was a licensing issue, or
I would have recommended waiting for both further improvements, and a
declaration of license intent; nevertheless, here it is now, and I
formally give this over into the GPLv2+ domain.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
2019-03-28 21:17:55 +01:00
Eli Schwartz via arch-projects
ebba5a5885 sogrep: don't be templated when it is not templated
Partition the Makefile targets to only clean configured files, and make
the configured files be a subset of the bin programs.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
2019-03-28 21:17:50 +01:00
Jelle van der Waa
c9b6f58f8e Create a general README
Introduce a README which describes where to send patches and how to
release a new version of devtools.

Signed-off-by: Jelle van der Waa <jelle@vdwaa.nl>
2019-03-25 23:32:16 +01:00
Matt Robinson
155798b8b1 makechrootpkg: keep *DEST, MAKEFLAGS & PACKAGER
If makechrootpkg is called as non-root, the {SRC,SRCPKG,PKG,LOG}DEST,
MAKEFLAGS and PACKAGER environment variables are lost in the call to
check_root().

Add these to the passed keepenv list so that they are preserved instead.
2019-03-25 23:32:13 +01:00
Christian Hesse
d9b7350448 arch-nspawn: get all mirrors from host
Now that pacconf gives us all mirrors we can use them, instead of just
the first one.

Signed-off-by: Christian Hesse <mail@eworm.de>
2019-03-25 23:32:04 +01:00
Jelle van der Waa
6645701cb1 sogrep: remove duplicate sogrep
The rename of sogrep to sogrep.in failed to remove sogrep and adding it
to .gitignore.

Signed-off-by: Jelle van der Waa <jelle@archlinux.org>
2019-03-17 14:51:19 +01:00
Jelle van der Waa
657497c91a doc: Add myself as maintainer
Signed-off-by: Jelle van der Waa <jelle@vdwaa.nl>
2019-03-16 18:35:21 +01:00
Jelle van der Waa
90bb423304 sogrep: rename to sogrep.in so make clean works
make clean removes all .in converted files to a file without .in which
in the make clean step is removed. So running make clean will remove
sogrep since it's specified as BINPROGS. In the future this steps should
be removed for sogrep since it is a standalone script.

Signed-off-by: Jelle van der Waa <jelle@vdwaa.nl>
2019-03-16 18:29:56 +01:00
Jelle van der Waa
23f248ccfb find-libdeps: fix indentation in case
Signed-off-by: Jelle van der Waa <jelle@vdwaa.nl>
2019-03-16 18:27:13 +01:00
Jelle van der Waa
eeb1c0e59e doc: add man pages for find-{libdeps,libprovides}
Add a simple man page for find-libdeps and find-libprovides.

Signed-off-by: Jelle van der Waa <jelle@vdwaa.nl>
2019-03-16 18:25:55 +01:00
Jelle van der Waa
936ff8da2f doc: add Environment variables section to sogrep
Add a section about environment variables which influence sogrep's
behaviour.

Signed-off-by: Jelle van der Waa <jelle@vdwaa.nl>
2019-03-13 22:17:35 +01:00
Jelle van der Waa
d123fee8ec doc: add man page for mkarchroot 2019-03-13 22:13:51 +01:00
Jelle van der Waa
4a532e38e7 crossrepomove: do not set svn propset
svn propset's where determined to be non-reproducible and therefore
where removed from svn. Don't introduce them when moving packages
between repos.

Signed-off-by: Jelle van der Waa <jelle@vdwaa.nl>
2019-03-13 22:06:00 +01:00
Sven-Hendrik Haase
f61421a3f5 Add sogrep
This is from Eli's dotfiles after he'd cleaned it up but never actually went ahead and made this PR.
I figure it's time to add it.
2019-03-13 09:16:32 +01:00
Jelle van der Waa
26b2ffc665 remove arch rm as it's not really useful
archrm is a not much more fancy rm -rf and therefore not really useful
to ship.
2019-02-24 13:37:37 +01:00
Levente Polyak
62306018f2 conf: sync makepkg.conf with latest version from pacman package 2019-02-09 14:27:31 +01:00
Levente Polyak
65b50dac40 ci: adding travis support for basic check 2019-01-22 03:33:53 +01:00
Levente Polyak
799376904d find-libdeps: in functions use return instead of continue to abort
Even if continue would work, it does exactly the same as a return
in the way this function is being used.
2019-01-22 03:32:50 +01:00
Erich Eckner
8310abb348 remove empty tree if "--verifysource" failed
makechrootpkg's download_sources() leaves a stray directory if
"makepkg --verifysource" failed. We use "setup_workdir" instead
of "mktemp -d", because this ensures the correct garbage collection.

Signed-off-by: Erich Eckner <git@eckner.net>
2019-01-22 01:44:40 +01:00
Morten Linderud
7b09525003 Expand check_root keepenv variables
Les us source makepkg.conf settings from the environemnt. This also includes
`GNUPGHOME` which is present in `makechrootpkg`, but not included in archbuild.

Signed-off-by: Morten Linderud <foxboron@archlinux.org>
2019-01-22 01:29:06 +01:00
Jelle van der Waa
e9102b2ad8 doc: add find-libprovides man page 2018-09-09 21:02:45 +02:00
Jelle van der Waa
99969c67a9 doc: Add checkpkg man page 2018-09-09 21:02:44 +02:00
Jelle van der Waa
05c81038e5 doc: Add lddd man page 2018-09-09 21:02:43 +02:00
Jan Alexander Steffens (heftig)
6364b3c9b9 Version 20180531 2018-05-31 16:05:49 +02:00
Eli Schwartz via arch-projects
98ff92f467 makechrootpkg: whitelist return code 14 from makepkg
makepkg 5.1 implements error codes, and 14 means that installing the
packages after they were built has failed. We don't care about this
error and would like makechrootpkg to succeed regardless, e.g. for split
packages that are mutually exclusive.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
2018-05-31 16:03:13 +02:00
Allan McRae
e414173f89 update makefile for current version
Signed-off-by: Allan McRae <allan@archlinux.org>
2018-05-29 10:42:47 +10:00
Eli Schwartz
7fcf847bc3 Do not assume the makechrootpkg user's groupname is the same as the username
chown support "$user:$group" but also "$user:" which infers $group
rather than leaving it as root. This looks up the group name in cases
where the default group is e.g. "users" and users do not get their own
unique groups.
2018-05-16 10:37:55 -04:00
Eli Schwartz
5b3c14454a Proper fix for pacman-git returning file urls from the cache
It is much nicer to use a proper configuration parser to retrieve the
primary mirror, rather than clever hacks using undocumented APIs,
especially when their behavior as used then breaks in later releases.

Fortunately, pacutils exists now and pacconf handles this quite
elegantly. It has since been moved to pacman-git proper.

Check if pacman-conf from a new enough version of pacman exists and
fallback on pacconf from pacutils.
2018-05-13 09:16:20 -04:00
Eli Schwartz
4408bb2a15 Revert "arch-nspawn: Work around pacman master returning file-URLs from the cache"
This reverts commit eb6b0e3f11.

This never worked, as pacman-git returns file urls from the cache anyway
and pacman stable doesn't have any problem at all. Having useless code
which makes people think the issue is solved when it really isn't, is
bloat, so remove it.
2018-05-13 09:16:20 -04:00
Eli Schwartz
509c00ea23 makechrootpkg: Do not copy the user keyring into the chroot.
Since commit 75fdff1811 we no longer run
integrity checks inside the chroot anyway, so this is no longer needed
and will never be used.
2018-05-13 09:16:20 -04:00
Evangelos Foutras
5713cd629c makechrootpkg: add /etc/shadow entry for builduser
Without it, sudo 1.8.23 will return an error:

    sudo: PAM account management error: Authentication
    service cannot retrieve authentication info
2018-05-12 11:52:18 +03:00
Eli Schwartz
40f0179a5e makechrootpkg: fix verifysource with pacman-git
In pacman-git commit d8717a6a9666ec80c8645d190d6f9c7ab73084ac makepkg
started checking that the setuid/setgid bit could be removed on the
$BUILDDIR in order to prevent this propagating to the packages
themselves.  Unfortunately, this requires the temporary builddir used
during the --verifysource stage of makepkg, to be owned by $makepkg_user
which was not the case as it is created as root using mktemp (and given
world rwx in addition to the restricted deletion bit.)

Obviously makepkg cannot chmod a directory that it does not own. Fix
this by making $makepkg_user the owner of that directory, as should have
been the case all along.

(Giving world rwx is illogical on general principle. The fact that this
is a workaround for makepkg demanding these directories be writable even
when they are not going to be used for the makepkg options in question,
is not justification for being careless.)

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
2018-03-24 20:54:24 +01:00
Emiel Wiedijk
ffb5003fda makechrootpkg: respect GNUPGHOME
Previously, makechrootpkg hardcoded ~/.gnupg. Therefore, if a user
uses a custom GPG home directory, the siganture checking would fail.
Now makechrootpkg uses $GNUPGHOME, with a fallback to ~/.gnupg.

Signed-off-by: Emiel Wiedijk <me@aimileus.nl>
2018-03-24 20:54:17 +01:00
Bartłomiej Piotrowski
ab3368f061 Remove corepkg symlink
While still possible with 'commitpkg core', there is a chance it will
prevent accidental pushes straight to [core].
2018-03-24 20:35:09 +01:00
Bartłomiej Piotrowski
38c7a391b0 makechrootpkg: make sure that makepkg.conf is always parsed as text 2018-01-21 14:18:43 +01:00
Luke Shumaker
75ad2aca57 makechrootpkg: Adjust to work properly with set -e
This worked properly until eab5aba.
2018-01-21 14:16:10 +01:00
Luke Shumaker
aee72cae32 lib/common.sh: Adjust to work properly with set -u
Support for working with `set -u` was broken by 94160d6.  Egg on my
face; I'm the one who wants `set -u` support, and I'm the author of
that commit!

libmakepkg does not work with `set -u`; but mostly because of the include
guards!  So we just need to temporarily disable `set -u` (nounset) while
loading libmakepkg.  Instead of introducing a new variable, just store the
initial nounset status in _INCLUDE_COMMON_SH; rather than a useless
fixed-string "true".

While we're at it, disable POSIX-mode (just in case we're running as "sh"
instead of "bash"), since libmakepkg uses bash-isms that won't parse in
POSIX mode.
2018-01-21 14:16:10 +01:00
Luke Shumaker
5ab8f8430a arch-nspawn: Remove pointless $(echo ...) subshell 2018-01-21 14:16:10 +01:00
Luke Shumaker
c9e287e845 arch-nspawn: make sure that makepkg.conf is always parsed as text
https://lists.parabola.nu/pipermail/dev/2017-June/005576.html
2018-01-21 14:16:10 +01:00
Eli Schwartz
48b2f8dcc4 makechrootpkg: Fix anti-pattern when checking for enabled features
Don't use error-prone logic e.g.
foo=true; if $foo ...

This completely fails to act as expected when the variable is unset
because of unrelated bugs.

While this merely causes the default behavior to be "false" rather than
"true" in such cases, it is better to fail to enable explicitly
requested behavior (which will be noticed by the user) than to simply
upgrade to this behavior for free (which may not seem to have any
obvious cause).

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
2018-01-21 14:16:10 +01:00
Eli Schwartz
3b725b5843 makechrootpkg: Fix unconditionally running namcap
Fixes regression in 2fd5931a8c

$run_namcap will always be set to ""
`if $not_a_var; then ...; fi` is always truthful when $not_a_var is
unset or equal to "" and the `then` clause will always be run.

I'm not sure why global state variables need to be cloned locally for
their sole explicit purpose.

But for now this patch implements the minimum necessary work to properly
pass the "do I want namcap" variable into prepare_chroot() according to
the current logic flow.
Note that I have still not thorougly tested makechrootpkg.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
2018-01-21 14:16:10 +01:00
Evangelos Foutras
7a3c508501 Revert "makechrootpkg: Reopen console to assign the CTTY"
This reverts commit ddd508efc0.

The underlying bug (FS#56529) was fixed in glibc 2.26-9.
2017-12-27 23:33:45 +02:00
Eli Schwartz
eab5aba9b0 Support reproducible builds
Recent development versions of makepkg support reproducible builds
through the environment variable SOURCE_DATE_EPOCH. Pass this variable
through makechrootpkg to makepkg when available.

Also initialize SOURCE_DATE_EPOCH whenever running archbuild to enforce
reproducible builds for repository packages.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2017-11-22 16:35:25 +01:00
Bartłomiej Piotrowski
2a308821b3 Version 20171108 2017-11-08 14:23:26 +01:00
Bartłomiej Piotrowski
7259e7def0 Remove i686 support 2017-11-08 14:22:56 +01:00
Luke Shumaker
94160d62b8 use makepkg library instead of local function copies
This mirrors dbscripts commit
625fa02 by Pierre Schmitz <pierre@archlinux.de> at 2017-04-18 14:20:49
2017-10-30 16:03:15 +01:00
Luke Shumaker
095e5305e4 makechrootpkg: Fix function usage comments
A couple of the comments noting which globals are used by functions are
outdated/wrong.

 - download_sources() : Remove USER from the list.  It was always wrong.
   Originally, it should have been SUDO_USER (not USER), but I should have
   removed it entirely in 4f23609.

 - move_products() : Add SRCPKGDEST to the list.  Though the commit adding
   the comment was only recently upstreamed (as 2fd5931), it originated in
   2013 in a commit that has since  been rebased many times.  Anyway, in
   this rebasing, it missed move_products() starting to pay attention to
   SRCPKGDEST in fd1be1b (since nothing made git think there was a
   "conflict").
2017-10-30 15:59:38 +01:00
Luke Shumaker
e4db687d10 makechrootpkg: move init_variables() to be part of main()
The reason it wasn't moved before was just to keep the diffs
(with --ignore-all-space) smaller, to make merging and rebasing work
easier.  Moving code around in a file tends to make that difficult.

But, readability wise, it belongs in main().
2017-10-30 15:59:05 +01:00
Jan Alexander Steffens (heftig)
ddd508efc0 makechrootpkg: Reopen console to assign the CTTY
nspawn does not give us a controlling terminal, hence we ignore
interrupts. Apparently this was lost in systemd at some point.

Hack around this by reopening the console to make it the controlling
terminal.
2017-09-14 23:33:47 +02:00
Jan Alexander Steffens (heftig)
0f3778c3d3 makechrootpkg: Prevent collecting coredumps
Coredumps from build chroots are not generally useful. Prevent
them from being generated.

Avoids a lot of annoyance from the GCC testsuite spawning lots of
systemd-coredump processes.

Just set the soft limit so the user can still raise it in the PKGBUILD
if they insist.
2017-09-14 23:31:36 +02:00
Jan Alexander Steffens (heftig)
6b55282bd7 Revert "arch-nspawn: Hack to give the inner process a controlling terminal"
Whoops, this will of course mess with nspawn arguments passed to
arch-nspawn.
2017-09-13 00:25:06 +02:00
Jan Alexander Steffens (heftig)
6a7dcdeff9 arch-nspawn: Hack to give the inner process a controlling terminal
This was lost at some point.
2017-09-13 00:17:49 +02:00
Jan Alexander Steffens (heftig)
cd500d161f arch-nspawn: Pass --as-pid2
As not all commands we run are capable of reaping processes correctly.
For example, pacman is not.
2017-09-12 23:27:07 +02:00
Sébastien Luttringer
5ebb9c16c0 Version 20170911 2017-09-11 21:26:07 +02:00
Sébastien Luttringer
fecf107c37 arch-nspawn: Force PATH to be the Arch default
systemd-nspawn use a default environ PATH value of:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Since filesystem 2017.08, this is no more overrided by /etc/profile
to the Arch default:
PATH=/usr/local/sbin:/usr/local/bin:/usr/bin
2017-09-11 21:21:51 +02:00
Jan Alexander Steffens (heftig)
bd826752c9 makechrootpkg: Also look for -e as --noextract 2017-08-24 17:20:59 +02:00
Martchus
d0e684d2e9 makechrootpkg: Prevent removing build dir when --noextract specified 2017-08-24 17:20:59 +02:00
Jan Alexander Steffens (heftig)
000ea6c7bb arch-nspawn: Add --keep-unit to prevent scope conflicts 2017-08-24 17:03:32 +02:00
Jan Alexander Steffens (heftig)
5715134884 Version 20170813 2017-08-13 01:24:11 +02:00
Jan Alexander Steffens (heftig)
75fdff1811 makechrootpkg: Skip integrity checks inside the chroot
We've already done these during download_sources().
2017-07-13 19:43:52 +02:00
Jan Alexander Steffens (heftig)
0cbc179d21 makechrootpkg: Use long args for makepkg
Slightly more verbose, but also more understandable.
2017-07-13 19:42:01 +02:00
Jan Alexander Steffens (heftig)
a8f512a665 makechrootpkg: Move makepkg-as-root check to main()
download_sources(), while the first invocation of makepkg, is a rather
odd place for this kind of guard.
2017-07-13 19:37:15 +02:00
Jan Alexander Steffens (heftig)
086ff8b9e7 archrelease: Whitespace adjustment 2017-07-05 18:35:16 +02:00
Laurent Carlier via arch-projects
041afb5f07 archrelease: sync the repos directory before commiting changes 2017-07-05 18:23:38 +02:00
Luke Shumaker
3efa4b7bf5 makechrootpkg: Fix broken symlinks because of chroot SRCPKGDEST /srcpkgdest
Commit 58968cf fixed symlinks for package products in $startdir in
light of the simplified chroot setup.  However, a similar change needs
to be made for source-package products.  This was an easy omission to
make because makechrootpkg does not produce source-pakcages by
default.
2017-07-05 18:22:31 +02:00
Luke Shumaker
a9dab95334 Add # shellcheck directives to quiet shellcheck, add PKGBUILD.proto
The added PKGBUILD.proto file is so that shellcheck can know know what
to expect that a PKGBUILD sets.
2017-07-05 18:21:56 +02:00
Luke Shumaker
a396a69081 Make slightly more involved changes to make shellcheck happy.
- Use `read -r` instead of other forms of read or looping
 - Use arrays instead of strings with whitespaces.
 - In one instance, use ${var%%.*} instead of $(echo $var|cut -f. -d1)
2017-07-05 18:21:56 +02:00
Luke Shumaker
78fabcfa06 Quote strings that shellcheck warns about.
These changes are all strictly "slap some double-quotes in there".
Anything more than that is not included in this commit.
2017-07-05 18:21:56 +02:00
Luke Shumaker
3f72579b28 Make purely stylistic changes to make shellcheck happier.
These are purely stylistic changes that make shellcheck complain less.

This does NOT include things like quoting currently unquoted variables.
2017-07-05 18:21:55 +02:00
Luke Shumaker
430e1265fb Makefile: Add a simple 'check' target that runs shellcheck 2017-07-05 18:21:55 +02:00
Luke Shumaker
56cace32b2 makechrootpkg: Add a comment warning about a bug in "sudo -i"
The bug isn't currently triggered, but I accidentally did trigger when I
was trying to modify the command a bit.  I figure a "caution" sign would be
helpful to any future developers.
2017-07-05 18:21:55 +02:00
Luke Shumaker
2fdd1654b5 Makefile: m4_changequote([[[, ]]]) to avoid accidental quoting.
The default m4 quote characters: `QUOTE' are troublesome, because ` is
fairly likely to pop up in a shell script (if not for a subshell, because
it is a useful character in comments and user-facing messages).

So, this changes it to [[[QUOTE]]], as it is unlikely to see three braces
together like that, let alone in unbalanced sets.
2017-07-05 18:21:55 +02:00
Luke Shumaker
007d6fc15f Makefile: add .DELETE_ON_ERROR:
The absence of it was allowing an (m4-produced) syntax error in
in a change I had made to be masked.
2017-07-05 18:21:55 +02:00
Luke Shumaker
4f23609d4e makechroot: download_sources: Accept makepkg_owner as an argument
What this is really doing is fixing a conflict that I had incorrectly
resolved when rebasing what became 2fd5931 onto cda9cf4.  Of course,
because of dynamic scoping, everything worked out, and everything worked as
intended.

Before cda9cf4, it was appropriate for download_sources to take src_owner
as an argument, but after cda9cf4, it is now appropriate to take
makepkg_user as an argument.  However, it still takes src_owner as an
argument, but pays 0 attention to it; instead looking at makepkg_user which
it happily inherited because of dynamic scoping.

So change it to take makepkg_user as the argument.
2017-07-05 18:21:55 +02:00
Luke Shumaker
31a800fd88 lib/archroot.sh: subvolume_delete_recursive: support arbitrary recursion
The `-xdev` flag to `find` makes it not recurse over subvolumes; so it only
supports recursion with depth=1.  Fix this by having the function
recursively call itself.
2017-07-05 18:21:55 +02:00
Luke Shumaker
6d1992909c makechrootpkg: sync_chroot: Make more general.
This is inspired by the thought that went in to the delete_chroot
is_subvolume commit.

sync_chroot($chrootdir, $copydir) copies `$chrootdir/root` to `$copydir`.
That seems a little silly; why do we care about "$chrootdir"?  Have it just
be sync_chroot(source, destination) like every other sync/copy command.

Where this becomes tricky is check to decide if we are going to use btrfs
subvolumes or not.  We don't care if "$source/.." is on btrfs; the root
could be a directly-mounted subvolume, but and the destination could be
another subvolume of the same btrfs mounted somewhere else.

The things we do care about are:

 - The source is a btrfs subvolume (so that we can snapshot it)
 - The source is on the same filesystem as the directory that the copy will
   be created in.
 - If the destination exists:
   * that it is not a mountpoint (so that we can delete and recreate it)
   * that it is a btrfs subvolume (so that we can quickly delete it)

On the last point, it isn't necessary for creating the new snapshot, just
for quick deletion.  That can be a separate check, where we use regular
`rm` for deleting the existing copy, but use subvolume snapshots for
creating the new one.
2017-07-05 18:21:55 +02:00
Luke Shumaker
928744cbc4 makechrootpkg: sync_chroot: make usage easier to understand.
Also, shorten the "Synchronizing" message to only include the full path
to the copy if it was specified.

The capslocked variable names in the Usage comment were references to
things in Parabola's tools, that didn't make much sense here out of
context.
2017-07-05 18:21:54 +02:00
Luke Shumaker
2a9b30ed35 makechrootpkg: delete_chroot: Fix the is-btrfs-subvolume check.
First of all, it ran `is_btrfs "$chrootdir"` to decide if it was on
btrfs, but $chrootdir wasn't defined locally; it just happens to work
because $chrootdir was defined in main().  (I noticed this because in
Parabola, it is called differently, so $chrootdir was empty).

So I was tempted to just change it to `is_btrfs "$copydir"`, but if
$copydir is just a regular directory on a btrfs filesystem, then it
It would leave much of $copydir intact.  What we really care about is
if $copydir is a btrfs subvolume; which we can check by combining the
is_btrfs check with inspecting the inum of the directory.

I put this combined check in lib/archroot.sh:is_subvolume.

https://lists.archlinux.org/pipermail/arch-projects/2013-September/003901.html
2017-07-05 18:21:54 +02:00
Bartłomiej Piotrowski
c9b1fc08b5 Sync makepkg.conf files with pacman 5.0.2-2 2017-07-04 12:04:51 +02:00
Luke Shumaker
49088b0860 makechrootpkg: Avoid having code floating around outside of a function.
This means wrapping variable initialization in init_variables(), and the
main program routine in main().

I did NOT put `shopt -s nullglob` in to a function.

It make make sense to move init_variables() down into the main()
function, instead of having it as a separate function up top (if this
done, then the `-g` flag passed to `declare` in init_variables() can
be dropped).  However, in interest of keeping the `diff -w` small, and
merges/rebases simpler, this isn't done here.
2017-04-17 03:11:34 +02:00
Jan Alexander Steffens (heftig)
a1f8ac9c70 makechrootpkg: Delete chroot subvols recursively when using -T
I overlooked this one. Fixes FS#53513.
2017-04-09 02:37:24 +02:00
Jan Alexander Steffens (heftig)
2243a276e4 makechrootpkg: Unindent as suggested in 2fd5931 2017-04-05 22:20:01 +02:00
Luke Shumaker
578a62f1e0 mkarchroot: Don't let the environment affect pacstrap (sans proxy settings).
A previous iteration of this change (libretools commit d7dcce53396d)
simply inserted `env -i` to clear the environment.

However, that lead to it ignoring proxy settings, which some users had
problems with:

    https://labs.parabola.nu/issues/487:
    > To fix other bugs, the pacstrap environment is blank, which also
    > means that the proxy settings are blank.

So (in libretools commit d17d1d82349f), I changed it to use `declare
-x` to inspect the environment, and create a version of it only
consisting of variables ending with "_proxy" (case-insensitive).

I honestly don't remember what "other bugs" prompted me to clear the
environment in the first place.
2017-04-05 22:17:51 +02:00
Luke Shumaker
4228d79b63 makechrootpkg: Improve status messages.
In sync_chroot(), this makes the messages be a bit more precise with
exactly which thing they are syncing where.  This is based on my users
expressing confusion at what is going on (especially when something is
taking a long time, and they have to blame something for blocking).
With these changes, I haven't gotten such confusion in a long time
(but maybe my users just got used to it).

In delete_chroot(), this changes "temporary copy" to "chroot copy",
since in Parabola's version of the tools, the function can get called
from other places, and it isn't necessarily operating on a temporary
copy.
2017-04-05 22:17:51 +02:00
Luke Shumaker
5b9c06d275 mkarchroot, arch-nspawn: Add an -s flag to inhibit setarch.
This allows us to run an ARM chroot on an x86 box; as the binfmt
runner will set the architecture for us, and the x86
`/usr/bin/setarch` program won't know about the ARM architecture
string.
2017-04-05 22:17:51 +02:00
Luke Shumaker
82e6bfcd7a mkarchroot, arch-nspawn: Add an -f flag to add files to copy.
This allows us to copy in files like `qemu-arm-static`, which is
necessary for running an ARM chroot on an x86 box.
2017-04-05 22:17:51 +02:00
Luke Shumaker
35da846dde makechrootpkg: Adjust to have the functions work with set -u.
Even though main() doesn't call `set -u`; this way the functions will
continue to work if copied into an environment with `set -u`, or so
that we are ready if we ever want to start using `set -u`.
2017-04-05 22:17:51 +02:00
Luke Shumaker
2fd5931a8c makechrootpkg: Have functions be more function-y.
Rather than them simply being named blocks of code with braces around
them.

That is: have them take things via arguments rather than global
variables.

Specific notes:

 - create_chroot->sync_chroot:

   I pulled out locking the destination chroot; getting that lock is
   now the caller's responsibility.  It still handles locking the
   source chroot though.

   I pulled the `if [[ ! -d $copydir ]] || $clean_first;` check out; it is
   now the caller's responsibility to use that check when deciding if to
   call sync_chroot.

   However, when pulling that check out, I left it as `if true;`, to
   keep an indentation level.  This patch has had to be rebased/merged
   many times, and changing the indentation is a sure way to make that
   go less smoothly; I'm not going to re-indent this block until I see
   the check removed in the git.archlinux.org/devtools.git repository.

 - install_packages:

    1. Receive the list of packages as arguments, rather than a global
       variable.
    2. Make the caller responsible for looking at PKGBUILD.  From the
       name and arguments, one would never expect it to look at PKGBUILD.
2017-04-05 22:17:51 +02:00
lukeshu@parabola.nu
6098253f6f Handle makepkg.conf more consistently 2017-04-05 22:17:51 +02:00
Luke Shumaker
c1a056c9a8 lib/common.sh: Make it safe to include multiple times.
This is similar to common C #ifdef guards.

I was tempted to wrap the entire thing in the if/fi, rather than use
'return' to bail early.  However, that means it won't execute anything
until after it reaches 'fi'.  And if `shopt -s extglob` isn't executed
before parsing, then it will syntax-error on the extended globs.  One
solution would have been to move `shopt -s extglob` up above the
include-guard.  But the committed solution is all-around simpler.
2017-04-05 22:14:20 +02:00
Luke Shumaker
747e8ffc8d lib/common.sh: Adjust to work properly with set -u. 2017-04-05 22:14:20 +02:00
Luke Shumaker
fb40b58772 makechrootpkg: install_pkg was an unused variable 2017-04-05 22:14:20 +02:00
Luke Shumaker
f9d9db474a makechrootpkg: Quote directory passed to rm -rf. 2017-04-05 22:14:20 +02:00
Luke Shumaker
253bb4c8d4 makechrootpkg: /chrootbuild: accept makepkg_args as arguments rather than embedding. 2017-04-05 22:14:19 +02:00
Luke Shumaker
189efd3bc0 makechrootpkg: usage(): Display the actual default makepkg flags.
It was displaing the value of the `makepkg_args` variable, which may
have already been changed by the argument parsing by the time it gets
to `-h`.  Now there is a separate `default_makepkg_args` variable.
2017-04-05 22:14:19 +02:00
Luke Shumaker
cb35d74f8c Avoid using string interpolation; use printf format strings instead.
This involves extending the signature of lib/common.sh's `stat_busy()`,
`lock()`, and `slock()`. The `mesg=$1; shift` in stat_busy even suggests
that this is what was originally intended from it.
2017-04-05 22:11:16 +02:00
Luke Shumaker
14d5e1c21b Add a "License:" tag to all code files.
In cases where there is no license specified, the file is tagged as
"License: Unspecified".  Obviously, that is not ideal, but it
highlights the fact, and I hope that it encourages whoever has the
authority to specify the license to do so.

On that note, to anyone who may have the authority to specify the
license of files in devtools: the current licence of many files is
GPLv2 with no option for later versions; I impore you to re-license
them to have the "or any later version" option.
2017-04-05 22:10:03 +02:00
Luke Shumaker
ae82f88e51 commitpkg: Adjust fancy quoting/escaping to not confuse Emacs.
It was confusing Emacs and screwing up the syntax highlighting and
auto-indentation for the rest of the file.
2017-04-05 22:10:03 +02:00
Luke Shumaker
f55786b7a8 Add '#!/hint/bash' headers to non-executable bash files.
This provides a cross-editor hint that the syntax of the file is Bash.
2017-04-05 22:10:03 +02:00
Luke Shumaker
8ff247de13 lib/common.sh: Make setup_workdir()/cleanup() safe for programs to not use 2017-04-05 22:03:00 +02:00
Luke Shumaker
d4f09b2c7b lib/common.sh: lock, slock: Create directories for locks if necessary. 2017-04-05 22:03:00 +02:00
Luke Shumaker
d333440810 lib/common.sh: lock, slock: Allow locks to be inherited.
Allow for locks to be inherited.  Inheriting the lock is something that
mkarchroot could do previously, but has since lost the ability to do.  This
allows for the programs to be more compos-able.

Do this by instead of unconditionally opening $file on $fd, first check if
$file is already open on $fd; and go ahead use it if it is.

The naive way of doing this would be to `$(readlink /dev/fd/$fd)` and
compare that to `$file`.  However, if `$file` is itself a symlink; or there
is a symlink somewhere in the path to `$file`, then this could easily fail.
Instead, check `[[ "/dev/fd/$fd" -ef "$file" ]]`.  Even though the Bash
documentation (`help test`) says that `-ef` checks for if the two files are
hard links to eachother, because it uses stat(3) (which resolves symlinks)
to do this check, it also works with the /dev/fd/ soft links.
2017-04-05 22:03:00 +02:00
Luke Shumaker
997bc1dc0d lib/common.sh: add 'lock_close'; use it as appropriate.
`lock_close FD` is easier to remember than 'exec FD>&-`; and is especially
easier if FD is a variable (though that isn't actually taken advantage of
here).

This uses Bash 4.1+ `exec {var}>&-`, rather than the clunkier
`eval exec "$var>&-"` that was necessary in older versions of Bash.
Thanks to Dave Reisner for pointing this new bit of syntax out to me
the last time I submitted this (back in 2014, 4.1 had just come out).
2017-04-05 22:03:00 +02:00
Jan Alexander Steffens (heftig)
f73c1f172f Version 20170320 2017-03-20 19:23:50 +01:00
Jan Alexander Steffens (heftig)
eec7fcf965 archbuild/makechrootpkg: Delete subvolumes in roots
The systemd package creates a subvolume at /var/lib/machines (through
tmpfiles), if it can. We need to delete this subvolume before we can
delete the parent subvolume.

Look through the root for inodes with the number 256. These identify
subvolume roots.
2017-03-07 20:39:11 +01:00
Jan Alexander Steffens (heftig)
c53a3e8017 lib/archroot.sh: Add is_btrfs helper 2017-03-07 20:37:54 +01:00
Jan Alexander Steffens (heftig)
45f87aa9d5 lib/archroot.sh: Simplify check_root
Move the function and save the orig_argv right along it.
2017-03-07 19:35:09 +01:00
Jan Alexander Steffens (heftig)
66553e7e07 lib/archroot.sh: Move CHROOT_VERSION to a common file 2017-03-07 19:35:09 +01:00
Alad Wenter
cda9cf436b makechrootpkg: run makepkg as specified user
makepkg --asroot was removed with pacman 4.2. Allow to specify a
separate makepkg user from the command line instead.

Fixes FS#43432
2017-03-07 19:02:21 +01:00
Alad Wenter
06c98c1b54 makechrootpkg: explain load_vars
The way in which makechrootpkg reads variables from makepkg.conf(5) is
different from makepkg, in that it reads a subset of defined
variables, and only if the were not set in the environment before.

Mention this in the usage text.

Fixes FS#44827
2017-03-07 19:02:21 +01:00
Jan Alexander Steffens (heftig)
e10ce7fc70 Version 20170304 2017-03-04 15:10:11 +01:00
Levente Polyak
ff48401963 makechrootpkg: fix potential non-writable directories of builduser in /build
This removes the preservation of HOME being /build just for the pacman
sudo call. Former leads to unbuildable packages when an to be installed
dependency writes something into the HOME dir (f.e. .config). The
resulting directories won't be writable by the builduser as they are
owned by root:root and ultimately will fail to build anything that
requires so.
2017-03-04 15:05:09 +01:00
Jelle van der Waa
15f16162fb lib: remove unused version, pkgparts 2017-03-04 15:03:37 +01:00
Jelle van der Waa
fea14fa286 lib: remove unused left, right 2017-03-04 15:03:05 +01:00
Jan Alexander Steffens (heftig)
4bafd641ab makechrootpkg: Simplify symlink replacement 2017-03-04 15:00:50 +01:00
NicoHood
58968cfaa2 makechrootpkg: Fix broken symlink because of temporary chroot PKGDEST /pkgdest 2017-03-04 15:00:12 +01:00
Jan Alexander Steffens (heftig)
c8147a3512 mkarchroot: Set LANG=en_US.UTF-8
In order to have an UTF-8 locale in the build root. This is something
normally set on real machines but is not set from our chroots. Meson,
for example, loudly complains when the locale charset is not UTF-8.

I'd like to have C.UTF-8, as most other distributions do. Unfortunately,
it's not part of vanilla glibc; en_US.UTF-8 will have to do.

mkarchroot already creates roots with both en_US.UTF-8 and de_DE.UTF-8,
the latter because builds of gcc (perhaps used to) require it.

Bump the CHROOT_VERSION due to the setting change.
2017-02-17 19:51:56 +01:00
Jan Alexander Steffens (heftig)
76dec8507e makechrootpkg: Reset environment for builduser
The gnustep-base package ships a profile.d script that adds
"$HOME/GNUstep/Tools" to the PATH, which breaks when the user changes
and causes meson to exit with a "permission denied" error.
2016-10-08 14:44:31 +02:00
Jan Alexander Steffens (heftig)
9727b684e6 makechrootpkg: Shorten user-config loading code
Make use of load_vars returning 1 when the file is missing. Avoids
introducing another variable.
2016-06-13 00:06:54 +02:00
Johannes Löthberg
e3fe7134e2 makechrootpkg: Use XDG_CONFIG_HOME for makepkg.conf
Implemented the same way as in makepkg.

Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
2016-06-13 00:02:29 +02:00
Jan Alexander Steffens (heftig)
70d3c63b5c Version 20160528 2016-05-28 17:52:56 +02:00
Jan Alexander Steffens (heftig)
eb6b0e3f11 arch-nspawn: Work around pacman master returning file-URLs from the cache 2016-05-28 12:33:00 +02:00
Jan Alexander Steffens (heftig)
69a3a0e7c0 makechrootpkg: Install packages in one step
Avoids having to specify them in dependency order.
2016-05-28 12:30:36 +02:00
Jan Alexander Steffens (heftig)
ca819a2357 makechrootpkg: Simplify chroot preparation (v2)
Copy both UID and primary GID of the invoker to the builduser. Mount
srcdest and startdir read-write.

v2: Fixed GnuPG keyring owner and moved running namcap from a heredoc
    to a function.
2016-05-28 12:30:36 +02:00
Pierre Schmitz
eb88a303b7 Merge branch 'master' of git.archlinux.org:/srv/git/devtools 2016-05-28 10:09:45 +02:00
Sven-Hendrik Haase
8f94d8118f This is 20160527.1 2016-05-27 22:17:02 +02:00
Sven-Hendrik Haase
882f5d0451 mkarchroot: Manually generate machine-id because nspawn expects it 2016-05-27 22:16:09 +02:00
Sven-Hendrik Haase
f36c45e0c6 Makefile: change version to 20160527 2016-05-27 21:11:46 +02:00
Sven-Hendrik Haase
7fc22b9aba Use repos.archlinux.org everywhere instead of hostname based domains
This makes it a lot easier to swap out the host that actually serves the repos in the future.
2016-05-27 21:02:46 +02:00
Pierre Schmitz
7fe0f68856 Set target vendor to pc for usge with gcc 6 2016-05-07 10:53:48 +02:00
Pierre Schmitz
f85fc32d78 Update bundled pacman and makepkg configuration 2016-02-07 10:12:56 +01:00
Evangelos Foutras
c5128dc45c makechrootpkg: set builduser's shell to /bin/bash
Having it set to nologin breaks a couple of tests in Git and Python.
2016-01-09 12:00:21 +02:00
Levente Polyak
f1effdf989 makechrootpkg: use /build as HOME for the builduser
This way the HOME dir is writable and no ugly hacks are required
in the PKGBUILD if $HOME is accessed (f.e. maven, gradle and also
some python tests etc.)
2016-01-09 11:59:44 +02:00
115 changed files with 9108 additions and 1949 deletions

17
.gitignore vendored
View File

@@ -1,18 +1,3 @@
*~
devtools-*.tar.gz*
archbuild
archco
archrelease
archrm
bash_completion
checkpkg
commitpkg
finddeps
lddd
makechrootpkg
mkarchroot
rebuildpkgs
zsh_completion
find-libdeps
crossrepomove
arch-nspawn
/build/

21
.gitlab-ci.yml Normal file
View File

@@ -0,0 +1,21 @@
image: "archlinux:latest"
stages:
- build
- test
build:
stage: build
needs: []
script:
- pacman -Syu --noconfirm m4 make openssh subversion rsync arch-install-scripts git bzr mercurial diffutils asciidoc
- make PREFIX=/usr
- make PREFIX=/usr DESTDIR=build install
check:
stage: test
needs: []
script:
- pacman -Syu --noconfirm m4 make openssh subversion rsync arch-install-scripts git bzr mercurial diffutils asciidoc shellcheck
- make check || true
- SHELLCHECK_OPTS="-S error" make check

674
LICENSE Normal file
View File

@@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.

194
Makefile
View File

@@ -1,43 +1,30 @@
V=20151129
SHELL=/bin/bash
V=1.0.1
BUILDTOOLVER ?= $(V)
PREFIX = /usr/local
MANDIR = $(PREFIX)/share/man
DATADIR = $(PREFIX)/share/devtools
BUILDDIR = build
BINPROGS = \
checkpkg \
commitpkg \
archco \
archrelease \
archrm \
archbuild \
lddd \
finddeps \
rebuildpkgs \
find-libdeps \
crossrepomove\
arch-nspawn \
mkarchroot \
makechrootpkg
rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d))
CONFIGFILES = \
makepkg-i686.conf \
makepkg-x86_64.conf \
pacman-extra.conf \
pacman-testing.conf \
pacman-staging.conf \
pacman-multilib.conf \
pacman-multilib-testing.conf \
pacman-multilib-staging.conf \
pacman-kde-unstable.conf \
pacman-gnome-unstable.conf
BINPROGS_SRC = $(wildcard src/*.in)
BINPROGS = $(addprefix $(BUILDDIR)/,$(patsubst src/%,bin/%,$(patsubst %.in,%,$(BINPROGS_SRC))))
LIBRARY_SRC = $(call rwildcard,src/lib,*.sh)
LIBRARY = $(addprefix $(BUILDDIR)/,$(patsubst src/%,%,$(patsubst %.in,%,$(LIBRARY_SRC))))
MAKEPKG_CONFIGS=$(wildcard config/makepkg/*)
PACMAN_CONFIGS=$(wildcard config/pacman/*)
SETARCH_ALIASES = $(wildcard config/setarch-aliases.d/*)
MANS = $(addprefix $(BUILDDIR)/,$(patsubst %.asciidoc,%,$(wildcard doc/man/*.asciidoc)))
COMMITPKG_LINKS = \
core-testingpkg \
core-stagingpkg \
extrapkg \
corepkg \
testingpkg \
stagingpkg \
communitypkg \
community-testingpkg \
community-stagingpkg \
extra-testingpkg \
extra-stagingpkg \
multilibpkg \
multilib-testingpkg \
multilib-stagingpkg \
@@ -45,73 +32,134 @@ COMMITPKG_LINKS = \
gnome-unstablepkg
ARCHBUILD_LINKS = \
extra-i686-build \
core-testing-x86_64-build \
core-testing-x86_64_v3-build \
core-staging-x86_64-build \
core-staging-x86_64_v3-build \
extra-x86_64-build \
testing-i686-build \
testing-x86_64-build \
staging-i686-build \
staging-x86_64-build \
extra-x86_64_v3-build \
extra-testing-x86_64-build \
extra-testing-x86_64_v3-build \
extra-staging-x86_64-build \
extra-staging-x86_64_v3-build \
multilib-build \
multilib-testing-build \
multilib-staging-build \
kde-unstable-i686-build \
kde-unstable-x86_64-build \
gnome-unstable-i686-build \
gnome-unstable-x86_64-build
CROSSREPOMOVE_LINKS = \
extra2community \
community2extra
COMPLETIONS = $(addprefix $(BUILDDIR)/,$(patsubst %.in,%,$(wildcard contrib/completion/*/*)))
BASHCOMPLETION_LINKS = \
archco \
communityco
all: $(BINPROGS) bash_completion zsh_completion
all: binprogs library conf completion man
binprogs: $(BINPROGS)
library: $(LIBRARY)
completion: $(COMPLETIONS)
man: $(MANS)
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 "$@"
@bash -O extglob -n "$@"
ifneq ($(wildcard *.in),)
$(error Legacy in prog file found: $(wildcard *.in) - please migrate to src/*)
endif
ifneq ($(wildcard pacman-*.conf),)
$(error Legacy pacman config file found: $(wildcard pacman-*.conf) - please migrate to config/pacman/*)
endif
ifneq ($(wildcard makepkg-*.conf),)
$(error Legacy makepkg config files found: $(wildcard makepkg-*.conf) - please migrate to config/makepkg/*)
endif
ifneq ($(wildcard setarch-aliases.d/*),)
$(error Legacy setarch aliase found: $(wildcard setarch-aliases.d/*) - please migrate to config/setarch-aliases.d/*)
endif
edit = sed \
-e "s|@pkgdatadir[@]|$(DATADIR)|g" \
-e "s|@buildtoolver[@]|$(BUILDTOOLVER)|g"
GEN_MSG = @echo "GEN $(patsubst $(BUILDDIR)/%,%,$@)"
define buildInScript
$(1)/%: $(2)%$(3)
$$(GEN_MSG)
@mkdir -p $$(dir $$@)
@$(RM) "$$@"
@cat $$< | $(edit) >$$@
@chmod $(4) "$$@"
@bash -O extglob -n "$$@"
endef
$(eval $(call buildInScript,build/bin,src/,.in,755))
$(eval $(call buildInScript,build/lib,src/lib/,,644))
$(foreach completion,$(wildcard contrib/completion/*),$(eval $(call buildInScript,build/$(completion),$(completion)/,.in,444)))
$(BUILDDIR)/doc/man/%: doc/man/%.asciidoc doc/asciidoc.conf doc/man/include/footer.asciidoc
$(GEN_MSG)
@mkdir -p $(BUILDDIR)/doc/man
@a2x --no-xmllint --asciidoc-opts="-f doc/asciidoc.conf" -d manpage -f manpage --destination-dir=$(BUILDDIR)/doc/man -a pkgdatadir=$(DATADIR) $<
conf:
@install -d $(BUILDDIR)/makepkg.conf.d $(BUILDDIR)/pacman.conf.d
@cp -a $(MAKEPKG_CONFIGS) $(BUILDDIR)/makepkg.conf.d
@cp -a $(PACMAN_CONFIGS) $(BUILDDIR)/pacman.conf.d
clean:
rm -f $(BINPROGS) bash_completion zsh_completion
rm -rf $(BUILDDIR)
install:
install: all
install -dm0755 $(DESTDIR)$(PREFIX)/bin
install -dm0755 $(DESTDIR)$(PREFIX)/share/devtools
install -dm0755 $(DESTDIR)$(DATADIR)/setarch-aliases.d
install -dm0755 $(DESTDIR)$(DATADIR)/makepkg.conf.d
install -dm0755 $(DESTDIR)$(DATADIR)/pacman.conf.d
install -m0755 ${BINPROGS} $(DESTDIR)$(PREFIX)/bin
install -m0644 ${CONFIGFILES} $(DESTDIR)$(PREFIX)/share/devtools
install -dm0755 $(DESTDIR)$(DATADIR)/lib
cp -ra $(BUILDDIR)/lib/* $(DESTDIR)$(DATADIR)/lib
for conf in $(notdir $(MAKEPKG_CONFIGS)); do install -Dm0644 $(BUILDDIR)/makepkg.conf.d/$$conf $(DESTDIR)$(DATADIR)/makepkg.conf.d/$${conf##*/}; done
for conf in $(notdir $(PACMAN_CONFIGS)); do install -Dm0644 $(BUILDDIR)/pacman.conf.d/$$conf $(DESTDIR)$(DATADIR)/pacman.conf.d/$${conf##*/}; done
for a in ${SETARCH_ALIASES}; do install -m0644 $$a -t $(DESTDIR)$(DATADIR)/setarch-aliases.d; done
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
for l in ${CROSSREPOMOVE_LINKS}; do ln -sf crossrepomove $(DESTDIR)$(PREFIX)/bin/$$l; done
ln -sf find-libdeps $(DESTDIR)$(PREFIX)/bin/find-libprovides
install -Dm0644 bash_completion $(DESTDIR)/usr/share/bash-completion/completions/devtools
for l in ${BASHCOMPLETION_LINKS}; do ln -sf devtools $(DESTDIR)/usr/share/bash-completion/completions/$$l; done
install -Dm0644 zsh_completion $(DESTDIR)$(PREFIX)/share/zsh/site-functions/_devtools
ln -sf archco $(DESTDIR)$(PREFIX)/bin/communityco
install -Dm0644 $(BUILDDIR)/contrib/completion/bash/devtools $(DESTDIR)$(PREFIX)/share/bash-completion/completions/devtools
for f in $(notdir $(BINPROGS)); do ln -sf devtools $(DESTDIR)$(PREFIX)/share/bash-completion/completions/$$f; done
install -Dm0644 $(BUILDDIR)/contrib/completion/zsh/_devtools $(DESTDIR)$(PREFIX)/share/zsh/site-functions/_devtools
for manfile in $(MANS); do \
install -Dm644 $$manfile -t $(DESTDIR)$(MANDIR)/man$${manfile##*.}; \
done;
uninstall:
for f in ${BINPROGS}; do rm -f $(DESTDIR)$(PREFIX)/bin/$$f; done
for f in ${CONFIGFILES}; do rm -f $(DESTDIR)$(PREFIX)/share/devtools/$$f; done
for f in $(notdir $(BINPROGS)); do rm -f $(DESTDIR)$(PREFIX)/bin/$$f; done
for f in $(notdir $(LIBRARY)); do rm -f $(DESTDIR)$(DATADIR)/lib/$$f; done
rm -rf $(DESTDIR)$(DATADIR)/lib
for conf in $(notdir $(MAKEPKG_CONFIGS)); do rm -f $(DESTDIR)$(DATADIR)/makepkg.conf.d/$${conf##*/}; done
for conf in $(notdir $(PACMAN_CONFIGS)); do rm -f $(DESTDIR)$(DATADIR)/pacman.conf.d/$${conf##*/}; done
for f in $(notdir $(SETARCH_ALIASES)); do rm -f $(DESTDIR)$(DATADIR)/setarch-aliases.d/$$f; done
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
for l in ${CROSSREPOMOVE_LINKS}; do rm -f $(DESTDIR)$(PREFIX)/bin/$$l; done
rm $(DESTDIR)/usr/share/bash-completion/completions/devtools
rm $(DESTDIR)$(PREFIX)/share/zsh/site-functions/_devtools
rm -f $(DESTDIR)$(PREFIX)/bin/communityco
rm -f $(DESTDIR)$(PREFIX)/share/bash-completion/completions/devtools
for f in $(notdir $(BINPROGS)); do rm -f $(DESTDIR)$(PREFIX)/share/bash-completion/completions/$$f; done
rm -f $(DESTDIR)$(PREFIX)/share/zsh/site-functions/_devtools
rm -f $(DESTDIR)$(PREFIX)/bin/find-libprovides
for manfile in $(notdir $(MANS)); do rm -f $(DESTDIR)$(MANDIR)/man$${manfile##*.}/$${manfile}; done;
rmdir --ignore-fail-on-non-empty \
$(DESTDIR)$(DATADIR)/setarch-aliases.d \
$(DESTDIR)$(DATADIR)/makepkg.conf.d \
$(DESTDIR)$(DATADIR)/pacman.conf.d \
$(DESTDIR)$(DATADIR)
TODAY=$(shell date +"%Y%m%d")
tag:
@sed -E "s|^V=[0-9]{8}|V=$(TODAY)|" -i Makefile
@git commit --gpg-sign --message "Version $(TODAY)" Makefile
@git tag --sign --message "Version $(TODAY)" $(TODAY)
dist:
git archive --format=tar --prefix=devtools-$(V)/ $(V) | gzip -9 > devtools-$(V).tar.gz
git archive --format=tar --prefix=devtools-$(V)/ $(V) | gzip > devtools-$(V).tar.gz
gpg --detach-sign --use-agent devtools-$(V).tar.gz
upload:
scp devtools-$(V).tar.gz devtools-$(V).tar.gz.sig nymeria.archlinux.org:/srv/ftp/other/devtools/
scp devtools-$(V).tar.gz devtools-$(V).tar.gz.sig repos.archlinux.org:/srv/ftp/other/devtools/
.PHONY: all clean install uninstall dist upload
check: $(BINPROGS_SRC) $(LIBRARY_SRC) contrib/completion/bash/devtools.in config/makepkg/x86_64.conf contrib/makepkg/PKGBUILD.proto
shellcheck $^
.PHONY: all binprogs library completion conf man clean install uninstall tag dist upload check
.DELETE_ON_ERROR:

68
README.md Normal file
View File

@@ -0,0 +1,68 @@
# Devtools - development tools for Arch Linux
This repository contains tools for the Arch Linux distribution for building
and maintaining official repository packages.
## Building
When building official distro packages the `BUILDTOOLVER` needs to be set to the
exact label of the release package in order to allow to detect the exactly used
devtools version. This is required for reproducible builds to fetch the according
files like `makepkg.conf`.
```sh
BUILDTOOLVER="${pkgver}-${pkgrel}-${arch}" make all
```
## Development
For local development testing, there is a convenience wrapper for `pkgctl` that
will automatically build the project and proxy all calls to the local build directory:
```sh
./test/bin/pkgctl --help
```
## Releasing
1. bump the version in the Makefile
2. Commit everything as ```Version $(date +"%Y%m%d")```
3. Create a new tag ```git tag -s $(date +"%Y%m%d")```
4. Push changes
5. Upload the source tarball with ```make dist upload```
6. Update the package
## Dependencies
### Runtime Dependencies
- arch-install-scripts
- awk
- bash
- binutils
- coreutils
- diffutils
- findutils
- grep
- jq
- ncurses
- openssh
- parallel
- rsync
- sed
- systemd
- util-linux
- bzr
- git
- mercurial
- subversion
### Development Dependencies
- asciidoc
- make
- shellcheck
## License
Devtools is licensed under the terms of the **GPL-3.0-or-later** (see [LICENSE](LICENSE)).

View File

@@ -1,103 +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.
m4_include(lib/common.sh)
CHROOT_VERSION='v3'
working_dir=''
usage() {
echo "Usage: ${0##*/} [options] working-dir [systemd-nspawn arguments]"
echo "A wrapper around systemd-nspawn. Provides support for pacman."
echo
echo ' options:'
echo ' -C <file> Location of a pacman config file'
echo ' -M <file> Location of a makepkg config file'
echo ' -c <dir> Set pacman cache'
echo ' -h This message'
exit 1
}
orig_argv=("$@")
while getopts 'hC:M:c:' arg; do
case "$arg" in
C) pac_conf="$OPTARG" ;;
M) makepkg_conf="$OPTARG" ;;
c) cache_dir="$OPTARG" ;;
h|?) usage ;;
*) error "invalid argument '$arg'"; usage ;;
esac
done
shift $(($OPTIND - 1))
(( $# < 1 )) && die 'You must specify a directory.'
check_root "$0" "${orig_argv[@]}"
working_dir=$(readlink -f "$1")
shift 1
[[ -z $working_dir ]] && die 'Please specify a working directory.'
if [[ -z $cache_dir ]]; then
cache_dirs=($(pacman -v 2>&1 | grep '^Cache Dirs:' | sed 's/Cache Dirs:\s*//g'))
else
cache_dirs=("$cache_dir")
fi
host_mirror=$(pacman -Sddp extra/devtools 2>/dev/null | sed -r 's#(.*/)extra/os/.*#\1$repo/os/$arch#')
[[ $host_mirror == *file://* ]] && host_mirror_path=$(echo "$host_mirror" | sed -r 's#file://(/.*)/\$repo/os/\$arch#\1#g')
# {{{ functions
build_mount_args() {
declare -g mount_args=()
if [[ -n $host_mirror_path ]]; then
mount_args+=(--bind-ro="$host_mirror_path")
fi
mount_args+=(--bind="${cache_dirs[0]}")
for cache_dir in ${cache_dirs[@]:1}; do
mount_args+=(--bind-ro="$cache_dir")
done
}
copy_hostconf () {
cp -a /etc/pacman.d/gnupg "$working_dir/etc/pacman.d"
echo "Server = $host_mirror" >"$working_dir/etc/pacman.d/mirrorlist"
[[ -n $pac_conf ]] && cp $pac_conf "$working_dir/etc/pacman.conf"
[[ -n $makepkg_conf ]] && cp $makepkg_conf "$working_dir/etc/makepkg.conf"
sed -r "s|^#?\\s*CacheDir.+|CacheDir = $(echo -n ${cache_dirs[@]})|g" -i "$working_dir/etc/pacman.conf"
}
# }}}
umask 0022
# Sanity check
if [[ ! -f "$working_dir/.arch-chroot" ]]; then
die "'%s' does not appear to be an Arch chroot." "$working_dir"
elif [[ $(cat "$working_dir/.arch-chroot") != $CHROOT_VERSION ]]; then
die "chroot '%s' is not at version %s. Please rebuild." "$working_dir" "$CHROOT_VERSION"
fi
build_mount_args
copy_hostconf
eval $(grep '^CARCH=' "$working_dir/etc/makepkg.conf")
exec ${CARCH:+setarch "$CARCH"} systemd-nspawn -q \
-D "$working_dir" \
--register=no \
"${mount_args[@]}" \
"$@"

View File

@@ -1,80 +0,0 @@
#!/bin/bash
m4_include(lib/common.sh)
base_packages=(base-devel)
makechrootpkg_args=(-c -n)
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/lib/archbuild'
clean_first=false
usage() {
echo "Usage: $cmd [options] -- [makechrootpkg args]"
echo ' -h This help'
echo ' -c Recreate the chroot before building'
echo ' -r <dir> Create chroots in this directory'
echo ''
echo "Default makechrootpkg args: ${makechrootpkg_args[*]}"
echo ''
exit 1
}
orig_argv=("$@")
while getopts 'hcr:' arg; do
case "${arg}" in
c) clean_first=true ;;
r) chroots="$OPTARG" ;;
*) usage ;;
esac
done
check_root "$0" "${orig_argv[@]}"
# Pass all arguments after -- right to makepkg
makechrootpkg_args+=("${@:$OPTIND}")
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 9 "$copy.lock" "Locking chroot copy '$copy'"
if [[ "$(stat -f -c %T "${copy}")" == btrfs ]]; then
{ type -P btrfs && btrfs subvolume delete "${copy}"; } &>/dev/null
fi
rm -rf --one-file-system "${copy}"
done
exec 9>&-
rm -rf --one-file-system "${chroots}/${repo}-${arch}"
mkdir -p "${chroots}/${repo}-${arch}"
setarch "${arch}" mkarchroot \
-C "@pkgdatadir@/pacman-${repo}.conf" \
-M "@pkgdatadir@/makepkg-${arch}.conf" \
"${chroots}/${repo}-${arch}/root" \
"${base_packages[@]}" || abort
else
lock 9 "${chroots}/${repo}-${arch}/root.lock" "Locking clean chroot"
arch-nspawn \
-C "@pkgdatadir@/pacman-${repo}.conf" \
-M "@pkgdatadir@/makepkg-${arch}.conf" \
"${chroots}/${repo}-${arch}/root" \
pacman -Syu --noconfirm || abort
fi
msg "Building in chroot for [${repo}] (${arch})..."
exec makechrootpkg -r "${chroots}/${repo}-${arch}" "${makechrootpkg_args[@]}"

View File

@@ -1,24 +0,0 @@
#!/bin/bash
m4_include(lib/common.sh)
scriptname=${0##*/}
if [[ -z $1 ]]; then
echo 'Usage: '$scriptname' <package name>...'
exit 1
fi
case $scriptname in
archco)
SVNURL="svn+ssh://svn-packages@nymeria.archlinux.org/srv/repos/svn-packages/svn";;
communityco)
SVNURL="svn+ssh://svn-community@nymeria.archlinux.org/srv/repos/svn-community/svn";;
*)
die "Couldn't find svn url for %s" "$scriptname"
;;
esac
for i in "$@"; do
svn co "$SVNURL/$i"
done

View File

@@ -1,86 +0,0 @@
#!/bin/bash
m4_include(lib/common.sh)
m4_include(lib/valid-tags.sh)
# parse command line options
FORCE=
while getopts ':f' flag; do
case $flag in
f) FORCE=1 ;;
:) die "Option requires an argument -- '%s'" "$OPTARG" ;;
\?) die "Invalid option -- '%s'" "$OPTARG" ;;
esac
done
shift $(( OPTIND - 1 ))
if ! (( $# )); then
echo 'Usage: archrelease [-f] <repo>...'
exit 1
fi
# validate repo is really repo-arch
if [[ -z $FORCE ]]; then
for tag in "$@"; do
if ! in_array "$tag" "${_tags[@]}"; then
die "archrelease: Invalid tag: '%s' (use -f to force release)" "$tag"
fi
done
fi
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
# gracefully handle files containing an "@" character
known_files=("${known_files[@]/%/@}")
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

View File

@@ -1,15 +0,0 @@
#!/bin/bash
m4_include(lib/common.sh)
if [[ -z $1 ]]; then
echo 'Usage: archrm <path to checkout>'
exit 1
fi
# FIXME: Check if there are uncommited changes
#pushd $1
#
#popd
rm -rf $1

View File

@@ -1,86 +0,0 @@
_devtools_compgen() {
local i r
COMPREPLY=($(compgen -W '$*' -- "$cur"))
for ((i=1; i < ${#COMP_WORDS[@]}-1; i++)); do
for r in ${!COMPREPLY[@]}; do
if [[ ${COMP_WORDS[i]} = ${COMPREPLY[r]} ]]; then
unset 'COMPREPLY[r]'; break
fi
done
done
}
_archco_pkg() {
_devtools_compgen "$(
\pacman -$1
)"
}
_archco() {
local cur prev
COMPREPLY=()
cur=$(_get_cword)
prev=${COMP_WORDS[COMP_CWORD-1]}
_archco_pkg Slq
true
} &&
complete -F _archco archco communityco
_makechrootpkg() {
local cur
COMPREPLY=()
_get_comp_words_by_ref cur
case $cur in
-*)
COMPREPLY=( $( compgen -W '-I -c -h -l -r -u' -- "$cur" ) )
;;
*)
_filedir
return 0
;;
esac
true
} &&
complete -F _makechrootpkg makechrootpkg
_mkarchroot() {
local cur
COMPREPLY=()
_get_comp_words_by_ref cur
case $cur in
-*)
COMPREPLY=( $( compgen -W '-C -M -c -h' -- "$cur" ) )
;;
*)
_filedir
return 0
;;
esac
true
} &&
complete -F _mkarchroot mkarchroot
_arch-nspawn() {
local cur
COMPREPLY=()
_get_comp_words_by_ref cur
case $cur in
-*)
COMPREPLY=( $( compgen -W '-C -M -c -h' -- "$cur" ) )
;;
*)
_filedir
return 0
;;
esac
true
} &&
complete -F _arch-nspawn arch-nspawn
# ex:et ts=2 sw=2 ft=sh

View File

@@ -1,76 +0,0 @@
#!/bin/bash
shopt -s extglob
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)
for _pkgname in "${pkgname[@]}"; do
target_pkgver=$(get_full_version "$_pkgname")
if ! pkgfile=$(find_cached_package "$_pkgname" "$target_pkgver" "$CARCH"); then
die 'tarball not found for package: %s' "${_pkgname}-$target_pkgver"
fi
ln -s "$pkgfile" "$TEMPDIR"
pkgurl=$(pacman -Spdd --print-format '%l' --noconfirm "$_pkgname")
if [[ $? -ne 0 ]]; then
die "Couldn't download previous package for %s." "$_pkgname"
fi
oldpkg=${pkgurl##*://*/}
if [[ ${oldpkg##*/} = ${pkgfile##*/} ]]; then
die "The built package (%s) is the one in the repo right now!" "$_pkgname"
fi
if [[ $pkgurl = file://* ]]; then
ln -s "${pkgurl#file://}" "$TEMPDIR/$oldpkg"
elif [[ -f "$PKGDEST/$oldpkg" ]]; then
ln -s "$PKGDEST/$oldpkg" "$TEMPDIR/$oldpkg"
elif [[ -f "$STARTDIR/$oldpkg" ]]; then
ln -s "$STARTDIR/$oldpkg" "$TEMPDIR/$oldpkg"
else
curl -fsLC - --retry 3 --retry-delay 3 -o "$TEMPDIR/$oldpkg" "$pkgurl"
fi
bsdtar tf "$TEMPDIR/$oldpkg" | sort > "$TEMPDIR/filelist-$_pkgname-old"
bsdtar tf "$pkgfile" | sort > "$TEMPDIR/filelist-$_pkgname"
sdiff -s "$TEMPDIR/filelist-$_pkgname-old" "$TEMPDIR/filelist-$_pkgname"
find-libprovides "$TEMPDIR/$oldpkg" 2>/dev/null | sort > "$TEMPDIR/libraries-$_pkgname-old"
find-libprovides "$pkgfile" 2>/dev/null | sort > "$TEMPDIR/libraries-$_pkgname"
if ! diff_output="$(sdiff -s "$TEMPDIR/libraries-$_pkgname-old" "$TEMPDIR/libraries-$_pkgname")"; then
msg "Sonames differ in $_pkgname!"
echo "$diff_output"
else
msg "No soname differences for $_pkgname."
fi
done
msg "Files saved to $TEMPDIR"

View File

@@ -1,202 +0,0 @@
#!/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
. ~/.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> [-f] [-s server] [-l limit] [-a arch] [commit message]'
fi
repo="$1"
shift
;;
*pkg)
repo="${cmd%pkg}"
;;
*)
die 'Usage: commitpkg <reponame> [-f] [-s server] [-l limit] [-a arch] [commit message]'
;;
esac
# find files which should be under source control
needsversioning=()
for s in "${source[@]}"; do
[[ $s != *://* ]] && needsversioning+=("$s")
done
for i in 'changelog' 'install'; do
while read -r file; do
# evaluate any bash variables used
eval file=\"$(sed 's/^\(['\''"]\)\(.*\)\1$/\2/' <<< "$file")\"
needsversioning+=("$file")
done < <(sed -n "s/^[[:space:]]*$i=//p" PKGBUILD)
done
# assert that they really are controlled by SVN
if (( ${#needsversioning[*]} )); then
# svn status's output is only two columns when the status is unknown
while read -r status filename; do
[[ $status = '?' ]] && unversioned+=("$filename")
done < <(svn status -v "${needsversioning[@]}")
(( ${#unversioned[*]} )) && die "%s is not under version control" "${unversioned[@]}"
fi
rsyncopts=(-e ssh -p --chmod=ug=rw,o=r -c -h -L --progress --partial -y)
archreleaseopts=()
while getopts ':l:a:s:f' flag; do
case $flag in
f) archreleaseopts+=('-f') ;;
s) server=$OPTARG ;;
l) rsyncopts+=("--bwlimit=$OPTARG") ;;
a) commit_arch=$OPTARG ;;
:) die "Option requires an argument -- '%s'" "$OPTARG" ;;
\?) die "Invalid option -- '%s'" "$OPTARG" ;;
esac
done
shift $(( OPTIND - 1 ))
# check packages have the packager field set
for _arch in ${arch[@]}; do
if [[ -n $commit_arch && ${_arch} != "$commit_arch" ]]; then
continue
fi
for _pkgname in ${pkgname[@]}; do
fullver=$(get_full_version $_pkgname)
if pkgfile=$(find_cached_package "$_pkgname" "$_arch" "$fullver"); then
if grep -q "packager = Unknown Packager" <(bsdtar -xOqf "$pkgfile" .PKGINFO); then
die "PACKAGER was not set when building package"
fi
fi
done
done
if [[ -z $server ]]; then
server='nymeria.archlinux.org'
fi
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)
if ! pkgfile=$(find_cached_package "$_pkgname" "$fullver" "${_arch}"); then
warning "Skipping $_pkgname-$fullver-$_arch: failed to locate package file"
skip_arches+=($_arch)
continue 2
fi
uploads+=("$pkgfile")
sigfile="${pkgfile}.sig"
if [[ ! -f $sigfile ]]; then
msg "Signing package ${pkgfile}..."
if [[ -n $GPGKEY ]]; then
SIGNWITHKEY="-u ${GPGKEY}"
fi
gpg --detach-sign --use-agent --no-armor ${SIGNWITHKEY} "${pkgfile}" || die
fi
if ! gpg --verify "$sigfile" >/dev/null 2>&1; then
die "Signature %s.sig is incorrect!" "$pkgfile"
fi
uploads+=("$sigfile")
done
done
for _arch in ${arch[@]}; do
if ! in_array $_arch ${skip_arches[@]}; then
commit_arches+=($_arch)
fi
done
if [[ ${#commit_arches[*]} -gt 0 ]]; then
archrelease "${archreleaseopts[@]}" "${commit_arches[@]/#/$repo-}" || die
fi
if [[ ${#uploads[*]} -gt 0 ]]; then
new_uploads=()
# convert to absolute paths so rsync can work with colons (epoch)
while read -r -d '' upload; do
new_uploads+=("$upload")
done < <(realpath -z "${uploads[@]}")
uploads=("${new_uploads[@]}")
unset new_uploads
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

View File

@@ -1,3 +1,6 @@
#!/hint/bash
# shellcheck disable=2034
#
# /etc/makepkg.conf
#
@@ -8,9 +11,10 @@
#
#-- The download utilities that makepkg should use to acquire sources
# Format: 'protocol::agent'
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'
DLAGENTS=('file::/usr/bin/curl -qgC - -o %o %u'
'ftp::/usr/bin/curl -qgfC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %u'
'http::/usr/bin/curl -qgb "" -fLC - --retry 3 --retry-delay 3 -o %o %u'
'https::/usr/bin/curl -qgb "" -fLC - --retry 3 --retry-delay 3 -o %o %u'
'rsync::/usr/bin/rsync --no-motd -z %u %o'
'scp::/usr/bin/scp -C %u %o')
@@ -22,6 +26,7 @@ DLAGENTS=('ftp::/usr/bin/curl -fC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %
#-- The package required by makepkg to download VCS sources
# Format: 'protocol::package'
VCSCLIENTS=('bzr::bzr'
'fossil::fossil'
'git::git'
'hg::mercurial'
'svn::subversion')
@@ -31,26 +36,29 @@ VCSCLIENTS=('bzr::bzr'
#########################################################################
#
CARCH="x86_64"
CHOST="x86_64-unknown-linux-gnu"
CHOST="x86_64-pc-linux-gnu"
#-- Compiler and Linker Flags
# -march (or -mcpu) builds exclusively for an architecture
# -mtune optimizes for an architecture, but builds for whole processor family
CPPFLAGS="-D_FORTIFY_SOURCE=2"
CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong"
CXXFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong"
LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro"
#CPPFLAGS=""
CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions \
-Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security \
-fstack-clash-protection -fcf-protection"
CXXFLAGS="$CFLAGS -Wp,-D_GLIBCXX_ASSERTIONS"
LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now"
LTOFLAGS="-flto=auto"
RUSTFLAGS=""
#-- Make Flags: change this for DistCC/SMP systems
#MAKEFLAGS="-j2"
#-- Debugging flags
DEBUG_CFLAGS="-g -fvar-tracking-assignments"
DEBUG_CXXFLAGS="-g -fvar-tracking-assignments"
DEBUG_CFLAGS="-g"
DEBUG_CXXFLAGS="$DEBUG_CFLAGS"
DEBUG_RUSTFLAGS="-C debuginfo=2"
#########################################################################
# BUILD ENVIRONMENT
#########################################################################
#
# Defaults: BUILDENV=(!distcc color !ccache check !sign)
# Makepkg defaults: BUILDENV=(!distcc !color !ccache check !sign)
# A negated environment option will do the opposite of the comments below.
#
#-- distcc: Use the Distributed C/C++/ObjC compiler
@@ -73,7 +81,7 @@ BUILDENV=(!distcc color !ccache check !sign)
# These are default values for the options=() settings
#########################################################################
#
# Default: OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !upx !debug)
# Makepkg defaults: OPTIONS=(!strip docs libtool staticlibs emptydirs !zipman !purge !debug !lto)
# A negated option will do the opposite of the comments below.
#
#-- strip: Strip symbols from binaries/libraries
@@ -83,13 +91,13 @@ BUILDENV=(!distcc color !ccache check !sign)
#-- 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
#-- debug: Add debugging flags as specified in DEBUG_* variables
#-- lto: Add compile flags for building with link time optimization
#
OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !upx !debug)
OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge debug lto)
#-- File integrity checks to use. Valid: md5, sha1, sha256, sha384, sha512
INTEGRITY_CHECK=(md5)
#-- File integrity checks to use. Valid: md5, sha1, sha224, sha256, sha384, sha512, b2
INTEGRITY_CHECK=(sha256)
#-- Options to be used when stripping binaries. See `man strip' for details.
STRIP_BINARIES="--strip-all"
#-- Options to be used when stripping shared libraries. See `man strip' for details.
@@ -102,6 +110,8 @@ MAN_DIRS=({usr{,/local}{,/share},opt/*}/{man,info})
DOC_DIRS=(usr/{,local/}{,share/}{doc,gtk-doc} opt/*/{doc,gtk-doc})
#-- Files to be removed from all packages (if purge is specified)
PURGE_TARGETS=(usr/{,share}/info/dir .packlist *.pod)
#-- Directory to store source code in for debug packages
DBGSRCDIR="/usr/src/debug"
#########################################################################
# PACKAGE OUTPUT
@@ -129,18 +139,24 @@ PURGE_TARGETS=(usr/{,share}/info/dir .packlist *.pod)
COMPRESSGZ=(gzip -c -f -n)
COMPRESSBZ2=(bzip2 -c -f)
COMPRESSXZ=(xz -c -z -)
COMPRESSZST=(zstd -c -T0 --ultra -20 -)
COMPRESSLRZ=(lrzip -q)
COMPRESSLZO=(lzop -q)
COMPRESSZ=(compress -c -f)
COMPRESSLZ4=(lz4 -q)
COMPRESSLZ=(lzip -c -f)
#########################################################################
# EXTENSION DEFAULTS
#########################################################################
#
# WARNING: Do NOT modify these variables unless you know what you are
# doing.
#
PKGEXT='.pkg.tar.xz'
PKGEXT='.pkg.tar.zst'
SRCEXT='.src.tar.gz'
#########################################################################
# OTHER
#########################################################################
#
#-- Command used to run pacman as root, instead of trying sudo and su
#PACMAN_AUTH=()
# vim: set ft=sh ts=2 sw=2 et:

View File

@@ -1,3 +1,6 @@
#!/hint/bash
# shellcheck disable=2034
#
# /etc/makepkg.conf
#
@@ -8,9 +11,10 @@
#
#-- The download utilities that makepkg should use to acquire sources
# Format: 'protocol::agent'
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'
DLAGENTS=('file::/usr/bin/curl -qgC - -o %o %u'
'ftp::/usr/bin/curl -qgfC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %u'
'http::/usr/bin/curl -qgb "" -fLC - --retry 3 --retry-delay 3 -o %o %u'
'https::/usr/bin/curl -qgb "" -fLC - --retry 3 --retry-delay 3 -o %o %u'
'rsync::/usr/bin/rsync --no-motd -z %u %o'
'scp::/usr/bin/scp -C %u %o')
@@ -22,6 +26,7 @@ DLAGENTS=('ftp::/usr/bin/curl -fC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %
#-- The package required by makepkg to download VCS sources
# Format: 'protocol::package'
VCSCLIENTS=('bzr::bzr'
'fossil::fossil'
'git::git'
'hg::mercurial'
'svn::subversion')
@@ -30,27 +35,30 @@ VCSCLIENTS=('bzr::bzr'
# ARCHITECTURE, COMPILE FLAGS
#########################################################################
#
CARCH="i686"
CHOST="i686-pc-linux-gnu"
CARCH="x86_64_v3"
CHOST="x86_64-pc-linux-gnu"
#-- Compiler and Linker Flags
# -march (or -mcpu) builds exclusively for an architecture
# -mtune optimizes for an architecture, but builds for whole processor family
CPPFLAGS="-D_FORTIFY_SOURCE=2"
CFLAGS="-march=i686 -mtune=generic -O2 -pipe -fstack-protector-strong"
CXXFLAGS="-march=i686 -mtune=generic -O2 -pipe -fstack-protector-strong"
LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro"
#CPPFLAGS=""
CFLAGS="-march=x86-64-v3 -mtune=generic -O2 -pipe -fno-plt -fexceptions \
-Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security \
-fstack-clash-protection -fcf-protection"
CXXFLAGS="$CFLAGS -Wp,-D_GLIBCXX_ASSERTIONS"
LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now"
LTOFLAGS="-flto=auto"
RUSTFLAGS=""
#-- Make Flags: change this for DistCC/SMP systems
#MAKEFLAGS="-j2"
#-- Debugging flags
DEBUG_CFLAGS="-g -fvar-tracking-assignments"
DEBUG_CXXFLAGS="-g -fvar-tracking-assignments"
DEBUG_CFLAGS="-g"
DEBUG_CXXFLAGS="$DEBUG_CFLAGS"
DEBUG_RUSTFLAGS="-C debuginfo=2"
#########################################################################
# BUILD ENVIRONMENT
#########################################################################
#
# Defaults: BUILDENV=(!distcc color !ccache check !sign)
# Makepkg defaults: BUILDENV=(!distcc !color !ccache check !sign)
# A negated environment option will do the opposite of the comments below.
#
#-- distcc: Use the Distributed C/C++/ObjC compiler
@@ -73,7 +81,7 @@ BUILDENV=(!distcc color !ccache check !sign)
# These are default values for the options=() settings
#########################################################################
#
# Default: OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !upx !debug)
# Makepkg defaults: OPTIONS=(!strip docs libtool staticlibs emptydirs !zipman !purge !debug !lto)
# A negated option will do the opposite of the comments below.
#
#-- strip: Strip symbols from binaries/libraries
@@ -83,13 +91,13 @@ BUILDENV=(!distcc color !ccache check !sign)
#-- 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
#-- debug: Add debugging flags as specified in DEBUG_* variables
#-- lto: Add compile flags for building with link time optimization
#
OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !upx !debug)
OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge debug lto)
#-- File integrity checks to use. Valid: md5, sha1, sha256, sha384, sha512
INTEGRITY_CHECK=(md5)
#-- File integrity checks to use. Valid: md5, sha1, sha224, sha256, sha384, sha512, b2
INTEGRITY_CHECK=(sha256)
#-- Options to be used when stripping binaries. See `man strip' for details.
STRIP_BINARIES="--strip-all"
#-- Options to be used when stripping shared libraries. See `man strip' for details.
@@ -102,6 +110,8 @@ MAN_DIRS=({usr{,/local}{,/share},opt/*}/{man,info})
DOC_DIRS=(usr/{,local/}{,share/}{doc,gtk-doc} opt/*/{doc,gtk-doc})
#-- Files to be removed from all packages (if purge is specified)
PURGE_TARGETS=(usr/{,share}/info/dir .packlist *.pod)
#-- Directory to store source code in for debug packages
DBGSRCDIR="/usr/src/debug"
#########################################################################
# PACKAGE OUTPUT
@@ -129,18 +139,24 @@ PURGE_TARGETS=(usr/{,share}/info/dir .packlist *.pod)
COMPRESSGZ=(gzip -c -f -n)
COMPRESSBZ2=(bzip2 -c -f)
COMPRESSXZ=(xz -c -z -)
COMPRESSZST=(zstd -c -T0 --ultra -20 -)
COMPRESSLRZ=(lrzip -q)
COMPRESSLZO=(lzop -q)
COMPRESSZ=(compress -c -f)
COMPRESSLZ4=(lz4 -q)
COMPRESSLZ=(lzip -c -f)
#########################################################################
# EXTENSION DEFAULTS
#########################################################################
#
# WARNING: Do NOT modify these variables unless you know what you are
# doing.
#
PKGEXT='.pkg.tar.xz'
PKGEXT='.pkg.tar.zst'
SRCEXT='.src.tar.gz'
#########################################################################
# OTHER
#########################################################################
#
#-- Command used to run pacman as root, instead of trying sudo and su
#PACMAN_AUTH=()
# vim: set ft=sh ts=2 sw=2 et:

View File

@@ -0,0 +1,95 @@
#
# /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/
#HookDir = /etc/pacman.d/hooks/
HoldPkg = pacman glibc
#XferCommand = /usr/bin/curl -L -C - -f -o %o %u
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
Architecture = x86_64_v3 x86_64
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
#IgnorePkg =
#IgnoreGroup =
#NoUpgrade =
#NoExtract =
# Misc options
#UseSyslog
#Color
NoProgressBar
# We cannot check disk space from within a chroot environment
#CheckSpace
VerbosePkgLists
ParallelDownloads = 5
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.
SigLevel = Required DatabaseOptional
LocalFileSigLevel = Optional
#RemoteFileSigLevel = Required
# NOTE: You must run `pacman-key --init` before first using pacman; the local
# keyring can then be populated with the keys of all official Arch Linux
# packagers with `pacman-key --populate archlinux`.
#
# 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.
[core-staging]
Include = /etc/pacman.d/mirrorlist
[core-testing]
Include = /etc/pacman.d/mirrorlist
[core]
Include = /etc/pacman.d/mirrorlist
[extra-staging]
Include = /etc/pacman.d/mirrorlist
[extra-testing]
Include = /etc/pacman.d/mirrorlist
[extra]
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

@@ -14,11 +14,11 @@
#CacheDir = /var/cache/pacman/pkg/
#LogFile = /var/log/pacman.log
#GPGDir = /etc/pacman.d/gnupg/
#HookDir = /etc/pacman.d/hooks/
HoldPkg = pacman glibc
#XferCommand = /usr/bin/curl -C - -f %u > %o
#XferCommand = /usr/bin/curl -L -C - -f -o %o %u
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
#UseDelta = 0.7
Architecture = auto
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
@@ -31,10 +31,11 @@ Architecture = auto
# Misc options
#UseSyslog
#Color
#TotalDownload
NoProgressBar
# We cannot check disk space from within a chroot environment
#CheckSpace
#VerbosePkgLists
VerbosePkgLists
ParallelDownloads = 5
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.
@@ -69,30 +70,26 @@ LocalFileSigLevel = Optional
# repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors.
[staging]
[core-staging]
Include = /etc/pacman.d/mirrorlist
[testing]
[core-testing]
Include = /etc/pacman.d/mirrorlist
[core]
Include = /etc/pacman.d/mirrorlist
[extra-staging]
Include = /etc/pacman.d/mirrorlist
[extra-testing]
Include = /etc/pacman.d/mirrorlist
[extra]
Include = /etc/pacman.d/mirrorlist
[community-staging]
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

@@ -0,0 +1,89 @@
#
# /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/
#HookDir = /etc/pacman.d/hooks/
HoldPkg = pacman glibc
#XferCommand = /usr/bin/curl -L -C - -f -o %o %u
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
Architecture = x86_64_v3 x86_64
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
#IgnorePkg =
#IgnoreGroup =
#NoUpgrade =
#NoExtract =
# Misc options
#UseSyslog
#Color
NoProgressBar
# We cannot check disk space from within a chroot environment
#CheckSpace
VerbosePkgLists
ParallelDownloads = 5
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.
SigLevel = Required DatabaseOptional
LocalFileSigLevel = Optional
#RemoteFileSigLevel = Required
# NOTE: You must run `pacman-key --init` before first using pacman; the local
# keyring can then be populated with the keys of all official Arch Linux
# packagers with `pacman-key --populate archlinux`.
#
# 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.
[core-testing]
Include = /etc/pacman.d/mirrorlist
[core]
Include = /etc/pacman.d/mirrorlist
[extra-testing]
Include = /etc/pacman.d/mirrorlist
[extra]
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

@@ -14,11 +14,11 @@
#CacheDir = /var/cache/pacman/pkg/
#LogFile = /var/log/pacman.log
#GPGDir = /etc/pacman.d/gnupg/
#HookDir = /etc/pacman.d/hooks/
HoldPkg = pacman glibc
#XferCommand = /usr/bin/curl -C - -f %u > %o
#XferCommand = /usr/bin/curl -L -C - -f -o %o %u
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
#UseDelta = 0.7
Architecture = auto
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
@@ -31,10 +31,11 @@ Architecture = auto
# Misc options
#UseSyslog
#Color
#TotalDownload
NoProgressBar
# We cannot check disk space from within a chroot environment
#CheckSpace
#VerbosePkgLists
VerbosePkgLists
ParallelDownloads = 5
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.
@@ -69,24 +70,20 @@ LocalFileSigLevel = Optional
# repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors.
[testing]
[core-testing]
Include = /etc/pacman.d/mirrorlist
[core]
Include = /etc/pacman.d/mirrorlist
[extra-testing]
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

@@ -0,0 +1,95 @@
#
# /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/
#HookDir = /etc/pacman.d/hooks/
HoldPkg = pacman glibc
#XferCommand = /usr/bin/curl -L -C - -f -o %o %u
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
Architecture = x86_64_v3 x86_64
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
#IgnorePkg =
#IgnoreGroup =
#NoUpgrade =
#NoExtract =
# Misc options
#UseSyslog
#Color
NoProgressBar
# We cannot check disk space from within a chroot environment
#CheckSpace
VerbosePkgLists
ParallelDownloads = 5
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.
SigLevel = Required DatabaseOptional
LocalFileSigLevel = Optional
#RemoteFileSigLevel = Required
# NOTE: You must run `pacman-key --init` before first using pacman; the local
# keyring can then be populated with the keys of all official Arch Linux
# packagers with `pacman-key --populate archlinux`.
#
# 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.
[core-staging]
Include = /etc/pacman.d/mirrorlist
[core-testing]
Include = /etc/pacman.d/mirrorlist
[core]
Include = /etc/pacman.d/mirrorlist
[extra-staging]
Include = /etc/pacman.d/mirrorlist
[extra-testing]
Include = /etc/pacman.d/mirrorlist
[extra]
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

@@ -14,11 +14,11 @@
#CacheDir = /var/cache/pacman/pkg/
#LogFile = /var/log/pacman.log
#GPGDir = /etc/pacman.d/gnupg/
#HookDir = /etc/pacman.d/hooks/
HoldPkg = pacman glibc
#XferCommand = /usr/bin/curl -C - -f %u > %o
#XferCommand = /usr/bin/curl -L -C - -f -o %o %u
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
#UseDelta = 0.7
Architecture = auto
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
@@ -31,10 +31,11 @@ Architecture = auto
# Misc options
#UseSyslog
#Color
#TotalDownload
NoProgressBar
# We cannot check disk space from within a chroot environment
#CheckSpace
#VerbosePkgLists
VerbosePkgLists
ParallelDownloads = 5
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.
@@ -69,33 +70,26 @@ LocalFileSigLevel = Optional
# 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]
[core-staging]
Include = /etc/pacman.d/mirrorlist
[staging]
Include = /etc/pacman.d/mirrorlist
[testing]
[core-testing]
Include = /etc/pacman.d/mirrorlist
[core]
Include = /etc/pacman.d/mirrorlist
[extra-staging]
Include = /etc/pacman.d/mirrorlist
[extra-testing]
Include = /etc/pacman.d/mirrorlist
[extra]
Include = /etc/pacman.d/mirrorlist
[community-staging]
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

@@ -0,0 +1,89 @@
#
# /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/
#HookDir = /etc/pacman.d/hooks/
HoldPkg = pacman glibc
#XferCommand = /usr/bin/curl -L -C - -f -o %o %u
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
Architecture = x86_64_v3 x86_64
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
#IgnorePkg =
#IgnoreGroup =
#NoUpgrade =
#NoExtract =
# Misc options
#UseSyslog
#Color
NoProgressBar
# We cannot check disk space from within a chroot environment
#CheckSpace
VerbosePkgLists
ParallelDownloads = 5
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.
SigLevel = Required DatabaseOptional
LocalFileSigLevel = Optional
#RemoteFileSigLevel = Required
# NOTE: You must run `pacman-key --init` before first using pacman; the local
# keyring can then be populated with the keys of all official Arch Linux
# packagers with `pacman-key --populate archlinux`.
#
# 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.
[core-testing]
Include = /etc/pacman.d/mirrorlist
[core]
Include = /etc/pacman.d/mirrorlist
[extra-testing]
Include = /etc/pacman.d/mirrorlist
[extra]
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,89 @@
#
# /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/
#HookDir = /etc/pacman.d/hooks/
HoldPkg = pacman glibc
#XferCommand = /usr/bin/curl -L -C - -f -o %o %u
#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
#Color
NoProgressBar
# We cannot check disk space from within a chroot environment
#CheckSpace
VerbosePkgLists
ParallelDownloads = 5
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.
SigLevel = Required DatabaseOptional
LocalFileSigLevel = Optional
#RemoteFileSigLevel = Required
# NOTE: You must run `pacman-key --init` before first using pacman; the local
# keyring can then be populated with the keys of all official Arch Linux
# packagers with `pacman-key --populate archlinux`.
#
# 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.
[core-testing]
Include = /etc/pacman.d/mirrorlist
[core]
Include = /etc/pacman.d/mirrorlist
[extra-testing]
Include = /etc/pacman.d/mirrorlist
[extra]
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,89 @@
#
# /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/
#HookDir = /etc/pacman.d/hooks/
HoldPkg = pacman glibc
#XferCommand = /usr/bin/curl -L -C - -f -o %o %u
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
Architecture = x86_64_v3 x86_64
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
#IgnorePkg =
#IgnoreGroup =
#NoUpgrade =
#NoExtract =
# Misc options
#UseSyslog
#Color
NoProgressBar
# We cannot check disk space from within a chroot environment
#CheckSpace
VerbosePkgLists
ParallelDownloads = 5
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.
SigLevel = Required DatabaseOptional
LocalFileSigLevel = Optional
#RemoteFileSigLevel = Required
# NOTE: You must run `pacman-key --init` before first using pacman; the local
# keyring can then be populated with the keys of all official Arch Linux
# packagers with `pacman-key --populate archlinux`.
#
# 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.
#[core-testing]
#Include = /etc/pacman.d/mirrorlist
[core]
Include = /etc/pacman.d/mirrorlist
#[extra-testing]
#Include = /etc/pacman.d/mirrorlist
[extra]
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

@@ -14,11 +14,11 @@
#CacheDir = /var/cache/pacman/pkg/
#LogFile = /var/log/pacman.log
#GPGDir = /etc/pacman.d/gnupg/
#HookDir = /etc/pacman.d/hooks/
HoldPkg = pacman glibc
#XferCommand = /usr/bin/curl -C - -f %u > %o
#XferCommand = /usr/bin/curl -L -C - -f -o %o %u
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
#UseDelta = 0.7
Architecture = auto
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
@@ -31,10 +31,11 @@ Architecture = auto
# Misc options
#UseSyslog
#Color
#TotalDownload
NoProgressBar
# We cannot check disk space from within a chroot environment
#CheckSpace
#VerbosePkgLists
VerbosePkgLists
ParallelDownloads = 5
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.
@@ -69,19 +70,16 @@ LocalFileSigLevel = Optional
# repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors.
#[testing]
#[core-testing]
#Include = /etc/pacman.d/mirrorlist
[core]
Include = /etc/pacman.d/mirrorlist
[extra]
Include = /etc/pacman.d/mirrorlist
#[community-testing]
#[extra-testing]
#Include = /etc/pacman.d/mirrorlist
[community]
[extra]
Include = /etc/pacman.d/mirrorlist
# An example of a custom package repository. See the pacman manpage for
@@ -89,4 +87,3 @@ Include = /etc/pacman.d/mirrorlist
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs

View File

@@ -0,0 +1,92 @@
#
# /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/
#HookDir = /etc/pacman.d/hooks/
HoldPkg = pacman glibc
#XferCommand = /usr/bin/curl -L -C - -f -o %o %u
#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
#Color
NoProgressBar
# We cannot check disk space from within a chroot environment
#CheckSpace
VerbosePkgLists
ParallelDownloads = 5
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.
SigLevel = Required DatabaseOptional
LocalFileSigLevel = Optional
#RemoteFileSigLevel = Required
# NOTE: You must run `pacman-key --init` before first using pacman; the local
# keyring can then be populated with the keys of all official Arch Linux
# packagers with `pacman-key --populate archlinux`.
#
# 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
[core-testing]
Include = /etc/pacman.d/mirrorlist
[core]
Include = /etc/pacman.d/mirrorlist
[extra-testing]
Include = /etc/pacman.d/mirrorlist
[extra]
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

@@ -14,11 +14,11 @@
#CacheDir = /var/cache/pacman/pkg/
#LogFile = /var/log/pacman.log
#GPGDir = /etc/pacman.d/gnupg/
#HookDir = /etc/pacman.d/hooks/
HoldPkg = pacman glibc
#XferCommand = /usr/bin/curl -C - -f %u > %o
#XferCommand = /usr/bin/curl -L -C - -f -o %o %u
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
#UseDelta = 0.7
Architecture = auto
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
@@ -31,10 +31,11 @@ Architecture = auto
# Misc options
#UseSyslog
#Color
#TotalDownload
NoProgressBar
# We cannot check disk space from within a chroot environment
#CheckSpace
#VerbosePkgLists
VerbosePkgLists
ParallelDownloads = 5
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.
@@ -72,24 +73,20 @@ LocalFileSigLevel = Optional
[kde-unstable]
Include = /etc/pacman.d/mirrorlist
[testing]
[core-testing]
Include = /etc/pacman.d/mirrorlist
[core]
Include = /etc/pacman.d/mirrorlist
[extra-testing]
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

@@ -14,11 +14,11 @@
#CacheDir = /var/cache/pacman/pkg/
#LogFile = /var/log/pacman.log
#GPGDir = /etc/pacman.d/gnupg/
#HookDir = /etc/pacman.d/hooks/
HoldPkg = pacman glibc
#XferCommand = /usr/bin/curl -C - -f %u > %o
#XferCommand = /usr/bin/curl -L -C - -f -o %o %u
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
#UseDelta = 0.7
Architecture = auto
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
@@ -31,10 +31,11 @@ Architecture = auto
# Misc options
#UseSyslog
#Color
#TotalDownload
NoProgressBar
# We cannot check disk space from within a chroot environment
#CheckSpace
#VerbosePkgLists
VerbosePkgLists
ParallelDownloads = 5
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.
@@ -69,27 +70,24 @@ LocalFileSigLevel = Optional
# repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors.
[staging]
[core-staging]
Include = /etc/pacman.d/mirrorlist
[testing]
[core-testing]
Include = /etc/pacman.d/mirrorlist
[core]
Include = /etc/pacman.d/mirrorlist
[extra-staging]
Include = /etc/pacman.d/mirrorlist
[extra-testing]
Include = /etc/pacman.d/mirrorlist
[extra]
Include = /etc/pacman.d/mirrorlist
[community-staging]
Include = /etc/pacman.d/mirrorlist
[community-testing]
Include = /etc/pacman.d/mirrorlist
[community]
Include = /etc/pacman.d/mirrorlist
# If you want to run 32 bit applications on your x86_64 system,
# enable the multilib repositories as required here.
[multilib-staging]
@@ -106,4 +104,3 @@ Include = /etc/pacman.d/mirrorlist
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs

View File

@@ -14,11 +14,11 @@
#CacheDir = /var/cache/pacman/pkg/
#LogFile = /var/log/pacman.log
#GPGDir = /etc/pacman.d/gnupg/
#HookDir = /etc/pacman.d/hooks/
HoldPkg = pacman glibc
#XferCommand = /usr/bin/curl -C - -f %u > %o
#XferCommand = /usr/bin/curl -L -C - -f -o %o %u
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
#UseDelta = 0.7
Architecture = auto
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
@@ -31,10 +31,11 @@ Architecture = auto
# Misc options
#UseSyslog
#Color
#TotalDownload
NoProgressBar
# We cannot check disk space from within a chroot environment
#CheckSpace
#VerbosePkgLists
VerbosePkgLists
ParallelDownloads = 5
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.
@@ -69,21 +70,18 @@ LocalFileSigLevel = Optional
# repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors.
[testing]
[core-testing]
Include = /etc/pacman.d/mirrorlist
[core]
Include = /etc/pacman.d/mirrorlist
[extra-testing]
Include = /etc/pacman.d/mirrorlist
[extra]
Include = /etc/pacman.d/mirrorlist
[community-testing]
Include = /etc/pacman.d/mirrorlist
[community]
Include = /etc/pacman.d/mirrorlist
# If you want to run 32 bit applications on your x86_64 system,
# enable the multilib repositories as required here.
[multilib-testing]
@@ -97,4 +95,3 @@ Include = /etc/pacman.d/mirrorlist
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs

View File

@@ -14,11 +14,11 @@
#CacheDir = /var/cache/pacman/pkg/
#LogFile = /var/log/pacman.log
#GPGDir = /etc/pacman.d/gnupg/
#HookDir = /etc/pacman.d/hooks/
HoldPkg = pacman glibc
#XferCommand = /usr/bin/curl -C - -f %u > %o
#XferCommand = /usr/bin/curl -L -C - -f -o %o %u
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
#UseDelta = 0.7
Architecture = auto
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
@@ -31,10 +31,11 @@ Architecture = auto
# Misc options
#UseSyslog
#Color
#TotalDownload
NoProgressBar
# We cannot check disk space from within a chroot environment
#CheckSpace
#VerbosePkgLists
VerbosePkgLists
ParallelDownloads = 5
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.
@@ -69,19 +70,16 @@ LocalFileSigLevel = Optional
# repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors.
#[testing]
#[core-testing]
#Include = /etc/pacman.d/mirrorlist
[core]
Include = /etc/pacman.d/mirrorlist
[extra]
Include = /etc/pacman.d/mirrorlist
#[community-testing]
#[extra-testing]
#Include = /etc/pacman.d/mirrorlist
[community]
[extra]
Include = /etc/pacman.d/mirrorlist
# If you want to run 32 bit applications on your x86_64 system,
@@ -98,4 +96,3 @@ Include = /etc/pacman.d/mirrorlist
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs

View File

@@ -0,0 +1 @@
x86_64

View File

@@ -0,0 +1,469 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/valid-tags.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-tags.sh
# shellcheck source=src/lib/valid-repos.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-repos.sh
_binary_arch=${_arch[*]:0:-1}
_colors=(never always auto)
_makechrootpkg_args=(
-h
-c
-d
-D
-u
-r
-I
-l
-n
-T
-U
)
_makechrootpkg_args_d_opts() { _filedir -d; }
_makechrootpkg_args_D_opts() { _filedir -d; }
_makechrootpkg_args_r_opts() { _filedir -d; }
_makechrootpkg_args_I_opts() { _filedir '*.pkg.tar.*'; }
_makechrootpkg_args_l_opts() { _filedir -d; }
_makechrootpkg_args_U_opts() { :; }
_makechrootpkg() { __devtools_complete _makechrootpkg; }
complete -F _makechrootpkg makechrootpkg
_makerepropkg_args=(
-h
-d
-c
-M
)
_makerepropkg_args_c_opts() { _filedir -d; }
_makerepropkg_args_M_opts() { _filedir '*.conf'; }
_makerepropkg_opts() { _filedir '*.pkg.tar.*'; }
_makerepropkg() { __devtools_complete _makerepropkg; }
complete -F _makerepropkg makerepropkg
_mkarchroot_args=(
-U
-C
-M
-c
-h
)
_mkarchroot_args_U_opts() { _filedir '*.pkg.tar.*'; }
_mkarchroot_args_C_opts() { _filedir '*.conf'; }
_mkarchroot_args_M_opts() { _filedir '*.conf'; }
_mkarchroot_args_c_opts() { _filedir -d; }
_mkarchroot_opts() {
local args
args=$(__pkgctl_word_count_after_subcommand)
if (( args == 0 )); then
_filedir -d
elif (( args >= 1 )); then
_devtools_completions_all_packages
fi
}
_mkarchroot() { __devtools_complete _mkarchroot; }
complete -F _mkarchroot mkarchroot
_arch_nspawn_args=(
-C
-M
-c
-f
-s
-h
)
_arch_nspawn_args_C_opts() { _filedir '*.conf'; }
_arch_nspawn_args_M_opts() { _filedir '*.conf'; }
_arch_nspawn_args_c_opts() { _filedir -d; }
_arch_nspawn_args_f_opts() { _filedir; }
_arch_nspawn_opts() {
local args
args=$(__pkgctl_word_count_after_subcommand)
if (( args == 0 )); then
_filedir -d
fi
}
_arch_nspawn() { __devtools_complete _arch_nspawn; }
complete -F _arch_nspawn arch-nspawn
_sogrep_args=(
-v --verbose
-r --refresh
-h --help
)
_sogrep_opts() {
local args
args=$(__pkgctl_word_count_after_subcommand)
if (( args == 0 )); then
_devtools_completions_repo all
fi
}
_sogrep() { __devtools_complete _sogrep; }
complete -F _sogrep sogrep
_offload_build_args=(
-r --repo
-a --arch
-s --server
-h --help
)
_offload_build_args__repo_opts() { _devtools_completions_build_repo; }
_offload_build_args_r_opts() { _offload_build_args__repo_opts; }
_offload_build_args__arch_opts() { _devtools_completions_arch; }
_offload_build_args_a_opts() { _offload_build_args__arch_opts; }
_offload_build_args__server_opts() { :; }
_offload_build_args_s_opts() { _offload_build_args__server_opts; }
_offload_build() { __devtools_complete _offload_build; }
complete -F _offload_build offload-build
_pkgctl_cmds=(
auth
build
db
diff
release
repo
version
)
_pkgctl_args=(
-V --version
-h --help
)
_pkgctl_auth_cmds=(
login
status
)
_pkgctl_auth_login_args=(
-g --gen-access-token
-h --help
)
_pkgctl_auth_status_args=(
-t --show-token
-h --help
)
_pkgctl_build_args=(
--arch
--repo
-s --staging
-t --testing
-o --offload
-c --clean
-w --worker
--pkgver
--pkgrel
--rebuild
-e --edit
-r --release
-m --message
-u --db-update
-h --help
)
_pkgctl_build_args__arch_opts() { _devtools_completions_arch; }
_pkgctl_build_args__repo_opts() { _devtools_completions_repo; }
_pkgctl_build_args__worker_opts() { :; }
_pkgctl_build_args_w_opts() { _pkgctl_build_args__worker_opts; }
_pkgctl_build_args__pkgver_opts() { :; }
_pkgctl_build_args__pkgrel_opts() { :; }
_pkgctl_build_args__message_opts() { :; }
_pkgctl_build_args_m_opts() { _pkgctl_build_args__message_opts; }
_pkgctl_build_opts() { _filedir -d; }
_pkgctl_db_cmds=(
move
remove
update
)
_pkgctl_db_move_args=(
-h --help
)
_pkgctl_db_move_opts() {
local subcommand args
subcommand=(db move)
args=$(__pkgctl_word_count_after_subcommand "${subcommand[@]}")
if (( args == 0 )); then
_devtools_completions_repo
elif (( args == 1 )); then
_devtools_completions_repo
elif (( args >= 2 )); then
_devtools_completions_all_packages
fi
}
_pkgctl_db_remove_args=(
-a --arch
-h --help
)
_pkgctl_db_remove_opts() {
local subcommand args
subcommand=(db remove)
args=$(__pkgctl_word_count_after_subcommand "${subcommand[@]}")
if (( args == 0 )); then
_devtools_completions_repo
elif (( args >= 1 )); then
_devtools_completions_all_packages
fi
}
_pkgctl_db_update_args=(
-h --help
)
_pkgctl_release_args=(
-m --message
-r --repo
-s --staging
-t --testing
-u --db-update
-h --help
)
_pkgctl_release_args__message_opts() { :; }
_pkgctl_release_args_m_opts() { _pkgctl_release_args__message_opts; }
_pkgctl_release_args__repo_opts() { _devtools_completions_repo; }
_pkgctl_release_args_r_opts() { _pkgctl_release_args__repo_opts; }
_pkgctl_release_opts() { _filedir -d; }
_pkgctl_repo_cmds=(
clone
configure
create
switch
web
)
_pkgctl_repo_clone_args=(
-m --maintainer
--protocol
--switch
-u --unprivileged
--universe
-j --jobs
-h --help
)
_pkgctl_repo_clone_args__maintainer_opts() { :; }
_pkgctl_repo_clone_args_m_opts() { _pkgctl_repo_clone_args__maintainer_opts; }
_pkgctl_repo_clone_args__protocol_opts() { _devtools_completions_protocol; }
_pkgctl_repo_clone_args__switch_opts() { :; }
_pkgctl_repo_clone_args__jobs_opts() { :; }
_pkgctl_repo_clone_args_j_opts() { _pkgctl_repo_clone_args__jobs_opts; }
_pkgctl_repo_clone_opts() { _devtools_completions_all_packages; }
_pkgctl_repo_configure_args=(
--protocol
-j --jobs
-h --help
)
_pkgctl_repo_configure_args__protocol_opts() { _devtools_completions_protocol; }
_pkgctl_repo_configure_args__jobs_opts() { :; }
_pkgctl_repo_configure_args_j_opts() { _pkgctl_repo_clone_args__jobs_opts; }
_pkgctl_repo_configure_opts() { _filedir -d; }
_pkgctl_repo_create_args=(
-c --clone
-h --help
)
_pkgctl_repo_switch_args=(
--discard-changes
-f --force
-h --help
)
_pkgctl_repo_switch_opts() {
local subcommand args
subcommand=(repo switch)
args=$(__pkgctl_word_count_after_subcommand "${subcommand[@]}")
if (( args == 0 )); then
:
elif (( args >= 1 )); then
_filedir -d;
fi
}
_pkgctl_repo_web_args=(
-h --help
)
_pkgctl_repo_web_opts() { _filedir -d; }
_pkgctl_diff_args=(
-l --list
-d --diffoscope
-p --pkginfo
-b --buildinfo
-m --makepkg-config
-u -U --unified
-y --side-by-side
--color
-W --width
-P --pool
-v --verbose
-h --help
)
_pkgctl_diff_args__makepkg_config_opts() { _filedir '*.conf'; }
_pkgctl_diff_args_m_opts() { _pkgctl_diff_args__makepkg_config_opts; }
_pkgctl_diff_args__width_opts() { :; }
_pkgctl_diff_args_W_opts() { _pkgctl_diff_args__width_opts; }
_pkgctl_diff_args__color_opts() { _devtools_completions_color; }
_pkgctl_diff_args__pool_opts() { _filedir -d; }
_pkgctl_diff_args_P_opts() { _pkgctl_diff_args__pool_opts; }
_pkgctl_diff_opts() { _devtools_completions_all_packages; }
_pkgctl_version_args=(
-h --help
)
_devtools_completions_color() {
mapfile -t COMPREPLY < <(compgen -W "${_colors[*]}" -- "$cur")
}
_devtools_completions_arch() {
mapfile -t COMPREPLY < <(compgen -W "${_arch[*]}" -- "$cur")
}
_devtools_completions_repo() {
local optional=${1:-}
mapfile -t COMPREPLY < <(compgen -W "${optional} ${_repos[*]}" -- "$cur")
}
_devtools_completions_build_repo() {
mapfile -t COMPREPLY < <(compgen -W "${_build_repos[*]}" -- "$cur")
}
_devtools_completions_all_packages() {
mapfile -t COMPREPLY < <(compgen -W "$(pacman -Sql)" -- "$cur")
}
_devtools_completions_protocol() {
mapfile -t COMPREPLY < <(compgen -W "https" -- "$cur")
}
__devtools_complete() {
local service=$1
local cur prev
# Don't break words at : and =
COMP_WORDBREAKS=${COMP_WORDBREAKS//[:=]}
cur=$(_get_cword)
prev=${COMP_WORDS[COMP_CWORD-1]}
__pkgctl_handle_subcommands "${service}"
return 0
}
__pkgctl_has_func() {
declare -f -- "${1}" &>/dev/null
}
__pkgctl_has_array() {
declare -p -- "${1}" &>/dev/null
}
__pkgctl_is_subcommand() {
__pkgctl_has_array "${1}"_args || \
__pkgctl_has_array "${1}"_cmds
}
__pkgctl_words_after_subcommand() {
local subcommand=("$@")
local subcommand_idx=0
local word prev_word
for ((i = 1; i < ${#COMP_WORDS[@]}; ++i)); do
word=${COMP_WORDS[i]}
prev_word=${COMP_WORDS[i-1]}
# skip options and the current typing
if [[ ${word} == -* ]] || [[ ${word} == "${cur}" ]]; then
continue
fi
# skip until we resolved the passed subcommand
if (( subcommand_idx < ${#subcommand[@]} )); then
if [[ $word == "${subcommand[$subcommand_idx]}" ]]; then
subcommand_idx=$(( subcommand_idx + 1 ))
fi
continue
fi
# skip previous options as they belong to the argument
if [[ ${prev_word} == -* ]] && __pkgctl_has_func "${service_name}_args${prev_word//-/_}_opts"; then
continue
fi
printf "%s\n" "${word}"
done
}
__pkgctl_word_count_after_subcommand() {
local subcommand=("$@")
mapfile -t words < <(__pkgctl_words_after_subcommand "${subcommand[@]}")
echo "${#words[@]}"
}
__pkgctl_handle_subcommands() {
local service_name=${1}
local index=${2:-0}
local word ref
# recurse into nested subcommands
for ((i = index + 1; i < ${#COMP_WORDS[@]}; ++i)); do
word=${COMP_WORDS[i]}
if [[ ${word} == -* ]] || [[ ${word} == "${cur}" ]]; then
continue
fi
if __pkgctl_is_subcommand "${service_name}_${word}"; then
__pkgctl_handle_subcommands "${service_name}_${word}" "${i}"
return
fi
done
# dynamic argument options
if [[ $prev == -* ]] && word=${prev//-/_} && __pkgctl_has_func "${service_name}_args${word}_opts"; then
"${service_name}_args${word}_opts"
# dynamic subcommand options
elif [[ $cur != -* ]] && __pkgctl_has_func "${service_name}_opts"; then
"${service_name}_opts"
# subcommand argument array
elif ( ! __pkgctl_has_array "${service_name}"_cmds || [[ $cur == -* ]] ) && __pkgctl_has_array "${service_name}_args"; then
declare -n ref="${service_name}_args"
mapfile -t COMPREPLY < <(compgen -W "${ref[*]}" -- "$cur")
# subcommand array
elif __pkgctl_has_array "${service_name}"_cmds; then
declare -n ref="${service_name}_cmds"
mapfile -t COMPREPLY < <(compgen -W "${ref[*]}" -- "$cur")
fi
}
_pkgctl() { __devtools_complete _pkgctl; }
complete -F _pkgctl pkgctl
# ex:noet ts=4 sw=4 ft=sh

View File

@@ -0,0 +1,298 @@
#compdef archbuild arch-nspawn archrelease commitpkg pkgctl diffpkg finddeps makechrootpkg mkarchroot extrapkg=commitpkg corepkg=commitpkg testingpkg=commitpkg stagingpkg=commitpkg communitypkg=commitpkg community-testingpkg=commitpkg community-stagingpkg=commitpkg multilibpkg=commitpkg multilib-testingpkg=commitpkg extra-x86_64-build=archbuild testing-x86_64-build=archbuild staging-x86_64-build=archbuild multilib-build=archbuild multilib-testing-build=archbuild multilib-staging-build=archbuild kde-unstable-x86_64-build=archbuild gnome-unstable-x86_64-build=archbuild checkpkg sogrep offload-build makerepropkg
#
# SPDX-License-Identifier: GPL-3.0-or-later
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/valid-tags.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-tags.sh
# shellcheck source=src/lib/valid-repos.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-repos.sh
_binary_arch=${_arch[*]:0:-1}
_colors=(never always auto)
_archbuild_args=(
'-c[Recreate the chroot before building]'
'-r[Create chroots in this directory]:base_dir:_files -/'
'-h[Display usage]'
'--[Introduce makechrootpkg options]:*::makechrootpkg options:= _dispatch makechrootpkg makechrootpkg'
)
_pkgctl_auth_cmds=(
"pkgctl auth command"
"login[Authenticate with the GitLab instance]"
"status[View authentication status]"
)
_pkgctl_auth_login_args=(
'(-g --gen-access-token)'{-g,--gen-access-token}'[Open the URL to generate a new personal access token]'
'(-h --help)'{-h,--help}'[Display usage]'
)
_pkgctl_auth_status_args=(
'(-t --show-token)'{-t,--show-token}'[Display the auth token]'
'(-h --help)'{-h,--help}'[Display usage]'
)
_pkgctl_build_args=(
"--arch=[Specify architectures to build for (disables auto-detection)]:arch:($_arch[*])"
"--repo=[Specify a target repository (disables auto-detection)]:repo:($_repos[*])"
'(-s --staging)'{-s,--staging}'[Build against the staging counterpart of the auto-detected repo]'
'(-t --testing)'{-t,--testing}'[Build against the testing counterpart of the auto-detected repo]'
'(-o --offload)'{-o,--offload}'[Build on a remote server and transfer artifacts afterwards]'
'(-c --clean)'{-c,--clean}'[Recreate the chroot before building]'
'(-I --install)'{-I,--install}'[Install a package into the working copy of the chroot]:target:_files -g "*.pkg.tar.*(.)"'
'(-w --worker)'{-w,--worker}'[Name of the worker slot, useful for concurrent builds (disables auto-detection)]:slot:'
'--nocheck[Do not run the check() function in the PKGBUILD]'
'--pkgver=[Set pkgver, reset pkgrel and update checksums]:pkgver:'
'--pkgrel=[Set pkgrel to a given value]:pkgrel:'
'--rebuild[Increment the pkgrel variable]'
'(-e --edit)'{-e,--edit}'[Edit the PKGBUILD before building]'
'(-r --release)'{-r,--release}'[Automatically commit, tag and release after building]'
'(-m --message=)'{-m,--message=}"[Use the given <msg> as the commit message]:message:"
'(-u --db-update)'{-u,--db-update}'[Automatically update the pacman database as last action]'
'(-h --help)'{-h,--help}'[Display usage]'
'*:git_dir:_files -/'
)
_pkgctl_db_cmds=(
"pkgctl db command"
"move[Move packages between pacman repositories]"
"remove[Remove packages from pacman repositories]"
"update[Update the pacman database as final release step]"
)
_pkgctl_db_move_args=(
'(-h --help)'{-h,--help}'[Display usage]'
"1:src-repo:($_repos[*])"
"2:target-repo:($_repos[*])"
'*:pkgbase:_devtools_completions_all_packages'
)
_pkgctl_db_remove_args=(
'(-a --arch=)'{-a,--arch=}"[Override the architecture (disables auto-detection)]:arch:($_arch[*])"
'(-h --help)'{-h,--help}'[Display usage]'
"1:repo:($_repos[*])"
'*:pkgbase:_devtools_completions_all_packages'
)
_pkgctl_db_update_args=(
'(-h --help)'{-h,--help}'[Display usage]'
)
_pkgctl_release_args=(
'(-m --message=)'{-m,--message=}"[Use the given <msg> as the commit message]:message:"
'(-r --repo=)'{-r,--repo=}"[Specify a target repository (disables auto-detection)]:repo:($_repos[*])"
'(-s --staging)'{-s,--staging}'[Release to the staging counterpart of the auto-detected repo]'
'(-t --testing)'{-t,--testing}'[Release to the testing counterpart of the auto-detected repo]'
'(-u --db-update)'{-u,--db-update}'[Automatically update the pacman database after uploading]'
'(-h --help)'{-h,--help}'[Display usage]'
'*:git_dir:_files -/'
)
_pkgctl_repo_cmds=(
"pkgctl repo command"
"clone[Clone a package repository]"
"configure[Configure a clone according to distro specs]"
"create[Create a new GitLab package repository]"
"switch[Switch a package repository to a specified version]"
"web[Open the packaging repository's website]"
)
_pkgctl_repo_switch_args=(
'(-f --force --discard-changes)'{-f,--force,--discard-changes}'[Discard changes if index or working tree is dirty]'
'(-h --help)'{-h,--help}'[Display usage]'
'1:version'
'*:git_dir:_files -/'
)
_pkgctl_repo_clone_args=(
'(-m --maintainer=)'{-m,--maintainer=}'[Clone all packages of the named maintainer]:maintainer:'
'--protocol[Clone the repository over https]:proto:(https)'
'--switch=[Switch the current working tree to a specified version]'
'--universe[Clone all existing packages, useful for cache warming]'
'(-j --jobs)'{-j,--jobs}'[Run up to N jobs in parallel (default: number of processing units)]:jobs:'
'(-h --help)'{-h,--help}'[Display usage]'
'*:packages:_devtools_completions_all_packages'
)
_pkgctl_repo_configure_args=(
'--protocol[Configure remote url to use https]:proto:(https)'
'(-j --jobs)'{-j,--jobs}'[Run up to N jobs in parallel (default: number of processing units)]:jobs:'
'(-h --help)'{-h,--help}'[Display usage]'
'*:git_dir:_files -/'
)
_pkgctl_repo_create_args=(
'(-c --clone)'{-c,--clone}'[Clone the Git repository after creation]'
'(-h --help)'{-h,--help}'[Display usage]'
'1:pkgbase'
)
_pkgctl_repo_web_args=(
'(-h --help)'{-h,--help}'[Display usage]'
'*:git_dir:_files -/'
)
_arch_nspawn_args=(
'-C[Location of a pacman config file]:pacman_config:_files -g "*.conf(.)"'
'-M[Location of a makepkg config file]:makepkg_config:_files -g "*.conf(.)"'
'-c[Set pacman cache]:pacman_cache:_files -/'
'-f[Copy file from the host to the chroot]:copy_file:_files'
'-s[Do not run setarch]'
'-h[Display usage]'
'1:chroot_dir:_files -/'
)
_archrelease_args=(
'-f[Force release without checks]'
"*:arch:($_tags[*])"
)
_commitpkg_args=(
'-f[Force release without checks]'
'-s[Target repo server]'
'-l[Set bandwidth limit]:limit'
"-a[Release to a specific architecture only]:arch:($_arch[*])"
'1:commit_msg'
)
_diffpkg_args=(
'(-l --list)'{-l,--list}'[Tar content list diff mode]'
'(-d --diffoscope)'{-d,--diffoscope}'[Diffoscope diff mode]'
'(-p --pkginfo)'{-p,--pkginfo}'[.PKGINFO diff mode]'
'(-b --buildinfo)'{-b,--buildinfo}'[.BUILDINFO diff mode]'
'(-m --makepkg-config)'{-m,--makepkg-config}'[Location of a makepkg config file]:makepkg_config:_files -g "*.conf(.)"'
'(-u -U --unified)'{-u,-U,--unified}'[Output 3 lines of unified context]'
'(-y --side-by-side)'{-y,--side-by-side}'[Output in two columns]'
'--color=[Color output]:when:($_colors[*])'
'(-W --width=)'{-W,--width=}'[Output at most NUM print columns]:num:(auto columns)'
'(-P --pool=)'{-P,--pool=}'[pool directory]:dir:_files -/'
'(-v --verbose)'{-v,--verbose}'[Provide more detailed/unfiltered output]'
'(-h --help)'{-h,--help}'[Display usage]'
'*:packages:_devtools_completions_all_packages'
)
_finddeps_args=(
'1:packages:_devtools_completions_all_packages'
)
_makechrootpkg_args=(
'-h[Display usage]'
'-c[Clean the chroot before building]'
'-d[Bind directory into build chroot as read-write]:bind_dir_rw:_files -/'
'-D[Bind directory into build chroot as read-only]:bind_dir_ro:_files -/'
'-u[Update the working copy of the chroot before building]'
'-r[The chroot dir to use]:chroot_dir:_files -/'
'-I[Install a package into the working copy]:target:_files -g "*.pkg.tar.*(.)"'
'-l[The directory to use as the working copy]:copy_dir:_files -/'
'-n[Run namcap on the package]'
'-T[Build in a temporary directory]'
'-U[Run makepkg as a specified user]:makepkg_user'
)
_mkarchroot_args=(
'-U[Install a package into the working copy]:target:_files -g "*.pkg.tar.*(.)"'
'-C[Location of a pacman config file]:pacman_config:_files -g "*.conf(.)"'
'-M[Location of a makepkg config file]:makepkg_config:_files -g "*.conf(.)"'
'-c[Set pacman cache]:pacman_cache:_files -/'
'-h[Display usage]'
'1:working_dir:_files -/'
'*:packages:_devtools_completions_all_packages'
)
_checkpkg_args=(
'(-r --rmdir)'{-r,--rmdir}'[Remove the temporary directory]'
'(-w --warn)'{-w,--warn}'[Print a warning in case of differences]'
'(-M --makepkg-config)'{-M,--makepkg-config}'[Location of a makepkg config file]:makepkg_config:_files -g "*.conf(.)"'
'(-h --help)'{-h,--help}'[Display usage]'
)
_sogrep_args=(
'(-v --verbose)'{-v,--verbose}'[Show matched links in addition to pkgname]'
'(-r --refresh)'{-r,--refresh}'[Refresh the links databases]'
'(-h --help)'{-h,--help}'[Display usage]'
'1:repo:(all $_repos[*])'
'2:libname'
)
_offload_build_args=(
'(-r --repo)'{-r,--repo}'[Build against a specific repository]:repo:($_build_repos[*])'
'(-a --arch)'{-a,--arch}'[Build against a specific architecture]:arch:(${_binary_arch[*]})'
'(-s --server)'{-s,--server}'[Offload to a specific Build server]:server:'
'(-h --help)'{-h,--help}'[Display usage]'
)
_makerepropkg_args=(
'-d[Run diffoscope if the package is unreproducible]'
'-c[Set pacman cache]:pacman_cache:_files -/'
'-M[Location of a makepkg config file]:makepkg_config:_files -g "*.conf(.)"'
'-h[Display usage]'
'*:working_dir:_files -g "*.pkg.tar.*(.)"'
)
_devtools_completions_all_packages() {
typeset -U packages
packages=($(_call_program packages pacman -Sql))
compadd - "${(@)packages}"
}
_pkgctl_cmds=(
"pkgctl command"
"auth[Authenticate with services like GitLab]"
"build[Build packages inside a clean chroot]"
"db[Pacman database modification for packge update, move etc]"
"diff[Compare package files using different modes]"
"release[Release step to commit, tag and upload build artifacts]"
"repo[Manage Git packaging repositories and their configuration]"
"version[Show pkgctl version information]"
)
_pkgctl_args=(
'(-V --version)'{-V,--version}'[Show pkgctl version information]'
'(-h --help)'{-h,--help}'[Display usage]'
)
_pkgctl_version_args=(
'(-h --help)'{-h,--help}'[Display usage]'
)
_pkgctl_diff_args=("${_diffpkg_args[@]}")
_handle_subcommands() {
local service_name=${1}
if typeset -p ${service_name}_cmds &> /dev/null; then
_arguments -C \
"1: :->cmds" \
'*::arg:->args'
case $state in
cmds)
if [[ "${line[-1]}" == -* ]] && typeset -p ${service_name}_args &> /dev/null; then
local argname="${service_name}_args[@]"
_arguments -s "${(P)argname}"
else
local service_cmds=${service_name}_cmds[@]
_values "${(P)service_cmds}"
fi
;;
args)
local service_sub=${service_name}_$line[1]
if typeset -p ${service_sub}_args &> /dev/null; then
local cmd_args=${service_sub}_args[@]
_arguments -s "${(P)cmd_args}"
elif typeset -p ${service_sub}_cmds &> /dev/null; then
_handle_subcommands "${service_sub}"
fi
;;
esac
elif typeset -p ${service_name}_args &> /dev/null; then
local argname="${service_name}_args[@]"
_arguments -s "${(P)argname}"
fi
}
_devtools() {
_handle_subcommands _${service//-/_}
}
_devtools

View File

@@ -0,0 +1,48 @@
#!/hint/bash
# shellcheck disable=2034
# This is an example PKGBUILD file, so that shellcheck can know what
# variables to expect be set after including a PKGBUILD.
# Maintainer: Your Name <youremail@domain.com>
pkgname=NAME
pkgver=VERSION
pkgrel=1
epoch=
pkgdesc=""
arch=()
url=""
license=('GPL')
groups=()
depends=()
makedepends=()
checkdepends=()
optdepends=()
provides=()
conflicts=()
replaces=()
backup=()
options=()
install=
changelog=
source=("$pkgname-$pkgver.tar.gz"
"$pkgname-$pkgver.patch")
noextract=()
md5sums=()
validpgpkeys=()
prepare() {
:
}
build() {
:
}
check() {
:
}
package() {
:
}

View File

@@ -1,81 +0,0 @@
#!/bin/bash
m4_include(lib/common.sh)
scriptname=${0##*/}
if [[ -z $1 ]]; then
echo 'Usage: '$scriptname' [pkgbase]'
exit 1
fi
pkgbase="${1}"
case $scriptname in
extra2community)
source_name='packages'
target_name='community'
source_repo='extra'
target_repo='community'
;;
community2extra)
source_name='community'
target_name='packages'
source_repo='community'
target_repo='extra'
;;
*)
die "Couldn't find configuration for %s" "$scriptname"
;;
esac
server='nymeria.archlinux.org'
source_svn="svn+ssh://svn-${source_name}@${server}/srv/repos/svn-${source_name}/svn"
target_svn="svn+ssh://svn-${target_name}@${server}/srv/repos/svn-${target_name}/svn"
source_dbscripts="/srv/repos/svn-${source_name}/dbscripts"
target_dbscripts="/srv/repos/svn-${target_name}/dbscripts"
setup_workdir
pushd $WORKDIR >/dev/null
msg "Downloading sources for ${pkgbase}"
svn -q checkout -N "${target_svn}" target_checkout
mkdir -p "target_checkout/${pkgbase}/repos"
svn -q export "${source_svn}/${pkgbase}/trunk" "target_checkout/${pkgbase}/trunk" || die
. "target_checkout/${pkgbase}/trunk/PKGBUILD"
msg "Downloading packages for ${pkgbase}"
for _arch in ${arch[@]}; do
if [[ "${_arch[*]}" == 'any' ]]; then
repo_arch='x86_64'
else
repo_arch=${_arch}
fi
for _pkgname in ${pkgname[@]}; do
fullver=$(get_full_version $_pkgname)
pkgpath="/srv/ftp/$source_repo/os/$repo_arch/$_pkgname-$fullver-${_arch}.pkg.tar.*"
ssh "$server" "cp $pkgpath staging/$target_repo" || die
done
done
msg "Adding ${pkgbase} to ${target_repo}"
svn -q add "target_checkout/${pkgbase}"
svn -q propset svn:keywords 'Id' "target_checkout/${pkgbase}/trunk/PKGBUILD"
svn -q commit -m"${scriptname}: Moving ${pkgbase} from ${source_repo} to ${target_repo}" target_checkout
pushd "target_checkout/${pkgbase}/trunk" >/dev/null
archrelease "${arch[@]/#/$target_repo-}" || die
popd >/dev/null
ssh "${server}" "${target_dbscripts}/db-update" || die
msg "Removing ${pkgbase} from ${source_repo}"
for _arch in ${arch[@]}; do
ssh "${server}" "${source_dbscripts}/db-remove ${source_repo} ${_arch} ${pkgbase}"
done
svn -q checkout -N "${source_svn}" source_checkout
svn -q up "source_checkout/${pkgbase}"
svn -q rm "source_checkout/${pkgbase}"
svn -q commit -m"${scriptname}: Moving ${pkgbase} from ${source_repo} to ${target_repo}" source_checkout
popd >/dev/null

37
doc/asciidoc.conf Normal file
View File

@@ -0,0 +1,37 @@
## linkman: macro
# Inspired by/borrowed from the GIT source tree at Documentation/asciidoc.conf
#
# Usage: linkman:command[manpage-section]
#
# Note, {0} is the manpage section, while {target} is the command.
#
# Show man link as: <command>(<section>); if section is defined, else just show
# the command.
[macros]
(?su)[\\]?(?P<name>linkman):(?P<target>\S*?)\[(?P<attrlist>.*?)\]=
[attributes]
asterisk=&#42;
plus=&#43;
caret=&#94;
startsb=&#91;
endsb=&#93;
backslash=&#92;
tilde=&#126;
apostrophe=&#39;
backtick=&#96;
litdd=&#45;&#45;
ifdef::backend-docbook[]
[linkman-inlinemacro]
{0%{target}}
{0#<citerefentry>}
{0#<refentrytitle>{target}</refentrytitle><manvolnum>{0}</manvolnum>}
{0#</citerefentry>}
endif::backend-docbook[]
ifdef::backend-xhtml11[]
[linkman-inlinemacro]
<a href="{target}.{0}.html">{target}{0?({0})}</a>
endif::backend-xhtml11[]

View File

@@ -0,0 +1,40 @@
arch-nspawn(1)
==============
Name
----
arch-nspawn - Run a command or OS in a light-weight namespace container
Synopsis
--------
arch-nspawn [options] working-dir [systemd-nspawn arguments]
Description
-----------
'arch-nspawn' is a wrapper around systemd-nspawn to run command or OS in a
namespace container such as a directory including base utilities of a OS.
It is used to build package(s) in given clean and defined environment.
Options
-------
*-C* <file>::
Location of a pacman config file
*-M* <file>::
Location of a makepkg config file
*-c* <dir>::
Set pacman cache, if no directory is specified the passed pacman.conf's cachedir is used with a fallback to '/etc/pacman.conf'
*-f* <file>::
Copy file from the host to the chroot
*-s*::
Do not run setarch
*-h*::
Show this usage message
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,48 @@
archbuild(1)
============
Name
----
archbuild - a script to build an Arch Linux package inside a clean chroot.
Synopsis
--------
archbuild [options] -- [makechrootpkg args]
Description
-----------
'archbuild' is a script to build an Arch Linux package. archbuild is part of devtools but should only be used via one of the included symlinks:
* extra-x86_64-build
* gnome-unstable-x86_64-build
* kde-unstable-x86_64-build
* multilib-build
* multilib-staging-build
* multilib-testing-build
* staging-x86_64-build
* testing-x86_64-build
The symlink used to run it will be inspected by archbuild, to determine which target you want it to use. It will load the available pacman configuration from 'reponame-arch.conf' with a fallback to 'reponame.conf' from {pkgdatadir}/pacman.conf.d. The makepkg configuration is loaded from 'repo-arch.conf' with a fallback to 'reponame.conf' from {pkgdatadir}/makepkg.conf.d.
It will also load the bind mount configuration from 'mount.d/arch' in {pkgdatadir}. The file format is that each line starting with ro and rw will be used, other lines will be ignored, and the rest of the used line is out/path:in/path preceded by a space as a separator. ro means it is a read-only mount, rw means a read-write mount.
Options
-------
*-h*::
Output command line options.
*-c*::
Recreate the chroot before building.
*-r* <dir>::
Create chroots in this directory.
See Also
--------
linkman:devtools[7]
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,43 @@
checkpkg(1)
===========
Name
----
checkpkg - Compare the current build package with the repository version
Synopsis
--------
checkpkg
Description
-----------
Searches for a locally built package corresponding to the PKGBUILD, and
downloads the last version of that package from the Pacman repositories. It
then compares the list of .so files provided by each version of the package and
outputs if there are soname differences for the new package. A directory is
also created using mktemp with files containing a file list for both packages
and a library list for both packages.
Options
-------
*-r, --rmdir*::
Remove the temporary directory created to contain the file and library list
of both packages.
*-w, --warn*::
Print a warning instead of a regular message in case of soname differences.
*-M, --makepkg-config*::
Set an alternate makepkg configuration file.
*-h, --help*::
Show a help text
See Also
--------
linkman:find-libprovides[1]
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,67 @@
devtools(7)
===========
Name
----
devtools - Developer tools for the Arch Linux distribution
Description
-----------
Devtools contains tools for package maintenance in Arch Linux. It comes with a
unified command-line frontend called 'pkgctl' that aids to conveniently
interact with all the different tools this collection provides.
The toolset varies from tools for building packages in a clean chroot
('mkarchroot', 'archbuild', ...), packaging related tools ('sogrep', 'diffpkg',
'lddd') and tools for repository management such as ('pkgrepo').
Programs
--------
The list below gives a short overview; see the respective documentation
for details.
linkman:pkgctl[1]
Unified command-line frontend for devtools
linkman:archbuild[1]
Build an Arch Linux package inside a clean chroot
linkman:arch-nspawn[1]
Run a command or OS in a light-weight namespace container
linkman:checkpkg[1]
Compare the current build package with the repository version
linkman:diffpkg[1]
Compare package files using different modes
linkman:export-pkgbuild-keys[1]
Export valid source signing keys from a PKGBUILD
linkman:find-libdeps[1]
Find soname dependencies for a package
linkman:find-libprovides[1]
Find soname's which are provided by a package
linkman:lddd[1]
Find broken library links on your system
linkman:mkarchroot[1]
Creates an arch chroot in a specified location with a specified set of
packages
linkman:makechrootpkg[1]
Build a PKGBUILD in a given chroot environment
linkman:makerepropkg[1]
Rebuild a package to see if it is reproducible
linkman:offload-build[1]
Build a PKGBUILD on a remote server using makechrootpkg
linkman:sogrep[1]
Find packages using a linked to a given shared library
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,73 @@
diffpkg(1)
==========
Name
----
diffpkg - Compare package files using different modes.
Synopsis
--------
diffpkg [OPTIONS] [MODES] [FILE|PKGNAME...]
Description
-----------
Searches for a locally built package corresponding to the PKGBUILD, and
downloads the last version of that package from the Pacman repositories.
It then compares the package archives using different modes while using
simple tar content list by default.
When given one package, use it to diff against the locally built one.
When given two packages, diff both packages against each other.
In either case, a package name will be converted to a filename from the
cache or pool, and diffpkg will proceed as though this filename was initially
specified.
Options
-------
*-M, --makepkg-config*::
Set an alternate makepkg configuration file
*-P, --pool*='DIR'::
Search diff target in pool dir (default `'/srv/ftp/pool'`)
*-v, --verbose*::
Provide more detailed/unfiltered output
*-h, --help*::
Show a help text
Output Options
--------------
*--color*[='WHEN']::
Color output; 'WHEN' is `'never'`, `'always'`, or `'auto'`; Plain *--color* means *--color='auto'*
*-u, -U, --unified*::
Output 3 lines of unified context
*-y, --side-by-side*::
Output in two columns
*-W, --width*[='NUM']::
Output at most 'NUM' (default `'auto'`) print columns; 'NUM' can be `'auto'`, `'columns'` or a number.
`'auto'` will be resolved to the maximum line length of both files, guaranteeing the diff to be uncut.
Modes
-----
*-l, --list*::
Activate tar content list diff mode (default)
*-d, --diffoscope*::
Activate diffoscope diff mode
*-p, --pkginfo*::
Activate .PKGINFO diff mode
*-b, --buildinfo*::
Activate .BUILDINFO diff mode
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,25 @@
export-pkgbuild-keys(1)
=======================
Name
----
export-pkgbuild-keys - Export valid source signing keys from a PKGBUILD
Synopsis
--------
export-pkgbuild-keys
Description
-----------
Export the PGP keys from a PKGBUILDs validpgpkeys array into the keys/pgp/
subdirectory. Useful for distributing packager validated source signing
keys alongside PKGBUILDs.
Options
-------
*-h, --help*::
Show a help text.
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,24 @@
find-libdeps(1)
===============
Name
----
find-libdeps - Find soname dependencies for a package
Synopsis
--------
find-libdeps [options]
Description
-----------
Finds soname dependencies of a package and prints out a list in the following
format '<soname>=<soversion>-<soarch>'.
Options
-------
*--ignore-internal*::
Ignore internal libraries.
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,24 @@
find-libprovides(1)
===================
Name
----
find-libprovides - Find soname's which are provided by a package
Synopsis
--------
find-libprovides [options]
Description
-----------
Finds soname's provided by a package and prints out a list in the following
format '<soname>=<soversion>-<soarch>'.
Options
-------
*--ignore-internal*::
Ignore internal libraries.
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,7 @@
Homepage
--------
'https://gitlab.archlinux.org/archlinux/devtools'
Please report bugs and feature requests in the issue tracker. Please do your best to provide a reproducible test case for bugs.

25
doc/man/lddd.1.asciidoc Normal file
View File

@@ -0,0 +1,25 @@
lddd(1)
=======
Name
----
lddd - Find broken library links on your system
Synopsis
--------
lddd
Description
-----------
Scans '$PATH', '/lib', '/usr/lib', '/usr/local/lib' and
'/etc/ld.so.conf.d/*.conf' directories for ELF files with references to missing
shared libraries, and suggests which packages might need to be rebuilt. The
collected data is written to a temporary directory created by mktemp.
See Also
--------
linkman:ldd[1]
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,76 @@
makechrootpkg(1)
================
Name
----
makechrootpkg - Build a PKGBUILD in a given chroot environment
Synopsis
--------
makechrootpkg [OPTIONS] -r <chrootdir> [--] [makepkg args]
Description
-----------
Run this script in a directory containing a PKGBUILD to build a package
inside a clean chroot. Arguments passed to this script after the
end-of-options marker (--) will be passed to makepkg.
The chroot dir consists of the following directories:
<chrootdir>/{root, copy} but only "root" is required
by default. The working copy will be created as needed
The chroot "root" directory must be created via the following
command:
mkarchroot <chrootdir>/root base-devel
This script reads {SRC,SRCPKG,PKG,LOG}DEST, MAKEFLAGS and PACKAGER
from makepkg.conf(5), if those variables are not part of the
environment.
Default makepkg args: --syncdeps --noconfirm --log --holdver --skipinteg
Options
-------
*-h*::
Show this usage message
*-c*::
Clean the chroot before building
*-d* <dir>::
Bind directory into build chroot as read-write
*-D* <dir>::
Bind directory into build chroot as read-only
*-u*::
Update the working copy of the chroot before building
This is useful for rebuilds without dirtying the pristine
chroot
*-r* <dir>::
The chroot dir to use
*-I* <pkg>::
Install a package into the working copy of the chroot
*-l* <copy>::
The directory to use as the working copy of the chroot
Useful for maintaining multiple copies
Default: $USER
*-n*::
Run namcap on the build package
*-C*::
Run checkpkg on the build package
*-T*::
Build in a temporary directory
*-U*::
Run makepkg as a specified user
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,59 @@
makerepropkg(1)
===============
Name
----
makerepropkg - Rebuild a package to see if it is reproducible
Synopsis
--------
makerepropkg [OPTIONS] [<package_file|pkgname>...]
Description
-----------
Given the path to a built pacman package(s), attempt to rebuild it using the
PKGBUILD in the current directory. The package will be built in an environment
as closely matching the environment of the initial package as possible, by
building up a chroot to match the information exposed in the package's
linkman:BUILDINFO[5] manifest. On success, the resulting package will be
compared to the input package, and makerepropkg will report whether the
artifacts are identical.
When given multiple packages, additional package files are assumed to be split
packages and will be treated as additional artifacts to compare during the
verification step.
A valid target(s) for pacman -S can be specified instead, and makerepropkg will
download it to the cache if needed. This is mostly useful to specify which
repository to retrieve from. If no positional arguments are specified, the
targets will be sourced from the PKGBUILD.
In either case, the package name will be converted to a filename from the
cache, and makerepropkg will proceed as though this filename was initially
specified.
This implements a verifier for pacman/libalpm packages in accordance with the
link:https://reproducible-builds.org/[Reproducible Builds] project.
Options
-------
*-d*::
If packages are not reproducible, compare them using diffoscope.
*-c*::
Set the pacman cache directory.
*-M* <file>::
Location of a makepkg config file.
*-l* <chroot>::
The directory name to use as the chroot namespace
Useful for maintaining multiple copies
Default: $USER
*-h*::
Show this usage message
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,49 @@
mkarchroot(1)
=============
Name
----
mkarchroot - Creates an arch chroot in a specified location with a specified set of packages
Synopsis
--------
mkarchroot [options] [location] [packages]
Description
-----------
'mkarchroot' is a script to create an Arch Linux chroot at a specified location
with specified packages. Typically used by 'makechrootpkg' to create build
chroots. Apart from installing specified packages the chroot is created with an
en_US.UTF-8 and de_DE.UTF-8 locale and a generated machine-id.
Options
-------
*-U*::
Use 'pacman -U' to install packages.
*-C* <file>::
Location of a pacman config file.
*-M* <file>::
Location of a makepkg config file.
*-c* <dir>::
Set pacman cache.
*-f* <file>::
Copy file from the host to the chroot.
*-s*::
Do not run setarch.
*-h*::
Output command line options.
See Also
--------
linkman:pacman[1]
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,52 @@
offload-build(1)
================
Name
----
offload-build - Build a PKGBUILD on a remote server using makechrootpkg
Synopsis
--------
offload-build [OPTIONS] -- [ARCHBUILD_OPTIONS]
Description
-----------
Build a PKGBUILD on a remote server using makechrootpkg. Requires a remote user
that can run archbuild in a non-interactive manner, e.g. must be able to
elevate permissions using passwordless sudo.
Options
-------
*-r, --repo* <reponame>::
Build against a specific repository. The default is `extra`, to build packages using
the stable repositories via extra-x86_64-build.
*-a, --arch* <architecture>::
Build against a specific architecture. The default is `x86_64`, the only
architecture officially supported by Arch Linux.
*-s, --server* <hostname>::
Offload to a specific build server. The default is build.archlinux.org
which is used as part of the build toolchain for the official Arch Linux
repos.
*-h, --help*::
Show a help text.
Passing options to archbuild
----------------------------
Options after a delimiting -- are passed on to archbuild on the remote.
archbuild in turn supports passing arguments on to makechrootpkg, which in turn
supports passing options to makepkg. Since each uses -- to delimit options that
are forwarded, make sure to escape them properly:
`offload-build offload-args -- archbuild-args -- makechrootpkg-args -- makepkg-args`
Example: To use a second `testing-x86_64-build` instance with another copydir:
`offload-build -r testing -- -- -l <chroot_copy>`
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,40 @@
pkgctl-auth-login(1)
====================
Name
----
pkgctl-auth-login - Authenticate with the GitLab instance
Synopsis
--------
pkgctl auth login [OPTIONS]
Description
-----------
Interactively authenticate with the GitLab instance.
The minimum required scopes for the token are: 'api', 'write_repository'.
The GitLab API token can either be stored in a plaintext file in
'$XDG_CONFIG_HOME/devtools/gitlab.conf', or supplied via the
'DEVTOOLS_GITLAB_TOKEN' environment variable using any command (gpg, vault,
password manager) by declaring a shell alias:
$ alias pkgctl='DEVTOOLS_GITLAB_TOKEN="$(command to obtain token)" pkgctl'
Options
-------
*-g, --gen-access-token*::
Open the URL to generate a new personal access token
*-h, --help*::
Show a help text
See Also
--------
linkman:pkgctl-auth-status[1]
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,32 @@
pkgctl-auth-status(1)
=====================
Name
----
pkgctl-auth-status - View authentication status
Synopsis
--------
pkgctl auth status [OPTIONS]
Description
-----------
Verifies and displays information about your authentication state of
services like the GitLab instance and reports issues if any.
Options
-------
*-t, --show-token*::
Display the auth token
*-h, --help*::
Show a help text
See Also
--------
linkman:pkgctl-auth-login[1]
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,38 @@
pkgctl-auth(1)
==============
Name
----
pkgctl-auth - Authenticate with serivces like GitLab.
Synopsis
--------
pkgctl auth [OPTIONS] [SUBCOMMAND]
Description
-----------
Manage the authorization for the GitLab instance and show its current status.
Options
-------
*-h, --help*::
Show a help text
Subcommands
-----------
pkgctl auth login::
Authenticate with the GitLab instance
pkgctl auth status::
View authentication status
See Also
--------
linkman:pkgctl-auth-login[1]
linkman:pkgctl-auth-status[1]
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,91 @@
pkgctl-build(1)
===============
Name
----
pkgctl-build - Build packages inside a clean chroot
Synopsis
--------
pkgctl build [OPTIONS] [PATH...]
Description
-----------
TODO
Build Options
-------------
*--arch* 'ARCH'::
Specify architectures to build for (disables auto-detection)
*--repo* 'REPO'::
Specify a target repository (disables auto-detection)
*-s, --staging*::
Build against the staging counterpart of the auto-detected repo
*-t, --testing*::
Build against the testing counterpart of the auto-detected repo
*-o, --offload*::
Build on a remote server and transfer artifacts afterwards
*-c, --clean*::
Recreate the chroot before building
*-I, --install* 'FILE'::
Install a package into the working copy of the chroot
*-w, --worker* 'SLOT'::
Name of the worker slot, useful for concurrent builds. By default the slot
is automatically assigned to the current tty pts number. In case the caller
is not a tty, choose a random slot between 1 and number of available
processing units.
*--nocheck*::
Do not run the check() function in the PKGBUILD
PKGBUILD Options
----------------
*--pkgver*='PKGVER'::
Set pkgver, reset pkgrel and update checksums
*--pkgrel*='PKGREL'::
Set pkgrel to a given value
*--rebuild*::
Increment the current pkgrel variable
*-e, --edit*::
Edit the PKGBUILD before building
Release Options
---------------
*-r, --release*::
Automatically commit, tag and release after building +
Specifying this option is required when using any of the following options
in this section
*-m, --message* 'MSG'::
Use the given <msg> as the commit message
*-u, --db-update*::
Automatically update the pacman database as last action
Options
-------
*-h, --help*::
Show a help text
See Also
--------
linkman:pkgctl-release[1]
linkman:pkgctl-db-update[1]
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,24 @@
pkgctl-db-move(1)
=================
Name
----
pkgctl-db-update - Update the binary repository as final release step
Synopsis
--------
pkgctl db update [OPTIONS]
Description
-----------
Update the pacman database as final release step for packages that
have been transfered and staged on 'repos.archlinux.org'.
Options
-------
*-h, --help*::
Show a help text
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,26 @@
pkgctl-db-remove(1)
===================
Name
----
pkgctl-db-remove - Remove packages from binary repositories
Synopsis
--------
pkgctl db remove [OPTIONS] [REPO] [PKGBASE]...
Description
-----------
Remove packages from pacman repositories.
Options
-------
*-a, --arch* 'ARCH'::
Override the architecture (disables auto-detection)
*-h, --help*::
Show a help text
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,23 @@
pkgctl-db-move(1)
=================
Name
----
pkgctl-db-move - Move packages between binary repositories
Synopsis
--------
pkgctl db move [OPTIONS] [SOURCE_REPO] [TARGET_REPO] [PKGBASE]...
Description
-----------
Move packages between pacman repositories.
Options
-------
*-h, --help*::
Show a help text
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,73 @@
pkgctl-diff(1)
==============
Name
----
pkgctl-diff - Compare package files using different modes.
Synopsis
--------
pkgctl diff [OPTIONS] [MODES] [FILE|PKGNAME...]
Description
-----------
Searches for a locally built package corresponding to the PKGBUILD, and
downloads the last version of that package from the Pacman repositories.
It then compares the package archives using different modes while using
simple tar content list by default.
When given one package, use it to diff against the locally built one.
When given two packages, diff both packages against each other.
In either case, a package name will be converted to a filename from the cache
or pool, and 'pkgctl diff' will proceed as though this filename was initially
specified.
Options
-------
*-M, --makepkg-config*::
Set an alternate makepkg configuration file
*-P, --pool*='DIR'::
Search diff target in pool dir (default `'/srv/ftp/pool'`)
*-v, --verbose*::
Provide more detailed/unfiltered output
*-h, --help*::
Show a help text
Output Options
--------------
*--color*[='WHEN']::
Color output; 'WHEN' is `'never'`, `'always'`, or `'auto'`; Plain *--color* means *--color='auto'*
*-u, -U, --unified*::
Output 3 lines of unified context
*-y, --side-by-side*::
Output in two columns
*-W, --width*[='NUM']::
Output at most 'NUM' (default `'auto'`) print columns; 'NUM' can be `'auto'`, `'columns'` or a number.
`'auto'` will be resolved to the maximum line length of both files, guaranteeing the diff to be uncut.
Modes
-----
*-l, --list*::
Activate tar content list diff mode (default)
*-d, --diffoscope*::
Activate diffoscope diff mode
*-p, --pkginfo*::
Activate .PKGINFO diff mode
*-b, --buildinfo*::
Activate .BUILDINFO diff mode
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,49 @@
pkgctl-release(1)
=================
Name
----
pkgctl-release - Release step to commit, tag and upload build artifacts
Synopsis
--------
pkgctl release [OPTIONS] [PATH...]
Description
-----------
Modified version controlled files will first be staged for commit,
afterwards a Git tag matching the pkgver will be created and finally
all build artifacts will be uploaded.
By default the target pacman repository will be auto-detected by querying
the repo it is currently released in. When initially adding a new package
to the repositories, the target repo must be specified manually.
Options
-------
*-m, --message* 'MSG'::
Use the given <msg> as the commit message
*-r, --repo* 'REPO'::
Specify a target repository (disables auto-detection)
*-s, --staging*::
Build against the staging counterpart of the auto-detected repo
*-t, --testing*::
Build against the testing counterpart of the auto-detected repo
*-u, --db-update*::
Automatically update the pacman database after uploading
*-h, --help*::
Show a help text
See Also
--------
linkman:pkgctl-db-update[1]
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,52 @@
pkgctl-repo-clone(1)
====================
Name
----
pkgctl-repo-clone - Clone a package repository
Synopsis
--------
pkgctl repo clone [OPTIONS] [PKGNAME...]
Description
-----------
Clone Git packaging repositories from the canonical namespace.
The configure command is subsequently invoked to synchronize the distro
specs and makepkg.conf settings. The unprivileged option can be used
for cloning packaging repositories without SSH access using read-only
HTTPS.
Options
-------
*-m, --maintainer* 'NAME'::
Clone all packages of the named maintainer
*--protocol* 'https'::
Clone the repository over https
*--universe*::
Clone all existing packages, useful for cache warming
*--switch* 'VERSION'::
Switch to a specified version. The working tree and the index are updated to
match the version.
*-j, --jobs* 'N'::
Run up to N jobs in parallel. By default the number of jobs is equal to the
number of available processing units. For sequential processing this option
needs to be passed with 1.
*-h, --help*::
Show a help text
See Also
--------
linkman:pkgctl-repo-configure[1]
linkman:pkgctl-repo-switch[1]
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,39 @@
pkgctl-repo-configure(1)
========================
Name
----
pkgctl-repo-configure - Configure a clone according to distro specs
Synopsis
--------
pkgctl repo configure [OPTIONS] [PATH...]
Description
-----------
Configure Git packaging repositories according to distro specs and
'makepkg.conf' settings.
Git author information and the used signing key is set up from
'makepkg.conf' read from any valid location like '/etc' or 'XDG_CONFIG_HOME'.
The remote protocol is automatically determined from the author email
address by choosing SSH for all official packager identities and
read-only HTTPS otherwise.
Options
-------
*--protocol* 'https'::
Configure remote url to use https
*-j, --jobs* 'N'::
Run up to N jobs in parallel. By default the number of jobs is equal to the
number of available processing units. For sequential processing this option
needs to be passed with 1.
*-h, --help*::
Show a help text
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,40 @@
pkgctl-repo-create(1)
=====================
Name
----
pkgctl-repo-create - Create a new GitLab package repository
Synopsis
--------
pkgctl repo create [OPTIONS] [PKGBASE...]
Description
-----------
Create a new Git packaging repository in the canonical GitLab namespace.
This command requires a valid GitLab API authentication. To setup a new
GitLab token or check the currently configured one please consult the
'auth' subcommand for further instructions.
If invoked without a parameter, try to create a packaging repository
based on the 'PKGBUILD' from the current working directory.
Options
-------
*-c, --clone*::
Clone the Git repository after creation
*-h, --help*::
Show a help text
See Also
--------
linkman:pkgctl-auth[1]
linkman:pkgctl-repo-clone[1]
linkman:pkgctl-repo-configure[1]
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,36 @@
pkgctl-repo-switch(1)
=====================
Name
----
pkgctl-repo-switch - Switch a package repository to a specified version
Synopsis
--------
pkgctl repo switch [OPTIONS] [VERSION] [PKGBASE]...
Description
-----------
Switch a package source repository to a specified version, tag or branch.
The working tree and the index are updated to match the specified ref.
If a version identifier is specified in the pacman version format, that
identifier is automatically translated to the Git tag name accordingly.
The current working directory is used if no PKGBASE is specified.
Options
-------
*--discard-changes*::
Proceed even if the index or the working tree differs from HEAD. Both the
index and working tree are restored to match the switching target.
*-f, --force*::
An alias for '--discard-changes'.
*-h, --help*::
Show a help text
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,24 @@
pkgctl-repo-web(1)
==================
Name
----
pkgctl-repo-web - Open the packaging repository's website
Synopsis
--------
pkgctl repo web [OPTIONS] [PKGBASE...]
Description
-----------
Open the packaging repository's website via xdg-open. If called with
no arguments, open the package cloned in the current working directory.
Options
-------
*-h, --help*::
Show a help text
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,59 @@
pkgctl-repo(1)
==============
Name
----
pkgctl-repo - Manage Git packaging repositories and their configuration
Synopsis
--------
pkgctl repo [OPTIONS] [SUBCOMMAND]
Description
-----------
Manage Git packaging repositories and helps with their configuration
according to distro specs.
Git author information and the used signing key is set up from
'makepkg.conf' read from any valid location like '/etc' or 'XDG_CONFIG_HOME'.
The configure command can be used to synchronize the distro specs and
makepkg.conf settings for previously cloned repositories.
The unprivileged option can be used for cloning packaging repositories
without SSH access using read-only HTTPS.
Options
-------
*-h, --help*::
Show a help text
Subcommands
-----------
pkgctl repo clone::
Clone a package repository
pkgctl repo configure::
Configure a clone according to distro specs
pkgctl repo create::
Create a new GitLab package repository
pkgctl repo switch::
Switch a package repository to a specified version
pkgctl repo web::
Open the packaging repository's website
See Also
--------
linkman:pkgctl-repo-clone[1]
linkman:pkgctl-repo-configure[1]
linkman:pkgctl-repo-create[1]
linkman:pkgctl-repo-switch[1]
linkman:pkgctl-repo-web[1]
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,23 @@
pkgctl-version(1)
=================
Name
----
pkgctl-version - Show pkgctl version information
Synopsis
--------
pkgctl version [OPTIONS]
Description
-----------
Shows the current version information of pkgctl.
Options
-------
*-h, --help*::
Show a help text
include::include/footer.asciidoc[]

61
doc/man/pkgctl.1.asciidoc Normal file
View File

@@ -0,0 +1,61 @@
pkgctl(1)
=========
Name
----
pkgctl - Unified command-line frontend for devtools
Synopsis
--------
pkgctl [SUBCOMMAND] [OPTIONS]
Description
-----------
TODO
Options
-------
*-V, --version*::
Show pkgctl version information
*-h, --help*::
Show a help text
Subcommands
-----------
pkgctl auth::
Authenticate with services like GitLab
pkgctl build::
Build packages inside a clean chroot
pkgctl db::
Pacman database modification for packge update, move etc
pkgctl diff::
Compare package files using different modes
pkgctl release::
Release step to commit, tag and upload build artifacts
pkgctl repo::
Manage Git packaging repositories and their configuration
pkgctl version::
Show pkgctl version information
See Also
--------
linkman:pkgctl-auth[1]
linkman:pkgctl-build[1]
linkman:pkgctl-db[1]
linkman:pkgctl-diff[1]
linkman:pkgctl-release[1]
linkman:pkgctl-repo[1]
linkman:pkgctl-version[1]
include::include/footer.asciidoc[]

48
doc/man/sogrep.1.asciidoc Normal file
View File

@@ -0,0 +1,48 @@
sogrep(1)
=========
Name
----
sogrep - Find shared library links in an Arch Linux repository
Synopsis
--------
sogrep [options] repo libname
Description
-----------
Check the soname links database for Arch Linux repositories containing packages
linked to a given shared library. If the repository specified is "all", then
all repositories will be searched, otherwise only the named repository will be
searched.
If the links database does not exist, it will be downloaded first.
Options
-------
*-v, --verbose*::
Provide detailed output containing the matched links for each package, the
repository it came from (in the event that all repositories are being
searched), and, in combination with `-r`, a progress bar for the links
database download.
*-r, --refresh*::
Refresh the links databases
*-h, --help*::
Show a help text
Environment Variables
---------------------
**SOLINKS_MIRROR**="https://mirror.foo.com"
Alternative mirror to use for downloading soname links database.
**SOCACHE_DIR**="/path/to/directory"::
Directory where soname links database is stored, overrides the default
directory set by the **XDG_CACHE_HOME** environment variable or the
**HOME** environment variable if **XDG_CACHE_HOME** is not set.
include::include/footer.asciidoc[]

View File

@@ -1,243 +0,0 @@
# Avoid any encoding problems
export LANG=C
shopt -s extglob
# 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() {
[[ -n $WORKDIR ]] && rm -rf "$WORKDIR"
exit ${1:-0}
}
abort() {
error 'Aborting...'
cleanup 255
}
trap_abort() {
trap - EXIT INT QUIT TERM HUP
abort
}
trap_exit() {
local r=$?
trap - EXIT INT QUIT TERM HUP
cleanup $r
}
die() {
(( $# )) && error "$@"
cleanup 255
}
trap 'trap_abort' INT QUIT TERM HUP
trap 'trap_exit' 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 )); 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
}
##
# usage : lock( $fd, $file, $message )
##
lock() {
eval "exec $1>"'"$2"'
if ! flock -n $1; then
stat_busy "$3"
flock $1
stat_done
fi
}
##
# usage : slock( $fd, $file, $message )
##
slock() {
eval "exec $1>"'"$2"'
if ! flock -sn $1; then
stat_busy "$3"
flock -s $1
stat_done
fi
}
##
# usage: pkgver_equal( $pkgver1, $pkgver2 )
##
pkgver_equal() {
local left right
if [[ $1 = *-* && $2 = *-* ]]; then
# if both versions have a pkgrel, then they must be an exact match
[[ $1 = "$2" ]]
else
# otherwise, trim any pkgrel and compare the bare version.
[[ ${1%%-*} = "${2%%-*}" ]]
fi
}
##
# usage: find_cached_package( $pkgname, $pkgver, $arch )
#
# $pkgver can be supplied with or without a pkgrel appended.
# If not supplied, any pkgrel will be matched.
##
find_cached_package() {
local searchdirs=("$PWD" "$PKGDEST") results=()
local targetname=$1 targetver=$2 targetarch=$3
local dir pkg pkgbasename pkgparts name ver rel arch size r results
for dir in "${searchdirs[@]}"; do
[[ -d $dir ]] || continue
for pkg in "$dir"/*.pkg.tar?(.?z); do
[[ -f $pkg ]] || continue
# avoid adding duplicates of the same inode
for r in "${results[@]}"; do
[[ $r -ef $pkg ]] && continue 2
done
# split apart package filename into parts
pkgbasename=${pkg##*/}
pkgbasename=${pkgbasename%.pkg.tar?(.?z)}
arch=${pkgbasename##*-}
pkgbasename=${pkgbasename%-"$arch"}
rel=${pkgbasename##*-}
pkgbasename=${pkgbasename%-"$rel"}
ver=${pkgbasename##*-}
name=${pkgbasename%-"$ver"}
if [[ $targetname = "$name" && $targetarch = "$arch" ]] &&
pkgver_equal "$targetver" "$ver-$rel"; then
results+=("$pkg")
fi
done
done
case ${#results[*]} in
0)
return 1
;;
1)
printf '%s\n' "$results"
return 0
;;
*)
error 'Multiple packages found:'
printf '\t%s\n' "${results[@]}" >&2
return 1
esac
}
##
# usage : check_root ("$0" "$@")
##
check_root() {
(( EUID == 0 )) && return
if type -P sudo >/dev/null; then
exec sudo -- "$@"
else
exec su root -c "$(printf ' %q' "$@")"
fi
}

View File

@@ -1,20 +0,0 @@
_arch=(
i686
x86_64
any
)
_tags=(
core-i686 core-x86_64 core-any
extra-i686 extra-x86_64 extra-any
multilib-x86_64
staging-i686 staging-x86_64 staging-any
testing-i686 testing-x86_64 testing-any
multilib-testing-x86_64
multilib-staging-x86_64
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
)

View File

@@ -1,412 +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.
m4_include(lib/common.sh)
shopt -s nullglob
makepkg_args=(-s --noconfirm -L --holdver)
repack=false
update_first=false
clean_first=false
install_pkg=
run_namcap=false
temp_chroot=false
chrootdir=
passeddir=
declare -a install_pkgs
declare -i ret=0
bindmounts_ro=()
bindmounts_rw=()
copy=$USER
[[ -n $SUDO_USER ]] && copy=$SUDO_USER
[[ -z "$copy" || $copy = root ]] && copy=copy
src_owner=${SUDO_USER:-$USER}
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. Arguments passed to this script after the'
echo ' end-of-options marker (--) 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-devel'
echo ''
echo "Default makepkg args: ${makepkg_args[*]}"
echo ''
echo 'Flags:'
echo '-h This help'
echo '-c Clean the chroot before building'
echo '-d <dir> Bind directory into build chroot as read-write'
echo '-D <dir> Bind directory into build chroot as read-only'
echo '-u Update the working copy of the chroot before building'
echo ' This is useful for rebuilds without dirtying the pristine'
echo ' chroot'
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: $copy"
echo '-n Run namcap on the package'
echo '-T Build in a temporary directory'
exit 1
}
# {{{ functions
load_vars() {
local makepkg_conf="$1" var
[[ -f $makepkg_conf ]] || return 1
for var in {SRC,SRCPKG,PKG,LOG}DEST MAKEFLAGS PACKAGER; do
[[ -z ${!var} ]] && eval $(grep "^${var}=" "$makepkg_conf")
done
return 0
}
create_chroot() {
# Lock the chroot we want to use. We'll keep this lock until we exit.
lock 9 "$copydir.lock" "Locking chroot copy [$copy]"
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
slock 8 "$chrootdir/root.lock" "Locking clean chroot"
stat_busy "Creating clean working copy [$copy]"
if [[ "$chroottype" == btrfs ]] && ! mountpoint -q "$copydir"; then
if [[ -d $copydir ]]; then
btrfs subvolume delete "$copydir" >/dev/null ||
die "Unable to delete subvolume %s" "$copydir"
fi
btrfs subvolume snapshot "$chrootdir/root" "$copydir" >/dev/null ||
die "Unable to create subvolume %s" "$copydir"
else
mkdir -p "$copydir"
rsync -a --delete -q -W -x "$chrootdir/root/" "$copydir"
fi
stat_done
# Drop the read lock again
exec 8>&-
fi
# Update mtime
touch "$copydir"
}
clean_temporary() {
stat_busy "Removing temporary copy [$copy]"
if [[ "$chroottype" == btrfs ]] && ! mountpoint -q "$copydir"; then
btrfs subvolume delete "$copydir" >/dev/null ||
die "Unable to delete subvolume %s" "$copydir"
else
# avoid change of filesystem in case of an umount failure
rm --recursive --force --one-file-system "$copydir" ||
die "Unable to delete %s" "$copydir"
fi
# remove lock file
rm -f "$copydir.lock"
stat_done
}
install_packages() {
local pkgname
for install_pkg in "${install_pkgs[@]}"; do
pkgname="${install_pkg##*/}"
cp "$install_pkg" "$copydir/$pkgname"
arch-nspawn "$copydir" \
"${bindmounts_ro[@]}" "${bindmounts_rw[@]}" \
pacman -U /$pkgname --noconfirm
(( ret += !! $? ))
rm "$copydir/$pkgname"
done
# If there is no PKGBUILD we are done
[[ -f PKGBUILD ]] || exit $ret
}
prepare_chroot() {
$repack || rm -rf "$copydir/build"
mkdir -p "$copydir/build"
if ! grep -q 'BUILDDIR="/build"' "$copydir/etc/makepkg.conf"; then
echo 'BUILDDIR="/build"' >> "$copydir/etc/makepkg.conf"
fi
# Read .makepkg.conf and gnupg pubring
if [[ -r $USER_HOME/.gnupg/pubring.kbx ]]; then
install -D "$USER_HOME/.gnupg/pubring.kbx" "$copydir/build/.gnupg/pubring.kbx"
fi
if [[ -r $USER_HOME/.gnupg/pubring.gpg ]]; then
install -D "$USER_HOME/.gnupg/pubring.gpg" "$copydir/build/.gnupg/pubring.gpg"
fi
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/srcpkgdest"
if ! grep -q 'SRCPKGDEST="/srcpkgdest"' "$copydir/etc/makepkg.conf"; then
echo 'SRCPKGDEST="/srcpkgdest"' >> "$copydir/etc/makepkg.conf"
fi
mkdir -p "$copydir/logdest"
if ! grep -q 'LOGDEST="/logdest"' "$copydir/etc/makepkg.conf"; then
echo 'LOGDEST="/logdest"' >> "$copydir/etc/makepkg.conf"
fi
# These two get bind-mounted read-only
# XXX: makepkg dislikes having these dirs read-only, so separate them
mkdir -p "$copydir/startdir" "$copydir/startdir_host"
mkdir -p "$copydir/srcdest" "$copydir/srcdest_host"
if ! grep -q 'SRCDEST="/srcdest"' "$copydir/etc/makepkg.conf"; then
echo 'SRCDEST="/srcdest"' >> "$copydir/etc/makepkg.conf"
fi
builduser_uid=${SUDO_UID:-$UID}
# We can't use useradd without chrooting, otherwise it invokes PAM modules
# which we might not be able to load (i.e. when building i686 packages on
# an x86_64 host).
printf 'builduser:x:%d:100:builduser:/:/usr/bin/nologin\n' "$builduser_uid" >>"$copydir/etc/passwd"
chown -R "$builduser_uid" "$copydir"/{build,pkgdest,srcpkgdest,logdest,srcdest,startdir}
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
if [[ ! -f $copydir/etc/sudoers.d/builduser-pacman ]]; then
cat > "$copydir/etc/sudoers.d/builduser-pacman" <<EOF
Defaults env_keep += "HOME"
builduser ALL = NOPASSWD: /usr/bin/pacman
EOF
chmod 440 "$copydir/etc/sudoers.d/builduser-pacman"
fi
# This is a little gross, but this way the script is recreated every time in the
# working copy
{
printf '#!/bin/bash\n'
declare -f _chrootbuild
printf '_chrootbuild'
printf ' %q' "${makepkg_args[@]}"
printf ' || exit\n'
if $run_namcap; then
cat <<'EOF'
pacman -S --needed --noconfirm namcap
for pkgfile in /startdir/PKGBUILD /pkgdest/*; do
echo "Checking ${pkgfile##*/}"
sudo -u builduser namcap "$pkgfile" 2>&1 | tee "/logdest/${pkgfile##*/}-namcap.log"
done
EOF
fi
} >"$copydir/chrootbuild"
chmod +x "$copydir/chrootbuild"
}
download_sources() {
local builddir="$(mktemp -d)"
chmod 1777 "$builddir"
# Ensure sources are downloaded
if [[ -n $SUDO_USER ]]; then
sudo -u $SUDO_USER env SRCDEST="$SRCDEST" BUILDDIR="$builddir" \
makepkg --config="$copydir/etc/makepkg.conf" --verifysource -o
else
( export SRCDEST BUILDDIR="$builddir"
makepkg --asroot --config="$copydir/etc/makepkg.conf" --verifysource -o
)
fi
(( $? != 0 )) && die "Could not download sources."
# Clean up garbage from verifysource
rm -rf $builddir
}
_chrootbuild() {
# This function isn't run in makechrootpkg,
# so no global variables
. /etc/profile
export HOME=/build
shopt -s nullglob
# XXX: Workaround makepkg disliking read-only dirs
ln -sft /srcdest /srcdest_host/*
ln -sft /startdir /startdir_host/*
# XXX: Keep bzr and svn sources writable
# Since makepkg 4.1.1 they get checked out via cp -a, copying the symlink
for dir in /srcdest /startdir; do
for vcs in bzr svn; do
cd "$dir"
for vcsdir in */.$vcs; do
rm "${vcsdir%/.$vcs}"
cp -a "${dir}_host/${vcsdir%/.$vcs}" .
chown -R builduser "${vcsdir%/.$vcs}"
done
done
done
cd /startdir
# XXX: Keep PKGBUILD writable for pkgver()
rm PKGBUILD*
cp /startdir_host/PKGBUILD* .
chown builduser PKGBUILD*
# Safety check
if [[ ! -w PKGBUILD ]]; then
echo "Can't write to PKGBUILD!"
exit 1
fi
sudo -u builduser makepkg "$@"
}
move_products() {
for pkgfile in "$copydir"/pkgdest/*; do
chown "$src_owner" "$pkgfile"
mv "$pkgfile" "$PKGDEST"
done
for l in "$copydir"/logdest/*; do
[[ $l == */logpipe.* ]] && continue
chown "$src_owner" "$l"
mv "$l" "$LOGDEST"
done
for s in "$copydir"/srcpkgdest/*; do
chown "$src_owner" "$s"
mv "$s" "$SRCPKGDEST"
done
}
# }}}
orig_argv=("$@")
while getopts 'hcur:I:l:nTD:d:' arg; do
case "$arg" in
c) clean_first=true ;;
D) bindmounts_ro+=(--bind-ro="$OPTARG") ;;
d) bindmounts_rw+=(--bind="$OPTARG") ;;
u) update_first=true ;;
r) passeddir="$OPTARG" ;;
I) install_pkgs+=("$OPTARG") ;;
l) copy="$OPTARG" ;;
n) run_namcap=true; makepkg_args+=(-i) ;;
T) temp_chroot=true; copy+="-$$" ;;
h|*) usage ;;
esac
done
[[ ! -f PKGBUILD && -z "${install_pkgs[*]}" ]] && die 'This must be run in a directory containing a PKGBUILD.'
check_root "$0" "${orig_argv[@]}"
# Canonicalize chrootdir, getting rid of trailing /
chrootdir=$(readlink -e "$passeddir")
[[ ! -d $chrootdir ]] && die "No chroot dir defined, or invalid path '%s'" "$passeddir"
[[ ! -d $chrootdir/root ]] && die "Missing chroot dir root directory. Try using: mkarchroot %s/root base-devel" "$chrootdir"
# Detect chrootdir filesystem type
chroottype=$(stat -f -c %T "$chrootdir")
if [[ ${copy:0:1} = / ]]; then
copydir=$copy
else
copydir="$chrootdir/$copy"
fi
# Pass all arguments after -- right to makepkg
makepkg_args+=("${@:$OPTIND}")
# See if -R was passed to makepkg
for arg in "${@:OPTIND}"; do
case ${arg%%=*} in
-*R*|--repackage)
repack=true
break 2
;;
esac
done
if [[ -n $SUDO_USER ]]; then
eval "USER_HOME=~$SUDO_USER"
else
USER_HOME=$HOME
fi
umask 0022
load_vars "$USER_HOME/.makepkg.conf"
load_vars /etc/makepkg.conf
# Use PKGBUILD directory if these don't exist
[[ -d $PKGDEST ]] || PKGDEST=$PWD
[[ -d $SRCDEST ]] || SRCDEST=$PWD
[[ -d $SRCPKGDEST ]] || SRCPKGDEST=$PWD
[[ -d $LOGDEST ]] || LOGDEST=$PWD
create_chroot
$update_first && arch-nspawn "$copydir" \
"${bindmounts_ro[@]}" "${bindmounts_rw[@]}" \
pacman -Syu --noconfirm
[[ -n ${install_pkgs[*]} ]] && install_packages
download_sources
prepare_chroot
if arch-nspawn "$copydir" \
--bind-ro="$PWD:/startdir_host" \
--bind-ro="$SRCDEST:/srcdest_host" \
"${bindmounts_ro[@]}" "${bindmounts_rw[@]}" \
/chrootbuild
then
move_products
else
(( ret += 1 ))
fi
$temp_chroot && clean_temporary
if (( ret != 0 )); then
if $temp_chroot; then
die "Build failed"
else
die "Build failed, check %s/build" "$copydir"
fi
else
true
fi

View File

@@ -1,82 +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.
m4_include(lib/common.sh)
CHROOT_VERSION='v3'
working_dir=''
usage() {
echo "Usage: ${0##*/} [options] working-dir package-list..."
echo ' options:'
echo ' -C <file> Location of a pacman config file'
echo ' -M <file> Location of a makepkg config file'
echo ' -c <dir> Set pacman cache'
echo ' -h This message'
exit 1
}
orig_argv=("$@")
while getopts 'hC:M:c:' arg; do
case "$arg" in
C) pac_conf="$OPTARG" ;;
M) makepkg_conf="$OPTARG" ;;
c) cache_dir="$OPTARG" ;;
h|?) usage ;;
*) error "invalid argument '$arg'"; usage ;;
esac
done
shift $(($OPTIND - 1))
(( $# < 2 )) && die 'You must specify a directory and one or more packages.'
check_root "$0" "${orig_argv[@]}"
working_dir="$(readlink -f $1)"
shift 1
[[ -z $working_dir ]] && die 'Please specify a working directory.'
if [[ -z $cache_dir ]]; then
cache_dirs=($(pacman -v $cache_conf 2>&1 | grep '^Cache Dirs:' | sed 's/Cache Dirs:\s*//g'))
else
cache_dirs=(${cache_dir})
fi
umask 0022
[[ -e $working_dir ]] && die "Working directory '%s' already exists" "$working_dir"
mkdir -p "$working_dir"
lock 9 "${working_dir}.lock" "Locking chroot"
if [[ $(stat -f -c %T "$working_dir") == btrfs ]]; then
rmdir "$working_dir"
if ! btrfs subvolume create "$working_dir"; then
die "Couldn't create subvolume for '%s'" "$working_dir"
fi
chmod 0755 "$working_dir"
fi
pacstrap -GMcd ${pac_conf:+-C "$pac_conf"} "$working_dir" \
"${cache_dirs[@]/#/--cachedir=}" "$@" || die 'Failed to install all packages'
printf '%s.UTF-8 UTF-8\n' en_US de_DE > "$working_dir/etc/locale.gen"
echo 'LANG=C' > "$working_dir/etc/locale.conf"
echo "$CHROOT_VERSION" > "$working_dir/.arch-chroot"
exec arch-nspawn \
${pac_conf:+-C "$pac_conf"} \
${makepkg_conf:+-M "$makepkg_conf"} \
${cache_dir:+-c "$cache_dir"} \
"$working_dir" locale-gen

View File

@@ -1,97 +0,0 @@
#!/bin/bash
# This script rebuilds a list of packages in order
# and reports anything that fails
#
# Due to sudo usage, it is recommended to allow makechrootpkg
# to be run with NOPASSWD in your sudoers file
#
# FIXME
# Currently uses $(pwd)/rebuilds as the directory for rebuilding...
# TODO make this work for community too
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
source '/etc/makepkg.conf'
else
die '/etc/makepkg.conf not found!'
fi
bump_pkgrel() {
# Get the current pkgrel from SVN and update the working copy with it
# This prevents us from incrementing out of control :)
pbuild='.svn/text-base/PKGBUILD.svn-base'
oldrel=$(grep 'pkgrel=' $pbuild | cut -d= -f2)
#remove decimals
rel=$(echo $oldrel | cut -d. -f1)
newrel=$(($rel + 1))
sed -i "s/pkgrel=$oldrel/pkgrel=$newrel/" PKGBUILD
}
pkg_from_pkgbuild() {
# we want the sourcing to be done in a subshell so we don't pollute our current namespace
export CARCH PKGEXT
(source PKGBUILD; echo "$pkgname-$pkgver-$pkgrel-$CARCH$PKGEXT")
}
chrootdir="$1"; shift
pkgs="$@"
SVNPATH='svn+ssh://nymeria.archlinux.org/srv/repos/svn-packages/svn'
msg "Work will be done in $(pwd)/rebuilds"
REBUILD_ROOT="$(pwd)/rebuilds"
mkdir -p "$REBUILD_ROOT"
cd "$REBUILD_ROOT"
/usr/bin/svn co -N $SVNPATH
FAILED=""
for pkg in $pkgs; do
cd "$REBUILD_ROOT/svn-packages"
msg2 "Building '$pkg'"
/usr/bin/svn update "$pkg"
if [[ ! -d "$pkg/trunk" ]]; then
FAILED="$FAILED $pkg"
warning "$pkg does not exist in SVN"
continue
fi
cd "$pkg/trunk/"
bump_pkgrel
if ! sudo makechrootpkg -u -d -r "$chrootdir" -- --noconfirm; then
FAILED="$FAILED $pkg"
error "$pkg Failed!"
else
pkgfile=$(pkg_from_pkgbuild)
if [[ -e $pkgfile ]]; then
msg2 "$pkg Complete"
else
FAILED="$FAILED $pkg"
error "$pkg Failed, no package built!"
fi
fi
done
cd "$REBUILD_ROOT"
if [[ -n $FAILED ]]; then
msg 'Packages failed:'
for pkg in $FAILED; do
msg2 "$pkg"
done
fi
msg 'SVN pkgbumps in svn-packages/ - commit when ready'

134
src/arch-nspawn.in Normal file
View File

@@ -0,0 +1,134 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/common.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
# shellcheck source=src/lib/archroot.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/archroot.sh
# umask might have been changed in /etc/profile
# ensure that sane default is set again
umask 0022
working_dir=''
files=()
mount_args=()
usage() {
echo "Usage: ${0##*/} [options] working-dir [systemd-nspawn arguments]"
echo "A wrapper around systemd-nspawn. Provides support for pacman."
echo
echo ' options:'
echo ' -C <file> Location of a pacman config file'
echo ' -M <file> Location of a makepkg config file'
echo ' -c <dir> Set pacman cache'
echo ' -f <file> Copy file from the host to the chroot'
echo ' -s Do not run setarch'
echo ' -h This message'
exit 1
}
while getopts 'hC:M:c:f:s' arg; do
case "$arg" in
C) pac_conf="$OPTARG" ;;
M) makepkg_conf="$OPTARG" ;;
c) cache_dirs+=("$OPTARG") ;;
f) files+=("$OPTARG") ;;
s) nosetarch=1 ;;
h|?) usage ;;
*) error "invalid argument '%s'" "$arg"; usage ;;
esac
done
shift $((OPTIND - 1))
(( $# < 1 )) && die 'You must specify a directory.'
check_root "" "${BASH_SOURCE[0]}" "$@"
working_dir=$(readlink -f "$1")
shift 1
[[ -z $working_dir ]] && die 'Please specify a working directory.'
if (( ${#cache_dirs[@]} == 0 )); then
mapfile -t cache_dirs < <(pacman-conf --config "${pac_conf:-$working_dir/etc/pacman.conf}" CacheDir)
fi
# shellcheck disable=2016
host_mirrors=($(pacman-conf --repo extra Server 2> /dev/null | sed -r 's#(.*/)extra/os/.*#\1$repo/os/$arch#'))
for host_mirror in "${host_mirrors[@]}"; do
if [[ $host_mirror == *file://* ]]; then
host_mirror=$(echo "$host_mirror" | sed -r 's#file://(/.*)/\$repo/os/\$arch#\1#g')
for m in "$host_mirror"/pool/*/; do
in_array "$m" "${cache_dirs[@]}" || cache_dirs+=("$m")
done
fi
done
while read -r line; do
mapfile -t lines < <(pacman-conf --config "${pac_conf:-$working_dir/etc/pacman.conf}" \
--repo $line Server | sed -r 's#(.*/)[^/]+/os/.+#\1#')
for line in "${lines[@]}"; do
if [[ $line = file://* ]]; then
line=${line#file://}
in_array "$line" "${cache_dirs[@]}" || cache_dirs+=("$line")
fi
done
done < <(pacman-conf --config "${pac_conf:-$working_dir/etc/pacman.conf}" --repo-list)
mount_args+=("--bind=${cache_dirs[0]//:/\\:}")
for cache_dir in "${cache_dirs[@]:1}"; do
mount_args+=("--bind-ro=${cache_dir//:/\\:}")
done
# {{{ functions
copy_hostconf () {
unshare --fork --pid gpg --homedir "$working_dir"/etc/pacman.d/gnupg/ --no-permission-warning --quiet --batch --import --import-options import-local-sigs "$(pacman-conf GpgDir)"/pubring.gpg >/dev/null 2>&1
pacman-key --gpgdir "$working_dir"/etc/pacman.d/gnupg/ --import-trustdb "$(pacman-conf GpgDir)" >/dev/null 2>&1
printf 'Server = %s\n' "${host_mirrors[@]}" >"$working_dir/etc/pacman.d/mirrorlist"
[[ -n $pac_conf ]] && cp "$pac_conf" "$working_dir/etc/pacman.conf"
[[ -n $makepkg_conf ]] && cp "$makepkg_conf" "$working_dir/etc/makepkg.conf"
local file
for file in "${files[@]}"; do
mkdir -p "$(dirname "$working_dir$file")"
cp -T "$file" "$working_dir$file"
done
sed -r "s|^#?\\s*CacheDir.+|CacheDir = ${cache_dirs[*]}|g" -i "$working_dir/etc/pacman.conf"
}
# }}}
umask 0022
# Sanity check
if [[ ! -f "$working_dir/.arch-chroot" ]]; then
die "'%s' does not appear to be an Arch chroot." "$working_dir"
elif [[ $(cat "$working_dir/.arch-chroot") != "$CHROOT_VERSION" ]]; then
die "chroot '%s' is not at version %s. Please rebuild." "$working_dir" "$CHROOT_VERSION"
fi
copy_hostconf
eval "$(grep -a '^CARCH=' "$working_dir/etc/makepkg.conf")"
[[ -z $nosetarch ]] || unset CARCH
if [[ -f "@pkgdatadir@/setarch-aliases.d/${CARCH}" ]]; then
read -r set_arch < "@pkgdatadir@/setarch-aliases.d/${CARCH}"
else
set_arch="${CARCH}"
fi
exec ${CARCH:+setarch "$set_arch"} systemd-nspawn -q \
-D "$working_dir" \
-E "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin" \
--register=no --keep-unit --as-pid2 \
"${mount_args[@]}" \
"$@"

118
src/archbuild.in Normal file
View File

@@ -0,0 +1,118 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/common.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
# shellcheck source=src/lib/archroot.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/archroot.sh
base_packages=(base-devel)
makechrootpkg_args=(-c -n -C)
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
if [[ -f "@pkgdatadir@/setarch-aliases.d/${arch}" ]]; then
read -r set_arch < "@pkgdatadir@/setarch-aliases.d/${arch}"
else
set_arch="${arch}"
fi
# Architecture-specific Mount
arch_mounts=()
if [[ -f "@pkgdatadir@/mount.d/${arch}" ]]; then
mapfile -t arch_mounts < "@pkgdatadir@/mount.d/${arch}"
fi
for arch_mount in "${arch_mounts[@]}"; do
if [[ $arch_mount = rw* ]]; then
arch_mount=${arch_mount#rw }
in_array "$arch_mount" "${makechrootpkg_args[@]}" || makechrootpkg_args+=("-d" "$arch_mount")
elif [[ $arch_mount = ro* ]]; then
arch_mount=${arch_mount#ro }
in_array "$arch_mount" "${makechrootpkg_args[@]}" || makechrootpkg_args+=("-D" "$arch_mount")
fi
done
chroots='/var/lib/archbuild'
clean_first=false
pacman_config="@pkgdatadir@/pacman.conf.d/${repo}.conf"
if [[ -f @pkgdatadir@/pacman.conf.d/${repo}-${arch}.conf ]]; then
pacman_config="@pkgdatadir@/pacman.conf.d/${repo}-${arch}.conf"
fi
makepkg_config="@pkgdatadir@/makepkg.conf.d/${arch}.conf"
if [[ -f @pkgdatadir@/makepkg.conf.d/${repo}-${arch}.conf ]]; then
makepkg_config="@pkgdatadir@/makepkg.conf.d/${repo}-${arch}.conf"
fi
usage() {
echo "Usage: $cmd [options] -- [makechrootpkg args]"
echo ' -h This help'
echo ' -c Recreate the chroot before building'
echo ' -r <dir> Create chroots in this directory'
echo ''
echo "Default makechrootpkg args: ${makechrootpkg_args[*]}"
echo ''
exit 1
}
while getopts 'hcr:' arg; do
case "${arg}" in
c) clean_first=true ;;
r) chroots="$OPTARG" ;;
*) usage ;;
esac
done
check_root SOURCE_DATE_EPOCH,SRCDEST,SRCPKGDEST,PKGDEST,LOGDEST,MAKEFLAGS,PACKAGER,GNUPGHOME "${BASH_SOURCE[0]}" "$@"
# Pass all arguments after -- right to makepkg
makechrootpkg_args+=("${@:$OPTIND}")
if ${clean_first} || [[ ! -d "${chroots}/${repo}-${arch}" ]]; then
msg "Creating chroot for [%s] (%s)..." "${repo}" "${arch}"
for copy in "${chroots}/${repo}-${arch}"/*; do
[[ -d $copy ]] || continue
msg2 "Deleting chroot copy '%s'..." "$(basename "${copy}")"
lock 9 "$copy.lock" "Locking chroot copy '%s'" "$copy"
subvolume_delete_recursive "${copy}"
rm -rf --one-file-system "${copy}"
done
lock_close 9
rm -rf --one-file-system "${chroots}/${repo}-${arch}"
(umask 0022; mkdir -p "${chroots}/${repo}-${arch}")
setarch "${set_arch}" mkarchroot \
-C "${pacman_config}" \
-M "${makepkg_config}" \
"${chroots}/${repo}-${arch}/root" \
"${base_packages[@]}" || abort
else
lock 9 "${chroots}/${repo}-${arch}/root.lock" "Locking clean chroot"
arch-nspawn \
-C "${pacman_config}" \
-M "${makepkg_config}" \
"${chroots}/${repo}-${arch}/root" \
pacman -Syuu --noconfirm || abort
fi
# Always build official packages reproducibly
if [[ ! -v SOURCE_DATE_EPOCH ]]; then
export SOURCE_DATE_EPOCH=$(date +%s)
fi
msg "Building in chroot for [%s] (%s)..." "${repo}" "${arch}"
exec makechrootpkg -r "${chroots}/${repo}-${arch}" "${makechrootpkg_args[@]}"

94
src/archrelease.in Normal file
View File

@@ -0,0 +1,94 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/common.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
# shellcheck source=src/lib/valid-tags.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-tags.sh
set -e
# Deprecation warning
if [[ -z $_DEVTOOLS_COMMAND ]]; then
warning "${0##*/} is deprecated and will be removed. Use 'pkgctl release' instead"
fi
# parse command line options
FORCE=
while getopts ':f' flag; do
case $flag in
f) FORCE=1 ;;
:) die "Option requires an argument -- '%s'" "$OPTARG" ;;
\?) die "Invalid option -- '%s'" "$OPTARG" ;;
esac
done
shift $(( OPTIND - 1 ))
if ! (( $# )); then
echo 'Usage: archrelease [-f] <repo>...'
exit 1
fi
# validate repo is really repo-arch
if [[ -z $FORCE ]]; then
for tag in "$@"; do
if ! in_array "$tag" "${_tags[@]}"; then
die "archrelease: Invalid tag: '%s' (use -f to force release)" "$tag"
fi
done
fi
if [[ ! -f PKGBUILD ]]; then
die 'archrelease: PKGBUILD not found'
fi
# shellcheck source=contrib/makepkg/PKGBUILD.proto
. ./PKGBUILD
pkgbase=${pkgbase:-$pkgname}
pkgver=$(get_full_version "$pkgbase")
gittag=$(get_tag_from_pkgver "$pkgver")
# Check if releasing from a branch
if ! branchname=$(git symbolic-ref --short HEAD); then
die 'not on any branch'
fi
if [[ "${branchname}" != main ]]; then
die 'must be run from the main branch'
fi
# Check if remote origin is setup properly
if ! giturl=$(git remote get-url origin) || [[ ${giturl} != *${GIT_PACKAGING_URL_SSH}* ]]; then
die "remote origin is not configured, run 'pkgctl repo configure'"
fi
if ! git ls-remote origin >/dev/null; then
die "configured remote origin may not exist, run 'pkgctl repo create ${pkgbase}' to create it"
fi
msg 'Fetching remote changes'
git fetch --prune --prune-tags origin || die 'failed to fetch remote changes'
# Check if local branch is up to date and contains the latest origin commit
if remoteref=$(git rev-parse "origin/${branchname}" 2>/dev/null); then
if [[ $(git branch "${branchname}" --contains "${remoteref}" --format '%(refname:short)') != "${branchname}" ]]; then
die "local branch is out of date, run 'git pull --rebase'"
fi
fi
# If the tag exists we check if it's properly signed and that it
# matches the working directory PKGBUILD.
if git tag --verify "$gittag" &> /dev/null; then
cwd_checksum=$(sha256sum PKGBUILD|cut -d' ' -f1)
tag_checksum=$(git show "${gittag}:PKGBUILD" | sha256sum |cut -d' ' -f1)
if [[ "$cwd_checksum" != "$tag_checksum" ]]; then
die "tagged PKGBUILD is not the same as the working dir PKGBUILD"
fi
git push --tags --set-upstream origin main || abort
exit 0
fi
msg "Releasing package"
git tag --sign --message="Package release ${pkgver}" "$gittag" || abort
git push --tags --set-upstream origin main || abort

156
src/checkpkg.in Normal file
View File

@@ -0,0 +1,156 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/common.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
usage() {
cat <<- _EOF_
Usage: ${BASH_SOURCE[0]##*/} [OPTIONS]
Searches for a locally built package corresponding to the PKGBUILD, and
downloads the last version of that package from the Pacman repositories.
It then compares the list of .so files provided by each version of the
package and outputs if there are soname differences for the new package.
A directory is also created using mktemp with files containing a file
list for both packages and a library list for both packages.
OPTIONS
-r, --rmdir Remove the temporary directory
-w, --warn Print a warning in case of differences
-M, --makepkg-config Set an alternate makepkg configuration file
-h, --help Show this help text
_EOF_
}
RMDIR=0
WARN=0
MAKEPKG_CONF=/etc/makepkg.conf
# option checking
while (( $# )); do
case $1 in
-h|--help)
usage
exit 0
;;
-r|--rmdir)
RMDIR=1
shift
;;
-w|--warn)
WARN=1
shift
;;
-M|--makepkg-config)
MAKEPKG_CONF="$2"
shift 2
;;
--)
shift
break
;;
-*|--*)
die "invalid argument: %s" "$1"
;;
*)
break
;;
esac
done
# Source makepkg.conf; fail if it is not found
if [[ -r "${MAKEPKG_CONF}" ]]; then
# shellcheck source=config/makepkg/x86_64.conf
source "${MAKEPKG_CONF}"
else
die "${MAKEPKG_CONF} not found!"
fi
# Source user-specific makepkg.conf overrides
if [[ -r "${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf" ]]; then
# shellcheck source=/dev/null
source "${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf"
elif [[ -r "$HOME/.makepkg.conf" ]]; then
# shellcheck source=/dev/null
source "$HOME/.makepkg.conf"
fi
if [[ ! -f PKGBUILD ]]; then
die 'This must be run in the directory of a built package.'
fi
# shellcheck source=contrib/makepkg/PKGBUILD.proto
. ./PKGBUILD
if [[ ${arch[0]} == 'any' ]]; then
CARCH='any'
fi
STARTDIR=$(pwd)
(( RMDIR )) && trap 'rm -rf $TEMPDIR' EXIT INT TERM QUIT
TEMPDIR=$(mktemp -d --tmpdir checkpkg-script.XXXX)
for _pkgname in "${pkgname[@]}"; do
comparepkg=$_pkgname
pkgurl=
target_pkgver=$(get_full_version "$_pkgname")
if ! pkgfile=$(find_cached_package "$_pkgname" "$target_pkgver" "$CARCH"); then
die 'tarball not found for package: %s' "${_pkgname}-$target_pkgver"
fi
ln -s "$pkgfile" "$TEMPDIR"
if (( $# )); then
case $1 in
*://*)
pkgurl=$1 ;;
/*|*/*)
pkgurl=$(readlink -m "$1") ;;
*.pkg.tar*)
pkgurl=$1 ;;
'')
;;
*)
comparepkg=$1 ;;
esac
shift
fi
[[ -n $pkgurl ]] || pkgurl=$(pacman -Spdd --print-format '%l' --noconfirm "$comparepkg") ||
die "Couldn't download previous package for %s." "$comparepkg"
oldpkg=${pkgurl##*/}
if [[ ${oldpkg} = "${pkgfile##*/}" ]]; then
die "The built package (%s) is the one in the repo right now!" "$_pkgname"
fi
if [[ $pkgurl = file://* || ( $pkgurl = /* && -f $pkgurl ) ]]; then
ln -s "${pkgurl#file://}" "$TEMPDIR/$oldpkg"
elif [[ -f "$PKGDEST/$oldpkg" ]]; then
ln -s "$PKGDEST/$oldpkg" "$TEMPDIR/$oldpkg"
elif [[ -f "$STARTDIR/$oldpkg" ]]; then
ln -s "$STARTDIR/$oldpkg" "$TEMPDIR/$oldpkg"
else
curl -fsLC - --retry 3 --retry-delay 3 -o "$TEMPDIR/$oldpkg" "$pkgurl"
fi
bsdtar tf "$TEMPDIR/$oldpkg" | sort > "$TEMPDIR/filelist-$_pkgname-old"
bsdtar tf "$pkgfile" | sort > "$TEMPDIR/filelist-$_pkgname"
sdiff -s "$TEMPDIR/filelist-$_pkgname-old" "$TEMPDIR/filelist-$_pkgname"
find-libprovides "$TEMPDIR/$oldpkg" 2>/dev/null | sort > "$TEMPDIR/libraries-$_pkgname-old"
find-libprovides "$pkgfile" 2>/dev/null | sort > "$TEMPDIR/libraries-$_pkgname"
if ! diff_output="$(sdiff -s "$TEMPDIR/libraries-$_pkgname-old" "$TEMPDIR/libraries-$_pkgname")"; then
message="Sonames differ in $_pkgname!"
(( WARN )) && warning "$message" || msg "$message"
echo "$diff_output"
else
msg "No soname differences for %s." "$_pkgname"
fi
done
(( RMDIR )) || msg "Files saved to %s" "$TEMPDIR"

289
src/commitpkg.in Normal file
View File

@@ -0,0 +1,289 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/common.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
source /usr/share/makepkg/util/util.sh
check_pkgbuild_validity() {
# shellcheck source=contrib/makepkg/PKGBUILD.proto
. ./PKGBUILD
# skip when there are no sources available
if (( ! ${#source[@]} )); then
return
fi
# validate sources hash algo is at least > sha1
local bad_algos=("cksums" "md5sums" "sha1sums")
local good_hash_algo=false
# from makepkg libmakepkg/util/schema.sh
for integ in "${known_hash_algos[@]}"; do
local sumname="${integ}sums"
if [[ -n ${!sumname} ]] && ! in_array "${sumname}" "${bad_algos[@]}"; then
good_hash_algo=true
break
fi
done
if ! $good_hash_algo; then
die "PKGBUILD lacks a secure cryptographic checksum, insecure algorithms: ${bad_algos[*]}"
fi
}
# Source makepkg.conf; fail if it is not found
if [[ -r '/etc/makepkg.conf' ]]; then
# shellcheck source=config/makepkg/x86_64.conf
source '/etc/makepkg.conf'
else
die '/etc/makepkg.conf not found!'
fi
# Source user-specific makepkg.conf overrides
if [[ -r "${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf" ]]; then
# shellcheck source=/dev/null
source "${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf"
elif [[ -r "$HOME/.makepkg.conf" ]]; then
# shellcheck source=/dev/null
source "$HOME/.makepkg.conf"
fi
cmd=${0##*/}
# Deprecation warning
if [[ -z $_DEVTOOLS_COMMAND ]]; then
warning "${cmd} is deprecated and will be removed. Use 'pkgctl release' instead"
fi
if [[ ! -f PKGBUILD ]]; then
die 'No PKGBUILD file'
fi
if ! repo_spec=$(git config --local devtools.version) || [[ ${repo_spec} != "${GIT_REPO_SPEC_VERSION}" ]]; then
error "repository specs are out of date, try:"
msg2 'pkgctl repo configure'
exit 1
fi
if [[ "$(git symbolic-ref --short HEAD)" != main ]]; then
die 'must be run from the main branch'
fi
source=()
# shellcheck source=contrib/makepkg/PKGBUILD.proto
. ./PKGBUILD
pkgbase=${pkgbase:-$pkgname}
case "$cmd" in
commitpkg)
if (( $# == 0 )); then
die 'Usage: commitpkg <reponame> [-f] [-s server] [-l limit] [-a arch] [commit message]'
fi
repo="$1"
shift
;;
*pkg)
repo="${cmd%pkg}"
;;
*)
die 'Usage: commitpkg <reponame> [-f] [-s server] [-l limit] [-a arch] [commit message]'
;;
esac
if (( ${#validpgpkeys[@]} != 0 )); then
if [[ -d keys ]]; then
for key in "${validpgpkeys[@]}"; do
if [[ ! -f keys/pgp/$key.asc ]]; then
export-pkgbuild-keys || die 'Failed to export valid PGP keys for source files'
fi
done
else
export-pkgbuild-keys || die 'Failed to export valid PGP keys for source files'
fi
git add --force -- keys/pgp/*
fi
# find files which should be under source control
needsversioning=()
for s in "${source[@]}"; do
[[ $s != *://* ]] && needsversioning+=("$s")
done
for i in 'changelog' 'install'; do
while read -r file; do
# evaluate any bash variables used
eval "file=\"$(sed "s/^\(['\"]\)\(.*\)\1\$/\2/" <<< "$file")\""
needsversioning+=("$file")
done < <(sed -n "s/^[[:space:]]*$i=//p" PKGBUILD)
done
for key in "${validpgpkeys[@]}"; do
needsversioning+=("keys/pgp/$key.asc")
done
# assert that they really are controlled by git
if (( ${#needsversioning[*]} )); then
for file in "${needsversioning[@]}"; do
if ! git ls-files --error-unmatch "$file"; then
die "%s is not under version control" "$file"
fi
done
fi
server=${PACKAGING_REPO_RELEASE_HOST}
rsyncopts=(-e ssh -p '--chmod=ug=rw,o=r' -c -h -L --progress --partial -y)
archreleaseopts=()
while getopts ':l:a:s:f' flag; do
case $flag in
f) archreleaseopts+=('-f') ;;
s) server=$OPTARG ;;
l) rsyncopts+=("--bwlimit=$OPTARG") ;;
a) commit_arch=$OPTARG ;;
:) die "Option requires an argument -- '%s'" "$OPTARG" ;;
\?) die "Invalid option -- '%s'" "$OPTARG" ;;
esac
done
shift $(( OPTIND - 1 ))
# check packages for validity
for _arch in "${arch[@]}"; do
if [[ -n $commit_arch && ${_arch} != "$commit_arch" ]]; then
continue
fi
for _pkgname in "${pkgname[@]}"; do
fullver=$(get_full_version "$_pkgname")
if pkgfile=$(find_cached_package "$_pkgname" "$fullver" "$_arch"); then
check_package_validity "$pkgfile"
fi
done
fullver=$(get_full_version "$pkgbase")
if pkgfile=$(find_cached_package "$pkgbase-debug" "$fullver" "$_arch"); then
check_package_validity "$pkgfile"
fi
done
# check for PKGBUILD standards
check_pkgbuild_validity
# auto generate .SRCINFO if present
if [[ -f .SRCINFO ]]; then
stat_busy 'Generating .SRCINFO'
makepkg --printsrcinfo > .SRCINFO
git add .SRCINFO
stat_done
fi
if [[ -n $(git status --porcelain --untracked-files=no) ]]; then
stat_busy 'Staging files'
for f in $(git ls-files --modified); do
git add "$f"
done
for f in $(git ls-files --deleted); do
git rm "$f"
done
stat_done
msgtemplate="upgpkg: $(get_full_version)"
if [[ -n $1 ]]; then
stat_busy 'Committing changes'
git commit -q -m "${msgtemplate}: ${1}" || die
stat_done
else
[[ -z ${WORKDIR:-} ]] && setup_workdir
msgfile=$(mktemp --tmpdir="${WORKDIR}" commitpkg.XXXXXXXXXX)
echo "$msgtemplate" > "$msgfile"
if [[ -n $GIT_EDITOR ]]; then
$GIT_EDITOR "$msgfile" || die
elif [[ -n $VISUAL ]]; then
$VISUAL "$msgfile" || die
elif [[ -n $EDITOR ]]; then
$EDITOR "$msgfile" || die
elif giteditor=$(git config --get core.editor); then
$giteditor "$msgfile" || die
else
die "No usable editor found (tried \$GIT_EDITOR, \$VISUAL, \$EDITOR, git config [core.editor])."
fi
[[ -s $msgfile ]] || die
stat_busy 'Committing changes'
git commit -v -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")
if ! pkgfile=$(find_cached_package "$_pkgname" "$fullver" "${_arch}"); then
warning "Skipping %s: failed to locate package file" "$_pkgname-$fullver-$_arch"
skip_arches+=("$_arch")
continue 2
fi
uploads+=("$pkgfile")
done
fullver=$(get_full_version "$pkgbase")
if ! pkgfile=$(find_cached_package "$pkgbase-debug" "$fullver" "$_arch"); then
continue
fi
if ! is_debug_package "$pkgfile"; then
continue
fi
uploads+=("$pkgfile")
done
for pkgfile in "${uploads[@]}"; do
sigfile="${pkgfile}.sig"
if [[ ! -f $sigfile ]]; then
msg "Signing package %s..." "${pkgfile}"
if [[ -n $GPGKEY ]]; then
SIGNWITHKEY=(-u "${GPGKEY}")
fi
gpg --detach-sign --use-agent --no-armor "${SIGNWITHKEY[@]}" "${pkgfile}" || die
fi
if ! gpg --verify "$sigfile" "$pkgfile" >/dev/null 2>&1; then
die "Signature %s is incorrect!" "$sigfile"
fi
uploads+=("$sigfile")
done
for _arch in "${arch[@]}"; do
if ! in_array "$_arch" "${skip_arches[@]}"; then
commit_arches+=("$_arch")
fi
done
if [[ ${#commit_arches[*]} -gt 0 ]]; then
archrelease "${archreleaseopts[@]}" "${commit_arches[@]/#/$repo-}" || die
fi
if [[ ${#uploads[*]} -gt 0 ]]; then
new_uploads=()
# convert to absolute paths so rsync can work with colons (epoch)
while read -r -d '' upload; do
new_uploads+=("$upload")
done < <(realpath -z "${uploads[@]}")
uploads=("${new_uploads[@]}")
unset new_uploads
msg 'Uploading all package and signature files'
rsync "${rsyncopts[@]}" "${uploads[@]}" "$server:staging/$repo/" || die
fi

340
src/diffpkg.in Normal file
View File

@@ -0,0 +1,340 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/common.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
usage() {
local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [MODES] [FILE|PKGNAME...]
Searches for a locally built package corresponding to the PKGBUILD, and
downloads the last version of that package from the Pacman repositories.
It then compares the package archives using different modes while using
simple tar content list by default.
When given one package, use it to diff against the locally built one.
When given two packages, diff both packages against each other.
In either case, a package name will be converted to a filename from the
cache, and '${COMMAND}' will proceed as though this filename was
initially specified.
OPTIONS
-M, --makepkg-config Set an alternate makepkg configuration file
-P, --pool=DIR Search diff target in pool dir (default '/srv/ftp/pool')
-v, --verbose Provide more detailed/unfiltered output
-h, --help Show this help text
OUTPUT OPTIONS
--color[=WHEN] Color output; WHEN is 'never', 'always', or 'auto';
Plain --color means --color='auto'
-u, -U, --unified Output 3 lines of unified context
-y, --side-by-side Output in two columns
-W, --width=NUM Output at most NUM (default 'auto') print columns
NUM can be 'auto', 'columns' or a number
MODES
-l, --list Activate content list diff mode (default)
-d, --diffoscope Activate diffoscope diff mode
-p, --pkginfo Activate .PKGINFO diff mode
-b, --buildinfo Activate .BUILDINFO diff mode
_EOF_
}
MAKEPKG_CONF=/etc/makepkg.conf
POOLDIR=/srv/ftp/pool
VERBOSE=0
TARLIST=0
DIFFOSCOPE=0
PKGINFO=0
BUILDINFO=0
DIFFMODE=--side-by-side
DIFFCOLOR=--color=auto
DIFFWIDTH=--width=auto
DIFFOPTIONS=(--expand-tabs)
# option checking
while (( $# )); do
case $1 in
-h|--help)
usage
exit 0
;;
-M|--makepkg-config)
(( $# <= 1 )) && die "missing argument for %s" "$1"
MAKEPKG_CONF="$2"
shift 2
;;
-l|--list)
TARLIST=1
shift
;;
-d|--diffoscope)
DIFFOSCOPE=1
shift
;;
-p|--pkginfo)
PKGINFO=1
shift
;;
-b|--buildinfo)
BUILDINFO=1
shift
;;
-v|--verbose)
VERBOSE=1
shift
;;
-u|-U|--unified)
DIFFMODE=--unified
shift
;;
-y|--side-by-side)
DIFFMODE=--side-by-side
shift
;;
--color|--color=*)
if [[ $2 == never || $2 == always || $2 == auto ]]; then
DIFFCOLOR="--color=$2"
shift 2
continue
fi
if [[ $1 == --color ]]; then
DIFFCOLOR="--color=auto"
else
DIFFCOLOR="$1"
fi
shift
;;
-W|--width)
(( $# <= 1 )) && die "missing argument for %s" "$1"
DIFFWIDTH="--width=$2"
shift 2
;;
--width=*)
DIFFWIDTH="$1"
shift
;;
-P|--pool)
(( $# <= 1 )) && die "missing argument for %s" "$1"
POOLDIR="$2"
shift 2
;;
--pool=*)
POOLDIR="${1#*=}"
shift
;;
--)
shift
break
;;
-*|--*)
die "invalid argument: %s" "$1"
;;
*)
break
;;
esac
done
# Set options based on flags or magic values
if (( VERBOSE )); then
if [[ $DIFFMODE == --unified ]]; then
DIFFMODE="--unified=99999"
fi
else
DIFFOPTIONS+=(--suppress-common-lines)
fi
if [[ $DIFFWIDTH == --width=columns ]]; then
DIFFWIDTH="--width=${COLUMNS:-130}"
fi
if [[ $DIFFWIDTH != --width=auto ]]; then
DIFFOPTIONS+=("${DIFFWIDTH}")
fi
DIFFOPTIONS+=("${DIFFMODE}" "${DIFFCOLOR}")
if ! (( DIFFOSCOPE || TARLIST || PKGINFO || BUILDINFO )); then
TARLIST=1
fi
# Source makepkg.conf; fail if it is not found
if [[ -r "${MAKEPKG_CONF}" ]]; then
# shellcheck source=config/makepkg/x86_64.conf
source "${MAKEPKG_CONF}"
else
die "${MAKEPKG_CONF} not found!"
fi
# Source user-specific makepkg.conf overrides
if [[ -r "${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf" ]]; then
# shellcheck source=/dev/null
source "${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf"
elif [[ -r "$HOME/.makepkg.conf" ]]; then
# shellcheck source=/dev/null
source "$HOME/.makepkg.conf"
fi
STARTDIR=$(pwd)
trap 'rm -rf $TMPDIR' EXIT INT TERM QUIT
TMPDIR=$(mktemp -d --tmpdir diffpkg-script.XXXXXXXX)
export TMPDIR
tar_list() {
bsdtar tf "$*" | if (( VERBOSE )); then
cat
else
sed -E 's|^usr/lib/modules/[0-9][^/]+|usr/lib/modules/[…]|g'
fi | sort
}
file_line_length() {
path="$1"
wc -L "${path}" | tail -n1 | sed -E 's/^ +//g' | cut -d' ' -f1
}
file_diff_columns() {
file1="$1"
file2="$2"
file1_length=$(file_line_length "$file1")
file2_length=$(file_line_length "$file2")
echo $(( file1_length + file2_length + 3 ))
}
diff_pkgs() {
local oldpkg newpkg
oldpkg=$(readlink -m "$1")
newpkg=$(readlink -m "$2")
[[ -f $oldpkg ]] || die "No such file: %s" "${oldpkg}"
[[ -f $newpkg ]] || die "No such file: %s" "${newpkg}"
local -a diffoptions
diffoptions=("${DIFFOPTIONS[@]}" --label "${oldpkg}" --label "${newpkg}")
if (( TARLIST )); then
tar_list "$oldpkg" > "$TMPDIR/old"
tar_list "$newpkg" > "$TMPDIR/new"
fi
if (( PKGINFO )); then
bsdtar xOqf "$oldpkg" .PKGINFO > "$TMPDIR/old"
bsdtar xOqf "$newpkg" .PKGINFO > "$TMPDIR/new"
fi
if (( BUILDINFO )); then
bsdtar xOqf "$oldpkg" .BUILDINFO > "$TMPDIR/old"
bsdtar xOqf "$newpkg" .BUILDINFO > "$TMPDIR/new"
fi
if (( TARLIST || PKGINFO || BUILDINFO )); then
# Resolve dynamic auto width one we know the content to diff
if [[ $DIFFWIDTH == --width=auto ]]; then
AUTOLENGTH=$(file_diff_columns "$TMPDIR/old" "$TMPDIR/new")
diffoptions+=("--width=${AUTOLENGTH}")
fi
# Print a header for side-by-side view as it lacks labels
if [[ $DIFFMODE == --side-by-side ]]; then
printf -- "--- %s\n+++ %s\n" "${oldpkg}" "${newpkg}"
fi
diff "${diffoptions[@]}" "$TMPDIR/old" "$TMPDIR/new"
fi
if (( DIFFOSCOPE )); then
diffoscope "${DIFFCOLOR/--color/--text-color}" "$oldpkg" "$newpkg"
fi
}
shopt -s extglob
fetch_pkg() {
local pkg pkgdest pkgurl
case $1 in
*://*)
pkgurl=$1 ;;
/*|*/*)
pkgurl=$(readlink -m "$1") ;;
*.pkg.tar*)
pkgurl=$1 ;;
'')
;;
*)
pkg=$1 ;;
esac
if [[ -z ${pkgurl} ]]; then
# Try to find latest package in pool dir
if [[ -d ${POOLDIR} ]]; then
shopt -s extglob nullglob
pkgurl=$(printf "%s\n" "${POOLDIR}"/*/"${_pkgname}"-!(*-*)-!(*-*)-!(*-*).pkg.tar!(*.sig)|sort -Vr|head -1)
shopt -u extglob nullglob
fi
# Search via pacman database if no pool file exists
if [[ ! -f ${pkgurl} ]]; then
pkgurl=$(pacman -Spdd --print-format '%l' --noconfirm "$pkg") ||
die "Couldn't download previous package for %s." "$pkg"
fi
fi
pkg=${pkgurl##*/}
pkgdest=$(mktemp -t -d "${pkg}-XXXXXX")/${pkg}
if [[ $pkgurl = file://* || ( $pkgurl = /* && -f $pkgurl ) ]]; then
ln -sf "${pkgurl#file://}" "$pkgdest"
elif [[ -f "$PKGDEST/$pkg" ]]; then
ln -sf "$PKGDEST/$pkg" "$pkgdest"
elif [[ -f "$STARTDIR/$pkg" ]]; then
ln -sf "$STARTDIR/$pkg" "$pkgdest"
elif [[ $pkgurl = *://* ]]; then
curl -fsLC - --retry 3 --retry-delay 3 -o "$pkgdest" "$pkgurl" || \
die "Couldn't download %s" "$pkgurl"
else
die "File not found: %s" "$pkgurl"
fi
echo "$pkgdest"
}
shopt -u extglob
if (( $# < 2 )); then
if [[ ! -f PKGBUILD ]]; then
die "This must be run in the directory of a built package.\nTry '${COMMAND} --help' for more information."
fi
# shellcheck source=contrib/makepkg/PKGBUILD.proto
. ./PKGBUILD
if [[ ${arch[0]} == 'any' ]]; then
CARCH='any'
fi
for _pkgname in "${pkgname[@]}"; do
comparepkg=$_pkgname
pkgurl=
target_pkgver=$(get_full_version "$_pkgname")
if ! pkgfile=$(find_cached_package "$_pkgname" "$target_pkgver" "$CARCH"); then
die 'tarball not found for package: %s' "${_pkgname}-$target_pkgver"
fi
ln -s "$pkgfile" "$TMPDIR"
if (( $# )); then
comparepkg="$1"
fi
oldpkg=$(fetch_pkg "$comparepkg") || exit 1
diff_pkgs "$oldpkg" "$pkgfile"
done
else
file1=$(fetch_pkg "$1") || exit 1
file2=$(fetch_pkg "$2") || exit 1
diff_pkgs "$file1" "$file2"
fi

View File

@@ -0,0 +1,78 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/common.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
usage() {
cat <<- _EOF_
Usage: ${BASH_SOURCE[0]##*/}
Export the PGP keys from a PKGBUILDs validpgpkeys array into the keys/pgp/
subdirectory. Useful for distributing packager validated source signing
keys alongside PKGBUILDs.
OPTIONS
-h, --help Show this help text
_EOF_
}
# option checking
while (( $# )); do
case $1 in
-h|--help)
usage
exit 0
;;
*)
die "invalid argument: %s" "$1"
;;
esac
done
if [[ ! -f PKGBUILD ]]; then
die "This must be run a directory containing a PKGBUILD."
fi
mapfile -t validpgpkeys < <(
# shellcheck source=contrib/makepkg/PKGBUILD.proto
. ./PKGBUILD
if (( ${#validpgpkeys[@]} )); then
printf "%s\n" "${validpgpkeys[@]}"
fi
)
msg "Exporting ${#validpgpkeys[@]} PGP keys..."
if (( ${#validpgpkeys[@]} == 0 )); then
exit 0
fi
trap 'rm -rf $TEMPDIR' EXIT INT TERM QUIT
TEMPDIR=$(mktemp -d --tmpdir export-pkgbuild-keys.XXXXXXXXXX)
mkdir -p keys/pgp
error=0
for key in "${validpgpkeys[@]}"; do
gpg --output "$TEMPDIR/$key.asc" --armor --export --export-options export-minimal "$key" 2>/dev/null
# gpg does not give a non-zero return value if it fails to export...
if [[ -f $TEMPDIR/$key.asc ]]; then
msg2 "Exported $key"
mv "$TEMPDIR/$key.asc" "keys/pgp/$key.asc"
else
if [[ -f keys/pgp/$key.asc ]]; then
warning "Failed to update key: $key"
else
error "Key unavailable: $key"
error=1
fi
fi
done
if (( error )); then
die "Failed to export all \'validpgpkeys\' entries."
fi

View File

@@ -1,9 +1,13 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/common.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
m4_include(lib/common.sh)
set -e
shopt -s extglob
IGNORE_INTERNAL=0
@@ -12,7 +16,7 @@ if [[ $1 = "--ignore-internal" ]]; then
shift
fi
script_mode=${0##*/find-lib}
script_mode=${BASH_SOURCE[0]##*/find-lib}
case $script_mode in
deps|provides) true;;
@@ -27,7 +31,7 @@ if [[ -z $1 ]]; then
fi
if [[ -d $1 ]]; then
pushd $1 >/dev/null
pushd "$1" >/dev/null
else
setup_workdir
@@ -39,27 +43,31 @@ else
pushd "$WORKDIR" >/dev/null
fi
shopt -s extglob
process_sofile() {
# extract the library name: libfoo.so
shopt -s extglob nullglob
soname="${sofile%.so?(+(.+([0-9])))}".so
shopt -u extglob nullglob
# extract the major version: 1
soversion="${sofile##*\.so\.}"
if [[ "$soversion" = "$sofile" ]] && (($IGNORE_INTERNAL)); then
continue
if [[ "$soversion" = "$sofile" ]] && ((IGNORE_INTERNAL)); then
return
fi
if ! in_array "${soname}=${soversion}-${soarch}" ${soobjects[@]}; then
if ! in_array "${soname}=${soversion}-${soarch}" "${soobjects[@]}"; then
# libfoo.so=1-64
echo "${soname}=${soversion}-${soarch}"
soobjects+=("${soname}=${soversion}-${soarch}")
fi
}
shopt -u extglob
case $script_mode in
deps) find_args=(-perm -u+x);;
provides) find_args=(-name '*.so*');;
provides) find_args=(-name '*.so*');;
esac
find . -type f "${find_args[@]}" | while read filename; do
find . -type f "${find_args[@]}" | while read -r 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

View File

@@ -2,8 +2,12 @@
#
# finddeps - find packages that depend on a given depname
#
# SPDX-License-Identifier: GPL-3.0-or-later
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/common.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
m4_include(lib/common.sh)
match=$1
@@ -16,24 +20,25 @@ if [[ -z $match ]]; then
exit 1
fi
find . -type d | while read d; do
find . -type d -print0 2>/dev/null| while read -r -d '' d; do
if [[ -f "$d/PKGBUILD" ]]; then
unset pkgname depends makedepends optdepends
pkgname=() depends=() makedepends=() optdepends=()
# shellcheck source=contrib/makepkg/PKGBUILD.proto
. "$d/PKGBUILD"
for dep in "${depends[@]}"; do
# lose the version comparator, if any
depname=${dep%%[<>=]*}
[[ $depname = $match ]] && echo "$d (depends)"
[[ $depname = "$match" ]] && echo "$d (depends)"
done
for dep in "${makedepends[@]}"; do
# lose the version comparator, if any
depname=${dep%%[<>=]*}
[[ $depname = $match ]] && echo "$d (makedepends)"
[[ $depname = "$match" ]] && echo "$d (makedepends)"
done
for dep in "${optdepends[@]/:*}"; do
# lose the version comaparator, if any
depname=${dep%%[<>=]*}
[[ $depname = $match ]] && echo "$d (optdepends)"
[[ $depname = "$match" ]] && echo "$d (optdepends)"
done
fi
done

View File

@@ -2,8 +2,12 @@
#
# lddd - find broken library links on your machine
#
# SPDX-License-Identifier: GPL-3.0-or-later
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/common.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
m4_include(lib/common.sh)
ifs=$IFS
IFS="${IFS}:"
@@ -16,10 +20,10 @@ TEMPDIR=$(mktemp -d --tmpdir lddd-script.XXXX)
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
msg2 "DIR $tree"
msg2 "DIR %s" "$tree"
# Get list of files in tree.
files=$(find $tree -type f ! -name '*.a' ! -name '*.la' ! -name '*.py*' ! -name '*.txt' ! -name '*.h' ! -name '*.ttf' ! \
files=$(find "$tree" -type f ! -name '*.a' ! -name '*.la' ! -name '*.py*' ! -name '*.txt' ! -name '*.h' ! -name '*.ttf' ! \
-name '*.rb' ! -name '*.ko' ! -name '*.pc' ! -name '*.enc' ! -name '*.cf' ! -name '*.def' ! -name '*.rules' ! -name \
'*.cmi' ! -name '*.mli' ! -name '*.ml' ! -name '*.cma' ! -name '*.cmx' ! -name '*.cmxa' ! -name '*.pod' ! -name '*.pm' \
! -name '*.pl' ! -name '*.al' ! -name '*.tcl' ! -name '*.bs' ! -name '*.o' ! -name '*.png' ! -name '*.gif' ! -name '*.cmo' \
@@ -27,22 +31,22 @@ for tree in $PATH $libdirs $extras; do
-name '*.mcopclass' ! -name '*.mcoptype')
IFS=$ifs
for i in $files; do
if (( $(file $i | grep -c 'ELF') != 0 )); then
if (( $(file "$i" | grep -c 'ELF') != 0 )); then
# Is an ELF binary.
if (( $(ldd $i 2>/dev/null | grep -c 'not found') != 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
echo "$i:" >> "$TEMPDIR/raw.txt"
ldd "$i" 2>/dev/null | grep 'not found' >> "$TEMPDIR/raw.txt"
fi
fi
done
done
grep '^/' $TEMPDIR/raw.txt | sed -e 's/://g' >> $TEMPDIR/affected-files.txt
grep '^/' "$TEMPDIR/raw.txt" | sed -e 's/://g' >> "$TEMPDIR/affected-files.txt"
# invoke pacman
for i in $(cat $TEMPDIR/affected-files.txt); do
pacman -Qo $i | awk '{print $4,$5}' >> $TEMPDIR/pacman.txt
done
while read -r i; do
pacman -Qo "$i" | awk '{print $4,$5}' >> "$TEMPDIR/pacman.txt"
done < "$TEMPDIR/affected-files.txt"
# clean list
sort -u $TEMPDIR/pacman.txt >> $TEMPDIR/possible-rebuilds.txt
sort -u "$TEMPDIR/pacman.txt" >> "$TEMPDIR/possible-rebuilds.txt"
msg "Files saved to $TEMPDIR"
msg "Files saved to %s" "$TEMPDIR"

132
src/lib/api/gitlab.sh Normal file
View File

@@ -0,0 +1,132 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${DEVTOOLS_INCLUDE_API_GITLAB_SH:-} ]] || return 0
DEVTOOLS_INCLUDE_API_GITLAB_SH=1
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/common.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
# shellcheck source=src/lib/config.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/config.sh
set -e
gitlab_api_call() {
local outfile=$1
local request=$2
local endpoint=$3
local data=${4:-}
local error
# empty token
if [[ -z "${GITLAB_TOKEN}" ]]; then
msg_error " api call failed: No token provided"
return 1
fi
if ! curl --request "${request}" \
--url "https://${GITLAB_HOST}/api/v4/${endpoint}" \
--header "PRIVATE-TOKEN: ${GITLAB_TOKEN}" \
--header "Content-Type: application/json" \
--data "${data}" \
--output "${outfile}" \
--silent; then
msg_error " api call failed: $(cat "${outfile}")"
return 1
fi
# check for general purpose api error
if error=$(jq --raw-output --exit-status '.error' < "${outfile}"); then
msg_error " api call failed: ${error}"
return 1
fi
# check for api specific error messages
if ! jq --raw-output --exit-status '.id' < "${outfile}" >/dev/null; then
if jq --raw-output --exit-status '.message | keys[]' < "${outfile}" &>/dev/null; then
while read -r error; do
msg_error " api call failed: ${error}"
done < <(jq --raw-output --exit-status '.message|to_entries|map("\(.key) \(.value[])")[]' < "${outfile}")
elif error=$(jq --raw-output --exit-status '.message' < "${outfile}"); then
msg_error " api call failed: ${error}"
fi
return 1
fi
return 0
}
gitlab_api_get_user() {
local outfile username
[[ -z ${WORKDIR:-} ]] && setup_workdir
outfile=$(mktemp --tmpdir="${WORKDIR}" pkgctl-gitlab-api.XXXXXXXXXX)
# query user details
if ! gitlab_api_call "${outfile}" GET "user/"; then
msg_warn " Invalid token provided?"
exit 1
fi
# extract username from details
if ! username=$(jq --raw-output --exit-status '.username' < "${outfile}"); then
msg_error " failed to query username: $(cat "${outfile}")"
return 1
fi
printf "%s" "${username}"
return 0
}
# Convert arbitrary project names to GitLab valid path names.
#
# GitLab has several limitations on project and group names and also maintains
# a list of reserved keywords as documented on their docs.
# https://docs.gitlab.com/ee/user/reserved_names.html
#
# 1. replace single '+' between word boundaries with '-'
# 2. replace any other '+' with literal 'plus'
# 3. replace any special chars other than '_', '-' and '.' with '-'
# 4. replace consecutive '_-' chars with a single '-'
# 5. replace 'tree' with 'unix-tree' due to GitLab reserved keyword
gitlab_project_name_to_path() {
local name=$1
printf "%s" "${name}" \
| sed -E 's/([a-zA-Z0-9]+)\+([a-zA-Z]+)/\1-\2/g' \
| sed -E 's/\+/plus/g' \
| sed -E 's/[^a-zA-Z0-9_\-\.]/-/g' \
| sed -E 's/[_\-]{2,}/-/g' \
| sed -E 's/^tree$/unix-tree/g'
}
gitlab_api_create_project() {
local pkgbase=$1
local outfile data path project_path
[[ -z ${WORKDIR:-} ]] && setup_workdir
outfile=$(mktemp --tmpdir="${WORKDIR}" pkgctl-gitlab-api.XXXXXXXXXX)
project_path=$(gitlab_project_name_to_path "${pkgbase}")
# create GitLab project
data='{
"name": "'"${pkgbase}"'",
"path": "'"${project_path}"'",
"namespace_id": "'"${GIT_PACKAGING_NAMESPACE_ID}"'",
"request_access_enabled": "false"
}'
if ! gitlab_api_call "${outfile}" POST "projects/" "${data}"; then
return 1
fi
if ! path=$(jq --raw-output --exit-status '.path' < "${outfile}"); then
msg_error " failed to query path: $(cat "${outfile}")"
return 1
fi
printf "%s" "${path}"
return 0
}

63
src/lib/archroot.sh Normal file
View File

@@ -0,0 +1,63 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
:
# shellcheck disable=2034
CHROOT_VERSION='v5'
##
# usage : check_root $keepenv
##
check_root() {
local keepenv=$1
shift
local orig_argv=("$@")
(( EUID == 0 )) && return
if type -P sudo >/dev/null; then
exec sudo --preserve-env="${keepenv}" -- "${orig_argv[@]}"
else
exec su root -c "$(printf ' %q' "${orig_argv[@]}")"
fi
}
##
# usage : is_btrfs( $path )
# return : whether $path is on a btrfs
##
is_btrfs() {
[[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs ]]
}
##
# usage : is_subvolume( $path )
# return : whether $path is a the root of a btrfs subvolume (including
# the top-level subvolume).
##
is_subvolume() {
[[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs && "$(stat -c %i "$1")" == 256 ]]
}
##
# usage : subvolume_delete_recursive( $path )
#
# Find all btrfs subvolumes under and including $path and delete them.
##
subvolume_delete_recursive() {
local subvol
is_subvolume "$1" || return 0
while IFS= read -d $'\0' -r subvol; do
if ! subvolume_delete_recursive "$subvol"; then
return 1
fi
done < <(find "$1" -mindepth 1 -xdev -depth -inum 256 -print0)
if ! btrfs subvolume delete "$1" &>/dev/null; then
error "Unable to delete subvolume %s" "$subvol"
return 1
fi
return 0
}

72
src/lib/auth.sh Normal file
View File

@@ -0,0 +1,72 @@
#!/hint/bash
#
# This may be included with or without `set -euE`
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${DEVTOOLS_INCLUDE_AUTH_SH:-} ]] || return 0
DEVTOOLS_INCLUDE_AUTH_SH=1
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
set -e
pkgctl_auth_usage() {
local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [COMMAND] [OPTIONS]
Authenticate with services like GitLab.
COMMANDS
login Authenticate with the GitLab instance
status View authentication status
OPTIONS
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} login --gen-access-token
$ ${COMMAND} status
_EOF_
}
pkgctl_auth() {
if (( $# < 1 )); then
pkgctl_auth_usage
exit 0
fi
# option checking
while (( $# )); do
case $1 in
-h|--help)
pkgctl_auth_usage
exit 0
;;
login)
_DEVTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/auth/login.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/auth/login.sh
pkgctl_auth_login "$@"
exit 0
;;
status)
_DEVTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/auth/status.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/auth/status.sh
pkgctl_auth_status "$@"
exit 0
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
die "invalid command: %s" "$1"
;;
esac
done
}

101
src/lib/auth/login.sh Normal file
View File

@@ -0,0 +1,101 @@
#!/hint/bash
#
# This may be included with or without `set -euE`
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${DEVTOOLS_INCLUDE_AUTH_LOGIN_SH:-} ]] || return 0
DEVTOOLS_INCLUDE_AUTH_LOGIN_SH=1
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/common.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
# shellcheck source=src/lib/config.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/config.sh
# shellcheck source=src/lib/api/gitlab.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/api/gitlab.sh
set -e
pkgctl_auth_login_usage() {
local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS]
Interactively authenticate with the GitLab instance.
The minimum required scopes for the token are: 'api', 'write_repository'.
The GitLab API token can either be stored in a plaintext file, or
supplied via the DEVTOOLS_GITLAB_TOKEN environment variable using a
vault, see pkgctl-auth-login(1) for details.
OPTIONS
-g, --gen-access-token Open the URL to generate a new personal access token
-h, --help Show this help text
EXAMPLES
$ ${COMMAND}
$ ${COMMAND} --gen-access-token
_EOF_
}
pkgctl_auth_login() {
local token personal_access_token_url
local GEN_ACESS_TOKEN=0
# option checking
while (( $# )); do
case $1 in
-h|--help)
pkgctl_auth_login_usage
exit 0
;;
-g|--gen-access-token)
GEN_ACESS_TOKEN=1
shift
;;
*)
die "invalid argument: %s" "$1"
;;
esac
done
personal_access_token_url="https://${GITLAB_HOST}/-/profile/personal_access_tokens?name=pkgctl+token&scopes=api,write_repository"
cat <<- _EOF_
Logging into ${BOLD}${GITLAB_HOST}${ALL_OFF}
Tip: you can generate a Personal Access Token here ${personal_access_token_url}
The minimum required scopes are 'api' and 'write_repository'.
If you do not want to store the token in a plaintext file, you can abort
the following prompt and supply the token via the DEVTOOLS_GITLAB_TOKEN
environment variable using a vault, see pkgctl-auth-login(1) for details.
_EOF_
if (( GEN_ACESS_TOKEN )); then
xdg-open "${personal_access_token_url}" 2>/dev/null
fi
# read token from stdin
read -s -r -p "${GREEN}?${ALL_OFF} ${BOLD}Paste your authentication token:${ALL_OFF} " token
echo
if [[ -z ${token} ]]; then
msg_error " No token provided"
exit 1
fi
# check if the passed token works
GITLAB_TOKEN="${token}"
if ! result=$(gitlab_api_get_user); then
printf "%s\n" "$result"
exit 1
fi
msg_success " Logged in as ${BOLD}${result}${ALL_OFF}"
save_devtools_config
}

69
src/lib/auth/status.sh Normal file
View File

@@ -0,0 +1,69 @@
#!/hint/bash
#
# This may be included with or without `set -euE`
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${DEVTOOLS_INCLUDE_AUTH_STATUS_SH:-} ]] || return 0
DEVTOOLS_INCLUDE_AUTH_STATUS_SH=1
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/common.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
# shellcheck source=src/lib/api/gitlab.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/api/gitlab.sh
set -e
pkgctl_auth_status_usage() {
local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS]
Verifies and displays information about your authentication state of
services like the GitLab instance and reports issues if any.
OPTIONS
-t, --show-token Display the auth token
-h, --help Show this help text
EXAMPLES
$ ${COMMAND}
$ ${COMMAND} --show-token
_EOF_
}
pkgctl_auth_status() {
local SHOW_TOKEN=0
# option checking
while (( $# )); do
case $1 in
-h|--help)
pkgctl_auth_status_usage
exit 0
;;
-t|--show-token)
SHOW_TOKEN=1
shift
;;
*)
die "invalid argument: %s" "$1"
;;
esac
done
printf "%s\n" "${BOLD}${GITLAB_HOST}${ALL_OFF}"
# shellcheck disable=2119
if ! username=$(gitlab_api_get_user); then
printf "%s\n" "${username}"
exit 1
fi
msg_success " Logged in as ${BOLD}${username}${ALL_OFF}"
if (( SHOW_TOKEN )); then
msg_success " Token: ${GITLAB_TOKEN}"
else
msg_success " Token: **************************"
fi
}

420
src/lib/build/build.sh Normal file
View File

@@ -0,0 +1,420 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${DEVTOOLS_INCLUDE_BUILD_SH:-} ]] || return 0
DEVTOOLS_INCLUDE_BUILD_SH=1
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/common.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
# shellcheck source=src/lib/db/update.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/db/update.sh
# shellcheck source=src/lib/release.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/release.sh
# shellcheck source=src/lib/util/git.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/git.sh
# shellcheck source=src/lib/util/pacman.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/pacman.sh
# shellcheck source=src/lib/valid-repos.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-repos.sh
# shellcheck source=src/lib/valid-tags.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-tags.sh
source /usr/share/makepkg/util/config.sh
source /usr/share/makepkg/util/message.sh
set -e
set -o pipefail
pkgctl_build_usage() {
local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [PATH]...
Build packages inside a clean chroot
When a new pkgver is set using the appropriate PKGBUILD options the
checksums are automatically updated.
TODO
BUILD OPTIONS
--arch ARCH Specify architectures to build for (disables auto-detection)
--repo REPO Specify a target repository (disables auto-detection)
-s, --staging Build against the staging counterpart of the auto-detected repo
-t, --testing Build against the testing counterpart of the auto-detected repo
-o, --offload Build on a remote server and transfer artifacts afterwards
-c, --clean Recreate the chroot before building
-I, --install FILE Install a package into the working copy of the chroot
-w, --worker SLOT Name of the worker slot, useful for concurrent builds (disables automatic names)
--nocheck Do not run the check() function in the PKGBUILD
PKGBUILD OPTIONS
--pkgver=PKGVER Set pkgver, reset pkgrel and update checksums
--pkgrel=PKGREL Set pkgrel to a given value
--rebuild Increment the current pkgrel variable
-e, --edit Edit the PKGBUILD before building
RELEASE OPTIONS
-r, --release Automatically commit, tag and release after building
-m, --message MSG Use the given <msg> as the commit message
-u, --db-update Automatically update the pacman database as last action
OPTIONS
-h, --help Show this help text
EXAMPLES
$ ${COMMAND}
$ ${COMMAND} --rebuild --staging --message 'libyay 0.42 rebuild' libfoo libbar
$ ${COMMAND} --pkgver 1.42 --release --db-update
_EOF_
}
pkgctl_build_check_option_group_repo() {
local option=$1
local repo=$2
local testing=$3
local staging=$4
if ( (( testing )) && (( staging )) ) ||
( [[ $repo =~ ^.*-(staging|testing)$ ]] && ( (( testing )) || (( staging )) )); then
die "The argument '%s' cannot be used with one or more of the other specified arguments" "${option}"
exit 1
fi
return 0
}
pkgctl_build_check_option_group_ver() {
local option=$1
local pkgver=$2
local pkgrel=$3
local rebuild=$4
if [[ -n "${pkgver}" ]] || [[ -n "${pkgrel}" ]] || (( rebuild )); then
die "The argument '%s' cannot be used with one or more of the other specified arguments" "${option}"
exit 1
fi
return 0
}
# TODO: import pgp keys
pkgctl_build() {
if (( $# < 1 )) && [[ ! -f PKGBUILD ]]; then
pkgctl_build_usage
exit 1
fi
local UPDPKGSUMS=0
local EDIT=0
local REBUILD=0
local OFFLOAD=0
local STAGING=0
local TESTING=0
local RELEASE=0
local DB_UPDATE=0
local REPO=
local PKGVER=
local PKGREL=
local MESSAGE=
local paths=()
local BUILD_ARCH=()
local BUILD_OPTIONS=()
local MAKECHROOT_OPTIONS=()
local RELEASE_OPTIONS=()
local MAKEPKG_OPTIONS=()
local WORKER=
local WORKER_SLOT=
# variables
local path pkgbase pkgrepo source
while (( $# )); do
case $1 in
-h|--help)
pkgctl_build_usage
exit 0
;;
--repo)
(( $# <= 1 )) && die "missing argument for %s" "$1"
REPO="${2}"
pkgctl_build_check_option_group_repo '--repo' "${REPO}" "${TESTING}" "${STAGING}"
shift 2
;;
--arch)
(( $# <= 1 )) && die "missing argument for %s" "$1"
if [[ ${2} == all ]]; then
BUILD_ARCH=("${_arch[@]::${#_arch[@]}-1}")
elif [[ ${2} == any ]]; then
BUILD_ARCH=("${_arch[0]}")
elif ! in_array "${2}" "${BUILD_ARCH[@]}"; then
if ! in_array "${2}" "${_arch[@]}"; then
die 'invalid architecture: %s' "${2}"
fi
BUILD_ARCH+=("${2}")
fi
shift 2
;;
--pkgver=*)
pkgctl_build_check_option_group_ver '--pkgver' "${PKGVER}" "${PKGREL}" "${REBUILD}"
PKGVER="${1#*=}"
PKGREL=1
UPDPKGSUMS=1
shift
;;
--pkgrel=*)
pkgctl_build_check_option_group_ver '--pkgrel' "${PKGVER}" "${PKGREL}" "${REBUILD}"
PKGREL="${1#*=}"
shift
;;
--rebuild)
# shellcheck source=src/lib/util/git.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/git.sh
pkgctl_build_check_option_group_ver '--rebuild' "${PKGVER}" "${PKGREL}" "${REBUILD}"
REBUILD=1
shift
;;
-e|--edit)
EDIT=1
shift
;;
-o|--offload)
OFFLOAD=1
shift
;;
-s|--staging)
STAGING=1
pkgctl_build_check_option_group_repo '--staging' "${REPO}" "${TESTING}" "${STAGING}"
shift
;;
-t|--testing)
TESTING=1
pkgctl_build_check_option_group_repo '--testing' "${REPO}" "${TESTING}" "${STAGING}"
shift
;;
-c|--clean)
BUILD_OPTIONS+=("-c")
shift
;;
-I|--install)
(( $# <= 1 )) && die "missing argument for %s" "$1"
MAKECHROOT_OPTIONS+=("-I" "$2")
warning 'installing packages into the chroot may break reproducible builds, use with caution!'
shift 2
;;
--nocheck)
MAKEPKG_OPTIONS+=("--nocheck")
warning 'not running checks is disallowed for official packages, except for bootstrapping. Please rebuild after bootstrapping is completed!'
shift
;;
-r|--release)
# shellcheck source=src/lib/release.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/release.sh
RELEASE=1
shift
;;
-m|--message)
(( $# <= 1 )) && die "missing argument for %s" "$1"
MESSAGE=$2
RELEASE_OPTIONS+=("--message" "${MESSAGE}")
shift 2
;;
-u|--db-update)
DB_UPDATE=1
shift
;;
-w|--worker)
(( $# <= 1 )) && die "missing argument for %s" "$1"
WORKER_SLOT=$2
shift 2
;;
--)
shift
break
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
paths=("$@")
break
;;
esac
done
# check if any release specific options were specified without releasing
if (( ! RELEASE )); then
if (( DB_UPDATE )); then
die "cannot use --db-update without --release"
fi
if [[ -n "${MESSAGE}" ]]; then
die "cannot use --message without --release"
fi
fi
# check if invoked without any path from within a packaging repo
if (( ${#paths[@]} == 0 )); then
if [[ -f PKGBUILD ]]; then
paths=(".")
else
pkgctl_build_usage
exit 1
fi
fi
# assign default worker slot
if [[ -z ${WORKER_SLOT} ]] && ! WORKER_SLOT="$(tty | sed 's|/dev/pts/||')"; then
WORKER_SLOT=$(( RANDOM % $(nproc) + 1 ))
fi
WORKER="${USER}-${WORKER_SLOT}"
# Update pacman cache for auto-detection
if [[ -z ${REPO} ]]; then
update_pacman_repo_cache
# Check valid repos if not resolved dynamically
elif ! in_array "${REPO}" "${_repos[@]}"; then
die "Invalid repository target: %s" "${REPO}"
fi
for path in "${paths[@]}"; do
pushd "${path}" >/dev/null
if [[ ! -f PKGBUILD ]]; then
die 'PKGBUILD not found in %s' "${path}"
fi
source=()
# shellcheck source=contrib/makepkg/PKGBUILD.proto
. ./PKGBUILD
pkgbase=${pkgbase:-$pkgname}
pkgrepo=${REPO}
msg "Building ${pkgbase}"
# auto-detection of build target
if [[ -z ${pkgrepo} ]]; then
if ! pkgrepo=$(get_pacman_repo_from_pkgbuild PKGBUILD); then
die 'failed to get pacman repo'
fi
if [[ -z "${pkgrepo}" ]]; then
die 'unknown repo, please specify --repo for new packages'
fi
fi
# special cases to resolve final build target
if (( TESTING )); then
pkgrepo="${pkgrepo}-testing"
elif (( STAGING )); then
pkgrepo="${pkgrepo}-staging"
elif [[ $pkgrepo == core ]]; then
pkgrepo="${pkgrepo}-testing"
fi
# auto-detection of build architecture
if [[ $pkgrepo = multilib* ]]; then
BUILD_ARCH=("")
elif (( ${#BUILD_ARCH[@]} == 0 )); then
if in_array any "${arch[@]}"; then
BUILD_ARCH=("${_arch[0]}")
else
BUILD_ARCH+=("${arch[@]}")
fi
fi
# print gathered build modes
msg2 " repo: ${pkgrepo}"
msg2 " arch: ${BUILD_ARCH[*]}"
msg2 "worker: ${WORKER}"
# increment pkgrel on rebuild
if (( REBUILD )); then
# try to figure out of pkgrel has been changed
if ! old_pkgrel=$(git_diff_tree HEAD PKGBUILD | grep --perl-regexp --only-matching --max-count=1 '^-pkgrel=\K\w+'); then
old_pkgrel=${pkgrel}
fi
# check if pkgrel conforms expectations
[[ ${pkgrel/.*} =~ ^[0-9]+$ ]] || die "Non-standard pkgrel declaration"
[[ ${old_pkgrel/.*} =~ ^[0-9]+$ ]] || die "Non-standard pkgrel declaration"
# increment pkgrel if it hasn't been changed yet
if [[ ${pkgrel} = "${old_pkgrel}" ]]; then
PKGREL=$((${pkgrel/.*}+1))
else
warning 'ignoring --rebuild as pkgrel has already been incremented from %s to %s' "${old_pkgrel}" "${pkgrel}"
fi
fi
# update pkgver
if [[ -n ${PKGVER} ]]; then
if [[ $(type -t pkgver) == function ]]; then
# TODO: check if die or warn, if we provide _commit _gitcommit setter maybe?
warning 'setting pkgver variable has no effect if the PKGBUILD has a pkgver() function'
fi
msg "Bumping pkgver to ${PKGVER}"
grep --extended-regexp --quiet --max-count=1 "^pkgver=${pkgver}$" PKGBUILD || die "Non-standard pkgver declaration"
sed --regexp-extended "s|^(pkgver=)${pkgver}$|\1${PKGVER}|g" -i PKGBUILD
fi
# update pkgrel
if [[ -n ${PKGREL} ]]; then
msg "Bumping pkgrel to ${PKGREL}"
grep --extended-regexp --quiet --max-count=1 "^pkgrel=${pkgrel}$" PKGBUILD || die "Non-standard pkgrel declaration"
sed --regexp-extended "s|^(pkgrel=)${pkgrel}$|\1${PKGREL}|g" -i PKGBUILD
fi
# edit PKGBUILD
if (( EDIT )); then
stat_busy 'Editing PKGBUILD'
if [[ -n $GIT_EDITOR ]]; then
$GIT_EDITOR PKGBUILD || die
elif [[ -n $VISUAL ]]; then
$VISUAL PKGBUILD || die
elif [[ -n $EDITOR ]]; then
$EDITOR PKGBUILD || die
elif giteditor=$(git config --get core.editor); then
$giteditor PKGBUILD || die
else
die "No usable editor found (tried \$GIT_EDITOR, \$VISUAL, \$EDITOR, git config [core.editor])."
fi
stat_done
fi
# update checksums if any sources are declared
if (( UPDPKGSUMS )) && (( ${#source[@]} >= 1 )); then
updpkgsums
fi
# execute build
for arch in "${BUILD_ARCH[@]}"; do
if [[ -n $arch ]]; then
msg "Building ${pkgbase} for [${pkgrepo}] (${arch})"
BUILDTOOL="${pkgrepo}-${arch}-build"
else
msg "Building ${pkgbase} for [${pkgrepo}]"
BUILDTOOL="${pkgrepo}-build"
fi
if (( OFFLOAD )); then
offload-build --repo "${pkgrepo}" -- "${BUILD_OPTIONS[@]}" -- "${MAKECHROOT_OPTIONS[@]}" -l "${WORKER}" -- "${MAKEPKG_OPTIONS[@]}"
else
"${BUILDTOOL}" "${BUILD_OPTIONS[@]}" -- "${MAKECHROOT_OPTIONS[@]}" -l "${WORKER}" -- "${MAKEPKG_OPTIONS[@]}"
fi
done
# release the build
if (( RELEASE )); then
pkgctl_release --repo "${pkgrepo}" "${RELEASE_OPTIONS[@]}"
fi
# reset common PKGBUILD variables
unset pkgbase pkgname arch pkgrepo source pkgver pkgrel validpgpkeys
popd >/dev/null
done
# update the binary package repo db as last action
if (( RELEASE )) && (( DB_UPDATE )); then
# shellcheck disable=2119
pkgctl_db_update
fi
}

313
src/lib/common.sh Normal file
View File

@@ -0,0 +1,313 @@
#!/hint/bash
#
# This may be included with or without `set -euE`
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${DEVTOOLS_INCLUDE_COMMON_SH:-} ]] || return 0
DEVTOOLS_INCLUDE_COMMON_SH="$(set +o|grep nounset)"
set +u +o posix
# shellcheck disable=1091
. /usr/share/makepkg/util.sh
$DEVTOOLS_INCLUDE_COMMON_SH
# Avoid any encoding problems
export LANG=C
# Set buildtool properties
export BUILDTOOL=devtools
export BUILDTOOLVER=@buildtoolver@
# Set common properties
export PACMAN_KEYRING_DIR=/etc/pacman.d/gnupg
export GITLAB_HOST=gitlab.archlinux.org
export GIT_REPO_SPEC_VERSION=1
export GIT_PACKAGING_NAMESPACE=archlinux/packaging/packages
export GIT_PACKAGING_NAMESPACE_ID=11323
export GIT_PACKAGING_URL_SSH="git@${GITLAB_HOST}:${GIT_PACKAGING_NAMESPACE}"
export GIT_PACKAGING_URL_HTTPS="https://${GITLAB_HOST}/${GIT_PACKAGING_NAMESPACE}"
export PACKAGING_REPO_RELEASE_HOST=repos.archlinux.org
# check if messages are to be printed using color
if [[ -t 2 && "$TERM" != dumb ]] || [[ ${DEVTOOLS_COLOR} == always ]]; then
colorize
else
# shellcheck disable=2034
declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW=''
fi
stat_busy() {
local mesg=$1; shift
# shellcheck disable=2059
printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2
}
stat_progress() {
# shellcheck disable=2059
printf "${BOLD}.${ALL_OFF}" >&2
}
stat_done() {
# shellcheck disable=2059
printf "${BOLD}done${ALL_OFF}\n" >&2
}
msg_success() {
local msg=$1
local padding
padding=$(echo "${msg}"|sed -E 's/( *).*/\1/')
msg=$(echo "${msg}"|sed -E 's/ *(.*)/\1/')
printf "%s %s\n" "${padding}${GREEN}${ALL_OFF}" "${msg}" >&2
}
msg_error() {
local msg=$1
local padding
padding=$(echo "${msg}"|sed -E 's/( *).*/\1/')
msg=$(echo "${msg}"|sed -E 's/ *(.*)/\1/')
printf "%s %s\n" "${padding}${RED}x${ALL_OFF}" "${msg}" >&2
}
msg_warn() {
local msg=$1
local padding
padding=$(echo "${msg}"|sed -E 's/( *).*/\1/')
msg=$(echo "${msg}"|sed -E 's/ *(.*)/\1/')
printf "%s %s\n" "${padding}${YELLOW}!${ALL_OFF}" "${msg}" >&2
}
_setup_workdir=false
setup_workdir() {
[[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX")
_setup_workdir=true
trap 'trap_abort' INT QUIT TERM HUP
trap 'trap_exit' EXIT
}
cleanup() {
if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then
rm -rf "$WORKDIR"
fi
exit "${1:-0}"
}
abort() {
error 'Aborting...'
cleanup 255
}
trap_abort() {
trap - EXIT INT QUIT TERM HUP
abort
}
trap_exit() {
local r=$?
trap - EXIT INT QUIT TERM HUP
cleanup $r
}
die() {
(( $# )) && error "$@"
cleanup 255
}
##
# usage : lock( $fd, $file, $message, [ $message_arguments... ] )
##
lock() {
# Only reopen the FD if it wasn't handed to us
if ! [[ "/dev/fd/$1" -ef "$2" ]]; then
mkdir -p -- "$(dirname -- "$2")"
eval "exec $1>"'"$2"'
fi
if ! flock -n "$1"; then
stat_busy "${@:3}"
flock "$1"
stat_done
fi
}
##
# usage : slock( $fd, $file, $message, [ $message_arguments... ] )
##
slock() {
# Only reopen the FD if it wasn't handed to us
if ! [[ "/dev/fd/$1" -ef "$2" ]]; then
mkdir -p -- "$(dirname -- "$2")"
eval "exec $1>"'"$2"'
fi
if ! flock -sn "$1"; then
stat_busy "${@:3}"
flock -s "$1"
stat_done
fi
}
##
# usage : lock_close( $fd )
##
lock_close() {
local fd=$1
# https://github.com/koalaman/shellcheck/issues/862
# shellcheck disable=2034
exec {fd}>&-
}
##
# usage: pkgver_equal( $pkgver1, $pkgver2 )
##
pkgver_equal() {
if [[ $1 = *-* && $2 = *-* ]]; then
# if both versions have a pkgrel, then they must be an exact match
[[ $1 = "$2" ]]
else
# otherwise, trim any pkgrel and compare the bare version.
[[ ${1%%-*} = "${2%%-*}" ]]
fi
}
##
# usage: find_cached_package( $pkgname, $pkgver, $arch )
#
# $pkgver can be supplied with or without a pkgrel appended.
# If not supplied, any pkgrel will be matched.
##
shopt -s extglob
find_cached_package() {
local searchdirs=("$PWD" "$PKGDEST") results=()
local targetname=$1 targetver=$2 targetarch=$3
local dir pkg packages pkgbasename name ver rel arch r results
for dir in "${searchdirs[@]}"; do
[[ -d $dir ]] || continue
shopt -s extglob nullglob
mapfile -t packages < <(printf "%s\n" "$dir"/"${targetname}"-"${targetver}"-*"${targetarch}".pkg.tar?(.!(sig|*.*)))
shopt -u extglob nullglob
for pkg in "${packages[@]}"; do
[[ -f $pkg ]] || continue
# avoid adding duplicates of the same inode
for r in "${results[@]}"; do
[[ $r -ef $pkg ]] && continue 2
done
# split apart package filename into parts
pkgbasename=${pkg##*/}
pkgbasename=${pkgbasename%.pkg.tar*}
arch=${pkgbasename##*-}
pkgbasename=${pkgbasename%-"$arch"}
rel=${pkgbasename##*-}
pkgbasename=${pkgbasename%-"$rel"}
ver=${pkgbasename##*-}
name=${pkgbasename%-"$ver"}
if [[ $targetname = "$name" && $targetarch = "$arch" ]] &&
pkgver_equal "$targetver" "$ver-$rel"; then
results+=("$pkg")
fi
done
done
case ${#results[*]} in
0)
return 1
;;
1)
printf '%s\n' "${results[0]}"
return 0
;;
*)
error 'Multiple packages found:'
printf '\t%s\n' "${results[@]}" >&2
return 1
esac
}
shopt -u extglob
check_package_validity(){
local pkgfile=$1
if grep -q "packager = Unknown Packager" <(bsdtar -xOqf "$pkgfile" .PKGINFO); then
die "PACKAGER was not set when building package"
fi
hashsum=sha256sum
pkgbuild_hash=$(awk -v"hashsum=$hashsum" -F' = ' '$1 == "pkgbuild_"hashsum {print $2}' <(bsdtar -xOqf "$pkgfile" .BUILDINFO))
if [[ "$pkgbuild_hash" != "$($hashsum PKGBUILD|cut -d' ' -f1)" ]]; then
die "PKGBUILD $hashsum mismatch: expected $pkgbuild_hash"
fi
}
# usage: grep_pkginfo pkgfile pattern
grep_pkginfo() {
local _ret=()
mapfile -t _ret < <(bsdtar -xOqf "$1" ".PKGINFO" | grep "^${2} = ")
printf '%s\n' "${_ret[@]#${2} = }"
}
# Get the package name
getpkgname() {
local _name
_name="$(grep_pkginfo "$1" "pkgname")"
if [[ -z $_name ]]; then
error "Package '%s' has no pkgname in the PKGINFO. Fail!" "$1"
exit 1
fi
echo "$_name"
}
# Get the package base or name as fallback
getpkgbase() {
local _base
_base="$(grep_pkginfo "$1" "pkgbase")"
if [[ -z $_base ]]; then
getpkgname "$1"
else
echo "$_base"
fi
}
getpkgdesc() {
local _desc
_desc="$(grep_pkginfo "$1" "pkgdesc")"
if [[ -z $_desc ]]; then
error "Package '%s' has no pkgdesc in the PKGINFO. Fail!" "$1"
exit 1
fi
echo "$_desc"
}
get_tag_from_pkgver() {
local pkgver=$1
local tag=${pkgver}
tag=${tag/:/-}
tag=${tag//~/.}
echo "${tag}"
}
is_debug_package() {
local pkgfile=${1} pkgbase pkgname pkgdesc
pkgbase="$(getpkgbase "${pkgfile}")"
pkgname="$(getpkgname "${pkgfile}")"
pkgdesc="$(getpkgdesc "${pkgfile}")"
[[ ${pkgdesc} == "Detached debugging symbols for "* && ${pkgbase}-debug = "${pkgname}" ]]
}

48
src/lib/config.sh Normal file
View File

@@ -0,0 +1,48 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${DEVTOOLS_INCLUDE_CONFIG_SH:-} ]] || return 0
DEVTOOLS_INCLUDE_CONFIG_SH=1
set -e
readonly XDG_DEVTOOLS_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/devtools"
readonly XDG_DEVTOOLS_GITLAB_CONFIG="${XDG_DEVTOOLS_DIR}/gitlab.conf"
# default config variables
export GITLAB_TOKEN=""
load_devtools_config() {
# temporary permission fixup
if [[ -d "${XDG_DEVTOOLS_DIR}" ]]; then
chmod 700 "${XDG_DEVTOOLS_DIR}"
fi
if [[ -f "${XDG_DEVTOOLS_GITLAB_CONFIG}" ]]; then
chmod 600 "${XDG_DEVTOOLS_GITLAB_CONFIG}"
fi
if [[ -n "${DEVTOOLS_GITLAB_TOKEN}" ]]; then
GITLAB_TOKEN="${DEVTOOLS_GITLAB_TOKEN}"
return
fi
if [[ -f "${XDG_DEVTOOLS_GITLAB_CONFIG}" ]]; then
GITLAB_TOKEN=$(grep GITLAB_TOKEN "${XDG_DEVTOOLS_GITLAB_CONFIG}"|cut -d= -f2|cut -d\" -f2)
return
fi
GITLAB_TOKEN=""
}
save_devtools_config() {
# temporary permission fixup
if [[ -d "${XDG_DEVTOOLS_DIR}" ]]; then
chmod 700 "${XDG_DEVTOOLS_DIR}"
fi
if [[ -f "${XDG_DEVTOOLS_GITLAB_CONFIG}" ]]; then
chmod 600 "${XDG_DEVTOOLS_GITLAB_CONFIG}"
fi
(
umask 0077
mkdir -p "${XDG_DEVTOOLS_DIR}"
printf 'GITLAB_TOKEN="%s"\n' "${GITLAB_TOKEN}" > "${XDG_DEVTOOLS_GITLAB_CONFIG}"
)
}

80
src/lib/db.sh Normal file
View File

@@ -0,0 +1,80 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${DEVTOOLS_INCLUDE_DB_SH:-} ]] || return 0
DEVTOOLS_INCLUDE_DB_SH=1
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
set -e
pkgctl_db_usage() {
local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [COMMAND] [OPTIONS]
Pacman database modification for packge update, move etc
COMMANDS
move Move packages between pacman repositories
remove Remove packages from pacman repositories
update Update the pacman database as final release step
OPTIONS
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} move extra-staging extra-testing libfoo libbar
$ ${COMMAND} remove core-testing libfoo libbar
$ ${COMMAND} update
_EOF_
}
pkgctl_db() {
if (( $# < 1 )); then
pkgctl_db_usage
exit 0
fi
# option checking
while (( $# )); do
case $1 in
-h|--help)
pkgctl_db_usage
exit 0
;;
move)
_DEVTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/db/move.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/db/move.sh
pkgctl_db_move "$@"
exit 0
;;
remove)
_DEVTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/db/remove.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/db/remove.sh
pkgctl_db_remove "$@"
exit 0
;;
update)
_DEVTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/db/update.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/db/update.sh
pkgctl_db_update "$@"
exit 0
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
die "invalid command: %s" "$1"
;;
esac
done
}

64
src/lib/db/move.sh Normal file
View File

@@ -0,0 +1,64 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${DEVTOOLS_INCLUDE_DB_MOVE_SH:-} ]] || return 0
DEVTOOLS_INCLUDE_DB_MOVE_SH=1
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/common.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
set -e
pkgctl_db_move_usage() {
local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [SOURCE_REPO] [TARGET_REPO] [PKGBASE]...
Move packages between binary repositories.
OPTIONS
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} extra-staging extra-testing libfoo libbar
$ ${COMMAND} extra core libfoo libbar
_EOF_
}
pkgctl_db_move() {
local SOURCE_REPO=""
local TARGET_REPO=""
local PKGBASES=()
# option checking
while (( $# )); do
case $1 in
-h|--help)
pkgctl_db_move_usage
exit 0
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
break
;;
esac
done
if (( $# < 3 )); then
pkgctl_db_move_usage
exit 1
fi
SOURCE_REPO=$1
TARGET_REPO=$2
shift 2
PKGBASES+=("$@")
# shellcheck disable=SC2029
ssh "${PACKAGING_REPO_RELEASE_HOST}" db-move "${SOURCE_REPO}" "${TARGET_REPO}" "${PKGBASES[@]}"
}

69
src/lib/db/remove.sh Normal file
View File

@@ -0,0 +1,69 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${DEVTOOLS_INCLUDE_DB_REMOVE_SH:-} ]] || return 0
DEVTOOLS_INCLUDE_DB_REMOVE_SH=1
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/common.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
set -e
pkgctl_db_remove_usage() {
local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [REPO] [PKGBASE]...
Remove packages from binary repositories.
OPTIONS
-a, --arch Override the architecture (disables auto-detection)
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} core-testing libfoo libbar
$ ${COMMAND} --arch x86_64 core libyay
_EOF_
}
pkgctl_db_remove() {
local REPO=""
local ARCH=any
local PKGBASES=()
# option checking
while (( $# )); do
case $1 in
-h|--help)
pkgctl_db_remove_usage
exit 0
;;
-a|--arch)
(( $# <= 1 )) && die "missing argument for %s" "$1"
ARCH=$2
shift 2
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
break
;;
esac
done
if (( $# < 2 )); then
pkgctl_db_remove_usage
exit 1
fi
REPO=$1
shift
PKGBASES+=("$@")
# shellcheck disable=SC2029
ssh "${PACKAGING_REPO_RELEASE_HOST}" db-remove "${REPO}" "${ARCH}" "${PKGBASES[@]}"
}

46
src/lib/db/update.sh Normal file
View File

@@ -0,0 +1,46 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${DEVTOOLS_INCLUDE_DB_UPDATE_SH:-} ]] || return 0
DEVTOOLS_INCLUDE_DB_UPDATE_SH=1
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/common.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
set -e
pkgctl_db_update_usage() {
local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS]
Update the binary repository as final release step for packages that
have been transfered and staged on ${PACKAGING_REPO_RELEASE_HOST}.
OPTIONS
-h, --help Show this help text
EXAMPLES
$ ${COMMAND}
_EOF_
}
pkgctl_db_update() {
# option checking
while (( $# )); do
case $1 in
-h|--help)
pkgctl_db_update_usage
exit 0
;;
*)
die "invalid argument: %s" "$1"
;;
esac
done
ssh "${PACKAGING_REPO_RELEASE_HOST}" db-update
}

167
src/lib/release.sh Normal file
View File

@@ -0,0 +1,167 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${DEVTOOLS_INCLUDE_RELEASE_SH:-} ]] || return 0
DEVTOOLS_INCLUDE_RELEASE_SH=1
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/db/update.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/db/update.sh
# shellcheck source=src/lib/util/pacman.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/pacman.sh
# shellcheck source=src/lib/valid-repos.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-repos.sh
source /usr/share/makepkg/util/util.sh
set -e
pkgctl_release_usage() {
local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [PATH]...
Release step to commit, tag and upload build artifacts
Modified version controlled files will first be staged for commit,
afterwards a Git tag matching the pkgver will be created and finally
all build artifacts will be uploaded.
By default the target pacman repository will be auto-detected by querying
the repo it is currently released in. When initially adding a new package
to the repositories, the target repo must be specified manually.
OPTIONS
-m, --message MSG Use the given <msg> as the commit message
-r, --repo REPO Specify a target repository (disables auto-detection)
-s, --staging Release to the staging counterpart of the auto-detected repo
-t, --testing Release to the testing counterpart of the auto-detected repo
-u, --db-update Automatically update the pacman database after uploading
-h, --help Show this help text
EXAMPLES
$ ${COMMAND}
$ ${COMMAND} --repo core-testing --message 'libyay 0.42 rebuild' libfoo libbar
$ ${COMMAND} --staging --db-update libfoo
_EOF_
}
pkgctl_release_check_option_group() {
local option=$1
local repo=$2
local testing=$3
local staging=$4
if [[ -n "${repo}" ]] || (( testing )) || (( staging )); then
die "The argument '%s' cannot be used with one or more of the other specified arguments" "${option}"
exit 1
fi
return 0
}
pkgctl_release() {
if (( $# < 1 )) && [[ ! -f PKGBUILD ]]; then
pkgctl_release_usage
exit 1
fi
local MESSAGE=""
local PKGBASES=()
local REPO=""
local TESTING=0
local STAGING=0
local DB_UPDATE=0
local path pkgbase pkgnames repo repos
# option checking
while (( $# )); do
case $1 in
-h|--help)
pkgctl_release_usage
exit 0
;;
-m|--message)
(( $# <= 1 )) && die "missing argument for %s" "$1"
MESSAGE=$2
shift 2
;;
-r|--repo)
(( $# <= 1 )) && die "missing argument for %s" "$1"
pkgctl_release_check_option_group '--repo' "${REPO}" "${TESTING}" "${STAGING}"
REPO=$2
shift 2
;;
-s|--staging)
pkgctl_release_check_option_group '--staging' "${REPO}" "${TESTING}" "${STAGING}"
STAGING=1
shift
;;
-t|--testing)
pkgctl_release_check_option_group '--testing' "${REPO}" "${TESTING}" "${STAGING}"
TESTING=1
shift
;;
-u|--db-update)
DB_UPDATE=1
shift
;;
-*)
die "invalid option: %s" "$1"
;;
*)
PKGBASES+=("$@")
break
;;
esac
done
# Resolve package from current working directory
if (( 0 == ${#PKGBASES[@]} )); then
PKGBASES=("$PWD")
fi
# Update pacman cache for auto-detection
if [[ -z ${REPO} ]]; then
update_pacman_repo_cache
# Check valid repos if not resolved dynamically
elif ! in_array "${REPO}" "${_repos[@]}"; then
die "Invalid repository target: %s" "${REPO}"
fi
for path in "${PKGBASES[@]}"; do
pushd "${path}" >/dev/null
pkgbase=$(basename "${path}")
if [[ -n ${REPO} ]]; then
repo=${REPO}
else
if ! repo=$(get_pacman_repo_from_pkgbuild PKGBUILD); then
die 'Failed to get pacman repo'
fi
if [[ -z "${repo}" ]]; then
die 'Unknown repo, please specify --repo for new packages'
fi
fi
if (( TESTING )); then
repo="${repo}-testing"
elif (( STAGING )); then
repo="${repo}-staging"
elif [[ $repo == core ]]; then
repo="${repo}-testing"
fi
msg "Releasing ${pkgbase} to ${repo}"
commitpkg "${repo}" "${MESSAGE}"
unset repo
popd >/dev/null
done
if (( DB_UPDATE )); then
# shellcheck disable=2119
pkgctl_db_update
fi
}

110
src/lib/repo.sh Normal file
View File

@@ -0,0 +1,110 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${DEVTOOLS_INCLUDE_REPO_SH:-} ]] || return 0
DEVTOOLS_INCLUDE_REPO_SH=1
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
set -e
pkgctl_repo_usage() {
local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [COMMAND] [OPTIONS]
Manage Git packaging repositories and helps with their configuration
according to distro specs.
Git author information and the used signing key is set up from
makepkg.conf read from any valid location like /etc or XDG_CONFIG_HOME.
The configure command can be used to synchronize the distro specs and
makepkg.conf settings for previously cloned repositories.
The unprivileged option can be used for cloning packaging repositories
without SSH access using read-only HTTPS.
COMMANDS
clone Clone a package repository
configure Configure a clone according to distro specs
create Create a new GitLab package repository
switch Switch a package repository to a specified version
web Open the packaging repository's website
OPTIONS
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} clone libfoo linux libbar
$ ${COMMAND} clone --maintainer mynickname
$ ${COMMAND} configure *
$ ${COMMAND} create libfoo
$ ${COMMAND} switch 2:1.19.5-1 libfoo
$ ${COMMAND} web linux
_EOF_
}
pkgctl_repo() {
if (( $# < 1 )); then
pkgctl_repo_usage
exit 0
fi
# option checking
while (( $# )); do
case $1 in
-h|--help)
pkgctl_repo_usage
exit 0
;;
clone)
_DEVTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/repo/clone.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/repo/clone.sh
pkgctl_repo_clone "$@"
exit 0
;;
configure)
_DEVTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/repo/configure.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/repo/configure.sh
pkgctl_repo_configure "$@"
exit 0
;;
create)
_DEVTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/repo/create.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/repo/create.sh
pkgctl_repo_create "$@"
exit 0
;;
switch)
_DEVTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/repo/switch.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/repo/switch.sh
pkgctl_repo_switch "$@"
exit 0
;;
web)
_DEVTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/repo/web.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/repo/web.sh
pkgctl_repo_web "$@"
exit 0
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
die "invalid command: %s" "$1"
;;
esac
done
}

199
src/lib/repo/clone.sh Normal file
View File

@@ -0,0 +1,199 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${DEVTOOLS_INCLUDE_REPO_CLONE_SH:-} ]] || return 0
DEVTOOLS_INCLUDE_REPO_CLONE_SH=1
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/common.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
# shellcheck source=src/lib/api/gitlab.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/api/gitlab.sh
# shellcheck source=src/lib/repo/configure.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/repo/configure.sh
source /usr/share/makepkg/util/message.sh
set -e
pkgctl_repo_clone_usage() {
local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
Clone Git packaging repositories from the canonical namespace.
The configure command is subsequently invoked to synchronize the distro
specs and makepkg.conf settings. The protocol option can be used
for cloning packaging repositories without SSH access using read-only
HTTPS.
OPTIONS
-m, --maintainer=NAME Clone all packages of the named maintainer
--protocol https Clone the repository over https
--switch VERSION Switch the current working tree to a specified version
--universe Clone all existing packages, useful for cache warming
-j, --jobs N Run up to N jobs in parallel (default: $(nproc))
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} libfoo linux libbar
$ ${COMMAND} --maintainer mynickname
$ ${COMMAND} --switch 1:1.0-2 libfoo
_EOF_
}
pkgctl_repo_clone() {
if (( $# < 1 )); then
pkgctl_repo_clone_usage
exit 0
fi
# options
local GIT_REPO_BASE_URL=${GIT_PACKAGING_URL_SSH}
local CLONE_ALL=0
local MAINTAINER=
local VERSION=
local CONFIGURE_OPTIONS=()
local jobs=
jobs=$(nproc)
# variables
local command=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
local project_path
while (( $# )); do
case $1 in
-h|--help)
pkgctl_repo_clone_usage
exit 0
;;
--protocol=https)
GIT_REPO_BASE_URL=${GIT_PACKAGING_URL_HTTPS}
CONFIGURE_OPTIONS+=("$1")
shift
;;
--protocol)
(( $# <= 1 )) && die "missing argument for %s" "$1"
if [[ $2 == https ]]; then
GIT_REPO_BASE_URL=${GIT_PACKAGING_URL_HTTPS}
else
die "unsupported protocol: %s" "$2"
fi
CONFIGURE_OPTIONS+=("$1" "$2")
shift 2
;;
-m|--maintainer)
(( $# <= 1 )) && die "missing argument for %s" "$1"
MAINTAINER="$2"
shift 2
;;
--maintainer=*)
MAINTAINER="${1#*=}"
shift
;;
--switch)
(( $# <= 1 )) && die "missing argument for %s" "$1"
# shellcheck source=src/lib/repo/switch.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/repo/switch.sh
VERSION="$2"
shift 2
;;
--switch=*)
# shellcheck source=src/lib/repo/switch.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/repo/switch.sh
VERSION="${1#*=}"
shift
;;
--universe)
CLONE_ALL=1
shift
;;
-j|--jobs)
(( $# <= 1 )) && die "missing argument for %s" "$1"
jobs=$2
shift 2
;;
--)
shift
break
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
pkgbases=("$@")
break
;;
esac
done
# Query packages of a maintainer
if [[ -n ${MAINTAINER} ]]; then
stat_busy "Query packages"
max_pages=$(curl --silent --location --fail --retry 3 --retry-delay 3 "https://archlinux.org/packages/search/json/?sort=name&maintainer=${MAINTAINER}" | jq -r '.num_pages')
if [[ ! ${max_pages} =~ ([[:digit:]]) ]]; then
stat_done
warning "found no packages for maintainer ${MAINTAINER}"
exit 0
fi
mapfile -t pkgbases < <(for page in $(seq "${max_pages}"); do
curl --silent --location --fail --retry 3 --retry-delay 3 "https://archlinux.org/packages/search/json/?sort=name&maintainer=${MAINTAINER}&page=${page}" | jq -r '.results[].pkgbase'
stat_progress
done | sort --unique)
stat_done
fi
# Query all released packages
if (( CLONE_ALL )); then
stat_busy "Query all released packages"
max_pages=$(curl --silent --location --fail --retry 3 --retry-delay 3 "https://archlinux.org/packages/search/json/?sort=name" | jq -r '.num_pages')
if [[ ! ${max_pages} =~ ([[:digit:]]) ]]; then
stat_done
die "failed to query packages"
fi
mapfile -t pkgbases < <(for page in $(seq "${max_pages}"); do
curl --silent --location --fail --retry 3 --retry-delay 3 "https://archlinux.org/packages/search/json/?sort=name&page=${page}" | jq -r '.results[].pkgbase'
stat_progress
done | sort --unique)
stat_done
fi
# parallelization
if [[ ${jobs} != 1 ]] && (( ${#pkgbases[@]} > 1 )); then
# force colors in parallel if parent process is colorized
if [[ -n ${BOLD} ]]; then
export DEVTOOLS_COLOR=always
fi
# assign command options
if [[ -n "${VERSION}" ]]; then
command+=" --switch '${VERSION}'"
fi
if ! parallel --bar --jobs "${jobs}" "${command}" ::: "${pkgbases[@]}"; then
die 'Failed to clone some packages, please check the output'
exit 1
fi
exit 0
fi
for pkgbase in "${pkgbases[@]}"; do
if [[ ! -d ${pkgbase} ]]; then
msg "Cloning ${pkgbase} ..."
project_path=$(gitlab_project_name_to_path "${pkgbase}")
remote_url="${GIT_REPO_BASE_URL}/${project_path}.git"
if ! git clone --origin origin "${remote_url}" "${pkgbase}"; then
die 'failed to clone %s' "${pkgbase}"
fi
else
warning "Skip cloning ${pkgbase}: Directory exists"
fi
pkgctl_repo_configure "${CONFIGURE_OPTIONS[@]}" "${pkgbase}"
if [[ -n "${VERSION}" ]]; then
pkgctl_repo_switch "${VERSION}" "${pkgbase}"
fi
done
}

259
src/lib/repo/configure.sh Normal file
View File

@@ -0,0 +1,259 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${DEVTOOLS_INCLUDE_REPO_CONFIGURE_SH:-} ]] || return 0
DEVTOOLS_INCLUDE_REPO_CONFIGURE_SH=1
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/common.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
# shellcheck source=src/lib/api/gitlab.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/api/gitlab.sh
source /usr/share/makepkg/util/config.sh
source /usr/share/makepkg/util/message.sh
set -e
pkgctl_repo_configure_usage() {
local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [PATH]...
Configure Git packaging repositories according to distro specs and
makepkg.conf settings.
Git author information and the used signing key is set up from
makepkg.conf read from any valid location like /etc or XDG_CONFIG_HOME.
The remote protocol is automatically determined from the author email
address by choosing SSH for all official packager identities and
read-only HTTPS otherwise.
OPTIONS
--protocol https Configure remote url to use https
-j, --jobs N Run up to N jobs in parallel (default: $(nproc))
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} configure *
_EOF_
}
get_packager_name() {
local packager=$1
local packager_pattern="(.+) <(.+@.+)>"
local name
if [[ ! $packager =~ $packager_pattern ]]; then
return 1
fi
name=$(echo "${packager}"|sed -E "s/${packager_pattern}/\1/")
printf "%s" "${name}"
}
get_packager_email() {
local packager=$1
local packager_pattern="(.+) <(.+@.+)>"
local email
if [[ ! $packager =~ $packager_pattern ]]; then
return 1
fi
email=$(echo "${packager}"|sed -E "s/${packager_pattern}/\2/")
printf "%s" "${email}"
}
is_packager_name_valid() {
local packager_name=$1
if [[ -z ${packager_name} ]]; then
return 1
elif [[ ${packager_name} == "John Doe" ]]; then
return 1
elif [[ ${packager_name} == "Unknown Packager" ]]; then
return 1
fi
return 0
}
is_packager_email_official() {
local packager_email=$1
if [[ -z ${packager_email} ]]; then
return 1
elif [[ $packager_email =~ .+@archlinux.org ]]; then
return 0
fi
return 1
}
pkgctl_repo_configure() {
# options
local GIT_REPO_BASE_URL=${GIT_PACKAGING_URL_HTTPS}
local official=0
local proto=https
local proto_force=0
local jobs=
jobs=$(nproc)
local paths=()
# variables
local -r command=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
local path realpath pkgbase remote_url project_path
local PACKAGER GPGKEY packager_name packager_email
while (( $# )); do
case $1 in
-h|--help)
pkgctl_repo_configure_usage
exit 0
;;
--protocol=https)
proto_force=1
shift
;;
--protocol)
(( $# <= 1 )) && die "missing argument for %s" "$1"
if [[ $2 == https ]]; then
proto_force=1
else
die "unsupported protocol: %s" "$2"
fi
shift 2
;;
-j|--jobs)
(( $# <= 1 )) && die "missing argument for %s" "$1"
jobs=$2
shift 2
;;
--)
shift
break
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
paths=("$@")
break
;;
esac
done
# check if invoked without any path from within a packaging repo
if (( ${#paths[@]} == 0 )); then
if [[ -f PKGBUILD ]]; then
paths=(".")
else
pkgctl_repo_configure_usage
exit 1
fi
fi
# Load makepkg.conf variables to be available for packager identity
msg "Collecting packager identity from makepkg.conf"
# shellcheck disable=2119
load_makepkg_config
if [[ -n ${PACKAGER} ]]; then
if ! packager_name=$(get_packager_name "${PACKAGER}") || \
! packager_email=$(get_packager_email "${PACKAGER}"); then
die "invalid PACKAGER format '${PACKAGER}' in makepkg.conf"
fi
if ! is_packager_name_valid "${packager_name}"; then
die "invalid PACKAGER '${PACKAGER}' in makepkg.conf"
fi
if is_packager_email_official "${packager_email}"; then
official=1
if (( ! proto_force )); then
proto=ssh
GIT_REPO_BASE_URL=${GIT_PACKAGING_URL_SSH}
fi
fi
fi
msg2 "name : ${packager_name:-${YELLOW}undefined${ALL_OFF}}"
msg2 "email : ${packager_email:-${YELLOW}undefined${ALL_OFF}}"
msg2 "gpg-key : ${GPGKEY:-${YELLOW}undefined${ALL_OFF}}"
if [[ ${proto} == ssh ]]; then
msg2 "protocol: ${GREEN}${proto}${ALL_OFF}"
else
msg2 "protocol: ${YELLOW}${proto}${ALL_OFF}"
fi
# parallelization
if [[ ${jobs} != 1 ]] && (( ${#paths[@]} > 1 )); then
if [[ -n ${BOLD} ]]; then
export DEVTOOLS_COLOR=always
fi
if ! parallel --bar --jobs "${jobs}" "${command}" ::: "${paths[@]}"; then
die 'Failed to configure some packages, please check the output'
exit 1
fi
exit 0
fi
for path in "${paths[@]}"; do
if ! realpath=$(realpath -e "${path}"); then
die "No such directory: ${path}"
fi
pkgbase=$(basename "${realpath}")
pkgbase=${pkgbase%.git}
msg "Configuring ${pkgbase}"
if [[ ! -d "${path}/.git" ]]; then
die "Not a Git repository: ${path}"
fi
pushd "${path}" >/dev/null
project_path=$(gitlab_project_name_to_path "${pkgbase}")
remote_url="${GIT_REPO_BASE_URL}/${project_path}.git"
if ! git remote add origin "${remote_url}" &>/dev/null; then
git remote set-url origin "${remote_url}"
fi
# move the master branch to main
if [[ $(git symbolic-ref --quiet --short HEAD) == master ]]; then
git branch --move main
git config branch.main.merge refs/heads/main
fi
git config devtools.version "${GIT_REPO_SPEC_VERSION}"
git config pull.rebase true
git config branch.autoSetupRebase always
git config branch.main.remote origin
git config branch.main.rebase true
git config transfer.fsckobjects true
git config fetch.fsckobjects true
git config receive.fsckobjects true
# setup author identity
if [[ -n ${packager_name} ]]; then
git config user.name "${packager_name}"
git config user.email "${packager_email}"
fi
# force gpg for official packagers
if (( official )); then
git config commit.gpgsign true
fi
# set custom pgp key from makepkg.conf
if [[ -n $GPGKEY ]]; then
git config commit.gpgsign true
git config user.signingKey "${GPGKEY}"
fi
if ! git ls-remote origin &>/dev/null; then
warning "configured remote origin may not exist, run:"
msg2 "pkgctl repo create ${pkgbase}"
fi
popd >/dev/null
done
}

113
src/lib/repo/create.sh Normal file
View File

@@ -0,0 +1,113 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${DEVTOOLS_INCLUDE_REPO_CREATE_SH:-} ]] || return 0
DEVTOOLS_INCLUDE_REPO_CREATE_SH=1
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/common.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
# shellcheck source=src/lib/api/gitlab.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/api/gitlab.sh
# shellcheck source=src/lib/repo/clone.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/repo/clone.sh
# shellcheck source=src/lib/repo/configure.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/repo/configure.sh
set -e
pkgctl_repo_create_usage() {
local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
Create a new Git packaging repository in the canonical GitLab namespace.
This command requires a valid GitLab API authentication. To setup a new
GitLab token or check the currently configured one please consult the
'auth' subcommand for further instructions.
If invoked without a parameter, try to create a packaging repository
based on the PKGBUILD from the current working directory and configure
the local repository afterwards.
OPTIONS
-c, --clone Clone the Git repository after creation
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} libfoo
_EOF_
}
pkgctl_repo_create() {
# options
local pkgbases=()
local pkgbase
local clone=0
local configure=0
# variables
local path
while (( $# )); do
case $1 in
-h|--help)
pkgctl_repo_create_usage
exit 0
;;
-c|--clone)
clone=1
shift
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
pkgbases=("$@")
break
;;
esac
done
# check if invoked without any path from within a packaging repo
if (( ${#pkgbases[@]} == 0 )); then
if [[ -f PKGBUILD ]]; then
if ! path=$(realpath -e .); then
die "failed to read path from current directory"
fi
pkgbases=("$(basename "${path}")")
clone=0
configure=1
else
pkgctl_repo_create_usage
exit 1
fi
fi
# create projects
for pkgbase in "${pkgbases[@]}"; do
if ! gitlab_api_create_project "${pkgbase}" >/dev/null; then
die "failed to create project: ${pkgbase}"
fi
msg_success "Successfully created ${pkgbase}"
if (( clone )); then
pkgctl_repo_clone "${pkgbase}"
elif (( configure )); then
pkgctl_repo_configure
fi
done
# some convenience hints if not in auto clone/configure mode
if (( ! clone )) && (( ! configure )); then
cat <<- _EOF_
For new clones:
$(msg2 "pkgctl repo clone ${pkgbases[*]}")
For existing clones:
$(msg2 "pkgctl repo configure ${pkgbases[*]}")
_EOF_
fi
}

Some files were not shown because too many files have changed in this diff Show More