commit: 5346ae96d8d4b141454fe802a74e855e3e246593
Author: Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Mon Jan 18 14:37:17 2021 +0000
Commit: Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Mon Jan 18 15:03:28 2021 +0000
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=5346ae96
RepoStorageInterface: Use async and await syntax
Signed-off-by: Zac Medico <zmedico <AT> gentoo.org>
.../repository/storage/hardlink_quarantine.py | 45 +++++++----------
lib/portage/repository/storage/hardlink_rcu.py | 57 +++++++++-------------
lib/portage/repository/storage/inplace.py | 27 +++-------
lib/portage/repository/storage/interface.py | 17 +++----
lib/portage/util/futures/_sync_decorator.py | 6 +--
5 files changed, 56 insertions(+), 96 deletions(-)
diff --git a/lib/portage/repository/storage/hardlink_quarantine.py
b/lib/portage/repository/storage/hardlink_quarantine.py
index 165ab8324..bab34997b 100644
--- a/lib/portage/repository/storage/hardlink_quarantine.py
+++ b/lib/portage/repository/storage/hardlink_quarantine.py
@@ -1,4 +1,4 @@
-# Copyright 2018 Gentoo Foundation
+# Copyright 2018-2021 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
from portage import os
@@ -7,10 +7,6 @@ from portage.repository.storage.interface import (
RepoStorageInterface,
)
from portage.util.futures import asyncio
-from portage.util.futures.compat_coroutine import (
- coroutine,
- coroutine_return,
-)
from _emerge.SpawnProcess import SpawnProcess
@@ -38,60 +34,55 @@ class HardlinkQuarantineRepoStorage(RepoStorageInterface):
self._spawn_kwargs = spawn_kwargs
self._current_update = None
- @coroutine
- def _check_call(self, cmd, loop=None):
+ async def _check_call(self, cmd):
"""
Run cmd and raise RepoStorageException on failure.
@param cmd: command to executre
@type cmd: list
"""
- p = SpawnProcess(args=cmd, scheduler=asyncio._wrap_loop(loop),
**self._spawn_kwargs)
+ p = SpawnProcess(args=cmd, scheduler=asyncio.get_event_loop(),
**self._spawn_kwargs)
p.start()
- if (yield p.async_wait()) != os.EX_OK:
+ if await p.async_wait() != os.EX_OK:
raise RepoStorageException('command exited with status
{}: {}'.\
format(p.returncode, ' '.join(cmd)))
- @coroutine
- def init_update(self, loop=None):
+ async def init_update(self):
update_location = os.path.join(self._user_location,
'.tmp-unverified-download-quarantine')
- yield self._check_call(['rm', '-rf', update_location],
loop=loop)
+ await self._check_call(['rm', '-rf', update_location])
# Use rsync --link-dest to hardlink a files into
self._update_location,
# since cp -l is not portable.
- yield self._check_call(['rsync', '-a', '--link-dest',
self._user_location,
+ await self._check_call(['rsync', '-a', '--link-dest',
self._user_location,
'--exclude=/distfiles', '--exclude=/local',
'--exclude=/lost+found', '--exclude=/packages',
'--exclude',
'/{}'.format(os.path.basename(update_location)),
- self._user_location + '/', update_location + '/'],
loop=loop)
+ self._user_location + '/', update_location + '/'])
self._update_location = update_location
- coroutine_return(self._update_location)
+ return self._update_location
@property
- def current_update(self, loop=None):
+ def current_update(self):
if self._update_location is None:
raise RepoStorageException('current update does not
exist')
return self._update_location
- @coroutine
- def commit_update(self, loop=None):
+ async def commit_update(self):
update_location = self.current_update
self._update_location = None
- yield self._check_call(['rsync', '-a', '--delete',
+ await self._check_call(['rsync', '-a', '--delete',
'--exclude=/distfiles', '--exclude=/local',
'--exclude=/lost+found', '--exclude=/packages',
'--exclude',
'/{}'.format(os.path.basename(update_location)),
- update_location + '/', self._user_location + '/'],
loop=loop)
+ update_location + '/', self._user_location + '/'])
- yield self._check_call(['rm', '-rf', update_location],
loop=loop)
+ await self._check_call(['rm', '-rf', update_location])
- @coroutine
- def abort_update(self, loop=None):
+ async def abort_update(self):
if self._update_location is not None:
update_location = self._update_location
self._update_location = None
- yield self._check_call(['rm', '-rf', update_location],
loop=loop)
+ await self._check_call(['rm', '-rf', update_location])
- @coroutine
- def garbage_collection(self, loop=None):
- yield self.abort_update(loop=loop)
+ async def garbage_collection(self):
+ await self.abort_update()
diff --git a/lib/portage/repository/storage/hardlink_rcu.py
b/lib/portage/repository/storage/hardlink_rcu.py
index 68081494c..0f7c9cf70 100644
--- a/lib/portage/repository/storage/hardlink_rcu.py
+++ b/lib/portage/repository/storage/hardlink_rcu.py
@@ -1,4 +1,4 @@
-# Copyright 2018-2020 Gentoo Authors
+# Copyright 2018-2021 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
import datetime
@@ -10,10 +10,6 @@ from portage.repository.storage.interface import (
RepoStorageInterface,
)
from portage.util.futures import asyncio
-from portage.util.futures.compat_coroutine import (
- coroutine,
- coroutine_return,
-)
from _emerge.SpawnProcess import SpawnProcess
@@ -104,8 +100,7 @@ class HardlinkRcuRepoStorage(RepoStorageInterface):
self._latest_canonical = None
self._snapshots_dir = os.path.join(self._storage_location,
'snapshots')
- @coroutine
- def _check_call(self, cmd, privileged=False, loop=None):
+ async def _check_call(self, cmd, privileged=False):
"""
Run cmd and raise RepoStorageException on failure.
@@ -118,16 +113,15 @@ class HardlinkRcuRepoStorage(RepoStorageInterface):
kwargs =
dict(fd_pipes=self._spawn_kwargs.get('fd_pipes'))
else:
kwargs = self._spawn_kwargs
- p = SpawnProcess(args=cmd, scheduler=asyncio._wrap_loop(loop),
**kwargs)
+ p = SpawnProcess(args=cmd, scheduler=asyncio.get_event_loop(),
**kwargs)
p.start()
- if (yield p.async_wait()) != os.EX_OK:
+ if await p.async_wait() != os.EX_OK:
raise RepoStorageException('command exited with status
{}: {}'.\
format(p.returncode, ' '.join(cmd)))
- @coroutine
- def init_update(self, loop=None):
+ async def init_update(self):
update_location = os.path.join(self._storage_location, 'update')
- yield self._check_call(['rm', '-rf', update_location],
loop=loop)
+ await self._check_call(['rm', '-rf', update_location])
# This assumes normal umask permissions if it doesn't exist yet.
portage.util.ensure_dirs(self._storage_location)
@@ -138,19 +132,18 @@ class HardlinkRcuRepoStorage(RepoStorageInterface):
os.stat(self._user_location))
# Use rsync --link-dest to hardlink a files into
update_location,
# since cp -l is not portable.
- yield self._check_call(['rsync', '-a', '--link-dest',
self._latest_canonical,
- self._latest_canonical + '/', update_location +
'/'], loop=loop)
+ await self._check_call(['rsync', '-a', '--link-dest',
self._latest_canonical,
+ self._latest_canonical + '/', update_location +
'/'])
elif not os.path.islink(self._user_location):
- yield self._migrate(update_location, loop=loop)
- update_location = (yield self.init_update(loop=loop))
+ await self._migrate(update_location)
+ update_location = await self.init_update()
self._update_location = update_location
- coroutine_return(self._update_location)
+ return self._update_location
- @coroutine
- def _migrate(self, update_location, loop=None):
+ async def _migrate(self, update_location):
"""
When repo.user_location is a normal directory, migrate it to
storage so that it can be replaced with a symlink. After
migration,
@@ -163,27 +156,26 @@ class HardlinkRcuRepoStorage(RepoStorageInterface):
portage.util.apply_stat_permissions(update_location,
os.stat(self._user_location))
# It's probably on a different device, so copy it.
- yield self._check_call(['rsync', '-a',
- self._user_location + '/', update_location +
'/'], loop=loop)
+ await self._check_call(['rsync', '-a',
+ self._user_location + '/', update_location +
'/'])
# Remove the old copy so that symlink can be created.
Run with
# maximum privileges, since removal requires write
access to
# the parent directory.
- yield self._check_call(['rm', '-rf', user_location],
privileged=True, loop=loop)
+ await self._check_call(['rm', '-rf',
self._user_location], privileged=True)
self._update_location = update_location
# Make this copy the latest snapshot
- yield self.commit_update(loop=loop)
+ await self.commit_update()
@property
- def current_update(self, loop=None):
+ def current_update(self):
if self._update_location is None:
raise RepoStorageException('current update does not
exist')
return self._update_location
- @coroutine
- def commit_update(self, loop=None):
+ async def commit_update(self):
update_location = self.current_update
self._update_location = None
try:
@@ -231,18 +223,13 @@ class HardlinkRcuRepoStorage(RepoStorageInterface):
os.symlink(self._latest_symlink, new_symlink)
os.rename(new_symlink, self._user_location)
- coroutine_return()
- yield None
-
- @coroutine
- def abort_update(self, loop=None):
+ async def abort_update(self):
if self._update_location is not None:
update_location = self._update_location
self._update_location = None
- yield self._check_call(['rm', '-rf', update_location],
loop=loop)
+ await self._check_call(['rm', '-rf', update_location])
- @coroutine
- def garbage_collection(self, loop=None):
+ async def garbage_collection(self):
snap_ttl = datetime.timedelta(days=self._ttl_days)
snapshots = sorted(int(name) for name in
os.listdir(self._snapshots_dir))
# always preserve the latest snapshot
@@ -259,4 +246,4 @@ class HardlinkRcuRepoStorage(RepoStorageInterface):
snap_timestamp =
datetime.datetime.utcfromtimestamp(st.st_mtime)
if (datetime.datetime.utcnow() - snap_timestamp) <
snap_ttl:
continue
- yield self._check_call(['rm', '-rf', snap_path],
loop=loop)
+ await self._check_call(['rm', '-rf', snap_path])
diff --git a/lib/portage/repository/storage/inplace.py
b/lib/portage/repository/storage/inplace.py
index 3dbcbd7ad..3ff073554 100644
--- a/lib/portage/repository/storage/inplace.py
+++ b/lib/portage/repository/storage/inplace.py
@@ -1,11 +1,10 @@
-# Copyright 2018 Gentoo Foundation
+# Copyright 2018-2021 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
from portage.repository.storage.interface import (
RepoStorageException,
RepoStorageInterface,
)
-from portage.util.futures.compat_coroutine import coroutine, coroutine_return
class InplaceRepoStorage(RepoStorageInterface):
@@ -18,32 +17,22 @@ class InplaceRepoStorage(RepoStorageInterface):
self._user_location = repo.location
self._update_location = None
- @coroutine
- def init_update(self, loop=None):
+ async def init_update(self):
self._update_location = self._user_location
- coroutine_return(self._update_location)
- yield None
+ return self._update_location
@property
- def current_update(self, loop=None):
+ def current_update(self):
if self._update_location is None:
raise RepoStorageException('current update does not
exist')
return self._update_location
- @coroutine
- def commit_update(self, loop=None):
+ async def commit_update(self):
self.current_update
self._update_location = None
- coroutine_return()
- yield None
- @coroutine
- def abort_update(self, loop=None):
+ async def abort_update(self):
self._update_location = None
- coroutine_return()
- yield None
- @coroutine
- def garbage_collection(self, loop=None):
- coroutine_return()
- yield None
+ async def garbage_collection(self):
+ pass
diff --git a/lib/portage/repository/storage/interface.py
b/lib/portage/repository/storage/interface.py
index 4f5be6dbc..924d47f0b 100644
--- a/lib/portage/repository/storage/interface.py
+++ b/lib/portage/repository/storage/interface.py
@@ -1,8 +1,7 @@
-# Copyright 2018 Gentoo Foundation
+# Copyright 2018-2021 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
from portage.exception import PortageException
-from portage.util.futures.compat_coroutine import coroutine
class RepoStorageException(PortageException):
@@ -32,8 +31,7 @@ class RepoStorageInterface:
"""
raise NotImplementedError
- @coroutine
- def init_update(self, loop=None):
+ async def init_update(self):
"""
Create an update directory as a destination to sync updates to.
The directory will be populated with files from the previous
@@ -50,7 +48,7 @@ class RepoStorageInterface:
raise NotImplementedError
@property
- def current_update(self, loop=None):
+ def current_update(self):
"""
Get the current update directory which would have been returned
from the most recent call to the init_update method. This raises
@@ -62,16 +60,14 @@ class RepoStorageInterface:
"""
raise NotImplementedError
- @coroutine
- def commit_update(self, loop=None):
+ async def commit_update(self):
"""
Commit the current update directory, so that is becomes the
latest immutable snapshot.
"""
raise NotImplementedError
- @coroutine
- def abort_update(self, loop=None):
+ async def abort_update(self):
"""
Delete the current update directory. If there was not an update
in progress, or it has already been committed, then this has
@@ -79,8 +75,7 @@ class RepoStorageInterface:
"""
raise NotImplementedError
- @coroutine
- def garbage_collection(self, loop=None):
+ async def garbage_collection(self):
"""
Remove expired snapshots.
"""
diff --git a/lib/portage/util/futures/_sync_decorator.py
b/lib/portage/util/futures/_sync_decorator.py
index 3da065789..648e56574 100644
--- a/lib/portage/util/futures/_sync_decorator.py
+++ b/lib/portage/util/futures/_sync_decorator.py
@@ -1,4 +1,4 @@
-# Copyright 2018 Gentoo Foundation
+# Copyright 2018-2021 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
import functools
@@ -17,9 +17,7 @@ def _sync_decorator(func, loop=None):
"""
@functools.wraps(func)
def wrapper(*args, **kwargs):
- nonlocal loop
- loop = kwargs['loop'] = asyncio._wrap_loop(kwargs.get('loop')
or loop)
- return loop.run_until_complete(func(*args, **kwargs))
+ return (loop or
asyncio.get_event_loop()).run_until_complete(func(*args, **kwargs))
return wrapper