| $rep = new Pluf_HTTP_Response($scm->getBlob($request_file_info, $commit),␊ | 
| $info[0]);␊ | 
| $rep->headers['Content-Disposition'] = 'attachment; filename="'.$info[1].'"';␊ | 
| return $rep;␊ | 
| } else {␊ | 
| // We want to display the content of the file as text␊ | 
| $rep = new Pluf_HTTP_Response($scm->getBlob($request_file_info, $commit),␊ | 
| 'text/plain');␊ | 
| $extra = array('branches' => $branches,␊ | 
| 'commit' => $commit,␊ | 
| 'request_file' => $request_file,␊ | 
| 'request_file_info' => $request_file_info,␊ | 
| 'mime' => $info,␊ | 
| );␊ | 
| return $this->viewFile($request, $match, $extra);␊ | 
| }␊ | 
| return $rep;␊ | 
| }␊ | 
| $bc = self::makeBreadCrumb($request->project, $commit, $request_file_info->file);␊ | 
| $page_title = $bc.' - '.$title;␊ | 
|  | 
| }␊ | 
| ␊ | 
| /**␊ | 
| * Should only be called through self::tree␊ | 
| */␊ | 
| public function viewFile($request, $match, $extra)␊ | 
| {␊ | 
| $title = sprintf(__('%1$s %2$s Source Tree'), (string) $request->project,␊ | 
| $this->getScmType($request));␊ | 
| $scm = IDF_Scm::get($request);␊ | 
| $branches = $extra['branches'];␊ | 
| $commit = $extra['commit'];␊ | 
| $request_file = $extra['request_file'];␊ | 
| $request_file_info = $extra['request_file_info'];␊ | 
| $bc = self::makeBreadCrumb($request->project, $commit, $request_file_info->file);␊ | 
| $page_title = $bc.' - '.$title;␊ | 
| $cobject = $scm->getCommit($commit);␊ | 
| $tree_in = in_array($commit, $branches);␊ | 
| // try to find the previous level if it exists.␊ | 
| $prev = split('/', $request_file);␊ | 
| $l = array_pop($prev);␊ | 
| $previous = substr($request_file, 0, -strlen($l.' '));␊ | 
| $scmConf = $request->conf->getVal('scm', 'git');␊ | 
| $props = null;␊ | 
| if ($scmConf === 'svn') {␊ | 
| $props = $scm->getProperties($commit, $request_file);␊ | 
| }␊ | 
| $content = self::highLight($extra['mime'], $scm->getBlob($request_file_info, $commit));␊ | 
| return Pluf_Shortcuts_RenderToResponse('source/'.$scmConf.'/file.html',␊ | 
| array(␊ | 
| 'page_title' => $page_title,␊ | 
| 'title' => $title,␊ | 
| 'breadcrumb' => $bc,␊ | 
| 'file' => $content,␊ | 
| 'commit' => $commit,␊ | 
| 'cobject' => $cobject,␊ | 
| 'fullpath' => $request_file,␊ | 
| 'base' => $request_file_info->file,␊ | 
| 'prev' => $previous,␊ | 
| 'tree_in' => $tree_in,␊ | 
| 'branches' => $branches,␊ | 
| 'props' => $props,␊ | 
| ),␊ | 
| $request);␊ | 
| }␊ | 
| ␊ | 
| /**␊ | 
| * Get a given file at a given commit.␊ | 
| *␊ | 
| */␊ | 
| public $getFile_precond = array('IDF_Precondition::accessSource');␊ | 
| public function getFile($request, $match)␊ | 
| {␊ | 
| $scm = IDF_Scm::get($request);␊ | 
| $branches = $scm->getBranches();␊ | 
| $commit = $match[2];␊ | 
| $request_file = $match[3];␊ | 
| if ('commit' != $scm->testHash($commit, $request_file)) {␊ | 
| // Redirect to the first branch␊ | 
| $url = Pluf_HTTP_URL_urlForView('IDF_Views_Source::treeBase',␊ | 
| array($request->project->shortname,␊ | 
| $branches[0]));␊ | 
| return new Pluf_HTTP_Response_Redirect($url);␊ | 
| }␊ | 
| $request_file_info = $scm->getFileInfo($request_file, $commit);␊ | 
| if (!$request_file_info or $request_file_info->type == 'tree') {␊ | 
| // Redirect to the first branch␊ | 
| $url = Pluf_HTTP_URL_urlForView('IDF_Views_Source::treeBase',␊ | 
| array($request->project->shortname,␊ | 
| $branches[0]));␊ | 
| return new Pluf_HTTP_Response_Redirect($url);␊ | 
| }␊ | 
| $info = self::getMimeType($request_file_info->file);␊ | 
| $rep = new Pluf_HTTP_Response($scm->getBlob($request_file_info, $commit),␊ | 
| $info[0]);␊ | 
| $rep->headers['Content-Disposition'] = 'attachment; filename="'.$info[1].'"';␊ | 
| return $rep;␊ | 
| }␊ | 
| ␊ | 
| /**␊ | 
| * Get a zip archive of the current commit.␊ | 
| *␊ | 
| */␊ | 
|  | 
| return (in_array($fileinfo[2], explode(' ', $ext)));␊ | 
| }␊ | 
| ␊ | 
| public static function highLight($fileinfo, $content)␊ | 
| {␊ | 
| $table = array();␊ | 
| $i = 1;␊ | 
| foreach (preg_split("/\015\012|\015|\012/", $content) as $line) {␊ | 
| $table[] = '<tr class="c-line"><td class="code-lc" id="L'.$i.'"><a href="#L'.$i.'">'.$i.'</a></td>'␊ | 
| .'<td class="code mono">'.IDF_Diff::padLine(Pluf_esc($line)).'</td></tr>';␊ | 
| $i++;␊ | 
| }␊ | 
| return Pluf_Template::markSafe(implode("\n", $table));␊ | 
| }␊ | 
| ␊ | 
| /**␊ | 
| * Get the scm type for page title␊ | 
| *␊ |