I had some experiences with doing this sort of thing for what eventually 
became github.com/hashicorp/hcl/v2. I have some assorted notes to share 
about that experience, which I hope will substitute for a more definitive 
answer to your question "does this sound reasonable?", because I don't feel 
comfortable giving an answer to *that* except "it depends"!

I will add some context that I was doing most of this when Go v1.11 and 
then v1.12 were current, and so I'm not sure if all of the exact behavior 
details I'm saying here remain true in recent Go releases, and also this 
was a while ago and so I may be misremembering some details.

The first thing I learned is that if you name a branch something like "v2" 
then a go get github.com/hashicorp/hcl/v2@v2 would stop working as soon as 
there is a tag v2.0.0, because the version selection gives preference to 
tag-matching before it considers branch matching, and it treats "v2" as a 
shorthand for v2.0.0. To counter that, I named my temporary development 
branch "hcl2", which I would then install using go get 
github.com/hashicorp/hcl/v2@hcl2 when I wanted to get the latest commit 
from that branch.

Separately, it's worth noting that this strategy of making v2 be a change 
to the root go.mod (adding the /v2 suffix) is one of two options; the other 
is to put your second version in a v2 subdirectory and keep v1 in the root, 
effectively maintaining them both together in the same tree. For HCL making 
v2 live in the root and having v1 continue as a separate maintenance branch 
felt best because v2 is a revolutionary change rather than just an 
incremental update, but it does have the important consequence that folks 
using GOPATH mode can no longer use either version once v2 is in the main 
branch. (In GOPATH mode, the toolchain can only install from the main 
branch.) To mitigate that, we ended up waiting a full year after creating 
the first stable v2 tag from the hcl2 branch before we changed the main 
branch to track v2 and moved v1 into a "hcl1" maintenance branch.

Finally, I want to note that you don't actually really need to create that 
v2.0.0-alpha tag unless having it tagged is important for documentation 
purposes. You can see in my examples two paragraphs ago that you can 
install the v2 module from an arbitrary branch (/v2@hcl2 in my case), which 
causes go.mod to track a synthetic version number that starts with v2 and 
includes the git commit id, and thus behaves just like a prerelease version 
but without the need for an explicit tag.

When I was first working on this I found it useful to create a temporary, 
throwaway repository to play around with in order to see the Go tool's 
behaviors in each case. While I hope the above is useful in understanding 
some of the details of how this transition might work for you, I think 
there's no substitute for rehearsing it to get confidence for what will 
happen at each step. Indeed, doing that is how I learned the three notes I 
shared above, prior to following a process like what you described against 
the real repository.

On Wednesday, April 7, 2021 at 4:43:54 PM UTC-7 mar...@gmail.com wrote:

> Hi All,
>
> I need to release a V2 of my module. (
> https://github.com/deepmap/oapi-codegen). I understand what to do on the 
> Go side in terms of the /v2 suffix and go.mod changes, but I'm a little bit 
> unclear how this works w.r.t git branches. Yes, I've looked at 
> https://golang.org/ref/mod#vcs-find
>
> My plan is to do development in a "v2" branch, which which will 
> occasionally be rebased onto the "master" branch until that's no longer 
> feasible, at which point I'll cherry pick or port important commits from 
> master to v2.
>
> The v2 branch will start off with an annotated tag named "v2.0.0-alpha". 
> and will begin to diverge from master, which is tagged with v1.x.x
>
> When I am ready to release the V2 branch, I plan to do the following.
>
> Top commit in master becomes a new branch, "v1", and any future V1 bug 
> fixes go here.
>
> I will merge the V2 branch into master, and tag it as v2.0.0.
>
> Does this sounds like a reasonable plan? I would like, for the time being, 
> for people to be able to work on V1 in master, and eventually master will 
> become V2 while V1 is a branch.
>
> My alternative is to create a V1 branch today, and all future work in 
> master is V2.
>
> -- Marcin
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/64280de7-7832-4ee6-b402-65cacecfaca8n%40googlegroups.com.

Reply via email to