sapling/mercurial/txnutil.py
Mark Thomas 0b425b5f11 txnutil: add HG_SHAREDPENDING and trysharedpending
Summary:
Add `HG_SHAREDPENDING` which contains the path to the shared primary repository,
similar to how `HG_PENDING` contains the path to the local repository.

Repositories that are not shared check whether either of these refer to the
local repository path.  Repositories that are shared check whether the pending
directory matches their own path, or the shared-pending directory matches their
shared path, via the new `trysharedpending` function.

This fixes the asymmetry in shared repos where pending changes made in a shared
repo were not visible in the primary repo, even though they were visible the
other way around.

Reviewed By: quark-zju

Differential Revision: D9699164

fbshipit-source-id: 31bc5fb2df6e9b9468b6ef39aabf877045c2a011
2018-09-28 07:23:00 -07:00

58 lines
1.8 KiB
Python

# 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.
"""
localispending = root == encoding.environ.get("HG_PENDING")
localissharedpending = root == encoding.environ.get("HG_SHAREDPENDING")
return localispending or localissharedpending
def mayhavesharedpending(root, sharedroot):
"""return whether 'root' or 'sharedroot' may have pending changes, which
are visible to this process.
"""
localispending = root == encoding.environ.get("HG_PENDING")
sharedissharedpending = sharedroot == encoding.environ.get("HG_SHAREDPENDING")
return localispending or sharedissharedpending
def trypending(root, vfs, filename, **kwargs):
"""Open a file to be read according to the 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)
def trysharedpending(root, sharedroot, vfs, filename, **kwargs):
if mayhavesharedpending(root, sharedroot):
try:
return (vfs("%s.pending" % filename, **kwargs), True)
except IOError as inst:
if inst.errno != errno.ENOENT:
raise
return (vfs(filename, **kwargs), False)