annotate rhodecode/controllers/files.py @ 4043:a1bc4af25ec5

Implemented issue #387 side-by-side diffs view
author Marcin Kuzminski <marcin@python-works.com>
date Wed, 26 Jun 2013 19:07:32 +0200
parents 5293d4bbb1ea
children ba7b8dfac7d5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
812
30ad41c76fae fixes #79 cut off limit was added into .ini config files
Marcin Kuzminski <marcin@python-works.com>
parents: 774
diff changeset
1 # -*- coding: utf-8 -*-
30ad41c76fae fixes #79 cut off limit was added into .ini config files
Marcin Kuzminski <marcin@python-works.com>
parents: 774
diff changeset
2 """
30ad41c76fae fixes #79 cut off limit was added into .ini config files
Marcin Kuzminski <marcin@python-works.com>
parents: 774
diff changeset
3 rhodecode.controllers.files
30ad41c76fae fixes #79 cut off limit was added into .ini config files
Marcin Kuzminski <marcin@python-works.com>
parents: 774
diff changeset
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
318
fdf9f6ee5217 Implemented permissions into hg app, secured admin controllers, templates and repository specific controllers
Marcin Kuzminski <marcin@python-works.com>
parents: 275
diff changeset
5
812
30ad41c76fae fixes #79 cut off limit was added into .ini config files
Marcin Kuzminski <marcin@python-works.com>
parents: 774
diff changeset
6 Files controller for RhodeCode
1203
6832ef664673 source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents: 1200
diff changeset
7
812
30ad41c76fae fixes #79 cut off limit was added into .ini config files
Marcin Kuzminski <marcin@python-works.com>
parents: 774
diff changeset
8 :created_on: Apr 21, 2010
30ad41c76fae fixes #79 cut off limit was added into .ini config files
Marcin Kuzminski <marcin@python-works.com>
parents: 774
diff changeset
9 :author: marcink
1824
89efedac4e6c 2012 copyrights
Marcin Kuzminski <marcin@python-works.com>
parents: 1818
diff changeset
10 :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
812
30ad41c76fae fixes #79 cut off limit was added into .ini config files
Marcin Kuzminski <marcin@python-works.com>
parents: 774
diff changeset
11 :license: GPLv3, see COPYING for more details.
30ad41c76fae fixes #79 cut off limit was added into .ini config files
Marcin Kuzminski <marcin@python-works.com>
parents: 774
diff changeset
12 """
1206
a671db5bdd58 fixed license issue #149
Marcin Kuzminski <marcin@python-works.com>
parents: 1203
diff changeset
13 # This program is free software: you can redistribute it and/or modify
a671db5bdd58 fixed license issue #149
Marcin Kuzminski <marcin@python-works.com>
parents: 1203
diff changeset
14 # it under the terms of the GNU General Public License as published by
a671db5bdd58 fixed license issue #149
Marcin Kuzminski <marcin@python-works.com>
parents: 1203
diff changeset
15 # the Free Software Foundation, either version 3 of the License, or
a671db5bdd58 fixed license issue #149
Marcin Kuzminski <marcin@python-works.com>
parents: 1203
diff changeset
16 # (at your option) any later version.
1203
6832ef664673 source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents: 1200
diff changeset
17 #
252
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 245
diff changeset
18 # 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
19 # 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
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 245
diff changeset
21 # GNU General Public License for more details.
1203
6832ef664673 source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents: 1200
diff changeset
22 #
252
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 245
diff changeset
23 # You should have received a copy of the GNU General Public License
1206
a671db5bdd58 fixed license issue #149
Marcin Kuzminski <marcin@python-works.com>
parents: 1203
diff changeset
24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
2291
982d8a80e048 archive file fixes for python 2.5
Marcin Kuzminski <marcin@python-works.com>
parents: 2277
diff changeset
25 from __future__ import with_statement
1200
3ecaa17d9dea added os.sep for files controller
Marcin Kuzminski <marcin@python-works.com>
parents: 1190
diff changeset
26 import os
812
30ad41c76fae fixes #79 cut off limit was added into .ini config files
Marcin Kuzminski <marcin@python-works.com>
parents: 774
diff changeset
27 import logging
1305
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
28 import traceback
2267
b872bc10f4ec cleanup code of get archive for repositories
Marcin Kuzminski <marcin@python-works.com>
parents: 2255
diff changeset
29 import tempfile
3490
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
30 import shutil
812
30ad41c76fae fixes #79 cut off limit was added into .ini config files
Marcin Kuzminski <marcin@python-works.com>
parents: 774
diff changeset
31
1789
17caf4efe15c implements #308 rewrote diffs to enable displaying full diff on each file
Marcin Kuzminski <marcin@python-works.com>
parents: 1768
diff changeset
32 from pylons import request, response, tmpl_context as c, url
544
d8778cde98f0 added limits to single file diffs
Marcin Kuzminski <marcin@python-works.com>
parents: 512
diff changeset
33 from pylons.i18n.translation import _
318
fdf9f6ee5217 Implemented permissions into hg app, secured admin controllers, templates and repository specific controllers
Marcin Kuzminski <marcin@python-works.com>
parents: 275
diff changeset
34 from pylons.controllers.util import redirect
3868
e262494ca099 store download archive actions in journal
Marcin Kuzminski <marcin@python-works.com>
parents: 3840
diff changeset
35 from rhodecode.lib.utils import jsonify, action_logger
812
30ad41c76fae fixes #79 cut off limit was added into .ini config files
Marcin Kuzminski <marcin@python-works.com>
parents: 774
diff changeset
36
2109
8ecfed1d8f8b utils/conf
Marcin Kuzminski <marcin@python-works.com>
parents: 2083
diff changeset
37 from rhodecode.lib import diffs
8ecfed1d8f8b utils/conf
Marcin Kuzminski <marcin@python-works.com>
parents: 2083
diff changeset
38 from rhodecode.lib import helpers as h
1753
1d1ccb873d00 moved soon-to-be-deleted code from vcs to rhodecode
Marcin Kuzminski <marcin@python-works.com>
parents: 1752
diff changeset
39
4043
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
40 from rhodecode.lib.compat import OrderedDict, json
2931
4c7cc3a4c330 fixed issue with show at revision button. Some JS were not properly loaded due to ajaxified files view.
Marcin Kuzminski <marcin@python-works.com>
parents: 2930
diff changeset
41 from rhodecode.lib.utils2 import convert_line_endings, detect_mode, safe_str,\
4c7cc3a4c330 fixed issue with show at revision button. Some JS were not properly loaded due to ajaxified files view.
Marcin Kuzminski <marcin@python-works.com>
parents: 2930
diff changeset
42 str2bool
1305
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
43 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
44 from rhodecode.lib.base import BaseRepoController, render
2684
2b6939a77052 Bumped mercurial version to 2.3
Marcin Kuzminski <marcin@python-works.com>
parents: 2570
diff changeset
45 from rhodecode.lib.vcs.backends.base import EmptyChangeset
2109
8ecfed1d8f8b utils/conf
Marcin Kuzminski <marcin@python-works.com>
parents: 2083
diff changeset
46 from rhodecode.lib.vcs.conf import settings
8ecfed1d8f8b utils/conf
Marcin Kuzminski <marcin@python-works.com>
parents: 2083
diff changeset
47 from rhodecode.lib.vcs.exceptions import RepositoryError, \
8ecfed1d8f8b utils/conf
Marcin Kuzminski <marcin@python-works.com>
parents: 2083
diff changeset
48 ChangesetDoesNotExistError, EmptyRepositoryError, \
2977
cff9d4e1d821 Fixed issue when node didn't exists at 'tip' and we tried calculate history based on that assumption.
Marcin Kuzminski <marcin@python-works.com>
parents: 2973
diff changeset
49 ImproperArchiveTypeError, VCSError, NodeAlreadyExistsError,\
3037
789f20683559 fix error when diff path is a directory, edge case generated by google bots
Marcin Kuzminski <marcin@python-works.com>
parents: 3009
diff changeset
50 NodeDoesNotExistError, ChangesetError, NodeError
2109
8ecfed1d8f8b utils/conf
Marcin Kuzminski <marcin@python-works.com>
parents: 2083
diff changeset
51 from rhodecode.lib.vcs.nodes import FileNode
8ecfed1d8f8b utils/conf
Marcin Kuzminski <marcin@python-works.com>
parents: 2083
diff changeset
52
1305
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
53 from rhodecode.model.repo import RepoModel
2109
8ecfed1d8f8b utils/conf
Marcin Kuzminski <marcin@python-works.com>
parents: 2083
diff changeset
54 from rhodecode.model.scm import ScmModel
2255
95800dad44d0 fixes for tests on Windows
Marcin Kuzminski <marcin@python-works.com>
parents: 2199
diff changeset
55 from rhodecode.model.db import Repository
2109
8ecfed1d8f8b utils/conf
Marcin Kuzminski <marcin@python-works.com>
parents: 2083
diff changeset
56
1789
17caf4efe15c implements #308 rewrote diffs to enable displaying full diff on each file
Marcin Kuzminski <marcin@python-works.com>
parents: 1768
diff changeset
57 from rhodecode.controllers.changeset import anchor_url, _ignorews_url,\
17caf4efe15c implements #308 rewrote diffs to enable displaying full diff on each file
Marcin Kuzminski <marcin@python-works.com>
parents: 1768
diff changeset
58 _context_url, get_line_ctx, get_ignore_ws
3621
fe012b7df29d missing files or bad files revisions should return 404s not redirects - ref #808
Marcin Kuzminski <marcin@python-works.com>
parents: 3591
diff changeset
59 from webob.exc import HTTPNotFound
3840
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3839
diff changeset
60 from rhodecode.lib.exceptions import NonRelativePathError
2109
8ecfed1d8f8b utils/conf
Marcin Kuzminski <marcin@python-works.com>
parents: 2083
diff changeset
61
1305
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
62
93
aec4c0071cb3 added empty controllers for branches tags files graph, routing and test for them
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
63 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
64
1134
1dc5d169e85a fixed issue with vcs stream
Marcin Kuzminski <marcin@python-works.com>
parents: 1132
diff changeset
65
1045
3fc9183e05dd another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents: 1044
diff changeset
66 class FilesController(BaseRepoController):
636
ffd07396d315 Fixes for raw_id, needed for git
Marcin Kuzminski <marcin@python-works.com>
parents: 629
diff changeset
67
99
5b57295601b6 Updated basic files browser with, pygments
Marcin Kuzminski <marcin@python-works.com>
parents: 93
diff changeset
68 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
69 super(FilesController, self).__before__()
813
e8b5be26fb78 fixed small issue made on latest patches
Marcin Kuzminski <marcin@python-works.com>
parents: 812
diff changeset
70 c.cut_off_limit = self.cut_off_limit
93
aec4c0071cb3 added empty controllers for branches tags files graph, routing and test for them
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
71
1483
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
72 def __get_cs_or_redirect(self, rev, repo_name, redirect_after=True):
1045
3fc9183e05dd another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents: 1044
diff changeset
73 """
1137
82344ce0a892 clean and fixes in files controller
Marcin Kuzminski <marcin@python-works.com>
parents: 1134
diff changeset
74 Safe way to get changeset if error occur it redirects to tip with
82344ce0a892 clean and fixes in files controller
Marcin Kuzminski <marcin@python-works.com>
parents: 1134
diff changeset
75 proper message
1203
6832ef664673 source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents: 1200
diff changeset
76
1045
3fc9183e05dd another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents: 1044
diff changeset
77 :param rev: revision to fetch
3fc9183e05dd another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents: 1044
diff changeset
78 :param repo_name: repo name to redirect after
3fc9183e05dd another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents: 1044
diff changeset
79 """
3fc9183e05dd another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents: 1044
diff changeset
80
3fc9183e05dd another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents: 1044
diff changeset
81 try:
3fc9183e05dd another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents: 1044
diff changeset
82 return c.rhodecode_repo.get_changeset(rev)
3fc9183e05dd another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents: 1044
diff changeset
83 except EmptyRepositoryError, e:
1483
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
84 if not redirect_after:
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
85 return None
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
86 url_ = url('files_add_home',
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
87 repo_name=c.repo_name,
1485
269905fac50a added uploading of files from web interface directly into repo
Marcin Kuzminski <marcin@python-works.com>
parents: 1484
diff changeset
88 revision=0, f_path='')
3654
ec6354949623 Fix a lot of casings - use standard casing in most places
Mads Kiilerich <madski@unity3d.com>
parents: 3625
diff changeset
89 add_new = h.link_to(_('Click here to add new file'), url_)
2570
94ae02ca5f00 i18n improve
Takumi IINO <trot.thunder@gmail.com>
parents: 2536
diff changeset
90 h.flash(h.literal(_('There are no files yet %s') % add_new),
1483
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
91 category='warning')
1045
3fc9183e05dd another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents: 1044
diff changeset
92 redirect(h.url('summary_home', repo_name=repo_name))
3fc9183e05dd another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents: 1044
diff changeset
93
3621
fe012b7df29d missing files or bad files revisions should return 404s not redirects - ref #808
Marcin Kuzminski <marcin@python-works.com>
parents: 3591
diff changeset
94 except RepositoryError, e: # including ChangesetDoesNotExistError
3573
881ae12b3c7d report ChangesetDoesNotExistError as an error but don't lose the repo context
Mads Kiilerich <madski@unity3d.com>
parents: 3563
diff changeset
95 h.flash(str(e), category='error')
3621
fe012b7df29d missing files or bad files revisions should return 404s not redirects - ref #808
Marcin Kuzminski <marcin@python-works.com>
parents: 3591
diff changeset
96 raise HTTPNotFound()
1045
3fc9183e05dd another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents: 1044
diff changeset
97
1189
a4e1b955fe07 fixes for rawfile, annotation, download. It will check now if it's a filenode.
Marcin Kuzminski <marcin@python-works.com>
parents: 1151
diff changeset
98 def __get_filenode_or_redirect(self, repo_name, cs, path):
a4e1b955fe07 fixes for rawfile, annotation, download. It will check now if it's a filenode.
Marcin Kuzminski <marcin@python-works.com>
parents: 1151
diff changeset
99 """
a4e1b955fe07 fixes for rawfile, annotation, download. It will check now if it's a filenode.
Marcin Kuzminski <marcin@python-works.com>
parents: 1151
diff changeset
100 Returns file_node, if error occurs or given path is directory,
a4e1b955fe07 fixes for rawfile, annotation, download. It will check now if it's a filenode.
Marcin Kuzminski <marcin@python-works.com>
parents: 1151
diff changeset
101 it'll redirect to top level path
1203
6832ef664673 source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents: 1200
diff changeset
102
1189
a4e1b955fe07 fixes for rawfile, annotation, download. It will check now if it's a filenode.
Marcin Kuzminski <marcin@python-works.com>
parents: 1151
diff changeset
103 :param repo_name: repo_name
a4e1b955fe07 fixes for rawfile, annotation, download. It will check now if it's a filenode.
Marcin Kuzminski <marcin@python-works.com>
parents: 1151
diff changeset
104 :param cs: given changeset
a4e1b955fe07 fixes for rawfile, annotation, download. It will check now if it's a filenode.
Marcin Kuzminski <marcin@python-works.com>
parents: 1151
diff changeset
105 :param path: path to lookup
a4e1b955fe07 fixes for rawfile, annotation, download. It will check now if it's a filenode.
Marcin Kuzminski <marcin@python-works.com>
parents: 1151
diff changeset
106 """
a4e1b955fe07 fixes for rawfile, annotation, download. It will check now if it's a filenode.
Marcin Kuzminski <marcin@python-works.com>
parents: 1151
diff changeset
107
a4e1b955fe07 fixes for rawfile, annotation, download. It will check now if it's a filenode.
Marcin Kuzminski <marcin@python-works.com>
parents: 1151
diff changeset
108 try:
a4e1b955fe07 fixes for rawfile, annotation, download. It will check now if it's a filenode.
Marcin Kuzminski <marcin@python-works.com>
parents: 1151
diff changeset
109 file_node = cs.get_node(path)
a4e1b955fe07 fixes for rawfile, annotation, download. It will check now if it's a filenode.
Marcin Kuzminski <marcin@python-works.com>
parents: 1151
diff changeset
110 if file_node.is_dir():
a4e1b955fe07 fixes for rawfile, annotation, download. It will check now if it's a filenode.
Marcin Kuzminski <marcin@python-works.com>
parents: 1151
diff changeset
111 raise RepositoryError('given path is a directory')
a4e1b955fe07 fixes for rawfile, annotation, download. It will check now if it's a filenode.
Marcin Kuzminski <marcin@python-works.com>
parents: 1151
diff changeset
112 except RepositoryError, e:
3573
881ae12b3c7d report ChangesetDoesNotExistError as an error but don't lose the repo context
Mads Kiilerich <madski@unity3d.com>
parents: 3563
diff changeset
113 h.flash(str(e), category='error')
3621
fe012b7df29d missing files or bad files revisions should return 404s not redirects - ref #808
Marcin Kuzminski <marcin@python-works.com>
parents: 3591
diff changeset
114 raise HTTPNotFound()
1189
a4e1b955fe07 fixes for rawfile, annotation, download. It will check now if it's a filenode.
Marcin Kuzminski <marcin@python-works.com>
parents: 1151
diff changeset
115
a4e1b955fe07 fixes for rawfile, annotation, download. It will check now if it's a filenode.
Marcin Kuzminski <marcin@python-works.com>
parents: 1151
diff changeset
116 return file_node
a4e1b955fe07 fixes for rawfile, annotation, download. It will check now if it's a filenode.
Marcin Kuzminski <marcin@python-works.com>
parents: 1151
diff changeset
117
2457
01e005cabd4d moved login required into seperate calls for files due to optional API access option
Marcin Kuzminski <marcin@python-works.com>
parents: 2456
diff changeset
118 @LoginRequired()
1305
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
119 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
120 'repository.admin')
2177
ee07357d9265 unified annotation view with file source view
Marcin Kuzminski <marcin@python-works.com>
parents: 2109
diff changeset
121 def index(self, repo_name, revision, f_path, annotate=False):
1789
17caf4efe15c implements #308 rewrote diffs to enable displaying full diff on each file
Marcin Kuzminski <marcin@python-works.com>
parents: 1768
diff changeset
122 # redirect to given revision from form if given
1137
82344ce0a892 clean and fixes in files controller
Marcin Kuzminski <marcin@python-works.com>
parents: 1134
diff changeset
123 post_revision = request.POST.get('at_rev', None)
82344ce0a892 clean and fixes in files controller
Marcin Kuzminski <marcin@python-works.com>
parents: 1134
diff changeset
124 if post_revision:
1224
e76833cd555a files: fixes error when passing a diff without parameters and caused server crash
Marcin Kuzminski <marcin@python-works.com>
parents: 1212
diff changeset
125 cs = self.__get_cs_or_redirect(post_revision, repo_name)
636
ffd07396d315 Fixes for raw_id, needed for git
Marcin Kuzminski <marcin@python-works.com>
parents: 629
diff changeset
126
1137
82344ce0a892 clean and fixes in files controller
Marcin Kuzminski <marcin@python-works.com>
parents: 1134
diff changeset
127 c.changeset = self.__get_cs_or_redirect(revision, repo_name)
82344ce0a892 clean and fixes in files controller
Marcin Kuzminski <marcin@python-works.com>
parents: 1134
diff changeset
128 c.branch = request.GET.get('branch', None)
82344ce0a892 clean and fixes in files controller
Marcin Kuzminski <marcin@python-works.com>
parents: 1134
diff changeset
129 c.f_path = f_path
2177
ee07357d9265 unified annotation view with file source view
Marcin Kuzminski <marcin@python-works.com>
parents: 2109
diff changeset
130 c.annotate = annotate
3237
f5dd76e2a7af disable file editing when not on branch head fixes issue #462
Marcin Kuzminski <marcin@python-works.com>
parents: 3061
diff changeset
131 c.changeset = self.__get_cs_or_redirect(revision, repo_name)
1137
82344ce0a892 clean and fixes in files controller
Marcin Kuzminski <marcin@python-works.com>
parents: 1134
diff changeset
132 cur_rev = c.changeset.revision
636
ffd07396d315 Fixes for raw_id, needed for git
Marcin Kuzminski <marcin@python-works.com>
parents: 629
diff changeset
133
1789
17caf4efe15c implements #308 rewrote diffs to enable displaying full diff on each file
Marcin Kuzminski <marcin@python-works.com>
parents: 1768
diff changeset
134 # prev link
1137
82344ce0a892 clean and fixes in files controller
Marcin Kuzminski <marcin@python-works.com>
parents: 1134
diff changeset
135 try:
82344ce0a892 clean and fixes in files controller
Marcin Kuzminski <marcin@python-works.com>
parents: 1134
diff changeset
136 prev_rev = c.rhodecode_repo.get_changeset(cur_rev).prev(c.branch)
82344ce0a892 clean and fixes in files controller
Marcin Kuzminski <marcin@python-works.com>
parents: 1134
diff changeset
137 c.url_prev = url('files_home', repo_name=c.repo_name,
82344ce0a892 clean and fixes in files controller
Marcin Kuzminski <marcin@python-works.com>
parents: 1134
diff changeset
138 revision=prev_rev.raw_id, f_path=f_path)
82344ce0a892 clean and fixes in files controller
Marcin Kuzminski <marcin@python-works.com>
parents: 1134
diff changeset
139 if c.branch:
82344ce0a892 clean and fixes in files controller
Marcin Kuzminski <marcin@python-works.com>
parents: 1134
diff changeset
140 c.url_prev += '?branch=%s' % c.branch
82344ce0a892 clean and fixes in files controller
Marcin Kuzminski <marcin@python-works.com>
parents: 1134
diff changeset
141 except (ChangesetDoesNotExistError, VCSError):
82344ce0a892 clean and fixes in files controller
Marcin Kuzminski <marcin@python-works.com>
parents: 1134
diff changeset
142 c.url_prev = '#'
883
20ed6f6a6329 Changed prev/next in file browser to new vcs methods
Marcin Kuzminski <marcin@python-works.com>
parents: 872
diff changeset
143
1789
17caf4efe15c implements #308 rewrote diffs to enable displaying full diff on each file
Marcin Kuzminski <marcin@python-works.com>
parents: 1768
diff changeset
144 # next link
1137
82344ce0a892 clean and fixes in files controller
Marcin Kuzminski <marcin@python-works.com>
parents: 1134
diff changeset
145 try:
82344ce0a892 clean and fixes in files controller
Marcin Kuzminski <marcin@python-works.com>
parents: 1134
diff changeset
146 next_rev = c.rhodecode_repo.get_changeset(cur_rev).next(c.branch)
82344ce0a892 clean and fixes in files controller
Marcin Kuzminski <marcin@python-works.com>
parents: 1134
diff changeset
147 c.url_next = url('files_home', repo_name=c.repo_name,
82344ce0a892 clean and fixes in files controller
Marcin Kuzminski <marcin@python-works.com>
parents: 1134
diff changeset
148 revision=next_rev.raw_id, f_path=f_path)
82344ce0a892 clean and fixes in files controller
Marcin Kuzminski <marcin@python-works.com>
parents: 1134
diff changeset
149 if c.branch:
82344ce0a892 clean and fixes in files controller
Marcin Kuzminski <marcin@python-works.com>
parents: 1134
diff changeset
150 c.url_next += '?branch=%s' % c.branch
82344ce0a892 clean and fixes in files controller
Marcin Kuzminski <marcin@python-works.com>
parents: 1134
diff changeset
151 except (ChangesetDoesNotExistError, VCSError):
82344ce0a892 clean and fixes in files controller
Marcin Kuzminski <marcin@python-works.com>
parents: 1134
diff changeset
152 c.url_next = '#'
636
ffd07396d315 Fixes for raw_id, needed for git
Marcin Kuzminski <marcin@python-works.com>
parents: 629
diff changeset
153
1789
17caf4efe15c implements #308 rewrote diffs to enable displaying full diff on each file
Marcin Kuzminski <marcin@python-works.com>
parents: 1768
diff changeset
154 # files or dirs
1137
82344ce0a892 clean and fixes in files controller
Marcin Kuzminski <marcin@python-works.com>
parents: 1134
diff changeset
155 try:
1737
61eda8bf70d0 new files views
Marcin Kuzminski <marcin@python-works.com>
parents: 1664
diff changeset
156 c.file = c.changeset.get_node(f_path)
1190
0d7a127e6449 use cs get history instead of node.history, node history have to much reference calls
Marcin Kuzminski <marcin@python-works.com>
parents: 1189
diff changeset
157
1737
61eda8bf70d0 new files views
Marcin Kuzminski <marcin@python-works.com>
parents: 1664
diff changeset
158 if c.file.is_file():
3001
37c7abd34d44 implements #636, lazy loading of history and authors to speed up page responsiveness.
Marcin Kuzminski <marcin@python-works.com>
parents: 2995
diff changeset
159 c.load_full_history = False
37c7abd34d44 implements #636, lazy loading of history and authors to speed up page responsiveness.
Marcin Kuzminski <marcin@python-works.com>
parents: 2995
diff changeset
160 file_last_cs = c.file.last_changeset
37c7abd34d44 implements #636, lazy loading of history and authors to speed up page responsiveness.
Marcin Kuzminski <marcin@python-works.com>
parents: 2995
diff changeset
161 c.file_changeset = (c.changeset
37c7abd34d44 implements #636, lazy loading of history and authors to speed up page responsiveness.
Marcin Kuzminski <marcin@python-works.com>
parents: 2995
diff changeset
162 if c.changeset.revision < file_last_cs.revision
37c7abd34d44 implements #636, lazy loading of history and authors to speed up page responsiveness.
Marcin Kuzminski <marcin@python-works.com>
parents: 2995
diff changeset
163 else file_last_cs)
3237
f5dd76e2a7af disable file editing when not on branch head fixes issue #462
Marcin Kuzminski <marcin@python-works.com>
parents: 3061
diff changeset
164 #determine if we're on branch head
f5dd76e2a7af disable file editing when not on branch head fixes issue #462
Marcin Kuzminski <marcin@python-works.com>
parents: 3061
diff changeset
165 _branches = c.rhodecode_repo.branches
3267
7b74079beec9 coding style: fix trailing and leading spaces and tabs
Mads Kiilerich <madski@unity3d.com>
parents: 3237
diff changeset
166 c.on_branch_head = revision in _branches.keys() + _branches.values()
3001
37c7abd34d44 implements #636, lazy loading of history and authors to speed up page responsiveness.
Marcin Kuzminski <marcin@python-works.com>
parents: 2995
diff changeset
167 _hist = []
37c7abd34d44 implements #636, lazy loading of history and authors to speed up page responsiveness.
Marcin Kuzminski <marcin@python-works.com>
parents: 2995
diff changeset
168 c.file_history = []
37c7abd34d44 implements #636, lazy loading of history and authors to speed up page responsiveness.
Marcin Kuzminski <marcin@python-works.com>
parents: 2995
diff changeset
169 if c.load_full_history:
37c7abd34d44 implements #636, lazy loading of history and authors to speed up page responsiveness.
Marcin Kuzminski <marcin@python-works.com>
parents: 2995
diff changeset
170 c.file_history, _hist = self._get_node_history(c.changeset, f_path)
37c7abd34d44 implements #636, lazy loading of history and authors to speed up page responsiveness.
Marcin Kuzminski <marcin@python-works.com>
parents: 2995
diff changeset
171
2456
51b203e44202 Add authors into file view
Marcin Kuzminski <marcin@python-works.com>
parents: 2428
diff changeset
172 c.authors = []
51b203e44202 Add authors into file view
Marcin Kuzminski <marcin@python-works.com>
parents: 2428
diff changeset
173 for a in set([x.author for x in _hist]):
51b203e44202 Add authors into file view
Marcin Kuzminski <marcin@python-works.com>
parents: 2428
diff changeset
174 c.authors.append((h.email(a), h.person(a)))
1190
0d7a127e6449 use cs get history instead of node.history, node history have to much reference calls
Marcin Kuzminski <marcin@python-works.com>
parents: 1189
diff changeset
175 else:
2456
51b203e44202 Add authors into file view
Marcin Kuzminski <marcin@python-works.com>
parents: 2428
diff changeset
176 c.authors = c.file_history = []
644
c8bd0e6cc3da some changes for #45.
Marcin Kuzminski <marcin@python-works.com>
parents: 636
diff changeset
177 except RepositoryError, e:
3621
fe012b7df29d missing files or bad files revisions should return 404s not redirects - ref #808
Marcin Kuzminski <marcin@python-works.com>
parents: 3591
diff changeset
178 h.flash(str(e), category='error')
fe012b7df29d missing files or bad files revisions should return 404s not redirects - ref #808
Marcin Kuzminski <marcin@python-works.com>
parents: 3591
diff changeset
179 raise HTTPNotFound()
644
c8bd0e6cc3da some changes for #45.
Marcin Kuzminski <marcin@python-works.com>
parents: 636
diff changeset
180
2686
269c6e0b54cc Reimplemented file-browser using partial-ajax
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
181 if request.environ.get('HTTP_X_PARTIAL_XHR'):
269c6e0b54cc Reimplemented file-browser using partial-ajax
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
182 return render('files/files_ypjax.html')
269c6e0b54cc Reimplemented file-browser using partial-ajax
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
183
128
9deb6f1d5b90 Implemented file history.
Marcin Kuzminski <marcin@python-works.com>
parents: 106
diff changeset
184 return render('files/files.html')
9deb6f1d5b90 Implemented file history.
Marcin Kuzminski <marcin@python-works.com>
parents: 106
diff changeset
185
3749
b950b884ab87 auth decorators are not used anymore on __before__
Marcin Kuzminski <marcin@python-works.com>
parents: 3654
diff changeset
186 @LoginRequired()
b950b884ab87 auth decorators are not used anymore on __before__
Marcin Kuzminski <marcin@python-works.com>
parents: 3654
diff changeset
187 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
b950b884ab87 auth decorators are not used anymore on __before__
Marcin Kuzminski <marcin@python-works.com>
parents: 3654
diff changeset
188 'repository.admin')
3001
37c7abd34d44 implements #636, lazy loading of history and authors to speed up page responsiveness.
Marcin Kuzminski <marcin@python-works.com>
parents: 2995
diff changeset
189 def history(self, repo_name, revision, f_path, annotate=False):
37c7abd34d44 implements #636, lazy loading of history and authors to speed up page responsiveness.
Marcin Kuzminski <marcin@python-works.com>
parents: 2995
diff changeset
190 if request.environ.get('HTTP_X_PARTIAL_XHR'):
37c7abd34d44 implements #636, lazy loading of history and authors to speed up page responsiveness.
Marcin Kuzminski <marcin@python-works.com>
parents: 2995
diff changeset
191 c.changeset = self.__get_cs_or_redirect(revision, repo_name)
37c7abd34d44 implements #636, lazy loading of history and authors to speed up page responsiveness.
Marcin Kuzminski <marcin@python-works.com>
parents: 2995
diff changeset
192 c.f_path = f_path
37c7abd34d44 implements #636, lazy loading of history and authors to speed up page responsiveness.
Marcin Kuzminski <marcin@python-works.com>
parents: 2995
diff changeset
193 c.annotate = annotate
37c7abd34d44 implements #636, lazy loading of history and authors to speed up page responsiveness.
Marcin Kuzminski <marcin@python-works.com>
parents: 2995
diff changeset
194 c.file = c.changeset.get_node(f_path)
37c7abd34d44 implements #636, lazy loading of history and authors to speed up page responsiveness.
Marcin Kuzminski <marcin@python-works.com>
parents: 2995
diff changeset
195 if c.file.is_file():
37c7abd34d44 implements #636, lazy loading of history and authors to speed up page responsiveness.
Marcin Kuzminski <marcin@python-works.com>
parents: 2995
diff changeset
196 file_last_cs = c.file.last_changeset
37c7abd34d44 implements #636, lazy loading of history and authors to speed up page responsiveness.
Marcin Kuzminski <marcin@python-works.com>
parents: 2995
diff changeset
197 c.file_changeset = (c.changeset
37c7abd34d44 implements #636, lazy loading of history and authors to speed up page responsiveness.
Marcin Kuzminski <marcin@python-works.com>
parents: 2995
diff changeset
198 if c.changeset.revision < file_last_cs.revision
37c7abd34d44 implements #636, lazy loading of history and authors to speed up page responsiveness.
Marcin Kuzminski <marcin@python-works.com>
parents: 2995
diff changeset
199 else file_last_cs)
37c7abd34d44 implements #636, lazy loading of history and authors to speed up page responsiveness.
Marcin Kuzminski <marcin@python-works.com>
parents: 2995
diff changeset
200 c.file_history, _hist = self._get_node_history(c.changeset, f_path)
37c7abd34d44 implements #636, lazy loading of history and authors to speed up page responsiveness.
Marcin Kuzminski <marcin@python-works.com>
parents: 2995
diff changeset
201 c.authors = []
37c7abd34d44 implements #636, lazy loading of history and authors to speed up page responsiveness.
Marcin Kuzminski <marcin@python-works.com>
parents: 2995
diff changeset
202 for a in set([x.author for x in _hist]):
37c7abd34d44 implements #636, lazy loading of history and authors to speed up page responsiveness.
Marcin Kuzminski <marcin@python-works.com>
parents: 2995
diff changeset
203 c.authors.append((h.email(a), h.person(a)))
37c7abd34d44 implements #636, lazy loading of history and authors to speed up page responsiveness.
Marcin Kuzminski <marcin@python-works.com>
parents: 2995
diff changeset
204 return render('files/files_history_box.html')
37c7abd34d44 implements #636, lazy loading of history and authors to speed up page responsiveness.
Marcin Kuzminski <marcin@python-works.com>
parents: 2995
diff changeset
205
2457
01e005cabd4d moved login required into seperate calls for files due to optional API access option
Marcin Kuzminski <marcin@python-works.com>
parents: 2456
diff changeset
206 @LoginRequired()
1305
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
207 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
208 'repository.admin')
147
873fd2dc62c2 Added rawfile support, and few fixes for file
Marcin Kuzminski <marcin@python-works.com>
parents: 145
diff changeset
209 def rawfile(self, repo_name, revision, f_path):
1137
82344ce0a892 clean and fixes in files controller
Marcin Kuzminski <marcin@python-works.com>
parents: 1134
diff changeset
210 cs = self.__get_cs_or_redirect(revision, repo_name)
1189
a4e1b955fe07 fixes for rawfile, annotation, download. It will check now if it's a filenode.
Marcin Kuzminski <marcin@python-works.com>
parents: 1151
diff changeset
211 file_node = self.__get_filenode_or_redirect(repo_name, cs, f_path)
1045
3fc9183e05dd another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents: 1044
diff changeset
212
1189
a4e1b955fe07 fixes for rawfile, annotation, download. It will check now if it's a filenode.
Marcin Kuzminski <marcin@python-works.com>
parents: 1151
diff changeset
213 response.content_disposition = 'attachment; filename=%s' % \
2255
95800dad44d0 fixes for tests on Windows
Marcin Kuzminski <marcin@python-works.com>
parents: 2199
diff changeset
214 safe_str(f_path.split(Repository.url_sep())[-1])
1189
a4e1b955fe07 fixes for rawfile, annotation, download. It will check now if it's a filenode.
Marcin Kuzminski <marcin@python-works.com>
parents: 1151
diff changeset
215
160
0f7f93df5802 implemented rawdiff and diff download into diff view.
Marcin Kuzminski <marcin@python-works.com>
parents: 158
diff changeset
216 response.content_type = file_node.mimetype
147
873fd2dc62c2 Added rawfile support, and few fixes for file
Marcin Kuzminski <marcin@python-works.com>
parents: 145
diff changeset
217 return file_node.content
2461
015a42e970a6 whitespace cleanup
Marcin Kuzminski <marcin@python-works.com>
parents: 2457
diff changeset
218
2457
01e005cabd4d moved login required into seperate calls for files due to optional API access option
Marcin Kuzminski <marcin@python-works.com>
parents: 2456
diff changeset
219 @LoginRequired()
1305
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
220 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
221 'repository.admin')
485
9836541b0509 added limit for showing pygemntized source codes larger than 250kb.
Marcin Kuzminski <marcin@python-works.com>
parents: 438
diff changeset
222 def raw(self, repo_name, revision, f_path):
1137
82344ce0a892 clean and fixes in files controller
Marcin Kuzminski <marcin@python-works.com>
parents: 1134
diff changeset
223 cs = self.__get_cs_or_redirect(revision, repo_name)
1189
a4e1b955fe07 fixes for rawfile, annotation, download. It will check now if it's a filenode.
Marcin Kuzminski <marcin@python-works.com>
parents: 1151
diff changeset
224 file_node = self.__get_filenode_or_redirect(repo_name, cs, f_path)
1045
3fc9183e05dd another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents: 1044
diff changeset
225
1241
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
226 raw_mimetype_mapping = {
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
227 # map original mimetype to a mimetype used for "show as raw"
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
228 # you can also provide a content-disposition to override the
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
229 # default "attachment" disposition.
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
230 # orig_type: (new_type, new_dispo)
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
231
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
232 # show images inline:
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
233 'image/x-icon': ('image/x-icon', 'inline'),
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
234 'image/png': ('image/png', 'inline'),
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
235 'image/gif': ('image/gif', 'inline'),
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
236 'image/jpeg': ('image/jpeg', 'inline'),
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
237 'image/svg+xml': ('image/svg+xml', 'inline'),
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
238 }
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
239
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
240 mimetype = file_node.mimetype
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
241 try:
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
242 mimetype, dispo = raw_mimetype_mapping[mimetype]
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
243 except KeyError:
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
244 # we don't know anything special about this, handle it safely
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
245 if file_node.is_binary:
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
246 # do same as download raw for binary files
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
247 mimetype, dispo = 'application/octet-stream', 'attachment'
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
248 else:
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
249 # do not just use the original mimetype, but force text/plain,
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
250 # otherwise it would serve text/html and that might be unsafe.
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
251 # Note: underlying vcs library fakes text/plain mimetype if the
1245
5f2fbab7c429 PEP8ify - controllers
Marcin Kuzminski <marcin@python-works.com>
parents: 1241
diff changeset
252 # mimetype can not be determined and it thinks it is not
5f2fbab7c429 PEP8ify - controllers
Marcin Kuzminski <marcin@python-works.com>
parents: 1241
diff changeset
253 # binary.This might lead to erroneous text display in some
5f2fbab7c429 PEP8ify - controllers
Marcin Kuzminski <marcin@python-works.com>
parents: 1241
diff changeset
254 # cases, but helps in other cases, like with text files
5f2fbab7c429 PEP8ify - controllers
Marcin Kuzminski <marcin@python-works.com>
parents: 1241
diff changeset
255 # without extension.
1241
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
256 mimetype, dispo = 'text/plain', 'inline'
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
257
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
258 if dispo == 'attachment':
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
259 dispo = 'attachment; filename=%s' % \
1401
b7563ad4e7ee Unicode fixes, added safe_str method for global str() operations +better test sandboxing
Marcin Kuzminski <marcin@python-works.com>
parents: 1313
diff changeset
260 safe_str(f_path.split(os.sep)[-1])
1241
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
261
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
262 response.content_disposition = dispo
ed5270522724 changed raw action to show images instead of saying about binary file
Marcin Kuzminski <marcin@python-works.com>
parents: 1224
diff changeset
263 response.content_type = mimetype
485
9836541b0509 added limit for showing pygemntized source codes larger than 250kb.
Marcin Kuzminski <marcin@python-works.com>
parents: 438
diff changeset
264 return file_node.content
636
ffd07396d315 Fixes for raw_id, needed for git
Marcin Kuzminski <marcin@python-works.com>
parents: 629
diff changeset
265
2457
01e005cabd4d moved login required into seperate calls for files due to optional API access option
Marcin Kuzminski <marcin@python-works.com>
parents: 2456
diff changeset
266 @LoginRequired()
1305
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
267 @HasRepoPermissionAnyDecorator('repository.write', 'repository.admin')
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
268 def edit(self, repo_name, revision, f_path):
3237
f5dd76e2a7af disable file editing when not on branch head fixes issue #462
Marcin Kuzminski <marcin@python-works.com>
parents: 3061
diff changeset
269 repo = c.rhodecode_db_repo
2727
5899fe08f063 Forbid adding files and editing from web interface while repo is locked
Marcin Kuzminski <marcin@python-works.com>
parents: 2688
diff changeset
270 if repo.enable_locking and repo.locked[0]:
5899fe08f063 Forbid adding files and editing from web interface while repo is locked
Marcin Kuzminski <marcin@python-works.com>
parents: 2688
diff changeset
271 h.flash(_('This repository is has been locked by %s on %s')
5899fe08f063 Forbid adding files and editing from web interface while repo is locked
Marcin Kuzminski <marcin@python-works.com>
parents: 2688
diff changeset
272 % (h.person_by_id(repo.locked[0]),
5899fe08f063 Forbid adding files and editing from web interface while repo is locked
Marcin Kuzminski <marcin@python-works.com>
parents: 2688
diff changeset
273 h.fmt_date(h.time_to_datetime(repo.locked[1]))),
5899fe08f063 Forbid adding files and editing from web interface while repo is locked
Marcin Kuzminski <marcin@python-works.com>
parents: 2688
diff changeset
274 'warning')
5899fe08f063 Forbid adding files and editing from web interface while repo is locked
Marcin Kuzminski <marcin@python-works.com>
parents: 2688
diff changeset
275 return redirect(h.url('files_home',
5899fe08f063 Forbid adding files and editing from web interface while repo is locked
Marcin Kuzminski <marcin@python-works.com>
parents: 2688
diff changeset
276 repo_name=repo_name, revision='tip'))
5899fe08f063 Forbid adding files and editing from web interface while repo is locked
Marcin Kuzminski <marcin@python-works.com>
parents: 2688
diff changeset
277
3237
f5dd76e2a7af disable file editing when not on branch head fixes issue #462
Marcin Kuzminski <marcin@python-works.com>
parents: 3061
diff changeset
278 # check if revision is a branch identifier- basically we cannot
f5dd76e2a7af disable file editing when not on branch head fixes issue #462
Marcin Kuzminski <marcin@python-works.com>
parents: 3061
diff changeset
279 # create multiple heads via file editing
f5dd76e2a7af disable file editing when not on branch head fixes issue #462
Marcin Kuzminski <marcin@python-works.com>
parents: 3061
diff changeset
280 _branches = repo.scm_instance.branches
f5dd76e2a7af disable file editing when not on branch head fixes issue #462
Marcin Kuzminski <marcin@python-works.com>
parents: 3061
diff changeset
281 # check if revision is a branch name or branch hash
f5dd76e2a7af disable file editing when not on branch head fixes issue #462
Marcin Kuzminski <marcin@python-works.com>
parents: 3061
diff changeset
282 if revision not in _branches.keys() + _branches.values():
f5dd76e2a7af disable file editing when not on branch head fixes issue #462
Marcin Kuzminski <marcin@python-works.com>
parents: 3061
diff changeset
283 h.flash(_('You can only edit files with revision '
f5dd76e2a7af disable file editing when not on branch head fixes issue #462
Marcin Kuzminski <marcin@python-works.com>
parents: 3061
diff changeset
284 'being a valid branch '), category='warning')
f5dd76e2a7af disable file editing when not on branch head fixes issue #462
Marcin Kuzminski <marcin@python-works.com>
parents: 3061
diff changeset
285 return redirect(h.url('files_home',
f5dd76e2a7af disable file editing when not on branch head fixes issue #462
Marcin Kuzminski <marcin@python-works.com>
parents: 3061
diff changeset
286 repo_name=repo_name, revision='tip',
f5dd76e2a7af disable file editing when not on branch head fixes issue #462
Marcin Kuzminski <marcin@python-works.com>
parents: 3061
diff changeset
287 f_path=f_path))
f5dd76e2a7af disable file editing when not on branch head fixes issue #462
Marcin Kuzminski <marcin@python-works.com>
parents: 3061
diff changeset
288
1305
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
289 r_post = request.POST
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
290
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
291 c.cs = self.__get_cs_or_redirect(revision, repo_name)
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
292 c.file = self.__get_filenode_or_redirect(repo_name, c.cs, f_path)
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
293
1313
856be614d9a4 disabled edition of binary files
Marcin Kuzminski <marcin@python-works.com>
parents: 1312
diff changeset
294 if c.file.is_binary:
856be614d9a4 disabled edition of binary files
Marcin Kuzminski <marcin@python-works.com>
parents: 1312
diff changeset
295 return redirect(url('files_home', repo_name=c.repo_name,
856be614d9a4 disabled edition of binary files
Marcin Kuzminski <marcin@python-works.com>
parents: 1312
diff changeset
296 revision=c.cs.raw_id, f_path=f_path))
3237
f5dd76e2a7af disable file editing when not on branch head fixes issue #462
Marcin Kuzminski <marcin@python-works.com>
parents: 3061
diff changeset
297 c.default_message = _('Edited file %s via RhodeCode') % (f_path)
1305
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
298 c.f_path = f_path
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
299
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
300 if r_post:
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
301
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
302 old_content = c.file.content
1306
6e1d24503383 Added support for ascendent characters for inMemoryCommit
Marcin Kuzminski <marcin@python-works.com>
parents: 1305
diff changeset
303 sl = old_content.splitlines(1)
6e1d24503383 Added support for ascendent characters for inMemoryCommit
Marcin Kuzminski <marcin@python-works.com>
parents: 1305
diff changeset
304 first_line = sl[0] if sl else ''
1305
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
305 # modes: 0 - Unix, 1 - Mac, 2 - DOS
1306
6e1d24503383 Added support for ascendent characters for inMemoryCommit
Marcin Kuzminski <marcin@python-works.com>
parents: 1305
diff changeset
306 mode = detect_mode(first_line, 0)
3839
9dec870411e0 Added more tests for web based file edit and add
Marcin Kuzminski <marcin@python-works.com>
parents: 3749
diff changeset
307 content = convert_line_endings(r_post.get('content', ''), mode)
1306
6e1d24503383 Added support for ascendent characters for inMemoryCommit
Marcin Kuzminski <marcin@python-works.com>
parents: 1305
diff changeset
308
3237
f5dd76e2a7af disable file editing when not on branch head fixes issue #462
Marcin Kuzminski <marcin@python-works.com>
parents: 3061
diff changeset
309 message = r_post.get('message') or c.default_message
1311
6705eeebc41b moved out commit into scm model, and added cache invalidation after commit.
Marcin Kuzminski <marcin@python-works.com>
parents: 1308
diff changeset
310 author = self.rhodecode_user.full_contact
1305
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
311
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
312 if content == old_content:
3621
fe012b7df29d missing files or bad files revisions should return 404s not redirects - ref #808
Marcin Kuzminski <marcin@python-works.com>
parents: 3591
diff changeset
313 h.flash(_('No changes'), category='warning')
1306
6e1d24503383 Added support for ascendent characters for inMemoryCommit
Marcin Kuzminski <marcin@python-works.com>
parents: 1305
diff changeset
314 return redirect(url('changeset_home', repo_name=c.repo_name,
6e1d24503383 Added support for ascendent characters for inMemoryCommit
Marcin Kuzminski <marcin@python-works.com>
parents: 1305
diff changeset
315 revision='tip'))
1305
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
316 try:
1311
6705eeebc41b moved out commit into scm model, and added cache invalidation after commit.
Marcin Kuzminski <marcin@python-works.com>
parents: 1308
diff changeset
317 self.scm_model.commit_change(repo=c.rhodecode_repo,
6705eeebc41b moved out commit into scm model, and added cache invalidation after commit.
Marcin Kuzminski <marcin@python-works.com>
parents: 1308
diff changeset
318 repo_name=repo_name, cs=c.cs,
3487
b39cb4d4e0be it's safer to user user_id for IMC
Marcin Kuzminski <marcin@python-works.com>
parents: 3440
diff changeset
319 user=self.rhodecode_user.user_id,
1311
6705eeebc41b moved out commit into scm model, and added cache invalidation after commit.
Marcin Kuzminski <marcin@python-works.com>
parents: 1308
diff changeset
320 author=author, message=message,
6705eeebc41b moved out commit into scm model, and added cache invalidation after commit.
Marcin Kuzminski <marcin@python-works.com>
parents: 1308
diff changeset
321 content=content, f_path=f_path)
2570
94ae02ca5f00 i18n improve
Takumi IINO <trot.thunder@gmail.com>
parents: 2536
diff changeset
322 h.flash(_('Successfully committed to %s') % f_path,
1305
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
323 category='success')
1306
6e1d24503383 Added support for ascendent characters for inMemoryCommit
Marcin Kuzminski <marcin@python-works.com>
parents: 1305
diff changeset
324
1311
6705eeebc41b moved out commit into scm model, and added cache invalidation after commit.
Marcin Kuzminski <marcin@python-works.com>
parents: 1308
diff changeset
325 except Exception:
1305
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
326 log.error(traceback.format_exc())
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
327 h.flash(_('Error occurred during commit'), category='error')
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
328 return redirect(url('changeset_home',
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
329 repo_name=c.repo_name, revision='tip'))
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
330
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
331 return render('files/files_edit.html')
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
332
2457
01e005cabd4d moved login required into seperate calls for files due to optional API access option
Marcin Kuzminski <marcin@python-works.com>
parents: 2456
diff changeset
333 @LoginRequired()
1483
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
334 @HasRepoPermissionAnyDecorator('repository.write', 'repository.admin')
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
335 def add(self, repo_name, revision, f_path):
2727
5899fe08f063 Forbid adding files and editing from web interface while repo is locked
Marcin Kuzminski <marcin@python-works.com>
parents: 2688
diff changeset
336
5899fe08f063 Forbid adding files and editing from web interface while repo is locked
Marcin Kuzminski <marcin@python-works.com>
parents: 2688
diff changeset
337 repo = Repository.get_by_repo_name(repo_name)
5899fe08f063 Forbid adding files and editing from web interface while repo is locked
Marcin Kuzminski <marcin@python-works.com>
parents: 2688
diff changeset
338 if repo.enable_locking and repo.locked[0]:
5899fe08f063 Forbid adding files and editing from web interface while repo is locked
Marcin Kuzminski <marcin@python-works.com>
parents: 2688
diff changeset
339 h.flash(_('This repository is has been locked by %s on %s')
5899fe08f063 Forbid adding files and editing from web interface while repo is locked
Marcin Kuzminski <marcin@python-works.com>
parents: 2688
diff changeset
340 % (h.person_by_id(repo.locked[0]),
5899fe08f063 Forbid adding files and editing from web interface while repo is locked
Marcin Kuzminski <marcin@python-works.com>
parents: 2688
diff changeset
341 h.fmt_date(h.time_to_datetime(repo.locked[1]))),
5899fe08f063 Forbid adding files and editing from web interface while repo is locked
Marcin Kuzminski <marcin@python-works.com>
parents: 2688
diff changeset
342 'warning')
5899fe08f063 Forbid adding files and editing from web interface while repo is locked
Marcin Kuzminski <marcin@python-works.com>
parents: 2688
diff changeset
343 return redirect(h.url('files_home',
5899fe08f063 Forbid adding files and editing from web interface while repo is locked
Marcin Kuzminski <marcin@python-works.com>
parents: 2688
diff changeset
344 repo_name=repo_name, revision='tip'))
5899fe08f063 Forbid adding files and editing from web interface while repo is locked
Marcin Kuzminski <marcin@python-works.com>
parents: 2688
diff changeset
345
1483
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
346 r_post = request.POST
1485
269905fac50a added uploading of files from web interface directly into repo
Marcin Kuzminski <marcin@python-works.com>
parents: 1484
diff changeset
347 c.cs = self.__get_cs_or_redirect(revision, repo_name,
1483
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
348 redirect_after=False)
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
349 if c.cs is None:
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
350 c.cs = EmptyChangeset(alias=c.rhodecode_repo.alias)
3237
f5dd76e2a7af disable file editing when not on branch head fixes issue #462
Marcin Kuzminski <marcin@python-works.com>
parents: 3061
diff changeset
351 c.default_message = (_('Added file via RhodeCode'))
1483
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
352 c.f_path = f_path
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
353
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
354 if r_post:
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
355 unix_mode = 0
3839
9dec870411e0 Added more tests for web based file edit and add
Marcin Kuzminski <marcin@python-works.com>
parents: 3749
diff changeset
356 content = convert_line_endings(r_post.get('content', ''), unix_mode)
1483
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
357
3237
f5dd76e2a7af disable file editing when not on branch head fixes issue #462
Marcin Kuzminski <marcin@python-works.com>
parents: 3061
diff changeset
358 message = r_post.get('message') or c.default_message
3559
328eb707fe3f added more strict checks for file path in add file controller
Marcin Kuzminski <marcin@python-works.com>
parents: 3547
diff changeset
359 filename = r_post.get('filename')
3839
9dec870411e0 Added more tests for web based file edit and add
Marcin Kuzminski <marcin@python-works.com>
parents: 3749
diff changeset
360 location = r_post.get('location', '')
1485
269905fac50a added uploading of files from web interface directly into repo
Marcin Kuzminski <marcin@python-works.com>
parents: 1484
diff changeset
361 file_obj = r_post.get('upload_file', None)
269905fac50a added uploading of files from web interface directly into repo
Marcin Kuzminski <marcin@python-works.com>
parents: 1484
diff changeset
362
269905fac50a added uploading of files from web interface directly into repo
Marcin Kuzminski <marcin@python-works.com>
parents: 1484
diff changeset
363 if file_obj is not None and hasattr(file_obj, 'filename'):
269905fac50a added uploading of files from web interface directly into repo
Marcin Kuzminski <marcin@python-works.com>
parents: 1484
diff changeset
364 filename = file_obj.filename
269905fac50a added uploading of files from web interface directly into repo
Marcin Kuzminski <marcin@python-works.com>
parents: 1484
diff changeset
365 content = file_obj.file
269905fac50a added uploading of files from web interface directly into repo
Marcin Kuzminski <marcin@python-works.com>
parents: 1484
diff changeset
366
1483
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
367 if not content:
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
368 h.flash(_('No content'), category='warning')
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
369 return redirect(url('changeset_home', repo_name=c.repo_name,
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
370 revision='tip'))
1484
1db451a44504 fixed small issues with adding new filenodes
Marcin Kuzminski <marcin@python-works.com>
parents: 1483
diff changeset
371 if not filename:
1db451a44504 fixed small issues with adding new filenodes
Marcin Kuzminski <marcin@python-works.com>
parents: 1483
diff changeset
372 h.flash(_('No filename'), category='warning')
1db451a44504 fixed small issues with adding new filenodes
Marcin Kuzminski <marcin@python-works.com>
parents: 1483
diff changeset
373 return redirect(url('changeset_home', repo_name=c.repo_name,
1485
269905fac50a added uploading of files from web interface directly into repo
Marcin Kuzminski <marcin@python-works.com>
parents: 1484
diff changeset
374 revision='tip'))
3840
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3839
diff changeset
375 #strip all crap out of file, just leave the basename
3559
328eb707fe3f added more strict checks for file path in add file controller
Marcin Kuzminski <marcin@python-works.com>
parents: 3547
diff changeset
376 filename = os.path.basename(filename)
328eb707fe3f added more strict checks for file path in add file controller
Marcin Kuzminski <marcin@python-works.com>
parents: 3547
diff changeset
377 node_path = os.path.join(location, filename)
328eb707fe3f added more strict checks for file path in add file controller
Marcin Kuzminski <marcin@python-works.com>
parents: 3547
diff changeset
378 author = self.rhodecode_user.full_contact
1483
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
379
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
380 try:
3840
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3839
diff changeset
381 nodes = {
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3839
diff changeset
382 node_path: {
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3839
diff changeset
383 'content': content
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3839
diff changeset
384 }
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3839
diff changeset
385 }
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3839
diff changeset
386 self.scm_model.create_nodes(
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3839
diff changeset
387 user=c.rhodecode_user.user_id, repo=c.rhodecode_db_repo,
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3839
diff changeset
388 message=message,
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3839
diff changeset
389 nodes=nodes,
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3839
diff changeset
390 parent_cs=c.cs,
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3839
diff changeset
391 author=author,
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3839
diff changeset
392 )
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3839
diff changeset
393
2570
94ae02ca5f00 i18n improve
Takumi IINO <trot.thunder@gmail.com>
parents: 2536
diff changeset
394 h.flash(_('Successfully committed to %s') % node_path,
1483
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
395 category='success')
3840
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3839
diff changeset
396 except NonRelativePathError, e:
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3839
diff changeset
397 h.flash(_('Location must be relative path and must not '
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3839
diff changeset
398 'contain .. in path'), category='warning')
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3839
diff changeset
399 return redirect(url('changeset_home', repo_name=c.repo_name,
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3839
diff changeset
400 revision='tip'))
3559
328eb707fe3f added more strict checks for file path in add file controller
Marcin Kuzminski <marcin@python-works.com>
parents: 3547
diff changeset
401 except (NodeError, NodeAlreadyExistsError), e:
1485
269905fac50a added uploading of files from web interface directly into repo
Marcin Kuzminski <marcin@python-works.com>
parents: 1484
diff changeset
402 h.flash(_(e), category='error')
1483
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
403 except Exception:
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
404 log.error(traceback.format_exc())
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
405 h.flash(_('Error occurred during commit'), category='error')
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
406 return redirect(url('changeset_home',
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
407 repo_name=c.repo_name, revision='tip'))
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
408
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
409 return render('files/files_add.html')
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1480
diff changeset
410
2457
01e005cabd4d moved login required into seperate calls for files due to optional API access option
Marcin Kuzminski <marcin@python-works.com>
parents: 2456
diff changeset
411 @LoginRequired()
1305
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
412 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
413 'repository.admin')
872
b956e6f415a2 implemented #91,
Marcin Kuzminski <marcin@python-works.com>
parents: 813
diff changeset
414 def archivefile(self, repo_name, fname):
945
05b59c48556f fixed error when trying to make download on empty repository
Marcin Kuzminski <marcin@python-works.com>
parents: 942
diff changeset
415
942
32318ec7bfc1 added branch/tag options to download links in summary
Marcin Kuzminski <marcin@python-works.com>
parents: 915
diff changeset
416 fileformat = None
32318ec7bfc1 added branch/tag options to download links in summary
Marcin Kuzminski <marcin@python-works.com>
parents: 915
diff changeset
417 revision = None
948
85ee0ea183e7 fixed archival in rhodecode to use new functions from vcs
Marcin Kuzminski <marcin@python-works.com>
parents: 945
diff changeset
418 ext = None
1450
2a8bf2a3da98 fixes #214 added support for downloading subrepos in download menu.
Marcin Kuzminski <marcin@python-works.com>
parents: 1401
diff changeset
419 subrepos = request.GET.get('subrepos') == 'true'
945
05b59c48556f fixed error when trying to make download on empty repository
Marcin Kuzminski <marcin@python-works.com>
parents: 942
diff changeset
420
1480
daa29da0f783 fixes for vcs settings module
Marcin Kuzminski <marcin@python-works.com>
parents: 1452
diff changeset
421 for a_type, ext_data in settings.ARCHIVE_SPECS.items():
948
85ee0ea183e7 fixed archival in rhodecode to use new functions from vcs
Marcin Kuzminski <marcin@python-works.com>
parents: 945
diff changeset
422 archive_spec = fname.split(ext_data[1])
85ee0ea183e7 fixed archival in rhodecode to use new functions from vcs
Marcin Kuzminski <marcin@python-works.com>
parents: 945
diff changeset
423 if len(archive_spec) == 2 and archive_spec[1] == '':
85ee0ea183e7 fixed archival in rhodecode to use new functions from vcs
Marcin Kuzminski <marcin@python-works.com>
parents: 945
diff changeset
424 fileformat = a_type or ext_data[1]
942
32318ec7bfc1 added branch/tag options to download links in summary
Marcin Kuzminski <marcin@python-works.com>
parents: 915
diff changeset
425 revision = archive_spec[0]
948
85ee0ea183e7 fixed archival in rhodecode to use new functions from vcs
Marcin Kuzminski <marcin@python-works.com>
parents: 945
diff changeset
426 ext = ext_data[1]
872
b956e6f415a2 implemented #91,
Marcin Kuzminski <marcin@python-works.com>
parents: 813
diff changeset
427
b956e6f415a2 implemented #91,
Marcin Kuzminski <marcin@python-works.com>
parents: 813
diff changeset
428 try:
1045
3fc9183e05dd another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents: 1044
diff changeset
429 dbrepo = RepoModel().get_by_repo_name(repo_name)
3625
260a7a01b054 follow Python conventions for boolean values
Mads Kiilerich <madski@unity3d.com>
parents: 3621
diff changeset
430 if not dbrepo.enable_downloads:
3654
ec6354949623 Fix a lot of casings - use standard casing in most places
Mads Kiilerich <madski@unity3d.com>
parents: 3625
diff changeset
431 return _('Downloads disabled')
962
72f008ed9b18 implemented #84 downloads can be enabled/disabled per each repository from now.
Marcin Kuzminski <marcin@python-works.com>
parents: 961
diff changeset
432
1809
ef0066e95be5 fix archive download for git
Marcin Kuzminski <marcin@python-works.com>
parents: 1789
diff changeset
433 if c.rhodecode_repo.alias == 'hg':
ef0066e95be5 fix archive download for git
Marcin Kuzminski <marcin@python-works.com>
parents: 1789
diff changeset
434 # patch and reset hooks section of UI config to not run any
ef0066e95be5 fix archive download for git
Marcin Kuzminski <marcin@python-works.com>
parents: 1789
diff changeset
435 # hooks on fetching archives with subrepos
ef0066e95be5 fix archive download for git
Marcin Kuzminski <marcin@python-works.com>
parents: 1789
diff changeset
436 for k, v in c.rhodecode_repo._repo.ui.configitems('hooks'):
ef0066e95be5 fix archive download for git
Marcin Kuzminski <marcin@python-works.com>
parents: 1789
diff changeset
437 c.rhodecode_repo._repo.ui.setconfig('hooks', k, None)
1664
65386911df2a fixes issue with mercurial 2.0 and archival of subrepos.
Marcin Kuzminski <marcin@python-works.com>
parents: 1568
diff changeset
438
1045
3fc9183e05dd another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents: 1044
diff changeset
439 cs = c.rhodecode_repo.get_changeset(revision)
1480
daa29da0f783 fixes for vcs settings module
Marcin Kuzminski <marcin@python-works.com>
parents: 1452
diff changeset
440 content_type = settings.ARCHIVE_SPECS[fileformat][0]
872
b956e6f415a2 implemented #91,
Marcin Kuzminski <marcin@python-works.com>
parents: 813
diff changeset
441 except ChangesetDoesNotExistError:
b956e6f415a2 implemented #91,
Marcin Kuzminski <marcin@python-works.com>
parents: 813
diff changeset
442 return _('Unknown revision %s') % revision
945
05b59c48556f fixed error when trying to make download on empty repository
Marcin Kuzminski <marcin@python-works.com>
parents: 942
diff changeset
443 except EmptyRepositoryError:
05b59c48556f fixed error when trying to make download on empty repository
Marcin Kuzminski <marcin@python-works.com>
parents: 942
diff changeset
444 return _('Empty repository')
961
840ca7492dbe fixed typo in exception
Marcin Kuzminski <marcin@python-works.com>
parents: 953
diff changeset
445 except (ImproperArchiveTypeError, KeyError):
948
85ee0ea183e7 fixed archival in rhodecode to use new functions from vcs
Marcin Kuzminski <marcin@python-works.com>
parents: 945
diff changeset
446 return _('Unknown archive type')
3490
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
447 # archive cache
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
448 from rhodecode import CONFIG
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
449 rev_name = cs.raw_id[:12]
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
450 archive_name = '%s-%s%s' % (safe_str(repo_name.replace('/', '_')),
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
451 safe_str(rev_name), ext)
872
b956e6f415a2 implemented #91,
Marcin Kuzminski <marcin@python-works.com>
parents: 813
diff changeset
452
3490
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
453 use_cached_archive = False # defines if we use cached version of archive
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
454 archive_cache_enabled = CONFIG.get('archive_cache_dir')
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
455 if not subrepos and archive_cache_enabled:
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
456 #check if we it's ok to write
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
457 if not os.path.isdir(CONFIG['archive_cache_dir']):
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
458 os.makedirs(CONFIG['archive_cache_dir'])
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
459 cached_archive_path = os.path.join(CONFIG['archive_cache_dir'], archive_name)
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
460 if os.path.isfile(cached_archive_path):
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
461 log.debug('Found cached archive in %s' % cached_archive_path)
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
462 fd, archive = None, cached_archive_path
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
463 use_cached_archive = True
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
464 else:
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
465 log.debug('Archive %s is not yet cached' % (archive_name))
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
466
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
467 if not use_cached_archive:
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
468 #generate new archive
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
469 try:
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
470 fd, archive = tempfile.mkstemp()
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
471 t = open(archive, 'wb')
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
472 log.debug('Creating new temp archive in %s' % archive)
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
473 cs.fill_archive(stream=t, kind=fileformat, subrepos=subrepos)
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
474 if archive_cache_enabled:
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
475 #if we generated the archive and use cache rename that
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
476 log.debug('Storing new archive in %s' % cached_archive_path)
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
477 shutil.move(archive, cached_archive_path)
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
478 archive = cached_archive_path
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
479 finally:
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
480 t.close()
2294
3c1d991755df Use paste fileapp to properly send the archive size
Marcin Kuzminski <marcin@python-works.com>
parents: 2291
diff changeset
481
2318
058e2743e7b7 fixes issue #455 Creating an archive generates an exception on Windows
Marcin Kuzminski <marcin@python-works.com>
parents: 2294
diff changeset
482 def get_chunked_archive(archive):
058e2743e7b7 fixes issue #455 Creating an archive generates an exception on Windows
Marcin Kuzminski <marcin@python-works.com>
parents: 2294
diff changeset
483 stream = open(archive, 'rb')
058e2743e7b7 fixes issue #455 Creating an archive generates an exception on Windows
Marcin Kuzminski <marcin@python-works.com>
parents: 2294
diff changeset
484 while True:
058e2743e7b7 fixes issue #455 Creating an archive generates an exception on Windows
Marcin Kuzminski <marcin@python-works.com>
parents: 2294
diff changeset
485 data = stream.read(16 * 1024)
058e2743e7b7 fixes issue #455 Creating an archive generates an exception on Windows
Marcin Kuzminski <marcin@python-works.com>
parents: 2294
diff changeset
486 if not data:
058e2743e7b7 fixes issue #455 Creating an archive generates an exception on Windows
Marcin Kuzminski <marcin@python-works.com>
parents: 2294
diff changeset
487 stream.close()
3490
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
488 if fd: # fd means we used temporary file
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
489 os.close(fd)
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
490 if not archive_cache_enabled:
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
491 log.debug('Destroing temp archive %s' % archive)
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
492 os.remove(archive)
2318
058e2743e7b7 fixes issue #455 Creating an archive generates an exception on Windows
Marcin Kuzminski <marcin@python-works.com>
parents: 2294
diff changeset
493 break
058e2743e7b7 fixes issue #455 Creating an archive generates an exception on Windows
Marcin Kuzminski <marcin@python-works.com>
parents: 2294
diff changeset
494 yield data
3868
e262494ca099 store download archive actions in journal
Marcin Kuzminski <marcin@python-works.com>
parents: 3840
diff changeset
495 # store download action
e262494ca099 store download archive actions in journal
Marcin Kuzminski <marcin@python-works.com>
parents: 3840
diff changeset
496 action_logger(user=c.rhodecode_user,
e262494ca099 store download archive actions in journal
Marcin Kuzminski <marcin@python-works.com>
parents: 3840
diff changeset
497 action='user_downloaded_archive:%s' % (archive_name),
e262494ca099 store download archive actions in journal
Marcin Kuzminski <marcin@python-works.com>
parents: 3840
diff changeset
498 repo=repo_name, ipaddr=self.ip_addr, commit=True)
3490
c0ac34b8eb07 initial version of #788 tarball cache
Marcin Kuzminski <marcin@python-works.com>
parents: 3488
diff changeset
499 response.content_disposition = str('attachment; filename=%s' % (archive_name))
2318
058e2743e7b7 fixes issue #455 Creating an archive generates an exception on Windows
Marcin Kuzminski <marcin@python-works.com>
parents: 2294
diff changeset
500 response.content_type = str(content_type)
058e2743e7b7 fixes issue #455 Creating an archive generates an exception on Windows
Marcin Kuzminski <marcin@python-works.com>
parents: 2294
diff changeset
501 return get_chunked_archive(archive)
948
85ee0ea183e7 fixed archival in rhodecode to use new functions from vcs
Marcin Kuzminski <marcin@python-works.com>
parents: 945
diff changeset
502
2457
01e005cabd4d moved login required into seperate calls for files due to optional API access option
Marcin Kuzminski <marcin@python-works.com>
parents: 2456
diff changeset
503 @LoginRequired()
1305
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
504 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
166317d464f3 Added server side file editing with commit
Marcin Kuzminski <marcin@python-works.com>
parents: 1273
diff changeset
505 'repository.admin')
129
42d46deb124d implemented simple diffs for history of files.
Marcin Kuzminski <marcin@python-works.com>
parents: 128
diff changeset
506 def diff(self, repo_name, f_path):
1752
f28dc032adf0 Added handling of ignore whitespace flag in changesets
Marcin Kuzminski <marcin@python-works.com>
parents: 1737
diff changeset
507 ignore_whitespace = request.GET.get('ignorews') == '1'
1768
5610fd9b6803 added line context control to diffs
Marcin Kuzminski <marcin@python-works.com>
parents: 1753
diff changeset
508 line_context = request.GET.get('context', 3)
1789
17caf4efe15c implements #308 rewrote diffs to enable displaying full diff on each file
Marcin Kuzminski <marcin@python-works.com>
parents: 1768
diff changeset
509 diff1 = request.GET.get('diff1', '')
17caf4efe15c implements #308 rewrote diffs to enable displaying full diff on each file
Marcin Kuzminski <marcin@python-works.com>
parents: 1768
diff changeset
510 diff2 = request.GET.get('diff2', '')
337
fa3835d34fc1 fixed bug when diff command was different than available options
Marcin Kuzminski <marcin@python-works.com>
parents: 335
diff changeset
511 c.action = request.GET.get('diff')
131
49c7e191c2cd Implemented mercurial style diff-lib
Marcin Kuzminski <marcin@python-works.com>
parents: 130
diff changeset
512 c.no_changes = diff1 == diff2
129
42d46deb124d implemented simple diffs for history of files.
Marcin Kuzminski <marcin@python-works.com>
parents: 128
diff changeset
513 c.f_path = f_path
1273
64cb9612f9aa Added show as raw into big diff
Marcin Kuzminski <marcin@python-works.com>
parents: 1245
diff changeset
514 c.big_diff = False
1789
17caf4efe15c implements #308 rewrote diffs to enable displaying full diff on each file
Marcin Kuzminski <marcin@python-works.com>
parents: 1768
diff changeset
515 c.anchor_url = anchor_url
17caf4efe15c implements #308 rewrote diffs to enable displaying full diff on each file
Marcin Kuzminski <marcin@python-works.com>
parents: 1768
diff changeset
516 c.ignorews_url = _ignorews_url
17caf4efe15c implements #308 rewrote diffs to enable displaying full diff on each file
Marcin Kuzminski <marcin@python-works.com>
parents: 1768
diff changeset
517 c.context_url = _context_url
17caf4efe15c implements #308 rewrote diffs to enable displaying full diff on each file
Marcin Kuzminski <marcin@python-works.com>
parents: 1768
diff changeset
518 c.changes = OrderedDict()
17caf4efe15c implements #308 rewrote diffs to enable displaying full diff on each file
Marcin Kuzminski <marcin@python-works.com>
parents: 1768
diff changeset
519 c.changes[diff2] = []
2931
4c7cc3a4c330 fixed issue with show at revision button. Some JS were not properly loaded due to ajaxified files view.
Marcin Kuzminski <marcin@python-works.com>
parents: 2930
diff changeset
520
4c7cc3a4c330 fixed issue with show at revision button. Some JS were not properly loaded due to ajaxified files view.
Marcin Kuzminski <marcin@python-works.com>
parents: 2930
diff changeset
521 #special case if we want a show rev only, it's impl here
4c7cc3a4c330 fixed issue with show at revision button. Some JS were not properly loaded due to ajaxified files view.
Marcin Kuzminski <marcin@python-works.com>
parents: 2930
diff changeset
522 #to reduce JS and callbacks
2995
32471bd1f4ee Implemented generation of changesets based
Marcin Kuzminski <marcin@python-works.com>
parents: 2981
diff changeset
523
2931
4c7cc3a4c330 fixed issue with show at revision button. Some JS were not properly loaded due to ajaxified files view.
Marcin Kuzminski <marcin@python-works.com>
parents: 2930
diff changeset
524 if request.GET.get('show_rev'):
4c7cc3a4c330 fixed issue with show at revision button. Some JS were not properly loaded due to ajaxified files view.
Marcin Kuzminski <marcin@python-works.com>
parents: 2930
diff changeset
525 if str2bool(request.GET.get('annotate', 'False')):
4c7cc3a4c330 fixed issue with show at revision button. Some JS were not properly loaded due to ajaxified files view.
Marcin Kuzminski <marcin@python-works.com>
parents: 2930
diff changeset
526 _url = url('files_annotate_home', repo_name=c.repo_name,
4c7cc3a4c330 fixed issue with show at revision button. Some JS were not properly loaded due to ajaxified files view.
Marcin Kuzminski <marcin@python-works.com>
parents: 2930
diff changeset
527 revision=diff1, f_path=c.f_path)
4c7cc3a4c330 fixed issue with show at revision button. Some JS were not properly loaded due to ajaxified files view.
Marcin Kuzminski <marcin@python-works.com>
parents: 2930
diff changeset
528 else:
4c7cc3a4c330 fixed issue with show at revision button. Some JS were not properly loaded due to ajaxified files view.
Marcin Kuzminski <marcin@python-works.com>
parents: 2930
diff changeset
529 _url = url('files_home', repo_name=c.repo_name,
4c7cc3a4c330 fixed issue with show at revision button. Some JS were not properly loaded due to ajaxified files view.
Marcin Kuzminski <marcin@python-works.com>
parents: 2930
diff changeset
530 revision=diff1, f_path=c.f_path)
4c7cc3a4c330 fixed issue with show at revision button. Some JS were not properly loaded due to ajaxified files view.
Marcin Kuzminski <marcin@python-works.com>
parents: 2930
diff changeset
531
4c7cc3a4c330 fixed issue with show at revision button. Some JS were not properly loaded due to ajaxified files view.
Marcin Kuzminski <marcin@python-works.com>
parents: 2930
diff changeset
532 return redirect(_url)
275
2d61aa00e855 fixed bugs when putting empty or unknown changesets into diff
Marcin Kuzminski <marcin@python-works.com>
parents: 272
diff changeset
533 try:
544
d8778cde98f0 added limits to single file diffs
Marcin Kuzminski <marcin@python-works.com>
parents: 512
diff changeset
534 if diff1 not in ['', None, 'None', '0' * 12, '0' * 40]:
1045
3fc9183e05dd another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents: 1044
diff changeset
535 c.changeset_1 = c.rhodecode_repo.get_changeset(diff1)
2995
32471bd1f4ee Implemented generation of changesets based
Marcin Kuzminski <marcin@python-works.com>
parents: 2981
diff changeset
536 try:
32471bd1f4ee Implemented generation of changesets based
Marcin Kuzminski <marcin@python-works.com>
parents: 2981
diff changeset
537 node1 = c.changeset_1.get_node(f_path)
3440
4725d097c3c0 check if given f_path in diff is not a dir by any chance
Marcin Kuzminski <marcin@python-works.com>
parents: 3267
diff changeset
538 if node1.is_dir():
3563
8d8c4dddd174 fixed bad raise statement
Marcin Kuzminski <marcin@python-works.com>
parents: 3559
diff changeset
539 raise NodeError('%s path is a %s not a file'
8d8c4dddd174 fixed bad raise statement
Marcin Kuzminski <marcin@python-works.com>
parents: 3559
diff changeset
540 % (node1, type(node1)))
2995
32471bd1f4ee Implemented generation of changesets based
Marcin Kuzminski <marcin@python-works.com>
parents: 2981
diff changeset
541 except NodeDoesNotExistError:
32471bd1f4ee Implemented generation of changesets based
Marcin Kuzminski <marcin@python-works.com>
parents: 2981
diff changeset
542 c.changeset_1 = EmptyChangeset(cs=diff1,
32471bd1f4ee Implemented generation of changesets based
Marcin Kuzminski <marcin@python-works.com>
parents: 2981
diff changeset
543 revision=c.changeset_1.revision,
32471bd1f4ee Implemented generation of changesets based
Marcin Kuzminski <marcin@python-works.com>
parents: 2981
diff changeset
544 repo=c.rhodecode_repo)
32471bd1f4ee Implemented generation of changesets based
Marcin Kuzminski <marcin@python-works.com>
parents: 2981
diff changeset
545 node1 = FileNode(f_path, '', changeset=c.changeset_1)
275
2d61aa00e855 fixed bugs when putting empty or unknown changesets into diff
Marcin Kuzminski <marcin@python-works.com>
parents: 272
diff changeset
546 else:
1224
e76833cd555a files: fixes error when passing a diff without parameters and caused server crash
Marcin Kuzminski <marcin@python-works.com>
parents: 1212
diff changeset
547 c.changeset_1 = EmptyChangeset(repo=c.rhodecode_repo)
2995
32471bd1f4ee Implemented generation of changesets based
Marcin Kuzminski <marcin@python-works.com>
parents: 2981
diff changeset
548 node1 = FileNode(f_path, '', changeset=c.changeset_1)
636
ffd07396d315 Fixes for raw_id, needed for git
Marcin Kuzminski <marcin@python-works.com>
parents: 629
diff changeset
549
544
d8778cde98f0 added limits to single file diffs
Marcin Kuzminski <marcin@python-works.com>
parents: 512
diff changeset
550 if diff2 not in ['', None, 'None', '0' * 12, '0' * 40]:
1045
3fc9183e05dd another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents: 1044
diff changeset
551 c.changeset_2 = c.rhodecode_repo.get_changeset(diff2)
2995
32471bd1f4ee Implemented generation of changesets based
Marcin Kuzminski <marcin@python-works.com>
parents: 2981
diff changeset
552 try:
32471bd1f4ee Implemented generation of changesets based
Marcin Kuzminski <marcin@python-works.com>
parents: 2981
diff changeset
553 node2 = c.changeset_2.get_node(f_path)
3563
8d8c4dddd174 fixed bad raise statement
Marcin Kuzminski <marcin@python-works.com>
parents: 3559
diff changeset
554 if node2.is_dir():
8d8c4dddd174 fixed bad raise statement
Marcin Kuzminski <marcin@python-works.com>
parents: 3559
diff changeset
555 raise NodeError('%s path is a %s not a file'
8d8c4dddd174 fixed bad raise statement
Marcin Kuzminski <marcin@python-works.com>
parents: 3559
diff changeset
556 % (node2, type(node2)))
2995
32471bd1f4ee Implemented generation of changesets based
Marcin Kuzminski <marcin@python-works.com>
parents: 2981
diff changeset
557 except NodeDoesNotExistError:
32471bd1f4ee Implemented generation of changesets based
Marcin Kuzminski <marcin@python-works.com>
parents: 2981
diff changeset
558 c.changeset_2 = EmptyChangeset(cs=diff2,
32471bd1f4ee Implemented generation of changesets based
Marcin Kuzminski <marcin@python-works.com>
parents: 2981
diff changeset
559 revision=c.changeset_2.revision,
32471bd1f4ee Implemented generation of changesets based
Marcin Kuzminski <marcin@python-works.com>
parents: 2981
diff changeset
560 repo=c.rhodecode_repo)
32471bd1f4ee Implemented generation of changesets based
Marcin Kuzminski <marcin@python-works.com>
parents: 2981
diff changeset
561 node2 = FileNode(f_path, '', changeset=c.changeset_2)
275
2d61aa00e855 fixed bugs when putting empty or unknown changesets into diff
Marcin Kuzminski <marcin@python-works.com>
parents: 272
diff changeset
562 else:
1224
e76833cd555a files: fixes error when passing a diff without parameters and caused server crash
Marcin Kuzminski <marcin@python-works.com>
parents: 1212
diff changeset
563 c.changeset_2 = EmptyChangeset(repo=c.rhodecode_repo)
2995
32471bd1f4ee Implemented generation of changesets based
Marcin Kuzminski <marcin@python-works.com>
parents: 2981
diff changeset
564 node2 = FileNode(f_path, '', changeset=c.changeset_2)
3037
789f20683559 fix error when diff path is a directory, edge case generated by google bots
Marcin Kuzminski <marcin@python-works.com>
parents: 3009
diff changeset
565 except (RepositoryError, NodeError):
2995
32471bd1f4ee Implemented generation of changesets based
Marcin Kuzminski <marcin@python-works.com>
parents: 2981
diff changeset
566 log.error(traceback.format_exc())
1818
cf51bbfb120e auto white-space removal
Marcin Kuzminski <marcin@python-works.com>
parents: 1810
diff changeset
567 return redirect(url('files_home', repo_name=c.repo_name,
1789
17caf4efe15c implements #308 rewrote diffs to enable displaying full diff on each file
Marcin Kuzminski <marcin@python-works.com>
parents: 1768
diff changeset
568 f_path=f_path))
275
2d61aa00e855 fixed bugs when putting empty or unknown changesets into diff
Marcin Kuzminski <marcin@python-works.com>
parents: 272
diff changeset
569
337
fa3835d34fc1 fixed bug when diff command was different than available options
Marcin Kuzminski <marcin@python-works.com>
parents: 335
diff changeset
570 if c.action == 'download':
1753
1d1ccb873d00 moved soon-to-be-deleted code from vcs to rhodecode
Marcin Kuzminski <marcin@python-works.com>
parents: 1752
diff changeset
571 _diff = diffs.get_gitdiff(node1, node2,
1768
5610fd9b6803 added line context control to diffs
Marcin Kuzminski <marcin@python-works.com>
parents: 1753
diff changeset
572 ignore_whitespace=ignore_whitespace,
5610fd9b6803 added line context control to diffs
Marcin Kuzminski <marcin@python-works.com>
parents: 1753
diff changeset
573 context=line_context)
1789
17caf4efe15c implements #308 rewrote diffs to enable displaying full diff on each file
Marcin Kuzminski <marcin@python-works.com>
parents: 1768
diff changeset
574 diff = diffs.DiffProcessor(_diff, format='gitdiff')
1044
f3402cb92fdf changed raw and download diffs to gitdiff
Marcin Kuzminski <marcin@python-works.com>
parents: 1043
diff changeset
575
160
0f7f93df5802 implemented rawdiff and diff download into diff view.
Marcin Kuzminski <marcin@python-works.com>
parents: 158
diff changeset
576 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
577 response.content_type = 'text/plain'
2083
60115135b77e fixed raw_changeset for git, accidentally it was generated with hg patch headers
Marcin Kuzminski <marcin@python-works.com>
parents: 2046
diff changeset
578 response.content_disposition = (
60115135b77e fixed raw_changeset for git, accidentally it was generated with hg patch headers
Marcin Kuzminski <marcin@python-works.com>
parents: 2046
diff changeset
579 'attachment; filename=%s' % diff_name
60115135b77e fixed raw_changeset for git, accidentally it was generated with hg patch headers
Marcin Kuzminski <marcin@python-works.com>
parents: 2046
diff changeset
580 )
2995
32471bd1f4ee Implemented generation of changesets based
Marcin Kuzminski <marcin@python-works.com>
parents: 2981
diff changeset
581 return diff.as_raw()
636
ffd07396d315 Fixes for raw_id, needed for git
Marcin Kuzminski <marcin@python-works.com>
parents: 629
diff changeset
582
337
fa3835d34fc1 fixed bug when diff command was different than available options
Marcin Kuzminski <marcin@python-works.com>
parents: 335
diff changeset
583 elif c.action == 'raw':
1753
1d1ccb873d00 moved soon-to-be-deleted code from vcs to rhodecode
Marcin Kuzminski <marcin@python-works.com>
parents: 1752
diff changeset
584 _diff = diffs.get_gitdiff(node1, node2,
1768
5610fd9b6803 added line context control to diffs
Marcin Kuzminski <marcin@python-works.com>
parents: 1753
diff changeset
585 ignore_whitespace=ignore_whitespace,
5610fd9b6803 added line context control to diffs
Marcin Kuzminski <marcin@python-works.com>
parents: 1753
diff changeset
586 context=line_context)
1789
17caf4efe15c implements #308 rewrote diffs to enable displaying full diff on each file
Marcin Kuzminski <marcin@python-works.com>
parents: 1768
diff changeset
587 diff = diffs.DiffProcessor(_diff, format='gitdiff')
649
3765f0f479a2 fixed raw diff as purly raw without html
Marcin Kuzminski <marcin@python-works.com>
parents: 644
diff changeset
588 response.content_type = 'text/plain'
2995
32471bd1f4ee Implemented generation of changesets based
Marcin Kuzminski <marcin@python-works.com>
parents: 2981
diff changeset
589 return diff.as_raw()
662
373ee7031003 fixed annotation bug, added history to annotation.
Marcin Kuzminski <marcin@python-works.com>
parents: 649
diff changeset
590
337
fa3835d34fc1 fixed bug when diff command was different than available options
Marcin Kuzminski <marcin@python-works.com>
parents: 335
diff changeset
591 else:
1789
17caf4efe15c implements #308 rewrote diffs to enable displaying full diff on each file
Marcin Kuzminski <marcin@python-works.com>
parents: 1768
diff changeset
592 fid = h.FID(diff2, node2.path)
17caf4efe15c implements #308 rewrote diffs to enable displaying full diff on each file
Marcin Kuzminski <marcin@python-works.com>
parents: 1768
diff changeset
593 line_context_lcl = get_line_ctx(fid, request.GET)
17caf4efe15c implements #308 rewrote diffs to enable displaying full diff on each file
Marcin Kuzminski <marcin@python-works.com>
parents: 1768
diff changeset
594 ign_whitespace_lcl = get_ignore_ws(fid, request.GET)
1149
d162de13caec memory optimizations, call diffs only when needed ie. after checking for binary, and cutoff limit.
Marcin Kuzminski <marcin@python-works.com>
parents: 1137
diff changeset
595
1789
17caf4efe15c implements #308 rewrote diffs to enable displaying full diff on each file
Marcin Kuzminski <marcin@python-works.com>
parents: 1768
diff changeset
596 lim = request.GET.get('fulldiff') or self.cut_off_limit
2109
8ecfed1d8f8b utils/conf
Marcin Kuzminski <marcin@python-works.com>
parents: 2083
diff changeset
597 _, cs1, cs2, diff, st = diffs.wrapped_diff(filenode_old=node1,
1789
17caf4efe15c implements #308 rewrote diffs to enable displaying full diff on each file
Marcin Kuzminski <marcin@python-works.com>
parents: 1768
diff changeset
598 filenode_new=node2,
17caf4efe15c implements #308 rewrote diffs to enable displaying full diff on each file
Marcin Kuzminski <marcin@python-works.com>
parents: 1768
diff changeset
599 cut_off_limit=lim,
17caf4efe15c implements #308 rewrote diffs to enable displaying full diff on each file
Marcin Kuzminski <marcin@python-works.com>
parents: 1768
diff changeset
600 ignore_whitespace=ign_whitespace_lcl,
17caf4efe15c implements #308 rewrote diffs to enable displaying full diff on each file
Marcin Kuzminski <marcin@python-works.com>
parents: 1768
diff changeset
601 line_context=line_context_lcl,
17caf4efe15c implements #308 rewrote diffs to enable displaying full diff on each file
Marcin Kuzminski <marcin@python-works.com>
parents: 1768
diff changeset
602 enable_comments=False)
2995
32471bd1f4ee Implemented generation of changesets based
Marcin Kuzminski <marcin@python-works.com>
parents: 2981
diff changeset
603 op = ''
32471bd1f4ee Implemented generation of changesets based
Marcin Kuzminski <marcin@python-works.com>
parents: 2981
diff changeset
604 filename = node1.path
32471bd1f4ee Implemented generation of changesets based
Marcin Kuzminski <marcin@python-works.com>
parents: 2981
diff changeset
605 cs_changes = {
32471bd1f4ee Implemented generation of changesets based
Marcin Kuzminski <marcin@python-works.com>
parents: 2981
diff changeset
606 'fid': [cs1, cs2, op, filename, diff, st]
32471bd1f4ee Implemented generation of changesets based
Marcin Kuzminski <marcin@python-works.com>
parents: 2981
diff changeset
607 }
32471bd1f4ee Implemented generation of changesets based
Marcin Kuzminski <marcin@python-works.com>
parents: 2981
diff changeset
608 c.changes = cs_changes
636
ffd07396d315 Fixes for raw_id, needed for git
Marcin Kuzminski <marcin@python-works.com>
parents: 629
diff changeset
609
129
42d46deb124d implemented simple diffs for history of files.
Marcin Kuzminski <marcin@python-works.com>
parents: 128
diff changeset
610 return render('files/file_diff.html')
636
ffd07396d315 Fixes for raw_id, needed for git
Marcin Kuzminski <marcin@python-works.com>
parents: 629
diff changeset
611
4043
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
612 @LoginRequired()
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
613 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
614 'repository.admin')
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
615 def diff_2way(self, repo_name, f_path):
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
616 diff1 = request.GET.get('diff1', '')
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
617 diff2 = request.GET.get('diff2', '')
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
618 try:
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
619 if diff1 not in ['', None, 'None', '0' * 12, '0' * 40]:
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
620 c.changeset_1 = c.rhodecode_repo.get_changeset(diff1)
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
621 try:
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
622 node1 = c.changeset_1.get_node(f_path)
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
623 if node1.is_dir():
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
624 raise NodeError('%s path is a %s not a file'
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
625 % (node1, type(node1)))
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
626 except NodeDoesNotExistError:
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
627 c.changeset_1 = EmptyChangeset(cs=diff1,
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
628 revision=c.changeset_1.revision,
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
629 repo=c.rhodecode_repo)
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
630 node1 = FileNode(f_path, '', changeset=c.changeset_1)
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
631 else:
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
632 c.changeset_1 = EmptyChangeset(repo=c.rhodecode_repo)
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
633 node1 = FileNode(f_path, '', changeset=c.changeset_1)
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
634
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
635 if diff2 not in ['', None, 'None', '0' * 12, '0' * 40]:
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
636 c.changeset_2 = c.rhodecode_repo.get_changeset(diff2)
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
637 try:
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
638 node2 = c.changeset_2.get_node(f_path)
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
639 if node2.is_dir():
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
640 raise NodeError('%s path is a %s not a file'
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
641 % (node2, type(node2)))
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
642 except NodeDoesNotExistError:
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
643 c.changeset_2 = EmptyChangeset(cs=diff2,
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
644 revision=c.changeset_2.revision,
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
645 repo=c.rhodecode_repo)
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
646 node2 = FileNode(f_path, '', changeset=c.changeset_2)
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
647 else:
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
648 c.changeset_2 = EmptyChangeset(repo=c.rhodecode_repo)
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
649 node2 = FileNode(f_path, '', changeset=c.changeset_2)
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
650 except (RepositoryError, NodeError):
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
651 log.error(traceback.format_exc())
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
652 return redirect(url('files_home', repo_name=c.repo_name,
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
653 f_path=f_path))
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
654 if node2.is_binary:
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
655 node2_content = 'binary file'
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
656 else:
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
657 node2_content = node2.content
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
658
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
659 if node1.is_binary:
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
660 node1_content = 'binary file'
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
661 else:
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
662 node1_content = node1.content
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
663
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
664 html_escape_table = {
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
665 "&": "\u0026",
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
666 '"': "\u0022",
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
667 "'": "\u0027",
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
668 ">": "\u003e",
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
669 "<": "\<",
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
670 '\\': "\u005c",
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
671 '\n': '\\n'
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
672 }
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
673
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
674 c.orig1 = h.html_escape((node1_content), html_escape_table)
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
675 c.orig2 = h.html_escape((node2_content), html_escape_table)
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
676 c.node1 = node1
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
677 c.node2 = node2
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
678 c.cs1 = c.changeset_1
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
679 c.cs2 = c.changeset_2
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
680
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
681 return render('files/diff_2way.html')
a1bc4af25ec5 Implemented issue #387 side-by-side diffs view
Marcin Kuzminski <marcin@python-works.com>
parents: 3960
diff changeset
682
2456
51b203e44202 Add authors into file view
Marcin Kuzminski <marcin@python-works.com>
parents: 2428
diff changeset
683 def _get_node_history(self, cs, f_path, changesets=None):
2977
cff9d4e1d821 Fixed issue when node didn't exists at 'tip' and we tried calculate history based on that assumption.
Marcin Kuzminski <marcin@python-works.com>
parents: 2973
diff changeset
684 """
cff9d4e1d821 Fixed issue when node didn't exists at 'tip' and we tried calculate history based on that assumption.
Marcin Kuzminski <marcin@python-works.com>
parents: 2973
diff changeset
685 get changesets history for given node
cff9d4e1d821 Fixed issue when node didn't exists at 'tip' and we tried calculate history based on that assumption.
Marcin Kuzminski <marcin@python-works.com>
parents: 2973
diff changeset
686
cff9d4e1d821 Fixed issue when node didn't exists at 'tip' and we tried calculate history based on that assumption.
Marcin Kuzminski <marcin@python-works.com>
parents: 2973
diff changeset
687 :param cs: changeset to calculate history
cff9d4e1d821 Fixed issue when node didn't exists at 'tip' and we tried calculate history based on that assumption.
Marcin Kuzminski <marcin@python-works.com>
parents: 2973
diff changeset
688 :param f_path: path for node to calculate history for
cff9d4e1d821 Fixed issue when node didn't exists at 'tip' and we tried calculate history based on that assumption.
Marcin Kuzminski <marcin@python-works.com>
parents: 2973
diff changeset
689 :param changesets: if passed don't calculate history and take
cff9d4e1d821 Fixed issue when node didn't exists at 'tip' and we tried calculate history based on that assumption.
Marcin Kuzminski <marcin@python-works.com>
parents: 2973
diff changeset
690 changesets defined in this list
cff9d4e1d821 Fixed issue when node didn't exists at 'tip' and we tried calculate history based on that assumption.
Marcin Kuzminski <marcin@python-works.com>
parents: 2973
diff changeset
691 """
cff9d4e1d821 Fixed issue when node didn't exists at 'tip' and we tried calculate history based on that assumption.
Marcin Kuzminski <marcin@python-works.com>
parents: 2973
diff changeset
692 # calculate history based on tip
cff9d4e1d821 Fixed issue when node didn't exists at 'tip' and we tried calculate history based on that assumption.
Marcin Kuzminski <marcin@python-works.com>
parents: 2973
diff changeset
693 tip_cs = c.rhodecode_repo.get_changeset()
2456
51b203e44202 Add authors into file view
Marcin Kuzminski <marcin@python-works.com>
parents: 2428
diff changeset
694 if changesets is None:
2977
cff9d4e1d821 Fixed issue when node didn't exists at 'tip' and we tried calculate history based on that assumption.
Marcin Kuzminski <marcin@python-works.com>
parents: 2973
diff changeset
695 try:
cff9d4e1d821 Fixed issue when node didn't exists at 'tip' and we tried calculate history based on that assumption.
Marcin Kuzminski <marcin@python-works.com>
parents: 2973
diff changeset
696 changesets = tip_cs.get_file_history(f_path)
2981
6cd0f8f8aef1 Let the function calculating changeset history do all the work
Marcin Kuzminski <marcin@python-works.com>
parents: 2977
diff changeset
697 except (NodeDoesNotExistError, ChangesetError):
2977
cff9d4e1d821 Fixed issue when node didn't exists at 'tip' and we tried calculate history based on that assumption.
Marcin Kuzminski <marcin@python-works.com>
parents: 2973
diff changeset
698 #this node is not present at tip !
cff9d4e1d821 Fixed issue when node didn't exists at 'tip' and we tried calculate history based on that assumption.
Marcin Kuzminski <marcin@python-works.com>
parents: 2973
diff changeset
699 changesets = cs.get_file_history(f_path)
128
9deb6f1d5b90 Implemented file history.
Marcin Kuzminski <marcin@python-works.com>
parents: 106
diff changeset
700 hist_l = []
774
c47152c5fe01 added tags, and branches to file history select box, fixed annotation changeset errors crash on wrongly given revions
Marcin Kuzminski <marcin@python-works.com>
parents: 691
diff changeset
701
c47152c5fe01 added tags, and branches to file history select box, fixed annotation changeset errors crash on wrongly given revions
Marcin Kuzminski <marcin@python-works.com>
parents: 691
diff changeset
702 changesets_group = ([], _("Changesets"))
c47152c5fe01 added tags, and branches to file history select box, fixed annotation changeset errors crash on wrongly given revions
Marcin Kuzminski <marcin@python-works.com>
parents: 691
diff changeset
703 branches_group = ([], _("Branches"))
c47152c5fe01 added tags, and branches to file history select box, fixed annotation changeset errors crash on wrongly given revions
Marcin Kuzminski <marcin@python-works.com>
parents: 691
diff changeset
704 tags_group = ([], _("Tags"))
2046
4e1e265af5ca remove branch from git filenode history drop-down
Marcin Kuzminski <marcin@python-works.com>
parents: 2007
diff changeset
705 _hg = cs.repository.alias == 'hg'
128
9deb6f1d5b90 Implemented file history.
Marcin Kuzminski <marcin@python-works.com>
parents: 106
diff changeset
706 for chs in changesets:
3001
37c7abd34d44 implements #636, lazy loading of history and authors to speed up page responsiveness.
Marcin Kuzminski <marcin@python-works.com>
parents: 2995
diff changeset
707 #_branch = '(%s)' % chs.branch if _hg else ''
37c7abd34d44 implements #636, lazy loading of history and authors to speed up page responsiveness.
Marcin Kuzminski <marcin@python-works.com>
parents: 2995
diff changeset
708 _branch = chs.branch
3009
f0e19116f154 fixed file history tests
Marcin Kuzminski <marcin@python-works.com>
parents: 3001
diff changeset
709 n_desc = 'r%s:%s (%s)' % (chs.revision, chs.short_id, _branch)
774
c47152c5fe01 added tags, and branches to file history select box, fixed annotation changeset errors crash on wrongly given revions
Marcin Kuzminski <marcin@python-works.com>
parents: 691
diff changeset
710 changesets_group[0].append((chs.raw_id, n_desc,))
c47152c5fe01 added tags, and branches to file history select box, fixed annotation changeset errors crash on wrongly given revions
Marcin Kuzminski <marcin@python-works.com>
parents: 691
diff changeset
711 hist_l.append(changesets_group)
c47152c5fe01 added tags, and branches to file history select box, fixed annotation changeset errors crash on wrongly given revions
Marcin Kuzminski <marcin@python-works.com>
parents: 691
diff changeset
712
1045
3fc9183e05dd another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents: 1044
diff changeset
713 for name, chs in c.rhodecode_repo.branches.items():
774
c47152c5fe01 added tags, and branches to file history select box, fixed annotation changeset errors crash on wrongly given revions
Marcin Kuzminski <marcin@python-works.com>
parents: 691
diff changeset
714 branches_group[0].append((chs, name),)
c47152c5fe01 added tags, and branches to file history select box, fixed annotation changeset errors crash on wrongly given revions
Marcin Kuzminski <marcin@python-works.com>
parents: 691
diff changeset
715 hist_l.append(branches_group)
c47152c5fe01 added tags, and branches to file history select box, fixed annotation changeset errors crash on wrongly given revions
Marcin Kuzminski <marcin@python-works.com>
parents: 691
diff changeset
716
1045
3fc9183e05dd another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents: 1044
diff changeset
717 for name, chs in c.rhodecode_repo.tags.items():
774
c47152c5fe01 added tags, and branches to file history select box, fixed annotation changeset errors crash on wrongly given revions
Marcin Kuzminski <marcin@python-works.com>
parents: 691
diff changeset
718 tags_group[0].append((chs, name),)
c47152c5fe01 added tags, and branches to file history select box, fixed annotation changeset errors crash on wrongly given revions
Marcin Kuzminski <marcin@python-works.com>
parents: 691
diff changeset
719 hist_l.append(tags_group)
3009
f0e19116f154 fixed file history tests
Marcin Kuzminski <marcin@python-works.com>
parents: 3001
diff changeset
720
2981
6cd0f8f8aef1 Let the function calculating changeset history do all the work
Marcin Kuzminski <marcin@python-works.com>
parents: 2977
diff changeset
721 return hist_l, changesets
1452
8585fbf3ed06 Implemented #111 copy github node finder solution
Marcin Kuzminski <marcin@python-works.com>
parents: 1450
diff changeset
722
2457
01e005cabd4d moved login required into seperate calls for files due to optional API access option
Marcin Kuzminski <marcin@python-works.com>
parents: 2456
diff changeset
723 @LoginRequired()
1452
8585fbf3ed06 Implemented #111 copy github node finder solution
Marcin Kuzminski <marcin@python-works.com>
parents: 1450
diff changeset
724 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
8585fbf3ed06 Implemented #111 copy github node finder solution
Marcin Kuzminski <marcin@python-works.com>
parents: 1450
diff changeset
725 'repository.admin')
2457
01e005cabd4d moved login required into seperate calls for files due to optional API access option
Marcin Kuzminski <marcin@python-works.com>
parents: 2456
diff changeset
726 @jsonify
1452
8585fbf3ed06 Implemented #111 copy github node finder solution
Marcin Kuzminski <marcin@python-works.com>
parents: 1450
diff changeset
727 def nodelist(self, repo_name, revision, f_path):
8585fbf3ed06 Implemented #111 copy github node finder solution
Marcin Kuzminski <marcin@python-works.com>
parents: 1450
diff changeset
728 if request.environ.get('HTTP_X_PARTIAL_XHR'):
8585fbf3ed06 Implemented #111 copy github node finder solution
Marcin Kuzminski <marcin@python-works.com>
parents: 1450
diff changeset
729 cs = self.__get_cs_or_redirect(revision, repo_name)
1810
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1809
diff changeset
730 _d, _f = ScmModel().get_nodes(repo_name, cs.raw_id, f_path,
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1809
diff changeset
731 flat=False)
2428
530bd12fc18a removed JSON array envelope from filter files function
Marcin Kuzminski <marcin@python-works.com>
parents: 2318
diff changeset
732 return {'nodes': _d + _f}