Yeah it's how Dmitri said, the Google style is most likely on purpose not
configurable, because otherwise it's getting more difficult to achieve the
same formatting results across IDEs & CMD line.


On Wed, Jul 13, 2022 at 7:39 PM Dmitri Bourlatchkov <
dmitri.bourlatch...@dremio.com> wrote:

> Yeah, the Google style has very specific wrapping limits and javadoc
> format. It is not configurable, if we go with it.
>
> From my POV, using another style would be fine. However, with a custom
> style it can be hard and tricky to ensure that all IDEs enforce it the same
> way as spotless.
>
> The Google style has a plugin at least for IntelliJ (and likely for
> Eclipse too) so it will behave the same way in IDE and cmd. line build.
>
> On Wed, Jul 13, 2022 at 1:28 PM Ryan Blue <b...@tabular.io> wrote:
>
>> Is there any value in trying to get Spotless to match the current format
>> as closely as possible? It would be great to have fewer changes.
>>
>> For example, when I tested the apply, I see this:
>>
>> -  /**
>> -   * Returns an initialized {@link AliyunProperties}
>> -   */
>> +  /** Returns an initialized {@link AliyunProperties} */
>>
>> Changes like that don’t seem very valuable to me. Similarly, it looks
>> like a lot of text is wrapped at a different line length. If we can alter
>> that, we could easily avoid a lot of changes.
>>
>> Ryan
>>
>> On Wed, Jul 13, 2022 at 7:41 AM Eduard Tudenhoefner <edu...@tabular.io>
>> wrote:
>>
>>> As a first step, I created https://github.com/apache/iceberg/pull/5266 which
>>> configures Spotless to use the Google Java Format and also apply the
>>> correct copyright header for Java files.
>>>
>>> Once this PR is merged, the next steps would be:
>>>
>>>    - removing conflicting Checkstyle rules that are not in line with
>>>    the Google format
>>>    - formatting the entire code base via `*./gradlew spotlessApply*`
>>>    - setting `*enforceCheck*` to `*true*` in
>>>    
>>> https://github.com/apache/iceberg/blob/80318d8cfbeb0d96d0afc27c84bc3dbddde35344/baseline.gradle#L48
>>>    so that validation fails if code isn't properly formatted
>>>    - updating docs around the current Formatter usage and how to
>>>    configure Eclipse/IntelliJ
>>>
>>> The first 3 steps should be done together as part of the big bang.
>>>
>>> Eduard
>>>
>>> On Mon, Jul 11, 2022 at 10:54 PM Ryan Blue <b...@apache.org> wrote:
>>>
>>>> Okay, it sounds like there's mostly agreement for going with spotless.
>>>> Let's try that out. We'll work on some changes to add spotless so that
>>>> `spotlessApply` works. Then we can do the big bang migration (which I also
>>>> agree is the best option) just before the 1.0.
>>>>
>>>> Thanks, everyone!
>>>>
>>>> On Mon, Jul 11, 2022 at 11:50 AM Dmitri Bourlatchkov <
>>>> dmitri.bourlatch...@dremio.com> wrote:
>>>>
>>>>> My experience with the Google Code Style + Spotless was positive too.
>>>>>
>>>>> I'd be fine with another code style as long as it is "deterministic"
>>>>> (e.g. does not make changes on repeated execution) and works in IntelliJ
>>>>> IDEA / Eclipse / etc.
>>>>>
>>>>> Regarding cherry-picking into older branches, I think Robert's
>>>>> suggestion can be tweaked slightly to be helpful there too:
>>>>>
>>>>> 1. Checkout old branch
>>>>> 2. Apply the new style (run gradle ...)
>>>>> 3. Cherry-pick without committing
>>>>> 4. Manually revert to old style
>>>>> 5. Commit
>>>>> 6. Reset to original branch HEAD
>>>>> 7. Cherry pick commit 5 again
>>>>>
>>>>> It's a bit lengthy and may be a tedious process, but it should allow
>>>>> applying the git-level changes mostly automatically.
>>>>>
>>>>> Cheers,
>>>>> Dmitri.
>>>>>
>>>>>
>>>>> On Fri, Jul 8, 2022 at 2:53 AM Robert Stupp <sn...@snazy.de> wrote:
>>>>>
>>>>>> From my experience, it’s a big win to have automatic code formatting.
>>>>>>
>>>>>> In projectnessie we use automatic code formatting for all languages
>>>>>> and haven’t serious issues with Spotless. It is just nice to not have to
>>>>>> bike shed about whitespaces, line breaks, brackets, etc. It was a bit of
>>>>>> discussion, because people had bad memories from past experiences with
>>>>>> automatic code formatting breaking code and introducing subtle bugs.
>>>>>>
>>>>>> I think that using code styles that „do not allow bike shedding“
>>>>>> (Google Code Style) are a very good option.
>>>>>>
>>>>>> So far none of us has seen issues with any of the Spotless code
>>>>>> formatters that we use: XML, Kotlin/Gradle, Kotlin, Antlr4, Java, Scala -
>>>>>> relying on the „standard“ settings w/o any customizations. We use this
>>>>>> piece of code, externalized into an internal Gradle plugin:
>>>>>> https://github.com/projectnessie/gradle-build-plugins/blob/main/spotless/src/main/kotlin/org/projectnessie/buildtools/spotless/SpotlessHelperPlugin.kt
>>>>>>  For
>>>>>> Iceberg, it would probably be nice to have some Groovy code formatting 
>>>>>> for
>>>>>> the build scripts as well.
>>>>>>
>>>>>> Sure, the migration will add some pain. IMHO the best option is a
>>>>>> „big bang“ across the whole code base, because it happens only once.
>>>>>> Migrating one module after another is a „repeated series of pains“.
>>>>>>
>>>>>> Since the result of a `./gradlew spotlessApply` is deterministic,
>>>>>> people that have open PRs could:
>>>>>> 1. Rebase their PR branch against the commit before the „Big Bang“
>>>>>> 2. Include a commit with the necessary Gradle build change (one the
>>>>>> only contains the changes to add Spotless)
>>>>>> 3. Do the `./gradlew spotlessApply`
>>>>>> 4. Squash all commits in the PR-branch
>>>>>> 5. Rebase again - against the HEAD of the master branch
>>>>>> 6. Force-push PR-branch
>>>>>> Because git is „clever enough“ to eliminate the „duplicated/unrelated
>>>>>> changes“, the final result of the above steps is just the diff with the
>>>>>> changes for the open PR.
>>>>>>
>>>>>>
>>>>>> Am 08.07.2022 um 00:59 schrieb Ryan Blue <b...@tabular.io>:
>>>>>>
>>>>>> We were just talking about this proposal internally. I think it
>>>>>> would be great to have automatic code formatting, especially since we 
>>>>>> have
>>>>>> to point out a lot of changes manually. The main question is how to get
>>>>>> there without too much disruption. This came up in our discussions around
>>>>>> the upcoming 1.0 release, since that may be a good opportunity to make 
>>>>>> all
>>>>>> of the code changes.
>>>>>>
>>>>>> For background, the main concern about adding something like this is
>>>>>> applying all of the changes needed to get the existing code to conform to
>>>>>> the new style. That is really disruptive because it will cause all of the
>>>>>> PRs to need to be rebased and makes it really difficult to cherry-pick
>>>>>> changes from after the code formatting happens to branches that were
>>>>>> created before code formatting. The 1.0 release makes a good opportunity
>>>>>> because we are making other changes (removing deprecations) and will
>>>>>> hopefully have people upgrading their branches to the new major version,
>>>>>> rather than cherry picking.
>>>>>>
>>>>>> This is as good a time as any to add automatic code formatting, but
>>>>>> it's up to the community: so should we refromat the project and apply
>>>>>> spotless code formatting everywhere? I'm interested to hear opinions!
>>>>>>
>>>>>> Ryan
>>>>>>
>>>>>> On Thu, Mar 10, 2022 at 3:00 AM Eduard Tudenhoefner <
>>>>>> edu...@dremio.com> wrote:
>>>>>>
>>>>>>> Hello everyone,
>>>>>>>
>>>>>>> I would like to get the discussion started around automatic code
>>>>>>> formatting + enforcing and how we get there.
>>>>>>>
>>>>>>> Currently we use Checkstyle *check* to enforce formatting. However,
>>>>>>> the problem with that is that you still have to manually do the actual
>>>>>>> formatting.
>>>>>>>
>>>>>>> What I would like to propose is the usage of *Spotless* (
>>>>>>> https://github.com/diffplug/spotless) for *checking* and *enforcing*
>>>>>>> Java code style (it can also enforce code style for Scala, Markdown, ...
>>>>>>> btw). Spotless is being used by many projects (
>>>>>>> https://github.com/search?l=gradle&q=spotless&type=Code) and comes
>>>>>>> essentially with two tasks:
>>>>>>> * *spotlessCheck*: Checks that sourcecode satisfies formatting steps
>>>>>>> * *spotlessApply*: Applies code formatting steps to sourcecode
>>>>>>> in-place
>>>>>>>
>>>>>>>
>>>>>>> *Code format*
>>>>>>>
>>>>>>> The problem with code format is that there is no single format that
>>>>>>> can satisfy the preferences of everybody. However, from my experience, 
>>>>>>> once
>>>>>>> people start to use *any* code format that produces consistent
>>>>>>> results across *Eclipse**/IntelliJ/cmd line*, people stop worrying
>>>>>>> about code format details.
>>>>>>> This is also one of the reasons why the creators of Go decided to
>>>>>>> have a code formatter built-in (
>>>>>>> https://go.dev/doc/effective_go#formatting):
>>>>>>>
>>>>>>> *Formatting issues are the most contentious but the least
>>>>>>>> consequential. People can adapt to different formatting styles but it's
>>>>>>>> better if they don't have to, and less time is devoted to the topic if
>>>>>>>> everyone adheres to the same style. The problem is how to approach this
>>>>>>>> Utopia without a long prescriptive style guide.*
>>>>>>>> *With Go we take an unusual approach and let the machine take care
>>>>>>>> of most formatting issues. The gofmt program (also available as go fmt,
>>>>>>>> which operates at the package level rather than source file level) 
>>>>>>>> reads a
>>>>>>>> Go program and emits the source in a standard style of indentation and
>>>>>>>> vertical alignment, retaining and if necessary reformatting comments.*
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> I would like to propose using the Google Java Format with Spotless.
>>>>>>> The reason for this format is essentially that this is a widely-adopted
>>>>>>> code format that is designed specifically for code reviews (since we're
>>>>>>> spending more time reviewing code than writing it).
>>>>>>> Additionally, it produces consistent formatting results across
>>>>>>> *Eclipse**/IntelliJ/cmd line*, which I think is another very
>>>>>>> important factor.
>>>>>>>
>>>>>>> Thus, our initial Gradle spotless configuration could look similar
>>>>>>> to the above below:
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> *pluginManager.withPlugin('com.diffplug.spotless') {    spotless {
>>>>>>>     // don't run spotlessCheck during gradle check task during the
>>>>>>> transition phase      enforceCheck = false      java {        target
>>>>>>> 'src/main/java/**/*.java', 'src/test/java/**/*.java',
>>>>>>> 'src/jmh/java/**/*.java'        googleJavaFormat()      }    }}*
>>>>>>>
>>>>>>> We don't have to use Google Java Format. Spotless also supports
>>>>>>> formatting the code with other formats, but from previous experience the
>>>>>>> Google Java Format seemed to be really the only one to produce 
>>>>>>> consistent
>>>>>>> results across *Eclipse**/IntelliJ/cmd line*.
>>>>>>>
>>>>>>>
>>>>>>> *How do we get to a point where the entire codebase is properly
>>>>>>> formatted (and enforceCheck = false can be removed)?*
>>>>>>>
>>>>>>> Now this is a difficult question. Obviously we don't want to have a
>>>>>>> single *format-everything* commit, as that would affect lots of
>>>>>>> in-flight PRs.
>>>>>>>
>>>>>>> There would have to be some form of gradual formatting, for example
>>>>>>> module by module. Spotless offers something called Ratched (
>>>>>>> https://github.com/diffplug/spotless/tree/main/plugin-gradle#ratchet)
>>>>>>> that allows to enforce code format gradually (but I'm not sure this 
>>>>>>> would
>>>>>>> be a good thing either).
>>>>>>>
>>>>>>> How exactly we'd like to approach this transitioning phase this is a
>>>>>>> completely separate discussion, but I feel like at least we could get 
>>>>>>> the
>>>>>>> ball rolling so that we make it also easier for newcomers to contribute 
>>>>>>> to
>>>>>>> the project, since it would be straightforward for them to make their 
>>>>>>> PRs
>>>>>>> adhere to the code format and also save time during PR reviews.
>>>>>>>
>>>>>>>
>>>>>>> Eduard
>>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Ryan Blue
>>>>>> Tabular
>>>>>>
>>>>>>
>>>>>>
>>>>
>>>> --
>>>> Ryan Blue
>>>>
>>>
>>
>> --
>> Ryan Blue
>> Tabular
>>
>

Reply via email to