summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Opdenacker <michael.opdenacker@bootlin.com>2024-04-12 11:02:29 +0200
committerRichard Purdie <richard.purdie@linuxfoundation.org>2024-04-14 06:31:45 +0100
commit112a37e6a9ce095003228950962903eae46fc55e (patch)
tree02676d726d0b22e22fd1451ca38594a290f78cc5
parent62a3a7172a0cf71889603698780a5911b7f84e36 (diff)
downloadpoky-112a37e6a9ce095003228950962903eae46fc55e.tar.gz
bitbake: prserv: add extra requests
Useful for connecting a PR server to an upstream one - "test-package" checks whether the specified package version and arch is known in the database. - "test-pr" checks a specified output hash is found in the database. Otherwise it returns 'None' instead of a new value. - "max-package-pr" returns the highest PR number for (version, arch) entries in the database, and None if not found Add new DB functions supporting the above, plus test_value() which tells whether a given value is available for the specified package and architecture. (Bitbake rev: 0f1474a30f741b760ca81c19dd1d8f3bd5647251) Signed-off-by: Michael Opdenacker <michael.opdenacker@bootlin.com> Cc: Joshua Watt <JPEWhacker@gmail.com> Cc: Tim Orling <ticotimo@gmail.com> Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--bitbake/lib/prserv/client.py23
-rw-r--r--bitbake/lib/prserv/db.py46
-rw-r--r--bitbake/lib/prserv/serv.py28
3 files changed, 96 insertions, 1 deletions
diff --git a/bitbake/lib/prserv/client.py b/bitbake/lib/prserv/client.py
index 7bc5188c53..8471ee3046 100644
--- a/bitbake/lib/prserv/client.py
+++ b/bitbake/lib/prserv/client.py
@@ -20,6 +20,27 @@ class PRAsyncClient(bb.asyncrpc.AsyncClient):
20 if response: 20 if response:
21 return response["value"] 21 return response["value"]
22 22
23 async def test_pr(self, version, pkgarch, checksum):
24 response = await self.invoke(
25 {"test-pr": {"version": version, "pkgarch": pkgarch, "checksum": checksum}}
26 )
27 if response:
28 return response["value"]
29
30 async def test_package(self, version, pkgarch):
31 response = await self.invoke(
32 {"test-package": {"version": version, "pkgarch": pkgarch}}
33 )
34 if response:
35 return response["value"]
36
37 async def max_package_pr(self, version, pkgarch):
38 response = await self.invoke(
39 {"max-package-pr": {"version": version, "pkgarch": pkgarch}}
40 )
41 if response:
42 return response["value"]
43
23 async def importone(self, version, pkgarch, checksum, value): 44 async def importone(self, version, pkgarch, checksum, value):
24 response = await self.invoke( 45 response = await self.invoke(
25 {"import-one": {"version": version, "pkgarch": pkgarch, "checksum": checksum, "value": value}} 46 {"import-one": {"version": version, "pkgarch": pkgarch, "checksum": checksum, "value": value}}
@@ -44,7 +65,7 @@ class PRAsyncClient(bb.asyncrpc.AsyncClient):
44class PRClient(bb.asyncrpc.Client): 65class PRClient(bb.asyncrpc.Client):
45 def __init__(self): 66 def __init__(self):
46 super().__init__() 67 super().__init__()
47 self._add_methods("getPR", "importone", "export", "is_readonly") 68 self._add_methods("getPR", "test_pr", "test_package", "importone", "export", "is_readonly")
48 69
49 def _get_async_client(self): 70 def _get_async_client(self):
50 return PRAsyncClient() 71 return PRAsyncClient()
diff --git a/bitbake/lib/prserv/db.py b/bitbake/lib/prserv/db.py
index 7bc2b2dc2d..7c200602ed 100644
--- a/bitbake/lib/prserv/db.py
+++ b/bitbake/lib/prserv/db.py
@@ -78,6 +78,52 @@ class PRTable(object):
78 self.sync() 78 self.sync()
79 self.dirty = False 79 self.dirty = False
80 80
81 def test_package(self, version, pkgarch):
82 """Returns whether the specified package version is found in the database for the specified architecture"""
83
84 # Just returns the value if found or None otherwise
85 data=self._execute("SELECT value FROM %s WHERE version=? AND pkgarch=?;" % self.table,
86 (version, pkgarch))
87 row=data.fetchone()
88 if row is not None:
89 return True
90 else:
91 return False
92
93 def test_value(self, version, pkgarch, value):
94 """Returns whether the specified value is found in the database for the specified package and architecture"""
95
96 # Just returns the value if found or None otherwise
97 data=self._execute("SELECT value FROM %s WHERE version=? AND pkgarch=? and value=?;" % self.table,
98 (version, pkgarch, value))
99 row=data.fetchone()
100 if row is not None:
101 return True
102 else:
103 return False
104
105 def find_value(self, version, pkgarch, checksum):
106 """Returns the value for the specified checksum if found or None otherwise."""
107
108 data=self._execute("SELECT value FROM %s WHERE version=? AND pkgarch=? AND checksum=?;" % self.table,
109 (version, pkgarch, checksum))
110 row=data.fetchone()
111 if row is not None:
112 return row[0]
113 else:
114 return None
115
116 def find_max_value(self, version, pkgarch):
117 """Returns the greatest value for (version, pkgarch), or None if not found. Doesn't create a new value"""
118
119 data = self._execute("SELECT max(value) FROM %s where version=? AND pkgarch=?;" % (self.table),
120 (version, pkgarch))
121 row = data.fetchone()
122 if row is not None:
123 return row[0]
124 else:
125 return None
126
81 def _get_value_hist(self, version, pkgarch, checksum): 127 def _get_value_hist(self, version, pkgarch, checksum):
82 data=self._execute("SELECT value FROM %s WHERE version=? AND pkgarch=? AND checksum=?;" % self.table, 128 data=self._execute("SELECT value FROM %s WHERE version=? AND pkgarch=? AND checksum=?;" % self.table,
83 (version, pkgarch, checksum)) 129 (version, pkgarch, checksum))
diff --git a/bitbake/lib/prserv/serv.py b/bitbake/lib/prserv/serv.py
index efb2e0cf93..86bd3bb75f 100644
--- a/bitbake/lib/prserv/serv.py
+++ b/bitbake/lib/prserv/serv.py
@@ -26,6 +26,9 @@ class PRServerClient(bb.asyncrpc.AsyncServerConnection):
26 26
27 self.handlers.update({ 27 self.handlers.update({
28 "get-pr": self.handle_get_pr, 28 "get-pr": self.handle_get_pr,
29 "test-pr": self.handle_test_pr,
30 "test-package": self.handle_test_package,
31 "max-package-pr": self.handle_max_package_pr,
29 "import-one": self.handle_import_one, 32 "import-one": self.handle_import_one,
30 "export": self.handle_export, 33 "export": self.handle_export,
31 "is-readonly": self.handle_is_readonly, 34 "is-readonly": self.handle_is_readonly,
@@ -43,6 +46,31 @@ class PRServerClient(bb.asyncrpc.AsyncServerConnection):
43 else: 46 else:
44 self.server.table.sync_if_dirty() 47 self.server.table.sync_if_dirty()
45 48
49 async def handle_test_pr(self, request):
50 '''Finds the PR value corresponding to the request. If not found, returns None and doesn't insert a new value'''
51 version = request["version"]
52 pkgarch = request["pkgarch"]
53 checksum = request["checksum"]
54
55 value = self.server.table.find_value(version, pkgarch, checksum)
56 return {"value": value}
57
58 async def handle_test_package(self, request):
59 '''Tells whether there are entries for (version, pkgarch) in the db. Returns True or False'''
60 version = request["version"]
61 pkgarch = request["pkgarch"]
62
63 value = self.server.table.test_package(version, pkgarch)
64 return {"value": value}
65
66 async def handle_max_package_pr(self, request):
67 '''Finds the greatest PR value for (version, pkgarch) in the db. Returns None if no entry was found'''
68 version = request["version"]
69 pkgarch = request["pkgarch"]
70
71 value = self.server.table.find_max_value(version, pkgarch)
72 return {"value": value}
73
46 async def handle_get_pr(self, request): 74 async def handle_get_pr(self, request):
47 version = request["version"] 75 version = request["version"]
48 pkgarch = request["pkgarch"] 76 pkgarch = request["pkgarch"]