xaizek / rocketgit (License: AGPLv3+) (since 2018-12-09)
Light and fast Git hosting solution suitable to serve both as a hub or as a personal code storage with its tickets, pull requests, API and much more.
<root> / misc / compare.php (5f49399fab8f3f75d3ab8b004bf1ae19748d07e8) (4,423B) (mode 100644) [raw]
<?php
// Build the compare.html from compare.csv
// compare.csv is easy edited with LibreOffice
// compare.html gets included in the website

/*
 * Returns an array with fields
 * Parses something like: "a,a",,"b","c" => array('a,a', '', 'b', 'c')
 */
/*
function parse_csv_line($line)
{
	$ret = array();
	$pos = 0;
	$f = '';
	$first = TRUE;
	$len = strlen($line);
	$last_was_comma = FALSE;
	while (1) {
		//echo "REST: " . substr($line, $pos) . "\n";
		if (strncmp($line[$pos], '"', 1) == 0) {
			$q = strpos($line, '"', $pos + 1);
			//echo "Q q=" . $q . "\n";
			if ($q === FALSE) {
				echo 'Line: ' . $line . ' is malformed (unterminated quoted string)!' . "\n";
				return FALSE;
			}
			$ret[] = substr($line, $pos + 1, $q - $pos - 1);
			$pos = $q + 1;

			if ($pos == $len)
				break;

			if (strncmp($line[$pos], ',', 1) != 0) {
				echo 'Line: ' . $line . ' is malformed (no comma after quote)!' . "\n";
				return FALSE;
			}

			$pos++; // skip comma
		} else {
			// This field does not start with '"' => starts with a comma! Search till next ','
			$q = strpos($line, ',', $pos);
			//echo "X q=" . $q . "\n";
			if ($q === FALSE) {
				// Final element after last ','
				$ret[] = substr($line, $pos);
				break;
			}

			$last_was_comma = TRUE;
			$ret[] = substr($line, $pos, $q - $pos);
			$pos = $q + 1;
			if ($pos == $len)
				break;
		}
	}

	if ($last_was_comma)
		$ret[] = '';

	return $ret;
}

$s = 'a';
$r = parse_csv_line($s);
echo $s . ':'; print_r($r);

$s = ',b';
$r = parse_csv_line($s);
echo $s . ':'; print_r($r);

$s = '"a","b","c';
$r = parse_csv_line($s);
echo $s . ':'; print_r($r);

$s = '"a","b","c"';
$r = parse_csv_line($s);
echo $s . ':'; print_r($r);

$s = ',"a,a","b 3 6,6","c d e c",,';
$r = parse_csv_line($s);
echo $s . ':'; print_r($r);

$s = '"a",,';
$r = parse_csv_line($s);
echo $s . ':'; print_r($r);
exit(1);
*/

$INC = dirname(__FILE__) . '/../inc';
require_once($INC . '/util.inc.php');

$h = fopen($_SERVER['argv'][1], 'r');
if (!$h)
	die('Cannot open input file!' . "\n");

$out = fopen($_SERVER['argv'][2], 'w');
if (!$out)
	die('Cannot open out file!' . "\n");

fwrite($out, '<div class="main_title">Git hosting solutions comparison</div>' . "\n");
fwrite($out, '<div>'
	. '<i>' . "\n"
	. '- This document was generated on ' . gmdate('Y-m-d') . '.<br />' . "\n"
	. '- To contribute to this document, just e-mail us to'
	. ' in@rocketgit.com or clone the RocketGit'
	. ' <a href="https://rocketgit.com/user/catalinux/rocketgit">repository</a>'
	. ', make changes and push them.<br />' . "\n"
	. '- Move the mouse over the features field for more information.'
	. '</i>' . "\n"
	. '</div>' . "\n");
fwrite($out, '<table class="compare">' . "\n");

$lineno = 1;
while (($line = fgetcsv($h)) !== FALSE) {
	if ($lineno == 1) {
		// First line
		$td = 'th';
		$rows = count($line);
	} else {
		$td = 'td';
	}

	// Insert an empty line
	if (empty($line[0])) {
		fwrite($out, '<tr><' . $td . ' colspan="'
			. $rows . '">&nbsp;</' . $td . '></tr>' . "\n");
		continue;
	}

	if (empty($line[1])) {
		// We have a chapter
		$title = str_replace('[', '', $line[0]);
		$title = str_replace(']', '', $title);
		fwrite($out,
			'<tr><' . $td . ' colspan="' . $rows . '">'
			. '<b>' . rg_xss_safe($title) . '</b>'
			. '</' . $td . '></tr>' . "\n");
		$lineno++;
		continue;
	}

	// Notes
	if (strcmp($line[0], '*') == 0) {
		fwrite($out,
			'<tr><' . $td . ' colspan="' . $rows . '">'
			. rg_xss_safe($line[1])
			. '</' . $td . '></tr>' . "\n");
		continue;
	}

	fwrite($out, '<tr>');
	foreach ($line as $i => $f) {
		if ($i == 0) {
			$color = '';

			// Do we have a {...} - used for baloons
			$p = strpos($f, '{');
			if ($p) {
				$q = strpos($f, '}');
				$baloon = trim(substr($f, $p + 1, $q - $p - 1));
				$newf = trim(substr($f, 0, $p));
				$f = $newf . ' <span title="' . rg_xss_safe($baloon)
					. '">?</span>';
			}
		} else if (strstr($f, '/#')) {
			$t = explode('/#', $f);
			$color = ' bgcolor="#' . $t[1] . '"';
			$f = rg_xss_safe($t[0]);
		} else if (stristr($f, 'no')) {
			$color = ' bgcolor="#f00"';
			$f = rg_xss_safe($f);
		} else if (stristr($f, 'yes')) {
			$color = ' bgcolor="#0f0"';
			$f = rg_xss_safe($f);
		} else {
			$color = '';
			$f = rg_xss_safe($f);
		}

		fwrite($out, '<' . $td . $color . '>' . $f . '</' . $td . '>');
	}
	fwrite($out, '</tr>' . "\n");
	$lineno++;
}
fwrite($out, '</table>' . "\n");
fclose($out);
fclose($h);

?>
Hints

Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://code.reversed.top/user/xaizek/rocketgit

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@code.reversed.top/user/xaizek/rocketgit

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a pull request:
... clone the repository ...
... make some changes and some commits ...
git push origin master