sync.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import argparse
  2. import re
  3. import subprocess
  4. import sys
  5. import symuid
  6. def _generate_uuid():
  7. return subprocess.check_output(['uuid', '-v', '4', '-F', 'BIN']).strip()
  8. def _log_path(track_path, msg, stream=sys.stdout):
  9. stream.write("{!r}: {}\n".format(track_path, msg))
  10. def _log_path_error(track_path, msg):
  11. _log_path(track_path, msg, stream=sys.stderr)
  12. def sync(path, path_ignore_regex, show_ignored=False):
  13. for track in symuid.Track.walk(
  14. root_path=path,
  15. path_ignore_regex=path_ignore_regex,
  16. ignored_cb=lambda p: show_ignored and _log_path(p, 'ignored'),
  17. unsupported_cb=lambda p, e:
  18. _log_path_error(p, 'unsupported type, skipped'),
  19. ):
  20. if track.get_uuid() is None:
  21. track.assign_uuid(_generate_uuid())
  22. _log_path(track.path, 'assigned uuid {!r}'.format(
  23. track.get_uuid()))
  24. def _init_argparser():
  25. argparser = argparse.ArgumentParser(description=None)
  26. argparser.add_argument('path')
  27. argparser.add_argument(
  28. '--path-ignore-regex',
  29. default=symuid.Track.PATH_DEFAULT_IGNORE_REGEX,
  30. nargs=1,
  31. metavar='pattern',
  32. dest='path_ignore_regex',
  33. type=re.compile,
  34. help='(default: %(default)s)',
  35. )
  36. argparser.add_argument(
  37. '--show-ignored',
  38. action='store_true',
  39. )
  40. return argparser
  41. def _main():
  42. argparser = _init_argparser()
  43. args = argparser.parse_args()
  44. sync(**vars(args))