69 "Computed cacheFile={$this->cacheFile} for {$repoDir}"
71 if ( $usePrecomputed &&
72 $this->cacheFile !==
null &&
75 $this->
cache = FormatJson::decode(
79 wfDebugLog(
'gitinfo',
"Loaded git data from cache for {$repoDir}" );
83 wfDebugLog(
'gitinfo',
"Cache incomplete for {$repoDir}" );
84 $this->basedir =
$repoDir . DIRECTORY_SEPARATOR .
'.git';
87 if (
strlen( $GITfile ) > 8 &&
88 substr( $GITfile, 0, 8 ) ===
'gitdir: '
91 if ( $path[0] ===
'/' ||
substr( $path, 1, 1 ) ===
':' ) {
93 $this->basedir =
$path;
116 $realIP = realpath(
$IP );
118 if ( $repoName ===
false ) {
122 if (
strpos( $repoName, $realIP ) === 0 ) {
128 $repoName =
strtr( $repoName, DIRECTORY_SEPARATOR,
'-' );
129 $fileName =
'info' . $repoName .
'.json';
130 $cachePath =
"{$wgGitInfoCacheDirectory}/{$fileName}";
136 return "$repoDir/gitinfo.json";
144 public static function repo() {
145 if (
is_null( self::$repo ) ) {
147 self::$repo =
new self(
$IP );
159 return (
bool)
preg_match(
'/^[0-9A-F]{40}$/i', $str );
169 $headFile =
"{$this->basedir}/HEAD";
175 if (
preg_match(
"/ref: (.*)/", $head, $m ) ) {
176 $head =
rtrim( $m[1] );
178 $head =
rtrim( $head );
183 return $this->
cache[
'head'];
197 if ( self::isSHA1( $head ) ) {
201 $refFile =
"{$this->basedir}/{$head}";
202 $packedRefs =
"{$this->basedir}/packed-refs";
212 $this->
cache[
'headSHA1'] = $sha1;
214 return $this->
cache[
'headSHA1'];
226 if ( !
isset( $this->
cache[
'headCommitDate'] ) ) {
230 !Shell::isDisabled() &&
237 '--format=format:%ct',
240 $gitDir = realpath( $this->basedir );
241 $result = Shell::command( $cmd )
242 ->environment( [
'GIT_DIR' => $gitDir ] )
243 ->restrict( Shell::RESTRICT_DEFAULT | Shell::NO_NETWORK )
244 ->whitelistPaths( [ $gitDir, $this->repoDir ] )
247 if ( $result->getExitCode() === 0 ) {
248 $date = (
int)$result->getStdout();
251 $this->
cache[
'headCommitDate'] = $date;
253 return $this->
cache[
'headCommitDate'];
265 preg_match(
"#^refs/heads/(.*)$#", $branch, $m )
271 return $this->
cache[
'branch'];
281 if ( $url ===
false ) {
284 foreach ( self::getViewers() as
$repo => $viewer ) {
285 $pattern =
'#^' .
$repo .
'$#';
290 '%h' =>
substr( $headSHA1, 0, 7 ),
295 return strtr( $viewerUrl, $replacements );
307 $config =
"{$this->basedir}/config";
316 if (
isset( $configArray[
'remote origin'] ) ) {
317 $remote = $configArray[
'remote origin'];
319 foreach ( $configArray as $sectionName => $sectionConf ) {
320 if (
substr( $sectionName, 0, 6 ) ==
'remote' ) {
326 if ( $remote !==
false &&
isset( $remote[
'url'] ) ) {
327 $url = $remote[
'url'];
330 $this->
cache[
'remoteURL'] = $url;
332 return $this->
cache[
'remoteURL'];
362 if ( $this->cacheFile !==
null ) {
372 "Failed to compute GitInfo for \"{$this->basedir}\""
377 $cacheDir =
dirname( $this->cacheFile );
381 throw new MWException(
"Unable to create GitInfo cache \"{$cacheDir}\"" );
419 if ( self::$viewers ===
false ) {
421 Hooks::run(
'GitViewers', [ &self::$viewers ] );
and that you know you can do these things To protect your we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights These restrictions translate to certain responsibilities for you if you distribute copies of the or if you modify it For if you distribute copies of such a whether gratis or for a you must give the recipients all the rights that you have You must make sure that receive or can get the source code And you must show them these terms so they know their rights We protect your rights with two and(2) offer you this license which gives you legal permission to copy
$wgGitRepositoryViewers
Map GIT repository URLs to viewer URLs to provide links in Special:Version.
$wgGitInfoCacheDirectory
Directory where GitInfo will look for pre-computed cache files.
$wgGitBin
Fully specified path to git binary.
wfDebugLog( $logGroup, $text, $dest='all', array $context=[])
Send a line to a supplementary debug log file, if configured, or main debug log if not.
wfMkdirParents( $dir, $mode=null, $caller=null)
Make directory, and make all parent directories if they don't exist.
static repo()
Get the singleton for the repo at $IP.
getHead()
Get the HEAD of the repo (without any opening "ref: ")
static getCacheFilePath( $repoDir)
Compute the path to the cache file for a given directory.
static array false $viewers
Map of repo URLs to viewer URLs.
$cacheFile
Path to JSON cache file for pre-computed git information.
$basedir
Location of the .git directory.
getRemoteUrl()
Get the URL of the remote origin.
getHeadCommitDate()
Get the commit date of HEAD entry of the git code repository.
precomputeValues()
Precompute and cache git information.
$cache
Cached git information.
cacheIsComplete()
Check to see if the current cache is fully populated.
static $repo
Singleton for the repo at $IP.
$repoDir
Location of the repository.
getHeadViewUrl()
Get an URL to a web viewer link to the HEAD revision.
__construct( $repoDir, $usePrecomputed=true)
static isSHA1( $str)
Check if a string looks like a hex encoded SHA1 hash.
getHeadSHA1()
Get the SHA1 for the current HEAD of the repo.
getCurrentBranch()
Get the name of the current branch, or HEAD if not found.
static getViewers()
Gets the list of repository viewers.
you have access to all of the normal MediaWiki so you can get a DB use the cache
The wiki should then use memcached to cache various data To use multiple just add more items to the array To increase the weight of a make its entry a array("192.168.0.1:11211", 2))