On Wed, 2018-02-07 at 11:35 +0100, Christophe de Dinechin wrote:
> > On 7 Feb 2018, at 11:01, Frediano Ziglio <fzig...@redhat.com> wrote:
> > 
> > > 
> > > From: Christophe de Dinechin <dinec...@redhat.com>
> > > 
> > > Signed-off-by: Christophe de Dinechin <dinec...@redhat.com>
> > > ---
> > > docs/spice_style.txt | 113
> > > ++++++++++++++++++++++++++++++++++++---------------
> > > 1 file changed, 81 insertions(+), 32 deletions(-)
> > > 
> > > diff --git a/docs/spice_style.txt b/docs/spice_style.txt
> > > index eb0e30ef..8e2e7363 100644
> > > --- a/docs/spice_style.txt
> > > +++ b/docs/spice_style.txt
> > > @@ -1,7 +1,7 @@
> > > Spice project coding style and coding conventions
> > > =================================================
> > > 
> > > -Copyright (C) 2009-2016 Red Hat, Inc.
> > > +Copyright (C) 2009-2018 Red Hat, Inc.
> > > Licensed under a Creative Commons Attribution-Share Alike 3.0
> > > United States License (see
> > > http://creativecommons.org/licenses/by-sa/3.0/us/legalcode).
> > > 
> > > @@ -14,7 +14,16 @@ Names
> > > 
> > > Use lower case and separate words using dashes (e.g., file-name.c,
> > > header.h).
> > > 
> > > -Use standard file extension for C source and header files.
> > > +The file extensions used in the SPICE project are:
> > > +- .c for C source
> > > +- .cpp for C++ sources
> > > +- .h for headers that can be included from C code
> > > +- .hpp for headers that are strictly reserved to C++
> > > +- .m for Objective-C source files (currently not properly enforced)
> > > +
> > > +Note that .h headers may contain C++ code as long as the header can
> > > +sucessfully be included from a C source file.
> > > +
> > 
> > typo "sucessfully".
> > Why .m ? Can't wait ? :-) 
> 
> While I was looking at it, I thought I’d mention it.
> AFAIK, there is only one file that should be renamed, 
> vncdisplaykeymap_xorgxquartz2xtkbd.c.
> That file really needs Obj-C
> 
> > 
> > > 
> > > Line width
> > > ~~~~~~~~~~
> > > @@ -73,7 +82,11 @@ Comments that are prefixed with `FIXME` describe a bug
> > > that need to be fixed. Ge
> > > ASSERT
> > > ------
> > > 
> > > -Use it freely. ASSERT helps testing function arguments and function 
> > > results
> > > validity.  ASSERT helps detecting bugs and improve code readability and
> > > stability.
> > > +Use assertions liberally. They helps testing function arguments and 
> > > function
> > > results validity. Assertions helps detecting bugs and improve code
> > > readability and stability.
> > > +
> > > +Several form of assertion exist, notably:
> > > +- spice_assert which should be preferred for any assertion related to 
> > > SPICE
> > > itself
> > > +- glib asserts (many forms) which should be preferred for any assertion
> > > related to the use of glib
> > > 
> > 
> > Actually I think the original ASSERT here were supposed to be more like
> > Windows. Note that on SPICE we never use assert as C, we always compile
> > them in.
> 
> Does not matter with respect to what I wrote, does it? Or would you like to 
> rephrase?
> 
> > 
> > > sizeof
> > > ------
> > > @@ -93,12 +106,14 @@ Using goto is allowed in C code for error handling. 
> > > In
> > > any other case it will be
> > > Defining Constant values
> > > ------------------------
> > > 
> > > -Use defines for constant values for improving readability and ease of
> > > changes. Alternatively, use global `const` variables.
> > > +Use defines for constant values for improving readability and ease of
> > > changes.
> > > +Alternatively, use global `const` variables for individual values.
> > > +If multiple related constants are to be defined, consider the use of
> > > enumerations with initializers.
> > > 
> > > Short functions
> > > ---------------
> > > 
> > > -Try to split code to short functions, each having simple functionality, 
> > > in
> > > order to improve code readability and re-usability. Prefix with inline 
> > > short
> > > functions or functions that were splitted for readability reason.
> > > +Try to split code to short functions, each having simple functionality, 
> > > in
> > > order to improve code readability and re-usability. Prefix with `inline`
> > > functions that were splitted for readability reason or that are very 
> > > short.
> > > 
> > > Return on if
> > > ------------
> > 
> > Too much changes in a single patch, please split!
> 
> Seriously?
> 
> If you are serious, I can submit a series, though I think this makes things 
> harder to review.

As a side note, I think a single patch is fine here :)

> > 
> > > @@ -118,7 +133,8 @@ void function(int *n)
> > >     ...
> > > }
> > > ----
> > > -on
> > > +over
> > > +
> > > [source,c]
> > > ----
> > > void function(int *n)
> > > @@ -238,15 +254,7 @@ if (condition) {
> > > +
> > > In case of long condition statement, prefer having additional temporary
> > > variable over multiple line condition statement.
> > > +
> > > -In case of new line in condition statement.
> > > -+
> > > -[source,c]
> > > -----
> > > -if (long_name && very_long_name && very_long ||
> > > -                                               var_name) {
> > > -----
> > > -+
> > > -or indent under the round bracket using spaces
> > > +Indent long conditionals under the opening parenthesis using spaces
> > > +
> > > [source,c]
> > > ----
> > 
> > Why this removal?
> 
> I could not understand what it meant. I thought it was an error. Is it not?
> Can you point me to one example in the source code where it’s indented like 
> this?
> Also, that breaks all auto-indent tools I know of. So I would strongly 
> suggest we remove the rule if this ever was one.
> 
> > 
> > > @@ -285,6 +293,8 @@ default:
> > > }
> > > ----
> > > 
> > > +Use /* Fall through */ comments when there is no break (compilers will 
> > > emit
> > > a warning otherwise)
> > > +
> > > Types indentation
> > > ~~~~~~~~~~~~~~~~~
> > > 
> > > @@ -330,7 +340,7 @@ Multi line macro indentation
> > > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> > > 
> > > [source,c]
> > > -#define MACRO_NAME(a, b, c) {        \
> > > +#define MACRO_NAME(a, b, c) {   \
> > >     int ab = a + c;             \
> > >     int ac = a + b;             \
> > >     int bc = b + c;             \
> > > @@ -347,35 +357,74 @@ char *array[] = {
> > >     "item_3",
> > > };
> > > 
> > > +Headers
> > > +-------
> > > +
> > > +Headers should be protected against multiple inclusing using a macro that
> > 
> > typo, “inclusing"
> 
> I had seen it (and fixed locally)
> 
> > 
> > > matches the header file name in uppercase, with all characters that are
> > 
> > should be "upper case”
> 
> Both spellings are valid, see https://www.thefreedictionary.com/uppercase
> 
> > 
> > > invalid in C replaced with an underscore '_':
> > > +
> > > +[source,h]
> > > +---
> > > +#ifndef MY_MODULE_H
> > > +#define MY_MODULE_H
> > > +
> > > +...
> > > +
> > > +#endif /* MY_MODULE_H */
> > > +---
> > > +
> > > +
> > > Header inclusion
> > > ----------------
> > > 
> > > -Headers should be included in this order
> > > +Headers should be included in this order:
> > > +- config.h, which should only be included from C source files
> > > +- [module].h, where [module].c is the corresponding implementation file
> > > +- [module]-xyz.h, which are support headers for [module]
> > > +- Other application headers, using #include "file.h"
> > > +- System headers, using #include <file.h>
> > > +- If necessary, C++ system headers, using #include <file>
> > > +
> > > +This order is designed to maximize chances of catching missing headers in
> > > headers (i.e. headers that are not self-contained).
> > > +
> > > +In summary, Headers should be included in this order
> > > 
> > > [source,c]
> > > ----
> > > -#include <system_headers.h>
> > > -#include <no_spice_no_system_libraries.h>
> > > +#include "config.h"
> > > +#include "source.h"
> > > +#include "source-support.h"
> > > +#include "some-other-source.h"
> > > +
> > > #include <spice_protocol.h>
> > > #include <spice_common.h>
> > > -
> > > -#include "spice_server.h"
> > > +#include <no_spice_no_system_libraries.h>
> > > +#include <system_headers.h>
> > > +#include <vector>
> > > +#include <cstdio>
> > > ----
> > > 
> > > -(note the empty line between no spice-server and spice-server headers)
> > > +(note the empty line between application headers included with "" and 
> > > system
> > > headers included with <>
> > > 
> > > -Also in source (no header) files you must include `config.h` at the
> > > beginning so should start (beside comments and copyright) with
> > > +Headers should include only the headers required to process the header
> > > itself, and otherwise include as little as possible.
> > > 
> > > -[source,c]
> > > +[source,h]
> > > ----
> > > -#ifdef HAVE_CONFIG_H
> > > -#include <config.h>
> > > -#endif
> > > +#ifndef SOURCE_H
> > > +#define SOURCE_H
> > > +#include "application-header-required-for-header.h"
> > > 
> > > -#include <system_headers.h>
> > > -#include <no_spice_no_system_libraries.h>
> > > -#include <spice_protocol.h>
> > > -#include <spice_common.h>
> > > +#include <system-header-required-for-header.h>
> > > +
> > > +...
> > > 
> > > -#include "spice_server.h"
> > > +#endif /* SOURCE_H */
> > 
> > I think this header changes applied everywhere should have more consents.
> > Another reason to split this too long patch!
> 
> What do you mean “more consents” (I don’t think this is correct english)? Do 
> you mean we need to discuss it more?

We always used the header order in Christophe's patch in my previous
job. I was surprised to see the reverse order in our style guide, but
thought there are more important reasons than ensuring correctness,
like some #defines changing behaviour...

> By the way, I am not suggesting we start reworking the code to match that, 
> just that we agree on whether this is the correct way or not. As for 
> refactoring, it’s actually easy because clang-format does it for you, and 
> Emacs has a clang-format that applies to a selection, so the job is 
> relatively straightforward.
> 
> Also note that clang-format does imply a few style changes as well, for 
> things that are not clearly specified in the style guide. Let me just give an 
> example:
> 
> GType
> spice_compat_version_t_spice_compat_version_t_get_type (void)
> {
>     static GType type = 0;
>     static volatile gsize type_volatile = 0;
> 
>     if (g_once_init_enter(&type_volatile)) {
>         type = g_enum_register_static ("spice_compat_version_t", 
> _spice_compat_version_t_spice_compat_version_t_values);
>         g_once_init_leave(&type_volatile, type);
>     }
> 
>     return type;
> }
> 
> with the LLVM style adjusted for explicit preferences in the document, turns 
> into
> 
> GType spice_compat_version_t_spice_compat_version_t_get_type(void)
> {
>     static GType type = 0;
>     static volatile gsize type_volatile = 0;
> 
>     if (g_once_init_enter(&type_volatile))
>     {
>         type = g_enum_register_static("spice_compat_version_t",
>                                       
> _spice_compat_version_t_spice_compat_version_t_values);
>         g_once_init_leave(&type_volatile, type);
>     }
> 
>     return type;
> }

How does this relate to the headers?

> So it puts the function definition { at end of line. Not sure what the team 
> prefers here. It also rewrites the function call to split arguments, which I 
> think is nicer that way
> 
> FYI, this is with the following in .clang-format:
> 
> Language:        Cpp
> # BasedOnStyle:  LLVM
> 
> # IncludeBlocks: Regroup
> SortIncludes: true
> 
> IncludeCategories:
>   - Regex:           'config.h'
>     Priority:        -1
>   - Regex:           '^"spice.*"'
>     Priority:        1
>   - Regex:           'glib'
>     Priority:        4
>   - Regex:           '^<.*>'
>     Priority:        3
>   - Regex:           '^".*"'
>     Priority:        2
> 
> ColumnLimit:     100
> IndentCaseLabels: false
> IndentWidth:     4
> BreakBeforeBraces: Allman
> 
> 
> I disabled InlcudeBlocks: Regroup which is not available unless you run a 
> very recent clang-fromat.
> 
> > 
> > > ----
> > > +
> > > +
> > > +Compilation
> > > +-----------
> > > +
> > > +The source code should compile without warnings on all variants of GCC 
> > > and
> > > clang available.
> > 
> > No, please!
> 
> That’s a should. Why not? We enforce that in our makefiles.
> 
> > 
> > > +A patch may be rejected if it introduces new warnings.
> > > +Warnings that appear over time due to improvements in compilers should be
> > > fixed in dedicated patches. A patch should not mix warning fixes and other
> > > changes.
> > > +Any patch may adjust whitespace (e.g. eliminate trailing whitespace).
> > > Whitespace adjustments do not require specific patches.
> > 
> > I would agree only if the changes touch these lines.
> > Otherwise I disagree.
> 
> Having some of my patches rejected because of spurious whitespace changes is 
> extremely annoying. I can easily configure Emacs to remove all trailing 
> spaces when saving. I cannot configure it to remove spaces only on lines that 
> I changed. I’d much rather slowly fix spurious whitespaces over time 
> automatically than be forced to do some extra work just because you don’t 
> want to see whitespace fixes in my patches.
> 
> In short, please don’t make my life miserable for something that is no extra 
> work for you.

FWIW in vim I have a piece of config that highlights the trailing
whitespaces. That way I can remove them manually where I want and also
makes me not create them unintentionally.

Unless you have messy source with lots of them, this is fine (and if
you do, a quick sed solves the problem).

I can share it if you want (it's google-able, but vim wiki has a wall
of text on it and you need to fiddle...)

Lukas

> > 
> > Frediano
> 
> _______________________________________________
> Spice-devel mailing list
> Spice-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel
_______________________________________________
Spice-devel mailing list
Spice-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/spice-devel

Reply via email to