D2591: state: import the file to write state files from evolve extension
pulkit (Pulkit Goyal)
phabricator at mercurial-scm.org
Sat Mar 3 19:19:21 UTC 2018
pulkit created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.
REVISION SUMMARY
This patch moves the file which is used to write state files easily in a good
way using the cbor format.
The file is moved from changeset 1baf32675ec60d622bd2c3cdce9dbf5a1020c06d of the
evolve extension. The following changes are made to the file while moving to
core:
- import util from current directory as this file in mercurial/ now
- make cmdstate class extend object
- removed mutable default value for opts in cmdstate.__init__
- some doc changes to replace out of core things with in-core ones
evolve extension can be found at https://bitbucket.org/marmoute/mutable-history
REPOSITORY
rHG Mercurial
REVISION DETAIL
https://phab.mercurial-scm.org/D2591
AFFECTED FILES
mercurial/state.py
CHANGE DETAILS
diff --git a/mercurial/state.py b/mercurial/state.py
new file mode 100644
--- /dev/null
+++ b/mercurial/state.py
@@ -0,0 +1,89 @@
+# state.py - writing and reading state files in Mercurial
+#
+# Copyright 2018 Pulkit Goyal <pulkitmgoyal at 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 (
+ 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, opts=None):
+ """ repo is the repo object
+ fname is the file name in which data should be stored in .hg directory
+ opts is a dictionary of data of the statefile
+ """
+ self._repo = repo
+ self.fname = fname
+ if not opts:
+ self.opts = {}
+ else:
+ self.opts = opts
+
+ def __nonzero__(self):
+ return self.exists()
+
+ def __getitem__(self, key):
+ return self.opts[key]
+
+ def load(self):
+ """load the existing evolvestate file into the class object"""
+ op = self._read()
+ self.opts.update(op)
+
+ def addopts(self, opts):
+ """add more key-value pairs to the data stored by the object"""
+ self.opts.update(opts)
+
+ def save(self):
+ """write all the evolvestate data stored in .hg/evolvestate file
+
+ we use third-party library cbor to serialize data to write in the file.
+ """
+ with self._repo.vfs(self.fname, 'wb', atomictemp=True) as fp:
+ cbor.dump(self.opts, fp)
+
+ def _read(self):
+ """reads the evolvestate 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:
+ return cbor.load(fp)
+
+ def delete(self):
+ """drop the evolvestate file if exists"""
+ util.unlinkpath(self._repo.vfs.join(self.fname), ignoremissing=True)
+
+ def exists(self):
+ """check whether the evolvestate file exists or not"""
+ return self._repo.vfs.exists(self.fname)
To: pulkit, #hg-reviewers
Cc: mercurial-devel
More information about the Mercurial-devel
mailing list