Build Rust components and ship in optional mercurial-rust package

Original patch has been tweaked by Mads Kiilerich.
This commit is contained in:
Aleksei Bavshin 2022-04-14 20:11:07 -07:00 committed by Mads Kiilerich
parent d5e33e9ca9
commit 095581b5d6
2 changed files with 151 additions and 2 deletions

View File

@ -0,0 +1,65 @@
# HG changeset patch
# Parent 5bd6bcd31dd1ebb63b8914b00064f96297267af7
Patch cargo metadata for Fedora build
Backport upstream 6.2 changes to 6.1:
- update memmap2 to 0.5.3 (upstream ec8d9b5a5e7c)
- update micro-timer to 0.4.0 (upstream 8848c3453661, ec8d9b5a5e7c)
Update zstd to 0.10.0 (upstream is stuck on 0.5 because MSRV)
- adapt for breaking changes in zstd 0.10.0
Downgrade ouroboros to 0.13.0 (Fedora packaging needs update - rhbz#2027028)
diff --git a/rust/hg-core/Cargo.toml b/rust/hg-core/Cargo.toml
--- a/rust/hg-core/Cargo.toml
+++ b/rust/hg-core/Cargo.toml
@@ -18,7 +18,7 @@ im-rc = "15.0.*"
itertools = "0.9"
lazy_static = "1.4.0"
libc = "0.2"
-ouroboros = "0.15.0"
+ouroboros = ">= 0.13.0, < 0.16.0"
rand = "0.8.4"
rand_pcg = "0.3.1"
rand_distr = "0.4.2"
@@ -29,10 +29,10 @@ twox-hash = "1.5.0"
same-file = "1.0.6"
tempfile = "3.1.0"
crossbeam-channel = "0.4"
-micro-timer = "0.3.0"
+micro-timer = "0.4.0"
log = "0.4.8"
-memmap2 = {version = "0.4", features = ["stable_deref_trait"]}
-zstd = "0.5.3"
+memmap2 = {version = "0.5.3", features = ["stable_deref_trait"]}
+zstd = "0.10"
format-bytes = "0.3.0"
# We don't use the `miniz-oxide` backend to not change rhg benchmarks and until
diff --git a/rust/hg-core/src/revlog/revlog.rs b/rust/hg-core/src/revlog/revlog.rs
--- a/rust/hg-core/src/revlog/revlog.rs
+++ b/rust/hg-core/src/revlog/revlog.rs
@@ -431,7 +431,7 @@ impl<'a> RevlogEntry<'a> {
} else {
let cap = self.uncompressed_len.max(0) as usize;
let mut buf = vec![0; cap];
- let len = zstd::block::decompress_to_buffer(self.bytes, &mut buf)
+ let len = zstd::bulk::decompress_to_buffer(self.bytes, &mut buf)
.map_err(|_| corrupted())?;
if len != self.uncompressed_len as usize {
Err(corrupted())
diff --git a/rust/rhg/Cargo.toml b/rust/rhg/Cargo.toml
--- a/rust/rhg/Cargo.toml
+++ b/rust/rhg/Cargo.toml
@@ -16,7 +16,7 @@ derive_more = "0.99"
home = "0.5.3"
lazy_static = "1.4.0"
log = "0.4.11"
-micro-timer = "0.3.1"
+micro-timer = "0.4.0"
regex = "1.3.9"
env_logger = "0.7.1"
format-bytes = "0.3.0"

View File

@ -1,7 +1,14 @@
# build Rust binary and extensions
%ifarch %{rust_arches}
%bcond_without rust
%else
%bcond_with rust
%endif
Summary: Mercurial -- a distributed SCM Summary: Mercurial -- a distributed SCM
Name: mercurial Name: mercurial
Version: 6.1.1 Version: 6.1.1
Release: 2%{?dist} Release: 3%{?dist}
# Release: 1.rc1%%{?dist} # Release: 1.rc1%%{?dist}
@ -12,6 +19,8 @@ License: GPLv2+
URL: https://mercurial-scm.org/ URL: https://mercurial-scm.org/
Source0: https://www.mercurial-scm.org/release/%{name}-%{upstreamversion}.tar.gz Source0: https://www.mercurial-scm.org/release/%{name}-%{upstreamversion}.tar.gz
Source1: mercurial-site-start.el Source1: mercurial-site-start.el
# Patch cargo metadata for dependency versions available in Fedora
Patch0: mercurial-rust-metadata.patch
BuildRequires: make BuildRequires: make
BuildRequires: bash-completion BuildRequires: bash-completion
BuildRequires: emacs-el BuildRequires: emacs-el
@ -22,6 +31,9 @@ BuildRequires: pkgconfig
BuildRequires: python3-devel BuildRequires: python3-devel
BuildRequires: python3-setuptools BuildRequires: python3-setuptools
BuildRequires: python3-docutils BuildRequires: python3-docutils
%if %{with rust}
BuildRequires: rust-packaging
%endif
Provides: hg = %{version}-%{release} Provides: hg = %{version}-%{release}
Requires: python3 Requires: python3
@ -66,9 +78,54 @@ With chg, a Mercurial command server background process is created that runs
Mercurial. When you type chg, a C program connects to that background process Mercurial. When you type chg, a C program connects to that background process
and executes Mercurial commands. and executes Mercurial commands.
%if %{with rust}
%package rust
Summary: Mercurial Rust binaries and extensions
# Effective license for the rust binaries, computed from statically linked dependencies:
# BSD
# GPLv2+
# MIT
# MIT or ASL 2.0
# MPLv2.0
# Python
# Unlicense or MIT
# zlib or ASL 2.0 or MIT
License: GPLv2+
Requires: hg = %{version}-%{release}
%description rust
This subpackage provides following Mercurial components implemented in Rust:
The `rustext` extension speeds up some functionality of Mercurial, e.g.
ancestry computations in revision graphs, status or discovery of differences
between repositories.
The experimental `rhg` executable implements a subset of the functionality of `hg` using
only Rust, to avoid the startup cost of a Python interpreter. This subset is
initially small but grows over time as `rhg` is improved. When fallback to the
Python implementation is configured, `rhg` aims to be a drop-in replacement
for `hg` that should behave the same, except that some commands run faster.
%endif
%prep %prep
%setup -q -n %{name}-%{upstreamversion} %autosetup -p1 -n %{name}-%{upstreamversion}
%if %{with rust}
pushd rust
%cargo_prep
popd
%generate_buildrequires
for crate in rust/hg-core rust/hg-cpython rust/rhg; do
cd $crate
# Temporarily remove hg-core = { path = "../hg-core"} dependencies while generating buildrequires.
sed -i.br -r -e '/=\s*\{[^}]+path\s*=/d' Cargo.toml
%cargo_generate_buildrequires
mv -f Cargo.toml{.br,}
cd - >/dev/null
done
%endif
# /with rust
%build %build
PYTHON=%{python3} make all PYTHON=%{python3} make all
@ -78,10 +135,27 @@ pushd contrib/chg
make make
popd popd
%if %{with rust}
# Mercurial build system hardcodes too much. Instead, just build with Fedora macro.
pushd rust
%cargo_build
popd
%endif
%install %install
%{python3} setup.py install -O1 --root %{buildroot} --prefix %{_prefix} --record=%{name}.files %{python3} setup.py install -O1 --root %{buildroot} --prefix %{_prefix} --record=%{name}.files
make install-doc DESTDIR=%{buildroot} MANDIR=%{_mandir} make install-doc DESTDIR=%{buildroot} MANDIR=%{_mandir}
# Overrule setup.py policy "c" for module usage: always allow rust extension (if available)
echo 'modulepolicy = b"rust+c-allow"' > %{buildroot}%{python3_sitearch}/mercurial/__modulepolicy__.py
%if %{with rust}
# We are not using the Mercurial build system to build rust, and must thus manually install relevant parts.
install -D -m 755 -pv rust/target/release/rhg %{buildroot}%{_bindir}
install -D -m 755 -pv rust/target/release/librusthg.so \
%{buildroot}%{python3_sitearch}/mercurial/rustext%{python3_ext_suffix}
%endif
grep -v -e 'hgk.py*' \ grep -v -e 'hgk.py*' \
-e "%{python3_sitearch}/mercurial/" \ -e "%{python3_sitearch}/mercurial/" \
-e "%{python3_sitearch}/hgext/" \ -e "%{python3_sitearch}/hgext/" \
@ -157,6 +231,7 @@ pathfix.py -pni "%{python3}" %{buildroot}%{_bindir}/hg-ssh
%dir %{_sysconfdir}/mercurial/hgrc.d %dir %{_sysconfdir}/mercurial/hgrc.d
%{_datadir}/bash-completion/ %{_datadir}/bash-completion/
%{_datadir}/zsh/site-functions/_mercurial %{_datadir}/zsh/site-functions/_mercurial
%exclude %{python3_sitearch}/mercurial/rustext%{python3_ext_suffix}
%{python3_sitearch}/mercurial/ %{python3_sitearch}/mercurial/
%{python3_sitearch}/hgext/ %{python3_sitearch}/hgext/
%{python3_sitearch}/hgext3rd/ %{python3_sitearch}/hgext3rd/
@ -176,6 +251,12 @@ pathfix.py -pni "%{python3}" %{buildroot}%{_bindir}/hg-ssh
%{_bindir}/chg %{_bindir}/chg
%doc %attr(644,root,root) %{_mandir}/man?/chg.*.gz %doc %attr(644,root,root) %{_mandir}/man?/chg.*.gz
%if %{with rust}
%files rust
%{_bindir}/rhg
%{python3_sitearch}/mercurial/rustext%{python3_ext_suffix}
%endif
#%%check #%%check
# This will now fail everytime. Mercurial is not ported properly for Python3 # This will now fail everytime. Mercurial is not ported properly for Python3
@ -185,6 +266,9 @@ pathfix.py -pni "%{python3}" %{buildroot}%{_bindir}/hg-ssh
%changelog %changelog
* Thu Apr 14 2022 Aleksei Bavshin <alebastr@fedoraproject.org> - 6.1.1-3
- Build Rust components
* Wed Apr 06 2022 Mads Kiilerich <mads@kiilerich.com> - 6.1.1-2 * Wed Apr 06 2022 Mads Kiilerich <mads@kiilerich.com> - 6.1.1-2
- Undo accicental commit - Undo accicental commit