1"""Auto-commit hook for Fava.
2
3This mainly serves as an example how Fava's extension systems, which only
4really does hooks at the moment, works.
5"""
6# pylint: disable=missing-docstring
7# pragma: no cover - this is just an untested example
8import os
9import subprocess
10
11from fava.ext import FavaExtensionBase
12
13
14class AutoCommit(FavaExtensionBase):
15    def _run(self, args):
16        cwd = os.path.dirname(self.ledger.beancount_file_path)
17        subprocess.call(args, cwd=cwd, stdout=subprocess.DEVNULL)
18
19    def after_write_source(self, path, _):
20        message = "autocommit: file saved"
21        self._run(["git", "add", path])
22        self._run(["git", "commit", "-m", message])
23
24    def after_insert_metadata(self, *_):
25        message = "autocommit: metadata added"
26        self._run(["git", "commit", "-am", message])
27
28    def after_insert_entry(self, entry):
29        message = f"autocommit: entry on {entry.date}"
30        self._run(["git", "commit", "-am", message])
31
32    def after_entry_modified(self, entry, _):
33        message = f"autocommit: modified entry on {entry.date}"
34        self._run(["git", "commit", "-am", message])
35