ceph/CodingStyle
Sage Weil 2f361a6eee relicense LGPL-2.1 code as LGPL-2.1 or LGPL-3.0
The primary motivation to relicense is a desire to integrate with projects
that are licensed under the Apache License version 2.0.  Although opinions
vary, there are some who argue the the LGPL-2.1 and Apache-2.0 licenses
are not fully compatible.  We would like to avoid the ambiguity and
potential for controversy.

Projects we would like to consume that are Apache-2.0 licensed include
Seastar, OpenSSL (which is in the process of relicensing to Apache-2.0),
and Swagger (swagger.io).  Note that some of these are dynamically linked
or consumed via a high-level language and may or may not require a change
to LGPL-3.0, but providing the option for LGPL-3.0 certainly avoids any
uncertainty.

A few other source files are already incorporated into Ceph that claim an
Apache-2.0 license:

    src/common/deleter.h
    src/common/sstring.h
    src/include/cpp-btree

The Ceph developers would further like to provide a license option that is
more modern than the current LGPL-2.1.  LGPL-3.0 includes updated,
clarified language around several issues and is widely considered
more modern, superior license.

Signed-off-by: Sage Weil <sage@redhat.com>
2019-04-22 11:22:55 -05:00

165 lines
3.9 KiB
Plaintext

Ceph Coding style
-----------------
Coding style is most important for new code and (to a lesser extent)
revised code. It is not worth the churn to simply reformat old code.
C code
------
For C code, we conform by the Linux kernel coding standards:
https://www.kernel.org/doc/Documentation/CodingStyle
C++ code
--------
For C++ code, things are a bit more complex. As a baseline, we use Google's
coding guide:
https://google.github.io/styleguide/cppguide.html
As an addendum to the above, we add the following guidelines, organized
by section.
* Naming > Type Names:
Google uses CamelCaps for all type names. We use two naming schemes:
- for naked structs (simple data containers), lower case with _t.
Yes, _t also means typedef. It's perhaps not ideal.
struct my_type_t {
int a = 0, b = 0;
void encode(...) ...
...
};
- for full-blown classes, CamelCaps, private: section, accessors,
probably not copyable, etc.
* Naming > Variable Names:
Google uses _ suffix for class members. That's ugly. We'll use
a m_ prefix, like so, or none at all.
class Foo {
public:
int get_foo() const { return m_foo; }
void set_foo(int foo) { m_foo = foo; }
private:
int m_foo;
};
* Naming > Constant Names:
Google uses kSomeThing for constants. We prefer SOME_THING.
* Naming > Function Names:
Google uses CamelCaps. We use_function_names_with_underscores().
Accessors are the same, {get,set}_field().
* Naming > Enumerator Names:
Name them like constants, as above (SOME_THING).
* Comments > File Comments:
Don't sweat it, unless the license varies from that of the project
(LGPL2.1 or LGPL3.0) or the code origin isn't reflected by the git history.
* Formatting > Tabs:
Indent width is two spaces. When runs of 8 spaces can be compressed
to a single tab character, do so. The standard Emacs/Vim settings
header is:
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
// vim: ts=8 sw=2 smarttab
* Formatting > Conditionals:
- No spaces inside conditionals please, e.g.
if (foo) { // okay
if ( foo ) { // no
- Always use newline following if, and use braces:
if (foo) {
bar; // like this, even for a one-liner
}
if (foo)
bar; // no, usually harder to parse visually
if (foo) bar; // no
if (foo) { bar; } // definitely no
* Header Files -> The `#define` Guard:
`#pragma once` is allowed for simplicity at the expense of
portability sinces `#pragma once` is wildly supported and is known
to work on GCC and Clang.
The following guidelines have not been followed in the legacy code,
but are worth mentioning and should be followed strictly for new code:
* Header Files > Function Parameter Ordering:
Inputs, then outputs.
* Classes > Explicit Constructors:
You should normally mark constructors explicit to avoid getting silent
type conversions.
* Classes > Copy Constructors:
- Use defaults for basic struct-style data objects.
- Most other classes should DISALLOW_COPY_AND_ASSIGN.
- In rare cases we can define a proper copy constructor and operator=.
* Other C++ Features > Reference Arguments:
Only use const references. Use pointers for output arguments.
* Other C++ Features > Avoid Default Arguments:
They obscure the interface.
Python code
-----------
For new python code, PEP-8 should be observed:
https://www.python.org/dev/peps/pep-0008/
Existing code can be refactored to adhere to PEP-8, and cleanups are welcome.
JavaScript / TypeScript
-----------------------
For Angular code, we follow the official Angular style guide:
https://angular.io/guide/styleguide
To check whether your code is conformant with the style guide, we use a
combination of TSLint, Codelyzer and Prettier:
https://palantir.github.io/tslint/
http://codelyzer.com/
https://prettier.io/