import settings from django import forms, http, template from django.contrib.auth.decorators import login_required from django.shortcuts import get_object_or_404, render_to_response from django.http import HttpResponse import os, commands from models import * try: GITCOMMAND = settings.GITCOMMAND except AttributeError: GITCOMMAND='git' # Create your views here. def repo_info(request, repo,branch=None): therepo = get_object_or_404(Repository, slug=repo) (GITPREFIX, heads, tags) = therepo.scan() branches = commands.getoutput(GITPREFIX + ' branch') filelist = commands.getoutput(GITPREFIX + ' ls-files') shortlog = therepo.shortlog() return render_to_response('git_browse/repository_info.html', \ dict(object=therepo, \ filelist=filelist, \ tags=tags, \ heads=heads, \ shortlog=shortlog,)) def view_tree(request, repo, hash=None,branch=None): therepo = get_object_or_404(Repository, slug=repo) (GITPREFIX, heads, tags) = therepo.scan() if(hash == None): head_ref = commands.getoutput('cd ' + therepo.path + '; cat HEAD') head_ref = head_ref.split()[1] hash = commands.getoutput('cd ' + therepo.path + '; cat ' + head_ref) tree_ls = commands.getoutput(GITPREFIX + ' ls-tree ' + hash) tree_objs = list() blob_objs = list() for line in tree_ls.splitlines(): l = line.split() if len(l) < 4: continue if l[1] == 'tree': t = Tree(id=l[2]) t.path = ' '.join(l[3:]) #if self.path and self.path != '/': # t.path = self.path + '/' + t.path t.name = t.path t.type = 'tree' tree_objs.append(t) if l[1] == 'blob': i = Blob(id=l[2]) i.path = ' '.join(l[3:]) #if self.path and self.path != '/': # i.path = self.path + '/' + i.path i.name=i.path i.type = 'blob' blob_objs.append(i) return render_to_response('git_browse/tree.html', dict(object=therepo, blob_objs=blob_objs, tree_objs=tree_objs, hash=hash, all_objs=tree_objs+blob_objs,)) def view_log(request, repo, hash=None): therepo = get_object_or_404(Repository, slug=repo) (GITPREFIX, heads, tags) = therepo.scan() logtxt = commands.getoutput(GITPREFIX + ' log | cat') log_items = logtxt.split('\ncommit ') if (log_items[0] == ''): log_items.pop(0) if (log_items[0].startswith('commit ')): log_items[0] = log_items[0][7:] log_objs = list() for li in log_items: logobj = dict() lines = li.splitlines() if len(lines) < 3: continue logobj['hash'] = lines[0] logobj['author'] = lines[1][8:] logobj['date'] = lines[2][8:] logobj['comment'] = '' for l in lines[4:]: if l.startswith(' '): logobj['comment'] += l[4:] + '\n' log_objs.append(logobj) return render_to_response('git_browse/full_log.html', dict(object=therepo, log_objs=log_objs,)) def view_blob(request, repo, hash): therepo = get_object_or_404(Repository, slug=repo) (GITPREFIX, heads, tags) = therepo.scan() b = Blob(id=hash,repo=therepo) b.update() try: from pygments import highlight from pygments.lexers import guess_lexer from pygments.formatters import HtmlFormatter b.pretty_contents = highlight(b.contents, guess_lexer(b.contents), HtmlFormatter()) except: b.pretty_contents = None return render_to_response('git_browse/blob.html', dict(object=therepo, heads=heads, tags=tags, hash=b.id, size=b.size, contents=b.contents, pretty_contents=b.pretty_contents)) def view_commit(request, repo, hash): therepo = get_object_or_404(Repository, slug=repo) (GITPREFIX, heads, tags) = therepo.scan() c = Commit(id=hash,repo=therepo) c.update() try: from pygments import highlight from pygments.lexers import DiffLexer from pygments.formatters import HtmlFormatter c.pretty_diff = highlight(c.rawdiff, DiffLexer(), HtmlFormatter()) except: pass return render_to_response('git_browse/commit.html', dict(object=therepo, heads=heads, tags=tags, commit=c)) def view_obj(request, repo, hash, branch=None): therepo = get_object_or_404(Repository, slug=repo) (GITPREFIX, heads, tags) = therepo.scan() obj_type = commands.getoutput(GITPREFIX + ' cat-file -t ' + hash) obj_contents = commands.getoutput(GITPREFIX + ' cat-file -p ' + hash) obj_size = commands.getoutput(GITPREFIX + ' cat-file -s ' + hash) return render_to_response('git_browse/obj.html', dict(object=therepo, hash=hash, type=obj_type, size=float(obj_size), contents=obj_contents)) def zip(request, repo, hash): therepo = get_object_or_404(Repository, slug=repo) (GITPREFIX, heads, tags) = therepo.scan() t = Tree(id=hash,repo=therepo) t.update() hr = HttpResponse(mimetype="application/zip") hr['Content-Disposition'] = 'filename=%s.zip' % t.id archive = commands.getoutput(GITPREFIX + \ ' archive --format=zip ' + hash + ' | cat') hr.write(archive) return hr