Create cli.common, begin record command
This commit is contained in:
parent
07f6347d49
commit
6c62d0568d
15
src/nancy/cli/common.py
Normal file
15
src/nancy/cli/common.py
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
def confirm(question, default_no=False):
|
||||||
|
"""Ask a question and wait for a Y/N response."""
|
||||||
|
|
||||||
|
choices = ' [y/N]: ' if default_no else ' [Y/n]: '
|
||||||
|
default_answer = 'n' if default_no else 'y'
|
||||||
|
while True:
|
||||||
|
raw_reply = str(input(question + choices))
|
||||||
|
reply = raw_reply.lower().strip() or default_answer
|
||||||
|
if reply[0] == 'y':
|
||||||
|
return True
|
||||||
|
elif reply[0] == 'n':
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
print("Unrecognized input:", reply)
|
||||||
|
|
||||||
@ -7,8 +7,8 @@ import sys
|
|||||||
import warnings
|
import warnings
|
||||||
|
|
||||||
|
|
||||||
def print_diff(ABdiff: fs.FSDiff, version_info='count', indent=2,
|
def print_diff(ABdiff: fs.FSDiff, indent=2, indent_level=0, use_color=True,
|
||||||
indent_level=0, use_color=True, show_hashes=False):
|
show_hashes=False):
|
||||||
"""Pretty print an FSDiff object"""
|
"""Pretty print an FSDiff object"""
|
||||||
if use_color:
|
if use_color:
|
||||||
try:
|
try:
|
||||||
@ -67,7 +67,7 @@ def print_diff(ABdiff: fs.FSDiff, version_info='count', indent=2,
|
|||||||
_print_row('MOD', d.B, l)
|
_print_row('MOD', d.B, l)
|
||||||
|
|
||||||
|
|
||||||
def diff(store, filedir_path, version_info='count', show_hashes=False, use_color=True):
|
def diff(store, filedir_path, show_hashes=False, use_color=True):
|
||||||
"""Unwrapped diff command that prints a diff"""
|
"""Unwrapped diff command that prints a diff"""
|
||||||
if not os.path.exists(filedir_path):
|
if not os.path.exists(filedir_path):
|
||||||
raise FileNotFoundError(f"Cannot diff non-existent file or directory {filedir_path}")
|
raise FileNotFoundError(f"Cannot diff non-existent file or directory {filedir_path}")
|
||||||
@ -75,17 +75,11 @@ def diff(store, filedir_path, version_info='count', show_hashes=False, use_color
|
|||||||
# get the diff object
|
# get the diff object
|
||||||
fsdiff = store.diff(filedir_path)
|
fsdiff = store.diff(filedir_path)
|
||||||
|
|
||||||
print_diff(fsdiff, version_info=version_info, show_hashes=show_hashes, use_color=use_color)
|
print_diff(fsdiff, show_hashes=show_hashes, use_color=use_color)
|
||||||
|
|
||||||
|
|
||||||
@click.command()
|
@click.command()
|
||||||
@click.argument("path", default='.')
|
@click.argument("path", default='.')
|
||||||
@click.option(
|
|
||||||
"--version-info",
|
|
||||||
type=click.Choice(['count', 'details', 'none'], case_sensitive=False),
|
|
||||||
default='count',
|
|
||||||
help='How much info to display about file versions.',
|
|
||||||
)
|
|
||||||
@click.option(
|
@click.option(
|
||||||
'-H', "--show-hashes",
|
'-H', "--show-hashes",
|
||||||
is_flag=True,
|
is_flag=True,
|
||||||
@ -96,7 +90,7 @@ def diff(store, filedir_path, version_info='count', show_hashes=False, use_color
|
|||||||
is_flag=True,
|
is_flag=True,
|
||||||
help='If given, do not print any color output.',
|
help='If given, do not print any color output.',
|
||||||
)
|
)
|
||||||
def diff_cli(path, version_info, show_hashes, no_color):
|
def diff_cli(path, show_hashes, no_color):
|
||||||
"""Detect and describe changes to PATH
|
"""Detect and describe changes to PATH
|
||||||
|
|
||||||
PATH is a path to a file or directory inside an existing nancy store
|
PATH is a path to a file or directory inside an existing nancy store
|
||||||
|
|||||||
@ -2,10 +2,15 @@ import click
|
|||||||
|
|
||||||
from .. import store
|
from .. import store
|
||||||
|
|
||||||
|
from .common import confirm
|
||||||
|
from .diff import print_diff
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
def record(directory):
|
def record(directory, message, show_diff=True, show_hashes=False, use_color=True,
|
||||||
|
skip_confirm=False):
|
||||||
"""Unwrapped record command"""
|
"""Unwrapped record command"""
|
||||||
if not os.path.isdir(directory):
|
if not os.path.isdir(directory):
|
||||||
raise ValueError(f"Cannot record non-existent directory {directory}")
|
raise ValueError(f"Cannot record non-existent directory {directory}")
|
||||||
@ -16,12 +21,38 @@ def record(directory):
|
|||||||
else: # this is an existing store
|
else: # this is an existing store
|
||||||
s = store.Store(directory)
|
s = store.Store(directory)
|
||||||
|
|
||||||
s.record()
|
fsdiff = s.diff(directory)
|
||||||
|
|
||||||
|
if show_diff:
|
||||||
|
print_diff(fsdiff, show_hashes=show_hashes, use_color=use_color)
|
||||||
|
|
||||||
|
print('Message:', message)
|
||||||
|
|
||||||
|
if skip_confirm or confirm("Record the values above into the database?"):
|
||||||
|
s.record(fsdiff, message=message)
|
||||||
|
else:
|
||||||
|
print("Cancelled!")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
@click.command()
|
@click.command()
|
||||||
@click.argument("directory", default='.')
|
@click.argument("directory", default='.')
|
||||||
def record_cli(directory):
|
@click.option(
|
||||||
|
'-H', "--show-hashes",
|
||||||
|
is_flag=True,
|
||||||
|
help='If given, prepend each line in the diff with the new file hash (SHA256).',
|
||||||
|
)
|
||||||
|
@click.option(
|
||||||
|
"--no-color",
|
||||||
|
is_flag=True,
|
||||||
|
help='If given, do not print any color output.',
|
||||||
|
)
|
||||||
|
@click.option(
|
||||||
|
"-m", "--message",
|
||||||
|
type=str,
|
||||||
|
required=True,
|
||||||
|
help='A user-defined descriptive message for this recording operation.',
|
||||||
|
def record_cli(directory, show_hashes, no_color, message):
|
||||||
"""
|
"""
|
||||||
Initialize tracking or record changes to a tracked directory.
|
Initialize tracking or record changes to a tracked directory.
|
||||||
|
|
||||||
@ -30,5 +61,6 @@ def record_cli(directory):
|
|||||||
directory is part of an existing store, it will be updated and versions
|
directory is part of an existing store, it will be updated and versions
|
||||||
of any files changes since the last recording will be incremented.
|
of any files changes since the last recording will be incremented.
|
||||||
"""
|
"""
|
||||||
record(directory)
|
record(directory, message=message, show_hashes=show_hashes, use_color=not
|
||||||
|
no_color)
|
||||||
|
|
||||||
|
|||||||
@ -202,14 +202,10 @@ class Store:
|
|||||||
|
|
||||||
return fs.FSDiff.compute(recorded, current)
|
return fs.FSDiff.compute(recorded, current)
|
||||||
|
|
||||||
def record(self, message=None):
|
def record(self, diff, message=None):
|
||||||
with self.program('RECORD', message) as p:
|
with self.program('RECORD', message) as p:
|
||||||
|
for _, d in diff.flatten_tree():
|
||||||
d = self.diff(self.path)
|
pass
|
||||||
|
|
||||||
# select all dirs
|
|
||||||
|
|
||||||
# detect new and deleted files, and those that have changed type
|
|
||||||
|
|
||||||
# create entries for all directories if they do not yet exist (top
|
# create entries for all directories if they do not yet exist (top
|
||||||
# down)
|
# down)
|
||||||
@ -219,9 +215,6 @@ class Store:
|
|||||||
|
|
||||||
# update versions in nancy.db as appropriate
|
# update versions in nancy.db as appropriate
|
||||||
|
|
||||||
#p.unlink_file()
|
|
||||||
#p.record_file()
|
|
||||||
# all effected files
|
|
||||||
|
|
||||||
#@contextmanager
|
#@contextmanager
|
||||||
def run(
|
def run(
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user