Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
commit c57f474df123b66cc387ad665bbd28dc9b426113 Author: Valentin Gologuzov vgologuz@redhat.com Date: Fri Nov 7 11:21:05 2014 +0100
[PEP8] cleanup, part 1
backend/backend/dispatcher.py | 57 +++++++------- .../coprs_frontend/coprs/logic/builds_logic.py | 53 +++++++------ frontend/coprs_frontend/coprs/logic/coprs_logic.py | 1 + .../coprs/views/admin_ns/admin_general.py | 28 ++++---- .../coprs/views/api_ns/api_general.py | 36 +++++---- .../coprs/views/coprs_ns/coprs_general.py | 81 ++++++++++---------- setup.cfg | 4 + 7 files changed, 135 insertions(+), 125 deletions(-)
diff --git a/backend/backend/dispatcher.py b/backend/backend/dispatcher.py index 1854175..c183293 100644 --- a/backend/backend/dispatcher.py +++ b/backend/backend/dispatcher.py @@ -29,12 +29,13 @@ try: except ImportError: pass # fedmsg is optional
+ def ans_extra_vars_encode(extra_vars, name): """ transform dict into --extra-vars="json string" """ if not extra_vars: return "" - return "--extra-vars='{{"{0}": {1}}}'".format( - name, json.dumps(extra_vars)) + return "--extra-vars='{{"{0}": {1}}}'".format(name, json.dumps(extra_vars)) +
class SilentPlaybookCallbacks(callbacks.PlaybookCallbacks):
@@ -147,11 +148,11 @@ class Worker(multiprocessing.Process): self.spawn_in_advance = self.opts.spawn_in_advance self.frontend_callback = FrontendCallback(opts, events) if not self.callback: - self.logfile = os.path.join( - self.opts.worker_logdir, - "worker-{0}-{1}.log".format( - self.opts.build_groups[self.group_id]["name"], - self.worker_num)) + log_name = "worker-{0}-{1}.log".format( + self.opts.build_groups[self.group_id]["name"], + self.worker_num) + + self.logfile = os.path.join(self.opts.worker_logdir, log_name) self.callback = WorkerCallback(logfile=self.logfile)
if ip: @@ -289,8 +290,7 @@ class Worker(multiprocessing.Process): return None
args = "-c ssh {0} {1}".format( - spawn_playbook, - ans_extra_vars_encode(extra_vars, "copr_task")) + spawn_playbook, ans_extra_vars_encode(extra_vars, "copr_task"))
i = 0 while True: @@ -327,12 +327,13 @@ class Worker(multiprocessing.Process): # we were getting some dead instancies # that's why I'm testing the conncectivity here connection = ansible.runner.Runner( - remote_user="root", - host_list=ipaddr+",", - pattern=ipaddr, - forks=1, - transport="ssh", - timeout=500) + remote_user="root", + host_list=ipaddr+",", + pattern=ipaddr, + forks=1, + transport="ssh", + timeout=500 + ) connection.module_name = "shell" connection.module_args = "echo hello" res = connection.run() @@ -341,8 +342,9 @@ class Worker(multiprocessing.Process): return ipaddr
else: - self.callback.log("Worker is not responding to" \ - "the testing playbook. Spawning another one.") + self.callback.log( + "Worker is not responding to" + "the testing playbook. Spawning another one.") self.terminate_instance(ipaddr)
def terminate_instance(self, instance_ip): @@ -357,8 +359,8 @@ class Worker(multiprocessing.Process): term_args["vm_name"] = self.vm_name
args = "-c ssh -i '{0},' {1} {2}".format( - instance_ip, self.opts.build_groups[self.group_id]["terminate_playbook"], - ans_extra_vars_encode(term_args, "copr_task")) + instance_ip, self.opts.build_groups[self.group_id]["terminate_playbook"], + ans_extra_vars_encode(term_args, "copr_task")) self.run_ansible_playbook(args, "terminate instance")
def mark_started(self, job): @@ -368,11 +370,9 @@ class Worker(multiprocessing.Process):
job.status = 3 # running build = job.to_dict() - self.callback.log("build: {}".format(build)) - #build["status"] = 3 # running - data = {"builds": [build]}
+ data = {"builds": [build]} try: self.frontend_callback.update(data) except: @@ -453,8 +453,8 @@ class Worker(multiprocessing.Process):
while not self.kill_received: setproctitle("worker-{0} {1} No task".format( - self.opts.build_groups[self.group_id]["name"], - self.worker_num)) + self.opts.build_groups[self.group_id]["name"], + self.worker_num))
# this sometimes caused TypeError in random worker # when another one picekd up a task to build @@ -496,10 +496,11 @@ class Worker(multiprocessing.Process): # Checking whether to build or skip if self.pkg_built_before(job.pkgs, job.chroot, job.destdir): self._announce_start(job) - self.callback.log("Skipping: package {0} has been"\ - "already built before.".format( - ' '.join(job.pkgs))) - job.status = 5 # skipped + self.callback.log( + "Skipping: package {0} has been already built before." + .format(' '.join(job.pkgs))) + + job.status = 5 # skipped self._announce_end(job) continue # FIXME diff --git a/frontend/coprs_frontend/coprs/logic/builds_logic.py b/frontend/coprs_frontend/coprs/logic/builds_logic.py index ef3a97b..0024874 100644 --- a/frontend/coprs_frontend/coprs/logic/builds_logic.py +++ b/frontend/coprs_frontend/coprs/logic/builds_logic.py @@ -43,7 +43,6 @@ class BuildsLogic(object):
return query
- @classmethod def get_build_task_queue(cls): """ @@ -51,14 +50,14 @@ class BuildsLogic(object): - older than 2 hours and unfinished """ query = models.BuildChroot.query.join(models.Build).filter(or_( - models.BuildChroot.status == helpers.StatusEnum("pending"), - models.BuildChroot.status == helpers.StatusEnum("starting"), - and_( - models.BuildChroot.status == helpers.StatusEnum("running"), - models.Build.started_on < int(time.time() - 7200), - models.Build.ended_on == None - ) - )) + models.BuildChroot.status == helpers.StatusEnum("pending"), + models.BuildChroot.status == helpers.StatusEnum("starting"), + and_( + models.BuildChroot.status == helpers.StatusEnum("running"), + models.Build.started_on < int(time.time() - 7200), + models.Build.ended_on is None + ) + )) query = query.order_by(models.BuildChroot.build_id.asc()) return query
@@ -102,7 +101,7 @@ class BuildsLogic(object): .filter((models.Build.started_on == None) | (models.Build.started_on < int(time.time() - 7200))) .filter(models.Build.ended_on == None) - .filter(models.Build.canceled != True) + .filter(models.Build.canceled == False) .order_by(models.Build.submitted_on.asc())) return query
@@ -196,7 +195,7 @@ class BuildsLogic(object): "You are not allowed to cancel this build.") build.canceled = True for chroot in build.build_chroots: - chroot.status = 2 #canceled + chroot.status = 2 # canceled
@classmethod def delete_build(cls, user, build): @@ -210,19 +209,21 @@ class BuildsLogic(object): "Unfinished build")
# Only failed (and finished), succeeded, skipped and cancelled get here. - if build.state != "cancelled": #has nothing in backend to delete + if build.state != "cancelled": # has nothing in backend to delete object_type = "build-{0}".format(build.state) data_dict = {"pkgs": build.pkgs, "username": build.copr.owner.name, "projectname": build.copr.name}
- action = models.Action(action_type=helpers.ActionTypeEnum("delete"), - object_type=object_type, - object_id=build.id, - old_value="{0}/{1}".format(build.copr.owner.name, - build.copr.name), - data=json.dumps(data_dict), - created_on=int(time.time())) + action = models.Action( + action_type=helpers.ActionTypeEnum("delete"), + object_type=object_type, + object_id=build.id, + old_value="{0}/{1}".format(build.copr.owner.name, + build.copr.name), + data=json.dumps(data_dict), + created_on=int(time.time()) + ) db.session.add(action)
for build_chroot in build.build_chroots: @@ -237,13 +238,13 @@ class BuildsLogic(object): """ builds = cls.get_multiple(None, copr=copr)
- last_build = (builds - .join(models.BuildChroot) - .filter((models.BuildChroot.status == helpers.StatusEnum("succeeded")) - | (models.BuildChroot.status == helpers.StatusEnum("skipped"))) - .filter(models.Build.ended_on != None) - .order_by(models.Build.ended_on.desc()) - ).first() + last_build = ( + builds.join(models.BuildChroot) + .filter((models.BuildChroot.status == helpers.StatusEnum("succeeded")) + | (models.BuildChroot.status == helpers.StatusEnum("skipped"))) + .filter(models.Build.ended_on != None) + .order_by(models.Build.ended_on.desc()) + ).first() if last_build: return last_build.ended_on else: diff --git a/frontend/coprs_frontend/coprs/logic/coprs_logic.py b/frontend/coprs_frontend/coprs/logic/coprs_logic.py index a9bc4d7..7db6c29 100644 --- a/frontend/coprs_frontend/coprs/logic/coprs_logic.py +++ b/frontend/coprs_frontend/coprs/logic/coprs_logic.py @@ -8,6 +8,7 @@ from coprs import models from coprs import signals from coprs.logic import users_logic
+ class CoprsLogic(object):
""" diff --git a/frontend/coprs_frontend/coprs/views/admin_ns/admin_general.py b/frontend/coprs_frontend/coprs/views/admin_ns/admin_general.py index e3fbeb4..0624f64 100644 --- a/frontend/coprs_frontend/coprs/views/admin_ns/admin_general.py +++ b/frontend/coprs_frontend/coprs/views/admin_ns/admin_general.py @@ -15,6 +15,7 @@ from coprs.views.misc import login_required
from coprs.exceptions import InsufficientRightsException
+ @admin_ns.route("/") @login_required(role=helpers.RoleEnum("admin")) def admin_index(): @@ -24,12 +25,13 @@ def admin_index(): @admin_ns.route("/legal-flag/") @login_required(role=helpers.RoleEnum("admin")) def legal_flag(): - legal_flags = (models.LegalFlag.query - .outerjoin(models.LegalFlag.copr) - .options(db.contains_eager(models.LegalFlag.copr)) - .filter(models.LegalFlag.resolved_on == None) - .order_by(models.LegalFlag.raised_on.desc()) - .all()) + legal_flags = ( + models.LegalFlag.query + .outerjoin(models.LegalFlag.copr) + .options(db.contains_eager(models.LegalFlag.copr)) + .filter(models.LegalFlag.resolved_on == None) + .order_by(models.LegalFlag.raised_on.desc()) + .all())
return flask.render_template("admin/legal-flag.html", legal_flags=legal_flags) @@ -65,13 +67,14 @@ def playground(): copr = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname).first()
if copr: - return flask.redirect(flask.url_for("admin_ns.playground_project", - username=username, - coprname=coprname)) + return flask.redirect(flask.url_for( + "admin_ns.playground_project", + username=username, + coprname=coprname)) else: flask.flash("This project does not exist")
- return flask.render_template("admin/playground.html", form_search = form) + return flask.render_template("admin/playground.html", form_search=form)
@admin_ns.route("/playground/<username>/<coprname>/") @@ -84,9 +87,7 @@ def playground_project(username, coprname):
form = forms.AdminPlaygroundForm() form.playground.data = copr.playground - return flask.render_template("admin/playground.html", - form_set = form, - copr = copr) + return flask.render_template("admin/playground.html", form_set=form, copr=copr)
@admin_ns.route("/playground/<username>/<coprname>/set/", methods=["POST"]) @@ -110,4 +111,3 @@ def playground_set(username, coprname): return flask.redirect(flask.url_for("admin_ns.playground_project", username=username, coprname=coprname)) - diff --git a/frontend/coprs_frontend/coprs/views/api_ns/api_general.py b/frontend/coprs_frontend/coprs/views/api_ns/api_general.py index 96d3b62..0ca9780 100644 --- a/frontend/coprs_frontend/coprs/views/api_ns/api_general.py +++ b/frontend/coprs_frontend/coprs/views/api_ns/api_general.py @@ -72,10 +72,10 @@ def api_new_copr(username): httpcode = 200
# are there any arguments in POST which our form doesn't know? - if sum([1 for post_key in flask.request.form.keys() \ - if post_key not in form.__dict__.keys()]): - output = {"output": "notok", "error": - "Unknown arguments passed (non-existing chroot probably)"} + if any([post_key not in form.__dict__.keys() + for post_key in flask.request.form.keys()]): + output = {"output": "notok", + "error": "Unknown arguments passed (non-existing chroot probably)"} httpcode = 500
elif form.validate_on_submit(): @@ -136,8 +136,7 @@ def api_copr_delete(username, coprname): httpcode = 200
if form.validate_on_submit() and copr: - builds_query = builds_logic.BuildsLogic.get_multiple( - flask.g.user, copr=copr) + builds_query = builds_logic.BuildsLogic.get_multiple(flask.g.user, copr=copr) try: for build in builds_query: builds_logic.BuildsLogic.delete_build(flask.g.user, build) @@ -204,6 +203,7 @@ def api_coprs_by_owner(username=None): jsonout.status_code = httpcode return jsonout
+ @api_ns.route("/coprs/<username>/<coprname>/detail/") def api_coprs_by_owner_detail(username, coprname): """ Return detail of one project. @@ -244,6 +244,7 @@ def api_coprs_by_owner_detail(username, coprname): jsonout.status_code = httpcode return jsonout
+ @api_ns.route("/coprs/<username>/<coprname>/new_build/", methods=["POST"]) @api_login_required def copr_new_build(username, coprname): @@ -257,13 +258,13 @@ def copr_new_build(username, coprname):
else: form = forms.BuildFormFactory.create_form_cls( - copr.active_chroots)(csrf_enabled=False) + copr.active_chroots)(csrf_enabled=False)
# are there any arguments in POST which our form doesn't know? - if sum([1 for post_key in flask.request.form.keys() \ - if post_key not in form.__dict__.keys()]): - output = {"output": "notok", "error": - "Unknown arguments passed (non-existing chroot probably)"} + if any([post_key not in form.__dict__.keys() + for post_key in flask.request.form.keys()]): + output = {"output": "notok", + "error": "Unknown arguments passed (non-existing chroot probably)"} httpcode = 500
elif form.validate_on_submit() and flask.g.user.can_build_in(copr): @@ -290,7 +291,6 @@ def copr_new_build(username, coprname): db.session.commit() ids.append(build.id)
- output = {"output": "ok", "ids": ids, "message": "Build was added to {0}.".format(coprname)} @@ -323,6 +323,7 @@ def build_status(build_id): jsonout.status_code = httpcode return jsonout
+ @api_ns.route("/coprs/build_detail/<build_id>/", methods=["GET"]) @api_ns.route("/coprs/build/<build_id>/", methods=["GET"]) def build_detail(build_id): @@ -362,6 +363,7 @@ def build_detail(build_id): jsonout.status_code = httpcode return jsonout
+ @api_ns.route("/coprs/cancel_build/<build_id>/", methods=["POST"]) @api_login_required def cancel_build(build_id): @@ -387,6 +389,7 @@ def cancel_build(build_id): jsonout.status_code = httpcode return jsonout
+ @api_ns.route('/coprs/<username>/<coprname>/modify/', methods=["POST"]) @api_login_required def copr_modify(username, coprname): @@ -429,6 +432,7 @@ def copr_modify(username, coprname): jsonout.status_code = httpcode return jsonout
+ @api_ns.route('/coprs/<username>/<coprname>/modify/<chrootname>/', methods=["POST"]) @api_login_required def copr_modify_chroot(username, coprname, chrootname): @@ -457,6 +461,7 @@ def copr_modify_chroot(username, coprname, chrootname): jsonout.status_code = httpcode return jsonout
+ @api_ns.route('/coprs/<username>/<coprname>/detail/<chrootname>/', methods=["GET"]) def copr_chroot_details(username, coprname, chrootname): copr = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname).first() @@ -477,11 +482,11 @@ def copr_chroot_details(username, coprname, chrootname): output = {"output": "notok", "error": "Invalid chroot for this project."} httpcode = 404
- jsonout = flask.jsonify(output) jsonout.status_code = httpcode return jsonout
+ @api_ns.route("/coprs/search/") @api_ns.route("/coprs/search/<project>/") def api_coprs_search_by_project(project=None): @@ -515,6 +520,7 @@ def api_coprs_search_by_project(project=None): jsonout.status_code = httpcode return jsonout
+ @api_ns.route("/playground/list/") def playground_list(): """ Return list of coprs which are part of playground """ @@ -530,6 +536,7 @@ def playground_list(): jsonout.status_code = 200 return jsonout
+ @api_ns.route("/coprs/<username>/<coprname>/monitor/", methods=["GET"]) def monitor(username, coprname): copr = coprs_logic.CoprsLogic.get( @@ -538,9 +545,6 @@ def monitor(username, coprname): monitor_data = builds_logic.BuildsMonitorLogic.get_monitor_data(copr) output = MonitorWrapper(monitor_data).to_dict()
- #output["href"] = flask.url_for(".monitor", - # username=username, coprname=coprname) - jsonout = flask.jsonify(output) jsonout.status_code = 200 return jsonout diff --git a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_general.py b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_general.py index 419483d..9284f2b 100644 --- a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_general.py +++ b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_general.py @@ -37,8 +37,8 @@ def coprs_show(page=1): users_builds = builds_logic.BuildsLogic.get_recent_tasks(flask.g.user, 5)
waiting_tasks = len(list(builds_logic.BuildsLogic.get_build_task_queue())) - running_tasks = len(list(builds_logic.BuildsLogic.get_build_tasks( - helpers.StatusEnum("running")))) + running_tasks = len(list(builds_logic.BuildsLogic + .get_build_tasks(helpers.StatusEnum("running"))))
return flask.render_template("coprs/show.html", coprs=coprs, @@ -64,8 +64,8 @@ def coprs_by_owner(username=None, page=1): users_builds = builds_logic.BuildsLogic.get_recent_tasks(flask.g.user, 5)
waiting_tasks = len(list(builds_logic.BuildsLogic.get_build_task_queue())) - running_tasks = len(list(builds_logic.BuildsLogic.get_build_tasks( - helpers.StatusEnum("running")))) + running_tasks = len(list(builds_logic.BuildsLogic + .get_build_tasks(helpers.StatusEnum("running"))))
return flask.render_template("coprs/show.html", coprs=coprs, @@ -104,10 +104,8 @@ def coprs_fulltext_search(page=1): paginator = helpers.Paginator(query, query.count(), page)
coprs = paginator.sliced_query - return render_template("coprs/show.html", - coprs=coprs, - paginator=paginator, - fulltext=fulltext) + return render_template("coprs/show.html", coprs=coprs, + paginator=paginator, fulltext=fulltext)
@coprs_ns.route("/<username>/add/") @@ -324,14 +322,16 @@ def copr_permissions_applier_change(username, coprname): # sending emails if flask.current_app.config.get("SEND_EMAILS", False): for mail in admin_mails: - msg = MIMEText("{6} is asking for these permissions:\n\n" - "Builder: {0} -> {1}\nAdmin: {2} -> {3}\n\n" - "Project: {4}\nOwner: {5}".format( - helpers.PermissionEnum(old_builder), - helpers.PermissionEnum(new_builder), - helpers.PermissionEnum(old_admin), - helpers.PermissionEnum(new_admin), - copr.name, copr.owner.name, flask.g.user.name), "plain") + msg = MIMEText( + "{6} is asking for these permissions:\n\n" + "Builder: {0} -> {1}\nAdmin: {2} -> {3}\n\n" + "Project: {4}\nOwner: {5}".format( + helpers.PermissionEnum(old_builder), + helpers.PermissionEnum(new_builder), + helpers.PermissionEnum(old_admin), + helpers.PermissionEnum(new_admin), + copr.name, copr.owner.name, flask.g.user.name)) + msg["Subject"] = "[Copr] {0}: {1} is asking permissons".format(copr.name, flask.g.user.name) msg["From"] = "root@{0}".format(platform.node()) msg["To"] = mail @@ -339,7 +339,6 @@ def copr_permissions_applier_change(username, coprname): s.sendmail("root@{0}".format(platform.node()), mail, msg.as_string()) s.quit()
- return flask.redirect(flask.url_for("coprs_ns.copr_detail", username=copr.owner.name, coprname=copr.name)) @@ -370,24 +369,25 @@ def copr_update_permissions(username, coprname): "copr_admin_{0}".format(perm.user_id)].data coprs_logic.CoprPermissionsLogic.update_permissions( flask.g.user, copr, perm, new_builder, new_admin) - if flask.current_app.config.get("SEND_EMAILS", False): - if old_builder is not new_builder or \ - old_admin is not new_admin: - msg = MIMEText("Your permissions have changed:\n\n" - "Builder: {0} -> {1}\nAdmin: {2} -> {3}\n\n" - "Project: {4}\nOwner: {5}".format( - helpers.PermissionEnum(old_builder), - helpers.PermissionEnum(new_builder), - helpers.PermissionEnum(old_admin), - helpers.PermissionEnum(new_admin), - copr.name, copr.owner.name), "plain") - msg["Subject"] = "[Copr] {0}: Your permissions have changed".format(copr.name) - msg["From"] = "root@{0}".format(platform.node()) - msg["To"] = perm.user.mail - s = smtplib.SMTP("localhost") - s.sendmail("root@{0}".format(platform.node()), perm.user.mail, msg.as_string()) - s.quit() - + if flask.current_app.config.get("SEND_EMAILS", False) and \ + (old_builder is not new_builder or old_admin is not new_admin): + + msg = MIMEText( + "Your permissions have changed:\n\n" + "Builder: {0} -> {1}\nAdmin: {2} -> {3}\n\n" + "Project: {4}\nOwner: {5}".format( + helpers.PermissionEnum(old_builder), + helpers.PermissionEnum(new_builder), + helpers.PermissionEnum(old_admin), + helpers.PermissionEnum(new_admin), + copr.name, copr.owner.name)) + + msg["Subject"] = "[Copr] {0}: Your permissions have changed".format(copr.name) + msg["From"] = "root@{0}".format(platform.node()) + msg["To"] = perm.user.mail + s = smtplib.SMTP("localhost") + s.sendmail("root@{0}".format(platform.node()), perm.user.mail, msg.as_string()) + s.quit() # for now, we don't check for actions here, as permissions operation # don't collide with any actions except exceptions.InsufficientRightsException as e: @@ -401,13 +401,13 @@ def copr_update_permissions(username, coprname): username=copr.owner.name, coprname=copr.name))
+ @coprs_ns.route("/<username>/<coprname>/createrepo/", methods=["POST"]) @login_required def copr_createrepo(username, coprname):
copr = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname).first()
- #import ipdb; ipdb.set_trace() chroots = [c.name for c in copr.active_chroots] actions_logic.ActionsLogic.send_createrepo( username=copr.owner.name, coprname=copr.name, @@ -418,6 +418,7 @@ def copr_createrepo(username, coprname): username=copr.owner.name, coprname=copr.name))
+ @coprs_ns.route("/<username>/<coprname>/delete/", methods=["GET", "POST"]) @login_required def copr_delete(username, coprname): @@ -426,7 +427,8 @@ def copr_delete(username, coprname):
if form.validate_on_submit() and copr: builds_query = builds_logic.BuildsLogic.get_multiple( - flask.g.user, copr=copr) + flask.g.user, copr=copr) + try: for build in builds_query: builds_logic.BuildsLogic.delete_build(flask.g.user, build) @@ -515,8 +517,6 @@ def generate_repo_file(username, coprname, chroot, repofile): "Repository filename does not match expected: {0}" .format(repofile))
- - copr = None try: # query.one() is used since it fetches all builds, unlike # query.first(). @@ -526,8 +526,7 @@ def generate_repo_file(username, coprname, chroot, repofile): return page_not_found( "Project {0}/{1} does not exist".format(username, coprname))
- mock_chroot = coprs_logic.MockChrootsLogic.get_from_name(chroot, - noarch=True).first() + mock_chroot = coprs_logic.MockChrootsLogic.get_from_name(chroot, noarch=True).first() if not mock_chroot: return page_not_found("Chroot {0} does not exist".format(chroot))
diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..b73e41f --- /dev/null +++ b/setup.cfg @@ -0,0 +1,4 @@ +[pep8] + +exclude=frontend/coprs_frontend/alembic/versions +ignore=E711,E712
copr-commits@lists.fedorahosted.org