Source code for wxyz.dvcs.tools.tool_commits

"""baseline tools for working with commits"""

import ipywidgets as W
import traitlets as T

from ..repos.repo_base import Repo

CSS_PREFIX = "jp-wxyz-dvcs-tool-commit"


[docs]class Committer(W.VBox): """Create commits with a message""" # pylint: disable=unused-argument repo = T.Instance(Repo) watch = T.Instance(W.DOMWidget) message = T.Instance(W.Text) commit_btn = T.Instance(W.Button) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # move these into watchers T.link((self.watch, "value"), (self.repo, "watching")) T.dlink( (self.repo, "changes"), (self.commit_btn, "description"), self.change_btn_desc, ) T.dlink( (self.repo, "changes"), (self.commit_btn, "disabled"), lambda changes: not changes, ) self.commit_btn.on_click(self.commit) self._dom_classes += (f"{CSS_PREFIX}-box",) self.commit_btn._dom_classes += (f"{CSS_PREFIX}-btn",) self.message._dom_classes += (f"{CSS_PREFIX}-msg",) self.children = [self.watch, self.message, self.commit_btn]
[docs] def commit(self, *args): """actually commit""" staged = [] for change in self.repo.changes: for path in ["a_path", "b_path"]: if change[path] and change[path] not in staged: self.repo.stage(change[path]) staged += [change[path]] self.repo.commit(self.message.value or self.message.placeholder) self.message.value = ""
[docs] def change_btn_desc(self, changes): """update button description""" if not changes: self.message.placeholder = "Commit message" return "No changes" paths = sum([[change["a_path"], change["b_path"]] for change in changes], []) paths = sorted({p for p in paths if p}) self.message.placeholder = f"""Updated {", ".join(paths)}""" change_plural = "s" if changes and len(changes) >= 2 else "" return f"""Commit {len(changes)} change{change_plural}"""
@T.default("watch") def _default_watch(self): """default watcher""" return W.Checkbox(True, description="Watch") @T.default("message") def _default_message(self): """default message editor""" return W.Text(placeholder="Commit Message", description="Log") @T.default("commit_btn") def _default_commit_btn(self): """default commit button""" return W.Button(description="Commit")