Changeset ea4a93f9f8d0…
Parent e9febbf6d1d9…
by Na'Tosha Bard <natosha@unity3d.com>
Changes to 5 files · Browse files at ea4a93f9f8d0 Showing diff from parent e9febbf6d1d9 Diff from another changeset...
|
@@ -8,6 +8,7 @@ match as match_, filemerge, node, archival, httprepo, error
from mercurial.i18n import _
from mercurial.node import hex
+from hgext import rebase
import bfutil, bfcommands
def hgversion():
@@ -196,6 +197,12 @@
wlock = repo.wlock()
try:
+ if getattr(repo, "_are_rebasing", False):
+ # We have to take the time to pull down the new bfiles now. Otherwise
+ # if we are rebasing, any bfiles that were modified in the changesets we
+ # are rebasing on top of get overwritten either by the rebase or in the
+ # first commit after the rebase.
+ bfcommands.update_bfiles(repo.ui, repo)
# Case 1: user calls commit with no specific files or
# include/exclude patterns: refresh and commit everything.
if (match is None) or (not match.anypats() and not match.files()):
@@ -204,8 +211,11 @@ # this only loops through bfiles that exist (not removed/renamed)
for bfile in bfiles:
if os.path.exists(self.wjoin(bfutil.standin(bfile))):
- bfutil.update_standin(self, bfutil.standin(bfile))
- bfdirstate.normal(bfutil.unixpath(bfile))
+ # this handles the case where a rebase is being performed and the
+ # working copy is not updated yet.
+ if os.path.exists(self.wjoin(bfile)):
+ bfutil.update_standin(self, bfutil.standin(bfile))
+ bfdirstate.normal(bfutil.unixpath(bfile))
for bfile in bfdirstate:
if not os.path.exists(repo.wjoin(bfutil.standin(bfile))):
bfdirstate.forget(bfutil.unixpath(bfile))
@@ -752,14 +762,45 @@ return result
# When we rebase a repository with remotely changed bfiles, we need
-# to explicitly do a clean update so that the entries in .kbf are
-# udpated and the new bfiles are pulled
+# to take some extra care so that the bfiles are correctly updated
+# in the working copy
def override_pull(orig, ui, repo, source="default", **opts):
- result = orig(ui, repo, source, **opts)
if opts.get('rebase', False):
- commands.update(repo.ui, repo, clean = True)
+ setattr(repo, "_are_rebasing", True)
+ try:
+ if opts.get('update'):
+ del opts['update']
+ ui.debug('--update and --rebase are not compatible, ignoring '
+ 'the update flag\n')
+ del opts['rebase']
+ cmdutil.bail_if_changed(repo)
+ revsprepull = len(repo)
+ origpostincoming = commands.postincoming
+ def _dummy(*args, **kwargs):
+ pass
+ commands.postincoming = _dummy
+ try:
+ result = commands.pull(ui, repo, source, **opts)
+ finally:
+ commands.postincoming = origpostincoming
+ revspostpull = len(repo)
+ if revspostpull > revsprepull:
+ result = result or rebase.rebase(ui, repo)
+ branch = repo[None].branch()
+ dest = repo[branch].rev()
+ finally:
+ setattr(repo, "_are_rebasing", False)
+ else:
+ result = orig(ui, repo, source, **opts)
return result
+def override_rebase(orig, ui, repo, **opts):
+ setattr(repo, "_are_rebasing", True)
+ try:
+ orig(ui, repo, **opts)
+ finally:
+ setattr(repo, "_are_rebasing", False)
+
def override_archive(orig, repo, dest, node, kind, decode=True, matchfn=None,
prefix=None, mtime=None, subrepos=None):
# No need to lock because we are only reading history and bfile caches
@@ -1040,5 +1081,7 @@ for name, module in extensions.extensions():
if name == 'fetch':
extensions.wrapcommand(getattr(module, 'cmdtable'), 'fetch', override_fetch)
+ if name == 'rebase':
+ extensions.wrapcommand(getattr(module, 'cmdtable'), 'rebase', override_rebase)
|
@@ -286,9 +286,10 @@
def update_standin(repo, standin):
file = repo.wjoin(split_standin(standin))
- hash = hashfile(file)
- executable = get_executable(file)
- write_standin(repo, standin, hash, executable)
+ if(os.path.exists(file)):
+ hash = hashfile(file)
+ executable = get_executable(file)
+ write_standin(repo, standin, hash, executable)
def read_standin(repo, standin):
'''read hex hash from <repo.root>/<standin>'''
@@ -318,6 +319,8 @@ return hashfile(repo.wjoin(file))
def hashfile(file):
+ if not os.path.exists(file):
+ return '';
hasher = util.sha1('')
with open(file, 'rb') as fd:
for data in blockstream(fd):
|
@@ -11,7 +11,8 @@ STOREDIR = os.path.join(os.getcwd(), 'store')
DEFAULTRC = {
- 'extensions': [('kbfiles', '%s/../kbfiles' % TESTDIR),],
+ 'extensions': [('kbfiles', '%s/../kbfiles' % TESTDIR),
+ ('rebase', '')],
'kilnbfiles': [('systemcache', os.path.join(os.getcwd(), 'bfilesstore')),],
}
|
@@ -55,3 +55,8 @@ ''')
hgt.hg(['commit', '-m', 'adding', 'dir/b2', 'dir/n2'])
hgt.hg(['status'])
+hgt.writefile('b1', 'b11')
+hgt.hg(['status'],
+ stdout='M b1\n')
+hgt.hg(['commit', '-m', 'modifying b1'])
+hgt.asserttrue(hgt.readfile('b1') == 'b11', 'file contents dont match')
|
|
|
@@ -0,0 +1,158 @@ + #!/usr/bin/python
+#
+# Test rebasing
+#
+
+import os
+import common
+
+
+hgt = common.BfilesTester()
+
+hgt.updaterc()
+hgt.announce('test')
+os.mkdir('repo1')
+os.chdir('repo1')
+hgt.hg(['init'])
+hgt.writefile('n1', 'n1')
+hgt.hg(['add'],
+ stdout=('adding n1\n'))
+hgt.hg(['commit', '-m', 'Add n1 repo1'])
+hgt.writefile('b1', 'b1')
+hgt.hg(['add', '--bf', 'b1'])
+hgt.hg(['commit', '-m', 'Add bfile b1 in repo1'])
+os.chdir('..')
+hgt.hg(['clone', 'repo1', 'repo2'],
+ stdout=('updating to branch default\n'
+ '2 files updated, 0 files merged, 0 files removed, 0 files unresolved\n'
+ 'Getting changed bfiles\n'
+ '1 big files updated, 0 removed\n'))
+os.chdir('repo1')
+hgt.writefile('b1', 'b11')
+hgt.hg(['commit', '-m', 'Modify bfile b1 in repo1'])
+os.chdir('../repo2')
+hgt.writefile('n1', 'n11')
+hgt.hg(['commit', '-m', 'Modify n1 in repo2'])
+hgt.hg(['pull', '--rebase'],
+ stdout=('pulling from $HGTMP/test-rebase.py/repo1\n'
+ 'searching for changes\n'
+ 'adding changesets\n'
+ 'adding manifests\n'
+ 'adding file changes\n'
+ 'added 1 changesets with 1 changes to 1 files (+1 heads)\n'
+ 'Getting changed bfiles\n'
+ '1 big files updated, 0 removed\n'
+ 'saved backup bundle to $HGTMP/test-rebase.py/repo2/.hg/strip-backup/5d80f03f644c-backup.hg\n'
+ 'nothing to rebase\n'))
+hgt.hg(['out', '--bf'],
+ stdout=('comparing with $HGTMP/test-rebase.py/repo1\n'
+ 'searching for changes\n'
+ 'changeset: 3:168bfc518870\n'
+ 'tag: tip\n'
+ 'user: test\n'
+ 'date: Thu Jan 01 00:00:00 1970 +0000\n'
+ 'summary: Modify n1 in repo2\n'
+ '\n'
+ 'searching for changes\n'
+ 'kbfiles to upload:\n'
+ '\n'))
+hgt.writefile('n1', 'n111');
+hgt.hg(['commit', '-m', 'Modify n1'])
+hgt.hg(['out', '--bf'],
+ stdout=('comparing with $HGTMP/test-rebase.py/repo1\n'
+ 'searching for changes\n'
+ 'changeset: 3:168bfc518870\n'
+ 'user: test\n'
+ 'date: Thu Jan 01 00:00:00 1970 +0000\n'
+ 'summary: Modify n1 in repo2\n'
+ '\n'
+ 'changeset: 4:76fa4c6125bc\n'
+ 'tag: tip\n'
+ 'user: test\n'
+ 'date: Thu Jan 01 00:00:00 1970 +0000\n'
+ 'summary: Modify n1\n'
+ '\n'
+ 'searching for changes\n'
+ 'kbfiles to upload:\n'
+ '\n'))
+hgt.hg(['update', '--clean'],
+ stdout=('0 files updated, 0 files merged, 0 files removed, 0 files unresolved\n'
+ 'Getting changed bfiles\n'
+ '0 big files updated, 0 removed\n'))
+hgt.asserttrue(hgt.readfile('b1') == 'b11', "file contents don't match")
+
+# Now do the exact same thing with the rebase command instead of pull --rebase
+os.chdir('..')
+os.mkdir('repo3')
+os.chdir('repo3')
+hgt.hg(['init'])
+hgt.writefile('n1', 'n1')
+hgt.hg(['add'],
+ stdout=('adding n1\n'))
+hgt.hg(['commit', '-m', 'Add n1 repo3'])
+hgt.writefile('b1', 'b1')
+hgt.hg(['add', '--bf', 'b1'])
+hgt.hg(['commit', '-m', 'Add bfile b1 in repo3'])
+os.chdir('..')
+hgt.hg(['clone', 'repo3', 'repo4'],
+ stdout=('updating to branch default\n'
+ '2 files updated, 0 files merged, 0 files removed, 0 files unresolved\n'
+ 'Getting changed bfiles\n'
+ '1 big files updated, 0 removed\n'))
+os.chdir('repo3')
+hgt.writefile('b1', 'b11')
+hgt.hg(['commit', '-m', 'Modify bfile b1 in repo3'])
+os.chdir('../repo4')
+hgt.writefile('n1', 'n11')
+hgt.hg(['commit', '-m', 'Modify n1 in repo4'])
+hgt.hg(['pull'],
+ stdout=('pulling from $HGTMP/test-rebase.py/repo3\n'
+ 'searching for changes\n'
+ 'adding changesets\n'
+ 'adding manifests\n'
+ 'adding file changes\n'
+ 'added 1 changesets with 1 changes to 1 files (+1 heads)\n'
+ '(run \'hg heads\' to see heads, \'hg merge\' to merge)\n'))
+
+
+hgt.hg(['rebase'],
+ stdout=('Getting changed bfiles\n'
+ '1 big files updated, 0 removed\n'
+ 'saved backup bundle to $HGTMP/test-rebase.py/repo4/.hg/strip-backup/589266dab166-backup.hg\n'))
+hgt.hg(['out', '--bf'],
+ stdout=('comparing with $HGTMP/test-rebase.py/repo3\n'
+ 'searching for changes\n'
+ 'changeset: 3:e4dbf8fdf868\n'
+ 'tag: tip\n'
+ 'user: test\n'
+ 'date: Thu Jan 01 00:00:00 1970 +0000\n'
+ 'summary: Modify n1 in repo4\n'
+ '\n'
+ 'searching for changes\n'
+ 'kbfiles to upload:\n'
+ '\n'))
+hgt.writefile('n1', 'n111');
+hgt.hg(['commit', '-m', 'Modify n1'])
+hgt.hg(['out', '--bf'],
+ stdout=('comparing with $HGTMP/test-rebase.py/repo3\n'
+ 'searching for changes\n'
+ 'changeset: 3:e4dbf8fdf868\n'
+ 'user: test\n'
+ 'date: Thu Jan 01 00:00:00 1970 +0000\n'
+ 'summary: Modify n1 in repo4\n'
+ '\n'
+ 'changeset: 4:26ba7897b44d\n'
+ 'tag: tip\n'
+ 'user: test\n'
+ 'date: Thu Jan 01 00:00:00 1970 +0000\n'
+ 'summary: Modify n1\n'
+ '\n'
+ 'searching for changes\n'
+ 'kbfiles to upload:\n'
+ '\n'))
+hgt.hg(['update', '--clean'],
+ stdout=('0 files updated, 0 files merged, 0 files removed, 0 files unresolved\n'
+ 'Getting changed bfiles\n'
+ '0 big files updated, 0 removed\n'))
+
+hgt.asserttrue(hgt.readfile('b1') == 'b11', "file contents don't match")
|
Loading...