> On 7 Feb 2018, at 14:58, Lukáš Hrázký <lhra...@redhat.com> wrote: > > On Wed, 2018-02-07 at 14:44 +0100, Christophe de Dinechin wrote: >>> 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. > > That might be quite nice... In that case I'd like to nitpick the > bracket on a new line after the if statement :) Don't think we want > that?
Talk about yourself ;-) But you are right, this is not what the team decided. I need to find what replaces “Altman” 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: > > Out of curiosity, why do you find it distracting? I never ever see the > highlight, it doesn't show for the current line when I'm in edit mode > in vim (wink, nudge :D). It only shows when I move to another line or > quit edit mode... > >> (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 ;-) > > In that case, why don't we just remove all trailing whitespaces in one > commit and be done with it? Easy enough. > > Lukas > >> >>> >>> 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