Skip to content

Commit b6273c7

Browse files
authored
Merge pull request #66 from mxstack/fix/write-only-existing-sources
Fix issue #65: Check source directories exist before writing to requirements
2 parents 3154e36 + e3d228e commit b6273c7

File tree

5 files changed

+452
-226
lines changed

5 files changed

+452
-226
lines changed

.claude/settings.local.json

Lines changed: 0 additions & 17 deletions
This file was deleted.

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,4 @@ requirements-mxdev.txt
1919
.venv/
2020
dist/
2121
src/mxdev/_version.py
22+
.claude

CHANGES.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
## 5.0.1 (unreleased)
44

5+
- Fix #65: Check source directories exist before writing to requirements-mxdev.txt. In **offline mode**: missing sources log WARNING and are written as comments (expected behavior). In **non-offline mode**: missing sources log ERROR and mxdev exits with RuntimeError (fatal error indicating checkout failure). This fixes mxmake two-stage installation workflow and prevents silent failures when sources fail to check out.
6+
[jensens]
57
- Fix: Add 'synchronize' event to pull_request workflow triggers. This ensures CI runs when PRs are updated with new commits (e.g., after rebasing or pushing new changes), not just when opened or reopened.
68
[jensens]
79
- Chore: Optimize GitHub Actions to prevent duplicate workflow runs on pull requests. Restrict `push` trigger to only run on `main` branch, so PRs only trigger via `pull_request` event. This reduces CI resource usage by 50% for PR workflows.

src/mxdev/processing.py

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -210,26 +210,70 @@ def fetch(state: State) -> None:
210210
)
211211

212212

213-
def write_dev_sources(fio, packages: dict[str, dict[str, typing.Any]]):
213+
def write_dev_sources(fio, packages: dict[str, dict[str, typing.Any]], state: State):
214214
"""Create requirements configuration for fetched source packages."""
215215
if not packages:
216216
return
217+
218+
# Check if we're in offline mode or no-fetch mode
219+
from .config import to_bool
220+
221+
offline_mode = to_bool(state.configuration.settings.get("offline", False))
222+
missing_sources = [] # Track missing sources for error handling
223+
217224
fio.write("#" * 79 + "\n")
218225
fio.write("# mxdev development sources\n")
226+
219227
for name, package in packages.items():
220228
if package["install-mode"] == "skip":
221229
continue
230+
231+
# Check if source directory exists
232+
source_path = Path(package["path"])
233+
222234
extras = f"[{package['extras']}]" if package["extras"] else ""
223235
subdir = f"/{package['subdirectory']}" if package["subdirectory"] else ""
224236

225237
# Add -e prefix only for 'editable' mode (not for 'fixed')
226238
prefix = "-e " if package["install-mode"] == "editable" else ""
227-
install_line = f"""{prefix}./{package['target']}/{name}{subdir}{extras}\n"""
239+
install_line = f"""{prefix}./{package['target']}/{name}{subdir}{extras}"""
240+
241+
if not source_path.exists():
242+
# Source not checked out yet - write as comment
243+
missing_sources.append(name)
244+
245+
if offline_mode:
246+
# In offline mode, missing sources are expected - log as WARNING
247+
reason = (
248+
f"Source directory does not exist: {source_path} (package: {name}). "
249+
f"This is expected in offline mode. Run mxdev without -n and --offline flags to fetch sources."
250+
)
251+
logger.warning(reason)
252+
else:
253+
# In non-offline mode, missing sources are a fatal error - log as ERROR
254+
reason = (
255+
f"Source directory does not exist: {source_path} (package: {name}). "
256+
f"This indicates a failure in the checkout process. "
257+
f"Run mxdev without -n flag to fetch sources."
258+
)
259+
logger.error(reason)
260+
261+
fio.write(f"# {install_line} # mxdev: source not checked out\n")
262+
else:
263+
# Source exists - write normally
264+
logger.debug(f"-> {install_line}")
265+
fio.write(f"{install_line}\n")
228266

229-
logger.debug(f"-> {install_line.strip()}")
230-
fio.write(install_line)
231267
fio.write("\n\n")
232268

269+
# In non-offline mode, missing sources are a fatal error
270+
if not offline_mode and missing_sources:
271+
raise RuntimeError(
272+
f"Source directories missing for packages: {', '.join(missing_sources)}. "
273+
f"This indicates a failure in the checkout process. "
274+
f"Run mxdev without -n flag to fetch sources."
275+
)
276+
233277

234278
def write_dev_overrides(fio, overrides: dict[str, str], package_keys: list[str]):
235279
"""Create requirements configuration for overridden packages."""
@@ -292,6 +336,6 @@ def write(state: State) -> None:
292336
fio.write("#" * 79 + "\n")
293337
fio.write("# mxdev combined constraints\n")
294338
fio.write(f"-c {constraints_ref}\n\n")
295-
write_dev_sources(fio, cfg.packages)
339+
write_dev_sources(fio, cfg.packages, state)
296340
fio.writelines(requirements)
297341
write_main_package(fio, cfg.settings)

0 commit comments

Comments
 (0)