2022-10-21 09:48:31 +02:00
|
|
|
from lib.request import Request
|
|
|
|
|
|
|
|
|
2022-10-18 12:17:43 +02:00
|
|
|
class DBRevision:
|
|
|
|
def __init__(self, row):
|
2022-10-18 13:13:52 +02:00
|
|
|
# need to stay in sync with the schema creation in db.py
|
|
|
|
(
|
|
|
|
self.dbid,
|
|
|
|
self.project,
|
|
|
|
self.package,
|
|
|
|
self.rev,
|
|
|
|
self.unexpanded_srcmd5,
|
|
|
|
self.commit_time,
|
|
|
|
self.userid,
|
|
|
|
self.comment,
|
2022-10-18 19:29:25 +02:00
|
|
|
self.broken,
|
|
|
|
self.expanded_srcmd5,
|
2022-10-19 14:00:07 +02:00
|
|
|
self.request_number,
|
|
|
|
self.request_id,
|
2022-10-18 13:13:52 +02:00
|
|
|
) = row
|
|
|
|
|
2022-10-18 15:40:11 +02:00
|
|
|
def __str__(self):
|
2022-10-19 14:00:07 +02:00
|
|
|
return f"Rev {self.project}/{self.rev} Md5 {self.unexpanded_srcmd5} {self.commit_time} {self.userid} {self.request_number}"
|
2022-10-18 15:40:11 +02:00
|
|
|
|
|
|
|
def __repr__(self):
|
|
|
|
return f"[{self.__str__()}]"
|
|
|
|
|
2022-10-21 09:48:31 +02:00
|
|
|
def as_dict(self, db):
|
|
|
|
"""Return a dict we can put into YAML for test cases"""
|
|
|
|
ret = {
|
|
|
|
"project": self.project,
|
|
|
|
"package": self.package,
|
|
|
|
"rev": self.rev,
|
|
|
|
"unexpanded_srcmd5": self.unexpanded_srcmd5,
|
|
|
|
"commit_time": self.commit_time,
|
|
|
|
"userid": self.userid,
|
|
|
|
"comment": self.comment,
|
|
|
|
"broken": self.broken,
|
|
|
|
"expanded_srcmd5": self.expanded_srcmd5,
|
|
|
|
"files": self.files_list(db),
|
|
|
|
}
|
|
|
|
if self.request_id:
|
|
|
|
ret["request"] = Request.find(db, self.request_id).as_dict()
|
|
|
|
return ret
|
|
|
|
|
2022-10-18 13:13:52 +02:00
|
|
|
def links_to(self, db, project, package):
|
2022-10-26 11:58:01 +02:00
|
|
|
with db.cursor() as cur:
|
|
|
|
cur.execute(
|
|
|
|
"INSERT INTO links (revision_id, project, package) VALUES (%s,%s,%s)",
|
|
|
|
(self.dbid, project, package),
|
|
|
|
)
|
2022-10-18 13:48:27 +02:00
|
|
|
|
2022-10-18 13:13:52 +02:00
|
|
|
@classmethod
|
|
|
|
def import_obs_rev(cls, db, revision):
|
2022-10-26 11:58:01 +02:00
|
|
|
with db.cursor() as cur:
|
|
|
|
cur.execute(
|
|
|
|
"""INSERT INTO revisions (project, package, rev, unexpanded_srcmd5, commit_time, userid, comment, request_number)
|
|
|
|
VALUES(%s, %s, %s, %s, %s, %s, %s, %s)""",
|
|
|
|
(
|
|
|
|
revision.project,
|
|
|
|
revision.package,
|
|
|
|
revision.rev,
|
|
|
|
revision.unexpanded_srcmd5,
|
|
|
|
revision.time,
|
|
|
|
revision.userid,
|
|
|
|
revision.comment,
|
|
|
|
revision.request_number,
|
|
|
|
),
|
|
|
|
)
|
2022-10-18 13:13:52 +02:00
|
|
|
return cls.fetch_revision(db, revision.project, revision.package, revision.rev)
|
2022-10-18 12:17:43 +02:00
|
|
|
|
2022-10-26 11:58:01 +02:00
|
|
|
@staticmethod
|
|
|
|
def fetch_revision(db, project, package, rev):
|
|
|
|
with db.cursor() as cur:
|
|
|
|
cur.execute(
|
|
|
|
"SELECT * FROM revisions where project=%s and package=%s and rev=%s",
|
|
|
|
(project, package, str(rev)),
|
|
|
|
)
|
|
|
|
row = cur.fetchone()
|
2022-10-18 12:17:43 +02:00
|
|
|
return DBRevision(row)
|
|
|
|
|
2022-10-26 11:58:01 +02:00
|
|
|
@staticmethod
|
|
|
|
def latest_revision(db, project, package):
|
|
|
|
with db.cursor() as cur:
|
|
|
|
cur.execute(
|
|
|
|
"SELECT MAX(rev) FROM revisions where project=%s and package=%s",
|
|
|
|
(project, package),
|
|
|
|
)
|
|
|
|
max = cur.fetchone()[0]
|
2022-10-18 12:17:43 +02:00
|
|
|
if max:
|
|
|
|
return DBRevision.fetch_revision(db, project, package, int(max))
|
|
|
|
return None
|
2022-10-18 15:40:11 +02:00
|
|
|
|
2022-10-26 11:58:01 +02:00
|
|
|
@staticmethod
|
|
|
|
def all_revisions(db, project, package):
|
|
|
|
with db.cursor() as cur:
|
|
|
|
cur.execute(
|
|
|
|
"SELECT * FROM revisions where project=%s and package=%s",
|
|
|
|
(project, package),
|
|
|
|
)
|
|
|
|
ret = []
|
|
|
|
for row in cur.fetchall():
|
|
|
|
ret.append(DBRevision(row))
|
2022-10-18 15:40:11 +02:00
|
|
|
return ret
|
|
|
|
|
|
|
|
def linked_rev(self, db):
|
2022-10-26 11:58:01 +02:00
|
|
|
with db.cursor() as cur:
|
|
|
|
cur.execute(
|
|
|
|
"SELECT project,package FROM links where revision_id=%s", (self.dbid,)
|
|
|
|
)
|
|
|
|
row = cur.fetchone()
|
|
|
|
if not row:
|
|
|
|
return None
|
|
|
|
project, package = row
|
|
|
|
cur.execute(
|
|
|
|
"SELECT * FROM revisions where project=%s and package=%s and commit_time <= %s ORDER BY commit_time DESC LIMIT 1",
|
|
|
|
(project, package, self.commit_time),
|
|
|
|
)
|
|
|
|
revisions = [DBRevision(row) for row in cur.fetchall()]
|
2022-10-18 15:40:11 +02:00
|
|
|
if revisions:
|
|
|
|
return revisions[0]
|
|
|
|
return None
|
2022-10-18 19:29:25 +02:00
|
|
|
|
|
|
|
def set_broken(self, db):
|
2022-10-26 11:58:01 +02:00
|
|
|
with db.cursor() as cur:
|
|
|
|
cur.execute("UPDATE revisions SET broken=TRUE where id=%s", (self.dbid,))
|
|
|
|
|
2022-10-18 19:29:25 +02:00
|
|
|
|
|
|
|
def import_dir_list(self, db, xml):
|
2022-10-26 11:58:01 +02:00
|
|
|
with db.cursor() as cur:
|
2022-10-18 19:29:25 +02:00
|
|
|
cur.execute(
|
2022-10-26 11:58:01 +02:00
|
|
|
"UPDATE revisions SET expanded_srcmd5=%s where id=%s",
|
|
|
|
(xml.get("srcmd5"), self.dbid),
|
2022-10-18 19:29:25 +02:00
|
|
|
)
|
2022-10-26 11:58:01 +02:00
|
|
|
for entry in xml.findall("entry"):
|
|
|
|
cur.execute(
|
|
|
|
"""INSERT INTO files (name, md5, size, mtime, revision_id)
|
|
|
|
VALUES (%s,%s,%s,%s,%s)""",
|
|
|
|
(
|
|
|
|
entry.get("name"),
|
|
|
|
entry.get("md5"),
|
|
|
|
entry.get("size"),
|
|
|
|
entry.get("mtime"),
|
|
|
|
self.dbid,
|
|
|
|
),
|
|
|
|
)
|
2022-10-19 14:00:07 +02:00
|
|
|
|
2022-10-21 09:48:31 +02:00
|
|
|
def files_list(self, db):
|
|
|
|
cur = db.cursor()
|
|
|
|
cur.execute("SELECT * from files where revision_id=%s", (self.dbid,))
|
|
|
|
ret = []
|
|
|
|
for row in cur.fetchall():
|
|
|
|
(_, _, name, md5, size, mtime) = row
|
|
|
|
ret.append({"md5": md5, "size": size, "mtime": mtime, "name": name})
|
|
|
|
return ret
|
|
|
|
|
2022-10-26 11:58:01 +02:00
|
|
|
@staticmethod
|
2022-10-21 09:48:31 +02:00
|
|
|
def requests_to_fetch(self, db, project, package):
|
2022-10-26 11:58:01 +02:00
|
|
|
with db.cursor() as cur:
|
|
|
|
cur.execute(
|
2022-10-21 09:48:31 +02:00
|
|
|
"""SELECT request_number FROM revisions revs LEFT JOIN requests
|
|
|
|
reqs ON reqs.number=revs.request_number WHERE reqs.id is null AND
|
|
|
|
revs.request_number IS NOT NULL and project=%s AND package=%s;""",
|
2022-10-26 11:58:01 +02:00
|
|
|
(project, package),
|
|
|
|
)
|
2022-10-21 09:48:31 +02:00
|
|
|
return [row[0] for row in cur.fetchall()]
|