Public Access
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
11ce99756c | ||
|
|
6149167ba2 | ||
|
|
014ab0b63f | ||
|
|
2a3ee1ec96 | ||
|
|
5d4968eb21 |
@@ -108,7 +108,8 @@ jobs:
|
|||||||
--repo "${{ github.repository }}" \
|
--repo "${{ github.repository }}" \
|
||||||
--run-id "${{ github.run_id }}" \
|
--run-id "${{ github.run_id }}" \
|
||||||
--workflow "build-images/build-and-push" \
|
--workflow "build-images/build-and-push" \
|
||||||
--commit "${{ github.sha }}"
|
--commit "${{ github.sha }}" \
|
||||||
|
--auto-login
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
needs: [build-and-push]
|
needs: [build-and-push]
|
||||||
|
|||||||
@@ -122,7 +122,8 @@ jobs:
|
|||||||
--repo "${{ github.repository }}" \
|
--repo "${{ github.repository }}" \
|
||||||
--run-id "${{ github.run_id }}" \
|
--run-id "${{ github.run_id }}" \
|
||||||
--workflow "post-merge/release" \
|
--workflow "post-merge/release" \
|
||||||
--commit "${{ github.sha }}"
|
--commit "${{ github.sha }}" \
|
||||||
|
--auto-login
|
||||||
|
|
||||||
publish:
|
publish:
|
||||||
needs: [release]
|
needs: [release]
|
||||||
@@ -160,7 +161,8 @@ jobs:
|
|||||||
--repo "${{ github.repository }}" \
|
--repo "${{ github.repository }}" \
|
||||||
--run-id "${{ github.run_id }}" \
|
--run-id "${{ github.run_id }}" \
|
||||||
--workflow "post-merge/publish" \
|
--workflow "post-merge/publish" \
|
||||||
--commit "${{ github.sha }}"
|
--commit "${{ github.sha }}" \
|
||||||
|
--auto-login
|
||||||
|
|
||||||
sync-wiki:
|
sync-wiki:
|
||||||
needs: [detect-type]
|
needs: [detect-type]
|
||||||
@@ -195,7 +197,8 @@ jobs:
|
|||||||
--repo "${{ github.repository }}" \
|
--repo "${{ github.repository }}" \
|
||||||
--run-id "${{ github.run_id }}" \
|
--run-id "${{ github.run_id }}" \
|
||||||
--workflow "post-merge/sync-wiki" \
|
--workflow "post-merge/sync-wiki" \
|
||||||
--commit "${{ github.sha }}"
|
--commit "${{ github.sha }}" \
|
||||||
|
--auto-login
|
||||||
|
|
||||||
badges:
|
badges:
|
||||||
needs: [detect-type]
|
needs: [detect-type]
|
||||||
@@ -235,7 +238,8 @@ jobs:
|
|||||||
--repo "${{ github.repository }}" \
|
--repo "${{ github.repository }}" \
|
||||||
--run-id "${{ github.run_id }}" \
|
--run-id "${{ github.run_id }}" \
|
||||||
--workflow "post-merge/badges" \
|
--workflow "post-merge/badges" \
|
||||||
--commit "${{ github.sha }}"
|
--commit "${{ github.sha }}" \
|
||||||
|
--auto-login
|
||||||
|
|
||||||
vikunja:
|
vikunja:
|
||||||
needs: [detect-type]
|
needs: [detect-type]
|
||||||
@@ -271,7 +275,8 @@ jobs:
|
|||||||
--repo "${{ github.repository }}" \
|
--repo "${{ github.repository }}" \
|
||||||
--run-id "${{ github.run_id }}" \
|
--run-id "${{ github.run_id }}" \
|
||||||
--workflow "post-merge/vikunja" \
|
--workflow "post-merge/vikunja" \
|
||||||
--commit "${{ github.sha }}"
|
--commit "${{ github.sha }}" \
|
||||||
|
--auto-login
|
||||||
|
|
||||||
configure-repo:
|
configure-repo:
|
||||||
needs: [detect-type]
|
needs: [detect-type]
|
||||||
@@ -304,4 +309,5 @@ jobs:
|
|||||||
--repo "${{ github.repository }}" \
|
--repo "${{ github.repository }}" \
|
||||||
--run-id "${{ github.run_id }}" \
|
--run-id "${{ github.run_id }}" \
|
||||||
--workflow "post-merge/configure-repo" \
|
--workflow "post-merge/configure-repo" \
|
||||||
--commit "${{ github.sha }}"
|
--commit "${{ github.sha }}" \
|
||||||
|
--auto-login
|
||||||
|
|||||||
@@ -2,6 +2,13 @@
|
|||||||
|
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
|
## [0.23.4] - 2026-06-27
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- Add --auto-login to all notify_failure calls in workflows
|
||||||
|
- Classify .gitea/** as user-facing for devx, support glob in user_facing_overrides
|
||||||
|
|
||||||
## [0.23.3] - 2026-06-27
|
## [0.23.3] - 2026-06-27
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|||||||
@@ -16,12 +16,12 @@ quality badges.
|
|||||||
|
|
||||||
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
||||||
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/src/branch/master/LICENSE)
|
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/src/branch/master/LICENSE)
|
||||||
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
||||||
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
||||||
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/wiki)
|
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/wiki)
|
||||||
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
||||||
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/releases)
|
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/releases)
|
||||||
[](https://www.python.org/downloads/)
|
[](https://www.python.org/downloads/)
|
||||||
|
|
||||||
## Why devx?
|
## Why devx?
|
||||||
|
|
||||||
|
|||||||
+6
-6
@@ -12,12 +12,12 @@ project to be reusable across all oblachno-oss repositories.
|
|||||||
|
|
||||||
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
||||||
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/src/branch/master/LICENSE)
|
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/src/branch/master/LICENSE)
|
||||||
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
||||||
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
||||||
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/wiki)
|
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/wiki)
|
||||||
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/actions)
|
||||||
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/releases)
|
[](https://git.oblachno.oblachno.fyi/oblachno-oss/devx/releases)
|
||||||
[](https://www.python.org/downloads/)
|
[](https://www.python.org/downloads/)
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
|
|||||||
+6
-2
@@ -139,8 +139,12 @@ infrastructure_overrides = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
# User-facing overrides — safety override for broad infrastructure patterns
|
# User-facing overrides — safety override for broad infrastructure patterns
|
||||||
# (empty — add when an infrastructure pattern is too broad)
|
# devx workflow files (.gitea/**) are reference implementations that
|
||||||
user_facing_overrides = []
|
# downstream repos (grm, infra) copy from. Changes to them affect how
|
||||||
|
# consumer projects run their CI, so they must trigger a release.
|
||||||
|
user_facing_overrides = [
|
||||||
|
".gitea/**",
|
||||||
|
]
|
||||||
|
|
||||||
# Tag patterns — additional categories for CI conditional execution
|
# Tag patterns — additional categories for CI conditional execution
|
||||||
# Orthogonal to release impact (user-facing vs infrastructure)
|
# Orthogonal to release impact (user-facing vs infrastructure)
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
"""devx — reusable development and CI/CD tools for oblachno-oss projects."""
|
"""devx — reusable development and CI/CD tools for oblachno-oss projects."""
|
||||||
|
|
||||||
__version__ = "0.23.3"
|
__version__ = "0.23.4"
|
||||||
|
|||||||
@@ -393,11 +393,12 @@ class ChangeClassifier:
|
|||||||
tags = self._compute_tags(file_path)
|
tags = self._compute_tags(file_path)
|
||||||
|
|
||||||
# 1. User-facing overrides (highest priority — safety)
|
# 1. User-facing overrides (highest priority — safety)
|
||||||
if file_path in self._user_overrides:
|
for pattern in self._user_overrides:
|
||||||
|
if _matches_glob(file_path, pattern):
|
||||||
return FileClassification(
|
return FileClassification(
|
||||||
path=file_path,
|
path=file_path,
|
||||||
is_user_facing=True,
|
is_user_facing=True,
|
||||||
reason="User-facing override (safety override)",
|
reason=f"User-facing override (matches '{pattern}')",
|
||||||
matched_rule="user_facing_overrides",
|
matched_rule="user_facing_overrides",
|
||||||
tags=tags,
|
tags=tags,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -264,6 +264,16 @@ class TestChangeClassifier:
|
|||||||
assert fc.is_user_facing
|
assert fc.is_user_facing
|
||||||
assert fc.matched_rule == "user_facing_overrides"
|
assert fc.matched_rule == "user_facing_overrides"
|
||||||
|
|
||||||
|
def test_user_facing_override_glob_matches_nested(self) -> None:
|
||||||
|
"""User-facing overrides support glob patterns like infrastructure."""
|
||||||
|
classifier = self._make_classifier(
|
||||||
|
infrastructure=[".gitea/**"],
|
||||||
|
user_facing_overrides=[".gitea/**"],
|
||||||
|
)
|
||||||
|
fc = classifier.classify_file(".gitea/workflows/ci.yml")
|
||||||
|
assert fc.is_user_facing
|
||||||
|
assert fc.matched_rule == "user_facing_overrides"
|
||||||
|
|
||||||
def test_user_facing_override_beats_infrastructure_override(self) -> None:
|
def test_user_facing_override_beats_infrastructure_override(self) -> None:
|
||||||
"""User-facing overrides beat infrastructure overrides (safety first)."""
|
"""User-facing overrides beat infrastructure overrides (safety first)."""
|
||||||
classifier = self._make_classifier(
|
classifier = self._make_classifier(
|
||||||
@@ -489,7 +499,7 @@ class TestMain:
|
|||||||
@patch("devx.ci.classify_changes.get_changed_files")
|
@patch("devx.ci.classify_changes.get_changed_files")
|
||||||
@patch("devx.ci.classify_changes.get_latest_tag", return_value="v0.3.0")
|
@patch("devx.ci.classify_changes.get_latest_tag", return_value="v0.3.0")
|
||||||
def test_workflow_only_exits_2(self, mock_tag: MagicMock, mock_changes: MagicMock) -> None:
|
def test_workflow_only_exits_2(self, mock_tag: MagicMock, mock_changes: MagicMock) -> None:
|
||||||
mock_changes.return_value = [".gitea/workflows/ci.yml", "docs/index.md"]
|
mock_changes.return_value = ["docs/index.md", "README.md"]
|
||||||
runner = CliRunner()
|
runner = CliRunner()
|
||||||
result = runner.invoke(main, [])
|
result = runner.invoke(main, [])
|
||||||
assert result.exit_code == 2
|
assert result.exit_code == 2
|
||||||
@@ -572,7 +582,7 @@ class TestMain:
|
|||||||
@patch("devx.ci.classify_changes.get_changed_files")
|
@patch("devx.ci.classify_changes.get_changed_files")
|
||||||
@patch("devx.ci.classify_changes.get_latest_tag", return_value="v0.3.0")
|
@patch("devx.ci.classify_changes.get_latest_tag", return_value="v0.3.0")
|
||||||
def test_quiet_workflow_only(self, mock_tag: MagicMock, mock_changes: MagicMock) -> None:
|
def test_quiet_workflow_only(self, mock_tag: MagicMock, mock_changes: MagicMock) -> None:
|
||||||
mock_changes.return_value = [".gitea/workflows/ci.yml"]
|
mock_changes.return_value = ["docs/index.md"]
|
||||||
runner = CliRunner()
|
runner = CliRunner()
|
||||||
result = runner.invoke(main, ["--quiet"])
|
result = runner.invoke(main, ["--quiet"])
|
||||||
assert result.exit_code == 0
|
assert result.exit_code == 0
|
||||||
@@ -631,7 +641,7 @@ class TestMain:
|
|||||||
@patch("devx.ci.classify_changes.get_changed_files")
|
@patch("devx.ci.classify_changes.get_changed_files")
|
||||||
@patch("devx.ci.classify_changes.get_latest_tag", return_value="v0.3.0")
|
@patch("devx.ci.classify_changes.get_latest_tag", return_value="v0.3.0")
|
||||||
def test_check_user_facing_false(self, mock_tag: MagicMock, mock_changes: MagicMock) -> None:
|
def test_check_user_facing_false(self, mock_tag: MagicMock, mock_changes: MagicMock) -> None:
|
||||||
mock_changes.return_value = [".gitea/workflows/ci.yml", "tests/test_foo.py"]
|
mock_changes.return_value = ["docs/index.md", "tests/test_foo.py"]
|
||||||
runner = CliRunner()
|
runner = CliRunner()
|
||||||
result = runner.invoke(main, ["--check", "user-facing", "--quiet"])
|
result = runner.invoke(main, ["--check", "user-facing", "--quiet"])
|
||||||
assert result.exit_code == 0
|
assert result.exit_code == 0
|
||||||
|
|||||||
Reference in New Issue
Block a user