]> git.t-rg.ws Git - slackbuilds.git/commitdiff
shadowsocks-rust: wrote a script that vendors crates up to 15 times faster
authorfsLeg <fsleg@t-rg.ws>
Sun, 15 Dec 2024 16:53:28 +0000 (19:53 +0300)
committerfsLeg <fsleg@t-rg.ws>
Sun, 15 Dec 2024 16:53:28 +0000 (19:53 +0300)
shadowsocks-rust/mkvendor.py [new file with mode: 0755]
shadowsocks-rust/shadowsocks-rust.SlackBuild

diff --git a/shadowsocks-rust/mkvendor.py b/shadowsocks-rust/mkvendor.py
new file mode 100755 (executable)
index 0000000..2d3ec58
--- /dev/null
@@ -0,0 +1,70 @@
+#!/usr/bin/env python3
+
+"""
+A script to vendor Rust crates
+
+Copyright 2022-2024 Vladislav 'fsLeg' Borisov, Moscow, Russia
+All rights reserved.
+
+Redistribution and use of this script, with or without modification, is
+permitted provided that the following conditions are met:
+
+1. Redistributions of this script must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+   THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
+   WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+   MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO
+   EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+   OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+   WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+   OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+   ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+from os import makedirs, walk
+from os.path import join
+from hashlib import sha256
+from glob import glob
+import json
+import tarfile
+
+def createVendor(vendordir, cratedir):
+    "We extract each crate, create an empty .cargo-ok file, calculate sha256 sum for every file inside the crate and crate file itself and put it into .cargo-checksum.json"
+    crate_path = ""
+    crate_checksums = []
+    crate_files = []
+    makedirs(vendordir, exist_ok=True)
+    for crate in glob(f"{cratedir}/*.crate"):
+        with tarfile.open(crate, 'r:*') as archive:
+            archive.extractall(path=vendordir, filter='data')
+            crate_path = f"{vendordir}/{crate[crate.rfind('/')+1:].replace('.crate', '')}"
+            open(f"{crate_path}/.cargo-ok", "a").close()
+            for root, dirs, files in walk(f"{crate_path}"):
+                crate_files.extend(join(root, name) for name in files)
+            for file in crate_files:
+                with open(file, "rb") as opened_file:
+                    crate_checksums.append(sha256(opened_file.read()).hexdigest())
+            with open(f"{crate_path}/.cargo-checksum.json", "w") as crate_json:
+                with open(crate, 'rb') as crate_file:
+                    json.dump({"files": dict(zip([file.replace(f"{crate_path}/", "") for file in crate_files], crate_checksums)), "package": sha256(crate_file.read()).hexdigest()}, crate_json)
+            crate_files = []
+            crate_checksums = []
+
+if __name__ == "__main__":
+    import argparse
+
+    parser = argparse.ArgumentParser(
+                        prog="mkvendor.py",
+                        description="This scripts properly vendors downloaded crates for offline builds"
+                        )
+    parser.add_argument("-d", "--directory", help="Directory of a Rust program to vendor crates for")
+    parser.add_argument("-c", "--crates",    help="Directory with downloaded .crate files to vendor")
+    args = parser.parse_args()
+
+    workdir = args.directory
+    cratedir = args.crates
+
+    createVendor(f"{workdir}/vendor", cratedir)
index e2123da606ecc04e16d44b1f6a2067fdec24d3d8..25b84afdb6faa66560cac83215cd65fb5e02a7bf 100755 (executable)
@@ -3,8 +3,6 @@
 # Slackware build script for shadowsocks-rust
 
 # Copyright 2022-2024 Vladislav 'fsLeg' Borisov, Moscow, Russia
-# Parts with Cargo's offline building were taken from alacritty.SlackBuild
-# by Andrew Clemons, Tokyo Japan
 # All rights reserved.
 #
 # Redistribution and use of this script, with or without modification, is
@@ -101,29 +99,11 @@ registry = 'https://github.com/rust-lang/crates.io-index'
 replace-with = 'vendored-sources'
 
 [source.vendored-sources]
-directory = '$(pwd)/vendor'
+directory = 'vendor'
 EOF
 
 # Unpack crates and vendor them
-mkdir vendor
-(
-  cd vendor
-
-  for CRATE in ${CWD}/*.crate; do
-    CRATE_CHECKSUM=$(sha256sum ${CRATE} | cut -d' ' -f1)
-    tar xf ${CRATE}
-    cd $(basename ${CRATE%.crate})
-    touch .cargo-ok
-    JSON='{"files":{'
-    for FILE in $(find -type f | sed 's/\.\///g'); do
-      CHECKSUM=$(sha256sum ${FILE} | cut -d' ' -f1)
-      JSON="${JSON}\"${FILE}\":\"${CHECKSUM}\","
-    done
-    JSON="${JSON%,}},\"package\":\"${CRATE_CHECKSUM}\"}"
-    echo ${JSON} > .cargo-checksum.json
-    cd ..
-  done
-)
+python3 $CWD/mkvendor.py --directory $(pwd) --crates $CWD
 
 chown -R root:root .
 find -L . \
@@ -145,7 +125,7 @@ CFLAGS="$SLKCFLAGS" \
 CXXFLAGS="$SLKCFLAGS" \
 RUSTFLAGS="-C target-cpu=native" \
 CARGO_HOME=".cargo" \
-cargo build --offline --release 
+cargo build --offline --release
 make install DESTDIR=$PKG TARGET=release PREFIX=/usr/bin
 
 # Strip binaries and libraries