From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) by finch.gentoo.org (Postfix) with ESMTP id 5B46D138010 for ; Thu, 25 Oct 2012 08:36:01 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 0F1F721C035; Thu, 25 Oct 2012 08:35:48 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) by pigeon.gentoo.org (Postfix) with ESMTP id 78B6921C035 for ; Thu, 25 Oct 2012 08:35:48 +0000 (UTC) Received: from hornbill.gentoo.org (hornbill.gentoo.org [94.100.119.163]) (using TLSv1 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id AE60633D825 for ; Thu, 25 Oct 2012 08:35:47 +0000 (UTC) Received: from localhost.localdomain (localhost [127.0.0.1]) by hornbill.gentoo.org (Postfix) with ESMTP id 1DB46E5440 for ; Thu, 25 Oct 2012 08:35:46 +0000 (UTC) From: "Zac Medico" To: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: 8bit Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Zac Medico" Message-ID: <1351154131.639a084f3aebe09ee580f958b6b7ec7922e9e07d.zmedico@gentoo> Subject: [gentoo-commits] proj/portage:master commit in: man/, pym/portage/dbapi/, pym/portage/, cnf/ X-VCS-Repository: proj/portage X-VCS-Files: cnf/make.globals man/make.conf.5 pym/portage/const.py pym/portage/dbapi/vartree.py X-VCS-Directories: man/ pym/portage/dbapi/ pym/portage/ cnf/ X-VCS-Committer: zmedico X-VCS-Committer-Name: Zac Medico X-VCS-Revision: 639a084f3aebe09ee580f958b6b7ec7922e9e07d X-VCS-Branch: master Date: Thu, 25 Oct 2012 08:35:46 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org X-Archives-Salt: 8e5e7e19-226b-4300-8913-a88791bc7bcf X-Archives-Hash: 9de1bb80c83ca6979b5012e82bfec8a5 commit: 639a084f3aebe09ee580f958b6b7ec7922e9e07d Author: Zac Medico gentoo org> AuthorDate: Thu Oct 25 08:35:31 2012 +0000 Commit: Zac Medico gentoo org> CommitDate: Thu Oct 25 08:35:31 2012 +0000 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=639a084f Add FEATURES=merge-sync, for bug #439584. --- cnf/make.globals | 2 +- man/make.conf.5 | 5 +++++ pym/portage/const.py | 1 + pym/portage/dbapi/vartree.py | 40 +++++++++++++++++++++++++++++++++++++++- 4 files changed, 46 insertions(+), 2 deletions(-) diff --git a/cnf/make.globals b/cnf/make.globals index e53f186..47ee787 100644 --- a/cnf/make.globals +++ b/cnf/make.globals @@ -53,7 +53,7 @@ FETCHCOMMAND_SFTP="bash -c \"x=\\\${2#sftp://} ; host=\\\${x%%/*} ; port=\\\${ho # Default user options FEATURES="assume-digests binpkg-logs config-protect-if-modified distlocks ebuild-locks - fixlafiles news parallel-fetch protect-owned + fixlafiles merge-sync news parallel-fetch protect-owned sandbox sfperms strict unknown-features-warn unmerge-logs unmerge-orphans userfetch" diff --git a/man/make.conf.5 b/man/make.conf.5 index 4c86d38..9152ab2 100644 --- a/man/make.conf.5 +++ b/man/make.conf.5 @@ -361,6 +361,11 @@ Do \fBNOT\fR use \fIlmirror\fR for clients that need to override \fBRESTRICT\fR when fetching from a local mirror, but instead use a "local" mirror setting in \fI/etc/portage/mirrors\fR, as described in \fBportage\fR(5). .TP +.B merge\-sync +After a package is merged or unmerged, sync relevant files to +disk in order to avoid data\-loss in the event of a power failure. +This feature is enabled by default. +.TP .B metadata\-transfer Automatically perform a metadata transfer when `emerge \-\-sync` is run. In versions of portage >=2.1.5, this feature is disabled by diff --git a/pym/portage/const.py b/pym/portage/const.py index 3242861..8c5bbf3 100644 --- a/pym/portage/const.py +++ b/pym/portage/const.py @@ -96,6 +96,7 @@ SUPPORTED_FEATURES = frozenset([ "downgrade-backup", "ebuild-locks", "fakeroot", "fail-clean", "force-mirror", "force-prefix", "getbinpkg", "installsources", "keeptemp", "keepwork", "fixlafiles", "lmirror", + "merge-sync", "metadata-transfer", "mirror", "multilib-strict", "news", "noauto", "noclean", "nodoc", "noinfo", "noman", "nostrip", "notitles", "parallel-fetch", "parallel-install", diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py index cb7b39b..0f2c419 100644 --- a/pym/portage/dbapi/vartree.py +++ b/pym/portage/dbapi/vartree.py @@ -30,6 +30,7 @@ portage.proxy.lazyimport.lazyimport(globals(), 'portage.util.env_update:env_update', 'portage.util.listdir:dircache,listdir', 'portage.util.movefile:movefile', + 'portage.util._ctypes:find_library,LoadLibrary', 'portage.util._dyn_libs.PreservedLibsRegistry:PreservedLibsRegistry', 'portage.util._dyn_libs.LinkageMapELF:LinkageMapELF@LinkageMap', 'portage.util._async.SchedulerInterface:SchedulerInterface', @@ -73,6 +74,7 @@ import io from itertools import chain import logging import os as _os +import platform import pwd import re import stat @@ -4688,7 +4690,43 @@ class dblink(object): disk and avoid data-loss in the event of a power failure. This method does nothing if FEATURES=merge-sync is disabled. """ - pass + if not self._device_path_map: + return + + syncfs = self._get_syncfs() + if syncfs is None: + try: + proc = subprocess.Popen(["sync"]) + except EnvironmentError: + pass + else: + proc.wait() + else: + for path in self._device_path_map.values(): + try: + fd = os.open(path, os.O_RDONLY) + except OSError: + pass + else: + try: + syncfs(fd) + except OSError: + pass + finally: + os.close(fd) + + def _get_syncfs(self): + if platform.system() == "Linux": + filename = find_library("c") + if filename is not None: + library = LoadLibrary(filename) + if library is not None: + try: + return library.syncfs + except AttributeError: + pass + + return None def merge(self, mergeroot, inforoot, myroot=None, myebuild=None, cleanup=0, mydbapi=None, prev_mtimes=None, counter=None):