From 274adb4c3e75afbc802d9669f58e2216b2b1ff7e Mon Sep 17 00:00:00 2001 From: Fabio Erculiani Date: Sun, 27 Oct 2013 19:35:39 +0100 Subject: [PATCH] [matter.builder] acquire a file lock before calling PackageBuilder.sync() --- matter/matter/builder.py | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/matter/matter/builder.py b/matter/matter/builder.py index bb4dc74d4..becc2b099 100644 --- a/matter/matter/builder.py +++ b/matter/matter/builder.py @@ -10,6 +10,8 @@ """ import copy +import errno +import fcntl import os import shlex import shutil @@ -907,12 +909,27 @@ class PackageBuilder(object): """ Execute Portage and Overlays sync """ - sync_cmd = cls.PORTAGE_SYNC_CMD - std_env = cls._build_standard_environment() - exit_st = subprocess.call(sync_cmd, env = std_env) - if exit_st != 0: - return exit_st + portdir = os.getenv("PORTDIR", "/usr/portage") + portdir_lock_file = os.path.join(portdir, ".matter_sync.lock") - # overlays update - overlay_cmd = cls.OVERLAYS_SYNC_CMD - return subprocess.call(overlay_cmd, env = std_env) + print_info("synchronizing the repositories...") + print_info("About to acquire %s..." % (portdir_lock_file,)) + with open(portdir_lock_file, "a+") as lock_f: + while True: + try: + fcntl.flock(lock_f.fileno(), fcntl.LOCK_EX) + break + except IOError as err: + if err.errno == errno.EINTR: + continue + raise + + sync_cmd = cls.PORTAGE_SYNC_CMD + std_env = cls._build_standard_environment() + exit_st = subprocess.call(sync_cmd, env = std_env) + if exit_st != 0: + return exit_st + + # overlays update + overlay_cmd = cls.OVERLAYS_SYNC_CMD + return subprocess.call(overlay_cmd, env = std_env)