Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
17 / 17
100.00% covered (success)
100.00%
2 / 2
CRAP
100.00% covered (success)
100.00%
1 / 1
TempFSFileFactory
100.00% covered (success)
100.00%
17 / 17
100.00% covered (success)
100.00%
2 / 2
6
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 newTempFSFile
100.00% covered (success)
100.00%
16 / 16
100.00% covered (success)
100.00%
1 / 1
5
1<?php
2
3namespace MediaWiki\FileBackend\FSFile;
4
5use TempFSFile;
6use Wikimedia\AtEase\AtEase;
7
8/**
9 * @ingroup FileBackend
10 */
11class TempFSFileFactory {
12    /** @var string|null */
13    private $tmpDirectory;
14
15    /**
16     * @param string|null $tmpDirectory A directory to put the temporary files in, e.g.,
17     *   $wgTmpDirectory. If null, we'll try to find one ourselves.
18     */
19    public function __construct( $tmpDirectory = null ) {
20        $this->tmpDirectory = $tmpDirectory;
21    }
22
23    /**
24     * Make a new temporary file on the file system.
25     * Temporary files may be purged when the file object falls out of scope.
26     *
27     * @param string $prefix
28     * @param string $extension Optional file extension
29     * @return TempFSFile|null
30     */
31    public function newTempFSFile( $prefix, $extension = '' ) {
32        $ext = ( $extension != '' ) ? ".{$extension}" : '';
33        $tmpDirectory = $this->tmpDirectory;
34        if ( !is_string( $tmpDirectory ) ) {
35            $tmpDirectory = TempFSFile::getUsableTempDirectory();
36        }
37
38        $attempts = 5;
39        while ( $attempts-- ) {
40            $hex = sprintf( '%06x%06x', mt_rand( 0, 0xffffff ), mt_rand( 0, 0xffffff ) );
41            $path = "$tmpDirectory/$prefix$hex$ext";
42            AtEase::suppressWarnings();
43            $newFileHandle = fopen( $path, 'x' );
44            AtEase::restoreWarnings();
45            if ( $newFileHandle ) {
46                fclose( $newFileHandle );
47                $tmpFile = new TempFSFile( $path );
48                $tmpFile->autocollect();
49                // Safely instantiated, end loop.
50                return $tmpFile;
51            }
52        }
53
54        // Give up
55        return null; // @codeCoverageIgnore
56    }
57}