def diff(request, repo_id=None, repo_id2=None): repoapi = RepositoryAPI() if request.GET: mode = request.GET.get("mode", "all") else: mode = "all" repo1 = repo_utils.get_repo(repo_id) repo2 = repo_utils.get_repo(repo_id2) packages1 = dict([("%s.%s" % (p['name'], p['arch']), p) for p in repoapi.packages(repo_id)]) packages2 = dict([("%s.%s" % (p['name'], p['arch']), p) for p in repoapi.packages(repo_id2)]) pkg_names = set(packages1.keys() + packages2.keys()) allpackages = dict() for pkg in pkg_names: if pkg in packages1: nevra1 = repo_utils.get_nevra(packages1[pkg]) else: nevra1 = None if pkg in packages2: nevra2 = repo_utils.get_nevra(packages2[pkg]) else: nevra2 = None if nevra1 == nevra2 and mode == "diff": continue allpackages[pkg] = dict() allpackages[pkg]["repo1"] = nevra1 allpackages[pkg]["repo2"] = nevra2 return dict(repo1=repo1, repo2=repo2, mode=mode, packages1=packages1, packages2=packages2, allpackages=allpackages)
def get_updates(repo): """ return a list of updated packages available to a child repo """ if not repo["parent"]: return None repoapi = RepositoryAPI() child_nevras = [get_nevra(p) for p in repoapi.packages(repo["id"])] rv = [] for pkg in repoapi.packages(repo["parent"]["id"]): if get_nevra(pkg) not in child_nevras: rv.append(pkg) return rv
def promote_select(request, repo_id=None): repo = repo_utils.get_repo(repo_id) form = PromotePackageSelectionForm(request.POST or None, repo=repo) if request.method == 'POST' and form.is_valid(): repoapi = RepositoryAPI() pset = PackageSet.objects.create(stype="promote") pset.save() prepo = PackageSetRepo.objects.create(packageset=pset, repoid=repo['id'], name=repo['name']) prepo.save() packages = [] for pkg in repoapi.packages(repo['parent']['id']): if pkg['id'] in form.cleaned_data['packages']: packages.append(pkg) pspkg = \ PackageSetPackage.objects.create(packageset=pset, packageid=pkg['id'], pkgobj=cPickle.dumps(pkg)) pspkg.save() deps = repo_utils.resolve_deps(packages, [repo['parent']['id']], pkgfilter=repoapi.packages(repo['id'])) for pkg in deps: pspkg = PackageSetPackage.objects.create(packageset=pset, packageid=pkg['id'], pkgobj=cPickle.dumps(pkg)) pspkg.save() return HttpResponseRedirect(reverse('sponge.views.repos.promote_ok', kwargs=dict(pid=pset.pk))) packages = repo_utils.get_updates(repo) if packages: return dict(repo=repo, form=form) else: messages.info(request, "No packages available to be promoted from %s to %s" % (repo['parent']['name'], repo['name'])) return HttpResponseRedirect(reverse('sponge.views.repos.list'))
def get_package(repo, name=None, id=None): if not isinstance(repo, dict): repo = get_repo(repo) repoapi = RepositoryAPI() for pkg in repoapi.packages(repo["id"]): if ( pkg["id"] == id or pkg["name"] == name or get_nevra(pkg) == name or get_nevra(pkg, arch=repo["arch"]) == name or "%s-%s" % (pkg["name"], pkg["version"]) == name ): return pkg return None
def view(request, repo_id=None): repoapi = RepositoryAPI() repo = repo_utils.get_repo(repo_id) packages = repoapi.packages(repo_id) for pkg in packages: pkg['nevra'] = repo_utils.get_nevra(pkg, repo['arch']) editform = RepoEditForm(request.POST or None, repo=repo) diffform = DiffSelectForm(request.POST or None, repo=repo) if request.method == 'POST' and "repoedit" in request.POST: if editform.is_valid(): success = True if editform.cleaned_data['name'] != repo['name']: try: repoapi.update(repo['id'], dict(name=editform.cleaned_data['name'], checksum_type=editform.cleaned_data['cksum'])) messages.debug(request, "Updated repository name for %s" % repo['id']) except ServerRequestError, err: success = False messages.error(request, "Could not update repository info for %s: " "%s" % (repo['id'], err[1])) groups = filter(lambda s: s != '', editform.cleaned_data['groups'] + \ re.split(r'\s*,\s*', editform.cleaned_data['newgroups'])) success &= repo_utils.set_groups(repo, groups, request=request) success &= repo_utils.set_gpgkeys(repo, editform.cleaned_data['gpgkeys'].splitlines(), request=request) success &= repo_utils.set_filters(repo, editform.cleaned_data['filters'], request=request) if success: messages.success(request, "Updated repository %s" % repo['id']) else: messages.warning(request, "Errors encountered while updating repository " "%s" % repo['id']) repo = repo_utils.reload_repo(repo['id'])
def demote_select(request, repo_id=None): repo = repo_utils.get_repo(repo_id) form = DemotePackageSelectionForm(request.POST or None, repo=repo) if request.method == 'POST' and form.is_valid(): pset = PackageSet.objects.create(stype="demote") pset.save() prepo = PackageSetRepo.objects.create(packageset=pset, repoid=repo['id'], name=repo['name']) prepo.save() repoapi = RepositoryAPI() for pkg in repoapi.packages(repo['id']): if pkg['id'] in form.cleaned_data['packages']: pspkg = \ PackageSetPackage.objects.create(packageset=pset, packageid=pkg['id'], pkgobj=cPickle.dumps(pkg)) pspkg.save() return HttpResponseRedirect(reverse('sponge.views.repos.demote_ok', kwargs=dict(pid=pset.pk))) else: packages = repo_utils.get_updates(repo) return dict(repo=repo, form=form)
def get_packages(self, repo): repoapi = RepositoryAPI() return repoapi.packages(repo['id'])