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

1072 by matt.giuca
Renamed scripts to services.
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
import cgi
28
import os.path
29
import pysvn
30
import re
31
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
32
from ivle import cgirequest
33
import ivle.svn
34
1072 by matt.giuca
Renamed scripts to services.
35
def htmlfy_diff(difftext):
36
    """Adds HTML markup to a udiff string"""
37
    output = cgi.escape(difftext)
38
    subs = {
39
     r'^([\+\-]{3})\s(\S+)\s\((.+)\)$':
40
         r'<span class="diff-files">\1 \2 <em>(\3)</em></span>',
41
     r'^\@\@ (.*) \@\@$':
42
         r'<span class="diff-range">@@ \1 @@</span>',
43
     r'^\+(.*)$':
44
         r'<span class="diff-add">+\1</span>',
45
     r'^\-(.*)$':
46
         r'<span class="diff-sub">-\1</span>',
47
     r'^\\(.*)$':
48
         r'<span class="diff-special">\\\1</span>'
49
    }
50
51
    for match in subs:
52
        output = re.compile(match, re.MULTILINE).sub(subs[match], output)
53
54
    return output
55
56
# Use a CGIRequest object to make the CGI environment look like the normal
57
# IVLE handler environment.
58
59
req = cgirequest.CGIRequest()
60
req.install_error_handler()
61
req.content_type = "text/html"
62
63
# Beginning of the page
64
req.write('<div id="ivle_padding">\n')
65
req.write('<h1>Diff</h1>\n')
66
67
# Default revisions
68
revs = [pysvn.Revision(x) for x in [pysvn.opt_revision_kind.base,
69
                                    pysvn.opt_revision_kind.working]]
70
# Override revisions from query string
71
fields = req.get_fieldstorage()
72
field_r = fields.getlist("r")
73
for ri in range(len(field_r)):
1079 by William Grant
Merge setup-refactor branch. This completely breaks existing installations;
74
    r = ivle.svn.revision_from_string(field_r[ri])
1072 by matt.giuca
Renamed scripts to services.
75
    if r is not None:
76
        revs[ri] = r
77
78
# Attempt to get the diff for these revisons
79
try:
80
    svnclient = pysvn.Client()
81
    diff = svnclient.diff
82
    diff_text = diff( '/tmp/svndiff',
83
        os.path.join('/home', req.path),
84
        revision1=revs[0],
85
        revision2=revs[1]
86
    )
87
88
    # Split up the udiff into individual files
89
    diff_matcher = re.compile(
90
        r'^Index: (.*)\n\=+\n((?:[^I].*\n)*)',re.MULTILINE
91
    )
92
    split_diff = diff_matcher.findall(diff_text)
93
94
    # Prints output
95
    for filediff in split_diff:
96
        filename = filediff[0]
97
        diffbody = htmlfy_diff(filediff[1])
98
        req.write('<p><b>File:</b> %s</p>\n'
99
            % cgi.escape(filename))
100
        req.write('<pre class="diff">%s</pre>\n' % diffbody)
101
102
except pysvn._pysvn_2_5.ClientError, e:
103
    req.write('<p><b>Error:</b></p>\n')
104
    req.write('<pre class="diff">%s</pre>\n' % cgi.escape(str(e)))
105
106
req.write('</div>\n')