def load(cls, repo): version = cls._getversion(repo) if version < cls._version: d = cls._readold(repo) elif version == cls._version: d = scmutil.simplekeyvaluefile( repo.localvfs, cls._filename).read(firstlinenonkeyval=True) else: raise error.Abort( _("this version of shelve is incompatible " "with the version used in this repo")) cls._verifyandtransform(d) try: obj = cls() obj.name = d["name"] obj.wctx = repo[d["originalwctx"]] obj.pendingctx = repo[d["pendingctx"]] obj.parents = d["parents"] obj.nodestoremove = d["nodestoremove"] obj.branchtorestore = d.get("branchtorestore", "") obj.keep = d.get("keep") == cls._keep obj.activebookmark = "" if d.get("activebook", "") != cls._noactivebook: obj.activebookmark = d.get("activebook", "") obj.obsshelve = d["obsshelve"] == cls._obsbased except (error.RepoLookupError, KeyError) as err: raise error.CorruptedState(str(err)) return obj
def _verifyandtransform(cls, d): """Some basic shelvestate syntactic verification and transformation""" try: d["originalwctx"] = nodemod.bin(d["originalwctx"]) d["pendingctx"] = nodemod.bin(d["pendingctx"]) d["parents"] = cls._parsenodelist(d["parents"]) d["nodestoremove"] = cls._parsenodelist(d["nodestoremove"]) except (ValueError, TypeError, KeyError) as err: raise error.CorruptedState(str(err))
def _getversion(cls, repo): """Read version information from shelvestate file""" fp = repo.localvfs(cls._filename) try: version = int(fp.readline().strip()) except ValueError as err: raise error.CorruptedState(str(err)) finally: fp.close() return version