From c2ee9d537d64704a2b96e1dc3883c17331f7fc65 Mon Sep 17 00:00:00 2001 From: Ondřej Nosek Date: Sep 16 2019 07:14:19 +0000 Subject: New release 1.59 Signed-off-by: Ondřej Nosek --- diff --git a/.gitignore b/.gitignore index 50128a5..7483756 100644 --- a/.gitignore +++ b/.gitignore @@ -54,3 +54,4 @@ /rpkg-1.56.tar.gz /rpkg-1.57.tar.gz /rpkg-1.58.tar.gz +/rpkg-1.59.tar.gz diff --git a/0001-Fix-clone-branches.patch b/0001-Fix-clone-branches.patch deleted file mode 100644 index 1536310..0000000 --- a/0001-Fix-clone-branches.patch +++ /dev/null @@ -1,44 +0,0 @@ -From c194bf503ffd176403708345a230501b634aa373 Mon Sep 17 00:00:00 2001 -From: Todd Zullinger -Date: Tue, 7 May 2019 21:40:31 -0400 -Subject: [PATCH] Fix clone --branches - -When cloning with the --branches option we first clone a bare repo -locally, then clone each branch from that bare repo. Avoid adding an -excludes file to the temporary bare repo (which fails because we pass -the wrong path to the git dir). Add an excludes file to each branch -dir. - -Resolves: rhbz#1707223 -Signed-off-by: Todd Zullinger ---- - pyrpkg/__init__.py | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - -diff --git a/pyrpkg/__init__.py b/pyrpkg/__init__.py -index c12b52b..43bfc1d 100644 ---- a/pyrpkg/__init__.py -+++ b/pyrpkg/__init__.py -@@ -1546,7 +1546,8 @@ class Commands(object): - conf_git = git.Git(os.path.join(path, git_dir)) - self._clone_config(conf_git, repo) - -- self._add_git_excludes(os.path.join(path, git_dir)) -+ if not bare_dir: -+ self._add_git_excludes(os.path.join(path, git_dir)) - - return - -@@ -1625,6 +1626,9 @@ class Commands(object): - branch_git.config("--replace-all", - "remote.%s.url" % self.default_branch_remote, - giturl) -+ -+ # Add excludes -+ self._add_git_excludes(branch_path) - except (git.GitCommandError, OSError) as e: - raise rpkgError('Could not locally clone %s from %s: %s' - % (branch, repo_path, e)) --- -2.20.1 - diff --git a/0002-Custom-handler-for-koji-watch_tasks.patch b/0002-Custom-handler-for-koji-watch_tasks.patch deleted file mode 100644 index 9e4c2d2..0000000 --- a/0002-Custom-handler-for-koji-watch_tasks.patch +++ /dev/null @@ -1,121 +0,0 @@ -From 910ed50456ea41995989d59a5a469799ba8d4e5b Mon Sep 17 00:00:00 2001 -From: Ondrej Nosek -Date: Wed, 15 May 2019 18:53:30 +0200 -Subject: [PATCH] Custom handler for koji watch_tasks - -Output text during rhpkg/fedpkg build process states that there -is a 'watch_task' subcommand. When 'koji_cli' library is imported -in rhpkg/fedpkg tool, it shows that command is named -'rhpkg/fedpkg watch_task' instead of 'brew/koji watch_task'. Custom -handler replaces the internal one inside koji_cli library. -Additional fix in rhpkg is needed after this change is released. - -Relates: rhbz#1570921 -Relates: COMPOSE-2809 - -Signed-off-by: Ondrej Nosek ---- - pyrpkg/cli.py | 6 +++++- - pyrpkg/utils.py | 21 +++++++++++++++++++++ - tests/test_cli.py | 39 ++++++++++++++++++++++----------------- - 3 files changed, 48 insertions(+), 18 deletions(-) - -diff --git a/pyrpkg/cli.py b/pyrpkg/cli.py -index 7b83a44..72be1cf 100644 ---- a/pyrpkg/cli.py -+++ b/pyrpkg/cli.py -@@ -1667,7 +1667,11 @@ see API KEY section of copr-cli(1) man page. - if self.args.dry_run: - self.log.info('DRY-RUN: Watch tasks: %s', task_ids) - else: -- return koji_cli.lib.watch_tasks(self.cmd.kojisession, task_ids) -+ return koji_cli.lib.watch_tasks( -+ self.cmd.kojisession, -+ task_ids, -+ ki_handler=utils.make_koji_watch_tasks_handler(self.cmd.build_client) -+ ) - - def extract_greenwave_url(self): - greenwave_url = None -diff --git a/pyrpkg/utils.py b/pyrpkg/utils.py -index 2268e6f..37a39e2 100644 ---- a/pyrpkg/utils.py -+++ b/pyrpkg/utils.py -@@ -128,3 +128,24 @@ def validate_module_build_optional(optional_arg): - 'The "{0}" optional argument is reserved to built-in arguments'.format(key)) - - return (key, value) -+ -+ -+def make_koji_watch_tasks_handler(progname): -+ def koji_watch_tasks_handler(_, tasks, quiet): -+ """ -+ Displays information about running tasks and says how to watch them. -+ Unlike the default version at koji library it overrides progname -+ to show brew, koji or other build client. -+ """ -+ if not quiet: -+ tlist = ['%s: %s' % (t.str(), t.display_state(t.info)) -+ for t in tasks.values() if not t.is_done()] -+ print("""Tasks still running. You can continue to watch with the '%s watch-task' command. -+Running Tasks: %s""" % (progname, '\n'.join(tlist))) -+ -+ # Save reference of the handler during first time use. -+ # It guarantees that the same object is always returned (it allows unittest to pass). -+ global handler_reference -+ if 'handler_reference' not in globals(): -+ handler_reference = koji_watch_tasks_handler -+ return handler_reference -diff --git a/tests/test_cli.py b/tests/test_cli.py -index 785e103..b3e0718 100644 ---- a/tests/test_cli.py -+++ b/tests/test_cli.py -@@ -3235,23 +3235,28 @@ class TestBuildPackage(FakeKojiCreds, CliTestCase): - mock_build_api = None - - with patch('koji_cli.lib.watch_tasks') as watch_tasks: -- with patch('sys.argv', new=cli_cmd): -- cli = self.new_cli(cfg=config_file) -- if sub_command == 'build': -- mock_build_api = session.build -- cli.build() -- elif sub_command == 'scratch-build': -- mock_build_api = session.build -- cli.scratch_build() -- elif sub_command == 'chain-build': -- mock_build_api = session.chainBuild -- cli.chainbuild() -- -- if '--nowait' in cli_cmd: -- watch_tasks.assert_not_called() -- else: -- watch_tasks.assert_called_once_with( -- session, [mock_build_api.return_value]) -+ with patch('pyrpkg.utils.make_koji_watch_tasks_handler') as mock_ki: -+ with patch('sys.argv', new=cli_cmd): -+ cli = self.new_cli(cfg=config_file) -+ if sub_command == 'build': -+ mock_build_api = session.build -+ cli.build() -+ elif sub_command == 'scratch-build': -+ mock_build_api = session.build -+ cli.scratch_build() -+ elif sub_command == 'chain-build': -+ mock_build_api = session.chainBuild -+ cli.chainbuild() -+ -+ if '--nowait' in cli_cmd: -+ watch_tasks.assert_not_called() -+ else: -+ watch_tasks.assert_called_once_with( -+ session, -+ [mock_build_api.return_value], -+ ki_handler=mock_ki.return_value -+ ) -+ self.assertEqual(mock_ki.call_args, (("koji",),)) - - mock_build_api.assert_called_once() - --- -2.20.1 - diff --git a/0003-Show-nvr-in-container-build.patch b/0003-Show-nvr-in-container-build.patch deleted file mode 100644 index d7a6bae..0000000 --- a/0003-Show-nvr-in-container-build.patch +++ /dev/null @@ -1,75 +0,0 @@ -From 7cef29d843fabce5abab317303e9016c91414913 Mon Sep 17 00:00:00 2001 -From: Ondrej Nosek -Date: Fri, 24 May 2019 11:21:34 +0200 -Subject: [PATCH] Show nvr in container-build - -JIRA: COMPOSE-3481 - -Signed-off-by: Ondrej Nosek ---- - pyrpkg/__init__.py | 42 ++++++++++++++++++++++++++++++++++-------- - 1 file changed, 34 insertions(+), 8 deletions(-) - -diff --git a/pyrpkg/__init__.py b/pyrpkg/__init__.py -index 291b9ac..0348420 100644 ---- a/pyrpkg/__init__.py -+++ b/pyrpkg/__init__.py -@@ -3036,6 +3036,39 @@ class Commands(object): - # Run the command - self._run_command(cmd, shell=True) - -+ def _process_koji_task_result(self, task_id): -+ """ -+ Parse and modify output from brew/koji containing information about -+ task (and eventually builds). -+ -+ :param int task_id: id of the current task -+ :return: record containing information about repositories, builds and nvrs -+ :rtype: dict(str, str) -+ """ -+ koji_result = self.kojisession.getTaskResult(task_id) -+ if not koji_result: -+ raise rpkgError('Unknown task: %s' % task_id) -+ koji_builds = koji_result.get("koji_builds", []) -+ koji_result["koji_builds"] = [] -+ -+ for build_id in koji_builds: -+ try: -+ build_id = int(build_id) -+ except ValueError: -+ raise rpkgError("Can not convert 'build_id' to integer: %s" % build_id) -+ -+ bdata = self.kojisession.getBuild(build_id) -+ if not bdata: -+ raise rpkgError('Unknown build: %s' % build_id) -+ nvr = bdata.get("nvr") -+ if nvr: -+ koji_result.setdefault("nvrs", []).append(nvr) -+ -+ koji_result["koji_builds"].append( -+ "%s/buildinfo?buildID=%d" % (self.kojiweburl, build_id)) -+ -+ return koji_result -+ - def container_build_koji(self, target_override=False, opts={}, - kojiconfig=None, kojiprofile=None, - build_client=None, -@@ -3105,14 +3138,7 @@ class Commands(object): - if not nowait: - rv = koji_task_watcher(self.kojisession, [task_id]) - if rv == 0: -- result = self.kojisession.getTaskResult(task_id) -- try: -- result["koji_builds"] = [ -- "%s/buildinfo?buildID=%s" % (self.kojiweburl, -- build_id) -- for build_id in result.get("koji_builds", [])] -- except TypeError: -- pass -+ result = self._process_koji_task_result(task_id) - log_result(self.log.info, result) - - finally: --- -2.20.1 - diff --git a/0004-Different-import-offline-command-behavior.patch b/0004-Different-import-offline-command-behavior.patch deleted file mode 100644 index b17da5b..0000000 --- a/0004-Different-import-offline-command-behavior.patch +++ /dev/null @@ -1,123 +0,0 @@ -From 810b2f7efda65ba369f1bb865f25d351915db1ab Mon Sep 17 00:00:00 2001 -From: Ondrej Nosek -Date: Fri, 24 May 2019 17:43:01 +0200 -Subject: [PATCH] Different import --offline command behavior - -`*pkg import --offline` didn't update 'source' and '.gitignore' files. -Modified incorrect output about uploaded sources. Offline mode now does -everything but uploading sources into lookaside cache. - -JIRA: COMPOSE-3558 -Fixes: #445 -Resolves: rhbz#1175262 - -Signed-off-by: Ondrej Nosek ---- - pyrpkg/__init__.py | 5 +++-- - pyrpkg/cli.py | 15 +++++++++++---- - pyrpkg/lookaside.py | 8 +++++++- - tests/test_cli.py | 2 +- - 4 files changed, 22 insertions(+), 8 deletions(-) - -diff --git a/pyrpkg/__init__.py b/pyrpkg/__init__.py -index 0348420..1f61082 100644 ---- a/pyrpkg/__init__.py -+++ b/pyrpkg/__init__.py -@@ -2818,7 +2818,7 @@ class Commands(object): - self.log.debug('Cleaning up mock temporary config directory: %s', config_dir) - self._cleanup_tmp_dir(config_dir) - -- def upload(self, files, replace=False): -+ def upload(self, files, replace=False, offline=False): - """Upload source file(s) in the lookaside cache - - Both file `sources` and `.gitignore` will be updated with uploaded -@@ -2827,6 +2827,7 @@ class Commands(object): - :param iterable files: an iterable of files to upload. - :param bool replace: optionally replace the existing tracked sources. - Defaults to `False`. -+ :param bool offline: do all the steps except uploading into lookaside cache - :raises rpkgError: if failed to add a file to file `sources`. - """ - -@@ -2859,7 +2860,7 @@ class Commands(object): - gitignore.add('/%s' % file_basename) - self.lookasidecache.upload( - self.ns_repo_name if self.lookaside_namespaced else self.repo_name, -- f, file_hash) -+ f, file_hash, offline=offline) - - sourcesf.write() - gitignore.write() -diff --git a/pyrpkg/cli.py b/pyrpkg/cli.py -index 72be1cf..eb0f499 100644 ---- a/pyrpkg/cli.py -+++ b/pyrpkg/cli.py -@@ -2027,13 +2027,20 @@ see API KEY section of copr-cli(1) man page. - - def import_srpm(self): - uploadfiles = self.cmd.import_srpm(self.args.srpm) -- if uploadfiles and not self.args.offline: -- self.cmd.upload(uploadfiles, replace=True) -+ if uploadfiles: -+ self.cmd.upload(uploadfiles, replace=True, offline=self.args.offline) - if not self.args.skip_diffs: - self.cmd.diff(cached=True) - self.log.info('--------------------------------------------') -- self.log.info("New content staged and new sources uploaded.") -- self.log.info("Commit if happy or revert with: git reset --hard HEAD") -+ if uploadfiles and self.args.offline: -+ self.log.info("New content staged without uploading sources.") -+ self.log.info("Commit and upload (%s upload ) if happy or revert with: " -+ "'git reset --hard HEAD' (warning: it reverts also eventual user " -+ "changes)." % (self._name,)) -+ else: -+ self.log.info("New content staged and new sources uploaded.") -+ self.log.info("Commit if happy or revert with: 'git reset --hard HEAD' (warning: " -+ "it reverts also eventual user changes).") - - def install(self): - self.sources() -diff --git a/pyrpkg/lookaside.py b/pyrpkg/lookaside.py -index d28c1d9..ede81ea 100644 ---- a/pyrpkg/lookaside.py -+++ b/pyrpkg/lookaside.py -@@ -269,7 +269,7 @@ class CGILookasideCache(object): - raise UploadError('Error checking for %s at %s' - % (filename, self.upload_url)) - -- def upload(self, name, filepath, hash): -+ def upload(self, name, filepath, hash, offline=False): - """Upload a source file - - :param str name: The name of the module. (usually the name of the SRPM) -@@ -277,7 +277,13 @@ class CGILookasideCache(object): - server side expects). - :param str filepath: The full path to the file to upload. - :param str hash: The known good hash of the file. -+ :param bool offline: Method prints a message about disabled upload and does return. - """ -+ if offline: -+ self.log.info("Uploading: %s", filepath) -+ self.log.info("*Upload disabled*") -+ return -+ - filename = os.path.basename(filepath) - - # As in remote_file_exists, we need to convert unicode strings to str -diff --git a/tests/test_cli.py b/tests/test_cli.py -index b3e0718..ee92389 100644 ---- a/tests/test_cli.py -+++ b/tests/test_cli.py -@@ -1163,7 +1163,7 @@ class LookasideCacheMock(object): - def destroy_lookaside_cache(self): - shutil.rmtree(self.lookasidecache_storage) - -- def lookasidecache_upload(self, repo_name, filepath, hash): -+ def lookasidecache_upload(self, repo_name, filepath, hash, offline): - filename = os.path.basename(filepath) - storage_filename = os.path.join(self.lookasidecache_storage, filename) - with open(storage_filename, 'wb') as fout: --- -2.20.1 - diff --git a/rpkg.spec b/rpkg.spec index 702a935..a05c6f7 100644 --- a/rpkg.spec +++ b/rpkg.spec @@ -3,8 +3,8 @@ %{!?__python2: %global __python2 %{__python}} Name: rpkg -Version: 1.58 -Release: 10%{?dist} +Version: 1.59 +Release: 1%{?dist} Summary: Python library for interacting with rpm+git License: GPLv2+ and LGPLv2 @@ -21,10 +21,6 @@ Source0: https://pagure.io/releases/rpkg/%{name}-%{version}.tar.gz # and there is only old rpm-python package in EL6 and 7, so just simply to # remove rpm-py-installer for now. Patch0: remove-koji-and-rpm-py-installer-from-requires.patch -Patch1: 0001-Fix-clone-branches.patch -Patch2: 0002-Custom-handler-for-koji-watch_tasks.patch -Patch3: 0003-Show-nvr-in-container-build.patch -Patch4: 0004-Different-import-offline-command-behavior.patch %if 0%{?fedora} || 0%{?rhel} > 7 # Enable python3 build by default @@ -68,7 +64,7 @@ BuildRequires: python2-pycurl BuildRequires: python2-requests BuildRequires: python2-six >= 1.9.0 BuildRequires: python2-openidc-client -BuildRequires: python2-libmodulemd1 +BuildRequires: python2-libmodulemd %endif %if 0%{?rhel} && 0%{?rhel} < 7 @@ -103,7 +99,7 @@ Requires: python2-GitPython Requires: python2-rpm Requires: python2-pycurl Requires: python2-six >= 1.9.0 -Requires: python2-libmodulemd1 +Requires: python2-libmodulemd %endif %if 0%{?rhel} && 0%{?rhel} < 7 @@ -141,7 +137,7 @@ BuildRequires: python3-koji >= 1.17 BuildRequires: python3-gobject-base BuildRequires: libmodulemd %else -BuildRequires: python3-libmodulemd1 +BuildRequires: python3-libmodulemd %endif BuildRequires: python3-cccolutils BuildRequires: python3-openidc-client @@ -166,7 +162,7 @@ Requires: python3-koji >= 1.17 Requires: python3-gobject-base Requires: libmodulemd %else -Requires: python3-libmodulemd1 +Requires: python3-libmodulemd %endif Requires: python3-rpm Requires: python3-pycurl @@ -275,6 +271,26 @@ nosetests tests %changelog +* Mon Sep 16 2019 Ondřej Nosek - 1.59-1 +- Add argument to skip build option for container-build (rcerven) +- Sorting imports (onosek) +- Ignore error when adding exclude patterns - 1733862 (onosek) +- Path to lookaside repo fix (onosek) +- Add commands for interacting with Koji side-tag plugin - 329 (lsedlar) +- Do not delete files related to gating on import (onosek) +- Support integer values in the optional module-build arguments (mprahl) +- container-build: add --build-release argument (kdreyer) +- Allow some arguments for container-build together (onosek) +- git-changelog: Fix running on Python 3 - 3 (onosek) +- Port to libmodulemd 2 API (lsedlar) +- Module-overview allows filtering by owner - 325 (onosek) +- Different import --offline command behavior - #445 (onosek) +- Show nvr in container-build (onosek) +- Custom handler for koji watch_tasks (onosek) +- Unittests for clone command (onosek) +- Fix clone --branches - rhbz#1707223 (tmz) +- Make gitbuildhash work for windows builds (lsedlar) + * Mon Sep 16 2019 Ondřej Nosek - 1.58-10 - Update koji dependency diff --git a/sources b/sources index 6855be4..9752728 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (rpkg-1.58.tar.gz) = 2bb8064fbf716d24a43a959be528214c90feef1b8ffdb24f8ed2338e22a4694182ae0977e074c60280605efacd6f02a6c13b9304eefa230d461311930d085e1f +SHA512 (rpkg-1.59.tar.gz) = 773173f7133d65c8326649fac70c7f7ac32502f4cfe911d7d8988cad3892f0ea418aefa43c1a4a9a8ca68d1e020064d7c82a4e9d4e1a0c82ec9ace627bea3f20