FATES Development workflow
Here is a helpful and straightforward guide to help new users understand the basics of a work-flow:
https://guides.github.com/introduction/flow/
We also use git submodule, this was decided for consistency sake with the ACME project (although that may change.
Some key points:
The FATES is a collection of modules with a communication interface, not a stand-alone model itself. Thus, it must be called by a land-model. Coupling with E3SM’s land-model and CESM’s land-model is currently supported.
Because FATES is not a stand-alone module, the development process and process to build the model uses a submodule system. In short, you must clone the land-model repository, which will indirectly handle the cloning of FATES.
The central (i.e. NGEET/) repository contains a master branch, numerous potential feature branches, and public release branches.
Master is the continuously tested, stable version of the code that is updated by new features when they become vetted and available.
Feature branches are created by developers who wish to contribute, a feature branch is supposed to encapsulate the changes associated with a targeted development concept.
Fork-and-Pull System:
The NGEET fates project uses a “fork-and-pull” system. Meaning, developers are expected to keep their feature branches synced with their own personal forks of the fates repository. The users’ forks will be the server-side location from which they can collaborate with team-mates, and allow others push/pull access to their feature branch.
Pull requests to the central ed-clm repository “NGEET/ed-clm”, should be issued from one of these forked repositories.
For more on how to fork and what forks are, see: https://help.github.com/articles/fork-a-repo/
Process:
A developer creates a new branch in the code based off of “master” that will contain a specific feature or requested bug fix to be added to the code (naming convention here).
git checkout master
git fetch origin
git pull origin master
git checkout -b rgknox-IO-historyfix
The developer modifies code, and periodically commits those changes:
git add ChangedFile1.F90
git add ChangedFile2.F90
git commit -m "Two generic changes were applied to two generic files."
The developer periodically tests their changes (protocol here) as they make commits.
The developer periodically pushes their committed changes to their fork. This is also useful for sharing work with team-members, and allows the developer a place to save work that can be retrieved on another computer (PUSHING, PULLING AND WORKING WITH FORKS)
The developer may then decide that their features are complete, or they simply decide that it is time to submit what they have been doing to the NGEET/ team for feedback, help and/or ultimately to get merged into the master version of the code. (protocol here)
The developer issues a pull request to merge their feature branch into the “master” (ISSUING PULL REQUESTS )