annotate pylons_app/controllers/files.py @ 275:a83e86e3f580

fixed bug when displaying html not escaped data as raw diff.
author Marcin Kuzminski <marcin@python-works.com>
date Tue, 08 Jun 2010 23:02:24 +0200
parents c3661cf28bec
children 2d61aa00e855
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
252
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 245
diff changeset
1 #!/usr/bin/env python
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 245
diff changeset
2 # encoding: utf-8
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 245
diff changeset
3 # files controller for pylons
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 245
diff changeset
4 # Copyright (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 245
diff changeset
5
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 245
diff changeset
6 # This program is free software; you can redistribute it and/or
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 245
diff changeset
7 # modify it under the terms of the GNU General Public License
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 245
diff changeset
8 # as published by the Free Software Foundation; version 2
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 245
diff changeset
9 # of the License or (at your opinion) any later version of the license.
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 245
diff changeset
10 #
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 245
diff changeset
11 # This program is distributed in the hope that it will be useful,
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 245
diff changeset
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 245
diff changeset
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 245
diff changeset
14 # GNU General Public License for more details.
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 245
diff changeset
15 #
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 245
diff changeset
16 # You should have received a copy of the GNU General Public License
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 245
diff changeset
17 # along with this program; if not, write to the Free Software
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 245
diff changeset
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 245
diff changeset
19 # MA 02110-1301, USA.
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 245
diff changeset
20 """
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 245
diff changeset
21 Created on April 21, 2010
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 245
diff changeset
22 files controller for pylons
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 245
diff changeset
23 @author: marcink
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 245
diff changeset
24 """
245
a83a1799480c Reimplemented way of caching repos list, hg model now get's repos objects right from cached dict, this way we skipp creating instances of MercurialRepository and gain performance. Some import cleanup
Marcin Kuzminski <marcin@python-works.com>
parents: 209
diff changeset
25 from mercurial import archival
a83a1799480c Reimplemented way of caching repos list, hg model now get's repos objects right from cached dict, this way we skipp creating instances of MercurialRepository and gain performance. Some import cleanup
Marcin Kuzminski <marcin@python-works.com>
parents: 209
diff changeset
26 from pylons import request, response, session, tmpl_context as c, url
209
1a18994cdc3b Added archives support. Version bump
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
27 from pylons_app.lib.auth import LoginRequired
93
aec4c0071cb3 added empty controllers for branches tags files graph, routing and test for them
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
28 from pylons_app.lib.base import BaseController, render
275
a83e86e3f580 fixed bug when displaying html not escaped data as raw diff.
Marcin Kuzminski <marcin@python-works.com>
parents: 267
diff changeset
29 import pylons_app.lib.helpers as h
99
5b57295601b6 Updated basic files browser with, pygments
Marcin Kuzminski <marcin@python-works.com>
parents: 93
diff changeset
30 from pylons_app.model.hg_model import HgModel
209
1a18994cdc3b Added archives support. Version bump
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
31 from vcs.exceptions import RepositoryError, ChangesetError
158
f905f45c457e moved diff libs to vcs. updated htmls and css for diff and source
Marcin Kuzminski <marcin@python-works.com>
parents: 152
diff changeset
32 from vcs.utils import diffs as differ
209
1a18994cdc3b Added archives support. Version bump
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
33 import logging
245
a83a1799480c Reimplemented way of caching repos list, hg model now get's repos objects right from cached dict, this way we skipp creating instances of MercurialRepository and gain performance. Some import cleanup
Marcin Kuzminski <marcin@python-works.com>
parents: 209
diff changeset
34 import tempfile
209
1a18994cdc3b Added archives support. Version bump
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
35
131
49c7e191c2cd Implemented mercurial style diff-lib
Marcin Kuzminski <marcin@python-works.com>
parents: 130
diff changeset
36
93
aec4c0071cb3 added empty controllers for branches tags files graph, routing and test for them
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
37 log = logging.getLogger(__name__)
aec4c0071cb3 added empty controllers for branches tags files graph, routing and test for them
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
38
aec4c0071cb3 added empty controllers for branches tags files graph, routing and test for them
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
39 class FilesController(BaseController):
191
b68b2246e5a6 Authenticated controller with LoginRequired decorator, and cleaned __before__ (used in baseController now). fixed User for clone url with logged in session user.
Marcin Kuzminski <marcin@python-works.com>
parents: 160
diff changeset
40
b68b2246e5a6 Authenticated controller with LoginRequired decorator, and cleaned __before__ (used in baseController now). fixed User for clone url with logged in session user.
Marcin Kuzminski <marcin@python-works.com>
parents: 160
diff changeset
41 @LoginRequired()
99
5b57295601b6 Updated basic files browser with, pygments
Marcin Kuzminski <marcin@python-works.com>
parents: 93
diff changeset
42 def __before__(self):
191
b68b2246e5a6 Authenticated controller with LoginRequired decorator, and cleaned __before__ (used in baseController now). fixed User for clone url with logged in session user.
Marcin Kuzminski <marcin@python-works.com>
parents: 160
diff changeset
43 super(FilesController, self).__before__()
93
aec4c0071cb3 added empty controllers for branches tags files graph, routing and test for them
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
44
99
5b57295601b6 Updated basic files browser with, pygments
Marcin Kuzminski <marcin@python-works.com>
parents: 93
diff changeset
45 def index(self, repo_name, revision, f_path):
5b57295601b6 Updated basic files browser with, pygments
Marcin Kuzminski <marcin@python-works.com>
parents: 93
diff changeset
46 hg_model = HgModel()
5b57295601b6 Updated basic files browser with, pygments
Marcin Kuzminski <marcin@python-works.com>
parents: 93
diff changeset
47 c.repo = repo = hg_model.get_repo(c.repo_name)
149
b3c93efd1c97 Updated template for summary (archives links)
Marcin Kuzminski <marcin@python-works.com>
parents: 147
diff changeset
48 revision = request.POST.get('at_rev', None) or revision
145
3f01d02c2cc6 fixed error when browsing revisions on path that doesn't exist. Fixed files browsing. Fixed templates in branches and tags
Marcin Kuzminski <marcin@python-works.com>
parents: 142
diff changeset
49
149
b3c93efd1c97 Updated template for summary (archives links)
Marcin Kuzminski <marcin@python-works.com>
parents: 147
diff changeset
50 def get_next_rev(cur):
145
3f01d02c2cc6 fixed error when browsing revisions on path that doesn't exist. Fixed files browsing. Fixed templates in branches and tags
Marcin Kuzminski <marcin@python-works.com>
parents: 142
diff changeset
51 max_rev = len(c.repo.revisions) - 1
149
b3c93efd1c97 Updated template for summary (archives links)
Marcin Kuzminski <marcin@python-works.com>
parents: 147
diff changeset
52 r = cur + 1
b3c93efd1c97 Updated template for summary (archives links)
Marcin Kuzminski <marcin@python-works.com>
parents: 147
diff changeset
53 if r > max_rev:
b3c93efd1c97 Updated template for summary (archives links)
Marcin Kuzminski <marcin@python-works.com>
parents: 147
diff changeset
54 r = max_rev
b3c93efd1c97 Updated template for summary (archives links)
Marcin Kuzminski <marcin@python-works.com>
parents: 147
diff changeset
55 return r
b3c93efd1c97 Updated template for summary (archives links)
Marcin Kuzminski <marcin@python-works.com>
parents: 147
diff changeset
56
b3c93efd1c97 Updated template for summary (archives links)
Marcin Kuzminski <marcin@python-works.com>
parents: 147
diff changeset
57 def get_prev_rev(cur):
b3c93efd1c97 Updated template for summary (archives links)
Marcin Kuzminski <marcin@python-works.com>
parents: 147
diff changeset
58 r = cur - 1
b3c93efd1c97 Updated template for summary (archives links)
Marcin Kuzminski <marcin@python-works.com>
parents: 147
diff changeset
59 return r
b3c93efd1c97 Updated template for summary (archives links)
Marcin Kuzminski <marcin@python-works.com>
parents: 147
diff changeset
60
99
5b57295601b6 Updated basic files browser with, pygments
Marcin Kuzminski <marcin@python-works.com>
parents: 93
diff changeset
61 c.f_path = f_path
149
b3c93efd1c97 Updated template for summary (archives links)
Marcin Kuzminski <marcin@python-works.com>
parents: 147
diff changeset
62
147
873fd2dc62c2 Added rawfile support, and few fixes for file
Marcin Kuzminski <marcin@python-works.com>
parents: 145
diff changeset
63
138
5f42d751c719 fixed files when repository is empty
Marcin Kuzminski <marcin@python-works.com>
parents: 131
diff changeset
64 try:
149
b3c93efd1c97 Updated template for summary (archives links)
Marcin Kuzminski <marcin@python-works.com>
parents: 147
diff changeset
65 cur_rev = repo.get_changeset(revision).revision
b3c93efd1c97 Updated template for summary (archives links)
Marcin Kuzminski <marcin@python-works.com>
parents: 147
diff changeset
66 prev_rev = repo.get_changeset(get_prev_rev(cur_rev)).raw_id
b3c93efd1c97 Updated template for summary (archives links)
Marcin Kuzminski <marcin@python-works.com>
parents: 147
diff changeset
67 next_rev = repo.get_changeset(get_next_rev(cur_rev)).raw_id
b3c93efd1c97 Updated template for summary (archives links)
Marcin Kuzminski <marcin@python-works.com>
parents: 147
diff changeset
68
b3c93efd1c97 Updated template for summary (archives links)
Marcin Kuzminski <marcin@python-works.com>
parents: 147
diff changeset
69 c.url_prev = url('files_home', repo_name=c.repo_name,
b3c93efd1c97 Updated template for summary (archives links)
Marcin Kuzminski <marcin@python-works.com>
parents: 147
diff changeset
70 revision=prev_rev, f_path=f_path)
b3c93efd1c97 Updated template for summary (archives links)
Marcin Kuzminski <marcin@python-works.com>
parents: 147
diff changeset
71 c.url_next = url('files_home', repo_name=c.repo_name,
b3c93efd1c97 Updated template for summary (archives links)
Marcin Kuzminski <marcin@python-works.com>
parents: 147
diff changeset
72 revision=next_rev, f_path=f_path)
b3c93efd1c97 Updated template for summary (archives links)
Marcin Kuzminski <marcin@python-works.com>
parents: 147
diff changeset
73
b3c93efd1c97 Updated template for summary (archives links)
Marcin Kuzminski <marcin@python-works.com>
parents: 147
diff changeset
74 c.changeset = repo.get_changeset(revision)
267
c3661cf28bec fixed bug for last commit message in file source
Marcin Kuzminski <marcin@python-works.com>
parents: 252
diff changeset
75
147
873fd2dc62c2 Added rawfile support, and few fixes for file
Marcin Kuzminski <marcin@python-works.com>
parents: 145
diff changeset
76
142
f7218849798a Changeg graph to changelog, and changelog to shortlog
Marcin Kuzminski <marcin@python-works.com>
parents: 138
diff changeset
77 c.cur_rev = c.changeset.raw_id
f7218849798a Changeg graph to changelog, and changelog to shortlog
Marcin Kuzminski <marcin@python-works.com>
parents: 138
diff changeset
78 c.rev_nr = c.changeset.revision
138
5f42d751c719 fixed files when repository is empty
Marcin Kuzminski <marcin@python-works.com>
parents: 131
diff changeset
79 c.files_list = c.changeset.get_node(f_path)
5f42d751c719 fixed files when repository is empty
Marcin Kuzminski <marcin@python-works.com>
parents: 131
diff changeset
80 c.file_history = self._get_history(repo, c.files_list, f_path)
147
873fd2dc62c2 Added rawfile support, and few fixes for file
Marcin Kuzminski <marcin@python-works.com>
parents: 145
diff changeset
81
145
3f01d02c2cc6 fixed error when browsing revisions on path that doesn't exist. Fixed files browsing. Fixed templates in branches and tags
Marcin Kuzminski <marcin@python-works.com>
parents: 142
diff changeset
82 except (RepositoryError, ChangesetError):
138
5f42d751c719 fixed files when repository is empty
Marcin Kuzminski <marcin@python-works.com>
parents: 131
diff changeset
83 c.files_list = None
99
5b57295601b6 Updated basic files browser with, pygments
Marcin Kuzminski <marcin@python-works.com>
parents: 93
diff changeset
84
128
9deb6f1d5b90 Implemented file history.
Marcin Kuzminski <marcin@python-works.com>
parents: 106
diff changeset
85 return render('files/files.html')
9deb6f1d5b90 Implemented file history.
Marcin Kuzminski <marcin@python-works.com>
parents: 106
diff changeset
86
147
873fd2dc62c2 Added rawfile support, and few fixes for file
Marcin Kuzminski <marcin@python-works.com>
parents: 145
diff changeset
87 def rawfile(self, repo_name, revision, f_path):
873fd2dc62c2 Added rawfile support, and few fixes for file
Marcin Kuzminski <marcin@python-works.com>
parents: 145
diff changeset
88 hg_model = HgModel()
873fd2dc62c2 Added rawfile support, and few fixes for file
Marcin Kuzminski <marcin@python-works.com>
parents: 145
diff changeset
89 c.repo = hg_model.get_repo(c.repo_name)
873fd2dc62c2 Added rawfile support, and few fixes for file
Marcin Kuzminski <marcin@python-works.com>
parents: 145
diff changeset
90 file_node = c.repo.get_changeset(revision).get_node(f_path)
160
0f7f93df5802 implemented rawdiff and diff download into diff view.
Marcin Kuzminski <marcin@python-works.com>
parents: 158
diff changeset
91 response.content_type = file_node.mimetype
0f7f93df5802 implemented rawdiff and diff download into diff view.
Marcin Kuzminski <marcin@python-works.com>
parents: 158
diff changeset
92 response.content_disposition = 'attachment; filename=%s' \
147
873fd2dc62c2 Added rawfile support, and few fixes for file
Marcin Kuzminski <marcin@python-works.com>
parents: 145
diff changeset
93 % f_path.split('/')[-1]
873fd2dc62c2 Added rawfile support, and few fixes for file
Marcin Kuzminski <marcin@python-works.com>
parents: 145
diff changeset
94 return file_node.content
873fd2dc62c2 Added rawfile support, and few fixes for file
Marcin Kuzminski <marcin@python-works.com>
parents: 145
diff changeset
95
191
b68b2246e5a6 Authenticated controller with LoginRequired decorator, and cleaned __before__ (used in baseController now). fixed User for clone url with logged in session user.
Marcin Kuzminski <marcin@python-works.com>
parents: 160
diff changeset
96 def annotate(self, repo_name, revision, f_path):
b68b2246e5a6 Authenticated controller with LoginRequired decorator, and cleaned __before__ (used in baseController now). fixed User for clone url with logged in session user.
Marcin Kuzminski <marcin@python-works.com>
parents: 160
diff changeset
97 hg_model = HgModel()
b68b2246e5a6 Authenticated controller with LoginRequired decorator, and cleaned __before__ (used in baseController now). fixed User for clone url with logged in session user.
Marcin Kuzminski <marcin@python-works.com>
parents: 160
diff changeset
98 c.repo = hg_model.get_repo(c.repo_name)
b68b2246e5a6 Authenticated controller with LoginRequired decorator, and cleaned __before__ (used in baseController now). fixed User for clone url with logged in session user.
Marcin Kuzminski <marcin@python-works.com>
parents: 160
diff changeset
99 cs = c.repo.get_changeset(revision)
b68b2246e5a6 Authenticated controller with LoginRequired decorator, and cleaned __before__ (used in baseController now). fixed User for clone url with logged in session user.
Marcin Kuzminski <marcin@python-works.com>
parents: 160
diff changeset
100 c.file = cs.get_node(f_path)
b68b2246e5a6 Authenticated controller with LoginRequired decorator, and cleaned __before__ (used in baseController now). fixed User for clone url with logged in session user.
Marcin Kuzminski <marcin@python-works.com>
parents: 160
diff changeset
101 c.file_msg = cs.get_file_message(f_path)
b68b2246e5a6 Authenticated controller with LoginRequired decorator, and cleaned __before__ (used in baseController now). fixed User for clone url with logged in session user.
Marcin Kuzminski <marcin@python-works.com>
parents: 160
diff changeset
102 c.cur_rev = cs.raw_id
b68b2246e5a6 Authenticated controller with LoginRequired decorator, and cleaned __before__ (used in baseController now). fixed User for clone url with logged in session user.
Marcin Kuzminski <marcin@python-works.com>
parents: 160
diff changeset
103 c.f_path = f_path
b68b2246e5a6 Authenticated controller with LoginRequired decorator, and cleaned __before__ (used in baseController now). fixed User for clone url with logged in session user.
Marcin Kuzminski <marcin@python-works.com>
parents: 160
diff changeset
104 c.annotate = cs.get_file_annotate(f_path)
b68b2246e5a6 Authenticated controller with LoginRequired decorator, and cleaned __before__ (used in baseController now). fixed User for clone url with logged in session user.
Marcin Kuzminski <marcin@python-works.com>
parents: 160
diff changeset
105 return render('files/files_annotate.html')
b68b2246e5a6 Authenticated controller with LoginRequired decorator, and cleaned __before__ (used in baseController now). fixed User for clone url with logged in session user.
Marcin Kuzminski <marcin@python-works.com>
parents: 160
diff changeset
106
149
b3c93efd1c97 Updated template for summary (archives links)
Marcin Kuzminski <marcin@python-works.com>
parents: 147
diff changeset
107 def archivefile(self, repo_name, revision, fileformat):
209
1a18994cdc3b Added archives support. Version bump
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
108 archive_specs = {
1a18994cdc3b Added archives support. Version bump
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
109 '.tar.bz2': ('application/x-tar', 'tbz2'),
1a18994cdc3b Added archives support. Version bump
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
110 '.tar.gz': ('application/x-tar', 'tgz'),
1a18994cdc3b Added archives support. Version bump
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
111 '.zip': ('application/zip', 'zip'),
1a18994cdc3b Added archives support. Version bump
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
112 }
1a18994cdc3b Added archives support. Version bump
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
113 if not archive_specs.has_key(fileformat):
1a18994cdc3b Added archives support. Version bump
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
114 return 'Unknown archive type %s' % fileformat
1a18994cdc3b Added archives support. Version bump
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
115
1a18994cdc3b Added archives support. Version bump
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
116 def read_in_chunks(file_object, chunk_size=1024 * 40):
1a18994cdc3b Added archives support. Version bump
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
117 """Lazy function (generator) to read a file piece by piece.
1a18994cdc3b Added archives support. Version bump
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
118 Default chunk size: 40k."""
1a18994cdc3b Added archives support. Version bump
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
119 while True:
1a18994cdc3b Added archives support. Version bump
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
120 data = file_object.read(chunk_size)
1a18994cdc3b Added archives support. Version bump
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
121 if not data:
1a18994cdc3b Added archives support. Version bump
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
122 break
1a18994cdc3b Added archives support. Version bump
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
123 yield data
1a18994cdc3b Added archives support. Version bump
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
124
1a18994cdc3b Added archives support. Version bump
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
125 archive = tempfile.TemporaryFile()
1a18994cdc3b Added archives support. Version bump
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
126 repo = HgModel().get_repo(repo_name).repo
1a18994cdc3b Added archives support. Version bump
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
127 fname = '%s-%s%s' % (repo_name, revision, fileformat)
1a18994cdc3b Added archives support. Version bump
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
128 archival.archive(repo, archive, revision, archive_specs[fileformat][1],
1a18994cdc3b Added archives support. Version bump
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
129 prefix='%s-%s' % (repo_name, revision))
1a18994cdc3b Added archives support. Version bump
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
130 response.content_type = archive_specs[fileformat][0]
1a18994cdc3b Added archives support. Version bump
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
131 response.content_disposition = 'attachment; filename=%s' % fname
1a18994cdc3b Added archives support. Version bump
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
132 archive.seek(0)
1a18994cdc3b Added archives support. Version bump
Marcin Kuzminski <marcin@python-works.com>
parents: 191
diff changeset
133 return read_in_chunks(archive)
149
b3c93efd1c97 Updated template for summary (archives links)
Marcin Kuzminski <marcin@python-works.com>
parents: 147
diff changeset
134
129
42d46deb124d implemented simple diffs for history of files.
Marcin Kuzminski <marcin@python-works.com>
parents: 128
diff changeset
135 def diff(self, repo_name, f_path):
42d46deb124d implemented simple diffs for history of files.
Marcin Kuzminski <marcin@python-works.com>
parents: 128
diff changeset
136 hg_model = HgModel()
42d46deb124d implemented simple diffs for history of files.
Marcin Kuzminski <marcin@python-works.com>
parents: 128
diff changeset
137 diff1 = request.GET.get('diff1')
42d46deb124d implemented simple diffs for history of files.
Marcin Kuzminski <marcin@python-works.com>
parents: 128
diff changeset
138 diff2 = request.GET.get('diff2')
160
0f7f93df5802 implemented rawdiff and diff download into diff view.
Marcin Kuzminski <marcin@python-works.com>
parents: 158
diff changeset
139 c.action = action = request.GET.get('diff')
131
49c7e191c2cd Implemented mercurial style diff-lib
Marcin Kuzminski <marcin@python-works.com>
parents: 130
diff changeset
140 c.no_changes = diff1 == diff2
129
42d46deb124d implemented simple diffs for history of files.
Marcin Kuzminski <marcin@python-works.com>
parents: 128
diff changeset
141 c.f_path = f_path
42d46deb124d implemented simple diffs for history of files.
Marcin Kuzminski <marcin@python-works.com>
parents: 128
diff changeset
142 c.repo = hg_model.get_repo(c.repo_name)
42d46deb124d implemented simple diffs for history of files.
Marcin Kuzminski <marcin@python-works.com>
parents: 128
diff changeset
143 c.changeset_1 = c.repo.get_changeset(diff1)
42d46deb124d implemented simple diffs for history of files.
Marcin Kuzminski <marcin@python-works.com>
parents: 128
diff changeset
144 c.changeset_2 = c.repo.get_changeset(diff2)
152
0c00fbaff55a Fixed differ to properly extract filenames, and dates from diff file. and swaped order of columns with lines nr in diff html
Marcin Kuzminski <marcin@python-works.com>
parents: 149
diff changeset
145
129
42d46deb124d implemented simple diffs for history of files.
Marcin Kuzminski <marcin@python-works.com>
parents: 128
diff changeset
146 c.diff1 = 'r%s:%s' % (c.changeset_1.revision, c.changeset_1._short)
42d46deb124d implemented simple diffs for history of files.
Marcin Kuzminski <marcin@python-works.com>
parents: 128
diff changeset
147 c.diff2 = 'r%s:%s' % (c.changeset_2.revision, c.changeset_2._short)
158
f905f45c457e moved diff libs to vcs. updated htmls and css for diff and source
Marcin Kuzminski <marcin@python-works.com>
parents: 152
diff changeset
148 f_udiff = differ.get_udiff(c.changeset_1.get_node(f_path),
f905f45c457e moved diff libs to vcs. updated htmls and css for diff and source
Marcin Kuzminski <marcin@python-works.com>
parents: 152
diff changeset
149 c.changeset_2.get_node(f_path))
160
0f7f93df5802 implemented rawdiff and diff download into diff view.
Marcin Kuzminski <marcin@python-works.com>
parents: 158
diff changeset
150
0f7f93df5802 implemented rawdiff and diff download into diff view.
Marcin Kuzminski <marcin@python-works.com>
parents: 158
diff changeset
151 diff = differ.DiffProcessor(f_udiff)
0f7f93df5802 implemented rawdiff and diff download into diff view.
Marcin Kuzminski <marcin@python-works.com>
parents: 158
diff changeset
152
0f7f93df5802 implemented rawdiff and diff download into diff view.
Marcin Kuzminski <marcin@python-works.com>
parents: 158
diff changeset
153 if action == 'download':
0f7f93df5802 implemented rawdiff and diff download into diff view.
Marcin Kuzminski <marcin@python-works.com>
parents: 158
diff changeset
154 diff_name = '%s_vs_%s.diff' % (diff1, diff2)
0f7f93df5802 implemented rawdiff and diff download into diff view.
Marcin Kuzminski <marcin@python-works.com>
parents: 158
diff changeset
155 response.content_type = 'text/plain'
0f7f93df5802 implemented rawdiff and diff download into diff view.
Marcin Kuzminski <marcin@python-works.com>
parents: 158
diff changeset
156 response.content_disposition = 'attachment; filename=%s' \
0f7f93df5802 implemented rawdiff and diff download into diff view.
Marcin Kuzminski <marcin@python-works.com>
parents: 158
diff changeset
157 % diff_name
0f7f93df5802 implemented rawdiff and diff download into diff view.
Marcin Kuzminski <marcin@python-works.com>
parents: 158
diff changeset
158 return diff.raw_diff()
0f7f93df5802 implemented rawdiff and diff download into diff view.
Marcin Kuzminski <marcin@python-works.com>
parents: 158
diff changeset
159
0f7f93df5802 implemented rawdiff and diff download into diff view.
Marcin Kuzminski <marcin@python-works.com>
parents: 158
diff changeset
160 elif action == 'raw':
275
a83e86e3f580 fixed bug when displaying html not escaped data as raw diff.
Marcin Kuzminski <marcin@python-works.com>
parents: 267
diff changeset
161 c.cur_diff = '<pre class="raw">%s</pre>' % h.escape(diff.raw_diff())
160
0f7f93df5802 implemented rawdiff and diff download into diff view.
Marcin Kuzminski <marcin@python-works.com>
parents: 158
diff changeset
162 elif action == 'diff':
0f7f93df5802 implemented rawdiff and diff download into diff view.
Marcin Kuzminski <marcin@python-works.com>
parents: 158
diff changeset
163 c.cur_diff = diff.as_html()
0f7f93df5802 implemented rawdiff and diff download into diff view.
Marcin Kuzminski <marcin@python-works.com>
parents: 158
diff changeset
164
129
42d46deb124d implemented simple diffs for history of files.
Marcin Kuzminski <marcin@python-works.com>
parents: 128
diff changeset
165 return render('files/file_diff.html')
42d46deb124d implemented simple diffs for history of files.
Marcin Kuzminski <marcin@python-works.com>
parents: 128
diff changeset
166
128
9deb6f1d5b90 Implemented file history.
Marcin Kuzminski <marcin@python-works.com>
parents: 106
diff changeset
167 def _get_history(self, repo, node, f_path):
9deb6f1d5b90 Implemented file history.
Marcin Kuzminski <marcin@python-works.com>
parents: 106
diff changeset
168 from vcs.nodes import NodeKind
9deb6f1d5b90 Implemented file history.
Marcin Kuzminski <marcin@python-works.com>
parents: 106
diff changeset
169 if not node.kind is NodeKind.FILE:
9deb6f1d5b90 Implemented file history.
Marcin Kuzminski <marcin@python-works.com>
parents: 106
diff changeset
170 return []
129
42d46deb124d implemented simple diffs for history of files.
Marcin Kuzminski <marcin@python-works.com>
parents: 128
diff changeset
171 changesets = node.history
128
9deb6f1d5b90 Implemented file history.
Marcin Kuzminski <marcin@python-works.com>
parents: 106
diff changeset
172 hist_l = []
9deb6f1d5b90 Implemented file history.
Marcin Kuzminski <marcin@python-works.com>
parents: 106
diff changeset
173 for chs in changesets:
9deb6f1d5b90 Implemented file history.
Marcin Kuzminski <marcin@python-works.com>
parents: 106
diff changeset
174 n_desc = 'r%s:%s' % (chs.revision, chs._short)
9deb6f1d5b90 Implemented file history.
Marcin Kuzminski <marcin@python-works.com>
parents: 106
diff changeset
175 hist_l.append((chs._short, n_desc,))
9deb6f1d5b90 Implemented file history.
Marcin Kuzminski <marcin@python-works.com>
parents: 106
diff changeset
176 return hist_l