On Mon, Apr 4, 2011 at 4:59 PM, Sergiu Dumitriu <[email protected]> wrote:
> On 04/04/2011 03:32 PM, Fabio Mancinelli wrote:
>> Hi Sergiu,
>>
>> I've read your mail and I have some quick remarks/questions:
>>
>> 1) Concerning part 1, I like the fact of working on a fork and sending
>> pull requests (solution C), though it seems a bit overkill for
>> committers who "really knows what they are doing".
>> In my particular case I would gladly fork the project in order to have
>> the chance to submit pull requests whenever I think my code needs a
>> review.
>> I think that sending pull requests is only possible if you are working
>> on a fork, so if we want to use github as an effective code-review
>> platform we should always work with forks.
>
> No, you can send "pull requests" even on committed code. In that case
> the request must be manually closed. So even with direct commits it's
> possible to ask for code reviews via pull requests.
>
Out of curiosity, how do you do this?
Anyway I was thinking to use this mechanism to prevent to incorporate
something the committer wants to be reviewed.
Having a code review after the changeset has been committed doesn't
make too much sense to me... Unless we use this to flag committed
things to keep an eye on.

Thanks,
Fabio

>> The overhead of working with a fork could be worked around by
>> selectively pushing stuff to the main repo.
>> For example, if I am working on something I am confident with, I will
>> push my changes to the main repo (that on https://github.com/xwiki)
>> and then pull them in the fork.
>> If I need a code review, I will push to my fork and issue a pull request.
>>
>> I think this is doable with git, since you can have multiple remotes
>> but I am not an expert so I don't know if this could lead to "hellish"
>> workflows for the developers.
>
> Yes, it's doable.
>
> "git push" pushes to the "origin" repo.
> "git push myown" pushes to a remote repo called "myown".
>
> What's critical is being careful where each commit goes.
>
>> 2) Concerning part 2, it's not clear to me what is the lifetime of the 
>> branches?
>> Here I am implicitly advertising (again)
>> http://nvie.com/posts/a-successful-git-branching-model/ (I like it a
>> lot because it's simple and cristal clear :))
>
> Yes, I found this one around the time it appeared, and I also liked it a
> lot. It's similar to D, but from their branch names they use the
> "master" branch as the most stable one, and not as the development
> branch. This is useful for forking and checking out "stable" sources,
> since it will point to the latest release. But personally, as a
> developer, I prefer to have "master" as the most unstable branch, with
> the latest code in it. It's all just naming in the end, not very important.
>
>> I think that your point D is very similar to it, but it's not clear to
>> me how the release branch is handled.
>> From my point of view nobody is allowed to commit in the stable
>> branch, except the release manager when doing a release. When a
>> release starts a release branch is created from the development
>> branch. The release manager prepares the release in that branch and
>> when she's done she merges everything in stable and develop and then
>> delete the release branch.
>
> Yes, exactly.
>
>> Feature branches appear and disappear as developers work on single
>> features. Every feature branch is deleted after it's merged in
>> develop.
>> develop is the new "SNAPSHOT".
>
> Yes, but feature branches don't have to be deleted that fast. A feature
> branch could be left in place for users to try and merge a feature in
> their own version, or to do bugfixing for a short period in it. It will
> be decided case by case.
>
>> So to sum up, in principle I am
>>
>> +1 for 1C provided that git allows to bypass the pull request by
>> pushing in the main repo from a fork and that this doesn't generate
>> too much hassle for a developer
>> +1 for 2D provided that I have well understood the semantics of these
>> branches :)
>>
>> -Thanks,
>> Fabio
>>
>> On Sat, Apr 2, 2011 at 7:31 PM, Sergiu Dumitriu<[email protected]>  wrote:
>>> Hi devs,
>>>
>>> Since we're moving to git / GitHub, it's time to re-evaluate the
>>> development / git usage strategy.
>>>
>>> = Short version:
>>>
>>> 1/ Where do developers commit:
>>> A. Always in the master branch
>>> B. In feature branches in the official repo, merged into the master
>>> branch when ready
>>> C. In their personal forks, requesting pulls in the official repo with a
>>> mandatory code review from another developer
>>>
>>> 2/ How to move code from development to release:
>>> A. Commit and release from the master branch
>>> B. Develop in feature branches, merge them in the master when ready,
>>> release from master
>>> C. Develop in feature branches, merge them in a development branch
>>> (master) for polishing, merge them in a release branch when done-done
>>> D. Develop in feature branches, merge them often in the development
>>> branch (master) for snapshot testing, move into the stabilization
>>> (pre-release) branch for polishing, move into the release branch when
>>> done-done.
>>> E. Develop in feature branches, merge them in a development branch for
>>> snapshot testing, move into a stabilization branch for the Next release,
>>> which becomes the Current release branch after the previous release is
>>> done, and which becomes a Maintenance branch after the new release is
>>> performed. Only bugfixes go in the Current release branch.
>>>
>>> I vote 1C and 2D.
>>>
>>> = Long version
>>>
>>> The common practice with Subversion is to have as few branches as
>>> possible, usually a trunk and a few maintenance branches, or
>>> development+stable+maintenance. This is a consequence of the perceived
>>> difficulty of merging changes between branches in svn, and the high cost
>>> of keeping multiple branches checked out.
>>>
>>> On the other hand, the git philosophy is to use branches as much as
>>> possible. Two core elements are "feature branches" and "forks".
>>>
>>> A feature branch is a branch where one feature is being developed,
>>> separated from the trunk and all the other features. While working on
>>> it, the developer "rebases" the branch on top of the trunk to keep his
>>> branch up to date with the trunk, and at the end "merges" the feature
>>> branch into the trunk. This way in-development features are kept out of
>>> the main trunk, but still allowing changes to be committed someplace
>>> public (no local uncommitted code anymore).
>>>
>>> A central element of GitHub is the ability to "fork" a repository. This
>>> means that a user clones a project in a personal repository where he can
>>> commit changes. He can later ask the maintainer of the original to
>>> "pull" those changes back into the original repository. This is the
>>> preferred way of contributing patches on GitHub.
>>>
>>>
>>>
>>> == Commit/Development-related strategies
>>>
>>> A. One central repository, one trunk (subversion-like)
>>>
>>> Developers clone the official trunks repository, prepare commits
>>> locally, then push back to the official repository. It's the same
>>> strategy that we're using now, except that we can also have an offline
>>> local repository.
>>>
>>>
>>> B. One central repository, feature branches
>>>
>>> Developers clone the official trunks repository, prepare commits locally
>>> in feature branches, then push back to the official repository in
>>> feature branches as well. When a feature is considered stable, it is
>>> merged into the master branch. Small bugfixes and improvements go
>>> directly in the master branch.
>>>
>>> B1. Also use specific helper branches
>>>
>>> Security fixes also go into a "security" branch so that users can
>>> cherry-pick them into older tags to build a custom patched version.
>>>
>>> Retired features can go into a "retired" branch so that users can
>>> re-include that feature in a custom build if they need it.
>>>
>>>
>>> C. One aggregated repository, pulling from developers
>>>
>>> Developers fork the official repositories, work on their fork (in
>>> feature branches as well), then make pull requests for integrating their
>>> work into the trunk. The rule would be that another developer has to do
>>> the pull after a code review (mandatory code reviews). This means more
>>> bugs spotted before committing, but also more work/time needed from the
>>> committers.
>>>
>>> We can relax the rule so that obvious bugfixes can be pulled by the same
>>> developer making the pull request.
>>>
>>>
>>> Personally, I prefer C, since it ensures better quality since at least
>>> two eyes see each line of code.
>>>
>>>
>>> == Integration/Release-related strategies
>>>
>>> Currently, we're developing on the trunk, and we're releasing from it
>>> during short breaks from live development. This is highly dangerous, and
>>> imposes a certain rhythm, with fast bursts of development right after a
>>> release, and imposed slowdown as the next release approaches (no work on
>>> new features after the last milestone).
>>>
>>> Short releases from a development branch is inline with agile
>>> development, but personally I find it too dangerous.
>>>
>>> Most big projects always keep the main development at least one branch
>>> away from the release branch.
>>>
>>> One example is the Linux kernel. While a kernel release lasts about 3
>>> months, like our own releases, almost all of the code that goes into a
>>> release has been developed before the merge window opens. This means
>>> that after a kernel version is released, Linus opens a two-weeks merge
>>> window during which he accepts pull requests for existing, working,
>>> complete code. The next ~10 weeks are spent testing the new kernel and
>>> integrating bugfixes, while developers prepare the features for the next
>>> kernel version. This ensures that a released kernel has as few bugs as
>>> possible. They can afford to do that since there are hundreds or
>>> thousands of contributors. Still, this is entirely opposite to our way
>>> of working: after a release we barely start writing the code to go in
>>> the new release, and we get code in at the last minute (especially me).
>>>
>>> Another example that I'd like to present is the new proposed strategy
>>> for Mozilla Firefox:
>>> http://mozilla.github.com/process-releases/draft/development_overview/
>>> Basically, the propose using 4 branches, from development to release,
>>> where code enters on the lowest branch, and moves up towards a release
>>> as it stabilizes and becomes release-ready. They use 6-weeks release
>>> cycles, and only stable-enough features get promoted from one branch to
>>> the next when a new cycle starts. This process ensures quality as well.
>>>
>>>
>>> I'd like to move closer to one of these two strategies, so that our
>>> releases are more polished. The mechanism for ensuring quality that
>>> we're currently using is to have an "investigation" phase during the
>>> previous release, which is supposed to help define the exact goals, so
>>> that during the current release the development should go smoothly
>>> towards that "idea goal". Unfortunately, this doesn't work that well.
>>> Without the code in place, investigations may miss important
>>> details/limitations that will shift the development in another
>>> direction. Or it can happen that the time is too short to fully
>>> implement something, so we can either release a very "in progress"
>>> feature, or decide near the end that it's not enough time to implement
>>> everything and focus on polishing what's already available to have a
>>> "partial" feature, but polished enough not to reek of low quality.
>>>
>>> The main problem here is that we're mixing feature- and time-based
>>> releases, with mandatory features that must find their way into a
>>> release, and a fixed deadline to make the release. This means that
>>> features have 8-10 weeks to be fully implemented, polished, tested,
>>> validated. And that doesn't always happen.
>>>
>>> So, here are some possible integration strategies:
>>>
>>> A. Master development (like now)
>>>
>>> All development is done in the master branch, from which we branch a few
>>> hours/days before the release, so that the master remains clear for
>>> development.
>>>
>>> B. Feature branches
>>>
>>> All new feature development is done in a separate branch for each
>>> feature, and we merge it in the trunk once it's considered done (or very
>>> close). When a release date comes, we release with the completed
>>> features, whatever those are. We don't force a merge of an incomplete
>>> feature just because it's in the roadmap if it's not stable enough.
>>>
>>> C. Feature+Development+Release branches
>>>
>>> All development is done in feature branches, but they get merged on the
>>> master branch more often to have test builds; the release branch is
>>> separate and it integrates features when they are considered ready. This
>>> has the advantage over B. that automated builds expose all the
>>> development features.
>>>
>>> D. Feature+Development+Stable+Release branches
>>>
>>> This is similar to the new Mozilla strategy. Developers merge their work
>>> in the Development branch very often. Users and other developers can
>>> contribute here as well, and preview the upcoming features. When they
>>> are close to finalization, they are also merged to the stable branch,
>>> where UX, QA and feature owners can test and improve the feature,
>>> preparing it for release. Once it's considered ready, it is merged into
>>> the release branch, where QA does a final thorough test. Releases happen
>>> from this branch.
>>>
>>> E. Feature+Development+Next+Release
>>>
>>> This is similar to D, with the exception that done features go into the
>>> next release, while the current release is staging. When the release is
>>> done, Release moves into Bugfix, Next becomes Release, and we create a
>>> new Next branch and start pulling in it. This would work well if we had
>>> very short release cycles (2 weeks), but it's not worth the effort for
>>> our current 3-month releases, since a feature would stagnate too much
>>> before being released. And it would also work if we had more beta testers.
>>>
>>>
>>> We can also impose windows, like 2-4 weeks for a feature to move into
>>> the next branch.
>>>
>>> We could also make faster releases, skipping milestones. and going to 6
>>> week releases.
>>>
>>> This means that it would take longer for a feature to make its way from
>>> idea to release. One release for investigation, one or more for the main
>>> development, and one for integration and stabilization.
>>>
>>> But this also means that releases will be more solid, polished, with
>>> less bugs, and closer to the user needs.
>>>
>>>
>>> Personally I prefer option D, although it's a bit too much overkill with
>>> our current limited manpower. We need more contributors and committers!
>>>
>>>
>>> As for a change strategy, we can continue the way we're doing now,
>>> gradually switching to feature branches and release/pre-release branches
>>> during the following release.
>>> --
>>> Sergiu Dumitriu
>>> http://purl.org/net/sergiu/
>
>
> --
> Sergiu Dumitriu
> http://purl.org/net/sergiu/
> _______________________________________________
> devs mailing list
> [email protected]
> http://lists.xwiki.org/mailman/listinfo/devs
>
_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to