From 7b9363b53224a381fe988b707655d8697cd45975 Mon Sep 17 00:00:00 2001 From: ZhangXiao Date: Fri, 5 Nov 2021 21:41:33 +0800 Subject: [PATCH] repo_manage: add support to delete source packages Be careful to use it without paramter "--package_version", this will delete all versions of specified packages. Story: 2008846 Task: 43864 Signed-off-by: ZhangXiao Change-Id: I5914141018b9d46af37d08309776577a18be837f --- build-tools/stx/aptly_deb_usage.py | 13 ++++++---- build-tools/stx/repo_manage.py | 39 ++++++++++++++++++------------ 2 files changed, 31 insertions(+), 21 deletions(-) diff --git a/build-tools/stx/aptly_deb_usage.py b/build-tools/stx/aptly_deb_usage.py index 2ca1183c..b13ad37d 100755 --- a/build-tools/stx/aptly_deb_usage.py +++ b/build-tools/stx/aptly_deb_usage.py @@ -388,15 +388,19 @@ class Deb_aptly(): self.logger.warning('add_upload_file failed %s : %s : %s', new_name, repo_name, self.aptly.tasks.show(task.id).state) return True - # Remove a binary Debian package from a local repository. + # Delete a Debian package from a local repository. # Input: # local_repo: the name of the local repository # pkg_name: the path-name of the deb file + # pkg_type: 'binary' or 'source' # pkg_version: version of the deb file # Output: None - def delete_pkg_local(self, local_repo, pkg_name, pkg_version: Optional[str] = None): + def delete_pkg_local(self, local_repo, pkg_name, pkg_type, pkg_version = None): '''Delete a binary package from a local repository.''' # self.logger.debug('delete_pkg_local not supported yet.') + if pkg_type not in {'binary', 'source'}: + self.logger.error('package type must be one of either "binary" or "source"') + return if not pkg_version: query = pkg_name else: @@ -404,10 +408,9 @@ class Deb_aptly(): # If we want more detailed info, add "detailed=True, with_deps=True" for search_packages. search_result = self.aptly.repos.search_packages(local_repo, query=query) self.logger.debug('delete_pkg_local find %d packages.', len(search_result)) - # find_pkg = False for pkg in search_result: - if pkg.key.split()[0] != 'Psource': - # find_pkg = True + if (pkg_type == 'source' and pkg.key.split()[0] == 'Psource') or \ + (pkg_type != 'source' and pkg.key.split()[0] != 'Psource') : self.aptly.repos.delete_packages_by_key(local_repo, pkg.key) # Search a package in a set of repos, return True if find, or False diff --git a/build-tools/stx/repo_manage.py b/build-tools/stx/repo_manage.py index d6f141d3..b3dbc386 100755 --- a/build-tools/stx/repo_manage.py +++ b/build-tools/stx/repo_manage.py @@ -478,9 +478,9 @@ class RepoMgr(): return True # search a package from a repository - # repo_name: name of the repository that search the package - # pkg_name: name of the binary package to be deleted - # pkg_version: version number of the package to be deleted + # repo_name: name of the repository to search the package in + # pkg_name: name of the Debian package to be searched + # pkg_version: version number of the package to be searched # binary: binary package or source one? # Output: True if find, or False def search_pkg(self, repo_name, pkg_name, pkg_version: Optional[str] = None, binary: Optional[bool] = True): @@ -508,28 +508,35 @@ class RepoMgr(): return False return True - # Delete a binary package from a repository - # repo_name: name of the LOCAL repository that delete the package from + # Delete a Debian package from a local repository + # repo_name: name of the LOCAL repository to delete the package from # pkg_name: name of the binary package to be deleted + # pkg_type: 'source' or 'binary' # pkg_version: version number of the package to be deleted # Output: True is find and deleted, or False - def delete_pkg(self, repo_name, pkg_name, pkg_version: Optional[str] = None): + def delete_pkg(self, repo_name, pkg_name, pkg_type, pkg_version = ''): '''Find and delete a binary package from a specified local repo.''' repo_find = False repo = None + if pkg_type not in {'binary', 'source'}: + self.logger.error('Delete package, pkg_type must be one of either "binary" or "source".') + return False + if not repo_name.startswith(aptly_deb_usage.PREFIX_LOCAL): + self.logger.error('Delete package, only local repositories support this operation.') + return False local_list = self.repo.list_local(quiet=True) for repo in local_list: if repo == repo_name: repo_find = True if not repo_find: - self.logger.err('Delete package, repository not exist.') + self.logger.error('Delete package, repository not exist.') return False - if not self.repo.pkg_exist([repo_name], pkg_name, 'binary', pkg_version): + if not self.repo.pkg_exist([repo_name], pkg_name, pkg_type, pkg_version): self.logger.info('Delete package, package not find.') return False - self.repo.delete_pkg_local(repo_name, pkg_name, pkg_version) + self.repo.delete_pkg_local(repo_name, pkg_name, pkg_type, pkg_version) self.repo.deploy_local(repo_name) return True @@ -565,12 +572,11 @@ def _handleUploadPkg(args): def _handleDeletePkg(args): repomgr = RepoMgr('aptly', REPOMGR_URL, '/tmp', applogger) - repomgr.delete_pkg(args.repository, args.package_name, pkg_version=args.package_version) + repomgr.delete_pkg(args.repository, args.package_name, args.package_type, pkg_version=args.package_version) def _handleSearchPkg(args): repomgr = RepoMgr('aptly', REPOMGR_URL, '/tmp', applogger) - print('_handleSearchPkg', args.package_name, args.package_type) if args.package_type == 'binary': repomgr.search_pkg(args.repository, args.package_name, pkg_version=args.package_version, binary=True) else: @@ -654,17 +660,18 @@ def main(): upload_pkg_parser.set_defaults(handle=_handleUploadPkg) delete_pkg_parser = subparsers.add_parser('delete_pkg', - help='Delete a specified binary package from a specified repository.\n\n') - delete_pkg_parser.add_argument('--package_name', '-p', help='Binary package to be deleted.') - delete_pkg_parser.add_argument('--package_version', '-v', help='The version of the binary package.', required=False) - delete_pkg_parser.add_argument('--repository', '-r', help='The Repository that will delete the package.') + help='Delete a specified Debian package from a specified repository.\n\n') + delete_pkg_parser.add_argument('--package_name', '-p', help='Package name to be deleted.') + delete_pkg_parser.add_argument('--package_type', '-t', help='Package type to be deleted, "binary" or "source".') + delete_pkg_parser.add_argument('--package_version', '-v', help='Version number of the package.', required=False) + delete_pkg_parser.add_argument('--repository', '-r', help='Local Repository to delete the package from.') delete_pkg_parser.set_defaults(handle=_handleDeletePkg) search_pkg_parser = subparsers.add_parser('search_pkg', help='Search a specified package from a specified repository.\n\n') search_pkg_parser.add_argument('--package_name', '-p', help='package to be looking for.') search_pkg_parser.add_argument('--package_version', '-v', help='The version of the package.', required=False) - search_pkg_parser.add_argument('--repository', '-r', help='The Repository that will delete the pacakge.') + search_pkg_parser.add_argument('--repository', '-r', help='The Repository to search the package in.') search_pkg_parser.add_argument('--package_type', '-t', help='binary or source', required=False) search_pkg_parser.set_defaults(handle=_handleSearchPkg)