リポジトリブラウザを作ってみる 4.ユニファイド形式のdiff結果を配列にする

今回のメインはdiff。
全体的に大体出来た。
 

あれがBacklogかBacklogでないかと言われれば、むしろBacklogだったんじゃないかな?
いや!!科学的な見解から言ってもBacklogであった確率が高いね!!

 

ユニファイド形式のdiff結果を配列にする

<?php
public static function diff2array($difftxt)
{
	$lines = SVN_Util::multiline2array($difftxt);
	$result = array();
	$base = 0;
	$m_i = 0;
	$p_i = 0;
	$m_c = 0;
	$p_c = 0;
	foreach ($lines as $i=>$line) {
		if ($i<4) {
			continue;
		}
		switch (substr($line, 0, 1)) {
		case '@':
			list($m, $p) = explode(' ', trim($line, '@ '));
			list($m_i) = explode(',', trim($m, '-'));
			list($p_i) = explode(',', trim($p, '+'));
			$base = $i;
			if (1<$m_i) {
				$result[$base] = array(
					'mode' => 'skip',
					'before' => array(
						'num' => '..'
					),
					'after' => array(
						'num' => '..'
					)
				);
			}
			$m_c = 1;
			$p_c = 1;
			break;
		case '-':
			$result[$base+$m_c] = array(
				'mode' => 'delete',
				'before' => array(
					'num' => $m_i,
					'txt' => substr($line, 1)
				)
			);
			$m_i++;
			$m_c++;
			break;
		case '+':
			$result[$base+$p_c]['mode'] = isset($result[$base+$p_c]['before']) ? 'modify' : 'insert';
			$result[$base+$p_c]['after'] = array(
				'num' => $p_i,
				'txt' => substr($line, 1)
			);
			$p_i++;
			$p_c++;
			break;
		default:
			$m_c = $p_c = max($m_c, $p_c);
			$result[$base+$m_c] = array(
				'mode' => 'keep',
				'before' => array(
					'num' => $m_i,
					'txt' => substr($line, 1)
				),
				'after' => array(
					'num' => $p_i,
					'txt' => substr($line, 1)
				)
			);
			$m_i++;
			$p_i++;
			$m_c++;
			$p_c++;
			break;
		}
		$i++;
	}
	$result = array_values($result);
	return $result;
}

 

スクリーンショット

list


 

cat


 

diff


 

log