state.py
87 lines
| 2.8 KiB
| text/x-python
|
PythonLexer
/ mercurial / state.py
Pulkit Goyal
|
r38115 | # 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. | ||||
Augie Fackler
|
r41171 | We store the data on disk in cbor, for which we use the CBOR format to encode | ||
the data. | ||||
Pulkit Goyal
|
r38115 | """ | ||
from __future__ import absolute_import | ||||
from . import ( | ||||
Pulkit Goyal
|
r38118 | error, | ||
Pulkit Goyal
|
r38115 | util, | ||
) | ||||
Gregory Szorc
|
r39482 | from .utils import ( | ||
cborutil, | ||||
) | ||||
Pulkit Goyal
|
r38115 | |||
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. | ||||
""" | ||||
Pulkit Goyal
|
r38162 | def __init__(self, repo, fname): | ||
Pulkit Goyal
|
r38115 | """ 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 | ||||
Pulkit Goyal
|
r38116 | def read(self): | ||
"""read the existing state file and return a dict of data stored""" | ||||
return self._read() | ||||
Pulkit Goyal
|
r38115 | |||
Pulkit Goyal
|
r38118 | def save(self, version, data): | ||
Pulkit Goyal
|
r38115 | """write all the state data stored to .hg/<filename> file | ||
we use third-party library cbor to serialize data to write in the file. | ||||
""" | ||||
Pulkit Goyal
|
r38118 | if not isinstance(version, int): | ||
raise error.ProgrammingError("version of state file should be" | ||||
" an integer") | ||||
Pulkit Goyal
|
r38115 | with self._repo.vfs(self.fname, 'wb', atomictemp=True) as fp: | ||
Pulkit Goyal
|
r38140 | fp.write('%d\n' % version) | ||
Gregory Szorc
|
r39482 | for chunk in cborutil.streamencode(data): | ||
fp.write(chunk) | ||||
Pulkit Goyal
|
r38115 | |||
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: | ||||
Pulkit Goyal
|
r38118 | try: | ||
Pulkit Goyal
|
r38141 | int(fp.readline()) | ||
Pulkit Goyal
|
r38118 | except ValueError: | ||
Pulkit Goyal
|
r38148 | raise error.CorruptedState("unknown version of state file" | ||
" found") | ||||
Gregory Szorc
|
r39482 | |||
return cborutil.decodeall(fp.read())[0] | ||||
Pulkit Goyal
|
r38115 | |||
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) | ||||