Afficher mes infos, commits Git en php

Il existe une librairie php   »klaussilveira/gitter » pour retrouver toutes les infos sur nos repositories Git. On pourrait très bien s’en servir pour ajouter une nouvelle fenêtre d’info a notre barre de debug, ou un service espion de plusieurs repositories.

mes commits

Il faut en premier lieu utiliser cette bibliothèque dans notre projet, merci composer :
insérez :  »klaussilveira/gitter »: « 0.2.* », dans require(-dev) du fichier composer.json; puis faire en ligne de commande « composer update ».

Ici, je vais tester cette bibliothèque, donc je ne ferais pas de package commitsInfo, mais le code source sous Laravel est le même.

Une route :

Route::controller('git', 'GitController');

Une vue :
J’affiche surtout la liste des fichiers modifiés pour chaque commit, mais il est même possible d’afficher les différences dans chaque fichier.

@extends('frontend/layouts/default')

@section('styles')
div.rfiles { border-bottom:1px solid #eee; padding-bottom:0.5em; }
div.rfiles li { font-size:90%; margin-left:3em; }
@parent
@stop

{{-- Page content --}}
@section('content')
<div class="page-header">
	<h3>{{ $git->path }} : GIT</h3>

    Branche : <code>{{$git->branche}}</code>
    HEAD : <code>{{$git->head}}</code>
    <hr>
    @foreach($git->commits as $commit)
    <div class="row">
        <div class="span2">
            {{$commit->name}}
        </div>
        <div class="span6" title="{{$commit->id}}">
            <b>{{$commit->message}}</b>
        </div>
        <div class="span1">
            {{$commit->date}}
        </div>        
    </div>
    <div class="row rfiles">
        <div class="span2"></div>
        <div class="span7"><ul>
            @foreach($commit->files as $file)
             <li>{{$file}}</li>
            @endforeach
        </ul></div>
    </div>
    @endforeach

	<pre title="branches">
	@foreach($git->branches as $branche) {{ $branche }}   @endforeach
	</pre>
	<hr><pre title="tags">
	@foreach($git->tags as $tag) {{ $tag }}  	@endforeach
	</pre>		
</div>

@stop

Un controleur :

Enfin du code :)

<?php // app/controllers/GitController.php

class GitController extends BaseController 
{
	public function getIndex()
	{
		$path=base_path();
//$path='/home/www/intranet/www/laravel/loic-sharma/dev-branche/vendor/loic-sharma';
//$path='/home/www/intranet/www/laravel/out.git/workbench/papajoker/out';
//$path='/home/www/intranet/www/laravel/rss/workbench/juy';
$path='/home/www/intranet/www/laravel/starter-kit-fr.patrick/workbench/papajoker/artisan';

		$git=$this->loadGit($path);
		return View::make('git')->with('git',$git);
	}

Dans notre contrôleur, nous n’avons que 3 lignes :
1, nous définissons notre dossier git; (5 lignes! mais pour tests!)
2, nous chargeons notre dossier .git; et
3, pour finir nous affichons notre vue avec les données chargées en « 2″.

Seule la méthode ->loadGit($projetGitPath) utilisera la bibliothèque   »klaussilveira/gitter ».

Nous chargeons le dépôt git très simplement :

$client = new Gitter\Client;
$repository = $client->getRepository( $projetGitpath );

Nous pouvons avoir des infos sur les branches de notre dépot :

$branches=$repository->getBranches();
$repository->getCurrentBranch();

aussi sur les tags (de version) :

$repository->getTags();

mais surtout sur les commits :

$commits = $repository->getCommits();
foreach ($commits as $commit) {
   $ID = $commit->getShortHash();
   $commit->getCommiter()->getName();
   $commit->getDate()->format('d/m/Y');
   $titre= $commit->getMessage();
}

Pour des informations plus en profondeur, il faut charger individuellement le commit par sa clé avec ->getShortHash().

$idCommit=$commit->getShortHash();
$commit=$repository->getCommit($idCommit);

Cette fois ci, avec getCommit(), nous avons toutes les infos sur le commit, en particulier, les noms des fichiers modifiés ainsi que le détail de chaque modification, par la méthode getDiffs().

foreach ($commit->getDiffs() as $diff){
   $files[]=$diff->getFile();
}

Voici le code source de notre controleur :

  private function loadGit($path=null)
  {
	$return=new stdClass();
	if ($path==null) $path= base_path();
	$return->path= $path;

	$client = new Gitter\Client;
	$repository = $client->getRepository( $return->path );

	$return->branches=array();
	$branches=$repository->getBranches();
	foreach ($branches as $branche) $return->branches[]=$branche;
	$return->branche=$repository->getCurrentBranch();

	$return->tags=array();
	$tags=$repository->getTags(); $tags= (is_array($tags)) ? array_reverse($tags) : array() ;
	foreach ($tags as $tag) $return->tags[] = $tag;
   	$return->head= $repository->getHead();

	$commits = $repository->getCommits();
	foreach($commits as $c) {
	     $commit= new stdClass();
	     $return->commits[]=$commit;
	     $commit->name = $c->getCommiter()->getName();
	     $commit->message = $c->getMessage();
	     $commit->date = $c->getDate()->format('d/m/Y');
	     $commit->id=$c->getShortHash();
	     $c=$repository->getCommit($commit->id);
	     foreach($c->getDiffs() as $diff){
		    $commit->files[]=$diff->getFile();
	     }
	}
	return $return;
  }
}

Et voila, nous visualisons très rapidement les commits de notre projet, avec une vue particulière : on ne va pas refaire gitHub quand même :)

Share Button

Vous devriez aimer...