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-12 18:04:00 +0100 |
| commit | 0087b3e7291428f80ede303e0edcfb114611eed5 (patch) | |
| tree | 4bf64f846082443b3c6148f060c01b35eba53211 /bitbake/lib | |
| parent | 0154036c061b1d50531bf6a1ba9dd4e226f77a54 (diff) | |
| download | poky-0087b3e7291428f80ede303e0edcfb114611eed5.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: c65b5d9056e3f8b9869b3fdc8689f43a0b83b10e)
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>
Diffstat (limited to 'bitbake/lib')
| -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"] |
