Merge branch 'dartdoc-compare-dart' of git://github.com/jirkadanek/markdown into jirkadanek-dartdoc-compare-dart * 'dartdoc-compare-dart' of git://github.com/jirkadanek/markdown: Add a dartdoc-compare.dart script
diff --git a/pkgs/markdown/AUTHORS b/pkgs/markdown/AUTHORS index 302a1de..213eca2 100644 --- a/pkgs/markdown/AUTHORS +++ b/pkgs/markdown/AUTHORS
@@ -7,3 +7,4 @@ David Peek <ninjascript@gmail.com> Daniel Schubert <daniel.schubert+github.com@gmail.com> +Jirka Daněk <dnk@mail.muni.cz>
diff --git a/pkgs/markdown/pubspec.yaml b/pkgs/markdown/pubspec.yaml index a659ba8..7740d41 100644 --- a/pkgs/markdown/pubspec.yaml +++ b/pkgs/markdown/pubspec.yaml
@@ -6,6 +6,8 @@ environment: sdk: '>=1.12.0 <2.0.0' dev_dependencies: + args: '^0.13.3+1' collection: ^1.2.0 path: '^1.3.1' test: '^0.12.4+1' + yaml: '^2.1.8'
diff --git a/pkgs/markdown/tools/dartdoc-compare.dart b/pkgs/markdown/tools/dartdoc-compare.dart new file mode 100644 index 0000000..05317b1 --- /dev/null +++ b/pkgs/markdown/tools/dartdoc-compare.dart
@@ -0,0 +1,123 @@ +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 dartdoc_dir = 'dartdoc-dir'; + const markdown_before = 'before'; + const markdown_after = 'after'; + const sdk = 'sdk'; + const help = 'help'; + final parser = new ArgParser() + ..addSeparator("Usage: dartdoc-compare.dart [OPTIONS] <dart-package>") + ..addOption(dartdoc_dir, help: "Directory of the dartdoc package") + ..addOption(markdown_before, help: "Markdown package 'before' ref") + ..addOption(markdown_after, + 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[dartdoc_dir] == null || options[markdown_before] == null) { + print( + "Invalid arguments: Options --$dartdoc_dir and --$markdown_before must be specified"); + print(parser.usage); + return 1; + } + var comparer = new DartdocCompare() + ..dartdoc_dir = options[dartdoc_dir] + ..markdown_before = options[markdown_before] + ..markdown_after = options[markdown_after] + ..dartdoc_bin = absolute(options[dartdoc_dir], "bin/dartdoc.dart") + ..dartdoc_pubspec_path = absolute(options[dartdoc_dir], "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 diff = "diff -r -B ${out_before} ${out_after}"; + var result = Process.runSync("${diff}", [], runInShell: true); + var nlines = "\n".allMatches(result.stdout).length; + print("Diff lines: ${ nlines }"); + print(diff); + return result == 0; + } + + run_dartdoc(markdown_ref, package) { + print("=========================================================="); + print("Running dartdoc for ${markdown_ref}..."); + print("=========================================================="); + update_dartdoc_pubspec(markdown_ref); + return doInPath(package, () { + system('pub', ['get']); + var out = Directory.systemTemp + .createTempSync("dartdoc-compare-${markdown_ref}__"); + var sdk_options = sdk ? "--sdk-docs --dart-sdk=$package" : ""; + var cmd = "dart"; + var args = ["${dartdoc_bin}", "--output=${out.path} ${sdk_options}"]; + print("Command: $cmd ${args.join(" ")}"); + system(cmd, args); + print(""); + + return out.path; + }); + } + + 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 system(cmd, args) { + var result = Process.runSync(cmd, args); + print(result.stdout); + print(result.stderr); + return result.exitCode; + } + + static doInPath(String path, Function f) { + var former = Directory.current.path; + Directory.current = path; + var result = f(); + Directory.current = former; + return result; + } +}