diff --git a/src/pocketmine/PocketMine.php b/src/pocketmine/PocketMine.php index 090d5b7c9..410501cd5 100644 --- a/src/pocketmine/PocketMine.php +++ b/src/pocketmine/PocketMine.php @@ -467,18 +467,16 @@ namespace pocketmine { } $gitHash = str_repeat("00", 20); - if(file_exists(\pocketmine\PATH . ".git/HEAD")){ //Found Git information! - $ref = trim(file_get_contents(\pocketmine\PATH . ".git/HEAD")); - if(preg_match('/^[0-9a-f]{40}$/i', $ref)){ - $gitHash = strtolower($ref); - }elseif(substr($ref, 0, 5) === "ref: "){ - $refFile = \pocketmine\PATH . ".git/" . substr($ref, 5); - if(is_file($refFile)){ - $gitHash = strtolower(trim(file_get_contents($refFile))); +#ifndef COMPILE + if(\Phar::running(true) === ""){ + if(Utils::execute("git rev-parse HEAD", $out) === 0){ + $gitHash = trim($out); + if(Utils::execute("git diff --quiet") === 1 or Utils::execute("git diff --cached --quiet") === 1){ //Locally-modified + $gitHash .= "-dirty"; } } } - +#endif define('pocketmine\GIT_COMMIT', $gitHash); diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index d51cfd50e..43917f951 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -2159,6 +2159,11 @@ class Server{ $report = false; } + if(strrpos(\pocketmine\GIT_COMMIT, "-dirty") !== false){ + $this->logger->debug("Not sending crashdump due to locally modified"); + $report = false; //Don't send crashdumps for locally modified builds + } + if($report){ $url = ($this->getProperty("auto-report.use-https", true) ? "https" : "http") . "://" . $this->getProperty("auto-report.host", "crash.pmmp.io") . "/submit/api"; $reply = Utils::postURL($url, [ diff --git a/src/pocketmine/utils/Utils.php b/src/pocketmine/utils/Utils.php index aee6d5cb8..ce8762fb4 100644 --- a/src/pocketmine/utils/Utils.php +++ b/src/pocketmine/utils/Utils.php @@ -492,4 +492,36 @@ class Utils{ } return $hash; } + + + /** + * @param string $command Command to execute + * @param string|null &$stdout Reference parameter to write stdout to + * @param string|null &$stderr Reference parameter to write stderr to + * + * @return int process exit code + */ + public static function execute(string $command, string &$stdout = null, string &$stderr = null) : int{ + $process = proc_open($command, [ + ["pipe", "r"], + ["pipe", "w"], + ["pipe", "w"] + ], $pipes); + + if($process === false){ + $stderr = "Failed to open process"; + $stdout = ""; + + return -1; + } + + $stdout = stream_get_contents($pipes[1]); + $stderr = stream_get_contents($pipes[2]); + + foreach($pipes as $p){ + fclose($p); + } + + return proc_close($process); + } }