From 0df76fa3861b1de2ee3a83efd96e591e788175be Mon Sep 17 00:00:00 2001 From: gigaclank Date: Thu, 28 Aug 2025 16:56:21 +0100 Subject: [PATCH 1/9] updated to add in testing --- .gitignore | 2 ++ mike/git_utils.py | 8 ++++++++ requirments.txt | 22 ++++++++++++++++++++++ setup.py | 2 +- test/data/directory_ignored/.gitignore | 1 + test/data/directory_ignored/file.txt | 1 + test/data/directory_ignored/ignoreme | 0 test/unit/test_git_utils.py | 17 +++++++++++++++-- 8 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 requirments.txt create mode 100644 test/data/directory_ignored/.gitignore create mode 100644 test/data/directory_ignored/file.txt create mode 100644 test/data/directory_ignored/ignoreme diff --git a/.gitignore b/.gitignore index c1c936e..1c77c05 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,5 @@ /dist/ /htmlcov/ /test/stage/ +.venv +.idea \ No newline at end of file diff --git a/mike/git_utils.py b/mike/git_utils.py index 54fac2e..0139f46 100644 --- a/mike/git_utils.py +++ b/mike/git_utils.py @@ -8,6 +8,7 @@ import unicodedata from enum import Enum +from gitignore_parser import parse_gitignore BranchStatus = Enum('BranchState', ['even', 'ahead', 'behind', 'diverged']) @@ -408,11 +409,18 @@ def walk_files(branch, path=''): def walk_real_files(srcdir): + gitignore = parse_gitignore(os.path.join(srcdir, '.gitignore')) if os.path.isfile(os.path.join(srcdir, '.gitignore')) else None for path, dirs, filenames in os.walk(srcdir): + if gitignore is not None: + if gitignore(path) is True: + continue if '.git' in dirs: dirs.remove('.git') for f in filenames: filepath = os.path.join(path, f) + if gitignore is not None: + if gitignore(filepath) is True: + continue mode = 0o100755 if os.access(filepath, os.X_OK) else 0o100644 with open(filepath, 'rb') as fd: data = fd.read() diff --git a/requirments.txt b/requirments.txt new file mode 100644 index 0000000..3d07264 --- /dev/null +++ b/requirments.txt @@ -0,0 +1,22 @@ +click==8.2.1 +ghp-import==2.1.0 +gitignore_parser==0.1.13 +importlib_metadata==8.7.0 +importlib_resources==6.5.2 +Jinja2==3.1.6 +Markdown==3.8.2 +MarkupSafe==3.0.2 +mergedeep==1.3.4 +mkdocs==1.6.1 +mkdocs-get-deps==0.2.0 +packaging==25.0 +pathspec==0.12.1 +platformdirs==4.4.0 +pyparsing==3.2.3 +python-dateutil==2.9.0.post0 +PyYAML==6.0.2 +pyyaml_env_tag==1.1 +six==1.17.0 +verspec==0.1.0 +watchdog==6.0.0 +zipp==3.23.0 diff --git a/setup.py b/setup.py index 1ebfb37..6669bcf 100644 --- a/setup.py +++ b/setup.py @@ -89,7 +89,7 @@ def run(self): install_requires=(['importlib_metadata', 'importlib_resources', 'jinja2 >= 2.7', 'mkdocs >= 1.0', 'pyparsing >= 3.0', - 'pyyaml >= 5.1', 'pyyaml_env_tag', 'verspec']), + 'pyyaml >= 5.1', 'pyyaml_env_tag', 'verspec', 'gitignore-parser>= 0.1.13 ']), extras_require={ 'dev': ['coverage', 'flake8 >= 3.0', 'flake8-quotes', 'shtab'], 'test': ['coverage', 'flake8 >= 3.0', 'flake8-quotes', 'shtab'], diff --git a/test/data/directory_ignored/.gitignore b/test/data/directory_ignored/.gitignore new file mode 100644 index 0000000..f4ee7b5 --- /dev/null +++ b/test/data/directory_ignored/.gitignore @@ -0,0 +1 @@ +ignoreme \ No newline at end of file diff --git a/test/data/directory_ignored/file.txt b/test/data/directory_ignored/file.txt new file mode 100644 index 0000000..c7c7da3 --- /dev/null +++ b/test/data/directory_ignored/file.txt @@ -0,0 +1 @@ +hello there diff --git a/test/data/directory_ignored/ignoreme b/test/data/directory_ignored/ignoreme new file mode 100644 index 0000000..e69de29 diff --git a/test/unit/test_git_utils.py b/test/unit/test_git_utils.py index 89ae661..4d7e3b9 100644 --- a/test/unit/test_git_utils.py +++ b/test/unit/test_git_utils.py @@ -796,10 +796,9 @@ def test_nonexistent(self): class TestWalkRealFiles(unittest.TestCase): mode = 0o100755 if sys.platform == 'win32' else 0o100644 - def setUp(self): - self.directory = os.path.join(test_data_dir, 'directory') def test_walk(self): + self.directory = os.path.join(test_data_dir, 'directory') files = sorted(git_utils.walk_real_files(self.directory), key=lambda x: x.path) @@ -808,3 +807,17 @@ def test_walk(self): data = f.read() self.assertEqual(files, [git_utils.FileInfo(path, data, self.mode)]) + + def test_walk_ignore(self): + self.directory = os.path.join(test_data_dir, 'directory_ignored') + files = sorted(git_utils.walk_real_files(self.directory), + key=lambda x: x.path) + print(files) + path = os.path.join(self.directory, 'file.txt') + with open(path, 'rb') as f: + data = f.read() + path2 = os.path.join(self.directory, '.gitignore') + with open(path2, 'rb') as f: + data2 = f.read() + self.assertEqual(files, [git_utils.FileInfo(path2, data2, self.mode),git_utils.FileInfo(path, data, self.mode)]) + From a01e97fad0bed2c3ca2db346a23d3cee85d906b5 Mon Sep 17 00:00:00 2001 From: gigaclank Date: Thu, 28 Aug 2025 17:24:55 +0100 Subject: [PATCH 2/9] updated --- mike/commands.py | 2 +- mike/driver.py | 2 ++ mike/git_utils.py | 9 +++++---- test/unit/test_git_utils.py | 9 ++++----- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/mike/commands.py b/mike/commands.py index 6ed1ef0..33d6e71 100644 --- a/mike/commands.py +++ b/mike/commands.py @@ -93,7 +93,7 @@ def deploy(cfg, version, title=None, aliases=[], update_aliases=False, with git_utils.Commit(branch, message, allow_empty=allow_empty) as commit: commit.delete_files([destdir] + alias_destdirs) - for f in git_utils.walk_real_files(cfg['site_dir']): + for f in git_utils.walk_real_files(cfg['top_dir'],cfg['site_dir']): canonical_file = f.copy(destdir, cfg['site_dir']) commit.add_file(canonical_file) for d in alias_destdirs: diff --git a/mike/driver.py b/mike/driver.py index 8ad0465..ed904ff 100644 --- a/mike/driver.py +++ b/mike/driver.py @@ -152,6 +152,7 @@ def maybe_set(args, cfg, field, cfg_field=None): maybe_set(args, plugin.config, 'alias_type') maybe_set(args, plugin.config, 'template', 'redirect_template') maybe_set(args, plugin.config, 'deploy_prefix') + maybe_set(args, plugin.config, 'top_dir') return cfg except FileNotFoundError as e: if strict: @@ -161,6 +162,7 @@ def maybe_set(args, cfg, field, cfg_field=None): maybe_set(args, plugin.config, 'alias_type') maybe_set(args, plugin.config, 'template', 'redirect_template') maybe_set(args, plugin.config, 'deploy_prefix') + maybe_set(args, plugin.config, 'top_dir') if args.branch is None or args.remote is None: raise FileNotFoundError( '{}; pass --config-file or set --remote/--branch explicitly' diff --git a/mike/git_utils.py b/mike/git_utils.py index 0139f46..1e651c6 100644 --- a/mike/git_utils.py +++ b/mike/git_utils.py @@ -317,8 +317,8 @@ def finish(self): if self._pipe.wait() != 0: raise GitCommitError(self._stderr.decode('utf-8')) - if ( not self._allow_empty - and is_commit_empty(get_latest_commit(self._branch)) ): + if (not self._allow_empty + and is_commit_empty(get_latest_commit(self._branch))): delete_latest_commit(self._branch) raise GitEmptyCommit() @@ -408,8 +408,9 @@ def walk_files(branch, path=''): .format(branch=branch, path=gpath)) -def walk_real_files(srcdir): - gitignore = parse_gitignore(os.path.join(srcdir, '.gitignore')) if os.path.isfile(os.path.join(srcdir, '.gitignore')) else None +def walk_real_files(topdir, srcdir): + gitignore = parse_gitignore(os.path.join(topdir, '.gitignore')) if os.path.isfile( + os.path.join(topdir, '.gitignore')) else None for path, dirs, filenames in os.walk(srcdir): if gitignore is not None: if gitignore(path) is True: diff --git a/test/unit/test_git_utils.py b/test/unit/test_git_utils.py index 4d7e3b9..8f097bc 100644 --- a/test/unit/test_git_utils.py +++ b/test/unit/test_git_utils.py @@ -796,10 +796,9 @@ def test_nonexistent(self): class TestWalkRealFiles(unittest.TestCase): mode = 0o100755 if sys.platform == 'win32' else 0o100644 - def test_walk(self): self.directory = os.path.join(test_data_dir, 'directory') - files = sorted(git_utils.walk_real_files(self.directory), + files = sorted(git_utils.walk_real_files(self.directory, self.directory), key=lambda x: x.path) path = os.path.join(self.directory, 'file.txt') @@ -810,7 +809,7 @@ def test_walk(self): def test_walk_ignore(self): self.directory = os.path.join(test_data_dir, 'directory_ignored') - files = sorted(git_utils.walk_real_files(self.directory), + files = sorted(git_utils.walk_real_files(self.directory, self.directory), key=lambda x: x.path) print(files) path = os.path.join(self.directory, 'file.txt') @@ -819,5 +818,5 @@ def test_walk_ignore(self): path2 = os.path.join(self.directory, '.gitignore') with open(path2, 'rb') as f: data2 = f.read() - self.assertEqual(files, [git_utils.FileInfo(path2, data2, self.mode),git_utils.FileInfo(path, data, self.mode)]) - + self.assertEqual(files, + [git_utils.FileInfo(path2, data2, self.mode), git_utils.FileInfo(path, data, self.mode)]) From 462ca481c1ac73c339b222ee05262fbde8174dc8 Mon Sep 17 00:00:00 2001 From: gigaclank Date: Thu, 28 Aug 2025 17:33:23 +0100 Subject: [PATCH 3/9] Updated to allow change of git ignore dir --- mike/mkdocs_plugin.py | 2 ++ test/data/directory_ignored/.gitignore | 2 +- test/data/directory_ignored/ignoreme | 0 test/unit/test_git_utils.py | 9 ++------- 4 files changed, 5 insertions(+), 8 deletions(-) delete mode 100644 test/data/directory_ignored/ignoreme diff --git a/mike/mkdocs_plugin.py b/mike/mkdocs_plugin.py index 2b80482..1063507 100644 --- a/mike/mkdocs_plugin.py +++ b/mike/mkdocs_plugin.py @@ -43,6 +43,8 @@ def default(cls): def on_config(self, config): version = os.environ.get(docs_version_var) + if 'top_dir' not in config: + config['top_dir'] = os.getcwd() if version and config.get('site_url'): if self.config['canonical_version'] is not None: version = self.config['canonical_version'] diff --git a/test/data/directory_ignored/.gitignore b/test/data/directory_ignored/.gitignore index f4ee7b5..4c33073 100644 --- a/test/data/directory_ignored/.gitignore +++ b/test/data/directory_ignored/.gitignore @@ -1 +1 @@ -ignoreme \ No newline at end of file +file.txt \ No newline at end of file diff --git a/test/data/directory_ignored/ignoreme b/test/data/directory_ignored/ignoreme deleted file mode 100644 index e69de29..0000000 diff --git a/test/unit/test_git_utils.py b/test/unit/test_git_utils.py index 8f097bc..92424e5 100644 --- a/test/unit/test_git_utils.py +++ b/test/unit/test_git_utils.py @@ -811,12 +811,7 @@ def test_walk_ignore(self): self.directory = os.path.join(test_data_dir, 'directory_ignored') files = sorted(git_utils.walk_real_files(self.directory, self.directory), key=lambda x: x.path) - print(files) - path = os.path.join(self.directory, 'file.txt') + path = os.path.join(self.directory, '.gitignore') with open(path, 'rb') as f: data = f.read() - path2 = os.path.join(self.directory, '.gitignore') - with open(path2, 'rb') as f: - data2 = f.read() - self.assertEqual(files, - [git_utils.FileInfo(path2, data2, self.mode), git_utils.FileInfo(path, data, self.mode)]) + self.assertEqual(files,[git_utils.FileInfo(path, data, self.mode)]) From c94ed90d903dda0e7ad25122e8e11154ef7c3833 Mon Sep 17 00:00:00 2001 From: gigaclank Date: Mon, 1 Sep 2025 08:46:28 +0100 Subject: [PATCH 4/9] updated to use cwd for dir of gitignore --- mike/commands.py | 2 +- mike/git_utils.py | 6 +++--- mike/mkdocs_plugin.py | 2 -- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/mike/commands.py b/mike/commands.py index 33d6e71..6ed1ef0 100644 --- a/mike/commands.py +++ b/mike/commands.py @@ -93,7 +93,7 @@ def deploy(cfg, version, title=None, aliases=[], update_aliases=False, with git_utils.Commit(branch, message, allow_empty=allow_empty) as commit: commit.delete_files([destdir] + alias_destdirs) - for f in git_utils.walk_real_files(cfg['top_dir'],cfg['site_dir']): + for f in git_utils.walk_real_files(cfg['site_dir']): canonical_file = f.copy(destdir, cfg['site_dir']) commit.add_file(canonical_file) for d in alias_destdirs: diff --git a/mike/git_utils.py b/mike/git_utils.py index 1e651c6..6000010 100644 --- a/mike/git_utils.py +++ b/mike/git_utils.py @@ -408,9 +408,9 @@ def walk_files(branch, path=''): .format(branch=branch, path=gpath)) -def walk_real_files(topdir, srcdir): - gitignore = parse_gitignore(os.path.join(topdir, '.gitignore')) if os.path.isfile( - os.path.join(topdir, '.gitignore')) else None +def walk_real_files(srcdir, topdir=os.getcwd()): + gitignore = parse_gitignore(os.path.join(topdir,'.gitignore')) if os.path.isfile( + os.path.join(topdir,'.gitignore')) else None for path, dirs, filenames in os.walk(srcdir): if gitignore is not None: if gitignore(path) is True: diff --git a/mike/mkdocs_plugin.py b/mike/mkdocs_plugin.py index 1063507..2b80482 100644 --- a/mike/mkdocs_plugin.py +++ b/mike/mkdocs_plugin.py @@ -43,8 +43,6 @@ def default(cls): def on_config(self, config): version = os.environ.get(docs_version_var) - if 'top_dir' not in config: - config['top_dir'] = os.getcwd() if version and config.get('site_url'): if self.config['canonical_version'] is not None: version = self.config['canonical_version'] From 2045efeb283dd59f9926297e76079a2c36483254 Mon Sep 17 00:00:00 2001 From: gigaclank Date: Mon, 1 Sep 2025 08:48:36 +0100 Subject: [PATCH 5/9] debug print use of gitignore --- mike/git_utils.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mike/git_utils.py b/mike/git_utils.py index 6000010..b4d60b8 100644 --- a/mike/git_utils.py +++ b/mike/git_utils.py @@ -409,8 +409,10 @@ def walk_files(branch, path=''): def walk_real_files(srcdir, topdir=os.getcwd()): - gitignore = parse_gitignore(os.path.join(topdir,'.gitignore')) if os.path.isfile( - os.path.join(topdir,'.gitignore')) else None + gitignorepath=os.path.join(topdir,'.gitignore') + gitignore = parse_gitignore(gitignorepath) if os.path.isfile(gitignorepath) else None + if gitignore is not None: + print(f"Using Gitignore: {gitignorepath}") for path, dirs, filenames in os.walk(srcdir): if gitignore is not None: if gitignore(path) is True: From 69d73a784aabbcaf1cebf132468fae07fa6b73d4 Mon Sep 17 00:00:00 2001 From: gigaclank Date: Mon, 1 Sep 2025 10:44:31 +0100 Subject: [PATCH 6/9] added in debug to see what does get added --- mike/commands.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mike/commands.py b/mike/commands.py index 6ed1ef0..c1313fc 100644 --- a/mike/commands.py +++ b/mike/commands.py @@ -96,6 +96,7 @@ def deploy(cfg, version, title=None, aliases=[], update_aliases=False, for f in git_utils.walk_real_files(cfg['site_dir']): canonical_file = f.copy(destdir, cfg['site_dir']) commit.add_file(canonical_file) + print(f"Adding {f.path}") for d in alias_destdirs: alias_file = f.copy(d, cfg['site_dir']) if alias_type == AliasType.redirect: From afa57de54f027731f7242c9e14056b2b7bd7e57b Mon Sep 17 00:00:00 2001 From: gigaclank Date: Mon, 1 Sep 2025 10:49:21 +0100 Subject: [PATCH 7/9] added in debug to see what does get added --- mike/git_utils.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mike/git_utils.py b/mike/git_utils.py index b4d60b8..39d8078 100644 --- a/mike/git_utils.py +++ b/mike/git_utils.py @@ -416,15 +416,19 @@ def walk_real_files(srcdir, topdir=os.getcwd()): for path, dirs, filenames in os.walk(srcdir): if gitignore is not None: if gitignore(path) is True: + print(f"Ignoring: {path}",file=sys.stderr) continue if '.git' in dirs: dirs.remove('.git') for f in filenames: + filepath = os.path.join(path, f) if gitignore is not None: if gitignore(filepath) is True: + print(f"Ignoring: {path}",file=sys.stderr) continue mode = 0o100755 if os.access(filepath, os.X_OK) else 0o100644 with open(filepath, 'rb') as fd: data = fd.read() + yield FileInfo(filepath, data, mode) From c6abe5cdd27f215c6530dc4d2fca2d15dc202d94 Mon Sep 17 00:00:00 2001 From: gigaclank Date: Mon, 1 Sep 2025 10:50:46 +0100 Subject: [PATCH 8/9] added in debug to see what does get added --- mike/git_utils.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mike/git_utils.py b/mike/git_utils.py index 39d8078..2f92bed 100644 --- a/mike/git_utils.py +++ b/mike/git_utils.py @@ -414,10 +414,10 @@ def walk_real_files(srcdir, topdir=os.getcwd()): if gitignore is not None: print(f"Using Gitignore: {gitignorepath}") for path, dirs, filenames in os.walk(srcdir): - if gitignore is not None: - if gitignore(path) is True: - print(f"Ignoring: {path}",file=sys.stderr) - continue + # if gitignore is not None: + # if gitignore(path) is True: + # print(f"Ignoring: {path}",file=sys.stderr) + # continue if '.git' in dirs: dirs.remove('.git') for f in filenames: From 0f8a802ff06972b9b1ba7be87ede1fbbc647c43d Mon Sep 17 00:00:00 2001 From: gigaclank Date: Mon, 1 Sep 2025 10:51:53 +0100 Subject: [PATCH 9/9] saved files --- mike/driver.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/mike/driver.py b/mike/driver.py index ed904ff..8ad0465 100644 --- a/mike/driver.py +++ b/mike/driver.py @@ -152,7 +152,6 @@ def maybe_set(args, cfg, field, cfg_field=None): maybe_set(args, plugin.config, 'alias_type') maybe_set(args, plugin.config, 'template', 'redirect_template') maybe_set(args, plugin.config, 'deploy_prefix') - maybe_set(args, plugin.config, 'top_dir') return cfg except FileNotFoundError as e: if strict: @@ -162,7 +161,6 @@ def maybe_set(args, cfg, field, cfg_field=None): maybe_set(args, plugin.config, 'alias_type') maybe_set(args, plugin.config, 'template', 'redirect_template') maybe_set(args, plugin.config, 'deploy_prefix') - maybe_set(args, plugin.config, 'top_dir') if args.branch is None or args.remote is None: raise FileNotFoundError( '{}; pass --config-file or set --remote/--branch explicitly'