diff options
author | Michael Opdenacker <michael.opdenacker@bootlin.com> | 2024-04-12 11:02:29 +0200 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2024-04-14 06:31:45 +0100 |
commit | 112a37e6a9ce095003228950962903eae46fc55e (patch) | |
tree | 02676d726d0b22e22fd1451ca38594a290f78cc5 | |
parent | 62a3a7172a0cf71889603698780a5911b7f84e36 (diff) | |
download | poky-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.py | 23 | ||||
-rw-r--r-- | bitbake/lib/prserv/db.py | 46 | ||||
-rw-r--r-- | bitbake/lib/prserv/serv.py | 28 |
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): | |||
44 | class PRClient(bb.asyncrpc.Client): | 65 | class 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"] |