mirror of
https://github.com/facebook/sapling.git
synced 2024-10-09 16:31:02 +03:00
core: make tracking and caches share-aware
This commit is contained in:
parent
ec0ec5b329
commit
88b07191ff
@ -106,7 +106,8 @@ def exclone(orig, ui, *args, **opts):
|
||||
wlock = repo.wlock()
|
||||
try:
|
||||
try:
|
||||
repo.vfs.unlink('bookmarks')
|
||||
vfs = shareawarevfs(repo)
|
||||
vfs.unlink('bookmarks')
|
||||
except OSError, inst:
|
||||
if inst.errno != errno.ENOENT:
|
||||
raise
|
||||
@ -661,7 +662,8 @@ def exbranches(orig, ui, repo, *args, **opts):
|
||||
def _readtracking(repo):
|
||||
tracking = {}
|
||||
try:
|
||||
for line in repo.vfs.read('bookmarks.tracking').strip().split('\n'):
|
||||
vfs = shareawarevfs(repo)
|
||||
for line in vfs.read('bookmarks.tracking').strip().split('\n'):
|
||||
try:
|
||||
book, track = line.strip().split(' ')
|
||||
tracking[book] = track
|
||||
@ -676,7 +678,8 @@ def _writetracking(repo, tracking):
|
||||
data = ''
|
||||
for book, track in tracking.iteritems():
|
||||
data += '%s %s\n' % (book, track)
|
||||
repo.vfs.write('bookmarks.tracking', data)
|
||||
vfs = shareawarevfs(repo)
|
||||
vfs.write('bookmarks.tracking', data)
|
||||
|
||||
def _removetracking(repo, bookmarks):
|
||||
tracking = _readtracking(repo)
|
||||
@ -949,16 +952,16 @@ def shareawarevfs(repo):
|
||||
return repo.vfs
|
||||
|
||||
def readremotenames(repo):
|
||||
rfile = shareawarevfs(repo).join('remotenames')
|
||||
vfs = shareawarevfs(repo)
|
||||
# exit early if there is nothing to do
|
||||
if not os.path.exists(rfile):
|
||||
if not vfs.exists('remotenames'):
|
||||
return
|
||||
|
||||
# needed to heuristically determine if a file is in the old format
|
||||
branches = repo.names['branches'].listnames(repo)
|
||||
bookmarks = repo.names['bookmarks'].listnames(repo)
|
||||
|
||||
f = open(rfile)
|
||||
f = vfs('remotenames')
|
||||
for line in f:
|
||||
nametype = None
|
||||
line = line.strip()
|
||||
@ -1043,16 +1046,17 @@ def transition(repo, ui):
|
||||
ui.warn(message + '\n')
|
||||
|
||||
def saveremotenames(repo, remote, branches={}, bookmarks={}):
|
||||
vfs = shareawarevfs(repo)
|
||||
wlock = repo.wlock()
|
||||
try:
|
||||
# delete old files
|
||||
try:
|
||||
repo.vfs.unlink('remotedistance')
|
||||
vfs.unlink('remotedistance')
|
||||
except OSError, inst:
|
||||
if inst.errno != errno.ENOENT:
|
||||
raise
|
||||
|
||||
if not shareawarevfs(repo).exists('remotenames'):
|
||||
if not vfs.exists('remotenames'):
|
||||
transition(repo, repo.ui)
|
||||
|
||||
# while we're removing old paths, also update _remotenames
|
||||
@ -1064,7 +1068,7 @@ def saveremotenames(repo, remote, branches={}, bookmarks={}):
|
||||
# read in all data first before opening file to write
|
||||
olddata = set(readremotenames(repo))
|
||||
|
||||
f = shareawarevfs(repo)('remotenames', 'w')
|
||||
f = vfs('remotenames', 'w')
|
||||
|
||||
# only update the given 'remote'; iterate over old data and re-save it
|
||||
for node, nametype, oldremote, rname in olddata:
|
||||
@ -1111,7 +1115,8 @@ def calculatenamedistance(repo, fromname, toname):
|
||||
|
||||
def writedistancecache(repo, distance):
|
||||
try:
|
||||
f = repo.vfs('cache/distance', 'w')
|
||||
vfs = shareawarevfs(repo)
|
||||
f = vfs('cache/distance', 'w')
|
||||
for k, v in distance.iteritems():
|
||||
f.write('%s %d %d\n' % (k, v[0], v[1]))
|
||||
except (IOError, OSError):
|
||||
@ -1120,7 +1125,8 @@ def writedistancecache(repo, distance):
|
||||
def readdistancecache(repo):
|
||||
distances = {}
|
||||
try:
|
||||
for line in repo.vfs.read('cache/distance').splitlines():
|
||||
vfs = shareawarevfs(repo)
|
||||
for line in vfs.read('cache/distance').splitlines():
|
||||
line = line.rsplit(' ', 2)
|
||||
try:
|
||||
d = (int(line[1]), int(line[2]))
|
||||
@ -1136,16 +1142,17 @@ def readdistancecache(repo):
|
||||
def invalidatedistancecache(repo):
|
||||
"""Try to invalidate any existing distance caches"""
|
||||
error = False
|
||||
vfs = shareawarevfs(repo)
|
||||
try:
|
||||
if repo.vfs.isdir('cache/distance'):
|
||||
shutil.rmtree(repo.vfs.join('cache/distance'))
|
||||
if vfs.isdir('cache/distance'):
|
||||
shutil.rmtree(vfs.join('cache/distance'))
|
||||
else:
|
||||
repo.vfs.unlink('cache/distance')
|
||||
vfs.unlink('cache/distance')
|
||||
except (OSError, IOError), inst:
|
||||
if inst.errno != errno.ENOENT:
|
||||
error = True
|
||||
try:
|
||||
repo.vfs.unlink('cache/distance.current')
|
||||
vfs.unlink('cache/distance.current')
|
||||
except (OSError, IOError), inst:
|
||||
if inst.errno != errno.ENOENT:
|
||||
error = True
|
||||
@ -1190,8 +1197,9 @@ def precachedistance(repo):
|
||||
# and we'll pick the first one for now
|
||||
bmark = repo[revs[0]].bookmarks()[0]
|
||||
distance = len(repo.revs('only(%d, .)' % revs[0]))
|
||||
repo.vfs.write('cache/distance.current',
|
||||
'%s %d' % (bmark, distance))
|
||||
vfs = shareawarevfs(repo)
|
||||
vfs.write('cache/distance.current',
|
||||
'%s %d' % (bmark, distance))
|
||||
|
||||
finally:
|
||||
wlock.release()
|
||||
|
@ -1,3 +1,5 @@
|
||||
Set up upstream repo
|
||||
|
||||
$ echo "[extensions]" >> $HGRCPATH
|
||||
$ echo "share=" >> $HGRCPATH
|
||||
$ echo "remotenames=`dirname $TESTDIR`/remotenames.py" >> $HGRCPATH
|
||||
@ -6,7 +8,11 @@
|
||||
$ touch file0
|
||||
$ hg add file0
|
||||
$ hg commit -m "file0"
|
||||
$ hg bookmark mainline
|
||||
$ cd ..
|
||||
|
||||
Clone primary repo
|
||||
|
||||
$ hg clone upstream primary
|
||||
updating to branch default
|
||||
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
||||
@ -14,21 +20,35 @@
|
||||
$ hg log --graph
|
||||
@ changeset: 0:d26a60f4f448
|
||||
tag: tip
|
||||
bookmark: default/mainline
|
||||
hoistedname: mainline
|
||||
branch: default/default
|
||||
user: test
|
||||
date: Thu Jan 01 00:00:00 1970 +0000
|
||||
summary: file0
|
||||
|
||||
|
||||
Share to secondary repo
|
||||
$ cd ..
|
||||
$ hg share primary secondary
|
||||
$ hg share -B primary secondary
|
||||
updating working directory
|
||||
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
||||
$ cd secondary
|
||||
$ hg log --graph
|
||||
@ changeset: 0:d26a60f4f448
|
||||
tag: tip
|
||||
bookmark: default/mainline
|
||||
hoistedname: mainline
|
||||
branch: default/default
|
||||
user: test
|
||||
date: Thu Jan 01 00:00:00 1970 +0000
|
||||
summary: file0
|
||||
|
||||
|
||||
Check that tracking is also shared
|
||||
$ hg book local -t default/mainline
|
||||
$ hg book -v
|
||||
* local 0:d26a60f4f448 [default/mainline]
|
||||
$ cd ../primary
|
||||
$ hg book -v
|
||||
local 0:d26a60f4f448 [default/mainline]
|
||||
|
Loading…
Reference in New Issue
Block a user