txnutil: factor out the logic to read file in according to HG_PENDING
This patch adds new file txnutil.py, because:
- transaction.py is too large to import small utility logic
- scmutil.py or so causes cyclic importing in phases.py
mayhavepending() is defined separately for convenience in subsequent
patch.
--- a/mercurial/dirstate.py Mon Feb 20 01:54:07 2017 -0800
+++ b/mercurial/dirstate.py Tue Feb 21 01:20:59 2017 +0900
@@ -23,6 +23,7 @@
pathutil,
pycompat,
scmutil,
+ txnutil,
util,
)
@@ -59,22 +60,6 @@
return set(fname for fname, e in dmap.iteritems()
if e[0] != 'n' or e[3] == -1)
-def _trypending(root, vfs, filename):
- '''Open file to be read according to HG_PENDING environment variable
-
- This opens '.pending' of specified 'filename' only when HG_PENDING
- is equal to 'root'.
-
- This returns '(fp, is_pending_opened)' tuple.
- '''
- if root == encoding.environ.get('HG_PENDING'):
- try:
- return (vfs('%s.pending' % filename), True)
- except IOError as inst:
- if inst.errno != errno.ENOENT:
- raise
- return (vfs(filename), False)
-
class dirstate(object):
def __init__(self, opener, ui, root, validate):
@@ -385,7 +370,7 @@
raise
def _opendirstatefile(self):
- fp, mode = _trypending(self._root, self._opener, self._filename)
+ fp, mode = txnutil.trypending(self._root, self._opener, self._filename)
if self._pendingmode is not None and self._pendingmode != mode:
fp.close()
raise error.Abort(_('working directory state may be '
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial/txnutil.py Tue Feb 21 01:20:59 2017 +0900
@@ -0,0 +1,36 @@
+# txnutil.py - transaction related utilities
+#
+# Copyright FUJIWARA Katsunori <foozy@lares.dti.ne.jp> and others
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from __future__ import absolute_import
+
+import errno
+
+from . import (
+ encoding,
+)
+
+def mayhavepending(root):
+ '''return whether 'root' may have pending changes, which are
+ visible to this process.
+ '''
+ return root == encoding.environ.get('HG_PENDING')
+
+def trypending(root, vfs, filename, **kwargs):
+ '''Open file to be read according to HG_PENDING environment variable
+
+ This opens '.pending' of specified 'filename' only when HG_PENDING
+ is equal to 'root'.
+
+ This returns '(fp, is_pending_opened)' tuple.
+ '''
+ if mayhavepending(root):
+ try:
+ return (vfs('%s.pending' % filename, **kwargs), True)
+ except IOError as inst:
+ if inst.errno != errno.ENOENT:
+ raise
+ return (vfs(filename, **kwargs), False)