diff --git a/docs/tools/github.md b/docs/tools/github.md index 71bb855d8058a48589edb5b9bb1da595b1009f81..daf146337d8d20cd2d6ed6d08ad7ce864f002e6c 100644 --- a/docs/tools/github.md +++ b/docs/tools/github.md @@ -1,5 +1,658 @@ # Using GitHub for CiviCRM development -TODO: migrate content from -https://wiki.civicrm.org/confluence/display/CRMDOC/Contributing+to+CiviCRM+using+GitHub + + +<div class="panelMacro"> + ++--+ +| | ++--+ + +</div> + +<div class="panel" +style="background-color: #FFFFCE;border-color: #000;border-style: solid;border-width: 1px;"> + +<div class="panelHeader" +style="border-bottom-width: 1px;border-bottom-style: solid;border-bottom-color: #000;background-color: #F7D6C1;"> + +**Table of Contents** + +</div> + +<div class="panelContent" style="background-color: #FFFFCE;"> + +<div> + +- [Background](#ContributingtoCiviCRMusingGitHub-Background) +- [Repositories](#ContributingtoCiviCRMusingGitHub-Repositories) +- [How-To: Checkout the latest source code from + Github](#ContributingtoCiviCRMusingGitHub-How-To:CheckoutthelatestsourcecodefromGithub) +- [How-To: Create your first + change ("pull-request")](#ContributingtoCiviCRMusingGitHub-How-To:Createyourfirstchange(%22pull-request%22)) +- [How-To: Submit a Patch to a Version + Branch](#ContributingtoCiviCRMusingGitHub-How-To:SubmitaPatchtoaVersionBranch) +- [How-To: Manage + files](#ContributingtoCiviCRMusingGitHub-How-To:Managefiles) +- [How-To: Manage day-to-day branching and + merging](#ContributingtoCiviCRMusingGitHub-How-To:Manageday-to-daybranchingandmerging) +- [Tip: Getting out of + trouble](#ContributingtoCiviCRMusingGitHub-Tip:Gettingoutoftrouble) +- [CiviCRM-Git Workflow for Git + Experts](#ContributingtoCiviCRMusingGitHub-CiviCRM-GitWorkflowforGitExperts) +- [Links](#ContributingtoCiviCRMusingGitHub-Links) + +</div> + +</div> + +</div> + +## Background + +- [Git is a "source-code management system" or "version control + system"](http://learn.github.com/p/intro.html){.external-link} – an + alternative to Subversion. It was designed for a large open-source + project (Linux) and has seen broad adoption among other + FOSS projects. +- GitHub is a company which provides hosted, web-based tools for + enhancing Git development. For open projects like CiviCRM, its + services are free. +- Git and GitHub have several advantages:\ + - The tools are already popular among FOSS projects and + web developers. + - The tools are free ("as in beer") and mostly free ("as + in speech"). + - They support off-line development. + - They support lightweight branching, merging, and code-review. + - They support open teams – anyone can jump-in, make changes, and + share changes. +- <span>To develop patches or enhancements to CiviCRM, you should base + any changes on the latest source-code from Github.</span> +- For more introductions to Git and Github, see + <https://help.github.com/>. + +## Repositories + +CiviCRM is divided into a few repositories. This allows developers to +work with different components, allows different teams to manage each +component, and will allow all the pieces to be remixed using different +tools (shell scripts, Drush-make, or composer). The repositories are: + +<div class="table-wrap"> + + Type URL Description + ------ ------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + git <https://github.com/civicrm/civicrm-core/> Core application which can be embedded in different systems (Drupal, Joomla, etc) + git <https://github.com/civicrm/civicrm-drupal/> Drupal integration modules. (Note: Each major release of Drupal has its own development branch; e.g. 7.x-4.3.x and 6.x-4.3.x would be branches for running CiviCRM 4.3 on Drupal 7 and Drupal 6, respectively) + git <https://github.com/civicrm/civicrm-joomla/> Joomla integration modules + git <https://github.com/civicrm/civicrm-wordpress/> Word Press integration modules + git <https://github.com/civicrm/civicrm-packages/> External dependencies required by CiviCRM + svn <http://svn.civicrm.org/l10n/> Localization data + +</div> + + + +## How-To: Checkout the latest source code from Github + +Because CiviCRM is split across multiple repositories, the easiest way +to get the latest code is to run a tool which handles all of the +repositories. Two alternative tools are included with +[civicrm-buildkit](https://github.com/civicrm/civicrm-buildkit){.external-link}: + +- *gitify*: Gitify takes an existing CiviCRM installation and replaces + various folders with the appropriate git repositories. This is + generally the easiest way to get the code for the first time because + it works with your current httpd/mysql configuration. +- *civibuild*: Civibuild downloads, installs, and configures a full + installation with a CMS (Drupal/WordPress) and Civi. For the first + build, this is more difficult because it requires deeper integration + with your httpd/mysql servers. However, it provides a reproducible + configuration (which matches the test infrastructure) and makes it + easier to maintain multiple installations (v4.4 and v4.5 and v4.6; + WP and Drupal; etc) (For more, see <http://buildkit.civicrm.org/> or + <https://github.com/civicrm/civicrm-buildkit/blob/master/doc/civibuild.md> .) + +For now, we'll assume this is your first project and proceed with +*gitify*. You will need to: + +- Note the existing CiviCRM directory + (eg "/var/www/drupal/sites/all/modules/civicrm"). +- Download builkdit. +- Run the "gitify" command. + +You may need to adapt the command arguments, but a typical case would +be: + +<div class="code panel" style="border-width: 1px;"> + +<div class="codeHeader panelHeader" style="border-bottom-width: 1px;"> + +**gitify /var/www/drupal/sites/all/modules/civicrm** + +</div> + +<div class="codeContent panelContent"> + + git clone https://github.com/civicrm/civicrm-buildkit.git ~/buildkit + cd ~/buildkit/bin + export PATH=$PWD:$PATH + cd /var/www/drupal/sites/all/modules/civicrm + gitify Drupal --hooks + +</div> + +</div> + +Depending on the type of development you do, you may need to checkout +more or less code. For example, if you work with CiviCRM in multiple +environments (Drupal 7, Joomla, WordPress) and multiple languages +(English, French, Chinese, etc), then you can instruct gitify to fetch a +lot of source-code; if you only use one environment and one language, +then you might instruct it to fetch less source-code. For more +instructions, run "gitify" (with no extra parameters). + +<div class="panelMacro"> + ++--+ +| | ++--+ + +</div> + + + +## How-To: Create your first change ("pull-request") + +When you create your first change for CiviCRM, there will be several +steps of setup and configuration. As part of the process, you will +create: + +- A **"fork"** which is a public space where you can store copies of + the code – a space where you can freely edit and publish at your own + discretion +- A **"branch"** which lists your specific code changes +- A **"pull request (PR)"** which requests that your changes be merged + into the official CiviCRM code. (A coordinator from civicrm.org will + review the PR before it becomes official.) + +The process: + +1. Checkout the latest source code from Github (see above) +2. [Signup for a user account on + Github](https://github.com/signup/free){.external-link} +3. [Set up + git](https://help.github.com/articles/set-up-git){.external-link} +4. Create your own "fork" of the CiviCRM code. + 1. In the web browser, navigate to + <https://github.com/civicrm/civicrm-core/> + 2. In the top-right corner, click the fork icon and complete + the form. + 3. You will be taken to a screen that lists files in your "fork". + 4. Note the top of the screen includes an "HTTP" address like + "*<span + class="nolink">https://github.com/myuser/civicrm-core.git</span>*" + or an "SSH" address like: + "*git@github.com:myuser/civicrm-core.git*" You will need this in + a moment. + +5. Link the local code to your "fork" + 1. <div class="code panel" style="border-width: 1px;"> + + <div class="codeContent panelContent"> + + ## Navigate to the directory; adjust path to match your local system + cd /var/www/drupal/sites/all/modules/civicrm + + ## Link code your fork; adjust the address to match your fork + git remote set-url origin git@github.com:myuser/civicrm-core.git + git pull + + ## Link code to the official "upstream" source + git remote add upstream git://github.com/civicrm/civicrm-core.git + git fetch upstream + + </div> + + </div> + +6. Create a branch with your changes + 1. <div class="code panel" style="border-width: 1px;"> + + <div class="codeContent panelContent"> + + ## Navigate to the directory; adjust the path to match your local system + cd /var/www/drupal/sites/all/modules/civicrm + + ## Make a branch. + ## + ## When you make a branch, you should explicitly declare a starting point. + ## The parameter "upstream/master" indicates that you'll base your changes + ## on the latest, bleeding-edge code from CiviCRM. If you wanted to base + ## your changes on a specific release, then you might say "upstream/4.3.1". + ## + ## The "-b cool-footer" indicates that your code goes into a new branch. + ## The name ("cool-footer") should reflect what you're working on. + git checkout upstream/master -b cool-footer + + ## Modify some code + vi templates/CRM/common/footer.tpl + + ## Save the changes + git commit templates/CRM/common/footer.tpl -m 'CRM-12603 - subtracted 4 degrees C to make footer cooler' + git push origin cool-footer + + </div> + + </div> + + 2. In order to make it possible for people to understand your + commit in the future, please follow the recommendations on [Git + Commit Messages for + CiviCRM](/confluence/display/CRMDOC/Git+Commit+Messages+for+CiviCRM). + +7. Create a pull request + 1. In the web browser, navigate to the web page for your fork (e.g. + <https://github.com/myuser/civicrm-core> ) + 2. Click "Pull Request" + 3. There will be two branches specified – the (first) left should + be "civicrm" (ie where the code is going to). The second (right) + should be your branch. + + 4. Add an explanation and submit + 5. (See also: + <https://help.github.com/articles/creating-a-pull-request> ) + +8. Create an issue on JIRA referencing your pull request. Then comment + on the pull request with the link to the created issue. + +## How-To: Submit a Patch to a Version Branch + +So now you are doing well at making changes to civicrm-core, and you've +created a bug fix that should be applied to the current stable branch +rather than the next major release. In May, 2013 this means you want it +to come out in the next 4.3.x release, rather than the 4.4.0 release +that is months in the future. Here is how you go about creating the +patch and the related pull request. + +1. Create an issue on JIRA + (<http://issues.civicrm.org/jira/secure/CreateIssue!default.jspa>) + with an Issue Type of Patch, and note its number. +2. Go to <https://github.com/civicrm/civicrm-core>, select the version + branch you want to create a patch against such as 4.3 or 4.4, then + click Fork to create a fork of that branch in your github + account:{.confluence-embedded-image} + +<!-- --> + +1. On your local machine, + +<div class="code panel" style="border-width: 1px;"> + +<div class="codeHeader panelHeader" style="border-bottom-width: 1px;"> + +**Create your local branch** + +</div> + +<div class="codeContent panelContent"> + + ## go to the directory setup previously using steps 1 - 5 of How-To: Create your first change ("pull-request") + $ cd /var/www/drupal/sites/all/modules/civicrm + + ## this time checkout the 4.3 branch, and name your new branch for the issue you created in 1. above + $ git checkout upstream/4.3 -b CRM-12603 + + ## make your changes to one or more files + $ vi some_civi_core_file.php + + ## make sure everything looks good + $ git diff + ## add and commit the change to your local branch + $ git add some_civi_core_file.php + $ git commit -m 'CRM-12603 - grant pre-hook invoked with wrong arg' + + ## push your local issue branch to your github repository + $ git push origin CRM-12603 + +</div> + +</div> + +1. 1. Note that the commit message should follow standards outlined + in [Git Commit Messages for + CiviCRM](/confluence/display/CRMDOC/Git+Commit+Messages+for+CiviCRM). + +<!-- --> + +1. In your browser, go to your fork of civicrm-core + at <https://github.com/myuser/civicrm-core>, click Pull Request, on + the left change the base branch from master to the version branch, + on the right change to your local issue fix branch, then underneath + make sure the Commits and Files Changed is what you expect, and + finally click Send pull + request.{.confluence-embedded-image} +2. Note the pull request number. Go back to JIRA and add a comment + including the pull request number. + +## How-To: Manage files + +*git add*<span style="font-size: 10.0pt;line-height: 13.0pt;"> is used +to add files to a repository. For example if you want to add an +additional .js file to the code. </span> + +*git commit * creates a point in time, with a message about it, that can +be pushed to a repository. + +*git rm* is used to remove files from a repository. For example if two +files are combined together you would remove one from the repository. + +*git status* shows the current status of a remote repository (ie the +files you have changed or added). It will also show you what will be +included in your next commit. + +Here is a list of *[Major Git +Commands](http://www.siteground.com/tutorials/git/commands.htm){.external-link} *and +a list of [Useful Git +Commands](http://davidwalsh.name/git-commands){.external-link}. + + + +## How-To: Manage day-to-day branching and merging + +The previous "How To" covers one's *first* change -- but as you make +more changes, then you'll need a few more techniques. For example, +suppose you work on two new features -- one feature provides a fancy +event registration form, and the second feature adds clairvoyance to the +automated dedupe system. You begin work on the first feature: + +<div class="code panel" style="border-width: 1px;"> + +<div class="codeHeader panelHeader" style="border-bottom-width: 1px;"> + +**Begin work on new feature #1, the fancy registration form** + +</div> + +<div class="codeContent panelContent"> + + me@localhost:~/civicrm$ git fetch upstream + me@localhost:~/civicrm$ git checkout upstream/master -b fancy-registration + me@localhost:~/civicrm$ vi templates/CRM/Event/Form/FancyRegistration.tpl + me@localhost:~/civicrm$ git commit templates/CRM/Event/Form/FancyRegistration.tpl + me@localhost:~/civicrm$ vi templates/CRM/Event/Form/FancyRegistration.tpl + me@localhost:~/civicrm$ vi CRM/Event/Form/FancyRegistration.php + me@localhost:~/civicrm$ vi templates/CRM/Event/Form/FancyRegistration.tpl + +</div> + +</div> + +The fancy registration isn't done yet, but you get a memo from the boss: +the clairvoyant dedupe is now top priority! You need to get started on +it ASAP! First, tie up any loose ends -- make sure your work has been +saved. + +<div class="code panel" style="border-width: 1px;"> + +<div class="codeHeader panelHeader" style="border-bottom-width: 1px;"> + +**Tie up loose ends on feature #1** + +</div> + +<div class="codeContent panelContent"> + + me@localhost:~/civicrm$ git status + # On branch fancy-registration + # Changes not staged for commit: + # (use "git add <file>..." to update what will be committed) + # (use "git checkout -- <file>..." to discard changes in working directory) + # + # modified: CRM/Event/Form/FancyRegistration.php + # modified: templatesCRM/Event/Form/FancyRegistration.tpl + # + me@localhost:~/civicrm$ git commit templates CRM + +</div> + +</div> + +And then begin work on the new feature. Create a new branch using the +same "git checkout ... -b ..." command. + +<div class="code panel" style="border-width: 1px;"> + +<div class="codeHeader panelHeader" style="border-bottom-width: 1px;"> + +**Begin work on new feature #2, the clairvoyant deduper** + +</div> + +<div class="codeContent panelContent"> + + me@localhost:~/civicrm$ git fetch upstream + me@localhost:~/civicrm$ git checkout upstream/master -b clairvoyant-dedupe + me@localhost:~/civicrm$ vi CRM/Dedupe/BAO/QueryBuilder/Clairvoyant.php + me@localhost:~/civicrm$ git add CRM/Dedupe/BAO/QueryBuilder/Clairvoyant.php + me@localhost:~/civicrm$ git commit . + +</div> + +</div> + +If you're clairvoyant yourself, then the clairvoyant deduper will be +easy to write. After a few minutes, you can resume work on the fancy +registration form. + +<div class="code panel" style="border-width: 1px;"> + +<div class="codeHeader panelHeader" style="border-bottom-width: 1px;"> + +**Switch back to the feature #1 (after brief interlude)** + +</div> + +<div class="codeContent panelContent"> + + me@localhost:~/civicrm$ git checkout fancy-registration + me@localhost:~/civicrm$ vi templates/CRM/Event/Form/FancyRegistration.tpl + me@localhost:~/civicrm$ git commit templates/CRM/Event/Form/FancyRegistration.tpl + +</div> + +</div> + +Of course, some of us aren't good at writing clairvoyant code. It may +take a couple days. If you switch back to feature #1 after a notable +delay, then you might encounter a problem: the official "upstream" code +has moved on! To be safe, you should pull in the latest changes from +upstream and reset your MySQL database. + +<div class="code panel" style="border-width: 1px;"> + +<div class="codeHeader panelHeader" style="border-bottom-width: 1px;"> + +**Switch back to the feature #1 (after long interlude)** + +</div> + +<div class="codeContent panelContent"> + + me@localhost:~/civicrm$ git checkout fancy-registration + me@localhost:~/civicrm$ git pull --rebase upstream master + me@localhost:~/civicrm$ cd bin + me@localhost:~/civicrm/bin$ ./setup.sh + me@localhost:~/civicrm/bin$ cd .. + me@localhost:~/civicrm$ vi templates/CRM/Event/Form/FancyRegistration.tpl + me@localhost:~/civicrm$ git commit templates/CRM/Event/Form/FancyRegistration.tpl + +</div> + +</div> + +Note: There's a connection with the commands from the earlier step, +"Begin work on new feature #1". + +<div class="code panel" style="border-width: 1px;"> + +<div class="codeHeader panelHeader" style="border-bottom-width: 1px;"> + +**Compare "Begin work" and "Switch back"** + +</div> + +<div class="codeContent panelContent"> + + # Begin work on new feature #1 + me@localhost:~/civicrm$ git fetch upstream + me@localhost:~/civicrm$ git checkout upstream/master -b fancy-registration + + # Switch back to feature #1 + me@localhost:~/civicrm$ git checkout fancy-registration + me@localhost:~/civicrm$ git pull --rebase upstream master + +</div> + +</div> + +In the first case, we create the new branch "fancy-registration"; in the +second case, we update the existing branch "fancy-registration". In both +cases, "fancy-registration" builds on top of the latest +"upstream/master". + +<div class="panelMacro"> + ++--+ +| | ++--+ + +</div> + +## Tip: Getting out of trouble + +To understand what branches you have locally: + +<div class="code panel" style="border-width: 1px;"> + +<div class="codeContent panelContent"> + + $ git branch + +</div> + +</div> + +To prune branches on your local system that are tracking remote branches +that no longer exist: + +<div class="code panel" style="border-width: 1px;"> + +<div class="codeContent panelContent"> + + $ git -p + +</div> + +</div> + +To delete a branch on your local system: + +<div class="code panel" style="border-width: 1px;"> + +<div class="codeContent panelContent"> + + $ git branch -d my_local_branch + +</div> + +</div> + +If you changed a file and you have not git add'ed or committed it, but +want to discard your changes: + +<div class="code panel" style="border-width: 1px;"> + +<div class="codeContent panelContent"> + + git checkout path/to/file + +</div> + +</div> + +If you altered a file or files and you have git add'ed them or you just +want to blow away all un-committed changes in your repository: + +<div class="code panel" style="border-width: 1px;"> + +<div class="codeContent panelContent"> + + git reset --hard HEAD + +</div> + +</div> + +If you committed to your local repository, but you have not pushed, and +you want to change your previous commit (or commit message): + +<div class="code panel" style="border-width: 1px;"> + +<div class="codeContent panelContent"> + + # fix the file you want fixed + git add path/to/file/you/fixed + git commit --amend + +</div> + +</div> + +If you git pull and git tells you have a conflict with your local +changes: + +<div class="code panel" style="border-width: 1px;"> + +<div class="codeContent panelContent"> + + # Edit conflicted files, resolving the conflict + git add path/to/conflicted/file/or/files + git commit + +</div> + +</div> + +## CiviCRM-Git Workflow for Git Experts + +Recommended practices: + +- Create a new branch for each feature +- Base new feature-branches on "upstream/master" or "upstream/4.3.x" + (as appropriate) +- Publish changes to your personal fork on Github +- Send a pull-request through Github + +See [Pull-Request Process](/confluence/display/CRM/Pull-Request+Process) +for more details on how your PR will be reviewed (or how to review PRs +by others). + +Note: CiviCRM previously used Subversion. The migration was +"history-less" (i.e. the source of 4.3.beta1 was imported to git without +any history). + +## Links + +These links look interesting, but no one has thought-through/presented +on how helpful/unhelpful they would be in our community: + +- <http://joeyh.name/blog/entry/introducing_mr/> (Comment: I like that + it shows statuses across repos; don't like the per-user config file) +- <http://defunkt.io/hub/> (Comment: I like that this automatically + manages the "git remote"; not a fan of "alias git=hub") +- <https://github.com/jsmits/github-cli> +- <https://github.com/peter-murach/github_cli> +- <http://code.google.com/p/git-repo/> diff --git a/redirects/wiki-crmdoc.txt b/redirects/wiki-crmdoc.txt index 860872849b8b804a6d310e9318833b4c0bf8e822..3e97a38bca84072e361cf647e8ac7300617a51c4 100644 --- a/redirects/wiki-crmdoc.txt +++ b/redirects/wiki-crmdoc.txt @@ -172,3 +172,4 @@ Manual+testing testing/manual Dedupe+and+merge+testing testing/manual/#dedupe Smart+group+testing testing/manual/#smart-group Tarball+installation+testing testing/manual/#tarball +Contributing+to+CiviCRM+using+GitHub tools/github