-
-
Notifications
You must be signed in to change notification settings - Fork 3.6k
/
deleted_file_check.php
145 lines (110 loc) · 3.19 KB
/
deleted_file_check.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
<?php
/**
* This file is used to build the list of deleted files between two reference points.
*
* This script requires one parameter:
*
* --from - The git commit reference to use as the starting point for the comparison.
*
* This script has one additional optional parameter:
*
* --to - The git commit reference to use as the ending point for the comparison.
*
* The reference parameters may be any valid identifier (i.e. a branch, tag, or commit SHA)
*
* @package Joomla.Build
*
* @copyright (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
// Detect the native operating system type.
$os = strtoupper(substr(PHP_OS, 0, 3));
if ($os === 'WIN')
{
echo 'Sorry, this script is not supported on Windows.' . PHP_EOL;
exit(1);
}
/*
* Constants
*/
const PHP_TAB = "\t";
/*
* Globals
*/
global $currentDir;
$currentDir = getcwd();
global $changedFiles;
$changedFiles = array();
global $deletedFiles;
$deletedFiles = array();
global $gitBinary;
ob_start();
passthru('which git', $gitBinary);
$gitBinary = trim(ob_get_clean());
/*
* Functions
*/
function run_git_command($command)
{
global $currentDir;
chdir(dirname(__DIR__));
ob_start();
passthru($command);
$return = trim(ob_get_clean());
chdir($currentDir);
return $return;
}
function usage($command)
{
echo PHP_EOL;
echo 'Usage: php ' . $command . ' [options]' . PHP_EOL;
echo PHP_TAB . '--from <ref>:' . PHP_TAB . 'Starting commit reference (branch/tag)' . PHP_EOL;
echo PHP_TAB . '--to <ref>:' . PHP_TAB . 'Ending commit reference (branch/tag) [optional]' . PHP_EOL;
echo PHP_EOL;
}
/*
* This is where the magic happens
*/
$options = getopt('', array('from:', 'to::'));
// We need the from reference, otherwise we're doomed to fail
if (empty($options['from']))
{
echo PHP_EOL;
echo 'Missing starting commit reference' . PHP_EOL;
usage($argv[0]);
exit(1);
}
// Missing the to reference? No problem, grab the current HEAD
if (empty($options['to']))
{
$options['to'] = run_git_command("$gitBinary rev-parse HEAD");
}
// Parse the git diff to know what files have been added, removed, or renamed
$fileDiff = explode("\n", run_git_command("$gitBinary diff --name-status {$options['from']} {$options['to']}"));
$deletedFiles = array();
foreach ($fileDiff as $file)
{
$fileName = substr($file, 2);
// Act on the file based on the action
switch (substr($file, 0, 1))
{
// This is a new case with git 2.9 to handle renamed files
case 'R':
// Explode the file on the tab character; key 0 is the action (rename), key 1 is the old filename, and key 2 is the new filename
$renamedFileData = explode("\t", $file);
// And flag the old file as deleted
$deletedFiles[] = "'/{$renamedFileData[1]}',";
break;
case 'D':
$deletedFiles[] = "'/$fileName',";
break;
default:
// Ignore file additions and modifications
break;
}
}
asort($deletedFiles);
// Write the deleted files list to a file for later reference
file_put_contents(__DIR__ . '/deleted_files.txt', implode("\n", $deletedFiles));
echo PHP_EOL;
echo 'There are ' . count($deletedFiles) . ' deleted files in comparison to "' . $options['from'] . '"' . PHP_EOL;