> On 7 Feb 2018, at 12:12, Lukáš Hrázký <lhra...@redhat.com> wrote:
> 
> 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?

Sorry, a short-circuit in my brain that was all but obvious…

The relation is clang-format.

clang-format can do the header reordering. I added a .clang-format in the 
latest iteration of the patch series.

It also enforces a number of other rules in a way that I personally find quite 
nice overall if applied locally using some IDE. I would not recommend applying 
it globally to entire files.


Christophe

> 
>> 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.

Emacs has a mode like that (whitespace-mode) but I find it visually 
distracting. For my own projects, I wanted to make sure I was not committing 
trailing whitespace, so I added this to my .emacs:

(add-hook 'before-save-hook 'delete-trailing-whitespace)

I find it quite inconvenient to disable this setting while working on SPICE 
projects just for the sake of not accidentally removing whitespaces we said we 
did not want anyway ;-)


Christophe

> 
> 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