###################
What is CodeIgniter
###################

CodeIgniter is an Application Development Framework - a toolkit - for people
who build web sites using PHP. Its goal is to enable you to develop projects
much faster than you could if you were writing code from scratch, by providing
a rich set of libraries for commonly needed tasks, as well as a simple
interface and logical structure to access these libraries. CodeIgniter lets
you creatively focus on your project by minimizing the amount of code needed
for a given task.

*******************
Release Information
*******************

This repo contains in development code for future releases. To download the
latest stable release please visit the `CodeIgniter Downloads
<http://codeigniter.com/downloads/>`_ page.

**************************
Changelog and New Features
**************************

You can find a list of all changes for each release in the `user
guide change log <https://github.com/EllisLab/CodeIgniter/blob/develop/user_guide/changelog.html>`_.

*******************
Server Requirements
*******************

-  PHP version 5.1.6 or newer.

************
Installation
************

Please see the `installation section <http://codeigniter.com/user_guide/installation/index.html>`_
of the CodeIgniter User Guide.

************
Contributing
************

CodeIgniter is a community driven project and accepts contributions of code
and documentation from the community. These contributions are made in the form
of Issues or `Pull Requests <http://help.github.com/send-pull-requests/>`_ on
the `EllisLab CodeIgniter repository
<https://github.com/EllisLab/CodeIgniter>`_ on GitHub.

Issues are a quick way to point out a bug. If you find a bug or documentation
error in CodeIgniter then please check a few things first:

- There is not already an open Issue
- The issue has already been fixed (check the develop branch, or look for
  closed Issues)
- Is it something really obvious that you fix it yourself?

Reporting issues is helpful but an even better approach is to send a Pull
Request, which is done by "Forking" the main repository and committing to your
own copy. This will require you to use the version control system called Git.

**********
Guidelines
**********

Before we look into how, here are the guidelines. If your Pull Requests fail
to pass these guidelines it will be declined and you will need to re-submit
when you’ve made the changes. This might sound a bit tough, but it is required
for us to maintain quality of the code-base.

PHP Style
=========

All code must meet the `Style Guide
<http://codeigniter.com/user_guide/general/styleguide.html>`_, which is
essentially the `Allman indent style
<http://en.wikipedia.org/wiki/Indent_style#Allman_style>`_, underscores and
readable operators. This makes certain that all code is the same format as the
existing code and means it will be as readable as possible.

Documentation
=============

If you change anything that requires a change to documentation then you will
need to add it. New classes, methods, parameters, changing default values, etc
are all things that will require a change to documentation. The change-log
must also be updated for every change. Also PHPDoc blocks must be maintained.

Compatibility
=============

CodeIgniter is compatible with PHP 5.1.6 so all code supplied must stick to
this requirement. If PHP 5.2 or 5.3 functions or features are used then there
must be a fallback for PHP 5.1.6.

Branching
=========

CodeIgniter uses the `Git-Flow
<http://nvie.com/posts/a-successful-git-branching-model/>`_ branching model
which requires all pull requests to be sent to the "develop" branch. This is
where the next planned version will be developed. The "master" branch will
always contain the latest stable version and is kept clean so a "hotfix" (e.g:
an emergency security patch) can be applied to master to create a new version,
without worrying about other features holding it up. For this reason all
commits need to be made to "develop" and any sent to "master" will be closed
automatically. If you have multiple changes to submit, please place all
changes into their own branch on your fork.

One thing at a time: A pull request should only contain one change. That does
not mean only one commit, but one change - however many commits it took. The
reason for this is that if you change X and Y but send a pull request for both
at the same time, we might really want X but disagree with Y, meaning we
cannot merge the request. Using the Git-Flow branching model you can create
new branches for both of these features and send two requests.

************
How-to Guide
************

There are two ways to make changes, the easy way and the hard way. Either way
you will need to `create a GitHub account <https://github.com/signup/free>`_.

Easy way GitHub allows in-line editing of files for making simple typo changes
and quick-fixes. This is not the best way as you are unable to test the code
works. If you do this you could be introducing syntax errors, etc, but for a
Git-phobic user this is good for a quick-fix.

Hard way The best way to contribute is to "clone" your fork of CodeIgniter to
your development area. That sounds like some jargon, but "forking" on GitHub
means "making a copy of that repo to your account" and "cloning" means
"copying that code to your environment so you can work on it".

#. Set up Git (Windows, Mac & Linux)
#. Go to the CodeIgniter repo
#. Fork it
#. Clone your CodeIgniter repo: git@github.com:<your-name>/CodeIgniter.git
#. Checkout the "develop" branch At this point you are ready to start making
   changes. 
#. Fix existing bugs on the Issue tracker after taking a look to see nobody
   else is working on them.
#. Commit the files
#. Push your develop branch to your fork
#. Send a pull request http://help.github.com/send-pull-requests/

The Reactor Engineers will now be alerted about the change and at least one of
the team will respond. If your change fails to meet the guidelines it will be
bounced, or feedback will be provided to help you improve it.

Once the Reactor Engineer handling your pull request is happy with it they
will post it to the internal EllisLab discussion area to be double checked by
the other Engineers and EllisLab developers. If nobody has a problem with the
change then it will be merged into develop and will be part of the next
release. Keeping your fork up-to-date

Unlike systems like Subversion, Git can have multiple remotes. A remote is the
name for a URL of a Git repository. By default your fork will have a remote
named "origin" which points to your fork, but you can add another remote named
"codeigniter" which points to git://github.com/EllisLab/CodeIgniter.git. This
is a read-only remote but you can pull from this develop branch to update your
own.

If you are using command-line you can do the following:

#. git remote add codeigniter git://github.com/EllisLab/CodeIgniter.git
#. git pull codeigniter develop
#. git push origin develop

Now your fork is up to date. This should be done regularly, or before you send
a pull request at least.

*******
License
*******

Please see the `license
agreement <http://codeigniter.com/user_guide/license.html>`_

*********
Resources
*********

-  `User Guide <http://codeigniter.com/user_guide/>`_
-  `Community Forums <http://codeigniter.com/forums/>`_
-  `User
   Voice <http://codeigniter.uservoice.com/forums/40508-codeigniter-reactor>`_
-  `Community Wiki <http://codeigniter.com/wiki/>`_
-  `Community IRC <http://codeigniter.com/irc/>`_

***************
Acknowledgement
***************

The EllisLab team and The Reactor Engineers would like to thank all the
contributors to the CodeIgniter project and you, the CodeIgniter user.