Skip to content

Commit 166863e

Browse files
committed
feat: <output> base directory support for relative paths
1 parent d38d3e1 commit 166863e

File tree

2 files changed

+14
-6
lines changed

2 files changed

+14
-6
lines changed

src/lib/Lib/Config.cpp

Lines changed: 13 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,12 @@ struct PublicSettingsVisitor {
198199
else if (referenceDirKey == "mrdocs-root") {
199200
return dirs.mrdocsRoot;
200201
}
202+
else if (referenceDirKey == "output") {
203+
if (settings.output.empty()) {
204+
return Unexpected(formatError("output is not yet resolved"));
205+
}
206+
return settings.output;
207+
}
201208
return Unexpected(formatError("unknown relative-to value: \"{}\"", referenceDirKey));
202209
}
203210

@@ -218,6 +225,7 @@ struct PublicSettingsVisitor {
218225
getBaseDir(
219226
std::string& value,
220227
ReferenceDirectories const& dirs,
228+
PublicSettings const& settings,
221229
bool useDefault,
222230
PublicSettings::OptionProperties const& opts)
223231
{
@@ -226,7 +234,7 @@ struct PublicSettingsVisitor {
226234
// as the base path
227235
std::string_view relativeTo = opts.relativeto;
228236
relativeTo = trimBaseDirReference(relativeTo);
229-
return getBaseDir(relativeTo, dirs);
237+
return getBaseDir(relativeTo, dirs, settings);
230238
}
231239

232240
// If we used the default value, the base dir comes from
@@ -237,7 +245,7 @@ struct PublicSettingsVisitor {
237245
referenceDirKey = referenceDirKey.substr(0, pos);
238246
}
239247
referenceDirKey = trimBaseDirReference(referenceDirKey);
240-
MRDOCS_TRY(std::string_view baseDir, getBaseDir(referenceDirKey, dirs));
248+
MRDOCS_TRY(std::string_view baseDir, getBaseDir(referenceDirKey, dirs, settings));
241249
if (pos != std::string::npos) {
242250
value = value.substr(pos + 1);
243251
}

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)