comparison rhodecode/controllers/files.py @ 636:ffd07396d315 beta

Fixes for raw_id, needed for git Renamed hg controller to home css html changes
author Marcin Kuzminski <marcin@python-works.com>
date Tue, 26 Oct 2010 03:20:32 +0200
parents 7e536d1af60d
children c8bd0e6cc3da
comparison
equal deleted inserted replaced
635:fd63782c4426 636:ffd07396d315
34 from vcs.nodes import FileNode 34 from vcs.nodes import FileNode
35 from vcs.utils import diffs as differ 35 from vcs.utils import diffs as differ
36 import logging 36 import logging
37 import rhodecode.lib.helpers as h 37 import rhodecode.lib.helpers as h
38 import tempfile 38 import tempfile
39 39
40 log = logging.getLogger(__name__) 40 log = logging.getLogger(__name__)
41 41
42 class FilesController(BaseController): 42 class FilesController(BaseController):
43 43
44 @LoginRequired() 44 @LoginRequired()
45 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write', 45 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
46 'repository.admin') 46 'repository.admin')
47 def __before__(self): 47 def __before__(self):
48 super(FilesController, self).__before__() 48 super(FilesController, self).__before__()
49 c.file_size_limit = 250 * 1024 #limit of file size to display 49 c.file_size_limit = 250 * 1024 #limit of file size to display
50 50
51 def index(self, repo_name, revision, f_path): 51 def index(self, repo_name, revision, f_path):
52 hg_model = HgModel() 52 hg_model = HgModel()
53 c.repo = repo = hg_model.get_repo(c.repo_name) 53 c.repo = repo = hg_model.get_repo(c.repo_name)
54 revision = request.POST.get('at_rev', None) or revision 54 revision = request.POST.get('at_rev', None) or revision
55 55
56 def get_next_rev(cur): 56 def get_next_rev(cur):
57 max_rev = len(c.repo.revisions) - 1 57 max_rev = len(c.repo.revisions) - 1
58 r = cur + 1 58 r = cur + 1
59 if r > max_rev: 59 if r > max_rev:
60 r = max_rev 60 r = max_rev
61 return r 61 return r
62 62
63 def get_prev_rev(cur): 63 def get_prev_rev(cur):
64 r = cur - 1 64 r = cur - 1
65 return r 65 return r
66 66
67 c.f_path = f_path 67 c.f_path = f_path
68 68
69 69
70 try: 70 try:
71 cur_rev = repo.get_changeset(revision).revision 71 cur_rev = repo.get_changeset(revision).revision
72 prev_rev = repo.get_changeset(get_prev_rev(cur_rev)).short_id 72 prev_rev = repo.get_changeset(get_prev_rev(cur_rev)).raw_id
73 next_rev = repo.get_changeset(get_next_rev(cur_rev)).short_id 73 next_rev = repo.get_changeset(get_next_rev(cur_rev)).raw_id
74 74
75 c.url_prev = url('files_home', repo_name=c.repo_name, 75 c.url_prev = url('files_home', repo_name=c.repo_name,
76 revision=prev_rev, f_path=f_path) 76 revision=prev_rev, f_path=f_path)
77 c.url_next = url('files_home', repo_name=c.repo_name, 77 c.url_next = url('files_home', repo_name=c.repo_name,
78 revision=next_rev, f_path=f_path) 78 revision=next_rev, f_path=f_path)
79 79
80 c.changeset = repo.get_changeset(revision) 80 c.changeset = repo.get_changeset(revision)
81 81
82 c.cur_rev = c.changeset.short_id 82 c.cur_rev = c.changeset.raw_id
83 c.rev_nr = c.changeset.revision 83 c.rev_nr = c.changeset.revision
84 c.files_list = c.changeset.get_node(f_path) 84 c.files_list = c.changeset.get_node(f_path)
85 c.file_history = self._get_history(repo, c.files_list, f_path) 85 c.file_history = self._get_history(repo, c.files_list, f_path)
86 86
87 except (RepositoryError, ChangesetError): 87 except (RepositoryError, ChangesetError):
88 c.files_list = None 88 c.files_list = None
89 89
90 return render('files/files.html') 90 return render('files/files.html')
91 91
92 def rawfile(self, repo_name, revision, f_path): 92 def rawfile(self, repo_name, revision, f_path):
93 hg_model = HgModel() 93 hg_model = HgModel()
94 c.repo = hg_model.get_repo(c.repo_name) 94 c.repo = hg_model.get_repo(c.repo_name)
95 file_node = c.repo.get_changeset(revision).get_node(f_path) 95 file_node = c.repo.get_changeset(revision).get_node(f_path)
96 response.content_type = file_node.mimetype 96 response.content_type = file_node.mimetype
97 response.content_disposition = 'attachment; filename=%s' \ 97 response.content_disposition = 'attachment; filename=%s' \
98 % f_path.split('/')[-1] 98 % f_path.split('/')[-1]
99 return file_node.content 99 return file_node.content
100 100
101 def raw(self, repo_name, revision, f_path): 101 def raw(self, repo_name, revision, f_path):
102 hg_model = HgModel() 102 hg_model = HgModel()
103 c.repo = hg_model.get_repo(c.repo_name) 103 c.repo = hg_model.get_repo(c.repo_name)
104 file_node = c.repo.get_changeset(revision).get_node(f_path) 104 file_node = c.repo.get_changeset(revision).get_node(f_path)
105 response.content_type = 'text/plain' 105 response.content_type = 'text/plain'
106 106
107 return file_node.content 107 return file_node.content
108 108
109 def annotate(self, repo_name, revision, f_path): 109 def annotate(self, repo_name, revision, f_path):
110 hg_model = HgModel() 110 hg_model = HgModel()
111 c.repo = hg_model.get_repo(c.repo_name) 111 c.repo = hg_model.get_repo(c.repo_name)
112 cs = c.repo.get_changeset(revision) 112 cs = c.repo.get_changeset(revision)
113 c.file = cs.get_node(f_path) 113 c.file = cs.get_node(f_path)
114 c.file_msg = cs.get_file_message(f_path) 114 c.file_msg = cs.get_file_message(f_path)
115 c.cur_rev = cs.short_id 115 c.cur_rev = cs.raw_id
116 c.rev_nr = cs.revision 116 c.rev_nr = cs.revision
117 c.f_path = f_path 117 c.f_path = f_path
118 118
119 return render('files/files_annotate.html') 119 return render('files/files_annotate.html')
120 120
121 def archivefile(self, repo_name, revision, fileformat): 121 def archivefile(self, repo_name, revision, fileformat):
122 archive_specs = { 122 archive_specs = {
123 '.tar.bz2': ('application/x-tar', 'tbz2'), 123 '.tar.bz2': ('application/x-tar', 'tbz2'),
124 '.tar.gz': ('application/x-tar', 'tgz'), 124 '.tar.gz': ('application/x-tar', 'tgz'),
125 '.zip': ('application/zip', 'zip'), 125 '.zip': ('application/zip', 'zip'),
126 } 126 }
127 if not archive_specs.has_key(fileformat): 127 if not archive_specs.has_key(fileformat):
128 return 'Unknown archive type %s' % fileformat 128 return 'Unknown archive type %s' % fileformat
129 129
130 def read_in_chunks(file_object, chunk_size=1024 * 40): 130 def read_in_chunks(file_object, chunk_size=1024 * 40):
131 """Lazy function (generator) to read a file piece by piece. 131 """Lazy function (generator) to read a file piece by piece.
132 Default chunk size: 40k.""" 132 Default chunk size: 40k."""
133 while True: 133 while True:
134 data = file_object.read(chunk_size) 134 data = file_object.read(chunk_size)
135 if not data: 135 if not data:
136 break 136 break
137 yield data 137 yield data
138 138
139 archive = tempfile.TemporaryFile() 139 archive = tempfile.TemporaryFile()
140 repo = HgModel().get_repo(repo_name).repo 140 repo = HgModel().get_repo(repo_name).repo
141 fname = '%s-%s%s' % (repo_name, revision, fileformat) 141 fname = '%s-%s%s' % (repo_name, revision, fileformat)
142 archival.archive(repo, archive, revision, archive_specs[fileformat][1], 142 archival.archive(repo, archive, revision, archive_specs[fileformat][1],
143 prefix='%s-%s' % (repo_name, revision)) 143 prefix='%s-%s' % (repo_name, revision))
144 response.content_type = archive_specs[fileformat][0] 144 response.content_type = archive_specs[fileformat][0]
145 response.content_disposition = 'attachment; filename=%s' % fname 145 response.content_disposition = 'attachment; filename=%s' % fname
146 archive.seek(0) 146 archive.seek(0)
147 return read_in_chunks(archive) 147 return read_in_chunks(archive)
148 148
149 def diff(self, repo_name, f_path): 149 def diff(self, repo_name, f_path):
150 hg_model = HgModel() 150 hg_model = HgModel()
151 diff1 = request.GET.get('diff1') 151 diff1 = request.GET.get('diff1')
152 diff2 = request.GET.get('diff2') 152 diff2 = request.GET.get('diff2')
153 c.action = request.GET.get('diff') 153 c.action = request.GET.get('diff')
160 c.changeset_1 = c.repo.get_changeset(diff1) 160 c.changeset_1 = c.repo.get_changeset(diff1)
161 node1 = c.changeset_1.get_node(f_path) 161 node1 = c.changeset_1.get_node(f_path)
162 else: 162 else:
163 c.changeset_1 = EmptyChangeset() 163 c.changeset_1 = EmptyChangeset()
164 node1 = FileNode('.', '', changeset=c.changeset_1) 164 node1 = FileNode('.', '', changeset=c.changeset_1)
165 165
166 if diff2 not in ['', None, 'None', '0' * 12, '0' * 40]: 166 if diff2 not in ['', None, 'None', '0' * 12, '0' * 40]:
167 c.changeset_2 = c.repo.get_changeset(diff2) 167 c.changeset_2 = c.repo.get_changeset(diff2)
168 node2 = c.changeset_2.get_node(f_path) 168 node2 = c.changeset_2.get_node(f_path)
169 else: 169 else:
170 c.changeset_2 = EmptyChangeset() 170 c.changeset_2 = EmptyChangeset()
171 node2 = FileNode('.', '', changeset=c.changeset_2) 171 node2 = FileNode('.', '', changeset=c.changeset_2)
172 except RepositoryError: 172 except RepositoryError:
173 return redirect(url('files_home', 173 return redirect(url('files_home',
174 repo_name=c.repo_name, f_path=f_path)) 174 repo_name=c.repo_name, f_path=f_path))
175 175
176 c.diff1 = 'r%s:%s' % (c.changeset_1.revision, c.changeset_1.short_id)
177 c.diff2 = 'r%s:%s' % (c.changeset_2.revision, c.changeset_2.short_id)
178
179 f_udiff = differ.get_udiff(node1, node2) 176 f_udiff = differ.get_udiff(node1, node2)
180 diff = differ.DiffProcessor(f_udiff) 177 diff = differ.DiffProcessor(f_udiff)
181 178
182 if c.action == 'download': 179 if c.action == 'download':
183 diff_name = '%s_vs_%s.diff' % (diff1, diff2) 180 diff_name = '%s_vs_%s.diff' % (diff1, diff2)
184 response.content_type = 'text/plain' 181 response.content_type = 'text/plain'
185 response.content_disposition = 'attachment; filename=%s' \ 182 response.content_disposition = 'attachment; filename=%s' \
186 % diff_name 183 % diff_name
187 return diff.raw_diff() 184 return diff.raw_diff()
188 185
189 elif c.action == 'raw': 186 elif c.action == 'raw':
190 c.cur_diff = '<pre class="raw">%s</pre>' % h.escape(diff.raw_diff()) 187 c.cur_diff = '<pre class="raw">%s</pre>' % h.escape(diff.raw_diff())
191 elif c.action == 'diff': 188 elif c.action == 'diff':
192 if node1.size > c.file_size_limit or node2.size > c.file_size_limit: 189 if node1.size > c.file_size_limit or node2.size > c.file_size_limit:
193 c.cur_diff = _('Diff is to big to display') 190 c.cur_diff = _('Diff is to big to display')
197 #default option 194 #default option
198 if node1.size > c.file_size_limit or node2.size > c.file_size_limit: 195 if node1.size > c.file_size_limit or node2.size > c.file_size_limit:
199 c.cur_diff = _('Diff is to big to display') 196 c.cur_diff = _('Diff is to big to display')
200 else: 197 else:
201 c.cur_diff = diff.as_html() 198 c.cur_diff = diff.as_html()
202 199
203 if not c.cur_diff: c.no_changes = True 200 if not c.cur_diff: c.no_changes = True
204 return render('files/file_diff.html') 201 return render('files/file_diff.html')
205 202
206 def _get_history(self, repo, node, f_path): 203 def _get_history(self, repo, node, f_path):
207 from vcs.nodes import NodeKind 204 from vcs.nodes import NodeKind
208 if not node.kind is NodeKind.FILE: 205 if not node.kind is NodeKind.FILE:
209 return [] 206 return []
210 changesets = node.history 207 changesets = node.history
211 hist_l = [] 208 hist_l = []
212 for chs in changesets: 209 for chs in changesets:
213 n_desc = 'r%s:%s' % (chs.revision, chs.short_id) 210 n_desc = 'r%s:%s' % (chs.revision, chs.short_id)
214 hist_l.append((chs.short_id, n_desc,)) 211 hist_l.append((chs.raw_id, n_desc,))
215 return hist_l 212 return hist_l