#!/usr/bin/php allowText2Html = false; // Don't produce HTML when processing the download block } function ExportAsGit(string $dest) { // Create destination directory if (is_dir($dest)) { throw new Exception("Destination path '{$dest}' already exists"); } mkdir($dest); shell_exec('cd '. escapeshellarg($dest).' && git init'); // Parse download information blocks $this->filterLongDescArea(); // Prepare to start modifying the generated README.md file $this->longdesc = preg_replace('~\\[url=([^\\]]+?)\\](.+?)\\[/url\\]~m', '[\\2](\\1)', $this->longdesc); $lines = explode("\n", $this->longdesc); $lines = array_merge(["# ".$this->projname, ""], $lines); // Modify some lines to standard markdown format: foreach($lines as $i => $line) { // Convert ==HEADERS== to ## Headers if (strlen($line) > 0 && $line[0] == '=') { $tmp = rtrim($line, '='); $indent = substr_count($tmp, '='); // Normalise the capitalisation for header text $header_text = substr($tmp, $indent); if ($header_text != "TODO" && $header_text != "FIXME" && $header_text != "WARNING") { $header_text = ucwords(strtolower($header_text)); } // raise markdown-equivalent header level by 1 to compensate for new header $lines[$i] = $line = str_repeat('#', $indent + 1).' '.$header_text; } // Convert multiline single-backtick to multi-backtick // Heuristic: if there is only a single backtick in the line if (substr_count($line, '`') == 1) { $lines[$i] = $line = str_replace('`', "\n```\n", $line); } // If the previous line started with a hyphen, and this line didn't, we need an // extra line separator if ($i > 0 && strlen($line) > 0 && $line[0] != '-' && strlen($lines[$i-1]) > 0 && $lines[$i-1][0] == '-' ) { $lines[$i] = $line = "\n".$line; } } // Copy all images to a doc/ subdirectory mkdir($dest.'/doc'); foreach($this->images as $img) { copy($this->dir.$img, $dest.'/doc/'.$img); } // Copy all downloads to a dist-archive/ subdirectory if (count($this->downloads) > 0) { mkdir($dest.'/dist-archive'); foreach($this->downloads as $file) { copy($this->dir.$file, $dest.'/dist-archive/'.$file); } if (! $this->downloads_section_was_replaced) { // Add our own downloads section $lines[] = $this->renderDownloadsBlock($this->downloads, true); } } // Save final README file_put_contents($dest.'/README.md', implode("\n", $lines)); // Extra properties file $ctime = $this->lastupdate - ($this->lifespan * 3600); // Lifespans are measured in hours $nice_shortdesc = $this->shortdesc; if (strlen($nice_shortdesc) > 0) { $nice_shortdesc = rtrim($this->shortdesc, '.').'.'; $nice_shortdesc[0] = strtoupper($nice_shortdesc[0]); } file_put_contents($dest.'/.legacy-codesite.toml', "# Converted with codesite2git project_name=".json_encode($this->projname)." short_description=".json_encode($nice_shortdesc)." written_in_lang=".json_encode($this->subtag)." topics=".json_encode($this->tags)." ctime=".$ctime." mtime=".$this->lastupdate." "); // Git commit everything // Once for the meta with ctime; once for all files with the mtime $command = ( 'cd '. escapeshellarg($dest).' && '. 'git add .legacy-codesite.toml ; '. 'GIT_COMMITTER_DATE="'.date(DATE_ISO8601, $ctime).'" git commit -m "initial meta commit" --date '.escapeshellarg(date(DATE_ISO8601, $ctime)).' ; '. 'git add -A ; '. 'GIT_COMMITTER_DATE="'.date(DATE_ISO8601, $this->lastupdate).'" git commit -m "commit all archived files" --date '.escapeshellarg(date(DATE_ISO8601, $this->lastupdate)) ); echo $command."\n"; shell_exec($command); } public function renderDownloadsBlock($render_downloads, $include_header=false) { // override if (! count($render_downloads)) { return; } $ret = "\n"; if ($include_header) { $ret .= "## Download\n\n"; } foreach($render_downloads as $filename) { $ret .= "- [⬇️ {$filename}](raw/branch/master/dist-archive/{$filename}) "; $ret .= "*(".fbytes(filesize($this->dir.$filename)).")*\n"; } return $ret; } } function codesite2git(string $projdirname, string $projname, string $dest) { // Parse existing project $c = new CProjectGitExporter($projdirname, $projname); // var_dump($c); $c->ExportAsGit($dest); } function usage() { die("Usage: codesite2git [FLAGS...] Options: --single CODESITE_ROOT_PATH PROJECT_DIR_NAME PROJECT_REAL_NAME DEST_DIR --all CODESITE_ROOT_PATH TEMP_DIR GITEA_URL GITEA_ORG GITEA_AUTH_TOKEN "); die(1); } function main(array $argv) { if (count($argv) < 2) { usage(); } if ($argv[1] == '--single') { if (count($argv) != 6) { usage(); } $config = setup_vars($argv[2]); codesite2git($argv[3], $argv[4], $argv[5]); } else if ($argv[1] == "--all") { if (count($argv) != 7) { usage(); } $config = setup_vars($argv[2]); $repos = glob(BASEDIR.'data/*'); $temp_dir = $argv[3]; foreach($repos as $path) { $projdir = basename($path); $reponame = explode('-', $projdir, 2)[1]; // Convert to git codesite2git($projdir, $reponame, $temp_dir.'/'.$projdir.'-archive.git'); // Create new Gitea repo // TODO // Add git remote and push // TODO // Set Gitea topics + description // TODO } } else { usage(); } } main($_SERVER['argv']);