GitPHP Badoo рдкрд░

рдмреБрд╢ рдПрдХ рд╡рд┐рд╢рд╛рд▓рдХрд╛рдп рд╡рд┐рд╢рд╛рд▓ рднрдВрдбрд╛рд░ рд╡рд╛рд▓реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдЬрд╛рд░реЛрдВ рд╢рд╛рдЦрд╛рдПрдБ рдФрд░ рдЯреИрдЧ рд╣реИрдВред рд╣рдо рдЕрддреНрдпрдзрд┐рдХ рд╕рдВрд╢реЛрдзрд┐рдд GitPHP ( http://gitphp.org ) рд╕рдВрд╕реНрдХрд░рдг 0.2.4 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рдкрд░ рдХрдИ рдРрдб-рдСрди рдХрд┐рдП рдЧрдП рд╣реИрдВ (JIRA рдореЗрдВ рд╣рдорд╛рд░реЗ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг, рд╕рдореАрдХреНрд╖рд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рдВрдЧрдарди рдЖрджрд┐)ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЗрд╕ рдЙрддреНрдкрд╛рдж рдиреЗ рд╣рдореЗрдВ рддрдм рддрдХ рдЕрдиреБрдХреВрд▓ рдХрд┐рдпрд╛ рдЬрдм рддрдХ рдХрд┐ рд╣рдордиреЗ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рдХрд┐ рд╣рдорд╛рд░рд╛ рдореБрдЦреНрдп рднрдВрдбрд╛рд░ 20 рд╕реЗрдХрдВрдб рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рддрдХ рдЦреБрд▓рд╛ рд░рд╣рд╛ред рдФрд░ рдЖрдЬ рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╣рдордиреЗ GITPHP рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЬрд╛рдВрдЪ рдХреИрд╕реЗ рдХреА рдФрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдХреЗ рд╣рдордиреЗ рдХреНрдпрд╛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд┐рдПред

рд╕рдВрд░реЗрдЦрдг рдЯрд╛рдЗрдорд░


рд╡рд┐рдХрд╛рд╕ рдХреЗ рдорд╛рд╣реМрд▓ рдореЗрдВ badoo.com рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдЯрд╛рдЗрдорд░ рдФрд░ рдбреАрдмрдЧ рдПрд╕рдХреНрдпреВрдПрд▓ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдбрд┐рдмрдЧ-рдкреИрдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рд╣рдордиреЗ рдХреА рдереА, рдЙрд╕реЗ GITPHP рдореЗрдВ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдФрд░ рдХреЛрдб рд╕реЗрдХреНрд╢рди рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХреЛ рдорд╛рдкрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рдирд╕реНрдЯреЗрдб рдЯрд╛рдЗрдорд░ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ред рдпрд╣ рд╣рдорд╛рд░рд╛ рдбрд┐рдмрдЧ рдкреИрдирд▓ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:



рдкрд╣рд▓реЗ рдХреЙрд▓рдо рдореЗрдВ рд╡рд┐рдзрд┐ рдХрд╛ рдирд╛рдо (рдпрд╛ рдХреНрд░рд┐рдпрд╛) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рджреВрд╕рд░реЗ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ: рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ, рдХрдорд╛рдВрдб рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреА рд╢реБрд░реБрдЖрдд, рдФрд░ рдЯреНрд░реЗрд╕ред рдЕрдВрддрд┐рдо рдХреЙрд▓рдо рдореЗрдВ рдХреЙрд▓ рдкрд░ (рд╕реЗрдХрдВрдб рдореЗрдВ) рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕рдордп рд╣реЛрддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдЯрд╛рдЗрдорд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЕрдВрд╢ рд╣реИ:

<?php class GitPHP_Log { // ... public function timerStart() { array_push($this->timers, microtime(true)); } public function timerStop($name, $value = null) { $timer = array_pop($this->timers); $duration = microtime(true) - $timer; //      ,     foreach ($this->timers as &$item) $item += $duration; $this->Log($name, $value, $duration); } // ... } 

рдРрд╕реЗ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред timerStart() рдХреЛ рдорд╛рдкрд╛ рдХреЛрдб timerStart() рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, timerStart() рдХреЛ рдЯрд╛рдЗрдорд░ рдирд╛рдо рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЕрдВрдд рдореЗрдВ timerStop() :

 <?php $Log = new GitPHP_Log; $Log->timerStart(); $result = 0; $mult = 4; for ($i = 1; $i < 1000000; $i+=2) { $result += $mult / $i; $mult = -$mult; } $Log->timerStop("PI computation", $result); 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЙрд▓ рдХреЛ рдиреЗрд╕реНрдЯреЗрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЙрдкрд░реЛрдХреНрдд рд╡рд░реНрдЧ рдЧрдгрдирд╛ рдХрд░рддреЗ рд╕рдордп рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗрдЧрд╛ред

рд╕реНрдорд╛рд░реНрдЯреА рдХреЗ рдЕрдВрджрд░ рдЖрд╕рд╛рди рдХреЛрдб рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ "рд╕реНрд╡-рдЯрд╛рдЗрдорд░" рдмрдирд╛рдпрд╛ред рд╡реЗ рдХрдИ рдирд┐рдХрд╛рд╕ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд╕рд╛рде рддрд░реАрдХреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрдиреЗ рд╡рд╛рд▓реЗ рд╕рдордп рдХреЛ рдорд╛рдкрдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддреЗ рд╣реИрдВ (рдХрдИ рдЬрдЧрд╣ рдЬрд╣рд╛рдВ рд░рд┐рдЯрд░реНрди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ):

 <?php class GitPHP_DebugAutoLog { private $name; public function __construct($name) { $this->name = $name; GitPHP_Log::GetInstance()->timerStart(); } public function __destruct() { GitPHP_Log::GetInstance()->timerStop($this->name); } } 

рдРрд╕реА рдХрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: рдЖрдкрдХреЛ $Log = new GitPHP_DebugAutoLog('timer_name'); рдбрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ $Log = new GitPHP_DebugAutoLog('timer_name'); рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рд╡рд┐рдзрд┐ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдФрд░ рдЬрдм рдЖрдк рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдорд╛рдкрд╛ рдЬрд╛рдПрдЧрд╛:

 <?php function doSomething($a) { $Log = GitPHP_DebugAutoLog('doSomething'); if ($a > 5) { echo "Hello world!\n"; sleep(5); return; } sleep(1); } 

рд╣рдЬрд╛рд░реЛрдВ git рдХреЙрд▓-рдлрд╛рдЗрд▓ -t <рдкреНрд░рддрд┐рдмрджреНрдз>


рд╕реЗрдЯ рдЕрдк рдЯрд╛рдЗрдорд░реНрд╕ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдо рдЬрд▓реНрджреА рд╕реЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп GitPHP рд╕рдВрд╕реНрдХрд░рдг 0.2.4 рдХрд╣рд╛рдВ рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЯреИрдЧ рдХреЗ рд▓рд┐рдП, рдПрдХ рдХреЙрд▓ git cat-file -t рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рддрд╛рдХрд┐ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХрдорд┐рдЯ рд╣реИ, рдФрд░ рдХреНрдпрд╛ рдпрд╣ рдХрдорд┐рдЯ "рд▓рд╛рдЗрдЯрд╡реЗрдЯ рдЯреИрдЧ" рд╣реИ ( http://git-scm.com/book/en/Git-Basics -рдЯреИрдЧрд┐рдВрдЧ # рд▓рд╛рдЗрдЯрд╡реЗрдЯ-рдЯреИрдЧ )ред Git рдореЗрдВ рд▓рд╛рдЗрдЯрд╡реЗрдЯ рдЯреИрдЧ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЯреИрдЧ рд╣реИ рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрдореЗрдВрдЯ рдХрд╛ рд▓рд┐рдВрдХ рд╣реЛрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдХреЛрдИ рдЕрдиреНрдп рдЯреИрдЧ рдкреНрд░рдХрд╛рд░ рдореМрдЬреВрдж рдирд╣реАрдВ рдереЗ, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдмрд╕ рдЗрд╕ рдЪреЗрдХ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдФрд░ git cat-file -t, рдХреЛ рдХреБрдЫ рд╣рдЬрд╝рд╛рд░ рдХреЙрд▓ рд╕рд╣реЗрдЬреЗ git cat-file -t, рдЬрд┐рд╕рдореЗрдВ рд▓рдЧрднрдЧ 20 рд╕реЗрдХрдВрдб рд▓рдЧреЗред

рдпрд╣ рдХреИрд╕реЗ рд╣реБрдЖ рдХрд┐ GitPHP рдХреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЯреИрдЧ рдХреЗ рд▓рд┐рдП рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ "рд╣рд▓реНрдХрд╛" рд╣реИ? рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред

рд╕рднреА GitPHP рдкреГрд╖реНрдареЛрдВ рдкрд░, рдХрдорд┐рдЯ рдХреЗ рдЖрдЧреЗ, рд╢рд╛рдЦрд╛рдПрдБ рдФрд░ рдЯреИрдЧ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реИрдВ:



рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, GitPHP_TagList рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдЙрди рдЯреИрдЧреЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИ рдЬреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЛрдб рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддреЗ рд╣реИрдВ:

 <?php class GitPHP_TagList extends GitPHP_RefList { // ... public function GetCommitTags($commit) { if (!$commit) return array(); $commitHash = $commit->GetHash(); if (!$this->dataLoaded) $this->LoadData(); $tags = array(); foreach ($this->refs as $tag => $hash) { if (isset($this->commits[$tag])) { // ... } else { $tagObj = $this->project->GetObjectManager()->GetTag($tag, $hash); $tagCommitHash = $tagObj->GetCommitHash(); // ... if ($tagCommitHash == $commitHash) { $tags[] = $tagObj; } } } return $tags; } // ... } 

рдпрд╛рдиреА рдкреНрд░рддреНрдпреЗрдХ рдХрдореЗрдЯреА рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЖрдк рдЯреИрдЧ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рддреНрдп рд╣реИ:

  1. рдкрд╣рд▓рд╛ рдХреЙрд▓ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА (рдХреЙрд▓ рд▓реЛрдбрдбрд╛рдЯрд╛ ()) рдореЗрдВ рд╕рднреА рдЯреИрдЧ рдХреА рд╕реВрдЪреА рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред
  2. рд╕рднреА рдЯреИрдЧреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиред
  3. рдкреНрд░рддреНрдпреЗрдХ рдЯреИрдЧ рдХреЗ рд▓рд┐рдП, рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╕реНрддреБ рднрд░реА рд╣реБрдИ рд╣реИред
  4. GetCommitHash () рдХреЛ рдЯреИрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдореА рдореВрд▓реНрдп рдХреА рдЦреЛрдЬ рдХреА рдЧрдИ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред

рдЗрд╕ рддрдереНрдп рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐ рдЖрдк рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдлреЙрд░реНрдо array( commit_hash => array(tags) ) рдирдХреНрд╢реЗ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ GetCommitHash() рд╡рд┐рдзрд┐ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА GetCommitHash() : рдпрд╣ Load($tag) рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдмрд╛рд╣рд░реА рдЧрд┐рдЯ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ:

 <?php class GitPHP_TagLoad_Git implements GitPHP_TagLoadStrategy_Interface { // ... public function Load($tag) { // ... $args[] = '-t'; $args[] = $tag->GetHash(); $ret = trim($this->exe->Execute($tag->GetProject()->GetPath(), GIT_CAT_FILE, $args)); if ($ret === 'commit') { // ... return array(/* ... */); } // ... $ret = $this->exe->Execute($tag->GetProject()->GetPath(), GIT_CAT_FILE, $args); // ... return array(/* ... */); } } 

рдпрд╛рдиреА рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреМрди рд╕реА рд╢рд╛рдЦрд╛рдПрдБ рдФрд░ рдЯреИрдЧ рдПрдХ рдХрдорд┐рдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, GitPHP рд╕рднреА рдЯреИрдЧреНрд╕ рдХреА рдПрдХ рд╕реВрдЪреА рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП git рдХреИрдЯ-рдлрд╛рдЗрд▓ -t рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрд░рд┐рд╕реНрдЯреЛрдлрд░, рдЗрд╕реЗ рдмрдирд╛рдП рд░рдЦреЛ!

рд╕реИрдХрдбрд╝реЛрдВ рд░реАрдЯ-рд╕реВрдЪреА-рдХреЙрд▓ рдХреЙрд▓ --рдореИрдХреНрд╕-рдХрд╛рдЙрдВрдЯ = 1 ... <рдкреНрд░рддрд┐рдмрджреНрдз>


рдкреНрд░рддрд┐рдмрджреНрдз рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рд╕рдорд╛рди рд╣реИред рддрд┐рдерд┐ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдорд┐рдЯ, рд╕рдВрджреЗрд╢ рдЖрджрд┐ рдХрд╛ рд╕рдВрджреЗрд╢, рд╣рд░ рдмрд╛рд░ рд░реАрдЯ-рд▓рд┐рд╕реНрдЯ - рдЕрдзрд┐рдХрддрдо-рдЧрдгрдирд╛ = 1 ... <рдкреНрд░рддрд┐рдмрджреНрдз> рдХрд╣рд╛ рдЧрдпрд╛ред рдпрд╣ рдСрдкрд░реЗрд╢рди рднреА рдореБрдлреНрдд рдирд╣реАрдВ рд╣реИ:

 <?php class GitPHP_CommitLoad_Git extends GitPHP_CommitLoad_Base { public function Load($commit) { // ... /* get data from git_rev_list */ $args = array(); $args[] = '--header'; $args[] = '--parents'; $args[] = '--max-count=1'; $args[] = '--abbrev-commit'; $args[] = $commit->GetHash(); $ret = $this->exe->Execute($commit->GetProject()->GetPath(), GIT_REV_LIST, $args); // ... return array( // ... ); } // ... } 

рд╕рдорд╛рдзрд╛рди: рдмреИрдЪ рдЕрдкрд▓реЛрдб рдХрдорд┐рдЯ (git cat-file --batch)


рдХреИрдЯ-рдлрд╛рдЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╕рд┐рдВрдЧрд▓ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Git рдЖрдкрдХреЛ --batch рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдХрдИ рдХрдорд┐рдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ, рдпрд╣ рд╕реНрдЯрдб рдореЗрдВ рдХрдорд┐рдЯреНрд╕ рдХреА рдПрдХ рд╕реВрдЪреА рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рд╕реНрдЯрдбрдЖрдЙрдЯ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рд▓рд┐рдЦрддрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдЖрдк рдкрд╣рд▓реЗ рдЙрди рд╕рднреА рд╣реИрд╢ рдХреЗ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, git cat-file --batch рдФрд░ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рд╕рднреА рдкрд░рд┐рдгрд╛рдо рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред

рдпрд╣рд╛рдБ рдХреЛрдб рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИ (рдХреЛрдб рд╕рдВрд╕реНрдХрд░рдг GitPHP 0.2.4 рдХреЗ рд▓рд┐рдП рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ * nith рдореАрдбрд┐рдпрд╛):

 <?php class GitPHP_Project { // ... public function BatchReadData(array $hashes) { if (!count($hashes)) return array(); $outfile = tempnam('/tmp', 'objlist'); $hashlistfile = tempnam('/tmp', 'objlist'); file_put_contents($hashlistfile, implode("\n", $hashes)); $Git = new GitPHP_GitExe($this); $Git->Execute(GIT_CAT_FILE, array('--batch', ' < ' . escapeshellarg($hashlistfile), ' > ' . escapeshellarg($outfile))); unlink($hashlistfile); $fp = fopen($outfile, 'r'); unlink($outfile); $types = $contents = array(); while (!feof($fp)) { $ln = rtrim(fgets($fp)); if (!$ln) continue; list($hash, $type, $n) = explode(" ", rtrim($ln)); $contents[$hash] = fread($fp, $n); $types[$hash] = $type; } return array('contents' => $contents, 'types' => $types); } // ... } 

рд╣рдордиреЗ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛, рдЬрд╣рд╛рдБ рдХрдорд┐рдЯреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЧрдИ рд╣реИ (рдпрд╛рдиреА рд╣рдо рдХрдорд┐рдЯреНрд╕ рдХреА рдПрдХ рд╕реВрдЪреА рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрди рд╕рднреА рдХреЛ git cat-file --batch рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ)ред рдЗрд╕ рдЕрдиреБрдХреВрд▓рди рдиреЗ рдФрд╕рдд рдкреГрд╖реНрда рд▓реЛрдб рд╕рдордп рдХреЛ 20 рд╕реЗрдХрдВрдб рд╕реЗ 0.5 рд╕реЗрдХрдВрдб рд╕реЗ рдХрдо рдХрд░ рджрд┐рдпрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ GitPHP рдХреЗ рдзреАрдореЗ рдХрд╛рдо рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ред

рдУрдкрди-рд╕реЛрд░реНрд╕: GitPHP рдЕрдиреБрдХреВрд▓рди 0.2.9 (рдорд╛рд╕реНрдЯрд░)


рдереЛрдбрд╝рд╛ рд╕реЛрдЪрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдордиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ git cat-file --batch рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛ред рдпрджреНрдпрдкрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рдЖрджреЗрд╢ рдЖрдкрдХреЛ рдкреНрд░рджрд░реНрд╢рди рдЦреЛрдП рдмрд┐рдирд╛, рдПрдХ рд╕рдордп рдореЗрдВ рдПрдХ рдкреНрд░рддрд┐рдмрджреНрдз рдЬрд╛рдирдХрд╛рд░реА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ! рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди, рдорд╛рдирдХ рдЗрдирдкреБрдЯ рд╕реЗ рдПрдХ рдкрдВрдХреНрддрд┐ рдкрдврд╝реА рдЬрд╛рддреА рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдмрдлрд░рд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛ рдорд╛рдирдХ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рднреЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо git cat-file --batch рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ git cat-file --batch proc_open() рдорд╛рдзреНрдпрдо рд╕реЗ git cat-file --batch рдФрд░ рддреБрд░рдВрдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдмрд┐рдирд╛ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ git cat-file --batch !

рдпрд╣рд╛рдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдПрдХ рдЕрдВрд╢ рд╣реИ (рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ):

 <?php // ... class GitPHP_GitExe implements GitPHP_Observable_Interface { // ... public function GetObjectData($projectPath, $hash) { $process = $this->GetProcess($projectPath); $pipes = $process['pipes']; $data = $hash . "\n"; fwrite($pipes[0], $data); fflush($pipes[0]); $ln = rtrim(fgets($pipes[1])); $parts = explode(" ", rtrim($ln)); list($hash, $type, $n) = $parts; $contents = ''; while (strlen($contents) < $n) { $buf = fread($pipes[1], min(4096, $n - strlen($contents))); $contents .= $buf; } return array( 'contents' => $contents, 'type' => $type, ); } // ... } 

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╣рдо рдЕрдм рд╣рд░ рдмрд╛рд░ рдЧрд┐рдЯ рдХрдорд╛рдВрдб рдХреЛ рдХреЙрд▓ рдХрд┐рдП рдмрд┐рдирд╛ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдмрдбрд╝рд╛ рдкреНрд░рджрд░реНрд╢рди рдмреВрд╕реНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ: рдмрд╕ рд╣рдорд╛рд░реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП git cat-file рдФрд░ git rev-list рдХреЛ рд╕рднреА рдХреЙрд▓ рдмрджрд▓реЗрдВред

рд╣рдордиреЗ рдПрдХ рд╣реА рдХрдорд┐рдЯ рдореЗрдВ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рдПрдХрддреНрд░ рдХрд┐рдП рдФрд░ GitPHP рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдПрдХ рдкреБрд▓-рдЕрдиреБрд░реЛрдз рднреЗрдЬрд╛ред рдХреБрдЫ рд╕рдордп рдмрд╛рдж, рдкреИрдЪ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛! рдпрд╣рд╛рдБ рд╣реИ:

source.gitphp.org/projects/gitphp.git/commitdiff/3c87676b3afe4b0c1a1f7198995cecc176200482

рд▓реЗрдЦрдХ рдиреЗ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реБрдзрд╛рд░ рдХрд┐рдП (рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрдорд┐рдЯ рдореЗрдВ), рдФрд░ рдЕрдм рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛ рдореЗрдВ GitPHP рдХрд╛ рдХрд╛рдлреА рддреНрд╡рд░рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИ! рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ "рд╕рдВрдЧрддрддрд╛ рдореЛрдб" рдХреЛ рдмрдВрдж рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЕрд░реНрдерд╛рдд $compat = false; рд╕реЗрдЯ рдХрд░реЗрдВ $compat = false; рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВред

Yuri youROCK Nasretdinov , PHP рдбреЗрд╡рд▓рдкрд░, Badoo
рдПрд╡рдЧреЗрдиреА рдИрдЬрд╝реЛ рдордЦрд░реЛрд╡ , рдХреНрдпреВрдП рдЗрдВрдЬреАрдирд┐рдпрд░, рдмреЗрде

Source: https://habr.com/ru/post/In200946/


All Articles