aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElena ``of Valhalla'' Grandi <valhalla@trueelena.org>2017-03-04 19:10:37 +0100
committerElena ``of Valhalla'' Grandi <valhalla@trueelena.org>2017-03-04 19:12:55 +0100
commit2e1e99bdb18368de7cb30623c4381baa076f4307 (patch)
tree094631f60852438a36e987b709cfab3137897f4f
parentd4d4120ed6362e15f55d83525515c959713ff4ba (diff)
Auto add edited files to git
-rw-r--r--TODO.rst1
-rw-r--r--lesana/collection.py21
-rw-r--r--lesana/command.py14
-rw-r--r--tests/test_collection.py34
4 files changed, 69 insertions, 1 deletions
diff --git a/TODO.rst b/TODO.rst
index 0dbaeac..f8256c8 100644
--- a/TODO.rst
+++ b/TODO.rst
@@ -1,7 +1,6 @@
The following features are already planned.
* Allow to identify entries with just the beginning of the uid.
-* Auto add edited file to git (but don't commit).
* Write some infrastructure to make it easy to write import scripts
from other formats (and write an import script from tellico to
lesana).
diff --git a/lesana/collection.py b/lesana/collection.py
index 8be3ed0..a4b9c63 100644
--- a/lesana/collection.py
+++ b/lesana/collection.py
@@ -193,6 +193,27 @@ class Collection(object):
with open(complete_name, 'w') as fp:
fp.write(e.yaml_data)
+ def git_add_files(self, files=[]):
+ if not git_available:
+ logging.warning(
+ "python3-git not available, could not initalise " +
+ "the git repository.")
+ return False
+ if not self.settings.get('git', False):
+ logging.info(
+ "This collection is configured not to use git"
+ )
+ return False
+ try:
+ repo = git.Repo(self.basedir)
+ except git.exc.InvalidGitRepositoryError as e:
+ logging.warning(
+ "Could not find a git repository in {}".format(
+ self.basedir))
+ return False
+ repo.index.add(files)
+ return True
+
def _get_cache(self):
try:
cache = xapian.Database(
diff --git a/lesana/command.py b/lesana/command.py
index 56c855a..41448b3 100644
--- a/lesana/command.py
+++ b/lesana/command.py
@@ -64,6 +64,11 @@ class New(guacamole.Command):
(['--collection', '-c'], dict(
help='The collection to work on (default .)'
)),
+ (['--no-git'], dict(
+ help="Don't add the new entry to git",
+ action="store_false",
+ dest='git'
+ )),
]
def register_arguments(self, parser):
@@ -80,6 +85,8 @@ class New(guacamole.Command):
)
if edit_file_in_external_editor(filepath):
collection.update_cache([filepath])
+ if ctx.args.git:
+ collection.git_add_files([filepath])
print(new_entry)
@@ -88,6 +95,11 @@ class Edit(guacamole.Command):
(['--collection', '-c'], dict(
help='The collection to work on (default .)'
)),
+ (['--no-git'], dict(
+ help="Don't add the new entry to git",
+ action="store_false",
+ dest='git'
+ )),
(['uid'], dict(
help='uid of an entry to edit',
)),
@@ -108,6 +120,8 @@ class Edit(guacamole.Command):
)
if edit_file_in_external_editor(filepath):
collection.update_cache([filepath])
+ if ctx.args.git:
+ collection.git_add_files([filepath])
print(entry)
diff --git a/tests/test_collection.py b/tests/test_collection.py
index 265db09..e17e044 100644
--- a/tests/test_collection.py
+++ b/tests/test_collection.py
@@ -4,6 +4,7 @@ import shutil
import tempfile
import unittest
+import git
import ruamel.yaml
import lesana
@@ -264,6 +265,39 @@ class testCollectionCreation(unittest.TestCase):
mset = collection._enquire.get_mset(0, 10)
self.assertEqual(mset.get_matches_estimated(), 0)
+ def _find_file_in_git_index(self, fname, index):
+ found = False
+ for (path, stage) in index.entries:
+ if fname in path:
+ found = True
+ break
+ return found
+
+ def test_git_adding(self):
+ tmpdir = tempfile.mkdtemp()
+ shutil.copy('tests/data/simple/settings.yaml', tmpdir)
+ shutil.copytree(
+ 'tests/data/simple/items',
+ os.path.join(tmpdir, 'items'),
+ )
+ collection = lesana.Collection.init(tmpdir)
+ fname = '11189ee47ddf4796b718a483b379f976.yaml'
+ repo = git.Repo(tmpdir)
+ # By default, this collection doesn't have any git entry in the
+ # settings (but there is a repo)
+ collection.git_add_files([os.path.join(collection.itemdir, fname)])
+ self.assertFalse(self._find_file_in_git_index(fname, repo.index))
+ # Then we set it to false
+ collection.settings['git'] = False
+ collection.git_add_files([os.path.join(collection.itemdir, fname)])
+ self.assertFalse(self._find_file_in_git_index(fname, repo.index))
+ # And only when it's set to true we should find the file in the
+ # staging area
+ collection.settings['git'] = True
+ collection.git_add_files([os.path.join(collection.itemdir, fname)])
+ self.assertTrue(self._find_file_in_git_index(fname, repo.index))
+ shutil.rmtree(tmpdir)
+
if __name__ == '__main__':
unittest.main()