Skip to content

Commit

Permalink
refactor: rewrite tools/format.py in deno
Browse files Browse the repository at this point in the history
Note: findFiles and findFilesWalk are borrowed from the previous
attempt of @pseudo-su (#1434). Thanks!
  • Loading branch information
kt3k committed Jan 16, 2019
1 parent 7d08db2 commit 11f12ac
Show file tree
Hide file tree
Showing 21 changed files with 209 additions and 56 deletions.
2 changes: 1 addition & 1 deletion .github/CONTRIBUTING.md
Expand Up @@ -18,7 +18,7 @@ Docs are [here](https://github.com/denoland/deno/blob/master/Docs.md).
Before submitting, please make sure the following is done:

1. Ensure `./tools/test.py` passes.
2. Format your code with `./tools/format.py`.
2. Format your code with `./tools/format.ts`.
3. Make sure `./tools/lint.py` passes.

## Changes to `third_party`
Expand Down
2 changes: 1 addition & 1 deletion .travis.yml
Expand Up @@ -63,8 +63,8 @@ before_script:
# Default script for release builds.
script:
- ./tools/lint.py
- ./tools/test_format.py
- ./tools/build.py -C target/release
- ./tools/test_format.py
- DENO_BUILD_MODE=release ./tools/test.py

jobs:
Expand Down
2 changes: 1 addition & 1 deletion Docs.md
Expand Up @@ -344,7 +344,7 @@ submodule. However, you need to install separately:
./tools/test.py

# Format code.
./tools/format.py
./tools/format.ts

Other useful commands:

Expand Down
2 changes: 2 additions & 0 deletions js/unit_tests.ts
Expand Up @@ -41,4 +41,6 @@ import "./url_test.ts";
import "./url_search_params_test.ts";
import "./write_file_test.ts";

import "../tools/util_test.ts";

import "../website/app_test.js";
50 changes: 0 additions & 50 deletions tools/format.py

This file was deleted.

78 changes: 78 additions & 0 deletions tools/format.ts
@@ -0,0 +1,78 @@
#!/usr/bin/env deno --allow-run
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
import * as deno from "deno";
import { join } from "../js/deps/https/deno.land/x/std/path/index.ts";
import { findFiles } from "./util.ts";

const clangFormat = join("third_party", "depot_tools", "clang-format");
const gn = join("third_party", "depot_tools", "gn");
const prettier = join(
"third_party",
"node_modules",
"prettier",
"bin-prettier.js"
);
const yapf = join("third_party", "python_packages", "bin", "yapf");
const rustfmt = join("third_party", "rustfmt", deno.platform.os, "rustfmt");
const rustfmtConfig = join("tools", "rustfmt.toml");

const run = (...args: string[]) => {
if (deno.platform.os === "win") {
args = ["cmd.exe", "/c", ...args];
}
return deno.run({ args, stdout: "null", stderr: "piped" }).status();
};

(async () => {
console.log("clang_format");
await run(
clangFormat,
"-i",
"-style",
"Google",
...findFiles(["libdeno"], [".cc", ".h"])
);

console.log("gn format");
for (const fn of [
"BUILD.gn",
".gn",
...findFiles(["build_extra", "libdeno"], [".gn", ".gni"])
]) {
await run(gn, "format", fn);
}

console.log("yapf");
await run(
"python",
yapf,
"-i",
...findFiles(["tools", "build_extra"], [".py"], {
skip: [join("tools", "clang")]
})
);

console.log("prettier");
await run(
"node",
prettier,
"--write",
"--loglevel=error",
"rollup.config.js",
...findFiles(["."], [".json", ".md"], { depth: 1 }),
...findFiles(
[".github", "js", "tests", "tools", "website"],
[".js", ".json", ".ts", ".md"],
{ skip: [join("tools", "clang"), join("js", "deps")] }
)
);

console.log("rustfmt");
await run(
rustfmt,
"--config-path",
rustfmtConfig,
"build.rs",
...findFiles(["src"], [".rs"])
);
})();
28 changes: 25 additions & 3 deletions tools/test_format.py
@@ -1,18 +1,40 @@
#!/usr/bin/env python
# This program fails if ./tools/format.py changes any files.
# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
# This program fails if ./tools/format.ts changes any files.

import os
import sys
import util
import sys
import subprocess
from distutils.spawn import find_executable


def lookup_deno_path():
deno_exe = "deno" + util.executable_suffix
release_deno = os.path.join(root_path, "target", "release", deno_exe)
debug_deno = os.path.join(root_path, "target", "debug", deno_exe)

if os.path.exists(release_deno):
return release_deno
if os.path.exists(debug_deno):
return debug_deno

return find_executable("deno")


def main():
util.run([sys.executable, "tools/format.py"])
deno_path = lookup_deno_path()

if not deno_path:
print "No available deno executable."
sys.exit(1)

util.run([deno_path, "--allow-run", "tools/format.ts"])
output = util.run_output(
["git", "status", "-uno", "--porcelain", "--ignore-submodules"])
if len(output) > 0:
print "Run tools/format.py "
print "Run tools/format.ts "
print output
sys.exit(1)

Expand Down
1 change: 1 addition & 0 deletions tools/testdata/find_files_testdata/bar.md
@@ -0,0 +1 @@
# bar
1 change: 1 addition & 0 deletions tools/testdata/find_files_testdata/bar.ts
@@ -0,0 +1 @@
console.log("bar");
1 change: 1 addition & 0 deletions tools/testdata/find_files_testdata/bar.txt
@@ -0,0 +1 @@
bar
1 change: 1 addition & 0 deletions tools/testdata/find_files_testdata/foo.md
@@ -0,0 +1 @@
# foo
1 change: 1 addition & 0 deletions tools/testdata/find_files_testdata/foo.ts
@@ -0,0 +1 @@
console.log("foo");
1 change: 1 addition & 0 deletions tools/testdata/find_files_testdata/foo.txt
@@ -0,0 +1 @@
foo
1 change: 1 addition & 0 deletions tools/testdata/find_files_testdata/subdir0/bar.ts
@@ -0,0 +1 @@
console.log("bar");
1 change: 1 addition & 0 deletions tools/testdata/find_files_testdata/subdir0/foo.ts
@@ -0,0 +1 @@
console.log("foo");
1 change: 1 addition & 0 deletions tools/testdata/find_files_testdata/subdir0/subdir0/bar.ts
@@ -0,0 +1 @@
console.log("bar");
1 change: 1 addition & 0 deletions tools/testdata/find_files_testdata/subdir0/subdir0/foo.ts
@@ -0,0 +1 @@
console.log("foo");
1 change: 1 addition & 0 deletions tools/testdata/find_files_testdata/subdir1/bar.ts
@@ -0,0 +1 @@
console.log("bar");
1 change: 1 addition & 0 deletions tools/testdata/find_files_testdata/subdir1/foo.ts
@@ -0,0 +1 @@
console.log("foo");
40 changes: 40 additions & 0 deletions tools/util.ts
@@ -0,0 +1,40 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
import { lstatSync, readDirSync } from "deno";

export interface FindOptions {
skip?: string[];
depth?: number;
}

/**
* Finds files of the give extensions under the given paths recursively.
* @param dirs directories
* @param exts extensions
* @param skip patterns to ignore
* @param depth depth to find
*/
export function findFiles(
dirs: string[],
exts: string[],
{ skip = [], depth = 20 }: FindOptions = {}
) {
return findFilesWalk(dirs, depth).filter(
path =>
exts.some(ext => path.endsWith(ext)) &&
skip.every(pattern => !path.includes(pattern))
);
}

function findFilesWalk(paths: string[], depth: number) {
if (depth < 0) {
return [];
}

const foundPaths = paths.map(path =>
lstatSync(path).isDirectory()
? findFilesWalk(readDirSync(path).map(f => f.path), depth - 1)
: path
);

return [].concat(...foundPaths);
}
49 changes: 49 additions & 0 deletions tools/util_test.ts
@@ -0,0 +1,49 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
import { test, assertEqual } from "../js/test_util.ts";
import { findFiles } from "./util.ts";

const testDir = "tools/testdata/find_files_testdata";

// Sorts and replace backslashes with slashes.
const normalize = files => files.map(f => f.replace(/\\/g, "/")).sort();

test(function testFindFiles() {
const files = findFiles([testDir], [".ts", ".md"]);
assertEqual(normalize(files), [
`${testDir}/bar.md`,
`${testDir}/bar.ts`,
`${testDir}/foo.md`,
`${testDir}/foo.ts`,
`${testDir}/subdir0/bar.ts`,
`${testDir}/subdir0/foo.ts`,
`${testDir}/subdir0/subdir0/bar.ts`,
`${testDir}/subdir0/subdir0/foo.ts`,
`${testDir}/subdir1/bar.ts`,
`${testDir}/subdir1/foo.ts`
]);
});

test(function testFindFilesDepth() {
const files = findFiles([testDir], [".ts", ".md"], { depth: 1 });
assertEqual(normalize(files), [
`${testDir}/bar.md`,
`${testDir}/bar.ts`,
`${testDir}/foo.md`,
`${testDir}/foo.ts`
]);
});

test(function testFindFilesSkip() {
const files = findFiles([testDir], [".ts", ".md"], {
skip: ["foo.md", "subdir1"]
});
assertEqual(normalize(files), [
`${testDir}/bar.md`,
`${testDir}/bar.ts`,
`${testDir}/foo.ts`,
`${testDir}/subdir0/bar.ts`,
`${testDir}/subdir0/foo.ts`,
`${testDir}/subdir0/subdir0/bar.ts`,
`${testDir}/subdir0/subdir0/foo.ts`
]);
});

0 comments on commit 11f12ac

Please sign in to comment.