mirror of
https://github.com/denoland/deno.git
synced 2025-03-03 17:34:47 -05:00
Rewrite tools/format.py in deno (#1528)
Note: findFiles and findFilesWalk are borrowed from the previous attempt of @pseudo-su (#1434)
This commit is contained in:
parent
befc6b2e76
commit
f19622e768
21 changed files with 209 additions and 56 deletions
2
.github/CONTRIBUTING.md
vendored
2
.github/CONTRIBUTING.md
vendored
|
@ -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:
|
Before submitting, please make sure the following is done:
|
||||||
|
|
||||||
1. Ensure `./tools/test.py` passes.
|
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.
|
3. Make sure `./tools/lint.py` passes.
|
||||||
|
|
||||||
## Changes to `third_party`
|
## Changes to `third_party`
|
||||||
|
|
|
@ -64,8 +64,8 @@ before_script:
|
||||||
# Default script for release builds.
|
# Default script for release builds.
|
||||||
script:
|
script:
|
||||||
- ./tools/lint.py
|
- ./tools/lint.py
|
||||||
- ./tools/test_format.py
|
|
||||||
- ./tools/build.py -C target/release
|
- ./tools/build.py -C target/release
|
||||||
|
- ./tools/test_format.py
|
||||||
- DENO_BUILD_MODE=release ./tools/test.py
|
- DENO_BUILD_MODE=release ./tools/test.py
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
2
Docs.md
2
Docs.md
|
@ -344,7 +344,7 @@ submodule. However, you need to install separately:
|
||||||
./tools/test.py
|
./tools/test.py
|
||||||
|
|
||||||
# Format code.
|
# Format code.
|
||||||
./tools/format.py
|
deno ./tools/format.ts
|
||||||
|
|
||||||
Other useful commands:
|
Other useful commands:
|
||||||
|
|
||||||
|
|
|
@ -42,4 +42,6 @@ import "./url_test.ts";
|
||||||
import "./url_search_params_test.ts";
|
import "./url_search_params_test.ts";
|
||||||
import "./write_file_test.ts";
|
import "./write_file_test.ts";
|
||||||
|
|
||||||
|
import "../tools/util_test.ts";
|
||||||
|
|
||||||
import "../website/app_test.js";
|
import "../website/app_test.js";
|
||||||
|
|
|
@ -1,50 +0,0 @@
|
||||||
#!/usr/bin/env python
|
|
||||||
# Copyright 2018 the Deno authors. All rights reserved. MIT license.
|
|
||||||
from glob import glob
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
from third_party import fix_symlinks, google_env, python_env
|
|
||||||
from third_party import clang_format_path, third_party_path
|
|
||||||
from util import root_path, run, find_exts, platform
|
|
||||||
|
|
||||||
fix_symlinks()
|
|
||||||
|
|
||||||
prettier = os.path.join(third_party_path, "node_modules", "prettier",
|
|
||||||
"bin-prettier.js")
|
|
||||||
tools_path = os.path.join(root_path, "tools")
|
|
||||||
rustfmt_config = os.path.join(tools_path, "rustfmt.toml")
|
|
||||||
|
|
||||||
os.chdir(root_path)
|
|
||||||
|
|
||||||
|
|
||||||
def qrun(cmd, env=None):
|
|
||||||
run(cmd, quiet=True, env=env)
|
|
||||||
|
|
||||||
|
|
||||||
print "clang_format"
|
|
||||||
qrun([clang_format_path, "-i", "-style", "Google"] +
|
|
||||||
find_exts(["libdeno"], [".cc", ".h"]))
|
|
||||||
|
|
||||||
print "gn format"
|
|
||||||
for fn in ["BUILD.gn", ".gn"] + find_exts(["build_extra", "libdeno"],
|
|
||||||
[".gn", ".gni"]):
|
|
||||||
qrun(["third_party/depot_tools/gn", "format", fn], env=google_env())
|
|
||||||
|
|
||||||
print "yapf"
|
|
||||||
qrun(
|
|
||||||
[sys.executable, "third_party/python_packages/bin/yapf", "-i"] + find_exts(
|
|
||||||
["tools", "build_extra"], [".py"], skip=["tools/clang"]),
|
|
||||||
env=python_env())
|
|
||||||
|
|
||||||
print "prettier"
|
|
||||||
qrun(["node", prettier, "--write", "--loglevel=error"] + ["rollup.config.js"] +
|
|
||||||
glob("*.json") + glob("*.md") +
|
|
||||||
find_exts([".github", "js", "tests", "tools", "website"],
|
|
||||||
[".js", ".json", ".ts", ".md"],
|
|
||||||
skip=["tools/clang", "js/deps"]))
|
|
||||||
|
|
||||||
print "rustfmt"
|
|
||||||
qrun([
|
|
||||||
"third_party/rustfmt/" + platform() +
|
|
||||||
"/rustfmt", "--config-path", rustfmt_config, "build.rs"
|
|
||||||
] + find_exts(["src"], [".rs"]))
|
|
78
tools/format.ts
Executable file
78
tools/format.ts
Executable file
|
@ -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"])
|
||||||
|
);
|
||||||
|
})();
|
|
@ -1,18 +1,40 @@
|
||||||
#!/usr/bin/env python
|
#!/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 sys
|
||||||
import util
|
import util
|
||||||
import sys
|
import sys
|
||||||
import subprocess
|
import subprocess
|
||||||
|
from distutils.spawn import find_executable
|
||||||
|
|
||||||
|
|
||||||
|
def lookup_deno_path():
|
||||||
|
deno_exe = "deno" + util.executable_suffix
|
||||||
|
release_deno = os.path.join(util.root_path, "target", "release", deno_exe)
|
||||||
|
debug_deno = os.path.join(util.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():
|
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(
|
output = util.run_output(
|
||||||
["git", "status", "-uno", "--porcelain", "--ignore-submodules"])
|
["git", "status", "-uno", "--porcelain", "--ignore-submodules"])
|
||||||
if len(output) > 0:
|
if len(output) > 0:
|
||||||
print "Run tools/format.py "
|
print "Run tools/format.ts "
|
||||||
print output
|
print output
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
1
tools/testdata/find_files_testdata/bar.md
vendored
Normal file
1
tools/testdata/find_files_testdata/bar.md
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
# bar
|
1
tools/testdata/find_files_testdata/bar.ts
vendored
Normal file
1
tools/testdata/find_files_testdata/bar.ts
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
console.log("bar");
|
1
tools/testdata/find_files_testdata/bar.txt
vendored
Normal file
1
tools/testdata/find_files_testdata/bar.txt
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
bar
|
1
tools/testdata/find_files_testdata/foo.md
vendored
Normal file
1
tools/testdata/find_files_testdata/foo.md
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
# foo
|
1
tools/testdata/find_files_testdata/foo.ts
vendored
Normal file
1
tools/testdata/find_files_testdata/foo.ts
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
console.log("foo");
|
1
tools/testdata/find_files_testdata/foo.txt
vendored
Normal file
1
tools/testdata/find_files_testdata/foo.txt
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
foo
|
1
tools/testdata/find_files_testdata/subdir0/bar.ts
vendored
Normal file
1
tools/testdata/find_files_testdata/subdir0/bar.ts
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
console.log("bar");
|
1
tools/testdata/find_files_testdata/subdir0/foo.ts
vendored
Normal file
1
tools/testdata/find_files_testdata/subdir0/foo.ts
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
console.log("foo");
|
1
tools/testdata/find_files_testdata/subdir0/subdir0/bar.ts
vendored
Normal file
1
tools/testdata/find_files_testdata/subdir0/subdir0/bar.ts
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
console.log("bar");
|
1
tools/testdata/find_files_testdata/subdir0/subdir0/foo.ts
vendored
Normal file
1
tools/testdata/find_files_testdata/subdir0/subdir0/foo.ts
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
console.log("foo");
|
1
tools/testdata/find_files_testdata/subdir1/bar.ts
vendored
Normal file
1
tools/testdata/find_files_testdata/subdir1/bar.ts
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
console.log("bar");
|
1
tools/testdata/find_files_testdata/subdir1/foo.ts
vendored
Normal file
1
tools/testdata/find_files_testdata/subdir1/foo.ts
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
console.log("foo");
|
40
tools/util.ts
Normal file
40
tools/util.ts
Normal file
|
@ -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
tools/util_test.ts
Normal file
49
tools/util_test.ts
Normal file
|
@ -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`
|
||||||
|
]);
|
||||||
|
});
|
Loading…
Add table
Reference in a new issue