2017 © Pedro Peláez
 

library gitelephant

An abstraction layer for git written in PHP 5.3

image

cypresslab/gitelephant

An abstraction layer for git written in PHP 5.3

  • Friday, July 13, 2018
  • by matteosister
  • Repository
  • 25 Watchers
  • 411 Stars
  • 81,567 Installations
  • PHP
  • 24 Dependents
  • 0 Suggesters
  • 74 Forks
  • 24 Open issues
  • 81 Versions
  • 6 % Grown

The README.md

GitElephant, (*1)

Latest Stable Version License Total Downloads Montly Downloads, (*2)

Build Status Code Check Dependency Status Scrutinizer Quality Score Code Coverage SensioLabsInsight, (*3)

GitElephant is an abstraction layer to manage your git repositories with php, (*4)

This library officially supports git >= 1.8, older version are supported as well, but with some caveat., (*5)

How it works

GitElephant mostly rely on the git binary to retrieve information about the repository, read the output and create an OOP layer to interact with, (*6)

Some parts are (or will be) implemented by reading directly inside the .git folder, (*7)

The api is completely transparent to the end user. You don't have to worry about which method is used., (*8)

Requirements

  • php >= 7.2
  • *nix system with git installed

*For php 7.1, please use GitElephant version 3.x, (*9)

*For php 7.0, please use GitElephant version 2.x, (*10)

*For php 5.x please use GitElephant version 1.x, (*11)

This library is tested on linux, but it should work well with any unix system, as far as a git binary is available. For windows support, well.. if someone want to help?!, (*12)

Installation

composer, (*13)

To install GitElephant with composer you simply need to create a composer.json in your project root and add:, (*14)

``` json { "require": { "cypresslab/gitelephant": "~4.0" } }, (*15)


Then run ``` bash $ curl -s https://getcomposer.org/installer | php $ composer install

You have now GitElephant installed in vendor/cypresslab/gitelephant, (*16)

And an handy autoload file to include in you project in vendor/autoload.php, (*17)

How to use

use GitElephant\Repository;
$repo = new Repository('/path/to/git/repository');
// or the factory method
$repo = Repository::open('/path/to/git/repository');

By default GitElephant try to use the git binary on your system., (*18)

the Repository class is the main class where you can find every method you need..., (*19)

Read repository, (*20)

// get the current status
$repo->getStatusOutput(); // returns an array of lines of the status message

branches, (*21)

$repo->getBranches(); // return an array of Branch objects
$repo->getMainBranch(); // return the Branch instance of the current checked out branch
$repo->getBranch('master'); // return a Branch instance by its name
$develop = Branch::checkout($repo, 'develop');
$develop = Branch::checkout($repo, 'develop', true); // create and checkout

tags, (*22)

$repo->getTags(); // array of Tag instances
$repo->getTag('v1.0'); // a Tag instance by name
Tag::pick($repo, 'v1.0'); // a Tag instance by name

// last tag by date
$repo->getLastTag();

commits, (*23)

$repo->getCommit(); // get a Commit instance of the current HEAD
$repo->getCommit('v1.0'); // get a Commit instance for a tag
$repo->getCommit('1ac370d'); // full sha or part of it
// or directly create a commit object
$commit = new Commit($repo, '1ac370d');
$commit = new Commit($repo, '1ac370d'); // head commit

// count commits
$repo->countCommits('1ac370d'); // number of commits to arrive at 1ac370d
// commit is countable, so, with a commit object, you can do
$commit->count();
// as well as
count($commit);

remotes, (*24)

$repo->getRemote('origin'); // a Remote object
$repo->getRemotes(); // array of Remote objects

// Log contains a collection of commit objects
// syntax: getLog(<tree-ish>, path = null, limit = 15, offset = null)
$log = $repo->getLog();
$log = $repo->getLog('master', null, 5);
$log = $repo->getLog('v0.1', null, 5, 10);
// or directly create a log object
$log = new Log($repo);
$log = new Log($repo, 'v0.1', null, 5, 10);

// countable
$log->count();
count($log);

// iterable
foreach ($log as $commit) {
    echo $commit->getMessage();
}

status, (*25)

If you build a GitElephant\Status\Status class, you will get a nice api for getting the actual state of the working tree and staging area., (*26)

$status = $repo->getStatus();
$status = GitElephant\Status\Status::get($repo); // it's the same...

$status->all(); // A PhpCollection of StatusFile objects
$status->untracked();
$status->modified();
$status->added();
$status->deleted();
$status->renamed();
$status->copied();

all this methods returns a PhpCollection of StatusFile objects, (*27)

a StatusFile instance has all the information about the tree node changes. File names (and new file names for renamed objects), index and working tree status, and also a "git style" description like: added to index or deleted in work tree, (*28)

Manage repository, (*29)

You could also use GitElephant to manage your git repositories via PHP., (*30)

Your web server user (like www-data) needs to have access to the folder of the git repository, (*31)

$repo->init(); // init
$repo->cloneFrom("git://github.com/matteosister/GitElephant.git"); // clone

// stage changes
$repo->stage('file1.php');
$repo->stage(); // stage all

// commit
$repo->commit('my first commit');
$repo->commit('my first commit', true); // commit and stage every pending changes in the working tree

// remotes
$repo->addRemote('awesome', 'git://github.com/matteosister/GitElephant.git');

// checkout
$repo->checkout($repo->getTag('v1.0')); // checkout a tag
$repo->checkout('master'); // checkout master

// manage branches
$repo->createBranch('develop'); // create a develop branch from current checked out branch
$repo->createBranch('develop', 'master'); // create a develop branch from master
$repo->deleteBranch('develop'); // delete the develop branch
$repo->checkoutAllRemoteBranches('origin'); // checkout all the branches from the remote repository

// manage tags
// create  a tag named v1.0 from master with the given tag message
$repo->createTag('v1.0', 'master', 'my first release!');
// create  a tag named v1.0 from the current checked out branch with the given tag message
$repo->createTag('v1.0', null, 'my first release!');
// create a tag from a Commit object
$repo->createTag($repo->getCommit());

Remote repositories, (*32)

If you need to access remote repository you have to install the ssh2 extension and pass a new Caller to the repository. this is a new feature...consider this in a testing phase, (*33)

$repo = new Repository('/path/to/git/repository');
$connection = ssh_connect('host', 'port');
// authorize the connection with the method you want
ssh2_auth_password($connection, 'user', 'password');
$caller = new CallerSSH2($connection, '/path/to/git/binary/on/server');
$repo = Repository::open('/path/to/git/repository');
$repo->setCaller($caller);

A versioned tree of files

A git repository is a tree structure versioned in time. So if you need to represent a repository in a, let's say, web browser, you will need a tree representation of the repository, at a given point in history., (*34)

Tree class, (*35)

$tree = $repo->getTree(); // retrieve the actual *HEAD* tree
$tree = $repo->getTree($repo->getCommit('1ac370d')); // retrieve a tree for a given commit
$tree = $repo->getTree('master', 'lib/vendor'); // retrieve a tree for a given path
// generate a tree
$tree = new Tree($repo);

The Tree class implements ArrayAccess, Countable and Iterator interfaces., (*36)

You can use it as an array of git objects., (*37)

foreach ($tree as $treeObject) {
    echo $treeObject;
}

A Object instance is a php representation of a node in a git tree, (*38)

echo $treeObject; // the name of the object (folder, file or link)
$treeObject->getType(); // one class constant of Object::TYPE_BLOB, Object::TYPE_TREE and Object::TYPE_LINK
$treeObject->getSha();
$treeObject->getSize();
$treeObject->getName();
$treeObject->getSize();
$treeObject->getPath();

You can also pass a tree object to the repository to get its subtree, (*39)

$subtree = $repo->getTree('master', $treeObject);

Diffs

If you want to check a Diff between two commits the Diff class comes in, (*40)

// get the diff between the given commit and it parent
$diff = $repo->getDiff($repo->getCommit());
// get the diff between two commits
$diff = $repo->getDiff($repo->getCommit('1ac370d'), $repo->getCommit('8fb7281'));
// same as before for a given path
$diff = $repo->getDiff($repo->getCommit('1ac370d'), $repo->getCommit('8fb7281'), 'lib/vendor');
// or even pass a Object
$diff = $repo->getDiff($repo->getCommit('1ac370d'), $repo->getCommit('8fb7281'), $treeObject);
// alternatively you could directly use the sha of the commit
$diff = $repo->getDiff('1ac370d', '8fb7281');
// manually generate a Diff object
$diff = Diff::create($repo); // defaults to the last commit
// or as explained before
$diff = Diff::create($repo, '1ac370d', '8fb7281');

The Diff class implements ArrayAccess, Countable and Iterator interfaces, (*41)

You can iterate over DiffObject, (*42)

foreach ($diff as $diffObject) {
    // mode is a constant of the DiffObject class
    // DiffObject::MODE_INDEX an index change
    // DiffObject::MODE_MODE a mode change
    // DiffObject::MODE_NEW_FILE a new file change
    // DiffObject::MODE_DELETED_FILE a deleted file change
    echo $diffObject->getMode();
}

A DiffObject is a class that implements ArrayAccess, Countable and Iterator interfaces. It represent a file, folder or submodule changed in the Diff., (*43)

Every DiffObject can have multiple chunks of changes. For example:, (*44)

    added 3 lines at line 20
    deleted 4 lines at line 560

You can iterate over DiffObject to get DiffChunks. DiffChunks are the last steps of the Diff process, they are a collection of DiffChunkLine Objects, (*45)

foreach ($diffObject as $diffChunk) {
    if (count($diffChunk) > 0) {
        echo "change detected from line ".$diffChunk->getDestStartLine()." to ".$diffChunk->getDestEndLine();
        foreach ($diffChunk as $diffChunkLine) {
            echo $diffChunkLine; // output the line content
        }
    }
}

Testing

The library is fully tested with PHPUnit., (*46)

Go to the base library folder and install the dev dependencies with composer, and then run the phpunitt test suite, (*47)

bash $ composer --dev install $ ./vendor/bin/phpunit # phpunit test suite, (*48)

If you want to run the test suite you should have all the dependencies loaded., (*49)

Symfony

There is a GitElephantBundle to use this library inside a Symfony project., (*50)

Dependencies

for tests, (*51)

Code style

GitElephant follows the: * PSR-2 Coding Standard * Extended Coding Style Guide * gitflow, (*52)

Want to contribute?

You are my new hero!, (*53)

Just remember:, (*54)

  • PSR coding standards
  • add tests to everything you develop
  • if you don't use gitflow, just remember to branch from "develop" and send your PR there. Please do not send pull requests on the master branch.

Author

Matteo Giachino (twitter), (*55)

Many thanks to all the contributors, (*56)

Thanks

Many thanks to Linus and all those who have worked/contributed in any way to git. Because it's awesome!!! I can't imagine being a developer without it., (*57)

Logo design by Stefano Lodovico, (*58)

Analytics, (*59)

The Versions

24/02 2018

dev-revert-128-develop

dev-revert-128-develop http://gitelephant.cypresslab.net/

An abstraction layer for git written in PHP 5.3

  Sources   Download

LGPL-3.0+

The Requires

 

The Development Requires

git

11/08 2014

dev-feature/global-command-flags

dev-feature/global-command-flags http://gitelephant.cypresslab.net/

An abstraction layer for git written in PHP 5.3

  Sources   Download

LGPL-3.0+

The Requires

 

The Development Requires

git

06/08 2014
03/08 2014

dev-feature/remote-repo-vagrant-tests

dev-feature/remote-repo-vagrant-tests http://gitelephant.cypresslab.net/

An abstraction layer for git written in PHP 5.3

  Sources   Download

LGPL-3.0+

The Requires

 

The Development Requires

git

26/06 2014

dev-John-Schlick-RevParse

dev-John-Schlick-RevParse http://matteosister.github.com/GitElephant

An abstraction layer for git written in PHP 5.3

  Sources   Download

LGPL-3.0+

The Requires

 

The Development Requires

git

07/06 2013
19/05 2013
19/05 2013
23/02 2013

0.9.15

0.9.15.0 http://matteosister.github.com/GitElephant

An abstraction layer for git written in PHP 5.3

  Sources   Download

LGPLv3

The Requires

 

The Development Requires

git

23/02 2013

0.9.14

0.9.14.0 http://matteosister.github.com/GitElephant

An abstraction layer for git written in PHP 5.3

  Sources   Download

LGPLv3

The Requires

 

The Development Requires

git

19/01 2013

0.9.13

0.9.13.0 http://matteosister.github.com/GitElephant

An abstraction layer for git written in PHP 5.3

  Sources   Download

LGPLv3

The Requires

 

The Development Requires

git

19/01 2013

0.9.12

0.9.12.0 http://matteosister.github.com/GitElephant

An abstraction layer for git written in PHP 5.3

  Sources   Download

LGPLv3

The Requires

 

The Development Requires

git

06/01 2013

0.9.11

0.9.11.0 http://matteosister.github.com/GitElephant

An abstraction layer for git written in PHP 5.3

  Sources   Download

LGPLv3

The Requires

 

The Development Requires

git

27/12 2012

0.9.10

0.9.10.0 http://matteosister.github.com/GitElephant

An abstraction layer for git written in PHP 5.3

  Sources   Download

LGPLv3

The Requires

 

The Development Requires

git

25/12 2012

0.9.9

0.9.9.0 http://matteosister.github.com/GitElephant

An abstraction layer for git written in PHP 5.3

  Sources   Download

LGPLv3

The Requires

 

The Development Requires

git

23/12 2012

0.9.8

0.9.8.0 http://matteosister.github.com/GitElephant

An abstraction layer for git written in PHP 5.3

  Sources   Download

LGPLv3

The Requires

 

The Development Requires

git

23/12 2012

0.9.7

0.9.7.0 http://matteosister.github.com/GitElephant

An abstraction layer for git written in PHP 5.3

  Sources   Download

LGPLv3

The Requires

 

The Development Requires

git

18/12 2012

0.9.6

0.9.6.0 http://matteosister.github.com/GitElephant

An abstraction layer for git written in PHP 5.3

  Sources   Download

LGPLv3

The Requires

 

The Development Requires

git

02/12 2012

0.9.5

0.9.5.0 http://matteosister.github.com/GitElephant

An abstraction layer for git written in PHP 5.3

  Sources   Download

LGPLv3

The Requires

 

The Development Requires

git

07/11 2012

0.9.3

0.9.3.0 http://matteosister.github.com/GitElephant

An abstraction layer for git written in PHP 5.3

  Sources   Download

LGPLv3

The Requires

 

The Development Requires

git

03/11 2012
28/10 2012
03/10 2012
31/08 2012

0.8.4

0.8.4.0 http://matteosister.github.com/GitElephant

An abstraction layer for git written in PHP 5.3

  Sources   Download

LGPLv3

The Requires

 

The Development Requires

git

20/08 2012

0.8.3

0.8.3.0 http://matteosister.github.com/GitElephant

An abstraction layer for git written in PHP 5.3

  Sources   Download

LGPLv3

The Requires

 

The Development Requires

git

30/06 2012

0.8.2

0.8.2.0 http://matteosister.github.com/GitElephant

An abstraction layer for git written in PHP 5.3

  Sources   Download

LGPLv3

The Requires

 

git

24/04 2012

0.8.1

0.8.1.0 http://matteosister.github.com/GitElephant

An abstraction layer for git written in PHP 5.3

  Sources   Download

LGPLv3

The Requires

 

git

11/03 2012
16/01 2012

0.6.1

0.6.1.0 http://matteosister.github.com/GitElephant

An abstraction layer for git written in PHP 5.3

  Sources   Download

GPL3

The Requires

 

git

14/01 2012

0.6.0

0.6.0.0 http://matteosister.github.com/GitElephant

An abstraction layer for git written in PHP 5.3

  Sources   Download

GPL3

The Requires

 

git

14/01 2012

0.5.4

0.5.4.0 http://matteosister.github.com/GitElephant

An abstraction layer for git written in PHP 5.3

  Sources   Download

GPL3

The Requires

 

git

13/01 2012

0.5.3

0.5.3.0 http://matteosister.github.com/GitElephant

An abstraction layer for git written in PHP 5.3

  Sources   Download

GPL3

The Requires

 

git

12/01 2012

0.5.2

0.5.2.0 http://matteosister.github.com/GitElephant

An abstraction layer for git written in PHP 5.3

  Sources   Download

GPL3

The Requires

 

git

11/01 2012

0.5.1

0.5.1.0 http://matteosister.github.com/GitElephant

An abstraction layer for git written in PHP 5.3

  Sources   Download

GPL3

The Requires

 

git

11/01 2012

0.5.0

0.5.0.0 http://matteosister.github.com/GitElephant

An abstraction layer for git written in PHP 5.3

  Sources   Download

GPL3

The Requires

 

git

11/01 2012

0.4.2

0.4.2.0 http://matteosister.github.com/GitElephant

An abstraction layer for git written in PHP 5.3

  Sources   Download

GPL3

The Requires

 

git

11/01 2012

0.4.1

0.4.1.0 http://matteosister.github.com/GitElephant

An abstraction layer for git written in PHP 5.3

  Sources   Download

GPL3

The Requires

 

git

11/01 2012

0.4

0.4.0.0 http://matteosister.github.com/GitElephant

An abstraction layer for git written in PHP 5.3

  Sources   Download

GPL3

The Requires

 

git

10/01 2012

0.3

0.3.0.0 http://matteosister.github.com/GitElephant

An abstraction layer for git written in PHP 5.3

  Sources   Download

GPL3

The Requires

  • php >=5.3.0

 

git

08/01 2012

0.2

0.2.0.0 http://matteosister.github.com/GitElephant

An abstraction layer for git written in PHP 5.3

  Sources   Download

GPL3

The Requires

 

git