~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to scripts/diffservice

  • Committer: Matt Giuca
  • Date: 2010-02-25 08:36:59 UTC
  • Revision ID: matt.giuca@gmail.com-20100225083659-2s8vdrfhx3bhvcmp
DateTimeValidator: Removed some debugging code. Oops.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!/usr/bin/python
2
 
 
3
 
# IVLE - Informatics Virtual Learning Environment
4
 
# Copyright (C) 2007-2008 The University of Melbourne
5
 
#
6
 
# This program is free software; you can redistribute it and/or modify
7
 
# it under the terms of the GNU General Public License as published by
8
 
# the Free Software Foundation; either version 2 of the License, or
9
 
# (at your option) any later version.
10
 
#
11
 
# This program is distributed in the hope that it will be useful,
12
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 
# GNU General Public License for more details.
15
 
#
16
 
# You should have received a copy of the GNU General Public License
17
 
# along with this program; if not, write to the Free Software
18
 
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19
 
 
20
 
# Script: diffservice
21
 
# Author: David Coles
22
 
# Date:   26/2/2008
23
 
 
24
 
# A CGI script for generating a diff report page in HTML. It is intended to be 
25
 
# run from the trampoline by the Diff application.
26
 
 
27
 
from common import cgirequest
28
 
import cgi
29
 
import os.path
30
 
import pysvn
31
 
import re
32
 
 
33
 
def htmlfy_diff(difftext):
34
 
    """Adds HTML markup to a udiff string"""
35
 
    output = cgi.escape(difftext)
36
 
    subs = {
37
 
     r'^([\+\-]{3})\s(\S+)\s\((.+)\)$':
38
 
         r'<span class="diff-files">\1 \2 <em>(\3)</em></span>',
39
 
     r'^\@\@ (.*) \@\@$':
40
 
         r'<span class="diff-range">@@ \1 @@</span>',
41
 
     r'^\+(.*)$':
42
 
         r'<span class="diff-add">+\1</span>',
43
 
     r'^\-(.*)$':
44
 
         r'<span class="diff-sub">-\1</span>',
45
 
     r'^\\(.*)$':
46
 
         r'<span class="diff-special">\\\1</span>'
47
 
    }
48
 
 
49
 
    for match in subs:
50
 
        output = re.compile(match, re.MULTILINE).sub(subs[match], output)
51
 
 
52
 
    return output
53
 
 
54
 
def get_revision(r_str):
55
 
    """ Returns a Revison object for pysvn from a r query string """
56
 
    if r_str == "HEAD":
57
 
        return pysvn.Revision( pysvn.opt_revision_kind.head )
58
 
    elif r_str == "WORKING":
59
 
        return pysvn.Revision( pysvn.opt_revision_kind.working )
60
 
    elif r_str == "BASE":
61
 
        return pysvn.Revision( pysvn.opt_revision_kind.base )
62
 
    else:
63
 
        try:
64
 
            r = int(r_str)
65
 
            return pysvn.Revision( pysvn.opt_revision_kind.number, r)
66
 
        except:
67
 
            return None
68
 
        
69
 
# Use a CGIRequest object to make the CGI environment look like the normal
70
 
# IVLE handler environment.
71
 
 
72
 
req = cgirequest.CGIRequest()
73
 
req.install_error_handler()
74
 
req.content_type = "text/html"
75
 
 
76
 
# Beginning of the page
77
 
req.write('<div id="ivle_padding">\n')
78
 
req.write('<h1>Diff</h1>\n')
79
 
 
80
 
# Default revisions
81
 
revs = [pysvn.Revision(x) for x in [pysvn.opt_revision_kind.base,
82
 
                                    pysvn.opt_revision_kind.working]]
83
 
# Override revisions from query string
84
 
fields = req.get_fieldstorage()
85
 
field_r = fields.getlist("r")
86
 
for ri in range(len(field_r)):
87
 
    r = get_revision(field_r[ri])
88
 
    if r is not None:
89
 
        revs[ri] = r
90
 
 
91
 
# Attempt to get the diff for these revisons
92
 
try:
93
 
    svnclient = pysvn.Client()
94
 
    diff = svnclient.diff
95
 
    diff_text = diff( '/tmp/svndiff',
96
 
        os.path.join('/home', req.path),
97
 
        revision1=revs[0],
98
 
        revision2=revs[1]
99
 
    )
100
 
 
101
 
    # Split up the udiff into individual files
102
 
    diff_matcher = re.compile(
103
 
        r'^Index: (.*)\n\=+\n((?:[^I].*\n)*)',re.MULTILINE
104
 
    )
105
 
    split_diff = diff_matcher.findall(diff_text)
106
 
 
107
 
    # Prints output
108
 
    for filediff in split_diff:
109
 
        filename = filediff[0]
110
 
        diffbody = htmlfy_diff(filediff[1])
111
 
        req.write('<p><b>File:</b> %s</p>\n'
112
 
            % cgi.escape(filename))
113
 
        req.write('<pre class="diff">%s</pre>\n' % diffbody)
114
 
 
115
 
except pysvn._pysvn_2_5.ClientError, e:
116
 
    req.write('<p><b>Error:</b></p>\n')
117
 
    req.write('<pre class="diff">%s</pre>\n' % cgi.escape(str(e)))
118
 
 
119
 
req.write('</div>\n')