Skip to content

Commit a7ab34d

Browse files
authored
Merge pull request #166 from timvink/parallel
Enable parallel processing
2 parents 5d014cc + c332bed commit a7ab34d

File tree

2 files changed

+69
-8
lines changed

2 files changed

+69
-8
lines changed

docs/options.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,3 +177,15 @@ git `blame.ignoreRevsFile`. This can be useful to ignore specific commits that a
177177
- git-revision-date-localized:
178178
ignored_commits_file: .git-blame-ignore-revs
179179
```
180+
181+
## `enable_parallel_processing`
182+
183+
Default is `true`. When enabled, the plugin will use `multiprocessing` to iterate through all site files in parallel. Disable if you encounter any errors (and open an issue!).
184+
185+
=== ":octicons-file-code-16: mkdocs.yml"
186+
187+
```yaml
188+
plugins:
189+
- git-revision-date-localized:
190+
enable_parallel_processing: True
191+
```

src/mkdocs_git_revision_date_localized_plugin/plugin.py

Lines changed: 57 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,16 @@
99
import re
1010
import os
1111
import time
12+
import multiprocessing
1213

1314
from mkdocs import __version__ as mkdocs_version
1415
from mkdocs.config import config_options
1516
from mkdocs.plugins import BasePlugin
1617
from mkdocs.structure.nav import Page
1718
from mkdocs.utils import copy_file
1819
from mkdocs.exceptions import ConfigurationError
20+
from mkdocs.config.defaults import MkDocsConfig
21+
from mkdocs.structure.files import Files
1922

2023
from mkdocs_git_revision_date_localized_plugin.util import Util
2124
from mkdocs_git_revision_date_localized_plugin.exclude import exclude
@@ -47,8 +50,14 @@ class GitRevisionDateLocalizedPlugin(BasePlugin):
4750
("strict", config_options.Type(bool, default=True)),
4851
("enable_git_follow", config_options.Type(bool, default=True)),
4952
("ignored_commits_file", config_options.Type(str, default=None)),
53+
("enable_parallel_processing", config_options.Type(bool, default=True)),
5054
)
5155

56+
def __init__(self):
57+
super().__init__()
58+
self.last_revision_commits = {}
59+
self.created_commits = {}
60+
5261
def on_config(self, config: config_options.Config, **kwargs) -> Dict[str, Any]:
5362
"""
5463
Determine which locale to use.
@@ -135,6 +144,42 @@ def on_config(self, config: config_options.Config, **kwargs) -> Dict[str, Any]:
135144

136145
return config
137146

147+
148+
def parallel_compute_commit_timestamps(self, files, docs_dir, is_first_commit=False):
149+
pool = multiprocessing.Pool(processes=min(10, multiprocessing.cpu_count()))
150+
results = []
151+
for file in files:
152+
if file.is_documentation_page():
153+
abs_src_path = os.path.join(docs_dir, file.src_uri)
154+
result = pool.apply_async(
155+
self.util.get_git_commit_timestamp, args=(abs_src_path, is_first_commit)
156+
)
157+
results.append((abs_src_path, result))
158+
pool.close()
159+
pool.join()
160+
if is_first_commit:
161+
for src_uri, result in results:
162+
self.created_commits[src_uri] = result.get()
163+
else:
164+
for src_uri, result in results:
165+
self.last_revision_commits[src_uri] = result.get()
166+
167+
def on_files(self, files: Files, config: MkDocsConfig):
168+
"""
169+
Compute commit timestamps for all files in parallel.
170+
"""
171+
if not self.config.get("enabled") or not self.config.get("enable_parallel_processing"):
172+
return
173+
# Some plugins like TechDocs/monorepo copies docs_dir to a tmp dir and we need the real git path.
174+
real_docs_dir = os.path.join(
175+
os.path.dirname(config["config_file_path"]), "docs"
176+
)
177+
if not self.last_revision_commits:
178+
self.parallel_compute_commit_timestamps(files=files, docs_dir=real_docs_dir, is_first_commit=False)
179+
if not self.created_commits:
180+
self.parallel_compute_commit_timestamps(files=files, docs_dir=real_docs_dir, is_first_commit=True)
181+
182+
138183
def on_page_markdown(self, markdown: str, page: Page, config: config_options.Config, files, **kwargs) -> str:
139184
"""
140185
Replace jinja2 tags in markdown and templates with the localized dates.
@@ -189,10 +234,12 @@ def on_page_markdown(self, markdown: str, page: Page, config: config_options.Con
189234
if getattr(page.file, "generated_by", None):
190235
last_revision_hash, last_revision_timestamp = "", int(time.time())
191236
else:
192-
last_revision_hash, last_revision_timestamp = self.util.get_git_commit_timestamp(
193-
path=page.file.abs_src_path,
194-
is_first_commit=False,
195-
)
237+
last_revision_hash, last_revision_timestamp = self.last_revision_commits.get(page.file.abs_src_path, (None, None))
238+
if last_revision_timestamp is None:
239+
last_revision_hash, last_revision_timestamp = self.util.get_git_commit_timestamp(
240+
path=page.file.abs_src_path,
241+
is_first_commit=False,
242+
)
196243

197244
# Last revision date
198245
revision_dates = self.util.get_date_formats_for_timestamp(
@@ -261,10 +308,12 @@ def on_page_markdown(self, markdown: str, page: Page, config: config_options.Con
261308
if getattr(page.file, "generated_by", None):
262309
first_revision_hash, first_revision_timestamp = "", int(time.time())
263310
else:
264-
first_revision_hash, first_revision_timestamp = self.util.get_git_commit_timestamp(
265-
path=page.file.abs_src_path,
266-
is_first_commit=True,
267-
)
311+
first_revision_hash, first_revision_timestamp = self.created_commits.get(page.file.abs_src_path, (None, None))
312+
if first_revision_timestamp is None:
313+
first_revision_hash, first_revision_timestamp = self.util.get_git_commit_timestamp(
314+
path=page.file.abs_src_path,
315+
is_first_commit=True,
316+
)
268317

269318
if first_revision_timestamp > last_revision_timestamp:
270319
# See also https://github.com/timvink/mkdocs-git-revision-date-localized-plugin/issues/111

0 commit comments

Comments
 (0)