25
25
# run from the trampoline by the Diff application.
27
27
from common import cgirequest
28
from cgi import parse_qs
34
34
def htmlfy_diff(difftext):
35
35
"""Adds HTML markup to a udiff string"""
37
match_file = re.compile(r'^([\+\-]{3})\s(\S+)\s\((.+)\)$',re.MULTILINE)
38
match_range = re.compile(r'^\@\@ (.*) \@\@$',re.MULTILINE)
39
match_add = re.compile(r'^\+(.*)$',re.MULTILINE)
40
match_sub = re.compile(r'^\-(.*)$',re.MULTILINE)
41
match_special = re.compile(r'^\\(.*)$',re.MULTILINE)
42
output = match_file.sub(
43
r'<span class="diff_files">\1 \2 <em>(\3)</em></span>', output)
44
output = match_range.sub(
45
r'<span class="diff_range">@@ \1 @@</span>', output)
46
output = match_add.sub(
47
r'<span class="diff_add">+\1</span>', output)
48
output = match_sub.sub(
49
r'<span class="diff_sub">-\1</span>', output)
50
output = match_special.sub(
51
r'<span class="diff_special">\\\1</span>', output)
36
output = cgi.escape(difftext)
38
r'^([\+\-]{3})\s(\S+)\s\((.+)\)$':
39
r'<span class="diff-files">\1 \2 <em>(\3)</em></span>',
41
r'<span class="diff-range">@@ \1 @@</span>',
43
r'<span class="diff-add">+\1</span>',
45
r'<span class="diff-sub">-\1</span>',
47
r'<span class="diff-special">\\\1</span>'
51
output = re.compile(match, re.MULTILINE).sub(subs[match], output)
54
def get_revision(r_str):
55
""" Returns a Revison object for pysvn from a r query string """
57
return pysvn.Revision( pysvn.opt_revision_kind.head )
58
elif r_str == "WORKING":
59
return pysvn.Revision( pysvn.opt_revision_kind.working )
61
return pysvn.Revision( pysvn.opt_revision_kind.base )
65
return pysvn.Revision( pysvn.opt_revision_kind.number, r)
69
55
# Use a CGIRequest object to make the CGI environment look like the normal
70
56
# IVLE handler environment.
72
58
req = cgirequest.CGIRequest()
75
print("Content-Type: text/html\n")
59
req.install_error_handler()
60
req.content_type = "text/html"
78
62
# Beginning of the page
79
print('<div id="ivle_padding">')
80
print('<h1>Diff</h1>')
63
req.write('<div id="ivle_padding">\n')
64
req.write('<h1>Diff</h1>\n')
82
# Work out the revisions from query
83
url = urlparse.urlparse(req.path)
86
query = parse_qs(querystr)
87
66
# Default revisions
88
rev1=pysvn.Revision( pysvn.opt_revision_kind.base )
89
rev2=pysvn.Revision( pysvn.opt_revision_kind.working )
91
if len(query['r']) == 2:
92
r2 = get_revision(query['r'][1])
95
r1 = get_revision(query['r'][0])
67
revs = [pysvn.Revision(x) for x in [pysvn.opt_revision_kind.base,
68
pysvn.opt_revision_kind.working]]
69
# Override revisions from query string
70
fields = req.get_fieldstorage()
71
field_r = fields.getlist("r")
72
for ri in range(len(field_r)):
73
r = common.svn.revision_from_string(field_r[ri])
99
77
# Attempt to get the diff for these revisons
101
79
svnclient = pysvn.Client()
102
80
diff = svnclient.diff
103
81
diff_text = diff( '/tmp/svndiff',
104
path.join('/home/', urlpath),
106
#revision1=pysvn.Revision( pysvn.opt_revision_kind.base ),
107
#url_or_path2=url_or_path,
109
#revision2=pysvn.Revision( opt_revision_kind.working ),
111
#ignore_ancestry=False,
113
#ignore_content_type=False,
82
os.path.join('/home', req.path),
118
87
# Split up the udiff into individual files
122
91
split_diff = diff_matcher.findall(diff_text)
126
94
for filediff in split_diff:
127
95
filename = filediff[0]
128
96
diffbody = htmlfy_diff(filediff[1])
129
print("<dt><strong>File:</strong> " + filename + "</dt>")
130
print("<dd><code><pre>" + diffbody + "</pre></code></dd>")
97
req.write('<p><b>File:</b> %s</p>\n'
98
% cgi.escape(filename))
99
req.write('<pre class="diff">%s</pre>\n' % diffbody)
133
101
except pysvn._pysvn_2_5.ClientError, e:
134
print("<dl><dt><strong>Error:</strong></dt><dd>")
102
req.write('<p><b>Error:</b></p>\n')
103
req.write('<pre class="diff">%s</pre>\n' % cgi.escape(str(e)))
105
req.write('</div>\n')