diff options
-rw-r--r-- | patchtracker/Patch.py | 11 | ||||
-rw-r--r-- | patchtracker/urls.py | 7 | ||||
-rw-r--r-- | patchtracker/views.py | 33 | ||||
-rw-r--r-- | templates/patch_view.html | 24 |
4 files changed, 71 insertions, 4 deletions
diff --git a/patchtracker/Patch.py b/patchtracker/Patch.py index 6533910..09f4911 100644 --- a/patchtracker/Patch.py +++ b/patchtracker/Patch.py @@ -2,6 +2,9 @@ import sys import os import errno from glob import glob +import pygments +import pygments.lexers +import pygments.formatters import tarfile class Diffstat: @@ -39,6 +42,14 @@ class Patch: def diffstat(self): return Diffstat(self) + def highlight(self): + for enc in ['utf-8', 'latin-1']: + try: + return pygments.highlight(str(self).decode(enc), pygments.lexers.DiffLexer(), + pygments.formatters.HtmlFormatter(style='colorful', noclasses=True, encoding=enc, nobackground=True)) + except UnicodeDecodeError: + pass + class GenericPatchSeries (list): def blank(self): self.names = [] diff --git a/patchtracker/urls.py b/patchtracker/urls.py index 422a2a1..23992f4 100644 --- a/patchtracker/urls.py +++ b/patchtracker/urls.py @@ -3,6 +3,9 @@ import views urlpatterns = patterns('', url(r'^package/(?P<package>\w+)/(?P<version>[^/]+)$', - views.package_vers, - name='user_profile') + views.package_vers), + url(r'^patch/series/dl/(?P<package>\w+)/(?P<version>[^/]+)/(?P<patch>[^/]*)$', + views.download_series_patch), + url(r'^patch/series/view/(?P<package>\w+)/(?P<version>[^/]+)/(?P<patch>[^/]*)$', + views.view_series_patch), ) diff --git a/patchtracker/views.py b/patchtracker/views.py index e24ba1b..eac4e89 100644 --- a/patchtracker/views.py +++ b/patchtracker/views.py @@ -1,11 +1,13 @@ import os -import django.template +import django.http import django.shortcuts +import django.template -import models +import DebTarHandler import DiffGzHandler import Conf +import models def package_vers(request, package, version): pkg = models.SourcePackage.objects.get( name=package, version=version ) @@ -18,3 +20,30 @@ def package_vers(request, package, version): extra = { 'pkg':pkg, 'ctx':ctx, 'conf':Conf, 'diffhandler':diffhandler } return django.shortcuts.render_to_response(tmpl, extra, context_instance=ctx) +def download_series_patch(request, package, version, patch): + pkg = models.SourcePackage.objects.get( name=package, version=version ) + diffhandler = None + if pkg.diffgz_name: + dgz = os.sep.join([Conf.archive_root, pkg.loc, pkg.diffgz_name]) + diffhandler = DiffGzHandler.DiffGzHandler(dgz) + elif pkg.debtar_name: + dtar = os.sep.join([Conf.archive_root, pkg.loc, pkg.debtar_name]) + diffhandler = DebTarHandler(dtar) + patchContents = diffhandler.series().fetch(patch) + return django.http.HttpResponse(patchContents, mimetype="text/plain") + +def view_series_patch(request, package, version, patch): + pkg = models.SourcePackage.objects.get( name=package, version=version ) + ctx = django.template.RequestContext(request) + tmpl = 'patch_view.html' + diffhandler = None + if pkg.diffgz_name: + dgz = os.sep.join([Conf.archive_root, pkg.loc, pkg.diffgz_name]) + diffhandler = DiffGzHandler.DiffGzHandler(dgz) + elif pkg.debtar_name: + dtar = os.sep.join([Conf.archive_root, pkg.loc, pkg.debtar_name]) + diffhandler = DebTarHandler(dtar) + patchContents = diffhandler.series().fetch(patch) + extra = { 'pkg':pkg, 'patch':patch, 'patchContents':patchContents, + 'patchType':'series', 'conf':Conf } + return django.shortcuts.render_to_response(tmpl, extra, context_instance=ctx) diff --git a/templates/patch_view.html b/templates/patch_view.html new file mode 100644 index 0000000..b4b50e0 --- /dev/null +++ b/templates/patch_view.html @@ -0,0 +1,24 @@ +{% extends "base.html" %} +{% block title %} +Patch information for {{ pkg.name }} ({{ pkg.version }}) {{ patch }} +{% endblock %} +{% block content %} + <h1>{{ pkg.name }} ({{ pkg.version }}) {{ patch }}</h1> + <h2>Summary</h2> + <div> + <code class="diffstat"> + <pre> +{{ patchContents.diffstat|escape }} + </pre> + </code> + </div> + <div> + <a href="{{ conf.root_url }}/patch/{{ patchType }}/dl/{{ pkg.name }}/{{ pkg.version }}/{{ patch }}"> + download this patch + </a> + </div> + <h2>Patch contents</h2> + <div class="patch"> +{{ patchContents.highlight|safe }} + </div> +{% endblock %} |