Mercurial > hg
view mercurial/state.py @ 38855:7848f284b211
revisions: allow "x123" to refer to nodeid prefix "123"
When resolving "123" to a revision, we try to interpret it as revnum
before we try to interpret it as a nodeid hex prefix. This can lead to
the shortest valid prefix being longer than necessary. This patch lets
us write such nodeids in a shorter form by prefixing them with "x"
instead of adding more hex digits until they're longer than the
longest decimal revnum.
On my hg repo with almost 69k revisions, turning this feature on saves
on average 0.4% on the average nodeid length. That clearly doesn't
justify this patch. However, it becomes more usefule when combined
with the earlier patches in this series that let you disambiguate
nodeid prefixes within a configured revset.
Note that we attempt to resolve symbols as nodeid prefixes after we've
exhausted all other posibilities, so this is a backwards compatible
change (only queries that would previously fail may now succeed).
I've still hidden this feature behind an experiemntal config option so
we can roll it back if needed.
Differential Revision: https://phab.mercurial-scm.org/D4041
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Sun, 29 Apr 2018 10:07:40 -0700 |
parents | 6f67bfe4b82f |
children | 5bfab9400daf |
line wrap: on
line source
# state.py - writing and reading state files in Mercurial # # Copyright 2018 Pulkit Goyal <pulkitmgoyal@gmail.com> # # This software may be used and distributed according to the terms of the # GNU General Public License version 2 or any later version. """ This file contains class to wrap the state for commands and other related logic. All the data related to the command state is stored as dictionary in the object. The class has methods using which the data can be stored to disk in a file under .hg/ directory. We store the data on disk in cbor, for which we use the third party cbor library to serialize and deserialize data. """ from __future__ import absolute_import from .thirdparty import cbor from . import ( error, util, ) class cmdstate(object): """a wrapper class to store the state of commands like `rebase`, `graft`, `histedit`, `shelve` etc. Extensions can also use this to write state files. All the data for the state is stored in the form of key-value pairs in a dictionary. The class object can write all the data to a file in .hg/ directory and can populate the object data reading that file. Uses cbor to serialize and deserialize data while writing and reading from disk. """ def __init__(self, repo, fname): """ repo is the repo object fname is the file name in which data should be stored in .hg directory """ self._repo = repo self.fname = fname def read(self): """read the existing state file and return a dict of data stored""" return self._read() def save(self, version, data): """write all the state data stored to .hg/<filename> file we use third-party library cbor to serialize data to write in the file. """ if not isinstance(version, int): raise error.ProgrammingError("version of state file should be" " an integer") with self._repo.vfs(self.fname, 'wb', atomictemp=True) as fp: fp.write('%d\n' % version) cbor.dump(data, fp, canonical=True) def _read(self): """reads the state file and returns a dictionary which contain data in the same format as it was before storing""" with self._repo.vfs(self.fname, 'rb') as fp: try: int(fp.readline()) except ValueError: raise error.CorruptedState("unknown version of state file" " found") return cbor.load(fp) def delete(self): """drop the state file if exists""" util.unlinkpath(self._repo.vfs.join(self.fname), ignoremissing=True) def exists(self): """check whether the state file exists or not""" return self._repo.vfs.exists(self.fname)