blob: ca8ea30bf362fac09bb70b2050d6ebcdf023d055 [file] [log] [blame]
import 'dart:convert' show JSON;
import 'dart:io' show Directory, File, Process;
import 'package:args/args.dart' show ArgParser;
import 'package:path/path.dart' show absolute;
import 'package:yaml/yaml.dart' show loadYaml;
int main(List<String> arguments) {
const dartdocDir = 'dartdoc-dir';
const markdownBefore = 'before';
const markdownAfter = 'after';
const sdk = 'sdk';
const help = 'help';
final parser = new ArgParser()
..addSeparator("Usage: dartdoc-compare.dart [OPTIONS] <dart-package>")
..addOption(dartdocDir, help: "Directory of the dartdoc package")
..addOption(markdownBefore, help: "Markdown package 'before' ref")
..addOption(markdownAfter,
defaultsTo: "HEAD", help: "Markdown package 'after' ref")
..addFlag(sdk,
defaultsTo: false, negatable: false, help: "Is the package the SDK?")
..addFlag(help, abbr: "h", hide: true);
var options = parser.parse(arguments);
if (options[help]) {
print(parser.usage);
return 0;
}
if (options[dartdocDir] == null || options[markdownBefore] == null) {
print(
"Invalid arguments: Options --$dartdocDir and --$markdownBefore must be specified");
print(parser.usage);
return 1;
}
var comparer = new DartdocCompare()
..dartdoc_dir = options[dartdocDir]
..markdown_before = options[markdownBefore]
..markdown_after = options[markdownAfter]
..dartdoc_bin = absolute(options[dartdocDir], "bin/dartdoc.dart")
..dartdoc_pubspec_path = absolute(options[dartdocDir], "pubspec.yaml")
..sdk = options[sdk];
var package = options.rest.first;
var success = comparer.compare(package);
return success ? 0 : 1;
}
class DartdocCompare {
String dartdoc_dir;
String markdown_before;
String markdown_after;
String dartdoc_bin;
String dartdoc_pubspec_path;
bool sdk;
bool compare(package) {
// Generate docs with Markdown "A".
var out_before = run_dartdoc(markdown_before, package);
// Generate docs with Markdown "B".
var out_after = run_dartdoc(markdown_after, package);
// Compare outputs
var diffOptions = ["-r", "-B", out_before, out_after];
var result = Process.runSync("diff", diffOptions, runInShell: true);
var nlines = "\n".allMatches(result.stdout).length;
print("Diff lines: ${ nlines }");
print("diff ${diffOptions.join(" ")}");
return result.exitCode == 0;
}
String run_dartdoc(markdown_ref, package) {
print("==========================================================");
print("Running dartdoc for ${markdown_ref}...");
print("==========================================================");
doInPath(dartdoc_dir, () => update_dartdoc_pubspec(markdown_ref));
return doInPath(package, () {
if (!sdk) system('pub', ['get']);
var out = Directory.systemTemp
.createTempSync("dartdoc-compare-${markdown_ref}__");
var sdk_options =
sdk ? ["--sdk-docs", "--dart-sdk=$package"] : <String>[];
var cmd = "dart";
var args = ["${dartdoc_bin}", "--output=${out.path}"]
..addAll(sdk_options);
print("Command: $cmd ${args.join(" ")}");
system(cmd, args);
print("");
return out.path;
});
}
int update_dartdoc_pubspec(markdown_ref) {
var dartdoc_pubspec =
loadYaml(new File(dartdoc_pubspec_path).readAsStringSync());
// make modifiable copy
dartdoc_pubspec = JSON.decode(JSON.encode(dartdoc_pubspec));
dartdoc_pubspec['dependencies']['markdown'] = {
'git': {
'url': 'git://github.com/dart-lang/markdown.git',
'ref': markdown_ref
}
};
new File(dartdoc_pubspec_path)
.writeAsStringSync(JSON.encode(dartdoc_pubspec));
return system('pub', ['get']);
}
static int system(String cmd, List<String> args) {
var result = Process.runSync(cmd, args);
print(result.stdout);
print(result.stderr);
return result.exitCode;
}
static Object doInPath(String path, Function f) {
var former = Directory.current.path;
Directory.current = path;
var result = f();
Directory.current = former;
return result;
}
}