From 5158560b4a0937fd74e1933352216fc56e3fdb37 Mon Sep 17 00:00:00 2001 From: Richie Adler Date: Mon, 22 Oct 2018 10:46:22 +0100 Subject: [PATCH] Support for Fossil VCS --- flit/vcs/__init__.py | 4 ++++ flit/vcs/fsl.py | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 flit/vcs/fsl.py diff --git a/flit/vcs/__init__.py b/flit/vcs/__init__.py index d7a9ec47..064d8e7c 100644 --- a/flit/vcs/__init__.py +++ b/flit/vcs/__init__.py @@ -3,6 +3,7 @@ from flit.common import VCSError from . import hg from . import git +from . import fsl def identify_vcs(directory: Path): directory = directory.resolve() @@ -11,5 +12,8 @@ def identify_vcs(directory: Path): return git if (p / '.hg').is_dir(): return hg + if ((p / '.fslckout').is_file() + or (p / '_FOSSIL_').is_file()): + return fsl raise VCSError("Directory does not appear to be in a VCS", directory) diff --git a/flit/vcs/fsl.py b/flit/vcs/fsl.py new file mode 100644 index 00000000..dfb642d9 --- /dev/null +++ b/flit/vcs/fsl.py @@ -0,0 +1,32 @@ +import os +from subprocess import check_output + +name = 'fossil' + +def find_repo_root(directory): + for p in [directory] + list(directory.parents): + if ((p / '.fslckout').is_file() + or (p / '_FOSSIL_').is_file()): + return p + +def _repo_paths_to_directory_paths(paths, directory): + # 'fossil ls' gives paths from repo root, which may not be our directory. + repo = find_repo_root(directory) + if directory != repo: + directory_in_repo = str(directory.relative_to(repo)) + os.sep + ix = len(directory_in_repo) + paths = [p[ix:] for p in paths + if os.path.normpath(p).startswith(directory_in_repo)] + return paths + + +def list_tracked_files(directory): + outb = check_output(['fossil', 'ls'], cwd=str(directory)) + paths = [os.fsdecode(l) for l in outb.strip().splitlines()] + return _repo_paths_to_directory_paths(paths, directory) + + +def list_untracked_deleted_files(directory): + outb = check_output(['fossil', 'extra'], cwd=str(directory)) + paths = [os.fsdecode(l) for l in outb.strip().splitlines()] + return _repo_paths_to_directory_paths(paths, directory)