Skip to content

Commit

Permalink
improve man page generation
Browse files Browse the repository at this point in the history
  • Loading branch information
WebFreak001 committed Aug 5, 2022
1 parent 93a6034 commit 96c630d
Showing 1 changed file with 66 additions and 7 deletions.
73 changes: 66 additions & 7 deletions scripts/man/gen_man.d
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ struct Config
{
import std.datetime;
SysTime date;
string[] relatedSubCommands;

static Config init(){
import std.process : environment;
Expand Down Expand Up @@ -62,7 +63,8 @@ void writeFooter(ref File manFile, string seeAlso, const Config config)
Copyright (c) 1999-%s by The D Language Foundation
.SH "ONLINE DOCUMENTATION"
.UR http://code.dlang.org/docs/commandline
.UE http://code.dlang.org/docs/commandline
http://code.dlang.org/docs/commandline
.UE
.SH "SEE ALSO"
%s`;
manFile.writefln(manFooter, config.date.year, seeAlso);
Expand Down Expand Up @@ -116,26 +118,28 @@ string highlightArguments(string args)

void writeArgs(CommandArgs args, ref File manFile)
{
alias write = (m) => manFile.write(m);
alias write = (m) => manFile.write(m.replace(`-`, `\-`));
foreach (arg; args.recognizedArgs)
{
auto names = arg.names.split("|");
assert(names.length == 1 || names.length == 2);
string sarg = names[0].length == 1 ? names[0] : null;
string larg = names[0].length > 1 ? names[0] : names.length > 1 ? names[1] : null;
write(".IP ");
manFile.writeln(".PP");
if (sarg !is null) {
write("-%s".format(sarg));
write("-%s".format(sarg).bold);
if (larg !is null)
write(", ");
}
if (larg !is null) {
write("--%s".format(larg));
write("--%s".format(larg).bold);
if (!arg.defaultValue.peek!bool)
write("=VALUE");
}
manFile.writeln;
manFile.writeln(".RS 4");
manFile.writeln(arg.helpText.join("\n"));
manFile.writeln(".RE");
}
}

Expand All @@ -149,11 +153,25 @@ void writeManFile(Command command, const Config config)
auto manFile = File(config.cwd.buildPath(fileName), "w");
auto manName = format("DUB-%s", command.name).toUpper;
manFile.writeHeader(manName, config);
static immutable seeAlso = ["dmd(1)", "dub(1)"].map!bold.joiner(", ").to!string;

string[] extraRelated;
foreach (arg; args.recognizedArgs) {
if (arg.names.canFind("rdmd"))
extraRelated ~= "rdmd(1)";
}
if (command.name == "dustmite")
extraRelated ~= "dustmite(1)";

const seeAlso = ["dub(1)"]
.chain(config.relatedSubCommands.map!(s => s.format!"dub-%s(1)"))
.chain(extraRelated)
.map!bold
.joiner(", ")
.to!string;
scope(exit) manFile.writeFooter(seeAlso, config);

alias writeln = (m) => manFile.writeln(m);
writeln(`dub \- Package and build management system for D`);
manFile.writefln(`dub-%s \- %s`, command.name, command.description);

writeln("SYNOPSIS".header);
writeln("dub %s".format(command.name).bold);
Expand All @@ -168,6 +186,25 @@ void writeManFile(Command command, const Config config)
writeln(command.helpText.joiner("\n\n"));
writeln("OPTIONS".header);
args.writeArgs(manFile);

static immutable exitStatus =
`.SH EXIT STATUS
.TP
.BR 0
DUB succeeded
.TP
.BR 1
usage errors, unknown command line flags
.TP
.BR 2
package not found, package failed to load, miscellaneous error`;
static immutable exitStatusDustmite =
`.SH EXIT STATUS
Forwards the exit code from ` ~ `dustmite(1)`.bold;
if (command.name == "dustmite")
manFile.writeln(exitStatusDustmite);
else
manFile.writeln(exitStatus);
}

void main()
Expand All @@ -183,8 +220,30 @@ void main()
args.writeMainManFile(commands, "dub.1", config);
}

string[][] relatedSubCommands = [
["run", "build", "test"],
["test", "dustmite", "lint"],
["describe", "gemerate"],
["add", "fetch"],
["init", "add", "convert"],
["add-path", "remove-path"],
["add-local", "remove-local"],
["list", "search"],
["add-override", "remove-override", "list-overrides"],
["clean-caches", "clean", "remove"],
];

// options for each specific command
foreach (cmd; commands.map!(a => a.commands).joiner) {
string[] related;
foreach (relatedList; relatedSubCommands) {
if (relatedList.canFind(cmd.name))
related ~= relatedList;
}
related = related.sort!"a<b".uniq.array;
related = related.remove!(c => c == cmd.name);
config.relatedSubCommands = related;

cmd.writeManFile(config);
}
}

0 comments on commit 96c630d

Please sign in to comment.