diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..5451a58 --- /dev/null +++ b/.clang-format @@ -0,0 +1,66 @@ +# After playing around: http://cf.monofraps.net/ +# +BasedOnStyle: LLVM +AccessModifierOffset: -1 +AlignAfterOpenBracket: true +AlignEscapedNewlinesLeft: false +AlignOperands: true +AlignTrailingComments: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortBlocksOnASingleLine: true +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: All +AllowShortIfStatementsOnASingleLine: true +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: false +AlwaysBreakAfterReturnType: AllDefinitions +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: true +BinPackArguments: true +BinPackParameters: true +BreakBeforeBinaryOperators: None +BreakBeforeBraces: Attach +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +ColumnLimit: 80 +CommentPragmas: '^ IWYU pragma:' +ConstructorInitializerAllOnOneLineOrOnePerLine: false +ConstructorInitializerIndentWidth: 2 +ContinuationIndentWidth: 2 +Cpp11BracedListStyle: true +DerivePointerAlignment: false +DisableFormat: false +ExperimentalAutoDetectBinPacking: false +IndentCaseLabels: false +IndentWidth: 2 +IndentWrappedFunctionNames: false +KeepEmptyLinesAtTheStartOfBlocks: true +Language: Cpp +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCBlockIndentWidth: 2 +ObjCSpaceAfterProperty: false +ObjCSpaceBeforeProtocolList: true +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakString: 1000 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 60 +PointerAlignment: Right +SpaceAfterCStyleCast: false +SpaceBeforeAssignmentOperators: true +SpaceBeforeParens: ControlStatements +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 2 +SpacesInAngles: false +SpacesInCStyleCastParentheses: false +SpacesInContainerLiterals: true +SpacesInParentheses: false +SpacesInSquareBrackets: false +Standard: Cpp11 +UseTab: Never +TabWidth: 2 +# IncludeCategories: +# - Regex: '^' +# Priority: 2 \ No newline at end of file diff --git a/fmt.py b/fmt.py new file mode 100644 index 0000000..cc1acc5 --- /dev/null +++ b/fmt.py @@ -0,0 +1,237 @@ +#!/usr/bin/env python + +import os +import sys +import subprocess +import datetime +import logging +import logging.handlers +import argparse +import distutils.util + +fmt_string = 'smf::fmt %(levelname)s:%(asctime)s %(filename)s:%(lineno)d] %(message)s' +logging.basicConfig(format=fmt_string) +formatter = logging.Formatter(fmt_string) + +for h in logging.getLogger().handlers: + h.setFormatter(formatter) + +logger = logging.getLogger('smf::fmt') +logger.setLevel(logging.INFO) + + +def generate_options(): + parser = argparse.ArgumentParser(description='run smf formatter fmt.py') + parser.add_argument( + '--log', + type=str, + default='INFO', + help='info,debug, type log levels. i.e: --log=debug') + parser.add_argument( + '--tidy', + type=distutils.util.strtobool, + default='false', + help='run formatter with clang-tidy') + parser.add_argument( + '--incremental', + type=distutils.util.strtobool, + default='false', + help='run formatter ONLY on last commit') + return parser + + +def get_git_root(): + ret = str( + subprocess.check_output("git rev-parse --show-toplevel", shell=True)) + assert ret is not None, "Failed getting git root" + return "".join(ret.split()) + + +def get_build_dir_type(d): + build_dir = "%s/build_%s" % (get_git_root(), d) + if not os.path.isdir(build_dir): return None + return build_dir + + +def get_debug_build_dir(): + return get_build_dir_type("debug") + + +def get_release_build_dir(): + return get_build_dir_type("release") + + +def run_subprocess(cmd): + logger.debug("Executing command: %s" % cmd) + proc = subprocess.Popen( + "exec %s" % cmd, stdout=sys.stdout, stderr=sys.stderr, shell=True) + return_code = 0 + try: + return_code = proc.wait() + sys.stdout.flush() + sys.stderr.flush() + except Exception as e: + logger.exception("Could not run command: % ", e) + proc.kill() + raise + + if return_code != 0: + raise subprocess.CalledProcessError(return_code, cmd) + + +def get_clang_prog(prog): + """ALL tools for clang should be pinned to one version""" + CLANG_SOURCE_VERSION = "7.0.1" + ret = subprocess.check_output("which %s" % prog, shell=True) + if ret != None: + original = "".join(str(ret).split()) + if "".join( + str( + subprocess.check_output( + "%s --version | grep %s | awk \'{print $3}\'" % + (original, CLANG_SOURCE_VERSION), + shell=True)).split()) != CLANG_SOURCE_VERSION: + return None + return original + return None + + +def get_clang_format(options): + return get_clang_prog("clang-format") + + +def get_clang_tidy(options): + if options.tidy == True: + clang_tidy = get_clang_prog("clang-tidy") + if not clang_tidy: + raise Exception( + "error tried to run clang tidy but binary not found") + return clang_tidy + else: + return None + + +def get_git_files(options): + git_args = 'ls-files' + if options.incremental == True: + git_args = 'show --pretty="" --name-only' + ret = str( + subprocess.check_output( + "cd %s && git %s" % (get_git_root(), git_args), shell=True)) + assert ret is not None, "Failed getting files tracked by git" + + # Ensure that you keep this up to date w/ files you want to skip + white_list = ["src/include/smf/rpc_generated.h"] + return list(filter(lambda x: x not in white_list, ret.split("\n"))) + + +def is_clang_fmt_file(filename): + for ext in [".cc", ".cpp", ".h", ".hpp", ".proto", ".java", ".js"]: + if filename.endswith(ext): return True + return False + + +def is_clang_tidy_file(filename): + for ext in [".cc", ".cpp"]: + if filename.endswith(ext): return True + return False + + +def is_double_slash(filename): + if is_clang_fmt_file(filename): return True + for ext in [".scala", ".fbs"]: + if filename.endswith(ext): return True + return False + + +def get_legal_header(filename): + hdr = "%s Copyright %s %s\n%s\n\n" + + def comment_char(): + if is_double_slash(filename): return "//" + return "#" + + return hdr % (comment_char(), datetime.date.today().year, "SMF Authors", + comment_char()) + + +def is_script_file(filename): + for ext in [".sh", ".bash", ".py"]: + if filename.endswith(ext): return True + return False + + +def double_slash_legal(filename): + if is_double_slash(filename): + with open(filename, "r+b") as f: + last_pos = f.tell() + line1 = f.readline() + if "// Copyright" not in line1: + f.seek(last_pos) + content = f.read() + f.seek(0) + f.write(get_legal_header(filename)) + f.write(content) + + +def hash_legal(filename): + if is_script_file(filename): + with open(filename, "r+b") as f: + last_pos = f.tell() + line1 = f.readline() + content = f.read() + if "# Copyright" not in content: + f.seek(0) + f.write(line1) + f.write('\n') + f.write(get_legal_header(filename)) + f.write(content) + + +def insert_legal(filename): + double_slash_legal(filename) + hash_legal(filename) + + +def main(): + parser = generate_options() + options, program_options = parser.parse_known_args() + logger.info("Options --log=%s" % options.log) + logger.info("Options --tidy=%s" % options.tidy) + logger.info("Options --incremental=%s" % options.incremental) + logger.setLevel(getattr(logging, options.log.upper(), None)) + + files = get_git_files(options) + clang_fmt = get_clang_format(options) + clang_tidy = get_clang_tidy(options) + root = get_git_root() + + logger.info("Git root: %s" % root) + logger.info("Formatting %s files" % len(files)) + logger.info("Clang format: %s" % clang_fmt) + logger.info("Clang tidy: %s" % clang_tidy) + + for f in files: + f = "%s/%s" % (root, f) + logger.debug("Formatting file: %s" % f) + sys.stdout.write(".") + insert_legal(f) + try: + if is_clang_fmt_file(f): + # fixing code + if is_clang_tidy_file(f) and clang_tidy != None: + run_subprocess("%s -header-filter=.* -fix %s" % + (clang_tidy, f)) + # fixing formatting + if clang_fmt != None: + run_subprocess("%s -i %s" % (clang_fmt, f)) + + except Exception as e: + logger.exception("Error %s, file: %s" % (e, f)) + sys.exit(1) + + sys.stdout.write("\nDone\n") + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/src/main/java/example/demo/Request.java b/src/main/java/example/demo/Request.java index c0b84d8..5d0bf32 100644 --- a/src/main/java/example/demo/Request.java +++ b/src/main/java/example/demo/Request.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + // automatically generated by the FlatBuffers compiler, do not modify package example.demo; diff --git a/src/main/java/example/demo/Response.java b/src/main/java/example/demo/Response.java index 723730a..2b6cbfe 100644 --- a/src/main/java/example/demo/Response.java +++ b/src/main/java/example/demo/Response.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + // automatically generated by the FlatBuffers compiler, do not modify package example.demo; diff --git a/src/main/java/example/demo/client/DemoApp.java b/src/main/java/example/demo/client/DemoApp.java index 1c5b61b..02896cf 100644 --- a/src/main/java/example/demo/client/DemoApp.java +++ b/src/main/java/example/demo/client/DemoApp.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + package example.demo.client; import com.google.flatbuffers.FlatBufferBuilder; diff --git a/src/main/java/example/demo/client/SmfStorageClient.java b/src/main/java/example/demo/client/SmfStorageClient.java index 8ba6430..b0c305e 100644 --- a/src/main/java/example/demo/client/SmfStorageClient.java +++ b/src/main/java/example/demo/client/SmfStorageClient.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + package example.demo.client; import example.demo.Response; diff --git a/src/main/java/example/demo/server/DemoServer.java b/src/main/java/example/demo/server/DemoServer.java index 732acf8..7f31639 100644 --- a/src/main/java/example/demo/server/DemoServer.java +++ b/src/main/java/example/demo/server/DemoServer.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + package example.demo.server; import com.google.flatbuffers.FlatBufferBuilder; diff --git a/src/main/java/smf.fbs b/src/main/java/smf.fbs index b0407e9..8d6f9df 100644 --- a/src/main/java/smf.fbs +++ b/src/main/java/smf.fbs @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + // // smf rpc flatbuffers changed to conform Go language style. // diff --git a/src/main/java/smf/CompressionFlags.java b/src/main/java/smf/CompressionFlags.java index 487c04f..0328343 100644 --- a/src/main/java/smf/CompressionFlags.java +++ b/src/main/java/smf/CompressionFlags.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + // automatically generated by the FlatBuffers compiler, do not modify package smf; diff --git a/src/main/java/smf/DynamicHeader.java b/src/main/java/smf/DynamicHeader.java index 1e3f938..3cb2f85 100644 --- a/src/main/java/smf/DynamicHeader.java +++ b/src/main/java/smf/DynamicHeader.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + // automatically generated by the FlatBuffers compiler, do not modify package smf; diff --git a/src/main/java/smf/Header.java b/src/main/java/smf/Header.java index 622fcd5..d577df2 100644 --- a/src/main/java/smf/Header.java +++ b/src/main/java/smf/Header.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + // automatically generated by the FlatBuffers compiler, do not modify package smf; diff --git a/src/main/java/smf/HeaderBitFlags.java b/src/main/java/smf/HeaderBitFlags.java index 34e14ab..41258d1 100644 --- a/src/main/java/smf/HeaderBitFlags.java +++ b/src/main/java/smf/HeaderBitFlags.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + // automatically generated by the FlatBuffers compiler, do not modify package smf; diff --git a/src/main/java/smf/PayloadHeaders.java b/src/main/java/smf/PayloadHeaders.java index 8e6fa1f..9da4f5a 100644 --- a/src/main/java/smf/PayloadHeaders.java +++ b/src/main/java/smf/PayloadHeaders.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + // automatically generated by the FlatBuffers compiler, do not modify package smf; diff --git a/src/main/java/smf/client/core/Dispatcher.java b/src/main/java/smf/client/core/Dispatcher.java index 9f69794..cb59e46 100644 --- a/src/main/java/smf/client/core/Dispatcher.java +++ b/src/main/java/smf/client/core/Dispatcher.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + package smf.client.core; import io.netty.channel.ChannelHandlerContext; diff --git a/src/main/java/smf/client/core/PreparedRpcRequest.java b/src/main/java/smf/client/core/PreparedRpcRequest.java index d2c3caa..63b6e61 100644 --- a/src/main/java/smf/client/core/PreparedRpcRequest.java +++ b/src/main/java/smf/client/core/PreparedRpcRequest.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + package smf.client.core; import java.nio.ByteBuffer; diff --git a/src/main/java/smf/client/core/RpcRequestEncoder.java b/src/main/java/smf/client/core/RpcRequestEncoder.java index 5e0d834..e61ab7f 100644 --- a/src/main/java/smf/client/core/RpcRequestEncoder.java +++ b/src/main/java/smf/client/core/RpcRequestEncoder.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + package smf.client.core; import com.google.flatbuffers.FlatBufferBuilder; diff --git a/src/main/java/smf/client/core/RpcRequestOptions.java b/src/main/java/smf/client/core/RpcRequestOptions.java index ea5f8be..af9a819 100644 --- a/src/main/java/smf/client/core/RpcRequestOptions.java +++ b/src/main/java/smf/client/core/RpcRequestOptions.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + package smf.client.core; import java.util.Objects; diff --git a/src/main/java/smf/client/core/RpcResponseDecoder.java b/src/main/java/smf/client/core/RpcResponseDecoder.java index 7f4154a..ca17de9 100644 --- a/src/main/java/smf/client/core/RpcResponseDecoder.java +++ b/src/main/java/smf/client/core/RpcResponseDecoder.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + package smf.client.core; import io.netty.buffer.ByteBuf; diff --git a/src/main/java/smf/client/core/SessionIdGenerator.java b/src/main/java/smf/client/core/SessionIdGenerator.java index 345f35f..53f9ce2 100644 --- a/src/main/java/smf/client/core/SessionIdGenerator.java +++ b/src/main/java/smf/client/core/SessionIdGenerator.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + package smf.client.core; import smf.client.core.exceptions.SessionIdGenerationException; diff --git a/src/main/java/smf/client/core/SmfClient.java b/src/main/java/smf/client/core/SmfClient.java index 3d2ba1a..ae07837 100644 --- a/src/main/java/smf/client/core/SmfClient.java +++ b/src/main/java/smf/client/core/SmfClient.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + package smf.client.core; import io.netty.bootstrap.Bootstrap; diff --git a/src/main/java/smf/client/core/exceptions/SessionIdGenerationException.java b/src/main/java/smf/client/core/exceptions/SessionIdGenerationException.java index a7c34f3..203bd2b 100644 --- a/src/main/java/smf/client/core/exceptions/SessionIdGenerationException.java +++ b/src/main/java/smf/client/core/exceptions/SessionIdGenerationException.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + package smf.client.core.exceptions; /** diff --git a/src/main/java/smf/common/InvalidRpcResponse.java b/src/main/java/smf/common/InvalidRpcResponse.java index bc399bf..53b082b 100644 --- a/src/main/java/smf/common/InvalidRpcResponse.java +++ b/src/main/java/smf/common/InvalidRpcResponse.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + package smf.common; import smf.Header; diff --git a/src/main/java/smf/common/RpcRequest.java b/src/main/java/smf/common/RpcRequest.java index 05253bd..452a84f 100644 --- a/src/main/java/smf/common/RpcRequest.java +++ b/src/main/java/smf/common/RpcRequest.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + package smf.common; import smf.Header; diff --git a/src/main/java/smf/common/RpcResponse.java b/src/main/java/smf/common/RpcResponse.java index d084f66..bd5722d 100644 --- a/src/main/java/smf/common/RpcResponse.java +++ b/src/main/java/smf/common/RpcResponse.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + package smf.common; import smf.Header; diff --git a/src/main/java/smf/common/compression/CompressionService.java b/src/main/java/smf/common/compression/CompressionService.java index b033089..479c552 100644 --- a/src/main/java/smf/common/compression/CompressionService.java +++ b/src/main/java/smf/common/compression/CompressionService.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + package smf.common.compression; import com.github.luben.zstd.Zstd; diff --git a/src/main/java/smf/common/exceptions/ClosedRpcRequestException.java b/src/main/java/smf/common/exceptions/ClosedRpcRequestException.java index 90d30e8..a26e00c 100644 --- a/src/main/java/smf/common/exceptions/ClosedRpcRequestException.java +++ b/src/main/java/smf/common/exceptions/ClosedRpcRequestException.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + package smf.common.exceptions; public class ClosedRpcRequestException extends RuntimeException { diff --git a/src/main/java/smf/common/exceptions/InvalidChecksumException.java b/src/main/java/smf/common/exceptions/InvalidChecksumException.java index 11993df..f4c71ba 100644 --- a/src/main/java/smf/common/exceptions/InvalidChecksumException.java +++ b/src/main/java/smf/common/exceptions/InvalidChecksumException.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + package smf.common.exceptions; public class InvalidChecksumException extends RuntimeException { diff --git a/src/main/java/smf/common/transport/BootstrapFactory.java b/src/main/java/smf/common/transport/BootstrapFactory.java index 1ad73d8..6f84d07 100644 --- a/src/main/java/smf/common/transport/BootstrapFactory.java +++ b/src/main/java/smf/common/transport/BootstrapFactory.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + package smf.common.transport; import io.netty.bootstrap.Bootstrap; diff --git a/src/main/java/smf/common/transport/ClientTransport.java b/src/main/java/smf/common/transport/ClientTransport.java index 444ef1a..f6da691 100644 --- a/src/main/java/smf/common/transport/ClientTransport.java +++ b/src/main/java/smf/common/transport/ClientTransport.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + package smf.common.transport; import io.netty.bootstrap.Bootstrap; diff --git a/src/main/java/smf/common/transport/ServerTransport.java b/src/main/java/smf/common/transport/ServerTransport.java index 22a5e5d..a5d55be 100644 --- a/src/main/java/smf/common/transport/ServerTransport.java +++ b/src/main/java/smf/common/transport/ServerTransport.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + package smf.common.transport; import io.netty.bootstrap.ServerBootstrap; diff --git a/src/main/java/smf/server/core/RequestHandler.java b/src/main/java/smf/server/core/RequestHandler.java index fef7d03..9097ac4 100644 --- a/src/main/java/smf/server/core/RequestHandler.java +++ b/src/main/java/smf/server/core/RequestHandler.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + package smf.server.core; import io.netty.channel.ChannelHandler; diff --git a/src/main/java/smf/server/core/RpcRequestDecoder.java b/src/main/java/smf/server/core/RpcRequestDecoder.java index ac368bd..dd01268 100644 --- a/src/main/java/smf/server/core/RpcRequestDecoder.java +++ b/src/main/java/smf/server/core/RpcRequestDecoder.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + package smf.server.core; import io.netty.buffer.ByteBuf; diff --git a/src/main/java/smf/server/core/RpcResponseEncoder.java b/src/main/java/smf/server/core/RpcResponseEncoder.java index 21a478e..5d6ce8d 100644 --- a/src/main/java/smf/server/core/RpcResponseEncoder.java +++ b/src/main/java/smf/server/core/RpcResponseEncoder.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + package smf.server.core; import com.google.flatbuffers.FlatBufferBuilder; diff --git a/src/main/java/smf/server/core/RpcService.java b/src/main/java/smf/server/core/RpcService.java index 2e195cd..7bb0644 100644 --- a/src/main/java/smf/server/core/RpcService.java +++ b/src/main/java/smf/server/core/RpcService.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + package smf.server.core; import java.nio.ByteBuffer; diff --git a/src/main/java/smf/server/core/SmfServer.java b/src/main/java/smf/server/core/SmfServer.java index 82bd915..f48b00a 100644 --- a/src/main/java/smf/server/core/SmfServer.java +++ b/src/main/java/smf/server/core/SmfServer.java @@ -1,3 +1,6 @@ +// Copyright 2019 SMF Authors +// + package smf.server.core; import io.netty.bootstrap.ServerBootstrap;