daixiang0 / gci

GCI, a tool that control golang package import order and make it always deterministic.
BSD 3-Clause "New" or "Revised" License
433 stars 62 forks source link

Multiple prefix() sections should not be automatically sorted #205

Closed SOF3 closed 2 months ago

SOF3 commented 7 months ago

What version of GCI are you using?

0.13.4

Reproduce Steps

$ example.go
package example

import (
        _ "example.com/a/b"
        _ "example.com/i/j"
        _ "example.com/m/n"
        _ "example.com/p/q"
)

$ go run github.com/daixiang0/gci@v0.13.4 print example.go \
>       -s standard
>       -s default
>       -s 'prefix(example.com/i/j,example.com/m/n)'
>       -s 'prefix(example.com/a/b,example.com/p/q)'
package example

import (
        _ "example.com/a/b"
        _ "example.com/p/q"

        _ "example.com/i/j"
        _ "example.com/m/n"
)

What did you expect to see?

The sections should be consistent with the order of -ss passed.

What did you see instead?

The sections follow lexicographical order of the prefix() string. If I change the fourth section to prefix(example.com/p/q,example.com/a/b), the two sections in the output will be swapped.

SOF3 commented 7 months ago

Possible workaround for now: add nosuchmodule/1, and nosuchmodule/2, after prefix( to force the order of prefixes.

daixiang0 commented 7 months ago

The two prefix section does not follow lexicographical order which is written in the README, the strings in the prefix follow, so you can put then into one prefix section.

I think it is good to improve, you can take it if interested.

Label it as help wanted if someone else interested.

SOF3 commented 7 months ago

I don't understand. What is written in the readme? And what does "you can put them into one prefix section" mean? I am referring to multiple prefix sections, not multiple prefixes within the same section; the , part is just for illustration.

DanWlker commented 4 months ago

Hi, can i have a go on this issue?

asfaltboy commented 4 months ago

I came across this issue, and I was missing the "--custom-order" flag, @SOF3 are you providing it?

It seems to be required when sections are given, otherwise sections are sorted alphabetically.

I found it a tad confusing, and it took me a while to figure out that without it, just adding sections in a given order has no impact on order of sections.

My suggestion? Make the behaviour of the flag true by default, as it's implicitly expected. Then, for cases where people would prefer to add custom sections, but rely on GCI to sort them, add a "--sort-sections" flag and explain it's behaviour clearly in the docs (which sections exactly will appear in what order, and which imports will be lexicographically sorted)