Skip to content

Commit af97cfe

Browse files
authored
feat: output base directory support for relative paths
1 parent 2da68d8 commit af97cfe

File tree

2 files changed

+12
-6
lines changed

2 files changed

+12
-6
lines changed

src/lib/Lib/Config.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ struct PublicSettingsVisitor {
9292
{
9393
// If the path is not absolute, we need to expand it
9494
if (!files::isAbsolute(value)) {
95-
auto exp = getBaseDir(value, dirs, useDefault, opts);
95+
auto exp = getBaseDir(value, dirs, self, useDefault, opts);
9696
if (!exp)
9797
{
9898
MRDOCS_TRY(value, files::makeAbsolute(value));
@@ -124,7 +124,7 @@ struct PublicSettingsVisitor {
124124
for (auto& v : value) {
125125
if (!files::isAbsolute(v))
126126
{
127-
auto exp = getBaseDir(v, dirs, useDefault, opts);
127+
auto exp = getBaseDir(v, dirs, self, useDefault, opts);
128128
if (!exp)
129129
{
130130
MRDOCS_TRY(v, files::makeAbsolute(v));
@@ -187,7 +187,8 @@ struct PublicSettingsVisitor {
187187
Expected<std::string_view>
188188
getBaseDir(
189189
std::string_view referenceDirKey,
190-
ReferenceDirectories const& dirs)
190+
ReferenceDirectories const& dirs,
191+
PublicSettings const& settings)
191192
{
192193
if (referenceDirKey == "config-dir") {
193194
return dirs.configDir;
@@ -198,6 +199,10 @@ struct PublicSettingsVisitor {
198199
else if (referenceDirKey == "mrdocs-root") {
199200
return dirs.mrdocsRoot;
200201
}
202+
else if (referenceDirKey == "output") {
203+
MRDOCS_ASSERT(!settings.output.empty());
204+
return settings.output;
205+
}
201206
return Unexpected(formatError("unknown relative-to value: \"{}\"", referenceDirKey));
202207
}
203208

@@ -218,6 +223,7 @@ struct PublicSettingsVisitor {
218223
getBaseDir(
219224
std::string& value,
220225
ReferenceDirectories const& dirs,
226+
PublicSettings const& settings,
221227
bool useDefault,
222228
PublicSettings::OptionProperties const& opts)
223229
{
@@ -226,7 +232,7 @@ struct PublicSettingsVisitor {
226232
// as the base path
227233
std::string_view relativeTo = opts.relativeto;
228234
relativeTo = trimBaseDirReference(relativeTo);
229-
return getBaseDir(relativeTo, dirs);
235+
return getBaseDir(relativeTo, dirs, settings);
230236
}
231237

232238
// If we used the default value, the base dir comes from
@@ -237,7 +243,7 @@ struct PublicSettingsVisitor {
237243
referenceDirKey = referenceDirKey.substr(0, pos);
238244
}
239245
referenceDirKey = trimBaseDirReference(referenceDirKey);
240-
MRDOCS_TRY(std::string_view baseDir, getBaseDir(referenceDirKey, dirs));
246+
MRDOCS_TRY(std::string_view baseDir, getBaseDir(referenceDirKey, dirs, settings));
241247
if (pos != std::string::npos) {
242248
value = value.substr(pos + 1);
243249
}

util/generate-config-info.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ def validate_and_normalize_option(option):
139139
option['relativeto'] = '<config-dir>'
140140
if 'must-exist' not in option:
141141
option['must-exist'] = True
142-
reference_directories = ['<config-dir>', '<cwd>', '<mrdocs-root>']
142+
reference_directories = ['<config-dir>', '<cwd>', '<mrdocs-root>', '<output>']
143143
if option['relativeto'] not in reference_directories:
144144
raise ValueError(f'Option "{option["name"]}" has an invalid value for "relativeto"')
145145
default_paths = option['default']

0 commit comments

Comments
 (0)