mirror of
https://github.com/facebook/sapling.git
synced 2024-10-16 11:52:02 +03:00
0b425b5f11
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
58 lines
1.8 KiB
Python
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)
|