Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package obs-service-cargo_vendor for openSUSE:Factory checked in at 2022-04-06 21:51:44 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/obs-service-cargo_vendor (Old) and /work/SRC/openSUSE:Factory/.obs-service-cargo_vendor.new.1900 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "obs-service-cargo_vendor" Wed Apr 6 21:51:44 2022 rev:6 rq:967173 version:0.4.3~2 Changes: -------- --- /work/SRC/openSUSE:Factory/obs-service-cargo_vendor/obs-service-cargo_vendor.changes 2022-03-11 11:48:11.842814896 +0100 +++ /work/SRC/openSUSE:Factory/.obs-service-cargo_vendor.new.1900/obs-service-cargo_vendor.changes 2022-04-06 21:52:12.863072146 +0200 @@ -1,0 +2,6 @@ +Wed Apr 06 05:26:52 UTC 2022 - wbr...@suse.de + +- Update to version 0.4.3~git2.08145c7: + * Update to account for srctar and tag + +------------------------------------------------------------------- Old: ---- obs-service-cargo_vendor-0.4.3~git0.afec7bc.tar.gz New: ---- obs-service-cargo_vendor-0.4.3~2.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ obs-service-cargo_vendor.spec ++++++ --- /var/tmp/diff_new_pack.AqMyIb/_old 2022-04-06 21:52:13.995059229 +0200 +++ /var/tmp/diff_new_pack.AqMyIb/_new 2022-04-06 21:52:13.999059183 +0200 @@ -22,7 +22,7 @@ License: GPL-2.0-or-later Group: Development/Tools/Building URL: https://github.com/openSUSE/obs-service-%{service} -Version: 0.4.3~git0.afec7bc +Version: 0.4.3~2 Release: 0 Source: %{name}-%{version}.tar.gz BuildRequires: python3 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.AqMyIb/_old 2022-04-06 21:52:14.027058864 +0200 +++ /var/tmp/diff_new_pack.AqMyIb/_new 2022-04-06 21:52:14.027058864 +0200 @@ -1,9 +1,9 @@ <services> <service mode="disabled" name="obs_scm"> <param name="url">https://github.com/openSUSE/obs-service-cargo_vendor.git</param> - <param name="versionformat">@PARENT_TAG@~git@TAG_OFFSET@.%h</param> + <param name="versionformat">@PARENT_TAG@~@TAG_OFFSET@</param> <param name="scm">git</param> - <param name="revision">v0.4.3</param> + <param name="revision">master</param> <param name="match-tag">v*</param> <param name="versionrewrite-pattern">v(\d+\.\d+\.\d+)</param> <param name="versionrewrite-replacement">\1</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.AqMyIb/_old 2022-04-06 21:52:14.047058635 +0200 +++ /var/tmp/diff_new_pack.AqMyIb/_new 2022-04-06 21:52:14.047058635 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/openSUSE/obs-service-cargo_vendor.git</param> - <param name="changesrevision">afec7bcacce9cfc694abdc227e835dd051ac9a2c</param></service></servicedata> + <param name="changesrevision">08145c7fc1f7cf14e4ba3d97e2aded6476d451e4</param></service></servicedata> (No newline at EOF) ++++++ obs-service-cargo_vendor-0.4.3~git0.afec7bc.tar.gz -> obs-service-cargo_vendor-0.4.3~2.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/obs-service-cargo_vendor-0.4.3~git0.afec7bc/README.md new/obs-service-cargo_vendor-0.4.3~2/README.md --- old/obs-service-cargo_vendor-0.4.3~git0.afec7bc/README.md 2021-07-30 04:14:33.000000000 +0200 +++ new/obs-service-cargo_vendor-0.4.3~2/README.md 2022-04-06 07:19:39.000000000 +0200 @@ -32,6 +32,7 @@ </service> <service name="cargo_vendor" mode="disabled"> <param name="srcdir">projectname</param> + <param name="update">true</param> </service> </services> ``` @@ -107,11 +108,15 @@ ## Options - `<param name="srcdir">projectname</param>` +- `<param name="srctar">name-of-source.tar</param>` The location to search for the Cargo.toml which we will vendor from. Generally this is your project name from the SCM checkout, or the extracted archive top dir, but it may differ depending on your configuration. +You can alternately specify srctar, which we will unpack into a temp location and perform the vendor +instead. This removes your need to rely on `obs_scm` or similar + - `<param name="compression">xz</param>` The compression to use for the `vendor.tar`. If the option is not supplied it will default to `xz`. @@ -122,10 +127,11 @@ If present, cargo update will be run before vendoring to ensure that the latest version of compatible dependencies is used. -- `<param name="strategy">vendor</param>` +- `<param name="tag">tagname</param>` -The default here is `vendor` which will use `cargo vendor` to fetch the crate dependencies. There -are currently no alternatives to `vendor`. +In some rare case, you may wish to annotate your `vendor.tar` and `cargo_config` with a unique +tag. Generally this happens if you are needing to create multiple vendor tars. When you specify +`tag` the vendor routine will create `vendor-{tag}.tar` and `cargo_config_{tag}` instead. #### Example @@ -135,11 +141,20 @@ ... </service> <service name="cargo_vendor" mode="disabled"> - <param name="strategy">vendor</param> <param name="srcdir">projectname</param> <param name="compression">xz</param> <param name="update">true</param> </service> +</services> +``` + +``` +<services> + <service name="cargo_vendor" mode="disabled"> + <param name="srctar">projectname.tar.xz</param> + <param name="compression">xz</param> + <param name="update">true</param> + </service> </services> ``` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/obs-service-cargo_vendor-0.4.3~git0.afec7bc/cargo_vendor new/obs-service-cargo_vendor-0.4.3~2/cargo_vendor --- old/obs-service-cargo_vendor-0.4.3~git0.afec7bc/cargo_vendor 2021-07-30 04:14:33.000000000 +0200 +++ new/obs-service-cargo_vendor-0.4.3~2/cargo_vendor 2022-04-06 07:19:39.000000000 +0200 @@ -34,6 +34,7 @@ import argparse import re import tarfile +import tempfile import os import shutil @@ -53,56 +54,21 @@ log = logging.getLogger(service_name) -parser = argparse.ArgumentParser( - description=description, formatter_class=argparse.RawDescriptionHelpFormatter -) -parser.add_argument("--strategy", default="vendor") -parser.add_argument("--srcdir") -parser.add_argument("--outdir") -parser.add_argument("--update", default=False) -parser.add_argument("--compression", default="xz") -args = parser.parse_args() - -outdir = args.outdir -srcdir = args.srcdir -# Hack - obs always emits an arg to this so we can't use store_true/store_false. -update = args.update -if update == "false" or update == '0': - update = False -compression = args.compression vendor_example = """ -Your spec file should be modified per the following example: +Examples of how to modify your spec file to use vendored libraries can be found online: ----BEGIN--- -%global rustflags '-Clink-arg=-Wl,-z,relro,-z,now' - -Source1: vendor.tar.xz -Source2: cargo_config - -%prep -%setup -qa1 -mkdir .cargo -cp %{SOURCE2} .cargo/config - -%build -RUSTFLAGS=%{rustflags} cargo build --release - -%install -RUSTFLAGS=%{rustflags} cargo install --root=%{buildroot}%{_prefix} --path . ----END--- +https://en.opensuse.org/Packaging_Rust_Software#Creating_the_Package WARNING: To avoid cargo install rebuilding the binary in the install stage all environment variables must be the same as in the build stage. """ -vendor_tarname = f"vendor.tar.{compression}" - def find_file(path, filename): for root, dirs, files in os.walk(path): if filename in files: - print(os.path.join(root, filename)) + log.debug(os.path.join(root, filename)) return os.path.join(root, filename) @@ -120,7 +86,7 @@ return None -def cargo_vendor(appDirectory, argsList=[]): +def cargo_vendor(appDirectory, update, outdir, tag, argsList=[]): if update: log.info("Updating deps before vendor") run_cargo(appDirectory, "update") @@ -128,52 +94,95 @@ output = run_cargo(appDirectory, "vendor", argsList + ["--", "vendor"]) if output: log.info(vendor_example) - config_file_path = os.path.join(outdir, "cargo_config") + if tag: + config_file_path = os.path.join(outdir, f"cargo_config_{tag}") + else: + config_file_path = os.path.join(outdir, "cargo_config") config_file = open(config_file_path, 'w') config_file.write(output) config_file.close() # End cargo_vendor. -def main(): - log.info(f"Running OBS Source Service: {service_name}") - - log.info(f"Searching for Cargo.toml in {srcdir}") - log.info(f"Current work dir {os.getcwd()}") - - cargo_toml_path = find_file(srcdir, "Cargo.toml") - if cargo_toml_path: - app_dir = os.path.dirname(cargo_toml_path) - log.info(f"Detected Rust app directory: {app_dir}") - else: - log.error(f"No Rust app using Cargo.toml found under {outdir}") - exit(1) +def do_cargo_vendor(srcdir, srctar, outdir, update, compression, tag): + if srcdir and srctar: + log.error("I'm confused - can't work with both a srctar and srcdir!") + return False + + with tempfile.TemporaryDirectory() as tmpdirname: + if srctar: + log.debug(f" Unpacking {srctar}") + # Setup the tar. + log.debug(f" setting up sources into {tmpdirname}") + with tarfile.open(f"{srctar}", "r:*") as tar: + tar.extractall(path=tmpdirname) + lsrcdir = tmpdirname + else: + log.debug(f" Copying {srcdir}") + (_, dirname) = os.path.split(srcdir) + dirpath = os.path.join(tmpdirname, dirname) + log.debug(f" copying sources into {dirpath}") + lsrcdir = shutil.copytree(srcdir, dirpath, dirs_exist_ok=True) + + log.info(f"Current work dir {os.getcwd()}") + log.info(f"Searching for Cargo.toml in {lsrcdir}") + + cargo_toml_path = find_file(lsrcdir, "Cargo.toml") + if cargo_toml_path: + app_dir = os.path.dirname(cargo_toml_path) + log.info(f"Detected Rust app directory: {app_dir}") + else: + log.error(f"No Rust app using Cargo.toml found under {outdir}") + return False - if args.strategy == "vendor": - cargo_vendor(appDirectory=app_dir) + cargo_vendor(appDirectory=app_dir, update=update, outdir=outdir, tag=tag) vendor_dir = os.path.join(app_dir, "vendor") vendor_lock = os.path.join(app_dir, "Cargo.lock") - vendor_tarfile = os.path.join(outdir, vendor_tarname) + if tag: + vendor_tarfile = os.path.join(outdir, f"vendor-{tag}.tar.{compression}") + else: + vendor_tarfile = os.path.join(outdir, f"vendor.tar.{compression}") log.info("Starting compression ...") with tarfile.open(vendor_tarfile, f"w:{compression}") as tar: tar.add(vendor_dir, arcname=("vendor")) if update: tar.add(vendor_lock, arcname=("Cargo.lock")) - # Complete, so cleanup the vendor folder. This is needed as obs_scm + compress - # will on subsequent runs, put the vendor folder in the mail tar AND into - # our vendor.tar.xz. - # - # This is not a greater cost, as cargo vendor will always download anyway. - log.debug(f"Cleaning up {vendor_dir} ...") - shutil.rmtree(vendor_dir) - # Remove the updated cargo.lock so that we don't conflict with obs_scm if run again. - if update: - log.debug(f"Cleaning up {vendor_lock} ...") - os.remove(vendor_lock) + # No longer need cleanup since we used a temp location. + log.info(f"Success") + return True + + +def main(): + log.info(f"Running OBS Source Service: {service_name}") + + parser = argparse.ArgumentParser( + description=description, formatter_class=argparse.RawDescriptionHelpFormatter + ) + # Legacy argument, no longer used. + parser.add_argument("--strategy", default="vendor") + + # Where to find unpacked sources. + parser.add_argument("--srcdir", default=None) + # Where to find packed sources. + parser.add_argument("--srctar", default=None) + # Where to put the vendor.tar and cargo_config + parser.add_argument("--outdir", default=None) + parser.add_argument("--update", default=False) + parser.add_argument("--tag", default=None) + parser.add_argument("--compression", default="xz") + args = parser.parse_args() + + # Hack - obs always emits an arg to this so we can't use store_true/store_false. + update = args.update + if args.update == "false" or update == '0': + update = False else: - log.error(f"Not a valid strategy : \"{args.strategy}\"") + update = True + + log.debug("%s" % args) + + if not do_cargo_vendor(args.srcdir, args.srctar, args.outdir, update, args.compression, args.tag): exit(1) - log.info(f"Success") if __name__ == "__main__": diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/obs-service-cargo_vendor-0.4.3~git0.afec7bc/do_bulk_update.py new/obs-service-cargo_vendor-0.4.3~2/do_bulk_update.py --- old/obs-service-cargo_vendor-0.4.3~git0.afec7bc/do_bulk_update.py 1970-01-01 01:00:00.000000000 +0100 +++ new/obs-service-cargo_vendor-0.4.3~2/do_bulk_update.py 2022-04-06 07:19:39.000000000 +0200 @@ -0,0 +1,132 @@ +#!/usr/bin/python3 + +import subprocess +import argparse +import os +import xml.etree.ElementTree as ET + +# Import Crimes +import importlib.machinery +import importlib.util +loader = importlib.machinery.SourceFileLoader( 'cargo_vendor_module', './cargo_vendor' ) +spec = importlib.util.spec_from_loader( 'cargo_vendor_module', loader ) +cargo_vendor_module = importlib.util.module_from_spec( spec ) +loader.exec_module( cargo_vendor_module ) + + + +def checkout_or_update(pkgname, basepath): + pkgpath = f"{basepath}:{pkgname}" + try: + if os.path.exists(pkgpath): + print(f"osc revert {pkgpath}") + # Revert/cleanup if required. + out = subprocess.check_output(["osc", "revert", "."], cwd=f"{pkgpath}") + print(f"osc clean {pkgpath}") + out = subprocess.check_output(["osc", "clean", "."], cwd=f"{pkgpath}") + print(f"osc up {pkgpath}") + out = subprocess.check_output(["osc", "up", f"{pkgpath}"]) + else: + print(f"osc bco {pkgname}") + out = subprocess.check_output(["osc", "bco", f"{pkgname}"]) + except subprocess.CalledProcessError as e: + print(f"Failed to checkout or update {pkgname}") + print(e.stdout) + raise e + print(f"done") + return pkgpath + + +def does_have_cargo_vendor(pkgpath): + service = f"{pkgpath}/_service" + has_vendor_update = False + srctar = None + srcdir = None + compression = None + + if os.path.exists(service): + tree = ET.parse(service) + root_node = tree.getroot() + for tag in root_node.findall('service'): + if tag.attrib['name'] == 'cargo_vendor': + for attr in tag: + if attr.attrib['name'] == 'update' and attr.text == 'true': + has_vendor_update = True + if attr.attrib['name'] == 'srctar': + srctar = attr.text + if attr.attrib['name'] == 'srcdir': + srcdir = attr.text + if attr.attrib['name'] == 'compression': + compression = attr.text + return (has_vendor_update, srctar, srcdir, compression) + +def attempt_update(pkgpath, message): + print(f"Attempting update for {pkgpath}") + + (has_vendor, srctar, srcdir, compression) = does_have_cargo_vendor(pkgpath) + + print(f"has_vendor: {has_vendor}, srctar: {srctar}, srcdir: {srcdir}") + + if not has_vendor: + print(f"ERROR ?????? : {pkgpath} is not setup for cargo vendor!") + return + + if srcdir and srctar is None: + # We can use srcdir to have a guess what tar we need to use. + content = os.listdir(pkgpath) + maybe_src = [ + x for x in content + if x.startswith(srcdir) and '.tar' in x and 'vendor' not in x and not x.endswith('.asc') + ] + if len(maybe_src) != 1: + print(f"ERROR ?????? : confused! Not sure what tar to use in {pkgpath} {maybe_src}") + return + + srctar = maybe_src[0] + + assert srctar + + srctar = f"{pkgpath}/{srctar}" + + print(f"Running vendor in {pkgpath} ...") + cargo_vendor_module.do_cargo_vendor(None, srctar, pkgpath, True, compression) + + print(f"osc vc {pkgpath}") + out = subprocess.check_output(["osc", "vc", "-m", message], cwd=f"{pkgpath}") + + print(f"osc ci {pkgpath}") + out = subprocess.check_output(["osc", "ci", "-m", message], cwd=f"{pkgpath}") + + print(f"osc sr {pkgpath}") + out = subprocess.check_output(["osc", "sr", "-m", message], cwd=f"{pkgpath}") + + print(f"Complete!") + + +if __name__ == '__main__': + print("Started OBS cargo vendor bulk updater ...") + + basepath = "home:firstyear:branches" + + parser = argparse.ArgumentParser( + description="update OBS gooderer", + formatter_class=argparse.RawDescriptionHelpFormatter + ) + parser.add_argument('packages', nargs='+') + parser.add_argument('message', nargs='?', default="Automatic update of vendored dependencies") + args = parser.parse_args() + + print(args) + + pkgpaths = [checkout_or_update(pkgname, basepath) for pkgname in args.packages] + + for pkgpath in pkgpaths: + print("---") + attempt_update(pkgpath, args.message) + + for pkgpath in pkgpaths: + print(f"echo {pkgpath}") + print(f"osc results {pkgpath}") + + print("--- complete") + ++++++ obs-service-cargo_vendor.obsinfo ++++++ --- /var/tmp/diff_new_pack.AqMyIb/_old 2022-04-06 21:52:14.103057996 +0200 +++ /var/tmp/diff_new_pack.AqMyIb/_new 2022-04-06 21:52:14.107057950 +0200 @@ -1,6 +1,5 @@ name: obs-service-cargo_vendor -version: 0.4.3~git0.afec7bc -mtime: 1627611273 -commit: afec7bcacce9cfc694abdc227e835dd051ac9a2c - +version: 0.4.3~2 +mtime: 1649222379 +commit: 08145c7fc1f7cf14e4ba3d97e2aded6476d451e4