Skip to content
This repository was archived by the owner on Jun 7, 2026. It is now read-only.

Commit 676a615

Browse files
committed
Warn when content page is missing ID attribute
1 parent 3eb6a2d commit 676a615

3 files changed

Lines changed: 19 additions & 9 deletions

File tree

src/service/project_issue.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ namespace service {
4040
{ProjectError::INVALID_RESLOC, "invalid_resloc"},
4141
{ProjectError::INVALID_VERSION_BRANCH, "invalid_version_branch"},
4242
{ProjectError::MISSING_PLATFORM_PROJECT, "missing_platform_project"},
43-
{ProjectError::NO_PAGE_TITLE, "no_page_title"}
43+
{ProjectError::NO_PAGE_TITLE, "no_page_title"},
44+
{ProjectError::MISSING_REQUIRED_ATTRIBUTE, "missing_required_attribute"}
4445
)
4546
// clang-format on
4647

src/service/project_issue.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ namespace service {
2121
INVALID_META, INVALID_PAGE,
2222
DUPLICATE_PAGE, UNKNOWN_RECIPE_TYPE, INVALID_INGREDIENT,
2323
INVALID_FILE, INVALID_FORMAT, INVALID_RESLOC, INVALID_VERSION_BRANCH,
24-
MISSING_PLATFORM_PROJECT, NO_PAGE_TITLE,
24+
MISSING_PLATFORM_PROJECT, NO_PAGE_TITLE, MISSING_REQUIRED_ATTRIBUTE,
2525
UNKNOWN
2626
};
2727
// clang-format on

src/service/storage/deployment.cc

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,28 +54,37 @@ Error copyProjectFiles(const fs::path &root, const fs::path &docsRoot, const fs:
5454
}
5555

5656
namespace service {
57-
void validatePageFile(const FileTreeEntry &entry, const ResolvedProject &resolved, ProjectIssueCallback &issues) {
57+
void validatePageFile(const FileTreeEntry &entry, const ResolvedProject &resolved, ProjectIssueCallback &issues,
58+
const std::vector<std::string> &requiredAttributes) {
5859
const auto path = entry.path + DOCS_FILE_EXT;
5960
if (const auto title = resolved.getPageTitle(path); !title) {
6061
issues.addIssueAsync(ProjectIssueLevel::WARNING, ProjectIssueType::FILE, ProjectError::NO_PAGE_TITLE, "", path);
6162
}
63+
64+
for (const auto &attr: requiredAttributes) {
65+
if (const auto val = resolved.getPageAttribute(path, attr); !val) {
66+
issues.addIssueAsync(ProjectIssueLevel::WARNING, ProjectIssueType::FILE, ProjectError::MISSING_REQUIRED_ATTRIBUTE, attr,
67+
path);
68+
}
69+
}
6270
}
6371

64-
void validatePagesTree(const FileTree &tree, const ResolvedProject &resolved, ProjectIssueCallback &issues) {
65-
for (const auto &entry : tree) {
72+
void validatePagesTree(const FileTree &tree, const ResolvedProject &resolved, ProjectIssueCallback &issues,
73+
const std::vector<std::string> &requiredAttributes) {
74+
for (const auto &entry: tree) {
6675
if (entry.type == FileType::FILE) {
67-
validatePageFile(entry, resolved, issues);
76+
validatePageFile(entry, resolved, issues, requiredAttributes);
6877
} else if (entry.type == FileType::DIR) {
69-
validatePagesTree(entry.children, resolved, issues);
78+
validatePagesTree(entry.children, resolved, issues, requiredAttributes);
7079
}
7180
}
7281
}
7382

7483
void validatePages(const ResolvedProject &resolved, ProjectIssueCallback &issues) {
7584
const auto [tree, tErr](resolved.getDirectoryTree());
76-
validatePagesTree(tree, resolved, issues);
85+
validatePagesTree(tree, resolved, issues, {});
7786
const auto [contentTree, cErr](resolved.getContentDirectoryTree());
78-
validatePagesTree(contentTree, resolved, issues);
87+
validatePagesTree(contentTree, resolved, issues, {"id"});
7988
}
8089

8190
std::unordered_map<std::string, std::string> readVersionsFromMetadata(const nlohmann::json &metadata,

0 commit comments

Comments
 (0)