mirror of
https://gitlab.archlinux.org/pacman/pacman.git
synced 2025-11-07 19:14:40 +01:00
Compare commits
14 Commits
morganamil
...
v5.1.3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1bf7672343 | ||
|
|
9702703633 | ||
|
|
0b36d87817 | ||
|
|
f8c73464c9 | ||
|
|
48a6adee3e | ||
|
|
cfa1e8b5e2 | ||
|
|
3a88fcb191 | ||
|
|
2a7bdd3e3a | ||
|
|
b39a62f575 | ||
|
|
cad8fe2fbf | ||
|
|
0dbb945387 | ||
|
|
519685e4b1 | ||
|
|
4fc7c1d41e | ||
|
|
5e81518ecb |
@@ -16,9 +16,5 @@ indent_style = tab
|
|||||||
[{NEWS,HACKING}]
|
[{NEWS,HACKING}]
|
||||||
indent_style = space
|
indent_style = space
|
||||||
|
|
||||||
[meson.build]
|
|
||||||
indent_style = space
|
|
||||||
indent_size = 2
|
|
||||||
|
|
||||||
[*.py]
|
[*.py]
|
||||||
indent_style = space
|
indent_style = space
|
||||||
|
|||||||
21
.gitignore
vendored
21
.gitignore
vendored
@@ -1,3 +1,24 @@
|
|||||||
*~
|
*~
|
||||||
*.o
|
*.o
|
||||||
|
ABOUT-NLS
|
||||||
|
aclocal.m4
|
||||||
|
autom4te.cache
|
||||||
|
config.h
|
||||||
|
config.h.in
|
||||||
|
config.log
|
||||||
|
config.status
|
||||||
|
config.status.lineno
|
||||||
|
configure
|
||||||
|
configure.lineno
|
||||||
|
cov-int
|
||||||
|
cscope.in.out
|
||||||
|
cscope.out
|
||||||
|
cscope.po.out
|
||||||
|
intl
|
||||||
|
libtool
|
||||||
|
Makefile
|
||||||
|
Makefile.in
|
||||||
pacman-*.tar.gz
|
pacman-*.tar.gz
|
||||||
|
root
|
||||||
|
stamp-h1
|
||||||
|
tags
|
||||||
|
|||||||
119
.gitlab-ci.yml
119
.gitlab-ci.yml
@@ -1,119 +0,0 @@
|
|||||||
variables:
|
|
||||||
MAKEFLAGS: "-j10"
|
|
||||||
VERBOSE: 1
|
|
||||||
|
|
||||||
default:
|
|
||||||
after_script:
|
|
||||||
- build-aux/print-failed-test-output build/meson-logs/testlog.json
|
|
||||||
|
|
||||||
.arch-test:
|
|
||||||
image: archlinux:base-devel
|
|
||||||
before_script:
|
|
||||||
- >
|
|
||||||
pacman -Syu --needed --noconfirm
|
|
||||||
git
|
|
||||||
gpgme libarchive curl
|
|
||||||
python
|
|
||||||
fakeroot fakechroot
|
|
||||||
meson
|
|
||||||
artifacts:
|
|
||||||
when: always
|
|
||||||
paths:
|
|
||||||
- build/meson-logs/meson-log.txt
|
|
||||||
|
|
||||||
arch:
|
|
||||||
extends: .arch-test
|
|
||||||
script:
|
|
||||||
- meson setup build
|
|
||||||
- ninja -C build
|
|
||||||
- fakechroot meson test -C build
|
|
||||||
|
|
||||||
arch-debug:
|
|
||||||
extends: .arch-test
|
|
||||||
script:
|
|
||||||
- meson setup --buildtype=debug --werror build
|
|
||||||
- ninja -C build
|
|
||||||
- fakechroot meson test -C build
|
|
||||||
|
|
||||||
arch-docs:
|
|
||||||
extends: .arch-test
|
|
||||||
script:
|
|
||||||
- pacman -Syu --needed --noconfirm asciidoc
|
|
||||||
- meson setup -Ddoc=enabled build
|
|
||||||
- ninja -C build
|
|
||||||
|
|
||||||
arch-clang:
|
|
||||||
extends: .arch-test
|
|
||||||
script:
|
|
||||||
- pacman -Syu --needed --noconfirm clang
|
|
||||||
- CC=clang meson setup build
|
|
||||||
- ninja -C build
|
|
||||||
- fakechroot meson test -C build
|
|
||||||
|
|
||||||
#arch-valgrind:
|
|
||||||
# extends: .arch-test
|
|
||||||
# script:
|
|
||||||
# - pacman -Syu --needed --noconfirm valgrind
|
|
||||||
# - pacman -U --noconfirm https://geo.mirror.pkgbuild.com/core-debug/os/x86_64/glibc-debug-$(pacman -S --print-format %v glibc)-x86_64.pkg.tar.zst
|
|
||||||
# - meson setup build
|
|
||||||
# - ninja -C build
|
|
||||||
# - PACTEST_VALGRIND=1 fakechroot meson test -C build
|
|
||||||
|
|
||||||
arch-nettle:
|
|
||||||
extends: .arch-test
|
|
||||||
script:
|
|
||||||
- meson setup -Dcrypto=nettle --buildtype=debug build
|
|
||||||
- ninja -C build
|
|
||||||
- fakechroot meson test -C build
|
|
||||||
|
|
||||||
arch-no-gpg:
|
|
||||||
extends: .arch-test
|
|
||||||
script:
|
|
||||||
- meson setup -Dgpgme=disabled --buildtype=debug build
|
|
||||||
- ninja -C build
|
|
||||||
- fakechroot meson test -C build
|
|
||||||
|
|
||||||
arch-no-curl:
|
|
||||||
extends: .arch-test
|
|
||||||
script:
|
|
||||||
- meson setup -Dcurl=disabled --buildtype=debug build
|
|
||||||
- ninja -C build
|
|
||||||
- fakechroot meson test -C build
|
|
||||||
|
|
||||||
arch-no-nls:
|
|
||||||
extends: .arch-test
|
|
||||||
script:
|
|
||||||
- meson setup -Di18n=false --buildtype=debug build
|
|
||||||
- ninja -C build
|
|
||||||
- fakechroot meson test -C build
|
|
||||||
|
|
||||||
debian:
|
|
||||||
image: debian:bullseye
|
|
||||||
before_script:
|
|
||||||
- apt update
|
|
||||||
- >
|
|
||||||
apt -y install --no-install-recommends
|
|
||||||
git pkg-config meson gcc libtool
|
|
||||||
libgpgme-dev libarchive-dev libcurl4-openssl-dev libssl-dev curl
|
|
||||||
gettext python3 python3-setuptools dash gawk ca-certificates
|
|
||||||
fakeroot fakechroot
|
|
||||||
script:
|
|
||||||
- meson setup --buildtype=debug build
|
|
||||||
- ninja -C build
|
|
||||||
- fakechroot meson test -C build
|
|
||||||
|
|
||||||
fedora:
|
|
||||||
image: fedora
|
|
||||||
before_script:
|
|
||||||
- >
|
|
||||||
dnf -y install
|
|
||||||
git findutils patch sed
|
|
||||||
meson gcc libtool bsdtar
|
|
||||||
gpgme-devel libarchive-devel libcurl-devel openssl-devel gettext-devel
|
|
||||||
asciidoc python3 dash gawk
|
|
||||||
fakeroot fakechroot
|
|
||||||
perl-Module-Load-Conditional
|
|
||||||
script:
|
|
||||||
- meson setup --buildtype=debug build
|
|
||||||
- ninja -C build
|
|
||||||
- fakechroot meson test -C build
|
|
||||||
1
.mailmap
1
.mailmap
@@ -20,7 +20,6 @@ Juan Pablo González Tognarelli <lord_jotape@yahoo.com.ar> <jotapesan@gmail.com>
|
|||||||
Manuel Tortosa <manutortosa@chakra-project.org> <manutortosa@gmail.com>
|
Manuel Tortosa <manutortosa@chakra-project.org> <manutortosa@gmail.com>
|
||||||
Marc - A. Dahlhaus <mad@wol.de>
|
Marc - A. Dahlhaus <mad@wol.de>
|
||||||
Matthias Gorissen <matthias@archlinux.de> <siquame@web.de>
|
Matthias Gorissen <matthias@archlinux.de> <siquame@web.de>
|
||||||
morganamilo <morganamilo@archlinux.org> <morganamilo@gmail.com>
|
|
||||||
Laszlo Papp <djszapi@archlinux.us> <djszapi2@gmail.com>
|
Laszlo Papp <djszapi@archlinux.us> <djszapi2@gmail.com>
|
||||||
Nagy Gabor <ngaba@bibl.u-szeged.hu> <ngaba@petra.hos.u-szeged.hu>
|
Nagy Gabor <ngaba@bibl.u-szeged.hu> <ngaba@petra.hos.u-szeged.hu>
|
||||||
Nagy Gabor <ngaba@bibl.u-szeged.hu> <ngaba at bibl.u-szeged.hu>
|
Nagy Gabor <ngaba@bibl.u-szeged.hu> <ngaba at bibl.u-szeged.hu>
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
[main]
|
[main]
|
||||||
host = https://www.transifex.com
|
host = https://www.transifex.com
|
||||||
|
|
||||||
[o:toofishes:p:archlinux-pacman:r:libalpm-pot]
|
[archlinux-pacman.libalpm-pot]
|
||||||
file_filter = lib/libalpm/po/<lang>.po
|
file_filter = lib/libalpm/po/<lang>.po
|
||||||
source_file = lib/libalpm/po/libalpm.pot
|
source_file = lib/libalpm/po/libalpm.pot
|
||||||
source_lang = en
|
source_lang = en
|
||||||
|
|
||||||
[o:toofishes:p:archlinux-pacman:r:pacman-pot]
|
[archlinux-pacman.pacman-pot]
|
||||||
file_filter = src/pacman/po/<lang>.po
|
file_filter = src/pacman/po/<lang>.po
|
||||||
source_file = src/pacman/po/pacman.pot
|
source_file = src/pacman/po/pacman.pot
|
||||||
source_lang = en
|
source_lang = en
|
||||||
|
|
||||||
[o:toofishes:p:archlinux-pacman:r:pacman-scripts-pot]
|
[archlinux-pacman.pacman-scripts-pot]
|
||||||
file_filter = scripts/po/<lang>.po
|
file_filter = scripts/po/<lang>.po
|
||||||
source_file = scripts/po/pacman-scripts.pot
|
source_file = scripts/po/pacman-scripts.pot
|
||||||
source_lang = en
|
source_lang = en
|
||||||
|
|||||||
13
HACKING
13
HACKING
@@ -176,3 +176,16 @@ For pacman:
|
|||||||
-------------------------------------------
|
-------------------------------------------
|
||||||
|
|
||||||
Never directly include config.h. This will always be added via Makefiles.
|
Never directly include config.h. This will always be added via Makefiles.
|
||||||
|
|
||||||
|
GDB and Valgrind Usage
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
When using GDB or valgrind on pacman, you will want to run it on the actual
|
||||||
|
binary rather than the shell script wrapper produced by libtool. The actual
|
||||||
|
binary lives at `src/pacman/.libs/lt-pacman`, and will exist after running
|
||||||
|
`./src/pacman/pacman` at least once.
|
||||||
|
|
||||||
|
For example, to run valgrind:
|
||||||
|
|
||||||
|
./src/pacman/pacman
|
||||||
|
valgrind --leak-check=full -- src/pacman/.libs/lt-pacman -Syu
|
||||||
|
|||||||
370
INSTALL
Normal file
370
INSTALL
Normal file
@@ -0,0 +1,370 @@
|
|||||||
|
Installation Instructions
|
||||||
|
*************************
|
||||||
|
|
||||||
|
Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation,
|
||||||
|
Inc.
|
||||||
|
|
||||||
|
Copying and distribution of this file, with or without modification,
|
||||||
|
are permitted in any medium without royalty provided the copyright
|
||||||
|
notice and this notice are preserved. This file is offered as-is,
|
||||||
|
without warranty of any kind.
|
||||||
|
|
||||||
|
Basic Installation
|
||||||
|
==================
|
||||||
|
|
||||||
|
Briefly, the shell commands `./configure; make; make install' should
|
||||||
|
configure, build, and install this package. The following
|
||||||
|
more-detailed instructions are generic; see the `README' file for
|
||||||
|
instructions specific to this package. Some packages provide this
|
||||||
|
`INSTALL' file but do not implement all of the features documented
|
||||||
|
below. The lack of an optional feature in a given package is not
|
||||||
|
necessarily a bug. More recommendations for GNU packages can be found
|
||||||
|
in *note Makefile Conventions: (standards)Makefile Conventions.
|
||||||
|
|
||||||
|
The `configure' shell script attempts to guess correct values for
|
||||||
|
various system-dependent variables used during compilation. It uses
|
||||||
|
those values to create a `Makefile' in each directory of the package.
|
||||||
|
It may also create one or more `.h' files containing system-dependent
|
||||||
|
definitions. Finally, it creates a shell script `config.status' that
|
||||||
|
you can run in the future to recreate the current configuration, and a
|
||||||
|
file `config.log' containing compiler output (useful mainly for
|
||||||
|
debugging `configure').
|
||||||
|
|
||||||
|
It can also use an optional file (typically called `config.cache'
|
||||||
|
and enabled with `--cache-file=config.cache' or simply `-C') that saves
|
||||||
|
the results of its tests to speed up reconfiguring. Caching is
|
||||||
|
disabled by default to prevent problems with accidental use of stale
|
||||||
|
cache files.
|
||||||
|
|
||||||
|
If you need to do unusual things to compile the package, please try
|
||||||
|
to figure out how `configure' could check whether to do them, and mail
|
||||||
|
diffs or instructions to the address given in the `README' so they can
|
||||||
|
be considered for the next release. If you are using the cache, and at
|
||||||
|
some point `config.cache' contains results you don't want to keep, you
|
||||||
|
may remove or edit it.
|
||||||
|
|
||||||
|
The file `configure.ac' (or `configure.in') is used to create
|
||||||
|
`configure' by a program called `autoconf'. You need `configure.ac' if
|
||||||
|
you want to change it or regenerate `configure' using a newer version
|
||||||
|
of `autoconf'.
|
||||||
|
|
||||||
|
The simplest way to compile this package is:
|
||||||
|
|
||||||
|
1. `cd' to the directory containing the package's source code and type
|
||||||
|
`./configure' to configure the package for your system.
|
||||||
|
|
||||||
|
Running `configure' might take a while. While running, it prints
|
||||||
|
some messages telling which features it is checking for.
|
||||||
|
|
||||||
|
2. Type `make' to compile the package.
|
||||||
|
|
||||||
|
3. Optionally, type `make check' to run any self-tests that come with
|
||||||
|
the package, generally using the just-built uninstalled binaries.
|
||||||
|
|
||||||
|
4. Type `make install' to install the programs and any data files and
|
||||||
|
documentation. When installing into a prefix owned by root, it is
|
||||||
|
recommended that the package be configured and built as a regular
|
||||||
|
user, and only the `make install' phase executed with root
|
||||||
|
privileges.
|
||||||
|
|
||||||
|
5. Optionally, type `make installcheck' to repeat any self-tests, but
|
||||||
|
this time using the binaries in their final installed location.
|
||||||
|
This target does not install anything. Running this target as a
|
||||||
|
regular user, particularly if the prior `make install' required
|
||||||
|
root privileges, verifies that the installation completed
|
||||||
|
correctly.
|
||||||
|
|
||||||
|
6. You can remove the program binaries and object files from the
|
||||||
|
source code directory by typing `make clean'. To also remove the
|
||||||
|
files that `configure' created (so you can compile the package for
|
||||||
|
a different kind of computer), type `make distclean'. There is
|
||||||
|
also a `make maintainer-clean' target, but that is intended mainly
|
||||||
|
for the package's developers. If you use it, you may have to get
|
||||||
|
all sorts of other programs in order to regenerate files that came
|
||||||
|
with the distribution.
|
||||||
|
|
||||||
|
7. Often, you can also type `make uninstall' to remove the installed
|
||||||
|
files again. In practice, not all packages have tested that
|
||||||
|
uninstallation works correctly, even though it is required by the
|
||||||
|
GNU Coding Standards.
|
||||||
|
|
||||||
|
8. Some packages, particularly those that use Automake, provide `make
|
||||||
|
distcheck', which can by used by developers to test that all other
|
||||||
|
targets like `make install' and `make uninstall' work correctly.
|
||||||
|
This target is generally not run by end users.
|
||||||
|
|
||||||
|
Compilers and Options
|
||||||
|
=====================
|
||||||
|
|
||||||
|
Some systems require unusual options for compilation or linking that
|
||||||
|
the `configure' script does not know about. Run `./configure --help'
|
||||||
|
for details on some of the pertinent environment variables.
|
||||||
|
|
||||||
|
You can give `configure' initial values for configuration parameters
|
||||||
|
by setting variables in the command line or in the environment. Here
|
||||||
|
is an example:
|
||||||
|
|
||||||
|
./configure CC=c99 CFLAGS=-g LIBS=-lposix
|
||||||
|
|
||||||
|
*Note Defining Variables::, for more details.
|
||||||
|
|
||||||
|
Compiling For Multiple Architectures
|
||||||
|
====================================
|
||||||
|
|
||||||
|
You can compile the package for more than one kind of computer at the
|
||||||
|
same time, by placing the object files for each architecture in their
|
||||||
|
own directory. To do this, you can use GNU `make'. `cd' to the
|
||||||
|
directory where you want the object files and executables to go and run
|
||||||
|
the `configure' script. `configure' automatically checks for the
|
||||||
|
source code in the directory that `configure' is in and in `..'. This
|
||||||
|
is known as a "VPATH" build.
|
||||||
|
|
||||||
|
With a non-GNU `make', it is safer to compile the package for one
|
||||||
|
architecture at a time in the source code directory. After you have
|
||||||
|
installed the package for one architecture, use `make distclean' before
|
||||||
|
reconfiguring for another architecture.
|
||||||
|
|
||||||
|
On MacOS X 10.5 and later systems, you can create libraries and
|
||||||
|
executables that work on multiple system types--known as "fat" or
|
||||||
|
"universal" binaries--by specifying multiple `-arch' options to the
|
||||||
|
compiler but only a single `-arch' option to the preprocessor. Like
|
||||||
|
this:
|
||||||
|
|
||||||
|
./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
||||||
|
CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
||||||
|
CPP="gcc -E" CXXCPP="g++ -E"
|
||||||
|
|
||||||
|
This is not guaranteed to produce working output in all cases, you
|
||||||
|
may have to build one architecture at a time and combine the results
|
||||||
|
using the `lipo' tool if you have problems.
|
||||||
|
|
||||||
|
Installation Names
|
||||||
|
==================
|
||||||
|
|
||||||
|
By default, `make install' installs the package's commands under
|
||||||
|
`/usr/local/bin', include files under `/usr/local/include', etc. You
|
||||||
|
can specify an installation prefix other than `/usr/local' by giving
|
||||||
|
`configure' the option `--prefix=PREFIX', where PREFIX must be an
|
||||||
|
absolute file name.
|
||||||
|
|
||||||
|
You can specify separate installation prefixes for
|
||||||
|
architecture-specific files and architecture-independent files. If you
|
||||||
|
pass the option `--exec-prefix=PREFIX' to `configure', the package uses
|
||||||
|
PREFIX as the prefix for installing programs and libraries.
|
||||||
|
Documentation and other data files still use the regular prefix.
|
||||||
|
|
||||||
|
In addition, if you use an unusual directory layout you can give
|
||||||
|
options like `--bindir=DIR' to specify different values for particular
|
||||||
|
kinds of files. Run `configure --help' for a list of the directories
|
||||||
|
you can set and what kinds of files go in them. In general, the
|
||||||
|
default for these options is expressed in terms of `${prefix}', so that
|
||||||
|
specifying just `--prefix' will affect all of the other directory
|
||||||
|
specifications that were not explicitly provided.
|
||||||
|
|
||||||
|
The most portable way to affect installation locations is to pass the
|
||||||
|
correct locations to `configure'; however, many packages provide one or
|
||||||
|
both of the following shortcuts of passing variable assignments to the
|
||||||
|
`make install' command line to change installation locations without
|
||||||
|
having to reconfigure or recompile.
|
||||||
|
|
||||||
|
The first method involves providing an override variable for each
|
||||||
|
affected directory. For example, `make install
|
||||||
|
prefix=/alternate/directory' will choose an alternate location for all
|
||||||
|
directory configuration variables that were expressed in terms of
|
||||||
|
`${prefix}'. Any directories that were specified during `configure',
|
||||||
|
but not in terms of `${prefix}', must each be overridden at install
|
||||||
|
time for the entire installation to be relocated. The approach of
|
||||||
|
makefile variable overrides for each directory variable is required by
|
||||||
|
the GNU Coding Standards, and ideally causes no recompilation.
|
||||||
|
However, some platforms have known limitations with the semantics of
|
||||||
|
shared libraries that end up requiring recompilation when using this
|
||||||
|
method, particularly noticeable in packages that use GNU Libtool.
|
||||||
|
|
||||||
|
The second method involves providing the `DESTDIR' variable. For
|
||||||
|
example, `make install DESTDIR=/alternate/directory' will prepend
|
||||||
|
`/alternate/directory' before all installation names. The approach of
|
||||||
|
`DESTDIR' overrides is not required by the GNU Coding Standards, and
|
||||||
|
does not work on platforms that have drive letters. On the other hand,
|
||||||
|
it does better at avoiding recompilation issues, and works well even
|
||||||
|
when some directory options were not specified in terms of `${prefix}'
|
||||||
|
at `configure' time.
|
||||||
|
|
||||||
|
Optional Features
|
||||||
|
=================
|
||||||
|
|
||||||
|
If the package supports it, you can cause programs to be installed
|
||||||
|
with an extra prefix or suffix on their names by giving `configure' the
|
||||||
|
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
|
||||||
|
|
||||||
|
Some packages pay attention to `--enable-FEATURE' options to
|
||||||
|
`configure', where FEATURE indicates an optional part of the package.
|
||||||
|
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
|
||||||
|
is something like `gnu-as' or `x' (for the X Window System). The
|
||||||
|
`README' should mention any `--enable-' and `--with-' options that the
|
||||||
|
package recognizes.
|
||||||
|
|
||||||
|
For packages that use the X Window System, `configure' can usually
|
||||||
|
find the X include and library files automatically, but if it doesn't,
|
||||||
|
you can use the `configure' options `--x-includes=DIR' and
|
||||||
|
`--x-libraries=DIR' to specify their locations.
|
||||||
|
|
||||||
|
Some packages offer the ability to configure how verbose the
|
||||||
|
execution of `make' will be. For these packages, running `./configure
|
||||||
|
--enable-silent-rules' sets the default to minimal output, which can be
|
||||||
|
overridden with `make V=1'; while running `./configure
|
||||||
|
--disable-silent-rules' sets the default to verbose, which can be
|
||||||
|
overridden with `make V=0'.
|
||||||
|
|
||||||
|
Particular systems
|
||||||
|
==================
|
||||||
|
|
||||||
|
On HP-UX, the default C compiler is not ANSI C compatible. If GNU
|
||||||
|
CC is not installed, it is recommended to use the following options in
|
||||||
|
order to use an ANSI C compiler:
|
||||||
|
|
||||||
|
./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
|
||||||
|
|
||||||
|
and if that doesn't work, install pre-built binaries of GCC for HP-UX.
|
||||||
|
|
||||||
|
HP-UX `make' updates targets which have the same time stamps as
|
||||||
|
their prerequisites, which makes it generally unusable when shipped
|
||||||
|
generated files such as `configure' are involved. Use GNU `make'
|
||||||
|
instead.
|
||||||
|
|
||||||
|
On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
|
||||||
|
parse its `<wchar.h>' header file. The option `-nodtk' can be used as
|
||||||
|
a workaround. If GNU CC is not installed, it is therefore recommended
|
||||||
|
to try
|
||||||
|
|
||||||
|
./configure CC="cc"
|
||||||
|
|
||||||
|
and if that doesn't work, try
|
||||||
|
|
||||||
|
./configure CC="cc -nodtk"
|
||||||
|
|
||||||
|
On Solaris, don't put `/usr/ucb' early in your `PATH'. This
|
||||||
|
directory contains several dysfunctional programs; working variants of
|
||||||
|
these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
|
||||||
|
in your `PATH', put it _after_ `/usr/bin'.
|
||||||
|
|
||||||
|
On Haiku, software installed for all users goes in `/boot/common',
|
||||||
|
not `/usr/local'. It is recommended to use the following options:
|
||||||
|
|
||||||
|
./configure --prefix=/boot/common
|
||||||
|
|
||||||
|
Specifying the System Type
|
||||||
|
==========================
|
||||||
|
|
||||||
|
There may be some features `configure' cannot figure out
|
||||||
|
automatically, but needs to determine by the type of machine the package
|
||||||
|
will run on. Usually, assuming the package is built to be run on the
|
||||||
|
_same_ architectures, `configure' can figure that out, but if it prints
|
||||||
|
a message saying it cannot guess the machine type, give it the
|
||||||
|
`--build=TYPE' option. TYPE can either be a short name for the system
|
||||||
|
type, such as `sun4', or a canonical name which has the form:
|
||||||
|
|
||||||
|
CPU-COMPANY-SYSTEM
|
||||||
|
|
||||||
|
where SYSTEM can have one of these forms:
|
||||||
|
|
||||||
|
OS
|
||||||
|
KERNEL-OS
|
||||||
|
|
||||||
|
See the file `config.sub' for the possible values of each field. If
|
||||||
|
`config.sub' isn't included in this package, then this package doesn't
|
||||||
|
need to know the machine type.
|
||||||
|
|
||||||
|
If you are _building_ compiler tools for cross-compiling, you should
|
||||||
|
use the option `--target=TYPE' to select the type of system they will
|
||||||
|
produce code for.
|
||||||
|
|
||||||
|
If you want to _use_ a cross compiler, that generates code for a
|
||||||
|
platform different from the build platform, you should specify the
|
||||||
|
"host" platform (i.e., that on which the generated programs will
|
||||||
|
eventually be run) with `--host=TYPE'.
|
||||||
|
|
||||||
|
Sharing Defaults
|
||||||
|
================
|
||||||
|
|
||||||
|
If you want to set default values for `configure' scripts to share,
|
||||||
|
you can create a site shell script called `config.site' that gives
|
||||||
|
default values for variables like `CC', `cache_file', and `prefix'.
|
||||||
|
`configure' looks for `PREFIX/share/config.site' if it exists, then
|
||||||
|
`PREFIX/etc/config.site' if it exists. Or, you can set the
|
||||||
|
`CONFIG_SITE' environment variable to the location of the site script.
|
||||||
|
A warning: not all `configure' scripts look for a site script.
|
||||||
|
|
||||||
|
Defining Variables
|
||||||
|
==================
|
||||||
|
|
||||||
|
Variables not defined in a site shell script can be set in the
|
||||||
|
environment passed to `configure'. However, some packages may run
|
||||||
|
configure again during the build, and the customized values of these
|
||||||
|
variables may be lost. In order to avoid this problem, you should set
|
||||||
|
them in the `configure' command line, using `VAR=value'. For example:
|
||||||
|
|
||||||
|
./configure CC=/usr/local2/bin/gcc
|
||||||
|
|
||||||
|
causes the specified `gcc' to be used as the C compiler (unless it is
|
||||||
|
overridden in the site shell script).
|
||||||
|
|
||||||
|
Unfortunately, this technique does not work for `CONFIG_SHELL' due to
|
||||||
|
an Autoconf limitation. Until the limitation is lifted, you can use
|
||||||
|
this workaround:
|
||||||
|
|
||||||
|
CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
|
||||||
|
|
||||||
|
`configure' Invocation
|
||||||
|
======================
|
||||||
|
|
||||||
|
`configure' recognizes the following options to control how it
|
||||||
|
operates.
|
||||||
|
|
||||||
|
`--help'
|
||||||
|
`-h'
|
||||||
|
Print a summary of all of the options to `configure', and exit.
|
||||||
|
|
||||||
|
`--help=short'
|
||||||
|
`--help=recursive'
|
||||||
|
Print a summary of the options unique to this package's
|
||||||
|
`configure', and exit. The `short' variant lists options used
|
||||||
|
only in the top level, while the `recursive' variant lists options
|
||||||
|
also present in any nested packages.
|
||||||
|
|
||||||
|
`--version'
|
||||||
|
`-V'
|
||||||
|
Print the version of Autoconf used to generate the `configure'
|
||||||
|
script, and exit.
|
||||||
|
|
||||||
|
`--cache-file=FILE'
|
||||||
|
Enable the cache: use and save the results of the tests in FILE,
|
||||||
|
traditionally `config.cache'. FILE defaults to `/dev/null' to
|
||||||
|
disable caching.
|
||||||
|
|
||||||
|
`--config-cache'
|
||||||
|
`-C'
|
||||||
|
Alias for `--cache-file=config.cache'.
|
||||||
|
|
||||||
|
`--quiet'
|
||||||
|
`--silent'
|
||||||
|
`-q'
|
||||||
|
Do not print messages saying which checks are being made. To
|
||||||
|
suppress all normal output, redirect it to `/dev/null' (any error
|
||||||
|
messages will still be shown).
|
||||||
|
|
||||||
|
`--srcdir=DIR'
|
||||||
|
Look for the package's source code in directory DIR. Usually
|
||||||
|
`configure' can determine that directory automatically.
|
||||||
|
|
||||||
|
`--prefix=DIR'
|
||||||
|
Use DIR as the installation prefix. *note Installation Names::
|
||||||
|
for more details, including other options available for fine-tuning
|
||||||
|
the installation locations.
|
||||||
|
|
||||||
|
`--no-create'
|
||||||
|
`-n'
|
||||||
|
Run the configure checks, but stop before creating any output
|
||||||
|
files.
|
||||||
|
|
||||||
|
`configure' also accepts some other, not widely useful, options. Run
|
||||||
|
`configure --help' for more details.
|
||||||
71
Makefile.am
Normal file
71
Makefile.am
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
SUBDIRS = lib/libalpm src/util src/pacman scripts etc test/pacman test/util test/scripts
|
||||||
|
if WANT_DOC
|
||||||
|
SUBDIRS += doc
|
||||||
|
endif
|
||||||
|
|
||||||
|
DIST_SUBDIRS = $(SUBDIRS) src/common
|
||||||
|
|
||||||
|
ACLOCAL_AMFLAGS = -I m4 --install
|
||||||
|
AM_MAKEFLAGS = --no-print-directory
|
||||||
|
|
||||||
|
# Make sure we test and build manpages when doing distcheck
|
||||||
|
DISTCHECK_CONFIGURE_FLAGS = --enable-doc --disable-git-version
|
||||||
|
|
||||||
|
# Some files automatically included, so they aren't specified below:
|
||||||
|
# AUTHORS, COPYING, NEWS, README
|
||||||
|
EXTRA_DIST = HACKING test/tap.sh
|
||||||
|
|
||||||
|
# Sample makepkg prototype files
|
||||||
|
pkgdatadir = ${datadir}/${PACKAGE}
|
||||||
|
dist_pkgdata_DATA = \
|
||||||
|
proto/PKGBUILD.proto \
|
||||||
|
proto/PKGBUILD-split.proto \
|
||||||
|
proto/PKGBUILD-vcs.proto \
|
||||||
|
proto/proto.install
|
||||||
|
|
||||||
|
$(top_srcdir)/test/pacman/tests/TESTS: $(wildcard test/pacman/tests/*.py)
|
||||||
|
@printf "TESTS += %s\n" $^ | LC_ALL=C sort -u > "$@"
|
||||||
|
|
||||||
|
TESTS = test/scripts/parseopts_test.sh \
|
||||||
|
test/scripts/human_to_size_test.sh \
|
||||||
|
test/scripts/makepkg-template_test.sh \
|
||||||
|
test/scripts/pacman-db-upgrade-v9.py \
|
||||||
|
test/util/vercmptest.sh
|
||||||
|
include $(top_srcdir)/test/pacman/tests/TESTS
|
||||||
|
|
||||||
|
TEST_SUITE_LOG = test/test-suite.log
|
||||||
|
TEST_EXTENSIONS = .py
|
||||||
|
AM_TESTS_ENVIRONMENT = \
|
||||||
|
PMTEST_UTIL_DIR=$(top_builddir)/src/util/; export PMTEST_UTIL_DIR; \
|
||||||
|
PMTEST_SCRIPT_DIR=$(top_builddir)/scripts/; export PMTEST_SCRIPT_DIR; \
|
||||||
|
PMTEST_SCRIPTLIB_DIR=$(top_srcdir)/scripts/library/; export PMTEST_SCRIPTLIB_DIR; \
|
||||||
|
PMTEST_LIBMAKEPKG_DIR=$(top_builddir)/scripts/libmakepkg/; export PMTEST_LIBMAKEPKG_DIR;
|
||||||
|
LOG_DRIVER = env AM_TAP_AWK='$(AWK)' $(SHELL) \
|
||||||
|
$(top_srcdir)/build-aux/tap-driver.sh
|
||||||
|
PY_LOG_DRIVER = env AM_TAP_AWK='$(AWK)' $(SHELL) \
|
||||||
|
$(top_srcdir)/build-aux/tap-driver.sh
|
||||||
|
PY_LOG_COMPILER = $(PYTHON) $(top_srcdir)/test/pacman/pactest.py
|
||||||
|
AM_PY_LOG_FLAGS = \
|
||||||
|
--scriptlet-shell $(SCRIPTLET_SHELL) \
|
||||||
|
--ldconfig $(LDCONFIG) \
|
||||||
|
--bindir $(top_builddir)/src/pacman \
|
||||||
|
--bindir $(top_builddir)/scripts
|
||||||
|
|
||||||
|
# create the pacman DB, cache, makepkg-template and system hook directories upon install
|
||||||
|
install-data-local:
|
||||||
|
for dir in "$(DESTDIR)$(localstatedir)/lib/pacman" "$(DESTDIR)$(localstatedir)/cache/pacman/pkg" \
|
||||||
|
"$(DESTDIR)$(datarootdir)/makepkg-template" "$(DESTDIR)$(datarootdir)/libalpm/hooks"; do \
|
||||||
|
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
||||||
|
done
|
||||||
|
|
||||||
|
update-po:
|
||||||
|
$(MAKE) -C lib/libalpm/po update-po
|
||||||
|
$(MAKE) -C scripts/po update-po
|
||||||
|
$(MAKE) -C src/pacman/po update-po
|
||||||
|
|
||||||
|
update-copyright:
|
||||||
|
for file in $(shell sh -c 'git grep -l "Copyright .* Pacman Development" | grep -v "\.po"'); do \
|
||||||
|
sed -i -e "/Copyright (/s/-$(OLD)/-$(NEW)/" -e "/Copyright (/s/ $(OLD)/ $(OLD)-$(NEW)/" "$$file"; \
|
||||||
|
done
|
||||||
|
|
||||||
|
.PHONY: update-po update-copyright
|
||||||
293
NEWS
293
NEWS
@@ -1,266 +1,7 @@
|
|||||||
VERSION DESCRIPTION
|
VERSION DESCRIPTION
|
||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
6.1.0 - Add cache server support
|
5.1.3 - Sanitize file path received from Content-Disposition header
|
||||||
- Improvements to --sysroot option - NOTE: targets to -U are no
|
to fix potential arbitary code execution
|
||||||
longer interpreted relative to sysroot
|
|
||||||
- Add more format specifiers for --print operations
|
|
||||||
- Add extended data field for arbitrary package data
|
|
||||||
- Do not run hooks with --dbonly
|
|
||||||
- Provide more details when encountering file conflicts or
|
|
||||||
corrupt packages
|
|
||||||
- Improved WKD support (FS#73703, FS#73534)
|
|
||||||
- Improved handling of malformed download headers (FS#73704)
|
|
||||||
- Use openssl interfaces for calculating sha256 and md5 sums
|
|
||||||
- Fix multi download bar chomps
|
|
||||||
- makepkg:
|
|
||||||
- Replace libdepends and libprovides with autodeps
|
|
||||||
- Support configuration via makepkg.conf.d drop-ins
|
|
||||||
- Add GITFLAGS environmental variable to customize checkouts
|
|
||||||
- Add -D option to change directory before building
|
|
||||||
- Implement verify() function for custom source verificaton
|
|
||||||
- Add checksum support for git/mercurial/bzr sources
|
|
||||||
- Improved stripping and debug package support
|
|
||||||
- Configurable LTO support
|
|
||||||
- Add source signing PGP keys to package if available
|
|
||||||
- Store "pkgtype" in xdata
|
|
||||||
- Remove md5sum from mtree files
|
|
||||||
- Document MAKEPKG_LIBRARY
|
|
||||||
- repo-add:
|
|
||||||
- Do not include package signature details in the repo. Add
|
|
||||||
the --include-sigs to revert to old behaviour.
|
|
||||||
- Do not add md5sum to the repo database
|
|
||||||
6.0.1 - Prevent download error pages ending up in package files
|
|
||||||
(FS#71083)
|
|
||||||
- Give -U downloads a random .part file name if needed
|
|
||||||
(FS#71464)
|
|
||||||
- Fix downloading signatures with redirecting URLs (FS#71148)
|
|
||||||
- Fix double free when importing PGP keys (FS#71107)
|
|
||||||
- Ensure signature files are named after original file
|
|
||||||
following redirects (FS#71274)
|
|
||||||
- Order downloads by size - largest to smallest (FS#70172)
|
|
||||||
- Fix reproducibility of man pages (FS#71154)
|
|
||||||
- makepkg:
|
|
||||||
- Fix stripping debug symbols with binutils 2.37 (FS#71722)
|
|
||||||
- Export PYTHONHASHSEED for reproducible python packages
|
|
||||||
- pacman-key:
|
|
||||||
- Quieten trust db checks.
|
|
||||||
6.0.0 - internal downloader can retrieve files in parallel (FS#20056)
|
|
||||||
- an additional progress bar is added to track total download
|
|
||||||
progress. This replaces the previous TotalDownload option.
|
|
||||||
- fix download rates becoming negative
|
|
||||||
- skip mirror servers with too many errors (FS#29293)
|
|
||||||
- package signatures are always retrieved even if signature is
|
|
||||||
embedded in repo database or package is in cache (FS#33992)
|
|
||||||
- detached package signatures found in CacheDir can be used to
|
|
||||||
verify packages if signature is not in the database. Also
|
|
||||||
verify packages checksums from repo db when using detached
|
|
||||||
signatures.
|
|
||||||
- add support for multiple 'Architecture' values
|
|
||||||
- -Qkk now validates file checksums in addition to date/size
|
|
||||||
- colored upgrade summary now dulls version numbers for contrast
|
|
||||||
- libalpm frontends can now supply context to callbacks (FS#12721)
|
|
||||||
- support xattr when extracting packages
|
|
||||||
- allow setting --noprogressbar in pacman.conf
|
|
||||||
- fix output alignment for CJK translated text (FS#59229)
|
|
||||||
- fix reading targets from stdin when using --sysroot (FS#68630)
|
|
||||||
- fix deleting signatures for existing databases with -Sc
|
|
||||||
- check for and forbid duplicate download filenames (FS#67850)
|
|
||||||
- -Fx now reports error for invalid regex
|
|
||||||
- remove support for the autotools build system
|
|
||||||
- meson: properly compile internal symbols as hidden
|
|
||||||
- meson: make -uninstalled.pc correct
|
|
||||||
- fix build errors on systems like FreeBSD
|
|
||||||
- makepkg:
|
|
||||||
- add link time optimization support to makepkg
|
|
||||||
- add support for sources using the fossil VCS
|
|
||||||
- allow specifying alternative authentication commands when
|
|
||||||
running pacman as root (FS#32621)
|
|
||||||
- support zstd decompression for sources
|
|
||||||
- strip: fix removing file attributes such as xattr
|
|
||||||
- switch to CRC as default integrity checksum
|
|
||||||
- record $startdir for reproducible builds
|
|
||||||
- record name of build orchestration tool for reproducible builds
|
|
||||||
- fix signing of source packages
|
|
||||||
- add optional argument support to parseopts
|
|
||||||
- reduce dependency on file for detecting ELF files
|
|
||||||
- remove dependency on GNU sed
|
|
||||||
- avoid trailing whitespace in --printsrcinfo output
|
|
||||||
- libprovides: don't provide both versioned and unversioned
|
|
||||||
sonames
|
|
||||||
- don't double-layer distcc on ccache
|
|
||||||
- fix detection of source file names for debug packages with
|
|
||||||
gcc 11
|
|
||||||
- strip: silence warnings emitted by readelf while detecting
|
|
||||||
source filenames
|
|
||||||
- fix use of spaces in source file renaming (FS#70254)
|
|
||||||
- pacman-key:
|
|
||||||
- --refresh-keys queries WKD before keyserver
|
|
||||||
- be less noisy when populating the keyring (FS#64142)
|
|
||||||
- warn about time taken for master key generation
|
|
||||||
- repo-add:
|
|
||||||
- support the same compression methods as makepkg
|
|
||||||
- zsh completion: add pacman-conf support
|
|
||||||
- various documentation updates
|
|
||||||
- after a decade and a half of promising libalpm.3 documentation
|
|
||||||
"once we get around to doing good Doxygen documentation", it
|
|
||||||
has happened!
|
|
||||||
5.2.2 - fix pacman test suite under python 3.8
|
|
||||||
- only prompt to import new keys once in a transaction
|
|
||||||
- fix handling of fully downloaded .part files
|
|
||||||
- increase maximum database size (FS#65197)
|
|
||||||
- fix segfault in alpm_option_set_assumeinstalled
|
|
||||||
- change config parsing warnings to errors to match actual
|
|
||||||
behavior
|
|
||||||
- fix key extraction for signatures with two-octet sub-packet
|
|
||||||
headers
|
|
||||||
- fix documentation typos (FS#67000)
|
|
||||||
- change master signing key to RSA4096
|
|
||||||
- improve error message when building without autoconf-archive
|
|
||||||
- pacman-conf:
|
|
||||||
- allow querying ILoveCandy individually
|
|
||||||
- fix querying NoExtract individually
|
|
||||||
- makepkg:
|
|
||||||
- fix seccmp-related error while stripping binaries (FS#65100)
|
|
||||||
- fix extraction of file:// sources (FS#64648)
|
|
||||||
- allow $pkgname in install and changelog file names (FS#64932)
|
|
||||||
- sort libprovides for reproducibility
|
|
||||||
- strip: don't re-add the same debug source multiple times
|
|
||||||
- error on empty refspecs in git sources
|
|
||||||
- correctly handle missing download clients
|
|
||||||
- fix splitting multi-line error messages across stdout and
|
|
||||||
stderr
|
|
||||||
- handle GPGKEY with spaces (FS#66949)
|
|
||||||
- do not accept public-only keys for signing
|
|
||||||
- repo-add:
|
|
||||||
- handle GPGKEY with spaces (FS#66949)
|
|
||||||
- do not accept public-only keys for signing
|
|
||||||
5.2.1 - fix segfault on importing PGP keys for -U operations
|
|
||||||
- fix distribution of meson files
|
|
||||||
- fix inode command for darwin/bsd
|
|
||||||
- distribute all documentation files
|
|
||||||
- update bash/zsh completion for -F changes, remove --force
|
|
||||||
- makepkg:
|
|
||||||
- fix calculation of package sizes in presence of hardlinks
|
|
||||||
- do not warn about PACKAGER format if not set
|
|
||||||
- only run --clean when a package is built
|
|
||||||
- repo-add:
|
|
||||||
- fix compression of databases with zstd (FS#64213)
|
|
||||||
5.2.0 - completely remove delta support (CVE-2019-18183)
|
|
||||||
- add support to pacman and pacman-key for downloading PGP
|
|
||||||
signing keys using the WKD protocol (FS#63171)
|
|
||||||
- completely remove the --force option
|
|
||||||
- renovate and simplify the UI for -F (FS#47949)
|
|
||||||
- hooks: rename type File to Path, for accuracy
|
|
||||||
- add the meson build system as an alternative to autotools, and
|
|
||||||
distribute it in autotools dist tarballs
|
|
||||||
- switch from system() to exec() when using alternative download
|
|
||||||
agents for XferCommand; this prevents a potential source of
|
|
||||||
shell injection (CVE-2019-18182)
|
|
||||||
- ignore .hook suffix when sorting libalpm hooks
|
|
||||||
- update the minimum requirement of bash to 4.4
|
|
||||||
- scripts: pass on options such as set -x to child processes
|
|
||||||
- show group and installed status during -Fs
|
|
||||||
- user-visible log when validity check fails due to access
|
|
||||||
- port pactest to python3
|
|
||||||
- process --needed before group selection when resolving the
|
|
||||||
dependencies to prompt for (FS#22870)
|
|
||||||
- don't error when a group exists but all packages are ignored
|
|
||||||
- bash completion now completes when it should, and doesn't
|
|
||||||
complete when it shouldn't (FS#59965)
|
|
||||||
- improve error message when gpg support is missing (FS#60880)
|
|
||||||
- don't emit confusing errors when a package is simultaneously
|
|
||||||
replaced and upgraded (FS#50875, FS#55534)
|
|
||||||
- better warning message when skipping duplicate targets
|
|
||||||
(FS#49377)
|
|
||||||
- libalpm: parse {check, make}depends when reading database
|
|
||||||
(FS#60347)
|
|
||||||
- add [ignored] to -Qu output for packages in repos that are not
|
|
||||||
Usage = Upgrade (FS#59854)
|
|
||||||
- prevent 301 redirect loop from hanging libalpm
|
|
||||||
- use standard, consistent units in the download progress
|
|
||||||
(FS#59201)
|
|
||||||
- fix segfault when Usage is specified without a value
|
|
||||||
- include timezones in pacman.log
|
|
||||||
- bash-completion: use POSIX character classes for portability
|
|
||||||
- correctly report a download failiure for 404s
|
|
||||||
- fix handling of signals during SIGSEGV
|
|
||||||
- fix buffer overread in pacman/callback
|
|
||||||
- fix crash when downloading files with a Content-Disposition
|
|
||||||
that has no directory component
|
|
||||||
- pacman-conf, testpkg are now properly localized
|
|
||||||
- when -F returns zero results, set a failing exit code
|
|
||||||
- improve wording for the error message when a package cannot be
|
|
||||||
removed due to dependencies
|
|
||||||
- fix segfaults and other incorrect behavior when using -Qip if
|
|
||||||
pacman was compiled without GPGME support
|
|
||||||
- makepkg:
|
|
||||||
- implement extendable source/signature verification routines
|
|
||||||
within libmakepkg (FS#49076)
|
|
||||||
- if pacman is in use, wait until it is available before
|
|
||||||
continuing (FS#28840)
|
|
||||||
- add support for lzip, lz4 and zst compressed packages
|
|
||||||
(FS#56676, FS#59081)
|
|
||||||
- add new checksum algorithm, b2sum
|
|
||||||
- various improvements to PKGBUILD linting
|
|
||||||
- when signing packages, report package filename on failure
|
|
||||||
- fix pkgver() function not aborting on errors
|
|
||||||
- remove checksum algorithm whirlpoolsum as it has not worked
|
|
||||||
for a long time
|
|
||||||
- reject PKGBUILDs with both split and non-split package
|
|
||||||
functions
|
|
||||||
- send status messages to stderr rather than stdout (FS#17173)
|
|
||||||
- ensure debug buildflags are unset when they are supposed to be
|
|
||||||
- buildenv and executable detection, definitions for the
|
|
||||||
PKGBUILD schema, and makepkg.conf loading are now part of
|
|
||||||
libmakepkg
|
|
||||||
- fix broken check for the fakeroot binary
|
|
||||||
- improve the error message for invalid dependency versioning
|
|
||||||
- add routine for linting $SOURCE_DATE_EPOCH
|
|
||||||
- fix the error code when no PKGBUILD exists
|
|
||||||
- use --unneeded when removing build deps to allow runtime-only
|
|
||||||
deps to work well with makepkg -sir (FS#32723)
|
|
||||||
- compute package sizes correctly across different filesystems
|
|
||||||
- use shared clones for git sources to save space when building
|
|
||||||
- fix reporting of invalid archive extensions
|
|
||||||
- correctly handle hg sources with updates on a non-default
|
|
||||||
branch
|
|
||||||
- install pkg-config file for libmakepkg's library directory
|
|
||||||
- propagate error codes when package failed to sign correctly
|
|
||||||
- be compatible with file 5.37's application/gzip MIME type
|
|
||||||
- forbid non-ASCII pkgname and pkgver (FS#49342)
|
|
||||||
- fix exiting on failure without ensuring dependencies are
|
|
||||||
prompted for removal (FS#63000)
|
|
||||||
- quiet superfluous warnings for missing debug source files for
|
|
||||||
artificial symbols
|
|
||||||
- add routine for linting $PACKAGER to check that it has a
|
|
||||||
valid name and email address, and document the desired format
|
|
||||||
in makepkg.conf(5)
|
|
||||||
- add rust support for *FLAGS and debug-prefix-map
|
|
||||||
- correctly handle a system file command with seccomp enabled
|
|
||||||
(FS#58626)
|
|
||||||
- try to more thoroughly clean up logpipe during unusual exit
|
|
||||||
states such as CTRL-C
|
|
||||||
- when installing packages with -sir, be more robust against
|
|
||||||
conflicting makedepends by always uninstalling them first
|
|
||||||
- fix exit code when removing deps fails
|
|
||||||
- reproducible builds: suppress filesystem-specific archive
|
|
||||||
metadata from built packages as they are not needed
|
|
||||||
- pacman-key:
|
|
||||||
- just accept one file to verify, and enforce detached sigs
|
|
||||||
(FS#52022)
|
|
||||||
- after recent GnuPG updates, ensure the Web of Trust is still
|
|
||||||
used
|
|
||||||
- clean keys during import to reduce size consumed by unusable
|
|
||||||
signatures
|
|
||||||
- repo-add:
|
|
||||||
- add support for zst compressed databases
|
|
||||||
- print the name of the database when extracting
|
|
||||||
- do not infinitely loop on malformed arguments with embedded
|
|
||||||
globs
|
|
||||||
- add option to prevent downgrading (FS#17752)
|
|
||||||
- various documentation updates
|
|
||||||
5.1.3 - Sanitize file name received from Content-Disposition header
|
|
||||||
during -U (CVE-2019-9686)
|
|
||||||
5.1.2 - pacman-conf: add missing DisableDownloadTimeout support
|
5.1.2 - pacman-conf: add missing DisableDownloadTimeout support
|
||||||
- Include version when checking optdepend install status
|
- Include version when checking optdepend install status
|
||||||
during -Qi (FS#60106)
|
during -Qi (FS#60106)
|
||||||
@@ -405,30 +146,12 @@ VERSION DESCRIPTION
|
|||||||
- vercmp:
|
- vercmp:
|
||||||
- remove duplicate, undocumented --usage option
|
- remove duplicate, undocumented --usage option
|
||||||
- fail when the wrong number of arguments are used (FS#49093)
|
- fail when the wrong number of arguments are used (FS#49093)
|
||||||
5.0.2 - fix database file checks with -Qkk and non-standard root
|
|
||||||
(FS#48563)
|
|
||||||
- improve optdepend detection for status messages (FS#44957)
|
|
||||||
- make Y/N prompt multi-byte-character aware (FS#47992)
|
|
||||||
- properly detect dependency cycles with --recursive (FS#41031)
|
|
||||||
- improve free disk space calculation (FS#37402)
|
|
||||||
- extract database files with --dbonly (FS#52052)
|
|
||||||
- repo-add:
|
|
||||||
- do not alter the database if only verifying signature
|
|
||||||
(FS#48085)
|
|
||||||
- fix error for directories containing whitespace (FS#50285)
|
|
||||||
- makepkg:
|
|
||||||
- fix building packages with only architecture-specific
|
|
||||||
sources (FS#48340)
|
|
||||||
- ignore PKGBUILD architecture for --printsrcinfo
|
|
||||||
- do not die on non-empty directories under !emptydirs
|
|
||||||
(FS#48515)
|
|
||||||
- preserve checksum type for architecture-specific sources
|
|
||||||
5.0.1 - fix alignment issues with wide character locales (FS#47980)
|
5.0.1 - fix alignment issues with wide character locales (FS#47980)
|
||||||
- fix removal of .pacnew files (FS#47993)
|
- fix removal of .pacnew files (FS#47993)
|
||||||
- fix triggering of Install hooks (FS#47996)
|
- fix triggering of Install hooks (FS#47996)
|
||||||
- fix handling of stdin scripts called by pacman
|
- fix handling of stdin scripts called by pacman
|
||||||
- hook activity is logged
|
- hook activity is logged
|
||||||
- documentation updates for alpm-hooks (FS#48080)
|
- documentataion updates for alpm-hooks (FS#48080)
|
||||||
- makepkg:
|
- makepkg:
|
||||||
- increase robustness of variable array checks
|
- increase robustness of variable array checks
|
||||||
- makepkg -g does not perform current architecture checks
|
- makepkg -g does not perform current architecture checks
|
||||||
@@ -520,9 +243,9 @@ VERSION DESCRIPTION
|
|||||||
- Fix removal of static libraries when the shared library
|
- Fix removal of static libraries when the shared library
|
||||||
uses the absolute path in symbolic links (FS#43395)
|
uses the absolute path in symbolic links (FS#43395)
|
||||||
- Improve Bazaar cloning (FS#43448)
|
- Improve Bazaar cloning (FS#43448)
|
||||||
- Fix issues with architecture dependent checksum
|
- Fix issues with architecture dependant checksum
|
||||||
verification (FS#43192)
|
verification (FS#43192)
|
||||||
- Fix .SRCINFO file with architecture dependent fields
|
- Fix .SRCINFO file with architecture dependant fields
|
||||||
(FS#43247)
|
(FS#43247)
|
||||||
- Fix compatibility with older bash versions
|
- Fix compatibility with older bash versions
|
||||||
- Allow git checkouts to be downloaded into directory ending
|
- Allow git checkouts to be downloaded into directory ending
|
||||||
@@ -612,7 +335,7 @@ VERSION DESCRIPTION
|
|||||||
- checkupdates: rename CHECKUPDATE_DB to CHECKUPDATES_DB
|
- checkupdates: rename CHECKUPDATE_DB to CHECKUPDATES_DB
|
||||||
- pacdiff: add a "Quit" option, and many other improvements
|
- pacdiff: add a "Quit" option, and many other improvements
|
||||||
- pacsysclean is removed
|
- pacsysclean is removed
|
||||||
4.1.2 - validate %FILEPATH% when parsing repos to prevent arbitrary
|
4.1.2 - validate %FILEPATH% when parsing repos to prevent arbitary
|
||||||
file overwrites from malicious databases
|
file overwrites from malicious databases
|
||||||
- makepkg:
|
- makepkg:
|
||||||
- restrict package name from starting with a dot
|
- restrict package name from starting with a dot
|
||||||
@@ -1077,7 +800,7 @@ VERSION DESCRIPTION
|
|||||||
- repo-add: use openssl instead of md5sum
|
- repo-add: use openssl instead of md5sum
|
||||||
- simplify doc building process for ease of development
|
- simplify doc building process for ease of development
|
||||||
- ensure correct handling of syscall interruptions
|
- ensure correct handling of syscall interruptions
|
||||||
- re-add missing newline on -Qi/-Si output (FS#11331)
|
- readd missing newline on -Qi/-Si output (FS#11331)
|
||||||
- fix TotalDownload regression (FS#11339)
|
- fix TotalDownload regression (FS#11339)
|
||||||
- makepkg:
|
- makepkg:
|
||||||
- replace getopt with an internal function
|
- replace getopt with an internal function
|
||||||
@@ -1523,7 +1246,7 @@ VERSION DESCRIPTION
|
|||||||
external download utility like wget
|
external download utility like wget
|
||||||
- added a license field to package meta-data
|
- added a license field to package meta-data
|
||||||
- add url support to -A and -U operations (download packages)
|
- add url support to -A and -U operations (download packages)
|
||||||
- -Ss now searches through provides fields
|
- -Ss now searches thru provides fields
|
||||||
- added --dbonly option to -R
|
- added --dbonly option to -R
|
||||||
2.7.6 - added --print-uris option
|
2.7.6 - added --print-uris option
|
||||||
- fixed an http download bug (FS#667)
|
- fixed an http download bug (FS#667)
|
||||||
|
|||||||
100
README
100
README
@@ -52,11 +52,13 @@ library is initialized.
|
|||||||
* logcb: The callback function for "log" operations.
|
* logcb: The callback function for "log" operations.
|
||||||
* dlcb: The callback function for download progress of each package.
|
* dlcb: The callback function for download progress of each package.
|
||||||
* fetchcb: Callback for custom download function.
|
* fetchcb: Callback for custom download function.
|
||||||
|
* totaldlcb: The callback function for overall download progress.
|
||||||
* eventcb: Callback for transaction messages.
|
* eventcb: Callback for transaction messages.
|
||||||
* questioncb: Callback for selecting amongst choices.
|
* questioncb: Callback for selecting amongst choices.
|
||||||
* progresscb: Callback to handle display of transaction progress.
|
* progresscb: Callback to handle display of transaction progress.
|
||||||
* gpgdir: Directory where GnuPG files are stored.
|
* gpgdir: Directory where GnuPG files are stored.
|
||||||
* arch: Allowed package architecture.
|
* arch: Allowed package architecture.
|
||||||
|
* deltaratio: Download deltas if possible; a ratio value.
|
||||||
* checkspace: Check disk space before installing.
|
* checkspace: Check disk space before installing.
|
||||||
* default_siglevel: Default signature verification level.
|
* default_siglevel: Default signature verification level.
|
||||||
* local_file_siglevel: Signature verification level for local file upgrades.
|
* local_file_siglevel: Signature verification level for local file upgrades.
|
||||||
@@ -194,8 +196,8 @@ remove.c and sync.c).
|
|||||||
|
|
||||||
The frontend is using a configuration file, usually "/etc/pacman.conf". Some
|
The frontend is using a configuration file, usually "/etc/pacman.conf". Some
|
||||||
of these options are only useful for the frontend only (mainly the ones used to
|
of these options are only useful for the frontend only (mainly the ones used to
|
||||||
control the output like verbosepkglist, or the behavior with cleanmethod).
|
control the output like totaldownload, or the behavior with cleanmethod and
|
||||||
The rest is used to configure the library.
|
syncfirst). The rest is used to configure the library.
|
||||||
|
|
||||||
|
|
||||||
[UPGRADE/REMOVE/SYNC]
|
[UPGRADE/REMOVE/SYNC]
|
||||||
@@ -629,97 +631,3 @@ API CHANGES BETWEEN 5.0 AND 5.1
|
|||||||
- alpm_capabilities()
|
- alpm_capabilities()
|
||||||
- duplicate and add to list
|
- duplicate and add to list
|
||||||
- alpm_list_append_strdup()
|
- alpm_list_append_strdup()
|
||||||
|
|
||||||
|
|
||||||
API CHANGES BETWEEN 5.1 AND 5.2
|
|
||||||
===============================
|
|
||||||
|
|
||||||
[REMOVED]
|
|
||||||
- package delta support
|
|
||||||
- alpm_delta_t
|
|
||||||
- alpm_event_delta_patch_t
|
|
||||||
- alpm_event_t union - removed alpm_event_delta_patch_t
|
|
||||||
- ALPM_EVENT_DELTA_INTEGRITY_START, ALPM_EVENT_DELTA_INTEGRITY_DONE,
|
|
||||||
ALPM_EVENT_DELTA_PATCHES_START, ALPM_EVENT_DELTA_PATCHES_DONE,
|
|
||||||
ALPM_EVENT_DELTA_PATCH_START, ALPM_EVENT_DELTA_PATCH_DONE,
|
|
||||||
ALPM_EVENT_DELTA_PATCH_FAILED
|
|
||||||
- ALPM_ERR_DLT_INVALID, ALPM_ERR_DLT_PATCHFAILED
|
|
||||||
- alpm_option_get_deltaratio()
|
|
||||||
- alpm_option_set_deltaratio()
|
|
||||||
- alpm_pkg_get_deltas()
|
|
||||||
- alpm_pkg_unused_deltas()
|
|
||||||
- alpm_transflag_t - removed member ALPM_TRANS_FLAG_FORCE
|
|
||||||
|
|
||||||
[CHANGED]
|
|
||||||
- alpm_errno_t - added member ALPM_ERR_MISSING_CAPABILITY_SIGNATURES
|
|
||||||
- alpm_sync_newversion() replaced with alpm_sync_get_new_version() which
|
|
||||||
does not filter on any ALPM_DB_USAGE_*.
|
|
||||||
|
|
||||||
|
|
||||||
API CHANGES BETWEEN 5.2 AND 6.0
|
|
||||||
===============================
|
|
||||||
|
|
||||||
[REMOVED]
|
|
||||||
- ALPM_EVENT_PKGDOWNLOAD_START, ALPM_EVENT_PKGDOWNLOAD_DONE, ALPM_EVENT_PKGDOWNLOAD_FAILED
|
|
||||||
- ALPM_ERR_PKG_REPO_NOT_FOUND
|
|
||||||
- old TotalDownload implementation
|
|
||||||
- alpm_cb_totaldl
|
|
||||||
- alpm_option_get_totaldlcb()
|
|
||||||
- alpm_option_set_totaldlcb()
|
|
||||||
|
|
||||||
[CHANGED]
|
|
||||||
- alpm_db_update() now accepts a list of databases rather than a single database.
|
|
||||||
- alpm_fetch_pkgurl() accepts a list of packages to download.
|
|
||||||
- alpm_db_search() now has an additional parameter and returns success status
|
|
||||||
- ALPM_EVENT_RETRIEVE_* -> ALPM_EVENT_DB_RETRIEVE_* and ALPM_EVENT_PKG_RETRIEVE_*
|
|
||||||
- alpm_cb_download pass event and data
|
|
||||||
- multi architecture support
|
|
||||||
- alpm_option_get_arch() -> alpm_option_get_architectures()
|
|
||||||
- alpm_option_set_arch() -> alpm_option_set_architectures()
|
|
||||||
- alpm_db_get_servers() copies parameter data
|
|
||||||
|
|
||||||
[ADDED]
|
|
||||||
- parallel download support
|
|
||||||
- alpm_option_set_parallel_downloads()
|
|
||||||
- alpm_option_get_parallel_downloads()
|
|
||||||
- file download events
|
|
||||||
- alpm_download_event_type_t
|
|
||||||
- alpm_download_event_init_t
|
|
||||||
- alpm_download_event_progress_t
|
|
||||||
- alpm_download_event_completed_t
|
|
||||||
- download misc
|
|
||||||
- ALPM_DOWNLOAD_RETRY
|
|
||||||
- alpm_download_event_retry_t
|
|
||||||
- alpm_event_pkg_retrieve_t
|
|
||||||
- multiarchitecture support
|
|
||||||
- alpm_option_add_architecture()
|
|
||||||
- alpm_option_remove_architecture()
|
|
||||||
- misc
|
|
||||||
- alpm_pkg_get_sig()
|
|
||||||
- callbacks add front-end provided context
|
|
||||||
|
|
||||||
|
|
||||||
API CHANGES BETWEEN 6.0 AND 6.1
|
|
||||||
===============================
|
|
||||||
|
|
||||||
[REMOVED]
|
|
||||||
- alpm_trans_t
|
|
||||||
|
|
||||||
[CHANGED]
|
|
||||||
- alpm_conflict_t - full package added as member, removing package name and name
|
|
||||||
hash members
|
|
||||||
- alpm_question_import_key_t - holds key uid and fingerprint rather than alpm_pgpkey_t
|
|
||||||
- alpm_pkgreason_t - added ALPM_PKG_REASON_UNKNOWN
|
|
||||||
- alpm_transflag_t - added ALPM_TRANS_FLAG_NOHOOKS
|
|
||||||
|
|
||||||
[ADDED]
|
|
||||||
- extensible package data type
|
|
||||||
- alpm_pkg_xdata_t
|
|
||||||
- alpm_pkg_get_xdata()
|
|
||||||
- accessor functions
|
|
||||||
- alpm_db_get_handle()
|
|
||||||
- alpm_pkg_get_handle()
|
|
||||||
- cache server support
|
|
||||||
- alpm_db_get_cache_servers()
|
|
||||||
- alpm_db_set_cache_servers()
|
|
||||||
- alpm_db_add_cache_server()
|
|
||||||
|
|||||||
14
RELEASE
14
RELEASE
@@ -1,24 +1,22 @@
|
|||||||
The following checklist should be used for making a pacman release.
|
The following checklist should be used for making a pacman release.
|
||||||
|
|
||||||
- Ensure "ninja dist" succeeds
|
- Ensure "make distcheck" succeeds
|
||||||
- Call a freeze to development.
|
- Call a freeze to development.
|
||||||
- Send translation updates to Transifex at least two weeks before a major
|
- Send translation updates to Transifex at least two weeks before a major
|
||||||
release (see below). At this stage, strings can only be changed for a
|
release (see below). At this stage, strings can only be changed for a
|
||||||
major issue.
|
major issue.
|
||||||
- Update NEWS and README files
|
- Update NEWS and README files
|
||||||
- Pull translation updates from Transifex
|
- Pull translation updates from Transifex
|
||||||
- Update version in meson.build as described in file
|
- Update version in configure.ac as described in file
|
||||||
- Update doc/index.asciidoc
|
- Update doc/index.asciidoc
|
||||||
- Create a signed git tag (git tag -s vX.Y.Z -m "commit message")
|
- Create a signed git tag (git tag -s vX.Y.Z -m "commit message")
|
||||||
- Create and sign release tarballs (generate with "ninja dist")
|
- Create and sign release tarballs (generate with "make distcheck")
|
||||||
- Create release on gitlab project page
|
|
||||||
- Upload release tarball and signature to gitlab ("glab release upload ...")
|
|
||||||
- Update pacman website
|
- Update pacman website
|
||||||
|
|
||||||
Transifex updates are handled using the transifex client. The basic process is:
|
Transifex updates are handled using the transifex client. The basic process is:
|
||||||
- Pull updates from transifex ("tx pull -f --minimum-perc 75")
|
- Pull updates from transifex ("tx pull -a -f --minimum-perc 75")
|
||||||
- Update po files ("./build-aux/update-po")
|
- Update po files ("make update-po")
|
||||||
- Fix all translation errors found (e.g. using "mint-check-translations")
|
- Fix all translation errors found
|
||||||
- Add any new locales to the relevant LINGUAS file
|
- Add any new locales to the relevant LINGUAS file
|
||||||
- Optional: Make any manual changes needed (e.g. fixing spacing in a string)
|
- Optional: Make any manual changes needed (e.g. fixing spacing in a string)
|
||||||
and update po files again
|
and update po files again
|
||||||
|
|||||||
6
autogen.sh
Executable file
6
autogen.sh
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
#!/bin/sh -x
|
||||||
|
|
||||||
|
autoreconf -i
|
||||||
|
patch -d build-aux -Np0 -i ltmain-asneeded.patch
|
||||||
|
|
||||||
|
exit 0
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
#!/usr/bin/python3
|
|
||||||
|
|
||||||
import sys
|
|
||||||
|
|
||||||
for path in sys.argv[1:]:
|
|
||||||
print('# -----------------------------------')
|
|
||||||
print('# ' + path + ':')
|
|
||||||
print('# -----------------------------------')
|
|
||||||
with open(path, 'r') as f:
|
|
||||||
for line in f:
|
|
||||||
print('# ' + line, end='')
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
#!@BASH@
|
|
||||||
|
|
||||||
input=$1
|
|
||||||
output=$2
|
|
||||||
mode=$3
|
|
||||||
|
|
||||||
sed \
|
|
||||||
-e "s|@rootdir[@]|@ROOTDIR@|g" \
|
|
||||||
-e "s|@localedir[@]|@LOCALEDIR@|g" \
|
|
||||||
-e "s|@sysconfdir[@]|@sysconfdir@|g" \
|
|
||||||
-e "s|@localstatedir[@]|@localstatedir@|g" \
|
|
||||||
-e "s|@libmakepkgdir[@]|@LIBMAKEPKGDIR@|g" \
|
|
||||||
-e "s|@pkgdatadir[@]|@PKGDATADIR@|g" \
|
|
||||||
-e "s|@keyringdir[@]|@KEYRINGDIR@|g" \
|
|
||||||
-e "s|@prefix[@]|@PREFIX@|g" \
|
|
||||||
-e "1s|#!/bin/bash|#!@BASH@|g" \
|
|
||||||
-e "s|@PACKAGE_VERSION[@]|@PACKAGE_VERSION@|g" \
|
|
||||||
-e "s|@PACKAGE_NAME[@]|@PACKAGE_NAME@|g" \
|
|
||||||
-e "s|@BUILDSCRIPT[@]|@BUILDSCRIPT@|g" \
|
|
||||||
-e "s|@TEMPLATE_DIR[@]|@TEMPLATE_DIR@|g" \
|
|
||||||
-e "s|@DEBUGSUFFIX[@]|@DEBUGSUFFIX@|g" \
|
|
||||||
-e "s|@INODECMD[@]|@INODECMD@|g" \
|
|
||||||
-e "s|@FILECMD[@]|@FILECMD@|g" \
|
|
||||||
-e "s|@BSDTAR_NO_READ_SPARSE[@]|@BSDTAR_NO_READ_SPARSE@|g" \
|
|
||||||
"$input" >"$output"
|
|
||||||
|
|
||||||
if [[ $mode ]]; then
|
|
||||||
chmod "$mode" "$output"
|
|
||||||
fi
|
|
||||||
33
build-aux/ltmain-asneeded.patch
Normal file
33
build-aux/ltmain-asneeded.patch
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
--- ltmain.sh.orig 2013-06-26 14:31:53.472627840 +1000
|
||||||
|
+++ ltmain.sh 2013-06-26 14:30:56.137038936 +1000
|
||||||
|
@@ -5800,6 +5800,14 @@
|
||||||
|
arg=$func_stripname_result
|
||||||
|
;;
|
||||||
|
|
||||||
|
+ -Wl,*--as-needed*)
|
||||||
|
+ deplibs="$deplibs $wl--as-needed"
|
||||||
|
+ ;;
|
||||||
|
+
|
||||||
|
+ -Wl,*--no-as-needed*)
|
||||||
|
+ deplibs="$deplibs $wl--no-as-needed"
|
||||||
|
+ ;;
|
||||||
|
+
|
||||||
|
-Wl,*)
|
||||||
|
func_stripname '-Wl,' '' "$arg"
|
||||||
|
args=$func_stripname_result
|
||||||
|
@@ -6160,6 +6168,15 @@
|
||||||
|
lib=
|
||||||
|
found=no
|
||||||
|
case $deplib in
|
||||||
|
+ -Wl,--as-needed|-Wl,--no-as-needed)
|
||||||
|
+ if test "$linkmode,$pass" = "prog,link"; then
|
||||||
|
+ compile_deplibs="$deplib $compile_deplibs"
|
||||||
|
+ finalize_deplibs="$deplib $finalize_deplibs"
|
||||||
|
+ else
|
||||||
|
+ deplibs="$deplib $deplibs"
|
||||||
|
+ fi
|
||||||
|
+ continue
|
||||||
|
+ ;;
|
||||||
|
-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
|
||||||
|
|-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
|
||||||
|
if test "$linkmode,$pass" = "prog,link"; then
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
set -eu
|
|
||||||
|
|
||||||
# this is needed mostly because $DESTDIR is provided as a variable,
|
|
||||||
# and we need to create the target directory...
|
|
||||||
|
|
||||||
mkdir -vp "$(dirname "${DESTDIR:-}$2")"
|
|
||||||
|
|
||||||
rm -f "${DESTDIR:-}$2"
|
|
||||||
ln -vs "$1" "${DESTDIR:-}$2"
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
|
|
||||||
import json
|
|
||||||
import sys
|
|
||||||
|
|
||||||
def print_result(result):
|
|
||||||
print('==================================================================')
|
|
||||||
print(result['name'])
|
|
||||||
print(' '.join(result['command']))
|
|
||||||
print('==================================================================')
|
|
||||||
print(result['stdout'])
|
|
||||||
|
|
||||||
with open(sys.argv[1], 'r') as f:
|
|
||||||
for line in f:
|
|
||||||
result = json.loads(line)
|
|
||||||
if result['result'] == 'FAIL':
|
|
||||||
print_result(result)
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# This script serves as a trampoline for running scripts which depend on
|
|
||||||
# libmakepkg with the libmakepkg within the build tree.
|
|
||||||
|
|
||||||
MAKEPKG_LIBRARY=@BUILDDIR@/libmakepkg exec @BASH@ -$- @REAL_PROGPATH@ "$@"
|
|
||||||
652
build-aux/tap-driver.sh
Executable file
652
build-aux/tap-driver.sh
Executable file
@@ -0,0 +1,652 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
# Copyright (C) 2011-2013 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# As a special exception to the GNU General Public License, if you
|
||||||
|
# distribute this file as part of a program that contains a
|
||||||
|
# configuration script generated by Autoconf, you may include it under
|
||||||
|
# the same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
# This file is maintained in Automake, please report
|
||||||
|
# bugs to <bug-automake@gnu.org> or send patches to
|
||||||
|
# <automake-patches@gnu.org>.
|
||||||
|
|
||||||
|
scriptversion=2011-12-27.17; # UTC
|
||||||
|
|
||||||
|
# Make unconditional expansion of undefined variables an error. This
|
||||||
|
# helps a lot in preventing typo-related bugs.
|
||||||
|
set -u
|
||||||
|
|
||||||
|
me=tap-driver.sh
|
||||||
|
|
||||||
|
fatal ()
|
||||||
|
{
|
||||||
|
echo "$me: fatal: $*" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
usage_error ()
|
||||||
|
{
|
||||||
|
echo "$me: $*" >&2
|
||||||
|
print_usage >&2
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
|
||||||
|
print_usage ()
|
||||||
|
{
|
||||||
|
cat <<END
|
||||||
|
Usage:
|
||||||
|
tap-driver.sh --test-name=NAME --log-file=PATH --trs-file=PATH
|
||||||
|
[--expect-failure={yes|no}] [--color-tests={yes|no}]
|
||||||
|
[--enable-hard-errors={yes|no}] [--ignore-exit]
|
||||||
|
[--diagnostic-string=STRING] [--merge|--no-merge]
|
||||||
|
[--comments|--no-comments] [--] TEST-COMMAND
|
||||||
|
The \`--test-name', \`--log-file' and \`--trs-file' options are mandatory.
|
||||||
|
END
|
||||||
|
}
|
||||||
|
|
||||||
|
# TODO: better error handling in option parsing (in particular, ensure
|
||||||
|
# TODO: $log_file, $trs_file and $test_name are defined).
|
||||||
|
test_name= # Used for reporting.
|
||||||
|
log_file= # Where to save the result and output of the test script.
|
||||||
|
trs_file= # Where to save the metadata of the test run.
|
||||||
|
expect_failure=0
|
||||||
|
color_tests=0
|
||||||
|
merge=0
|
||||||
|
ignore_exit=0
|
||||||
|
comments=0
|
||||||
|
diag_string='#'
|
||||||
|
while test $# -gt 0; do
|
||||||
|
case $1 in
|
||||||
|
--help) print_usage; exit $?;;
|
||||||
|
--version) echo "$me $scriptversion"; exit $?;;
|
||||||
|
--test-name) test_name=$2; shift;;
|
||||||
|
--log-file) log_file=$2; shift;;
|
||||||
|
--trs-file) trs_file=$2; shift;;
|
||||||
|
--color-tests) color_tests=$2; shift;;
|
||||||
|
--expect-failure) expect_failure=$2; shift;;
|
||||||
|
--enable-hard-errors) shift;; # No-op.
|
||||||
|
--merge) merge=1;;
|
||||||
|
--no-merge) merge=0;;
|
||||||
|
--ignore-exit) ignore_exit=1;;
|
||||||
|
--comments) comments=1;;
|
||||||
|
--no-comments) comments=0;;
|
||||||
|
--diagnostic-string) diag_string=$2; shift;;
|
||||||
|
--) shift; break;;
|
||||||
|
-*) usage_error "invalid option: '$1'";;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
test $# -gt 0 || usage_error "missing test command"
|
||||||
|
|
||||||
|
case $expect_failure in
|
||||||
|
yes) expect_failure=1;;
|
||||||
|
*) expect_failure=0;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if test $color_tests = yes; then
|
||||||
|
init_colors='
|
||||||
|
color_map["red"]="[0;31m" # Red.
|
||||||
|
color_map["grn"]="[0;32m" # Green.
|
||||||
|
color_map["lgn"]="[1;32m" # Light green.
|
||||||
|
color_map["blu"]="[1;34m" # Blue.
|
||||||
|
color_map["mgn"]="[0;35m" # Magenta.
|
||||||
|
color_map["std"]="[m" # No color.
|
||||||
|
color_for_result["ERROR"] = "mgn"
|
||||||
|
color_for_result["PASS"] = "grn"
|
||||||
|
color_for_result["XPASS"] = "red"
|
||||||
|
color_for_result["FAIL"] = "red"
|
||||||
|
color_for_result["XFAIL"] = "lgn"
|
||||||
|
color_for_result["SKIP"] = "blu"'
|
||||||
|
else
|
||||||
|
init_colors=''
|
||||||
|
fi
|
||||||
|
|
||||||
|
# :; is there to work around a bug in bash 3.2 (and earlier) which
|
||||||
|
# does not always set '$?' properly on redirection failure.
|
||||||
|
# See the Autoconf manual for more details.
|
||||||
|
:;{
|
||||||
|
(
|
||||||
|
# Ignore common signals (in this subshell only!), to avoid potential
|
||||||
|
# problems with Korn shells. Some Korn shells are known to propagate
|
||||||
|
# to themselves signals that have killed a child process they were
|
||||||
|
# waiting for; this is done at least for SIGINT (and usually only for
|
||||||
|
# it, in truth). Without the `trap' below, such a behaviour could
|
||||||
|
# cause a premature exit in the current subshell, e.g., in case the
|
||||||
|
# test command it runs gets terminated by a SIGINT. Thus, the awk
|
||||||
|
# script we are piping into would never seen the exit status it
|
||||||
|
# expects on its last input line (which is displayed below by the
|
||||||
|
# last `echo $?' statement), and would thus die reporting an internal
|
||||||
|
# error.
|
||||||
|
# For more information, see the Autoconf manual and the threads:
|
||||||
|
# <http://lists.gnu.org/archive/html/bug-autoconf/2011-09/msg00004.html>
|
||||||
|
# <http://mail.opensolaris.org/pipermail/ksh93-integration-discuss/2009-February/004121.html>
|
||||||
|
trap : 1 3 2 13 15
|
||||||
|
if test $merge -gt 0; then
|
||||||
|
exec 2>&1
|
||||||
|
else
|
||||||
|
exec 2>&3
|
||||||
|
fi
|
||||||
|
"$@"
|
||||||
|
echo $?
|
||||||
|
) | LC_ALL=C ${AM_TAP_AWK-awk} \
|
||||||
|
-v me="$me" \
|
||||||
|
-v test_script_name="$test_name" \
|
||||||
|
-v log_file="$log_file" \
|
||||||
|
-v trs_file="$trs_file" \
|
||||||
|
-v expect_failure="$expect_failure" \
|
||||||
|
-v merge="$merge" \
|
||||||
|
-v ignore_exit="$ignore_exit" \
|
||||||
|
-v comments="$comments" \
|
||||||
|
-v diag_string="$diag_string" \
|
||||||
|
'
|
||||||
|
# FIXME: the usages of "cat >&3" below could be optimized when using
|
||||||
|
# FIXME: GNU awk, and/on on systems that supports /dev/fd/.
|
||||||
|
|
||||||
|
# Implementation note: in what follows, `result_obj` will be an
|
||||||
|
# associative array that (partly) simulates a TAP result object
|
||||||
|
# from the `TAP::Parser` perl module.
|
||||||
|
|
||||||
|
## ----------- ##
|
||||||
|
## FUNCTIONS ##
|
||||||
|
## ----------- ##
|
||||||
|
|
||||||
|
function fatal(msg)
|
||||||
|
{
|
||||||
|
print me ": " msg | "cat >&2"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
function abort(where)
|
||||||
|
{
|
||||||
|
fatal("internal error " where)
|
||||||
|
}
|
||||||
|
|
||||||
|
# Convert a boolean to a "yes"/"no" string.
|
||||||
|
function yn(bool)
|
||||||
|
{
|
||||||
|
return bool ? "yes" : "no";
|
||||||
|
}
|
||||||
|
|
||||||
|
function add_test_result(result)
|
||||||
|
{
|
||||||
|
if (!test_results_index)
|
||||||
|
test_results_index = 0
|
||||||
|
test_results_list[test_results_index] = result
|
||||||
|
test_results_index += 1
|
||||||
|
test_results_seen[result] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Whether the test script should be re-run by "make recheck".
|
||||||
|
function must_recheck()
|
||||||
|
{
|
||||||
|
for (k in test_results_seen)
|
||||||
|
if (k != "XFAIL" && k != "PASS" && k != "SKIP")
|
||||||
|
return 1
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Whether the content of the log file associated to this test should
|
||||||
|
# be copied into the "global" test-suite.log.
|
||||||
|
function copy_in_global_log()
|
||||||
|
{
|
||||||
|
for (k in test_results_seen)
|
||||||
|
if (k != "PASS")
|
||||||
|
return 1
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# FIXME: this can certainly be improved ...
|
||||||
|
function get_global_test_result()
|
||||||
|
{
|
||||||
|
if ("ERROR" in test_results_seen)
|
||||||
|
return "ERROR"
|
||||||
|
if ("FAIL" in test_results_seen || "XPASS" in test_results_seen)
|
||||||
|
return "FAIL"
|
||||||
|
all_skipped = 1
|
||||||
|
for (k in test_results_seen)
|
||||||
|
if (k != "SKIP")
|
||||||
|
all_skipped = 0
|
||||||
|
if (all_skipped)
|
||||||
|
return "SKIP"
|
||||||
|
return "PASS";
|
||||||
|
}
|
||||||
|
|
||||||
|
function stringify_result_obj(result_obj)
|
||||||
|
{
|
||||||
|
if (result_obj["is_unplanned"] || result_obj["number"] != testno)
|
||||||
|
return "ERROR"
|
||||||
|
|
||||||
|
if (plan_seen == LATE_PLAN)
|
||||||
|
return "ERROR"
|
||||||
|
|
||||||
|
if (result_obj["directive"] == "TODO")
|
||||||
|
return result_obj["is_ok"] ? "XPASS" : "XFAIL"
|
||||||
|
|
||||||
|
if (result_obj["directive"] == "SKIP")
|
||||||
|
return result_obj["is_ok"] ? "SKIP" : COOKED_FAIL;
|
||||||
|
|
||||||
|
if (length(result_obj["directive"]))
|
||||||
|
abort("in function stringify_result_obj()")
|
||||||
|
|
||||||
|
return result_obj["is_ok"] ? COOKED_PASS : COOKED_FAIL
|
||||||
|
}
|
||||||
|
|
||||||
|
function decorate_result(result)
|
||||||
|
{
|
||||||
|
color_name = color_for_result[result]
|
||||||
|
if (color_name)
|
||||||
|
return color_map[color_name] "" result "" color_map["std"]
|
||||||
|
# If we are not using colorized output, or if we do not know how
|
||||||
|
# to colorize the given result, we should return it unchanged.
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
function report(result, details)
|
||||||
|
{
|
||||||
|
if (result ~ /^(X?(PASS|FAIL)|SKIP|ERROR)/)
|
||||||
|
{
|
||||||
|
msg = ": " test_script_name
|
||||||
|
add_test_result(result)
|
||||||
|
}
|
||||||
|
else if (result == "#")
|
||||||
|
{
|
||||||
|
msg = " " test_script_name ":"
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
abort("in function report()")
|
||||||
|
}
|
||||||
|
if (length(details))
|
||||||
|
msg = msg " " details
|
||||||
|
# Output on console might be colorized.
|
||||||
|
print decorate_result(result) msg
|
||||||
|
# Log the result in the log file too, to help debugging (this is
|
||||||
|
# especially true when said result is a TAP error or "Bail out!").
|
||||||
|
print result msg | "cat >&3";
|
||||||
|
}
|
||||||
|
|
||||||
|
function testsuite_error(error_message)
|
||||||
|
{
|
||||||
|
report("ERROR", "- " error_message)
|
||||||
|
}
|
||||||
|
|
||||||
|
function handle_tap_result()
|
||||||
|
{
|
||||||
|
details = result_obj["number"];
|
||||||
|
if (length(result_obj["description"]))
|
||||||
|
details = details " " result_obj["description"]
|
||||||
|
|
||||||
|
if (plan_seen == LATE_PLAN)
|
||||||
|
{
|
||||||
|
details = details " # AFTER LATE PLAN";
|
||||||
|
}
|
||||||
|
else if (result_obj["is_unplanned"])
|
||||||
|
{
|
||||||
|
details = details " # UNPLANNED";
|
||||||
|
}
|
||||||
|
else if (result_obj["number"] != testno)
|
||||||
|
{
|
||||||
|
details = sprintf("%s # OUT-OF-ORDER (expecting %d)",
|
||||||
|
details, testno);
|
||||||
|
}
|
||||||
|
else if (result_obj["directive"])
|
||||||
|
{
|
||||||
|
details = details " # " result_obj["directive"];
|
||||||
|
if (length(result_obj["explanation"]))
|
||||||
|
details = details " " result_obj["explanation"]
|
||||||
|
}
|
||||||
|
|
||||||
|
report(stringify_result_obj(result_obj), details)
|
||||||
|
}
|
||||||
|
|
||||||
|
# `skip_reason` should be empty whenever planned > 0.
|
||||||
|
function handle_tap_plan(planned, skip_reason)
|
||||||
|
{
|
||||||
|
planned += 0 # Avoid getting confused if, say, `planned` is "00"
|
||||||
|
if (length(skip_reason) && planned > 0)
|
||||||
|
abort("in function handle_tap_plan()")
|
||||||
|
if (plan_seen)
|
||||||
|
{
|
||||||
|
# Error, only one plan per stream is acceptable.
|
||||||
|
testsuite_error("multiple test plans")
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
planned_tests = planned
|
||||||
|
# The TAP plan can come before or after *all* the TAP results; we speak
|
||||||
|
# respectively of an "early" or a "late" plan. If we see the plan line
|
||||||
|
# after at least one TAP result has been seen, assume we have a late
|
||||||
|
# plan; in this case, any further test result seen after the plan will
|
||||||
|
# be flagged as an error.
|
||||||
|
plan_seen = (testno >= 1 ? LATE_PLAN : EARLY_PLAN)
|
||||||
|
# If testno > 0, we have an error ("too many tests run") that will be
|
||||||
|
# automatically dealt with later, so do not worry about it here. If
|
||||||
|
# $plan_seen is true, we have an error due to a repeated plan, and that
|
||||||
|
# has already been dealt with above. Otherwise, we have a valid "plan
|
||||||
|
# with SKIP" specification, and should report it as a particular kind
|
||||||
|
# of SKIP result.
|
||||||
|
if (planned == 0 && testno == 0)
|
||||||
|
{
|
||||||
|
if (length(skip_reason))
|
||||||
|
skip_reason = "- " skip_reason;
|
||||||
|
report("SKIP", skip_reason);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function extract_tap_comment(line)
|
||||||
|
{
|
||||||
|
if (index(line, diag_string) == 1)
|
||||||
|
{
|
||||||
|
# Strip leading `diag_string` from `line`.
|
||||||
|
line = substr(line, length(diag_string) + 1)
|
||||||
|
# And strip any leading and trailing whitespace left.
|
||||||
|
sub("^[ \t]*", "", line)
|
||||||
|
sub("[ \t]*$", "", line)
|
||||||
|
# Return what is left (if any).
|
||||||
|
return line;
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
# When this function is called, we know that line is a TAP result line,
|
||||||
|
# so that it matches the (perl) RE "^(not )?ok\b".
|
||||||
|
function setup_result_obj(line)
|
||||||
|
{
|
||||||
|
# Get the result, and remove it from the line.
|
||||||
|
result_obj["is_ok"] = (substr(line, 1, 2) == "ok" ? 1 : 0)
|
||||||
|
sub("^(not )?ok[ \t]*", "", line)
|
||||||
|
|
||||||
|
# If the result has an explicit number, get it and strip it; otherwise,
|
||||||
|
# automatically assing the next progresive number to it.
|
||||||
|
if (line ~ /^[0-9]+$/ || line ~ /^[0-9]+[^a-zA-Z0-9_]/)
|
||||||
|
{
|
||||||
|
match(line, "^[0-9]+")
|
||||||
|
# The final `+ 0` is to normalize numbers with leading zeros.
|
||||||
|
result_obj["number"] = substr(line, 1, RLENGTH) + 0
|
||||||
|
line = substr(line, RLENGTH + 1)
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result_obj["number"] = testno
|
||||||
|
}
|
||||||
|
|
||||||
|
if (plan_seen == LATE_PLAN)
|
||||||
|
# No further test results are acceptable after a "late" TAP plan
|
||||||
|
# has been seen.
|
||||||
|
result_obj["is_unplanned"] = 1
|
||||||
|
else if (plan_seen && testno > planned_tests)
|
||||||
|
result_obj["is_unplanned"] = 1
|
||||||
|
else
|
||||||
|
result_obj["is_unplanned"] = 0
|
||||||
|
|
||||||
|
# Strip trailing and leading whitespace.
|
||||||
|
sub("^[ \t]*", "", line)
|
||||||
|
sub("[ \t]*$", "", line)
|
||||||
|
|
||||||
|
# This will have to be corrected if we have a "TODO"/"SKIP" directive.
|
||||||
|
result_obj["description"] = line
|
||||||
|
result_obj["directive"] = ""
|
||||||
|
result_obj["explanation"] = ""
|
||||||
|
|
||||||
|
if (index(line, "#") == 0)
|
||||||
|
return # No possible directive, nothing more to do.
|
||||||
|
|
||||||
|
# Directives are case-insensitive.
|
||||||
|
rx = "[ \t]*#[ \t]*([tT][oO][dD][oO]|[sS][kK][iI][pP])[ \t]*"
|
||||||
|
|
||||||
|
# See whether we have the directive, and if yes, where.
|
||||||
|
pos = match(line, rx "$")
|
||||||
|
if (!pos)
|
||||||
|
pos = match(line, rx "[^a-zA-Z0-9_]")
|
||||||
|
|
||||||
|
# If there was no TAP directive, we have nothing more to do.
|
||||||
|
if (!pos)
|
||||||
|
return
|
||||||
|
|
||||||
|
# Let`s now see if the TAP directive has been escaped. For example:
|
||||||
|
# escaped: ok \# SKIP
|
||||||
|
# not escaped: ok \\# SKIP
|
||||||
|
# escaped: ok \\\\\# SKIP
|
||||||
|
# not escaped: ok \ # SKIP
|
||||||
|
if (substr(line, pos, 1) == "#")
|
||||||
|
{
|
||||||
|
bslash_count = 0
|
||||||
|
for (i = pos; i > 1 && substr(line, i - 1, 1) == "\\"; i--)
|
||||||
|
bslash_count += 1
|
||||||
|
if (bslash_count % 2)
|
||||||
|
return # Directive was escaped.
|
||||||
|
}
|
||||||
|
|
||||||
|
# Strip the directive and its explanation (if any) from the test
|
||||||
|
# description.
|
||||||
|
result_obj["description"] = substr(line, 1, pos - 1)
|
||||||
|
# Now remove the test description from the line, that has been dealt
|
||||||
|
# with already.
|
||||||
|
line = substr(line, pos)
|
||||||
|
# Strip the directive, and save its value (normalized to upper case).
|
||||||
|
sub("^[ \t]*#[ \t]*", "", line)
|
||||||
|
result_obj["directive"] = toupper(substr(line, 1, 4))
|
||||||
|
line = substr(line, 5)
|
||||||
|
# Now get the explanation for the directive (if any), with leading
|
||||||
|
# and trailing whitespace removed.
|
||||||
|
sub("^[ \t]*", "", line)
|
||||||
|
sub("[ \t]*$", "", line)
|
||||||
|
result_obj["explanation"] = line
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_test_exit_message(status)
|
||||||
|
{
|
||||||
|
if (status == 0)
|
||||||
|
return ""
|
||||||
|
if (status !~ /^[1-9][0-9]*$/)
|
||||||
|
abort("getting exit status")
|
||||||
|
if (status < 127)
|
||||||
|
exit_details = ""
|
||||||
|
else if (status == 127)
|
||||||
|
exit_details = " (command not found?)"
|
||||||
|
else if (status >= 128 && status <= 255)
|
||||||
|
exit_details = sprintf(" (terminated by signal %d?)", status - 128)
|
||||||
|
else if (status > 256 && status <= 384)
|
||||||
|
# We used to report an "abnormal termination" here, but some Korn
|
||||||
|
# shells, when a child process die due to signal number n, can leave
|
||||||
|
# in $? an exit status of 256+n instead of the more standard 128+n.
|
||||||
|
# Apparently, both behaviours are allowed by POSIX (2008), so be
|
||||||
|
# prepared to handle them both. See also Austing Group report ID
|
||||||
|
# 0000051 <http://www.austingroupbugs.net/view.php?id=51>
|
||||||
|
exit_details = sprintf(" (terminated by signal %d?)", status - 256)
|
||||||
|
else
|
||||||
|
# Never seen in practice.
|
||||||
|
exit_details = " (abnormal termination)"
|
||||||
|
return sprintf("exited with status %d%s", status, exit_details)
|
||||||
|
}
|
||||||
|
|
||||||
|
function write_test_results()
|
||||||
|
{
|
||||||
|
print ":global-test-result: " get_global_test_result() > trs_file
|
||||||
|
print ":recheck: " yn(must_recheck()) > trs_file
|
||||||
|
print ":copy-in-global-log: " yn(copy_in_global_log()) > trs_file
|
||||||
|
for (i = 0; i < test_results_index; i += 1)
|
||||||
|
print ":test-result: " test_results_list[i] > trs_file
|
||||||
|
close(trs_file);
|
||||||
|
}
|
||||||
|
|
||||||
|
BEGIN {
|
||||||
|
|
||||||
|
## ------- ##
|
||||||
|
## SETUP ##
|
||||||
|
## ------- ##
|
||||||
|
|
||||||
|
'"$init_colors"'
|
||||||
|
|
||||||
|
# Properly initialized once the TAP plan is seen.
|
||||||
|
planned_tests = 0
|
||||||
|
|
||||||
|
COOKED_PASS = expect_failure ? "XPASS": "PASS";
|
||||||
|
COOKED_FAIL = expect_failure ? "XFAIL": "FAIL";
|
||||||
|
|
||||||
|
# Enumeration-like constants to remember which kind of plan (if any)
|
||||||
|
# has been seen. It is important that NO_PLAN evaluates "false" as
|
||||||
|
# a boolean.
|
||||||
|
NO_PLAN = 0
|
||||||
|
EARLY_PLAN = 1
|
||||||
|
LATE_PLAN = 2
|
||||||
|
|
||||||
|
testno = 0 # Number of test results seen so far.
|
||||||
|
bailed_out = 0 # Whether a "Bail out!" directive has been seen.
|
||||||
|
|
||||||
|
# Whether the TAP plan has been seen or not, and if yes, which kind
|
||||||
|
# it is ("early" is seen before any test result, "late" otherwise).
|
||||||
|
plan_seen = NO_PLAN
|
||||||
|
|
||||||
|
## --------- ##
|
||||||
|
## PARSING ##
|
||||||
|
## --------- ##
|
||||||
|
|
||||||
|
is_first_read = 1
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
# Involutions required so that we are able to read the exit status
|
||||||
|
# from the last input line.
|
||||||
|
st = getline
|
||||||
|
if (st < 0) # I/O error.
|
||||||
|
fatal("I/O error while reading from input stream")
|
||||||
|
else if (st == 0) # End-of-input
|
||||||
|
{
|
||||||
|
if (is_first_read)
|
||||||
|
abort("in input loop: only one input line")
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if (is_first_read)
|
||||||
|
{
|
||||||
|
is_first_read = 0
|
||||||
|
nextline = $0
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
curline = nextline
|
||||||
|
nextline = $0
|
||||||
|
$0 = curline
|
||||||
|
}
|
||||||
|
# Copy any input line verbatim into the log file.
|
||||||
|
print | "cat >&3"
|
||||||
|
# Parsing of TAP input should stop after a "Bail out!" directive.
|
||||||
|
if (bailed_out)
|
||||||
|
continue
|
||||||
|
|
||||||
|
# TAP test result.
|
||||||
|
if ($0 ~ /^(not )?ok$/ || $0 ~ /^(not )?ok[^a-zA-Z0-9_]/)
|
||||||
|
{
|
||||||
|
testno += 1
|
||||||
|
setup_result_obj($0)
|
||||||
|
handle_tap_result()
|
||||||
|
}
|
||||||
|
# TAP plan (normal or "SKIP" without explanation).
|
||||||
|
else if ($0 ~ /^1\.\.[0-9]+[ \t]*$/)
|
||||||
|
{
|
||||||
|
# The next two lines will put the number of planned tests in $0.
|
||||||
|
sub("^1\\.\\.", "")
|
||||||
|
sub("[^0-9]*$", "")
|
||||||
|
handle_tap_plan($0, "")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
# TAP "SKIP" plan, with an explanation.
|
||||||
|
else if ($0 ~ /^1\.\.0+[ \t]*#/)
|
||||||
|
{
|
||||||
|
# The next lines will put the skip explanation in $0, stripping
|
||||||
|
# any leading and trailing whitespace. This is a little more
|
||||||
|
# tricky in truth, since we want to also strip a potential leading
|
||||||
|
# "SKIP" string from the message.
|
||||||
|
sub("^[^#]*#[ \t]*(SKIP[: \t][ \t]*)?", "")
|
||||||
|
sub("[ \t]*$", "");
|
||||||
|
handle_tap_plan(0, $0)
|
||||||
|
}
|
||||||
|
# "Bail out!" magic.
|
||||||
|
# Older versions of prove and TAP::Harness (e.g., 3.17) did not
|
||||||
|
# recognize a "Bail out!" directive when preceded by leading
|
||||||
|
# whitespace, but more modern versions (e.g., 3.23) do. So we
|
||||||
|
# emulate the latter, "more modern" behaviour.
|
||||||
|
else if ($0 ~ /^[ \t]*Bail out!/)
|
||||||
|
{
|
||||||
|
bailed_out = 1
|
||||||
|
# Get the bailout message (if any), with leading and trailing
|
||||||
|
# whitespace stripped. The message remains stored in `$0`.
|
||||||
|
sub("^[ \t]*Bail out![ \t]*", "");
|
||||||
|
sub("[ \t]*$", "");
|
||||||
|
# Format the error message for the
|
||||||
|
bailout_message = "Bail out!"
|
||||||
|
if (length($0))
|
||||||
|
bailout_message = bailout_message " " $0
|
||||||
|
testsuite_error(bailout_message)
|
||||||
|
}
|
||||||
|
# Maybe we have too look for dianogtic comments too.
|
||||||
|
else if (comments != 0)
|
||||||
|
{
|
||||||
|
comment = extract_tap_comment($0);
|
||||||
|
if (length(comment))
|
||||||
|
report("#", comment);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
## -------- ##
|
||||||
|
## FINISH ##
|
||||||
|
## -------- ##
|
||||||
|
|
||||||
|
# A "Bail out!" directive should cause us to ignore any following TAP
|
||||||
|
# error, as well as a non-zero exit status from the TAP producer.
|
||||||
|
if (!bailed_out)
|
||||||
|
{
|
||||||
|
if (!plan_seen)
|
||||||
|
{
|
||||||
|
testsuite_error("missing test plan")
|
||||||
|
}
|
||||||
|
else if (planned_tests != testno)
|
||||||
|
{
|
||||||
|
bad_amount = testno > planned_tests ? "many" : "few"
|
||||||
|
testsuite_error(sprintf("too %s tests run (expected %d, got %d)",
|
||||||
|
bad_amount, planned_tests, testno))
|
||||||
|
}
|
||||||
|
if (!ignore_exit)
|
||||||
|
{
|
||||||
|
# Fetch exit status from the last line.
|
||||||
|
exit_message = get_test_exit_message(nextline)
|
||||||
|
if (exit_message)
|
||||||
|
testsuite_error(exit_message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
write_test_results()
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
|
||||||
|
} # End of "BEGIN" block.
|
||||||
|
'
|
||||||
|
|
||||||
|
# TODO: document that we consume the file descriptor 3 :-(
|
||||||
|
} 3>"$log_file"
|
||||||
|
|
||||||
|
test $? -eq 0 || fatal "I/O or internal error"
|
||||||
|
|
||||||
|
# Local Variables:
|
||||||
|
# mode: shell-script
|
||||||
|
# sh-indentation: 2
|
||||||
|
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
|
|
||||||
OLD=$1
|
|
||||||
NEW=$2
|
|
||||||
|
|
||||||
for file in $(git grep -l "Copyright .* Pacman Development" | grep -v "\.po"); do \
|
|
||||||
sed -i -e "/Copyright (/s/-${OLD}/-${NEW}/" -e "/Copyright (/s/ ${OLD}/ ${OLD}-${NEW}/" "$file"
|
|
||||||
done
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
find_build_directory() {
|
|
||||||
local build_dirs=(*/build.ninja)
|
|
||||||
|
|
||||||
if [[ ! -e ${build_dirs[0]} ]]; then
|
|
||||||
echo "error: No build directory found. Have you run 'meson build' yet?" >&2
|
|
||||||
return 1
|
|
||||||
elif (( ${#build_dirs[*]} > 1 )); then
|
|
||||||
echo "error: Multiple build directories found. Unable to proceed." >&2
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
printf '%s\n' "${build_dirs[0]%/*}"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
filter_targets_by_name() {
|
|
||||||
if command -v jq &>/dev/null; then
|
|
||||||
jq --arg re "$1" -r 'map(.name)[] | select(match($re))'
|
|
||||||
else
|
|
||||||
json_pp | awk -v filter="$1" -F'[:"]' \
|
|
||||||
'$2 == "name" && $(NF - 1) ~ filter { print $(NF - 1) }'
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Make things simple and require that we're in the build root rather than
|
|
||||||
# trying to chase down the location of this script and the relative build dir.
|
|
||||||
if [[ ! -d .git ]]; then
|
|
||||||
echo "This script must be run from the root of the repository" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
build_dir=$(find_build_directory) || exit 1
|
|
||||||
|
|
||||||
mapfile -t targets < \
|
|
||||||
<(meson introspect "$build_dir" --targets | filter_targets_by_name "-update-po$")
|
|
||||||
|
|
||||||
ninja -C "$build_dir" "${targets[@]}"
|
|
||||||
596
configure.ac
Normal file
596
configure.ac
Normal file
@@ -0,0 +1,596 @@
|
|||||||
|
# -*- Autoconf -*-
|
||||||
|
# Process this file with autoconf to produce a configure script.
|
||||||
|
# Minimum version of autoconf required
|
||||||
|
AC_PREREQ(2.64)
|
||||||
|
|
||||||
|
# UPDATING VERSION NUMBERS FOR RELEASES
|
||||||
|
#
|
||||||
|
# libalpm:
|
||||||
|
# current
|
||||||
|
# The most recent interface number that this library implements.
|
||||||
|
# revision
|
||||||
|
# The implementation number of the current interface.
|
||||||
|
# age
|
||||||
|
# The difference between the newest and oldest interfaces that this library
|
||||||
|
# implements. In other words, the library implements all the interface
|
||||||
|
# numbers in the range from number current - age to current.
|
||||||
|
#
|
||||||
|
# 1. Start with version information of `0:0:0' for each libtool library.
|
||||||
|
# 2. Update the version information only immediately before a public release of
|
||||||
|
# your software. More frequent updates are unnecessary, and only guarantee
|
||||||
|
# that the current interface number gets larger faster.
|
||||||
|
# 3. If the library source code has changed at all since the last update, then
|
||||||
|
# increment revision (`c:r:a' becomes `c:r+1:a').
|
||||||
|
# 4. If any interfaces have been added, removed, or changed since the last
|
||||||
|
# update, increment current, and set revision to 0.
|
||||||
|
# 5. If any interfaces have been added since the last public release, then
|
||||||
|
# increment age.
|
||||||
|
# 6. If any interfaces have been removed since the last public release, then
|
||||||
|
# set age to 0.
|
||||||
|
#
|
||||||
|
# pacman:
|
||||||
|
# Extreme huge major changes:
|
||||||
|
# pacman_version_major += 1
|
||||||
|
# pacman_version_minor = 0
|
||||||
|
# pacman_version_micro = 0
|
||||||
|
#
|
||||||
|
# Real releases:
|
||||||
|
# pacman_version_minor += 1
|
||||||
|
# pacman_version_micro = 0
|
||||||
|
#
|
||||||
|
# Bugfix releases:
|
||||||
|
# pacman_version_micro += 1
|
||||||
|
|
||||||
|
m4_define([lib_current], [11])
|
||||||
|
m4_define([lib_revision], [3])
|
||||||
|
m4_define([lib_age], [0])
|
||||||
|
|
||||||
|
m4_define([pacman_version_major], [5])
|
||||||
|
m4_define([pacman_version_minor], [1])
|
||||||
|
m4_define([pacman_version_micro], [3])
|
||||||
|
m4_define([pacman_version],
|
||||||
|
[pacman_version_major.pacman_version_minor.pacman_version_micro])
|
||||||
|
|
||||||
|
# Autoconf initialization
|
||||||
|
AC_INIT([pacman], [pacman_version], [pacman-dev@archlinux.org])
|
||||||
|
AC_CONFIG_SRCDIR([config.h.in])
|
||||||
|
AC_CONFIG_HEADERS([config.h])
|
||||||
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
|
AC_CONFIG_AUX_DIR([build-aux])
|
||||||
|
AC_REQUIRE_AUX_FILE([tap-driver.sh])
|
||||||
|
|
||||||
|
AC_CANONICAL_HOST
|
||||||
|
AM_INIT_AUTOMAKE([1.11 foreign])
|
||||||
|
AM_SILENT_RULES([yes])
|
||||||
|
|
||||||
|
LT_INIT
|
||||||
|
LIB_VERSION=`expr lib_current - lib_age`.lib_age.lib_revision
|
||||||
|
LIB_VERSION_INFO="lib_current:lib_revision:lib_age"
|
||||||
|
|
||||||
|
# Respect empty CFLAGS during compiler tests
|
||||||
|
if test "x$CFLAGS" = "x"; then
|
||||||
|
CFLAGS=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Set subsitution values for version stuff in Makefiles and anywhere else,
|
||||||
|
# and put LIB_VERSION in config.h
|
||||||
|
AC_SUBST(LIB_VERSION)
|
||||||
|
AC_SUBST(LIB_VERSION_INFO)
|
||||||
|
AC_DEFINE_UNQUOTED([LIB_VERSION], ["$LIB_VERSION"], [libalpm version number])
|
||||||
|
|
||||||
|
# Help line for root directory
|
||||||
|
AC_ARG_WITH(root-dir,
|
||||||
|
AS_HELP_STRING([--with-root-dir=path], [set the location of the root operating directory]),
|
||||||
|
[ROOTDIR=$withval], [ROOTDIR=/])
|
||||||
|
|
||||||
|
# Help line for package extension
|
||||||
|
AC_ARG_WITH(pkg-ext,
|
||||||
|
AS_HELP_STRING([--with-pkg-ext=ext], [set the file extension used by packages]),
|
||||||
|
[PKGEXT=$withval], [PKGEXT=.pkg.tar.gz])
|
||||||
|
|
||||||
|
# Help line for source package directory
|
||||||
|
AC_ARG_WITH(src-ext,
|
||||||
|
AS_HELP_STRING([--with-src-ext=ext], [set the file extension used by source packages]),
|
||||||
|
[SRCEXT=$withval], [SRCEXT=.src.tar.gz])
|
||||||
|
|
||||||
|
# Help line for buildscript filename
|
||||||
|
AC_ARG_WITH(buildscript,
|
||||||
|
AS_HELP_STRING([--with-buildscript=name], [set the build script name used by makepkg]),
|
||||||
|
[BUILDSCRIPT=$withval], [BUILDSCRIPT=PKGBUILD])
|
||||||
|
|
||||||
|
# Help line for buildscript filename
|
||||||
|
AC_ARG_WITH(makepkg-template-dir,
|
||||||
|
AS_HELP_STRING([--with-makepkg-template-dir=name], [set the template dir used by makepkg-template]),
|
||||||
|
[TEMPLATE_DIR=$withval], [TEMPLATE_DIR=/usr/share/makepkg-template])
|
||||||
|
|
||||||
|
# Help line for debug package suffix
|
||||||
|
AC_ARG_WITH(debug-suffix,
|
||||||
|
AS_HELP_STRING([--with-debug-suffix=name], [set the suffix for split debugging symbol packages used by makepkg]),
|
||||||
|
[DEBUGSUFFIX=$withval], [DEBUGSUFFIX=debug])
|
||||||
|
|
||||||
|
# Help line for changing shell used to run install scriptlets
|
||||||
|
AC_ARG_WITH(scriptlet-shell,
|
||||||
|
AS_HELP_STRING([--with-scriptlet-shell=shell],
|
||||||
|
[set the full path to the shell used to run install scriptlets]),
|
||||||
|
[SCRIPTLET_SHELL=$withval], [SCRIPTLET_SHELL=/bin/sh])
|
||||||
|
|
||||||
|
# Help line for ldconfig path
|
||||||
|
AC_ARG_WITH(ldconfig,
|
||||||
|
AS_HELP_STRING([--with-ldconfig=path],
|
||||||
|
[set the full path to ldconfig]),
|
||||||
|
[LDCONFIG=$withval], [LDCONFIG=/sbin/ldconfig])
|
||||||
|
|
||||||
|
# Help line for selecting a crypto library
|
||||||
|
AC_ARG_WITH(crypto,
|
||||||
|
AS_HELP_STRING([--with-crypto={openssl|nettle}],
|
||||||
|
[select crypto implementation @<:@default=openssl@:>@]),
|
||||||
|
[with_crypto=$withval], [with_crypto=openssl])
|
||||||
|
|
||||||
|
# Help line for using gpgme
|
||||||
|
AC_ARG_WITH(gpgme,
|
||||||
|
AS_HELP_STRING([--with-gpgme], [use GPGME for PGP signature verification]),
|
||||||
|
[], [with_gpgme=check])
|
||||||
|
|
||||||
|
# Help line for using libcurl
|
||||||
|
AC_ARG_WITH(libcurl,
|
||||||
|
AS_HELP_STRING([--with-libcurl], [use libcurl for the internal downloader]),
|
||||||
|
[], [with_libcurl=check])
|
||||||
|
|
||||||
|
# Help line for documentation
|
||||||
|
AC_ARG_ENABLE(doc,
|
||||||
|
AS_HELP_STRING([--disable-doc], [prevent make from looking at doc/ dir]),
|
||||||
|
[wantdoc=$enableval], [wantdoc=yes])
|
||||||
|
|
||||||
|
# Help line for doxygen
|
||||||
|
AC_ARG_ENABLE(doxygen,
|
||||||
|
AS_HELP_STRING([--enable-doxygen], [build your own API docs via Doxygen]),
|
||||||
|
[wantdoxygen=$enableval], [wantdoxygen=no])
|
||||||
|
|
||||||
|
# Help line for debug
|
||||||
|
AC_ARG_ENABLE(debug,
|
||||||
|
AS_HELP_STRING([--enable-debug], [enable debugging support]),
|
||||||
|
[debug=$enableval], [debug=no])
|
||||||
|
|
||||||
|
# Help line for compiler warning flags
|
||||||
|
AC_ARG_ENABLE(warningflags,
|
||||||
|
AS_HELP_STRING([--enable-warningflags], [enable extra compiler warning flags]),
|
||||||
|
[warningflags=$enableval], [warningflags=no])
|
||||||
|
|
||||||
|
# Help line for using git version in pacman version string
|
||||||
|
AC_ARG_ENABLE(git-version,
|
||||||
|
AS_HELP_STRING([--enable-git-version],
|
||||||
|
[enable use of git version in version string if available]),
|
||||||
|
[wantgitver=$enableval], [wantgitver=no])
|
||||||
|
|
||||||
|
# Enable large file support if available (must be enabled before
|
||||||
|
# testing compilation against gpgme).
|
||||||
|
AC_SYS_LARGEFILE
|
||||||
|
|
||||||
|
# Record large file flags in pkgconfig file
|
||||||
|
if test "$enable_largefile" != no; then
|
||||||
|
if test "$ac_cv_sys_file_offset_bits" != 'no'; then
|
||||||
|
LFS_CFLAGS="-D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
AC_SUBST(LFS_CFLAGS)
|
||||||
|
|
||||||
|
|
||||||
|
# Checks for programs.
|
||||||
|
AC_PROG_AWK
|
||||||
|
AC_PROG_CC_C99
|
||||||
|
AC_PROG_INSTALL
|
||||||
|
AC_CHECK_PROGS([PYTHON], [python2.7 python2 python], [false])
|
||||||
|
AC_PATH_PROGS([BASH_SHELL], [bash bash4], [false])
|
||||||
|
|
||||||
|
# check for perl 5.10.1 (needed by makepkg-template)
|
||||||
|
AC_PATH_PROG([PERL],[perl])
|
||||||
|
AC_DEFUN([AX_PROG_PERL_VERSION],
|
||||||
|
[AC_CACHE_CHECK([for Perl version $1 or later], [ax_cv_prog_perl_version],
|
||||||
|
[AS_IF(["$PERL" -e 'require v$1;' >/dev/null 2>&1],
|
||||||
|
[ax_cv_prog_perl_version=yes],
|
||||||
|
[ax_cv_prog_perl_version=no])])
|
||||||
|
AS_IF([test x"$ax_cv_prog_perl_version" = xyes], [$2], [$3])])
|
||||||
|
AX_PROG_PERL_VERSION([5.10.1], [], [AC_MSG_ERROR([perl is too old])])
|
||||||
|
|
||||||
|
AS_IF([test "x$BASH_SHELL" = "xfalse"],
|
||||||
|
AC_MSG_WARN([*** bash >= 4.1.0 is required for pacman scripts]),
|
||||||
|
[bash_version_major=`$BASH_SHELL -c 'echo "${BASH_VERSINFO[[0]]}"'`
|
||||||
|
bash_version_minor=`$BASH_SHELL -c 'echo "${BASH_VERSINFO[[1]]}"'`
|
||||||
|
ok=yes
|
||||||
|
if test "$bash_version_major" -lt 4; then
|
||||||
|
ok=no
|
||||||
|
fi
|
||||||
|
if test "$bash_version_major" -eq 4 && test "$bash_version_minor" -lt 1; then
|
||||||
|
ok=no
|
||||||
|
fi
|
||||||
|
if test "$ok" = "no"; then
|
||||||
|
AC_MSG_ERROR([*** bash >= 4.1.0 is required for pacman scripts])
|
||||||
|
fi
|
||||||
|
unset bash_version_major bash_version_minor ok])
|
||||||
|
|
||||||
|
# find installed gettext
|
||||||
|
AM_GNU_GETTEXT([external], [need-ngettext])
|
||||||
|
AM_GNU_GETTEXT_VERSION(0.13.1)
|
||||||
|
|
||||||
|
AC_CHECK_LIB([m], [fabs], ,
|
||||||
|
AC_MSG_ERROR([libm is needed to compile pacman!]))
|
||||||
|
|
||||||
|
# Check for libarchive
|
||||||
|
PKG_CHECK_MODULES(LIBARCHIVE, [libarchive >= 3.0.0], ,
|
||||||
|
AC_MSG_ERROR([*** libarchive >= 3.0.0 is needed to compile pacman!]))
|
||||||
|
|
||||||
|
# Check for OpenSSL
|
||||||
|
have_openssl=no
|
||||||
|
have_nettle=no
|
||||||
|
if test "x$with_crypto" = "xnettle"; then
|
||||||
|
AC_SUBST(pc_crypto, [nettle])
|
||||||
|
PKG_CHECK_MODULES(NETTLE, [nettle],
|
||||||
|
[AC_DEFINE(HAVE_LIBNETTLE, 1, [Define whether to use nettle]) have_nettle=yes], have_nettle=no)
|
||||||
|
if test "x$have_nettle" = xno -a "x$with_crypto" = xnettle; then
|
||||||
|
AC_MSG_ERROR([*** nettle support requested but libraries not found])
|
||||||
|
fi
|
||||||
|
else if test "x$with_crypto" = "xopenssl"; then
|
||||||
|
AC_SUBST(pc_crypto, [libcrypto])
|
||||||
|
PKG_CHECK_MODULES(LIBSSL, [libcrypto],
|
||||||
|
[AC_DEFINE(HAVE_LIBSSL, 1, [Define if libcrypto is available]) have_openssl=yes], have_openssl=no)
|
||||||
|
if test "x$have_openssl" = xno; then
|
||||||
|
AC_MSG_ERROR([*** openssl support requested but libraries not found])
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
AC_MSG_ERROR([*** unknown crypto support library requested - $with_crypto])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
AM_CONDITIONAL(HAVE_LIBSSL, [test "$have_openssl" = "yes"])
|
||||||
|
AM_CONDITIONAL(HAVE_LIBNETTLE, [test "$have_nettle" = "yes"])
|
||||||
|
|
||||||
|
# Check for libcurl
|
||||||
|
have_libcurl=no
|
||||||
|
if test "x$with_libcurl" != "xno"; then
|
||||||
|
PKG_CHECK_MODULES(LIBCURL, [libcurl >= 7.32.0],
|
||||||
|
[AC_DEFINE(HAVE_LIBCURL, 1, [Define if libcurl is available]) have_libcurl=yes], have_libcurl=no)
|
||||||
|
if test "x$have_libcurl" = xno -a "x$with_libcurl" = xyes; then
|
||||||
|
AC_MSG_ERROR([*** libcurl >= 7.32.0 is required for internal downloader support])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
AM_CONDITIONAL(HAVE_LIBCURL, [test "$have_libcurl" = "yes"])
|
||||||
|
# used to generate libalpm.pc
|
||||||
|
if test "x$have_libcurl" = xyes; then
|
||||||
|
AC_SUBST(pc_libcurl, [libcurl])
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for gpgme
|
||||||
|
AC_MSG_CHECKING(whether to link with libgpgme)
|
||||||
|
AS_IF([test "x$with_gpgme" != "xno"],
|
||||||
|
[AC_MSG_RESULT([yes])],
|
||||||
|
[AC_MSG_RESULT([no])])
|
||||||
|
|
||||||
|
have_gpgme=no
|
||||||
|
AS_IF([test "x$with_gpgme" != "xno"],
|
||||||
|
[AM_PATH_GPGME([1.3.0],
|
||||||
|
[LIBS_save="$LIBS"
|
||||||
|
CPPFLAGS_save="$CPPFLAGS"
|
||||||
|
CFLAGS_save="$CFLAGS"
|
||||||
|
|
||||||
|
LIBS="$LIBS $GPGME_LIBS"
|
||||||
|
CPPFLAGS="$CPPFLAGS $GPGME_CPPFLAGS"
|
||||||
|
CFLAGS="$CFLAGS $GPGME_CFLAGS"
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([for sane gpgme])
|
||||||
|
AC_LINK_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM(
|
||||||
|
[[#include <gpgme.h>]],
|
||||||
|
[[return gpgme_check_version("1.3.0");]])],
|
||||||
|
[AC_MSG_RESULT([yes])
|
||||||
|
have_gpgme=yes
|
||||||
|
AC_DEFINE([HAVE_LIBGPGME], [1], [Define if gpgme should be used to provide GPG signature support.])],
|
||||||
|
[AC_MSG_RESULT([no])
|
||||||
|
have_gpgme=no
|
||||||
|
unset GPGME_LIBS
|
||||||
|
unset GPGME_CFLAGS]
|
||||||
|
AS_IF([test "x$with_gpgme" = "xyes"],
|
||||||
|
[AC_MSG_FAILURE([*** gpgme >= 1.3.0 is needed for GPG signature support])])
|
||||||
|
)
|
||||||
|
|
||||||
|
LIBS="$LIBS_save"
|
||||||
|
CPPFLAGS="$CPPFLAGS_save"
|
||||||
|
CFLAGS="$CFLAGS_save"
|
||||||
|
unset CPPFLAGS_save
|
||||||
|
unset CFLAGS_save],)])
|
||||||
|
|
||||||
|
AS_IF([test "x$have_gpgme" = xno -a "x$with_gpgme" = xyes],
|
||||||
|
[AC_MSG_FAILURE([--with-gpgme was given, but gpgme was not found])])
|
||||||
|
AM_CONDITIONAL([HAVE_LIBGPGME], [test "x$have_gpgme" = "xyes"])
|
||||||
|
|
||||||
|
# Checks for header files.
|
||||||
|
AC_CHECK_HEADERS([fcntl.h float.h glob.h langinfo.h libintl.h limits.h \
|
||||||
|
locale.h mntent.h netinet/in.h netinet/tcp.h \
|
||||||
|
stddef.h string.h sys/ioctl.h \
|
||||||
|
sys/mnttab.h sys/mount.h \
|
||||||
|
sys/param.h sys/statvfs.h sys/time.h sys/types.h \
|
||||||
|
sys/ucred.h syslog.h termios.h wchar.h])
|
||||||
|
|
||||||
|
# Checks for typedefs, structures, and compiler characteristics.
|
||||||
|
AC_C_INLINE
|
||||||
|
AC_TYPE_INT64_T
|
||||||
|
AC_TYPE_MODE_T
|
||||||
|
AC_TYPE_OFF_T
|
||||||
|
AC_TYPE_PID_T
|
||||||
|
AC_TYPE_SIZE_T
|
||||||
|
AC_TYPE_SSIZE_T
|
||||||
|
AC_STRUCT_TM
|
||||||
|
AC_TYPE_UID_T
|
||||||
|
AC_STRUCT_DIRENT_D_TYPE
|
||||||
|
PATH_MAX_DEFINED
|
||||||
|
|
||||||
|
# Checks for library functions.
|
||||||
|
AC_FUNC_FORK
|
||||||
|
AC_FUNC_GETMNTENT
|
||||||
|
AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK
|
||||||
|
AC_FUNC_MKTIME
|
||||||
|
AC_FUNC_STRCOLL
|
||||||
|
AC_CHECK_FUNCS([dup2 getcwd getmntinfo gettimeofday memmove memset \
|
||||||
|
mkdir realpath regcomp rmdir setenv setlocale strcasecmp \
|
||||||
|
strchr strcspn strdup strerror strndup strnlen strrchr \
|
||||||
|
strsep strstr strtol swprintf tcflush wcwidth uname])
|
||||||
|
AC_CHECK_MEMBERS([struct stat.st_blksize],,,[[#include <sys/stat.h>]])
|
||||||
|
|
||||||
|
# For the diskspace code
|
||||||
|
FS_STATS_TYPE
|
||||||
|
AC_CHECK_MEMBERS([struct statvfs.f_flag],,,[[#include <sys/statvfs.h>]])
|
||||||
|
AC_CHECK_MEMBERS([struct statfs.f_flags],,,[[#include <sys/param.h>
|
||||||
|
#include <sys/mount.h>]])
|
||||||
|
|
||||||
|
# Check if we can use symbol visibility support in GCC
|
||||||
|
GCC_VISIBILITY_CC
|
||||||
|
|
||||||
|
# Host-dependant definitions
|
||||||
|
DEFAULT_DUFLAGS=" -sk --apparent-size"
|
||||||
|
DEFAULT_SEDINPLACEFLAGS=" --follow-symlinks -i"
|
||||||
|
INODECMD="stat -c '%i %n'"
|
||||||
|
OWNERCMD="stat -c '%u:%g'"
|
||||||
|
MODECMD="stat -c '%a'"
|
||||||
|
STRIP_BINARIES="--strip-all"
|
||||||
|
STRIP_SHARED="--strip-unneeded"
|
||||||
|
STRIP_STATIC="--strip-debug"
|
||||||
|
case "${host_os}" in
|
||||||
|
*bsd*)
|
||||||
|
INODECMD="stat -f '%i %N'"
|
||||||
|
OWNERCMD="stat -f '%u:%g'"
|
||||||
|
MODECMD="stat -f '%Lp'"
|
||||||
|
DEFAULT_SEDINPLACEFLAGS=" -i \"\""
|
||||||
|
DEFAULT_DUFLAGS=" -sk"
|
||||||
|
;;
|
||||||
|
darwin*)
|
||||||
|
host_os_darwin=yes
|
||||||
|
INODECMD="/usr/bin/stat -f '%i %N'"
|
||||||
|
OWNERCMD="/usr/bin/stat -f '%u:%g'"
|
||||||
|
MODECMD="/usr/bin/stat -f '%Lp'"
|
||||||
|
DEFAULT_SEDINPLACEFLAGS=" -i ''"
|
||||||
|
DEFAULT_DUFLAGS=" -sk"
|
||||||
|
STRIP_BINARIES=""
|
||||||
|
STRIP_SHARED="-S"
|
||||||
|
STRIP_STATIC="-S"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
AM_CONDITIONAL([DARWIN], test "x$host_os_darwin" = "xyes")
|
||||||
|
AC_PATH_PROGS([DUPATH], [du], [du], [/usr/bin$PATH_SEPARATOR/bin] )
|
||||||
|
AC_PATH_PROGS([SEDPATH], [sed], [sed], [/usr/bin$PATH_SEPARATOR/bin] )
|
||||||
|
AC_SUBST(INODECMD)
|
||||||
|
AC_SUBST(OWNERCMD)
|
||||||
|
AC_SUBST(MODECMD)
|
||||||
|
AC_SUBST(STRIP_BINARIES)
|
||||||
|
AC_SUBST(STRIP_SHARED)
|
||||||
|
AC_SUBST(STRIP_STATIC)
|
||||||
|
|
||||||
|
# Flags for du
|
||||||
|
if test "${DUFLAGS+set}" != "set"; then
|
||||||
|
DUFLAGS="${DEFAULT_DUFLAGS}"
|
||||||
|
fi
|
||||||
|
AC_ARG_VAR(DUFLAGS, [flags for du, overriding the default])
|
||||||
|
|
||||||
|
# Flags for sed in place
|
||||||
|
if test "${SEDINPLACEFLAGS+set}" != "set"; then
|
||||||
|
SEDINPLACEFLAGS="${DEFAULT_SEDINPLACEFLAGS}"
|
||||||
|
fi
|
||||||
|
AC_ARG_VAR(SEDINPLACEFLAGS, [flags for sed, overriding the default])
|
||||||
|
|
||||||
|
# Variables plugged into makepkg.conf
|
||||||
|
CARCH="${host%%-*}"
|
||||||
|
CHOST="${host}"
|
||||||
|
AC_SUBST(CARCH)
|
||||||
|
AC_SUBST(CHOST)
|
||||||
|
|
||||||
|
# Check for documentation support and status
|
||||||
|
AC_CHECK_PROGS([ASCIIDOC], [asciidoc])
|
||||||
|
AC_MSG_CHECKING([for building documentation])
|
||||||
|
if test "x$wantdoc" = "xyes" ; then
|
||||||
|
if test $ASCIIDOC ; then
|
||||||
|
AC_MSG_RESULT([yes, enabled by configure])
|
||||||
|
else
|
||||||
|
asciidoc="(warning : asciidoc not installed)"
|
||||||
|
AC_MSG_RESULT([yes $asciidoc])
|
||||||
|
fi
|
||||||
|
wantdoc=yes
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT([no, disabled by configure])
|
||||||
|
wantdoc=no
|
||||||
|
fi
|
||||||
|
AM_CONDITIONAL(WANT_DOC, test "x$wantdoc" = "xyes")
|
||||||
|
|
||||||
|
# Check for doxygen support and status
|
||||||
|
AC_CHECK_PROGS([DOXYGEN], [doxygen])
|
||||||
|
AC_MSG_CHECKING([for doxygen])
|
||||||
|
if test "x$wantdoxygen" = "xyes" ; then
|
||||||
|
if test $DOXYGEN ; then
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
usedoxygen=yes
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT([no, doxygen missing])
|
||||||
|
usedoxygen=no
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT([no, disabled by configure])
|
||||||
|
usedoxygen=no
|
||||||
|
fi
|
||||||
|
AM_CONDITIONAL(USE_DOXYGEN, test "x$usedoxygen" = "xyes")
|
||||||
|
|
||||||
|
# Enable or disable debug code
|
||||||
|
AC_MSG_CHECKING(for debug mode request)
|
||||||
|
if test "x$debug" = "xyes" ; then
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE([PACMAN_DEBUG], , [Enable debug code])
|
||||||
|
# Check for -fstack-protector availability
|
||||||
|
GCC_STACK_PROTECT_LIB
|
||||||
|
GCC_STACK_PROTECT_CC
|
||||||
|
GCC_FORTIFY_SOURCE_CC
|
||||||
|
WARNING_CFLAGS="-g -Wall -Werror"
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
WARNING_CFLAGS="-Wall"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Enable or disable compiler warning flags
|
||||||
|
AC_MSG_CHECKING(for excessive compiler warning flags)
|
||||||
|
if test "x$warningflags" = "xyes" ; then
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
CFLAGS_ADD([-Wcast-align], [WARNING_CFLAGS])
|
||||||
|
CFLAGS_ADD([-Wclobbered], [WARNING_CFLAGS])
|
||||||
|
CFLAGS_ADD([-Wempty-body], [WARNING_CFLAGS])
|
||||||
|
CFLAGS_ADD([-Wfloat-equal], [WARNING_CFLAGS])
|
||||||
|
CFLAGS_ADD([-Wformat-nonliteral], [WARNING_CFLAGS])
|
||||||
|
CFLAGS_ADD([-Wformat-security], [WARNING_CFLAGS])
|
||||||
|
CFLAGS_ADD([-Wignored-qualifiers], [WARNING_CFLAGS])
|
||||||
|
CFLAGS_ADD([-Winit-self], [WARNING_CFLAGS])
|
||||||
|
CFLAGS_ADD([-Wlogical-op], [WARNING_CFLAGS])
|
||||||
|
CFLAGS_ADD([-Wmissing-declarations], [WARNING_CFLAGS])
|
||||||
|
CFLAGS_ADD([-Wmissing-field-initializers], [WARNING_CFLAGS])
|
||||||
|
CFLAGS_ADD([-Wmissing-parameter-type], [WARNING_CFLAGS])
|
||||||
|
CFLAGS_ADD([-Wmissing-prototypes], [WARNING_CFLAGS])
|
||||||
|
CFLAGS_ADD([-Wold-style-declaration], [WARNING_CFLAGS])
|
||||||
|
CFLAGS_ADD([-Woverride-init], [WARNING_CFLAGS])
|
||||||
|
CFLAGS_ADD([-Wpointer-arith], [WARNING_CFLAGS])
|
||||||
|
CFLAGS_ADD([-Wredundant-decls], [WARNING_CFLAGS])
|
||||||
|
CFLAGS_ADD([-Wshadow], [WARNING_CFLAGS])
|
||||||
|
CFLAGS_ADD([-Wsign-compare], [WARNING_CFLAGS])
|
||||||
|
CFLAGS_ADD([-Wstrict-aliasing], [WARNING_CFLAGS])
|
||||||
|
CFLAGS_ADD([-Wstrict-overflow=5], [WARNING_CFLAGS])
|
||||||
|
CFLAGS_ADD([-Wstrict-prototypes], [WARNING_CFLAGS])
|
||||||
|
CFLAGS_ADD([-Wtype-limits], [WARNING_CFLAGS])
|
||||||
|
CFLAGS_ADD([-Wuninitialized], [WARNING_CFLAGS])
|
||||||
|
CFLAGS_ADD([-Wunused-but-set-parameter], [WARNING_CFLAGS])
|
||||||
|
CFLAGS_ADD([-Wunused-parameter], [WARNING_CFLAGS])
|
||||||
|
CFLAGS_ADD([-Wwrite-strings], [WARNING_CFLAGS])
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Enable or disable use of git version in pacman version string
|
||||||
|
AC_MSG_CHECKING(whether to use git version if available)
|
||||||
|
if test "x$wantgitver" = "xyes" ; then
|
||||||
|
AC_CHECK_PROGS([GIT], [git])
|
||||||
|
AC_CHECK_FILE([.git/], hasgitdir=yes)
|
||||||
|
usegitver=$ac_cv_file__git_
|
||||||
|
if test $GIT -a "x$hasgitdir" = "xyes"; then
|
||||||
|
AC_DEFINE([USE_GIT_VERSION], , [Use GIT version in version string])
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT([no, disabled by configure])
|
||||||
|
usegitver=no
|
||||||
|
fi
|
||||||
|
AM_CONDITIONAL(USE_GIT_VERSION, test "x$usegitver" = "xyes")
|
||||||
|
|
||||||
|
# Set root directory
|
||||||
|
AC_SUBST(ROOTDIR)
|
||||||
|
AC_DEFINE_UNQUOTED([ROOTDIR], "$ROOTDIR", [The location of the root operating directory])
|
||||||
|
# Set package file extension
|
||||||
|
AC_SUBST(PKGEXT)
|
||||||
|
AC_DEFINE_UNQUOTED([PKGEXT], "$PKGEXT", [The file extension used by pacman packages])
|
||||||
|
# Set source package file extension
|
||||||
|
AC_SUBST(SRCEXT)
|
||||||
|
AC_DEFINE_UNQUOTED([SRCEXT], "$SRCEXT", [The file extension used by pacman source packages])
|
||||||
|
# Set makepkg build script name
|
||||||
|
AC_SUBST(BUILDSCRIPT)
|
||||||
|
AC_DEFINE_UNQUOTED([BUILDSCRIPT], "$BUILDSCRIPT", [The build script name used by makepkg])
|
||||||
|
# Set makepkg-template template directory
|
||||||
|
AC_SUBST(TEMPLATE_DIR)
|
||||||
|
AC_DEFINE_UNQUOTED([TEMPLATE_DIR], "$TEMPLATE_DIR", [The template directory used by makepkg-teplate])
|
||||||
|
# Set makepkg split debugging symbol package suffix
|
||||||
|
AC_SUBST(DEBUGSUFFIX)
|
||||||
|
AC_DEFINE_UNQUOTED([DEBUGSUFFIX], "$DEBUGSUFFIX", [The suffix for debugging symbol packages used by makepkg])
|
||||||
|
# Set shell used by install scriptlets
|
||||||
|
AC_SUBST(SCRIPTLET_SHELL)
|
||||||
|
AC_DEFINE_UNQUOTED([SCRIPTLET_SHELL], "$SCRIPTLET_SHELL", [The full path of the shell used to run install scriptlets])
|
||||||
|
# Set ldconfig path
|
||||||
|
AC_SUBST(LDCONFIG)
|
||||||
|
AC_DEFINE_UNQUOTED([LDCONFIG], "$LDCONFIG", [The full path to ldconfig])
|
||||||
|
|
||||||
|
|
||||||
|
# Configuration files
|
||||||
|
AC_CONFIG_FILES([
|
||||||
|
lib/libalpm/Makefile
|
||||||
|
lib/libalpm/po/Makefile.in
|
||||||
|
lib/libalpm/libalpm.pc
|
||||||
|
src/common/Makefile
|
||||||
|
src/pacman/Makefile
|
||||||
|
src/pacman/po/Makefile.in
|
||||||
|
src/util/Makefile
|
||||||
|
scripts/Makefile
|
||||||
|
scripts/po/Makefile.in
|
||||||
|
doc/Makefile
|
||||||
|
etc/Makefile
|
||||||
|
test/pacman/Makefile
|
||||||
|
test/pacman/tests/Makefile
|
||||||
|
test/scripts/Makefile
|
||||||
|
test/util/Makefile
|
||||||
|
Makefile
|
||||||
|
])
|
||||||
|
AC_OUTPUT
|
||||||
|
|
||||||
|
echo "
|
||||||
|
${PACKAGE_NAME}:
|
||||||
|
|
||||||
|
Build information:
|
||||||
|
source code location : ${srcdir}
|
||||||
|
prefix : ${prefix}
|
||||||
|
sysconfdir : $(eval echo ${sysconfdir})
|
||||||
|
conf file : $(eval echo ${sysconfdir})/pacman.conf
|
||||||
|
localstatedir : $(eval echo ${localstatedir})
|
||||||
|
database dir : $(eval echo ${localstatedir})/lib/pacman/
|
||||||
|
cache dir : $(eval echo ${localstatedir})/cache/pacman/pkg/
|
||||||
|
|
||||||
|
compiler : ${CC}
|
||||||
|
preprocessor flags : ${CPPFLAGS}
|
||||||
|
compiler flags : ${WARNING_CFLAGS} ${CFLAGS}
|
||||||
|
library flags : ${LIBS} ${LIBSSL_LIBS} ${NETTLE_LIBS} ${LIBARCHIVE_LIBS} ${LIBCURL_LIBS} ${GPGME_LIBS}
|
||||||
|
linker flags : ${LDFLAGS}
|
||||||
|
|
||||||
|
Architecture : ${CARCH}
|
||||||
|
Host Type : ${CHOST}
|
||||||
|
File inode command : ${INODECMD}
|
||||||
|
File owner command : ${OWNERCMD}
|
||||||
|
File mode command : ${MODECMD}
|
||||||
|
In-place sed command : ${SEDPATH} ${SEDINPLACEFLAGS}
|
||||||
|
|
||||||
|
libalpm version : ${LIB_VERSION}
|
||||||
|
libalpm version info : ${LIB_VERSION_INFO}
|
||||||
|
pacman version : ${PACKAGE_VERSION}
|
||||||
|
using git version : ${usegitver}
|
||||||
|
|
||||||
|
Directory and file information:
|
||||||
|
root working directory : ${ROOTDIR}
|
||||||
|
package extension : ${PKGEXT}
|
||||||
|
source pkg extension : ${SRCEXT}
|
||||||
|
build script name : ${BUILDSCRIPT}
|
||||||
|
template directory : ${TEMPLATE_DIR}
|
||||||
|
|
||||||
|
Compilation options:
|
||||||
|
Use libcurl : ${have_libcurl}
|
||||||
|
Use GPGME : ${have_gpgme}
|
||||||
|
Use OpenSSL : ${have_openssl}
|
||||||
|
Use nettle : ${have_nettle}
|
||||||
|
Run make in doc/ dir : ${wantdoc} ${asciidoc}
|
||||||
|
Doxygen support : ${usedoxygen}
|
||||||
|
debug support : ${debug}
|
||||||
|
extra warning flags : ${warningflags}
|
||||||
|
use git version : ${wantgitver}
|
||||||
|
"
|
||||||
1
doc/.gitignore
vendored
1
doc/.gitignore
vendored
@@ -6,4 +6,3 @@ asciidoc.js
|
|||||||
*.xml
|
*.xml
|
||||||
man3
|
man3
|
||||||
website.tar.gz
|
website.tar.gz
|
||||||
Doxyfile
|
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
/////
|
||||||
|
vim:set ts=4 sw=4 syntax=asciidoc noet spell spelllang=en_us:
|
||||||
|
/////
|
||||||
BUILDINFO(5)
|
BUILDINFO(5)
|
||||||
============
|
============
|
||||||
|
|
||||||
@@ -18,7 +21,7 @@ value.
|
|||||||
Description
|
Description
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
This is a description of the contents of version '2' of the
|
This is a description of the contents of version '1' of the
|
||||||
BUILDINFO file format.
|
BUILDINFO file format.
|
||||||
|
|
||||||
*format*::
|
*format*::
|
||||||
@@ -50,18 +53,6 @@ BUILDINFO file format.
|
|||||||
*builddir*::
|
*builddir*::
|
||||||
The directory where the package was built.
|
The directory where the package was built.
|
||||||
|
|
||||||
*startdir*::
|
|
||||||
The directory from which makepkg was executed.
|
|
||||||
|
|
||||||
*buildtool*::
|
|
||||||
The name of the tool ecosystem used to set up the build environment. Used
|
|
||||||
for defining a spec for reproducible builds, e.g. the source of the
|
|
||||||
linkman:makepkg.conf[5] used.
|
|
||||||
|
|
||||||
*buildtoolver*::
|
|
||||||
The full version of the 'buildtool', for example:
|
|
||||||
"$pkgver-$pkgrel-$pkgarch".
|
|
||||||
|
|
||||||
*buildenv (array)*::
|
*buildenv (array)*::
|
||||||
The build environment specified in makepkg.conf.
|
The build environment specified in makepkg.conf.
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Doxyfile 1.9.3
|
# Doxyfile 1.8.2
|
||||||
|
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# Project related configuration options
|
# Project related configuration options
|
||||||
@@ -8,9 +8,8 @@ PROJECT_NAME = libalpm
|
|||||||
PROJECT_NUMBER =
|
PROJECT_NUMBER =
|
||||||
PROJECT_BRIEF = "Arch Linux Package Manager Library"
|
PROJECT_BRIEF = "Arch Linux Package Manager Library"
|
||||||
PROJECT_LOGO =
|
PROJECT_LOGO =
|
||||||
OUTPUT_DIRECTORY = @OUTPUT_DIRECTORY@
|
OUTPUT_DIRECTORY = ./
|
||||||
CREATE_SUBDIRS = NO
|
CREATE_SUBDIRS = NO
|
||||||
ALLOW_UNICODE_NAMES = NO
|
|
||||||
OUTPUT_LANGUAGE = English
|
OUTPUT_LANGUAGE = English
|
||||||
BRIEF_MEMBER_DESC = YES
|
BRIEF_MEMBER_DESC = YES
|
||||||
REPEAT_BRIEF = YES
|
REPEAT_BRIEF = YES
|
||||||
@@ -32,47 +31,41 @@ STRIP_FROM_PATH =
|
|||||||
STRIP_FROM_INC_PATH =
|
STRIP_FROM_INC_PATH =
|
||||||
SHORT_NAMES = NO
|
SHORT_NAMES = NO
|
||||||
JAVADOC_AUTOBRIEF = YES
|
JAVADOC_AUTOBRIEF = YES
|
||||||
JAVADOC_BANNER = NO
|
|
||||||
QT_AUTOBRIEF = NO
|
QT_AUTOBRIEF = NO
|
||||||
MULTILINE_CPP_IS_BRIEF = NO
|
MULTILINE_CPP_IS_BRIEF = NO
|
||||||
PYTHON_DOCSTRING = YES
|
|
||||||
INHERIT_DOCS = YES
|
INHERIT_DOCS = YES
|
||||||
SEPARATE_MEMBER_PAGES = NO
|
SEPARATE_MEMBER_PAGES = NO
|
||||||
TAB_SIZE = 4
|
TAB_SIZE = 4
|
||||||
ALIASES =
|
ALIASES =
|
||||||
|
TCL_SUBST =
|
||||||
OPTIMIZE_OUTPUT_FOR_C = YES
|
OPTIMIZE_OUTPUT_FOR_C = YES
|
||||||
OPTIMIZE_OUTPUT_JAVA = NO
|
OPTIMIZE_OUTPUT_JAVA = NO
|
||||||
OPTIMIZE_FOR_FORTRAN = NO
|
OPTIMIZE_FOR_FORTRAN = NO
|
||||||
OPTIMIZE_OUTPUT_VHDL = NO
|
OPTIMIZE_OUTPUT_VHDL = NO
|
||||||
OPTIMIZE_OUTPUT_SLICE = NO
|
|
||||||
EXTENSION_MAPPING =
|
EXTENSION_MAPPING =
|
||||||
MARKDOWN_SUPPORT = YES
|
MARKDOWN_SUPPORT = YES
|
||||||
TOC_INCLUDE_HEADINGS = 5
|
|
||||||
AUTOLINK_SUPPORT = YES
|
AUTOLINK_SUPPORT = YES
|
||||||
BUILTIN_STL_SUPPORT = NO
|
BUILTIN_STL_SUPPORT = NO
|
||||||
CPP_CLI_SUPPORT = NO
|
CPP_CLI_SUPPORT = NO
|
||||||
SIP_SUPPORT = NO
|
SIP_SUPPORT = NO
|
||||||
IDL_PROPERTY_SUPPORT = YES
|
IDL_PROPERTY_SUPPORT = YES
|
||||||
DISTRIBUTE_GROUP_DOC = NO
|
DISTRIBUTE_GROUP_DOC = NO
|
||||||
GROUP_NESTED_COMPOUNDS = NO
|
|
||||||
SUBGROUPING = YES
|
SUBGROUPING = YES
|
||||||
INLINE_GROUPED_CLASSES = NO
|
INLINE_GROUPED_CLASSES = NO
|
||||||
INLINE_SIMPLE_STRUCTS = YES
|
INLINE_SIMPLE_STRUCTS = NO
|
||||||
TYPEDEF_HIDES_STRUCT = YES
|
TYPEDEF_HIDES_STRUCT = NO
|
||||||
|
SYMBOL_CACHE_SIZE = 0
|
||||||
LOOKUP_CACHE_SIZE = 0
|
LOOKUP_CACHE_SIZE = 0
|
||||||
NUM_PROC_THREADS = 1
|
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# Build related configuration options
|
# Build related configuration options
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
EXTRACT_ALL = NO
|
EXTRACT_ALL = NO
|
||||||
EXTRACT_PRIVATE = NO
|
EXTRACT_PRIVATE = NO
|
||||||
EXTRACT_PRIV_VIRTUAL = NO
|
|
||||||
EXTRACT_PACKAGE = NO
|
EXTRACT_PACKAGE = NO
|
||||||
EXTRACT_STATIC = NO
|
EXTRACT_STATIC = NO
|
||||||
EXTRACT_LOCAL_CLASSES = YES
|
EXTRACT_LOCAL_CLASSES = YES
|
||||||
EXTRACT_LOCAL_METHODS = NO
|
EXTRACT_LOCAL_METHODS = NO
|
||||||
EXTRACT_ANON_NSPACES = NO
|
EXTRACT_ANON_NSPACES = NO
|
||||||
RESOLVE_UNNAMED_PARAMS = YES
|
|
||||||
HIDE_UNDOC_MEMBERS = NO
|
HIDE_UNDOC_MEMBERS = NO
|
||||||
HIDE_UNDOC_CLASSES = NO
|
HIDE_UNDOC_CLASSES = NO
|
||||||
HIDE_FRIEND_COMPOUNDS = NO
|
HIDE_FRIEND_COMPOUNDS = NO
|
||||||
@@ -80,10 +73,7 @@ HIDE_IN_BODY_DOCS = YES
|
|||||||
INTERNAL_DOCS = NO
|
INTERNAL_DOCS = NO
|
||||||
CASE_SENSE_NAMES = YES
|
CASE_SENSE_NAMES = YES
|
||||||
HIDE_SCOPE_NAMES = NO
|
HIDE_SCOPE_NAMES = NO
|
||||||
HIDE_COMPOUND_REFERENCE= NO
|
|
||||||
SHOW_HEADERFILE = YES
|
|
||||||
SHOW_INCLUDE_FILES = YES
|
SHOW_INCLUDE_FILES = YES
|
||||||
SHOW_GROUPED_MEMB_INC = NO
|
|
||||||
FORCE_LOCAL_INCLUDES = NO
|
FORCE_LOCAL_INCLUDES = NO
|
||||||
INLINE_INFO = YES
|
INLINE_INFO = YES
|
||||||
SORT_MEMBER_DOCS = YES
|
SORT_MEMBER_DOCS = YES
|
||||||
@@ -105,30 +95,26 @@ FILE_VERSION_FILTER =
|
|||||||
LAYOUT_FILE =
|
LAYOUT_FILE =
|
||||||
CITE_BIB_FILES =
|
CITE_BIB_FILES =
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# Configuration options related to warning and progress messages
|
# configuration options related to warning and progress messages
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
QUIET = NO
|
QUIET = NO
|
||||||
WARNINGS = YES
|
WARNINGS = YES
|
||||||
WARN_IF_UNDOCUMENTED = YES
|
WARN_IF_UNDOCUMENTED = YES
|
||||||
WARN_IF_DOC_ERROR = YES
|
WARN_IF_DOC_ERROR = YES
|
||||||
WARN_IF_INCOMPLETE_DOC = YES
|
|
||||||
WARN_NO_PARAMDOC = NO
|
WARN_NO_PARAMDOC = NO
|
||||||
WARN_AS_ERROR = NO
|
|
||||||
WARN_FORMAT = "$file:$line: $text"
|
WARN_FORMAT = "$file:$line: $text"
|
||||||
WARN_LOGFILE =
|
WARN_LOGFILE =
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# Configuration options related to the input files
|
# configuration options related to the input files
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
INPUT = @INPUT_DIRECTORY@/../lib/libalpm/alpm.h \
|
INPUT = ../lib/libalpm/
|
||||||
@INPUT_DIRECTORY@/../lib/libalpm/alpm_list.h
|
|
||||||
INPUT_ENCODING = UTF-8
|
INPUT_ENCODING = UTF-8
|
||||||
FILE_PATTERNS =
|
FILE_PATTERNS =
|
||||||
RECURSIVE = NO
|
RECURSIVE = NO
|
||||||
EXCLUDE =
|
EXCLUDE =
|
||||||
EXCLUDE_SYMLINKS = NO
|
EXCLUDE_SYMLINKS = NO
|
||||||
EXCLUDE_PATTERNS =
|
EXCLUDE_PATTERNS =
|
||||||
EXCLUDE_SYMBOLS = _alpm_* \
|
EXCLUDE_SYMBOLS =
|
||||||
__alpm_*
|
|
||||||
EXAMPLE_PATH =
|
EXAMPLE_PATH =
|
||||||
EXAMPLE_PATTERNS = *
|
EXAMPLE_PATTERNS = *
|
||||||
EXAMPLE_RECURSIVE = NO
|
EXAMPLE_RECURSIVE = NO
|
||||||
@@ -137,9 +123,8 @@ INPUT_FILTER =
|
|||||||
FILTER_PATTERNS =
|
FILTER_PATTERNS =
|
||||||
FILTER_SOURCE_FILES = NO
|
FILTER_SOURCE_FILES = NO
|
||||||
FILTER_SOURCE_PATTERNS =
|
FILTER_SOURCE_PATTERNS =
|
||||||
USE_MDFILE_AS_MAINPAGE =
|
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# Configuration options related to source browsing
|
# configuration options related to source browsing
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
SOURCE_BROWSER = NO
|
SOURCE_BROWSER = NO
|
||||||
INLINE_SOURCES = NO
|
INLINE_SOURCES = NO
|
||||||
@@ -147,16 +132,16 @@ STRIP_CODE_COMMENTS = NO
|
|||||||
REFERENCED_BY_RELATION = YES
|
REFERENCED_BY_RELATION = YES
|
||||||
REFERENCES_RELATION = YES
|
REFERENCES_RELATION = YES
|
||||||
REFERENCES_LINK_SOURCE = YES
|
REFERENCES_LINK_SOURCE = YES
|
||||||
SOURCE_TOOLTIPS = YES
|
|
||||||
USE_HTAGS = NO
|
USE_HTAGS = NO
|
||||||
VERBATIM_HEADERS = YES
|
VERBATIM_HEADERS = YES
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# Configuration options related to the alphabetical class index
|
# configuration options related to the alphabetical class index
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
ALPHABETICAL_INDEX = NO
|
ALPHABETICAL_INDEX = NO
|
||||||
|
COLS_IN_ALPHA_INDEX = 5
|
||||||
IGNORE_PREFIX =
|
IGNORE_PREFIX =
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# Configuration options related to the HTML output
|
# configuration options related to the HTML output
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
GENERATE_HTML = NO
|
GENERATE_HTML = NO
|
||||||
HTML_OUTPUT = html
|
HTML_OUTPUT = html
|
||||||
@@ -169,12 +154,11 @@ HTML_EXTRA_FILES =
|
|||||||
HTML_COLORSTYLE_HUE = 220
|
HTML_COLORSTYLE_HUE = 220
|
||||||
HTML_COLORSTYLE_SAT = 100
|
HTML_COLORSTYLE_SAT = 100
|
||||||
HTML_COLORSTYLE_GAMMA = 80
|
HTML_COLORSTYLE_GAMMA = 80
|
||||||
HTML_DYNAMIC_MENUS = YES
|
HTML_TIMESTAMP = YES
|
||||||
HTML_DYNAMIC_SECTIONS = NO
|
HTML_DYNAMIC_SECTIONS = NO
|
||||||
HTML_INDEX_NUM_ENTRIES = 100
|
HTML_INDEX_NUM_ENTRIES = 100
|
||||||
GENERATE_DOCSET = NO
|
GENERATE_DOCSET = NO
|
||||||
DOCSET_FEEDNAME = "Doxygen generated docs"
|
DOCSET_FEEDNAME = "Doxygen generated docs"
|
||||||
DOCSET_FEEDURL =
|
|
||||||
DOCSET_BUNDLE_ID = org.doxygen.Project
|
DOCSET_BUNDLE_ID = org.doxygen.Project
|
||||||
DOCSET_PUBLISHER_ID = org.doxygen.Publisher
|
DOCSET_PUBLISHER_ID = org.doxygen.Publisher
|
||||||
DOCSET_PUBLISHER_NAME = Publisher
|
DOCSET_PUBLISHER_NAME = Publisher
|
||||||
@@ -197,50 +181,36 @@ GENERATE_ECLIPSEHELP = NO
|
|||||||
ECLIPSE_DOC_ID = org.doxygen.Project
|
ECLIPSE_DOC_ID = org.doxygen.Project
|
||||||
DISABLE_INDEX = NO
|
DISABLE_INDEX = NO
|
||||||
GENERATE_TREEVIEW = NO
|
GENERATE_TREEVIEW = NO
|
||||||
FULL_SIDEBAR = NO
|
|
||||||
ENUM_VALUES_PER_LINE = 4
|
ENUM_VALUES_PER_LINE = 4
|
||||||
TREEVIEW_WIDTH = 250
|
TREEVIEW_WIDTH = 250
|
||||||
EXT_LINKS_IN_WINDOW = NO
|
EXT_LINKS_IN_WINDOW = NO
|
||||||
OBFUSCATE_EMAILS = YES
|
|
||||||
HTML_FORMULA_FORMAT = png
|
|
||||||
FORMULA_FONTSIZE = 10
|
FORMULA_FONTSIZE = 10
|
||||||
FORMULA_MACROFILE =
|
FORMULA_TRANSPARENT = YES
|
||||||
USE_MATHJAX = NO
|
USE_MATHJAX = NO
|
||||||
MATHJAX_VERSION = MathJax_2
|
|
||||||
MATHJAX_FORMAT = HTML-CSS
|
|
||||||
MATHJAX_RELPATH = http://www.mathjax.org/mathjax
|
MATHJAX_RELPATH = http://www.mathjax.org/mathjax
|
||||||
MATHJAX_EXTENSIONS =
|
MATHJAX_EXTENSIONS =
|
||||||
MATHJAX_CODEFILE =
|
|
||||||
SEARCHENGINE = NO
|
SEARCHENGINE = NO
|
||||||
SERVER_BASED_SEARCH = NO
|
SERVER_BASED_SEARCH = NO
|
||||||
EXTERNAL_SEARCH = NO
|
|
||||||
SEARCHENGINE_URL =
|
|
||||||
SEARCHDATA_FILE = searchdata.xml
|
|
||||||
EXTERNAL_SEARCH_ID =
|
|
||||||
EXTRA_SEARCH_MAPPINGS =
|
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# Configuration options related to the LaTeX output
|
# configuration options related to the LaTeX output
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
GENERATE_LATEX = NO
|
GENERATE_LATEX = NO
|
||||||
LATEX_OUTPUT = latex
|
LATEX_OUTPUT = latex
|
||||||
LATEX_CMD_NAME = latex
|
LATEX_CMD_NAME = latex
|
||||||
MAKEINDEX_CMD_NAME = makeindex
|
MAKEINDEX_CMD_NAME = makeindex
|
||||||
LATEX_MAKEINDEX_CMD = makeindex
|
|
||||||
COMPACT_LATEX = NO
|
COMPACT_LATEX = NO
|
||||||
PAPER_TYPE = letter
|
PAPER_TYPE = letter
|
||||||
EXTRA_PACKAGES =
|
EXTRA_PACKAGES =
|
||||||
LATEX_HEADER =
|
LATEX_HEADER =
|
||||||
LATEX_FOOTER =
|
LATEX_FOOTER =
|
||||||
LATEX_EXTRA_STYLESHEET =
|
|
||||||
LATEX_EXTRA_FILES =
|
|
||||||
PDF_HYPERLINKS = NO
|
PDF_HYPERLINKS = NO
|
||||||
USE_PDFLATEX = NO
|
USE_PDFLATEX = NO
|
||||||
LATEX_BATCHMODE = NO
|
LATEX_BATCHMODE = NO
|
||||||
LATEX_HIDE_INDICES = NO
|
LATEX_HIDE_INDICES = NO
|
||||||
|
LATEX_SOURCE_CODE = NO
|
||||||
LATEX_BIB_STYLE = plain
|
LATEX_BIB_STYLE = plain
|
||||||
LATEX_EMOJI_DIRECTORY =
|
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# Configuration options related to the RTF output
|
# configuration options related to the RTF output
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
GENERATE_RTF = NO
|
GENERATE_RTF = NO
|
||||||
RTF_OUTPUT = rtf
|
RTF_OUTPUT = rtf
|
||||||
@@ -249,31 +219,26 @@ RTF_HYPERLINKS = NO
|
|||||||
RTF_STYLESHEET_FILE =
|
RTF_STYLESHEET_FILE =
|
||||||
RTF_EXTENSIONS_FILE =
|
RTF_EXTENSIONS_FILE =
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# Configuration options related to the man page output
|
# configuration options related to the man page output
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
GENERATE_MAN = YES
|
GENERATE_MAN = YES
|
||||||
MAN_OUTPUT = .
|
MAN_OUTPUT = .
|
||||||
MAN_EXTENSION = .3
|
MAN_EXTENSION = .3
|
||||||
MAN_SUBDIR =
|
|
||||||
MAN_LINKS = NO
|
MAN_LINKS = NO
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# Configuration options related to the XML output
|
# configuration options related to the XML output
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
GENERATE_XML = NO
|
GENERATE_XML = NO
|
||||||
XML_OUTPUT = xml
|
XML_OUTPUT = xml
|
||||||
|
XML_SCHEMA =
|
||||||
|
XML_DTD =
|
||||||
XML_PROGRAMLISTING = YES
|
XML_PROGRAMLISTING = YES
|
||||||
XML_NS_MEMB_FILE_SCOPE = NO
|
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# Configuration options related to the DOCBOOK output
|
# configuration options for the AutoGen Definitions output
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
GENERATE_DOCBOOK = NO
|
|
||||||
DOCBOOK_OUTPUT = docbook
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Configuration options for the AutoGen Definitions output
|
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
GENERATE_AUTOGEN_DEF = NO
|
GENERATE_AUTOGEN_DEF = NO
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# Configuration options related to the Perl module output
|
# configuration options related to the Perl module output
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
GENERATE_PERLMOD = NO
|
GENERATE_PERLMOD = NO
|
||||||
PERLMOD_LATEX = NO
|
PERLMOD_LATEX = NO
|
||||||
@@ -289,6 +254,7 @@ SEARCH_INCLUDES = YES
|
|||||||
INCLUDE_PATH = ../..
|
INCLUDE_PATH = ../..
|
||||||
INCLUDE_FILE_PATTERNS = *.h
|
INCLUDE_FILE_PATTERNS = *.h
|
||||||
PREDEFINED = HAVE_CONFIG_H= \
|
PREDEFINED = HAVE_CONFIG_H= \
|
||||||
|
SYMHIDDEN= \
|
||||||
SYMEXPORT= \
|
SYMEXPORT= \
|
||||||
HAVE_LIBARCHIVE \
|
HAVE_LIBARCHIVE \
|
||||||
HAVE_LIBCURL \
|
HAVE_LIBCURL \
|
||||||
@@ -296,28 +262,29 @@ PREDEFINED = HAVE_CONFIG_H= \
|
|||||||
EXPAND_AS_DEFINED =
|
EXPAND_AS_DEFINED =
|
||||||
SKIP_FUNCTION_MACROS = YES
|
SKIP_FUNCTION_MACROS = YES
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# Configuration options related to external references
|
# Configuration::additions related to external references
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
TAGFILES =
|
TAGFILES =
|
||||||
GENERATE_TAGFILE =
|
GENERATE_TAGFILE =
|
||||||
ALLEXTERNALS = NO
|
ALLEXTERNALS = NO
|
||||||
EXTERNAL_GROUPS = YES
|
EXTERNAL_GROUPS = YES
|
||||||
EXTERNAL_PAGES = YES
|
PERL_PATH = /usr/bin/perl
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# Configuration options related to the dot tool
|
# Configuration options related to the dot tool
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
DIA_PATH =
|
CLASS_DIAGRAMS = NO
|
||||||
|
MSCGEN_PATH =
|
||||||
HIDE_UNDOC_RELATIONS = YES
|
HIDE_UNDOC_RELATIONS = YES
|
||||||
HAVE_DOT = YES
|
HAVE_DOT = YES
|
||||||
DOT_NUM_THREADS = 0
|
DOT_NUM_THREADS = 0
|
||||||
|
DOT_FONTNAME = Helvetica
|
||||||
|
DOT_FONTSIZE = 10
|
||||||
DOT_FONTPATH =
|
DOT_FONTPATH =
|
||||||
CLASS_GRAPH = YES
|
CLASS_GRAPH = YES
|
||||||
COLLABORATION_GRAPH = YES
|
COLLABORATION_GRAPH = YES
|
||||||
GROUP_GRAPHS = YES
|
GROUP_GRAPHS = YES
|
||||||
UML_LOOK = NO
|
UML_LOOK = NO
|
||||||
UML_LIMIT_NUM_FIELDS = 10
|
UML_LIMIT_NUM_FIELDS = 10
|
||||||
DOT_UML_DETAILS = NO
|
|
||||||
DOT_WRAP_THRESHOLD = 17
|
|
||||||
TEMPLATE_RELATIONS = NO
|
TEMPLATE_RELATIONS = NO
|
||||||
INCLUDE_GRAPH = YES
|
INCLUDE_GRAPH = YES
|
||||||
INCLUDED_BY_GRAPH = YES
|
INCLUDED_BY_GRAPH = YES
|
||||||
@@ -325,18 +292,14 @@ CALL_GRAPH = NO
|
|||||||
CALLER_GRAPH = NO
|
CALLER_GRAPH = NO
|
||||||
GRAPHICAL_HIERARCHY = YES
|
GRAPHICAL_HIERARCHY = YES
|
||||||
DIRECTORY_GRAPH = YES
|
DIRECTORY_GRAPH = YES
|
||||||
DIR_GRAPH_MAX_DEPTH = 1
|
|
||||||
DOT_IMAGE_FORMAT = png
|
DOT_IMAGE_FORMAT = png
|
||||||
INTERACTIVE_SVG = NO
|
INTERACTIVE_SVG = NO
|
||||||
DOT_PATH =
|
DOT_PATH =
|
||||||
DOTFILE_DIRS =
|
DOTFILE_DIRS =
|
||||||
MSCFILE_DIRS =
|
MSCFILE_DIRS =
|
||||||
DIAFILE_DIRS =
|
|
||||||
PLANTUML_JAR_PATH =
|
|
||||||
PLANTUML_CFG_FILE =
|
|
||||||
PLANTUML_INCLUDE_PATH =
|
|
||||||
DOT_GRAPH_MAX_NODES = 50
|
DOT_GRAPH_MAX_NODES = 50
|
||||||
MAX_DOT_GRAPH_DEPTH = 3
|
MAX_DOT_GRAPH_DEPTH = 3
|
||||||
|
DOT_TRANSPARENT = NO
|
||||||
DOT_MULTI_TARGETS = NO
|
DOT_MULTI_TARGETS = NO
|
||||||
GENERATE_LEGEND = YES
|
GENERATE_LEGEND = YES
|
||||||
DOT_CLEANUP = YES
|
DOT_CLEANUP = YES
|
||||||
178
doc/Makefile.am
Normal file
178
doc/Makefile.am
Normal file
@@ -0,0 +1,178 @@
|
|||||||
|
# We have to do some funny stuff here with the manpages. In order to ensure
|
||||||
|
# a dist tarball doesn't get put out there without manpages, we keep those
|
||||||
|
# files listed in EXTRA_DIST no matter what. However, we only add them to
|
||||||
|
# man_MANS if --enable-asciidoc and/or --enable-doxygen are used.
|
||||||
|
|
||||||
|
ASCIIDOC_MANS = \
|
||||||
|
alpm-hooks.5 \
|
||||||
|
pacman.8 \
|
||||||
|
makepkg.8 \
|
||||||
|
makepkg-template.1 \
|
||||||
|
repo-add.8 \
|
||||||
|
vercmp.8 \
|
||||||
|
pkgdelta.8 \
|
||||||
|
pacman-key.8 \
|
||||||
|
PKGBUILD.5 \
|
||||||
|
makepkg.conf.5 \
|
||||||
|
pacman.conf.5 \
|
||||||
|
libalpm.3 \
|
||||||
|
BUILDINFO.5
|
||||||
|
|
||||||
|
DOXYGEN_MANS = $(wildcard man3/*.3)
|
||||||
|
|
||||||
|
HTML_MANPAGES = \
|
||||||
|
alpm-hooks.5.html \
|
||||||
|
pacman.8.html \
|
||||||
|
makepkg.8.html \
|
||||||
|
makepkg-template.1.html \
|
||||||
|
repo-add.8.html \
|
||||||
|
vercmp.8.html \
|
||||||
|
pkgdelta.8.html \
|
||||||
|
pacman-key.8.html \
|
||||||
|
PKGBUILD.5.html \
|
||||||
|
makepkg.conf.5.html \
|
||||||
|
pacman.conf.5.html \
|
||||||
|
libalpm.3.html
|
||||||
|
|
||||||
|
HTML_OTHER = \
|
||||||
|
index.html \
|
||||||
|
submitting-patches.html \
|
||||||
|
translation-help.html \
|
||||||
|
HACKING.html
|
||||||
|
|
||||||
|
HTML_DOCS = \
|
||||||
|
$(HTML_MANPAGES) \
|
||||||
|
$(HTML_OTHER)
|
||||||
|
|
||||||
|
EXTRA_DIST = \
|
||||||
|
asciidoc.conf \
|
||||||
|
asciidoc-override.css \
|
||||||
|
alpm-hooks.5.asciidoc \
|
||||||
|
pacman.8.asciidoc \
|
||||||
|
makepkg.8.asciidoc \
|
||||||
|
makepkg-template.1.asciidoc \
|
||||||
|
repo-add.8.asciidoc \
|
||||||
|
vercmp.8.asciidoc \
|
||||||
|
pkgdelta.8.asciidoc \
|
||||||
|
pacman-key.8.asciidoc \
|
||||||
|
PKGBUILD.5.asciidoc \
|
||||||
|
PKGBUILD-example.txt \
|
||||||
|
makepkg.conf.5.asciidoc \
|
||||||
|
pacman.conf.5.asciidoc \
|
||||||
|
BUILDINFO.5.asciidoc \
|
||||||
|
libalpm.3.asciidoc \
|
||||||
|
footer.asciidoc \
|
||||||
|
index.asciidoc \
|
||||||
|
submitting-patches.asciidoc \
|
||||||
|
translation-help.asciidoc \
|
||||||
|
Doxyfile \
|
||||||
|
$(ASCIIDOC_MANS) \
|
||||||
|
$(DOXYGEN_MANS)
|
||||||
|
|
||||||
|
# Files that should be removed, but which Automake does not know.
|
||||||
|
MOSTLYCLEANFILES = *.xml $(ASCIIDOC_MANS) $(HTML_DOCS) repo-remove.8 website.tar.gz
|
||||||
|
|
||||||
|
# Ensure manpages are fresh when building a dist tarball
|
||||||
|
dist-hook:
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) clean
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) all
|
||||||
|
|
||||||
|
if USE_GIT_VERSION
|
||||||
|
GIT_VERSION := $(shell sh -c 'git describe --abbrev=4 --dirty | sed s/^v//')
|
||||||
|
REAL_PACKAGE_VERSION = $(GIT_VERSION)
|
||||||
|
else
|
||||||
|
REAL_PACKAGE_VERSION = $(PACKAGE_VERSION)
|
||||||
|
endif
|
||||||
|
|
||||||
|
man_MANS =
|
||||||
|
dist_man_MANS = $(ASCIIDOC_MANS)
|
||||||
|
|
||||||
|
if USE_DOXYGEN
|
||||||
|
man_MANS += $(DOXYGEN_MANS)
|
||||||
|
|
||||||
|
all-local: doxygen.in
|
||||||
|
|
||||||
|
doxygen.in:
|
||||||
|
$(DOXYGEN) $(srcdir)/Doxyfile
|
||||||
|
endif
|
||||||
|
|
||||||
|
html: $(HTML_DOCS)
|
||||||
|
|
||||||
|
website: website.tar.gz
|
||||||
|
|
||||||
|
.PHONY: html website
|
||||||
|
|
||||||
|
website.tar.gz: html
|
||||||
|
$(AM_V_GEN)bsdtar czf $@ $(HTML_DOCS) \
|
||||||
|
asciidoc-override.css \
|
||||||
|
-C /etc/asciidoc/stylesheets/ \
|
||||||
|
asciidoc.css \
|
||||||
|
-C /etc/asciidoc/javascripts/ \
|
||||||
|
asciidoc.js \
|
||||||
|
-C /etc/asciidoc/ \
|
||||||
|
images
|
||||||
|
|
||||||
|
pkgdatadir = ${datadir}/${PACKAGE}
|
||||||
|
|
||||||
|
ASCIIDOC_OPTS = \
|
||||||
|
-f $(srcdir)/asciidoc.conf \
|
||||||
|
-a pacman_version="$(REAL_PACKAGE_VERSION)" \
|
||||||
|
-a pacman_date="`date +%Y-%m-%d`" \
|
||||||
|
-a pkgdatadir=$(pkgdatadir) \
|
||||||
|
-a localstatedir=$(localstatedir) \
|
||||||
|
-a sysconfdir=$(sysconfdir) \
|
||||||
|
-a datarootdir=$(datarootdir)
|
||||||
|
|
||||||
|
A2X_OPTS = \
|
||||||
|
--no-xmllint \
|
||||||
|
-d manpage \
|
||||||
|
-f manpage \
|
||||||
|
--xsltproc-opts='-param man.endnotes.list.enabled 0 -param man.endnotes.are.numbered 0'
|
||||||
|
|
||||||
|
# These rules are due to the includes and files of the asciidoc text
|
||||||
|
$(ASCIIDOC_MANS): asciidoc.conf footer.asciidoc Makefile.am
|
||||||
|
$(AM_V_GEN)a2x $(A2X_OPTS) --asciidoc-opts="$(ASCIIDOC_OPTS) --out-file=./$@.xml" $(srcdir)/$@.asciidoc
|
||||||
|
|
||||||
|
%.html: %.asciidoc
|
||||||
|
$(AM_V_GEN)asciidoc $(ASCIIDOC_OPTS) -o - $*.asciidoc | \
|
||||||
|
sed -e 's/\r$$//' > $@
|
||||||
|
|
||||||
|
HACKING.html: ../HACKING
|
||||||
|
$(AM_V_GEN)asciidoc $(ASCIIDOC_OPTS) -o - ../HACKING | \
|
||||||
|
sed -e 's/\r$$//' > $@
|
||||||
|
|
||||||
|
# Customizations for certain HTML docs
|
||||||
|
$(HTML_MANPAGES): asciidoc.conf footer.asciidoc Makefile.am
|
||||||
|
$(HTML_OTHER): asciidoc.conf Makefile.am
|
||||||
|
%.html: ASCIIDOC_OPTS += -a linkcss -a toc -a icons -a max-width=960px -a stylesheet=asciidoc-override.css
|
||||||
|
%.8.html: ASCIIDOC_OPTS += -d manpage
|
||||||
|
%.5.html: ASCIIDOC_OPTS += -d manpage
|
||||||
|
%.3.html: ASCIIDOC_OPTS += -d manpage
|
||||||
|
|
||||||
|
# Dependency rules
|
||||||
|
alpm-hooks.5 alpm-hooks.5.html: alpm-hooks.5.asciidoc
|
||||||
|
pacman.8 pacman.8.html: pacman.8.asciidoc
|
||||||
|
makepkg.8 makepkg.8.html: makepkg.8.asciidoc
|
||||||
|
makepkg-template.1 makepkg-template.1.html: makepkg-template.1.asciidoc
|
||||||
|
repo-add.8 repo-add.8.html: repo-add.8.asciidoc
|
||||||
|
vercmp.8 vercmp.8.html: vercmp.8.asciidoc
|
||||||
|
pkgdelta.8 pkgdelta.8.html: pkgdelta.8.asciidoc
|
||||||
|
pacman-key.8 pacman-key.8.html: pacman-key.8.asciidoc
|
||||||
|
PKGBUILD.5 PKGBUILD.5.html: PKGBUILD.5.asciidoc PKGBUILD-example.txt
|
||||||
|
makepkg.conf.5 makepkg.conf.5.html: makepkg.conf.5.asciidoc
|
||||||
|
pacman.conf.5 pacman.conf.5.html: pacman.conf.5.asciidoc
|
||||||
|
libalpm.3 libalpm.3.html: libalpm.3.asciidoc
|
||||||
|
# this one is just a symlink
|
||||||
|
repo-remove.8: repo-add.8
|
||||||
|
$(RM) repo-remove.8
|
||||||
|
$(LN_S) repo-add.8 repo-remove.8
|
||||||
|
|
||||||
|
install-data-hook:
|
||||||
|
cd $(DESTDIR)$(mandir)/man8 && \
|
||||||
|
$(RM) repo-remove.8 && \
|
||||||
|
( $(LN_S) repo-add.8 repo-remove.8 || \
|
||||||
|
ln repo-add.8 repo-remove.8 || \
|
||||||
|
cp repo-add.8 repo-remove.8 )
|
||||||
|
|
||||||
|
uninstall-hook:
|
||||||
|
$(RM) $(DESTDIR)$(mandir)/man8/repo-remove.8
|
||||||
@@ -12,8 +12,8 @@ depends=('glibc')
|
|||||||
makedepends=('ed')
|
makedepends=('ed')
|
||||||
optdepends=('ed: for "patch -e" functionality')
|
optdepends=('ed: for "patch -e" functionality')
|
||||||
source=("ftp://ftp.gnu.org/gnu/$pkgname/$pkgname-$pkgver.tar.xz"{,.sig})
|
source=("ftp://ftp.gnu.org/gnu/$pkgname/$pkgname-$pkgver.tar.xz"{,.sig})
|
||||||
sha256sums=('9124ba46db0abd873d0995c2ca880e81252676bb6c03e0a37dfc5f608a9b0ceb'
|
md5sums=('e9ae5393426d3ad783a300a338c09b72'
|
||||||
'SKIP')
|
'SKIP')
|
||||||
|
|
||||||
build() {
|
build() {
|
||||||
cd "$srcdir/$pkgname-$pkgver"
|
cd "$srcdir/$pkgname-$pkgver"
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PKGBUILD(5)
|
|||||||
|
|
||||||
Name
|
Name
|
||||||
----
|
----
|
||||||
PKGBUILD - Package build description file
|
PKGBUILD - Arch Linux package build description file
|
||||||
|
|
||||||
|
|
||||||
Synopsis
|
Synopsis
|
||||||
@@ -60,8 +60,8 @@ systems (see below).
|
|||||||
allows package maintainers to make updates to the package's configure
|
allows package maintainers to make updates to the package's configure
|
||||||
flags, for example. This is typically set to '1' for each new upstream
|
flags, for example. This is typically set to '1' for each new upstream
|
||||||
software release and incremented for intermediate PKGBUILD updates. The
|
software release and incremented for intermediate PKGBUILD updates. The
|
||||||
variable is a positive integer, with an optional subrelease level
|
variable is a postive integer, with an optional subrelease level
|
||||||
specified by adding another positive integer separated by a period
|
specified by adding another postive integer separated by a period
|
||||||
(i.e. in the form x.y).
|
(i.e. in the form x.y).
|
||||||
|
|
||||||
*epoch*::
|
*epoch*::
|
||||||
@@ -84,7 +84,14 @@ systems (see below).
|
|||||||
|
|
||||||
*license (array)*::
|
*license (array)*::
|
||||||
This field specifies the license(s) that apply to the package.
|
This field specifies the license(s) that apply to the package.
|
||||||
If multiple licenses are applicable, list all of them:
|
Commonly used licenses can be found in '/usr/share/licenses/common'. If you
|
||||||
|
see the package's license there, simply reference it in the license
|
||||||
|
field (e.g., `license=('GPL')`). If the package provides a license not
|
||||||
|
available in '/usr/share/licenses/common', then you should include it
|
||||||
|
in the package itself and set `license=('custom')` or
|
||||||
|
`license=('custom:LicenseName')`. The license should be placed in
|
||||||
|
'$pkgdir/usr/share/licenses/$pkgname/' when building the package. If
|
||||||
|
multiple licenses are applicable, list all of them:
|
||||||
`license=('GPL' 'FDL')`.
|
`license=('GPL' 'FDL')`.
|
||||||
|
|
||||||
*install*::
|
*install*::
|
||||||
@@ -111,7 +118,7 @@ systems (see below).
|
|||||||
+
|
+
|
||||||
Additional architecture-specific sources can be added by appending an
|
Additional architecture-specific sources can be added by appending an
|
||||||
underscore and the architecture name e.g., 'source_x86_64=()'. There must be a
|
underscore and the architecture name e.g., 'source_x86_64=()'. There must be a
|
||||||
corresponding integrity array with checksums, e.g. 'cksums_x86_64=()'.
|
corresponding integrity array with checksums, e.g. 'md5sums_x86_64=()'.
|
||||||
+
|
+
|
||||||
It is also possible to change the name of the downloaded file, which is helpful
|
It is also possible to change the name of the downloaded file, which is helpful
|
||||||
with weird URLs and for handling multiple source files with the same
|
with weird URLs and for handling multiple source files with the same
|
||||||
@@ -139,19 +146,17 @@ contain whitespace characters.
|
|||||||
listed here will not be extracted with the rest of the source files. This
|
listed here will not be extracted with the rest of the source files. This
|
||||||
is useful for packages that use compressed data directly.
|
is useful for packages that use compressed data directly.
|
||||||
|
|
||||||
*cksums (array)*::
|
*md5sums (array)*::
|
||||||
This array contains CRC checksums for every source file specified in the
|
This array contains an MD5 hash for every source file specified in the
|
||||||
source array (in the same order). makepkg will use this to verify source
|
source array (in the same order). makepkg will use this to verify source
|
||||||
file integrity during subsequent builds. If 'SKIP' is put in the array
|
file integrity during subsequent builds. If 'SKIP' is put in the array
|
||||||
in place of a normal hash, the integrity check for that source file will
|
in place of a normal hash, the integrity check for that source file will
|
||||||
be skipped. To easily generate cksums, run ``makepkg -g >> PKGBUILD''.
|
be skipped. To easily generate md5sums, run ``makepkg -g >> PKGBUILD''.
|
||||||
If desired, move the cksums line to an appropriate location. Note that
|
If desired, move the md5sums line to an appropriate location.
|
||||||
checksums generated by "makepkg -g" should be verified using checksum
|
|
||||||
values provided by the software developer.
|
|
||||||
|
|
||||||
*md5sums, sha1sums, sha224sums, sha256sums, sha384sums, sha512sums, b2sums (arrays)*::
|
*sha1sums, sha224sums, sha256sums, sha384sums, sha512sums (arrays)*::
|
||||||
Alternative integrity checks that makepkg supports; these all behave
|
Alternative integrity checks that makepkg supports; these all behave
|
||||||
similar to the cksums option described above. To enable use and generation
|
similar to the md5sums option described above. To enable use and generation
|
||||||
of these checksums, be sure to set up the `INTEGRITY_CHECK` option in
|
of these checksums, be sure to set up the `INTEGRITY_CHECK` option in
|
||||||
linkman:makepkg.conf[5].
|
linkman:makepkg.conf[5].
|
||||||
|
|
||||||
@@ -180,6 +185,11 @@ contain whitespace characters.
|
|||||||
than or equal to), `<=` (less than or equal to), `=` (equal to), `>`
|
than or equal to), `<=` (less than or equal to), `=` (equal to), `>`
|
||||||
(greater than), or `<` (less than).
|
(greater than), or `<` (less than).
|
||||||
+
|
+
|
||||||
|
If the dependency name appears to be a library (ends with .so), makepkg will
|
||||||
|
try to find a binary that depends on the library in the built package and
|
||||||
|
append the version needed by the binary. Appending the version yourself
|
||||||
|
disables automatic detection.
|
||||||
|
+
|
||||||
Additional architecture-specific depends can be added by appending an
|
Additional architecture-specific depends can be added by appending an
|
||||||
underscore and the architecture name e.g., 'depends_x86_64=()'.
|
underscore and the architecture name e.g., 'depends_x86_64=()'.
|
||||||
|
|
||||||
@@ -233,6 +243,10 @@ example, dcron can provide 'cron=2.0' to satisfy the 'cron>=2.0' dependency of
|
|||||||
other packages. Provisions involving the `>` and `<` operators are invalid as
|
other packages. Provisions involving the `>` and `<` operators are invalid as
|
||||||
only specific versions of a package may be provided.
|
only specific versions of a package may be provided.
|
||||||
+
|
+
|
||||||
|
If the provision name appears to be a library (ends with .so), makepkg will
|
||||||
|
try to find the library in the built package and append the correct
|
||||||
|
version. Appending the version yourself disables automatic detection.
|
||||||
|
+
|
||||||
Additional architecture-specific provides can be added by appending an
|
Additional architecture-specific provides can be added by appending an
|
||||||
underscore and the architecture name e.g., 'provides_x86_64=()'.
|
underscore and the architecture name e.g., 'provides_x86_64=()'.
|
||||||
|
|
||||||
@@ -282,23 +296,23 @@ underscore and the architecture name e.g., 'replaces_x86_64=()'.
|
|||||||
Compress man and info pages with gzip.
|
Compress man and info pages with gzip.
|
||||||
|
|
||||||
*ccache*;;
|
*ccache*;;
|
||||||
Allow the use of ccache during `build()`. More useful in its negative
|
Allow the use of ccache during build. More useful in its negative
|
||||||
form `!ccache` with select packages that have problems building
|
form `!ccache` with select packages that have problems building
|
||||||
with ccache.
|
with ccache.
|
||||||
|
|
||||||
*distcc*;;
|
*distcc*;;
|
||||||
Allow the use of distcc during `build()`. More useful in its negative
|
Allow the use of distcc during build. More useful in its negative
|
||||||
form `!distcc` with select packages that have problems building
|
form `!distcc` with select packages that have problems building
|
||||||
with distcc.
|
with distcc.
|
||||||
|
|
||||||
*buildflags*;;
|
*buildflags*;;
|
||||||
Allow the use of user-specific buildflags (CPPFLAGS, CFLAGS, CXXFLAGS,
|
Allow the use of user-specific buildflags (CPPFLAGS, CFLAGS, CXXFLAGS,
|
||||||
LDFLAGS) during `build()` as specified in linkman:makepkg.conf[5]. More
|
LDFLAGS) during build as specified in linkman:makepkg.conf[5]. More
|
||||||
useful in its negative form `!buildflags` with select packages that
|
useful in its negative form `!buildflags` with select packages that
|
||||||
have problems building with custom buildflags.
|
have problems building with custom buildflags.
|
||||||
|
|
||||||
*makeflags*;;
|
*makeflags*;;
|
||||||
Allow the use of user-specific makeflags during `build()` as specified
|
Allow the use of user-specific makeflags during build as specified
|
||||||
in linkman:makepkg.conf[5]. More useful in its negative form
|
in linkman:makepkg.conf[5]. More useful in its negative form
|
||||||
`!makeflags` with select packages that have problems building with
|
`!makeflags` with select packages that have problems building with
|
||||||
custom makeflags such as `-j2` (or higher).
|
custom makeflags such as `-j2` (or higher).
|
||||||
@@ -309,10 +323,6 @@ underscore and the architecture name e.g., 'replaces_x86_64=()'.
|
|||||||
When used in combination with the `strip' option, a separate package
|
When used in combination with the `strip' option, a separate package
|
||||||
containing the debug symbols is created.
|
containing the debug symbols is created.
|
||||||
|
|
||||||
*lto*;;
|
|
||||||
Enable building packages using link time optimization. Adds '-flto'
|
|
||||||
to both CFLAGS and CXXFLAGS.
|
|
||||||
|
|
||||||
|
|
||||||
Packaging Functions
|
Packaging Functions
|
||||||
-------------------
|
-------------------
|
||||||
@@ -322,27 +332,12 @@ PKGBUILD must contain a `package()` function which installs all the package's
|
|||||||
files into the packaging directory, with optional `prepare()`, `build()`, and
|
files into the packaging directory, with optional `prepare()`, `build()`, and
|
||||||
`check()` functions being used to create those files from source.
|
`check()` functions being used to create those files from source.
|
||||||
|
|
||||||
This is directly sourced and executed by makepkg, so anything that Bash or the
|
|
||||||
system has available is available for use here. Be sure any exotic commands
|
|
||||||
used are covered by the `makedepends` array.
|
|
||||||
|
|
||||||
If you create any variables of your own in any of these functions, it is
|
|
||||||
recommended to use the Bash `local` keyword to scope the variable to inside the
|
|
||||||
function.
|
|
||||||
|
|
||||||
*package() Function*::
|
*package() Function*::
|
||||||
The `package()` function is used to install files into the directory that
|
The `package()` function is used to install files into the directory that
|
||||||
will become the root directory of the built package and is run after all
|
will become the root directory of the built package and is run after all
|
||||||
the optional functions listed below. The packaging stage is run using
|
the optional functions listed below. The packaging stage is run using
|
||||||
fakeroot to ensure correct file permissions in the resulting package.
|
fakeroot to ensure correct file permissions in the resulting package.
|
||||||
All other functions will be run as the user calling makepkg.
|
All other functions will be run as the user calling makepkg.
|
||||||
This function is run inside `$srcdir`.
|
|
||||||
|
|
||||||
*verify() Function*::
|
|
||||||
An optional `verify()` function can be specified to implement arbitrary
|
|
||||||
source authentication. The function should return a non-zero exit code when
|
|
||||||
verification fails. This function is run before sources are extracted.
|
|
||||||
This function is run inside `$startdir`.
|
|
||||||
|
|
||||||
*prepare() Function*::
|
*prepare() Function*::
|
||||||
An optional `prepare()` function can be specified in which operations to
|
An optional `prepare()` function can be specified in which operations to
|
||||||
@@ -350,19 +345,23 @@ function.
|
|||||||
function is run after the source extraction and before the `build()`
|
function is run after the source extraction and before the `build()`
|
||||||
function. The `prepare()` function is skipped when source extraction
|
function. The `prepare()` function is skipped when source extraction
|
||||||
is skipped.
|
is skipped.
|
||||||
This function is run inside `$srcdir`.
|
|
||||||
|
|
||||||
*build() Function*::
|
*build() Function*::
|
||||||
The optional `build()` function is used to compile and/or adjust the source
|
The optional `build()` function is use to compile and/or adjust the source
|
||||||
files in preparation to be installed by the `package()` function.
|
files in preparation to be installed by the `package()` function. This is
|
||||||
This function is run inside `$srcdir`.
|
directly sourced and executed by makepkg, so anything that Bash or the
|
||||||
|
system has available is available for use here. Be sure any exotic
|
||||||
|
commands used are covered by the `makedepends` array.
|
||||||
|
+
|
||||||
|
If you create any variables of your own in the `build()` function, it is
|
||||||
|
recommended to use the Bash `local` keyword to scope the variable to inside
|
||||||
|
the `build()` function.
|
||||||
|
|
||||||
*check() Function*::
|
*check() Function*::
|
||||||
An optional `check()` function can be specified in which a package's
|
An optional `check()` function can be specified in which a package's
|
||||||
test-suite may be run. This function is run between the `build()` and
|
test-suite may be run. This function is run between the `build()` and
|
||||||
`package()` functions. Be sure any exotic commands used are covered by the
|
`package()` functions. Be sure any exotic commands used are covered by the
|
||||||
`checkdepends` array.
|
`checkdepends` array.
|
||||||
This function is run inside `$srcdir`.
|
|
||||||
|
|
||||||
All of the above variables such as `$pkgname` and `$pkgver` are available for
|
All of the above variables such as `$pkgname` and `$pkgver` are available for
|
||||||
use in the packaging functions. In addition, makepkg defines the following
|
use in the packaging functions. In addition, makepkg defines the following
|
||||||
@@ -372,6 +371,7 @@ variables:
|
|||||||
This contains the directory where makepkg extracts, or copies, all source
|
This contains the directory where makepkg extracts, or copies, all source
|
||||||
files.
|
files.
|
||||||
+
|
+
|
||||||
|
All of the packaging functions defined above are run starting inside `$srcdir`
|
||||||
|
|
||||||
*pkgdir*::
|
*pkgdir*::
|
||||||
This contains the directory where makepkg bundles the installed package.
|
This contains the directory where makepkg bundles the installed package.
|
||||||
@@ -465,16 +465,11 @@ reference with all of the available functions defined.
|
|||||||
Using VCS Sources[[VCS]]
|
Using VCS Sources[[VCS]]
|
||||||
------------------------
|
------------------------
|
||||||
Building a developmental version of a package using sources from a version
|
Building a developmental version of a package using sources from a version
|
||||||
control system (VCS) is enabled by specifying the source in the form:
|
control system (VCS) is enabled by specifying the source in the form
|
||||||
|
`source=('directory::url#fragment?query')`. Currently makepkg supports the
|
||||||
source=('directory::url#fragment?query')
|
Bazaar, Git, Subversion, and Mercurial version control systems. For other
|
||||||
|
version control systems, manual cloning of upstream repositories must be done
|
||||||
Currently makepkg supports the Bazaar, Git, Subversion, Fossil and Mercurial
|
in the `prepare()` function.
|
||||||
version control systems. For other version control systems, manual cloning of
|
|
||||||
upstream repositories must be done in the `prepare()` function.
|
|
||||||
|
|
||||||
Some <<VCS,VCS Sources>> like Git support pinning the checkout by a checksum of
|
|
||||||
its content using deterministic export functionality like ``git archive''.
|
|
||||||
|
|
||||||
The source URL is divided into four components:
|
The source URL is divided into four components:
|
||||||
|
|
||||||
@@ -492,16 +487,13 @@ The source URL is divided into four components:
|
|||||||
|
|
||||||
*fragment*::
|
*fragment*::
|
||||||
(optional) Allows specifying a revision number or branch for makepkg to checkout
|
(optional) Allows specifying a revision number or branch for makepkg to checkout
|
||||||
from the VCS. A fragment has the form `type=value`, for example to checkout a
|
from the VCS. For example, to checkout a given revision, the source line would
|
||||||
given revision the source line would be `source=(url#revision=123)`. The
|
have the format `source=(url#revision=123)`. The available fragments depends on
|
||||||
available types depends on the VCS being used:
|
the VCS being used:
|
||||||
|
|
||||||
*bzr*;;
|
*bzr*;;
|
||||||
revision (see `'bzr help revisionspec'` for details)
|
revision (see `'bzr help revisionspec'` for details)
|
||||||
|
|
||||||
*fossil*;;
|
|
||||||
branch, commit, tag
|
|
||||||
|
|
||||||
*git*;;
|
*git*;;
|
||||||
branch, commit, tag
|
branch, commit, tag
|
||||||
|
|
||||||
@@ -520,7 +512,8 @@ The source URL is divided into four components:
|
|||||||
Example
|
Example
|
||||||
-------
|
-------
|
||||||
The following is an example PKGBUILD for the 'patch' package. For more
|
The following is an example PKGBUILD for the 'patch' package. For more
|
||||||
examples, look through the build files of your distribution's packages.
|
examples, look through the build files of your distribution's packages. For
|
||||||
|
those using Arch Linux, consult the Arch Build System (ABS) tree.
|
||||||
|
|
||||||
[source,sh]
|
[source,sh]
|
||||||
-------------------------------
|
-------------------------------
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ SYNOPSIS
|
|||||||
--------
|
--------
|
||||||
[Trigger] (Required, Repeatable)
|
[Trigger] (Required, Repeatable)
|
||||||
Operation = Install|Upgrade|Remove (Required, Repeatable)
|
Operation = Install|Upgrade|Remove (Required, Repeatable)
|
||||||
Type = Path|Package (Required)
|
Type = File|Package (Required)
|
||||||
Target = <Path|PkgName> (Required, Repeatable)
|
Target = <Path|PkgName> (Required, Repeatable)
|
||||||
|
|
||||||
[Action] (Required)
|
[Action] (Required)
|
||||||
@@ -49,20 +49,19 @@ defined the hook will run if the transaction matches *any* of the triggers.
|
|||||||
Select the type of operation to match targets against. May be specified
|
Select the type of operation to match targets against. May be specified
|
||||||
multiple times. Installations are considered an upgrade if the package or
|
multiple times. Installations are considered an upgrade if the package or
|
||||||
file is already present on the system regardless of whether the new package
|
file is already present on the system regardless of whether the new package
|
||||||
version is actually greater than the currently installed version. For Path
|
version is actually greater than the currently installed version. For File
|
||||||
triggers, this is true even if the file changes ownership from one package
|
triggers, this is true even if the file changes ownership from one package
|
||||||
to another. Required.
|
to another. Required.
|
||||||
|
|
||||||
*Type =* Path|Package::
|
*Type =* File|Package::
|
||||||
Select whether targets are matched against transaction packages or files.
|
Select whether targets are matched against transaction packages or files.
|
||||||
See CAVEATS for special notes regarding Path triggers. 'File' is a deprecated
|
See CAVEATS for special notes regarding File triggers. Required.
|
||||||
alias for 'Path' and will be removed in a future release. Required.
|
|
||||||
|
|
||||||
*Target =* <path|package>::
|
*Target =* <path|package>::
|
||||||
The path or package name to match against the active transaction.
|
The file path or package name to match against the active transaction.
|
||||||
Paths refer to the files in the package archive; the installation root
|
File paths refer to the files in the package archive; the installation root
|
||||||
should *not* be included in the path. Shell-style glob patterns are
|
should *not* be included in the path. Shell-style glob patterns are
|
||||||
allowed. It is possible to invert matches by prepending a target with an
|
allowed. It is possible to invert matches by prepending a file with an
|
||||||
exclamation mark. May be specified multiple times. Required.
|
exclamation mark. May be specified multiple times. Required.
|
||||||
|
|
||||||
ACTIONS
|
ACTIONS
|
||||||
@@ -120,7 +119,7 @@ Exec = /usr/bin/sync
|
|||||||
CAVEATS
|
CAVEATS
|
||||||
-------
|
-------
|
||||||
|
|
||||||
There are situations when path triggers may act in unexpected ways. Hooks are
|
There are situations when file triggers may act in unexpected ways. Hooks are
|
||||||
triggered using the file list of the installed, upgraded, or removed package.
|
triggered using the file list of the installed, upgraded, or removed package.
|
||||||
When installing or upgrading a file that is extracted with a '.pacnew'
|
When installing or upgrading a file that is extracted with a '.pacnew'
|
||||||
extension, the original file name is used in triggering the hook. When
|
extension, the original file name is used in triggering the hook. When
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ ifdef::backend-docbook[]
|
|||||||
template::[header-declarations]
|
template::[header-declarations]
|
||||||
<refentry>
|
<refentry>
|
||||||
<refentryinfo>
|
<refentryinfo>
|
||||||
<date>{localdate}</date>
|
<date>{pacman_date}</date>
|
||||||
</refentryinfo>
|
</refentryinfo>
|
||||||
<refmeta>
|
<refmeta>
|
||||||
<refentrytitle>{mantitle}</refentrytitle>
|
<refentrytitle>{mantitle}</refentrytitle>
|
||||||
|
|||||||
@@ -1,14 +1,13 @@
|
|||||||
|
|
||||||
See the pacman website at https://archlinux.org/pacman/[] for current
|
See the pacman website at https://www.archlinux.org/pacman/[] for current
|
||||||
information on pacman and its related tools.
|
information on pacman and its related tools.
|
||||||
|
|
||||||
|
|
||||||
Bugs
|
Bugs
|
||||||
----
|
----
|
||||||
Bugs? You must be kidding; there are no bugs in this software. But if we
|
Bugs? You must be kidding; there are no bugs in this software. But if we
|
||||||
happen to be wrong, submit a bug report with as much detail as possible
|
happen to be wrong, send us an email with as much detail as possible to
|
||||||
at the https://bugs.archlinux.org/index.php?project=3[Arch Linux Bug Tracker]
|
mailto:pacman-dev@archlinux.org[].
|
||||||
in the Pacman section.
|
|
||||||
|
|
||||||
|
|
||||||
Authors
|
Authors
|
||||||
@@ -18,18 +17,16 @@ Current maintainers:
|
|||||||
|
|
||||||
* Allan McRae <allan@archlinux.org>
|
* Allan McRae <allan@archlinux.org>
|
||||||
* Andrew Gregory <andrew.gregory.8@gmail.com>
|
* Andrew Gregory <andrew.gregory.8@gmail.com>
|
||||||
* Morgan Adamiec <morganamilo@archlinux.org>
|
* Dan McGee <dan@archlinux.org>
|
||||||
|
* Dave Reisner <dreisner@archlinux.org>
|
||||||
|
|
||||||
Past major contributors:
|
Past major contributors:
|
||||||
|
|
||||||
* Judd Vinet <jvinet@zeroflux.org>
|
* Judd Vinet <jvinet@zeroflux.org>
|
||||||
* Aurelien Foret <aurelien@archlinux.org>
|
* Aurelien Foret <aurelien@archlinux.org>
|
||||||
* Aaron Griffin <aaron@archlinux.org>
|
* Aaron Griffin <aaron@archlinux.org>
|
||||||
* Dan McGee <dan@archlinux.org>
|
|
||||||
* Xavier Chantry <shiningxc@gmail.com>
|
* Xavier Chantry <shiningxc@gmail.com>
|
||||||
* Nagy Gabor <ngaba@bibl.u-szeged.hu>
|
* Nagy Gabor <ngaba@bibl.u-szeged.hu>
|
||||||
* Dave Reisner <dreisner@archlinux.org>
|
|
||||||
* Eli Schwartz <eschwartz@archlinux.org>
|
|
||||||
|
|
||||||
For additional contributors, use `git shortlog -s` on the pacman.git
|
For additional contributors, use `git shortlog -s` on the pacman.git
|
||||||
repository.
|
repository.
|
||||||
|
|||||||
@@ -34,8 +34,6 @@ makepkg/repo-add/pacman toolchain via GnuPG and GPGME.
|
|||||||
Version 5.0 added support for pre/post-transaction hooks and sync database file
|
Version 5.0 added support for pre/post-transaction hooks and sync database file
|
||||||
list operations.
|
list operations.
|
||||||
|
|
||||||
Version 6.0 added support for parallel downloads.
|
|
||||||
|
|
||||||
Documentation
|
Documentation
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
@@ -45,27 +43,25 @@ There are several man pages available for the programs, utilities, and
|
|||||||
configuration files dealing with pacman.
|
configuration files dealing with pacman.
|
||||||
|
|
||||||
* linkman:alpm-hooks[5]
|
* linkman:alpm-hooks[5]
|
||||||
* linkman:BUILDINFO[5]
|
|
||||||
* linkman:PKGBUILD[5]
|
* linkman:PKGBUILD[5]
|
||||||
* linkman:libalpm[3]
|
* linkman:libalpm[3]
|
||||||
* linkman:makepkg[8]
|
* linkman:makepkg[8]
|
||||||
* linkman:makepkg-template[1]
|
|
||||||
* linkman:makepkg.conf[5]
|
* linkman:makepkg.conf[5]
|
||||||
* linkman:pacman[8]
|
* linkman:pacman[8]
|
||||||
* linkman:pacman-key[8]
|
* linkman:pacman-key[8]
|
||||||
* linkman:pacman-conf[8]
|
|
||||||
* linkman:pacman.conf[5]
|
* linkman:pacman.conf[5]
|
||||||
|
* linkman:pkgdelta[8]
|
||||||
* linkman:repo-add[8]
|
* linkman:repo-add[8]
|
||||||
* linkman:vercmp[8]
|
* linkman:vercmp[8]
|
||||||
|
|
||||||
Changelog
|
Changelog
|
||||||
~~~~~~~~~
|
~~~~~~~~~
|
||||||
For a good idea of what is going on in pacman development, take a look at the
|
For a good idea of what is going on in pacman development, take a look at the
|
||||||
link:https://gitlab.archlinux.org/pacman/pacman[Git summary page] for the
|
link:https://projects.archlinux.org/pacman.git/[Git summary page] for the
|
||||||
project.
|
project.
|
||||||
|
|
||||||
See the most recent
|
See the most recent
|
||||||
link:https://gitlab.archlinux.org/pacman/pacman/-/blob/master/NEWS[NEWS]
|
link:https://projects.archlinux.org/pacman.git/tree/NEWS[NEWS]
|
||||||
file for a not-as-frequently-updated list of changes. However, this should
|
file for a not-as-frequently-updated list of changes. However, this should
|
||||||
contain the biggest changes in a format more concise than the commit log.
|
contain the biggest changes in a format more concise than the commit log.
|
||||||
|
|
||||||
@@ -79,17 +75,9 @@ Releases
|
|||||||
[frame="topbot",grid="none",options="header,autowidth"]
|
[frame="topbot",grid="none",options="header,autowidth"]
|
||||||
!======
|
!======
|
||||||
!Version !Date
|
!Version !Date
|
||||||
!6.1.0 !2024-03-04
|
|
||||||
!6.0.1 !2021-09-04
|
|
||||||
!6.0.0 !2021-05-20
|
|
||||||
!6.0.0alpha1 !2020-12-04
|
|
||||||
!5.2.1 !2019-11-01
|
|
||||||
!5.2.0 !2019-10-21
|
|
||||||
!5.1.3 !2019-03-01
|
|
||||||
!5.1.2 !2018-12-25
|
!5.1.2 !2018-12-25
|
||||||
!5.1.1 !2018-07-27
|
!5.1.1 !2018-07-27
|
||||||
!5.1.0 !2018-05-28
|
!5.1.0 !2018-05-28
|
||||||
!5.0.2 !2017-06-03
|
|
||||||
!5.0.1 !2016-02-23
|
!5.0.1 !2016-02-23
|
||||||
!5.0.0 !2016-01-30
|
!5.0.0 !2016-01-30
|
||||||
!4.2.1 !2015-02-20
|
!4.2.1 !2015-02-20
|
||||||
@@ -194,18 +182,16 @@ Releases
|
|||||||
|
|
||||||
|======
|
|======
|
||||||
|
|
||||||
Source code for releases since moving to gitlab is available at
|
Source code for all releases is available at
|
||||||
link:https://gitlab.archlinux.org/pacman/pacman/-/releases[].
|
|
||||||
Source code for historical releases is available at
|
|
||||||
link:https://sources.archlinux.org/other/pacman/[]. To install, download the newest
|
link:https://sources.archlinux.org/other/pacman/[]. To install, download the newest
|
||||||
available source tarball, unpack it in a directory, and run the three magic
|
available source tarball, unpack it in a directory, and run the three magic
|
||||||
commands:
|
commands:
|
||||||
|
|
||||||
$ meson build
|
$ ./configure
|
||||||
$ ninja -C build
|
$ make
|
||||||
# ninja -C build install
|
# make install
|
||||||
|
|
||||||
You may wish to read the options presented by `meson` in order to
|
You may wish to read the options presented by `./configure --help` in order to
|
||||||
set appropriate paths and build options that are correct for your system.
|
set appropriate paths and build options that are correct for your system.
|
||||||
|
|
||||||
Development
|
Development
|
||||||
@@ -214,8 +200,8 @@ Development
|
|||||||
Mailing List
|
Mailing List
|
||||||
~~~~~~~~~~~~
|
~~~~~~~~~~~~
|
||||||
There is a mailing list devoted to pacman development, hosted by Arch Linux.
|
There is a mailing list devoted to pacman development, hosted by Arch Linux.
|
||||||
link:https://lists.archlinux.org/listinfo/pacman-dev/[Subscribe] or
|
link:https://mailman.archlinux.org/mailman/listinfo/pacman-dev/[Subscribe] or
|
||||||
link:https://lists.archlinux.org/pipermail/pacman-dev/[view the archives].
|
link:https://mailman.archlinux.org/pipermail/pacman-dev/[view the archives].
|
||||||
|
|
||||||
Source Code
|
Source Code
|
||||||
~~~~~~~~~~~
|
~~~~~~~~~~~
|
||||||
@@ -226,11 +212,12 @@ these trees).
|
|||||||
|
|
||||||
The current development tree can be fetched with the following command:
|
The current development tree can be fetched with the following command:
|
||||||
|
|
||||||
git clone https://gitlab.archlinux.org/pacman/pacman.git
|
git clone git://projects.archlinux.org/pacman.git pacman
|
||||||
|
|
||||||
which will fetch the full development history into a directory named pacman.
|
which will fetch the full development history into a directory named pacman.
|
||||||
You can browse the source as well using
|
You can browse the source as well using
|
||||||
link:https://gitlab.archlinux.org/pacman/pacman/[gitlab].
|
link:https://projects.archlinux.org/pacman.git/[cgit]. HTTP/HTTPS URLs are also
|
||||||
|
available for cloning purposes; these URLs are listed at the above page.
|
||||||
|
|
||||||
If you are interested in hacking on pacman, it is highly recommended you join
|
If you are interested in hacking on pacman, it is highly recommended you join
|
||||||
the mailing list mentioned above, as well as take a quick glance at our
|
the mailing list mentioned above, as well as take a quick glance at our
|
||||||
@@ -242,16 +229,36 @@ you speak a foreign language, you can help by either creating or updating a
|
|||||||
translation file for your native language. Instructions can be found in
|
translation file for your native language. Instructions can be found in
|
||||||
link:translation-help.html[translation-help].
|
link:translation-help.html[translation-help].
|
||||||
|
|
||||||
|
Other Utilities
|
||||||
|
~~~~~~~~~~~~~~~
|
||||||
|
Although the package manager itself is quite simple, many scripts have been
|
||||||
|
developed that help automate building and installing packages. These are used
|
||||||
|
extensively in link:https://www.archlinux.org/[Arch Linux]. Most of these utilities
|
||||||
|
are available in the Arch Linux projects
|
||||||
|
link:https://projects.archlinux.org/[code browser].
|
||||||
|
|
||||||
|
Utilities available:
|
||||||
|
|
||||||
|
* link:https://projects.archlinux.org/abs.git/[abs] - ABS (Arch Build System), scripts to download & use the Arch Linux PKGBUILD tree
|
||||||
|
* link:https://projects.archlinux.org/dbscripts.git/[dbscripts] - scripts used by Arch Linux to manage the main package repositories
|
||||||
|
* link:https://projects.archlinux.org/devtools.git/[devtools] - tools to assist in packaging and dependency checking
|
||||||
|
* link:https://projects.archlinux.org/namcap.git/[namcap] - a package analysis utility written in python
|
||||||
|
* link:https://projects.archlinux.org/srcpac.git/[srcpac] - a bash build-from-source pacman wrapper
|
||||||
|
|
||||||
Bugs
|
Bugs
|
||||||
----
|
----
|
||||||
If you find bugs (which is quite likely), please report them to the issue
|
If you find bugs (which is quite likely), please email them to the pacman-dev
|
||||||
tracker at link:https://gitlab.archlinux.org/pacman/pacman/-/issues[] with
|
mailing last at mailto:pacman-dev@archlinux.org[] with specific information
|
||||||
specific information such as your command-line, the nature of the bug, and even
|
such as your command-line, the nature of the bug, and even the package database
|
||||||
the package database if it helps.
|
if it helps.
|
||||||
|
|
||||||
|
You can also post a bug to the Arch Linux bug tracker
|
||||||
|
link:https://bugs.archlinux.org/index.php?project=3[Flyspray]. Be sure to file
|
||||||
|
bugs under the Pacman project.
|
||||||
|
|
||||||
Copyright
|
Copyright
|
||||||
---------
|
---------
|
||||||
pacman is Copyright (C) 2006-2024 Pacman Development Team
|
pacman is Copyright (C) 2006-2018 Pacman Development Team
|
||||||
<pacman-dev@lists.archlinux.org> and Copyright (C) 2002-2006 Judd Vinet
|
<pacman-dev@archlinux.org> and Copyright (C) 2002-2006 Judd Vinet
|
||||||
<jvinet@zeroflux.org> and is licensed through the GNU General Public License,
|
<jvinet@zeroflux.org> and is licensed through the GNU General Public License,
|
||||||
version 2 or later.
|
version 2 or later.
|
||||||
|
|||||||
37
doc/libalpm.3.asciidoc
Normal file
37
doc/libalpm.3.asciidoc
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
libalpm(3)
|
||||||
|
==========
|
||||||
|
|
||||||
|
Name
|
||||||
|
----
|
||||||
|
libalpm - Arch Linux Package Management (ALPM) library
|
||||||
|
|
||||||
|
|
||||||
|
Synopsis
|
||||||
|
--------
|
||||||
|
For ease of access, the libalpm manual has been split up into several sections.
|
||||||
|
|
||||||
|
*TODO:* Yes, this man page needs a lot of work. Once we get around to doing
|
||||||
|
good Doxygen documentation, it will improve. We promise.
|
||||||
|
|
||||||
|
*alpm_databases*:: Database Functions
|
||||||
|
*alpm_interface*:: Interface Functions
|
||||||
|
*alpm_list*:: List Functions
|
||||||
|
*alpm_log*:: Logging Functions
|
||||||
|
*alpm_misc*:: Miscellaneous Functions
|
||||||
|
*alpm_packages*:: Package Functions
|
||||||
|
*alpm_sync*:: Sync Functions
|
||||||
|
*alpm_trans*:: Transaction Functions
|
||||||
|
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
-------------
|
||||||
|
See linkman:pacman.conf[5] for more details on configuring libalpm using the
|
||||||
|
'pacman.conf' file.
|
||||||
|
|
||||||
|
|
||||||
|
See Also
|
||||||
|
--------
|
||||||
|
linkman:alpm-hooks[5], linkman:makepkg[8], linkman:pacman[8],
|
||||||
|
linkman:pacman.conf[5]
|
||||||
|
|
||||||
|
include::footer.asciidoc[]
|
||||||
@@ -85,7 +85,7 @@ Example PKGBUILD
|
|||||||
license=('PerlArtistic' 'GPL')
|
license=('PerlArtistic' 'GPL')
|
||||||
depends=('perl')
|
depends=('perl')
|
||||||
source=("http://search.cpan.org/CPAN/authors/id/S/SH/SHERZODR/Config-Simple-${pkgver}.tar.gz")
|
source=("http://search.cpan.org/CPAN/authors/id/S/SH/SHERZODR/Config-Simple-${pkgver}.tar.gz")
|
||||||
sha256sums=('dd9995706f0f9384a15ccffe116c3b6e22f42ba2e58d8f24ed03c4a0e386edb4')
|
md5sums=('f014aec54f0a1e2e880d317180fce502')
|
||||||
_distname="Config-Simple"
|
_distname="Config-Simple"
|
||||||
|
|
||||||
# template start; name=perl-module; version=1.0;
|
# template start; name=perl-module; version=1.0;
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ Options
|
|||||||
For each source file in the source array of PKGBUILD, download the file
|
For each source file in the source array of PKGBUILD, download the file
|
||||||
if required and generate integrity checks. The integrity checks generated
|
if required and generate integrity checks. The integrity checks generated
|
||||||
are determined by the checks present in the PKGBUILD, falling back to the
|
are determined by the checks present in the PKGBUILD, falling back to the
|
||||||
value of the INTEGRITY_CHECK array in makepkg.conf(5) if these are absent.
|
value of the INTEGRITY_CHECK array in makepkg.conf(5) if these are absent
|
||||||
This output can be redirected into your PKGBUILD for source validation
|
This output can be redirected into your PKGBUILD for source validation
|
||||||
using "`makepkg -g >> PKGBUILD`".
|
using "`makepkg -g >> PKGBUILD`".
|
||||||
|
|
||||||
@@ -146,9 +146,6 @@ Options
|
|||||||
*-C, \--cleanbuild*::
|
*-C, \--cleanbuild*::
|
||||||
Remove the $srcdir before building the package.
|
Remove the $srcdir before building the package.
|
||||||
|
|
||||||
*-D* <dir>, *\--dir* <dir> ::
|
|
||||||
Change to directory <dir> before reading the PKGBUILD or doing anything else.
|
|
||||||
|
|
||||||
*\--allsource*::
|
*\--allsource*::
|
||||||
Do not actually build the package, but build a source-only tarball that
|
Do not actually build the package, but build a source-only tarball that
|
||||||
includes all sources, including those that are normally downloaded via
|
includes all sources, including those that are normally downloaded via
|
||||||
@@ -171,9 +168,6 @@ Options
|
|||||||
*\--noprepare*::
|
*\--noprepare*::
|
||||||
Do not run the prepare() function in the PKGBUILD.
|
Do not run the prepare() function in the PKGBUILD.
|
||||||
|
|
||||||
*\--noverify*::
|
|
||||||
Do not run the verify() function in the PKGBUILD.
|
|
||||||
|
|
||||||
*\--sign*::
|
*\--sign*::
|
||||||
Sign the resulting package with gpg, overriding the setting in
|
Sign the resulting package with gpg, overriding the setting in
|
||||||
linkman:makepkg.conf[5].
|
linkman:makepkg.conf[5].
|
||||||
@@ -233,9 +227,6 @@ before building.
|
|||||||
|
|
||||||
Environment Variables
|
Environment Variables
|
||||||
---------------------
|
---------------------
|
||||||
**MAKEPKG_LIBRARY**="/path/to/directory"::
|
|
||||||
Use an alternative libmakepkg path instead of the {libmakepkgdir} default.
|
|
||||||
|
|
||||||
**PACMAN**::
|
**PACMAN**::
|
||||||
The command that will be used to check for missing dependencies and to
|
The command that will be used to check for missing dependencies and to
|
||||||
install and remove packages. Pacman's '-Qq', '-Rns', '-S', '-T', and '-U'
|
install and remove packages. Pacman's '-Qq', '-Rns', '-S', '-T', and '-U'
|
||||||
@@ -283,23 +274,11 @@ Environment Variables
|
|||||||
|
|
||||||
**GPGKEY=**"keyid"::
|
**GPGKEY=**"keyid"::
|
||||||
Specify a key to use when signing packages, overriding the GPGKEY setting
|
Specify a key to use when signing packages, overriding the GPGKEY setting
|
||||||
in linkman:makepkg.conf[5].
|
in linkman:makepkg.conf[5]
|
||||||
|
|
||||||
**SOURCE_DATE_EPOCH=**"<date>"::
|
**SOURCE_DATE_EPOCH=**"<date>"::
|
||||||
Used for link:https://reproducible-builds.org/docs/[Reproducible Builds].
|
Used for link:https://reproducible-builds.org/docs/[Reproducible Builds].
|
||||||
|
|
||||||
**BUILDTOOL=**"<name>"::
|
|
||||||
The name of a tool ecosystem used to set up the build environment. Used for
|
|
||||||
defining a spec for reproducible builds, e.g. the linkman:makepkg.conf[5]
|
|
||||||
used.
|
|
||||||
|
|
||||||
**BUILDTOOLVER=**"<version>"::
|
|
||||||
The version of the '$BUILDTOOL' used.
|
|
||||||
|
|
||||||
**GITFLAGS**::
|
|
||||||
The options to pass when checking out git sources, replacing the default
|
|
||||||
"--mirror".
|
|
||||||
|
|
||||||
Configuration
|
Configuration
|
||||||
-------------
|
-------------
|
||||||
See linkman:makepkg.conf[5] for more details on configuring makepkg using the
|
See linkman:makepkg.conf[5] for more details on configuring makepkg using the
|
||||||
@@ -320,7 +299,7 @@ On exit, makepkg will return one of the following error codes.
|
|||||||
Error in configuration file.
|
Error in configuration file.
|
||||||
|
|
||||||
3::
|
3::
|
||||||
User specified an invalid option.
|
User specified an invalid option
|
||||||
|
|
||||||
4::
|
4::
|
||||||
Error in user-supplied function in PKGBUILD.
|
Error in user-supplied function in PKGBUILD.
|
||||||
@@ -361,7 +340,7 @@ On exit, makepkg will return one of the following error codes.
|
|||||||
Programs necessary to run makepkg are missing.
|
Programs necessary to run makepkg are missing.
|
||||||
|
|
||||||
16::
|
16::
|
||||||
Specified GPG key does not exist or failed to sign package.
|
Specified GPG key does not exist.
|
||||||
|
|
||||||
See Also
|
See Also
|
||||||
--------
|
--------
|
||||||
|
|||||||
@@ -77,11 +77,6 @@ Options
|
|||||||
usage resembling ``-Wl,--hash-style=gnu''. Read ld(1) for more details on
|
usage resembling ``-Wl,--hash-style=gnu''. Read ld(1) for more details on
|
||||||
available linker flags.
|
available linker flags.
|
||||||
|
|
||||||
**LTOFLAGS=**"ltoflags"::
|
|
||||||
Additional compiler and linker flags appended to `CFLAGS`, `CXXFLAGS`
|
|
||||||
and `LDFLAGS` when building with link time optimization. If empty,
|
|
||||||
``-flto'' is used.
|
|
||||||
|
|
||||||
**MAKEFLAGS=**"makeflags"::
|
**MAKEFLAGS=**"makeflags"::
|
||||||
This is often used to set the number of jobs used; for example, `-j2`.
|
This is often used to set the number of jobs used; for example, `-j2`.
|
||||||
Other flags that make accepts can also be passed.
|
Other flags that make accepts can also be passed.
|
||||||
@@ -143,7 +138,7 @@ Options
|
|||||||
Specify a key to use for GPG signing instead of the default key in the
|
Specify a key to use for GPG signing instead of the default key in the
|
||||||
keyring. Can be overridden with makepkg's '\--key' option.
|
keyring. Can be overridden with makepkg's '\--key' option.
|
||||||
|
|
||||||
**OPTIONS=(**!strip docs libtool staticlibs emptydirs ...**)**::
|
**OPTIONS=(**!strip docs libtool staticlibs emptydirs !zipman !purge !debug**)**::
|
||||||
This array contains options that affect default packaging. They are
|
This array contains options that affect default packaging. They are
|
||||||
equivalent to options that can be placed in the PKGBUILD; the defaults are
|
equivalent to options that can be placed in the PKGBUILD; the defaults are
|
||||||
shown here. All options should always be left in the array; to enable or
|
shown here. All options should always be left in the array; to enable or
|
||||||
@@ -185,20 +180,10 @@ Options
|
|||||||
DEBUG_CXXFLAGS to their counterpart buildflags. Creates a separate
|
DEBUG_CXXFLAGS to their counterpart buildflags. Creates a separate
|
||||||
package containing the debug symbols when used with `strip'.
|
package containing the debug symbols when used with `strip'.
|
||||||
|
|
||||||
*lto*;;
|
|
||||||
Enable building packages using link time optimization. Adds the
|
|
||||||
flags specified in LTOFLAGS to CFLAGS, CXXFLAGS and LDFLAGS (or
|
|
||||||
``-flto'' if LTOFLAGS is empty).
|
|
||||||
|
|
||||||
*autodeps*;;
|
|
||||||
Enable the automatic addition of libraries to the depends and
|
|
||||||
provides arrays. Search library directories are controlled by
|
|
||||||
the LIB_DIRS variable defined below.
|
|
||||||
|
|
||||||
**INTEGRITY_CHECK=(**check1 ...**)**::
|
**INTEGRITY_CHECK=(**check1 ...**)**::
|
||||||
File integrity checks to use. Multiple checks may be specified; this
|
File integrity checks to use. Multiple checks may be specified; this
|
||||||
affects both generation and checking. The current valid options are:
|
affects both generation and checking. The current valid options are:
|
||||||
`ck`, `md5`, `sha1`, `sha224`, `sha256`, `sha384`, `sha512`, and `b2`.
|
`md5`, `sha1`, `sha224`, `sha256`, `sha384`, and `sha512`.
|
||||||
|
|
||||||
**STRIP_BINARIES=**"--strip-all"::
|
**STRIP_BINARIES=**"--strip-all"::
|
||||||
Options to be used when stripping binaries. See linkman:strip[1]
|
Options to be used when stripping binaries. See linkman:strip[1]
|
||||||
@@ -225,12 +210,6 @@ Options
|
|||||||
that are located in opt/, you may need to add the directory to this
|
that are located in opt/, you may need to add the directory to this
|
||||||
array. *NOTE:* Do not add the leading slash to the directory name.
|
array. *NOTE:* Do not add the leading slash to the directory name.
|
||||||
|
|
||||||
**LIB_DIRS=(**lib:usr/lib ...**)**::
|
|
||||||
If `autodeps` is specified in the `OPTIONS` array, this variable will
|
|
||||||
instruct makepkg where to look to find libraries to add to the `provides`
|
|
||||||
array. The format is "prefix:path", where provides will be added for
|
|
||||||
libraries found in "path" with the specified prefix added.
|
|
||||||
|
|
||||||
**PURGE_TARGETS=(**usr/{,share}/info/dir .podlist *.pod...**)**::
|
**PURGE_TARGETS=(**usr/{,share}/info/dir .podlist *.pod...**)**::
|
||||||
If `purge` is specified in the `OPTIONS` array, this variable will
|
If `purge` is specified in the `OPTIONS` array, this variable will
|
||||||
instruct makepkg which files to remove from the package. This is
|
instruct makepkg which files to remove from the package. This is
|
||||||
@@ -265,36 +244,22 @@ Options
|
|||||||
|
|
||||||
**PACKAGER=**"John Doe <john@example.com>"::
|
**PACKAGER=**"John Doe <john@example.com>"::
|
||||||
This value is used when querying a package to see who was the builder.
|
This value is used when querying a package to see who was the builder.
|
||||||
The given format is required for PGP key lookup through WKD.
|
|
||||||
It is recommended to change this to your name and email address.
|
It is recommended to change this to your name and email address.
|
||||||
|
|
||||||
**COMPRESSGZ=**"(gzip -c -f -n)"::
|
**COMPRESSGZ=**"(gzip -c -f -n)"::
|
||||||
**COMPRESSBZ2=**"(bzip2 -c -f)"::
|
**COMPRESSBZ2=**"(bzip2 -c -f)"::
|
||||||
**COMPRESSXZ=**"(xz -c -z -)"::
|
**COMPRESSXZ=**"(xz -c -z -)"::
|
||||||
**COMPRESSZST=**"(zstd -c -z -)"::
|
|
||||||
**COMPRESSLZO**"(lzop -q)"::
|
**COMPRESSLZO**"(lzop -q)"::
|
||||||
**COMPRESSLRZ=**"(lrzip -q)"::
|
**COMPRESSLRZ=**"(lrzip -q)"::
|
||||||
**COMPRESSLZ4=**"(lz4 -q)"::
|
|
||||||
**COMPRESSZ=**"(compress -c -f)"::
|
**COMPRESSZ=**"(compress -c -f)"::
|
||||||
**COMPRESSLZ=**"(lzip -c -f)"::
|
|
||||||
Sets the command and options used when compressing compiled or source
|
Sets the command and options used when compressing compiled or source
|
||||||
packages in the named format.
|
packages in the named format.
|
||||||
|
|
||||||
**PKGEXT=**"{pkgext}", **SRCEXT=**"{srcext}"::
|
**PKGEXT=**".pkg.tar.gz", **SRCEXT=**".src.tar.gz"::
|
||||||
Sets the compression used when making compiled or source packages.
|
Sets the compression used when making compiled or source packages.
|
||||||
Valid suffixes are `.pkg` or `.src` (for PKGEXT and SRCEXT resepectively)
|
Valid suffixes are `.tar`, `.tar.gz`, `.tar.bz2`, `.tar.xz`,
|
||||||
followed by one of `.tar.gz`, `.tar.bz2`, `.tar.xz`, `.tar.zst`, `.tar.lzo`,
|
`.tar.lzo`, `.tar.lrz`, and `.tar.Z`.
|
||||||
`.tar.lrz`, `.tar.lz4`, `.tar.lz` and `.tar.Z`, or simply `.tar` to
|
Do not touch these unless you know what you are doing.
|
||||||
disable compression entirely.
|
|
||||||
|
|
||||||
**PACMAN_AUTH=()**::
|
|
||||||
Specify a command prefix for running pacman as root. If unset, makepkg will
|
|
||||||
check for the presence of sudo(8) and su(1) in turn, and try the first one
|
|
||||||
it finds.
|
|
||||||
+
|
|
||||||
If present, `%c` will be replaced with the shell-quoted form of the command
|
|
||||||
to run. Otherwise, the command to run is appended to the auth command.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
See Also
|
See Also
|
||||||
|
|||||||
157
doc/meson.build
157
doc/meson.build
@@ -1,157 +0,0 @@
|
|||||||
manpages = [
|
|
||||||
{ 'name': 'alpm-hooks.5' },
|
|
||||||
{ 'name': 'pacman.8' },
|
|
||||||
{ 'name': 'makepkg.8' },
|
|
||||||
{ 'name': 'makepkg-template.1' },
|
|
||||||
{ 'name': 'repo-add.8' },
|
|
||||||
{ 'name': 'vercmp.8' },
|
|
||||||
{ 'name': 'testpkg.8' },
|
|
||||||
{ 'name': 'pacman-key.8' },
|
|
||||||
{ 'name': 'pacman-db-upgrade.8' },
|
|
||||||
{ 'name': 'PKGBUILD.5', 'extra_depends' : [ 'PKGBUILD-example.txt' ] },
|
|
||||||
{ 'name': 'makepkg.conf.5' },
|
|
||||||
{ 'name': 'pacman.conf.5' },
|
|
||||||
{ 'name': 'BUILDINFO.5' },
|
|
||||||
{ 'name': 'pacman-conf.8' },
|
|
||||||
]
|
|
||||||
|
|
||||||
sitepages = [
|
|
||||||
{ 'name': 'submitting-patches' },
|
|
||||||
{ 'name': 'translation-help' },
|
|
||||||
{ 'name': 'HACKING', 'source': '../HACKING' },
|
|
||||||
{ 'name': 'index' },
|
|
||||||
]
|
|
||||||
|
|
||||||
asciidoc_conf = join_paths(meson.current_source_dir(), 'asciidoc.conf')
|
|
||||||
|
|
||||||
asciidoc_opts = [
|
|
||||||
'-f', asciidoc_conf,
|
|
||||||
'-a', 'pacman_version="@0@"'.format(PACKAGE_VERSION),
|
|
||||||
'-a', 'srcext=@0@'.format(get_option('src-ext')),
|
|
||||||
'-a', 'pkgext=@0@'.format(get_option('pkg-ext')),
|
|
||||||
'-a', 'pkgdatadir=@0@'.format(PKGDATADIR),
|
|
||||||
'-a', 'keyringdir=@0@'.format(KEYRINGDIR),
|
|
||||||
'-a', 'localstatedir=@0@'.format(LOCALSTATEDIR),
|
|
||||||
'-a', 'sysconfdir=@0@'.format(SYSCONFDIR),
|
|
||||||
'-a', 'datarootdir=@0@'.format(DATAROOTDIR),
|
|
||||||
'-a', 'rootdir=@0@'.format(ROOTDIR),
|
|
||||||
'-a', 'libmakepkgdir=@0@'.format(LIBMAKEPKGDIR),
|
|
||||||
]
|
|
||||||
|
|
||||||
html_targets = []
|
|
||||||
html_files = []
|
|
||||||
|
|
||||||
foreach page : manpages
|
|
||||||
manpage = page['name']
|
|
||||||
htmlpage = '@0@.html'.format(manpage)
|
|
||||||
input = '@0@.asciidoc'.format(manpage)
|
|
||||||
|
|
||||||
section = page['name'].split('.')[-1]
|
|
||||||
|
|
||||||
mandirn = join_paths(MANDIR, 'man' + section)
|
|
||||||
|
|
||||||
custom_target(
|
|
||||||
manpage,
|
|
||||||
command : [
|
|
||||||
A2X,
|
|
||||||
'--no-xmllint',
|
|
||||||
'-d', 'manpage',
|
|
||||||
'-f', 'manpage',
|
|
||||||
'--xsltproc-opts', '-param man.endnotes.list.enabled 0 -param man.endnotes.are.numbered 0',
|
|
||||||
'-D', '@OUTDIR@',
|
|
||||||
'--asciidoc-opts', ' '.join(asciidoc_opts),
|
|
||||||
'@INPUT@',
|
|
||||||
],
|
|
||||||
input : input,
|
|
||||||
output : [manpage],
|
|
||||||
depend_files : [
|
|
||||||
asciidoc_conf,
|
|
||||||
] + page.get('extra_depends', []),
|
|
||||||
install : true,
|
|
||||||
install_dir : mandirn,
|
|
||||||
)
|
|
||||||
endforeach
|
|
||||||
|
|
||||||
foreach page: manpages + sitepages
|
|
||||||
manpage = page['name']
|
|
||||||
htmlpage = '@0@.html'.format(manpage)
|
|
||||||
input = page.get('source', '@0@.asciidoc'.format(manpage))
|
|
||||||
|
|
||||||
html = custom_target(
|
|
||||||
htmlpage,
|
|
||||||
command : [
|
|
||||||
ASCIIDOC,
|
|
||||||
] + asciidoc_opts + [
|
|
||||||
'-a', 'linkcss',
|
|
||||||
'-a', 'toc',
|
|
||||||
'-a', 'icons',
|
|
||||||
'-a', 'max-width=960px',
|
|
||||||
'-a', 'stylesheet=asciidoc-override.css',
|
|
||||||
'-o', '@OUTPUT@',
|
|
||||||
'@INPUT@',
|
|
||||||
],
|
|
||||||
input : input,
|
|
||||||
output : [htmlpage],
|
|
||||||
depend_files : [
|
|
||||||
asciidoc_conf,
|
|
||||||
'asciidoc-override.css',
|
|
||||||
] + page.get('extra_depends', []),
|
|
||||||
build_by_default : false,
|
|
||||||
install : false,
|
|
||||||
)
|
|
||||||
html_targets += [html]
|
|
||||||
html_files += [htmlpage]
|
|
||||||
endforeach
|
|
||||||
|
|
||||||
run_target('html',
|
|
||||||
command : ['/bin/true'],
|
|
||||||
depends : html_targets)
|
|
||||||
|
|
||||||
custom_target(
|
|
||||||
'website.tar.gz',
|
|
||||||
command : [
|
|
||||||
'bsdtar', 'czf', '@OUTPUT@',
|
|
||||||
'-C', meson.current_build_dir(),
|
|
||||||
] + html_files + [
|
|
||||||
'-C', meson.current_source_dir(),
|
|
||||||
'asciidoc-override.css',
|
|
||||||
'-C', '/etc/asciidoc/stylesheets/',
|
|
||||||
'asciidoc.css',
|
|
||||||
'-C', '/etc/asciidoc/javascripts/',
|
|
||||||
'asciidoc.js',
|
|
||||||
'-C', '/etc/asciidoc/',
|
|
||||||
'images',
|
|
||||||
],
|
|
||||||
output : ['website.tar.gz'],
|
|
||||||
build_by_default : false,
|
|
||||||
depends : html_targets,
|
|
||||||
)
|
|
||||||
|
|
||||||
meson.add_install_script(MESON_MAKE_SYMLINK,
|
|
||||||
'repo-add.8',
|
|
||||||
join_paths(MANDIR, 'man8/repo-remove.8'))
|
|
||||||
|
|
||||||
meson.add_install_script(MESON_MAKE_SYMLINK,
|
|
||||||
'alpm-hooks.5',
|
|
||||||
join_paths(MANDIR, 'man5/pacman-hooks.5'))
|
|
||||||
|
|
||||||
doxygen = find_program('doxygen', required : get_option('doxygen'))
|
|
||||||
if doxygen.found() and not get_option('doxygen').disabled()
|
|
||||||
doxyconf = configuration_data()
|
|
||||||
doxyconf.set('INPUT_DIRECTORY', meson.current_source_dir())
|
|
||||||
doxyconf.set('OUTPUT_DIRECTORY', meson.current_build_dir())
|
|
||||||
doxyfile = configure_file(
|
|
||||||
input : 'Doxyfile.in',
|
|
||||||
output : 'Doxyfile',
|
|
||||||
configuration : doxyconf,
|
|
||||||
install : false)
|
|
||||||
|
|
||||||
custom_target(
|
|
||||||
'doxygen',
|
|
||||||
input : doxyfile,
|
|
||||||
output : ['man3'],
|
|
||||||
command : [doxygen, doxyfile],
|
|
||||||
build_by_default : true,
|
|
||||||
install : true,
|
|
||||||
install_dir : MANDIR)
|
|
||||||
endif
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
pacman-conf(8)
|
|
||||||
==============
|
|
||||||
|
|
||||||
Name
|
|
||||||
----
|
|
||||||
pacman-conf - query pacman's configuration file
|
|
||||||
|
|
||||||
|
|
||||||
Synopsis
|
|
||||||
--------
|
|
||||||
'pacman-conf' [options] [<directive> ...]
|
|
||||||
|
|
||||||
'pacman-conf' (--repo-list|--help|--version)
|
|
||||||
|
|
||||||
|
|
||||||
Description
|
|
||||||
-----------
|
|
||||||
'pacman-conf' is a utility for parsing the 'pacman' configuration file
|
|
||||||
and returning script-friendly output. It is designed to properly handle
|
|
||||||
non-trivial configuration features such as variable interpolation and
|
|
||||||
the use of the Include directive, and guarantees that it will return the
|
|
||||||
same configuration values which 'pacman' itself would use.
|
|
||||||
|
|
||||||
'pacman-conf' will output the fully-resolved contents of the
|
|
||||||
configuration file by default, or, if provided with the name of a
|
|
||||||
configuration directive, output the contents of the given directive alone.
|
|
||||||
|
|
||||||
|
|
||||||
Options
|
|
||||||
-------
|
|
||||||
*-c, \--config* <path>::
|
|
||||||
Specify an alternate configuration file.
|
|
||||||
|
|
||||||
*-R, \--rootdir* <path>::
|
|
||||||
Specify an alternate installation root (default is `/`).
|
|
||||||
|
|
||||||
*-r, \--repo* <repository>::
|
|
||||||
Query options for a specific repository.
|
|
||||||
|
|
||||||
*-v, \--verbose*::
|
|
||||||
Always shown directive names.
|
|
||||||
|
|
||||||
*-l, \--repo-list*::
|
|
||||||
List configured repositories.
|
|
||||||
|
|
||||||
*-h, \--help*::
|
|
||||||
Output syntax and command line options.
|
|
||||||
|
|
||||||
*-V, \--version*::
|
|
||||||
Display version and exit.
|
|
||||||
|
|
||||||
|
|
||||||
Examples
|
|
||||||
--------
|
|
||||||
|
|
||||||
pacman-conf -r core Usage::
|
|
||||||
Show the value of the Usage configuration option for core repository.
|
|
||||||
|
|
||||||
pacman-conf HoldPkg::
|
|
||||||
Show the value of the HoldPkg configuration option.
|
|
||||||
|
|
||||||
|
|
||||||
See Also
|
|
||||||
--------
|
|
||||||
linkman:pacman.conf[5]
|
|
||||||
|
|
||||||
include::footer.asciidoc[]
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
pacman-db-upgrade(8)
|
|
||||||
====================
|
|
||||||
|
|
||||||
Name
|
|
||||||
----
|
|
||||||
pacman-db-upgrade - upgrade the local pacman database to a newer format
|
|
||||||
|
|
||||||
Synopsis
|
|
||||||
--------
|
|
||||||
'pacman-db-upgrade' [options]
|
|
||||||
|
|
||||||
Description
|
|
||||||
-----------
|
|
||||||
'pacman-db-upgrade' is a script that upgrades the local database used
|
|
||||||
by linkman:pacman[8] to a newer format.
|
|
||||||
|
|
||||||
Options
|
|
||||||
--------------
|
|
||||||
*-h, \--help*::
|
|
||||||
Show the built-in help message and exit.
|
|
||||||
*-V, \--version*::
|
|
||||||
Show version information and exit.
|
|
||||||
*-d, \--dbpath* <path>::
|
|
||||||
Set an alternate database location.
|
|
||||||
*-r, \--root* <path>::
|
|
||||||
Set an alternate installation root.
|
|
||||||
*\--config* <path>::
|
|
||||||
Set an alternate configuration file.
|
|
||||||
*\--nocolor*::
|
|
||||||
Remove color from output.
|
|
||||||
|
|
||||||
See Also
|
|
||||||
--------
|
|
||||||
linkman:pacman[8]
|
|
||||||
|
|
||||||
include::footer.asciidoc[]
|
|
||||||
@@ -86,7 +86,7 @@ Operations
|
|||||||
|
|
||||||
*\--populate*::
|
*\--populate*::
|
||||||
Reload the default keys from the (optionally provided) keyrings in
|
Reload the default keys from the (optionally provided) keyrings in
|
||||||
+{keyringdir}+. For more information, see
|
+{pkgdatadir}/keyrings+. For more information, see
|
||||||
<<PK,Providing a Keyring for Import>> below.
|
<<PK,Providing a Keyring for Import>> below.
|
||||||
|
|
||||||
*-u, \--updatedb*::
|
*-u, \--updatedb*::
|
||||||
@@ -97,13 +97,7 @@ Operations
|
|||||||
Displays the program version.
|
Displays the program version.
|
||||||
|
|
||||||
*-v, \--verify*::
|
*-v, \--verify*::
|
||||||
Assume that the first argument is a signature and verify it. If a second
|
Verify the file(s) specified by the signature(s).
|
||||||
argument is provided, it is the file to be verified.
|
|
||||||
+
|
|
||||||
With only one argument given, assume that the signature is a detached
|
|
||||||
signature, and look for a matching data file to verify by stripping the file
|
|
||||||
extension. If no matching data file is found, fall back on GnuPG semantics and
|
|
||||||
attempt to verify a file with an embedded signature.
|
|
||||||
|
|
||||||
|
|
||||||
Options
|
Options
|
||||||
@@ -129,7 +123,7 @@ A distribution or other repository provided may want to provide a set of
|
|||||||
PGP keys used in the signing of its packages and repository databases that can
|
PGP keys used in the signing of its packages and repository databases that can
|
||||||
be readily imported into the pacman keyring. This is achieved by providing a
|
be readily imported into the pacman keyring. This is achieved by providing a
|
||||||
PGP keyring file `foo.gpg` that contains the keys for the foo keyring in the
|
PGP keyring file `foo.gpg` that contains the keys for the foo keyring in the
|
||||||
directory +{keyringdir}+.
|
directory +{pkgdatadir}/keyrings+.
|
||||||
|
|
||||||
Optionally, the file `foo-trusted` can be provided containing a list of trusted
|
Optionally, the file `foo-trusted` can be provided containing a list of trusted
|
||||||
key IDs for that keyring. This is a file in a format compatible with 'gpg
|
key IDs for that keyring. This is a file in a format compatible with 'gpg
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ Options
|
|||||||
not automatically prepended.
|
not automatically prepended.
|
||||||
|
|
||||||
*-r, \--root* <path>::
|
*-r, \--root* <path>::
|
||||||
Specify an alternative installation root (default is +{rootdir}+). This should
|
Specify an alternative installation root (default is `/`). This should
|
||||||
not be used as a way to install software into `/usr/local` instead of
|
not be used as a way to install software into `/usr/local` instead of
|
||||||
`/usr`.
|
`/usr`.
|
||||||
*NOTE*: If database path or log file are not specified on either the
|
*NOTE*: If database path or log file are not specified on either the
|
||||||
@@ -141,7 +141,7 @@ Options
|
|||||||
guest system. See '\--sysroot' instead.
|
guest system. See '\--sysroot' instead.
|
||||||
|
|
||||||
*-v, \--verbose*::
|
*-v, \--verbose*::
|
||||||
Output paths such as the Root, Conf File, DB Path, Cache Dirs, etc.
|
Output paths such as as the Root, Conf File, DB Path, Cache Dirs, etc.
|
||||||
|
|
||||||
*\--arch* <arch>::
|
*\--arch* <arch>::
|
||||||
Specify an alternate architecture.
|
Specify an alternate architecture.
|
||||||
@@ -195,10 +195,11 @@ Options
|
|||||||
Disable defaults for low speed limit and timeout on downloads. Use this
|
Disable defaults for low speed limit and timeout on downloads. Use this
|
||||||
if you have issues downloading files with proxy and/or security gateway.
|
if you have issues downloading files with proxy and/or security gateway.
|
||||||
|
|
||||||
*\--sysroot* <dir>:: Specify an alternative system root. This path will be
|
*\--sysroot* <dir>::
|
||||||
prepended to all other configuration directories and any repository servers
|
Specify an alternative system root. Pacman will chroot and chdir into the
|
||||||
beginning with `file://`. Any paths or URLs passed as targets will not be
|
system root prior to running. This allows mounted guest systems to be
|
||||||
modified. This allows mounted guest systems to be properly operated on.
|
properly operated on. Any other paths given will be interpreted as relative
|
||||||
|
to the system root. Requires root privileges.
|
||||||
|
|
||||||
|
|
||||||
Transaction Options (apply to '-S', '-R' and '-U')
|
Transaction Options (apply to '-S', '-R' and '-U')
|
||||||
@@ -211,7 +212,7 @@ Transaction Options (apply to '-S', '-R' and '-U')
|
|||||||
|
|
||||||
*\--assume-installed* <package=version>::
|
*\--assume-installed* <package=version>::
|
||||||
Add a virtual package "package" with version "version" to the transaction
|
Add a virtual package "package" with version "version" to the transaction
|
||||||
to satisfy dependencies. This allows disabling the specific dependency checks
|
to satisfy dependencies. This allows to disable specific dependency checks
|
||||||
without affecting all dependency checks. To disable all dependency
|
without affecting all dependency checks. To disable all dependency
|
||||||
checking, see the '\--nodeps' option.
|
checking, see the '\--nodeps' option.
|
||||||
|
|
||||||
@@ -234,22 +235,12 @@ Transaction Options (apply to '-S', '-R' and '-U')
|
|||||||
|
|
||||||
*\--print-format* <format>::
|
*\--print-format* <format>::
|
||||||
Specify a printf-like format to control the output of the '\--print'
|
Specify a printf-like format to control the output of the '\--print'
|
||||||
operation. The possible attributes are: "%a" for arch, "%b" for
|
operation. The possible attributes are: "%n" for pkgname, "%v" for pkgver,
|
||||||
builddate, "%d" for description, "%e" for pkgbase, "%f" for filename,
|
"%l" for location, "%r" for repository, and "%s" for size. Implies '\--print'.
|
||||||
"%g" for base64 encoded PGP signature, "%h" for sha256sum, "%m" for
|
|
||||||
md5sum, "%n" for pkgname, "%p" for packager, "%v" for pkgver, "%l" for
|
|
||||||
location, "%r" for repository, "%s" for size, "%C" for checkdepends,
|
|
||||||
"%D" for depends, "%G" for groups, "%H" for conflicts, "%L" for
|
|
||||||
licenses, "%M" for makedepends, "%O" for optional depends, "%P" for
|
|
||||||
provides and "%R" for replaces.
|
|
||||||
Implies '\--print'.
|
|
||||||
|
|
||||||
|
|
||||||
Upgrade Options (apply to '-S' and '-U')[[UO]]
|
Upgrade Options (apply to '-S' and '-U')[[UO]]
|
||||||
----------------------------------------------
|
----------------------------------------------
|
||||||
*-w, \--downloadonly*::
|
|
||||||
Retrieve all packages from the server, but do not install/upgrade anything.
|
|
||||||
|
|
||||||
*\--asdeps*::
|
*\--asdeps*::
|
||||||
Install packages non-explicitly; in other words, fake their install reason
|
Install packages non-explicitly; in other words, fake their install reason
|
||||||
to be installed as a dependency. This is useful for makepkg and other
|
to be installed as a dependency. This is useful for makepkg and other
|
||||||
@@ -454,12 +445,15 @@ can be useful when the user switches from a testing repository to a stable one.
|
|||||||
Additional targets can also be specified manually, so that '-Su foo' will do a
|
Additional targets can also be specified manually, so that '-Su foo' will do a
|
||||||
system upgrade and install/upgrade the "foo" package in the same operation.
|
system upgrade and install/upgrade the "foo" package in the same operation.
|
||||||
|
|
||||||
|
*-w, \--downloadonly*::
|
||||||
|
Retrieve all packages from the server, but do not install/upgrade anything.
|
||||||
|
|
||||||
*-y, \--refresh*::
|
*-y, \--refresh*::
|
||||||
Download a fresh copy of the master package databases '(repo.db)' from the
|
Download a fresh copy of the master package database from the server(s)
|
||||||
server(s) defined in linkman:pacman.conf[5]. This should typically be used
|
defined in linkman:pacman.conf[5]. This should typically be used each time
|
||||||
each time you use '\--sysupgrade' or '-u'. Passing two '\--refresh' or '-y'
|
you use '\--sysupgrade' or '-u'. Passing two '\--refresh' or '-y' flags
|
||||||
flags will force a refresh of all package databases, even if they appear to
|
will force a refresh of all package databases, even if they appear to be
|
||||||
be up-to-date.
|
up-to-date.
|
||||||
|
|
||||||
|
|
||||||
Database Options (apply to '-D')[[QO]]
|
Database Options (apply to '-D')[[QO]]
|
||||||
@@ -470,7 +464,7 @@ Database Options (apply to '-D')[[QO]]
|
|||||||
|
|
||||||
*\--asexplicit* <package>::
|
*\--asexplicit* <package>::
|
||||||
Mark a package as explicitly installed; in other words, set their install
|
Mark a package as explicitly installed; in other words, set their install
|
||||||
reason to be explicitly installed. This is useful if you want to keep a
|
reason to be explicitly installed. This is useful it you want to keep a
|
||||||
package installed even when it was initially installed as a dependency
|
package installed even when it was initially installed as a dependency
|
||||||
of another package.
|
of another package.
|
||||||
|
|
||||||
@@ -488,14 +482,20 @@ Database Options (apply to '-D')[[QO]]
|
|||||||
File Options (apply to '-F')[[FO]]
|
File Options (apply to '-F')[[FO]]
|
||||||
----------------------------------
|
----------------------------------
|
||||||
*-y, --refresh*::
|
*-y, --refresh*::
|
||||||
Download fresh package file databases '(repo.files)' from the server.
|
Download fresh package databases from the server. Use twice to force a
|
||||||
Use twice to force a refresh even if databases are up to date.
|
refresh even if databases are up to date.
|
||||||
|
|
||||||
*-l, \--list*::
|
*-l, \--list*::
|
||||||
List the files owned by the queried package.
|
List the files owned by the queried package.
|
||||||
|
|
||||||
|
*-s, \--search*::
|
||||||
|
Search package file names for matching strings.
|
||||||
|
|
||||||
*-x, --regex*::
|
*-x, --regex*::
|
||||||
Interpret each query as a regular expression.
|
Treat arguments to '--search' as regular expressions.
|
||||||
|
|
||||||
|
*-o, \--owns*::
|
||||||
|
Search for packages that own a particular file.
|
||||||
|
|
||||||
*-q, \--quiet*::
|
*-q, \--quiet*::
|
||||||
Show less information for certain file operations. This is useful when
|
Show less information for certain file operations. This is useful when
|
||||||
@@ -503,9 +503,9 @@ File Options (apply to '-F')[[FO]]
|
|||||||
'--machinereadable' instead.
|
'--machinereadable' instead.
|
||||||
|
|
||||||
*--machinereadable*::
|
*--machinereadable*::
|
||||||
Print each match in a machine readable output format. The format is
|
Use a machine readable output format for '--list', '--search' and
|
||||||
'repository\0pkgname\0pkgver\0path\n' with '\0' being the NULL character
|
'--owns'. The format is 'repository\0pkgname\0pkgver\0path\n' with '\0'
|
||||||
and '\n' a linefeed.
|
being the NULL character and '\n' a linefeed.
|
||||||
|
|
||||||
Handling Config Files[[HCF]]
|
Handling Config Files[[HCF]]
|
||||||
----------------------------
|
----------------------------
|
||||||
@@ -514,7 +514,7 @@ designated to be backed up. During an upgrade, three MD5 hashes are used for
|
|||||||
each backup file to determine the required action: one for the original file
|
each backup file to determine the required action: one for the original file
|
||||||
installed, one for the new file that is about to be installed, and one for the
|
installed, one for the new file that is about to be installed, and one for the
|
||||||
actual file existing on the file system. After comparing these three hashes, the
|
actual file existing on the file system. After comparing these three hashes, the
|
||||||
following scenarios can result:
|
follow scenarios can result:
|
||||||
|
|
||||||
original=X, current=X, new=X::
|
original=X, current=X, new=X::
|
||||||
All three files are the same, so overwrites are not an issue. Install the
|
All three files are the same, so overwrites are not an issue. Install the
|
||||||
|
|||||||
@@ -113,15 +113,15 @@ Options
|
|||||||
general configuration options. Wildcards in the specified paths will get
|
general configuration options. Wildcards in the specified paths will get
|
||||||
expanded based on linkman:glob[7] rules.
|
expanded based on linkman:glob[7] rules.
|
||||||
|
|
||||||
*Architecture =* auto &| i686 &| x86_64 | ...::
|
*Architecture =* auto | i686 | x86_64 | ...::
|
||||||
If set, pacman will only allow installation of packages with the given
|
If set, pacman will only allow installation of packages of the given
|
||||||
architectures (e.g. 'i686', 'x86_64', etc). The special value 'auto' will
|
architecture (e.g. 'i686', 'x86_64', etc). The special value 'auto' will
|
||||||
use the system architecture, provided via ``uname -m''. If unset, no
|
use the system architecture, provided via ``uname -m''. If unset, no
|
||||||
architecture checks are made. *NOTE*: Packages with the special
|
architecture checks are made. *NOTE*: Packages with the special
|
||||||
architecture 'any' can always be installed, as they are meant to be
|
architecture 'any' can always be installed, as they are meant to be
|
||||||
architecture independent.
|
architecture independent.
|
||||||
|
|
||||||
*XferCommand =* /path/to/command %u [%o]::
|
*XferCommand =* /path/to/command %u::
|
||||||
If set, an external program will be used to download all remote files.
|
If set, an external program will be used to download all remote files.
|
||||||
All instances of `%u` will be replaced with the download URL. If present,
|
All instances of `%u` will be replaced with the download URL. If present,
|
||||||
instances of `%o` will be replaced with the local filename, plus a
|
instances of `%o` will be replaced with the local filename, plus a
|
||||||
@@ -176,7 +176,7 @@ Options
|
|||||||
operation on a local file. Uses the value from SigLevel as the default.
|
operation on a local file. Uses the value from SigLevel as the default.
|
||||||
|
|
||||||
*RemoteFileSigLevel =* ...::
|
*RemoteFileSigLevel =* ...::
|
||||||
Set the signature verification level for installing packages using the "-U"
|
Set the signature verification level for installing packages using the "-U"
|
||||||
operation on a remote file URL. Uses the value from SigLevel as the default.
|
operation on a remote file URL. Uses the value from SigLevel as the default.
|
||||||
|
|
||||||
*UseSyslog*::
|
*UseSyslog*::
|
||||||
@@ -186,9 +186,20 @@ Options
|
|||||||
*Color*::
|
*Color*::
|
||||||
Automatically enable colors only when pacman's output is on a tty.
|
Automatically enable colors only when pacman's output is on a tty.
|
||||||
|
|
||||||
*NoProgressBar*::
|
*UseDelta* [= ratio]::
|
||||||
Disables progress bars. This is useful for terminals which do
|
Download delta files instead of complete packages if possible. Requires
|
||||||
not support escape characters.
|
the `xdelta3` program to be installed. If a ratio is specified (e.g.,
|
||||||
|
`0.5`), then it is used as a cutoff for determining whether to use deltas.
|
||||||
|
Allowed values are between `0.0` and `2.0`; sensible values are between
|
||||||
|
`0.2` and `0.9`. Using a value above `1.0` is not recommended. The
|
||||||
|
default is `0.7` if left unspecified.
|
||||||
|
|
||||||
|
*TotalDownload*::
|
||||||
|
When downloading, display the amount downloaded, download rate, ETA,
|
||||||
|
and completed percentage of the entire download list rather
|
||||||
|
than the percent of each individual download target. The progress
|
||||||
|
bar is still based solely on the current file download.
|
||||||
|
This option won't work if XferCommand is used.
|
||||||
|
|
||||||
*CheckSpace*::
|
*CheckSpace*::
|
||||||
Performs an approximate check for adequate available disk space before
|
Performs an approximate check for adequate available disk space before
|
||||||
@@ -202,11 +213,6 @@ Options
|
|||||||
Disable defaults for low speed limit and timeout on downloads. Use this
|
Disable defaults for low speed limit and timeout on downloads. Use this
|
||||||
if you have issues downloading files with proxy and/or security gateway.
|
if you have issues downloading files with proxy and/or security gateway.
|
||||||
|
|
||||||
*ParallelDownloads =* ...::
|
|
||||||
Specifies number of concurrent download streams. The value needs to be a
|
|
||||||
positive integer. If this config option is not set then only one download
|
|
||||||
stream is used (i.e. downloads happen sequentially).
|
|
||||||
|
|
||||||
|
|
||||||
Repository Sections
|
Repository Sections
|
||||||
-------------------
|
-------------------
|
||||||
@@ -240,12 +246,6 @@ number.
|
|||||||
general configuration options. Wildcards in the specified paths will get
|
general configuration options. Wildcards in the specified paths will get
|
||||||
expanded based on linkman:glob[7] rules.
|
expanded based on linkman:glob[7] rules.
|
||||||
|
|
||||||
*CacheServer =* url::
|
|
||||||
A full URL to a location where the packages, and signatures (if
|
|
||||||
available) for this repository can be found. Cache servers will be tried
|
|
||||||
before any non-cache servers, will not be removed from the server pool for
|
|
||||||
404 download errors, and will not be used for database files.
|
|
||||||
|
|
||||||
*Server =* url::
|
*Server =* url::
|
||||||
A full URL to a location where the database, packages, and signatures (if
|
A full URL to a location where the database, packages, and signatures (if
|
||||||
available) for this repository can be found.
|
available) for this repository can be found.
|
||||||
@@ -253,8 +253,8 @@ number.
|
|||||||
During parsing, pacman will define the `$repo` variable to the name of the
|
During parsing, pacman will define the `$repo` variable to the name of the
|
||||||
current section. This is often utilized in files specified using the 'Include'
|
current section. This is often utilized in files specified using the 'Include'
|
||||||
directive so all repositories can use the same mirrorfile. pacman also defines
|
directive so all repositories can use the same mirrorfile. pacman also defines
|
||||||
the `$arch` variable to the first (or only) value of the `Architecture` option,
|
the `$arch` variable to the value of `Architecture`, so the same mirrorfile can
|
||||||
so the same mirrorfile can even be used for different architectures.
|
even be used for different architectures.
|
||||||
|
|
||||||
*SigLevel =* ...::
|
*SigLevel =* ...::
|
||||||
Set the signature verification level for this repository. For more
|
Set the signature verification level for this repository. For more
|
||||||
|
|||||||
53
doc/pkgdelta.8.asciidoc
Normal file
53
doc/pkgdelta.8.asciidoc
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
pkgdelta(8)
|
||||||
|
=========
|
||||||
|
|
||||||
|
Name
|
||||||
|
----
|
||||||
|
pkgdelta - package delta generation utility
|
||||||
|
|
||||||
|
|
||||||
|
Synopsis
|
||||||
|
--------
|
||||||
|
'pkgdelta' [options] <package1> <package2>
|
||||||
|
|
||||||
|
|
||||||
|
Description
|
||||||
|
-----------
|
||||||
|
'pkgdelta' is used to create package delta files between two versions of the
|
||||||
|
same package. These files are essentially binary patches. linkman:pacman[8] can
|
||||||
|
download deltas instead of full package upgrades, and use them with the
|
||||||
|
previous versions of packages (in the package cache) to synthesize the upgraded
|
||||||
|
version of the packages. This likely reduces download sizes for upgrades
|
||||||
|
significantly.
|
||||||
|
|
||||||
|
'pkgdelta' requires linkman:xdelta3[1] to do its job.
|
||||||
|
|
||||||
|
|
||||||
|
Options
|
||||||
|
-------
|
||||||
|
*--max-delta-size <ratio>*::
|
||||||
|
Only create delta files if the delta is smaller than ratio * package_size.
|
||||||
|
Possible values: 0.0 to 2.0.
|
||||||
|
Recommended values: 0.2 to 0.9.
|
||||||
|
Default value: 0.7
|
||||||
|
|
||||||
|
*--min-pkg-size <size>*::
|
||||||
|
Minimal size of the package file in bytes to be considered for delta creation.
|
||||||
|
Default value: 1048576 bytes = 1 MiB. This may be any absolute size in bytes or
|
||||||
|
a human-readable value such as `4MiB` or `3.5MB`.
|
||||||
|
|
||||||
|
*-q, \--quiet*::
|
||||||
|
Be quiet. Do not output anything but warnings and errors.
|
||||||
|
|
||||||
|
|
||||||
|
Examples
|
||||||
|
--------
|
||||||
|
|
||||||
|
$ pkgdelta libreoffice-3.3.2-1-x86_64.pkg.tar.xz libreoffice-3.3.2-2-x86_64.pkg.tar.xz
|
||||||
|
|
||||||
|
|
||||||
|
See Also
|
||||||
|
--------
|
||||||
|
linkman:pacman[8], linkman:xdelta3[1]
|
||||||
|
|
||||||
|
include::footer.asciidoc[]
|
||||||
@@ -8,25 +8,27 @@ repo-add - package database maintenance utility
|
|||||||
|
|
||||||
Synopsis
|
Synopsis
|
||||||
--------
|
--------
|
||||||
'repo-add' [options] <path-to-db> <package> [<package> ...]
|
'repo-add' [options] <path-to-db> <package|delta> [<package|delta> ...]
|
||||||
|
|
||||||
'repo-remove' [options] <path-to-db> <packagename> [<packagename> ...]
|
'repo-remove' [options] <path-to-db> <packagename|delta> [<packagename|delta> ...]
|
||||||
|
|
||||||
|
|
||||||
Description
|
Description
|
||||||
-----------
|
-----------
|
||||||
'repo-add' and 'repo-remove' are two scripts to help build a package database for
|
'repo-add' and 'repo-remove' are two scripts to help build a package database for
|
||||||
packages built with linkman:makepkg[8] and installed with linkman:pacman[8].
|
packages built with linkman:makepkg[8] and installed with linkman:pacman[8].
|
||||||
|
They also handle package deltas produced by linkman:pkgdelta[8].
|
||||||
|
|
||||||
'repo-add' will update a package database by reading a built package file.
|
'repo-add' will update a package database by reading a built package or package
|
||||||
Multiple packages to add can be specified on the command line.
|
delta file. Multiple packages and/or deltas to add can be specified on the
|
||||||
|
command line.
|
||||||
|
|
||||||
If a matching ``.sig'' file is found alongside a package file, the signature
|
If a matching ``.sig'' file is found alongside a package file, the signature
|
||||||
will automatically be embedded into the database.
|
will automatically be embedded into the database.
|
||||||
|
|
||||||
'repo-remove' will update a package database by removing the package name
|
'repo-remove' will update a package database by removing the package name or
|
||||||
specified on the command line. Multiple packages to remove can be specified
|
delta specified on the command line. Multiple packages and/or delta to remove
|
||||||
on the command line.
|
can be specified on the command line.
|
||||||
|
|
||||||
A package database is a tar file, optionally compressed. Valid extensions are
|
A package database is a tar file, optionally compressed. Valid extensions are
|
||||||
``.db'' followed by an archive extension of ``.tar'', ``.tar.gz'', ``.tar.bz2'',
|
``.db'' followed by an archive extension of ``.tar'', ``.tar.gz'', ``.tar.bz2'',
|
||||||
@@ -62,6 +64,10 @@ Common Options
|
|||||||
|
|
||||||
repo-add Options
|
repo-add Options
|
||||||
----------------
|
----------------
|
||||||
|
*-d, \--delta*::
|
||||||
|
Automatically generate and add a delta file between the old entry and the
|
||||||
|
new one, if the old package file is found next to the new one.
|
||||||
|
|
||||||
*-n, \--new*::
|
*-n, \--new*::
|
||||||
Only add packages that are not already in the database. Warnings will be
|
Only add packages that are not already in the database. Warnings will be
|
||||||
printed upon detection of existing packages, but they will not be re-added.
|
printed upon detection of existing packages, but they will not be re-added.
|
||||||
@@ -70,8 +76,6 @@ repo-add Options
|
|||||||
Remove old package files from the disk when updating their entry in the
|
Remove old package files from the disk when updating their entry in the
|
||||||
database.
|
database.
|
||||||
|
|
||||||
*\--include-sigs*::
|
|
||||||
Include package PGP signatures in the repository database (if available)
|
|
||||||
|
|
||||||
Example
|
Example
|
||||||
-------
|
-------
|
||||||
@@ -85,6 +89,6 @@ db.tar* extension), there is currently no additional benefit for the larger down
|
|||||||
|
|
||||||
See Also
|
See Also
|
||||||
--------
|
--------
|
||||||
linkman:makepkg[8], linkman:pacman[8]
|
linkman:makepkg[8], linkman:pacman[8], linkman:pkgdelta[8]
|
||||||
|
|
||||||
include::footer.asciidoc[]
|
include::footer.asciidoc[]
|
||||||
|
|||||||
@@ -20,22 +20,7 @@ started with GIT if you have not worked with it before.
|
|||||||
|
|
||||||
The pacman code can be fetched using the following command:
|
The pacman code can be fetched using the following command:
|
||||||
|
|
||||||
git clone https://gitlab.archlinux.org/pacman/pacman.git
|
git clone git://projects.archlinux.org/pacman.git
|
||||||
|
|
||||||
|
|
||||||
Before making large changes
|
|
||||||
---------------------------
|
|
||||||
|
|
||||||
--
|
|
||||||
* Discuss your idea
|
|
||||||
|
|
||||||
There is nothing worse that spending time making a change only for it to be
|
|
||||||
rejected immediately. Ensure ideas are discussed beforehand to avoid
|
|
||||||
disappointment. Appropriate locations for discussion are the issue tracker
|
|
||||||
on gitlab, or the pacman-dev mailing list. Transient discussion channels
|
|
||||||
such as IRC are not appropriate.
|
|
||||||
|
|
||||||
--
|
|
||||||
|
|
||||||
|
|
||||||
Creating your patch
|
Creating your patch
|
||||||
@@ -54,22 +39,40 @@ address if you're afraid of spam.
|
|||||||
|
|
||||||
* Describe your patch.
|
* Describe your patch.
|
||||||
|
|
||||||
It helps if you describe the overview and goals of the patch in the git commit
|
It helps if you describe the overview and goals of the patch in the git commit
|
||||||
log. This allows others to see what you intended so as to compare it to what
|
log. This allows others to see what you intended so as to compare it to what
|
||||||
was actually done, and allows better feedback.
|
was actually done, and allows better feedback.
|
||||||
|
|
||||||
|
* Use `git format-patch` to create patches.
|
||||||
|
|
||||||
|
Your commit message will be shown above the patch by default when you will use
|
||||||
|
`git format-patch`, including the signoff line. Sets of multiple patches that
|
||||||
|
need extra explanation beyond the commit messages may include additional notes
|
||||||
|
in a cover letter. Individual patches may include additional notes between the
|
||||||
|
"---" following the commit message and the beginning of the diff.
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|
||||||
Submitting your patch
|
Submitting your patch
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
* Submit patches with a gitlab merge request
|
* Send the patch to the pacman-dev mailing list
|
||||||
|
|
||||||
The pacman gitlab instance is the primary queue for review and acceptance.
|
The mailing list is the primary queue for review and acceptance. Here you
|
||||||
Here you will get feedback, and let the reviewers know the details of your
|
will get feedback, and let the reviewers know the details of your patch.
|
||||||
patch.
|
|
||||||
|
|
||||||
|
* No MIME, no links, no compression, no attachments. Just plain text.
|
||||||
|
|
||||||
|
Patches should be contained in the actual body of the email. There are many
|
||||||
|
reasons for this. First, it makes them easier to read with any mail reader,
|
||||||
|
it allows easier review "at a glance", and most importantly, it allows people
|
||||||
|
to comment on exact lines of the patch in reply emails.
|
||||||
|
|
||||||
|
`git send-email` allows you to send Git-formatted patches in plain text easily
|
||||||
|
and is the preferred method for submission to the mailing list. Mail clients,
|
||||||
|
including Gmail's web interface, have a tendency to break patches by wrapping
|
||||||
|
lines and/or adjusting whitespace and should be avoided.
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|
||||||
@@ -92,6 +95,7 @@ When you do get feedback, it usually merits a response, whether this be a
|
|||||||
resubmission of the patch with corrections or a follow-up email asking for
|
resubmission of the patch with corrections or a follow-up email asking for
|
||||||
clarifications. When neither of these occurs, don't expect your patch to get
|
clarifications. When neither of these occurs, don't expect your patch to get
|
||||||
further review. The all-volunteer staff don't have time to fix up patches that
|
further review. The all-volunteer staff don't have time to fix up patches that
|
||||||
aren't their own.
|
aren't their own. When resubmitting patches, update the subject line to reflect
|
||||||
|
the version number ('[PATCHv2]'), and send it as a reply to the original thread.
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
testpkg(8)
|
|
||||||
==========
|
|
||||||
|
|
||||||
Name
|
|
||||||
----
|
|
||||||
testpkg - test a pacman package for validity
|
|
||||||
|
|
||||||
Synopsis
|
|
||||||
--------
|
|
||||||
'testpkg' <package file>
|
|
||||||
|
|
||||||
Description
|
|
||||||
-----------
|
|
||||||
'testpkg' is a script used to make sure that a pacman package is valid.
|
|
||||||
|
|
||||||
See Also
|
|
||||||
--------
|
|
||||||
linkman:pacman[8]
|
|
||||||
|
|
||||||
include::footer.asciidoc[]
|
|
||||||
@@ -4,10 +4,10 @@ Pacman - Translating
|
|||||||
This document is here to guide you in helping translate pacman messages,
|
This document is here to guide you in helping translate pacman messages,
|
||||||
libalpm messages, and the manual pages for the entire pacman package.
|
libalpm messages, and the manual pages for the entire pacman package.
|
||||||
|
|
||||||
We are currently using https://www.transifex.com/[Transifex] as the translation
|
We are currently using http://www.transifex.com/[Transifex] as the translation
|
||||||
platform for pacman and libalpm. You will need to sign up for an account there
|
platform for pacman and libalpm. You will need to sign up for an account there
|
||||||
and then register with a translation team on the
|
and then register with a translation team on the
|
||||||
https://www.transifex.com/projects/p/archlinux-pacman/[pacman project page].
|
http://www.transifex.com/projects/p/archlinux-pacman/[pacman project page].
|
||||||
|
|
||||||
NOTE: This may be old information due to our switch to Transifex, but the
|
NOTE: This may be old information due to our switch to Transifex, but the
|
||||||
gettext website is a very useful guide to read before embarking on translation
|
gettext website is a very useful guide to read before embarking on translation
|
||||||
@@ -31,7 +31,7 @@ either be hand-edited, or modified with a tool such as poedit, gtranslator or
|
|||||||
kbabel. Using a translation tool tends to make the job easier.
|
kbabel. Using a translation tool tends to make the job easier.
|
||||||
|
|
||||||
Please read up on Transifex usage using the
|
Please read up on Transifex usage using the
|
||||||
https://docs.transifex.com/[Transifex Help] if you are not familiar.
|
http://docs.transifex.com/[Transifex Help] if you are not familiar.
|
||||||
|
|
||||||
Transifex provides a command-line client to help with translations. Here is
|
Transifex provides a command-line client to help with translations. Here is
|
||||||
an example set of commands if you have a source code checkout and are not
|
an example set of commands if you have a source code checkout and are not
|
||||||
@@ -55,7 +55,7 @@ Pre-release Updates
|
|||||||
~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
A week or two before each release, the codebase will go into a string freeze
|
A week or two before each release, the codebase will go into a string freeze
|
||||||
and an email will be sent to the mailto:pacman-dev@lists.archlinux.org[pacman-dev]
|
and an email will be sent to the mailto:pacman-dev@archlinux.org[pacman-dev]
|
||||||
mailing list asking for translations. This email will have a prefix of
|
mailing list asking for translations. This email will have a prefix of
|
||||||
*[translation]* for anyone looking to set up an email filter.
|
*[translation]* for anyone looking to set up an email filter.
|
||||||
|
|
||||||
@@ -78,7 +78,7 @@ Incremental Updates
|
|||||||
If you have more advanced needs you will have to get a copy of the pacman
|
If you have more advanced needs you will have to get a copy of the pacman
|
||||||
repository.
|
repository.
|
||||||
|
|
||||||
git clone https://gitlab.archlinux.org/pacman/pacman.git
|
git clone git://projects.archlinux.org/pacman.git pacman
|
||||||
|
|
||||||
Next, you will need to run `./autogen.sh` and `./configure` in the base
|
Next, you will need to run `./autogen.sh` and `./configure` in the base
|
||||||
directory to generate the correct Makefiles. At this point, all necessary
|
directory to generate the correct Makefiles. At this point, all necessary
|
||||||
@@ -150,4 +150,4 @@ There are currently no efforts underway to include translated manual pages in
|
|||||||
the pacman codebase. However, this is not to say translations are unwelcome. If
|
the pacman codebase. However, this is not to say translations are unwelcome. If
|
||||||
someone has experience with i18n man pages and how to best include them with our
|
someone has experience with i18n man pages and how to best include them with our
|
||||||
source, please contact the pacman-dev mailing list at
|
source, please contact the pacman-dev mailing list at
|
||||||
mailto:pacman-dev@lists.archlinux.org[].
|
mailto:pacman-dev@archlinux.org[].
|
||||||
|
|||||||
27
etc/Makefile.am
Normal file
27
etc/Makefile.am
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
dist_sysconf_DATA = makepkg.conf pacman.conf
|
||||||
|
EXTRA_DIST = makepkg.conf.in pacman.conf.in
|
||||||
|
|
||||||
|
# Files that should be removed, but which Automake does not know.
|
||||||
|
MOSTLYCLEANFILES = $(dist_sysconf_DATA)
|
||||||
|
|
||||||
|
SED_PROCESS = \
|
||||||
|
$(AM_V_GEN)$(MKDIR_P) $(dir $@) && \
|
||||||
|
$(SED) \
|
||||||
|
-e 's|@sysconfdir[@]|$(sysconfdir)|g' \
|
||||||
|
-e 's|@localstatedir[@]|$(localstatedir)|g' \
|
||||||
|
-e 's|@prefix[@]|$(prefix)|g' \
|
||||||
|
-e 's|@PACKAGE_VERSION[@]|$(PACKAGE_VERSION)|g' \
|
||||||
|
-e 's|@PACKAGE_NAME[@]|$(PACKAGE_NAME)|g' \
|
||||||
|
-e 's|@PKGEXT[@]|$(PKGEXT)|g' \
|
||||||
|
-e 's|@SRCEXT[@]|$(SRCEXT)|g' \
|
||||||
|
-e 's|@STRIP_BINARIES[@]|$(STRIP_BINARIES)|g' \
|
||||||
|
-e 's|@STRIP_SHARED[@]|$(STRIP_SHARED)|g' \
|
||||||
|
-e 's|@STRIP_STATIC[@]|$(STRIP_STATIC)|g' \
|
||||||
|
-e 's|@CARCH[@]|$(CARCH)|g' \
|
||||||
|
-e 's|@CHOST[@]|$(CHOST)|g' \
|
||||||
|
-e 's|@ARCHSWITCH[@]|$(ARCHSWITCH)|g' \
|
||||||
|
-e 's|@ROOTDIR[@]|$(ROOTDIR)|g' \
|
||||||
|
< $< > $@
|
||||||
|
|
||||||
|
%.conf: %.conf.in Makefile
|
||||||
|
$(SED_PROCESS)
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#!/hint/bash
|
|
||||||
#
|
|
||||||
# @sysconfdir@/makepkg.conf.d/fortran.conf
|
|
||||||
#
|
|
||||||
|
|
||||||
#########################################################################
|
|
||||||
# FORTRAN LANGUAGE SUPPORT
|
|
||||||
#########################################################################
|
|
||||||
|
|
||||||
# Flags used for the Fortran compiler, similar in spirit to CFLAGS. Read
|
|
||||||
# linkman:gfortran[1] for more details on the available flags.
|
|
||||||
#FFLAGS="-O2 -pipe"
|
|
||||||
#FCFLAGS="$FFLAGS"
|
|
||||||
|
|
||||||
# Additional compiler flags appended to `FFLAGS` and `FCFLAGS` for use in debugging. Usually
|
|
||||||
# this would include: ``-g''. Read linkman:gfortran[1] for more details on the wide
|
|
||||||
# variety of compiler flags available.
|
|
||||||
#DEBUG_FFLAGS="-g"
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#!/hint/bash
|
|
||||||
#
|
|
||||||
# @sysconfdir@/makepkg.conf.d/rust.conf
|
|
||||||
#
|
|
||||||
|
|
||||||
#########################################################################
|
|
||||||
# RUST LANGUAGE SUPPORT
|
|
||||||
#########################################################################
|
|
||||||
|
|
||||||
# Flags used for the Rust compiler, similar in spirit to CFLAGS. Read
|
|
||||||
# linkman:rustc[1] for more details on the available flags.
|
|
||||||
#RUSTFLAGS="-C opt-level=3"
|
|
||||||
|
|
||||||
# Additional compiler flags appended to `RUSTFLAGS` for use in debugging.
|
|
||||||
# Usually this would include: ``-C debuginfo=2''. Read linkman:rustc[1] for
|
|
||||||
# more details on the available flags.
|
|
||||||
#DEBUG_RUSTFLAGS="-C debuginfo=2"
|
|
||||||
@@ -9,10 +9,10 @@
|
|||||||
#
|
#
|
||||||
#-- The download utilities that makepkg should use to acquire sources
|
#-- The download utilities that makepkg should use to acquire sources
|
||||||
# Format: 'protocol::agent'
|
# Format: 'protocol::agent'
|
||||||
DLAGENTS=('file::/usr/bin/curl -qgC - -o %o %u'
|
DLAGENTS=('file::/usr/bin/curl -gqC - -o %o %u'
|
||||||
'ftp::/usr/bin/curl -qgfC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %u'
|
'ftp::/usr/bin/curl -gqfC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %u'
|
||||||
'http::/usr/bin/curl -qgb "" -fLC - --retry 3 --retry-delay 3 -o %o %u'
|
'http::/usr/bin/curl -gqb "" -fLC - --retry 3 --retry-delay 3 -o %o %u'
|
||||||
'https::/usr/bin/curl -qgb "" -fLC - --retry 3 --retry-delay 3 -o %o %u'
|
'https::/usr/bin/curl -gqb "" -fLC - --retry 3 --retry-delay 3 -o %o %u'
|
||||||
'rsync::/usr/bin/rsync --no-motd -z %u %o'
|
'rsync::/usr/bin/rsync --no-motd -z %u %o'
|
||||||
'scp::/usr/bin/scp -C %u %o')
|
'scp::/usr/bin/scp -C %u %o')
|
||||||
|
|
||||||
@@ -23,8 +23,7 @@ DLAGENTS=('file::/usr/bin/curl -qgC - -o %o %u'
|
|||||||
|
|
||||||
#-- The package required by makepkg to download VCS sources
|
#-- The package required by makepkg to download VCS sources
|
||||||
# Format: 'protocol::package'
|
# Format: 'protocol::package'
|
||||||
VCSCLIENTS=('bzr::breezy'
|
VCSCLIENTS=('bzr::bzr'
|
||||||
'fossil::fossil'
|
|
||||||
'git::git'
|
'git::git'
|
||||||
'hg::mercurial'
|
'hg::mercurial'
|
||||||
'svn::subversion')
|
'svn::subversion')
|
||||||
@@ -41,7 +40,6 @@ CHOST="@CHOST@"
|
|||||||
#CFLAGS="-O2 -pipe"
|
#CFLAGS="-O2 -pipe"
|
||||||
#CXXFLAGS="-O2 -pipe"
|
#CXXFLAGS="-O2 -pipe"
|
||||||
#LDFLAGS=""
|
#LDFLAGS=""
|
||||||
#LTOFLAGS="-flto"
|
|
||||||
#-- Make Flags: change this for DistCC/SMP systems
|
#-- Make Flags: change this for DistCC/SMP systems
|
||||||
#MAKEFLAGS="-j2"
|
#MAKEFLAGS="-j2"
|
||||||
#-- Debugging flags
|
#-- Debugging flags
|
||||||
@@ -52,7 +50,7 @@ CHOST="@CHOST@"
|
|||||||
# BUILD ENVIRONMENT
|
# BUILD ENVIRONMENT
|
||||||
#########################################################################
|
#########################################################################
|
||||||
#
|
#
|
||||||
# Makepkg defaults: BUILDENV=(!distcc !color !ccache check !sign)
|
# Defaults: BUILDENV=(!distcc !color !ccache check !sign)
|
||||||
# A negated environment option will do the opposite of the comments below.
|
# A negated environment option will do the opposite of the comments below.
|
||||||
#
|
#
|
||||||
#-- distcc: Use the Distributed C/C++/ObjC compiler
|
#-- distcc: Use the Distributed C/C++/ObjC compiler
|
||||||
@@ -75,8 +73,7 @@ BUILDENV=(!distcc color !ccache check !sign)
|
|||||||
# These are default values for the options=() settings
|
# These are default values for the options=() settings
|
||||||
#########################################################################
|
#########################################################################
|
||||||
#
|
#
|
||||||
# Makepkg defaults:
|
# Default: OPTIONS=(!strip docs libtool staticlibs emptydirs !zipman !purge !debug)
|
||||||
# OPTIONS=(!strip docs libtool staticlibs emptydirs !zipman !purge !debug !lto !autodeps)
|
|
||||||
# A negated option will do the opposite of the comments below.
|
# A negated option will do the opposite of the comments below.
|
||||||
#
|
#
|
||||||
#-- strip: Strip symbols from binaries/libraries
|
#-- strip: Strip symbols from binaries/libraries
|
||||||
@@ -87,13 +84,11 @@ BUILDENV=(!distcc color !ccache check !sign)
|
|||||||
#-- zipman: Compress manual (man and info) pages in MAN_DIRS with gzip
|
#-- zipman: Compress manual (man and info) pages in MAN_DIRS with gzip
|
||||||
#-- purge: Remove files specified by PURGE_TARGETS
|
#-- purge: Remove files specified by PURGE_TARGETS
|
||||||
#-- debug: Add debugging flags as specified in DEBUG_* variables
|
#-- debug: Add debugging flags as specified in DEBUG_* variables
|
||||||
#-- lto: Add compile flags for building with link time optimization
|
|
||||||
#-- autodeps: Automatically add depends/provides
|
|
||||||
#
|
#
|
||||||
OPTIONS=(strip docs libtool staticlibs emptydirs zipman purge !debug !lto !autodeps)
|
OPTIONS=(strip docs libtool staticlibs emptydirs zipman purge !debug)
|
||||||
|
|
||||||
#-- File integrity checks to use. Valid: ck, md5, sha1, sha224, sha256, sha384, sha512, b2
|
#-- File integrity checks to use. Valid: md5, sha1, sha224, sha256, sha384, sha512
|
||||||
INTEGRITY_CHECK=(ck)
|
INTEGRITY_CHECK=(md5)
|
||||||
#-- Options to be used when stripping binaries. See `man strip' for details.
|
#-- Options to be used when stripping binaries. See `man strip' for details.
|
||||||
STRIP_BINARIES="@STRIP_BINARIES@"
|
STRIP_BINARIES="@STRIP_BINARIES@"
|
||||||
#-- Options to be used when stripping shared libraries. See `man strip' for details.
|
#-- Options to be used when stripping shared libraries. See `man strip' for details.
|
||||||
@@ -108,8 +103,6 @@ DOC_DIRS=(usr/{,local/}{,share/}{doc,gtk-doc} opt/*/{doc,gtk-doc})
|
|||||||
PURGE_TARGETS=(usr/{,share}/info/dir .packlist *.pod)
|
PURGE_TARGETS=(usr/{,share}/info/dir .packlist *.pod)
|
||||||
#-- Directory to store source code in for debug packages
|
#-- Directory to store source code in for debug packages
|
||||||
DBGSRCDIR="/usr/src/debug"
|
DBGSRCDIR="/usr/src/debug"
|
||||||
#-- Prefix and directories for library autodeps
|
|
||||||
LIB_DIRS=('lib:usr/lib' 'lib32:usr/lib32')
|
|
||||||
|
|
||||||
#########################################################################
|
#########################################################################
|
||||||
# PACKAGE OUTPUT
|
# PACKAGE OUTPUT
|
||||||
@@ -137,23 +130,16 @@ LIB_DIRS=('lib:usr/lib' 'lib32:usr/lib32')
|
|||||||
COMPRESSGZ=(gzip -c -f -n)
|
COMPRESSGZ=(gzip -c -f -n)
|
||||||
COMPRESSBZ2=(bzip2 -c -f)
|
COMPRESSBZ2=(bzip2 -c -f)
|
||||||
COMPRESSXZ=(xz -c -z -)
|
COMPRESSXZ=(xz -c -z -)
|
||||||
COMPRESSZST=(zstd -c -z -q -)
|
|
||||||
COMPRESSLRZ=(lrzip -q)
|
COMPRESSLRZ=(lrzip -q)
|
||||||
COMPRESSLZO=(lzop -q)
|
COMPRESSLZO=(lzop -q)
|
||||||
COMPRESSZ=(compress -c -f)
|
COMPRESSZ=(compress -c -f)
|
||||||
COMPRESSLZ4=(lz4 -q)
|
|
||||||
COMPRESSLZ=(lzip -c -f)
|
|
||||||
|
|
||||||
#########################################################################
|
#########################################################################
|
||||||
# EXTENSION DEFAULTS
|
# EXTENSION DEFAULTS
|
||||||
#########################################################################
|
#########################################################################
|
||||||
#
|
#
|
||||||
|
# WARNING: Do NOT modify these variables unless you know what you are
|
||||||
|
# doing.
|
||||||
|
#
|
||||||
PKGEXT='@PKGEXT@'
|
PKGEXT='@PKGEXT@'
|
||||||
SRCEXT='@SRCEXT@'
|
SRCEXT='@SRCEXT@'
|
||||||
|
|
||||||
#########################################################################
|
|
||||||
# OTHER
|
|
||||||
#########################################################################
|
|
||||||
#
|
|
||||||
#-- Command used to run pacman as root, instead of trying sudo and su
|
|
||||||
PACMAN_AUTH=()
|
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ HoldPkg = pacman glibc
|
|||||||
#XferCommand = /usr/bin/curl -L -C - -f -o %o %u
|
#XferCommand = /usr/bin/curl -L -C - -f -o %o %u
|
||||||
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
|
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
|
||||||
#CleanMethod = KeepInstalled
|
#CleanMethod = KeepInstalled
|
||||||
|
#UseDelta = 0.7
|
||||||
Architecture = auto
|
Architecture = auto
|
||||||
|
|
||||||
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
|
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
|
||||||
@@ -31,10 +32,9 @@ Architecture = auto
|
|||||||
# Misc options
|
# Misc options
|
||||||
#UseSyslog
|
#UseSyslog
|
||||||
#Color
|
#Color
|
||||||
#NoProgressBar
|
#TotalDownload
|
||||||
CheckSpace
|
CheckSpace
|
||||||
#VerbosePkgLists
|
#VerbosePkgLists
|
||||||
ParallelDownloads = 5
|
|
||||||
|
|
||||||
# PGP signature checking
|
# PGP signature checking
|
||||||
#SigLevel = Optional
|
#SigLevel = Optional
|
||||||
@@ -74,4 +74,4 @@ ParallelDownloads = 5
|
|||||||
# tips on creating your own repositories.
|
# tips on creating your own repositories.
|
||||||
#[custom]
|
#[custom]
|
||||||
#SigLevel = Optional TrustAll
|
#SigLevel = Optional TrustAll
|
||||||
#Server = file:///home/packages
|
#Server = file:///home/custompkgs
|
||||||
|
|||||||
77
lib/libalpm/Makefile.am
Normal file
77
lib/libalpm/Makefile.am
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
AUTOMAKE_OPTIONS = gnu
|
||||||
|
|
||||||
|
SUBDIRS = po
|
||||||
|
|
||||||
|
lib_LTLIBRARIES = libalpm.la
|
||||||
|
include_HEADERS = alpm_list.h alpm.h
|
||||||
|
|
||||||
|
AM_CPPFLAGS = \
|
||||||
|
-imacros $(top_builddir)/config.h \
|
||||||
|
-DSYSHOOKDIR=\"@datarootdir@/libalpm/hooks/\" \
|
||||||
|
-DLOCALEDIR=\"@localedir@\"
|
||||||
|
|
||||||
|
AM_CFLAGS = -pedantic -D_GNU_SOURCE $(WARNING_CFLAGS)
|
||||||
|
|
||||||
|
if ENABLE_VISIBILITY_CC
|
||||||
|
if DARWIN
|
||||||
|
AM_CFLAGS += -fvisibility=hidden
|
||||||
|
else
|
||||||
|
AM_CFLAGS += -fvisibility=internal
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
pkgconfigdir = $(libdir)/pkgconfig
|
||||||
|
pkgconfig_DATA = libalpm.pc
|
||||||
|
|
||||||
|
libalpm_la_SOURCES = \
|
||||||
|
add.h add.c \
|
||||||
|
alpm.h alpm.c \
|
||||||
|
alpm_list.h alpm_list.c \
|
||||||
|
backup.h backup.c \
|
||||||
|
base64.h base64.c \
|
||||||
|
be_local.c \
|
||||||
|
be_package.c \
|
||||||
|
be_sync.c \
|
||||||
|
conflict.h conflict.c \
|
||||||
|
db.h db.c \
|
||||||
|
delta.h delta.c \
|
||||||
|
deps.h deps.c \
|
||||||
|
diskspace.h diskspace.c \
|
||||||
|
dload.h dload.c \
|
||||||
|
error.c \
|
||||||
|
filelist.h filelist.c \
|
||||||
|
graph.h graph.c \
|
||||||
|
group.h group.c \
|
||||||
|
handle.h handle.c \
|
||||||
|
hook.h hook.c \
|
||||||
|
ini.h ini.c \
|
||||||
|
libarchive-compat.h \
|
||||||
|
log.h log.c \
|
||||||
|
package.h package.c \
|
||||||
|
pkghash.h pkghash.c \
|
||||||
|
rawstr.c \
|
||||||
|
remove.h remove.c \
|
||||||
|
signing.c signing.h \
|
||||||
|
sync.h sync.c \
|
||||||
|
trans.h trans.c \
|
||||||
|
util.h util.c \
|
||||||
|
util-common.h util-common.c \
|
||||||
|
version.c
|
||||||
|
|
||||||
|
libalpm_la_LDFLAGS = -no-undefined -version-info $(LIB_VERSION_INFO)
|
||||||
|
|
||||||
|
libalpm_la_CFLAGS = \
|
||||||
|
$(AM_CFLAGS) \
|
||||||
|
$(GPGME_CFLAGS) \
|
||||||
|
$(LIBARCHIVE_CFLAGS) \
|
||||||
|
$(LIBCURL_CFLAGS) \
|
||||||
|
$(LIBSSL_CFLAGS) \
|
||||||
|
$(NETTLE_CFLAGS)
|
||||||
|
|
||||||
|
libalpm_la_LIBADD = \
|
||||||
|
$(LTLIBINTL) \
|
||||||
|
$(GPGME_LIBS) \
|
||||||
|
$(LIBARCHIVE_LIBS) \
|
||||||
|
$(LIBCURL_LIBS) \
|
||||||
|
$(LIBSSL_LIBS) \
|
||||||
|
$(NETTLE_LIBS)
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* add.c
|
* add.c
|
||||||
*
|
*
|
||||||
* Copyright (c) 2006-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
@@ -47,12 +47,12 @@
|
|||||||
#include "remove.h"
|
#include "remove.h"
|
||||||
#include "handle.h"
|
#include "handle.h"
|
||||||
|
|
||||||
|
/** Add a package to the transaction. */
|
||||||
int SYMEXPORT alpm_add_pkg(alpm_handle_t *handle, alpm_pkg_t *pkg)
|
int SYMEXPORT alpm_add_pkg(alpm_handle_t *handle, alpm_pkg_t *pkg)
|
||||||
{
|
{
|
||||||
const char *pkgname, *pkgver;
|
const char *pkgname, *pkgver;
|
||||||
alpm_trans_t *trans;
|
alpm_trans_t *trans;
|
||||||
alpm_pkg_t *local;
|
alpm_pkg_t *local;
|
||||||
alpm_pkg_t *dup;
|
|
||||||
|
|
||||||
/* Sanity checks */
|
/* Sanity checks */
|
||||||
CHECK_HANDLE(handle, return -1);
|
CHECK_HANDLE(handle, return -1);
|
||||||
@@ -70,16 +70,12 @@ int SYMEXPORT alpm_add_pkg(alpm_handle_t *handle, alpm_pkg_t *pkg)
|
|||||||
|
|
||||||
_alpm_log(handle, ALPM_LOG_DEBUG, "adding package '%s'\n", pkgname);
|
_alpm_log(handle, ALPM_LOG_DEBUG, "adding package '%s'\n", pkgname);
|
||||||
|
|
||||||
if((dup = alpm_pkg_find(trans->add, pkgname))) {
|
if(alpm_pkg_find(trans->add, pkgname)) {
|
||||||
if(dup == pkg) {
|
|
||||||
_alpm_log(handle, ALPM_LOG_DEBUG, "skipping duplicate target: %s\n", pkgname);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/* error for separate packages with the same name */
|
|
||||||
RET_ERR(handle, ALPM_ERR_TRANS_DUP_TARGET, -1);
|
RET_ERR(handle, ALPM_ERR_TRANS_DUP_TARGET, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if((local = _alpm_db_get_pkgfromcache(handle->db_local, pkgname))) {
|
local = _alpm_db_get_pkgfromcache(handle->db_local, pkgname);
|
||||||
|
if(local) {
|
||||||
const char *localpkgname = local->name;
|
const char *localpkgname = local->name;
|
||||||
const char *localpkgver = local->version;
|
const char *localpkgver = local->version;
|
||||||
int cmp = _alpm_pkg_compare_versions(pkg, local);
|
int cmp = _alpm_pkg_compare_versions(pkg, local);
|
||||||
@@ -119,7 +115,6 @@ static int perform_extraction(alpm_handle_t *handle, struct archive *archive,
|
|||||||
ARCHIVE_EXTRACT_PERM |
|
ARCHIVE_EXTRACT_PERM |
|
||||||
ARCHIVE_EXTRACT_TIME |
|
ARCHIVE_EXTRACT_TIME |
|
||||||
ARCHIVE_EXTRACT_UNLINK |
|
ARCHIVE_EXTRACT_UNLINK |
|
||||||
ARCHIVE_EXTRACT_XATTR |
|
|
||||||
ARCHIVE_EXTRACT_SECURE_SYMLINKS;
|
ARCHIVE_EXTRACT_SECURE_SYMLINKS;
|
||||||
|
|
||||||
archive_entry_set_pathname(entry, filename);
|
archive_entry_set_pathname(entry, filename);
|
||||||
@@ -262,7 +257,7 @@ static int extract_single_file(alpm_handle_t *handle, struct archive *archive,
|
|||||||
"filesystem: %o package: %o\n"), filename, lsbuf.st_mode & mask,
|
"filesystem: %o package: %o\n"), filename, lsbuf.st_mode & mask,
|
||||||
entrymode & mask);
|
entrymode & mask);
|
||||||
alpm_logaction(handle, ALPM_CALLER_PREFIX,
|
alpm_logaction(handle, ALPM_CALLER_PREFIX,
|
||||||
"warning: directory permissions differ on %s, "
|
"warning: directory permissions differ on %s\n"
|
||||||
"filesystem: %o package: %o\n", filename, lsbuf.st_mode & mask,
|
"filesystem: %o package: %o\n", filename, lsbuf.st_mode & mask,
|
||||||
entrymode & mask);
|
entrymode & mask);
|
||||||
}
|
}
|
||||||
@@ -277,7 +272,7 @@ static int extract_single_file(alpm_handle_t *handle, struct archive *archive,
|
|||||||
"filesystem: %u:%u package: %u:%u\n"), filename,
|
"filesystem: %u:%u package: %u:%u\n"), filename,
|
||||||
lsbuf.st_uid, lsbuf.st_gid, entryuid, entrygid);
|
lsbuf.st_uid, lsbuf.st_gid, entryuid, entrygid);
|
||||||
alpm_logaction(handle, ALPM_CALLER_PREFIX,
|
alpm_logaction(handle, ALPM_CALLER_PREFIX,
|
||||||
"warning: directory ownership differs on %s, "
|
"warning: directory ownership differs on %s\n"
|
||||||
"filesystem: %u:%u package: %u:%u\n", filename,
|
"filesystem: %u:%u package: %u:%u\n", filename,
|
||||||
lsbuf.st_uid, lsbuf.st_gid, entryuid, entrygid);
|
lsbuf.st_uid, lsbuf.st_gid, entryuid, entrygid);
|
||||||
}
|
}
|
||||||
@@ -415,7 +410,7 @@ static int extract_single_file(alpm_handle_t *handle, struct archive *archive,
|
|||||||
static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg,
|
static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg,
|
||||||
size_t pkg_current, size_t pkg_count)
|
size_t pkg_current, size_t pkg_count)
|
||||||
{
|
{
|
||||||
int ret = 0, errors = 0;
|
int i, ret = 0, errors = 0;
|
||||||
int is_upgrade = 0;
|
int is_upgrade = 0;
|
||||||
alpm_pkg_t *oldpkg = NULL;
|
alpm_pkg_t *oldpkg = NULL;
|
||||||
alpm_db_t *db = handle->db_local;
|
alpm_db_t *db = handle->db_local;
|
||||||
@@ -432,7 +427,7 @@ static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg,
|
|||||||
ASSERT(trans != NULL, return -1);
|
ASSERT(trans != NULL, return -1);
|
||||||
|
|
||||||
/* see if this is an upgrade. if so, remove the old package first */
|
/* see if this is an upgrade. if so, remove the old package first */
|
||||||
if(_alpm_db_get_pkgfromcache(db, newpkg->name) && (oldpkg = newpkg->oldpkg)) {
|
if((oldpkg = newpkg->oldpkg)) {
|
||||||
int cmp = _alpm_pkg_compare_versions(newpkg, oldpkg);
|
int cmp = _alpm_pkg_compare_versions(newpkg, oldpkg);
|
||||||
if(cmp < 0) {
|
if(cmp < 0) {
|
||||||
log_msg = "downgrading";
|
log_msg = "downgrading";
|
||||||
@@ -484,7 +479,8 @@ static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg,
|
|||||||
/* set up fake remove transaction */
|
/* set up fake remove transaction */
|
||||||
if(_alpm_remove_single_package(handle, oldpkg, newpkg, 0, 0) == -1) {
|
if(_alpm_remove_single_package(handle, oldpkg, newpkg, 0, 0) == -1) {
|
||||||
handle->pm_errno = ALPM_ERR_TRANS_ABORT;
|
handle->pm_errno = ALPM_ERR_TRANS_ABORT;
|
||||||
return -1;
|
ret = -1;
|
||||||
|
goto cleanup;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -495,13 +491,15 @@ static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg,
|
|||||||
"error: could not create database entry %s-%s\n",
|
"error: could not create database entry %s-%s\n",
|
||||||
newpkg->name, newpkg->version);
|
newpkg->name, newpkg->version);
|
||||||
handle->pm_errno = ALPM_ERR_DB_WRITE;
|
handle->pm_errno = ALPM_ERR_DB_WRITE;
|
||||||
return -1;
|
ret = -1;
|
||||||
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
fd = _alpm_open_archive(db->handle, pkgfile, &buf,
|
fd = _alpm_open_archive(db->handle, pkgfile, &buf,
|
||||||
&archive, ALPM_ERR_PKG_OPEN);
|
&archive, ALPM_ERR_PKG_OPEN);
|
||||||
if(fd < 0) {
|
if(fd < 0) {
|
||||||
return -1;
|
ret = -1;
|
||||||
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* save the cwd so we can restore it later */
|
/* save the cwd so we can restore it later */
|
||||||
@@ -519,7 +517,8 @@ static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg,
|
|||||||
close(cwdfd);
|
close(cwdfd);
|
||||||
}
|
}
|
||||||
close(fd);
|
close(fd);
|
||||||
return -1;
|
ret = -1;
|
||||||
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(trans->flags & ALPM_TRANS_FLAG_DBONLY) {
|
if(trans->flags & ALPM_TRANS_FLAG_DBONLY) {
|
||||||
@@ -538,7 +537,7 @@ static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg,
|
|||||||
/* call PROGRESS once with 0 percent, as we sort-of skip that here */
|
/* call PROGRESS once with 0 percent, as we sort-of skip that here */
|
||||||
PROGRESS(handle, progress, newpkg->name, 0, pkg_count, pkg_current);
|
PROGRESS(handle, progress, newpkg->name, 0, pkg_count, pkg_current);
|
||||||
|
|
||||||
while(archive_read_next_header(archive, &entry) == ARCHIVE_OK) {
|
for(i = 0; archive_read_next_header(archive, &entry) == ARCHIVE_OK; i++) {
|
||||||
int percent;
|
int percent;
|
||||||
|
|
||||||
if(newpkg->size != 0) {
|
if(newpkg->size != 0) {
|
||||||
@@ -603,7 +602,8 @@ static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg,
|
|||||||
"error: could not update database entry %s-%s\n",
|
"error: could not update database entry %s-%s\n",
|
||||||
newpkg->name, newpkg->version);
|
newpkg->name, newpkg->version);
|
||||||
handle->pm_errno = ALPM_ERR_DB_WRITE;
|
handle->pm_errno = ALPM_ERR_DB_WRITE;
|
||||||
return -1;
|
ret = -1;
|
||||||
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(_alpm_db_add_pkgincache(db, newpkg) == -1) {
|
if(_alpm_db_add_pkgincache(db, newpkg) == -1) {
|
||||||
@@ -649,6 +649,7 @@ static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg,
|
|||||||
event.type = ALPM_EVENT_PACKAGE_OPERATION_DONE;
|
event.type = ALPM_EVENT_PACKAGE_OPERATION_DONE;
|
||||||
EVENT(handle, &event);
|
EVENT(handle, &event);
|
||||||
|
|
||||||
|
cleanup:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* add.h
|
* add.h
|
||||||
*
|
*
|
||||||
* Copyright (c) 2006-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* alpm.c
|
* alpm.c
|
||||||
*
|
*
|
||||||
* Copyright (c) 2006-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||||
* Copyright (c) 2005 by Aurelien Foret <orelien@chez.com>
|
* Copyright (c) 2005 by Aurelien Foret <orelien@chez.com>
|
||||||
* Copyright (c) 2005 by Christian Hamar <krics@linuxforum.hu>
|
* Copyright (c) 2005 by Christian Hamar <krics@linuxforum.hu>
|
||||||
@@ -32,6 +32,19 @@
|
|||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
|
/** \addtogroup alpm_interface Interface Functions
|
||||||
|
* @brief Functions to initialize and release libalpm
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Initializes the library.
|
||||||
|
* Creates handle, connects to database and creates lockfile.
|
||||||
|
* This must be called before any other functions are called.
|
||||||
|
* @param root the root path for all filesystem operations
|
||||||
|
* @param dbpath the absolute path to the libalpm database
|
||||||
|
* @param err an optional variable to hold any error return codes
|
||||||
|
* @return a context handle on success, NULL on error, err will be set if provided
|
||||||
|
*/
|
||||||
alpm_handle_t SYMEXPORT *alpm_initialize(const char *root, const char *dbpath,
|
alpm_handle_t SYMEXPORT *alpm_initialize(const char *root, const char *dbpath,
|
||||||
alpm_errno_t *err)
|
alpm_errno_t *err)
|
||||||
{
|
{
|
||||||
@@ -55,7 +68,7 @@ alpm_handle_t SYMEXPORT *alpm_initialize(const char *root, const char *dbpath,
|
|||||||
* with a slash) correctly, we skip SYSHOOKDIR[0]; the regular +1 therefore
|
* with a slash) correctly, we skip SYSHOOKDIR[0]; the regular +1 therefore
|
||||||
* disappears from the allocation */
|
* disappears from the allocation */
|
||||||
MALLOC(hookdir, strlen(myhandle->root) + strlen(SYSHOOKDIR), goto nomem);
|
MALLOC(hookdir, strlen(myhandle->root) + strlen(SYSHOOKDIR), goto nomem);
|
||||||
sprintf(hookdir, "%s%s", myhandle->root, &SYSHOOKDIR[1]);
|
sprintf(hookdir, "%s%s", myhandle->root, SYSHOOKDIR + 1);
|
||||||
myhandle->hookdirs = alpm_list_add(NULL, hookdir);
|
myhandle->hookdirs = alpm_list_add(NULL, hookdir);
|
||||||
|
|
||||||
/* set default database extension */
|
/* set default database extension */
|
||||||
@@ -70,13 +83,6 @@ alpm_handle_t SYMEXPORT *alpm_initialize(const char *root, const char *dbpath,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_LIBCURL
|
|
||||||
curl_global_init(CURL_GLOBAL_ALL);
|
|
||||||
myhandle->curlm = curl_multi_init();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
myhandle->parallel_downloads = 1;
|
|
||||||
|
|
||||||
#ifdef ENABLE_NLS
|
#ifdef ENABLE_NLS
|
||||||
bindtextdomain("libalpm", LOCALEDIR);
|
bindtextdomain("libalpm", LOCALEDIR);
|
||||||
#endif
|
#endif
|
||||||
@@ -93,23 +99,59 @@ cleanup:
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check current state and free all resources including storage locks */
|
/** Release the library.
|
||||||
|
* Disconnects from the database, removes handle and lockfile
|
||||||
|
* This should be the last alpm call you make.
|
||||||
|
* After this returns, handle should be considered invalid and cannot be reused
|
||||||
|
* in any way.
|
||||||
|
* @param myhandle the context handle
|
||||||
|
* @return 0 on success, -1 on error
|
||||||
|
*/
|
||||||
int SYMEXPORT alpm_release(alpm_handle_t *myhandle)
|
int SYMEXPORT alpm_release(alpm_handle_t *myhandle)
|
||||||
{
|
{
|
||||||
|
int ret = 0;
|
||||||
|
alpm_db_t *db;
|
||||||
|
|
||||||
CHECK_HANDLE(myhandle, return -1);
|
CHECK_HANDLE(myhandle, return -1);
|
||||||
ASSERT(myhandle->trans == NULL, RET_ERR(myhandle, ALPM_ERR_TRANS_NOT_NULL, -1));
|
|
||||||
|
/* close local database */
|
||||||
|
db = myhandle->db_local;
|
||||||
|
if(db) {
|
||||||
|
db->ops->unregister(db);
|
||||||
|
myhandle->db_local = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(alpm_unregister_all_syncdbs(myhandle) == -1) {
|
||||||
|
ret = -1;
|
||||||
|
}
|
||||||
|
|
||||||
_alpm_handle_unlock(myhandle);
|
_alpm_handle_unlock(myhandle);
|
||||||
_alpm_handle_free(myhandle);
|
_alpm_handle_free(myhandle);
|
||||||
|
|
||||||
return 0;
|
#ifdef HAVE_LIBCURL
|
||||||
|
curl_global_cleanup();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
/** @defgroup alpm_misc Miscellaneous Functions
|
||||||
|
* @brief Various libalpm functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Get the version of library.
|
||||||
|
* @return the library version, e.g. "6.0.4"
|
||||||
|
* */
|
||||||
const char SYMEXPORT *alpm_version(void)
|
const char SYMEXPORT *alpm_version(void)
|
||||||
{
|
{
|
||||||
return LIB_VERSION;
|
return LIB_VERSION;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Get the capabilities of the library.
|
||||||
|
* @return a bitmask of the capabilities
|
||||||
|
* */
|
||||||
int SYMEXPORT alpm_capabilities(void)
|
int SYMEXPORT alpm_capabilities(void)
|
||||||
{
|
{
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
2703
lib/libalpm/alpm.h
2703
lib/libalpm/alpm.h
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* alpm_list.c
|
* alpm_list.c
|
||||||
*
|
*
|
||||||
* Copyright (c) 2006-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
@@ -30,9 +30,25 @@
|
|||||||
|
|
||||||
/* check exported library symbols with: nm -C -D <lib> */
|
/* check exported library symbols with: nm -C -D <lib> */
|
||||||
#define SYMEXPORT __attribute__((visibility("default")))
|
#define SYMEXPORT __attribute__((visibility("default")))
|
||||||
|
#define SYMHIDDEN __attribute__((visibility("internal")))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @addtogroup alpm_list List Functions
|
||||||
|
* @brief Functions to manipulate alpm_list_t lists.
|
||||||
|
*
|
||||||
|
* These functions are designed to create, destroy, and modify lists of
|
||||||
|
* type alpm_list_t. This is an internal list type used by libalpm that is
|
||||||
|
* publicly exposed for use by frontends if desired.
|
||||||
|
*
|
||||||
|
* @{ */
|
||||||
|
|
||||||
/* Allocation */
|
/* Allocation */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Free a list, but not the contained data.
|
||||||
|
*
|
||||||
|
* @param list the list to free
|
||||||
|
*/
|
||||||
void SYMEXPORT alpm_list_free(alpm_list_t *list)
|
void SYMEXPORT alpm_list_free(alpm_list_t *list)
|
||||||
{
|
{
|
||||||
alpm_list_t *it = list;
|
alpm_list_t *it = list;
|
||||||
@@ -44,6 +60,12 @@ void SYMEXPORT alpm_list_free(alpm_list_t *list)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Free the internal data of a list structure.
|
||||||
|
*
|
||||||
|
* @param list the list to free
|
||||||
|
* @param fn a free function for the internal data
|
||||||
|
*/
|
||||||
void SYMEXPORT alpm_list_free_inner(alpm_list_t *list, alpm_list_fn_free fn)
|
void SYMEXPORT alpm_list_free_inner(alpm_list_t *list, alpm_list_fn_free fn)
|
||||||
{
|
{
|
||||||
alpm_list_t *it = list;
|
alpm_list_t *it = list;
|
||||||
@@ -61,12 +83,28 @@ void SYMEXPORT alpm_list_free_inner(alpm_list_t *list, alpm_list_fn_free fn)
|
|||||||
|
|
||||||
/* Mutators */
|
/* Mutators */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Add a new item to the end of the list.
|
||||||
|
*
|
||||||
|
* @param list the list to add to
|
||||||
|
* @param data the new item to be added to the list
|
||||||
|
*
|
||||||
|
* @return the resultant list
|
||||||
|
*/
|
||||||
alpm_list_t SYMEXPORT *alpm_list_add(alpm_list_t *list, void *data)
|
alpm_list_t SYMEXPORT *alpm_list_add(alpm_list_t *list, void *data)
|
||||||
{
|
{
|
||||||
alpm_list_append(&list, data);
|
alpm_list_append(&list, data);
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Add a new item to the end of the list.
|
||||||
|
*
|
||||||
|
* @param list the list to add to
|
||||||
|
* @param data the new item to be added to the list
|
||||||
|
*
|
||||||
|
* @return the newly added item
|
||||||
|
*/
|
||||||
alpm_list_t SYMEXPORT *alpm_list_append(alpm_list_t **list, void *data)
|
alpm_list_t SYMEXPORT *alpm_list_append(alpm_list_t **list, void *data)
|
||||||
{
|
{
|
||||||
alpm_list_t *ptr;
|
alpm_list_t *ptr;
|
||||||
@@ -93,6 +131,14 @@ alpm_list_t SYMEXPORT *alpm_list_append(alpm_list_t **list, void *data)
|
|||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Duplicate and append a string to a list.
|
||||||
|
*
|
||||||
|
* @param list the list to append to
|
||||||
|
* @param data the string to duplicate and append
|
||||||
|
*
|
||||||
|
* @return the newly added item
|
||||||
|
*/
|
||||||
alpm_list_t SYMEXPORT *alpm_list_append_strdup(alpm_list_t **list, const char *data)
|
alpm_list_t SYMEXPORT *alpm_list_append_strdup(alpm_list_t **list, const char *data)
|
||||||
{
|
{
|
||||||
alpm_list_t *ret;
|
alpm_list_t *ret;
|
||||||
@@ -105,6 +151,15 @@ alpm_list_t SYMEXPORT *alpm_list_append_strdup(alpm_list_t **list, const char *d
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Add items to a list in sorted order.
|
||||||
|
*
|
||||||
|
* @param list the list to add to
|
||||||
|
* @param data the new item to be added to the list
|
||||||
|
* @param fn the comparison function to use to determine order
|
||||||
|
*
|
||||||
|
* @return the resultant list
|
||||||
|
*/
|
||||||
alpm_list_t SYMEXPORT *alpm_list_add_sorted(alpm_list_t *list, void *data, alpm_list_fn_cmp fn)
|
alpm_list_t SYMEXPORT *alpm_list_add_sorted(alpm_list_t *list, void *data, alpm_list_fn_cmp fn)
|
||||||
{
|
{
|
||||||
if(!fn || !list) {
|
if(!fn || !list) {
|
||||||
@@ -147,6 +202,17 @@ alpm_list_t SYMEXPORT *alpm_list_add_sorted(alpm_list_t *list, void *data, alpm_
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Join two lists.
|
||||||
|
* The two lists must be independent. Do not free the original lists after
|
||||||
|
* calling this function, as this is not a copy operation. The list pointers
|
||||||
|
* passed in should be considered invalid after calling this function.
|
||||||
|
*
|
||||||
|
* @param first the first list
|
||||||
|
* @param second the second list
|
||||||
|
*
|
||||||
|
* @return the resultant joined list
|
||||||
|
*/
|
||||||
alpm_list_t SYMEXPORT *alpm_list_join(alpm_list_t *first, alpm_list_t *second)
|
alpm_list_t SYMEXPORT *alpm_list_join(alpm_list_t *first, alpm_list_t *second)
|
||||||
{
|
{
|
||||||
alpm_list_t *tmp;
|
alpm_list_t *tmp;
|
||||||
@@ -169,6 +235,15 @@ alpm_list_t SYMEXPORT *alpm_list_join(alpm_list_t *first, alpm_list_t *second)
|
|||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Merge the two sorted sublists into one sorted list.
|
||||||
|
*
|
||||||
|
* @param left the first list
|
||||||
|
* @param right the second list
|
||||||
|
* @param fn comparison function for determining merge order
|
||||||
|
*
|
||||||
|
* @return the resultant list
|
||||||
|
*/
|
||||||
alpm_list_t SYMEXPORT *alpm_list_mmerge(alpm_list_t *left, alpm_list_t *right,
|
alpm_list_t SYMEXPORT *alpm_list_mmerge(alpm_list_t *left, alpm_list_t *right,
|
||||||
alpm_list_fn_cmp fn)
|
alpm_list_fn_cmp fn)
|
||||||
{
|
{
|
||||||
@@ -230,6 +305,15 @@ alpm_list_t SYMEXPORT *alpm_list_mmerge(alpm_list_t *left, alpm_list_t *right,
|
|||||||
return newlist;
|
return newlist;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sort a list of size `n` using mergesort algorithm.
|
||||||
|
*
|
||||||
|
* @param list the list to sort
|
||||||
|
* @param n the size of the list
|
||||||
|
* @param fn the comparison function for determining order
|
||||||
|
*
|
||||||
|
* @return the resultant list
|
||||||
|
*/
|
||||||
alpm_list_t SYMEXPORT *alpm_list_msort(alpm_list_t *list, size_t n,
|
alpm_list_t SYMEXPORT *alpm_list_msort(alpm_list_t *list, size_t n,
|
||||||
alpm_list_fn_cmp fn)
|
alpm_list_fn_cmp fn)
|
||||||
{
|
{
|
||||||
@@ -255,6 +339,15 @@ alpm_list_t SYMEXPORT *alpm_list_msort(alpm_list_t *list, size_t n,
|
|||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Remove an item from the list.
|
||||||
|
* item is not freed; this is the responsibility of the caller.
|
||||||
|
*
|
||||||
|
* @param haystack the list to remove the item from
|
||||||
|
* @param item the item to remove from the list
|
||||||
|
*
|
||||||
|
* @return the resultant list
|
||||||
|
*/
|
||||||
alpm_list_t SYMEXPORT *alpm_list_remove_item(alpm_list_t *haystack,
|
alpm_list_t SYMEXPORT *alpm_list_remove_item(alpm_list_t *haystack,
|
||||||
alpm_list_t *item)
|
alpm_list_t *item)
|
||||||
{
|
{
|
||||||
@@ -292,6 +385,17 @@ alpm_list_t SYMEXPORT *alpm_list_remove_item(alpm_list_t *haystack,
|
|||||||
return haystack;
|
return haystack;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Remove an item from the list.
|
||||||
|
*
|
||||||
|
* @param haystack the list to remove the item from
|
||||||
|
* @param needle the data member of the item we're removing
|
||||||
|
* @param fn the comparison function for searching
|
||||||
|
* @param data output parameter containing data of the removed item
|
||||||
|
*
|
||||||
|
* @return the resultant list
|
||||||
|
*/
|
||||||
alpm_list_t SYMEXPORT *alpm_list_remove(alpm_list_t *haystack,
|
alpm_list_t SYMEXPORT *alpm_list_remove(alpm_list_t *haystack,
|
||||||
const void *needle, alpm_list_fn_cmp fn, void **data)
|
const void *needle, alpm_list_fn_cmp fn, void **data)
|
||||||
{
|
{
|
||||||
@@ -326,6 +430,15 @@ alpm_list_t SYMEXPORT *alpm_list_remove(alpm_list_t *haystack,
|
|||||||
return haystack;
|
return haystack;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Remove a string from a list.
|
||||||
|
*
|
||||||
|
* @param haystack the list to remove the item from
|
||||||
|
* @param needle the data member of the item we're removing
|
||||||
|
* @param data output parameter containing data of the removed item
|
||||||
|
*
|
||||||
|
* @return the resultant list
|
||||||
|
*/
|
||||||
alpm_list_t SYMEXPORT *alpm_list_remove_str(alpm_list_t *haystack,
|
alpm_list_t SYMEXPORT *alpm_list_remove_str(alpm_list_t *haystack,
|
||||||
const char *needle, char **data)
|
const char *needle, char **data)
|
||||||
{
|
{
|
||||||
@@ -333,6 +446,15 @@ alpm_list_t SYMEXPORT *alpm_list_remove_str(alpm_list_t *haystack,
|
|||||||
(alpm_list_fn_cmp)strcmp, (void **)data);
|
(alpm_list_fn_cmp)strcmp, (void **)data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Create a new list without any duplicates.
|
||||||
|
*
|
||||||
|
* This does NOT copy data members.
|
||||||
|
*
|
||||||
|
* @param list the list to copy
|
||||||
|
*
|
||||||
|
* @return a new list containing non-duplicate items
|
||||||
|
*/
|
||||||
alpm_list_t SYMEXPORT *alpm_list_remove_dupes(const alpm_list_t *list)
|
alpm_list_t SYMEXPORT *alpm_list_remove_dupes(const alpm_list_t *list)
|
||||||
{
|
{
|
||||||
const alpm_list_t *lp = list;
|
const alpm_list_t *lp = list;
|
||||||
@@ -349,6 +471,13 @@ alpm_list_t SYMEXPORT *alpm_list_remove_dupes(const alpm_list_t *list)
|
|||||||
return newlist;
|
return newlist;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Copy a string list, including data.
|
||||||
|
*
|
||||||
|
* @param list the list to copy
|
||||||
|
*
|
||||||
|
* @return a copy of the original list
|
||||||
|
*/
|
||||||
alpm_list_t SYMEXPORT *alpm_list_strdup(const alpm_list_t *list)
|
alpm_list_t SYMEXPORT *alpm_list_strdup(const alpm_list_t *list)
|
||||||
{
|
{
|
||||||
const alpm_list_t *lp = list;
|
const alpm_list_t *lp = list;
|
||||||
@@ -363,6 +492,13 @@ alpm_list_t SYMEXPORT *alpm_list_strdup(const alpm_list_t *list)
|
|||||||
return newlist;
|
return newlist;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Copy a list, without copying data.
|
||||||
|
*
|
||||||
|
* @param list the list to copy
|
||||||
|
*
|
||||||
|
* @return a copy of the original list
|
||||||
|
*/
|
||||||
alpm_list_t SYMEXPORT *alpm_list_copy(const alpm_list_t *list)
|
alpm_list_t SYMEXPORT *alpm_list_copy(const alpm_list_t *list)
|
||||||
{
|
{
|
||||||
const alpm_list_t *lp = list;
|
const alpm_list_t *lp = list;
|
||||||
@@ -377,6 +513,16 @@ alpm_list_t SYMEXPORT *alpm_list_copy(const alpm_list_t *list)
|
|||||||
return newlist;
|
return newlist;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Copy a list and copy the data.
|
||||||
|
* Note that the data elements to be copied should not contain pointers
|
||||||
|
* and should also be of constant size.
|
||||||
|
*
|
||||||
|
* @param list the list to copy
|
||||||
|
* @param size the size of each data element
|
||||||
|
*
|
||||||
|
* @return a copy of the original list, data copied as well
|
||||||
|
*/
|
||||||
alpm_list_t SYMEXPORT *alpm_list_copy_data(const alpm_list_t *list,
|
alpm_list_t SYMEXPORT *alpm_list_copy_data(const alpm_list_t *list,
|
||||||
size_t size)
|
size_t size)
|
||||||
{
|
{
|
||||||
@@ -400,6 +546,13 @@ alpm_list_t SYMEXPORT *alpm_list_copy_data(const alpm_list_t *list,
|
|||||||
return newlist;
|
return newlist;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Create a new list in reverse order.
|
||||||
|
*
|
||||||
|
* @param list the list to copy
|
||||||
|
*
|
||||||
|
* @return a new list in reverse order
|
||||||
|
*/
|
||||||
alpm_list_t SYMEXPORT *alpm_list_reverse(alpm_list_t *list)
|
alpm_list_t SYMEXPORT *alpm_list_reverse(alpm_list_t *list)
|
||||||
{
|
{
|
||||||
const alpm_list_t *lp;
|
const alpm_list_t *lp;
|
||||||
@@ -417,7 +570,6 @@ alpm_list_t SYMEXPORT *alpm_list_reverse(alpm_list_t *list)
|
|||||||
while(lp) {
|
while(lp) {
|
||||||
if(alpm_list_append(&newlist, lp->data) == NULL) {
|
if(alpm_list_append(&newlist, lp->data) == NULL) {
|
||||||
alpm_list_free(newlist);
|
alpm_list_free(newlist);
|
||||||
list->prev = backup;
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
lp = lp->prev;
|
lp = lp->prev;
|
||||||
@@ -428,6 +580,14 @@ alpm_list_t SYMEXPORT *alpm_list_reverse(alpm_list_t *list)
|
|||||||
|
|
||||||
/* Accessors */
|
/* Accessors */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Return nth element from list (starting from 0).
|
||||||
|
*
|
||||||
|
* @param list the list
|
||||||
|
* @param n the index of the item to find (n < alpm_list_count(list) IS needed)
|
||||||
|
*
|
||||||
|
* @return an alpm_list_t node for index `n`
|
||||||
|
*/
|
||||||
alpm_list_t SYMEXPORT *alpm_list_nth(const alpm_list_t *list, size_t n)
|
alpm_list_t SYMEXPORT *alpm_list_nth(const alpm_list_t *list, size_t n)
|
||||||
{
|
{
|
||||||
const alpm_list_t *i = list;
|
const alpm_list_t *i = list;
|
||||||
@@ -437,6 +597,13 @@ alpm_list_t SYMEXPORT *alpm_list_nth(const alpm_list_t *list, size_t n)
|
|||||||
return (alpm_list_t *)i;
|
return (alpm_list_t *)i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get the next element of a list.
|
||||||
|
*
|
||||||
|
* @param node the list node
|
||||||
|
*
|
||||||
|
* @return the next element, or NULL when no more elements exist
|
||||||
|
*/
|
||||||
inline alpm_list_t SYMEXPORT *alpm_list_next(const alpm_list_t *node)
|
inline alpm_list_t SYMEXPORT *alpm_list_next(const alpm_list_t *node)
|
||||||
{
|
{
|
||||||
if(node) {
|
if(node) {
|
||||||
@@ -446,6 +613,13 @@ inline alpm_list_t SYMEXPORT *alpm_list_next(const alpm_list_t *node)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get the previous element of a list.
|
||||||
|
*
|
||||||
|
* @param list the list head
|
||||||
|
*
|
||||||
|
* @return the previous element, or NULL when no previous element exist
|
||||||
|
*/
|
||||||
inline alpm_list_t SYMEXPORT *alpm_list_previous(const alpm_list_t *list)
|
inline alpm_list_t SYMEXPORT *alpm_list_previous(const alpm_list_t *list)
|
||||||
{
|
{
|
||||||
if(list && list->prev->next) {
|
if(list && list->prev->next) {
|
||||||
@@ -455,6 +629,13 @@ inline alpm_list_t SYMEXPORT *alpm_list_previous(const alpm_list_t *list)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get the last item in the list.
|
||||||
|
*
|
||||||
|
* @param list the list
|
||||||
|
*
|
||||||
|
* @return the last element in the list
|
||||||
|
*/
|
||||||
alpm_list_t SYMEXPORT *alpm_list_last(const alpm_list_t *list)
|
alpm_list_t SYMEXPORT *alpm_list_last(const alpm_list_t *list)
|
||||||
{
|
{
|
||||||
if(list) {
|
if(list) {
|
||||||
@@ -466,6 +647,13 @@ alpm_list_t SYMEXPORT *alpm_list_last(const alpm_list_t *list)
|
|||||||
|
|
||||||
/* Misc */
|
/* Misc */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get the number of items in a list.
|
||||||
|
*
|
||||||
|
* @param list the list
|
||||||
|
*
|
||||||
|
* @return the number of list items
|
||||||
|
*/
|
||||||
size_t SYMEXPORT alpm_list_count(const alpm_list_t *list)
|
size_t SYMEXPORT alpm_list_count(const alpm_list_t *list)
|
||||||
{
|
{
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
@@ -477,6 +665,15 @@ size_t SYMEXPORT alpm_list_count(const alpm_list_t *list)
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Find an item in a list.
|
||||||
|
*
|
||||||
|
* @param needle the item to search
|
||||||
|
* @param haystack the list
|
||||||
|
* @param fn the comparison function for searching (!= NULL)
|
||||||
|
*
|
||||||
|
* @return `needle` if found, NULL otherwise
|
||||||
|
*/
|
||||||
void SYMEXPORT *alpm_list_find(const alpm_list_t *haystack, const void *needle,
|
void SYMEXPORT *alpm_list_find(const alpm_list_t *haystack, const void *needle,
|
||||||
alpm_list_fn_cmp fn)
|
alpm_list_fn_cmp fn)
|
||||||
{
|
{
|
||||||
@@ -496,12 +693,30 @@ static int ptr_cmp(const void *p, const void *q)
|
|||||||
return (p != q);
|
return (p != q);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Find an item in a list.
|
||||||
|
*
|
||||||
|
* Search for the item whose data matches that of the `needle`.
|
||||||
|
*
|
||||||
|
* @param needle the data to search for (== comparison)
|
||||||
|
* @param haystack the list
|
||||||
|
*
|
||||||
|
* @return `needle` if found, NULL otherwise
|
||||||
|
*/
|
||||||
void SYMEXPORT *alpm_list_find_ptr(const alpm_list_t *haystack,
|
void SYMEXPORT *alpm_list_find_ptr(const alpm_list_t *haystack,
|
||||||
const void *needle)
|
const void *needle)
|
||||||
{
|
{
|
||||||
return alpm_list_find(haystack, needle, ptr_cmp);
|
return alpm_list_find(haystack, needle, ptr_cmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Find a string in a list.
|
||||||
|
*
|
||||||
|
* @param needle the string to search for
|
||||||
|
* @param haystack the list
|
||||||
|
*
|
||||||
|
* @return `needle` if found, NULL otherwise
|
||||||
|
*/
|
||||||
char SYMEXPORT *alpm_list_find_str(const alpm_list_t *haystack,
|
char SYMEXPORT *alpm_list_find_str(const alpm_list_t *haystack,
|
||||||
const char *needle)
|
const char *needle)
|
||||||
{
|
{
|
||||||
@@ -509,63 +724,20 @@ char SYMEXPORT *alpm_list_find_str(const alpm_list_t *haystack,
|
|||||||
(alpm_list_fn_cmp)strcmp);
|
(alpm_list_fn_cmp)strcmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
int SYMEXPORT alpm_list_cmp_unsorted(const alpm_list_t *left,
|
/**
|
||||||
const alpm_list_t *right, alpm_list_fn_cmp fn)
|
* @brief Find the differences between list `left` and list `right`
|
||||||
{
|
*
|
||||||
const alpm_list_t *l = left;
|
* The two lists must be sorted. Items only in list `left` are added to the
|
||||||
const alpm_list_t *r = right;
|
* `onlyleft` list. Items only in list `right` are added to the `onlyright`
|
||||||
int *matched;
|
* list.
|
||||||
|
*
|
||||||
/* short circuiting length comparison */
|
* @param left the first list
|
||||||
while(l && r) {
|
* @param right the second list
|
||||||
l = l->next;
|
* @param fn the comparison function
|
||||||
r = r->next;
|
* @param onlyleft pointer to the first result list
|
||||||
}
|
* @param onlyright pointer to the second result list
|
||||||
if(l || r) {
|
*
|
||||||
return 0;
|
*/
|
||||||
}
|
|
||||||
|
|
||||||
/* faster comparison for if the lists happen to be in the same order */
|
|
||||||
while(left && fn(left->data, right->data) == 0) {
|
|
||||||
left = left->next;
|
|
||||||
right = right->next;
|
|
||||||
}
|
|
||||||
if(!left) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
matched = calloc(alpm_list_count(right), sizeof(int));
|
|
||||||
if(matched == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(l = left; l; l = l->next) {
|
|
||||||
int found = 0;
|
|
||||||
int n = 0;
|
|
||||||
|
|
||||||
for(r = right; r; r = r->next, n++) {
|
|
||||||
/* make sure we don't match the same value twice */
|
|
||||||
if(matched[n]) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if(fn(l->data, r->data) == 0) {
|
|
||||||
found = 1;
|
|
||||||
matched[n] = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!found) {
|
|
||||||
free(matched);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
free(matched);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SYMEXPORT alpm_list_diff_sorted(const alpm_list_t *left,
|
void SYMEXPORT alpm_list_diff_sorted(const alpm_list_t *left,
|
||||||
const alpm_list_t *right, alpm_list_fn_cmp fn,
|
const alpm_list_t *right, alpm_list_fn_cmp fn,
|
||||||
alpm_list_t **onlyleft, alpm_list_t **onlyright)
|
alpm_list_t **onlyleft, alpm_list_t **onlyright)
|
||||||
@@ -610,6 +782,15 @@ void SYMEXPORT alpm_list_diff_sorted(const alpm_list_t *left,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Find the items in list `lhs` that are not present in list `rhs`.
|
||||||
|
*
|
||||||
|
* @param lhs the first list
|
||||||
|
* @param rhs the second list
|
||||||
|
* @param fn the comparison function
|
||||||
|
*
|
||||||
|
* @return a list containing all items in `lhs` not present in `rhs`
|
||||||
|
*/
|
||||||
alpm_list_t SYMEXPORT *alpm_list_diff(const alpm_list_t *lhs,
|
alpm_list_t SYMEXPORT *alpm_list_diff(const alpm_list_t *lhs,
|
||||||
const alpm_list_t *rhs, alpm_list_fn_cmp fn)
|
const alpm_list_t *rhs, alpm_list_fn_cmp fn)
|
||||||
{
|
{
|
||||||
@@ -628,6 +809,17 @@ alpm_list_t SYMEXPORT *alpm_list_diff(const alpm_list_t *lhs,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Copy a list and data into a standard C array of fixed length.
|
||||||
|
* Note that the data elements are shallow copied so any contained pointers
|
||||||
|
* will point to the original data.
|
||||||
|
*
|
||||||
|
* @param list the list to copy
|
||||||
|
* @param n the size of the list
|
||||||
|
* @param size the size of each data element
|
||||||
|
*
|
||||||
|
* @return an array version of the original list, data copied as well
|
||||||
|
*/
|
||||||
void SYMEXPORT *alpm_list_to_array(const alpm_list_t *list, size_t n,
|
void SYMEXPORT *alpm_list_to_array(const alpm_list_t *list, size_t n,
|
||||||
size_t size)
|
size_t size)
|
||||||
{
|
{
|
||||||
@@ -648,3 +840,5 @@ void SYMEXPORT *alpm_list_to_array(const alpm_list_t *list, size_t n,
|
|||||||
}
|
}
|
||||||
return array;
|
return array;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* alpm_list.h
|
* alpm_list.h
|
||||||
*
|
*
|
||||||
* Copyright (c) 2006-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
@@ -17,8 +17,6 @@
|
|||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef ALPM_LIST_H
|
#ifndef ALPM_LIST_H
|
||||||
#define ALPM_LIST_H
|
#define ALPM_LIST_H
|
||||||
|
|
||||||
@@ -33,362 +31,63 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ingroup libalpm
|
* @brief Linked list type used by libalpm.
|
||||||
* @addtogroup libalpm_list libalpm_list(3)
|
|
||||||
* @brief Functions to manipulate alpm_list_t lists.
|
|
||||||
*
|
|
||||||
* These functions are designed to create, destroy, and modify lists of
|
|
||||||
* type alpm_list_t. This is an internal list type used by libalpm that is
|
|
||||||
* publicly exposed for use by frontends if desired.
|
|
||||||
*
|
*
|
||||||
* It is exposed so front ends can use it to prevent the need to reimplement
|
* It is exposed so front ends can use it to prevent the need to reimplement
|
||||||
* lists of their own; however, it is not required that the front end uses
|
* lists of their own; however, it is not required that the front end uses
|
||||||
* it.
|
* it.
|
||||||
* @{
|
|
||||||
*/
|
*/
|
||||||
|
typedef struct __alpm_list_t {
|
||||||
/** A doubly linked list */
|
|
||||||
typedef struct _alpm_list_t {
|
|
||||||
/** data held by the list node */
|
/** data held by the list node */
|
||||||
void *data;
|
void *data;
|
||||||
/** pointer to the previous node */
|
/** pointer to the previous node */
|
||||||
struct _alpm_list_t *prev;
|
struct __alpm_list_t *prev;
|
||||||
/** pointer to the next node */
|
/** pointer to the next node */
|
||||||
struct _alpm_list_t *next;
|
struct __alpm_list_t *next;
|
||||||
} alpm_list_t;
|
} alpm_list_t;
|
||||||
|
|
||||||
/** Frees a list and its contents */
|
|
||||||
#define FREELIST(p) do { alpm_list_free_inner(p, free); alpm_list_free(p); p = NULL; } while(0)
|
#define FREELIST(p) do { alpm_list_free_inner(p, free); alpm_list_free(p); p = NULL; } while(0)
|
||||||
|
|
||||||
/** item deallocation callback.
|
typedef void (*alpm_list_fn_free)(void *); /* item deallocation callback */
|
||||||
* @param item the item to free
|
typedef int (*alpm_list_fn_cmp)(const void *, const void *); /* item comparison callback */
|
||||||
*/
|
|
||||||
typedef void (*alpm_list_fn_free)(void * item);
|
|
||||||
|
|
||||||
/** item comparison callback */
|
|
||||||
typedef int (*alpm_list_fn_cmp)(const void *, const void *);
|
|
||||||
|
|
||||||
/* allocation */
|
/* allocation */
|
||||||
|
|
||||||
/** Free a list, but not the contained data.
|
|
||||||
*
|
|
||||||
* @param list the list to free
|
|
||||||
*/
|
|
||||||
void alpm_list_free(alpm_list_t *list);
|
void alpm_list_free(alpm_list_t *list);
|
||||||
|
|
||||||
/** Free the internal data of a list structure but not the list itself.
|
|
||||||
*
|
|
||||||
* @param list the list to free
|
|
||||||
* @param fn a free function for the internal data
|
|
||||||
*/
|
|
||||||
void alpm_list_free_inner(alpm_list_t *list, alpm_list_fn_free fn);
|
void alpm_list_free_inner(alpm_list_t *list, alpm_list_fn_free fn);
|
||||||
|
|
||||||
/* item mutators */
|
/* item mutators */
|
||||||
|
|
||||||
/** Add a new item to the end of the list.
|
|
||||||
*
|
|
||||||
* @param list the list to add to
|
|
||||||
* @param data the new item to be added to the list
|
|
||||||
*
|
|
||||||
* @return the resultant list
|
|
||||||
*/
|
|
||||||
alpm_list_t *alpm_list_add(alpm_list_t *list, void *data);
|
alpm_list_t *alpm_list_add(alpm_list_t *list, void *data);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Add a new item to the end of the list.
|
|
||||||
*
|
|
||||||
* @param list the list to add to
|
|
||||||
* @param data the new item to be added to the list
|
|
||||||
*
|
|
||||||
* @return the newly added item
|
|
||||||
*/
|
|
||||||
alpm_list_t *alpm_list_append(alpm_list_t **list, void *data);
|
alpm_list_t *alpm_list_append(alpm_list_t **list, void *data);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Duplicate and append a string to a list.
|
|
||||||
*
|
|
||||||
* @param list the list to append to
|
|
||||||
* @param data the string to duplicate and append
|
|
||||||
*
|
|
||||||
* @return the newly added item
|
|
||||||
*/
|
|
||||||
alpm_list_t *alpm_list_append_strdup(alpm_list_t **list, const char *data);
|
alpm_list_t *alpm_list_append_strdup(alpm_list_t **list, const char *data);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Add items to a list in sorted order.
|
|
||||||
*
|
|
||||||
* @param list the list to add to
|
|
||||||
* @param data the new item to be added to the list
|
|
||||||
* @param fn the comparison function to use to determine order
|
|
||||||
*
|
|
||||||
* @return the resultant list
|
|
||||||
*/
|
|
||||||
alpm_list_t *alpm_list_add_sorted(alpm_list_t *list, void *data, alpm_list_fn_cmp fn);
|
alpm_list_t *alpm_list_add_sorted(alpm_list_t *list, void *data, alpm_list_fn_cmp fn);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Join two lists.
|
|
||||||
* The two lists must be independent. Do not free the original lists after
|
|
||||||
* calling this function, as this is not a copy operation. The list pointers
|
|
||||||
* passed in should be considered invalid after calling this function.
|
|
||||||
*
|
|
||||||
* @param first the first list
|
|
||||||
* @param second the second list
|
|
||||||
*
|
|
||||||
* @return the resultant joined list
|
|
||||||
*/
|
|
||||||
alpm_list_t *alpm_list_join(alpm_list_t *first, alpm_list_t *second);
|
alpm_list_t *alpm_list_join(alpm_list_t *first, alpm_list_t *second);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Merge the two sorted sublists into one sorted list.
|
|
||||||
*
|
|
||||||
* @param left the first list
|
|
||||||
* @param right the second list
|
|
||||||
* @param fn comparison function for determining merge order
|
|
||||||
*
|
|
||||||
* @return the resultant list
|
|
||||||
*/
|
|
||||||
alpm_list_t *alpm_list_mmerge(alpm_list_t *left, alpm_list_t *right, alpm_list_fn_cmp fn);
|
alpm_list_t *alpm_list_mmerge(alpm_list_t *left, alpm_list_t *right, alpm_list_fn_cmp fn);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Sort a list of size `n` using mergesort algorithm.
|
|
||||||
*
|
|
||||||
* @param list the list to sort
|
|
||||||
* @param n the size of the list
|
|
||||||
* @param fn the comparison function for determining order
|
|
||||||
*
|
|
||||||
* @return the resultant list
|
|
||||||
*/
|
|
||||||
alpm_list_t *alpm_list_msort(alpm_list_t *list, size_t n, alpm_list_fn_cmp fn);
|
alpm_list_t *alpm_list_msort(alpm_list_t *list, size_t n, alpm_list_fn_cmp fn);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Remove an item from the list.
|
|
||||||
* item is not freed; this is the responsibility of the caller.
|
|
||||||
*
|
|
||||||
* @param haystack the list to remove the item from
|
|
||||||
* @param item the item to remove from the list
|
|
||||||
*
|
|
||||||
* @return the resultant list
|
|
||||||
*/
|
|
||||||
alpm_list_t *alpm_list_remove_item(alpm_list_t *haystack, alpm_list_t *item);
|
alpm_list_t *alpm_list_remove_item(alpm_list_t *haystack, alpm_list_t *item);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Remove an item from the list.
|
|
||||||
*
|
|
||||||
* @param haystack the list to remove the item from
|
|
||||||
* @param needle the data member of the item we're removing
|
|
||||||
* @param fn the comparison function for searching
|
|
||||||
* @param data output parameter containing data of the removed item
|
|
||||||
*
|
|
||||||
* @return the resultant list
|
|
||||||
*/
|
|
||||||
alpm_list_t *alpm_list_remove(alpm_list_t *haystack, const void *needle, alpm_list_fn_cmp fn, void **data);
|
alpm_list_t *alpm_list_remove(alpm_list_t *haystack, const void *needle, alpm_list_fn_cmp fn, void **data);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Remove a string from a list.
|
|
||||||
*
|
|
||||||
* @param haystack the list to remove the item from
|
|
||||||
* @param needle the data member of the item we're removing
|
|
||||||
* @param data output parameter containing data of the removed item
|
|
||||||
*
|
|
||||||
* @return the resultant list
|
|
||||||
*/
|
|
||||||
alpm_list_t *alpm_list_remove_str(alpm_list_t *haystack, const char *needle, char **data);
|
alpm_list_t *alpm_list_remove_str(alpm_list_t *haystack, const char *needle, char **data);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Create a new list without any duplicates.
|
|
||||||
*
|
|
||||||
* This does NOT copy data members.
|
|
||||||
*
|
|
||||||
* @param list the list to copy
|
|
||||||
*
|
|
||||||
* @return a new list containing non-duplicate items
|
|
||||||
*/
|
|
||||||
alpm_list_t *alpm_list_remove_dupes(const alpm_list_t *list);
|
alpm_list_t *alpm_list_remove_dupes(const alpm_list_t *list);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Copy a string list, including data.
|
|
||||||
*
|
|
||||||
* @param list the list to copy
|
|
||||||
*
|
|
||||||
* @return a copy of the original list
|
|
||||||
*/
|
|
||||||
alpm_list_t *alpm_list_strdup(const alpm_list_t *list);
|
alpm_list_t *alpm_list_strdup(const alpm_list_t *list);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Copy a list, without copying data.
|
|
||||||
*
|
|
||||||
* @param list the list to copy
|
|
||||||
*
|
|
||||||
* @return a copy of the original list
|
|
||||||
*/
|
|
||||||
alpm_list_t *alpm_list_copy(const alpm_list_t *list);
|
alpm_list_t *alpm_list_copy(const alpm_list_t *list);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Copy a list and copy the data.
|
|
||||||
* Note that the data elements to be copied should not contain pointers
|
|
||||||
* and should also be of constant size.
|
|
||||||
*
|
|
||||||
* @param list the list to copy
|
|
||||||
* @param size the size of each data element
|
|
||||||
*
|
|
||||||
* @return a copy of the original list, data copied as well
|
|
||||||
*/
|
|
||||||
alpm_list_t *alpm_list_copy_data(const alpm_list_t *list, size_t size);
|
alpm_list_t *alpm_list_copy_data(const alpm_list_t *list, size_t size);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Create a new list in reverse order.
|
|
||||||
*
|
|
||||||
* @param list the list to copy
|
|
||||||
*
|
|
||||||
* @return a new list in reverse order
|
|
||||||
*/
|
|
||||||
alpm_list_t *alpm_list_reverse(alpm_list_t *list);
|
alpm_list_t *alpm_list_reverse(alpm_list_t *list);
|
||||||
|
|
||||||
/* item accessors */
|
/* item accessors */
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Return nth element from list (starting from 0).
|
|
||||||
*
|
|
||||||
* @param list the list
|
|
||||||
* @param n the index of the item to find (n < alpm_list_count(list) IS needed)
|
|
||||||
*
|
|
||||||
* @return an alpm_list_t node for index `n`
|
|
||||||
*/
|
|
||||||
alpm_list_t *alpm_list_nth(const alpm_list_t *list, size_t n);
|
alpm_list_t *alpm_list_nth(const alpm_list_t *list, size_t n);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Get the next element of a list.
|
|
||||||
*
|
|
||||||
* @param list the list node
|
|
||||||
*
|
|
||||||
* @return the next element, or NULL when no more elements exist
|
|
||||||
*/
|
|
||||||
alpm_list_t *alpm_list_next(const alpm_list_t *list);
|
alpm_list_t *alpm_list_next(const alpm_list_t *list);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Get the previous element of a list.
|
|
||||||
*
|
|
||||||
* @param list the list head
|
|
||||||
*
|
|
||||||
* @return the previous element, or NULL when no previous element exist
|
|
||||||
*/
|
|
||||||
alpm_list_t *alpm_list_previous(const alpm_list_t *list);
|
alpm_list_t *alpm_list_previous(const alpm_list_t *list);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Get the last item in the list.
|
|
||||||
*
|
|
||||||
* @param list the list
|
|
||||||
*
|
|
||||||
* @return the last element in the list
|
|
||||||
*/
|
|
||||||
alpm_list_t *alpm_list_last(const alpm_list_t *list);
|
alpm_list_t *alpm_list_last(const alpm_list_t *list);
|
||||||
|
|
||||||
/* misc */
|
/* misc */
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Get the number of items in a list.
|
|
||||||
*
|
|
||||||
* @param list the list
|
|
||||||
*
|
|
||||||
* @return the number of list items
|
|
||||||
*/
|
|
||||||
size_t alpm_list_count(const alpm_list_t *list);
|
size_t alpm_list_count(const alpm_list_t *list);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Find an item in a list.
|
|
||||||
*
|
|
||||||
* @param needle the item to search
|
|
||||||
* @param haystack the list
|
|
||||||
* @param fn the comparison function for searching (!= NULL)
|
|
||||||
*
|
|
||||||
* @return `needle` if found, NULL otherwise
|
|
||||||
*/
|
|
||||||
void *alpm_list_find(const alpm_list_t *haystack, const void *needle, alpm_list_fn_cmp fn);
|
void *alpm_list_find(const alpm_list_t *haystack, const void *needle, alpm_list_fn_cmp fn);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Find an item in a list.
|
|
||||||
*
|
|
||||||
* Search for the item whose data matches that of the `needle`.
|
|
||||||
*
|
|
||||||
* @param needle the data to search for (== comparison)
|
|
||||||
* @param haystack the list
|
|
||||||
*
|
|
||||||
* @return `needle` if found, NULL otherwise
|
|
||||||
*/
|
|
||||||
void *alpm_list_find_ptr(const alpm_list_t *haystack, const void *needle);
|
void *alpm_list_find_ptr(const alpm_list_t *haystack, const void *needle);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Find a string in a list.
|
|
||||||
*
|
|
||||||
* @param needle the string to search for
|
|
||||||
* @param haystack the list
|
|
||||||
*
|
|
||||||
* @return `needle` if found, NULL otherwise
|
|
||||||
*/
|
|
||||||
char *alpm_list_find_str(const alpm_list_t *haystack, const char *needle);
|
char *alpm_list_find_str(const alpm_list_t *haystack, const char *needle);
|
||||||
|
alpm_list_t *alpm_list_diff(const alpm_list_t *lhs, const alpm_list_t *rhs, alpm_list_fn_cmp fn);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Check if two lists contain the same data, ignoring order.
|
|
||||||
*
|
|
||||||
* Lists are considered equal if they both contain the same data regardless
|
|
||||||
* of order.
|
|
||||||
*
|
|
||||||
* @param left the first list
|
|
||||||
* @param right the second list
|
|
||||||
* @param fn the comparison function
|
|
||||||
*
|
|
||||||
* @return 1 if the lists are equal, 0 if not equal, -1 on error.
|
|
||||||
*/
|
|
||||||
int alpm_list_cmp_unsorted(const alpm_list_t *left,
|
|
||||||
const alpm_list_t *right, alpm_list_fn_cmp fn);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Find the differences between list `left` and list `right`
|
|
||||||
*
|
|
||||||
* The two lists must be sorted. Items only in list `left` are added to the
|
|
||||||
* `onlyleft` list. Items only in list `right` are added to the `onlyright`
|
|
||||||
* list.
|
|
||||||
*
|
|
||||||
* @param left the first list
|
|
||||||
* @param right the second list
|
|
||||||
* @param fn the comparison function
|
|
||||||
* @param onlyleft pointer to the first result list
|
|
||||||
* @param onlyright pointer to the second result list
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void alpm_list_diff_sorted(const alpm_list_t *left, const alpm_list_t *right,
|
void alpm_list_diff_sorted(const alpm_list_t *left, const alpm_list_t *right,
|
||||||
alpm_list_fn_cmp fn, alpm_list_t **onlyleft, alpm_list_t **onlyright);
|
alpm_list_fn_cmp fn, alpm_list_t **onlyleft, alpm_list_t **onlyright);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Find the items in list `lhs` that are not present in list `rhs`.
|
|
||||||
*
|
|
||||||
* @param lhs the first list
|
|
||||||
* @param rhs the second list
|
|
||||||
* @param fn the comparison function
|
|
||||||
*
|
|
||||||
* @return a list containing all items in `lhs` not present in `rhs`
|
|
||||||
*/
|
|
||||||
|
|
||||||
alpm_list_t *alpm_list_diff(const alpm_list_t *lhs, const alpm_list_t *rhs, alpm_list_fn_cmp fn);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Copy a list and data into a standard C array of fixed length.
|
|
||||||
* Note that the data elements are shallow copied so any contained pointers
|
|
||||||
* will point to the original data.
|
|
||||||
*
|
|
||||||
* @param list the list to copy
|
|
||||||
* @param n the size of the list
|
|
||||||
* @param size the size of each data element
|
|
||||||
*
|
|
||||||
* @return an array version of the original list, data copied as well
|
|
||||||
*/
|
|
||||||
void *alpm_list_to_array(const alpm_list_t *list, size_t n, size_t size);
|
void *alpm_list_to_array(const alpm_list_t *list, size_t n, size_t size);
|
||||||
|
|
||||||
/* End of alpm_list */
|
|
||||||
/** @} */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* backup.c
|
* backup.c
|
||||||
*
|
*
|
||||||
* Copyright (c) 2006-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
* Copyright (c) 2005 by Judd Vinet <jvinet@zeroflux.org>
|
* Copyright (c) 2005 by Judd Vinet <jvinet@zeroflux.org>
|
||||||
* Copyright (c) 2005 by Aurelien Foret <orelien@chez.com>
|
* Copyright (c) 2005 by Aurelien Foret <orelien@chez.com>
|
||||||
* Copyright (c) 2005 by Christian Hamar <krics@linuxforum.hu>
|
* Copyright (c) 2005 by Christian Hamar <krics@linuxforum.hu>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* backup.h
|
* backup.h
|
||||||
*
|
*
|
||||||
* Copyright (c) 2006-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* be_local.c : backend for the local database
|
* be_local.c : backend for the local database
|
||||||
*
|
*
|
||||||
* Copyright (c) 2006-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
@@ -153,18 +153,6 @@ static alpm_list_t *_cache_get_optdepends(alpm_pkg_t *pkg)
|
|||||||
return pkg->optdepends;
|
return pkg->optdepends;
|
||||||
}
|
}
|
||||||
|
|
||||||
static alpm_list_t *_cache_get_makedepends(alpm_pkg_t *pkg)
|
|
||||||
{
|
|
||||||
LAZY_LOAD(INFRQ_DESC);
|
|
||||||
return pkg->makedepends;
|
|
||||||
}
|
|
||||||
|
|
||||||
static alpm_list_t *_cache_get_checkdepends(alpm_pkg_t *pkg)
|
|
||||||
{
|
|
||||||
LAZY_LOAD(INFRQ_DESC);
|
|
||||||
return pkg->checkdepends;
|
|
||||||
}
|
|
||||||
|
|
||||||
static alpm_list_t *_cache_get_conflicts(alpm_pkg_t *pkg)
|
static alpm_list_t *_cache_get_conflicts(alpm_pkg_t *pkg)
|
||||||
{
|
{
|
||||||
LAZY_LOAD(INFRQ_DESC);
|
LAZY_LOAD(INFRQ_DESC);
|
||||||
@@ -195,12 +183,6 @@ static alpm_list_t *_cache_get_backup(alpm_pkg_t *pkg)
|
|||||||
return pkg->backup;
|
return pkg->backup;
|
||||||
}
|
}
|
||||||
|
|
||||||
static alpm_list_t *_cache_get_xdata(alpm_pkg_t *pkg)
|
|
||||||
{
|
|
||||||
LAZY_LOAD(INFRQ_DESC);
|
|
||||||
return pkg->xdata;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Open a package changelog for reading. Similar to fopen in functionality,
|
* Open a package changelog for reading. Similar to fopen in functionality,
|
||||||
* except that the returned 'file stream' is from the database.
|
* except that the returned 'file stream' is from the database.
|
||||||
@@ -250,6 +232,7 @@ static int _cache_changelog_close(const alpm_pkg_t UNUSED *pkg, void *fp)
|
|||||||
*/
|
*/
|
||||||
static struct archive *_cache_mtree_open(alpm_pkg_t *pkg)
|
static struct archive *_cache_mtree_open(alpm_pkg_t *pkg)
|
||||||
{
|
{
|
||||||
|
int r;
|
||||||
struct archive *mtree;
|
struct archive *mtree;
|
||||||
|
|
||||||
alpm_db_t *db = alpm_pkg_get_db(pkg);
|
alpm_db_t *db = alpm_pkg_get_db(pkg);
|
||||||
@@ -261,17 +244,19 @@ static struct archive *_cache_mtree_open(alpm_pkg_t *pkg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if((mtree = archive_read_new()) == NULL) {
|
if((mtree = archive_read_new()) == NULL) {
|
||||||
GOTO_ERR(pkg->handle, ALPM_ERR_LIBARCHIVE, error);
|
pkg->handle->pm_errno = ALPM_ERR_LIBARCHIVE;
|
||||||
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
_alpm_archive_read_support_filter_all(mtree);
|
_alpm_archive_read_support_filter_all(mtree);
|
||||||
archive_read_support_format_mtree(mtree);
|
archive_read_support_format_mtree(mtree);
|
||||||
|
|
||||||
if(_alpm_archive_read_open_file(mtree, mtfile, ALPM_BUFFER_SIZE)) {
|
if((r = _alpm_archive_read_open_file(mtree, mtfile, ALPM_BUFFER_SIZE))) {
|
||||||
_alpm_log(pkg->handle, ALPM_LOG_ERROR, _("error while reading file %s: %s\n"),
|
_alpm_log(pkg->handle, ALPM_LOG_ERROR, _("error while reading file %s: %s\n"),
|
||||||
mtfile, archive_error_string(mtree));
|
mtfile, archive_error_string(mtree));
|
||||||
|
pkg->handle->pm_errno = ALPM_ERR_LIBARCHIVE;
|
||||||
_alpm_archive_read_free(mtree);
|
_alpm_archive_read_free(mtree);
|
||||||
GOTO_ERR(pkg->handle, ALPM_ERR_LIBARCHIVE, error);
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
free(mtfile);
|
free(mtfile);
|
||||||
@@ -287,26 +272,12 @@ error:
|
|||||||
* @param pkg the package that the mtree file is being read from
|
* @param pkg the package that the mtree file is being read from
|
||||||
* @param archive the archive structure reading from the mtree file
|
* @param archive the archive structure reading from the mtree file
|
||||||
* @param entry an archive_entry to store the entry header information
|
* @param entry an archive_entry to store the entry header information
|
||||||
* @return 0 on success, 1 if end of archive is reached, -1 otherwise.
|
* @return 0 if end of archive is reached, non-zero otherwise.
|
||||||
*/
|
*/
|
||||||
static int _cache_mtree_next(const alpm_pkg_t UNUSED *pkg,
|
static int _cache_mtree_next(const alpm_pkg_t UNUSED *pkg,
|
||||||
struct archive *mtree, struct archive_entry **entry)
|
struct archive *mtree, struct archive_entry **entry)
|
||||||
{
|
{
|
||||||
int ret;
|
return archive_read_next_header(mtree, entry);
|
||||||
ret = archive_read_next_header(mtree, entry);
|
|
||||||
|
|
||||||
switch(ret) {
|
|
||||||
case ARCHIVE_OK:
|
|
||||||
return 0;
|
|
||||||
break;
|
|
||||||
case ARCHIVE_EOF:
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -331,40 +302,37 @@ static int _cache_force_load(alpm_pkg_t *pkg)
|
|||||||
* lazy accessor methods that handle any backend loading and caching
|
* lazy accessor methods that handle any backend loading and caching
|
||||||
* logic.
|
* logic.
|
||||||
*/
|
*/
|
||||||
static const struct pkg_operations local_pkg_ops = {
|
static struct pkg_operations local_pkg_ops = {
|
||||||
.get_base = _cache_get_base,
|
.get_base = _cache_get_base,
|
||||||
.get_desc = _cache_get_desc,
|
.get_desc = _cache_get_desc,
|
||||||
.get_url = _cache_get_url,
|
.get_url = _cache_get_url,
|
||||||
.get_builddate = _cache_get_builddate,
|
.get_builddate = _cache_get_builddate,
|
||||||
.get_installdate = _cache_get_installdate,
|
.get_installdate = _cache_get_installdate,
|
||||||
.get_packager = _cache_get_packager,
|
.get_packager = _cache_get_packager,
|
||||||
.get_arch = _cache_get_arch,
|
.get_arch = _cache_get_arch,
|
||||||
.get_isize = _cache_get_isize,
|
.get_isize = _cache_get_isize,
|
||||||
.get_reason = _cache_get_reason,
|
.get_reason = _cache_get_reason,
|
||||||
.get_validation = _cache_get_validation,
|
.get_validation = _cache_get_validation,
|
||||||
.has_scriptlet = _cache_has_scriptlet,
|
.has_scriptlet = _cache_has_scriptlet,
|
||||||
.get_licenses = _cache_get_licenses,
|
.get_licenses = _cache_get_licenses,
|
||||||
.get_groups = _cache_get_groups,
|
.get_groups = _cache_get_groups,
|
||||||
.get_depends = _cache_get_depends,
|
.get_depends = _cache_get_depends,
|
||||||
.get_optdepends = _cache_get_optdepends,
|
.get_optdepends = _cache_get_optdepends,
|
||||||
.get_makedepends = _cache_get_makedepends,
|
.get_conflicts = _cache_get_conflicts,
|
||||||
.get_checkdepends = _cache_get_checkdepends,
|
.get_provides = _cache_get_provides,
|
||||||
.get_conflicts = _cache_get_conflicts,
|
.get_replaces = _cache_get_replaces,
|
||||||
.get_provides = _cache_get_provides,
|
.get_files = _cache_get_files,
|
||||||
.get_replaces = _cache_get_replaces,
|
.get_backup = _cache_get_backup,
|
||||||
.get_files = _cache_get_files,
|
|
||||||
.get_backup = _cache_get_backup,
|
|
||||||
.get_xdata = _cache_get_xdata,
|
|
||||||
|
|
||||||
.changelog_open = _cache_changelog_open,
|
.changelog_open = _cache_changelog_open,
|
||||||
.changelog_read = _cache_changelog_read,
|
.changelog_read = _cache_changelog_read,
|
||||||
.changelog_close = _cache_changelog_close,
|
.changelog_close = _cache_changelog_close,
|
||||||
|
|
||||||
.mtree_open = _cache_mtree_open,
|
.mtree_open = _cache_mtree_open,
|
||||||
.mtree_next = _cache_mtree_next,
|
.mtree_next = _cache_mtree_next,
|
||||||
.mtree_close = _cache_mtree_close,
|
.mtree_close = _cache_mtree_close,
|
||||||
|
|
||||||
.force_load = _cache_force_load,
|
.force_load = _cache_force_load,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int checkdbdir(alpm_db_t *db)
|
static int checkdbdir(alpm_db_t *db)
|
||||||
@@ -630,10 +598,6 @@ static int local_db_populate(alpm_db_t *db)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* treat local metadata errors as warning-only,
|
|
||||||
* they are already installed and otherwise they can't be operated on */
|
|
||||||
_alpm_pkg_check_meta(pkg);
|
|
||||||
|
|
||||||
/* add to the collection */
|
/* add to the collection */
|
||||||
_alpm_log(db->handle, ALPM_LOG_FUNCTION, "adding '%s' to package cache for db '%s'\n",
|
_alpm_log(db->handle, ALPM_LOG_FUNCTION, "adding '%s' to package cache for db '%s'\n",
|
||||||
pkg->name, db->treename);
|
pkg->name, db->treename);
|
||||||
@@ -654,17 +618,6 @@ static int local_db_populate(alpm_db_t *db)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static alpm_pkgreason_t _read_pkgreason(alpm_handle_t *handle, const char *pkgname, const char *line) {
|
|
||||||
if(strcmp(line, "0") == 0) {
|
|
||||||
return ALPM_PKG_REASON_EXPLICIT;
|
|
||||||
} else if(strcmp(line, "1") == 0) {
|
|
||||||
return ALPM_PKG_REASON_DEPEND;
|
|
||||||
} else {
|
|
||||||
_alpm_log(handle, ALPM_LOG_ERROR, _("unknown install reason for package %s: %s\n"), pkgname, line);
|
|
||||||
return ALPM_PKG_REASON_UNKNOWN;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Note: the return value must be freed by the caller */
|
/* Note: the return value must be freed by the caller */
|
||||||
char *_alpm_local_db_pkgpath(alpm_db_t *db, alpm_pkg_t *info,
|
char *_alpm_local_db_pkgpath(alpm_db_t *db, alpm_pkg_t *info,
|
||||||
const char *filename)
|
const char *filename)
|
||||||
@@ -713,7 +666,7 @@ char *_alpm_local_db_pkgpath(alpm_db_t *db, alpm_pkg_t *info,
|
|||||||
static int local_db_read(alpm_pkg_t *info, int inforeq)
|
static int local_db_read(alpm_pkg_t *info, int inforeq)
|
||||||
{
|
{
|
||||||
FILE *fp = NULL;
|
FILE *fp = NULL;
|
||||||
char line[1024] = {0};
|
char line[1024];
|
||||||
alpm_db_t *db = info->origin_data.db;
|
alpm_db_t *db = info->origin_data.db;
|
||||||
|
|
||||||
/* bitmask logic here:
|
/* bitmask logic here:
|
||||||
@@ -736,6 +689,9 @@ static int local_db_read(alpm_pkg_t *info, int inforeq)
|
|||||||
"loading package data for %s : level=0x%x\n",
|
"loading package data for %s : level=0x%x\n",
|
||||||
info->name, inforeq);
|
info->name, inforeq);
|
||||||
|
|
||||||
|
/* clear out 'line', to be certain - and to make valgrind happy */
|
||||||
|
memset(line, 0, sizeof(line));
|
||||||
|
|
||||||
/* DESC */
|
/* DESC */
|
||||||
if(inforeq & INFRQ_DESC && !(info->infolevel & INFRQ_DESC)) {
|
if(inforeq & INFRQ_DESC && !(info->infolevel & INFRQ_DESC)) {
|
||||||
char *path = _alpm_local_db_pkgpath(db, info, "desc");
|
char *path = _alpm_local_db_pkgpath(db, info, "desc");
|
||||||
@@ -787,7 +743,7 @@ static int local_db_read(alpm_pkg_t *info, int inforeq)
|
|||||||
READ_AND_STORE(info->packager);
|
READ_AND_STORE(info->packager);
|
||||||
} else if(strcmp(line, "%REASON%") == 0) {
|
} else if(strcmp(line, "%REASON%") == 0) {
|
||||||
READ_NEXT();
|
READ_NEXT();
|
||||||
info->reason = _read_pkgreason(db->handle, info->name, line);
|
info->reason = (alpm_pkgreason_t)atoi(line);
|
||||||
} else if(strcmp(line, "%VALIDATION%") == 0) {
|
} else if(strcmp(line, "%VALIDATION%") == 0) {
|
||||||
alpm_list_t *i, *v = NULL;
|
alpm_list_t *i, *v = NULL;
|
||||||
READ_AND_STORE_ALL(v);
|
READ_AND_STORE_ALL(v);
|
||||||
@@ -817,31 +773,10 @@ static int local_db_read(alpm_pkg_t *info, int inforeq)
|
|||||||
READ_AND_SPLITDEP(info->depends);
|
READ_AND_SPLITDEP(info->depends);
|
||||||
} else if(strcmp(line, "%OPTDEPENDS%") == 0) {
|
} else if(strcmp(line, "%OPTDEPENDS%") == 0) {
|
||||||
READ_AND_SPLITDEP(info->optdepends);
|
READ_AND_SPLITDEP(info->optdepends);
|
||||||
} else if(strcmp(line, "%MAKEDEPENDS%") == 0) {
|
|
||||||
READ_AND_SPLITDEP(info->makedepends);
|
|
||||||
} else if(strcmp(line, "%CHECKDEPENDS%") == 0) {
|
|
||||||
READ_AND_SPLITDEP(info->checkdepends);
|
|
||||||
} else if(strcmp(line, "%CONFLICTS%") == 0) {
|
} else if(strcmp(line, "%CONFLICTS%") == 0) {
|
||||||
READ_AND_SPLITDEP(info->conflicts);
|
READ_AND_SPLITDEP(info->conflicts);
|
||||||
} else if(strcmp(line, "%PROVIDES%") == 0) {
|
} else if(strcmp(line, "%PROVIDES%") == 0) {
|
||||||
READ_AND_SPLITDEP(info->provides);
|
READ_AND_SPLITDEP(info->provides);
|
||||||
} else if(strcmp(line, "%XDATA%") == 0) {
|
|
||||||
alpm_list_t *i, *lines = NULL;
|
|
||||||
READ_AND_STORE_ALL(lines);
|
|
||||||
for(i = lines; i; i = i->next) {
|
|
||||||
alpm_pkg_xdata_t *pd = _alpm_pkg_parse_xdata(i->data);
|
|
||||||
if(pd == NULL || !alpm_list_append(&info->xdata, pd)) {
|
|
||||||
_alpm_pkg_xdata_free(pd);
|
|
||||||
FREELIST(lines);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FREELIST(lines);
|
|
||||||
} else {
|
|
||||||
_alpm_log(db->handle, ALPM_LOG_WARNING, _("%s: unknown key '%s' in local database\n"), info->name, line);
|
|
||||||
alpm_list_t *lines = NULL;
|
|
||||||
READ_AND_STORE_ALL(lines);
|
|
||||||
FREELIST(lines);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
@@ -879,7 +814,12 @@ static int local_db_read(alpm_pkg_t *info, int inforeq)
|
|||||||
}
|
}
|
||||||
/* attempt to hand back any memory we don't need */
|
/* attempt to hand back any memory we don't need */
|
||||||
if(files_count > 0) {
|
if(files_count > 0) {
|
||||||
REALLOC(files, sizeof(alpm_file_t) * files_count, (void)0);
|
alpm_file_t *newfiles;
|
||||||
|
|
||||||
|
newfiles = realloc(files, sizeof(alpm_file_t) * files_count);
|
||||||
|
if(newfiles != NULL) {
|
||||||
|
files = newfiles;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
FREE(files);
|
FREE(files);
|
||||||
}
|
}
|
||||||
@@ -1078,15 +1018,6 @@ int _alpm_local_db_write(alpm_db_t *db, alpm_pkg_t *info, int inforeq)
|
|||||||
write_deps(fp, "%CONFLICTS%", info->conflicts);
|
write_deps(fp, "%CONFLICTS%", info->conflicts);
|
||||||
write_deps(fp, "%PROVIDES%", info->provides);
|
write_deps(fp, "%PROVIDES%", info->provides);
|
||||||
|
|
||||||
if(info->xdata) {
|
|
||||||
fputs("%XDATA%\n", fp);
|
|
||||||
for(lp = info->xdata; lp; lp = lp->next) {
|
|
||||||
alpm_pkg_xdata_t *pd = lp->data;
|
|
||||||
fprintf(fp, "%s=%s\n", pd->name, pd->value);
|
|
||||||
}
|
|
||||||
fputc('\n', fp);
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
fp = NULL;
|
fp = NULL;
|
||||||
}
|
}
|
||||||
@@ -1205,7 +1136,7 @@ int SYMEXPORT alpm_pkg_set_reason(alpm_pkg_t *pkg, alpm_pkgreason_t reason)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct db_operations local_db_ops = {
|
struct db_operations local_db_ops = {
|
||||||
.validate = local_db_validate,
|
.validate = local_db_validate,
|
||||||
.populate = local_db_populate,
|
.populate = local_db_populate,
|
||||||
.unregister = _alpm_db_unregister,
|
.unregister = _alpm_db_unregister,
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* be_package.c : backend for packages
|
* be_package.c : backend for packages
|
||||||
*
|
*
|
||||||
* Copyright (c) 2006-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
@@ -134,10 +134,11 @@ static int _package_changelog_close(const alpm_pkg_t UNUSED *pkg, void *fp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Package file operations struct accessor. We implement this as a method
|
/** Package file operations struct accessor. We implement this as a method
|
||||||
* because we want to reuse the majority of the default_pkg_ops struct and
|
* rather than a static struct as in be_files because we want to reuse the
|
||||||
* add only a few operations of our own on top.
|
* majority of the default_pkg_ops struct and add only a few operations of
|
||||||
|
* our own on top.
|
||||||
*/
|
*/
|
||||||
static const struct pkg_operations *get_file_pkg_ops(void)
|
static struct pkg_operations *get_file_pkg_ops(void)
|
||||||
{
|
{
|
||||||
static struct pkg_operations file_pkg_ops;
|
static struct pkg_operations file_pkg_ops;
|
||||||
static int file_pkg_ops_initialized = 0;
|
static int file_pkg_ops_initialized = 0;
|
||||||
@@ -163,8 +164,9 @@ static int parse_descfile(alpm_handle_t *handle, struct archive *a, alpm_pkg_t *
|
|||||||
char *ptr = NULL;
|
char *ptr = NULL;
|
||||||
char *key = NULL;
|
char *key = NULL;
|
||||||
int ret, linenum = 0;
|
int ret, linenum = 0;
|
||||||
struct archive_read_buffer buf = {0};
|
struct archive_read_buffer buf;
|
||||||
|
|
||||||
|
memset(&buf, 0, sizeof(buf));
|
||||||
/* 512K for a line length seems reasonable */
|
/* 512K for a line length seems reasonable */
|
||||||
buf.max_line_size = 512 * 1024;
|
buf.max_line_size = 512 * 1024;
|
||||||
|
|
||||||
@@ -200,15 +202,11 @@ static int parse_descfile(alpm_handle_t *handle, struct archive *a, alpm_pkg_t *
|
|||||||
} else if(strcmp(key, "pkgdesc") == 0) {
|
} else if(strcmp(key, "pkgdesc") == 0) {
|
||||||
STRDUP(newpkg->desc, ptr, return -1);
|
STRDUP(newpkg->desc, ptr, return -1);
|
||||||
} else if(strcmp(key, "group") == 0) {
|
} else if(strcmp(key, "group") == 0) {
|
||||||
char *tmp = NULL;
|
newpkg->groups = alpm_list_add(newpkg->groups, strdup(ptr));
|
||||||
STRDUP(tmp, ptr, return -1);
|
|
||||||
newpkg->groups = alpm_list_add(newpkg->groups, tmp);
|
|
||||||
} else if(strcmp(key, "url") == 0) {
|
} else if(strcmp(key, "url") == 0) {
|
||||||
STRDUP(newpkg->url, ptr, return -1);
|
STRDUP(newpkg->url, ptr, return -1);
|
||||||
} else if(strcmp(key, "license") == 0) {
|
} else if(strcmp(key, "license") == 0) {
|
||||||
char *tmp = NULL;
|
newpkg->licenses = alpm_list_add(newpkg->licenses, strdup(ptr));
|
||||||
STRDUP(tmp, ptr, return -1);
|
|
||||||
newpkg->licenses = alpm_list_add(newpkg->licenses, tmp);
|
|
||||||
} else if(strcmp(key, "builddate") == 0) {
|
} else if(strcmp(key, "builddate") == 0) {
|
||||||
newpkg->builddate = _alpm_parsedate(ptr);
|
newpkg->builddate = _alpm_parsedate(ptr);
|
||||||
} else if(strcmp(key, "packager") == 0) {
|
} else if(strcmp(key, "packager") == 0) {
|
||||||
@@ -244,17 +242,13 @@ static int parse_descfile(alpm_handle_t *handle, struct archive *a, alpm_pkg_t *
|
|||||||
CALLOC(backup, 1, sizeof(alpm_backup_t), return -1);
|
CALLOC(backup, 1, sizeof(alpm_backup_t), return -1);
|
||||||
STRDUP(backup->name, ptr, FREE(backup); return -1);
|
STRDUP(backup->name, ptr, FREE(backup); return -1);
|
||||||
newpkg->backup = alpm_list_add(newpkg->backup, backup);
|
newpkg->backup = alpm_list_add(newpkg->backup, backup);
|
||||||
} else if(strcmp(key, "xdata") == 0) {
|
} else if(strcmp(key, "force") == 0) {
|
||||||
alpm_pkg_xdata_t *pd = _alpm_pkg_parse_xdata(ptr);
|
/* deprecated, skip it */
|
||||||
if(pd == NULL || !alpm_list_append(&newpkg->xdata, pd)) {
|
} else if(strcmp(key, "makepkgopt") == 0) {
|
||||||
_alpm_pkg_xdata_free(pd);
|
/* not used atm */
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
const char *pkgname = newpkg->name ? newpkg->name : "error";
|
|
||||||
_alpm_log(handle, ALPM_LOG_WARNING, _("%s: unknown key '%s' in package description\n"), pkgname, key);
|
|
||||||
_alpm_log(handle, ALPM_LOG_DEBUG, "%s: unknown key '%s' in description file line %d\n",
|
_alpm_log(handle, ALPM_LOG_DEBUG, "%s: unknown key '%s' in description file line %d\n",
|
||||||
pkgname, key, linenum);
|
newpkg->name ? newpkg->name : "error", key, linenum);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -314,7 +308,7 @@ int _alpm_pkg_validate_internal(alpm_handle_t *handle,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(syncpkg && (!has_sig || !syncpkg->base64_sig)) {
|
if(syncpkg && !has_sig) {
|
||||||
if(syncpkg->md5sum && !syncpkg->sha256sum) {
|
if(syncpkg->md5sum && !syncpkg->sha256sum) {
|
||||||
_alpm_log(handle, ALPM_LOG_DEBUG, "md5sum: %s\n", syncpkg->md5sum);
|
_alpm_log(handle, ALPM_LOG_DEBUG, "md5sum: %s\n", syncpkg->md5sum);
|
||||||
_alpm_log(handle, ALPM_LOG_DEBUG, "checking md5sum for %s\n", pkgfile);
|
_alpm_log(handle, ALPM_LOG_DEBUG, "checking md5sum for %s\n", pkgfile);
|
||||||
@@ -454,15 +448,18 @@ static int build_filelist_from_mtree(alpm_handle_t *handle, alpm_pkg_t *pkg, str
|
|||||||
char *mtree_data = NULL;
|
char *mtree_data = NULL;
|
||||||
struct archive *mtree;
|
struct archive *mtree;
|
||||||
struct archive_entry *mtree_entry = NULL;
|
struct archive_entry *mtree_entry = NULL;
|
||||||
alpm_filelist_t filelist = {0};
|
alpm_filelist_t filelist;
|
||||||
|
|
||||||
_alpm_log(handle, ALPM_LOG_DEBUG,
|
_alpm_log(handle, ALPM_LOG_DEBUG,
|
||||||
"found mtree for package %s, getting file list\n", pkg->filename);
|
"found mtree for package %s, getting file list\n", pkg->filename);
|
||||||
|
|
||||||
|
memset(&filelist, 0, sizeof(alpm_filelist_t));
|
||||||
|
|
||||||
/* create a new archive to parse the mtree and load it from archive into memory */
|
/* create a new archive to parse the mtree and load it from archive into memory */
|
||||||
/* TODO: split this into a function */
|
/* TODO: split this into a function */
|
||||||
if((mtree = archive_read_new()) == NULL) {
|
if((mtree = archive_read_new()) == NULL) {
|
||||||
GOTO_ERR(handle, ALPM_ERR_LIBARCHIVE, error);
|
handle->pm_errno = ALPM_ERR_LIBARCHIVE;
|
||||||
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
_alpm_archive_read_support_filter_all(mtree);
|
_alpm_archive_read_support_filter_all(mtree);
|
||||||
@@ -481,7 +478,8 @@ static int build_filelist_from_mtree(alpm_handle_t *handle, alpm_pkg_t *pkg, str
|
|||||||
if(size < 0) {
|
if(size < 0) {
|
||||||
_alpm_log(handle, ALPM_LOG_DEBUG, _("error while reading package %s: %s\n"),
|
_alpm_log(handle, ALPM_LOG_DEBUG, _("error while reading package %s: %s\n"),
|
||||||
pkg->filename, archive_error_string(archive));
|
pkg->filename, archive_error_string(archive));
|
||||||
GOTO_ERR(handle, ALPM_ERR_LIBARCHIVE, error);
|
handle->pm_errno = ALPM_ERR_LIBARCHIVE;
|
||||||
|
goto error;
|
||||||
}
|
}
|
||||||
if(size == 0) {
|
if(size == 0) {
|
||||||
break;
|
break;
|
||||||
@@ -494,7 +492,8 @@ static int build_filelist_from_mtree(alpm_handle_t *handle, alpm_pkg_t *pkg, str
|
|||||||
_alpm_log(handle, ALPM_LOG_DEBUG,
|
_alpm_log(handle, ALPM_LOG_DEBUG,
|
||||||
_("error while reading mtree of package %s: %s\n"),
|
_("error while reading mtree of package %s: %s\n"),
|
||||||
pkg->filename, archive_error_string(mtree));
|
pkg->filename, archive_error_string(mtree));
|
||||||
GOTO_ERR(handle, ALPM_ERR_LIBARCHIVE, error);
|
handle->pm_errno = ALPM_ERR_LIBARCHIVE;
|
||||||
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
while((ret = archive_read_next_header(mtree, &mtree_entry)) == ARCHIVE_OK) {
|
while((ret = archive_read_next_header(mtree, &mtree_entry)) == ARCHIVE_OK) {
|
||||||
@@ -517,7 +516,8 @@ static int build_filelist_from_mtree(alpm_handle_t *handle, alpm_pkg_t *pkg, str
|
|||||||
if(ret != ARCHIVE_EOF && ret != ARCHIVE_OK) { /* An error occurred */
|
if(ret != ARCHIVE_EOF && ret != ARCHIVE_OK) { /* An error occurred */
|
||||||
_alpm_log(handle, ALPM_LOG_DEBUG, _("error while reading mtree of package %s: %s\n"),
|
_alpm_log(handle, ALPM_LOG_DEBUG, _("error while reading mtree of package %s: %s\n"),
|
||||||
pkg->filename, archive_error_string(mtree));
|
pkg->filename, archive_error_string(mtree));
|
||||||
GOTO_ERR(handle, ALPM_ERR_LIBARCHIVE, error);
|
handle->pm_errno = ALPM_ERR_LIBARCHIVE;
|
||||||
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* throw away any files we loaded directly from the archive */
|
/* throw away any files we loaded directly from the archive */
|
||||||
@@ -582,9 +582,11 @@ alpm_pkg_t *_alpm_pkg_load_internal(alpm_handle_t *handle,
|
|||||||
|
|
||||||
newpkg = _alpm_pkg_new();
|
newpkg = _alpm_pkg_new();
|
||||||
if(newpkg == NULL) {
|
if(newpkg == NULL) {
|
||||||
GOTO_ERR(handle, ALPM_ERR_MEMORY, error);
|
handle->pm_errno = ALPM_ERR_MEMORY;
|
||||||
|
goto error;
|
||||||
}
|
}
|
||||||
STRDUP(newpkg->filename, pkgfile, GOTO_ERR(handle, ALPM_ERR_MEMORY, error));
|
STRDUP(newpkg->filename, pkgfile,
|
||||||
|
handle->pm_errno = ALPM_ERR_MEMORY; goto error);
|
||||||
newpkg->size = st.st_size;
|
newpkg->size = st.st_size;
|
||||||
|
|
||||||
_alpm_log(handle, ALPM_LOG_DEBUG, "starting package load for %s\n", pkgfile);
|
_alpm_log(handle, ALPM_LOG_DEBUG, "starting package load for %s\n", pkgfile);
|
||||||
@@ -634,7 +636,8 @@ alpm_pkg_t *_alpm_pkg_load_internal(alpm_handle_t *handle,
|
|||||||
if(archive_read_data_skip(archive)) {
|
if(archive_read_data_skip(archive)) {
|
||||||
_alpm_log(handle, ALPM_LOG_ERROR, _("error while reading package %s: %s\n"),
|
_alpm_log(handle, ALPM_LOG_ERROR, _("error while reading package %s: %s\n"),
|
||||||
pkgfile, archive_error_string(archive));
|
pkgfile, archive_error_string(archive));
|
||||||
GOTO_ERR(handle, ALPM_ERR_LIBARCHIVE, error);
|
handle->pm_errno = ALPM_ERR_LIBARCHIVE;
|
||||||
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if we are not doing a full read, see if we have all we need */
|
/* if we are not doing a full read, see if we have all we need */
|
||||||
@@ -646,7 +649,8 @@ alpm_pkg_t *_alpm_pkg_load_internal(alpm_handle_t *handle,
|
|||||||
if(ret != ARCHIVE_EOF && ret != ARCHIVE_OK) { /* An error occurred */
|
if(ret != ARCHIVE_EOF && ret != ARCHIVE_OK) { /* An error occurred */
|
||||||
_alpm_log(handle, ALPM_LOG_ERROR, _("error while reading package %s: %s\n"),
|
_alpm_log(handle, ALPM_LOG_ERROR, _("error while reading package %s: %s\n"),
|
||||||
pkgfile, archive_error_string(archive));
|
pkgfile, archive_error_string(archive));
|
||||||
GOTO_ERR(handle, ALPM_ERR_LIBARCHIVE, error);
|
handle->pm_errno = ALPM_ERR_LIBARCHIVE;
|
||||||
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!config) {
|
if(!config) {
|
||||||
@@ -654,9 +658,12 @@ alpm_pkg_t *_alpm_pkg_load_internal(alpm_handle_t *handle,
|
|||||||
goto pkg_invalid;
|
goto pkg_invalid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_alpm_archive_read_free(archive);
|
||||||
|
close(fd);
|
||||||
|
|
||||||
/* internal fields for package struct */
|
/* internal fields for package struct */
|
||||||
newpkg->origin = ALPM_PKG_FROM_FILE;
|
newpkg->origin = ALPM_PKG_FROM_FILE;
|
||||||
STRDUP(newpkg->origin_data.file, pkgfile, goto error);
|
newpkg->origin_data.file = strdup(pkgfile);
|
||||||
newpkg->ops = get_file_pkg_ops();
|
newpkg->ops = get_file_pkg_ops();
|
||||||
newpkg->handle = handle;
|
newpkg->handle = handle;
|
||||||
newpkg->infolevel = INFRQ_BASE | INFRQ_DESC | INFRQ_SCRIPTLET;
|
newpkg->infolevel = INFRQ_BASE | INFRQ_DESC | INFRQ_SCRIPTLET;
|
||||||
@@ -665,7 +672,8 @@ alpm_pkg_t *_alpm_pkg_load_internal(alpm_handle_t *handle,
|
|||||||
if(full) {
|
if(full) {
|
||||||
if(newpkg->files.files) {
|
if(newpkg->files.files) {
|
||||||
/* attempt to hand back any memory we don't need */
|
/* attempt to hand back any memory we don't need */
|
||||||
REALLOC(newpkg->files.files, sizeof(alpm_file_t) * newpkg->files.count, (void)0);
|
newpkg->files.files = realloc(newpkg->files.files,
|
||||||
|
sizeof(alpm_file_t) * newpkg->files.count);
|
||||||
/* "checking for conflicts" requires a sorted list, ensure that here */
|
/* "checking for conflicts" requires a sorted list, ensure that here */
|
||||||
_alpm_log(handle, ALPM_LOG_DEBUG,
|
_alpm_log(handle, ALPM_LOG_DEBUG,
|
||||||
"sorting package filelist for %s\n", pkgfile);
|
"sorting package filelist for %s\n", pkgfile);
|
||||||
@@ -675,12 +683,6 @@ alpm_pkg_t *_alpm_pkg_load_internal(alpm_handle_t *handle,
|
|||||||
newpkg->infolevel |= INFRQ_FILES;
|
newpkg->infolevel |= INFRQ_FILES;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(_alpm_pkg_check_meta(newpkg) != 0) {
|
|
||||||
goto pkg_invalid;
|
|
||||||
}
|
|
||||||
|
|
||||||
_alpm_archive_read_free(archive);
|
|
||||||
close(fd);
|
|
||||||
return newpkg;
|
return newpkg;
|
||||||
|
|
||||||
pkg_invalid:
|
pkg_invalid:
|
||||||
@@ -688,7 +690,9 @@ pkg_invalid:
|
|||||||
error:
|
error:
|
||||||
_alpm_pkg_free(newpkg);
|
_alpm_pkg_free(newpkg);
|
||||||
_alpm_archive_read_free(archive);
|
_alpm_archive_read_free(archive);
|
||||||
close(fd);
|
if(fd >= 0) {
|
||||||
|
close(fd);
|
||||||
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -727,7 +731,6 @@ int SYMEXPORT alpm_pkg_load(alpm_handle_t *handle, const char *filename, int ful
|
|||||||
{
|
{
|
||||||
int validation = 0;
|
int validation = 0;
|
||||||
char *sigpath;
|
char *sigpath;
|
||||||
alpm_pkg_t *pkg_temp;
|
|
||||||
|
|
||||||
CHECK_HANDLE(handle, return -1);
|
CHECK_HANDLE(handle, return -1);
|
||||||
ASSERT(pkg != NULL, RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1));
|
ASSERT(pkg != NULL, RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1));
|
||||||
@@ -752,11 +755,9 @@ int SYMEXPORT alpm_pkg_load(alpm_handle_t *handle, const char *filename, int ful
|
|||||||
for(k = keys; k; k = k->next) {
|
for(k = keys; k; k = k->next) {
|
||||||
char *key = k->data;
|
char *key = k->data;
|
||||||
if(_alpm_key_in_keychain(handle, key) == 0) {
|
if(_alpm_key_in_keychain(handle, key) == 0) {
|
||||||
pkg_temp = _alpm_pkg_load_internal(handle, filename, full);
|
if(_alpm_key_import(handle, key) == -1) {
|
||||||
if(_alpm_key_import(handle, NULL, key) == -1) {
|
|
||||||
fail = 1;
|
fail = 1;
|
||||||
}
|
}
|
||||||
_alpm_pkg_free(pkg_temp);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FREELIST(keys);
|
FREELIST(keys);
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* be_sync.c : backend for sync databases
|
* be_sync.c : backend for sync databases
|
||||||
*
|
*
|
||||||
* Copyright (c) 2006-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
@@ -37,6 +37,7 @@
|
|||||||
#include "alpm_list.h"
|
#include "alpm_list.h"
|
||||||
#include "package.h"
|
#include "package.h"
|
||||||
#include "handle.h"
|
#include "handle.h"
|
||||||
|
#include "delta.h"
|
||||||
#include "deps.h"
|
#include "deps.h"
|
||||||
#include "dload.h"
|
#include "dload.h"
|
||||||
#include "filelist.h"
|
#include "filelist.h"
|
||||||
@@ -136,90 +137,178 @@ valid:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int SYMEXPORT alpm_db_update(alpm_handle_t *handle, alpm_list_t *dbs, int force) {
|
/** Update a package database
|
||||||
|
*
|
||||||
|
* An update of the package database \a db will be attempted. Unless
|
||||||
|
* \a force is true, the update will only be performed if the remote
|
||||||
|
* database was modified since the last update.
|
||||||
|
*
|
||||||
|
* This operation requires a database lock, and will return an applicable error
|
||||||
|
* if the lock could not be obtained.
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* @code
|
||||||
|
* alpm_list_t *syncs = alpm_get_syncdbs();
|
||||||
|
* for(i = syncs; i; i = alpm_list_next(i)) {
|
||||||
|
* alpm_db_t *db = alpm_list_getdata(i);
|
||||||
|
* result = alpm_db_update(0, db);
|
||||||
|
*
|
||||||
|
* if(result < 0) {
|
||||||
|
* printf("Unable to update database: %s\n", alpm_strerrorlast());
|
||||||
|
* } else if(result == 1) {
|
||||||
|
* printf("Database already up to date\n");
|
||||||
|
* } else {
|
||||||
|
* printf("Database updated\n");
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @ingroup alpm_databases
|
||||||
|
* @note After a successful update, the \link alpm_db_get_pkgcache()
|
||||||
|
* package cache \endlink will be invalidated
|
||||||
|
* @param force if true, then forces the update, otherwise update only in case
|
||||||
|
* the database isn't up to date
|
||||||
|
* @param db pointer to the package database to update
|
||||||
|
* @return 0 on success, -1 on error (pm_errno is set accordingly), 1 if up to
|
||||||
|
* to date
|
||||||
|
*/
|
||||||
|
int SYMEXPORT alpm_db_update(int force, alpm_db_t *db)
|
||||||
|
{
|
||||||
char *syncpath;
|
char *syncpath;
|
||||||
const char *dbext = handle->dbext;
|
const char *dbext;
|
||||||
alpm_list_t *i;
|
alpm_list_t *i;
|
||||||
|
int updated = 0;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
mode_t oldmask;
|
mode_t oldmask;
|
||||||
alpm_list_t *payloads = NULL;
|
alpm_handle_t *handle;
|
||||||
alpm_event_t event;
|
int siglevel;
|
||||||
|
|
||||||
/* Sanity checks */
|
/* Sanity checks */
|
||||||
CHECK_HANDLE(handle, return -1);
|
ASSERT(db != NULL, return -1);
|
||||||
ASSERT(dbs != NULL, return -1);
|
handle = db->handle;
|
||||||
handle->pm_errno = ALPM_ERR_OK;
|
handle->pm_errno = ALPM_ERR_OK;
|
||||||
|
ASSERT(db != handle->db_local, RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1));
|
||||||
|
ASSERT(db->servers != NULL, RET_ERR(handle, ALPM_ERR_SERVER_NONE, -1));
|
||||||
|
|
||||||
|
if(!(db->usage & ALPM_DB_USAGE_SYNC)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
syncpath = get_sync_dir(handle);
|
syncpath = get_sync_dir(handle);
|
||||||
ASSERT(syncpath != NULL, return -1);
|
if(!syncpath) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* force update of invalid databases to fix potential mismatched database/signature */
|
||||||
|
if(db->status & DB_STATUS_INVALID) {
|
||||||
|
force = 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* make sure we have a sane umask */
|
/* make sure we have a sane umask */
|
||||||
oldmask = umask(0022);
|
oldmask = umask(0022);
|
||||||
|
|
||||||
|
siglevel = alpm_db_get_siglevel(db);
|
||||||
|
|
||||||
/* attempt to grab a lock */
|
/* attempt to grab a lock */
|
||||||
if(_alpm_handle_lock(handle)) {
|
if(_alpm_handle_lock(handle)) {
|
||||||
GOTO_ERR(handle, ALPM_ERR_HANDLE_LOCK, cleanup);
|
free(syncpath);
|
||||||
|
umask(oldmask);
|
||||||
|
RET_ERR(handle, ALPM_ERR_HANDLE_LOCK, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(i = dbs; i; i = i->next) {
|
dbext = db->handle->dbext;
|
||||||
alpm_db_t *db = i->data;
|
|
||||||
int dbforce = force;
|
for(i = db->servers; i; i = i->next) {
|
||||||
struct dload_payload *payload = NULL;
|
const char *server = i->data, *final_db_url = NULL;
|
||||||
|
struct dload_payload payload;
|
||||||
size_t len;
|
size_t len;
|
||||||
int siglevel;
|
int sig_ret = 0;
|
||||||
|
|
||||||
if(!(db->usage & ALPM_DB_USAGE_SYNC)) {
|
memset(&payload, 0, sizeof(struct dload_payload));
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASSERT(db != handle->db_local, GOTO_ERR(handle, ALPM_ERR_WRONG_ARGS, cleanup));
|
/* set hard upper limit of 25MiB */
|
||||||
ASSERT(db->servers != NULL, GOTO_ERR(handle, ALPM_ERR_SERVER_NONE, cleanup));
|
payload.max_size = 25 * 1024 * 1024;
|
||||||
|
|
||||||
/* force update of invalid databases to fix potential mismatched database/signature */
|
|
||||||
if(db->status & DB_STATUS_INVALID) {
|
|
||||||
dbforce = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
siglevel = alpm_db_get_siglevel(db);
|
|
||||||
|
|
||||||
CALLOC(payload, 1, sizeof(*payload), GOTO_ERR(handle, ALPM_ERR_MEMORY, cleanup));
|
|
||||||
payload->servers = db->servers;
|
|
||||||
/* print server + filename into a buffer */
|
/* print server + filename into a buffer */
|
||||||
len = strlen(db->treename) + strlen(dbext) + 1;
|
len = strlen(server) + strlen(db->treename) + strlen(dbext) + 2;
|
||||||
MALLOC(payload->filepath, len,
|
MALLOC(payload.fileurl, len,
|
||||||
FREE(payload); GOTO_ERR(handle, ALPM_ERR_MEMORY, cleanup));
|
{
|
||||||
snprintf(payload->filepath, len, "%s%s", db->treename, dbext);
|
free(syncpath);
|
||||||
payload->handle = handle;
|
umask(oldmask);
|
||||||
payload->force = dbforce;
|
RET_ERR(handle, ALPM_ERR_MEMORY, -1);
|
||||||
payload->unlink_on_fail = 1;
|
}
|
||||||
payload->download_signature = (siglevel & ALPM_SIG_DATABASE);
|
);
|
||||||
payload->signature_optional = (siglevel & ALPM_SIG_DATABASE_OPTIONAL);
|
snprintf(payload.fileurl, len, "%s/%s%s", server, db->treename, dbext);
|
||||||
/* set hard upper limit of 128 MiB */
|
payload.handle = handle;
|
||||||
payload->max_size = 128 * 1024 * 1024;
|
payload.force = force;
|
||||||
payloads = alpm_list_add(payloads, payload);
|
payload.unlink_on_fail = 1;
|
||||||
}
|
|
||||||
if(payloads == NULL) {
|
|
||||||
ret = 0;
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
event.type = ALPM_EVENT_DB_RETRIEVE_START;
|
ret = _alpm_download(&payload, syncpath, NULL, &final_db_url);
|
||||||
EVENT(handle, &event);
|
_alpm_dload_payload_reset(&payload);
|
||||||
ret = _alpm_download(handle, payloads, syncpath);
|
updated = (updated || ret == 0);
|
||||||
if(ret < 0) {
|
|
||||||
event.type = ALPM_EVENT_DB_RETRIEVE_FAILED;
|
|
||||||
EVENT(handle, &event);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
event.type = ALPM_EVENT_DB_RETRIEVE_DONE;
|
|
||||||
EVENT(handle, &event);
|
|
||||||
|
|
||||||
for(i = dbs; i; i = i->next) {
|
if(ret != -1 && updated && (siglevel & ALPM_SIG_DATABASE)) {
|
||||||
alpm_db_t *db = i->data;
|
/* an existing sig file is no good at this point */
|
||||||
if(!(db->usage & ALPM_DB_USAGE_SYNC)) {
|
char *sigpath = _alpm_sigpath(handle, _alpm_db_path(db));
|
||||||
continue;
|
if(!sigpath) {
|
||||||
|
ret = -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
unlink(sigpath);
|
||||||
|
free(sigpath);
|
||||||
|
|
||||||
|
|
||||||
|
/* check if the final URL from internal downloader looks reasonable */
|
||||||
|
if(final_db_url != NULL) {
|
||||||
|
if(strlen(final_db_url) < 3
|
||||||
|
|| strcmp(final_db_url + strlen(final_db_url) - strlen(dbext),
|
||||||
|
dbext) != 0) {
|
||||||
|
final_db_url = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if we downloaded a DB, we want the .sig from the same server */
|
||||||
|
if(final_db_url != NULL) {
|
||||||
|
/* print final_db_url into a buffer (leave space for .sig) */
|
||||||
|
len = strlen(final_db_url) + 5;
|
||||||
|
} else {
|
||||||
|
/* print server + filename into a buffer (leave space for separator and .sig) */
|
||||||
|
len = strlen(server) + strlen(db->treename) + strlen(dbext) + 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
MALLOC(payload.fileurl, len,
|
||||||
|
{
|
||||||
|
free(syncpath);
|
||||||
|
umask(oldmask);
|
||||||
|
RET_ERR(handle, ALPM_ERR_MEMORY, -1);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
if(final_db_url != NULL) {
|
||||||
|
snprintf(payload.fileurl, len, "%s.sig", final_db_url);
|
||||||
|
} else {
|
||||||
|
snprintf(payload.fileurl, len, "%s/%s%s.sig", server, db->treename, dbext);
|
||||||
|
}
|
||||||
|
|
||||||
|
payload.handle = handle;
|
||||||
|
payload.force = 1;
|
||||||
|
payload.errors_ok = (siglevel & ALPM_SIG_DATABASE_OPTIONAL);
|
||||||
|
|
||||||
|
/* set hard upper limit of 16KiB */
|
||||||
|
payload.max_size = 16 * 1024;
|
||||||
|
|
||||||
|
sig_ret = _alpm_download(&payload, syncpath, NULL, NULL);
|
||||||
|
/* errors_ok suppresses error messages, but not the return code */
|
||||||
|
sig_ret = payload.errors_ok ? 0 : sig_ret;
|
||||||
|
_alpm_dload_payload_reset(&payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(ret != -1 && sig_ret != -1) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(updated) {
|
||||||
/* Cache needs to be rebuilt */
|
/* Cache needs to be rebuilt */
|
||||||
_alpm_db_free_pkgcache(db);
|
_alpm_db_free_pkgcache(db);
|
||||||
|
|
||||||
@@ -230,29 +319,21 @@ int SYMEXPORT alpm_db_update(alpm_handle_t *handle, alpm_list_t *dbs, int force)
|
|||||||
db->status &= ~DB_STATUS_MISSING;
|
db->status &= ~DB_STATUS_MISSING;
|
||||||
|
|
||||||
/* if the download failed skip validation to preserve the download error */
|
/* if the download failed skip validation to preserve the download error */
|
||||||
if(sync_db_validate(db) != 0) {
|
if(ret != -1 && sync_db_validate(db) != 0) {
|
||||||
_alpm_log(handle, ALPM_LOG_DEBUG, "failed to validate db: %s\n",
|
|
||||||
db->treename);
|
|
||||||
/* pm_errno should be set */
|
/* pm_errno should be set */
|
||||||
ret = -1;
|
ret = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cleanup:
|
|
||||||
_alpm_handle_unlock(handle);
|
|
||||||
|
|
||||||
if(ret == -1) {
|
if(ret == -1) {
|
||||||
/* pm_errno was set by the download code */
|
/* pm_errno was set by the download code */
|
||||||
_alpm_log(handle, ALPM_LOG_DEBUG, "failed to sync dbs: %s\n",
|
_alpm_log(handle, ALPM_LOG_DEBUG, "failed to sync db: %s\n",
|
||||||
alpm_strerror(handle->pm_errno));
|
alpm_strerror(handle->pm_errno));
|
||||||
} else {
|
} else {
|
||||||
handle->pm_errno = ALPM_ERR_OK;
|
handle->pm_errno = ALPM_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(payloads) {
|
_alpm_handle_unlock(handle);
|
||||||
alpm_list_free_inner(payloads, (alpm_list_fn_free)_alpm_dload_payload_reset);
|
|
||||||
FREELIST(payloads);
|
|
||||||
}
|
|
||||||
free(syncpath);
|
free(syncpath);
|
||||||
umask(oldmask);
|
umask(oldmask);
|
||||||
return ret;
|
return ret;
|
||||||
@@ -285,22 +366,6 @@ static int _sync_get_validation(alpm_pkg_t *pkg)
|
|||||||
return pkg->validation;
|
return pkg->validation;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Package sync operations struct accessor. We implement this as a method
|
|
||||||
* because we want to reuse the majority of the default_pkg_ops struct and
|
|
||||||
* add only a few operations of our own on top.
|
|
||||||
*/
|
|
||||||
static const struct pkg_operations *get_sync_pkg_ops(void)
|
|
||||||
{
|
|
||||||
static struct pkg_operations sync_pkg_ops;
|
|
||||||
static int sync_pkg_ops_initalized = 0;
|
|
||||||
if(!sync_pkg_ops_initalized) {
|
|
||||||
sync_pkg_ops = default_pkg_ops;
|
|
||||||
sync_pkg_ops.get_validation = _sync_get_validation;
|
|
||||||
sync_pkg_ops_initalized = 1;
|
|
||||||
}
|
|
||||||
return &sync_pkg_ops;
|
|
||||||
}
|
|
||||||
|
|
||||||
static alpm_pkg_t *load_pkg_for_entry(alpm_db_t *db, const char *entryname,
|
static alpm_pkg_t *load_pkg_for_entry(alpm_db_t *db, const char *entryname,
|
||||||
const char **entry_filename, alpm_pkg_t *likely_pkg)
|
const char **entry_filename, alpm_pkg_t *likely_pkg)
|
||||||
{
|
{
|
||||||
@@ -341,14 +406,10 @@ static alpm_pkg_t *load_pkg_for_entry(alpm_db_t *db, const char *entryname,
|
|||||||
|
|
||||||
pkg->origin = ALPM_PKG_FROM_SYNCDB;
|
pkg->origin = ALPM_PKG_FROM_SYNCDB;
|
||||||
pkg->origin_data.db = db;
|
pkg->origin_data.db = db;
|
||||||
pkg->ops = get_sync_pkg_ops();
|
pkg->ops = &default_pkg_ops;
|
||||||
|
pkg->ops->get_validation = _sync_get_validation;
|
||||||
pkg->handle = db->handle;
|
pkg->handle = db->handle;
|
||||||
|
|
||||||
if(_alpm_pkg_check_meta(pkg) != 0) {
|
|
||||||
_alpm_pkg_free(pkg);
|
|
||||||
RET_ERR(db->handle, ALPM_ERR_PKG_INVALID, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* add to the collection */
|
/* add to the collection */
|
||||||
_alpm_log(db->handle, ALPM_LOG_FUNCTION, "adding '%s' to package cache for db '%s'\n",
|
_alpm_log(db->handle, ALPM_LOG_FUNCTION, "adding '%s' to package cache for db '%s'\n",
|
||||||
pkg->name, db->treename);
|
pkg->name, db->treename);
|
||||||
@@ -366,8 +427,9 @@ static alpm_pkg_t *load_pkg_for_entry(alpm_db_t *db, const char *entryname,
|
|||||||
|
|
||||||
/* This function doesn't work as well as one might think, as size of database
|
/* This function doesn't work as well as one might think, as size of database
|
||||||
* entries varies considerably. Adding signatures nearly doubles the size of a
|
* entries varies considerably. Adding signatures nearly doubles the size of a
|
||||||
* single entry. These current values are heavily influenced by Arch Linux;
|
* single entry; deltas also can make for large variations in size. These
|
||||||
* databases with a single signature per package. */
|
* current values are heavily influenced by Arch Linux; databases with no
|
||||||
|
* deltas and a single signature per package. */
|
||||||
static size_t estimate_package_count(struct stat *st, struct archive *archive)
|
static size_t estimate_package_count(struct stat *st, struct archive *archive)
|
||||||
{
|
{
|
||||||
int per_package;
|
int per_package;
|
||||||
@@ -441,14 +503,15 @@ static int sync_db_populate(alpm_db_t *db)
|
|||||||
|
|
||||||
db->pkgcache = _alpm_pkghash_create(est_count);
|
db->pkgcache = _alpm_pkghash_create(est_count);
|
||||||
if(db->pkgcache == NULL) {
|
if(db->pkgcache == NULL) {
|
||||||
|
db->handle->pm_errno = ALPM_ERR_MEMORY;
|
||||||
ret = -1;
|
ret = -1;
|
||||||
GOTO_ERR(db->handle, ALPM_ERR_MEMORY, cleanup);
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
while((archive_ret = archive_read_next_header(archive, &entry)) == ARCHIVE_OK) {
|
while((archive_ret = archive_read_next_header(archive, &entry)) == ARCHIVE_OK) {
|
||||||
mode_t mode = archive_entry_mode(entry);
|
mode_t mode = archive_entry_mode(entry);
|
||||||
if(!S_ISDIR(mode)) {
|
if(!S_ISDIR(mode)) {
|
||||||
/* we have desc or depends - parse it */
|
/* we have desc, depends or deltas - parse it */
|
||||||
if(sync_db_read(db, archive, entry, &pkg) != 0) {
|
if(sync_db_read(db, archive, entry, &pkg) != 0) {
|
||||||
_alpm_log(db->handle, ALPM_LOG_ERROR,
|
_alpm_log(db->handle, ALPM_LOG_ERROR,
|
||||||
_("could not parse package description file '%s' from db '%s'\n"),
|
_("could not parse package description file '%s' from db '%s'\n"),
|
||||||
@@ -457,20 +520,13 @@ static int sync_db_populate(alpm_db_t *db)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* the db file was successfully read, but contained errors */
|
|
||||||
if(ret == -1) {
|
|
||||||
db->status &= ~DB_STATUS_VALID;
|
|
||||||
db->status |= DB_STATUS_INVALID;
|
|
||||||
_alpm_db_free_pkgcache(db);
|
|
||||||
GOTO_ERR(db->handle, ALPM_ERR_DB_INVALID, cleanup);
|
|
||||||
}
|
|
||||||
/* reading the db file failed */
|
|
||||||
if(archive_ret != ARCHIVE_EOF) {
|
if(archive_ret != ARCHIVE_EOF) {
|
||||||
_alpm_log(db->handle, ALPM_LOG_ERROR, _("could not read db '%s' (%s)\n"),
|
_alpm_log(db->handle, ALPM_LOG_ERROR, _("could not read db '%s' (%s)\n"),
|
||||||
db->treename, archive_error_string(archive));
|
db->treename, archive_error_string(archive));
|
||||||
_alpm_db_free_pkgcache(db);
|
_alpm_db_free_pkgcache(db);
|
||||||
|
db->handle->pm_errno = ALPM_ERR_LIBARCHIVE;
|
||||||
ret = -1;
|
ret = -1;
|
||||||
GOTO_ERR(db->handle, ALPM_ERR_LIBARCHIVE, cleanup);
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
count = alpm_list_count(db->pkgcache->list);
|
count = alpm_list_count(db->pkgcache->list);
|
||||||
@@ -547,7 +603,7 @@ static int sync_db_read(alpm_db_t *db, struct archive *archive,
|
|||||||
{
|
{
|
||||||
const char *entryname, *filename;
|
const char *entryname, *filename;
|
||||||
alpm_pkg_t *pkg;
|
alpm_pkg_t *pkg;
|
||||||
struct archive_read_buffer buf = {0};
|
struct archive_read_buffer buf;
|
||||||
|
|
||||||
entryname = archive_entry_pathname(entry);
|
entryname = archive_entry_pathname(entry);
|
||||||
if(entryname == NULL) {
|
if(entryname == NULL) {
|
||||||
@@ -559,6 +615,7 @@ static int sync_db_read(alpm_db_t *db, struct archive *archive,
|
|||||||
_alpm_log(db->handle, ALPM_LOG_FUNCTION, "loading package data from archive entry %s\n",
|
_alpm_log(db->handle, ALPM_LOG_FUNCTION, "loading package data from archive entry %s\n",
|
||||||
entryname);
|
entryname);
|
||||||
|
|
||||||
|
memset(&buf, 0, sizeof(buf));
|
||||||
/* 512K for a line length seems reasonable */
|
/* 512K for a line length seems reasonable */
|
||||||
buf.max_line_size = 512 * 1024;
|
buf.max_line_size = 512 * 1024;
|
||||||
|
|
||||||
@@ -580,7 +637,8 @@ static int sync_db_read(alpm_db_t *db, struct archive *archive,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(strcmp(filename, "desc") == 0 || strcmp(filename, "depends") == 0
|
if(strcmp(filename, "desc") == 0 || strcmp(filename, "depends") == 0
|
||||||
|| strcmp(filename, "files") == 0) {
|
|| strcmp(filename, "files") == 0
|
||||||
|
|| (strcmp(filename, "deltas") == 0 && db->handle->deltaratio > 0.0) ) {
|
||||||
int ret;
|
int ret;
|
||||||
while((ret = _alpm_archive_fgets(archive, &buf)) == ARCHIVE_OK) {
|
while((ret = _alpm_archive_fgets(archive, &buf)) == ARCHIVE_OK) {
|
||||||
char *line = buf.line;
|
char *line = buf.line;
|
||||||
@@ -642,13 +700,29 @@ static int sync_db_read(alpm_db_t *db, struct archive *archive,
|
|||||||
} else if(strcmp(line, "%OPTDEPENDS%") == 0) {
|
} else if(strcmp(line, "%OPTDEPENDS%") == 0) {
|
||||||
READ_AND_SPLITDEP(pkg->optdepends);
|
READ_AND_SPLITDEP(pkg->optdepends);
|
||||||
} else if(strcmp(line, "%MAKEDEPENDS%") == 0) {
|
} else if(strcmp(line, "%MAKEDEPENDS%") == 0) {
|
||||||
READ_AND_SPLITDEP(pkg->makedepends);
|
/* currently unused */
|
||||||
|
while(1) {
|
||||||
|
READ_NEXT();
|
||||||
|
if(strlen(line) == 0) break;
|
||||||
|
}
|
||||||
} else if(strcmp(line, "%CHECKDEPENDS%") == 0) {
|
} else if(strcmp(line, "%CHECKDEPENDS%") == 0) {
|
||||||
READ_AND_SPLITDEP(pkg->checkdepends);
|
/* currently unused */
|
||||||
|
while(1) {
|
||||||
|
READ_NEXT();
|
||||||
|
if(strlen(line) == 0) break;
|
||||||
|
}
|
||||||
} else if(strcmp(line, "%CONFLICTS%") == 0) {
|
} else if(strcmp(line, "%CONFLICTS%") == 0) {
|
||||||
READ_AND_SPLITDEP(pkg->conflicts);
|
READ_AND_SPLITDEP(pkg->conflicts);
|
||||||
} else if(strcmp(line, "%PROVIDES%") == 0) {
|
} else if(strcmp(line, "%PROVIDES%") == 0) {
|
||||||
READ_AND_SPLITDEP(pkg->provides);
|
READ_AND_SPLITDEP(pkg->provides);
|
||||||
|
} else if(strcmp(line, "%DELTAS%") == 0) {
|
||||||
|
/* Different than the rest because of the _alpm_delta_parse call. */
|
||||||
|
while(1) {
|
||||||
|
READ_NEXT();
|
||||||
|
if(strlen(line) == 0) break;
|
||||||
|
pkg->deltas = alpm_list_add(pkg->deltas,
|
||||||
|
_alpm_delta_parse(db->handle, line));
|
||||||
|
}
|
||||||
} else if(strcmp(line, "%FILES%") == 0) {
|
} else if(strcmp(line, "%FILES%") == 0) {
|
||||||
/* TODO: this could lazy load if there is future demand */
|
/* TODO: this could lazy load if there is future demand */
|
||||||
size_t files_count = 0, files_size = 0;
|
size_t files_count = 0, files_size = 0;
|
||||||
@@ -672,36 +746,21 @@ static int sync_db_read(alpm_db_t *db, struct archive *archive,
|
|||||||
}
|
}
|
||||||
/* attempt to hand back any memory we don't need */
|
/* attempt to hand back any memory we don't need */
|
||||||
if(files_count > 0) {
|
if(files_count > 0) {
|
||||||
REALLOC(files, sizeof(alpm_file_t) * files_count, (void)0);
|
files = realloc(files, sizeof(alpm_file_t) * files_count);
|
||||||
} else {
|
} else {
|
||||||
FREE(files);
|
FREE(files);
|
||||||
}
|
}
|
||||||
pkg->files.count = files_count;
|
pkg->files.count = files_count;
|
||||||
pkg->files.files = files;
|
pkg->files.files = files;
|
||||||
_alpm_filelist_sort(&pkg->files);
|
_alpm_filelist_sort(&pkg->files);
|
||||||
} else if(strcmp(line, "%DATA%") == 0) {
|
|
||||||
alpm_list_t *i, *lines = NULL;
|
|
||||||
READ_AND_STORE_ALL(lines);
|
|
||||||
for(i = lines; i; i = i->next) {
|
|
||||||
alpm_pkg_xdata_t *pd = _alpm_pkg_parse_xdata(i->data);
|
|
||||||
if(pd == NULL || !alpm_list_append(&pkg->xdata, pd)) {
|
|
||||||
_alpm_pkg_xdata_free(pd);
|
|
||||||
FREELIST(lines);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FREELIST(lines);
|
|
||||||
} else {
|
|
||||||
_alpm_log(db->handle, ALPM_LOG_WARNING, _("%s: unknown key '%s' in sync database\n"), pkg->name, line);
|
|
||||||
alpm_list_t *lines = NULL;
|
|
||||||
READ_AND_STORE_ALL(lines);
|
|
||||||
FREELIST(lines);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(ret != ARCHIVE_EOF) {
|
if(ret != ARCHIVE_EOF) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
*likely_pkg = pkg;
|
*likely_pkg = pkg;
|
||||||
|
} else if(strcmp(filename, "deltas") == 0) {
|
||||||
|
/* skip reading delta files if UseDelta is unset */
|
||||||
} else {
|
} else {
|
||||||
/* unknown database file */
|
/* unknown database file */
|
||||||
_alpm_log(db->handle, ALPM_LOG_DEBUG, "unknown database file: %s\n", filename);
|
_alpm_log(db->handle, ALPM_LOG_DEBUG, "unknown database file: %s\n", filename);
|
||||||
@@ -729,7 +788,7 @@ alpm_db_t *_alpm_db_register_sync(alpm_handle_t *handle, const char *treename,
|
|||||||
|
|
||||||
#ifndef HAVE_LIBGPGME
|
#ifndef HAVE_LIBGPGME
|
||||||
if(level != 0 && level != ALPM_SIG_USE_DEFAULT) {
|
if(level != 0 && level != ALPM_SIG_USE_DEFAULT) {
|
||||||
RET_ERR(handle, ALPM_ERR_MISSING_CAPABILITY_SIGNATURES, NULL);
|
RET_ERR(handle, ALPM_ERR_WRONG_ARGS, NULL);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* conflict.c
|
* conflict.c
|
||||||
*
|
*
|
||||||
* Copyright (c) 2006-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||||
* Copyright (c) 2005 by Aurelien Foret <orelien@chez.com>
|
* Copyright (c) 2005 by Aurelien Foret <orelien@chez.com>
|
||||||
* Copyright (c) 2006 by David Kimpe <dnaku@frugalware.org>
|
* Copyright (c) 2006 by David Kimpe <dnaku@frugalware.org>
|
||||||
@@ -50,8 +50,10 @@ static alpm_conflict_t *conflict_new(alpm_pkg_t *pkg1, alpm_pkg_t *pkg2,
|
|||||||
|
|
||||||
CALLOC(conflict, 1, sizeof(alpm_conflict_t), return NULL);
|
CALLOC(conflict, 1, sizeof(alpm_conflict_t), return NULL);
|
||||||
|
|
||||||
ASSERT(_alpm_pkg_dup(pkg1, &conflict->package1) == 0, goto error);
|
conflict->package1_hash = pkg1->name_hash;
|
||||||
ASSERT(_alpm_pkg_dup(pkg2, &conflict->package2) == 0, goto error);
|
conflict->package2_hash = pkg2->name_hash;
|
||||||
|
STRDUP(conflict->package1, pkg1->name, goto error);
|
||||||
|
STRDUP(conflict->package2, pkg2->name, goto error);
|
||||||
conflict->reason = reason;
|
conflict->reason = reason;
|
||||||
|
|
||||||
return conflict;
|
return conflict;
|
||||||
@@ -61,12 +63,14 @@ error:
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Free a conflict and its members.
|
||||||
|
*/
|
||||||
void SYMEXPORT alpm_conflict_free(alpm_conflict_t *conflict)
|
void SYMEXPORT alpm_conflict_free(alpm_conflict_t *conflict)
|
||||||
{
|
{
|
||||||
ASSERT(conflict != NULL, return);
|
ASSERT(conflict != NULL, return);
|
||||||
_alpm_pkg_free(conflict->package1);
|
FREE(conflict->package2);
|
||||||
_alpm_pkg_free(conflict->package2);
|
FREE(conflict->package1);
|
||||||
|
|
||||||
FREE(conflict);
|
FREE(conflict);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,8 +82,10 @@ alpm_conflict_t *_alpm_conflict_dup(const alpm_conflict_t *conflict)
|
|||||||
alpm_conflict_t *newconflict;
|
alpm_conflict_t *newconflict;
|
||||||
CALLOC(newconflict, 1, sizeof(alpm_conflict_t), return NULL);
|
CALLOC(newconflict, 1, sizeof(alpm_conflict_t), return NULL);
|
||||||
|
|
||||||
ASSERT(_alpm_pkg_dup(conflict->package1, &newconflict->package1) == 0, goto error);
|
newconflict->package1_hash = conflict->package1_hash;
|
||||||
ASSERT(_alpm_pkg_dup(conflict->package2, &newconflict->package2) == 0, goto error);
|
newconflict->package2_hash = conflict->package2_hash;
|
||||||
|
STRDUP(newconflict->package1, conflict->package1, goto error);
|
||||||
|
STRDUP(newconflict->package2, conflict->package2, goto error);
|
||||||
newconflict->reason = conflict->reason;
|
newconflict->reason = conflict->reason;
|
||||||
|
|
||||||
return newconflict;
|
return newconflict;
|
||||||
@@ -102,10 +108,10 @@ static int conflict_isin(alpm_conflict_t *needle, alpm_list_t *haystack)
|
|||||||
alpm_list_t *i;
|
alpm_list_t *i;
|
||||||
for(i = haystack; i; i = i->next) {
|
for(i = haystack; i; i = i->next) {
|
||||||
alpm_conflict_t *conflict = i->data;
|
alpm_conflict_t *conflict = i->data;
|
||||||
if(needle->package1->name_hash == conflict->package1->name_hash
|
if(needle->package1_hash == conflict->package1_hash
|
||||||
&& needle->package2->name_hash == conflict->package2->name_hash
|
&& needle->package2_hash == conflict->package2_hash
|
||||||
&& strcmp(needle->package1->name, conflict->package1->name) == 0
|
&& strcmp(needle->package1, conflict->package1) == 0
|
||||||
&& strcmp(needle->package2->name, conflict->package2->name) == 0) {
|
&& strcmp(needle->package2, conflict->package2) == 0) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -237,6 +243,14 @@ alpm_list_t *_alpm_outerconflicts(alpm_db_t *db, alpm_list_t *packages)
|
|||||||
return baddeps;
|
return baddeps;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check the package conflicts in a database
|
||||||
|
*
|
||||||
|
* @param handle the context handle
|
||||||
|
* @param pkglist the list of packages to check
|
||||||
|
*
|
||||||
|
* @return an alpm_list_t of alpm_conflict_t
|
||||||
|
*/
|
||||||
alpm_list_t SYMEXPORT *alpm_checkconflicts(alpm_handle_t *handle,
|
alpm_list_t SYMEXPORT *alpm_checkconflicts(alpm_handle_t *handle,
|
||||||
alpm_list_t *pkglist)
|
alpm_list_t *pkglist)
|
||||||
{
|
{
|
||||||
@@ -286,6 +300,9 @@ error:
|
|||||||
RET_ERR(handle, ALPM_ERR_MEMORY, conflicts);
|
RET_ERR(handle, ALPM_ERR_MEMORY, conflicts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Frees a conflict and its members.
|
||||||
|
*/
|
||||||
void SYMEXPORT alpm_fileconflict_free(alpm_fileconflict_t *conflict)
|
void SYMEXPORT alpm_fileconflict_free(alpm_fileconflict_t *conflict)
|
||||||
{
|
{
|
||||||
ASSERT(conflict != NULL, return);
|
ASSERT(conflict != NULL, return);
|
||||||
@@ -384,7 +401,8 @@ static alpm_pkg_t *_alpm_find_file_owner(alpm_handle_t *handle, const char *path
|
|||||||
|
|
||||||
static int _alpm_can_overwrite_file(alpm_handle_t *handle, const char *path, const char *rootedpath)
|
static int _alpm_can_overwrite_file(alpm_handle_t *handle, const char *path, const char *rootedpath)
|
||||||
{
|
{
|
||||||
return _alpm_fnmatch_patterns(handle->overwrite_files, path) == 0
|
return handle->trans->flags & ALPM_TRANS_FLAG_FORCE
|
||||||
|
|| _alpm_fnmatch_patterns(handle->overwrite_files, path) == 0
|
||||||
|| _alpm_fnmatch_patterns(handle->overwrite_files, rootedpath) == 0;
|
|| _alpm_fnmatch_patterns(handle->overwrite_files, rootedpath) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* conflict.h
|
* conflict.h
|
||||||
*
|
*
|
||||||
* Copyright (c) 2006-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|||||||
163
lib/libalpm/db.c
163
lib/libalpm/db.c
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* db.c
|
* db.c
|
||||||
*
|
*
|
||||||
* Copyright (c) 2006-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||||
* Copyright (c) 2005 by Aurelien Foret <orelien@chez.com>
|
* Copyright (c) 2005 by Aurelien Foret <orelien@chez.com>
|
||||||
* Copyright (c) 2005 by Christian Hamar <krics@linuxforum.hu>
|
* Copyright (c) 2005 by Christian Hamar <krics@linuxforum.hu>
|
||||||
@@ -37,6 +37,12 @@
|
|||||||
#include "package.h"
|
#include "package.h"
|
||||||
#include "group.h"
|
#include "group.h"
|
||||||
|
|
||||||
|
/** \addtogroup alpm_databases Database Functions
|
||||||
|
* @brief Functions to query and manipulate the database of libalpm
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Register a sync database of packages. */
|
||||||
alpm_db_t SYMEXPORT *alpm_register_syncdb(alpm_handle_t *handle,
|
alpm_db_t SYMEXPORT *alpm_register_syncdb(alpm_handle_t *handle,
|
||||||
const char *treename, int siglevel)
|
const char *treename, int siglevel)
|
||||||
{
|
{
|
||||||
@@ -75,6 +81,7 @@ void _alpm_db_unregister(alpm_db_t *db)
|
|||||||
_alpm_db_free(db);
|
_alpm_db_free(db);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Unregister all package databases. */
|
||||||
int SYMEXPORT alpm_unregister_all_syncdbs(alpm_handle_t *handle)
|
int SYMEXPORT alpm_unregister_all_syncdbs(alpm_handle_t *handle)
|
||||||
{
|
{
|
||||||
alpm_list_t *i;
|
alpm_list_t *i;
|
||||||
@@ -95,6 +102,7 @@ int SYMEXPORT alpm_unregister_all_syncdbs(alpm_handle_t *handle)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Unregister a package database. */
|
||||||
int SYMEXPORT alpm_db_unregister(alpm_db_t *db)
|
int SYMEXPORT alpm_db_unregister(alpm_db_t *db)
|
||||||
{
|
{
|
||||||
int found = 0;
|
int found = 0;
|
||||||
@@ -131,43 +139,19 @@ int SYMEXPORT alpm_db_unregister(alpm_db_t *db)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
alpm_list_t SYMEXPORT *alpm_db_get_cache_servers(const alpm_db_t *db)
|
/** Get the serverlist of a database. */
|
||||||
{
|
|
||||||
ASSERT(db != NULL, return NULL);
|
|
||||||
return db->cache_servers;
|
|
||||||
}
|
|
||||||
|
|
||||||
int SYMEXPORT alpm_db_set_cache_servers(alpm_db_t *db, alpm_list_t *cache_servers)
|
|
||||||
{
|
|
||||||
alpm_list_t *i;
|
|
||||||
ASSERT(db != NULL, return -1);
|
|
||||||
FREELIST(db->cache_servers);
|
|
||||||
for(i = cache_servers; i; i = i->next) {
|
|
||||||
char *url = i->data;
|
|
||||||
if(alpm_db_add_cache_server(db, url) != 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
alpm_list_t SYMEXPORT *alpm_db_get_servers(const alpm_db_t *db)
|
alpm_list_t SYMEXPORT *alpm_db_get_servers(const alpm_db_t *db)
|
||||||
{
|
{
|
||||||
ASSERT(db != NULL, return NULL);
|
ASSERT(db != NULL, return NULL);
|
||||||
return db->servers;
|
return db->servers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Set the serverlist of a database. */
|
||||||
int SYMEXPORT alpm_db_set_servers(alpm_db_t *db, alpm_list_t *servers)
|
int SYMEXPORT alpm_db_set_servers(alpm_db_t *db, alpm_list_t *servers)
|
||||||
{
|
{
|
||||||
alpm_list_t *i;
|
|
||||||
ASSERT(db != NULL, return -1);
|
ASSERT(db != NULL, return -1);
|
||||||
FREELIST(db->servers);
|
FREELIST(db->servers);
|
||||||
for(i = servers; i; i = i->next) {
|
db->servers = servers;
|
||||||
char *url = i->data;
|
|
||||||
if(alpm_db_add_server(db, url) != 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -184,25 +168,11 @@ static char *sanitize_url(const char *url)
|
|||||||
return newurl;
|
return newurl;
|
||||||
}
|
}
|
||||||
|
|
||||||
int SYMEXPORT alpm_db_add_cache_server(alpm_db_t *db, const char *url)
|
/** Add a download server to a database.
|
||||||
{
|
* @param db database pointer
|
||||||
char *newurl;
|
* @param url url of the server
|
||||||
|
* @return 0 on success, -1 on error (pm_errno is set accordingly)
|
||||||
/* Sanity checks */
|
*/
|
||||||
ASSERT(db != NULL, return -1);
|
|
||||||
db->handle->pm_errno = ALPM_ERR_OK;
|
|
||||||
ASSERT(url != NULL && strlen(url) != 0, RET_ERR(db->handle, ALPM_ERR_WRONG_ARGS, -1));
|
|
||||||
|
|
||||||
newurl = sanitize_url(url);
|
|
||||||
ASSERT(newurl != NULL, RET_ERR(db->handle, ALPM_ERR_MEMORY, -1));
|
|
||||||
|
|
||||||
db->cache_servers = alpm_list_add(db->cache_servers, newurl);
|
|
||||||
_alpm_log(db->handle, ALPM_LOG_DEBUG, "adding new cache server URL to database '%s': %s\n",
|
|
||||||
db->treename, newurl);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int SYMEXPORT alpm_db_add_server(alpm_db_t *db, const char *url)
|
int SYMEXPORT alpm_db_add_server(alpm_db_t *db, const char *url)
|
||||||
{
|
{
|
||||||
char *newurl;
|
char *newurl;
|
||||||
@@ -213,8 +183,9 @@ int SYMEXPORT alpm_db_add_server(alpm_db_t *db, const char *url)
|
|||||||
ASSERT(url != NULL && strlen(url) != 0, RET_ERR(db->handle, ALPM_ERR_WRONG_ARGS, -1));
|
ASSERT(url != NULL && strlen(url) != 0, RET_ERR(db->handle, ALPM_ERR_WRONG_ARGS, -1));
|
||||||
|
|
||||||
newurl = sanitize_url(url);
|
newurl = sanitize_url(url);
|
||||||
ASSERT(newurl != NULL, RET_ERR(db->handle, ALPM_ERR_MEMORY, -1));
|
if(!newurl) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
db->servers = alpm_list_add(db->servers, newurl);
|
db->servers = alpm_list_add(db->servers, newurl);
|
||||||
_alpm_log(db->handle, ALPM_LOG_DEBUG, "adding new server URL to database '%s': %s\n",
|
_alpm_log(db->handle, ALPM_LOG_DEBUG, "adding new server URL to database '%s': %s\n",
|
||||||
db->treename, newurl);
|
db->treename, newurl);
|
||||||
@@ -222,32 +193,12 @@ int SYMEXPORT alpm_db_add_server(alpm_db_t *db, const char *url)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int SYMEXPORT alpm_db_remove_cache_server(alpm_db_t *db, const char *url)
|
/** Remove a download server from a database.
|
||||||
{
|
* @param db database pointer
|
||||||
char *newurl, *vdata = NULL;
|
* @param url url of the server
|
||||||
int ret = 1;
|
* @return 0 on success, 1 on server not present,
|
||||||
|
* -1 on error (pm_errno is set accordingly)
|
||||||
/* Sanity checks */
|
*/
|
||||||
ASSERT(db != NULL, return -1);
|
|
||||||
db->handle->pm_errno = ALPM_ERR_OK;
|
|
||||||
ASSERT(url != NULL && strlen(url) != 0, RET_ERR(db->handle, ALPM_ERR_WRONG_ARGS, -1));
|
|
||||||
|
|
||||||
newurl = sanitize_url(url);
|
|
||||||
ASSERT(newurl != NULL, RET_ERR(db->handle, ALPM_ERR_MEMORY, -1));
|
|
||||||
|
|
||||||
db->cache_servers = alpm_list_remove_str(db->cache_servers, newurl, &vdata);
|
|
||||||
|
|
||||||
if(vdata) {
|
|
||||||
_alpm_log(db->handle, ALPM_LOG_DEBUG, "removed cache server URL from database '%s': %s\n",
|
|
||||||
db->treename, newurl);
|
|
||||||
free(vdata);
|
|
||||||
ret = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
free(newurl);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int SYMEXPORT alpm_db_remove_server(alpm_db_t *db, const char *url)
|
int SYMEXPORT alpm_db_remove_server(alpm_db_t *db, const char *url)
|
||||||
{
|
{
|
||||||
char *newurl, *vdata = NULL;
|
char *newurl, *vdata = NULL;
|
||||||
@@ -259,7 +210,9 @@ int SYMEXPORT alpm_db_remove_server(alpm_db_t *db, const char *url)
|
|||||||
ASSERT(url != NULL && strlen(url) != 0, RET_ERR(db->handle, ALPM_ERR_WRONG_ARGS, -1));
|
ASSERT(url != NULL && strlen(url) != 0, RET_ERR(db->handle, ALPM_ERR_WRONG_ARGS, -1));
|
||||||
|
|
||||||
newurl = sanitize_url(url);
|
newurl = sanitize_url(url);
|
||||||
ASSERT(newurl != NULL, RET_ERR(db->handle, ALPM_ERR_MEMORY, -1));
|
if(!newurl) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
db->servers = alpm_list_remove_str(db->servers, newurl, &vdata);
|
db->servers = alpm_list_remove_str(db->servers, newurl, &vdata);
|
||||||
|
|
||||||
@@ -274,18 +227,14 @@ int SYMEXPORT alpm_db_remove_server(alpm_db_t *db, const char *url)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
alpm_handle_t SYMEXPORT *alpm_db_get_handle(alpm_db_t *db)
|
/** Get the name of a package database. */
|
||||||
{
|
|
||||||
ASSERT(db != NULL, return NULL);
|
|
||||||
return db->handle;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char SYMEXPORT *alpm_db_get_name(const alpm_db_t *db)
|
const char SYMEXPORT *alpm_db_get_name(const alpm_db_t *db)
|
||||||
{
|
{
|
||||||
ASSERT(db != NULL, return NULL);
|
ASSERT(db != NULL, return NULL);
|
||||||
return db->treename;
|
return db->treename;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Get the signature verification level for a database. */
|
||||||
int SYMEXPORT alpm_db_get_siglevel(alpm_db_t *db)
|
int SYMEXPORT alpm_db_get_siglevel(alpm_db_t *db)
|
||||||
{
|
{
|
||||||
ASSERT(db != NULL, return -1);
|
ASSERT(db != NULL, return -1);
|
||||||
@@ -296,6 +245,7 @@ int SYMEXPORT alpm_db_get_siglevel(alpm_db_t *db)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Check the validity of a database. */
|
||||||
int SYMEXPORT alpm_db_get_valid(alpm_db_t *db)
|
int SYMEXPORT alpm_db_get_valid(alpm_db_t *db)
|
||||||
{
|
{
|
||||||
ASSERT(db != NULL, return -1);
|
ASSERT(db != NULL, return -1);
|
||||||
@@ -303,6 +253,7 @@ int SYMEXPORT alpm_db_get_valid(alpm_db_t *db)
|
|||||||
return db->ops->validate(db);
|
return db->ops->validate(db);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Get a package entry from a package database. */
|
||||||
alpm_pkg_t SYMEXPORT *alpm_db_get_pkg(alpm_db_t *db, const char *name)
|
alpm_pkg_t SYMEXPORT *alpm_db_get_pkg(alpm_db_t *db, const char *name)
|
||||||
{
|
{
|
||||||
alpm_pkg_t *pkg;
|
alpm_pkg_t *pkg;
|
||||||
@@ -318,6 +269,7 @@ alpm_pkg_t SYMEXPORT *alpm_db_get_pkg(alpm_db_t *db, const char *name)
|
|||||||
return pkg;
|
return pkg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Get the package cache of a package database. */
|
||||||
alpm_list_t SYMEXPORT *alpm_db_get_pkgcache(alpm_db_t *db)
|
alpm_list_t SYMEXPORT *alpm_db_get_pkgcache(alpm_db_t *db)
|
||||||
{
|
{
|
||||||
ASSERT(db != NULL, return NULL);
|
ASSERT(db != NULL, return NULL);
|
||||||
@@ -325,6 +277,7 @@ alpm_list_t SYMEXPORT *alpm_db_get_pkgcache(alpm_db_t *db)
|
|||||||
return _alpm_db_get_pkgcache(db);
|
return _alpm_db_get_pkgcache(db);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Get a group entry from a package database. */
|
||||||
alpm_group_t SYMEXPORT *alpm_db_get_group(alpm_db_t *db, const char *name)
|
alpm_group_t SYMEXPORT *alpm_db_get_group(alpm_db_t *db, const char *name)
|
||||||
{
|
{
|
||||||
ASSERT(db != NULL, return NULL);
|
ASSERT(db != NULL, return NULL);
|
||||||
@@ -335,6 +288,7 @@ alpm_group_t SYMEXPORT *alpm_db_get_group(alpm_db_t *db, const char *name)
|
|||||||
return _alpm_db_get_groupfromcache(db, name);
|
return _alpm_db_get_groupfromcache(db, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Get the group cache of a package database. */
|
||||||
alpm_list_t SYMEXPORT *alpm_db_get_groupcache(alpm_db_t *db)
|
alpm_list_t SYMEXPORT *alpm_db_get_groupcache(alpm_db_t *db)
|
||||||
{
|
{
|
||||||
ASSERT(db != NULL, return NULL);
|
ASSERT(db != NULL, return NULL);
|
||||||
@@ -343,16 +297,16 @@ alpm_list_t SYMEXPORT *alpm_db_get_groupcache(alpm_db_t *db)
|
|||||||
return _alpm_db_get_groupcache(db);
|
return _alpm_db_get_groupcache(db);
|
||||||
}
|
}
|
||||||
|
|
||||||
int SYMEXPORT alpm_db_search(alpm_db_t *db, const alpm_list_t *needles,
|
/** Searches a database. */
|
||||||
alpm_list_t **ret)
|
alpm_list_t SYMEXPORT *alpm_db_search(alpm_db_t *db, const alpm_list_t *needles)
|
||||||
{
|
{
|
||||||
ASSERT(db != NULL && ret != NULL && *ret == NULL,
|
ASSERT(db != NULL, return NULL);
|
||||||
RET_ERR(db->handle, ALPM_ERR_WRONG_ARGS, -1));
|
|
||||||
db->handle->pm_errno = ALPM_ERR_OK;
|
db->handle->pm_errno = ALPM_ERR_OK;
|
||||||
|
|
||||||
return _alpm_db_search(db, needles, ret);
|
return _alpm_db_search(db, needles);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Sets the usage bitmask for a repo */
|
||||||
int SYMEXPORT alpm_db_set_usage(alpm_db_t *db, int usage)
|
int SYMEXPORT alpm_db_set_usage(alpm_db_t *db, int usage)
|
||||||
{
|
{
|
||||||
ASSERT(db != NULL, return -1);
|
ASSERT(db != NULL, return -1);
|
||||||
@@ -360,6 +314,7 @@ int SYMEXPORT alpm_db_set_usage(alpm_db_t *db, int usage)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Gets the usage bitmask for a repo */
|
||||||
int SYMEXPORT alpm_db_get_usage(alpm_db_t *db, int *usage)
|
int SYMEXPORT alpm_db_get_usage(alpm_db_t *db, int *usage)
|
||||||
{
|
{
|
||||||
ASSERT(db != NULL, return -1);
|
ASSERT(db != NULL, return -1);
|
||||||
@@ -368,6 +323,9 @@ int SYMEXPORT alpm_db_get_usage(alpm_db_t *db, int *usage)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
alpm_db_t *_alpm_db_new(const char *treename, int is_local)
|
alpm_db_t *_alpm_db_new(const char *treename, int is_local)
|
||||||
{
|
{
|
||||||
alpm_db_t *db;
|
alpm_db_t *db;
|
||||||
@@ -390,7 +348,6 @@ void _alpm_db_free(alpm_db_t *db)
|
|||||||
/* cleanup pkgcache */
|
/* cleanup pkgcache */
|
||||||
_alpm_db_free_pkgcache(db);
|
_alpm_db_free_pkgcache(db);
|
||||||
/* cleanup server list */
|
/* cleanup server list */
|
||||||
FREELIST(db->cache_servers);
|
|
||||||
FREELIST(db->servers);
|
FREELIST(db->servers);
|
||||||
FREE(db->_path);
|
FREE(db->_path);
|
||||||
FREE(db->treename);
|
FREE(db->treename);
|
||||||
@@ -439,13 +396,13 @@ int _alpm_db_cmp(const void *d1, const void *d2)
|
|||||||
return strcmp(db1->treename, db2->treename);
|
return strcmp(db1->treename, db2->treename);
|
||||||
}
|
}
|
||||||
|
|
||||||
int _alpm_db_search(alpm_db_t *db, const alpm_list_t *needles,
|
alpm_list_t *_alpm_db_search(alpm_db_t *db, const alpm_list_t *needles)
|
||||||
alpm_list_t **ret)
|
|
||||||
{
|
{
|
||||||
const alpm_list_t *i, *j, *k;
|
const alpm_list_t *i, *j, *k;
|
||||||
|
alpm_list_t *ret = NULL;
|
||||||
|
|
||||||
if(!(db->usage & ALPM_DB_USAGE_SEARCH)) {
|
if(!(db->usage & ALPM_DB_USAGE_SEARCH)) {
|
||||||
return 0;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* copy the pkgcache- we will free the list var after each needle */
|
/* copy the pkgcache- we will free the list var after each needle */
|
||||||
@@ -458,15 +415,12 @@ int _alpm_db_search(alpm_db_t *db, const alpm_list_t *needles,
|
|||||||
if(i->data == NULL) {
|
if(i->data == NULL) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
*ret = NULL;
|
ret = NULL;
|
||||||
targ = i->data;
|
targ = i->data;
|
||||||
_alpm_log(db->handle, ALPM_LOG_DEBUG, "searching for target '%s'\n", targ);
|
_alpm_log(db->handle, ALPM_LOG_DEBUG, "searching for target '%s'\n", targ);
|
||||||
|
|
||||||
if(regcomp(®, targ, REG_EXTENDED | REG_NOSUB | REG_ICASE | REG_NEWLINE) != 0) {
|
if(regcomp(®, targ, REG_EXTENDED | REG_NOSUB | REG_ICASE | REG_NEWLINE) != 0) {
|
||||||
db->handle->pm_errno = ALPM_ERR_INVALID_REGEX;
|
RET_ERR(db->handle, ALPM_ERR_INVALID_REGEX, NULL);
|
||||||
alpm_list_free(list);
|
|
||||||
alpm_list_free(*ret);
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for(j = list; j; j = j->next) {
|
for(j = list; j; j = j->next) {
|
||||||
@@ -509,18 +463,18 @@ int _alpm_db_search(alpm_db_t *db, const alpm_list_t *needles,
|
|||||||
_alpm_log(db->handle, ALPM_LOG_DEBUG,
|
_alpm_log(db->handle, ALPM_LOG_DEBUG,
|
||||||
"search target '%s' matched '%s' on package '%s'\n",
|
"search target '%s' matched '%s' on package '%s'\n",
|
||||||
targ, matched, name);
|
targ, matched, name);
|
||||||
*ret = alpm_list_add(*ret, pkg);
|
ret = alpm_list_add(ret, pkg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Free the existing search list, and use the returned list for the
|
/* Free the existing search list, and use the returned list for the
|
||||||
* next needle. This allows for AND-based package searching. */
|
* next needle. This allows for AND-based package searching. */
|
||||||
alpm_list_free(list);
|
alpm_list_free(list);
|
||||||
list = *ret;
|
list = ret;
|
||||||
regfree(®);
|
regfree(®);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns a new package cache from db.
|
/* Returns a new package cache from db.
|
||||||
@@ -563,17 +517,18 @@ static void free_groupcache(alpm_db_t *db)
|
|||||||
|
|
||||||
void _alpm_db_free_pkgcache(alpm_db_t *db)
|
void _alpm_db_free_pkgcache(alpm_db_t *db)
|
||||||
{
|
{
|
||||||
if(db == NULL || db->pkgcache == NULL) {
|
if(db == NULL || !(db->status & DB_STATUS_PKGCACHE)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_alpm_log(db->handle, ALPM_LOG_DEBUG,
|
_alpm_log(db->handle, ALPM_LOG_DEBUG,
|
||||||
"freeing package cache for repository '%s'\n", db->treename);
|
"freeing package cache for repository '%s'\n", db->treename);
|
||||||
|
|
||||||
alpm_list_free_inner(db->pkgcache->list,
|
if(db->pkgcache) {
|
||||||
(alpm_list_fn_free)_alpm_pkg_free);
|
alpm_list_free_inner(db->pkgcache->list,
|
||||||
_alpm_pkghash_free(db->pkgcache);
|
(alpm_list_fn_free)_alpm_pkg_free);
|
||||||
db->pkgcache = NULL;
|
_alpm_pkghash_free(db->pkgcache);
|
||||||
|
}
|
||||||
db->status &= ~DB_STATUS_PKGCACHE;
|
db->status &= ~DB_STATUS_PKGCACHE;
|
||||||
|
|
||||||
free_groupcache(db);
|
free_groupcache(db);
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* db.h
|
* db.h
|
||||||
*
|
*
|
||||||
* Copyright (c) 2006-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||||
* Copyright (c) 2005 by Aurelien Foret <orelien@chez.com>
|
* Copyright (c) 2005 by Aurelien Foret <orelien@chez.com>
|
||||||
* Copyright (c) 2006 by Miklos Vajna <vmiklos@frugalware.org>
|
* Copyright (c) 2006 by Miklos Vajna <vmiklos@frugalware.org>
|
||||||
@@ -62,16 +62,15 @@ struct db_operations {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* Database */
|
/* Database */
|
||||||
struct _alpm_db_t {
|
struct __alpm_db_t {
|
||||||
alpm_handle_t *handle;
|
alpm_handle_t *handle;
|
||||||
char *treename;
|
char *treename;
|
||||||
/* do not access directly, use _alpm_db_path(db) for lazy access */
|
/* do not access directly, use _alpm_db_path(db) for lazy access */
|
||||||
char *_path;
|
char *_path;
|
||||||
alpm_pkghash_t *pkgcache;
|
alpm_pkghash_t *pkgcache;
|
||||||
alpm_list_t *grpcache;
|
alpm_list_t *grpcache;
|
||||||
alpm_list_t *cache_servers;
|
|
||||||
alpm_list_t *servers;
|
alpm_list_t *servers;
|
||||||
const struct db_operations *ops;
|
struct db_operations *ops;
|
||||||
|
|
||||||
/* bitfields for validity, local, loaded caches, etc. */
|
/* bitfields for validity, local, loaded caches, etc. */
|
||||||
/* From _alpm_dbstatus_t */
|
/* From _alpm_dbstatus_t */
|
||||||
@@ -88,8 +87,7 @@ alpm_db_t *_alpm_db_new(const char *treename, int is_local);
|
|||||||
void _alpm_db_free(alpm_db_t *db);
|
void _alpm_db_free(alpm_db_t *db);
|
||||||
const char *_alpm_db_path(alpm_db_t *db);
|
const char *_alpm_db_path(alpm_db_t *db);
|
||||||
int _alpm_db_cmp(const void *d1, const void *d2);
|
int _alpm_db_cmp(const void *d1, const void *d2);
|
||||||
int _alpm_db_search(alpm_db_t *db, const alpm_list_t *needles,
|
alpm_list_t *_alpm_db_search(alpm_db_t *db, const alpm_list_t *needles);
|
||||||
alpm_list_t **ret);
|
|
||||||
alpm_db_t *_alpm_db_register_local(alpm_handle_t *handle);
|
alpm_db_t *_alpm_db_register_local(alpm_handle_t *handle);
|
||||||
alpm_db_t *_alpm_db_register_sync(alpm_handle_t *handle, const char *treename,
|
alpm_db_t *_alpm_db_register_sync(alpm_handle_t *handle, const char *treename,
|
||||||
int level);
|
int level);
|
||||||
|
|||||||
361
lib/libalpm/delta.c
Normal file
361
lib/libalpm/delta.c
Normal file
@@ -0,0 +1,361 @@
|
|||||||
|
/*
|
||||||
|
* delta.c
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
|
* Copyright (c) 2007-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdint.h> /* intmax_t */
|
||||||
|
#include <limits.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <regex.h>
|
||||||
|
|
||||||
|
/* libalpm */
|
||||||
|
#include "delta.h"
|
||||||
|
#include "alpm_list.h"
|
||||||
|
#include "util.h"
|
||||||
|
#include "log.h"
|
||||||
|
#include "graph.h"
|
||||||
|
|
||||||
|
static alpm_list_t *graph_init(alpm_list_t *deltas, int reverse)
|
||||||
|
{
|
||||||
|
alpm_list_t *i, *j;
|
||||||
|
alpm_list_t *vertices = NULL;
|
||||||
|
/* create the vertices */
|
||||||
|
for(i = deltas; i; i = i->next) {
|
||||||
|
alpm_graph_t *v = _alpm_graph_new();
|
||||||
|
if(!v) {
|
||||||
|
alpm_list_free(vertices);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
alpm_delta_t *vdelta = i->data;
|
||||||
|
vdelta->download_size = vdelta->delta_size;
|
||||||
|
v->weight = LONG_MAX;
|
||||||
|
v->data = vdelta;
|
||||||
|
vertices = alpm_list_add(vertices, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* compute the edges */
|
||||||
|
for(i = vertices; i; i = i->next) {
|
||||||
|
alpm_graph_t *v_i = i->data;
|
||||||
|
alpm_delta_t *d_i = v_i->data;
|
||||||
|
/* loop a second time so we make all possible comparisons */
|
||||||
|
for(j = vertices; j; j = j->next) {
|
||||||
|
alpm_graph_t *v_j = j->data;
|
||||||
|
alpm_delta_t *d_j = v_j->data;
|
||||||
|
/* We want to create a delta tree like the following:
|
||||||
|
* 1_to_2
|
||||||
|
* |
|
||||||
|
* 1_to_3 2_to_3
|
||||||
|
* \ /
|
||||||
|
* 3_to_4
|
||||||
|
* If J 'from' is equal to I 'to', then J is a child of I.
|
||||||
|
* */
|
||||||
|
if((!reverse && strcmp(d_j->from, d_i->to) == 0) ||
|
||||||
|
(reverse && strcmp(d_j->to, d_i->from) == 0)) {
|
||||||
|
v_i->children = alpm_list_add(v_i->children, v_j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
v_i->iterator = v_i->children;
|
||||||
|
}
|
||||||
|
return vertices;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void graph_init_size(alpm_handle_t *handle, alpm_list_t *vertices)
|
||||||
|
{
|
||||||
|
alpm_list_t *i;
|
||||||
|
|
||||||
|
for(i = vertices; i; i = i->next) {
|
||||||
|
char *fpath, *md5sum;
|
||||||
|
alpm_graph_t *v = i->data;
|
||||||
|
alpm_delta_t *vdelta = v->data;
|
||||||
|
|
||||||
|
/* determine whether the delta file already exists */
|
||||||
|
fpath = _alpm_filecache_find(handle, vdelta->delta);
|
||||||
|
if(fpath) {
|
||||||
|
md5sum = alpm_compute_md5sum(fpath);
|
||||||
|
if(md5sum && strcmp(md5sum, vdelta->delta_md5) == 0) {
|
||||||
|
vdelta->download_size = 0;
|
||||||
|
}
|
||||||
|
FREE(md5sum);
|
||||||
|
FREE(fpath);
|
||||||
|
} else {
|
||||||
|
char *fnamepart;
|
||||||
|
CALLOC(fnamepart, strlen(vdelta->delta) + 6, sizeof(char), return);
|
||||||
|
sprintf(fnamepart, "%s.part", vdelta->delta);
|
||||||
|
fpath = _alpm_filecache_find(handle, fnamepart);
|
||||||
|
if(fpath) {
|
||||||
|
struct stat st;
|
||||||
|
if(stat(fpath, &st) == 0) {
|
||||||
|
vdelta->download_size = vdelta->delta_size - st.st_size;
|
||||||
|
vdelta->download_size = vdelta->download_size < 0 ? 0 : vdelta->download_size;
|
||||||
|
}
|
||||||
|
FREE(fpath);
|
||||||
|
}
|
||||||
|
FREE(fnamepart);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* determine whether a base 'from' file exists */
|
||||||
|
fpath = _alpm_filecache_find(handle, vdelta->from);
|
||||||
|
if(fpath) {
|
||||||
|
v->weight = vdelta->download_size;
|
||||||
|
}
|
||||||
|
FREE(fpath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void dijkstra(alpm_list_t *vertices)
|
||||||
|
{
|
||||||
|
alpm_list_t *i;
|
||||||
|
alpm_graph_t *v;
|
||||||
|
while(1) {
|
||||||
|
v = NULL;
|
||||||
|
/* find the smallest vertice not visited yet */
|
||||||
|
for(i = vertices; i; i = i->next) {
|
||||||
|
alpm_graph_t *v_i = i->data;
|
||||||
|
|
||||||
|
if(v_i->state == ALPM_GRAPH_STATE_PROCESSING) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(v == NULL || v_i->weight < v->weight) {
|
||||||
|
v = v_i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(v == NULL || v->weight == LONG_MAX) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
v->state = ALPM_GRAPH_STATE_PROCESSING;
|
||||||
|
|
||||||
|
v->iterator = v->children;
|
||||||
|
while(v->iterator) {
|
||||||
|
alpm_graph_t *v_c = v->iterator->data;
|
||||||
|
alpm_delta_t *d_c = v_c->data;
|
||||||
|
if(v_c->weight > v->weight + d_c->download_size) {
|
||||||
|
v_c->weight = v->weight + d_c->download_size;
|
||||||
|
v_c->parent = v;
|
||||||
|
}
|
||||||
|
|
||||||
|
v->iterator = (v->iterator)->next;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static off_t shortest_path(alpm_list_t *vertices, const char *to, alpm_list_t **path)
|
||||||
|
{
|
||||||
|
alpm_list_t *i;
|
||||||
|
alpm_graph_t *v = NULL;
|
||||||
|
off_t bestsize = 0;
|
||||||
|
alpm_list_t *rpath = NULL;
|
||||||
|
|
||||||
|
for(i = vertices; i; i = i->next) {
|
||||||
|
alpm_graph_t *v_i = i->data;
|
||||||
|
alpm_delta_t *d_i = v_i->data;
|
||||||
|
|
||||||
|
if(strcmp(d_i->to, to) == 0) {
|
||||||
|
if(v == NULL || v_i->weight < v->weight) {
|
||||||
|
v = v_i;
|
||||||
|
bestsize = v->weight;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while(v != NULL) {
|
||||||
|
alpm_delta_t *vdelta = v->data;
|
||||||
|
rpath = alpm_list_add(rpath, vdelta);
|
||||||
|
v = v->parent;
|
||||||
|
}
|
||||||
|
*path = alpm_list_reverse(rpath);
|
||||||
|
alpm_list_free(rpath);
|
||||||
|
|
||||||
|
return bestsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Calculates the shortest path from one version to another.
|
||||||
|
* The shortest path is defined as the path with the smallest combined
|
||||||
|
* size, not the length of the path.
|
||||||
|
* @param handle the context handle
|
||||||
|
* @param deltas the list of alpm_delta_t * objects that a file has
|
||||||
|
* @param to the file to start the search at
|
||||||
|
* @param path the pointer to a list location where alpm_delta_t * objects that
|
||||||
|
* have the smallest size are placed. NULL is set if there is no path
|
||||||
|
* possible with the files available.
|
||||||
|
* @return the size of the path stored, or LONG_MAX if path is unfindable
|
||||||
|
*/
|
||||||
|
off_t _alpm_shortest_delta_path(alpm_handle_t *handle, alpm_list_t *deltas,
|
||||||
|
const char *to, alpm_list_t **path)
|
||||||
|
{
|
||||||
|
alpm_list_t *bestpath = NULL;
|
||||||
|
alpm_list_t *vertices;
|
||||||
|
off_t bestsize = LONG_MAX;
|
||||||
|
|
||||||
|
if(deltas == NULL) {
|
||||||
|
*path = NULL;
|
||||||
|
return bestsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
_alpm_log(handle, ALPM_LOG_DEBUG, "started delta shortest-path search for '%s'\n", to);
|
||||||
|
|
||||||
|
vertices = graph_init(deltas, 0);
|
||||||
|
graph_init_size(handle, vertices);
|
||||||
|
dijkstra(vertices);
|
||||||
|
bestsize = shortest_path(vertices, to, &bestpath);
|
||||||
|
|
||||||
|
_alpm_log(handle, ALPM_LOG_DEBUG, "delta shortest-path search complete : '%jd'\n", (intmax_t)bestsize);
|
||||||
|
|
||||||
|
alpm_list_free_inner(vertices, _alpm_graph_free);
|
||||||
|
alpm_list_free(vertices);
|
||||||
|
|
||||||
|
*path = bestpath;
|
||||||
|
return bestsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
static alpm_list_t *find_unused(alpm_list_t *deltas, const char *to, off_t quota)
|
||||||
|
{
|
||||||
|
alpm_list_t *unused = NULL;
|
||||||
|
alpm_list_t *vertices;
|
||||||
|
alpm_list_t *i;
|
||||||
|
vertices = graph_init(deltas, 1);
|
||||||
|
|
||||||
|
for(i = vertices; i; i = i->next) {
|
||||||
|
alpm_graph_t *v = i->data;
|
||||||
|
alpm_delta_t *vdelta = v->data;
|
||||||
|
if(strcmp(vdelta->to, to) == 0) {
|
||||||
|
v->weight = vdelta->download_size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dijkstra(vertices);
|
||||||
|
for(i = vertices; i; i = i->next) {
|
||||||
|
alpm_graph_t *v = i->data;
|
||||||
|
alpm_delta_t *vdelta = v->data;
|
||||||
|
if(v->weight > quota) {
|
||||||
|
unused = alpm_list_add(unused, vdelta->delta);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
alpm_list_free_inner(vertices, _alpm_graph_free);
|
||||||
|
alpm_list_free(vertices);
|
||||||
|
return unused;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \addtogroup alpm_deltas Delta Functions
|
||||||
|
* @brief Functions to manipulate libalpm deltas
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
alpm_list_t SYMEXPORT *alpm_pkg_unused_deltas(alpm_pkg_t *pkg)
|
||||||
|
{
|
||||||
|
ASSERT(pkg != NULL, return NULL);
|
||||||
|
return find_unused(pkg->deltas, pkg->filename,
|
||||||
|
pkg->size * pkg->handle->deltaratio);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#define NUM_MATCHES 6
|
||||||
|
|
||||||
|
/** Parses the string representation of a alpm_delta_t object.
|
||||||
|
* This function assumes that the string is in the correct format.
|
||||||
|
* This format is as follows:
|
||||||
|
* $deltafile $deltamd5 $deltasize $oldfile $newfile
|
||||||
|
* @param handle the context handle
|
||||||
|
* @param line the string to parse
|
||||||
|
* @return A pointer to the new alpm_delta_t object
|
||||||
|
*/
|
||||||
|
alpm_delta_t *_alpm_delta_parse(alpm_handle_t *handle, const char *line)
|
||||||
|
{
|
||||||
|
alpm_delta_t *delta;
|
||||||
|
size_t len;
|
||||||
|
regmatch_t pmatch[NUM_MATCHES];
|
||||||
|
char filesize[32];
|
||||||
|
|
||||||
|
/* this is so we only have to compile the pattern once */
|
||||||
|
if(!handle->delta_regex_compiled) {
|
||||||
|
/* $deltafile $deltamd5 $deltasize $oldfile $newfile*/
|
||||||
|
regcomp(&handle->delta_regex,
|
||||||
|
"^([^[:space:]]+) ([[:xdigit:]]{32}) ([[:digit:]]+)"
|
||||||
|
" ([^[:space:]]+) ([^[:space:]]+)$",
|
||||||
|
REG_EXTENDED | REG_NEWLINE);
|
||||||
|
handle->delta_regex_compiled = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(regexec(&handle->delta_regex, line, NUM_MATCHES, pmatch, 0) != 0) {
|
||||||
|
/* delta line is invalid, return NULL */
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
CALLOC(delta, 1, sizeof(alpm_delta_t), return NULL);
|
||||||
|
|
||||||
|
/* start at index 1 -- match 0 is the entire match */
|
||||||
|
len = pmatch[1].rm_eo - pmatch[1].rm_so;
|
||||||
|
STRNDUP(delta->delta, &line[pmatch[1].rm_so], len, goto error);
|
||||||
|
|
||||||
|
len = pmatch[2].rm_eo - pmatch[2].rm_so;
|
||||||
|
STRNDUP(delta->delta_md5, &line[pmatch[2].rm_so], len, goto error);
|
||||||
|
|
||||||
|
len = pmatch[3].rm_eo - pmatch[3].rm_so;
|
||||||
|
if(len < sizeof(filesize)) {
|
||||||
|
strncpy(filesize, &line[pmatch[3].rm_so], len);
|
||||||
|
filesize[len] = '\0';
|
||||||
|
delta->delta_size = _alpm_strtoofft(filesize);
|
||||||
|
}
|
||||||
|
|
||||||
|
len = pmatch[4].rm_eo - pmatch[4].rm_so;
|
||||||
|
STRNDUP(delta->from, &line[pmatch[4].rm_so], len, goto error);
|
||||||
|
|
||||||
|
len = pmatch[5].rm_eo - pmatch[5].rm_so;
|
||||||
|
STRNDUP(delta->to, &line[pmatch[5].rm_so], len, goto error);
|
||||||
|
|
||||||
|
return delta;
|
||||||
|
|
||||||
|
error:
|
||||||
|
_alpm_delta_free(delta);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef NUM_MATCHES
|
||||||
|
|
||||||
|
void _alpm_delta_free(alpm_delta_t *delta)
|
||||||
|
{
|
||||||
|
ASSERT(delta != NULL, return);
|
||||||
|
FREE(delta->delta);
|
||||||
|
FREE(delta->delta_md5);
|
||||||
|
FREE(delta->from);
|
||||||
|
FREE(delta->to);
|
||||||
|
FREE(delta);
|
||||||
|
}
|
||||||
|
|
||||||
|
alpm_delta_t *_alpm_delta_dup(const alpm_delta_t *delta)
|
||||||
|
{
|
||||||
|
alpm_delta_t *newdelta;
|
||||||
|
CALLOC(newdelta, 1, sizeof(alpm_delta_t), return NULL);
|
||||||
|
STRDUP(newdelta->delta, delta->delta, goto error);
|
||||||
|
STRDUP(newdelta->delta_md5, delta->delta_md5, goto error);
|
||||||
|
STRDUP(newdelta->from, delta->from, goto error);
|
||||||
|
STRDUP(newdelta->to, delta->to, goto error);
|
||||||
|
newdelta->delta_size = delta->delta_size;
|
||||||
|
newdelta->download_size = delta->download_size;
|
||||||
|
|
||||||
|
return newdelta;
|
||||||
|
|
||||||
|
error:
|
||||||
|
_alpm_delta_free(newdelta);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
33
lib/libalpm/delta.h
Normal file
33
lib/libalpm/delta.h
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* delta.h
|
||||||
|
*
|
||||||
|
* Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
|
* Copyright (c) 2007-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#ifndef ALPM_DELTA_H
|
||||||
|
#define ALPM_DELTA_H
|
||||||
|
|
||||||
|
#include <sys/types.h> /* off_t */
|
||||||
|
|
||||||
|
#include "alpm.h"
|
||||||
|
|
||||||
|
alpm_delta_t *_alpm_delta_parse(alpm_handle_t *handle, const char *line);
|
||||||
|
void _alpm_delta_free(alpm_delta_t *delta);
|
||||||
|
alpm_delta_t *_alpm_delta_dup(const alpm_delta_t *delta);
|
||||||
|
off_t _alpm_shortest_delta_path(alpm_handle_t *handle, alpm_list_t *deltas,
|
||||||
|
const char *to, alpm_list_t **path);
|
||||||
|
|
||||||
|
#endif /* ALPM_DELTA_H */
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* deps.c
|
* deps.c
|
||||||
*
|
*
|
||||||
* Copyright (c) 2006-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||||
* Copyright (c) 2005 by Aurelien Foret <orelien@chez.com>
|
* Copyright (c) 2005 by Aurelien Foret <orelien@chez.com>
|
||||||
* Copyright (c) 2005, 2006 by Miklos Vajna <vmiklos@frugalware.org>
|
* Copyright (c) 2005, 2006 by Miklos Vajna <vmiklos@frugalware.org>
|
||||||
@@ -286,6 +286,12 @@ static int no_dep_version(alpm_handle_t *handle)
|
|||||||
return (handle->trans->flags & ALPM_TRANS_FLAG_NODEPVERSION);
|
return (handle->trans->flags & ALPM_TRANS_FLAG_NODEPVERSION);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Find a package satisfying a specified dependency.
|
||||||
|
* The dependency can include versions with depmod operators.
|
||||||
|
* @param pkgs an alpm_list_t* of alpm_pkg_t where the satisfier will be searched
|
||||||
|
* @param depstring package or provision name, versioned or not
|
||||||
|
* @return a alpm_pkg_t* satisfying depstring
|
||||||
|
*/
|
||||||
alpm_pkg_t SYMEXPORT *alpm_find_satisfier(alpm_list_t *pkgs, const char *depstring)
|
alpm_pkg_t SYMEXPORT *alpm_find_satisfier(alpm_list_t *pkgs, const char *depstring)
|
||||||
{
|
{
|
||||||
alpm_depend_t *dep = alpm_dep_from_string(depstring);
|
alpm_depend_t *dep = alpm_dep_from_string(depstring);
|
||||||
@@ -297,6 +303,15 @@ alpm_pkg_t SYMEXPORT *alpm_find_satisfier(alpm_list_t *pkgs, const char *depstri
|
|||||||
return pkg;
|
return pkg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Checks dependencies and returns missing ones in a list.
|
||||||
|
* Dependencies can include versions with depmod operators.
|
||||||
|
* @param handle the context handle
|
||||||
|
* @param pkglist the list of local packages
|
||||||
|
* @param remove an alpm_list_t* of packages to be removed
|
||||||
|
* @param upgrade an alpm_list_t* of packages to be upgraded (remove-then-upgrade)
|
||||||
|
* @param reversedeps handles the backward dependencies
|
||||||
|
* @return an alpm_list_t* of alpm_depmissing_t pointers.
|
||||||
|
*/
|
||||||
alpm_list_t SYMEXPORT *alpm_checkdeps(alpm_handle_t *handle,
|
alpm_list_t SYMEXPORT *alpm_checkdeps(alpm_handle_t *handle,
|
||||||
alpm_list_t *pkglist, alpm_list_t *rem, alpm_list_t *upgrade,
|
alpm_list_t *pkglist, alpm_list_t *rem, alpm_list_t *upgrade,
|
||||||
int reversedeps)
|
int reversedeps)
|
||||||
@@ -556,7 +571,7 @@ static void _alpm_select_depends(alpm_list_t **from, alpm_list_t **to,
|
|||||||
for(i = *from; i; i = next) {
|
for(i = *from; i; i = next) {
|
||||||
alpm_pkg_t *deppkg = i->data;
|
alpm_pkg_t *deppkg = i->data;
|
||||||
next = i->next;
|
next = i->next;
|
||||||
if((explicit || alpm_pkg_get_reason(deppkg) == ALPM_PKG_REASON_DEPEND)
|
if((explicit || alpm_pkg_get_reason(deppkg) != ALPM_PKG_REASON_EXPLICIT)
|
||||||
&& _alpm_pkg_depends_on(pkg, deppkg)) {
|
&& _alpm_pkg_depends_on(pkg, deppkg)) {
|
||||||
*to = alpm_list_add(*to, deppkg);
|
*to = alpm_list_add(*to, deppkg);
|
||||||
*from = alpm_list_remove_item(*from, i);
|
*from = alpm_list_remove_item(*from, i);
|
||||||
@@ -628,9 +643,10 @@ int _alpm_recursedeps(alpm_db_t *db, alpm_list_t **targs, int include_explicit)
|
|||||||
* @param dep is the dependency to search for
|
* @param dep is the dependency to search for
|
||||||
* @param dbs are the databases to search
|
* @param dbs are the databases to search
|
||||||
* @param excluding are the packages to exclude from the search
|
* @param excluding are the packages to exclude from the search
|
||||||
* @param prompt if true, ask an alpm_question_install_ignorepkg_t to decide
|
* @param prompt if true, will cause an unresolvable dependency to issue an
|
||||||
* if ignored packages should be installed; if false, skip ignored
|
* interactive prompt asking whether the package should be removed from
|
||||||
* packages.
|
* the transaction or the transaction aborted; if false, simply returns
|
||||||
|
* an error code without prompting
|
||||||
* @return the resolved package
|
* @return the resolved package
|
||||||
**/
|
**/
|
||||||
static alpm_pkg_t *resolvedep(alpm_handle_t *handle, alpm_depend_t *dep,
|
static alpm_pkg_t *resolvedep(alpm_handle_t *handle, alpm_depend_t *dep,
|
||||||
@@ -683,8 +699,7 @@ static alpm_pkg_t *resolvedep(alpm_handle_t *handle, alpm_depend_t *dep,
|
|||||||
for(j = _alpm_db_get_pkgcache(db); j; j = j->next) {
|
for(j = _alpm_db_get_pkgcache(db); j; j = j->next) {
|
||||||
alpm_pkg_t *pkg = j->data;
|
alpm_pkg_t *pkg = j->data;
|
||||||
if((pkg->name_hash != dep->name_hash || strcmp(pkg->name, dep->name) != 0)
|
if((pkg->name_hash != dep->name_hash || strcmp(pkg->name, dep->name) != 0)
|
||||||
&& _alpm_depcmp_provides(dep, alpm_pkg_get_provides(pkg))
|
&& _alpm_depcmp(pkg, dep) && !alpm_pkg_find(excluding, pkg->name)) {
|
||||||
&& !alpm_pkg_find(excluding, pkg->name)) {
|
|
||||||
if(alpm_pkg_should_ignore(handle, pkg)) {
|
if(alpm_pkg_should_ignore(handle, pkg)) {
|
||||||
alpm_question_install_ignorepkg_t question = {
|
alpm_question_install_ignorepkg_t question = {
|
||||||
.type = ALPM_QUESTION_INSTALL_IGNOREPKG,
|
.type = ALPM_QUESTION_INSTALL_IGNOREPKG,
|
||||||
@@ -704,19 +719,20 @@ static alpm_pkg_t *resolvedep(alpm_handle_t *handle, alpm_depend_t *dep,
|
|||||||
}
|
}
|
||||||
_alpm_log(handle, ALPM_LOG_DEBUG, "provider found (%s provides %s)\n",
|
_alpm_log(handle, ALPM_LOG_DEBUG, "provider found (%s provides %s)\n",
|
||||||
pkg->name, dep->name);
|
pkg->name, dep->name);
|
||||||
|
|
||||||
/* provide is already installed so return early instead of prompting later */
|
|
||||||
if(_alpm_db_get_pkgfromcache(handle->db_local, pkg->name)) {
|
|
||||||
alpm_list_free(providers);
|
|
||||||
return pkg;
|
|
||||||
}
|
|
||||||
|
|
||||||
providers = alpm_list_add(providers, pkg);
|
providers = alpm_list_add(providers, pkg);
|
||||||
/* keep looking for other providers in the all dbs */
|
/* keep looking for other providers in the all dbs */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* first check if one provider is already installed locally */
|
||||||
|
for(i = providers; i; i = i->next) {
|
||||||
|
alpm_pkg_t *pkg = i->data;
|
||||||
|
if(_alpm_db_get_pkgfromcache(handle->db_local, pkg->name)) {
|
||||||
|
alpm_list_free(providers);
|
||||||
|
return pkg;
|
||||||
|
}
|
||||||
|
}
|
||||||
count = alpm_list_count(providers);
|
count = alpm_list_count(providers);
|
||||||
if(count >= 1) {
|
if(count >= 1) {
|
||||||
alpm_question_select_provider_t question = {
|
alpm_question_select_provider_t question = {
|
||||||
@@ -748,6 +764,15 @@ static alpm_pkg_t *resolvedep(alpm_handle_t *handle, alpm_depend_t *dep,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Find a package satisfying a specified dependency.
|
||||||
|
* First look for a literal, going through each db one by one. Then look for
|
||||||
|
* providers. The first satisfier found is returned.
|
||||||
|
* The dependency can include versions with depmod operators.
|
||||||
|
* @param handle the context handle
|
||||||
|
* @param dbs an alpm_list_t* of alpm_db_t where the satisfier will be searched
|
||||||
|
* @param depstring package or provision name, versioned or not
|
||||||
|
* @return a alpm_pkg_t* satisfying depstring
|
||||||
|
*/
|
||||||
alpm_pkg_t SYMEXPORT *alpm_find_dbs_satisfier(alpm_handle_t *handle,
|
alpm_pkg_t SYMEXPORT *alpm_find_dbs_satisfier(alpm_handle_t *handle,
|
||||||
alpm_list_t *dbs, const char *depstring)
|
alpm_list_t *dbs, const char *depstring)
|
||||||
{
|
{
|
||||||
@@ -862,6 +887,11 @@ int _alpm_resolvedeps(alpm_handle_t *handle, alpm_list_t *localpkgs,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Reverse of splitdep; make a dep string from a alpm_depend_t struct.
|
||||||
|
* The string must be freed!
|
||||||
|
* @param dep the depend to turn into a string
|
||||||
|
* @return a string-formatted dependency with operator if necessary
|
||||||
|
*/
|
||||||
char SYMEXPORT *alpm_dep_compute_string(const alpm_depend_t *dep)
|
char SYMEXPORT *alpm_dep_compute_string(const alpm_depend_t *dep)
|
||||||
{
|
{
|
||||||
const char *name, *opr, *ver, *desc_delim, *desc;
|
const char *name, *opr, *ver, *desc_delim, *desc;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* deps.h
|
* deps.h
|
||||||
*
|
*
|
||||||
* Copyright (c) 2006-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||||
* Copyright (c) 2005 by Aurelien Foret <orelien@chez.com>
|
* Copyright (c) 2005 by Aurelien Foret <orelien@chez.com>
|
||||||
* Copyright (c) 2006 by Miklos Vajna <vmiklos@frugalware.org>
|
* Copyright (c) 2006 by Miklos Vajna <vmiklos@frugalware.org>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* diskspace.c
|
* diskspace.c
|
||||||
*
|
*
|
||||||
* Copyright (c) 2010-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2010-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -111,10 +111,6 @@ static alpm_list_t *mount_point_list(alpm_handle_t *handle)
|
|||||||
}
|
}
|
||||||
|
|
||||||
while((mnt = getmntent(fp))) {
|
while((mnt = getmntent(fp))) {
|
||||||
if(mnt->mnt_dir == NULL) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALLOC(mp, 1, sizeof(alpm_mountpoint_t), RET_ERR(handle, ALPM_ERR_MEMORY, NULL));
|
CALLOC(mp, 1, sizeof(alpm_mountpoint_t), RET_ERR(handle, ALPM_ERR_MEMORY, NULL));
|
||||||
STRDUP(mp->mount_dir, mnt->mnt_dir, free(mp); RET_ERR(handle, ALPM_ERR_MEMORY, NULL));
|
STRDUP(mp->mount_dir, mnt->mnt_dir, free(mp); RET_ERR(handle, ALPM_ERR_MEMORY, NULL));
|
||||||
mp->mount_dir_len = strlen(mp->mount_dir);
|
mp->mount_dir_len = strlen(mp->mount_dir);
|
||||||
@@ -138,10 +134,6 @@ static alpm_list_t *mount_point_list(alpm_handle_t *handle)
|
|||||||
}
|
}
|
||||||
|
|
||||||
while((ret = getmntent(fp, &mnt)) == 0) {
|
while((ret = getmntent(fp, &mnt)) == 0) {
|
||||||
if(mnt->mnt_mountp == NULL) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALLOC(mp, 1, sizeof(alpm_mountpoint_t), RET_ERR(handle, ALPM_ERR_MEMORY, NULL));
|
CALLOC(mp, 1, sizeof(alpm_mountpoint_t), RET_ERR(handle, ALPM_ERR_MEMORY, NULL));
|
||||||
STRDUP(mp->mount_dir, mnt->mnt_mountp, free(mp); RET_ERR(handle, ALPM_ERR_MEMORY, NULL));
|
STRDUP(mp->mount_dir, mnt->mnt_mountp, free(mp); RET_ERR(handle, ALPM_ERR_MEMORY, NULL));
|
||||||
mp->mount_dir_len = strlen(mp->mount_dir);
|
mp->mount_dir_len = strlen(mp->mount_dir);
|
||||||
@@ -169,10 +161,6 @@ static alpm_list_t *mount_point_list(alpm_handle_t *handle)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for(; entries-- > 0; fsp++) {
|
for(; entries-- > 0; fsp++) {
|
||||||
if(fsp->f_mntonname == NULL) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALLOC(mp, 1, sizeof(alpm_mountpoint_t), RET_ERR(handle, ALPM_ERR_MEMORY, NULL));
|
CALLOC(mp, 1, sizeof(alpm_mountpoint_t), RET_ERR(handle, ALPM_ERR_MEMORY, NULL));
|
||||||
STRDUP(mp->mount_dir, fsp->f_mntonname, free(mp); RET_ERR(handle, ALPM_ERR_MEMORY, NULL));
|
STRDUP(mp->mount_dir, fsp->f_mntonname, free(mp); RET_ERR(handle, ALPM_ERR_MEMORY, NULL));
|
||||||
mp->mount_dir_len = strlen(mp->mount_dir);
|
mp->mount_dir_len = strlen(mp->mount_dir);
|
||||||
@@ -371,7 +359,7 @@ static int check_mountpoint(alpm_handle_t *handle, alpm_mountpoint_t *mp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int _alpm_check_downloadspace(alpm_handle_t *handle, const char *cachedir,
|
int _alpm_check_downloadspace(alpm_handle_t *handle, const char *cachedir,
|
||||||
size_t num_files, const off_t *file_sizes)
|
size_t num_files, off_t *file_sizes)
|
||||||
{
|
{
|
||||||
alpm_list_t *mount_points;
|
alpm_list_t *mount_points;
|
||||||
alpm_mountpoint_t *cachedir_mp;
|
alpm_mountpoint_t *cachedir_mp;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* diskspace.h
|
* diskspace.h
|
||||||
*
|
*
|
||||||
* Copyright (c) 2010-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2010-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -43,7 +43,7 @@ enum mount_fsinfo {
|
|||||||
MOUNT_FSINFO_FAIL,
|
MOUNT_FSINFO_FAIL,
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct _alpm_mountpoint_t {
|
typedef struct __alpm_mountpoint_t {
|
||||||
/* mount point information */
|
/* mount point information */
|
||||||
char *mount_dir;
|
char *mount_dir;
|
||||||
size_t mount_dir_len;
|
size_t mount_dir_len;
|
||||||
@@ -58,6 +58,6 @@ typedef struct _alpm_mountpoint_t {
|
|||||||
|
|
||||||
int _alpm_check_diskspace(alpm_handle_t *handle);
|
int _alpm_check_diskspace(alpm_handle_t *handle);
|
||||||
int _alpm_check_downloadspace(alpm_handle_t *handle, const char *cachedir,
|
int _alpm_check_downloadspace(alpm_handle_t *handle, const char *cachedir,
|
||||||
size_t num_files, const off_t *file_sizes);
|
size_t num_files, off_t *file_sizes);
|
||||||
|
|
||||||
#endif /* ALPM_DISKSPACE_H */
|
#endif /* ALPM_DISKSPACE_H */
|
||||||
|
|||||||
1049
lib/libalpm/dload.c
1049
lib/libalpm/dload.c
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* dload.h
|
* dload.h
|
||||||
*
|
*
|
||||||
* Copyright (c) 2006-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
@@ -30,14 +30,7 @@ struct dload_payload {
|
|||||||
char *tempfile_name;
|
char *tempfile_name;
|
||||||
char *destfile_name;
|
char *destfile_name;
|
||||||
char *content_disp_name;
|
char *content_disp_name;
|
||||||
/* client has to provide either
|
|
||||||
* 1) fileurl - full URL to the file
|
|
||||||
* 2) pair of (servers, filepath), in this case ALPM iterates over the
|
|
||||||
* server list and tries to download "$server/$filepath"
|
|
||||||
*/
|
|
||||||
char *fileurl;
|
char *fileurl;
|
||||||
char *filepath; /* download URL path */
|
|
||||||
alpm_list_t *cache_servers;
|
|
||||||
alpm_list_t *servers;
|
alpm_list_t *servers;
|
||||||
long respcode;
|
long respcode;
|
||||||
off_t initial_size;
|
off_t initial_size;
|
||||||
@@ -45,25 +38,19 @@ struct dload_payload {
|
|||||||
off_t prevprogress;
|
off_t prevprogress;
|
||||||
int force;
|
int force;
|
||||||
int allow_resume;
|
int allow_resume;
|
||||||
int random_partfile;
|
|
||||||
int errors_ok;
|
int errors_ok;
|
||||||
int unlink_on_fail;
|
int unlink_on_fail;
|
||||||
int trust_remote_name;
|
int trust_remote_name;
|
||||||
int download_signature; /* specifies if an accompanion *.sig file need to be downloaded*/
|
int cb_initialized;
|
||||||
int signature_optional; /* *.sig file is optional */
|
|
||||||
#ifdef HAVE_LIBCURL
|
#ifdef HAVE_LIBCURL
|
||||||
CURL *curl;
|
CURLcode curlerr; /* last error produced by curl */
|
||||||
char error_buffer[CURL_ERROR_SIZE];
|
|
||||||
FILE *localf; /* temp download file */
|
|
||||||
int signature; /* specifies if this payload is for a signature file */
|
|
||||||
int request_errors_ok; /* per-request errors-ok */
|
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
void _alpm_dload_payload_reset(struct dload_payload *payload);
|
void _alpm_dload_payload_reset(struct dload_payload *payload);
|
||||||
|
void _alpm_dload_payload_reset_for_retry(struct dload_payload *payload);
|
||||||
|
|
||||||
int _alpm_download(alpm_handle_t *handle,
|
int _alpm_download(struct dload_payload *payload, const char *localpath,
|
||||||
alpm_list_t *payloads /* struct dload_payload */,
|
char **final_file, const char **final_url);
|
||||||
const char *localpath);
|
|
||||||
|
|
||||||
#endif /* ALPM_DLOAD_H */
|
#endif /* ALPM_DLOAD_H */
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* error.c
|
* error.c
|
||||||
*
|
*
|
||||||
* Copyright (c) 2006-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
@@ -90,8 +90,6 @@ const char SYMEXPORT *alpm_strerror(alpm_errno_t err)
|
|||||||
return _("transaction not initialized");
|
return _("transaction not initialized");
|
||||||
case ALPM_ERR_TRANS_DUP_TARGET:
|
case ALPM_ERR_TRANS_DUP_TARGET:
|
||||||
return _("duplicate target");
|
return _("duplicate target");
|
||||||
case ALPM_ERR_TRANS_DUP_FILENAME:
|
|
||||||
return _("duplicate filename");
|
|
||||||
case ALPM_ERR_TRANS_NOT_INITIALIZED:
|
case ALPM_ERR_TRANS_NOT_INITIALIZED:
|
||||||
return _("transaction not initialized");
|
return _("transaction not initialized");
|
||||||
case ALPM_ERR_TRANS_NOT_PREPARED:
|
case ALPM_ERR_TRANS_NOT_PREPARED:
|
||||||
@@ -125,11 +123,18 @@ const char SYMEXPORT *alpm_strerror(alpm_errno_t err)
|
|||||||
return _("package filename is not valid");
|
return _("package filename is not valid");
|
||||||
case ALPM_ERR_PKG_INVALID_ARCH:
|
case ALPM_ERR_PKG_INVALID_ARCH:
|
||||||
return _("package architecture is not valid");
|
return _("package architecture is not valid");
|
||||||
|
case ALPM_ERR_PKG_REPO_NOT_FOUND:
|
||||||
|
return _("could not find repository for target");
|
||||||
/* Signatures */
|
/* Signatures */
|
||||||
case ALPM_ERR_SIG_MISSING:
|
case ALPM_ERR_SIG_MISSING:
|
||||||
return _("missing PGP signature");
|
return _("missing PGP signature");
|
||||||
case ALPM_ERR_SIG_INVALID:
|
case ALPM_ERR_SIG_INVALID:
|
||||||
return _("invalid PGP signature");
|
return _("invalid PGP signature");
|
||||||
|
/* Deltas */
|
||||||
|
case ALPM_ERR_DLT_INVALID:
|
||||||
|
return _("invalid or corrupted delta");
|
||||||
|
case ALPM_ERR_DLT_PATCHFAILED:
|
||||||
|
return _("delta patch failed");
|
||||||
/* Dependencies */
|
/* Dependencies */
|
||||||
case ALPM_ERR_UNSATISFIED_DEPS:
|
case ALPM_ERR_UNSATISFIED_DEPS:
|
||||||
return _("could not satisfy dependencies");
|
return _("could not satisfy dependencies");
|
||||||
@@ -154,9 +159,6 @@ const char SYMEXPORT *alpm_strerror(alpm_errno_t err)
|
|||||||
return _("gpgme error");
|
return _("gpgme error");
|
||||||
case ALPM_ERR_EXTERNAL_DOWNLOAD:
|
case ALPM_ERR_EXTERNAL_DOWNLOAD:
|
||||||
return _("error invoking external downloader");
|
return _("error invoking external downloader");
|
||||||
/* Missing compile-time features */
|
|
||||||
case ALPM_ERR_MISSING_CAPABILITY_SIGNATURES:
|
|
||||||
return _("compiled without signature support");
|
|
||||||
/* Unknown error! */
|
/* Unknown error! */
|
||||||
default:
|
default:
|
||||||
return _("unexpected error");
|
return _("unexpected error");
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* filelist.c
|
* filelist.c
|
||||||
*
|
*
|
||||||
* Copyright (c) 2012-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2012-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -118,7 +118,7 @@ static int _alpm_files_cmp(const void *f1, const void *f2)
|
|||||||
return strcmp(file1->name, file2->name);
|
return strcmp(file1->name, file2->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
alpm_file_t SYMEXPORT *alpm_filelist_contains(const alpm_filelist_t *filelist,
|
alpm_file_t SYMEXPORT *alpm_filelist_contains(alpm_filelist_t *filelist,
|
||||||
const char *path)
|
const char *path)
|
||||||
{
|
{
|
||||||
alpm_file_t key;
|
alpm_file_t key;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* filelist.h
|
* filelist.h
|
||||||
*
|
*
|
||||||
* Copyright (c) 2012-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2012-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* graph.c - helpful graph structure and setup/teardown methods
|
* graph.c - helpful graph structure and setup/teardown methods
|
||||||
*
|
*
|
||||||
* Copyright (c) 2007-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2007-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* graph.h - helpful graph structure and setup/teardown methods
|
* graph.h - helpful graph structure and setup/teardown methods
|
||||||
*
|
*
|
||||||
* Copyright (c) 2007-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2007-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -23,19 +23,19 @@
|
|||||||
|
|
||||||
#include "alpm_list.h"
|
#include "alpm_list.h"
|
||||||
|
|
||||||
enum _alpm_graph_vertex_state {
|
enum __alpm_graph_vertex_state {
|
||||||
ALPM_GRAPH_STATE_UNPROCESSED,
|
ALPM_GRAPH_STATE_UNPROCESSED,
|
||||||
ALPM_GRAPH_STATE_PROCESSING,
|
ALPM_GRAPH_STATE_PROCESSING,
|
||||||
ALPM_GRAPH_STATE_PROCESSED
|
ALPM_GRAPH_STATE_PROCESSED
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct _alpm_graph_t {
|
typedef struct __alpm_graph_t {
|
||||||
void *data;
|
void *data;
|
||||||
struct _alpm_graph_t *parent; /* where did we come from? */
|
struct __alpm_graph_t *parent; /* where did we come from? */
|
||||||
alpm_list_t *children;
|
alpm_list_t *children;
|
||||||
alpm_list_t *iterator; /* used for DFS without recursion */
|
alpm_list_t *iterator; /* used for DFS without recursion */
|
||||||
off_t weight; /* weight of the node */
|
off_t weight; /* weight of the node */
|
||||||
enum _alpm_graph_vertex_state state;
|
enum __alpm_graph_vertex_state state;
|
||||||
} alpm_graph_t;
|
} alpm_graph_t;
|
||||||
|
|
||||||
alpm_graph_t *_alpm_graph_new(void);
|
alpm_graph_t *_alpm_graph_new(void);
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* group.c
|
* group.c
|
||||||
*
|
*
|
||||||
* Copyright (c) 2006-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* group.h
|
* group.h
|
||||||
*
|
*
|
||||||
* Copyright (c) 2006-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* handle.c
|
* handle.c
|
||||||
*
|
*
|
||||||
* Copyright (c) 2006-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||||
* Copyright (c) 2005 by Aurelien Foret <orelien@chez.com>
|
* Copyright (c) 2005 by Aurelien Foret <orelien@chez.com>
|
||||||
* Copyright (c) 2005, 2006 by Miklos Vajna <vmiklos@frugalware.org>
|
* Copyright (c) 2005, 2006 by Miklos Vajna <vmiklos@frugalware.org>
|
||||||
@@ -34,6 +34,7 @@
|
|||||||
#include "alpm_list.h"
|
#include "alpm_list.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
#include "delta.h"
|
||||||
#include "trans.h"
|
#include "trans.h"
|
||||||
#include "alpm.h"
|
#include "alpm.h"
|
||||||
#include "deps.h"
|
#include "deps.h"
|
||||||
@@ -43,33 +44,18 @@ alpm_handle_t *_alpm_handle_new(void)
|
|||||||
alpm_handle_t *handle;
|
alpm_handle_t *handle;
|
||||||
|
|
||||||
CALLOC(handle, 1, sizeof(alpm_handle_t), return NULL);
|
CALLOC(handle, 1, sizeof(alpm_handle_t), return NULL);
|
||||||
|
handle->deltaratio = 0.0;
|
||||||
handle->lockfd = -1;
|
handle->lockfd = -1;
|
||||||
|
|
||||||
return handle;
|
return handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* free all in-memory resources */
|
|
||||||
void _alpm_handle_free(alpm_handle_t *handle)
|
void _alpm_handle_free(alpm_handle_t *handle)
|
||||||
{
|
{
|
||||||
alpm_list_t *i;
|
|
||||||
alpm_db_t *db;
|
|
||||||
|
|
||||||
if(handle == NULL) {
|
if(handle == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* close local database */
|
|
||||||
if((db = handle->db_local)) {
|
|
||||||
db->ops->unregister(db);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* unregister all sync dbs */
|
|
||||||
for(i = handle->dbs_sync; i; i = i->next) {
|
|
||||||
db = i->data;
|
|
||||||
db->ops->unregister(db);
|
|
||||||
}
|
|
||||||
alpm_list_free(handle->dbs_sync);
|
|
||||||
|
|
||||||
/* close logfile */
|
/* close logfile */
|
||||||
if(handle->logstream) {
|
if(handle->logstream) {
|
||||||
fclose(handle->logstream);
|
fclose(handle->logstream);
|
||||||
@@ -80,15 +66,16 @@ void _alpm_handle_free(alpm_handle_t *handle)
|
|||||||
closelog();
|
closelog();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBCURL
|
||||||
|
/* release curl handle */
|
||||||
|
curl_easy_cleanup(handle->curl);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_LIBGPGME
|
#ifdef HAVE_LIBGPGME
|
||||||
FREELIST(handle->known_keys);
|
FREELIST(handle->known_keys);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_LIBCURL
|
regfree(&handle->delta_regex);
|
||||||
curl_multi_cleanup(handle->curlm);
|
|
||||||
curl_global_cleanup();
|
|
||||||
FREELIST(handle->server_errors);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* free memory */
|
/* free memory */
|
||||||
_alpm_trans_free(handle->trans);
|
_alpm_trans_free(handle->trans);
|
||||||
@@ -99,7 +86,7 @@ void _alpm_handle_free(alpm_handle_t *handle)
|
|||||||
FREELIST(handle->hookdirs);
|
FREELIST(handle->hookdirs);
|
||||||
FREE(handle->logfile);
|
FREE(handle->logfile);
|
||||||
FREE(handle->lockfile);
|
FREE(handle->lockfile);
|
||||||
FREELIST(handle->architectures);
|
FREE(handle->arch);
|
||||||
FREE(handle->gpgdir);
|
FREE(handle->gpgdir);
|
||||||
FREELIST(handle->noupgrade);
|
FREELIST(handle->noupgrade);
|
||||||
FREELIST(handle->noextract);
|
FREELIST(handle->noextract);
|
||||||
@@ -122,7 +109,7 @@ int _alpm_handle_lock(alpm_handle_t *handle)
|
|||||||
ASSERT(handle->lockfd < 0, return 0);
|
ASSERT(handle->lockfd < 0, return 0);
|
||||||
|
|
||||||
/* create the dir of the lockfile first */
|
/* create the dir of the lockfile first */
|
||||||
STRDUP(dir, handle->lockfile, return -1);
|
dir = strdup(handle->lockfile);
|
||||||
ptr = strrchr(dir, '/');
|
ptr = strrchr(dir, '/');
|
||||||
if(ptr) {
|
if(ptr) {
|
||||||
*ptr = '\0';
|
*ptr = '\0';
|
||||||
@@ -140,6 +127,12 @@ int _alpm_handle_lock(alpm_handle_t *handle)
|
|||||||
return (handle->lockfd >= 0 ? 0 : -1);
|
return (handle->lockfd >= 0 ? 0 : -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Remove the database lock file
|
||||||
|
* @param handle the context handle
|
||||||
|
* @return 0 on success, -1 on error
|
||||||
|
*
|
||||||
|
* @note Safe to call from inside signal handlers.
|
||||||
|
*/
|
||||||
int SYMEXPORT alpm_unlock(alpm_handle_t *handle)
|
int SYMEXPORT alpm_unlock(alpm_handle_t *handle)
|
||||||
{
|
{
|
||||||
ASSERT(handle != NULL, return -1);
|
ASSERT(handle != NULL, return -1);
|
||||||
@@ -184,34 +177,22 @@ alpm_cb_log SYMEXPORT alpm_option_get_logcb(alpm_handle_t *handle)
|
|||||||
return handle->logcb;
|
return handle->logcb;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SYMEXPORT *alpm_option_get_logcb_ctx(alpm_handle_t *handle)
|
|
||||||
{
|
|
||||||
CHECK_HANDLE(handle, return NULL);
|
|
||||||
return handle->logcb_ctx;
|
|
||||||
}
|
|
||||||
|
|
||||||
alpm_cb_download SYMEXPORT alpm_option_get_dlcb(alpm_handle_t *handle)
|
alpm_cb_download SYMEXPORT alpm_option_get_dlcb(alpm_handle_t *handle)
|
||||||
{
|
{
|
||||||
CHECK_HANDLE(handle, return NULL);
|
CHECK_HANDLE(handle, return NULL);
|
||||||
return handle->dlcb;
|
return handle->dlcb;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SYMEXPORT *alpm_option_get_dlcb_ctx(alpm_handle_t *handle)
|
|
||||||
{
|
|
||||||
CHECK_HANDLE(handle, return NULL);
|
|
||||||
return handle->dlcb_ctx;
|
|
||||||
}
|
|
||||||
|
|
||||||
alpm_cb_fetch SYMEXPORT alpm_option_get_fetchcb(alpm_handle_t *handle)
|
alpm_cb_fetch SYMEXPORT alpm_option_get_fetchcb(alpm_handle_t *handle)
|
||||||
{
|
{
|
||||||
CHECK_HANDLE(handle, return NULL);
|
CHECK_HANDLE(handle, return NULL);
|
||||||
return handle->fetchcb;
|
return handle->fetchcb;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SYMEXPORT *alpm_option_get_fetchcb_ctx(alpm_handle_t *handle)
|
alpm_cb_totaldl SYMEXPORT alpm_option_get_totaldlcb(alpm_handle_t *handle)
|
||||||
{
|
{
|
||||||
CHECK_HANDLE(handle, return NULL);
|
CHECK_HANDLE(handle, return NULL);
|
||||||
return handle->fetchcb_ctx;
|
return handle->totaldlcb;
|
||||||
}
|
}
|
||||||
|
|
||||||
alpm_cb_event SYMEXPORT alpm_option_get_eventcb(alpm_handle_t *handle)
|
alpm_cb_event SYMEXPORT alpm_option_get_eventcb(alpm_handle_t *handle)
|
||||||
@@ -220,36 +201,18 @@ alpm_cb_event SYMEXPORT alpm_option_get_eventcb(alpm_handle_t *handle)
|
|||||||
return handle->eventcb;
|
return handle->eventcb;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SYMEXPORT *alpm_option_get_eventcb_ctx(alpm_handle_t *handle)
|
|
||||||
{
|
|
||||||
CHECK_HANDLE(handle, return NULL);
|
|
||||||
return handle->eventcb_ctx;
|
|
||||||
}
|
|
||||||
|
|
||||||
alpm_cb_question SYMEXPORT alpm_option_get_questioncb(alpm_handle_t *handle)
|
alpm_cb_question SYMEXPORT alpm_option_get_questioncb(alpm_handle_t *handle)
|
||||||
{
|
{
|
||||||
CHECK_HANDLE(handle, return NULL);
|
CHECK_HANDLE(handle, return NULL);
|
||||||
return handle->questioncb;
|
return handle->questioncb;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SYMEXPORT *alpm_option_get_questioncb_ctx(alpm_handle_t *handle)
|
|
||||||
{
|
|
||||||
CHECK_HANDLE(handle, return NULL);
|
|
||||||
return handle->questioncb_ctx;
|
|
||||||
}
|
|
||||||
|
|
||||||
alpm_cb_progress SYMEXPORT alpm_option_get_progresscb(alpm_handle_t *handle)
|
alpm_cb_progress SYMEXPORT alpm_option_get_progresscb(alpm_handle_t *handle)
|
||||||
{
|
{
|
||||||
CHECK_HANDLE(handle, return NULL);
|
CHECK_HANDLE(handle, return NULL);
|
||||||
return handle->progresscb;
|
return handle->progresscb;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SYMEXPORT *alpm_option_get_progresscb_ctx(alpm_handle_t *handle)
|
|
||||||
{
|
|
||||||
CHECK_HANDLE(handle, return NULL);
|
|
||||||
return handle->progresscb_ctx;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char SYMEXPORT *alpm_option_get_root(alpm_handle_t *handle)
|
const char SYMEXPORT *alpm_option_get_root(alpm_handle_t *handle)
|
||||||
{
|
{
|
||||||
CHECK_HANDLE(handle, return NULL);
|
CHECK_HANDLE(handle, return NULL);
|
||||||
@@ -334,10 +297,16 @@ alpm_list_t SYMEXPORT *alpm_option_get_assumeinstalled(alpm_handle_t *handle)
|
|||||||
return handle->assumeinstalled;
|
return handle->assumeinstalled;
|
||||||
}
|
}
|
||||||
|
|
||||||
alpm_list_t SYMEXPORT *alpm_option_get_architectures(alpm_handle_t *handle)
|
const char SYMEXPORT *alpm_option_get_arch(alpm_handle_t *handle)
|
||||||
{
|
{
|
||||||
CHECK_HANDLE(handle, return NULL);
|
CHECK_HANDLE(handle, return NULL);
|
||||||
return handle->architectures;
|
return handle->arch;
|
||||||
|
}
|
||||||
|
|
||||||
|
double SYMEXPORT alpm_option_get_deltaratio(alpm_handle_t *handle)
|
||||||
|
{
|
||||||
|
CHECK_HANDLE(handle, return -1);
|
||||||
|
return handle->deltaratio;
|
||||||
}
|
}
|
||||||
|
|
||||||
int SYMEXPORT alpm_option_get_checkspace(alpm_handle_t *handle)
|
int SYMEXPORT alpm_option_get_checkspace(alpm_handle_t *handle)
|
||||||
@@ -352,57 +321,52 @@ const char SYMEXPORT *alpm_option_get_dbext(alpm_handle_t *handle)
|
|||||||
return handle->dbext;
|
return handle->dbext;
|
||||||
}
|
}
|
||||||
|
|
||||||
int SYMEXPORT alpm_option_get_parallel_downloads(alpm_handle_t *handle)
|
int SYMEXPORT alpm_option_set_logcb(alpm_handle_t *handle, alpm_cb_log cb)
|
||||||
{
|
|
||||||
CHECK_HANDLE(handle, return -1);
|
|
||||||
return handle->parallel_downloads;
|
|
||||||
}
|
|
||||||
|
|
||||||
int SYMEXPORT alpm_option_set_logcb(alpm_handle_t *handle, alpm_cb_log cb, void *ctx)
|
|
||||||
{
|
{
|
||||||
CHECK_HANDLE(handle, return -1);
|
CHECK_HANDLE(handle, return -1);
|
||||||
handle->logcb = cb;
|
handle->logcb = cb;
|
||||||
handle->logcb_ctx = ctx;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int SYMEXPORT alpm_option_set_dlcb(alpm_handle_t *handle, alpm_cb_download cb, void *ctx)
|
int SYMEXPORT alpm_option_set_dlcb(alpm_handle_t *handle, alpm_cb_download cb)
|
||||||
{
|
{
|
||||||
CHECK_HANDLE(handle, return -1);
|
CHECK_HANDLE(handle, return -1);
|
||||||
handle->dlcb = cb;
|
handle->dlcb = cb;
|
||||||
handle->dlcb_ctx = ctx;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int SYMEXPORT alpm_option_set_fetchcb(alpm_handle_t *handle, alpm_cb_fetch cb, void *ctx)
|
int SYMEXPORT alpm_option_set_fetchcb(alpm_handle_t *handle, alpm_cb_fetch cb)
|
||||||
{
|
{
|
||||||
CHECK_HANDLE(handle, return -1);
|
CHECK_HANDLE(handle, return -1);
|
||||||
handle->fetchcb = cb;
|
handle->fetchcb = cb;
|
||||||
handle->fetchcb_ctx = ctx;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int SYMEXPORT alpm_option_set_eventcb(alpm_handle_t *handle, alpm_cb_event cb, void *ctx)
|
int SYMEXPORT alpm_option_set_totaldlcb(alpm_handle_t *handle, alpm_cb_totaldl cb)
|
||||||
|
{
|
||||||
|
CHECK_HANDLE(handle, return -1);
|
||||||
|
handle->totaldlcb = cb;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int SYMEXPORT alpm_option_set_eventcb(alpm_handle_t *handle, alpm_cb_event cb)
|
||||||
{
|
{
|
||||||
CHECK_HANDLE(handle, return -1);
|
CHECK_HANDLE(handle, return -1);
|
||||||
handle->eventcb = cb;
|
handle->eventcb = cb;
|
||||||
handle->eventcb_ctx = ctx;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int SYMEXPORT alpm_option_set_questioncb(alpm_handle_t *handle, alpm_cb_question cb, void *ctx)
|
int SYMEXPORT alpm_option_set_questioncb(alpm_handle_t *handle, alpm_cb_question cb)
|
||||||
{
|
{
|
||||||
CHECK_HANDLE(handle, return -1);
|
CHECK_HANDLE(handle, return -1);
|
||||||
handle->questioncb = cb;
|
handle->questioncb = cb;
|
||||||
handle->questioncb_ctx = ctx;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int SYMEXPORT alpm_option_set_progresscb(alpm_handle_t *handle, alpm_cb_progress cb, void *ctx)
|
int SYMEXPORT alpm_option_set_progresscb(alpm_handle_t *handle, alpm_cb_progress cb)
|
||||||
{
|
{
|
||||||
CHECK_HANDLE(handle, return -1);
|
CHECK_HANDLE(handle, return -1);
|
||||||
handle->progresscb = cb;
|
handle->progresscb = cb;
|
||||||
handle->progresscb_ctx = ctx;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -736,7 +700,6 @@ int SYMEXPORT alpm_option_set_assumeinstalled(alpm_handle_t *handle, alpm_list_t
|
|||||||
if(handle->assumeinstalled) {
|
if(handle->assumeinstalled) {
|
||||||
alpm_list_free_inner(handle->assumeinstalled, (alpm_list_fn_free)alpm_dep_free);
|
alpm_list_free_inner(handle->assumeinstalled, (alpm_list_fn_free)alpm_dep_free);
|
||||||
alpm_list_free(handle->assumeinstalled);
|
alpm_list_free(handle->assumeinstalled);
|
||||||
handle->assumeinstalled = NULL;
|
|
||||||
}
|
}
|
||||||
while(deps) {
|
while(deps) {
|
||||||
if(alpm_option_add_assumeinstalled(handle, deps->data) != 0) {
|
if(alpm_option_add_assumeinstalled(handle, deps->data) != 0) {
|
||||||
@@ -784,29 +747,21 @@ int SYMEXPORT alpm_option_remove_assumeinstalled(alpm_handle_t *handle, const al
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int SYMEXPORT alpm_option_add_architecture(alpm_handle_t *handle, const char *arch)
|
int SYMEXPORT alpm_option_set_arch(alpm_handle_t *handle, const char *arch)
|
||||||
{
|
{
|
||||||
handle->architectures = alpm_list_add(handle->architectures, strdup(arch));
|
CHECK_HANDLE(handle, return -1);
|
||||||
|
if(handle->arch) FREE(handle->arch);
|
||||||
|
STRDUP(handle->arch, arch, RET_ERR(handle, ALPM_ERR_MEMORY, -1));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int SYMEXPORT alpm_option_set_architectures(alpm_handle_t *handle, alpm_list_t *arches)
|
int SYMEXPORT alpm_option_set_deltaratio(alpm_handle_t *handle, double ratio)
|
||||||
{
|
{
|
||||||
CHECK_HANDLE(handle, return -1);
|
CHECK_HANDLE(handle, return -1);
|
||||||
if(handle->architectures) FREELIST(handle->architectures);
|
if(ratio < 0.0 || ratio > 2.0) {
|
||||||
handle->architectures = alpm_list_strdup(arches);
|
RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1);
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int SYMEXPORT alpm_option_remove_architecture(alpm_handle_t *handle, const char *arch)
|
|
||||||
{
|
|
||||||
char *vdata = NULL;
|
|
||||||
CHECK_HANDLE(handle, return -1);
|
|
||||||
handle->architectures = alpm_list_remove_str(handle->architectures, arch, &vdata);
|
|
||||||
if(vdata != NULL) {
|
|
||||||
FREE(vdata);
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
handle->deltaratio = ratio;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -848,14 +803,11 @@ int SYMEXPORT alpm_option_set_default_siglevel(alpm_handle_t *handle,
|
|||||||
int level)
|
int level)
|
||||||
{
|
{
|
||||||
CHECK_HANDLE(handle, return -1);
|
CHECK_HANDLE(handle, return -1);
|
||||||
if(level == ALPM_SIG_USE_DEFAULT) {
|
|
||||||
RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1);
|
|
||||||
}
|
|
||||||
#ifdef HAVE_LIBGPGME
|
#ifdef HAVE_LIBGPGME
|
||||||
handle->siglevel = level;
|
handle->siglevel = level;
|
||||||
#else
|
#else
|
||||||
if(level != 0) {
|
if(level != 0 && level != ALPM_SIG_USE_DEFAULT) {
|
||||||
RET_ERR(handle, ALPM_ERR_MISSING_CAPABILITY_SIGNATURES, -1);
|
RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
@@ -875,7 +827,7 @@ int SYMEXPORT alpm_option_set_local_file_siglevel(alpm_handle_t *handle,
|
|||||||
handle->localfilesiglevel = level;
|
handle->localfilesiglevel = level;
|
||||||
#else
|
#else
|
||||||
if(level != 0 && level != ALPM_SIG_USE_DEFAULT) {
|
if(level != 0 && level != ALPM_SIG_USE_DEFAULT) {
|
||||||
RET_ERR(handle, ALPM_ERR_MISSING_CAPABILITY_SIGNATURES, -1);
|
RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
@@ -899,7 +851,7 @@ int SYMEXPORT alpm_option_set_remote_file_siglevel(alpm_handle_t *handle,
|
|||||||
handle->remotefilesiglevel = level;
|
handle->remotefilesiglevel = level;
|
||||||
#else
|
#else
|
||||||
if(level != 0 && level != ALPM_SIG_USE_DEFAULT) {
|
if(level != 0 && level != ALPM_SIG_USE_DEFAULT) {
|
||||||
RET_ERR(handle, ALPM_ERR_MISSING_CAPABILITY_SIGNATURES, -1);
|
RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
@@ -919,15 +871,8 @@ int SYMEXPORT alpm_option_set_disable_dl_timeout(alpm_handle_t *handle,
|
|||||||
unsigned short disable_dl_timeout)
|
unsigned short disable_dl_timeout)
|
||||||
{
|
{
|
||||||
CHECK_HANDLE(handle, return -1);
|
CHECK_HANDLE(handle, return -1);
|
||||||
|
#ifdef HAVE_LIBCURL
|
||||||
handle->disable_dl_timeout = disable_dl_timeout;
|
handle->disable_dl_timeout = disable_dl_timeout;
|
||||||
return 0;
|
#endif
|
||||||
}
|
|
||||||
|
|
||||||
int SYMEXPORT alpm_option_set_parallel_downloads(alpm_handle_t *handle,
|
|
||||||
unsigned int num_streams)
|
|
||||||
{
|
|
||||||
CHECK_HANDLE(handle, return -1);
|
|
||||||
ASSERT(num_streams >= 1, RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1));
|
|
||||||
handle->parallel_downloads = num_streams;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* handle.h
|
* handle.h
|
||||||
*
|
*
|
||||||
* Copyright (c) 2006-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
@@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#include "alpm_list.h"
|
#include "alpm_list.h"
|
||||||
#include "alpm.h"
|
#include "alpm.h"
|
||||||
#include "trans.h"
|
|
||||||
|
|
||||||
#ifdef HAVE_LIBCURL
|
#ifdef HAVE_LIBCURL
|
||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
@@ -35,23 +34,23 @@
|
|||||||
#define EVENT(h, e) \
|
#define EVENT(h, e) \
|
||||||
do { \
|
do { \
|
||||||
if((h)->eventcb) { \
|
if((h)->eventcb) { \
|
||||||
(h)->eventcb((h)->eventcb_ctx, (alpm_event_t *) (e)); \
|
(h)->eventcb((alpm_event_t *) (e)); \
|
||||||
} \
|
} \
|
||||||
} while(0)
|
} while(0)
|
||||||
#define QUESTION(h, q) \
|
#define QUESTION(h, q) \
|
||||||
do { \
|
do { \
|
||||||
if((h)->questioncb) { \
|
if((h)->questioncb) { \
|
||||||
(h)->questioncb((h)->questioncb_ctx, (alpm_question_t *) (q)); \
|
(h)->questioncb((alpm_question_t *) (q)); \
|
||||||
} \
|
} \
|
||||||
} while(0)
|
} while(0)
|
||||||
#define PROGRESS(h, e, p, per, n, r) \
|
#define PROGRESS(h, e, p, per, n, r) \
|
||||||
do { \
|
do { \
|
||||||
if((h)->progresscb) { \
|
if((h)->progresscb) { \
|
||||||
(h)->progresscb((h)->progresscb_ctx, e, p, per, n, r); \
|
(h)->progresscb(e, p, per, n, r); \
|
||||||
} \
|
} \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
struct _alpm_handle_t {
|
struct __alpm_handle_t {
|
||||||
/* internal usage */
|
/* internal usage */
|
||||||
alpm_db_t *db_local; /* local db pointer */
|
alpm_db_t *db_local; /* local db pointer */
|
||||||
alpm_list_t *dbs_sync; /* List of (alpm_db_t *) */
|
alpm_list_t *dbs_sync; /* List of (alpm_db_t *) */
|
||||||
@@ -60,12 +59,9 @@ struct _alpm_handle_t {
|
|||||||
|
|
||||||
#ifdef HAVE_LIBCURL
|
#ifdef HAVE_LIBCURL
|
||||||
/* libcurl handle */
|
/* libcurl handle */
|
||||||
CURLM *curlm;
|
CURL *curl; /* reusable curl_easy handle */
|
||||||
alpm_list_t *server_errors;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
unsigned short disable_dl_timeout;
|
unsigned short disable_dl_timeout;
|
||||||
unsigned int parallel_downloads; /* number of download streams */
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_LIBGPGME
|
#ifdef HAVE_LIBGPGME
|
||||||
alpm_list_t *known_keys; /* keys verified to be in our keychain */
|
alpm_list_t *known_keys; /* keys verified to be in our keychain */
|
||||||
@@ -73,17 +69,12 @@ struct _alpm_handle_t {
|
|||||||
|
|
||||||
/* callback functions */
|
/* callback functions */
|
||||||
alpm_cb_log logcb; /* Log callback function */
|
alpm_cb_log logcb; /* Log callback function */
|
||||||
void *logcb_ctx;
|
|
||||||
alpm_cb_download dlcb; /* Download callback function */
|
alpm_cb_download dlcb; /* Download callback function */
|
||||||
void *dlcb_ctx;
|
alpm_cb_totaldl totaldlcb; /* Total download callback function */
|
||||||
alpm_cb_fetch fetchcb; /* Download file callback function */
|
alpm_cb_fetch fetchcb; /* Download file callback function */
|
||||||
void *fetchcb_ctx;
|
|
||||||
alpm_cb_event eventcb;
|
alpm_cb_event eventcb;
|
||||||
void *eventcb_ctx;
|
|
||||||
alpm_cb_question questioncb;
|
alpm_cb_question questioncb;
|
||||||
void *questioncb_ctx;
|
|
||||||
alpm_cb_progress progresscb;
|
alpm_cb_progress progresscb;
|
||||||
void *progresscb_ctx;
|
|
||||||
|
|
||||||
/* filesystem paths */
|
/* filesystem paths */
|
||||||
char *root; /* Root path, default '/' */
|
char *root; /* Root path, default '/' */
|
||||||
@@ -103,7 +94,8 @@ struct _alpm_handle_t {
|
|||||||
alpm_list_t *assumeinstalled; /* List of virtual packages used to satisfy dependencies */
|
alpm_list_t *assumeinstalled; /* List of virtual packages used to satisfy dependencies */
|
||||||
|
|
||||||
/* options */
|
/* options */
|
||||||
alpm_list_t *architectures; /* Architectures of packages we should allow */
|
char *arch; /* Architecture of packages we should allow */
|
||||||
|
double deltaratio; /* Download deltas if possible; a ratio value */
|
||||||
int usesyslog; /* Use syslog instead of logfile? */ /* TODO move to frontend */
|
int usesyslog; /* Use syslog instead of logfile? */ /* TODO move to frontend */
|
||||||
int checkspace; /* Check disk space before installing */
|
int checkspace; /* Check disk space before installing */
|
||||||
char *dbext; /* Sync DB extension */
|
char *dbext; /* Sync DB extension */
|
||||||
@@ -118,6 +110,10 @@ struct _alpm_handle_t {
|
|||||||
|
|
||||||
/* lock file descriptor */
|
/* lock file descriptor */
|
||||||
int lockfd;
|
int lockfd;
|
||||||
|
|
||||||
|
/* for delta parsing efficiency */
|
||||||
|
int delta_regex_compiled;
|
||||||
|
regex_t delta_regex;
|
||||||
};
|
};
|
||||||
|
|
||||||
alpm_handle_t *_alpm_handle_new(void);
|
alpm_handle_t *_alpm_handle_new(void);
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* hook.c
|
* hook.c
|
||||||
*
|
*
|
||||||
* Copyright (c) 2015-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2015-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -17,6 +17,7 @@
|
|||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
@@ -37,7 +38,7 @@ enum _alpm_hook_op_t {
|
|||||||
|
|
||||||
enum _alpm_trigger_type_t {
|
enum _alpm_trigger_type_t {
|
||||||
ALPM_HOOK_TYPE_PACKAGE = 1,
|
ALPM_HOOK_TYPE_PACKAGE = 1,
|
||||||
ALPM_HOOK_TYPE_PATH,
|
ALPM_HOOK_TYPE_FILE,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _alpm_trigger_t {
|
struct _alpm_trigger_t {
|
||||||
@@ -70,12 +71,23 @@ static void _alpm_trigger_free(struct _alpm_trigger_t *trigger)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void _alpm_wordsplit_free(char **ws)
|
||||||
|
{
|
||||||
|
if(ws) {
|
||||||
|
char **c;
|
||||||
|
for(c = ws; *c; c++) {
|
||||||
|
free(*c);
|
||||||
|
}
|
||||||
|
free(ws);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void _alpm_hook_free(struct _alpm_hook_t *hook)
|
static void _alpm_hook_free(struct _alpm_hook_t *hook)
|
||||||
{
|
{
|
||||||
if(hook) {
|
if(hook) {
|
||||||
free(hook->name);
|
free(hook->name);
|
||||||
free(hook->desc);
|
free(hook->desc);
|
||||||
wordsplit_free(hook->cmd);
|
_alpm_wordsplit_free(hook->cmd);
|
||||||
alpm_list_free_inner(hook->triggers, (alpm_list_fn_free) _alpm_trigger_free);
|
alpm_list_free_inner(hook->triggers, (alpm_list_fn_free) _alpm_trigger_free);
|
||||||
alpm_list_free(hook->triggers);
|
alpm_list_free(hook->triggers);
|
||||||
alpm_list_free(hook->matches);
|
alpm_list_free(hook->matches);
|
||||||
@@ -146,6 +158,107 @@ static int _alpm_hook_validate(alpm_handle_t *handle,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char **_alpm_wordsplit(char *str)
|
||||||
|
{
|
||||||
|
char *c = str, *end;
|
||||||
|
char **out = NULL, **outsave;
|
||||||
|
size_t count = 0;
|
||||||
|
|
||||||
|
if(str == NULL) {
|
||||||
|
errno = EINVAL;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(c = str; isspace(*c); c++);
|
||||||
|
while(*c) {
|
||||||
|
size_t wordlen = 0;
|
||||||
|
|
||||||
|
/* extend our array */
|
||||||
|
outsave = out;
|
||||||
|
if((out = realloc(out, (count + 1) * sizeof(char*))) == NULL) {
|
||||||
|
out = outsave;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* calculate word length and check for unbalanced quotes */
|
||||||
|
for(end = c; *end && !isspace(*end); end++) {
|
||||||
|
if(*end == '\'' || *end == '"') {
|
||||||
|
char quote = *end;
|
||||||
|
while(*(++end) && *end != quote) {
|
||||||
|
if(*end == '\\' && *(end + 1) == quote) {
|
||||||
|
end++;
|
||||||
|
}
|
||||||
|
wordlen++;
|
||||||
|
}
|
||||||
|
if(*end != quote) {
|
||||||
|
errno = EINVAL;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(*end == '\\' && (end[1] == '\'' || end[1] == '"')) {
|
||||||
|
end++; /* skip the '\\' */
|
||||||
|
}
|
||||||
|
wordlen++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(wordlen == (size_t) (end - c)) {
|
||||||
|
/* no internal quotes or escapes, copy it the easy way */
|
||||||
|
if((out[count++] = strndup(c, wordlen)) == NULL) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* manually copy to remove quotes and escapes */
|
||||||
|
char *dest = out[count++] = malloc(wordlen + 1);
|
||||||
|
if(dest == NULL) { goto error; }
|
||||||
|
while(c < end) {
|
||||||
|
if(*c == '\'' || *c == '"') {
|
||||||
|
char quote = *c;
|
||||||
|
/* we know there must be a matching end quote,
|
||||||
|
* no need to check for '\0' */
|
||||||
|
for(c++; *c != quote; c++) {
|
||||||
|
if(*c == '\\' && *(c + 1) == quote) {
|
||||||
|
c++;
|
||||||
|
}
|
||||||
|
*(dest++) = *c;
|
||||||
|
}
|
||||||
|
c++;
|
||||||
|
} else {
|
||||||
|
if(*c == '\\' && (c[1] == '\'' || c[1] == '"')) {
|
||||||
|
c++; /* skip the '\\' */
|
||||||
|
}
|
||||||
|
*(dest++) = *(c++);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*dest = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
if(*end == '\0') {
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
for(c = end + 1; isspace(*c); c++);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
outsave = out;
|
||||||
|
if((out = realloc(out, (count + 1) * sizeof(char*))) == NULL) {
|
||||||
|
out = outsave;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
out[count++] = NULL;
|
||||||
|
|
||||||
|
return out;
|
||||||
|
|
||||||
|
error:
|
||||||
|
/* can't use wordsplit_free here because NULL has not been appended */
|
||||||
|
while(count) {
|
||||||
|
free(out[--count]);
|
||||||
|
}
|
||||||
|
free(out);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static int _alpm_hook_parse_cb(const char *file, int line,
|
static int _alpm_hook_parse_cb(const char *file, int line,
|
||||||
const char *section, char *key, char *value, void *data)
|
const char *section, char *key, char *value, void *data)
|
||||||
{
|
{
|
||||||
@@ -190,11 +303,7 @@ static int _alpm_hook_parse_cb(const char *file, int line,
|
|||||||
if(strcmp(value, "Package") == 0) {
|
if(strcmp(value, "Package") == 0) {
|
||||||
t->type = ALPM_HOOK_TYPE_PACKAGE;
|
t->type = ALPM_HOOK_TYPE_PACKAGE;
|
||||||
} else if(strcmp(value, "File") == 0) {
|
} else if(strcmp(value, "File") == 0) {
|
||||||
_alpm_log(handle, ALPM_LOG_DEBUG,
|
t->type = ALPM_HOOK_TYPE_FILE;
|
||||||
"File targets are deprecated, use Path instead\n");
|
|
||||||
t->type = ALPM_HOOK_TYPE_PATH;
|
|
||||||
} else if(strcmp(value, "Path") == 0) {
|
|
||||||
t->type = ALPM_HOOK_TYPE_PATH;
|
|
||||||
} else {
|
} else {
|
||||||
error(_("hook %s line %d: invalid value %s\n"), file, line, value);
|
error(_("hook %s line %d: invalid value %s\n"), file, line, value);
|
||||||
}
|
}
|
||||||
@@ -234,9 +343,9 @@ static int _alpm_hook_parse_cb(const char *file, int line,
|
|||||||
} else if(strcmp(key, "Exec") == 0) {
|
} else if(strcmp(key, "Exec") == 0) {
|
||||||
if(hook->cmd != NULL) {
|
if(hook->cmd != NULL) {
|
||||||
warning(_("hook %s line %d: overwriting previous definition of %s\n"), file, line, "Exec");
|
warning(_("hook %s line %d: overwriting previous definition of %s\n"), file, line, "Exec");
|
||||||
wordsplit_free(hook->cmd);
|
_alpm_wordsplit_free(hook->cmd);
|
||||||
}
|
}
|
||||||
if((hook->cmd = wordsplit(value)) == NULL) {
|
if((hook->cmd = _alpm_wordsplit(value)) == NULL) {
|
||||||
if(errno == EINVAL) {
|
if(errno == EINVAL) {
|
||||||
error(_("hook %s line %d: invalid value %s\n"), file, line, value);
|
error(_("hook %s line %d: invalid value %s\n"), file, line, value);
|
||||||
} else {
|
} else {
|
||||||
@@ -442,16 +551,7 @@ static int _alpm_hook_triggered(alpm_handle_t *handle, struct _alpm_hook_t *hook
|
|||||||
|
|
||||||
static int _alpm_hook_cmp(struct _alpm_hook_t *h1, struct _alpm_hook_t *h2)
|
static int _alpm_hook_cmp(struct _alpm_hook_t *h1, struct _alpm_hook_t *h2)
|
||||||
{
|
{
|
||||||
size_t suflen = strlen(ALPM_HOOK_SUFFIX), l1, l2;
|
return strcmp(h1->name, h2->name);
|
||||||
int ret;
|
|
||||||
l1 = strlen(h1->name) - suflen;
|
|
||||||
l2 = strlen(h2->name) - suflen;
|
|
||||||
/* exclude the suffixes from comparison */
|
|
||||||
ret = strncmp(h1->name, h2->name, l1 <= l2 ? l1 : l2);
|
|
||||||
if(ret == 0 && l1 != l2) {
|
|
||||||
return l1 < l2 ? -1 : 1;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static alpm_list_t *find_hook(alpm_list_t *haystack, const void *needle)
|
static alpm_list_t *find_hook(alpm_list_t *haystack, const void *needle)
|
||||||
@@ -534,7 +634,8 @@ int _alpm_hook_run(alpm_handle_t *handle, alpm_hook_when_t when)
|
|||||||
alpm_event_hook_t event = { .when = when };
|
alpm_event_hook_t event = { .when = when };
|
||||||
alpm_event_hook_run_t hook_event;
|
alpm_event_hook_run_t hook_event;
|
||||||
alpm_list_t *i, *hooks = NULL, *hooks_triggered = NULL;
|
alpm_list_t *i, *hooks = NULL, *hooks_triggered = NULL;
|
||||||
size_t suflen = strlen(ALPM_HOOK_SUFFIX), triggered = 0;
|
const char *suffix = ".hook";
|
||||||
|
size_t suflen = strlen(suffix), triggered = 0;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
for(i = alpm_list_last(handle->hookdirs); i; i = alpm_list_previous(i)) {
|
for(i = alpm_list_last(handle->hookdirs); i; i = alpm_list_previous(i)) {
|
||||||
@@ -580,7 +681,7 @@ int _alpm_hook_run(alpm_handle_t *handle, alpm_hook_when_t when)
|
|||||||
memcpy(path + dirlen, entry->d_name, name_len + 1);
|
memcpy(path + dirlen, entry->d_name, name_len + 1);
|
||||||
|
|
||||||
if(name_len < suflen
|
if(name_len < suflen
|
||||||
|| strcmp(entry->d_name + name_len - suflen, ALPM_HOOK_SUFFIX) != 0) {
|
|| strcmp(entry->d_name + name_len - suflen, suffix) != 0) {
|
||||||
_alpm_log(handle, ALPM_LOG_DEBUG, "skipping non-hook file %s\n", path);
|
_alpm_log(handle, ALPM_LOG_DEBUG, "skipping non-hook file %s\n", path);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* hook.h
|
* hook.h
|
||||||
*
|
*
|
||||||
* Copyright (c) 2015-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2015-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -22,8 +22,6 @@
|
|||||||
|
|
||||||
#include "alpm.h"
|
#include "alpm.h"
|
||||||
|
|
||||||
#define ALPM_HOOK_SUFFIX ".hook"
|
|
||||||
|
|
||||||
int _alpm_hook_run(alpm_handle_t *handle, alpm_hook_when_t when);
|
int _alpm_hook_run(alpm_handle_t *handle, alpm_hook_when_t when);
|
||||||
|
|
||||||
#endif /* ALPM_HOOK_H */
|
#endif /* ALPM_HOOK_H */
|
||||||
|
|||||||
1
lib/libalpm/ini.c
Symbolic link
1
lib/libalpm/ini.c
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../../src/common/ini.c
|
||||||
1
lib/libalpm/ini.h
Symbolic link
1
lib/libalpm/ini.h
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../../src/common/ini.h
|
||||||
13
lib/libalpm/libalpm.pc.in
Normal file
13
lib/libalpm/libalpm.pc.in
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
prefix=@prefix@
|
||||||
|
exec_prefix=@exec_prefix@
|
||||||
|
libdir=@libdir@
|
||||||
|
includedir=@includedir@
|
||||||
|
|
||||||
|
Name: libalpm
|
||||||
|
Description: Arch Linux package management library
|
||||||
|
URL: http://www.archlinux.org/pacman/
|
||||||
|
Version: @LIB_VERSION@
|
||||||
|
Requires.private: libarchive @pc_crypto@ @pc_libcurl@
|
||||||
|
Cflags: -I${includedir} @LFS_CFLAGS@
|
||||||
|
Libs: -L${libdir} -lalpm
|
||||||
|
Libs.private: @LIBS@ @GPGME_LIBS@
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
/*
|
/*
|
||||||
* libarchive-compat.h
|
* libarchive-compat.h
|
||||||
*
|
*
|
||||||
* Copyright (c) 2013-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2013-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -24,28 +24,48 @@
|
|||||||
|
|
||||||
static inline int _alpm_archive_read_free(struct archive *archive)
|
static inline int _alpm_archive_read_free(struct archive *archive)
|
||||||
{
|
{
|
||||||
|
#if ARCHIVE_VERSION_NUMBER >= 3000000
|
||||||
return archive_read_free(archive);
|
return archive_read_free(archive);
|
||||||
|
#else
|
||||||
|
return archive_read_finish(archive);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int64_t _alpm_archive_compressed_ftell(struct archive *archive)
|
static inline int64_t _alpm_archive_compressed_ftell(struct archive *archive)
|
||||||
{
|
{
|
||||||
|
#if ARCHIVE_VERSION_NUMBER >= 3000000
|
||||||
return archive_filter_bytes(archive, -1);
|
return archive_filter_bytes(archive, -1);
|
||||||
|
#else
|
||||||
|
return archive_position_compressed(archive);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int _alpm_archive_read_open_file(struct archive *archive,
|
static inline int _alpm_archive_read_open_file(struct archive *archive,
|
||||||
const char *filename, size_t block_size)
|
const char *filename, size_t block_size)
|
||||||
{
|
{
|
||||||
|
#if ARCHIVE_VERSION_NUMBER >= 3000000
|
||||||
return archive_read_open_filename(archive, filename, block_size);
|
return archive_read_open_filename(archive, filename, block_size);
|
||||||
|
#else
|
||||||
|
return archive_read_open_file(archive, filename, block_size);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int _alpm_archive_filter_code(struct archive *archive)
|
static inline int _alpm_archive_filter_code(struct archive *archive)
|
||||||
{
|
{
|
||||||
|
#if ARCHIVE_VERSION_NUMBER >= 3000000
|
||||||
return archive_filter_code(archive, 0);
|
return archive_filter_code(archive, 0);
|
||||||
|
#else
|
||||||
|
return archive_compression(archive);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int _alpm_archive_read_support_filter_all(struct archive *archive)
|
static inline int _alpm_archive_read_support_filter_all(struct archive *archive)
|
||||||
{
|
{
|
||||||
|
#if ARCHIVE_VERSION_NUMBER >= 3000000
|
||||||
return archive_read_support_filter_all(archive);
|
return archive_read_support_filter_all(archive);
|
||||||
|
#else
|
||||||
|
return archive_read_support_compression_all(archive);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* LIBARCHIVE_COMPAT_H */
|
#endif /* LIBARCHIVE_COMPAT_H */
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* log.c
|
* log.c
|
||||||
*
|
*
|
||||||
* Copyright (c) 2006-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
@@ -22,7 +22,6 @@
|
|||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <syslog.h>
|
#include <syslog.h>
|
||||||
#include <time.h>
|
|
||||||
|
|
||||||
/* libalpm */
|
/* libalpm */
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
@@ -30,18 +29,28 @@
|
|||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "alpm.h"
|
#include "alpm.h"
|
||||||
|
|
||||||
|
/** \addtogroup alpm_log Logging Functions
|
||||||
|
* @brief Functions to log using libalpm
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
static int _alpm_log_leader(FILE *f, const char *prefix)
|
static int _alpm_log_leader(FILE *f, const char *prefix)
|
||||||
{
|
{
|
||||||
time_t t = time(NULL);
|
time_t t = time(NULL);
|
||||||
struct tm *tm = localtime(&t);
|
struct tm *tm = localtime(&t);
|
||||||
int length = 32;
|
|
||||||
char timestamp[length];
|
|
||||||
|
|
||||||
/* Use ISO-8601 date format */
|
/* Use ISO-8601 date format */
|
||||||
strftime(timestamp,length,"%FT%T%z", tm);
|
return fprintf(f, "[%04d-%02d-%02d %02d:%02d] [%s] ",
|
||||||
return fprintf(f, "[%s] [%s] ", timestamp, prefix);
|
tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
|
||||||
|
tm->tm_hour, tm->tm_min, prefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** A printf-like function for logging.
|
||||||
|
* @param handle the context handle
|
||||||
|
* @param prefix caller-specific prefix for the log
|
||||||
|
* @param fmt output format
|
||||||
|
* @return 0 on success, -1 on error (pm_errno is set accordingly)
|
||||||
|
*/
|
||||||
int SYMEXPORT alpm_logaction(alpm_handle_t *handle, const char *prefix,
|
int SYMEXPORT alpm_logaction(alpm_handle_t *handle, const char *prefix,
|
||||||
const char *fmt, ...)
|
const char *fmt, ...)
|
||||||
{
|
{
|
||||||
@@ -98,6 +107,8 @@ int SYMEXPORT alpm_logaction(alpm_handle_t *handle, const char *prefix,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
void _alpm_log(alpm_handle_t *handle, alpm_loglevel_t flag, const char *fmt, ...)
|
void _alpm_log(alpm_handle_t *handle, alpm_loglevel_t flag, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list args;
|
va_list args;
|
||||||
@@ -107,6 +118,6 @@ void _alpm_log(alpm_handle_t *handle, alpm_loglevel_t flag, const char *fmt, ...
|
|||||||
}
|
}
|
||||||
|
|
||||||
va_start(args, fmt);
|
va_start(args, fmt);
|
||||||
handle->logcb(handle->logcb_ctx, flag, fmt, args);
|
handle->logcb(flag, fmt, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* log.h
|
* log.h
|
||||||
*
|
*
|
||||||
* Copyright (c) 2006-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -1,32 +0,0 @@
|
|||||||
libalpm_sources = files('''
|
|
||||||
add.h add.c
|
|
||||||
alpm.h alpm.c
|
|
||||||
alpm_list.h alpm_list.c
|
|
||||||
backup.h backup.c
|
|
||||||
base64.h base64.c
|
|
||||||
be_local.c
|
|
||||||
be_package.c
|
|
||||||
be_sync.c
|
|
||||||
conflict.h conflict.c
|
|
||||||
db.h db.c
|
|
||||||
deps.h deps.c
|
|
||||||
diskspace.h diskspace.c
|
|
||||||
dload.h dload.c
|
|
||||||
error.c
|
|
||||||
filelist.h filelist.c
|
|
||||||
graph.h graph.c
|
|
||||||
group.h group.c
|
|
||||||
handle.h handle.c
|
|
||||||
hook.h hook.c
|
|
||||||
libarchive-compat.h
|
|
||||||
log.h log.c
|
|
||||||
package.h package.c
|
|
||||||
pkghash.h pkghash.c
|
|
||||||
rawstr.c
|
|
||||||
remove.h remove.c
|
|
||||||
signing.c signing.h
|
|
||||||
sync.h sync.c
|
|
||||||
trans.h trans.c
|
|
||||||
util.h util.c
|
|
||||||
version.c
|
|
||||||
'''.split())
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* package.c
|
* package.c
|
||||||
*
|
*
|
||||||
* Copyright (c) 2006-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||||
* Copyright (c) 2005 by Aurelien Foret <orelien@chez.com>
|
* Copyright (c) 2005 by Aurelien Foret <orelien@chez.com>
|
||||||
* Copyright (c) 2005, 2006 by Christian Hamar <krics@linuxforum.hu>
|
* Copyright (c) 2005, 2006 by Christian Hamar <krics@linuxforum.hu>
|
||||||
@@ -21,7 +21,6 @@
|
|||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <limits.h>
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
@@ -32,9 +31,16 @@
|
|||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "db.h"
|
#include "db.h"
|
||||||
|
#include "delta.h"
|
||||||
#include "handle.h"
|
#include "handle.h"
|
||||||
#include "deps.h"
|
#include "deps.h"
|
||||||
|
|
||||||
|
/** \addtogroup alpm_packages Package Functions
|
||||||
|
* @brief Functions to manipulate libalpm packages
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Free a package. */
|
||||||
int SYMEXPORT alpm_pkg_free(alpm_pkg_t *pkg)
|
int SYMEXPORT alpm_pkg_free(alpm_pkg_t *pkg)
|
||||||
{
|
{
|
||||||
ASSERT(pkg != NULL, return -1);
|
ASSERT(pkg != NULL, return -1);
|
||||||
@@ -47,6 +53,7 @@ int SYMEXPORT alpm_pkg_free(alpm_pkg_t *pkg)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Check the integrity (with md5) of a package from the sync cache. */
|
||||||
int SYMEXPORT alpm_pkg_checkmd5sum(alpm_pkg_t *pkg)
|
int SYMEXPORT alpm_pkg_checkmd5sum(alpm_pkg_t *pkg)
|
||||||
{
|
{
|
||||||
char *fpath;
|
char *fpath;
|
||||||
@@ -99,7 +106,6 @@ static alpm_list_t *_pkg_get_provides(alpm_pkg_t *pkg) { return pkg->provides;
|
|||||||
static alpm_list_t *_pkg_get_replaces(alpm_pkg_t *pkg) { return pkg->replaces; }
|
static alpm_list_t *_pkg_get_replaces(alpm_pkg_t *pkg) { return pkg->replaces; }
|
||||||
static alpm_filelist_t *_pkg_get_files(alpm_pkg_t *pkg) { return &(pkg->files); }
|
static alpm_filelist_t *_pkg_get_files(alpm_pkg_t *pkg) { return &(pkg->files); }
|
||||||
static alpm_list_t *_pkg_get_backup(alpm_pkg_t *pkg) { return pkg->backup; }
|
static alpm_list_t *_pkg_get_backup(alpm_pkg_t *pkg) { return pkg->backup; }
|
||||||
static alpm_list_t *_pkg_get_xdata(alpm_pkg_t *pkg) { return pkg->xdata; }
|
|
||||||
|
|
||||||
static void *_pkg_changelog_open(alpm_pkg_t UNUSED *pkg)
|
static void *_pkg_changelog_open(alpm_pkg_t UNUSED *pkg)
|
||||||
{
|
{
|
||||||
@@ -140,7 +146,7 @@ static int _pkg_force_load(alpm_pkg_t UNUSED *pkg) { return 0; }
|
|||||||
/** The standard package operations struct. Get fields directly from the
|
/** The standard package operations struct. Get fields directly from the
|
||||||
* struct itself with no abstraction layer or any type of lazy loading.
|
* struct itself with no abstraction layer or any type of lazy loading.
|
||||||
*/
|
*/
|
||||||
const struct pkg_operations default_pkg_ops = {
|
struct pkg_operations default_pkg_ops = {
|
||||||
.get_base = _pkg_get_base,
|
.get_base = _pkg_get_base,
|
||||||
.get_desc = _pkg_get_desc,
|
.get_desc = _pkg_get_desc,
|
||||||
.get_url = _pkg_get_url,
|
.get_url = _pkg_get_url,
|
||||||
@@ -164,7 +170,6 @@ const struct pkg_operations default_pkg_ops = {
|
|||||||
.get_replaces = _pkg_get_replaces,
|
.get_replaces = _pkg_get_replaces,
|
||||||
.get_files = _pkg_get_files,
|
.get_files = _pkg_get_files,
|
||||||
.get_backup = _pkg_get_backup,
|
.get_backup = _pkg_get_backup,
|
||||||
.get_xdata = _pkg_get_xdata,
|
|
||||||
|
|
||||||
.changelog_open = _pkg_changelog_open,
|
.changelog_open = _pkg_changelog_open,
|
||||||
.changelog_read = _pkg_changelog_read,
|
.changelog_read = _pkg_changelog_read,
|
||||||
@@ -194,12 +199,6 @@ const char SYMEXPORT *alpm_pkg_get_base(alpm_pkg_t *pkg)
|
|||||||
return pkg->ops->get_base(pkg);
|
return pkg->ops->get_base(pkg);
|
||||||
}
|
}
|
||||||
|
|
||||||
alpm_handle_t SYMEXPORT *alpm_pkg_get_handle(alpm_pkg_t *pkg)
|
|
||||||
{
|
|
||||||
ASSERT(pkg != NULL, return NULL);
|
|
||||||
return pkg->handle;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char SYMEXPORT *alpm_pkg_get_name(alpm_pkg_t *pkg)
|
const char SYMEXPORT *alpm_pkg_get_name(alpm_pkg_t *pkg)
|
||||||
{
|
{
|
||||||
ASSERT(pkg != NULL, return NULL);
|
ASSERT(pkg != NULL, return NULL);
|
||||||
@@ -277,44 +276,6 @@ const char SYMEXPORT *alpm_pkg_get_base64_sig(alpm_pkg_t *pkg)
|
|||||||
return pkg->base64_sig;
|
return pkg->base64_sig;
|
||||||
}
|
}
|
||||||
|
|
||||||
int SYMEXPORT alpm_pkg_get_sig(alpm_pkg_t *pkg, unsigned char **sig, size_t *sig_len)
|
|
||||||
{
|
|
||||||
ASSERT(pkg != NULL, return -1);
|
|
||||||
|
|
||||||
if(pkg->base64_sig) {
|
|
||||||
int ret = alpm_decode_signature(pkg->base64_sig, sig, sig_len);
|
|
||||||
if(ret != 0) {
|
|
||||||
RET_ERR(pkg->handle, ALPM_ERR_SIG_INVALID, -1);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
char *pkgpath = NULL, *sigpath = NULL;
|
|
||||||
alpm_errno_t err;
|
|
||||||
int ret = -1;
|
|
||||||
|
|
||||||
pkgpath = _alpm_filecache_find(pkg->handle, pkg->filename);
|
|
||||||
if(!pkgpath) {
|
|
||||||
GOTO_ERR(pkg->handle, ALPM_ERR_PKG_NOT_FOUND, cleanup);
|
|
||||||
}
|
|
||||||
sigpath = _alpm_sigpath(pkg->handle, pkgpath);
|
|
||||||
if(!sigpath || _alpm_access(pkg->handle, NULL, sigpath, R_OK)) {
|
|
||||||
GOTO_ERR(pkg->handle, ALPM_ERR_SIG_MISSING, cleanup);
|
|
||||||
}
|
|
||||||
err = _alpm_read_file(sigpath, sig, sig_len);
|
|
||||||
if(err == ALPM_ERR_OK) {
|
|
||||||
_alpm_log(pkg->handle, ALPM_LOG_DEBUG, "found detached signature %s with size %ld\n",
|
|
||||||
sigpath, *sig_len);
|
|
||||||
} else {
|
|
||||||
GOTO_ERR(pkg->handle, err, cleanup);
|
|
||||||
}
|
|
||||||
ret = 0;
|
|
||||||
cleanup:
|
|
||||||
FREE(pkgpath);
|
|
||||||
FREE(sigpath);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const char SYMEXPORT *alpm_pkg_get_arch(alpm_pkg_t *pkg)
|
const char SYMEXPORT *alpm_pkg_get_arch(alpm_pkg_t *pkg)
|
||||||
{
|
{
|
||||||
ASSERT(pkg != NULL, return NULL);
|
ASSERT(pkg != NULL, return NULL);
|
||||||
@@ -413,6 +374,13 @@ alpm_list_t SYMEXPORT *alpm_pkg_get_replaces(alpm_pkg_t *pkg)
|
|||||||
return pkg->ops->get_replaces(pkg);
|
return pkg->ops->get_replaces(pkg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
alpm_list_t SYMEXPORT *alpm_pkg_get_deltas(alpm_pkg_t *pkg)
|
||||||
|
{
|
||||||
|
ASSERT(pkg != NULL, return NULL);
|
||||||
|
pkg->handle->pm_errno = ALPM_ERR_OK;
|
||||||
|
return pkg->deltas;
|
||||||
|
}
|
||||||
|
|
||||||
alpm_filelist_t SYMEXPORT *alpm_pkg_get_files(alpm_pkg_t *pkg)
|
alpm_filelist_t SYMEXPORT *alpm_pkg_get_files(alpm_pkg_t *pkg)
|
||||||
{
|
{
|
||||||
ASSERT(pkg != NULL, return NULL);
|
ASSERT(pkg != NULL, return NULL);
|
||||||
@@ -437,6 +405,7 @@ alpm_db_t SYMEXPORT *alpm_pkg_get_db(alpm_pkg_t *pkg)
|
|||||||
return pkg->origin_data.db;
|
return pkg->origin_data.db;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Open a package changelog for reading. */
|
||||||
void SYMEXPORT *alpm_pkg_changelog_open(alpm_pkg_t *pkg)
|
void SYMEXPORT *alpm_pkg_changelog_open(alpm_pkg_t *pkg)
|
||||||
{
|
{
|
||||||
ASSERT(pkg != NULL, return NULL);
|
ASSERT(pkg != NULL, return NULL);
|
||||||
@@ -444,6 +413,7 @@ void SYMEXPORT *alpm_pkg_changelog_open(alpm_pkg_t *pkg)
|
|||||||
return pkg->ops->changelog_open(pkg);
|
return pkg->ops->changelog_open(pkg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Read data from an open changelog 'file stream'. */
|
||||||
size_t SYMEXPORT alpm_pkg_changelog_read(void *ptr, size_t size,
|
size_t SYMEXPORT alpm_pkg_changelog_read(void *ptr, size_t size,
|
||||||
const alpm_pkg_t *pkg, void *fp)
|
const alpm_pkg_t *pkg, void *fp)
|
||||||
{
|
{
|
||||||
@@ -452,6 +422,7 @@ size_t SYMEXPORT alpm_pkg_changelog_read(void *ptr, size_t size,
|
|||||||
return pkg->ops->changelog_read(ptr, size, pkg, fp);
|
return pkg->ops->changelog_read(ptr, size, pkg, fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Close a package changelog for reading. */
|
||||||
int SYMEXPORT alpm_pkg_changelog_close(const alpm_pkg_t *pkg, void *fp)
|
int SYMEXPORT alpm_pkg_changelog_close(const alpm_pkg_t *pkg, void *fp)
|
||||||
{
|
{
|
||||||
ASSERT(pkg != NULL, return -1);
|
ASSERT(pkg != NULL, return -1);
|
||||||
@@ -459,6 +430,7 @@ int SYMEXPORT alpm_pkg_changelog_close(const alpm_pkg_t *pkg, void *fp)
|
|||||||
return pkg->ops->changelog_close(pkg, fp);
|
return pkg->ops->changelog_close(pkg, fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Open a package mtree file for reading. */
|
||||||
struct archive SYMEXPORT *alpm_pkg_mtree_open(alpm_pkg_t * pkg)
|
struct archive SYMEXPORT *alpm_pkg_mtree_open(alpm_pkg_t * pkg)
|
||||||
{
|
{
|
||||||
ASSERT(pkg != NULL, return NULL);
|
ASSERT(pkg != NULL, return NULL);
|
||||||
@@ -466,6 +438,7 @@ struct archive SYMEXPORT *alpm_pkg_mtree_open(alpm_pkg_t * pkg)
|
|||||||
return pkg->ops->mtree_open(pkg);
|
return pkg->ops->mtree_open(pkg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Read entry from an open mtree file. */
|
||||||
int SYMEXPORT alpm_pkg_mtree_next(const alpm_pkg_t * pkg, struct archive *archive,
|
int SYMEXPORT alpm_pkg_mtree_next(const alpm_pkg_t * pkg, struct archive *archive,
|
||||||
struct archive_entry **entry)
|
struct archive_entry **entry)
|
||||||
{
|
{
|
||||||
@@ -474,6 +447,7 @@ int SYMEXPORT alpm_pkg_mtree_next(const alpm_pkg_t * pkg, struct archive *archiv
|
|||||||
return pkg->ops->mtree_next(pkg, archive, entry);
|
return pkg->ops->mtree_next(pkg, archive, entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Close a package mtree file for reading. */
|
||||||
int SYMEXPORT alpm_pkg_mtree_close(const alpm_pkg_t * pkg, struct archive *archive)
|
int SYMEXPORT alpm_pkg_mtree_close(const alpm_pkg_t * pkg, struct archive *archive)
|
||||||
{
|
{
|
||||||
ASSERT(pkg != NULL, return -1);
|
ASSERT(pkg != NULL, return -1);
|
||||||
@@ -488,13 +462,6 @@ int SYMEXPORT alpm_pkg_has_scriptlet(alpm_pkg_t *pkg)
|
|||||||
return pkg->ops->has_scriptlet(pkg);
|
return pkg->ops->has_scriptlet(pkg);
|
||||||
}
|
}
|
||||||
|
|
||||||
alpm_list_t SYMEXPORT *alpm_pkg_get_xdata(alpm_pkg_t *pkg)
|
|
||||||
{
|
|
||||||
ASSERT(pkg != NULL, return NULL);
|
|
||||||
pkg->handle->pm_errno = ALPM_ERR_OK;
|
|
||||||
return pkg->ops->get_xdata(pkg);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void find_requiredby(alpm_pkg_t *pkg, alpm_db_t *db, alpm_list_t **reqs,
|
static void find_requiredby(alpm_pkg_t *pkg, alpm_db_t *db, alpm_list_t **reqs,
|
||||||
int optional)
|
int optional)
|
||||||
{
|
{
|
||||||
@@ -551,16 +518,21 @@ static alpm_list_t *compute_requiredby(alpm_pkg_t *pkg, int optional)
|
|||||||
return reqs;
|
return reqs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Compute the packages requiring a given package. */
|
||||||
alpm_list_t SYMEXPORT *alpm_pkg_compute_requiredby(alpm_pkg_t *pkg)
|
alpm_list_t SYMEXPORT *alpm_pkg_compute_requiredby(alpm_pkg_t *pkg)
|
||||||
{
|
{
|
||||||
return compute_requiredby(pkg, 0);
|
return compute_requiredby(pkg, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Compute the packages optionally requiring a given package. */
|
||||||
alpm_list_t SYMEXPORT *alpm_pkg_compute_optionalfor(alpm_pkg_t *pkg)
|
alpm_list_t SYMEXPORT *alpm_pkg_compute_optionalfor(alpm_pkg_t *pkg)
|
||||||
{
|
{
|
||||||
return compute_requiredby(pkg, 1);
|
return compute_requiredby(pkg, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
alpm_file_t *_alpm_file_copy(alpm_file_t *dest,
|
alpm_file_t *_alpm_file_copy(alpm_file_t *dest,
|
||||||
const alpm_file_t *src)
|
const alpm_file_t *src)
|
||||||
{
|
{
|
||||||
@@ -648,6 +620,9 @@ int _alpm_pkg_dup(alpm_pkg_t *pkg, alpm_pkg_t **new_ptr)
|
|||||||
newpkg->optdepends = list_depdup(pkg->optdepends);
|
newpkg->optdepends = list_depdup(pkg->optdepends);
|
||||||
newpkg->conflicts = list_depdup(pkg->conflicts);
|
newpkg->conflicts = list_depdup(pkg->conflicts);
|
||||||
newpkg->provides = list_depdup(pkg->provides);
|
newpkg->provides = list_depdup(pkg->provides);
|
||||||
|
for(i = pkg->deltas; i; i = i->next) {
|
||||||
|
newpkg->deltas = alpm_list_add(newpkg->deltas, _alpm_delta_dup(i->data));
|
||||||
|
}
|
||||||
|
|
||||||
if(pkg->files.count) {
|
if(pkg->files.count) {
|
||||||
size_t filenum;
|
size_t filenum;
|
||||||
@@ -687,30 +662,6 @@ static void free_deplist(alpm_list_t *deps)
|
|||||||
alpm_list_free(deps);
|
alpm_list_free(deps);
|
||||||
}
|
}
|
||||||
|
|
||||||
alpm_pkg_xdata_t *_alpm_pkg_parse_xdata(const char *string)
|
|
||||||
{
|
|
||||||
alpm_pkg_xdata_t *pd;
|
|
||||||
const char *sep;
|
|
||||||
if(string == NULL || (sep = strchr(string, '=')) == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALLOC(pd, 1, sizeof(alpm_pkg_xdata_t), return NULL);
|
|
||||||
STRNDUP(pd->name, string, sep - string, FREE(pd); return NULL);
|
|
||||||
STRDUP(pd->value, sep + 1, FREE(pd->name); FREE(pd); return NULL);
|
|
||||||
|
|
||||||
return pd;
|
|
||||||
}
|
|
||||||
|
|
||||||
void _alpm_pkg_xdata_free(alpm_pkg_xdata_t *pd)
|
|
||||||
{
|
|
||||||
if(pd) {
|
|
||||||
free(pd->name);
|
|
||||||
free(pd->value);
|
|
||||||
free(pd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void _alpm_pkg_free(alpm_pkg_t *pkg)
|
void _alpm_pkg_free(alpm_pkg_t *pkg)
|
||||||
{
|
{
|
||||||
if(pkg == NULL) {
|
if(pkg == NULL) {
|
||||||
@@ -741,14 +692,13 @@ void _alpm_pkg_free(alpm_pkg_t *pkg)
|
|||||||
}
|
}
|
||||||
alpm_list_free_inner(pkg->backup, (alpm_list_fn_free)_alpm_backup_free);
|
alpm_list_free_inner(pkg->backup, (alpm_list_fn_free)_alpm_backup_free);
|
||||||
alpm_list_free(pkg->backup);
|
alpm_list_free(pkg->backup);
|
||||||
alpm_list_free_inner(pkg->xdata, (alpm_list_fn_free)_alpm_pkg_xdata_free);
|
|
||||||
alpm_list_free(pkg->xdata);
|
|
||||||
free_deplist(pkg->depends);
|
free_deplist(pkg->depends);
|
||||||
free_deplist(pkg->optdepends);
|
free_deplist(pkg->optdepends);
|
||||||
free_deplist(pkg->checkdepends);
|
|
||||||
free_deplist(pkg->makedepends);
|
|
||||||
free_deplist(pkg->conflicts);
|
free_deplist(pkg->conflicts);
|
||||||
free_deplist(pkg->provides);
|
free_deplist(pkg->provides);
|
||||||
|
alpm_list_free_inner(pkg->deltas, (alpm_list_fn_free)_alpm_delta_free);
|
||||||
|
alpm_list_free(pkg->deltas);
|
||||||
|
alpm_list_free(pkg->delta_path);
|
||||||
alpm_list_free(pkg->removes);
|
alpm_list_free(pkg->removes);
|
||||||
_alpm_pkg_free(pkg->oldpkg);
|
_alpm_pkg_free(pkg->oldpkg);
|
||||||
|
|
||||||
@@ -826,6 +776,16 @@ alpm_pkg_t SYMEXPORT *alpm_pkg_find(alpm_list_t *haystack, const char *needle)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Test if a package should be ignored.
|
||||||
|
*
|
||||||
|
* Checks if the package is ignored via IgnorePkg, or if the package is
|
||||||
|
* in a group ignored via IgnoreGroup.
|
||||||
|
*
|
||||||
|
* @param handle the context handle
|
||||||
|
* @param pkg the package to test
|
||||||
|
*
|
||||||
|
* @return 1 if the package should be ignored, 0 otherwise
|
||||||
|
*/
|
||||||
int SYMEXPORT alpm_pkg_should_ignore(alpm_handle_t *handle, alpm_pkg_t *pkg)
|
int SYMEXPORT alpm_pkg_should_ignore(alpm_handle_t *handle, alpm_pkg_t *pkg)
|
||||||
{
|
{
|
||||||
alpm_list_t *groups = NULL;
|
alpm_list_t *groups = NULL;
|
||||||
@@ -845,58 +805,3 @@ int SYMEXPORT alpm_pkg_should_ignore(alpm_handle_t *handle, alpm_pkg_t *pkg)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check that package metadata meets our requirements */
|
|
||||||
int _alpm_pkg_check_meta(alpm_pkg_t *pkg)
|
|
||||||
{
|
|
||||||
char *c;
|
|
||||||
int error_found = 0;
|
|
||||||
|
|
||||||
#define EPKGMETA(error) do { \
|
|
||||||
error_found = -1; \
|
|
||||||
_alpm_log(pkg->handle, ALPM_LOG_ERROR, error, pkg->name, pkg->version); \
|
|
||||||
} while(0)
|
|
||||||
|
|
||||||
/* sanity check */
|
|
||||||
if(pkg->handle == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* immediate bail if package doesn't have name or version */
|
|
||||||
if(pkg->name == NULL || pkg->name[0] == '\0'
|
|
||||||
|| pkg->version == NULL || pkg->version[0] == '\0') {
|
|
||||||
_alpm_log(pkg->handle, ALPM_LOG_ERROR,
|
|
||||||
_("invalid package metadata (name or version missing)"));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(pkg->name[0] == '-' || pkg->name[0] == '.') {
|
|
||||||
EPKGMETA(_("invalid metadata for package %s-%s "
|
|
||||||
"(package name cannot start with '.' or '-')\n"));
|
|
||||||
}
|
|
||||||
if(_alpm_fnmatch(pkg->name, "[![:alnum:]+_.@-]") == 0) {
|
|
||||||
EPKGMETA(_("invalid metadata for package %s-%s "
|
|
||||||
"(package name contains invalid characters)\n"));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* multiple '-' in pkgver can cause local db entries for different packages
|
|
||||||
* to overlap (e.g. foo-1=2-3 and foo=1-2-3 both give foo-1-2-3) */
|
|
||||||
if((c = strchr(pkg->version, '-')) && (strchr(c + 1, '-'))) {
|
|
||||||
EPKGMETA(_("invalid metadata for package %s-%s "
|
|
||||||
"(package version contains invalid characters)\n"));
|
|
||||||
}
|
|
||||||
if(strchr(pkg->version, '/')) {
|
|
||||||
EPKGMETA(_("invalid metadata for package %s-%s "
|
|
||||||
"(package version contains invalid characters)\n"));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* local db entry is <pkgname>-<pkgver> */
|
|
||||||
if(strlen(pkg->name) + strlen(pkg->version) + 1 > NAME_MAX) {
|
|
||||||
EPKGMETA(_("invalid metadata for package %s-%s "
|
|
||||||
"(package name and version too long)\n"));
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef EPKGMETA
|
|
||||||
|
|
||||||
return error_found;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* package.h
|
* package.h
|
||||||
*
|
*
|
||||||
* Copyright (c) 2006-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
|
||||||
* Copyright (c) 2005 by Aurelien Foret <orelien@chez.com>
|
* Copyright (c) 2005 by Aurelien Foret <orelien@chez.com>
|
||||||
* Copyright (c) 2006 by David Kimpe <dnaku@frugalware.org>
|
* Copyright (c) 2006 by David Kimpe <dnaku@frugalware.org>
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
/** Package operations struct. This struct contains function pointers to
|
/** Package operations struct. This struct contains function pointers to
|
||||||
* all methods used to access data in a package to allow for things such
|
* all methods used to access data in a package to allow for things such
|
||||||
* as lazy package initialization (such as used by the file backend). Each
|
* as lazy package initialization (such as used by the file backend). Each
|
||||||
* backend is free to define a struct containing pointers to a specific
|
* backend is free to define a stuct containing pointers to a specific
|
||||||
* implementation of these methods. Some backends may find using the
|
* implementation of these methods. Some backends may find using the
|
||||||
* defined default_pkg_ops struct to work just fine for their needs.
|
* defined default_pkg_ops struct to work just fine for their needs.
|
||||||
*/
|
*/
|
||||||
@@ -67,8 +67,6 @@ struct pkg_operations {
|
|||||||
alpm_filelist_t *(*get_files) (alpm_pkg_t *);
|
alpm_filelist_t *(*get_files) (alpm_pkg_t *);
|
||||||
alpm_list_t *(*get_backup) (alpm_pkg_t *);
|
alpm_list_t *(*get_backup) (alpm_pkg_t *);
|
||||||
|
|
||||||
alpm_list_t *(*get_xdata) (alpm_pkg_t *);
|
|
||||||
|
|
||||||
void *(*changelog_open) (alpm_pkg_t *);
|
void *(*changelog_open) (alpm_pkg_t *);
|
||||||
size_t (*changelog_read) (void *, size_t, const alpm_pkg_t *, void *);
|
size_t (*changelog_read) (void *, size_t, const alpm_pkg_t *, void *);
|
||||||
int (*changelog_close) (const alpm_pkg_t *, void *);
|
int (*changelog_close) (const alpm_pkg_t *, void *);
|
||||||
@@ -85,9 +83,9 @@ struct pkg_operations {
|
|||||||
* The actual definition is in package.c so it can have access to the
|
* The actual definition is in package.c so it can have access to the
|
||||||
* default accessor functions which are defined there.
|
* default accessor functions which are defined there.
|
||||||
*/
|
*/
|
||||||
extern const struct pkg_operations default_pkg_ops;
|
extern struct pkg_operations default_pkg_ops;
|
||||||
|
|
||||||
struct _alpm_pkg_t {
|
struct __alpm_pkg_t {
|
||||||
unsigned long name_hash;
|
unsigned long name_hash;
|
||||||
char *filename;
|
char *filename;
|
||||||
char *base;
|
char *base;
|
||||||
@@ -120,10 +118,12 @@ struct _alpm_pkg_t {
|
|||||||
alpm_list_t *makedepends;
|
alpm_list_t *makedepends;
|
||||||
alpm_list_t *conflicts;
|
alpm_list_t *conflicts;
|
||||||
alpm_list_t *provides;
|
alpm_list_t *provides;
|
||||||
|
alpm_list_t *deltas;
|
||||||
|
alpm_list_t *delta_path;
|
||||||
alpm_list_t *removes; /* in transaction targets only */
|
alpm_list_t *removes; /* in transaction targets only */
|
||||||
alpm_pkg_t *oldpkg; /* in transaction targets only */
|
alpm_pkg_t *oldpkg; /* in transaction targets only */
|
||||||
|
|
||||||
const struct pkg_operations *ops;
|
struct pkg_operations *ops;
|
||||||
|
|
||||||
alpm_filelist_t files;
|
alpm_filelist_t files;
|
||||||
|
|
||||||
@@ -138,8 +138,6 @@ struct _alpm_pkg_t {
|
|||||||
alpm_pkgreason_t reason;
|
alpm_pkgreason_t reason;
|
||||||
int scriptlet;
|
int scriptlet;
|
||||||
|
|
||||||
alpm_list_t *xdata;
|
|
||||||
|
|
||||||
/* Bitfield from alpm_dbinfrq_t */
|
/* Bitfield from alpm_dbinfrq_t */
|
||||||
int infolevel;
|
int infolevel;
|
||||||
/* Bitfield from alpm_pkgvalidation_t */
|
/* Bitfield from alpm_pkgvalidation_t */
|
||||||
@@ -162,9 +160,4 @@ alpm_pkg_t *_alpm_pkg_load_internal(alpm_handle_t *handle,
|
|||||||
int _alpm_pkg_cmp(const void *p1, const void *p2);
|
int _alpm_pkg_cmp(const void *p1, const void *p2);
|
||||||
int _alpm_pkg_compare_versions(alpm_pkg_t *local_pkg, alpm_pkg_t *pkg);
|
int _alpm_pkg_compare_versions(alpm_pkg_t *local_pkg, alpm_pkg_t *pkg);
|
||||||
|
|
||||||
alpm_pkg_xdata_t *_alpm_pkg_parse_xdata(const char *string);
|
|
||||||
void _alpm_pkg_xdata_free(alpm_pkg_xdata_t *pd);
|
|
||||||
|
|
||||||
int _alpm_pkg_check_meta(alpm_pkg_t *pkg);
|
|
||||||
|
|
||||||
#endif /* ALPM_PACKAGE_H */
|
#endif /* ALPM_PACKAGE_H */
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* pkghash.c
|
* pkghash.c
|
||||||
*
|
*
|
||||||
* Copyright (c) 2011-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2011-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* pkghash.h
|
* pkghash.h
|
||||||
*
|
*
|
||||||
* Copyright (c) 2011-2024 Pacman Development Team <pacman-dev@lists.archlinux.org>
|
* Copyright (c) 2011-2018 Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
* A combination of a hash table and a list, allowing for fast look-up
|
* A combination of a hash table and a list, allowing for fast look-up
|
||||||
* by package name but also iteration over the packages.
|
* by package name but also iteration over the packages.
|
||||||
*/
|
*/
|
||||||
struct _alpm_pkghash_t {
|
struct __alpm_pkghash_t {
|
||||||
/** data held by the hash table */
|
/** data held by the hash table */
|
||||||
alpm_list_t **hash_table;
|
alpm_list_t **hash_table;
|
||||||
/** head node of the hash table data in normal list format */
|
/** head node of the hash table data in normal list format */
|
||||||
@@ -45,7 +45,7 @@ struct _alpm_pkghash_t {
|
|||||||
unsigned int limit;
|
unsigned int limit;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct _alpm_pkghash_t alpm_pkghash_t;
|
typedef struct __alpm_pkghash_t alpm_pkghash_t;
|
||||||
|
|
||||||
alpm_pkghash_t *_alpm_pkghash_create(unsigned int size);
|
alpm_pkghash_t *_alpm_pkghash_create(unsigned int size);
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
# Set of available languages.
|
# Set of available languages.
|
||||||
ar
|
ar
|
||||||
ast
|
ast
|
||||||
az_AZ
|
|
||||||
bg
|
bg
|
||||||
br
|
br
|
||||||
ca
|
ca
|
||||||
@@ -18,7 +17,6 @@ eu_ES
|
|||||||
fi
|
fi
|
||||||
fr
|
fr
|
||||||
gl
|
gl
|
||||||
hi
|
|
||||||
hr
|
hr
|
||||||
hu
|
hu
|
||||||
id
|
id
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ XGETTEXT_OPTIONS = \
|
|||||||
# This is the copyright holder that gets inserted into the header of the
|
# This is the copyright holder that gets inserted into the header of the
|
||||||
# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding
|
# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding
|
||||||
# package.
|
# package.
|
||||||
COPYRIGHT_HOLDER = Pacman Development Team <pacman-dev@lists.archlinux.org>
|
COPYRIGHT_HOLDER = Pacman Development Team <pacman-dev@archlinux.org>
|
||||||
|
|
||||||
# This is the email address or URL to which the translators shall report
|
# This is the email address or URL to which the translators shall report
|
||||||
# bugs in the untranslated strings.
|
# bugs in the untranslated strings.
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user