1
0
forked from mirrors/pacman

Compare commits

..

31 Commits

Author SHA1 Message Date
morganamilo
219941734a Merge branch 'morganamilo/get_handle' into morganamilo/master 2021-12-14 18:56:31 +00:00
morganamilo
fe055bec1f libalpm: add getter for handle on db and pkg
db and pkg store a pointer to the handle for internal use but don't
actually provide a way for a user to get it.

Making this accessible is more convenient for front ends and FFI
wrappers.

For example, in other languages it's common to return the error value
directly. To achieve this the python and rust wrappers also store their
own pointer to the handle inside their own pkg/db wrappers.

Exposing this would allow the wrappers to forgo the extra pointer and
just return `pkg.get_handle().last_error()`.
2021-12-06 19:55:29 +00:00
morganamilo
ee31b4c12e alpm: fix wrong access() being used
When removing files we check _alpm_access() to see if we can write
(delete) the file. If not, we check if the file exists because if the
file does not exist then we don't actually need to remove it so there's
no issue.

However the second call uses acess() instead of _alpm_access() which
does not the rootdir into account.
2021-11-07 00:25:01 +00:00
morganamilo
cde562bb4d Merge branch 'morganamilo/pactrans' into morganamilo/tip 2021-11-07 00:19:35 +00:00
morganamilo
15eb65c839 Merge branch 'morganamilo/backup' into morganamilo/tip 2021-11-06 23:46:38 +00:00
morganamilo
40f59fd6ac Merge branch 'morganamilo/email' into morganamilo/tip 2021-11-06 23:41:36 +00:00
morganamilo
3c68d11f3c Merge branch 'morganamilo/qbackup' into morganamilo/tip 2021-11-06 23:41:29 +00:00
morganamilo
2200dd8797 Merge branch 'morganamilo/notes' into morganamilo/tip 2021-11-06 23:41:15 +00:00
morganamilo
c7c280115f Merge branch 'morganamilo/noserver' into morganamilo/tip 2021-11-06 23:41:05 +00:00
morganamilo
564fd18c9a Merge branch 'morganamilo/nolockdownload' into morganamilo/tip 2021-11-06 23:40:57 +00:00
morganamilo
5c55ef2db5 Merge branch 'morganamilo/nokeep' into morganamilo/tip 2021-11-06 23:40:45 +00:00
morganamilo
de5fb9ae2f Merge branch 'morganamilo/nodownload' into morganamilo/tip 2021-11-06 23:40:34 +00:00
morganamilo
d4b4d315aa Merge branch 'morganamilo/lint' into morganamilo/tip 2021-11-06 23:39:30 +00:00
morganamilo
97d127588e Merge branch 'morganamilo/file_error' into morganamilo/tip 2021-11-06 23:39:17 +00:00
morganamilo
c301327ad5 pacman: implement universal transactions
This allows using -S, -U and -R in one command:

    pacman -S foo -R bar

To make this work some breaking changes have made.

Targets have to come after the operation:

    pacman -S foo  //works
    pacman -Syu    //works
    pacman -yuS    //works
    pacman foo -S  //doesn't work

This could be supported with some code to copy all targets before the
first operation into the first operation's target list.

And -u as a short for --unneeded has been removed as it conflicts with
--sysupgrade. However has -u/--sysupgrade is bound to -S, accidently
doing `pacman -Ru` will not accidently cause a system upgrade.

Another quirk with the ui is that -S has many non transaction related
flags, -Sc -Sg -Sl -Si. These have been split off as "sync only" flags.
Meaning they show up with `pacman -Si foo` but will be invalid on
`pacman -R bar -Si foo`.

Also when -R'ing and -S'ing the same package in come command it's
treated as a full uninstall then reinstall. The backup files are
.pacsave'd and the install reason is set to explicit. I feel like this
behavious is good. This also allows you to wipe config files which what
--nokeep was intending to solve.

Other flags just have to have the op they belong to to be used for them
to be valid.

For example:

    pacman -Rn foo //works
    pacman -S -Rn //works
    pacman -Sn    //doesn't work
    pacman -Sn -R //works

We could posibly drop these flags belonging to each operation and just
make them generic transaction flags.

Implements FS#9694
2021-11-06 23:29:07 +00:00
morganamilo
841236a1c9 pacman: improve backup printing
The current backup printing does not fit in with the rest of the info at
all. Change to be more consistant.

Old:

Backup Files    :
MODIFIED	/etc/pacman.conf
UNMODIFIED	/etc/makepkg.conf

New:

Backup Files    : /etc/pacman.conf [modified]
                  /etc/makepkg.conf [unmodified]

Signed-off-by: morganamilo <morganamilo@archlinux.org>
2021-10-23 22:50:39 +01:00
morganamilo
6ce85053c5 libalpm: allow nolock transactions when downloadonly 2021-10-23 22:19:46 +01:00
morganamilo
e877472509 makepkg: lint empty arrays
While depend arrays are already linted, many array kinds are
still not. An empty string is never a valid array value so check
all arrays for it.
2021-10-07 22:26:50 +01:00
morganamilo
2b4c022925 libalpm: add iterator interface for syncdb files
This commit adds an iterator interface for reading files from the
syncdbs. Instead of using alpm_pkg_get_files(), you now get the files
from the database using alpm_db_files_open(), you then use
alpm_db_files_next() to iterate through the files for each package. If
you want to actually load the files from that package you then use
alpm_db_files_load().

This means alpm_pkg_get_files() will always return empty for syncdbs,
even on .files databases, however these functions still work on the
localdb and loaded packages.

This aproach is faster when dumping the entire file list but slower when
searching for a specific package.

The memory usage of pacman is drastically less. See below.

build/pacman -Fl        0.55s user 0.01s system 99% cpu 0.556 total
build/pacman -Fl pacman 0.46s user 0.01s system 99% cpu 0.472 total
build/pacman -Fx pacman 2.88s user 0.09s system 99% cpu 2.965 total

pacman -Fl              1.60s user 0.13s system 99% cpu 1.731 total
pacman -Fl pacman       0.24s user 0.04s system 99% cpu 0.283 total
pacman -Fx pacman       2.45s user 0.14s system 99% cpu 2.593 total

                         Peak Memory
build/pacman -Fl         43.52MB
build/pacman -Fl pacmam  11.292MB

pacman -Fl               677.048MB
pacman -Fl pacman        163.288MB
2021-10-06 08:18:55 +01:00
morganamilo
689223f40d alpm: don't download files from local servers
This causes file:// servers to be treated as if they were cache dirs
when checking if a package needs to be downloaded/read.
2021-10-04 20:11:24 +01:00
morganamilo
8d48332069 alpm: return -1 for error in find_dl_candidates
This is the error value generally used and the calling function
explicitly checks for -1, later causing the error to be missed
and the transaction to continue.

> pacman -S xterm
warning: xterm-369-1 is up to date -- reinstalling
resolving dependencies...
looking for conflicting packages...

Package (1)  Old Version  New Version  Net Change  Download Size

extra/xterm  369-1        369-1          0.00 MiB       0.42 MiB

Total Download Size:   0.42 MiB
Total Installed Size:  1.05 MiB
Net Upgrade Size:      0.00 MiB

:: Proceed with installation? [Y/n]
error: no servers configured for repository: extra
(1/1) checking keys in keyring                                                                 [--------------------------------------------------------] 100%
(1/1) checking package integrity                                                               [--------------------------------------------------------] 100%
error: failed to commit transaction (wrong or NULL argument passed)
Errors occurred, no packages were upgraded.
2021-10-04 20:07:06 +01:00
morganamilo
a61c500557 pacman: add -Q --backup
pacman -Q -w/--backup will print the modified backup files of a system
(passing twice will print all backup files). This could be useful for
backup/moving system config files.
2021-10-02 00:12:52 +01:00
morganamilo
8fa9a69683 pactest: fix test errors being treated as success
Rules return -1 if there was an error with the rule itself. Later this
return value is passed to tap as a bool. Because -1 is a truthy value it
gets treated as success.
2021-09-27 21:46:13 +01:00
morganamilo
1340b5336e pactest: add note tests 2021-09-27 21:46:10 +01:00
morganamilo
2b1ca6c298 pacman: add --note --rmnote
This adds --note for -S -U -D and --rmnote for -D
2021-09-27 21:46:07 +01:00
morganamilo
ef05b4e31e alpm: add note support
Add support for adding a note to packages. This is intended to be set to
the user to document the reason or motive a package was installed.

Notes can be set for a transaction and only the targets of that
transaction gain the note.

Notes can also be edited for installed packages similarly to how install
reason can be set.
2021-09-27 21:46:04 +01:00
morganamilo
c7c88f880a libalpm: check filecache_find return and log errors
Some user had erros while updating their system.

:: Proceed with installation? [Y/n]
:: Retrieving packages...
checking keyring...
checking package integrity...
error: failed to commit transaction (invalid or corrupted package)
Errors occurred, no packages were upgraded.

The issue was filecache_find returning null and alpm passing that null
path to check validity. How this happened I have no idea. It may be
something to do with the user's cachedir being a network drive.

Also warn when the file exists but it is not a regular file or can not
be opened.
2021-09-27 18:30:17 +01:00
morganamilo
753083d241 Update mailing list url
change pacman-dev@archlinux.org to pacmandev@lists.archlinux.org

Most of this is copyright notices but this also fixes FS#72129 by
updating the address in docs/index.asciidoc.

---

I could also update the email in the .po files as it's a simple find and
replace but I'm not sure if that's strictly done via transifex.
2021-09-22 14:51:11 +01:00
morganamilo
36d3d8401c pacman: move --nosave to transaction flags
--nosave is now useful when installing packages as it can be combined
with --nokeep to reinstall the packages backup files without generating
a pacsave.
2021-09-20 20:34:43 +01:00
morganamilo
ddcceb9314 pacman: add --nokeep 2021-09-20 20:34:40 +01:00
morganamilo
0c701af590 alpm: add ALPM_TRANS_FLAG_NOKEEP
this flag prevents backup files from being kept on package installation.
This is useful for resetting a package's config files back to their
original state.

Implements FS#59908 although with it's own flag name instead of reusing
nosave. This allows nokeep to optionally create a pacnew that you can
then choose to disable by also setting nosave.

---

I actually very dislike NOKEEP but it was the best I could come up with

I would have prefered overwrite or nosave but they are taken. Better
names are welcome.
2021-09-20 20:31:33 +01:00
230 changed files with 2122 additions and 1890 deletions

View File

@@ -16,22 +16,18 @@ default:
python python
fakeroot fakechroot fakeroot fakechroot
meson meson
artifacts:
when: always
paths:
- build/meson-logs/meson-log.txt
arch: arch:
extends: .arch-test extends: .arch-test
script: script:
- meson setup build - meson build
- ninja -C build - ninja -C build
- fakechroot meson test -C build - fakechroot meson test -C build
arch-debug: arch-debug:
extends: .arch-test extends: .arch-test
script: script:
- meson setup --buildtype=debug --werror build - meson --buildtype=debug build
- ninja -C build - ninja -C build
- fakechroot meson test -C build - fakechroot meson test -C build
@@ -39,51 +35,50 @@ arch-docs:
extends: .arch-test extends: .arch-test
script: script:
- pacman -Syu --needed --noconfirm asciidoc - pacman -Syu --needed --noconfirm asciidoc
- meson setup -Ddoc=enabled build - meson -Ddoc=enabled build
- ninja -C build - ninja -C build
arch-clang: arch-clang:
extends: .arch-test extends: .arch-test
script: script:
- pacman -Syu --needed --noconfirm clang - pacman -Syu --needed --noconfirm clang
- CC=clang meson setup build - CC=clang meson build
- ninja -C build - ninja -C build
- fakechroot meson test -C build - fakechroot meson test -C build
#arch-valgrind: arch-valgrind:
# extends: .arch-test extends: .arch-test
# script: script:
# - pacman -Syu --needed --noconfirm valgrind - 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 build
# - meson setup build - ninja -C build
# - ninja -C build - PACTEST_VALGRIND=1 fakechroot meson test -C build
# - PACTEST_VALGRIND=1 fakechroot meson test -C build
arch-nettle: arch-nettle:
extends: .arch-test extends: .arch-test
script: script:
- meson setup -Dcrypto=nettle --buildtype=debug build - meson -Dcrypto=nettle --buildtype=debug build
- ninja -C build - ninja -C build
- fakechroot meson test -C build - fakechroot meson test -C build
arch-no-gpg: arch-no-gpg:
extends: .arch-test extends: .arch-test
script: script:
- meson setup -Dgpgme=disabled --buildtype=debug build - meson -Dgpgme=disabled --buildtype=debug build
- ninja -C build - ninja -C build
- fakechroot meson test -C build - fakechroot meson test -C build
arch-no-curl: arch-no-curl:
extends: .arch-test extends: .arch-test
script: script:
- meson setup -Dcurl=disabled --buildtype=debug build - meson -Dcurl=disabled --buildtype=debug build
- ninja -C build - ninja -C build
- fakechroot meson test -C build - fakechroot meson test -C build
arch-no-nls: arch-no-nls:
extends: .arch-test extends: .arch-test
script: script:
- meson setup -Di18n=false --buildtype=debug build - meson -Di18n=false --buildtype=debug build
- ninja -C build - ninja -C build
- fakechroot meson test -C build - fakechroot meson test -C build
@@ -98,7 +93,7 @@ debian:
gettext python3 python3-setuptools dash gawk ca-certificates gettext python3 python3-setuptools dash gawk ca-certificates
fakeroot fakechroot fakeroot fakechroot
script: script:
- meson setup --buildtype=debug build - meson --buildtype=debug build
- ninja -C build - ninja -C build
- fakechroot meson test -C build - fakechroot meson test -C build
@@ -114,6 +109,6 @@ fedora:
fakeroot fakechroot fakeroot fakechroot
perl-Module-Load-Conditional perl-Module-Load-Conditional
script: script:
- meson setup --buildtype=debug build - meson --buildtype=debug build
- ninja -C build - ninja -C build
- fakechroot meson test -C build - fakechroot meson test -C build

View File

@@ -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

250
.ycm_extra_conf.py Normal file
View File

@@ -0,0 +1,250 @@
#!/usr/bin/env python
# SPDX-License-Identifier: Unlicense
#
# Based on the template file provided by the 'YCM-Generator' project authored by
# Reuben D'Netto.
# Jiahui Xie has re-reformatted and expanded the original script in accordance
# to the requirements of the PEP 8 style guide and 'systemd' project,
# respectively.
#
# The original license is preserved as it is.
#
#
# This is free and unencumbered software released into the public domain.
#
# Anyone is free to copy, modify, publish, use, compile, sell, or
# distribute this software, either in source code form or as a compiled
# binary, for any purpose, commercial or non-commercial, and by any
# means.
#
# In jurisdictions that recognize copyright laws, the author or authors
# of this software dedicate any and all copyright interest in the
# software to the public domain. We make this dedication for the benefit
# of the public at large and to the detriment of our heirs and
# successors. We intend this dedication to be an overt act of
# relinquishment in perpetuity of all present and future rights to this
# software under copyright law.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
#
# For more information, please refer to <http://unlicense.org/>
"""
YouCompleteMe configuration file tailored to support the 'meson' build system
used by the 'systemd' project.
"""
import glob
import os
import ycm_core
SOURCE_EXTENSIONS = (".C", ".cpp", ".cxx", ".cc", ".c", ".m", ".mm")
HEADER_EXTENSIONS = (".H", ".h", ".hxx", ".hpp", ".hh")
def DirectoryOfThisScript():
"""
Return the absolute path of the parent directory containing this
script.
"""
return os.path.dirname(os.path.abspath(__file__))
def GuessBuildDirectory():
"""
Guess the build directory using the following heuristics:
1. Returns the current directory of this script plus 'build'
subdirectory in absolute path if this subdirectory exists.
2. Otherwise, probes whether there exists any directory
containing '.ninja_log' file two levels above the current directory;
returns this single directory only if there is one candidate.
"""
result = os.path.join(DirectoryOfThisScript(), "build")
if os.path.exists(result):
return result
result = glob.glob(os.path.join(DirectoryOfThisScript(),
"..", "..", "*", ".ninja_log"))
if not result:
return ""
if 1 != len(result):
return ""
return os.path.split(result[0])[0]
def TraverseByDepth(root, include_extensions):
"""
Return a set of child directories of the 'root' containing file
extensions specified in 'include_extensions'.
NOTE:
1. The 'root' directory itself is excluded from the result set.
2. No subdirectories would be excluded if 'include_extensions' is left
to 'None'.
3. Each entry in 'include_extensions' must begin with string '.'.
"""
is_root = True
result = set()
# Perform a depth first top down traverse of the given directory tree.
for root_dir, subdirs, file_list in os.walk(root):
if not is_root:
# print("Relative Root: ", root_dir)
# print(subdirs)
if include_extensions:
get_ext = os.path.splitext
subdir_extensions = {
get_ext(f)[-1] for f in file_list if get_ext(f)[-1]
}
if subdir_extensions & include_extensions:
result.add(root_dir)
else:
result.add(root_dir)
else:
is_root = False
return result
_project_src_dir = os.path.join(DirectoryOfThisScript(), "src")
_include_dirs_set = TraverseByDepth(_project_src_dir, frozenset({".h"}))
flags = [
"-x",
"c"
# The following flags are partially redundant due to the existence of
# 'compile_commands.json'.
# '-Wall',
# '-Wextra',
# '-Wfloat-equal',
# '-Wpointer-arith',
# '-Wshadow',
# '-std=gnu99',
]
for include_dir in _include_dirs_set:
flags.append("-I" + include_dir)
# Set this to the absolute path to the folder (NOT the file!) containing the
# compile_commands.json file to use that instead of 'flags'. See here for
# more details: http://clang.llvm.org/docs/JSONCompilationDatabase.html
#
# You can get CMake to generate this file for you by adding:
# set( CMAKE_EXPORT_COMPILE_COMMANDS 1 )
# to your CMakeLists.txt file.
#
# Most projects will NOT need to set this to anything; you can just change the
# 'flags' list of compilation flags. Notice that YCM itself uses that approach.
compilation_database_folder = GuessBuildDirectory()
if os.path.exists(compilation_database_folder):
database = ycm_core.CompilationDatabase(compilation_database_folder)
else:
database = None
def MakeRelativePathsInFlagsAbsolute(flags, working_directory):
"""
Iterate through 'flags' and replace the relative paths prefixed by
'-isystem', '-I', '-iquote', '--sysroot=' with absolute paths
start with 'working_directory'.
"""
if not working_directory:
return list(flags)
new_flags = []
make_next_absolute = False
path_flags = ["-isystem", "-I", "-iquote", "--sysroot="]
for flag in flags:
new_flag = flag
if make_next_absolute:
make_next_absolute = False
if not flag.startswith("/"):
new_flag = os.path.join(working_directory, flag)
for path_flag in path_flags:
if flag == path_flag:
make_next_absolute = True
break
if flag.startswith(path_flag):
path = flag[len(path_flag):]
new_flag = path_flag + os.path.join(working_directory, path)
break
if new_flag:
new_flags.append(new_flag)
return new_flags
def IsHeaderFile(filename):
"""
Check whether 'filename' is considered as a header file.
"""
extension = os.path.splitext(filename)[1]
return extension in HEADER_EXTENSIONS
def GetCompilationInfoForFile(filename):
"""
Helper function to look up compilation info of 'filename' in the 'database'.
"""
# The compilation_commands.json file generated by CMake does not have
# entries for header files. So we do our best by asking the db for flags for
# a corresponding source file, if any. If one exists, the flags for that
# file should be good enough.
if not database:
return None
if IsHeaderFile(filename):
basename = os.path.splitext(filename)[0]
for extension in SOURCE_EXTENSIONS:
replacement_file = basename + extension
if os.path.exists(replacement_file):
compilation_info = \
database.GetCompilationInfoForFile(replacement_file)
if compilation_info.compiler_flags_:
return compilation_info
return None
return database.GetCompilationInfoForFile(filename)
def FlagsForFile(filename, **kwargs):
"""
Callback function to be invoked by YouCompleteMe in order to get the
information necessary to compile 'filename'.
It returns a dictionary with a single element 'flags'. This element is a
list of compiler flags to pass to libclang for the file 'filename'.
"""
if database:
# Bear in mind that compilation_info.compiler_flags_ does NOT return a
# python list, but a "list-like" StringVec object
compilation_info = GetCompilationInfoForFile(filename)
if not compilation_info:
return None
final_flags = MakeRelativePathsInFlagsAbsolute(
compilation_info.compiler_flags_,
compilation_info.compiler_working_dir_)
else:
relative_to = DirectoryOfThisScript()
final_flags = MakeRelativePathsInFlagsAbsolute(flags, relative_to)
return {
"flags": final_flags,
"do_cache": True
}

View File

@@ -14,7 +14,7 @@ The following checklist should be used for making a pacman release.
- 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 ("./build-aux/update-po")
- Fix all translation errors found - Fix all translation errors found
- Add any new locales to the relevant LINGUAS file - Add any new locales to the relevant LINGUAS file

View File

@@ -11,7 +11,6 @@ sed \
-e "s|@localstatedir[@]|@localstatedir@|g" \ -e "s|@localstatedir[@]|@localstatedir@|g" \
-e "s|@libmakepkgdir[@]|@LIBMAKEPKGDIR@|g" \ -e "s|@libmakepkgdir[@]|@LIBMAKEPKGDIR@|g" \
-e "s|@pkgdatadir[@]|@PKGDATADIR@|g" \ -e "s|@pkgdatadir[@]|@PKGDATADIR@|g" \
-e "s|@keyringdir[@]|@KEYRINGDIR@|g" \
-e "s|@prefix[@]|@PREFIX@|g" \ -e "s|@prefix[@]|@PREFIX@|g" \
-e "1s|#!/bin/bash|#!@BASH@|g" \ -e "1s|#!/bin/bash|#!@BASH@|g" \
-e "s|@PACKAGE_VERSION[@]|@PACKAGE_VERSION@|g" \ -e "s|@PACKAGE_VERSION[@]|@PACKAGE_VERSION@|g" \
@@ -21,7 +20,6 @@ sed \
-e "s|@DEBUGSUFFIX[@]|@DEBUGSUFFIX@|g" \ -e "s|@DEBUGSUFFIX[@]|@DEBUGSUFFIX@|g" \
-e "s|@INODECMD[@]|@INODECMD@|g" \ -e "s|@INODECMD[@]|@INODECMD@|g" \
-e "s|@FILECMD[@]|@FILECMD@|g" \ -e "s|@FILECMD[@]|@FILECMD@|g" \
-e "s|@BSDTAR_NO_READ_SPARSE[@]|@BSDTAR_NO_READ_SPARSE@|g" \
"$input" >"$output" "$input" >"$output"
if [[ $mode ]]; then if [[ $mode ]]; then

View File

@@ -18,7 +18,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*::
@@ -53,15 +53,6 @@ BUILDINFO file format.
*startdir*:: *startdir*::
The directory from which makepkg was executed. 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.

View File

@@ -1,4 +1,4 @@
# Doxyfile 1.9.3 # Doxyfile 1.8.20
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# Project related configuration options # Project related configuration options
@@ -12,6 +12,7 @@ OUTPUT_DIRECTORY = @OUTPUT_DIRECTORY@
CREATE_SUBDIRS = NO CREATE_SUBDIRS = NO
ALLOW_UNICODE_NAMES = NO ALLOW_UNICODE_NAMES = NO
OUTPUT_LANGUAGE = English OUTPUT_LANGUAGE = English
OUTPUT_TEXT_DIRECTION = None
BRIEF_MEMBER_DESC = YES BRIEF_MEMBER_DESC = YES
REPEAT_BRIEF = YES REPEAT_BRIEF = YES
ABBREVIATE_BRIEF = "The $name class" \ ABBREVIATE_BRIEF = "The $name class" \
@@ -72,7 +73,6 @@ 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
@@ -81,7 +81,6 @@ INTERNAL_DOCS = NO
CASE_SENSE_NAMES = YES CASE_SENSE_NAMES = YES
HIDE_SCOPE_NAMES = NO HIDE_SCOPE_NAMES = NO
HIDE_COMPOUND_REFERENCE= NO HIDE_COMPOUND_REFERENCE= NO
SHOW_HEADERFILE = YES
SHOW_INCLUDE_FILES = YES SHOW_INCLUDE_FILES = YES
SHOW_GROUPED_MEMB_INC = NO SHOW_GROUPED_MEMB_INC = NO
FORCE_LOCAL_INCLUDES = NO FORCE_LOCAL_INCLUDES = NO
@@ -111,7 +110,6 @@ 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_AS_ERROR = NO
WARN_FORMAT = "$file:$line: $text" WARN_FORMAT = "$file:$line: $text"
@@ -154,6 +152,7 @@ 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
@@ -175,7 +174,6 @@ 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
@@ -198,16 +196,14 @@ 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 HTML_FORMULA_FORMAT = png
FORMULA_FONTSIZE = 10 FORMULA_FONTSIZE = 10
FORMULA_TRANSPARENT = YES
FORMULA_MACROFILE = FORMULA_MACROFILE =
USE_MATHJAX = NO USE_MATHJAX = NO
MATHJAX_VERSION = MathJax_2
MATHJAX_FORMAT = HTML-CSS MATHJAX_FORMAT = HTML-CSS
MATHJAX_RELPATH = http://www.mathjax.org/mathjax MATHJAX_RELPATH = http://www.mathjax.org/mathjax
MATHJAX_EXTENSIONS = MATHJAX_EXTENSIONS =
@@ -238,6 +234,7 @@ 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_TIMESTAMP = NO LATEX_TIMESTAMP = NO
LATEX_EMOJI_DIRECTORY = LATEX_EMOJI_DIRECTORY =
@@ -250,6 +247,7 @@ COMPACT_RTF = NO
RTF_HYPERLINKS = NO RTF_HYPERLINKS = NO
RTF_STYLESHEET_FILE = RTF_STYLESHEET_FILE =
RTF_EXTENSIONS_FILE = RTF_EXTENSIONS_FILE =
RTF_SOURCE_CODE = NO
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# Configuration options related to the man page output # Configuration options related to the man page output
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
@@ -270,9 +268,7 @@ XML_NS_MEMB_FILE_SCOPE = NO
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
GENERATE_DOCBOOK = NO GENERATE_DOCBOOK = NO
DOCBOOK_OUTPUT = docbook DOCBOOK_OUTPUT = docbook
#--------------------------------------------------------------------------- DOCBOOK_PROGRAMLISTING = NO
# 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
@@ -308,18 +304,19 @@ EXTERNAL_PAGES = YES
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# Configuration options related to the dot tool # Configuration options related to the dot tool
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
CLASS_DIAGRAMS = NO
DIA_PATH = DIA_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
@@ -327,7 +324,6 @@ 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 =
@@ -339,6 +335,7 @@ PLANTUML_CFG_FILE =
PLANTUML_INCLUDE_PATH = 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

View File

@@ -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"

View File

@@ -3,7 +3,7 @@ PKGBUILD(5)
Name Name
---- ----
PKGBUILD - Package build description file PKGBUILD - Arch Linux package build description file
Synopsis Synopsis
@@ -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*::
@@ -180,6 +187,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 +245,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=()'.
@@ -464,9 +480,6 @@ Currently makepkg supports the Bazaar, Git, Subversion, Fossil and Mercurial
version control systems. For other version control systems, manual cloning of version control systems. For other version control systems, manual cloning of
upstream repositories must be done in the `prepare()` function. 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:
*directory*:: *directory*::
@@ -511,7 +524,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]
------------------------------- -------------------------------

View File

@@ -250,7 +250,7 @@ bugs under the Pacman project.
Copyright Copyright
--------- ---------
pacman is Copyright (C) 2006-2022 Pacman Development Team pacman is Copyright (C) 2006-2021 Pacman Development Team
<pacman-dev@lists.archlinux.org> and Copyright (C) 2002-2006 Judd Vinet <pacman-dev@lists.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.

View File

@@ -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;

View File

@@ -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
@@ -290,10 +287,6 @@ Environment Variables
**BUILDTOOLVER=**"<version>":: **BUILDTOOLVER=**"<version>"::
The version of the '$BUILDTOOL' used. 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

View File

@@ -81,11 +81,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.
@@ -195,14 +190,8 @@ Options
package containing the debug symbols when used with `strip'. package containing the debug symbols when used with `strip'.
*lto*;; *lto*;;
Enable building packages using link time optimization. Adds the Enable building packages using link time optimization. Adds '-flto'
flags specified in LTOFLAGS to CFLAGS, CXXFLAGS and LDFLAGS (or to both CFLAGS and CXXFLAGS.
``-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
@@ -234,12 +223,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
@@ -291,10 +274,9 @@ Options
**PKGEXT=**"{pkgext}", **SRCEXT=**"{srcext}":: **PKGEXT=**"{pkgext}", **SRCEXT=**"{srcext}"::
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.gz`, `.tar.bz2`, `.tar.xz`, `.tar.zst`,
followed by one of `.tar.gz`, `.tar.bz2`, `.tar.xz`, `.tar.zst`, `.tar.lzo`, `.tar.lzo`, `.tar.lrz`, `.tar.lz4`, `.tar.lz` and `.tar.Z`, or
`.tar.lrz`, `.tar.lz4`, `.tar.lz` and `.tar.Z`, or simply `.tar` to simply `.tar` to disable compression entirely.
disable compression entirely.
**PACMAN_AUTH=()**:: **PACMAN_AUTH=()**::
Specify a command prefix for running pacman as root. If unset, makepkg will Specify a command prefix for running pacman as root. If unset, makepkg will

View File

@@ -5,9 +5,7 @@ manpages = [
{ 'name': 'makepkg-template.1' }, { 'name': 'makepkg-template.1' },
{ 'name': 'repo-add.8' }, { 'name': 'repo-add.8' },
{ 'name': 'vercmp.8' }, { 'name': 'vercmp.8' },
{ 'name': 'testpkg.8' },
{ 'name': 'pacman-key.8' }, { 'name': 'pacman-key.8' },
{ 'name': 'pacman-db-upgrade.8' },
{ 'name': 'PKGBUILD.5', 'extra_depends' : [ 'PKGBUILD-example.txt' ] }, { 'name': 'PKGBUILD.5', 'extra_depends' : [ 'PKGBUILD-example.txt' ] },
{ 'name': 'makepkg.conf.5' }, { 'name': 'makepkg.conf.5' },
{ 'name': 'pacman.conf.5' }, { 'name': 'pacman.conf.5' },
@@ -30,7 +28,6 @@ asciidoc_opts = [
'-a', 'srcext=@0@'.format(get_option('src-ext')), '-a', 'srcext=@0@'.format(get_option('src-ext')),
'-a', 'pkgext=@0@'.format(get_option('pkg-ext')), '-a', 'pkgext=@0@'.format(get_option('pkg-ext')),
'-a', 'pkgdatadir=@0@'.format(PKGDATADIR), '-a', 'pkgdatadir=@0@'.format(PKGDATADIR),
'-a', 'keyringdir=@0@'.format(KEYRINGDIR),
'-a', 'localstatedir=@0@'.format(LOCALSTATEDIR), '-a', 'localstatedir=@0@'.format(LOCALSTATEDIR),
'-a', 'sysconfdir=@0@'.format(SYSCONFDIR), '-a', 'sysconfdir=@0@'.format(SYSCONFDIR),
'-a', 'datarootdir=@0@'.format(DATAROOTDIR), '-a', 'datarootdir=@0@'.format(DATAROOTDIR),

View File

@@ -34,7 +34,7 @@ Options
*-R, \--rootdir* <path>:: *-R, \--rootdir* <path>::
Specify an alternate installation root (default is `/`). Specify an alternate installation root (default is `/`).
*-r, \--repo* <repository>:: *-r, \--repo* <remote>::
Query options for a specific repository. Query options for a specific repository.
*-v, \--verbose*:: *-v, \--verbose*::

View File

@@ -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[]

View File

@@ -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*::
@@ -129,7 +129,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

View File

@@ -210,9 +210,14 @@ Transaction Options (apply to '-S', '-R' and '-U')
dependencies are installed and there are no package conflicts in the dependencies are installed and there are no package conflicts in the
system. Specify this option twice to skip all dependency checks. system. Specify this option twice to skip all dependency checks.
*-n, \--nosave*::
Instructs pacman to ignore file backup designations. Normally, when a
file is removed from the system, the database is checked to see if the
file should be renamed with a '.pacsave' extension.
*\--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.
@@ -235,15 +240,8 @@ 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]]
@@ -263,6 +261,12 @@ Upgrade Options (apply to '-S' and '-U')[[UO]]
as explicitly installed so it will not be removed by the '\--recursive' as explicitly installed so it will not be removed by the '\--recursive'
remove operation. remove operation.
*\--note*::
Add an install note to packages. This will only apply to targets explicitly
listed and not their dependencies. The note can be used to keep track of why
a package was installed or any other info of note. The note can later be
edited or removed with '\--D \--note' or '\--D \--rmnote' respectively.
*\--ignore* <package>:: *\--ignore* <package>::
Directs pacman to ignore upgrades of package even if there is one Directs pacman to ignore upgrades of package even if there is one
available. Multiple packages can be specified by separating them available. Multiple packages can be specified by separating them
@@ -276,6 +280,9 @@ Upgrade Options (apply to '-S' and '-U')[[UO]]
*\--needed*:: *\--needed*::
Do not reinstall the targets that are already up-to-date. Do not reinstall the targets that are already up-to-date.
*\--nokeep*::
Overwrite backup files when installing packages.
*\--overwrite* <glob>:: *\--overwrite* <glob>::
Bypass file conflict checks and overwrite conflicting files. If the Bypass file conflict checks and overwrite conflicting files. If the
package that is about to be installed contains files that are already package that is about to be installed contains files that are already
@@ -371,6 +378,9 @@ Query Options (apply to '-Q')[[QO]]
replacements are not checked here. This option works best if the sync replacements are not checked here. This option works best if the sync
database is refreshed using '-Sy'. database is refreshed using '-Sy'.
*-w, \--backup*::
List all modified backup files owened by a given package. Multiple packages can
be specified on the command line. Pass twice to print all backup files.
Remove Options (apply to '-R')[[RO]] Remove Options (apply to '-R')[[RO]]
------------------------------------ ------------------------------------
@@ -379,11 +389,6 @@ Remove Options (apply to '-R')[[RO]]
or more target packages. This operation is recursive and must be used or more target packages. This operation is recursive and must be used
with care, since it can remove many potentially needed packages. with care, since it can remove many potentially needed packages.
*-n, \--nosave*::
Instructs pacman to ignore file backup designations. Normally, when a
file is removed from the system, the database is checked to see if the
file should be renamed with a '.pacsave' extension.
*-s, \--recursive*:: *-s, \--recursive*::
Remove each target specified including all of their dependencies, provided Remove each target specified including all of their dependencies, provided
that (A) they are not required by other packages; and (B) they were not that (A) they are not required by other packages; and (B) they were not
@@ -456,11 +461,11 @@ 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.
*-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]]
@@ -475,6 +480,13 @@ Database Options (apply to '-D')[[QO]]
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.
*\--note*::
Add or edit a package's install note. The note can be used to keep track of why
a package was installed or any other info of note.
*\--rmnote*::
Remove a package's install note.
*-k, \--check*:: *-k, \--check*::
Check the local package database is internally consistent. This will Check the local package database is internally consistent. This will
check all required files are present and that installed packages have check all required files are present and that installed packages have
@@ -489,8 +501,8 @@ 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.

View File

@@ -121,7 +121,7 @@ Options
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

View File

@@ -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[]

View File

@@ -1,11 +0,0 @@
#!/hint/bash
#
# @sysconfdir@/makepkg.conf.d/rust.conf
#
#########################################################################
# RUST LANGUAGE SUPPORT
#########################################################################
#
#RUSTFLAGS="-C opt-level=2"
#DEBUG_RUSTFLAGS="-C debuginfo=2"

View File

@@ -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,7 +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' 'fossil::fossil'
'git::git' 'git::git'
'hg::mercurial' 'hg::mercurial'
@@ -41,12 +41,13 @@ CHOST="@CHOST@"
#CFLAGS="-O2 -pipe" #CFLAGS="-O2 -pipe"
#CXXFLAGS="-O2 -pipe" #CXXFLAGS="-O2 -pipe"
#LDFLAGS="" #LDFLAGS=""
#LTOFLAGS="-flto" #RUSTFLAGS="-C opt-level=2"
#-- Make Flags: change this for DistCC/SMP systems #-- Make Flags: change this for DistCC/SMP systems
#MAKEFLAGS="-j2" #MAKEFLAGS="-j2"
#-- Debugging flags #-- Debugging flags
#DEBUG_CFLAGS="-g" #DEBUG_CFLAGS="-g"
#DEBUG_CXXFLAGS="-g" #DEBUG_CXXFLAGS="-g"
#DEBUG_RUSTFLAGS="-C debuginfo=2"
######################################################################### #########################################################################
# BUILD ENVIRONMENT # BUILD ENVIRONMENT
@@ -75,8 +76,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: # Makepkg defaults: OPTIONS=(!strip docs libtool staticlibs emptydirs !zipman !purge !debug !lto)
# 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
@@ -88,9 +88,8 @@ BUILDENV=(!distcc color !ccache check !sign)
#-- 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 #-- 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 !lto)
#-- File integrity checks to use. Valid: ck, md5, sha1, sha224, sha256, sha384, sha512, b2 #-- File integrity checks to use. Valid: ck, md5, sha1, sha224, sha256, sha384, sha512, b2
INTEGRITY_CHECK=(ck) INTEGRITY_CHECK=(ck)
@@ -108,8 +107,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

View File

@@ -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

View File

@@ -1,7 +1,7 @@
/* /*
* add.c * add.c
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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
@@ -431,8 +431,22 @@ static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg,
ASSERT(trans != NULL, return -1); ASSERT(trans != NULL, return -1);
if(_alpm_db_get_pkgfromcache(db, newpkg->name)) {
oldpkg = newpkg->oldpkg;
}
/* set note on package only if it was explicitly added to transaction */
if(trans->note && newpkg->reason == ALPM_PKG_REASON_EXPLICIT) {
STRDUP(newpkg->note, trans->note,
RET_ERR(handle, ALPM_ERR_MEMORY, -1));
} else if(oldpkg && oldpkg->note) {
STRDUP(newpkg->note,oldpkg->note,
RET_ERR(handle, ALPM_ERR_MEMORY, -1));
}
if(oldpkg) {
/* 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)) {
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";

View File

@@ -1,7 +1,7 @@
/* /*
* add.h * add.h
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -1,7 +1,7 @@
/* /*
* alpm.c * alpm.c
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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>

View File

@@ -1,7 +1,7 @@
/* /*
* alpm.h * alpm.h
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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>
@@ -101,26 +101,23 @@ typedef struct _alpm_handle_t alpm_handle_t;
typedef struct _alpm_db_t alpm_db_t; typedef struct _alpm_db_t alpm_db_t;
/** A Database file iterator
* @ingroup libalpm_databases
*/
typedef struct __alpm_db_files_t alpm_db_files_t;
/** A package. /** A package.
* *
* A package can be loaded from disk via \link alpm_pkg_load \endlink or retrieved from a database. * A package can be loaded from disk via \link alpm_pkg_load \endlink or retrieved from a database.
* Packages from databases are automatically freed when the database is unregistered. Packages loaded * Packages from databases are automatically freed when the database is unregistered. Packages loaded
* from a file must be freed manually. * from a file must be freed manually.
* *
* Packages can then be queried for metadata or added to a transaction * Packages can then be queried for metadata or added to a \link alpm_trans_t transaction \endlink
* to be added or removed from the system. * to be added or removed from the system.
* @ingroup libalpm_packages * @ingroup libalpm_packages
*/ */
typedef struct _alpm_pkg_t alpm_pkg_t; typedef struct _alpm_pkg_t alpm_pkg_t;
/** The extended data type used to store non-standard package data fields
* @ingroup libalpm_packages
*/
typedef struct _alpm_pkg_xdata_t {
char *name;
char *value;
} alpm_pkg_xdata_t;
/** The time type used by libalpm. Represents a unix time stamp /** The time type used by libalpm. Represents a unix time stamp
* @ingroup libalpm_misc */ * @ingroup libalpm_misc */
typedef int64_t alpm_time_t; typedef int64_t alpm_time_t;
@@ -164,7 +161,10 @@ typedef struct _alpm_backup_t {
* @param path the path to search for in the package * @param path the path to search for in the package
* @return a pointer to the matching file or NULL if not found * @return a pointer to the matching file or NULL if not found
*/ */
alpm_file_t *alpm_filelist_contains(const alpm_filelist_t *filelist, const char *path); alpm_file_t *alpm_filelist_contains(alpm_filelist_t *filelist, const char *path);
/** Frees a file list */
void alpm_filelist_free(alpm_filelist_t *files);
/* End of libalpm_files */ /* End of libalpm_files */
/** @} */ /** @} */
@@ -600,10 +600,16 @@ typedef struct _alpm_depmissing_t {
/** A conflict that has occurred between two packages. */ /** A conflict that has occurred between two packages. */
typedef struct _alpm_conflict_t { typedef struct _alpm_conflict_t {
/** The first package */ /** Hash of the first package name
alpm_pkg_t *package1; * (used internally to speed up conflict checks) */
/** The second package */ unsigned long package1_hash;
alpm_pkg_t *package2; /** Hash of the second package name
* (used internally to speed up conflict checks) */
unsigned long package2_hash;
/** Name of the first package */
char *package1;
/** Name of the second package */
char *package2;
/** The conflict */ /** The conflict */
alpm_depend_t *reason; alpm_depend_t *reason;
} alpm_conflict_t; } alpm_conflict_t;
@@ -969,7 +975,7 @@ typedef union _alpm_event_t {
* Called when an event occurs * Called when an event occurs
* @param ctx user-provided context * @param ctx user-provided context
* @param event the event that occurred */ * @param event the event that occurred */
typedef void (*alpm_cb_event)(void *ctx, alpm_event_t *event); typedef void (*alpm_cb_event)(void *ctx, alpm_event_t *);
/** /**
* Type of question. * Type of question.
@@ -1116,7 +1122,7 @@ typedef union _alpm_question_t {
* @param ctx user-provided context * @param ctx user-provided context
* @param question the question being asked. * @param question the question being asked.
*/ */
typedef void (*alpm_cb_question)(void *ctx, alpm_question_t *question); typedef void (*alpm_cb_question)(void *ctx, alpm_question_t *);
/** An enum over different kinds of progress alerts. */ /** An enum over different kinds of progress alerts. */
typedef enum _alpm_progress_t { typedef enum _alpm_progress_t {
@@ -1452,6 +1458,42 @@ int alpm_db_get_usage(alpm_db_t *db, int *usage);
/* End of usage accessors */ /* End of usage accessors */
/** @} */ /** @} */
/** @name File iterators
* @{
*/
/** Opens a handle to the db files iterator.
* @param db the db files to iterate over
* @return handle to the iterator
*/
alpm_db_files_t *alpm_db_files_open(alpm_db_t *db);
/** Goes to the next package.
* @param files handle to the file iterator
* @param pkgname stores the pkgname of the current package
* @return 0 on success, 1 if end of iterator, -1 on error
*/
int alpm_db_files_next(alpm_db_files_t *files, char** pkgname);
/** Loads the files for a package into a file list.
*
* This extends the file list as needed, reusing the memory alloced.
* You can reuse the same file list for calls to this function but
* the list should be freed with \link alpm_filelist_free alpm_filelist_free \endlink
* after use.
* @param files handle to the file iterator
* @param filelist the filelist to load files into
* @return 0 on success, -1 on error
*/
int alpm_db_files_load(alpm_db_files_t *files, alpm_filelist_t *filelist);
/** Close the db file iterator
* @param files handle to the file iterator
*/
void alpm_db_files_close(alpm_db_files_t *files);
/* End of file iterators */
/** @} */
/* End of libalpm_databases */ /* End of libalpm_databases */
/** @} */ /** @} */
@@ -1838,7 +1880,7 @@ const char *alpm_option_get_gpgdir(alpm_handle_t *handle);
* @param gpgdir the gpgdir to set * @param gpgdir the gpgdir to set
*/ */
int alpm_option_set_gpgdir(alpm_handle_t *handle, const char *gpgdir); int alpm_option_set_gpgdir(alpm_handle_t *handle, const char *gpgdir);
/* End of gpgdir accessors */ /* End of gpdir accessors */
/** @} */ /** @} */
@@ -2443,6 +2485,12 @@ const char *alpm_pkg_get_desc(alpm_pkg_t *pkg);
*/ */
const char *alpm_pkg_get_url(alpm_pkg_t *pkg); const char *alpm_pkg_get_url(alpm_pkg_t *pkg);
/** Returns the package note.
* @param pkg a pointer to package
* @return a reference to an internal string
*/
char *alpm_pkg_get_note(alpm_pkg_t *pkg);
/** Returns the build timestamp of the package. /** Returns the build timestamp of the package.
* @param pkg a pointer to package * @param pkg a pointer to package
* @return the timestamp of the build time * @return the timestamp of the build time
@@ -2600,12 +2648,6 @@ int alpm_pkg_get_sig(alpm_pkg_t *pkg, unsigned char **sig, size_t *sig_len);
*/ */
int alpm_pkg_get_validation(alpm_pkg_t *pkg); int alpm_pkg_get_validation(alpm_pkg_t *pkg);
/** Gets the extended data field of a package.
* @param pkg a pointer to package
* @return a reference to a list of alpm_pkg_xdata_t objects
*/
alpm_list_t *alpm_pkg_get_xdata(alpm_pkg_t *pkg);
/** Returns whether the package has an install scriptlet. /** Returns whether the package has an install scriptlet.
* @return 0 if FALSE, TRUE otherwise * @return 0 if FALSE, TRUE otherwise
*/ */
@@ -2627,6 +2669,15 @@ off_t alpm_pkg_download_size(alpm_pkg_t *newpkg);
*/ */
int alpm_pkg_set_reason(alpm_pkg_t *pkg, alpm_pkgreason_t reason); int alpm_pkg_set_reason(alpm_pkg_t *pkg, alpm_pkgreason_t reason);
/** Set install note for a package in the local database.
* The provided package object must be from the local database or this method
* will fail. The write to the local database is performed immediately.
* @param pkg the package to edit
* @param note the new install note, null to remove a note
* @return 0 on success, -1 on error (pm_errno is set accordingly)
*/
int alpm_pkg_set_note(alpm_pkg_t *pkg, char *note);
/* End of libalpm_pkg_t accessors */ /* End of libalpm_pkg_t accessors */
/** @} */ /** @} */
@@ -2698,7 +2749,6 @@ int alpm_pkg_mtree_close(const alpm_pkg_t *pkg, struct archive *archive);
/* End of mtree accessors */ /* End of mtree accessors */
/** @} */ /** @} */
/* End of libalpm_packages */ /* End of libalpm_packages */
/** @} */ /** @} */
@@ -2724,7 +2774,8 @@ int alpm_pkg_mtree_close(const alpm_pkg_t *pkg, struct archive *archive);
typedef enum _alpm_transflag_t { typedef enum _alpm_transflag_t {
/** Ignore dependency checks. */ /** Ignore dependency checks. */
ALPM_TRANS_FLAG_NODEPS = 1, ALPM_TRANS_FLAG_NODEPS = 1,
/* (1 << 1) flag can go here */ /** Don't keep backup files when installing packages. */
ALPM_TRANS_FLAG_NOKEEP = (1 << 1),
/** Delete files even if they are tagged as backup. */ /** Delete files even if they are tagged as backup. */
ALPM_TRANS_FLAG_NOSAVE = (1 << 2), ALPM_TRANS_FLAG_NOSAVE = (1 << 2),
/** Ignore version numbers when checking dependencies. */ /** Ignore version numbers when checking dependencies. */
@@ -2776,6 +2827,16 @@ alpm_list_t *alpm_trans_get_add(alpm_handle_t *handle);
*/ */
alpm_list_t *alpm_trans_get_remove(alpm_handle_t *handle); alpm_list_t *alpm_trans_get_remove(alpm_handle_t *handle);
/** Sets the install note for a transaction
*
* All target packages will gain the note, dependencies will not.
*
* @param handle the context handle
* @note the the note, may not contain new lines
* @return 0 on success, -1 on error (pm_errno is set accordingly)
*/
int alpm_trans_set_note(alpm_handle_t *handle, char *note);
/** Initialize the transaction. /** Initialize the transaction.
* @param handle the context handle * @param handle the context handle
* @param flags flags of the transaction (like nodeps, etc; see alpm_transflag_t) * @param flags flags of the transaction (like nodeps, etc; see alpm_transflag_t)

View File

@@ -1,7 +1,7 @@
/* /*
* alpm_list.c * alpm_list.c
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -1,7 +1,7 @@
/* /*
* alpm_list.h * alpm_list.h
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -1,7 +1,7 @@
/* /*
* backup.c * backup.c
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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>

View File

@@ -1,7 +1,7 @@
/* /*
* backup.h * backup.h
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -1,7 +1,7 @@
/* /*
* be_local.c : backend for the local database * be_local.c : backend for the local database
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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
@@ -81,6 +81,12 @@ static const char *_cache_get_url(alpm_pkg_t *pkg)
return pkg->url; return pkg->url;
} }
static char *_cache_get_note(alpm_pkg_t *pkg)
{
LAZY_LOAD(INFRQ_DESC);
return pkg->note;
}
static alpm_time_t _cache_get_builddate(alpm_pkg_t *pkg) static alpm_time_t _cache_get_builddate(alpm_pkg_t *pkg)
{ {
LAZY_LOAD(INFRQ_DESC); LAZY_LOAD(INFRQ_DESC);
@@ -195,12 +201,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.
@@ -336,6 +336,7 @@ static const 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_note = _cache_get_note,
.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,
@@ -355,7 +356,6 @@ static const struct pkg_operations local_pkg_ops = {
.get_replaces = _cache_get_replaces, .get_replaces = _cache_get_replaces,
.get_files = _cache_get_files, .get_files = _cache_get_files,
.get_backup = _cache_get_backup, .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,
@@ -759,6 +759,8 @@ static int local_db_read(alpm_pkg_t *info, int inforeq)
READ_AND_STORE_ALL(info->groups); READ_AND_STORE_ALL(info->groups);
} else if(strcmp(line, "%URL%") == 0) { } else if(strcmp(line, "%URL%") == 0) {
READ_AND_STORE(info->url); READ_AND_STORE(info->url);
} else if(strcmp(line, "%NOTE%") == 0) {
READ_AND_STORE(info->note);
} else if(strcmp(line, "%LICENSE%") == 0) { } else if(strcmp(line, "%LICENSE%") == 0) {
READ_AND_STORE_ALL(info->licenses); READ_AND_STORE_ALL(info->licenses);
} else if(strcmp(line, "%ARCH%") == 0) { } else if(strcmp(line, "%ARCH%") == 0) {
@@ -811,18 +813,6 @@ static int local_db_read(alpm_pkg_t *info, int inforeq)
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);
} }
} }
fclose(fp); fclose(fp);
@@ -1059,13 +1049,9 @@ 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) { if(info->note) {
fputs("%XDATA%\n", fp); fprintf(fp, "%%NOTE%%\n"
for(lp = info->xdata; lp; lp = lp->next) { "%s\n\n", info->note);
alpm_pkg_xdata_t *pd = lp->data;
fprintf(fp, "%s=%s\n", pd->name, pd->value);
}
fputc('\n', fp);
} }
fclose(fp); fclose(fp);
@@ -1186,6 +1172,31 @@ int SYMEXPORT alpm_pkg_set_reason(alpm_pkg_t *pkg, alpm_pkgreason_t reason)
return 0; return 0;
} }
int SYMEXPORT alpm_pkg_set_note(alpm_pkg_t *pkg, char *note)
{
ASSERT(pkg != NULL, return -1);
ASSERT(pkg->origin == ALPM_PKG_FROM_LOCALDB,
RET_ERR(pkg->handle, ALPM_ERR_WRONG_ARGS, -1));
ASSERT(pkg->origin_data.db == pkg->handle->db_local,
RET_ERR(pkg->handle, ALPM_ERR_WRONG_ARGS, -1));
_alpm_log(pkg->handle, ALPM_LOG_DEBUG,
"setting note for %s: %s\n", pkg->name, note);
LAZY_LOAD(INFRQ_DESC);
FREE(pkg->note);
if(note) {
ASSERT(!strchr(note, '\n'), RET_ERR(pkg->handle, ALPM_ERR_WRONG_ARGS, -1));
STRDUP(pkg->note, note,
RET_ERR(pkg->handle, ALPM_ERR_MEMORY, -1));
}
/* write DESC */
if(_alpm_local_db_write(pkg->handle->db_local, pkg, INFRQ_DESC)) {
RET_ERR(pkg->handle, ALPM_ERR_DB_WRITE, -1);
}
return 0;
}
static const struct db_operations local_db_ops = { static const struct db_operations local_db_ops = {
.validate = local_db_validate, .validate = local_db_validate,
.populate = local_db_populate, .populate = local_db_populate,

View File

@@ -1,7 +1,7 @@
/* /*
* be_package.c : backend for packages * be_package.c : backend for packages
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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
@@ -244,12 +244,10 @@ 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 {
_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",
newpkg->name ? newpkg->name : "error", key, linenum); newpkg->name ? newpkg->name : "error", key, linenum);
@@ -653,6 +651,7 @@ alpm_pkg_t *_alpm_pkg_load_internal(alpm_handle_t *handle,
} }
_alpm_archive_read_free(archive); _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;
@@ -675,7 +674,6 @@ alpm_pkg_t *_alpm_pkg_load_internal(alpm_handle_t *handle,
newpkg->infolevel |= INFRQ_FILES; newpkg->infolevel |= INFRQ_FILES;
} }
close(fd);
return newpkg; return newpkg;
pkg_invalid: pkg_invalid:
@@ -725,6 +723,7 @@ 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; alpm_pkg_t *pkg_temp;
char *packager;
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));
@@ -750,7 +749,13 @@ int SYMEXPORT alpm_pkg_load(alpm_handle_t *handle, const char *filename, int ful
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); pkg_temp = _alpm_pkg_load_internal(handle, filename, full);
if(_alpm_key_import(handle, NULL, key) == -1) { if(pkg_temp) {
packager = pkg_temp->packager;
} else {
packager = NULL;
}
if(_alpm_key_import(handle, packager, key) == -1) {
fail = 1; fail = 1;
} }
_alpm_pkg_free(pkg_temp); _alpm_pkg_free(pkg_temp);

View File

@@ -1,7 +1,7 @@
/* /*
* be_sync.c : backend for sync databases * be_sync.c : backend for sync databases
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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
@@ -566,8 +566,7 @@ static int sync_db_read(alpm_db_t *db, struct archive *archive,
return 0; return 0;
} }
if(strcmp(filename, "desc") == 0 || strcmp(filename, "depends") == 0 if(strcmp(filename, "desc") == 0 || strcmp(filename, "depends") == 0) {
|| strcmp(filename, "files") == 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;
@@ -636,48 +635,6 @@ static int sync_db_read(alpm_db_t *db, struct archive *archive,
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, "%FILES%") == 0) {
/* TODO: this could lazy load if there is future demand */
size_t files_count = 0, files_size = 0;
alpm_file_t *files = NULL;
while(1) {
if(_alpm_archive_fgets(archive, &buf) != ARCHIVE_OK) {
goto error;
}
line = buf.line;
if(_alpm_strip_newline(line, buf.real_line_size) == 0) {
break;
}
if(!_alpm_greedy_grow((void **)&files, &files_size,
(files_count ? (files_count + 1) * sizeof(alpm_file_t) : 8 * sizeof(alpm_file_t)))) {
goto error;
}
STRDUP(files[files_count].name, line, goto error);
files_count++;
}
/* attempt to hand back any memory we don't need */
if(files_count > 0) {
REALLOC(files, sizeof(alpm_file_t) * files_count, (void)0);
} else {
FREE(files);
}
pkg->files.count = files_count;
pkg->files.files = 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);
} }
} }
if(ret != ARCHIVE_EOF) { if(ret != ARCHIVE_EOF) {
@@ -728,3 +685,152 @@ alpm_db_t *_alpm_db_register_sync(alpm_handle_t *handle, const char *treename,
handle->dbs_sync = alpm_list_add(handle->dbs_sync, db); handle->dbs_sync = alpm_list_add(handle->dbs_sync, db);
return db; return db;
} }
static int load_files(struct archive *archive, alpm_filelist_t *filelist)
{
struct archive_read_buffer buf = {0};
/* 512K for a line length seems reasonable */
buf.max_line_size = 512 * 1024;
_alpm_filelist_truncate(filelist);
int ret;
while((ret = _alpm_archive_fgets(archive, &buf)) == ARCHIVE_OK) {
char *line = buf.line;
if(_alpm_strip_newline(line, buf.real_line_size) == 0) {
/* length of stripped line was zero */
continue;
}
if(strcmp(line, "%FILES%") == 0) {
size_t files_size = 0;
while(1) {
if(_alpm_archive_fgets(archive, &buf) != ARCHIVE_OK) {
goto error;
}
line = buf.line;
if(_alpm_strip_newline(line, buf.real_line_size) == 0) {
break;
}
if(!_alpm_greedy_grow((void **)&filelist->files, &files_size,
(filelist->count ? (filelist->count + 1) * sizeof(alpm_file_t) : 8 * sizeof(alpm_file_t)))) {
goto error;
}
STRDUP(filelist->files[filelist->count].name, line, goto error);
filelist->count++;
}
_alpm_filelist_sort(filelist);
}
}
if(ret != ARCHIVE_EOF) {
goto error;
}
return 0;
error:
return -1;
}
alpm_db_files_t SYMEXPORT *alpm_db_files_open(alpm_db_t *db)
{
const char *dbpath;
int fd;
struct stat buf;
struct archive *archive;
alpm_db_files_t *files = NULL;
ASSERT(db != NULL, return NULL);
dbpath = _alpm_db_path(db);
if(!dbpath) {
/* pm_errno set in _alpm_db_path() */
return NULL;
}
if(db->status & DB_STATUS_INVALID || db->status & DB_STATUS_MISSING) {
return NULL;
}
fd = _alpm_open_archive(db->handle, dbpath, &buf,
&archive, ALPM_ERR_DB_OPEN);
if(fd < 0) {
db->status &= ~DB_STATUS_VALID;
db->status |= DB_STATUS_INVALID;
_alpm_archive_read_free(archive);
return NULL;
}
MALLOC(files, sizeof(alpm_db_files_t), RET_ERR(db->handle, ALPM_ERR_MEMORY, NULL));
files->archive = archive;
files->fd = fd;
files->db = db;
return files;
}
int SYMEXPORT alpm_db_files_next(alpm_db_files_t *files, char** pkgname)
{
struct archive_entry *entry;
const char *entryname;
int archive_ret;
char *filename;
ASSERT(files != NULL, return -1);
ASSERT(pkgname != NULL, return -1);
while((archive_ret = archive_read_next_header(files->archive, &entry)) == ARCHIVE_OK) {
mode_t mode = archive_entry_mode(entry);
if(!S_ISDIR(mode)) {
entryname = archive_entry_pathname(entry);
if(entryname == NULL) {
_alpm_log(files->db->handle, ALPM_LOG_DEBUG,
"invalid archive entry provided to alpm_db_files_next, skipping\n");
return -1;
}
if(_alpm_splitname(entryname, pkgname, NULL, NULL) != 0) {
_alpm_log(files->db->handle, ALPM_LOG_ERROR,
_("invalid name for database entry '%s'\n"), entryname);
return -1;
}
filename = strrchr(entryname, '/');
filename++;
/* we only want to read the file list */
if(filename && strcmp(filename, "files") == 0) {
return 0;
}
}
}
if(archive_ret != ARCHIVE_EOF) {
return -1;
}
return 1;
}
int SYMEXPORT alpm_db_files_load(alpm_db_files_t *files, alpm_filelist_t *filelist)
{
ASSERT(files != NULL, return -1);
ASSERT(filelist != NULL, return -1);
_alpm_filelist_truncate(filelist);
if(load_files(files->archive, filelist) != 0) {
_alpm_log(files->db->handle, ALPM_LOG_ERROR,
_("could not parse package description file '%s' from db '%s'\n"),
"files", files->db->treename);
return -1;
}
return 0;
}
void SYMEXPORT alpm_db_files_close(alpm_db_files_t *files)
{
ASSERT(files != NULL, return);
_alpm_archive_read_free(files->archive);
close(files->fd);
free(files);
}

View File

@@ -1,7 +1,7 @@
/* /*
* conflict.c * conflict.c
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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;
@@ -64,9 +66,8 @@ error:
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 +79,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 +105,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;
} }
} }

View File

@@ -1,7 +1,7 @@
/* /*
* conflict.h * conflict.h
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -1,7 +1,7 @@
/* /*
* db.c * db.c
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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>
@@ -411,6 +411,7 @@ int _alpm_db_search(alpm_db_t *db, const alpm_list_t *needles,
const char *matched = NULL; const char *matched = NULL;
const char *name = pkg->name; const char *name = pkg->name;
const char *desc = alpm_pkg_get_desc(pkg); const char *desc = alpm_pkg_get_desc(pkg);
const char *note = alpm_pkg_get_note(pkg);
/* check name as regex AND as plain text */ /* check name as regex AND as plain text */
if(name && (regexec(&reg, name, 0, 0, 0) == 0 || strstr(name, targ))) { if(name && (regexec(&reg, name, 0, 0, 0) == 0 || strstr(name, targ))) {
@@ -420,6 +421,11 @@ int _alpm_db_search(alpm_db_t *db, const alpm_list_t *needles,
else if(desc && regexec(&reg, desc, 0, 0, 0) == 0) { else if(desc && regexec(&reg, desc, 0, 0, 0) == 0) {
matched = desc; matched = desc;
} }
/* check note */
else if(note && regexec(&reg, note, 0, 0, 0) == 0) {
matched = note;
}
/* TODO: should we be doing this, and should we print something /* TODO: should we be doing this, and should we print something
* differently when we do match it since it isn't currently printed? */ * differently when we do match it since it isn't currently printed? */
if(!matched) { if(!matched) {

View File

@@ -1,7 +1,7 @@
/* /*
* db.h * db.h
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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>
@@ -61,6 +61,13 @@ struct db_operations {
void (*unregister) (alpm_db_t *); void (*unregister) (alpm_db_t *);
}; };
/* Database files iterator */
struct __alpm_db_files_t {
struct archive *archive;
int fd;
alpm_db_t *db;
};
/* Database */ /* Database */
struct _alpm_db_t { struct _alpm_db_t {
alpm_handle_t *handle; alpm_handle_t *handle;

View File

@@ -1,7 +1,7 @@
/* /*
* deps.c * deps.c
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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>

View File

@@ -1,7 +1,7 @@
/* /*
* deps.h * deps.h
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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>

View File

@@ -1,7 +1,7 @@
/* /*
* diskspace.c * diskspace.c
* *
* Copyright (c) 2010-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2010-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -1,7 +1,7 @@
/* /*
* diskspace.h * diskspace.h
* *
* Copyright (c) 2010-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2010-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -1,7 +1,7 @@
/* /*
* dload.c * dload.c
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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,7 +153,8 @@ static char *get_fullpath(const char *path, const char *filename,
} }
enum { enum {
ABORT_OVER_MAXFILESIZE = 1, ABORT_SIGINT = 1,
ABORT_OVER_MAXFILESIZE
}; };
static int dload_interrupted; static int dload_interrupted;
@@ -294,11 +295,8 @@ static size_t dload_parseheader_cb(void *ptr, size_t size, size_t nmemb, void *u
endptr--; endptr--;
} }
/* avoid information leakage with badly formed headers */ STRNDUP(payload->content_disp_name, fptr, endptr - fptr + 1,
if(endptr > fptr) { RET_ERR(payload->handle, ALPM_ERR_MEMORY, realsize));
STRNDUP(payload->content_disp_name, fptr, endptr - fptr + 1,
RET_ERR(payload->handle, ALPM_ERR_MEMORY, realsize));
}
} }
} }
@@ -429,9 +427,6 @@ static int curl_retry_next_server(CURLM *curlm, CURL *curl, struct dload_payload
len = strlen(server) + strlen(payload->filepath) + 2; len = strlen(server) + strlen(payload->filepath) + 2;
MALLOC(payload->fileurl, len, RET_ERR(handle, ALPM_ERR_MEMORY, -1)); MALLOC(payload->fileurl, len, RET_ERR(handle, ALPM_ERR_MEMORY, -1));
snprintf(payload->fileurl, len, "%s/%s", server, payload->filepath); snprintf(payload->fileurl, len, "%s/%s", server, payload->filepath);
_alpm_log(handle, ALPM_LOG_DEBUG,
"%s: retrying from %s\n",
payload->remote_name, payload->fileurl);
fflush(payload->localf); fflush(payload->localf);
@@ -473,9 +468,10 @@ static int curl_retry_next_server(CURLM *curlm, CURL *curl, struct dload_payload
* Returns -1 if an error happened for a required file * Returns -1 if an error happened for a required file
* Returns -2 if an error happened for an optional file * Returns -2 if an error happened for an optional file
*/ */
static int curl_check_finished_download(alpm_handle_t *handle, CURLM *curlm, CURLMsg *msg, static int curl_check_finished_download(CURLM *curlm, CURLMsg *msg,
const char *localpath, int *active_downloads_num) const char *localpath, int *active_downloads_num)
{ {
alpm_handle_t *handle = NULL;
struct dload_payload *payload = NULL; struct dload_payload *payload = NULL;
CURL *curl = msg->easy_handle; CURL *curl = msg->easy_handle;
CURLcode curlerr; CURLcode curlerr;
@@ -490,11 +486,12 @@ static int curl_check_finished_download(alpm_handle_t *handle, CURLM *curlm, CUR
curlerr = curl_easy_getinfo(curl, CURLINFO_PRIVATE, &payload); curlerr = curl_easy_getinfo(curl, CURLINFO_PRIVATE, &payload);
ASSERT(curlerr == CURLE_OK, RET_ERR(handle, ALPM_ERR_LIBCURL, -1)); ASSERT(curlerr == CURLE_OK, RET_ERR(handle, ALPM_ERR_LIBCURL, -1));
handle = payload->handle;
curl_gethost(payload->fileurl, hostname, sizeof(hostname)); curl_gethost(payload->fileurl, hostname, sizeof(hostname));
curlerr = msg->data.result; curlerr = msg->data.result;
_alpm_log(handle, ALPM_LOG_DEBUG, "%s: %s returned result %d from transfer\n", _alpm_log(handle, ALPM_LOG_DEBUG, "%s: curl returned result %d from transfer\n",
payload->remote_name, "curl", curlerr); payload->remote_name, curlerr);
/* was it a success? */ /* was it a success? */
switch(curlerr) { switch(curlerr) {
@@ -917,7 +914,7 @@ static int curl_download_internal(alpm_handle_t *handle,
break; break;
} }
if(msg->msg == CURLMSG_DONE) { if(msg->msg == CURLMSG_DONE) {
int ret = curl_check_finished_download(handle, curlm, msg, int ret = curl_check_finished_download(curlm, msg,
localpath, &active_downloads_num); localpath, &active_downloads_num);
if(ret == -1) { if(ret == -1) {
/* if current payload failed to download then stop adding new payloads but wait for the /* if current payload failed to download then stop adding new payloads but wait for the

View File

@@ -1,7 +1,7 @@
/* /*
* dload.h * dload.h
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -1,7 +1,7 @@
/* /*
* error.c * error.c
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -1,7 +1,7 @@
/* /*
* filelist.c * filelist.c
* *
* Copyright (c) 2012-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2012-2021 Pacman Development Team <pacman-dev@lists.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;
@@ -145,3 +145,17 @@ void _alpm_filelist_sort(alpm_filelist_t *filelist)
} }
} }
} }
void _alpm_filelist_truncate(alpm_filelist_t *files)
{
for(size_t i = 0; i < files->count; i++) {
FREE(files->files[i].name);
}
files->count = 0;
}
void SYMEXPORT alpm_filelist_free(alpm_filelist_t *files)
{
_alpm_filelist_truncate(files);
free(files->files);
}

View File

@@ -1,7 +1,7 @@
/* /*
* filelist.h * filelist.h
* *
* Copyright (c) 2012-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2012-2021 Pacman Development Team <pacman-dev@lists.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
@@ -28,5 +28,6 @@ alpm_list_t *_alpm_filelist_intersection(alpm_filelist_t *filesA,
alpm_filelist_t *filesB); alpm_filelist_t *filesB);
void _alpm_filelist_sort(alpm_filelist_t *filelist); void _alpm_filelist_sort(alpm_filelist_t *filelist);
void _alpm_filelist_truncate(alpm_filelist_t *filelist);
#endif /* ALPM_FILELIST_H */ #endif /* ALPM_FILELIST_H */

View File

@@ -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-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2007-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -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-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2007-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -1,7 +1,7 @@
/* /*
* group.c * group.c
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -1,7 +1,7 @@
/* /*
* group.h * group.h
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -1,7 +1,7 @@
/* /*
* handle.c * handle.c
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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>

View File

@@ -1,7 +1,7 @@
/* /*
* handle.h * handle.h
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -1,7 +1,7 @@
/* /*
* hook.c * hook.c
* *
* Copyright (c) 2015-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2015-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -1,7 +1,7 @@
/* /*
* hook.h * hook.h
* *
* Copyright (c) 2015-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2015-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -4,7 +4,7 @@
/* /*
* libarchive-compat.h * libarchive-compat.h
* *
* Copyright (c) 2013-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2013-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -1,7 +1,7 @@
/* /*
* log.c * log.c
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -1,7 +1,7 @@
/* /*
* log.h * log.h
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -1,7 +1,7 @@
/* /*
* package.c * package.c
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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>
@@ -57,7 +57,7 @@ int SYMEXPORT alpm_pkg_checkmd5sum(alpm_pkg_t *pkg)
ASSERT(pkg->origin == ALPM_PKG_FROM_SYNCDB, ASSERT(pkg->origin == ALPM_PKG_FROM_SYNCDB,
RET_ERR(pkg->handle, ALPM_ERR_WRONG_ARGS, -1)); RET_ERR(pkg->handle, ALPM_ERR_WRONG_ARGS, -1));
fpath = _alpm_filecache_find(pkg->handle, pkg->filename); fpath = _alpm_cache_find_pkg(pkg, 0);
retval = _alpm_test_checksum(fpath, pkg->md5sum, ALPM_PKG_VALIDATION_MD5SUM); retval = _alpm_test_checksum(fpath, pkg->md5sum, ALPM_PKG_VALIDATION_MD5SUM);
@@ -78,6 +78,7 @@ int SYMEXPORT alpm_pkg_checkmd5sum(alpm_pkg_t *pkg)
static const char *_pkg_get_base(alpm_pkg_t *pkg) { return pkg->base; } static const char *_pkg_get_base(alpm_pkg_t *pkg) { return pkg->base; }
static const char *_pkg_get_desc(alpm_pkg_t *pkg) { return pkg->desc; } static const char *_pkg_get_desc(alpm_pkg_t *pkg) { return pkg->desc; }
static const char *_pkg_get_url(alpm_pkg_t *pkg) { return pkg->url; } static const char *_pkg_get_url(alpm_pkg_t *pkg) { return pkg->url; }
static char *_pkg_get_note(alpm_pkg_t *pkg) { return pkg->note; }
static alpm_time_t _pkg_get_builddate(alpm_pkg_t *pkg) { return pkg->builddate; } static alpm_time_t _pkg_get_builddate(alpm_pkg_t *pkg) { return pkg->builddate; }
static alpm_time_t _pkg_get_installdate(alpm_pkg_t *pkg) { return pkg->installdate; } static alpm_time_t _pkg_get_installdate(alpm_pkg_t *pkg) { return pkg->installdate; }
static const char *_pkg_get_packager(alpm_pkg_t *pkg) { return pkg->packager; } static const char *_pkg_get_packager(alpm_pkg_t *pkg) { return pkg->packager; }
@@ -98,7 +99,7 @@ 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)
{ {
@@ -143,6 +144,7 @@ const 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,
.get_note = _pkg_get_note,
.get_builddate = _pkg_get_builddate, .get_builddate = _pkg_get_builddate,
.get_installdate = _pkg_get_installdate, .get_installdate = _pkg_get_installdate,
.get_packager = _pkg_get_packager, .get_packager = _pkg_get_packager,
@@ -163,7 +165,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,
@@ -196,6 +197,7 @@ const char SYMEXPORT *alpm_pkg_get_base(alpm_pkg_t *pkg)
alpm_handle_t SYMEXPORT *alpm_pkg_get_handle(alpm_pkg_t *pkg) alpm_handle_t SYMEXPORT *alpm_pkg_get_handle(alpm_pkg_t *pkg)
{ {
ASSERT(pkg != NULL, return NULL); ASSERT(pkg != NULL, return NULL);
pkg->handle->pm_errno = ALPM_ERR_OK;
return pkg->handle; return pkg->handle;
} }
@@ -234,6 +236,13 @@ const char SYMEXPORT *alpm_pkg_get_url(alpm_pkg_t *pkg)
return pkg->ops->get_url(pkg); return pkg->ops->get_url(pkg);
} }
char SYMEXPORT *alpm_pkg_get_note(alpm_pkg_t *pkg)
{
ASSERT(pkg != NULL, return NULL);
pkg->handle->pm_errno = ALPM_ERR_OK;
return pkg->ops->get_note(pkg);
}
alpm_time_t SYMEXPORT alpm_pkg_get_builddate(alpm_pkg_t *pkg) alpm_time_t SYMEXPORT alpm_pkg_get_builddate(alpm_pkg_t *pkg)
{ {
ASSERT(pkg != NULL, return -1); ASSERT(pkg != NULL, return -1);
@@ -291,7 +300,7 @@ int SYMEXPORT alpm_pkg_get_sig(alpm_pkg_t *pkg, unsigned char **sig, size_t *sig
alpm_errno_t err; alpm_errno_t err;
int ret = -1; int ret = -1;
pkgpath = _alpm_filecache_find(pkg->handle, pkg->filename); pkgpath = _alpm_cache_find_pkg(pkg, 0);
if(!pkgpath) { if(!pkgpath) {
GOTO_ERR(pkg->handle, ALPM_ERR_PKG_NOT_FOUND, cleanup); GOTO_ERR(pkg->handle, ALPM_ERR_PKG_NOT_FOUND, cleanup);
} }
@@ -487,13 +496,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)
{ {
@@ -625,6 +627,7 @@ int _alpm_pkg_dup(alpm_pkg_t *pkg, alpm_pkg_t **new_ptr)
STRDUP(newpkg->version, pkg->version, goto cleanup); STRDUP(newpkg->version, pkg->version, goto cleanup);
STRDUP(newpkg->desc, pkg->desc, goto cleanup); STRDUP(newpkg->desc, pkg->desc, goto cleanup);
STRDUP(newpkg->url, pkg->url, goto cleanup); STRDUP(newpkg->url, pkg->url, goto cleanup);
STRDUP(newpkg->note, pkg->note, goto cleanup);
newpkg->builddate = pkg->builddate; newpkg->builddate = pkg->builddate;
newpkg->installdate = pkg->installdate; newpkg->installdate = pkg->installdate;
STRDUP(newpkg->packager, pkg->packager, goto cleanup); STRDUP(newpkg->packager, pkg->packager, goto cleanup);
@@ -686,30 +689,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) {
@@ -722,6 +701,7 @@ void _alpm_pkg_free(alpm_pkg_t *pkg)
FREE(pkg->version); FREE(pkg->version);
FREE(pkg->desc); FREE(pkg->desc);
FREE(pkg->url); FREE(pkg->url);
FREE(pkg->note);
FREE(pkg->packager); FREE(pkg->packager);
FREE(pkg->md5sum); FREE(pkg->md5sum);
FREE(pkg->sha256sum); FREE(pkg->sha256sum);
@@ -740,8 +720,6 @@ 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->checkdepends);

View File

@@ -1,7 +1,7 @@
/* /*
* package.h * package.h
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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>
@@ -46,6 +46,7 @@ struct pkg_operations {
const char *(*get_base) (alpm_pkg_t *); const char *(*get_base) (alpm_pkg_t *);
const char *(*get_desc) (alpm_pkg_t *); const char *(*get_desc) (alpm_pkg_t *);
const char *(*get_url) (alpm_pkg_t *); const char *(*get_url) (alpm_pkg_t *);
char *(*get_note) (alpm_pkg_t *);
alpm_time_t (*get_builddate) (alpm_pkg_t *); alpm_time_t (*get_builddate) (alpm_pkg_t *);
alpm_time_t (*get_installdate) (alpm_pkg_t *); alpm_time_t (*get_installdate) (alpm_pkg_t *);
const char *(*get_packager) (alpm_pkg_t *); const char *(*get_packager) (alpm_pkg_t *);
@@ -67,8 +68,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 *);
@@ -95,6 +94,7 @@ struct _alpm_pkg_t {
char *version; char *version;
char *desc; char *desc;
char *url; char *url;
char *note;
char *packager; char *packager;
char *md5sum; char *md5sum;
char *sha256sum; char *sha256sum;
@@ -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,7 +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);
#endif /* ALPM_PACKAGE_H */ #endif /* ALPM_PACKAGE_H */

View File

@@ -1,7 +1,7 @@
/* /*
* pkghash.c * pkghash.c
* *
* Copyright (c) 2011-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2011-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -1,7 +1,7 @@
/* /*
* pkghash.h * pkghash.h
* *
* Copyright (c) 2011-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2011-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -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.

View File

@@ -1,7 +1,7 @@
/* /*
* remove.c * remove.c
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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>
@@ -575,7 +575,9 @@ static int should_skip_file(alpm_handle_t *handle,
{ {
return _alpm_fnmatch_patterns(handle->noupgrade, path) == 0 return _alpm_fnmatch_patterns(handle->noupgrade, path) == 0
|| alpm_list_find_str(handle->trans->skip_remove, path) || alpm_list_find_str(handle->trans->skip_remove, path)
|| (newpkg && _alpm_needbackup(path, newpkg) || (!(handle->trans->flags & ALPM_TRANS_FLAG_NOKEEP)
&& newpkg
&& _alpm_needbackup(path, newpkg)
&& alpm_filelist_contains(alpm_pkg_get_files(newpkg), path)); && alpm_filelist_contains(alpm_pkg_get_files(newpkg), path));
} }

View File

@@ -1,7 +1,7 @@
/* /*
* remove.h * remove.h
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -1,7 +1,7 @@
/* /*
* signing.c * signing.c
* *
* Copyright (c) 2008-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2008-2021 Pacman Development Team <pacman-dev@lists.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
@@ -253,10 +253,9 @@ error:
* This requires GPGME to call the gpg binary. * This requires GPGME to call the gpg binary.
* @param handle the context handle * @param handle the context handle
* @param email the email address of the key to import * @param email the email address of the key to import
* @param fpr the fingerprint key ID to look up (or NULL)
* @return 0 on success, -1 on error * @return 0 on success, -1 on error
*/ */
static int key_import_wkd(alpm_handle_t *handle, const char *email, const char *fpr) static int key_import_wkd(alpm_handle_t *handle, const char *email)
{ {
gpgme_error_t gpg_err; gpgme_error_t gpg_err;
gpgme_ctx_t ctx = {0}; gpgme_ctx_t ctx = {0};
@@ -275,12 +274,7 @@ static int key_import_wkd(alpm_handle_t *handle, const char *email, const char *
_alpm_log(handle, ALPM_LOG_DEBUG, _("looking up key %s using WKD\n"), email); _alpm_log(handle, ALPM_LOG_DEBUG, _("looking up key %s using WKD\n"), email);
gpg_err = gpgme_get_key(ctx, email, &key, 0); gpg_err = gpgme_get_key(ctx, email, &key, 0);
if(gpg_err_code(gpg_err) == GPG_ERR_NO_ERROR) { if(gpg_err_code(gpg_err) == GPG_ERR_NO_ERROR) {
/* check if correct key was imported via WKD */ ret = 0;
if(fpr && _alpm_key_in_keychain(handle, fpr)) {
ret = 0;
} else {
_alpm_log(handle, ALPM_LOG_DEBUG, "key lookup failed: WKD imported wrong fingerprint\n");
}
} }
gpgme_key_unref(key); gpgme_key_unref(key);
@@ -359,18 +353,14 @@ static int key_search_keyserver(alpm_handle_t *handle, const char *fpr,
} else { } else {
pgpkey->fingerprint = key->subkeys->keyid; pgpkey->fingerprint = key->subkeys->keyid;
} }
pgpkey->uid = key->uids->uid;
/* we are probably going to fail importing, but continue anyway... */ pgpkey->name = key->uids->name;
if(key->uids != NULL) { pgpkey->email = key->uids->email;
pgpkey->uid = key->uids->uid;
pgpkey->name = key->uids->name;
pgpkey->email = key->uids->email;
}
pgpkey->created = key->subkeys->timestamp; pgpkey->created = key->subkeys->timestamp;
pgpkey->expires = key->subkeys->expires; pgpkey->expires = key->subkeys->expires;
pgpkey->length = key->subkeys->length; pgpkey->length = key->subkeys->length;
pgpkey->revoked = key->subkeys->revoked; pgpkey->revoked = key->subkeys->revoked;
/* Initialize with '?', this is overwritten unless public key /* Initialize with '?', this is overwritten unless public key
* algorithm is unknown. */ * algorithm is unknown. */
pgpkey->pubkey_algo = '?'; pgpkey->pubkey_algo = '?';
@@ -526,7 +516,7 @@ int _alpm_key_import(alpm_handle_t *handle, const char *uid, const char *fpr)
if(question.import) { if(question.import) {
/* Try to import the key from a WKD first */ /* Try to import the key from a WKD first */
if(email_from_uid(uid, &email) == 0) { if(email_from_uid(uid, &email) == 0) {
ret = key_import_wkd(handle, email, fpr); ret = key_import_wkd(handle, email);
free(email); free(email);
} }
@@ -539,7 +529,7 @@ int _alpm_key_import(alpm_handle_t *handle, const char *uid, const char *fpr)
ret = 0; ret = 0;
} else { } else {
_alpm_log(handle, ALPM_LOG_ERROR, _alpm_log(handle, ALPM_LOG_ERROR,
_("key \"%s\" could not be imported\n"), fpr); _("key \"%s\" could not be imported\n"), fetch_key.uid);
} }
} else { } else {
_alpm_log(handle, ALPM_LOG_ERROR, _alpm_log(handle, ALPM_LOG_ERROR,

View File

@@ -1,7 +1,7 @@
/* /*
* signing.h * signing.h
* *
* Copyright (c) 2008-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2008-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -1,7 +1,7 @@
/* /*
* sync.c * sync.c
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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>
@@ -323,7 +323,7 @@ static int compute_download_size(alpm_pkg_t *newpkg)
ASSERT(newpkg->filename != NULL, RET_ERR(handle, ALPM_ERR_PKG_INVALID_NAME, -1)); ASSERT(newpkg->filename != NULL, RET_ERR(handle, ALPM_ERR_PKG_INVALID_NAME, -1));
fname = newpkg->filename; fname = newpkg->filename;
fpath = _alpm_filecache_find(handle, fname); fpath = _alpm_cache_find_pkg(newpkg, 0);
/* downloaded file exists, so there's nothing to grab */ /* downloaded file exists, so there's nothing to grab */
if(fpath) { if(fpath) {
@@ -333,7 +333,7 @@ static int compute_download_size(alpm_pkg_t *newpkg)
CALLOC(fnamepart, strlen(fname) + 6, sizeof(char), return -1); CALLOC(fnamepart, strlen(fname) + 6, sizeof(char), return -1);
sprintf(fnamepart, "%s.part", fname); sprintf(fnamepart, "%s.part", fname);
fpath = _alpm_filecache_find(handle, fnamepart); fpath = _alpm_cache_find_pkg(newpkg, 1);
if(fpath) { if(fpath) {
struct stat st; struct stat st;
if(stat(fpath, &st) == 0) { if(stat(fpath, &st) == 0) {
@@ -470,6 +470,7 @@ int _alpm_sync_prepare(alpm_handle_t *handle, alpm_list_t **data)
for(j = i->next; j; j = j->next) { for(j = i->next; j; j = j->next) {
alpm_pkg_t *pkg2 = j->data; alpm_pkg_t *pkg2 = j->data;
if(strcmp(pkg1->filename, pkg2->filename) == 0) { if(strcmp(pkg1->filename, pkg2->filename) == 0) {
alpm_list_free(resolved);
ret = -1; ret = -1;
handle->pm_errno = ALPM_ERR_TRANS_DUP_FILENAME; handle->pm_errno = ALPM_ERR_TRANS_DUP_FILENAME;
_alpm_log(handle, ALPM_LOG_ERROR, _("packages %s and %s have the same filename: %s\n"), _alpm_log(handle, ALPM_LOG_ERROR, _("packages %s and %s have the same filename: %s\n"),
@@ -479,7 +480,6 @@ int _alpm_sync_prepare(alpm_handle_t *handle, alpm_list_t **data)
} }
if(ret != 0) { if(ret != 0) {
alpm_list_free(resolved);
goto cleanup; goto cleanup;
} }
@@ -517,23 +517,21 @@ int _alpm_sync_prepare(alpm_handle_t *handle, alpm_list_t **data)
for(i = deps; i; i = i->next) { for(i = deps; i; i = i->next) {
alpm_conflict_t *conflict = i->data; alpm_conflict_t *conflict = i->data;
const char *name1 = conflict->package1->name;
const char *name2 = conflict->package2->name;
alpm_pkg_t *rsync, *sync, *sync1, *sync2; alpm_pkg_t *rsync, *sync, *sync1, *sync2;
/* have we already removed one of the conflicting targets? */ /* have we already removed one of the conflicting targets? */
sync1 = alpm_pkg_find(trans->add, name1); sync1 = alpm_pkg_find(trans->add, conflict->package1);
sync2 = alpm_pkg_find(trans->add, name2); sync2 = alpm_pkg_find(trans->add, conflict->package2);
if(!sync1 || !sync2) { if(!sync1 || !sync2) {
continue; continue;
} }
_alpm_log(handle, ALPM_LOG_DEBUG, "conflicting packages in the sync list: '%s' <-> '%s'\n", _alpm_log(handle, ALPM_LOG_DEBUG, "conflicting packages in the sync list: '%s' <-> '%s'\n",
name1, name2); conflict->package1, conflict->package2);
/* if sync1 provides sync2, we remove sync2 from the targets, and vice versa */ /* if sync1 provides sync2, we remove sync2 from the targets, and vice versa */
alpm_depend_t *dep1 = alpm_dep_from_string(name1); alpm_depend_t *dep1 = alpm_dep_from_string(conflict->package1);
alpm_depend_t *dep2 = alpm_dep_from_string(name2); alpm_depend_t *dep2 = alpm_dep_from_string(conflict->package2);
if(_alpm_depcmp(sync1, dep2)) { if(_alpm_depcmp(sync1, dep2)) {
rsync = sync2; rsync = sync2;
sync = sync1; sync = sync1;
@@ -561,8 +559,8 @@ int _alpm_sync_prepare(alpm_handle_t *handle, alpm_list_t **data)
/* Prints warning */ /* Prints warning */
_alpm_log(handle, ALPM_LOG_WARNING, _alpm_log(handle, ALPM_LOG_WARNING,
_("removing '%s-%s' from target list because it conflicts with '%s-%s'\n"), _("removing '%s' from target list because it conflicts with '%s'\n"),
rsync->name, rsync->version, sync->name, sync->version); rsync->name, sync->name);
trans->add = alpm_list_remove(trans->add, rsync, _alpm_pkg_cmp, NULL); trans->add = alpm_list_remove(trans->add, rsync, _alpm_pkg_cmp, NULL);
/* rsync is not a transaction target anymore */ /* rsync is not a transaction target anymore */
trans->unresolvable = alpm_list_add(trans->unresolvable, rsync); trans->unresolvable = alpm_list_add(trans->unresolvable, rsync);
@@ -583,18 +581,16 @@ int _alpm_sync_prepare(alpm_handle_t *handle, alpm_list_t **data)
.conflict = i->data .conflict = i->data
}; };
alpm_conflict_t *conflict = i->data; alpm_conflict_t *conflict = i->data;
const char *name1 = conflict->package1->name;
const char *name2 = conflict->package2->name;
int found = 0; int found = 0;
/* if name2 (the local package) is not elected for removal, /* if conflict->package2 (the local package) is not elected for removal,
we ask the user */ we ask the user */
if(alpm_pkg_find(trans->remove, name2)) { if(alpm_pkg_find(trans->remove, conflict->package2)) {
found = 1; found = 1;
} }
for(j = trans->add; j && !found; j = j->next) { for(j = trans->add; j && !found; j = j->next) {
alpm_pkg_t *spkg = j->data; alpm_pkg_t *spkg = j->data;
if(alpm_pkg_find(spkg->removes, name2)) { if(alpm_pkg_find(spkg->removes, conflict->package2)) {
found = 1; found = 1;
} }
} }
@@ -602,15 +598,15 @@ int _alpm_sync_prepare(alpm_handle_t *handle, alpm_list_t **data)
continue; continue;
} }
_alpm_log(handle, ALPM_LOG_DEBUG, "package '%s-%s' conflicts with '%s-%s'\n", _alpm_log(handle, ALPM_LOG_DEBUG, "package '%s' conflicts with '%s'\n",
name1, conflict->package1->version, name2,conflict->package2->version); conflict->package1, conflict->package2);
QUESTION(handle, &question); QUESTION(handle, &question);
if(question.remove) { if(question.remove) {
/* append to the removes list */ /* append to the removes list */
alpm_pkg_t *sync = alpm_pkg_find(trans->add, name1); alpm_pkg_t *sync = alpm_pkg_find(trans->add, conflict->package1);
alpm_pkg_t *local = _alpm_db_get_pkgfromcache(handle->db_local, name2); alpm_pkg_t *local = _alpm_db_get_pkgfromcache(handle->db_local, conflict->package2);
_alpm_log(handle, ALPM_LOG_DEBUG, "electing '%s' for removal\n", name2); _alpm_log(handle, ALPM_LOG_DEBUG, "electing '%s' for removal\n", conflict->package2);
sync->removes = alpm_list_add(sync->removes, local); sync->removes = alpm_list_add(sync->removes, local);
} else { /* abort */ } else { /* abort */
_alpm_log(handle, ALPM_LOG_ERROR, _("unresolvable package conflicts detected\n")); _alpm_log(handle, ALPM_LOG_ERROR, _("unresolvable package conflicts detected\n"));
@@ -741,21 +737,13 @@ static int find_dl_candidates(alpm_handle_t *handle, alpm_list_t **files)
ASSERT(spkg->filename != NULL, RET_ERR(handle, ALPM_ERR_PKG_INVALID_NAME, -1)); ASSERT(spkg->filename != NULL, RET_ERR(handle, ALPM_ERR_PKG_INVALID_NAME, -1));
need_download = spkg->download_size != 0 || !_alpm_filecache_exists(handle, spkg->filename); need_download = spkg->download_size != 0 || !_alpm_cache_pkg_exists(spkg, 0);
/* even if the package file in the cache we need to check for /* even if the package file in the cache we need to check for
* accompanion *.sig file as well. * accompanion *.sig file as well.
* If *.sig is not cached then force download the package + its signature file. * If *.sig is not cached then force download the package + its signature file.
*/ */
if(!need_download && (siglevel & ALPM_SIG_PACKAGE)) { if(!need_download && (siglevel & ALPM_SIG_PACKAGE)) {
char *sig_filename = NULL; need_download = !_alpm_cache_pkg_exists(spkg, 1);
int len = strlen(spkg->filename) + 5;
MALLOC(sig_filename, len, RET_ERR(handle, ALPM_ERR_MEMORY, -1));
snprintf(sig_filename, len, "%s.sig", spkg->filename);
need_download = !_alpm_filecache_exists(handle, sig_filename);
FREE(sig_filename);
} }
if(need_download) { if(need_download) {
@@ -994,7 +982,14 @@ static int check_validity(alpm_handle_t *handle,
} }
current_bytes += v.pkg->size; current_bytes += v.pkg->size;
v.path = _alpm_filecache_find(handle, v.pkg->filename); v.path = _alpm_cache_find_pkg(v.pkg, 0);
if(!v.path) {
_alpm_log(handle, ALPM_LOG_ERROR,
_("%s: could not find package in cache\n"), v.pkg->name);
RET_ERR(handle, ALPM_ERR_PKG_NOT_FOUND, -1);
}
v.siglevel = alpm_db_get_siglevel(alpm_pkg_get_db(v.pkg)); v.siglevel = alpm_db_get_siglevel(alpm_pkg_get_db(v.pkg));
if(_alpm_pkg_validate_internal(handle, v.path, v.pkg, if(_alpm_pkg_validate_internal(handle, v.path, v.pkg,
@@ -1084,7 +1079,14 @@ static int load_packages(alpm_handle_t *handle, alpm_list_t **data,
} }
current_bytes += spkg->size; current_bytes += spkg->size;
filepath = _alpm_filecache_find(handle, spkg->filename);
filepath = _alpm_cache_find_pkg(spkg, 0);
if(!filepath) {
_alpm_log(handle, ALPM_LOG_ERROR,
_("%s: could not find package in cache\n"), spkg->name);
RET_ERR(handle, ALPM_ERR_PKG_NOT_FOUND, -1);
}
/* load the package file and replace pkgcache entry with it in the target list */ /* load the package file and replace pkgcache entry with it in the target list */
/* TODO: alpm_pkg_get_db() will not work on this target anymore */ /* TODO: alpm_pkg_get_db() will not work on this target anymore */
@@ -1113,7 +1115,6 @@ static int load_packages(alpm_handle_t *handle, alpm_list_t **data,
errors++; errors++;
*data = alpm_list_add(*data, strdup(spkg->filename)); *data = alpm_list_add(*data, strdup(spkg->filename));
free(filepath); free(filepath);
_alpm_pkg_free(pkgfile);
continue; continue;
} }
free(filepath); free(filepath);

View File

@@ -1,7 +1,7 @@
/* /*
* sync.h * sync.h
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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>

View File

@@ -1,7 +1,7 @@
/* /*
* trans.c * trans.c
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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>
@@ -177,7 +177,8 @@ int SYMEXPORT alpm_trans_commit(alpm_handle_t *handle, alpm_list_t **data)
ASSERT(trans != NULL, RET_ERR(handle, ALPM_ERR_TRANS_NULL, -1)); ASSERT(trans != NULL, RET_ERR(handle, ALPM_ERR_TRANS_NULL, -1));
ASSERT(trans->state == STATE_PREPARED, RET_ERR(handle, ALPM_ERR_TRANS_NOT_PREPARED, -1)); ASSERT(trans->state == STATE_PREPARED, RET_ERR(handle, ALPM_ERR_TRANS_NOT_PREPARED, -1));
ASSERT(!(trans->flags & ALPM_TRANS_FLAG_NOLOCK), RET_ERR(handle, ALPM_ERR_TRANS_NOT_LOCKED, -1)); ASSERT(!(trans->flags & ALPM_TRANS_FLAG_NOLOCK && !(trans->flags & ALPM_TRANS_FLAG_DOWNLOADONLY)),
RET_ERR(handle, ALPM_ERR_TRANS_NOT_LOCKED, -1));
/* If there's nothing to do, return without complaining */ /* If there's nothing to do, return without complaining */
if(trans->add == NULL && trans->remove == NULL) { if(trans->add == NULL && trans->remove == NULL) {
@@ -298,6 +299,7 @@ void _alpm_trans_free(alpm_trans_t *trans)
alpm_list_free(trans->add); alpm_list_free(trans->add);
alpm_list_free_inner(trans->remove, (alpm_list_fn_free)_alpm_pkg_free); alpm_list_free_inner(trans->remove, (alpm_list_fn_free)_alpm_pkg_free);
alpm_list_free(trans->remove); alpm_list_free(trans->remove);
FREE(trans->note);
FREELIST(trans->skip_remove); FREELIST(trans->skip_remove);
@@ -450,3 +452,19 @@ alpm_list_t SYMEXPORT *alpm_trans_get_remove(alpm_handle_t *handle)
return handle->trans->remove; return handle->trans->remove;
} }
int SYMEXPORT alpm_trans_set_note(alpm_handle_t *handle, char *note) {
CHECK_HANDLE(handle, return -1);
ASSERT(handle->trans != NULL, RET_ERR(handle, ALPM_ERR_TRANS_NULL, -1));
ASSERT(handle->trans->state == STATE_INITIALIZED, RET_ERR(handle, ALPM_ERR_TRANS_NOT_INITIALIZED, -1));
if(handle->trans->note) {
ASSERT(!strchr(handle->trans->note, '\n'), RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1));
free(handle->trans->note);
handle->trans->note = NULL;
}
STRDUP(handle->trans->note, note, RET_ERR(handle, ALPM_ERR_MEMORY, -1));
return 0;
}

View File

@@ -1,7 +1,7 @@
/* /*
* trans.h * trans.h
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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>
@@ -39,6 +39,7 @@ typedef enum _alpm_transstate_t {
typedef struct _alpm_trans_t { typedef struct _alpm_trans_t {
/* bitfield of alpm_transflag_t flags */ /* bitfield of alpm_transflag_t flags */
int flags; int flags;
char *note;
alpm_transstate_t state; alpm_transstate_t state;
alpm_list_t *unresolvable; /* list of (alpm_pkg_t *) */ alpm_list_t *unresolvable; /* list of (alpm_pkg_t *) */
alpm_list_t *add; /* list of (alpm_pkg_t *) */ alpm_list_t *add; /* list of (alpm_pkg_t *) */

View File

@@ -1,7 +1,7 @@
/* /*
* util.c * util.c
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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>
@@ -40,7 +40,8 @@
#include <archive_entry.h> #include <archive_entry.h>
#ifdef HAVE_LIBSSL #ifdef HAVE_LIBSSL
#include <openssl/evp.h> #include <openssl/md5.h>
#include <openssl/sha.h>
#endif #endif
#ifdef HAVE_LIBNETTLE #ifdef HAVE_LIBNETTLE
@@ -348,11 +349,6 @@ int _alpm_unpack(alpm_handle_t *handle, const char *path, const char *prefix,
entryname = archive_entry_pathname(entry); entryname = archive_entry_pathname(entry);
if(entryname == NULL) {
ret = 1;
goto cleanup;
}
/* If specific files were requested, skip entries that don't match. */ /* If specific files were requested, skip entries that don't match. */
if(list) { if(list) {
char *entry_prefix = NULL; char *entry_prefix = NULL;
@@ -663,13 +659,6 @@ int _alpm_run_chroot(alpm_handle_t *handle, const char *cmd, char *const argv[],
"/", strerror(errno)); "/", strerror(errno));
exit(1); exit(1);
} }
/* bash assumes it's being run under rsh/ssh if stdin is a socket and
* sources ~/.bashrc if it thinks it's the top-level shell.
* set SHLVL before running to indicate that it's a child shell and
* disable this behavior */
setenv("SHLVL", "1", 0);
/* bash sources $BASH_ENV when run non-interactively */
unsetenv("BASH_ENV");
umask(0022); umask(0022);
_alpm_reset_signals(); _alpm_reset_signals();
execv(cmd, argv); execv(cmd, argv);
@@ -826,6 +815,37 @@ int _alpm_str_cmp(const void *s1, const void *s2)
return strcmp(s1, s2); return strcmp(s1, s2);
} }
char *_alpm_cache_find_pkg(alpm_pkg_t *pkg, int sig) {
alpm_handle_t *handle = pkg->handle;
struct stat buf;
alpm_list_t *servers = pkg->origin_data.db->servers;
char *retpath;
char filepath[PATH_MAX];
for(alpm_list_t *j = servers; j; j = j->next) {
char *server = j->data;
if(strncmp("file://", server, strlen("file://")) == 0) {
int len = strlen(server) - strlen("file://") + 1 + strlen(pkg->filename) + 1;
if(sig) {
len += strlen(".sig");
snprintf(filepath, len, "%s/%s", server + strlen("file://"), pkg->filename);
} else {
snprintf(filepath, len, "%s/%s.sig", server + strlen("file://"), pkg->filename);
}
if(stat(filepath, &buf) == 0 && S_ISREG(buf.st_mode)) {
STRDUP(retpath, filepath, RET_ERR(handle, ALPM_ERR_MEMORY, NULL));
_alpm_log(handle, ALPM_LOG_DEBUG, "found pkg in repo cache: %s\n", retpath);
return retpath;
}
}
}
return _alpm_filecache_find(handle, pkg->filename);
}
/** Find a filename in a registered alpm cachedir. /** Find a filename in a registered alpm cachedir.
* @param handle the context handle * @param handle the context handle
* @param filename name of file to find * @param filename name of file to find
@@ -842,10 +862,17 @@ char *_alpm_filecache_find(alpm_handle_t *handle, const char *filename)
for(i = handle->cachedirs; i; i = i->next) { for(i = handle->cachedirs; i; i = i->next) {
snprintf(path, PATH_MAX, "%s%s", (char *)i->data, snprintf(path, PATH_MAX, "%s%s", (char *)i->data,
filename); filename);
if(stat(path, &buf) == 0 && S_ISREG(buf.st_mode)) { if(stat(path, &buf) == 0) {
retpath = strdup(path); if(S_ISREG(buf.st_mode)) {
_alpm_log(handle, ALPM_LOG_DEBUG, "found cached pkg: %s\n", retpath); retpath = strdup(path);
return retpath; _alpm_log(handle, ALPM_LOG_DEBUG, "found cached pkg: %s\n", retpath);
return retpath;
} else {
_alpm_log(handle, ALPM_LOG_WARNING,
"cached pkg '%s' is not a regular file: mode=%i\n", path, buf.st_mode);
}
} else if(errno != ENOENT) {
_alpm_log(handle, ALPM_LOG_WARNING, "could not open '%s'\n: %s", path, strerror(errno));
} }
} }
/* package wasn't found in any cachedir */ /* package wasn't found in any cachedir */
@@ -857,10 +884,10 @@ char *_alpm_filecache_find(alpm_handle_t *handle, const char *filename)
* @param filename name of file to find * @param filename name of file to find
* @return 0 if the filename was not found, 1 otherwise * @return 0 if the filename was not found, 1 otherwise
*/ */
int _alpm_filecache_exists(alpm_handle_t *handle, const char *filename) int _alpm_cache_pkg_exists(alpm_pkg_t *pkg, int sig)
{ {
int res; int res;
char *fpath = _alpm_filecache_find(handle, filename); char *fpath = _alpm_cache_find_pkg(pkg, sig);
res = (fpath != NULL); res = (fpath != NULL);
FREE(fpath); FREE(fpath);
return res; return res;
@@ -927,8 +954,7 @@ const char *_alpm_filecache_setup(alpm_handle_t *handle)
static int md5_file(const char *path, unsigned char output[16]) static int md5_file(const char *path, unsigned char output[16])
{ {
#if HAVE_LIBSSL #if HAVE_LIBSSL
EVP_MD_CTX *ctx; MD5_CTX ctx;
const EVP_MD *md = EVP_get_digestbyname("MD5");
#else /* HAVE_LIBNETTLE */ #else /* HAVE_LIBNETTLE */
struct md5_ctx ctx; struct md5_ctx ctx;
#endif #endif
@@ -945,8 +971,7 @@ static int md5_file(const char *path, unsigned char output[16])
} }
#if HAVE_LIBSSL #if HAVE_LIBSSL
ctx = EVP_MD_CTX_create(); MD5_Init(&ctx);
EVP_DigestInit_ex(ctx, md, NULL);
#else /* HAVE_LIBNETTLE */ #else /* HAVE_LIBNETTLE */
md5_init(&ctx); md5_init(&ctx);
#endif #endif
@@ -956,7 +981,7 @@ static int md5_file(const char *path, unsigned char output[16])
continue; continue;
} }
#if HAVE_LIBSSL #if HAVE_LIBSSL
EVP_DigestUpdate(ctx, buf, n); MD5_Update(&ctx, buf, n);
#else /* HAVE_LIBNETTLE */ #else /* HAVE_LIBNETTLE */
md5_update(&ctx, n, buf); md5_update(&ctx, n, buf);
#endif #endif
@@ -970,8 +995,7 @@ static int md5_file(const char *path, unsigned char output[16])
} }
#if HAVE_LIBSSL #if HAVE_LIBSSL
EVP_DigestFinal_ex(ctx, output, NULL); MD5_Final(output, &ctx);
EVP_MD_CTX_destroy(ctx);
#else /* HAVE_LIBNETTLE */ #else /* HAVE_LIBNETTLE */
md5_digest(&ctx, MD5_DIGEST_SIZE, output); md5_digest(&ctx, MD5_DIGEST_SIZE, output);
#endif #endif
@@ -986,8 +1010,7 @@ static int md5_file(const char *path, unsigned char output[16])
static int sha256_file(const char *path, unsigned char output[32]) static int sha256_file(const char *path, unsigned char output[32])
{ {
#if HAVE_LIBSSL #if HAVE_LIBSSL
EVP_MD_CTX *ctx; SHA256_CTX ctx;
const EVP_MD *md = EVP_get_digestbyname("SHA256");
#else /* HAVE_LIBNETTLE */ #else /* HAVE_LIBNETTLE */
struct sha256_ctx ctx; struct sha256_ctx ctx;
#endif #endif
@@ -1004,8 +1027,7 @@ static int sha256_file(const char *path, unsigned char output[32])
} }
#if HAVE_LIBSSL #if HAVE_LIBSSL
ctx = EVP_MD_CTX_create(); SHA256_Init(&ctx);
EVP_DigestInit_ex(ctx, md, NULL);
#else /* HAVE_LIBNETTLE */ #else /* HAVE_LIBNETTLE */
sha256_init(&ctx); sha256_init(&ctx);
#endif #endif
@@ -1015,7 +1037,7 @@ static int sha256_file(const char *path, unsigned char output[32])
continue; continue;
} }
#if HAVE_LIBSSL #if HAVE_LIBSSL
EVP_DigestUpdate(ctx, buf, n); SHA256_Update(&ctx, buf, n);
#else /* HAVE_LIBNETTLE */ #else /* HAVE_LIBNETTLE */
sha256_update(&ctx, n, buf); sha256_update(&ctx, n, buf);
#endif #endif
@@ -1029,8 +1051,7 @@ static int sha256_file(const char *path, unsigned char output[32])
} }
#if HAVE_LIBSSL #if HAVE_LIBSSL
EVP_DigestFinal_ex(ctx, output, NULL); SHA256_Final(output, &ctx);
EVP_MD_CTX_destroy(ctx);
#else /* HAVE_LIBNETTLE */ #else /* HAVE_LIBNETTLE */
sha256_digest(&ctx, SHA256_DIGEST_SIZE, output); sha256_digest(&ctx, SHA256_DIGEST_SIZE, output);
#endif #endif

View File

@@ -1,7 +1,7 @@
/* /*
* util.h * util.h
* *
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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>
@@ -133,9 +133,10 @@ int _alpm_run_chroot(alpm_handle_t *handle, const char *cmd, char *const argv[],
_alpm_cb_io in_cb, void *in_ctx); _alpm_cb_io in_cb, void *in_ctx);
int _alpm_ldconfig(alpm_handle_t *handle); int _alpm_ldconfig(alpm_handle_t *handle);
int _alpm_str_cmp(const void *s1, const void *s2); int _alpm_str_cmp(const void *s1, const void *s2);
char *_alpm_cache_find_pkg(alpm_pkg_t *pkg, int sig);
char *_alpm_filecache_find(alpm_handle_t *handle, const char *filename); char *_alpm_filecache_find(alpm_handle_t *handle, const char *filename);
/* Checks whether a file exists in cache */ /* Checks whether a file exists in cache */
int _alpm_filecache_exists(alpm_handle_t *handle, const char *filename); int _alpm_cache_pkg_exists(alpm_pkg_t *pkg, int sig);
const char *_alpm_filecache_setup(alpm_handle_t *handle); const char *_alpm_filecache_setup(alpm_handle_t *handle);
/* Unlike many uses of alpm_pkgvalidation_t, _alpm_test_checksum expects /* Unlike many uses of alpm_pkgvalidation_t, _alpm_test_checksum expects
* an enum value rather than a bitfield. */ * an enum value rather than a bitfield. */

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2006-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> * Copyright (c) 2006-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -8,7 +8,7 @@ project('pacman',
'sysconfdir=/etc', 'sysconfdir=/etc',
'localstatedir=/var', 'localstatedir=/var',
], ],
meson_version : '>= 0.56') meson_version : '>= 0.51')
libalpm_version = '13.0.1' libalpm_version = '13.0.1'
@@ -26,15 +26,14 @@ MANDIR = join_paths(PREFIX, get_option('mandir'))
BUILDSCRIPT = get_option('buildscript') BUILDSCRIPT = get_option('buildscript')
LIBMAKEPKGDIR = join_paths(PREFIX, DATAROOTDIR, 'makepkg') LIBMAKEPKGDIR = join_paths(PREFIX, DATAROOTDIR, 'makepkg')
PKGDATADIR = join_paths(PREFIX, DATAROOTDIR, meson.project_name()) PKGDATADIR = join_paths(PREFIX, DATAROOTDIR, meson.project_name())
KEYRINGDIR = join_paths(PREFIX, DATAROOTDIR, get_option('keyringdir'))
PYTHON = import('python').find_installation('python3') PYTHON = import('python').find_installation('python3')
LDCONFIG = get_option('ldconfig') LDCONFIG = get_option('ldconfig')
MESON_MAKE_SYMLINK = join_paths(meson.project_source_root(), 'build-aux/meson-make-symlink.sh') MESON_MAKE_SYMLINK = join_paths(meson.source_root(), 'build-aux/meson-make-symlink.sh')
BASH = find_program('bash4', 'bash') BASH = find_program('bash4', 'bash')
if BASH.found() if BASH.found()
bash_version = run_command(BASH, '-c', 'IFS=.; echo "${BASH_VERSINFO[*]:0:3}"', check: true).stdout() bash_version = run_command(BASH, '-c', 'IFS=.; echo "${BASH_VERSINFO[*]:0:3}"').stdout()
have_bash = bash_version.version_compare('>= 4.4.0') have_bash = bash_version.version_compare('>= 4.4.0')
endif endif
@@ -44,7 +43,7 @@ endif
bashcompletion = dependency('bash-completion', required : false) bashcompletion = dependency('bash-completion', required : false)
if bashcompletion.found() if bashcompletion.found()
BASHCOMPDIR = bashcompletion.get_variable(pkgconfig: 'completionsdir') BASHCOMPDIR = bashcompletion.get_pkgconfig_variable('completionsdir')
else else
BASHCOMPDIR = join_paths(DATAROOTDIR, 'bash-completion/completions') BASHCOMPDIR = join_paths(DATAROOTDIR, 'bash-completion/completions')
endif endif
@@ -54,8 +53,7 @@ if get_option('use-git-version')
find_program('git'), find_program('git'),
'describe', 'describe',
'--abbrev=4', '--abbrev=4',
'--dirty', '--dirty').stdout().strip().strip('v')
check: true).stdout().strip().strip('v')
else else
PACKAGE_VERSION = meson.project_version() PACKAGE_VERSION = meson.project_version()
endif endif
@@ -92,11 +90,6 @@ endif
libarchive = dependency('libarchive', libarchive = dependency('libarchive',
version : '>=3.0.0', version : '>=3.0.0',
static : get_option('buildstatic')) static : get_option('buildstatic'))
if libarchive.version().version_compare('>=3.6.0')
bsdtar_no_read_sparse = '--no-read-sparse'
else
bsdtar_no_read_sparse = ''
endif
libcurl = dependency('libcurl', libcurl = dependency('libcurl',
version : '>=7.55.0', version : '>=7.55.0',
@@ -104,7 +97,7 @@ libcurl = dependency('libcurl',
static : get_option('buildstatic')) static : get_option('buildstatic'))
conf.set('HAVE_LIBCURL', libcurl.found()) conf.set('HAVE_LIBCURL', libcurl.found())
needed_gpgme_version = '>=1.12.0' needed_gpgme_version = '>=1.3.0'
gpgme = dependency('gpgme', gpgme = dependency('gpgme',
version : needed_gpgme_version, version : needed_gpgme_version,
required : get_option('gpgme'), required : get_option('gpgme'),
@@ -182,22 +175,7 @@ foreach type : [
endif endif
endforeach endforeach
if conf.has('HAVE_STRUCT_STATVFS_F_FLAG')
if conf.has('HAVE_GETMNTINFO')
if cc.compiles('''
#include <sys/types.h>
#include <sys/statvfs.h>
void func() {
struct statvfs *buf;
getmntinfo(&buf, 0);
}
''')
conf.set('FSSTATSTYPE', 'struct statvfs')
else
conf.set('FSSTATSTYPE', 'struct statfs')
endif
elif conf.has('HAVE_STRUCT_STATVFS_F_FLAG')
conf.set('FSSTATSTYPE', 'struct statvfs') conf.set('FSSTATSTYPE', 'struct statvfs')
elif conf.has('HAVE_STRUCT_STATFS_F_FLAGS') elif conf.has('HAVE_STRUCT_STATFS_F_FLAGS')
conf.set('FSSTATSTYPE', 'struct statfs') conf.set('FSSTATSTYPE', 'struct statfs')
@@ -205,7 +183,6 @@ endif
if get_option('debug') if get_option('debug')
extra_cflags = [ extra_cflags = [
'-pedantic',
'-Wcast-align', '-Wcast-align',
'-Wclobbered', '-Wclobbered',
'-Wempty-body', '-Wempty-body',
@@ -253,7 +230,7 @@ strip_static = '--strip-debug'
file_seccomp = get_option('file-seccomp') file_seccomp = get_option('file-seccomp')
# meson-git has find_program('file', required: false, version: '>=5.38') # meson-git has find_program('file', required: false, version: '>=5.38')
filever = run_command('sh', '-c', 'file --version | sed -n "s/^file-\(.*\)/\\1/p"', check: true).stdout() filever = run_command('sh', '-c', 'file --version | sed -n "s/^file-\(.*\)/\\1/p"').stdout()
if file_seccomp.enabled() or ( file_seccomp.auto() and filever.version_compare('>= 5.38') ) if file_seccomp.enabled() or ( file_seccomp.auto() and filever.version_compare('>= 5.38') )
filecmd = 'file -S' filecmd = 'file -S'
endif endif
@@ -268,7 +245,7 @@ elif os.contains('bsd') or os == 'dragonfly'
inodecmd = 'stat -f \'%i %N\'' inodecmd = 'stat -f \'%i %N\''
endif endif
chost = run_command(cc, '-dumpmachine', check: true).stdout().strip() chost = run_command(cc, '-dumpmachine').stdout().strip()
carch = chost.split('-')[0] carch = chost.split('-')[0]
# annoyingly, we have to maintain two sets of configuration_data which is # annoyingly, we have to maintain two sets of configuration_data which is
@@ -283,9 +260,8 @@ substs.set('LOCALEDIR', LOCALEDIR)
substs.set('sysconfdir', SYSCONFDIR) substs.set('sysconfdir', SYSCONFDIR)
substs.set('localstatedir', LOCALSTATEDIR) substs.set('localstatedir', LOCALSTATEDIR)
substs.set('PKGDATADIR', PKGDATADIR) substs.set('PKGDATADIR', PKGDATADIR)
substs.set('KEYRINGDIR', KEYRINGDIR)
substs.set('PREFIX', PREFIX) substs.set('PREFIX', PREFIX)
substs.set('BASH', BASH.full_path()) substs.set('BASH', BASH.path())
substs.set('PACKAGE_VERSION', PACKAGE_VERSION) substs.set('PACKAGE_VERSION', PACKAGE_VERSION)
substs.set('PACKAGE_NAME', meson.project_name()) substs.set('PACKAGE_NAME', meson.project_name())
substs.set('BUILDSCRIPT', BUILDSCRIPT) substs.set('BUILDSCRIPT', BUILDSCRIPT)
@@ -297,7 +273,6 @@ substs.set('LIBMAKEPKGDIR', LIBMAKEPKGDIR)
substs.set('STRIP_BINARIES', strip_binaries) substs.set('STRIP_BINARIES', strip_binaries)
substs.set('STRIP_SHARED', strip_shared) substs.set('STRIP_SHARED', strip_shared)
substs.set('STRIP_STATIC', strip_static) substs.set('STRIP_STATIC', strip_static)
substs.set('BSDTAR_NO_READ_SPARSE', bsdtar_no_read_sparse)
subdir('lib/libalpm') subdir('lib/libalpm')
subdir('src/common') subdir('src/common')
@@ -336,7 +311,7 @@ libalpm_a = static_library(
'alpm_objlib', 'alpm_objlib',
libalpm_sources, libalpm_sources,
# https://github.com/mesonbuild/meson/issues/3937 # https://github.com/mesonbuild/meson/issues/3937
objects : libcommon.extract_all_objects(recursive: true), objects : libcommon.extract_all_objects(),
include_directories : includes, include_directories : includes,
gnu_symbol_visibility : 'hidden', gnu_symbol_visibility : 'hidden',
dependencies : alpm_deps) dependencies : alpm_deps)
@@ -398,7 +373,7 @@ executable(
foreach wrapper : script_wrappers foreach wrapper : script_wrappers
cdata = configuration_data() cdata = configuration_data()
cdata.set_quoted('BASH', BASH.full_path()) cdata.set_quoted('BASH', BASH.path())
cdata.set_quoted('BUILDDIR', wrapper[2]) cdata.set_quoted('BUILDDIR', wrapper[2])
cdata.set_quoted('REAL_PROGPATH', wrapper[1].full_path()) cdata.set_quoted('REAL_PROGPATH', wrapper[1].full_path())
@@ -406,7 +381,7 @@ foreach wrapper : script_wrappers
# directory. Use configure_file instead of a custom_target to ensure that # directory. Use configure_file instead of a custom_target to ensure that
# permissions on the input script wrapper are preserved. # permissions on the input script wrapper are preserved.
configure_file( configure_file(
input : join_paths(meson.project_source_root(), 'build-aux', 'script-wrapper.sh.in'), input : join_paths(meson.source_root(), 'build-aux', 'script-wrapper.sh.in'),
output : wrapper[0], output : wrapper[0],
configuration : cdata) configuration : cdata)
endforeach endforeach
@@ -417,12 +392,6 @@ configure_file(
configuration : substs, configuration : substs,
install_dir : SYSCONFDIR) install_dir : SYSCONFDIR)
configure_file(
input : 'etc/makepkg.conf.d/rust.conf.in',
output : 'rust.conf',
configuration : substs,
install_dir : join_paths(SYSCONFDIR, 'makepkg.conf.d/'))
configure_file( configure_file(
input : 'etc/pacman.conf.in', input : 'etc/pacman.conf.in',
output : 'pacman.conf', output : 'pacman.conf',
@@ -446,10 +415,10 @@ foreach path : [
endforeach endforeach
TEST_ENV = environment() TEST_ENV = environment()
TEST_ENV.set('PMTEST_SCRIPTLIB_DIR', join_paths(meson.project_source_root(), 'scripts/library/')) TEST_ENV.set('PMTEST_SCRIPTLIB_DIR', join_paths(meson.source_root(), 'scripts/library/'))
TEST_ENV.set('PMTEST_LIBMAKEPKG_DIR', join_paths(meson.project_build_root(), 'scripts/libmakepkg/')) TEST_ENV.set('PMTEST_LIBMAKEPKG_DIR', join_paths(meson.build_root(), 'scripts/libmakepkg/'))
TEST_ENV.set('PMTEST_UTIL_DIR', meson.project_build_root() + '/') TEST_ENV.set('PMTEST_UTIL_DIR', meson.build_root() + '/')
TEST_ENV.set('PMTEST_SCRIPT_DIR', join_paths(meson.project_build_root(), 'scripts/')) TEST_ENV.set('PMTEST_SCRIPT_DIR', join_paths(meson.build_root(), 'scripts/'))
subdir('test/pacman') subdir('test/pacman')
subdir('test/scripts') subdir('test/scripts')
@@ -464,7 +433,6 @@ message('\n '.join([
' localstatedir : @0@'.format(LOCALSTATEDIR), ' localstatedir : @0@'.format(LOCALSTATEDIR),
' database dir : @0@'.format(join_paths(LOCALSTATEDIR, 'lib/pacman/')), ' database dir : @0@'.format(join_paths(LOCALSTATEDIR, 'lib/pacman/')),
' cache dir : @0@'.format(join_paths(LOCALSTATEDIR, 'cache/pacman/pkg/')), ' cache dir : @0@'.format(join_paths(LOCALSTATEDIR, 'cache/pacman/pkg/')),
' keyringdir : @0@'.format(KEYRINGDIR),
' compiler : @0@ @1@'.format(cc.get_id(), cc.version()), ' compiler : @0@ @1@'.format(cc.get_id(), cc.version()),
'', '',
' Architecture : @0@'.format(carch), ' Architecture : @0@'.format(carch),

View File

@@ -26,9 +26,6 @@ option('buildscript', type : 'string', value : 'PKGBUILD',
option('datarootdir', type : 'string', value : 'share', option('datarootdir', type : 'string', value : 'share',
description : 'FIXME') description : 'FIXME')
option('keyringdir', type : 'string', value: 'pacman/keyrings',
description : 'Where to look for keyring files under datarootdir')
option('makepkg-template-dir', type : 'string', value : '/usr/share/makepkg-template', option('makepkg-template-dir', type : 'string', value : '/usr/share/makepkg-template',
description : 'template dir used by makepkg-template') description : 'template dir used by makepkg-template')

View File

@@ -28,7 +28,7 @@ changelog=
source=("$pkgbase-$pkgver.tar.gz" source=("$pkgbase-$pkgver.tar.gz"
"$pkgname-$pkgver.patch") "$pkgname-$pkgver.patch")
noextract=() noextract=()
sha256sums=() md5sums=()
validpgpkeys=() validpgpkeys=()
prepare() { prepare() {

View File

@@ -25,7 +25,7 @@ options=()
install= install=
source=('FOLDER::VCS+URL#FRAGMENT') source=('FOLDER::VCS+URL#FRAGMENT')
noextract=() noextract=()
sha256sums=('SKIP') md5sums=('SKIP')
# Please refer to the 'USING VCS SOURCES' section of the PKGBUILD man page for # Please refer to the 'USING VCS SOURCES' section of the PKGBUILD man page for
# a description of each element in the source array. # a description of each element in the source array.

View File

@@ -27,7 +27,7 @@ changelog=
source=("$pkgname-$pkgver.tar.gz" source=("$pkgname-$pkgver.tar.gz"
"$pkgname-$pkgver.patch") "$pkgname-$pkgver.patch")
noextract=() noextract=()
sha256sums=() md5sums=()
validpgpkeys=() validpgpkeys=()
prepare() { prepare() {

View File

@@ -586,38 +586,38 @@ _pacman_conf() {
esac esac
} }
_pacman_key_shortopts=( _key_shortopts=(
'-h[show help]' '-h[show help]'
'-a[Add the specified keys (empty for stdin)]: :_files' '-a[Add the specified keys (empty for stdin)]: :_files'
'-d[Remove the Specified keyids]:*: :_pacman_key_list' '-d[Remove the Specified keyids]:*: :_keys'
'-e[Export the specified or all keyids]:*: :_pacman_key_list' '-e[Export the specified or all keyids]:*: :_keys'
'-f[List fingerprint for specified or all keyids]:*: :_pacman_key_list' '-f[List fingerprint for specified or all keyids]:*: :_keys'
'-l[List the specified or all keys]:*: :_pacman_key_list' '-l[List the specified or all keys]:*: :_keys'
'-r[Fetch the specified keyids]:*: :_pacman_key_list' '-r[Fetch the specified keyids]:*: :_keys'
'-u[Update the trustdb of pacman]' '-u[Update the trustdb of pacman]'
'-v[Verify the file specified by the signature]: :_files -g "*.sig"' '-v[Verify the file specified by the signature]: :_files -g "*.sig"'
'-V[Show program version]' '-V[Show program version]'
) )
_pacman_key_longopts=( _key_longopts=(
'--help[show help]' '--help[show help]'
'--add[Add the specified keys (empty for stdin)]: :_files' '--add[Add the specified keys (empty for stdin)]: :_files'
'--delete[Remove the Specified keyids]:*: :_pacman_key_list' '--delete[Remove the Specified keyids]:*: :_keys'
'--export[Export the specified or all keyids]:*: :_pacman_key_list' '--export[Export the specified or all keyids]:*: :_keys'
'--finger[List fingerprint for specified or all keyids]:*: :_pacman_key_list' '--finger[List fingerprint for specified or all keyids]:*: :_keys'
'--list-keys[List the specified or all keys]:*: :_pacman_key_list' '--list-keys[List the specified or all keys]:*: :_keys'
'--recv-keys[Fetch the specified keyids]:*: :_pacman_key_list' '--recv-keys[Fetch the specified keyids]:*: :_keys'
'--updatedb[Update the trustdb of pacman]' '--updatedb[Update the trustdb of pacman]'
'--verify[Verify the file specified by the signature]: :_files -g "*.sig"' '--verify[Verify the file specified by the signature]: :_files -g "*.sig"'
'--version[Show program version]' '--version[Show program version]'
'--edit-key[Present a menu for key management task on keyids]:*: :_pacman_key_list' '--edit-key[Present a menu for key management task on keyids]:*: :_keys'
'--import[Imports pubring.gpg from dir(s)]: :_files -g "*.gpg"' '--import[Imports pubring.gpg from dir(s)]: :_files -g "*.gpg"'
'--import-tb[Imports ownertrust values from trustdb.gpg in dir(s)]: :_files -g "*.gpg"' '--import-tb[Imports ownertrust values from trustdb.gpg in dir(s)]: :_files -g "*.gpg"'
'--init[Ensure the keyring is properly initialized]' '--init[Ensure the keyring is properly initialized]'
'--list-sigs[List keys and their signatures]:*: :_pacman_key_list' '--list-sigs[List keys and their signatures]:*: :_keys'
'--lsign-key[Locally sign the specified keyid]:*: :_pacman_key_list' '--lsign-key[Locally sign the specified keyid]:*: :_keys'
'--populate[Reload the default keys from the (given) keyrings in '@keyringdir@']: :_path_files -W @keyringdir@' '--populate[Reload the default keys from the (given) keyrings in '/usr/share/pacman/keyrings']: :_path_files -W /usr/share/pacman/keyrings'
'--refresh-keys[Update specified or all keys from a keyserver]:*: :_pacman_key_list' '--refresh-keys[Update specified or all keys from a keyserver]:*: :_keys'
) )
_pacman_key_options=( _pacman_key_options=(
@@ -631,13 +631,13 @@ _pacman_key() {
--*) --*)
_arguments -s : \ _arguments -s : \
"$_pacman_key_options[@]" \ "$_pacman_key_options[@]" \
"$_pacman_key_longopts[@]" "$_key_longopts[@]"
;; ;;
-*) -*)
_arguments -s : \ _arguments -s : \
"$_pacman_key_options[@]" \ "$_pacman_key_options[@]" \
"$_pacman_key_shortopts[@]" \ "$_key_shortopts[@]" \
"$_pacman_key_longopts[@]" "$_key_longopts[@]"
;; ;;
*) *)
i=$# i=$#
@@ -648,13 +648,13 @@ _pacman_key() {
--*) --*)
_arguments -s : \ _arguments -s : \
"$_pacman_key_options[@]" \ "$_pacman_key_options[@]" \
"$_pacman_key_longopts[@]" "$_key_longopts[@]"
;; ;;
-*) -*)
_arguments -s : \ _arguments -s : \
"$_pacman_key_options[@]" \ "$_pacman_key_options[@]" \
"$_pacman_key_shortopts[@]" \ "$_key_shortopts[@]" \
"$_pacman_key_longopts[@]" "$_key_longopts[@]"
;; ;;
*) *)
return 1 return 1
@@ -664,7 +664,7 @@ _pacman_key() {
esac esac
} }
_pacman_key_list() { _keys() {
local keylist keys local keylist keys
keylist=$(pacman-key --list-keys 2>/dev/null | awk ' keylist=$(pacman-key --list-keys 2>/dev/null | awk '
$1 == "pub" { $1 == "pub" {
@@ -733,7 +733,7 @@ _makepkg_longopts=(
'--check[Run check() function in the PKGBUILD]' '--check[Run check() function in the PKGBUILD]'
'--config[Use an alternate config file instead of '@sysconfdir@/makepkg.conf']: :_files' '--config[Use an alternate config file instead of '@sysconfdir@/makepkg.conf']: :_files'
'--holdver[Do not update VCS sources]' '--holdver[Do not update VCS sources]'
'--key[Specify key to use for gpg signing instead of the default]: :_pacman_key_list' '--key[Specify key to use for gpg signing instead of the default]: :_keys'
'--noarchive[Do not create package archive]' '--noarchive[Do not create package archive]'
'--nocheck[Do not run the check() function in the PKGBUILD]' '--nocheck[Do not run the check() function in the PKGBUILD]'
'--noprepare[Do not run the prepare() function in the PKGBUILD]' '--noprepare[Do not run the prepare() function in the PKGBUILD]'

View File

@@ -1,38 +0,0 @@
#!/bin/bash
#
# autodep.sh - functions for automatically adding depends/provides
#
# Copyright (c) 2021-2022 Pacman Development Team <pacman-dev@lists.archlinux.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/>.
#
[[ -n "$LIBMAKEPKG_AUTODEP_SH" ]] && return
LIBMAKEPKG_AUTODEP_SH=1
LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
declare -a autodep_functions
for lib in "$LIBRARY/autodep/"*.sh; do
source "$lib"
done
readonly -a autodep_functions
generate_autodeps() {
for func in ${autodep_functions[@]}; do
$func
done
}

View File

@@ -1,75 +0,0 @@
#!/bin/bash
#
# library_depends.sh - Automatically add library requirements to depends
#
# Copyright (c) 2021-2022 Pacman Development Team <pacman-dev@lists.archlinux.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/>.
#
[[ -n "$LIBMAKEPKG_AUTODEP_LIBRARY_DEPENDS_SH" ]] && return
LIBMAKEPKG_AUTODEP_LIBRARY_DEPENDS_SH=1
LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
autodep_functions+=('library_depends')
library_depends() {
if check_option "autodeps" "y"; then
local dep filename libdeps libdir libpath prefix sofile
declare -a libdeps
while IFS= read -rd '' filename; do
for sofile in $(LC_ALL=C readelf -d $filename 2>/dev/null | sed -nr 's/.*Shared library: \[(.*)\].*/\1/p'); do
# get the full path of the library
libpath=$(ldd $filename | sed -nr "s/.$sofile => (.*) \(.*\)/\1/p")
# if ldd can not find the library, it is likely part of the package and not in filesystem
if [[ -z $libpath ]]; then
continue
fi
# skip if the library is part of the package
if [[ -e "$pkgdir/$libpath" ]]; then
continue
fi
# find the prefix for the dependency
libpath=${libpath#/}
libpath=${libpath%/*}
unset prefix
for libdir in ${LIB_DIRS[@]}; do
if [[ ${libdir/*:} == ${libpath} ]]; then
prefix=${libdir/:*}
fi
done
if [[ -z ${prefix} ]]; then
continue
fi
# only add library dependency if it exists - this helps bootstraping dependencies
if [[ $(run_pacman -T "$prefix:$sofile") ]]; then
continue
fi
libdeps+=("$prefix:$sofile")
done
done < <(find "$pkgdir" -type f -perm -u+x -print0)
depends+=($(printf '%s\n' "${libdeps[@]}" | LC_ALL=C sort -u))
fi
}

View File

@@ -1,56 +0,0 @@
#!/bin/bash
#
# library_provides.sh - Automatically add a packages libraries to provides
#
# Copyright (c) 2021-2022 Pacman Development Team <pacman-dev@lists.archlinux.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/>.
#
[[ -n "$LIBMAKEPKG_AUTODEP_LIBRARY_PROVIDES_SH" ]] && return
LIBMAKEPKG_AUTODEP_LIBRARY_PROVIDES_SH=1
LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
autodep_functions+=('library_provides')
library_provides() {
if check_option "autodeps" "y"; then
for lib in ${LIB_DIRS[@]}; do
dir=${lib/*:}
prefix=${lib/:*}
if [[ ! -d "$pkgdir/$dir" ]]; then
continue;
fi
mapfile -t filenames < <(find "$pkgdir/$dir" -maxdepth 1 -type f | LC_ALL=C sort)
for fn in "${filenames[@]}"; do
# check we have a shared library
if LC_ALL=C readelf -h "$fn" 2>/dev/null | grep -q '.*Type:.*DYN (Shared object file).*'; then
# extract library soname
local sofile=$(LC_ALL=C readelf -d "$fn" 2>/dev/null | sed -n 's/.*Library soname: \[\(.*\)\].*/\1/p')
if [[ -z "$sofile" ]]; then
# the library has no soname
continue
fi
provides+=("$prefix:$sofile")
fi
done
done
fi
}

View File

@@ -1,18 +0,0 @@
libmakepkg_module = 'autodep'
sources = [
'library_depends.sh.in',
'library_provides.sh.in',
]
foreach src : sources
output_dir = join_paths(get_option('datadir'), 'makepkg', libmakepkg_module)
custom_target(
libmakepkg_module + '_' + src.underscorify(),
command : [ SCRIPT_EDITOR, '@INPUT@', '@OUTPUT@' ],
input : src,
output : '@BASENAME@',
install : true,
install_dir : output_dir)
endforeach

View File

@@ -3,7 +3,7 @@
# buildenv.sh - functions for altering the build environment before # buildenv.sh - functions for altering the build environment before
# compilation # compilation
# #
# Copyright (c) 2015-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> # Copyright (c) 2015-2021 Pacman Development Team <pacman-dev@lists.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
@@ -25,22 +25,18 @@ LIBMAKEPKG_BUILDENV_SH=1
LIBRARY=${LIBRARY:-'@libmakepkgdir@'} LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
declare -a buildenv_functions build_options declare -a buildenv_functions build_options
buildenv_vars=('CPPFLAGS' 'CFLAGS' 'CXXFLAGS' 'LDFLAGS' 'MAKEFLAGS' 'CHOST')
for lib in "$LIBRARY/buildenv/"*.sh; do for lib in "$LIBRARY/buildenv/"*.sh; do
source "$lib" source "$lib"
done done
readonly -a buildenv_functions buildenv_vars build_options readonly -a buildenv_functions build_options
prepare_buildenv() { prepare_buildenv() {
# ensure this function runs first
buildenv_buildflags
for func in ${buildenv_functions[@]}; do for func in ${buildenv_functions[@]}; do
$func $func
done done
# ensure all necessary build variables are exported # ensure all necessary build variables are exported
export ${buildenv_vars[@]} export CPPFLAGS CFLAGS CXXFLAGS LDFLAGS RUSTFLAGS MAKEFLAGS CHOST
} }

View File

@@ -2,7 +2,7 @@
# #
# buildflags.sh - Clear user-specified buildflags if requested # buildflags.sh - Clear user-specified buildflags if requested
# #
# Copyright (c) 2011-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> # Copyright (c) 2011-2021 Pacman Development Team <pacman-dev@lists.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
@@ -26,9 +26,10 @@ LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
source "$LIBRARY/util/option.sh" source "$LIBRARY/util/option.sh"
build_options+=('buildflags') build_options+=('buildflags')
buildenv_functions+=('buildenv_buildflags')
buildenv_buildflags() { buildenv_buildflags() {
if check_option "buildflags" "n"; then if check_option "buildflags" "n"; then
unset ${buildenv_vars[@]} unset CPPFLAGS CFLAGS DEBUG_CFLAGS CXXFLAGS DEBUG_CXXFLAGS LDFLAGS RUSTFLAGS DEBUG_RUSTFLAGS
fi fi
} }

View File

@@ -4,7 +4,7 @@
# ccache - Cache compilations and reuse them to save time on repetitions # ccache - Cache compilations and reuse them to save time on repetitions
# distcc - Distribute compilation of C and C++ across machines # distcc - Distribute compilation of C and C++ across machines
# #
# Copyright (c) 2007-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> # Copyright (c) 2007-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -3,7 +3,7 @@
# debugflags.sh - Specify flags for building a package with debugging # debugflags.sh - Specify flags for building a package with debugging
# symbols # symbols
# #
# Copyright (c) 2012-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> # Copyright (c) 2012-2021 Pacman Development Team <pacman-dev@lists.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
@@ -29,10 +29,12 @@ source "$LIBRARY/util/option.sh"
buildenv_functions+=('buildenv_debugflags') buildenv_functions+=('buildenv_debugflags')
buildenv_debugflags() { buildenv_debugflags() {
if check_option "debug" "y" && ! check_option "buildflags" "n"; then if check_option "debug" "y"; then
DEBUG_CFLAGS+=" -ffile-prefix-map=$srcdir=${DBGSRCDIR:-/usr/src/debug}/${pkgbase}" DEBUG_CFLAGS+=" -fdebug-prefix-map=$srcdir=${DBGSRCDIR:-/usr/src/debug}"
DEBUG_CXXFLAGS+=" -ffile-prefix-map=$srcdir=${DBGSRCDIR:-/usr/src/debug}/${pkgbase}" DEBUG_CXXFLAGS+=" -fdebug-prefix-map=$srcdir=${DBGSRCDIR:-/usr/src/debug}"
DEBUG_RUSTFLAGS+=" --remap-path-prefix=$srcdir=${DBGSRCDIR:-/usr/src/debug}"
CFLAGS+=" $DEBUG_CFLAGS" CFLAGS+=" $DEBUG_CFLAGS"
CXXFLAGS+=" $DEBUG_CXXFLAGS" CXXFLAGS+=" $DEBUG_CXXFLAGS"
RUSTFLAGS+=" $DEBUG_RUSTFLAGS"
fi fi
} }

View File

@@ -3,7 +3,7 @@
# lto.sh - Specify flags for building a package with link-time # lto.sh - Specify flags for building a package with link-time
# optimisation # optimisation
# #
# Copyright (c) 2021-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> # Copyright (c) 2021 Pacman Development Team <pacman-dev@lists.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
@@ -30,9 +30,8 @@ build_options+=('lto')
buildenv_functions+=('buildenv_lto') buildenv_functions+=('buildenv_lto')
buildenv_lto() { buildenv_lto() {
if check_option "lto" "y" && ! check_option "buildflags" "n"; then if check_option "lto" "y"; then
CFLAGS+=" ${LTOFLAGS:--flto}" CFLAGS+=" -flto"
CXXFLAGS+=" ${LTOFLAGS:--flto}" CXXFLAGS+=" -flto"
LDFLAGS+=" ${LTOFLAGS:--flto}"
fi fi
} }

View File

@@ -2,7 +2,7 @@
# #
# makeflags.sh - Clear user-specified makeflags if requested # makeflags.sh - Clear user-specified makeflags if requested
# #
# Copyright (c) 2007-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> # Copyright (c) 2007-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -6,7 +6,6 @@ sources = [
'debugflags.sh.in', 'debugflags.sh.in',
'lto.sh.in', 'lto.sh.in',
'makeflags.sh.in', 'makeflags.sh.in',
'rust.sh.in',
] ]
foreach src : sources foreach src : sources

View File

@@ -1,36 +0,0 @@
#!/usr/bin/bash
#
# rust.sh - Specify flags for building a package with rust
#
# Copyright (c) 2022 Pacman Development Team <pacman-dev@lists.archlinux.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/>.
#
[[ -n "$LIBMAKEPKG_BUILDENV_RUST_SH" ]] && return
LIBMAKEPKG_BUILDENV_RUST_SH=1
LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
source "$LIBRARY/util/option.sh"
buildenv_var+=('RUSTFLAGS' 'DEBUG_RUSTFLAGS')
buildenv_functions+=('buildenv_rust')
buildenv_rust() {
if check_option "debug" "y" && ! check_option "buildflags" "n"; then
DEBUG_RUSTFLAGS+=" --remap-path-prefix=$srcdir=${DBGSRCDIR:-/usr/src/debug}/${pkgbase}"
RUSTFLAGS+=" $DEBUG_RUSTFLAGS"
fi
}

View File

@@ -2,7 +2,7 @@
# #
# executable.sh - confirm presence of dependent executables # executable.sh - confirm presence of dependent executables
# #
# Copyright (c) 2018-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> # Copyright (c) 2018-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -2,7 +2,7 @@
# #
# ccache.sh - Confirm presence of ccache binary # ccache.sh - Confirm presence of ccache binary
# #
# Copyright (c) 2011-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> # Copyright (c) 2011-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -2,7 +2,7 @@
# #
# checksum.sh - Confirm presence of binaries for checksum operations # checksum.sh - Confirm presence of binaries for checksum operations
# #
# Copyright (c) 2016-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> # Copyright (c) 2016-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -1,38 +0,0 @@
#!/usr/bin/bash
#
# debugedit.sh - Confirm presence of debugedit binary
#
# Copyright (c) 2022 Pacman Development Team <pacman-dev@lists.archlinux.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/>.
#
[[ -n "$LIBMAKEPKG_EXECUTABLE_DEBUGEDIT_SH" ]] && return
LIBMAKEPKG_EXECUTABLE_DEBUGEDIT_SH=1
LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
source "$LIBRARY/util/message.sh"
source "$LIBRARY/util/option.sh"
executable_functions+=('executable_debugedit')
executable_debugedit() {
if check_option "debug" "y"; then
if ! type -p debugedit >/dev/null; then
error "$(gettext "Cannot find the %s binary required for including source files in debug packages.")" "debugedit"
return 1
fi
fi
}

View File

@@ -2,7 +2,7 @@
# #
# distcc.sh - Confirm presence of distcc binary # distcc.sh - Confirm presence of distcc binary
# #
# Copyright (c) 2011-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> # Copyright (c) 2011-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -2,7 +2,7 @@
# #
# fakeroot.sh - Confirm presence of fakeroot binary # fakeroot.sh - Confirm presence of fakeroot binary
# #
# Copyright (c) 2011-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> # Copyright (c) 2011-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -2,7 +2,7 @@
# #
# gpg.sh - Confirm presence of gpg binary # gpg.sh - Confirm presence of gpg binary
# #
# Copyright (c) 2011-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> # Copyright (c) 2011-2021 Pacman Development Team <pacman-dev@lists.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

View File

@@ -2,7 +2,7 @@
# #
# gzip.sh - Confirm presence of gzip binary # gzip.sh - Confirm presence of gzip binary
# #
# Copyright (c) 2011-2022 Pacman Development Team <pacman-dev@lists.archlinux.org> # Copyright (c) 2011-2021 Pacman Development Team <pacman-dev@lists.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

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