1 import json
2 import time
3 from sqlalchemy import or_
4 from sqlalchemy import and_, bindparam, Integer
5 from sqlalchemy.sql import false, true, text
6
7 from coprs import app
8 from coprs import db
9 from coprs import exceptions
10 from coprs import models
11 from coprs import helpers
12 from coprs import forms
13
14 from coprs.logic import coprs_logic
15 from coprs.logic import users_logic
16 from coprs.logic import builds_logic
17
18 from coprs.constants import DEFAULT_BUILD_TIMEOUT
19
20 log = app.logger
24
25 @classmethod
28
29 @classmethod
33
34 @classmethod
36 query_select = """
37 SELECT package.name, build.pkg_version, build.submitted_on, package.webhook_rebuild, order_to_status(subquery2.min_order_for_a_build) AS status
38 FROM package
39 LEFT OUTER JOIN (select MAX(build.id) as max_build_id_for_a_package, package_id
40 FROM build
41 WHERE build.copr_id = :copr_id
42 GROUP BY package_id) as subquery1 ON subquery1.package_id = package.id
43 LEFT OUTER JOIN build ON build.id = subquery1.max_build_id_for_a_package
44 LEFT OUTER JOIN (select build_id, min(status_to_order(status)) as min_order_for_a_build
45 FROM build_chroot
46 GROUP BY build_id) as subquery2 ON subquery2.build_id = subquery1.max_build_id_for_a_package
47 WHERE package.copr_id = :copr_id;
48 """
49
50 if db.engine.url.drivername == "sqlite":
51 def sqlite_status_to_order(x):
52 if x == 0:
53 return 0
54 elif x == 3:
55 return 1
56 elif x == 6:
57 return 2
58 elif x == 7:
59 return 3
60 elif x == 4:
61 return 4
62 elif x == 1:
63 return 5
64 elif x == 5:
65 return 6
66 return 1000
67
68 def sqlite_order_to_status(x):
69 if x == 0:
70 return 0
71 elif x == 1:
72 return 3
73 elif x == 2:
74 return 6
75 elif x == 3:
76 return 7
77 elif x == 4:
78 return 4
79 elif x == 5:
80 return 1
81 elif x == 6:
82 return 5
83 return 1000
84
85 conn = db.engine.connect()
86 conn.connection.create_function("status_to_order", 1, sqlite_status_to_order)
87 conn.connection.create_function("order_to_status", 1, sqlite_order_to_status)
88 statement = text(query_select)
89 statement.bindparams(bindparam("copr_id", Integer))
90 result = conn.execute(statement, {"copr_id": copr.id})
91 else:
92 statement = text(query_select)
93 statement.bindparams(bindparam("copr_id", Integer))
94 result = db.engine.execute(statement, {"copr_id": copr.id})
95
96 return result
97
98 @classmethod
99 - def get(cls, copr_id, package_name):
102
103 @classmethod
115
116 @classmethod
118 if package.source_type_text == "git_and_tito":
119 for commit in commits:
120 for file_path in commit['added'] + commit['removed'] + commit['modified']:
121 if cls.path_belong_to_package(package, file_path):
122 return True
123 return False
124 return True
125
126 @classmethod
133
134 @classmethod
155
156 @classmethod
157 - def exists(cls, copr_id, package_name):
161
162
163 @classmethod
173
174
175 @classmethod
185
186
187 @classmethod
188 - def build_package(cls, user, copr, package, chroot_names=None, **build_options):
192