###################
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_src/source/changelog.rst>`_.

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

-  PHP version 5.2.4 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.2.4 so all code supplied must stick to
this requirement. If PHP 5.3 or 5.4 functions or features are used then there
must be a fallback for PHP 5.2.4.

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/>`_
-  `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.
