From bc6fd1e41c3e362c42414b4f582f5ebd2613a8a4 Mon Sep 17 00:00:00 2001 From: zlg Date: Sun, 2 Aug 2020 16:57:26 -0700 Subject: vgstash_cli: Show what happens to note data The 'notes -e' command used to always tell the user that the notes had been updated. This was incorrect. Now 'notes -e' will detect three states: * The note has been changed * The note has not been changed * The editor can't be loaded (set via EDITOR) ZLG-Bug: 3 --- src/vgstash_cli.py | 27 ++++++++++++++++++++++----- tests/test_vgstash_cli.py | 21 +++++++++++++++++++++ 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/src/vgstash_cli.py b/src/vgstash_cli.py index d00f339..1967458 100755 --- a/src/vgstash_cli.py +++ b/src/vgstash_cli.py @@ -194,18 +194,35 @@ def notes(title, system, edit): with tempfile.NamedTemporaryFile() as tmpfile: tmpfile.write(target_game.notes.encode("UTF-8")) tmpfile.flush() - process = subprocess.run([os.getenv("EDITOR", "vim"), tmpfile.name]) + pre_stat = os.stat(tmpfile.name) + o_mtime = pre_stat.st_mtime + o_size = pre_stat.st_size + try: + process = subprocess.run([os.getenv("EDITOR", "vim"), tmpfile.name]) + except: + click.echo("Could not run editor. Is it set correctly?") + return tmpfile.flush() tmpfile.seek(0) + post_stat = os.stat(tmpfile.name) + n_mtime = post_stat.st_mtime + n_size = post_stat.st_size note_arr = [] for line in tmpfile: note_arr.append(line.decode("UTF-8").rstrip("\r\n")) target_game.notes = "\n".join(note_arr) db.update_game(target_game, target_game) - if process.returncode == 0: - click.echo("Notes for {} on {} have been updated!".format(target_game.title, target_game.system)) - else: - click.echo("Couldn't find an editor for notes. Check the EDITOR environment variable and try again.") + if process.returncode == 0: + # determine what actually happened + if o_mtime == n_mtime: + if o_size == n_size: + click.echo("Notes for {} on {} left unchanged.".format(target_game.title, target_game.system)) + elif n_mtime > o_mtime and o_size != n_size: + click.echo("Notes for {} on {} have been updated!".format(target_game.title, target_game.system)) + return + else: + click.echo("The editor crashed. Please try again.") + return else: if len(target_game.notes) > 0: click.echo("Notes for {} on {}:".format(target_game.title, target_game.system)) diff --git a/tests/test_vgstash_cli.py b/tests/test_vgstash_cli.py index 0e24859..e24c5a4 100644 --- a/tests/test_vgstash_cli.py +++ b/tests/test_vgstash_cli.py @@ -231,6 +231,27 @@ def test_notes_invalid(): assert result.output == 'Game not found. Please try again.\n' +def test_notes_unmodified(): + runner = CliRunner() + print("--- WHAT EDITOR SEES ---") + result = runner.invoke(vgstash_cli.cli, ['notes', 'Vectorman 2', 'Genesis', '-e']) + print("--- END WHAT EDITOR SEES ---") + if verbose: + print(result.output) + assert result.exit_code == 0 + assert result.output == 'Notes for Vectorman 2 on Genesis left unchanged.\n' + + +def test_notes_bad_editor(): + os.environ['EDITOR'] = "zlurp" + runner = CliRunner() + result = runner.invoke(vgstash_cli.cli, ['notes', 'Vectorman 2', 'Genesis', '-e']) + if verbose: + print(result.output) + assert result.exit_code == 0 + assert result.output == "Could not run editor. Is it set correctly?\n" + + def test_notes_empty(): runner = CliRunner() result = runner.invoke(vgstash_cli.cli, ['notes', 'Super Mario Bros.', 'NES']) -- cgit v1.2.3-54-g00ecf