This is an automated email from the git hooks/post-receive script.
clime pushed a commit to branch copr_dir_copr_cli_support
in repository copr/copr.
commit 58b27a0f8405d4b271aff86f4a406661a378cf17
Author: clime <clime(a)redhat.com>
AuthorDate: Wed Nov 7 22:02:02 2018 +0100
[cli][python][frontend] implement pg#462 add support for copr dir to copr-cli
---
.../Sanity/copr-cli-basic-operations/runtest.sh | 6 +++
cli/copr_cli/main.py | 19 ++++++---
frontend/coprs_frontend/coprs/forms.py | 2 +
.../coprs_frontend/coprs/logic/builds_logic.py | 46 +++++++++++++---------
.../coprs_frontend/coprs/logic/packages_logic.py | 5 ++-
.../coprs/views/apiv3_ns/apiv3_builds.py | 7 ++++
.../coprs/views/apiv3_ns/apiv3_packages.py | 3 +-
python/copr/v3/proxies/build.py | 31 +++++++++++----
python/copr/v3/proxies/package.py | 4 +-
9 files changed, 86 insertions(+), 37 deletions(-)
diff --git a/beaker-tests/Sanity/copr-cli-basic-operations/runtest.sh
b/beaker-tests/Sanity/copr-cli-basic-operations/runtest.sh
index fdf091a..952fd51 100755
--- a/beaker-tests/Sanity/copr-cli-basic-operations/runtest.sh
+++ b/beaker-tests/Sanity/copr-cli-basic-operations/runtest.sh
@@ -550,6 +550,10 @@ rlJournalStart
rlRun "copr-cli modify ${NAME_PREFIX}BootstrapProject --use-bootstrap
off"
rlAssertEquals "" `curl --silent
${FRONTEND_URL}/api/coprs/${NAME_PREFIX}BootstrapProject/detail/ |jq
'.detail.use_bootstrap_container'` false
+ ## test building in copr dirs
+ rlRun "copr-cli create --chroot $CHROOT ${NAME_PREFIX}CoprDirTest"
+ rlRun "copr-cli add-package-scm ${NAME_PREFIX}CoprDirTest --name example
--clone-url
http://github.com/clime/example.git" 0
+ rlRun "copr-cli buildscm ${NAME_PREFIX}CoprDirTest:example --clone-url
https://github.com/clime/example.git" 0
### ---- DELETING PROJECTS ------- ###
# delete - wrong project name
@@ -583,6 +587,8 @@ rlJournalStart
rlRun "copr-cli delete ${NAME_PREFIX}MockConfigParent"
rlRun "copr-cli delete ${NAME_PREFIX}TestBug1444804"
rlRun "copr-cli delete ${NAME_PREFIX}BootstrapProject"
+ rlRun "copr-cli delete ${NAME_PREFIX}CoprDirTest"
+
# and make sure we haven't left any mess
rlRun "copr-cli list | grep $NAME_PREFIX" 1
### left after this section: hello installed
diff --git a/cli/copr_cli/main.py b/cli/copr_cli/main.py
index 8127f06..5e03ba4 100644
--- a/cli/copr_cli/main.py
+++ b/cli/copr_cli/main.py
@@ -292,12 +292,15 @@ class Commands(object):
return self.process_build(args, self.client.build_proxy.create_from_scm, data)
def process_build(self, args, build_function, data, bar=None,
progress_callback=None):
- username, copr = self.parse_name(args.copr)
+ username, project_dirname = self.parse_name(args.copr_dir)
+ projectname = project_dirname.split(':')[0]
try:
buildopts = {"memory": args.memory, "timeout":
args.timeout, "chroots": args.chroots,
"background": args.background,
"progress_callback": progress_callback}
- result = build_function(ownername=username, projectname=copr,
buildopts=buildopts, **data)
+
+ result = build_function(ownername=username, projectname=projectname,
+ project_dirname=project_dirname, buildopts=buildopts,
**data)
builds = result if type(result) == list else [result]
print("Build was added to {0}:".format(builds[0].projectname))
@@ -624,7 +627,9 @@ class Commands(object):
print("Package's default source was successfully reseted.")
def action_build_package(self, args):
- ownername, projectname = self.parse_name(args.copr)
+ ownername, project_dirname = self.parse_name(args.copr_dir)
+ projectname = project_dirname.split(':')[0]
+
buildopts = {
"chroots": args.chroots,
#"memory": args.memory,
@@ -632,7 +637,8 @@ class Commands(object):
}
try:
build = self.client.package_proxy.build(ownername=ownername,
projectname=projectname,
- packagename=args.name,
buildopts=buildopts)
+ packagename=args.name,
buildopts=buildopts,
+ project_dirname=project_dirname)
print("Build was added to {0}.".format(build.projectname))
print("Created builds: {0}".format(build.id))
@@ -851,8 +857,9 @@ def setup_parser():
# parent parser for the builds commands below
parser_build_parent = argparse.ArgumentParser(add_help=False)
- parser_build_parent.add_argument("copr",
- help="The copr repo to build the package in.
Can be just name of project or even in format username/project or
@groupname/project.")
+ parser_build_parent.add_argument("copr_dir",
+ help="The copr repo to build the package in.
Can be just name of project or even in format username/project or @groupname/project.
"
+ "It can also be a copr directory name such as
project:<suffix>, where <suffix> is arbitrary.")
parser_build_parent.add_argument("--memory", dest="memory",
help="")
parser_build_parent.add_argument("--timeout", dest="timeout",
diff --git a/frontend/coprs_frontend/coprs/forms.py
b/frontend/coprs_frontend/coprs/forms.py
index cab0d35..865ccfd 100644
--- a/frontend/coprs_frontend/coprs/forms.py
+++ b/frontend/coprs_frontend/coprs/forms.py
@@ -374,6 +374,7 @@ class BuildFormRebuildFactory(object):
enable_net = wtforms.BooleanField(false_values=FALSE_VALUES)
background = wtforms.BooleanField(false_values=FALSE_VALUES)
+ project_dirname = wtforms.StringField(default=None)
F.chroots_list = list(map(lambda x: x.name, active_chroots))
F.chroots_list.sort()
@@ -757,6 +758,7 @@ class BaseBuildFormFactory(object):
F.enable_net = wtforms.BooleanField(false_values=FALSE_VALUES)
F.background = wtforms.BooleanField(default=False, false_values=FALSE_VALUES)
+ F.project_dirname = wtforms.StringField(default=None)
# overrides BasePackageForm.package_name and is unused for building
F.package_name = wtforms.StringField()
diff --git a/frontend/coprs_frontend/coprs/logic/builds_logic.py
b/frontend/coprs_frontend/coprs/logic/builds_logic.py
index efd013d..1eadfbe 100644
--- a/frontend/coprs_frontend/coprs/logic/builds_logic.py
+++ b/frontend/coprs_frontend/coprs/logic/builds_logic.py
@@ -494,14 +494,14 @@ GROUP BY
build = cls.create_new(user, copr, source_build.source_type,
source_build.source_json, chroot_names,
pkgs=source_build.pkgs, git_hashes=git_hashes,
skip_import=skip_import,
- srpm_url=source_build.srpm_url, **build_options)
+ srpm_url=source_build.srpm_url,
copr_dirname=source_build.copr_dir.name, **build_options)
build.package_id = source_build.package_id
build.pkg_version = source_build.pkg_version
return build
@classmethod
- def create_new_from_url(cls, user, copr, url,
- chroot_names=None, **build_options):
+ def create_new_from_url(cls, user, copr, url, chroot_names=None,
+ copr_dirname=None, **build_options):
"""
:type user: models.User
:type copr: models.Copr
@@ -514,12 +514,12 @@ GROUP BY
source_json = json.dumps({"url": url})
srpm_url = None if url.endswith('.spec') else url
return cls.create_new(user, copr, source_type, source_json, chroot_names,
- pkgs=url, srpm_url=srpm_url, **build_options)
+ pkgs=url, srpm_url=srpm_url, copr_dirname=copr_dirname,
**build_options)
@classmethod
def create_new_from_scm(cls, user, copr, scm_type, clone_url,
committish='', subdirectory='',
spec='', srpm_build_method='rpkg',
- chroot_names=None, **build_options):
+ chroot_names=None, copr_dirname=None, **build_options):
"""
:type user: models.User
:type copr: models.Copr
@@ -535,11 +535,11 @@ GROUP BY
"subdirectory": subdirectory,
"spec": spec,
"srpm_build_method": srpm_build_method})
- return cls.create_new(user, copr, source_type, source_json, chroot_names,
**build_options)
+ return cls.create_new(user, copr, source_type, source_json, chroot_names,
copr_dirname=copr_dirname, **build_options)
@classmethod
def create_new_from_pypi(cls, user, copr, pypi_package_name, pypi_package_version,
spec_template,
- python_versions, chroot_names=None, **build_options):
+ python_versions, chroot_names=None, copr_dirname=None,
**build_options):
"""
:type user: models.User
:type copr: models.Copr
@@ -556,11 +556,11 @@ GROUP BY
"pypi_package_version":
pypi_package_version,
"spec_template": spec_template,
"python_versions": python_versions})
- return cls.create_new(user, copr, source_type, source_json, chroot_names,
**build_options)
+ return cls.create_new(user, copr, source_type, source_json, chroot_names,
copr_dirname=copr_dirname, **build_options)
@classmethod
- def create_new_from_rubygems(cls, user, copr, gem_name,
- chroot_names=None, **build_options):
+ def create_new_from_rubygems(cls, user, copr, gem_name, chroot_names=None,
+ copr_dirname=None, **build_options):
"""
:type user: models.User
:type copr: models.Copr
@@ -570,12 +570,11 @@ GROUP BY
"""
source_type = helpers.BuildSourceEnum("rubygems")
source_json = json.dumps({"gem_name": gem_name})
- return cls.create_new(user, copr, source_type, source_json, chroot_names,
**build_options)
+ return cls.create_new(user, copr, source_type, source_json, chroot_names,
copr_dirname=copr_dirname, **build_options)
@classmethod
- def create_new_from_custom(cls, user, copr,
- script, script_chroot=None, script_builddeps=None,
- script_resultdir=None, chroot_names=None, **kwargs):
+ def create_new_from_custom(cls, user, copr, script, script_chroot=None,
script_builddeps=None,
+ script_resultdir=None, chroot_names=None,
copr_dirname=None, **kwargs):
"""
:type user: models.User
:type copr: models.Copr
@@ -595,11 +594,11 @@ GROUP BY
}
return cls.create_new(user, copr, source_type, json.dumps(source_dict),
- chroot_names, **kwargs)
+ chroot_names, copr_dirname=copr_dirname, **kwargs)
@classmethod
def create_new_from_upload(cls, user, copr, f_uploader, orig_filename,
- chroot_names=None, **build_options):
+ chroot_names=None, copr_dirname=None, **build_options):
"""
:type user: models.User
:type copr: models.Copr
@@ -625,7 +624,8 @@ GROUP BY
try:
build = cls.create_new(user, copr, source_type, source_json,
- chroot_names, pkgs=pkg_url, srpm_url=srpm_url,
**build_options)
+ chroot_names, pkgs=pkg_url, srpm_url=srpm_url,
+ copr_dirname=copr_dirname, **build_options)
except Exception:
shutil.rmtree(tmp) # todo: maybe we should delete in some cleanup
procedure?
raise
@@ -635,7 +635,7 @@ GROUP BY
@classmethod
def create_new(cls, user, copr, source_type, source_json, chroot_names=None,
pkgs="",
git_hashes=None, skip_import=False, background=False, batch=None,
- srpm_url=None, **build_options):
+ srpm_url=None, copr_dirname=None, **build_options):
"""
:type user: models.User
:type copr: models.Copr
@@ -669,6 +669,7 @@ GROUP BY
skip_import=skip_import,
batch=batch,
srpm_url=srpm_url,
+ copr_dirname=copr_dirname,
)
if user.proven:
@@ -681,7 +682,7 @@ GROUP BY
def add(cls, user, pkgs, copr, source_type=None, source_json=None,
repos=None, chroots=None, timeout=None, enable_net=True,
git_hashes=None, skip_import=False, background=False, batch=None,
- srpm_url=None):
+ srpm_url=None, copr_dirname=None):
if chroots is None:
chroots = []
@@ -712,6 +713,12 @@ GROUP BY
chroot_status = StatusEnum("waiting")
source_status = StatusEnum("pending")
+ copr_dir = None
+ if copr_dirname:
+ if not copr_dirname.startswith(copr.name+':') and copr_dirname !=
copr.name:
+ raise MalformedArgumentException("Copr dirname not starting with
copr name.")
+ copr_dir = coprs_logic.CoprDirsLogic.get_or_create(copr, copr_dirname)
+
build = models.Build(
user=user,
pkgs=pkgs,
@@ -725,6 +732,7 @@ GROUP BY
is_background=bool(background),
batch=batch,
srpm_url=srpm_url,
+ copr_dir=copr_dir,
)
if timeout:
diff --git a/frontend/coprs_frontend/coprs/logic/packages_logic.py
b/frontend/coprs_frontend/coprs/logic/packages_logic.py
index 3b922fc..8199c42 100644
--- a/frontend/coprs_frontend/coprs/logic/packages_logic.py
+++ b/frontend/coprs_frontend/coprs/logic/packages_logic.py
@@ -250,10 +250,11 @@ WHERE package.copr_dir_id = :copr_dir_id;
@classmethod
- def build_package(cls, user, copr, package, chroot_names=None, **build_options):
+ def build_package(cls, user, copr, package, chroot_names=None, copr_dirname=None,
**build_options):
if not package.has_source_type_set or not package.source_json:
raise exceptions.NoPackageSourceException('Unset default source for
package {0}'.format(package.name))
- return builds_logic.BuildsLogic.create_new(user, copr, package.source_type,
package.source_json, chroot_names, **build_options)
+ return builds_logic.BuildsLogic.create_new(user, copr, package.source_type,
package.source_json,
+ chroot_names,
copr_dirname=copr_dirname, **build_options)
@classmethod
diff --git a/frontend/coprs_frontend/coprs/views/apiv3_ns/apiv3_builds.py
b/frontend/coprs_frontend/coprs/views/apiv3_ns/apiv3_builds.py
index ecbbb71..91176a1 100644
--- a/frontend/coprs_frontend/coprs/views/apiv3_ns/apiv3_builds.py
+++ b/frontend/coprs_frontend/coprs/views/apiv3_ns/apiv3_builds.py
@@ -26,6 +26,7 @@ def to_dict(build):
"ended_on": build.max_ended_on,
"submitter": build.user.name if build.user else None,
"chroots": [chroot.name for chroot in build.build_chroots],
+ "project_dirname": build.copr_dir.name,
}
@@ -135,6 +136,7 @@ def create_from_url():
url=pkg,
chroot_names=form.selected_chroots,
background=form.background.data,
+ copr_dirname=form.project_dirname.data,
) for pkg in pkgs]
return process_creating_new_build(copr, form, create_new_build)
@@ -154,6 +156,7 @@ def create_from_upload():
orig_filename=secure_filename(form.pkgs.data.filename),
chroot_names=form.selected_chroots,
background=form.background.data,
+ copr_dirname=form.project_dirname.data,
)
return process_creating_new_build(copr, form, create_new_build)
@@ -177,6 +180,7 @@ def create_from_scm():
srpm_build_method=form.srpm_build_method.data,
chroot_names=form.selected_chroots,
background=form.background.data,
+ copr_dirname=form.project_dirname.data,
)
return process_creating_new_build(copr, form, create_new_build)
@@ -202,6 +206,7 @@ def create_from_pypi():
form.python_versions.data,
form.selected_chroots,
background=form.background.data,
+ copr_dirname=form.project_dirname.data,
)
return process_creating_new_build(copr, form, create_new_build)
@@ -220,6 +225,7 @@ def create_from_rubygems():
form.gem_name.data,
form.selected_chroots,
background=form.background.data,
+ copr_dirname=form.project_dirname.data,
)
return process_creating_new_build(copr, form, create_new_build)
@@ -241,6 +247,7 @@ def create_from_custom():
form.resultdir.data,
chroot_names=form.selected_chroots,
background=form.background.data,
+ copr_dirname=form.project_dirname.data,
)
return process_creating_new_build(copr, form, create_new_build)
diff --git a/frontend/coprs_frontend/coprs/views/apiv3_ns/apiv3_packages.py
b/frontend/coprs_frontend/coprs/views/apiv3_ns/apiv3_packages.py
index c2d0c26..0b062ad 100644
--- a/frontend/coprs_frontend/coprs/views/apiv3_ns/apiv3_packages.py
+++ b/frontend/coprs_frontend/coprs/views/apiv3_ns/apiv3_packages.py
@@ -119,7 +119,8 @@ def package_build():
.format(name=form.package_name.data, copr=copr.name))
if form.validate_on_submit():
buildopts = {k: v for k, v in form.data.items() if k in data}
- build = PackagesLogic.build_package(flask.g.user, copr, package,
form.selected_chroots, **buildopts)
+ build = PackagesLogic.build_package(flask.g.user, copr, package,
form.selected_chroots,
+ copr_dirname=form.project_dirname.data,
**buildopts)
db.session.commit()
else:
raise BadRequest(form.errors)
diff --git a/python/copr/v3/proxies/build.py b/python/copr/v3/proxies/build.py
index dbcd3c9..18fc96e 100644
--- a/python/copr/v3/proxies/build.py
+++ b/python/copr/v3/proxies/build.py
@@ -79,7 +79,7 @@ class BuildProxy(BaseProxy):
response = request.send()
return munchify(response)
- def create_from_urls(self, ownername, projectname, urls, buildopts=None):
+ def create_from_urls(self, ownername, projectname, urls, buildopts=None,
project_dirname=None):
"""
Create builds from a list of URLs
@@ -87,6 +87,7 @@ class BuildProxy(BaseProxy):
:param str projectname:
:param list urls:
:param buildopts:
http://python-copr.readthedocs.io/en/latest/client_v3/build_options.html
+ :param str project_dirname:
:return: Munch
"""
endpoint = "/build/create/url"
@@ -94,10 +95,11 @@ class BuildProxy(BaseProxy):
"ownername": ownername,
"projectname": projectname,
"pkgs": urls,
+ "project_dirname": project_dirname,
}
return self._create(endpoint, data, buildopts=buildopts)
- def create_from_url(self, ownername, projectname, url, buildopts=None):
+ def create_from_url(self, ownername, projectname, url, buildopts=None,
project_dirname=None):
"""
Create a build from URL
@@ -105,14 +107,16 @@ class BuildProxy(BaseProxy):
:param str projectname:
:param str url:
:param buildopts:
http://python-copr.readthedocs.io/en/latest/client_v3/build_options.html
+ :param str project_dirname:
:return: Munch
"""
if len(url.split()) > 1:
raise CoprValidationException("This method doesn't allow submitting
multiple URLs at once. "
"Use `create_from_urls` instead.")
- return self.create_from_urls(ownername, projectname, [url],
buildopts=buildopts)[0]
+ return self.create_from_urls(ownername, projectname, [url], buildopts=buildopts,
+ project_dirname=project_dirname)[0]
- def create_from_file(self, ownername, projectname, path, buildopts=None):
+ def create_from_file(self, ownername, projectname, path, buildopts=None,
project_dirname=None):
"""
Create a build from local SRPM file
@@ -120,6 +124,7 @@ class BuildProxy(BaseProxy):
:param str projectname:
:param str path:
:param buildopts:
http://python-copr.readthedocs.io/en/latest/client_v3/build_options.html
+ :param str project_dirname:
:return: Munch
"""
endpoint = "/build/create/upload"
@@ -128,6 +133,7 @@ class BuildProxy(BaseProxy):
data = {
"ownername": ownername,
"projectname": projectname,
+ "project_dirname": project_dirname,
}
files = {
"pkgs": (os.path.basename(f.name), f,
"application/x-rpm"),
@@ -135,7 +141,7 @@ class BuildProxy(BaseProxy):
return self._create(endpoint, data, files=files, buildopts=buildopts)
def create_from_scm(self, ownername, projectname, clone_url, committish="",
subdirectory="", spec="",
- scm_type="git", source_build_method="rpkg",
buildopts=None):
+ scm_type="git", source_build_method="rpkg",
buildopts=None, project_dirname=None):
"""
Create a build from SCM repository
@@ -148,6 +154,7 @@ class BuildProxy(BaseProxy):
:param str scm_type:
:param str source_build_method:
:param buildopts:
http://python-copr.readthedocs.io/en/latest/client_v3/build_options.html
+ :param str project_dirname:
:return: Munch
"""
endpoint = "/build/create/scm"
@@ -160,11 +167,12 @@ class BuildProxy(BaseProxy):
"spec": spec,
"scm_type": scm_type,
"source_build_method": source_build_method,
+ "project_dirname": project_dirname,
}
return self._create(endpoint, data, buildopts=buildopts)
def create_from_pypi(self, ownername, projectname, pypi_package_name,
pypi_package_version=None,
- spec_template='', python_versions=None,
buildopts=None):
+ spec_template='', python_versions=None, buildopts=None,
project_dirname=None):
"""
Create a build from PyPI -
https://pypi.org/
@@ -175,6 +183,7 @@ class BuildProxy(BaseProxy):
:param str spec_template: what pyp2rpm spec template to use
:param list python_versions: list of python versions to build for
:param buildopts:
http://python-copr.readthedocs.io/en/latest/client_v3/build_options.html
+ :param str project_dirname:
:return: Munch
"""
endpoint = "/build/create/pypi"
@@ -185,10 +194,11 @@ class BuildProxy(BaseProxy):
"pypi_package_version": pypi_package_version,
"spec_template": spec_template,
"python_versions": python_versions or [3, 2],
+ "project_dirname": project_dirname,
}
return self._create(endpoint, data, buildopts=buildopts)
- def create_from_rubygems(self, ownername, projectname, gem_name, buildopts=None):
+ def create_from_rubygems(self, ownername, projectname, gem_name, buildopts=None,
project_dirname=None):
"""
Create a build from RubyGems -
https://rubygems.org/
@@ -196,6 +206,7 @@ class BuildProxy(BaseProxy):
:param str projectname:
:param str gem_name:
:param buildopts:
http://python-copr.readthedocs.io/en/latest/client_v3/build_options.html
+ :param str project_dirname:
:return: Munch
"""
endpoint = "/build/create/rubygems"
@@ -203,11 +214,13 @@ class BuildProxy(BaseProxy):
"ownername": ownername,
"projectname": projectname,
"gem_name": gem_name,
+ "project_dirname": project_dirname,
}
return self._create(endpoint, data, buildopts=buildopts)
def create_from_custom(self, ownername, projectname, script, script_chroot=None,
- script_builddeps=None, script_resultdir=None,
buildopts=None):
+ script_builddeps=None, script_resultdir=None, buildopts=None,
+ project_dirname=None):
"""
Create a build from custom script.
@@ -219,6 +232,7 @@ class BuildProxy(BaseProxy):
:param script_builddeps: [optional] list of script's dependencies
:param script_resultdir: [optional] where script generates results
(relative to cwd)
+ :param str project_dirname:
:return: Munch
"""
endpoint = "/build/create/custom"
@@ -229,6 +243,7 @@ class BuildProxy(BaseProxy):
"chroot": script_chroot,
"builddeps": script_builddeps,
"resultdir": script_resultdir,
+ "project_dirname": project_dirname,
}
return self._create(endpoint, data, buildopts=buildopts)
diff --git a/python/copr/v3/proxies/package.py b/python/copr/v3/proxies/package.py
index 7a6863a..dfb9b7e 100644
--- a/python/copr/v3/proxies/package.py
+++ b/python/copr/v3/proxies/package.py
@@ -120,7 +120,7 @@ class PackageProxy(BaseProxy):
response = request.send()
return munchify(response)
- def build(self, ownername, projectname, packagename, buildopts=None):
+ def build(self, ownername, projectname, packagename, buildopts=None,
project_dirname=None):
"""
Create a build from a package configuration
@@ -128,6 +128,7 @@ class PackageProxy(BaseProxy):
:param str projectname:
:param str packagename:
:param buildopts:
http://python-copr.readthedocs.io/en/latest/client_v3/build_options.html
+ :param str project_dirname:
:return: Munch
"""
endpoint = "/package/build"
@@ -135,6 +136,7 @@ class PackageProxy(BaseProxy):
"ownername": ownername,
"projectname": projectname,
"package_name": packagename,
+ "project_dirname": project_dirname,
}
build_proxy = BuildProxy(self.config)
return build_proxy._create(endpoint, data, buildopts=buildopts)
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.