Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package obs-service-go_modules for openSUSE:Factory checked in at 2023-02-27 12:56:03 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/obs-service-go_modules (Old) and /work/SRC/openSUSE:Factory/.obs-service-go_modules.new.31432 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "obs-service-go_modules" Mon Feb 27 12:56:03 2023 rev:5 rq:1067956 version:0.6.0 Changes: -------- --- /work/SRC/openSUSE:Factory/obs-service-go_modules/obs-service-go_modules.changes 2022-06-12 17:43:21.526503593 +0200 +++ /work/SRC/openSUSE:Factory/.obs-service-go_modules.new.31432/obs-service-go_modules.changes 2023-02-27 12:56:03.795679460 +0100 @@ -1,0 +2,12 @@ +Mon Feb 27 10:51:08 UTC 2023 - jkowalc...@suse.com + +- Update to version 0.6.0: + * Make service arg subdir optional + * exit(1) immediately in extract() exception handler after recording error + * Use subprocess.run() options 'capture_output' & 'text' only when supported + * Add '--subdir' option: all to specify the directory to search go.mod in + * Use temporary directory to extract archive to + * Give the user the opprtunity to specify the name of the topmost directory + * Attempt to obtain name of top directory in archive from archive content + +------------------------------------------------------------------- Old: ---- obs-service-go_modules-0.5.0.tar.gz New: ---- obs-service-go_modules-0.6.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ obs-service-go_modules.spec ++++++ --- /var/tmp/diff_new_pack.LaBHwQ/_old 2023-02-27 12:56:04.187681876 +0100 +++ /var/tmp/diff_new_pack.LaBHwQ/_new 2023-02-27 12:56:04.191681900 +0100 @@ -1,7 +1,7 @@ # # spec file # -# Copyright (c) 2022 SUSE LLC +# Copyright (c) 2023 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -37,7 +37,7 @@ %define use_test test %endif Name: obs-service-%{service} -Version: 0.5.0 +Version: 0.6.0 Release: 0 Summary: An OBS source service: Download, verify and vendor Go module dependencies License: GPL-2.0-or-later ++++++ _service ++++++ --- /var/tmp/diff_new_pack.LaBHwQ/_old 2023-02-27 12:56:04.223682098 +0100 +++ /var/tmp/diff_new_pack.LaBHwQ/_new 2023-02-27 12:56:04.227682122 +0100 @@ -3,7 +3,7 @@ <param name="url">https://github.com/openSUSE/obs-service-go_modules</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">v0.5.0</param> + <param name="revision">v0.6.0</param> <param name="versionformat">@PARENT_TAG@</param> <param name="changesgenerate">enable</param> <param name="versionrewrite-pattern">v(.*)</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.LaBHwQ/_old 2023-02-27 12:56:04.247682246 +0100 +++ /var/tmp/diff_new_pack.LaBHwQ/_new 2023-02-27 12:56:04.251682271 +0100 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/openSUSE/obs-service-go_modules</param> - <param name="changesrevision">3ee3fd053c57ab951c7347243e6f4d017c36c7ee</param></service></servicedata> + <param name="changesrevision">19eae60776556c82bd16373f8fbc3b7ba590bec7</param></service></servicedata> (No newline at EOF) ++++++ obs-service-go_modules-0.5.0.tar.gz -> obs-service-go_modules-0.6.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/obs-service-go_modules-0.5.0/go_modules new/obs-service-go_modules-0.6.0/go_modules --- old/obs-service-go_modules-0.5.0/go_modules 2022-06-11 02:15:31.000000000 +0200 +++ new/obs-service-go_modules-0.6.0/go_modules 2023-02-27 11:29:49.000000000 +0100 @@ -33,6 +33,8 @@ import libarchive import os import shutil +import sys +import tempfile from pathlib import Path from subprocess import run @@ -82,11 +84,28 @@ def basename_from_archive_name(archive_name): - return re.sub( + basename = re.sub( "^(?P<service_prefix>_service:[^:]+:)?(?P<basename>.*)\.(?P<extension>obscpio|tar\.[^\.]+)$", r"\g<basename>", archive_name, ) + if basename: + log.info(f"Detected basename {basename} form archive name") + return basename + + +def basename_from_archive(archive_name): + paths = [] + with libarchive.file_reader(archive_name) as archive: + for entry in archive: + if entry.isdir: + paths.append(entry.name) + try: + basename = os.path.commonpath(paths) + except ValueError: + return + log.info(f"Detected basename {basename} from archive") + return basename def archive_autodetect(): @@ -162,16 +181,11 @@ libarchive.extract_file(filename) except libarchive.exception.ArchiveError as archive_error: log.error(archive_error) + exit(1) os.chdir(cwd) -def find_file(path, filename): - for root, dirs, files in os.walk(path): - if filename in files: - return os.path.join(root, filename) - - def cmd_go_mod(cmd, dir): """Execute go mod subcommand using subprocess.run(). Capture both stderr and stdout as text. @@ -180,12 +194,23 @@ """ log.info(f"go mod {cmd}") # subprocess.run() returns CompletedProcess cp - cp = run(["go", "mod", cmd], cwd=dir, capture_output=True, text=True) + if sys.version_info >= (3, 7): + cp = run(["go", "mod", cmd], cwd=dir, capture_output=True, text=True) + else: + cp = run(["go", "mod", cmd], cwd=dir) if cp.returncode: log.error(cp.stderr.strip()) return cp +def sanitize_subdir(dir, subdir): + ret = os.path.normpath(subdir) + if dir == os.path.commonpath([dir, ret]): + return ret + log.error("Invalid path: {ret} not subdir of {dir}") + exit(1) + + def main(): log.info(f"Running OBS Source Service: {app_name}") @@ -196,78 +221,85 @@ parser.add_argument("--archive") parser.add_argument("--outdir") parser.add_argument("--compression", default=DEFAULT_COMPRESSION) + parser.add_argument("--basename") + parser.add_argument("--subdir") args = parser.parse_args() outdir = args.outdir + subdir = args.subdir archive_format, archive_compression, archive_ext = get_archive_parameters(args) vendor_tarname = f"vendor.{archive_ext}" archive = args.archive or archive_autodetect() log.info(f"Using archive {archive}") - basename = basename_from_archive_name(archive) - extract(archive, outdir) - - go_mod_path = find_file(outdir, "go.mod") - if go_mod_path: - go_mod_dir = os.path.dirname(go_mod_path) - log.info(f"Using go.mod found at {go_mod_path}") - else: - log.error(f"File go.mod not found under {outdir}") - exit(1) - - if args.strategy == "vendor": - # go subcommand sequence: - # - go mod download - # (is sensitive to invalid module versions, try and log warn if fails) - # - go mod vendor - # (also downloads but use separate steps for visibility in OBS environment) - # - go mod verify - # (validates checksums) - - # return value cp is type subprocess.CompletedProcess - cp = cmd_go_mod("download", go_mod_dir) - if cp.returncode: - if "invalid version" in cp.stderr: - log.warning( - f"go mod download is more sensitive to invalid module versions than go mod vendor" - ) - log.warning( - f"if go mod vendor and go mod verify complete, vendoring is successful" - ) - else: - log.error("go mod download failed") - exit(1) + with tempfile.TemporaryDirectory() as tempdir: + extract(archive, tempdir) - cp = cmd_go_mod("vendor", go_mod_dir) - if cp.returncode: - log.error("go mod vendor failed") + basename = ( + args.basename + or basename_from_archive(archive) + or basename_from_archive_name(archive) + ) + if subdir: + go_mod_path = sanitize_subdir( + tempdir, os.path.join(tempdir, basename, subdir, "go.mod") + ) + else: + go_mod_path = sanitize_subdir( + tempdir, os.path.join(tempdir, basename, "go.mod") + ) + if go_mod_path and os.path.exists(go_mod_path): + go_mod_dir = os.path.dirname(go_mod_path) + log.info(f"Using go.mod found at {go_mod_path}") + else: + log.error(f"File go.mod not found under {os.path.join(tempdir, basename)}") exit(1) - cp = cmd_go_mod("verify", go_mod_dir) - if cp.returncode: - log.error("go mod verify failed") - exit(1) + if args.strategy == "vendor": + # go subcommand sequence: + # - go mod download + # (is sensitive to invalid module versions, try and log warn if fails) + # - go mod vendor + # (also downloads but use separate steps for visibility in OBS environment) + # - go mod verify + # (validates checksums) + + # return value cp is type subprocess.CompletedProcess + cp = cmd_go_mod("download", go_mod_dir) + if cp.returncode: + if "invalid version" in cp.stderr: + log.warning( + f"go mod download is more sensitive to invalid module versions than go mod vendor" + ) + log.warning( + f"if go mod vendor and go mod verify complete, vendoring is successful" + ) + else: + log.error("go mod download failed") + exit(1) + + cp = cmd_go_mod("vendor", go_mod_dir) + if cp.returncode: + log.error("go mod vendor failed") + exit(1) - log.info(f"Vendor go.mod dependencies to {vendor_tarname}") - vendor_tarfile = os.path.join(outdir, vendor_tarname) - cwd = os.getcwd() - os.chdir(go_mod_dir) - vendor_dir = "vendor" - - with libarchive.file_writer( - vendor_tarfile, archive_format, archive_compression - ) as new_archive: - new_archive.add_files(vendor_dir) - os.chdir(cwd) + cp = cmd_go_mod("verify", go_mod_dir) + if cp.returncode: + log.error("go mod verify failed") + exit(1) - # remove extracted Go application source - try: - to_remove = os.path.join(outdir, basename) - log.info(f"Cleaning up working dir {to_remove}") - shutil.rmtree(to_remove) - except FileNotFoundError: - log.error(f"Could not remove directory not found {to_remove}") + log.info(f"Vendor go.mod dependencies to {vendor_tarname}") + vendor_tarfile = os.path.join(outdir, vendor_tarname) + cwd = os.getcwd() + os.chdir(go_mod_dir) + vendor_dir = "vendor" + + with libarchive.file_writer( + vendor_tarfile, archive_format, archive_compression + ) as new_archive: + new_archive.add_files(vendor_dir) + os.chdir(cwd) if __name__ == "__main__": diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/obs-service-go_modules-0.5.0/go_modules.service new/obs-service-go_modules-0.6.0/go_modules.service --- old/obs-service-go_modules-0.5.0/go_modules.service 2022-06-11 02:15:31.000000000 +0200 +++ new/obs-service-go_modules-0.6.0/go_modules.service 2023-02-27 11:29:49.000000000 +0100 @@ -14,4 +14,9 @@ <parameter name="compression"> <description>Specify the source / vendor tarballs compression method. When using "tar" no compression is applied. Default: "gz".</description> </parameter> + <parameter name="basename"> + <description>Normally the go_modules service is able to determine the name of the top directory. Should this not be possible for some reason, use this option to specify.</description> + <parameter name="subdir"> + <description>If go.mod is not available in the top directory of the archive, specify its path (relative to the top directory).</description> + </parameter> </service>