Ok let's focus then on the idea that trunk is releasable. Releasable to me doesn't mean it can't contain a bad merge.
It means it doesn't contain some untested and unstable feature. We can always "release from trunk" and we still have a release process. The idea that trunk must contain. a first time it hits the branch, releasable code is way overboard On Thu, May 7, 2015 at 10:50 AM, Benedict Elliott Smith <belliottsm...@datastax.com> wrote: >> >> This breaks your model of applying every commit ref by ref. > > > How? The rebase only affects commits after the "real" branch, so it still > cleanly fast forwards? > > Merging is *hard*. Especially 2.1 -> 3.0, with many breaking API changes > (this is before 8099, which is going to make a *world* of hurt, and will > stick around for a year). It is *very* easy to break things, with even the > utmost care. > > On Thu, May 7, 2015 at 3:46 PM, Jake Luciani <jak...@gmail.com> wrote: > >> You then fetch and repair >> your local version and try again. >> >> This breaks your model of applying every commit ref by ref. >> >> I'm all for trying to avoid extra work/stability but we already have >> added a layer of testing every change before commit. I'm not going to >> accept we need to also add a layer of testing before every merge. >> >> >> >> >> On Thu, May 7, 2015 at 10:36 AM, Benedict Elliott Smith >> <belliottsm...@datastax.com> wrote: >> >> >> >> wouldn't you need to force push? >> > >> > >> > git push --force-with-lease >> > >> > This works essentially like CAS; if the remote repositories are not the >> > same as the one you have modified, it will fail. You then fetch and >> repair >> > your local version and try again. >> > >> > So what does this buy us? >> > >> > >> > This buys us a clean development process. We bought into "always >> > releasable". It's already a tall order; if we start weakening the >> > constraints before we even get started, I am unconvinced we will >> > successfully deliver. A monthly release cycle requires *strict* >> processes, >> > not *almost* strict, or strict*ish*. >> > >> > Something that could also help make a more streamlined process: if actual >> > commits were constructed on development branches ready for commit, with a >> > proper commit message and CHANGES.txt updated. Even more ideally: with >> git >> > rerere data for merging up to each of the branches. If we had that, and >> > each of the branches had been tested in CI, we would be much closer than >> we >> > are currently, as the risk-at-commit is minimized. >> > >> > On Thu, May 7, 2015 at 2:48 PM, Jake Luciani <jak...@gmail.com> wrote: >> > >> >> git rebase -i trunk_staging <ref~1> >> >> fix the problem >> >> git rebase --continue >> >> >> >> In this situation, if there was an untested follow on commit wouldn't >> >> you need to force push? >> >> >> >> On Thu, May 7, 2015 at 9:28 AM, Benedict Elliott Smith >> >> <belliottsm...@datastax.com> wrote: >> >> >> >> >> >> If we do it, we'll end up in weird situations which will be annoying >> for >> >> >> everyone >> >> > >> >> > >> >> > Such as? I'm not disputing, but if we're to assess the relative >> >> > strengths/weaknesses, we need to have specifics to discuss. >> >> > >> >> > If we do go with this suggestion, we will most likely want to enable a >> >> > shared git rerere cache, so that rebasing is not painful when there >> are >> >> > future commits. >> >> > >> >> > If instead we go with "repairing" commits, we cannot have a "queue" of >> >> > things to merge up to. Say you have a string of commits waiting for >> >> > approval C1 to C4; you made C1, and it broke something. You introduce >> C5 >> >> to >> >> > fix it, but the tests are still broken. Did you not really fix it? Or >> >> > perhaps one of C2 to C4 are to blame, but which? And have you >> >> accidentally >> >> > broken *them* with your commit? Who knows. Either way, we definitely >> >> cannot >> >> > fast forward. At the very best we can hope that the new merge did not >> >> > conflict or mess up the other people's C2 to C4 commits, and they >> have to >> >> > now merge on top. But what if another merge comes in, C6, in the >> >> meantime; >> >> > and C2 really did also break the tests in some way; how do we >> determine >> >> C2 >> >> > was to blame, and not C6, or C3 or C4? What do the committers for >> each of >> >> > these do? We end up in a lengthy tussle, and aren't able to commit >> any of >> >> > these to the mainline until all of them are resolved. Really we have >> to >> >> > prevent any merges to the staging repository until the mistakes are >> >> fixed. >> >> > Since our races in these scenario are the length of time taken for >> cassci >> >> > to vet them, these problems are much more likely than current race to >> >> > commit. >> >> > >> >> > In the scheme I propose, in this scenario, the person who broke the >> build >> >> > rebases everyone's branches to his now fixed commit, and the next >> broken >> >> > commit gets blamed, and all other commits being merged in on top can >> go >> >> in >> >> > smoothly. The only pain point I can think of is the multi-branch >> rebase, >> >> > but this is solved by git rerere. >> >> > >> >> > I agree running tests is painful, but at least for the build, this >> should >> >> >> be the responsibility of the committer to build before merging >> >> > >> >> > >> >> > Why make the distinction if we're going to have staging commits? It's >> a >> >> bit >> >> > of a waste of time to run three ant real-clean && ant tasks, and >> >> increases >> >> > the race window for merging (which is painful whether or not involves >> a >> >> > rebase), and it is not a *typical* occurrence ("alarming" is >> subjective) >> >> > >> >> > On Thu, May 7, 2015 at 2:12 PM, Sylvain Lebresne < >> sylv...@datastax.com> >> >> > wrote: >> >> > >> >> >> > If one of them breaks, we go and edit the _staging branch in place >> to >> >> >> correct >> >> >> > the problem, and let CI run again. >> >> >> >> >> >> I would strongly advise against *in place* edits. If we do it, we'll >> >> end up >> >> >> in >> >> >> weird situations which will be annoying for everyone. Editing commits >> >> that >> >> >> have >> >> >> been shared is almost always a bad idea and that's especially true >> for >> >> >> branch >> >> >> that will have some amount of concurrency like those staging >> branches. >> >> >> >> >> >> Even if such problems are rare, better to avoid them in the first >> place >> >> by >> >> >> simply >> >> >> commit new "fixup" commits as we currently do. Granted this give you >> a >> >> >> slightly >> >> >> less clean history but to the best of my knowledge, this hasn't been >> a >> >> pain >> >> >> point so far. >> >> >> >> >> >> > wait for CI; all clear >> >> >> > >> >> >> > git checkout cassandra-2.0; git merge cassandra-2.0_staging >> >> >> > git checkout cassandra-2.1; git merge cassandra-2.1_staging >> >> >> > git checkout trunk; git merge trunk_staging >> >> >> > >> >> >> > This does introduce some extra steps to the merge process >> >> >> >> >> >> If we do this, we should really automate that last part (have the CI >> >> >> environment merge the staging branch to the non-staging ones on >> >> success). >> >> >> >> >> >> > It seems if we want an "always releasable" set of branches, we need >> >> >> something >> >> >> > along these lines. >> >> >> >> >> >> Agreed as far as having staging branches vetoed by CI goes. Less sure >> >> about >> >> >> the edit-commit-in-place part as said above. >> >> >> >> >> >> > I certainly break tests by mistake, or the build itself, with >> alarming >> >> >> regularity. >> >> >> >> >> >> I agree running tests is painful, but at least for the build, this >> >> should >> >> >> be >> >> >> the responsibility of the committer to build before merging. We all >> >> forget >> >> >> it from >> >> >> times to times and that's ok, but it's not ok if it's "alarmingly >> >> regular". >> >> >> >> >> >> -- >> >> >> Sylvain >> >> >> >> >> >> >> >> >> >> >> -- >> >> http://twitter.com/tjake >> >> >> >> >> >> -- >> http://twitter.com/tjake >> -- http://twitter.com/tjake