{$proxy},%n {$proxy}date{$proxy}: {$proxy}%ad{$proxy},%n {$proxy}message{$proxy}: {$proxy}%s{$proxy}%n},'", [ ["pipe", "r"], ["pipe", "w"], ["pipe", "w"], ], $pipes ); $output = stream_get_contents($pipes[1]); $string = str_replace(['"', $proxy], ['\\"', '"'], $output); $string = "[" . rtrim($string, ",") . "]"; $json = json_decode($string, true); return $json; } function parse_status(): array { $process = proc_open( "git status --porcelain=v2 --branch", [ ["pipe", "r"], ["pipe", "w"], ["pipe", "w"], ], $pipes ); $output = stream_get_contents($pipes[1]); $status = ["files" => []]; foreach (explode("\n", $output) as $line) { if (empty($line)) { continue; } $start = substr($line, 0, 1); if ($start == "#") { if (str_contains($line, "branch.oid")) { $status["oid"] = substr($line, strlen("# branch.oid ")); } else if (str_contains($line, "branch.head")) { $status["head"] = substr($line, strlen("# branch.head ")); } else if (str_contains($line, "branch.upstream")) { $status["upstream"] = substr($line, strlen("# branch.upstream ")); } else if (str_contains($line, "branch.ab")) { $status["ab"] = substr($line, strlen("# branch.ab ")); } } else { $parts = explode(" ", $line); $file = [ "filename" => $parts[count($parts) - 1], "staged" => false, "unstaged" => false, "untracked" => false, "new_file" => false, "modified" => false, ]; if ($start == "1") { $track_status = $parts[1]; if (substr($track_status, 0, 1) == "A") { $file["staged"] = true; $file["new_file"] = true; } else if (substr($track_status, 0, 1) == "M") { $file["staged"] = true; $file["modified"] = true; } if (substr($track_status, 1, 1) == "M") { $file["unstaged"] = true; $file["modified"] = true; } $file = array_merge($file, [ "previous_mode" => $parts[3], "new_mode" => $parts[4], "previous_id" => $parts[6], "new_id" => $parts[7], ]); } else if ($start == "?") { $file["untracked"] = true; } $status["files"][] = $file; } } return $status; } foreach ($projects as $project) { chdir($project); echo $project . "
"; $status = parse_status(); foreach ($status["files"] as $file) { var_dump($file); } foreach (parse_log() as $commit) { // echo "$commit[message]
"; } }