Source code for wxyz.dvcs.tools.tool_timetravel
"""baseline tools for working with time traveling"""
import ipywidgets as W
import jinja2
import traitlets as T
from tornado.ioloop import IOLoop
from ..repos.repo_base import Repo
CSS_PREFIX = "jp-wxyz-dvcs-tool-timetravel"
DEFAULT_OPTIONS = [("No History", 0)]
DEFAULT_OPTION_TMPL = """
[{{ commit[:7] }}] {{ message }} by {{ author.name }} {{ timestamp }}
""".strip()
[docs]class TimeTraveler(W.HBox):
"""Show a selection widget"""
# pylint: disable=unused-argument
repo = T.Instance(Repo)
commits = T.Instance(W.DOMWidget)
enabled = T.Bool(default_value=False)
enable_chk = T.Instance(W.DOMWidget)
_commits_cls = W.SelectionSlider
_option_tmpl = jinja2.Template(DEFAULT_OPTION_TMPL)
def __init__(self, *args, **kwargs):
if "layout" not in kwargs:
kwargs["layout"] = dict(
flex="1",
display="flex",
)
super().__init__(*args, **kwargs)
T.dlink(
(self.repo, "head_history"),
(self.commits, "options"),
self._update_history_options,
)
T.dlink(
(self, "enabled"),
(self.commits.layout, "display"),
{True: "flex", False: "none"}.get,
)
T.link((self, "enabled"), (self.enable_chk, "value"))
self._dom_classes += (f"{CSS_PREFIX}-box",)
self.commits.observe(self._on_change_commit, "value")
self.repo.observe(self._on_head_hash_change, "head_hash")
self.children = [self.enable_chk, self.commits]
def _on_change_commit(self, change):
"""revert to the selected commit"""
if not self.enabled or change.new is None:
return
self.repo.revert(change.new)
def _on_head_hash_change(self, _change=None):
head_hash = str(self.repo.head_hash)
if head_hash is None:
return
options = self._update_history_options(self.repo.head_history)
if options:
self.commits.options = options
if head_hash not in dict(options).values():
IOLoop.current().add_callback(self._on_head_hash_change)
return
self.commits.value = head_hash
@T.default("commits")
def _make_default_commits(self):
"""create a default commit selector"""
return self._commits_cls(
options=DEFAULT_OPTIONS, layout=dict(width="80%", flex="1"), rows=1
)
def _update_history_options(self, history):
"""nicely format the commit history"""
return [(self._option_tmpl.render(**h), str(h["commit"])) for h in history][
::-1
] or DEFAULT_OPTIONS
@T.default("enable_chk")
def _default_enable_chk(self):
checkbox = W.Checkbox(description="Time Travel", layout=dict(flex="0"))
checkbox.add_class("jp-wxyz-dvcs-timetravel")
return checkbox