mirror of
https://github.com/gentoo-mirror/gentoo.git
synced 2026-09-24 04:59:14 -07:00
Merge updates from master
This commit is contained in:
@@ -1,8 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd">
|
||||
<pkgmetadata>
|
||||
<maintainer type="person">
|
||||
<email>sultan@gentoo.org</email>
|
||||
<name>Stephan Hartmann</name>
|
||||
</maintainer>
|
||||
<!-- maintainer-needed -->
|
||||
</pkgmetadata>
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd">
|
||||
<pkgmetadata>
|
||||
<maintainer type="person">
|
||||
<email>sultan@gentoo.org</email>
|
||||
<name>Stephan Hartmann</name>
|
||||
</maintainer>
|
||||
<!-- maintainer-needed -->
|
||||
</pkgmetadata>
|
||||
|
||||
@@ -13,7 +13,7 @@ SRC_URI+=" https://dev.gentoo.org/~williamh/dist/${P}-deps.tar.xz"
|
||||
|
||||
LICENSE="Apache-2.0 BSD BSD-2 MIT"
|
||||
SLOT="0"
|
||||
KEYWORDS="amd64 ~arm64 ~riscv ~x86"
|
||||
KEYWORDS="amd64 ~arm64 ~loong ~riscv ~x86"
|
||||
IUSE="selinux"
|
||||
|
||||
COMMON_DEPEND="acct-group/node_exporter
|
||||
|
||||
@@ -1,10 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd">
|
||||
<pkgmetadata>
|
||||
<maintainer type="person">
|
||||
<email>sultan@gentoo.org</email>
|
||||
<name>Stephan Hartmann</name>
|
||||
</maintainer>
|
||||
<!-- maintainer-needed -->
|
||||
<upstream>
|
||||
<remote-id type="github">liquidctl/liquidctl</remote-id>
|
||||
<remote-id type="pypi">liquidctl</remote-id>
|
||||
|
||||
@@ -1,10 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd">
|
||||
<pkgmetadata>
|
||||
<maintainer type="person">
|
||||
<email>sultan@gentoo.org</email>
|
||||
<name>Stephan Hartmann</name>
|
||||
</maintainer>
|
||||
<maintainer type="person">
|
||||
<email>gyakovlev@gentoo.org</email>
|
||||
<name>Georgy Yakovlev</name>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 1999-2021 Gentoo Authors
|
||||
# Copyright 1999-2023 Gentoo Authors
|
||||
# Distributed under the terms of the GNU General Public License v2
|
||||
|
||||
EAPI=7
|
||||
@@ -10,7 +10,7 @@ SRC_URI="mirror://sourceforge/docbook2x/${P}.tar.gz"
|
||||
HOMEPAGE="http://docbook2x.sourceforge.net/"
|
||||
|
||||
SLOT="0"
|
||||
KEYWORDS="~alpha amd64 arm arm64 hppa ~ia64 ppc ppc64 ~riscv ~s390 sparc x86 ~x86-linux ~x64-macos"
|
||||
KEYWORDS="~alpha amd64 arm arm64 hppa ~ia64 ~loong ppc ppc64 ~riscv ~s390 sparc x86 ~x86-linux ~x64-macos"
|
||||
IUSE="test"
|
||||
RESTRICT="!test? ( test )"
|
||||
LICENSE="MIT"
|
||||
|
||||
@@ -9,7 +9,7 @@ DESCRIPTION="vim plugin: syntax highlighting for perl module Template-Toolkit"
|
||||
HOMEPAGE="https://www.vim.org/scripts/script.php?script_id=830"
|
||||
|
||||
LICENSE="vim"
|
||||
KEYWORDS="~amd64 ~arm ~arm64 ~ppc ~ppc64 ~riscv ~x86 ~amd64-linux ~x86-linux ~ppc-macos ~x64-macos ~x64-solaris"
|
||||
KEYWORDS="~amd64 ~arm ~arm64 ~loong ~ppc ~ppc64 ~riscv ~x86 ~amd64-linux ~x86-linux ~ppc-macos ~x64-macos ~x64-solaris"
|
||||
|
||||
VIM_PLUGIN_HELPTEXT=\
|
||||
"This plugin provides syntax highlighting for perl module Template-Toolkit"
|
||||
|
||||
@@ -1,10 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd">
|
||||
<pkgmetadata>
|
||||
<maintainer type="person">
|
||||
<email>sultan@gentoo.org</email>
|
||||
<name>Stephan Hartmann</name>
|
||||
</maintainer>
|
||||
<!-- maintainer-needed -->
|
||||
<use>
|
||||
<flag name="fox">Build a <pkg>x11-libs/fox</pkg> GUI</flag>
|
||||
</use>
|
||||
|
||||
@@ -1,10 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd">
|
||||
<pkgmetadata>
|
||||
<maintainer type="person">
|
||||
<email>sultan@gentoo.org</email>
|
||||
<name>Stephan Hartmann</name>
|
||||
</maintainer>
|
||||
<!-- maintainer-needed -->
|
||||
<upstream>
|
||||
<remote-id type="github">trezor/cython-hidapi</remote-id>
|
||||
<remote-id type="pypi">hidapi</remote-id>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 1999-2022 Gentoo Authors
|
||||
# Copyright 1999-2023 Gentoo Authors
|
||||
# Distributed under the terms of the GNU General Public License v2
|
||||
|
||||
# @ECLASS: bazel.eclass
|
||||
@@ -27,6 +27,13 @@ if [[ ${CATEGORY}/${PN} != "dev-util/bazel" ]]; then
|
||||
BDEPEND=">=dev-util/bazel-0.20"
|
||||
fi
|
||||
|
||||
# @ECLASS_VARIABLE: BAZEL_BINARY
|
||||
# @DESCRIPTION:
|
||||
# The program to invoke for bazel. Defaults to `bazel`. Useful if you have
|
||||
# multiple bazel installations on your machine that differ in verson suffix,
|
||||
# e.g., `bazel-5`, `bazel-6`.
|
||||
BAZEL_BINARY="${BAZEL_BINARY:-bazel}"
|
||||
|
||||
# @FUNCTION: bazel_get_flags
|
||||
# @DESCRIPTION:
|
||||
# Obtain and print the bazel flags for target and host *FLAGS.
|
||||
@@ -138,7 +145,7 @@ ebazel() {
|
||||
output_base="${output_base%/}-bazel-base"
|
||||
mkdir -p "${output_base}" || die
|
||||
|
||||
set -- bazel --bazelrc="${T}/bazelrc" --output_base="${output_base}" ${@}
|
||||
set -- "${BAZEL_BINARY}" --bazelrc="${T}/bazelrc" --output_base="${output_base}" ${@}
|
||||
echo "${*}" >&2
|
||||
"${@}" || die "ebazel failed"
|
||||
}
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
DIST hyprland-0.27.2.gh.tar.gz 4992717 BLAKE2B 6725ee593edb4f7d127eb95ed567bc7344edc066a9ce818ba99bd15eb718ce1d8de86a63da5684521ccbe3ba918a3f385c3a3e662314704e60e855101d391d05 SHA512 92e8ca21eba52ff423654cd345d37125656c32e1262e4e76d8841ee4ba698788d46d70a5876fc9aca42440efa5dd4122f46c84365da53810284a666f5d13ce7e
|
||||
DIST hyprland-0.28.0.gh.tar.gz 14060441 BLAKE2B 25059b74b67df222867e84f5f1d44219302e7e454ec68110b70d6e915e95913bfdc8c6112bc8725e9be61f10a44603a96ba70980a9835d4b7757363825b93326 SHA512 c0802f2b061d5c9265c7767fae6ddaf00c1bbf6dc620f75593ba1538f94105a9ebe1517b7be444a1e70b81fd3a4205afd8154ba9ad02b3d610b00a9440ee6a63
|
||||
DIST hyprland-0.29.1.gh.tar.gz 14056843 BLAKE2B 9e9f1b15d354cf5e391b1add5dc5ce8cf2e4b206853465028a6170e613c7c5435e9a6e3318cd1006d3c2874d885128b95495bba08444fade0185b2a69d9ab950 SHA512 abbfd244b7473ec521a639b0d424e2873193ab9ef0d24e6272e15b79da9ade8ee56ea4cffdc328713f99600c1d320384839d32eb223034945659b015125e98b1
|
||||
|
||||
@@ -16,45 +16,65 @@ LICENSE="BSD"
|
||||
SLOT="0"
|
||||
IUSE="X legacy-renderer systemd video_cards_nvidia"
|
||||
|
||||
RDEPEND="
|
||||
app-misc/jq
|
||||
dev-libs/glib:2
|
||||
dev-libs/libinput:=
|
||||
# bundled wlroots has the following dependency string according to included headers.
|
||||
# wlroots[drm,gles2-renderer,libinput,x11-backend?,X?]
|
||||
# enable x11-backend with X and vice versa
|
||||
WLROOTS_RDEPEND="
|
||||
>=dev-libs/libinput-1.14.0:=
|
||||
dev-libs/libliftoff
|
||||
dev-libs/wayland
|
||||
dev-libs/wayland-protocols
|
||||
dev-util/glslang
|
||||
dev-util/vulkan-headers
|
||||
gui-libs/gtk-layer-shell
|
||||
>=dev-libs/wayland-1.22
|
||||
media-libs/libdisplay-info
|
||||
media-libs/libglvnd[X?]
|
||||
media-libs/mesa[gles2,wayland,X?]
|
||||
media-libs/vulkan-loader
|
||||
media-libs/libglvnd
|
||||
media-libs/mesa[egl(+),gles2]
|
||||
sys-apps/hwdata:=
|
||||
sys-auth/seatd:=
|
||||
x11-base/xcb-proto
|
||||
>=x11-libs/libdrm-2.4.114
|
||||
x11-libs/libxkbcommon
|
||||
>=x11-libs/pixman-0.42.0
|
||||
virtual/libudev:=
|
||||
X? (
|
||||
x11-base/xwayland
|
||||
x11-libs/libxcb:0=
|
||||
x11-libs/xcb-util-renderutil
|
||||
x11-libs/xcb-util-wm
|
||||
)
|
||||
"
|
||||
WLROOTS_DEPEND="
|
||||
>=dev-libs/wayland-protocols-1.32
|
||||
"
|
||||
WLROOTS_BDEPEND="
|
||||
dev-util/glslang
|
||||
dev-util/wayland-scanner
|
||||
"
|
||||
|
||||
RDEPEND="
|
||||
${WLROOTS_RDEPEND}
|
||||
dev-libs/glib:2
|
||||
dev-libs/libinput
|
||||
dev-libs/wayland
|
||||
media-libs/libglvnd
|
||||
x11-libs/cairo
|
||||
x11-libs/libdrm
|
||||
x11-libs/libxkbcommon
|
||||
x11-libs/pango
|
||||
x11-libs/pixman
|
||||
x11-misc/xkeyboard-config
|
||||
virtual/libudev:=
|
||||
X? (
|
||||
gui-libs/wlroots[x11-backend]
|
||||
x11-base/xwayland
|
||||
x11-libs/libxcb:=
|
||||
x11-libs/xcb-util-image
|
||||
x11-libs/xcb-util-renderutil
|
||||
x11-libs/xcb-util-wm
|
||||
x11-libs/libxcb:0=
|
||||
)
|
||||
"
|
||||
DEPEND="${RDEPEND}"
|
||||
BDEPEND="
|
||||
DEPEND="
|
||||
${RDEPEND}
|
||||
${WLROOTS_DEPEND}
|
||||
dev-libs/hyprland-protocols
|
||||
>=dev-libs/wayland-1.22.0
|
||||
>=dev-libs/wayland-protocols-1.25
|
||||
"
|
||||
BDEPEND="
|
||||
${WLROOTS_BDEPEND}
|
||||
app-misc/jq
|
||||
dev-util/cmake
|
||||
dev-util/wayland-scanner
|
||||
dev-vcs/git
|
||||
>=gui-libs/wlroots-0.16.0[X?]
|
||||
virtual/pkgconfig
|
||||
"
|
||||
|
||||
pkg_setup() {
|
||||
@@ -75,10 +95,12 @@ pkg_setup() {
|
||||
src_prepare() {
|
||||
if use video_cards_nvidia; then
|
||||
cd "${S}/subprojects/wlroots" || die
|
||||
eapply "${S}/nix/wlroots-nvidia.patch"
|
||||
eapply "${S}/nix/patches/wlroots-nvidia.patch"
|
||||
cd "${S}" || die
|
||||
fi
|
||||
|
||||
eapply "${FILESDIR}/hyprland-0.28.0-no-wlroots-automagic-r1.patch"
|
||||
|
||||
default
|
||||
}
|
||||
|
||||
@@ -94,10 +116,4 @@ src_configure() {
|
||||
|
||||
src_install() {
|
||||
meson_src_install --skip-subprojects wlroots
|
||||
|
||||
# FIXME: undo this in next release if meson is fixed (https://github.com/hyprwm/Hyprland/pull/2820)
|
||||
# https://github.com/hyprwm/Hyprland/commit/70dae78c1b5b17288a3e343b87ca6d10244ee937
|
||||
# upstream added new backgrounds but didnt add them to be installed by meson.
|
||||
insinto /usr/share/hyprland
|
||||
doins assets/wall_anime_{2,4,8}K.png
|
||||
}
|
||||
@@ -1,10 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd">
|
||||
<pkgmetadata>
|
||||
<maintainer type="person">
|
||||
<email>sultan@gentoo.org</email>
|
||||
<name>Stephan Hartmann</name>
|
||||
</maintainer>
|
||||
<!-- maintainer-needed -->
|
||||
<upstream>
|
||||
<remote-id type="github">schollz/croc</remote-id>
|
||||
</upstream>
|
||||
|
||||
@@ -15,7 +15,7 @@ S="${WORKDIR}/${P/_/-}"
|
||||
|
||||
LICENSE="GPL-2"
|
||||
SLOT="0"
|
||||
KEYWORDS="amd64 ~ia64 x86 ~amd64-linux ~x64-macos"
|
||||
KEYWORDS="amd64 ~ia64 ~loong x86 ~amd64-linux ~x64-macos"
|
||||
|
||||
RDEPEND="
|
||||
|| (
|
||||
|
||||
@@ -0,0 +1,622 @@
|
||||
Bug: https://bugs.gentoo.org/911775
|
||||
|
||||
--- a/base/base64.cc
|
||||
+++ b/base/base64.cc
|
||||
@@ -68,13 +68,13 @@
|
||||
throw std::runtime_error("internal error, in split");
|
||||
}
|
||||
|
||||
- optional<unsigned> char_to_index(char c) {
|
||||
+ boost::optional<unsigned> char_to_index(char c) {
|
||||
// FIXME: very slow
|
||||
for (unsigned i = 0; i < 64; i++)
|
||||
if (table_[i] == c)
|
||||
- return optional<unsigned>(i);
|
||||
+ return boost::optional<unsigned>(i);
|
||||
|
||||
- return optional<unsigned>();
|
||||
+ return boost::optional<unsigned>();
|
||||
}
|
||||
|
||||
decoded_or_error success(vector<unsigned char> const &decoded) {
|
||||
@@ -92,7 +92,7 @@
|
||||
}
|
||||
|
||||
decoded_or_error decode_quad(char c1, char c2, char c3, char c4) {
|
||||
- typedef optional<unsigned> oi;
|
||||
+ typedef boost::optional<unsigned> oi;
|
||||
unsigned char d1, d2, d3;
|
||||
vector<unsigned char> decoded;
|
||||
|
||||
--- a/base/run.h
|
||||
+++ b/base/run.h
|
||||
@@ -1,7 +1,7 @@
|
||||
#ifndef BASE_DATA_RANGE_H
|
||||
#define BASE_DATA_RANGE_H
|
||||
|
||||
-#include <boost/optional.hpp>
|
||||
+#include <boost/optional/optional_io.hpp>
|
||||
#include <ostream>
|
||||
|
||||
//----------------------------------------------------------------
|
||||
--- a/block-cache/copier.cc
|
||||
+++ b/block-cache/copier.cc
|
||||
@@ -90,19 +90,19 @@
|
||||
copier::wait_complete()
|
||||
{
|
||||
if (complete_.empty()) {
|
||||
- return optional<copy_op>();
|
||||
+ return boost::optional<copy_op>();
|
||||
|
||||
} else {
|
||||
auto op = complete_.front();
|
||||
complete_.pop_front();
|
||||
- return optional<copy_op>(op);
|
||||
+ return boost::optional<copy_op>(op);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
copier::wait_(unsigned µ)
|
||||
{
|
||||
- optional<io_engine::wait_result> mp;
|
||||
+ boost::optional<io_engine::wait_result> mp;
|
||||
|
||||
if (!pending())
|
||||
return;
|
||||
--- a/block-cache/io_engine.cc
|
||||
+++ b/block-cache/io_engine.cc
|
||||
@@ -125,13 +125,13 @@
|
||||
return r == 1;
|
||||
}
|
||||
|
||||
-optional<io_engine::wait_result>
|
||||
+boost::optional<io_engine::wait_result>
|
||||
aio_engine::wait()
|
||||
{
|
||||
return wait_(NULL);
|
||||
}
|
||||
|
||||
-optional<io_engine::wait_result>
|
||||
+boost::optional<io_engine::wait_result>
|
||||
aio_engine::wait(unsigned µsec)
|
||||
{
|
||||
timespec start = micro_to_ts(microsec);
|
||||
@@ -156,7 +156,7 @@
|
||||
}
|
||||
|
||||
if (r == 0) {
|
||||
- return optional<wait_result>();
|
||||
+ return boost::optional<wait_result>();
|
||||
}
|
||||
|
||||
iocb *cb = reinterpret_cast<iocb *>(event.obj);
|
||||
@@ -164,19 +164,19 @@
|
||||
|
||||
if (event.res == cb->u.c.nbytes) {
|
||||
cbs_.free(cb);
|
||||
- return optional<wait_result>(make_pair(true, context));
|
||||
+ return boost::optional<wait_result>(make_pair(true, context));
|
||||
|
||||
} else if (static_cast<int>(event.res) < 0) {
|
||||
cbs_.free(cb);
|
||||
- return optional<wait_result>(make_pair(false, context));
|
||||
+ return boost::optional<wait_result>(make_pair(false, context));
|
||||
|
||||
} else {
|
||||
cbs_.free(cb);
|
||||
- return optional<wait_result>(make_pair(false, context));
|
||||
+ return boost::optional<wait_result>(make_pair(false, context));
|
||||
}
|
||||
|
||||
// shouldn't get here
|
||||
- return optional<wait_result>(make_pair(false, 0));
|
||||
+ return boost::optional<wait_result>(make_pair(false, 0));
|
||||
}
|
||||
|
||||
struct timespec
|
||||
--- a/caching/cache_restore.cc
|
||||
+++ b/caching/cache_restore.cc
|
||||
@@ -40,8 +40,8 @@
|
||||
override_version(1) {
|
||||
}
|
||||
|
||||
- optional<string> input;
|
||||
- optional<string> output;
|
||||
+ boost::optional<string> input;
|
||||
+ boost::optional<string> output;
|
||||
|
||||
uint32_t metadata_version;
|
||||
bool clean_shutdown;
|
||||
@@ -154,11 +154,11 @@
|
||||
return 0;
|
||||
|
||||
case 'i':
|
||||
- fs.input = optional<string>(string(optarg));
|
||||
+ fs.input = boost::optional<string>(string(optarg));
|
||||
break;
|
||||
|
||||
case 'o':
|
||||
- fs.output = optional<string>(string(optarg));
|
||||
+ fs.output = boost::optional<string>(string(optarg));
|
||||
break;
|
||||
|
||||
case 'q':
|
||||
--- a/caching/cache_writeback.cc
|
||||
+++ b/caching/cache_writeback.cc
|
||||
@@ -150,7 +150,7 @@
|
||||
}
|
||||
|
||||
void check_for_completed_copies(bool block = false) {
|
||||
- optional<copy_op> mop;
|
||||
+ boost::optional<copy_op> mop;
|
||||
|
||||
do {
|
||||
if (block)
|
||||
--- a/era/era_invalidate.cc
|
||||
+++ b/era/era_invalidate.cc
|
||||
@@ -27,7 +27,7 @@
|
||||
}
|
||||
|
||||
bool metadata_snapshot_;
|
||||
- optional<uint32_t> era_threshold_;
|
||||
+ boost::optional<uint32_t> era_threshold_;
|
||||
};
|
||||
|
||||
//--------------------------------
|
||||
@@ -88,7 +88,7 @@
|
||||
walk_writeset_tree(md.tm_, *md.writeset_tree_, v, dv);
|
||||
}
|
||||
|
||||
- void mark_blocks_since(metadata const &md, optional<uint32_t> const &threshold, set<uint32_t> &result) {
|
||||
+ void mark_blocks_since(metadata const &md, boost::optional<uint32_t> const &threshold, set<uint32_t> &result) {
|
||||
if (!threshold)
|
||||
// Can't get here, just putting in to pacify the compiler
|
||||
throw std::runtime_error("threshold not set");
|
||||
--- a/era/era_restore.cc
|
||||
+++ b/era/era_restore.cc
|
||||
@@ -28,8 +28,8 @@
|
||||
: quiet(false) {
|
||||
}
|
||||
|
||||
- optional<string> input;
|
||||
- optional<string> output;
|
||||
+ boost::optional<string> input;
|
||||
+ boost::optional<string> output;
|
||||
bool quiet;
|
||||
};
|
||||
|
||||
@@ -99,11 +99,11 @@
|
||||
return 0;
|
||||
|
||||
case 'i':
|
||||
- fs.input = optional<string>(string(optarg));
|
||||
+ fs.input = boost::optional<string>(string(optarg));
|
||||
break;
|
||||
|
||||
case 'o':
|
||||
- fs.output = optional<string>(string(optarg));
|
||||
+ fs.output = boost::optional<string>(string(optarg));
|
||||
break;
|
||||
|
||||
case 'q':
|
||||
--- a/Makefile.in
|
||||
+++ b/Makefile.in
|
||||
@@ -162,7 +162,7 @@
|
||||
TOP_BUILDDIR:=@top_builddir@
|
||||
CFLAGS+=-fPIC
|
||||
CFLAGS+=@LFS_FLAGS@
|
||||
-CXXFLAGS+=-fPIC -fno-strict-aliasing -std=c++11
|
||||
+CXXFLAGS+=-fPIC -fno-strict-aliasing
|
||||
|
||||
ifeq ("@DEVTOOLS@", "yes")
|
||||
CXXFLAGS+=-DDEV_TOOLS
|
||||
--- a/persistent-data/hex_dump.h
|
||||
+++ b/persistent-data/hex_dump.h
|
||||
@@ -19,6 +19,7 @@
|
||||
#ifndef HEX_DUMP_H
|
||||
#define HEX_DUMP_H
|
||||
|
||||
+#include <cstddef>
|
||||
#include <iosfwd>
|
||||
|
||||
//----------------------------------------------------------------
|
||||
--- a/persistent-data/transaction_manager.cc
|
||||
+++ b/persistent-data/transaction_manager.cc
|
||||
@@ -48,7 +48,7 @@
|
||||
transaction_manager::write_ref
|
||||
transaction_manager::new_block(validator v)
|
||||
{
|
||||
- optional<block_address> mb = sm_->new_block();
|
||||
+ boost::optional<block_address> mb = sm_->new_block();
|
||||
if (!mb)
|
||||
throw runtime_error("transaction_manager::new_block() couldn't allocate new block");
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
return make_pair(bm_->write_lock(orig, v), need_inc);
|
||||
|
||||
read_ref src = bm_->read_lock(orig, v);
|
||||
- optional<block_address> mb = sm_->new_block();
|
||||
+ boost::optional<block_address> mb = sm_->new_block();
|
||||
if (!mb)
|
||||
throw runtime_error("transaction_manager::shadow() couldn't allocate new block");
|
||||
|
||||
--- a/thin-provisioning/metadata_checker.cc
|
||||
+++ b/thin-provisioning/metadata_checker.cc
|
||||
@@ -182,7 +182,7 @@
|
||||
error_state examine_mapping_tree_(transaction_manager::ptr tm,
|
||||
superblock_detail::superblock const &sb,
|
||||
nested_output &out,
|
||||
- optional<space_map::ptr> data_sm,
|
||||
+ boost::optional<space_map::ptr> data_sm,
|
||||
bool ignore_non_fatal) {
|
||||
out << "examining mapping tree" << end_message();
|
||||
nested_output::nest _ = out.push();
|
||||
@@ -213,7 +213,7 @@
|
||||
error_state examine_mapping_tree(transaction_manager::ptr tm,
|
||||
superblock_detail::superblock const &sb,
|
||||
nested_output &out,
|
||||
- optional<space_map::ptr> data_sm,
|
||||
+ boost::optional<space_map::ptr> data_sm,
|
||||
bool ignore_non_fatal) {
|
||||
error_state err = examine_devices_tree_(tm, sb, out, ignore_non_fatal);
|
||||
err << examine_mapping_tree_(tm, sb, out, data_sm, ignore_non_fatal);
|
||||
@@ -403,7 +403,7 @@
|
||||
// until that there's a better solution in space
|
||||
// and time complexity
|
||||
space_map::ptr data_sm{open_disk_sm(*tm, &sb.data_space_map_root_)};
|
||||
- optional<space_map::ptr> core_sm;
|
||||
+ boost::optional<space_map::ptr> core_sm;
|
||||
err_ << examine_data_mappings(tm, sb, options_.data_mapping_opts_, out_, core_sm);
|
||||
|
||||
if (err_ == FATAL)
|
||||
@@ -418,7 +418,7 @@
|
||||
err_ << compare_space_maps(data_sm, *core_sm, out_);
|
||||
} else
|
||||
err_ << examine_data_mappings(tm, sb, options_.data_mapping_opts_, out_,
|
||||
- optional<space_map::ptr>());
|
||||
+ boost::optional<space_map::ptr>());
|
||||
|
||||
metadata_checked_ = true;
|
||||
}
|
||||
@@ -509,7 +509,7 @@
|
||||
superblock_detail::superblock const &sb,
|
||||
check_options::data_mapping_options option,
|
||||
nested_output &out,
|
||||
- optional<space_map::ptr> data_sm) {
|
||||
+ boost::optional<space_map::ptr> data_sm) {
|
||||
error_state err = NO_ERROR;
|
||||
|
||||
switch (option) {
|
||||
--- a/thin-provisioning/metadata_dumper.cc
|
||||
+++ b/thin-provisioning/metadata_dumper.cc
|
||||
@@ -125,7 +125,7 @@
|
||||
};
|
||||
|
||||
// See comment on get_map_ids
|
||||
- optional<set<uint32_t> >
|
||||
+ boost::optional<set<uint32_t> >
|
||||
get_dev_ids(transaction_manager &tm, block_address root) {
|
||||
d_thin_id_extractor de;
|
||||
fatal_details_damage dv;
|
||||
@@ -134,7 +134,7 @@
|
||||
try {
|
||||
walk_device_tree(tree, de, dv, true);
|
||||
} catch (...) {
|
||||
- return optional<set<uint32_t>>();
|
||||
+ return boost::optional<set<uint32_t>>();
|
||||
}
|
||||
|
||||
return de.dd_;
|
||||
@@ -150,7 +150,7 @@
|
||||
|
||||
// The walk will do more sanity checks than we did when scanning the metadata, so
|
||||
// it's possible that it will fail and throw a metadata damage exception.
|
||||
- optional<set<uint32_t> >
|
||||
+ boost::optional<set<uint32_t> >
|
||||
get_map_ids(transaction_manager &tm, block_address root) {
|
||||
m_thin_id_extractor me;
|
||||
fatal_mapping_damage mv;
|
||||
@@ -159,7 +159,7 @@
|
||||
try {
|
||||
walk_mapping_tree(tree, me, mv, true);
|
||||
} catch (...) {
|
||||
- return optional<set<uint32_t>>();
|
||||
+ return boost::optional<set<uint32_t>>();
|
||||
}
|
||||
|
||||
return me.dd_;
|
||||
@@ -288,7 +288,7 @@
|
||||
uint32_t time;
|
||||
};
|
||||
|
||||
- optional<roots>
|
||||
+ boost::optional<roots>
|
||||
find_best_roots(transaction_manager &tm) {
|
||||
vector<node_info> mapping_roots;
|
||||
vector<node_info> device_roots;
|
||||
@@ -334,7 +334,7 @@
|
||||
if (pairs.size())
|
||||
return mk_roots(pairs[0]);
|
||||
else
|
||||
- return optional<roots>();
|
||||
+ return boost::optional<roots>();
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -623,12 +623,12 @@
|
||||
}
|
||||
}
|
||||
|
||||
- optional<node_info> lookup_info(block_address b) const {
|
||||
+ boost::optional<node_info> lookup_info(block_address b) const {
|
||||
auto it = infos_.find(b);
|
||||
if (it == infos_.end())
|
||||
- return optional<node_info>();
|
||||
+ return boost::optional<node_info>();
|
||||
|
||||
- return optional<node_info>(it->second);
|
||||
+ return boost::optional<node_info>(it->second);
|
||||
}
|
||||
|
||||
block_manager &bm_;
|
||||
@@ -846,16 +846,16 @@
|
||||
return sb;
|
||||
}
|
||||
|
||||
- optional<superblock_detail::superblock>
|
||||
+ boost::optional<superblock_detail::superblock>
|
||||
maybe_read_superblock(block_manager::ptr bm)
|
||||
{
|
||||
try {
|
||||
auto sb = read_superblock(bm);
|
||||
- return optional<superblock_detail::superblock>(sb);
|
||||
+ return boost::optional<superblock_detail::superblock>(sb);
|
||||
} catch (...) {
|
||||
}
|
||||
|
||||
- return optional<superblock_detail::superblock>();
|
||||
+ return boost::optional<superblock_detail::superblock>();
|
||||
}
|
||||
|
||||
void
|
||||
--- a/thin-provisioning/thin_dump.cc
|
||||
+++ b/thin-provisioning/thin_dump.cc
|
||||
@@ -50,7 +50,7 @@
|
||||
string format;
|
||||
bool repair;
|
||||
bool use_metadata_snap;
|
||||
- optional<block_address> snap_location;
|
||||
+ boost::optional<block_address> snap_location;
|
||||
};
|
||||
|
||||
metadata::ptr open_metadata(string const &path, struct flags &flags) {
|
||||
--- a/thin-provisioning/thin_ls.cc
|
||||
+++ b/thin-provisioning/thin_ls.cc
|
||||
@@ -238,7 +238,7 @@
|
||||
|
||||
void pass1(metadata::ptr md, mapping_set &mappings, ::uint64_t dev_id) {
|
||||
dev_tree::key k = {dev_id};
|
||||
- optional<::uint64_t> dev_root = md->mappings_top_level_->lookup(k);
|
||||
+ boost::optional<::uint64_t> dev_root = md->mappings_top_level_->lookup(k);
|
||||
|
||||
if (!dev_root)
|
||||
throw runtime_error("couldn't find mapping tree root");
|
||||
@@ -254,7 +254,7 @@
|
||||
|
||||
block_address count_exclusives(metadata::ptr md, mapping_set const &mappings, ::uint64_t dev_id) {
|
||||
dev_tree::key k = {dev_id};
|
||||
- optional<::uint64_t> dev_root = md->mappings_top_level_->lookup(k);
|
||||
+ boost::optional<::uint64_t> dev_root = md->mappings_top_level_->lookup(k);
|
||||
|
||||
if (!dev_root)
|
||||
throw runtime_error("couldn't find mapping tree root");
|
||||
@@ -324,7 +324,7 @@
|
||||
metadata::ptr md;
|
||||
|
||||
if (flags.use_metadata_snap)
|
||||
- md.reset(new metadata(bm, optional<block_address>()));
|
||||
+ md.reset(new metadata(bm, boost::optional<block_address>()));
|
||||
else
|
||||
md.reset(new metadata(bm));
|
||||
|
||||
--- a/unit-tests/bitset_t.cc
|
||||
+++ b/unit-tests/bitset_t.cc
|
||||
@@ -60,14 +60,14 @@
|
||||
tm_(bm_, sm_) {
|
||||
}
|
||||
|
||||
- bitset::ptr
|
||||
+ persistent_data::bitset::ptr
|
||||
create_bitset() {
|
||||
- return bitset::ptr(new bitset(tm_));
|
||||
+ return persistent_data::bitset::ptr(new persistent_data::bitset(tm_));
|
||||
}
|
||||
|
||||
- bitset::ptr
|
||||
+ persistent_data::bitset::ptr
|
||||
open_bitset(block_address root, unsigned count) {
|
||||
- return bitset::ptr(new bitset(tm_, root, count));
|
||||
+ return persistent_data::bitset::ptr(new persistent_data::bitset(tm_, root, count));
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -81,7 +81,7 @@
|
||||
|
||||
TEST_F(BitsetTests, create_empty_bitset)
|
||||
{
|
||||
- bitset::ptr bs = create_bitset();
|
||||
+ persistent_data::bitset::ptr bs = create_bitset();
|
||||
ASSERT_THROW(bs->get(0), runtime_error);
|
||||
}
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
{
|
||||
unsigned const COUNT = 100000;
|
||||
|
||||
- bitset::ptr bs = create_bitset();
|
||||
+ persistent_data::bitset::ptr bs = create_bitset();
|
||||
bs->grow(COUNT, false);
|
||||
|
||||
for (unsigned i = 0; i < COUNT; i++)
|
||||
@@ -100,7 +100,7 @@
|
||||
{
|
||||
unsigned const COUNT = 100000;
|
||||
|
||||
- bitset::ptr bs = create_bitset();
|
||||
+ persistent_data::bitset::ptr bs = create_bitset();
|
||||
bs->grow(COUNT, true);
|
||||
|
||||
for (unsigned i = 0; i < COUNT; i++)
|
||||
@@ -111,7 +111,7 @@
|
||||
{
|
||||
unsigned const COUNT = 100000;
|
||||
|
||||
- bitset::ptr bs = create_bitset();
|
||||
+ persistent_data::bitset::ptr bs = create_bitset();
|
||||
bs->grow(COUNT, false);
|
||||
ASSERT_THROW(bs->grow(COUNT / 2, false), runtime_error);
|
||||
}
|
||||
@@ -120,7 +120,7 @@
|
||||
{
|
||||
unsigned const COUNT = 100000;
|
||||
unsigned const STEP = 37;
|
||||
- bitset::ptr bs = create_bitset();
|
||||
+ persistent_data::bitset::ptr bs = create_bitset();
|
||||
|
||||
vector<unsigned> chunks;
|
||||
unsigned c;
|
||||
@@ -150,7 +150,7 @@
|
||||
TEST_F(BitsetTests, set_out_of_bounds_throws)
|
||||
{
|
||||
unsigned const COUNT = 100000;
|
||||
- bitset::ptr bs = create_bitset();
|
||||
+ persistent_data::bitset::ptr bs = create_bitset();
|
||||
|
||||
ASSERT_THROW(bs->set(0, true), runtime_error);
|
||||
bs->grow(COUNT, true);
|
||||
@@ -160,7 +160,7 @@
|
||||
TEST_F(BitsetTests, set_works)
|
||||
{
|
||||
unsigned const COUNT = 100000;
|
||||
- bitset::ptr bs = create_bitset();
|
||||
+ persistent_data::bitset::ptr bs = create_bitset();
|
||||
|
||||
bs->grow(COUNT, true);
|
||||
for (unsigned i = 0; i < COUNT; i += 7)
|
||||
@@ -176,7 +176,7 @@
|
||||
block_address root;
|
||||
|
||||
{
|
||||
- bitset::ptr bs = create_bitset();
|
||||
+ persistent_data::bitset::ptr bs = create_bitset();
|
||||
|
||||
bs->grow(COUNT, true);
|
||||
for (unsigned i = 0; i < COUNT; i += 7)
|
||||
@@ -186,7 +186,7 @@
|
||||
}
|
||||
|
||||
{
|
||||
- bitset::ptr bs = open_bitset(root, COUNT);
|
||||
+ persistent_data::bitset::ptr bs = open_bitset(root, COUNT);
|
||||
for (unsigned i = 0; i < COUNT; i++)
|
||||
ASSERT_THAT(bs->get(i), Eq(i % 7 ? true : false));
|
||||
}
|
||||
@@ -198,7 +198,7 @@
|
||||
block_address root;
|
||||
|
||||
{
|
||||
- bitset::ptr bs = create_bitset();
|
||||
+ persistent_data::bitset::ptr bs = create_bitset();
|
||||
|
||||
bs->grow(COUNT, true);
|
||||
for (unsigned i = 0; i < COUNT; i += 7)
|
||||
@@ -211,7 +211,7 @@
|
||||
}
|
||||
|
||||
{
|
||||
- bitset::ptr bs = open_bitset(root, COUNT);
|
||||
+ persistent_data::bitset::ptr bs = open_bitset(root, COUNT);
|
||||
bitset_checker c(COUNT, 7);
|
||||
bs->walk_bitset(c);
|
||||
}
|
||||
--- a/unit-tests/copier_t.cc
|
||||
+++ b/unit-tests/copier_t.cc
|
||||
@@ -32,23 +32,27 @@
|
||||
namespace {
|
||||
unsigned const BLOCK_SIZE = 64u;
|
||||
using wait_result = io_engine::wait_result;
|
||||
+}
|
||||
|
||||
- ostream &operator <<(ostream &out, optional<wait_result> const &mwr) {
|
||||
+namespace boost {
|
||||
+ ostream &operator <<(ostream &out, boost::optional<wait_result> const &mwr) {
|
||||
if (mwr) {
|
||||
out << "Just[wait_result[" << mwr->first << ", " << mwr->second << "]]";
|
||||
} else
|
||||
out << "Nothing";
|
||||
return out;
|
||||
}
|
||||
+}
|
||||
|
||||
+namespace {
|
||||
class io_engine_mock : public io_engine {
|
||||
public:
|
||||
MOCK_METHOD3(open_file, handle(string const &, mode, sharing));
|
||||
MOCK_METHOD1(close_file, void(handle));
|
||||
MOCK_METHOD6(issue_io, bool(handle, dir, sector_t, sector_t, void *, unsigned));
|
||||
|
||||
- MOCK_METHOD0(wait, optional<wait_result>());
|
||||
- MOCK_METHOD1(wait, optional<wait_result>(unsigned &));
|
||||
+ MOCK_METHOD0(wait, boost::optional<wait_result>());
|
||||
+ MOCK_METHOD1(wait, boost::optional<wait_result>(unsigned &));
|
||||
};
|
||||
|
||||
class CopierTests : public Test {
|
||||
@@ -72,8 +76,8 @@
|
||||
BLOCK_SIZE, 1 * 1024 * 1024));
|
||||
}
|
||||
|
||||
- static optional<wait_result> make_wr(bool success, unsigned context) {
|
||||
- return optional<wait_result>(wait_result(success, context));
|
||||
+ static boost::optional<wait_result> make_wr(bool success, unsigned context) {
|
||||
+ return boost::optional<wait_result>(wait_result(success, context));
|
||||
}
|
||||
|
||||
void issue_successful_op(copier &c, copy_op &op, unsigned context) {
|
||||
@@ -258,7 +262,7 @@
|
||||
WillOnce(Return(true));
|
||||
|
||||
EXPECT_CALL(engine_, wait(micro)).
|
||||
- WillOnce(DoAll(SetArgReferee<0>(0u), Return(optional<wait_result>())));
|
||||
+ WillOnce(DoAll(SetArgReferee<0>(0u), Return(boost::optional<wait_result>())));
|
||||
|
||||
auto mop = c->wait(micro);
|
||||
ASSERT_FALSE(mop);
|
||||
--- a/unit-tests/rolling_hash_t.cc
|
||||
+++ b/unit-tests/rolling_hash_t.cc
|
||||
@@ -127,10 +127,10 @@
|
||||
unsigned min = 100000, max = 0;
|
||||
|
||||
bytes bs = random_bytes(1024 * 1024 * 100);
|
||||
- vector<unsigned> counts(window_size_, 0);
|
||||
+ vector<unsigned> counts(window_size_ + 1, 0);
|
||||
|
||||
for (unsigned i = 0; i < bs.size(); i++) {
|
||||
- optional<unsigned> b = h_.step(bs[i]);
|
||||
+ boost::optional<unsigned> b = h_.step(bs[i]);
|
||||
if (b) {
|
||||
counts[*b]++;
|
||||
|
||||
--- a/unit-tests/span_iterator_t.cc
|
||||
+++ b/unit-tests/span_iterator_t.cc
|
||||
@@ -81,7 +81,9 @@
|
||||
|
||||
base::run_set<block_address> forbidden;
|
||||
};
|
||||
+}
|
||||
|
||||
+namespace boost {
|
||||
ostream &operator <<(ostream &out, maybe_span const &m) {
|
||||
out << "maybe_span[";
|
||||
if (m)
|
||||
@@ -0,0 +1,70 @@
|
||||
# Copyright 1999-2023 Gentoo Authors
|
||||
# Distributed under the terms of the GNU General Public License v2
|
||||
|
||||
EAPI=7
|
||||
|
||||
inherit autotools flag-o-matic
|
||||
|
||||
DESCRIPTION="A suite of tools for thin provisioning on Linux"
|
||||
HOMEPAGE="https://github.com/jthornber/thin-provisioning-tools"
|
||||
|
||||
if [[ ${PV} != *9999 ]]; then
|
||||
SRC_URI="https://github.com/jthornber/${PN}/archive/v${PV}.tar.gz -> ${P}.tar.gz"
|
||||
KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~loong ~m68k ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~amd64-linux ~x86-linux"
|
||||
else
|
||||
inherit git-r3
|
||||
EGIT_REPO_URI='https://github.com/jthornber/thin-provisioning-tools.git'
|
||||
fi
|
||||
|
||||
LICENSE="GPL-3"
|
||||
SLOT="0"
|
||||
IUSE="static test"
|
||||
RESTRICT="!test? ( test )"
|
||||
|
||||
LIB_DEPEND="dev-libs/expat[static-libs(+)]
|
||||
dev-libs/libaio[static-libs(+)]"
|
||||
RDEPEND="!static? ( ${LIB_DEPEND//\[static-libs(+)]} )"
|
||||
DEPEND="${RDEPEND}
|
||||
static? ( ${LIB_DEPEND} )
|
||||
test? (
|
||||
>=dev-cpp/gtest-1.8.0
|
||||
)
|
||||
dev-libs/boost"
|
||||
|
||||
PATCHES=(
|
||||
"${FILESDIR}"/${PN}-0.7.0-build-fixes.patch
|
||||
"${FILESDIR}"/${PN}-0.9.0-build-fixes.patch
|
||||
"${FILESDIR}"/0.9.0-remove-boost_iostreams.patch
|
||||
"${FILESDIR}"/${PN}-0.9.0-metadata_checker-Rename-function-to-reflect-command-.patch
|
||||
"${FILESDIR}"/${PN}-0.9.0-thin_check-Allow-using-clear-needs-check-and-skip-ma.patch
|
||||
"${FILESDIR}"/${PN}-0.9.0-boost-gtest.patch
|
||||
)
|
||||
|
||||
src_prepare() {
|
||||
default
|
||||
eautoreconf
|
||||
}
|
||||
|
||||
src_configure() {
|
||||
use static && append-ldflags -static
|
||||
local myeconfargs=(
|
||||
--prefix="${EPREFIX}"/
|
||||
--bindir="${EPREFIX}"/sbin
|
||||
--with-optimisation=''
|
||||
$(use_enable test testing)
|
||||
)
|
||||
STRIP=true econf "${myeconfargs[@]}"
|
||||
}
|
||||
|
||||
src_compile() {
|
||||
emake V=
|
||||
}
|
||||
|
||||
src_test() {
|
||||
emake V= unit-test
|
||||
}
|
||||
|
||||
src_install() {
|
||||
emake V= DESTDIR="${D}" DATADIR="${ED}/usr/share" install
|
||||
dodoc README.md TODO.org
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 1999-2022 Gentoo Authors
|
||||
# Copyright 1999-2023 Gentoo Authors
|
||||
# Distributed under the terms of the GNU General Public License v2
|
||||
|
||||
EAPI=8
|
||||
@@ -12,7 +12,7 @@ SRC_URI="https://github.com/icecc/${PN}/archive/${PV}.tar.gz -> ${P}.tar.gz"
|
||||
|
||||
LICENSE="GPL-2"
|
||||
SLOT="0"
|
||||
KEYWORDS="~amd64 ~arm ~hppa ~ppc ~sparc ~x86"
|
||||
KEYWORDS="~amd64 ~arm ~hppa ~loong ~ppc ~sparc ~x86"
|
||||
|
||||
DEPEND="app-arch/libarchive:=
|
||||
app-arch/zstd:=
|
||||
|
||||
1707
sys-libs/glibc/glibc-2.38-r3.ebuild
Normal file
1707
sys-libs/glibc/glibc-2.38-r3.ebuild
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1638,6 +1638,21 @@ pkg_preinst() {
|
||||
fi
|
||||
}
|
||||
|
||||
glibc_refresh_ldconfig() {
|
||||
if [[ ${MERGE_TYPE} == buildonly ]]; then
|
||||
return
|
||||
fi
|
||||
|
||||
# Version check could be added to avoid unnecessary work, but ldconfig
|
||||
# should finish quickly enough to not matter.
|
||||
ebegin "Refreshing ld.so.cache"
|
||||
ldconfig -i
|
||||
if ! eend $?; then
|
||||
ewarn "Failed to refresh the ld.so.cache for you. Some programs may be broken"
|
||||
ewarn "before you manually do so (ldconfig -i)."
|
||||
fi
|
||||
}
|
||||
|
||||
pkg_postinst() {
|
||||
# nothing to do if just installing headers
|
||||
just_headers && return
|
||||
@@ -1648,6 +1663,17 @@ pkg_postinst() {
|
||||
fi
|
||||
|
||||
if ! is_crosscompile && [[ -z ${ROOT} ]] ; then
|
||||
# glibc-2.38+ on loong has ldconfig support added, but the ELF e_flags
|
||||
# handling has changed as well, which means stale ldconfig auxiliary
|
||||
# cache entries and failure to lookup libgcc_s / libstdc++ (breaking
|
||||
# every C++ application) / libgomp etc., among other breakages.
|
||||
#
|
||||
# To fix this, simply refresh the ld.so.cache without using the
|
||||
# auxiliary cache if we're natively installing on loong. This should
|
||||
# be done relatively soon because we want to minimize the breakage
|
||||
# window for the affected programs.
|
||||
use loong && glibc_refresh_ldconfig
|
||||
|
||||
use compile-locales || run_locale_gen "${EROOT}/"
|
||||
fi
|
||||
|
||||
|
||||
@@ -5,10 +5,6 @@
|
||||
<email>xgqt@gentoo.org</email>
|
||||
<name>Maciej Barć</name>
|
||||
</maintainer>
|
||||
<maintainer type="person">
|
||||
<email>sultan@gentoo.org</email>
|
||||
<name>Stephan Hartmann</name>
|
||||
</maintainer>
|
||||
<longdescription>
|
||||
A screencast tool to display your keys, inspired by Screenflick.
|
||||
Featuring:
|
||||
|
||||
Reference in New Issue
Block a user