# Copyright (c) Facebook, Inc. and its affiliates. # # This software may be used and distributed according to the terms of the # GNU General Public License version 2. from __future__ import absolute_import from testutil.autofix import eq from testutil.dott import feature, sh, testtmp # noqa: F401 feature.require(["py2"]) def backup(): """Backup .hg/store/{bookmarks,remotenames}""" for name in ["bookmarks", "remotenames"]: path = ".hg/store/%s" % name sh.cp(path, "%s.bak" % path) def restore(): """Rewrite .hg/store/{bookmarks,remotenames} with backup""" for name in ["bookmarks", "remotenames"]: path = ".hg/store/%s" % name sh.cp("%s.bak" % path, path) def setbookmarks(name): """Set bookmarks to specified commit""" sh.hg("bookmark", "book", "-r", "desc(%s)" % name) sh.hg("debugremotebookmark", "remotebook", "desc(%s)" % name) def listbookmarks(): """List local and remote bookmarks""" local = sh.hg("log", "-r", sh.hg("bookmarks", "-T", "{node}"), "-T{desc}") remote = sh.hg( "log", "-r", sh.hg("bookmarks", "--remote", "-T", "{node}"), "-T{desc}" ) return [local, remote] sh.newrepo() sh.setconfig("experimental.metalog=0") sh.enable("remotenames") sh % "drawdag" << r""" C | B | A """ # Prepare bookmarks and remotenames. Set them to A in backup, and B on disk. setbookmarks("A") backup() setbookmarks("B") # Test migrating from disk to metalog. # They should migrate "B" from disk to metalog and use it. sh.setconfig("experimental.metalog=1") eq(listbookmarks(), ["B", "B"]) # Metalog is the source of truth. Changes to .hg/store are ignored. restore() eq(listbookmarks(), ["B", "B"]) # Test migrating from metalog to disk. # Metalog is not the source of truth. Changes to .hg/store are effective. sh.setconfig("experimental.metalog=0") setbookmarks("C") eq(listbookmarks(), ["C", "C"]) restore() eq(listbookmarks(), ["A", "A"]) # Migrate up again. # At this time metalog should import "A" from disk to metalog, instead of # using "B" that exists in metalog. sh.setconfig("experimental.metalog=1") eq(listbookmarks(), ["A", "A"])