mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-25 09:02:00 +00:00
187 lines
6.1 KiB
Python
Executable File
187 lines
6.1 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
import os, sys
|
|
import argparse
|
|
import subprocess
|
|
import contextlib
|
|
from git import cmd
|
|
from tempfile import NamedTemporaryFile
|
|
|
|
SCRIPT_DESCRIPTION = """
|
|
usage: ./easy_diff.py language/document path
|
|
|
|
Show the difference between a language document and an English document.
|
|
|
|
This script is based on the assumption that documents in other languages are fully synchronized with the en document at a commit.
|
|
|
|
For example:
|
|
Execute:
|
|
./easy_diff.py --no-pager zh/data_types
|
|
Output:
|
|
Need translate document:~/ClickHouse/docs/en/data_types/uuid.md
|
|
Need link document:~/ClickHouse/docs/en/data_types/decimal.md to ~/ClickHouse/docs/zh/data_types/decimal.md
|
|
diff --git a/docs/en/data_types/domains/ipv6.md b/docs/en/data_types/domains/ipv6.md
|
|
index 1bfbe3400b..e2abaff017 100644
|
|
--- a/docs/en/data_types/domains/ipv6.md
|
|
+++ b/docs/en/data_types/domains/ipv6.md
|
|
@@ -4,13 +4,13 @@
|
|
|
|
### Basic Usage
|
|
|
|
-``` sql
|
|
+```sql
|
|
CREATE TABLE hits (url String, from IPv6) ENGINE = MergeTree() ORDER BY url;
|
|
|
|
DESCRIBE TABLE hits;
|
|
```
|
|
|
|
-```
|
|
+```text
|
|
┌─name─┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┐
|
|
│ url │ String │ │ │ │ │
|
|
│ from │ IPv6 │ │ │ │ │
|
|
@@ -19,19 +19,19 @@ DESCRIBE TABLE hits;
|
|
|
|
OR you can use `IPv6` domain as a key:
|
|
|
|
-``` sql
|
|
+```sql
|
|
CREATE TABLE hits (url String, from IPv6) ENGINE = MergeTree() ORDER BY from;
|
|
... MORE
|
|
|
|
OPTIONS:
|
|
-h, --help show this help message and exit
|
|
--no-pager use stdout as difference result output
|
|
"""
|
|
|
|
SCRIPT_PATH = os.path.abspath(__file__)
|
|
CLICKHOUSE_REPO_HOME = os.path.join(os.path.dirname(SCRIPT_PATH), "..", "..")
|
|
SCRIPT_COMMAND_EXECUTOR = cmd.Git(CLICKHOUSE_REPO_HOME)
|
|
|
|
SCRIPT_COMMAND_PARSER = argparse.ArgumentParser(add_help=False)
|
|
SCRIPT_COMMAND_PARSER.add_argument("path", type=bytes, nargs="?", default=None)
|
|
SCRIPT_COMMAND_PARSER.add_argument("--no-pager", action="store_true", default=False)
|
|
SCRIPT_COMMAND_PARSER.add_argument("-h", "--help", action="store_true", default=False)
|
|
|
|
|
|
def execute(commands):
|
|
return SCRIPT_COMMAND_EXECUTOR.execute(commands)
|
|
|
|
|
|
def get_hash(file_name):
|
|
return execute(["git", "log", "-n", "1", '--pretty=format:"%H"', file_name])
|
|
|
|
|
|
def diff_file(reference_file, working_file, out):
|
|
if not os.path.exists(reference_file):
|
|
raise RuntimeError(
|
|
"reference file [" + os.path.abspath(reference_file) + "] is not exists."
|
|
)
|
|
|
|
if os.path.islink(working_file):
|
|
out.writelines(["Need translate document:" + os.path.abspath(reference_file)])
|
|
elif not os.path.exists(working_file):
|
|
out.writelines(
|
|
[
|
|
"Need link document "
|
|
+ os.path.abspath(reference_file)
|
|
+ " to "
|
|
+ os.path.abspath(working_file)
|
|
]
|
|
)
|
|
elif get_hash(working_file) != get_hash(reference_file):
|
|
out.writelines(
|
|
[
|
|
(
|
|
execute(
|
|
[
|
|
"git",
|
|
"diff",
|
|
get_hash(working_file).strip('"'),
|
|
reference_file,
|
|
]
|
|
).encode("utf-8")
|
|
)
|
|
]
|
|
)
|
|
|
|
return 0
|
|
|
|
|
|
def diff_directory(reference_directory, working_directory, out):
|
|
if not os.path.isdir(reference_directory):
|
|
return diff_file(reference_directory, working_directory, out)
|
|
|
|
for list_item in os.listdir(reference_directory):
|
|
working_item = os.path.join(working_directory, list_item)
|
|
reference_item = os.path.join(reference_directory, list_item)
|
|
if (
|
|
diff_file(reference_item, working_item, out)
|
|
if os.path.isfile(reference_item)
|
|
else diff_directory(reference_item, working_item, out) != 0
|
|
):
|
|
return 1
|
|
|
|
return 0
|
|
|
|
|
|
def find_language_doc(custom_document, other_language="en", children=[]):
|
|
if len(custom_document) == 0:
|
|
raise RuntimeError(
|
|
"The "
|
|
+ os.path.join(custom_document, *children)
|
|
+ " is not in docs directory."
|
|
)
|
|
|
|
if os.path.samefile(os.path.join(CLICKHOUSE_REPO_HOME, "docs"), custom_document):
|
|
return os.path.join(CLICKHOUSE_REPO_HOME, "docs", other_language, *children[1:])
|
|
children.insert(0, os.path.split(custom_document)[1])
|
|
return find_language_doc(
|
|
os.path.split(custom_document)[0], other_language, children
|
|
)
|
|
|
|
|
|
class ToPager:
|
|
def __init__(self, temp_named_file):
|
|
self.temp_named_file = temp_named_file
|
|
|
|
def writelines(self, lines):
|
|
self.temp_named_file.writelines(lines)
|
|
|
|
def close(self):
|
|
self.temp_named_file.flush()
|
|
git_pager = execute(["git", "var", "GIT_PAGER"])
|
|
subprocess.check_call([git_pager, self.temp_named_file.name])
|
|
self.temp_named_file.close()
|
|
|
|
|
|
class ToStdOut:
|
|
def writelines(self, lines):
|
|
self.system_stdout_stream.writelines(lines)
|
|
|
|
def close(self):
|
|
self.system_stdout_stream.flush()
|
|
|
|
def __init__(self, system_stdout_stream):
|
|
self.system_stdout_stream = system_stdout_stream
|
|
|
|
|
|
if __name__ == "__main__":
|
|
arguments = SCRIPT_COMMAND_PARSER.parse_args()
|
|
if arguments.help or not arguments.path:
|
|
sys.stdout.write(SCRIPT_DESCRIPTION)
|
|
sys.exit(0)
|
|
|
|
working_language = os.path.join(CLICKHOUSE_REPO_HOME, "docs", arguments.path)
|
|
with contextlib.closing(
|
|
ToStdOut(sys.stdout)
|
|
if arguments.no_pager
|
|
else ToPager(NamedTemporaryFile("r+"))
|
|
) as writer:
|
|
exit(
|
|
diff_directory(
|
|
find_language_doc(working_language), working_language, writer
|
|
)
|
|
)
|