|
1 | 1 | #!/usr/bin/env python3 |
2 | 2 | # encoding: utf-8 |
3 | | -# |
4 | | -# Licensed to the Apache Software Foundation (ASF) under one |
5 | | -# or more contributor license agreements. See the NOTICE file |
6 | | -# distributed with this work for additional information |
7 | | -# regarding copyright ownership. The ASF licenses this file |
8 | | -# to you under the Apache License, Version 2.0 (the |
9 | | -# "License"); you may not use this file except in compliance |
10 | | -# with the License. You may obtain a copy of the License at |
11 | | -# |
12 | | -# http://www.apache.org/licenses/LICENSE-2.0 |
13 | | -# |
14 | | -# Unless required by applicable law or agreed to in writing, |
15 | | -# software distributed under the License is distributed on an |
16 | | -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
17 | | -# KIND, either express or implied. See the License for the |
18 | | -# specific language governing permissions and limitations |
19 | | -# under the License. |
20 | | -# |
21 | | -# Modified from the Apache Arrow project for the Terrier project. |
22 | | - |
23 | | -"""Format the ill-formatted code.""" |
24 | | -# ============================================== |
25 | | -# GOAL : Format code, Update headers |
26 | | -# ============================================== |
27 | | - |
28 | | -# ===----------------------------------------------------------------------===// |
29 | | -# |
30 | | -# CMU-DB Project (15-445/645) |
31 | | -# ***DO NO SHARE PUBLICLY*** |
32 | | -# |
33 | | -# Identification: src/include/page/b_plus_tree_page.h |
34 | | -# |
35 | | -# Copyright (c) 2023, Carnegie Mellon University Database Group |
36 | | -# |
37 | | -# ===----------------------------------------------------------------------===// |
| 3 | +''' template |
| 4 | +//===----------------------------------------------------------------------===// |
| 5 | +// |
| 6 | +// BusTub |
| 7 | +// |
| 8 | +// rid.h |
| 9 | +// |
| 10 | +// Identification: src/include/common/rid.h |
| 11 | +// |
| 12 | +// Copyright (c) 2015-2019, Carnegie Mellon University Database Group |
| 13 | +// |
| 14 | +//===----------------------------------------------------------------------===// |
| 15 | +''' |
| 16 | +# ref: https://github.com/cmu-db/bustub/blob/master/script/formatting/formatter.py |
38 | 17 |
|
| 18 | +''' |
| 19 | +Usage: example |
| 20 | + python format_header.py src/include/storage/page/b_plus_tree_page.h \ |
| 21 | + src/include/storage/page/b_plus_tree_leaf_page.h |
39 | 22 |
|
40 | | -# ref: https://github.com/cmu-db/bustub/blob/master/script/formatting/formatter.py |
| 23 | +then you will get the header in b_plus_tree_page.h. |
| 24 | +//===----------------------------------------------------------------------===// |
| 25 | +// |
| 26 | +// BusTub |
| 27 | +// |
| 28 | +// b_plus_tree_page.h |
| 29 | +// |
| 30 | +// Identification: src/include/storage/page/b_plus_tree_page.h |
| 31 | +// |
| 32 | +// Copyright (c) 2015-2023, Carnegie Mellon University Database Group |
| 33 | +// |
| 34 | +//===----------------------------------------------------------------------===// |
41 | 35 |
|
| 36 | +similar results insert in b_plus_tree_leaf_page.h. |
42 | 37 |
|
43 | | -import argparse |
44 | | -import logging |
45 | | -import os |
46 | | -import re |
47 | | -import sys |
48 | | -import datetime |
49 | | -import subprocess |
50 | | -from functools import reduce |
51 | | -from helpers import CLANG_FORMAT, BUSTUB_DIR, CLANG_FORMAT_FILE, LOG,\ |
52 | | - clang_format, hunks_from_staged_files, hunks_from_last_commits |
| 38 | +''' |
53 | 39 |
|
54 | 40 |
|
| 41 | +import os |
| 42 | +import datetime |
| 43 | +import sys |
| 44 | +BUSTUB_DIR = os.path.abspath(os.path.dirname( |
| 45 | + __file__)).replace('/build_support', '') |
55 | 46 | BUSTUB_SRC_DIR = os.path.join(BUSTUB_DIR, "src") |
56 | 47 | BUSTUB_TESTS_DIR = os.path.join(BUSTUB_DIR, "test") |
57 | 48 |
|
|
60 | 51 | DEFAULT_DIRS.append(BUSTUB_SRC_DIR) |
61 | 52 | DEFAULT_DIRS.append(BUSTUB_TESTS_DIR) |
62 | 53 |
|
| 54 | + |
63 | 55 | # header framework, dynamic information will be added inside function |
64 | 56 | header_comment_line_1 = "//===----------------------------------------------------------------------===//\n" |
65 | 57 | header_comment_line_1 += "//\n" |
66 | | -header_comment_line_1 += "// CMU-DB Project (15-445/645)\n" |
67 | | -header_comment_line_2 = "// ***DO NO SHARE PUBLICLY***\n" |
| 58 | +header_comment_line_1 += "// BusTub\n" |
| 59 | +header_comment_line_2 = "//\n" |
68 | 60 | header_comment_line_3 = "// " |
69 | 61 | header_comment_line_4 = "//\n" |
70 | 62 | header_comment_line_5 = "// Identification: " |
71 | 63 | header_comment_line_6 = "//\n" |
72 | | -header_comment_line_7 = "// Copyright (c) %d, Carnegie Mellon University Database Group\n" % datetime.datetime.now().year |
| 64 | +header_comment_line_7 = "// Copyright (c) 2015-%d, Carnegie Mellon University Database Group\n" % datetime.datetime.now().year |
73 | 65 | header_comment_line_8 = "//\n" |
74 | 66 | header_comment_line_9 = "//===----------------------------------------------------------------------===//\n\n" |
75 | 67 |
|
76 | | -header_comment_1 = header_comment_line_1 + header_comment_line_2 |
77 | | -header_comment_3 = header_comment_line_4 |
78 | | -header_comment_5 = header_comment_line_6 + header_comment_line_7 \ |
79 | | - + header_comment_line_8 + header_comment_line_9 |
| 68 | +header_comment_line_6 = header_comment_line_6 + \ |
| 69 | + header_comment_line_7+header_comment_line_8+header_comment_line_9 |
80 | 70 |
|
81 | | -HEADER_REGEX = re.compile( |
82 | | - r"((\/\/===-*===\/\/\n(\/\/.*\n)*\/\/===-*===\/\/[\n]*)\n\n)*") |
| 71 | +header_comment_line_1 += header_comment_line_2 |
83 | 72 |
|
84 | 73 |
|
85 | | -# ============================================== |
86 | | -# UTILITY FUNCTION DEFINITIONS |
87 | | -# ============================================== |
| 74 | +def add_file_header(file: str): |
| 75 | + """add header to this file.""" |
| 76 | + if not file.endswith('.h'): |
| 77 | + return |
| 78 | + file_path = os.path.join(BUSTUB_DIR, file) |
88 | 79 |
|
| 80 | + if not os.path.isfile(file_path): |
| 81 | + return |
89 | 82 |
|
90 | | -def format_file(file_path, file_hunks, update_header, clang_format_code): |
91 | | - """Formats the file passed as argument.""" |
92 | | - file_name = os.path.basename(file_path) |
93 | | - abs_path = os.path.abspath(file_path) |
94 | | - rel_path_from_bustub_dir = os.path.relpath(abs_path, BUSTUB_DIR) |
| 83 | + dir_flag = False |
| 84 | + for deafult_dir in DEFAULT_DIRS: |
| 85 | + if file_path.startswith(deafult_dir): |
| 86 | + dir_flag = True |
| 87 | + break |
| 88 | + if not dir_flag: |
| 89 | + return |
95 | 90 |
|
96 | | - with open(file_path, "r+") as file: |
97 | | - file_data = file.read() |
| 91 | + file_name = os.path.basename(file) |
98 | 92 |
|
99 | | - if update_header: |
100 | | - # strip old header if it exists |
101 | | - header_match = HEADER_REGEX.match(file_data) |
102 | | - if not header_match is None: |
103 | | - LOG.info("Strip header from %s", file_name) |
104 | | - header_comment = header_match.group() |
105 | | - LOG.debug("Header comment : %s", header_comment) |
106 | | - file_data = file_data.replace(header_comment, "") |
| 93 | + header_comment_filename = header_comment_line_3+file_name+'\n' |
| 94 | + header_comment_relpath = header_comment_line_5+file + '\n' |
| 95 | + header_commnt = header_comment_line_1 + header_comment_filename + \ |
| 96 | + header_comment_line_4+header_comment_relpath+header_comment_line_6 |
107 | 97 |
|
108 | | - # add new header |
109 | | - LOG.info("Add header to %s", file_name) |
110 | | - header_comment_2 = header_comment_line_3 + file_name + "\n" |
111 | | - header_comment_4 = header_comment_line_5\ |
112 | | - + rel_path_from_bustub_dir + "\n" |
113 | | - header_comment = header_comment_1 + header_comment_2 \ |
114 | | - + header_comment_3 + header_comment_4 \ |
115 | | - + header_comment_5 |
116 | | - # print header_comment |
| 98 | + with open(file_path, 'r+') as f: |
| 99 | + # maybe use sed -i '' file |
| 100 | + old = f.read() |
| 101 | + f.seek(0) |
| 102 | + f.write(header_commnt) |
| 103 | + f.write(old) |
117 | 104 |
|
118 | | - file_data = header_comment + file_data |
119 | | - |
120 | | - file.seek(0, 0) |
121 | | - file.truncate() |
122 | | - file.write(file_data) |
123 | | - |
124 | | - elif clang_format_code: |
125 | | - clang_format(file_path, file_hunks) |
126 | | - |
127 | | - # END WITH |
128 | | -# END FORMAT__FILE(FILE_NAME) |
129 | | - |
130 | | - |
131 | | -def format_dir(dir_path, update_header, clang_format_code): |
132 | | - """Formats all the files in the dir passed as argument.""" |
133 | | - for subdir, _, files in os.walk(dir_path): # _ is for directories. |
134 | | - for file in files: |
135 | | - # print os.path.join(subdir, file) |
136 | | - file_path = subdir + os.path.sep + file |
137 | | - |
138 | | - if file_path.endswith(".h") or file_path.endswith(".cpp"): |
139 | | - format_file(file_path, None, update_header, clang_format_code) |
140 | | - # END IF |
141 | | - # END FOR [file] |
142 | | - # END FOR [os.walk] |
143 | | -# END ADD_HEADERS_DIR(DIR_PATH) |
144 | | - |
145 | | - |
146 | | -# ============================================== |
147 | | -# Main Function |
148 | | -# ============================================== |
149 | 105 |
|
150 | 106 | if __name__ == '__main__': |
151 | | - |
152 | | - PARSER = argparse.ArgumentParser( |
153 | | - description='Update headers and/or format source code' |
154 | | - ) |
155 | | - |
156 | | - PARSER.add_argument( |
157 | | - "-u", "--update-header", |
158 | | - help='Action: Update existing headers or add new ones', |
159 | | - action='store_true' |
160 | | - ) |
161 | | - PARSER.add_argument( |
162 | | - "-c", "--clang-format-code", |
163 | | - help='Action: Apply clang-format to source code', |
164 | | - action='store_true' |
165 | | - ) |
166 | | - PARSER.add_argument( |
167 | | - "-f", "--staged-files", |
168 | | - help='Action: Apply the selected action(s) to all staged files (git). ' + |
169 | | - '(clang-format will only touch the staged lines)', |
170 | | - action='store_true' |
171 | | - ) |
172 | | - PARSER.add_argument( |
173 | | - "-n", "--number-commits", |
174 | | - help='Action: Apply the selected action(s) to all changes of the last ' + |
175 | | - '<n> commits (clang-format will only touch the changed lines)', |
176 | | - type=int, default=0 |
177 | | - ) |
178 | | - PARSER.add_argument( |
179 | | - 'paths', metavar='PATH', type=str, nargs='*', |
180 | | - help='Files or directories to (recursively) apply the actions to' |
181 | | - ) |
182 | | - |
183 | | - ARGS = PARSER.parse_args() |
184 | | - |
185 | | - # TARGETS is a list of files with an optional list of hunks, represented as |
186 | | - # pair (start, end) of line numbers, 1 based. |
187 | | - # element of TARGETS: (filename, None) or (filename, [(start,end)]) |
188 | | - |
189 | | - if ARGS.staged_files: |
190 | | - TARGETS = hunks_from_staged_files() |
191 | | - |
192 | | - if not TARGETS: |
193 | | - LOG.error( |
194 | | - "no staged files or not calling from a repository -- exiting" |
195 | | - ) |
196 | | - sys.exit("no staged files or not calling from a repository") |
197 | | - |
198 | | - elif ARGS.number_commits > 0: |
199 | | - TARGETS = hunks_from_last_commits(ARGS.number_commits) |
200 | | - |
201 | | - if not TARGETS: |
202 | | - LOG.error( |
203 | | - "no changes could be extracted for formatting -- exiting" |
204 | | - ) |
205 | | - sys.exit("no changes could be extracted for formatting") |
206 | | - |
207 | | - elif not ARGS.paths: |
208 | | - LOG.error("no files or directories given -- exiting") |
209 | | - sys.exit("no files or directories given") |
210 | | - |
211 | | - else: |
212 | | - TARGETS = [(f, None) for f in ARGS.paths] |
213 | | - |
214 | | - for f, hunks in TARGETS: |
215 | | - if os.path.isfile(f): |
216 | | - LOG.info("Scanning file: %s", f) |
217 | | - format_file(f, hunks, ARGS.update_header, ARGS.clang_format_code) |
218 | | - elif os.path.isdir(f): |
219 | | - LOG.info("Scanning directory %s", f) |
220 | | - format_dir(f, ARGS.update_header, ARGS.clang_format_code) |
221 | | - # FOR |
222 | | -# IF |
| 107 | + for file in sys.argv[1:]: |
| 108 | + add_file_header(file) |
0 commit comments