aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcin Kuzminski <marcin@python-works.com>2012-03-02 21:57:01 +0200
committerMarcin Kuzminski <marcin@python-works.com>2012-03-02 21:57:01 +0200
commit84d7c4e1c42a5a46f3078cfc54ba4062c04086fb (patch)
treef54c36b5baa43328d2c746b3965e83f398926c58
parent1427e67b54ad555d0ee04fb7c5054999c544f65a (diff)
parentdf886e9e0f538999d56e3010d6156ac8e805c5d0 (diff)
merged beta into stable
-rw-r--r--CONTRIBUTORS1
-rwxr-xr-xdocs/setup.rst1
-rw-r--r--requires.txt2
-rw-r--r--rhodecode/__init__.py2
-rw-r--r--rhodecode/controllers/admin/settings.py4
-rw-r--r--rhodecode/controllers/changeset.py54
-rw-r--r--rhodecode/controllers/files.py5
-rw-r--r--rhodecode/lib/diffs.py4
-rw-r--r--rhodecode/lib/middleware/simplegit.py21
-rw-r--r--rhodecode/lib/vcs/backends/git/changeset.py2
-rw-r--r--rhodecode/lib/vcs/backends/hg/changeset.py5
-rw-r--r--rhodecode/lib/vcs/nodes.py18
-rw-r--r--rhodecode/lib/vcs/utils/diffs.py6
-rw-r--r--rhodecode/model/comment.py25
-rwxr-xr-xrhodecode/model/db.py4
-rw-r--r--rhodecode/model/notification.py41
-rw-r--r--rhodecode/model/user.py13
-rw-r--r--rhodecode/model/users_group.py8
-rw-r--r--rhodecode/public/js/rhodecode.js24
-rw-r--r--rhodecode/templates/changeset/raw_changeset.html3
-rw-r--r--rhodecode/templates/files/files_annotate.html6
-rw-r--r--rhodecode/templates/files/files_browser.html4
-rw-r--r--rhodecode/templates/files/files_edit.html2
-rw-r--r--rhodecode/templates/files/files_source.html22
-rw-r--r--rhodecode/tests/functional/test_files.py24
25 files changed, 177 insertions, 124 deletions
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index b4c25cb3..6c0a48d6 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -17,3 +17,4 @@ List of contributors to RhodeCode project:
Matt Zuba <matt.zuba@goodwillaz.org>
Aras Pranckevicius <aras@unity3d.com>
Tony Bussieres <t.bussieres@gmail.com>
+ Erwin Kroon <e.kroon@smartmetersolutions.nl> \ No newline at end of file
diff --git a/docs/setup.rst b/docs/setup.rst
index 7bff89c7..e833ab3b 100755
--- a/docs/setup.rst
+++ b/docs/setup.rst
@@ -648,6 +648,7 @@ Here is a sample excerpt from an Apache Virtual Host configuration file::
threads=4 \
python-path=/home/web/rhodecode/pyenv/lib/python2.6/site-packages
WSGIScriptAlias / /home/web/rhodecode/dispatch.wsgi
+ WSGIPassAuthorization On
Example wsgi dispatch script::
diff --git a/requires.txt b/requires.txt
index e54a1b03..0b4bdb06 100644
--- a/requires.txt
+++ b/requires.txt
@@ -1,5 +1,5 @@
Pylons==1.0.0
-Beaker==1.6.2
+Beaker==1.6.3
WebHelpers>=1.2
formencode==1.2.4
SQLAlchemy==0.7.4
diff --git a/rhodecode/__init__.py b/rhodecode/__init__.py
index f4a52146..35c016fc 100644
--- a/rhodecode/__init__.py
+++ b/rhodecode/__init__.py
@@ -38,7 +38,7 @@ PLATFORM_OTHERS = ('Linux', 'Darwin', 'FreeBSD', 'OpenBSD', 'SunOS')
requirements = [
"Pylons==1.0.0",
- "Beaker==1.6.2",
+ "Beaker==1.6.3",
"WebHelpers>=1.2",
"formencode==1.2.4",
"SQLAlchemy==0.7.4",
diff --git a/rhodecode/controllers/admin/settings.py b/rhodecode/controllers/admin/settings.py
index 679df89b..6cdc1255 100644
--- a/rhodecode/controllers/admin/settings.py
+++ b/rhodecode/controllers/admin/settings.py
@@ -248,7 +248,7 @@ class SettingsController(BaseController):
if update:
h.flash(_('Updated hooks'), category='success')
- Session.commit()
+ self.sa.commit()
except:
log.error(traceback.format_exc())
h.flash(_('error occurred during hook creation'),
@@ -285,7 +285,7 @@ class SettingsController(BaseController):
if setting_id == 'hooks':
hook_id = request.POST.get('hook_id')
RhodeCodeUi.delete(hook_id)
-
+ self.sa.commit()
@HasPermissionAllDecorator('hg.admin')
def show(self, setting_id, format='html'):
diff --git a/rhodecode/controllers/changeset.py b/rhodecode/controllers/changeset.py
index df3b5b76..44b4cbbf 100644
--- a/rhodecode/controllers/changeset.py
+++ b/rhodecode/controllers/changeset.py
@@ -221,17 +221,20 @@ class ChangesetController(BaseRepoController):
lim = self.cut_off_limit
if cumulative_diff > self.cut_off_limit:
lim = -1
- size, cs1, cs2, diff, st = wrapped_diff(filenode_old=None,
- filenode_new=node,
- cut_off_limit=lim,
- ignore_whitespace=ign_whitespace_lcl,
- line_context=line_context_lcl,
- enable_comments=enable_comments)
+ size, cs1, cs2, diff, st = wrapped_diff(
+ filenode_old=None,
+ filenode_new=node,
+ cut_off_limit=lim,
+ ignore_whitespace=ign_whitespace_lcl,
+ line_context=line_context_lcl,
+ enable_comments=enable_comments
+ )
cumulative_diff += size
c.lines_added += st[0]
c.lines_deleted += st[1]
- c.changes[changeset.raw_id].append(('added', node, diff,
- cs1, cs2, st))
+ c.changes[changeset.raw_id].append(
+ ('added', node, diff, cs1, cs2, st)
+ )
#==================================================================
# CHANGED FILES
@@ -249,24 +252,27 @@ class ChangesetController(BaseRepoController):
lim = self.cut_off_limit
if cumulative_diff > self.cut_off_limit:
lim = -1
- size, cs1, cs2, diff, st = wrapped_diff(filenode_old=filenode_old,
- filenode_new=node,
- cut_off_limit=lim,
- ignore_whitespace=ign_whitespace_lcl,
- line_context=line_context_lcl,
- enable_comments=enable_comments)
+ size, cs1, cs2, diff, st = wrapped_diff(
+ filenode_old=filenode_old,
+ filenode_new=node,
+ cut_off_limit=lim,
+ ignore_whitespace=ign_whitespace_lcl,
+ line_context=line_context_lcl,
+ enable_comments=enable_comments
+ )
cumulative_diff += size
c.lines_added += st[0]
c.lines_deleted += st[1]
- c.changes[changeset.raw_id].append(('changed', node, diff,
- cs1, cs2, st))
-
+ c.changes[changeset.raw_id].append(
+ ('changed', node, diff, cs1, cs2, st)
+ )
#==================================================================
# REMOVED FILES
#==================================================================
for node in changeset.removed:
- c.changes[changeset.raw_id].append(('removed', node, None,
- None, None, (0, 0)))
+ c.changes[changeset.raw_id].append(
+ ('removed', node, None, None, None, (0, 0))
+ )
# count inline comments
for path, lines in c.inline_comments:
@@ -311,7 +317,7 @@ class ChangesetController(BaseRepoController):
format='gitdiff').raw_diff()
cs1 = None
- cs2 = node.last_changeset.raw_id
+ cs2 = node.changeset.raw_id
c.changes.append(('added', node, diff, cs1, cs2))
for node in c.changeset.changed:
@@ -325,8 +331,8 @@ class ChangesetController(BaseRepoController):
diff = diffs.DiffProcessor(f_gitdiff,
format='gitdiff').raw_diff()
- cs1 = filenode_old.last_changeset.raw_id
- cs2 = node.last_changeset.raw_id
+ cs1 = filenode_old.changeset.raw_id
+ cs2 = node.changeset.raw_id
c.changes.append(('changed', node, diff, cs1, cs2))
response.content_type = 'text/plain'
@@ -335,8 +341,8 @@ class ChangesetController(BaseRepoController):
response.content_disposition = 'attachment; filename=%s.patch' \
% revision
- c.parent_tmpl = ''.join(['# Parent %s\n' % x.raw_id for x in
- c.changeset.parents])
+ c.parent_tmpl = ''.join(['# Parent %s\n' % x.raw_id
+ for x in c.changeset.parents])
c.diffs = ''
for x in c.changes:
diff --git a/rhodecode/controllers/files.py b/rhodecode/controllers/files.py
index ca75ce06..c49bb07a 100644
--- a/rhodecode/controllers/files.py
+++ b/rhodecode/controllers/files.py
@@ -428,8 +428,9 @@ class FilesController(BaseRepoController):
diff_name = '%s_vs_%s.diff' % (diff1, diff2)
response.content_type = 'text/plain'
- response.content_disposition = 'attachment; filename=%s' \
- % diff_name
+ response.content_disposition = (
+ 'attachment; filename=%s' % diff_name
+ )
return diff.raw_diff()
elif c.action == 'raw':
diff --git a/rhodecode/lib/diffs.py b/rhodecode/lib/diffs.py
index 36a4139e..145d6878 100644
--- a/rhodecode/lib/diffs.py
+++ b/rhodecode/lib/diffs.py
@@ -83,8 +83,8 @@ def wrapped_diff(filenode_old, filenode_new, cut_off_limit=None,
if not diff:
diff = wrap_to_table(_('No changes detected'))
- cs1 = filenode_old.last_changeset.raw_id
- cs2 = filenode_new.last_changeset.raw_id
+ cs1 = filenode_old.changeset.raw_id
+ cs2 = filenode_new.changeset.raw_id
return size, cs1, cs2, diff, stats
diff --git a/rhodecode/lib/middleware/simplegit.py b/rhodecode/lib/middleware/simplegit.py
index 59c6f1ae..00b16471 100644
--- a/rhodecode/lib/middleware/simplegit.py
+++ b/rhodecode/lib/middleware/simplegit.py
@@ -121,6 +121,7 @@ class SimpleGit(BaseVCSController):
#======================================================================
# CHECK ANONYMOUS PERMISSION
#======================================================================
+
if action in ['pull', 'push']:
anonymous_user = self.__get_user('default')
username = anonymous_user.username
@@ -169,15 +170,13 @@ class SimpleGit(BaseVCSController):
start_response)
#check permissions for this repository
- perm = self._check_permission(action, user,
- repo_name)
+ perm = self._check_permission(action, user, repo_name)
if perm is not True:
return HTTPForbidden()(environ, start_response)
#===================================================================
# GIT REQUEST HANDLING
#===================================================================
-
repo_path = safe_str(os.path.join(self.basepath, repo_name))
log.debug('Repository path is %s' % repo_path)
@@ -203,7 +202,6 @@ class SimpleGit(BaseVCSController):
:param repo_name: name of the repository
:param repo_path: full path to the repository
"""
-
_d = {'/' + repo_name: Repo(repo_path)}
backend = dulserver.DictBackend(_d)
gitserve = HTTPGitApplication(backend)
@@ -229,19 +227,24 @@ class SimpleGit(BaseVCSController):
return User.get_by_username(username)
def __get_action(self, environ):
- """Maps git request commands into a pull or push command.
+ """
+ Maps git request commands into a pull or push command.
:param environ:
"""
service = environ['QUERY_STRING'].split('=')
+
if len(service) > 1:
service_cmd = service[1]
mapping = {
'git-receive-pack': 'push',
'git-upload-pack': 'pull',
}
-
- return mapping.get(service_cmd,
- service_cmd if service_cmd else 'other')
+ op = mapping[service_cmd]
+ self._git_stored_op = op
+ return op
else:
- return 'other'
+ # try to fallback to stored variable as we don't know if the last
+ # operation is pull/push
+ op = getattr(self, '_git_stored_op', 'pull')
+ return op
diff --git a/rhodecode/lib/vcs/backends/git/changeset.py b/rhodecode/lib/vcs/backends/git/changeset.py
index 020bd34b..33c46061 100644
--- a/rhodecode/lib/vcs/backends/git/changeset.py
+++ b/rhodecode/lib/vcs/backends/git/changeset.py
@@ -247,7 +247,7 @@ class GitChangeset(BaseChangeset):
iterating commits.
"""
cmd = 'log --pretty="format: %%H" --name-status -p %s -- "%s"' % (
- '', path
+ self.id, path
)
so, se = self.repository.run_git_command(cmd)
ids = re.findall(r'\w{40}', so)
diff --git a/rhodecode/lib/vcs/backends/hg/changeset.py b/rhodecode/lib/vcs/backends/hg/changeset.py
index 2dd62bf0..02b7637c 100644
--- a/rhodecode/lib/vcs/backends/hg/changeset.py
+++ b/rhodecode/lib/vcs/backends/hg/changeset.py
@@ -187,9 +187,8 @@ class MercurialChangeset(BaseChangeset):
"""
Returns last commit of the file at the given ``path``.
"""
- fctx = self._get_filectx(path)
- changeset = self.repository.get_changeset(fctx.linkrev())
- return changeset
+ node = self.get_node(path)
+ return node.history[0]
def get_file_history(self, path):
"""
diff --git a/rhodecode/lib/vcs/nodes.py b/rhodecode/lib/vcs/nodes.py
index 2b8c528a..a5e6b8e9 100644
--- a/rhodecode/lib/vcs/nodes.py
+++ b/rhodecode/lib/vcs/nodes.py
@@ -306,14 +306,14 @@ class FileNode(Node):
attribute to indicate that type should *NOT* be calculated).
"""
if hasattr(self, '_mimetype'):
- if (isinstance(self._mimetype,(tuple,list,)) and
+ if (isinstance(self._mimetype, (tuple, list,)) and
len(self._mimetype) == 2):
return self._mimetype
else:
raise NodeError('given _mimetype attribute must be an 2 '
'element list or tuple')
- mtype,encoding = mimetypes.guess_type(self.name)
+ mtype, encoding = mimetypes.guess_type(self.name)
if mtype is None:
if self.is_binary:
@@ -322,7 +322,7 @@ class FileNode(Node):
else:
mtype = 'text/plain'
encoding = None
- return mtype,encoding
+ return mtype, encoding
@LazyProperty
def mimetype(self):
@@ -392,8 +392,8 @@ class FileNode(Node):
"""
Returns True if file has binary content.
"""
- bin = '\0' in self.content
- return bin
+ _bin = '\0' in self.content
+ return _bin
@LazyProperty
def extension(self):
@@ -406,6 +406,10 @@ class FileNode(Node):
"""
return bool(self.mode & stat.S_IXUSR)
+ def __repr__(self):
+ return '<%s %r @ %s>' % (self.__class__.__name__, self.path,
+ self.changeset.short_id)
+
class RemovedFileNode(FileNode):
"""
@@ -537,6 +541,10 @@ class DirNode(Node):
return size
+ def __repr__(self):
+ return '<%s %r @ %s>' % (self.__class__.__name__, self.path,
+ self.changeset.short_id)
+
class RootNode(DirNode):
"""
diff --git a/rhodecode/lib/vcs/utils/diffs.py b/rhodecode/lib/vcs/utils/diffs.py
index 06fefd27..b71667f5 100644
--- a/rhodecode/lib/vcs/utils/diffs.py
+++ b/rhodecode/lib/vcs/utils/diffs.py
@@ -15,17 +15,17 @@ from rhodecode.lib.vcs.exceptions import VCSError
from rhodecode.lib.vcs.nodes import FileNode, NodeError
-def get_udiff(filenode_old, filenode_new,show_whitespace=True):
+def get_udiff(filenode_old, filenode_new, show_whitespace=True):
"""
Returns unified diff between given ``filenode_old`` and ``filenode_new``.
"""
try:
- filenode_old_date = filenode_old.last_changeset.date
+ filenode_old_date = filenode_old.changeset.date
except NodeError:
filenode_old_date = None
try:
- filenode_new_date = filenode_new.last_changeset.date
+ filenode_new_date = filenode_new.changeset.date
except NodeError:
filenode_new_date = None
diff --git a/rhodecode/model/comment.py b/rhodecode/model/comment.py
index dc20c1eb..3753198c 100644
--- a/rhodecode/model/comment.py
+++ b/rhodecode/model/comment.py
@@ -67,7 +67,7 @@ class ChangesetCommentsModel(BaseModel):
repo = Repository.get(repo_id)
cs = repo.scm_instance.get_changeset(revision)
desc = cs.message
- author = cs.author_email
+ author_email = cs.author_email
comment = ChangesetComment()
comment.repo = repo
comment.user_id = user_id
@@ -92,22 +92,27 @@ class ChangesetCommentsModel(BaseModel):
)
)
body = text
+
+ # get the current participants of this changeset
recipients = ChangesetComment.get_users(revision=revision)
- # add changeset author
- recipients += [User.get_by_email(author)]
- NotificationModel().create(created_by=user_id, subject=subj,
- body=body, recipients=recipients,
- type_=Notification.TYPE_CHANGESET_COMMENT)
+ # add changeset author if it's in rhodecode system
+ recipients += [User.get_by_email(author_email)]
+
+ NotificationModel().create(
+ created_by=user_id, subject=subj, body=body,
+ recipients=recipients, type_=Notification.TYPE_CHANGESET_COMMENT
+ )
mention_recipients = set(self._extract_mentions(body))\
.difference(recipients)
if mention_recipients:
subj = _('[Mention]') + ' ' + subj
- NotificationModel().create(created_by=user_id, subject=subj,
- body=body,
- recipients=mention_recipients,
- type_=Notification.TYPE_CHANGESET_COMMENT)
+ NotificationModel().create(
+ created_by=user_id, subject=subj, body=body,
+ recipients=mention_recipients,
+ type_=Notification.TYPE_CHANGESET_COMMENT
+ )
return comment
diff --git a/rhodecode/model/db.py b/rhodecode/model/db.py
index ab6b9765..864c006b 100755
--- a/rhodecode/model/db.py
+++ b/rhodecode/model/db.py
@@ -807,7 +807,9 @@ class RepoGroup(Base, BaseModel):
@property
def repositories(self):
- return Repository.query().filter(Repository.group == self)
+ return Repository.query()\
+ .filter(Repository.group == self)\
+ .order_by(Repository.repo_name)
@property
def repositories_recursive_count(self):
diff --git a/rhodecode/model/notification.py b/rhodecode/model/notification.py
index dc5617e3..c8ef0f80 100644
--- a/rhodecode/model/notification.py
+++ b/rhodecode/model/notification.py
@@ -85,13 +85,19 @@ class NotificationModel(BaseModel):
if obj:
recipients_objs.append(obj)
recipients_objs = set(recipients_objs)
+ log.debug('sending notifications %s to %s' % (
+ type_, recipients_objs)
+ )
else:
# empty recipients means to all admins
recipients_objs = User.query().filter(User.admin == True).all()
-
- notif = Notification.create(created_by=created_by_obj, subject=subject,
- body=body, recipients=recipients_objs,
- type_=type_)
+ log.debug('sending notifications %s to admins: %s' % (
+ type_, recipients_objs)
+ )
+ notif = Notification.create(
+ created_by=created_by_obj, subject=subject,
+ body=body, recipients=recipients_objs, type_=type_
+ )
if with_email is False:
return notif
@@ -163,10 +169,12 @@ class NotificationModel(BaseModel):
of notification object
"""
- _map = {notification.TYPE_CHANGESET_COMMENT:_('commented on commit'),
- notification.TYPE_MESSAGE:_('sent message'),
- notification.TYPE_MENTION:_('mentioned you'),
- notification.TYPE_REGISTRATION:_('registered in RhodeCode')}
+ _map = {
+ notification.TYPE_CHANGESET_COMMENT: _('commented on commit'),
+ notification.TYPE_MESSAGE: _('sent message'),
+ notification.TYPE_MENTION: _('mentioned you'),
+ notification.TYPE_REGISTRATION: _('registered in RhodeCode')
+ }
DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S"
@@ -176,9 +184,10 @@ class NotificationModel(BaseModel):
else:
DTF = lambda d: datetime.datetime.strftime(d, DATETIME_FORMAT)
when = DTF(notification.created_on)
- data = dict(user=notification.created_by_user.username,
- action=_map[notification.type_],
- when=when)
+ data = dict(
+ user=notification.created_by_user.username,
+ action=_map[notification.type_], when=when,
+ )
return tmpl % data
@@ -194,10 +203,10 @@ class EmailNotificationModel(BaseModel):
self._tmpl_lookup = rhodecode.CONFIG['pylons.app_globals'].mako_lookup
self.email_types = {
- self.TYPE_CHANGESET_COMMENT:'email_templates/changeset_comment.html',
- self.TYPE_PASSWORD_RESET:'email_templates/password_reset.html',
- self.TYPE_REGISTRATION:'email_templates/registration.html',
- self.TYPE_DEFAULT:'email_templates/default.html'
+ self.TYPE_CHANGESET_COMMENT: 'email_templates/changeset_comment.html',
+ self.TYPE_PASSWORD_RESET: 'email_templates/password_reset.html',
+ self.TYPE_REGISTRATION: 'email_templates/registration.html',
+ self.TYPE_DEFAULT: 'email_templates/default.html'
}
def get_email_tmpl(self, type_, **kwargs):
@@ -210,7 +219,7 @@ class EmailNotificationModel(BaseModel):
base = self.email_types.get(type_, self.email_types[self.TYPE_DEFAULT])
email_template = self._tmpl_lookup.get_template(base)
# translator inject
- _kwargs = {'_':_}
+ _kwargs = {'_': _}
_kwargs.update(kwargs)
log.debug('rendering tmpl %s with kwargs %s' % (base, _kwargs))
return email_template.render(**_kwargs)
diff --git a/rhodecode/model/user.py b/rhodecode/model/user.py
index b87b7e01..8bb0f3b8 100644
--- a/rhodecode/model/user.py
+++ b/rhodecode/model/user.py
@@ -531,6 +531,13 @@ class UserModel(BaseModel):
"""
user = self.__get_user(user)
perm = self.__get_perm(perm)
+ # if this permission is already granted skip it
+ _perm = UserToPerm.query()\
+ .filter(UserToPerm.user == user)\
+ .filter(UserToPerm.permission == perm)\
+ .scalar()
+ if _perm:
+ return
new = UserToPerm()
new.user = user
new.permission = perm
@@ -546,7 +553,9 @@ class UserModel(BaseModel):
user = self.__get_user(user)
perm = self.__get_perm(perm)
- obj = UserToPerm.query().filter(UserToPerm.user == user)\
- .filter(UserToPerm.permission == perm).scalar()
+ obj = UserToPerm.query()\
+ .filter(UserToPerm.user == user)\
+ .filter(UserToPerm.permission == perm)\
+ .scalar()
if obj:
self.sa.delete(obj)
diff --git a/rhodecode/model/users_group.py b/rhodecode/model/users_group.py
index a23426c8..378edea5 100644
--- a/rhodecode/model/users_group.py
+++ b/rhodecode/model/users_group.py
@@ -172,6 +172,14 @@ class UsersGroupModel(BaseModel):
users_group = self.__get_users_group(users_group)
+ # if this permission is already granted skip it
+ _perm = UsersGroupToPerm.query()\
+ .filter(UsersGroupToPerm.users_group == users_group)\
+ .filter(UsersGroupToPerm.permission == perm)\
+ .scalar()
+ if _perm:
+ return
+
new = UsersGroupToPerm()
new.users_group = users_group
new.permission = perm
diff --git a/rhodecode/public/js/rhodecode.js b/rhodecode/public/js/rhodecode.js
index 936f0185..eb045480 100644
--- a/rhodecode/public/js/rhodecode.js
+++ b/rhodecode/public/js/rhodecode.js
@@ -613,16 +613,20 @@ var deleteNotification = function(url, notification_id,callbacks){
* QUICK REPO MENU
*/
var quick_repo_menu = function(){
- YUE.on(YUQ('.quick_repo_menu'),'click',function(e){
- var menu = e.currentTarget.firstElementChild.firstElementChild;
- if(YUD.hasClass(menu,'hidden')){
- YUD.addClass(e.currentTarget,'active');
- YUD.removeClass(menu,'hidden');
- }else{
- YUD.removeClass(e.currentTarget,'active');
- YUD.addClass(menu,'hidden');
- }
- })
+ YUE.on(YUQ('.quick_repo_menu'),'mouseenter',function(e){
+ var menu = e.currentTarget.firstElementChild.firstElementChild;
+ if(YUD.hasClass(menu,'hidden')){
+ YUD.replaceClass(e.currentTarget,'hidden', 'active');
+ YUD.replaceClass(menu, 'hidden', 'active');
+ }
+ })
+ YUE.on(YUQ('.quick_repo_menu'),'mouseleave',function(e){
+ var menu = e.currentTarget.firstElementChild.firstElementChild;
+ if(YUD.hasClass(menu,'active')){
+ YUD.replaceClass(e.currentTarget, 'active', 'hidden');
+ YUD.replaceClass(menu, 'active', 'hidden');
+ }
+ })
};
diff --git a/rhodecode/templates/changeset/raw_changeset.html b/rhodecode/templates/changeset/raw_changeset.html
index 933b93f4..2fe2d19c 100644
--- a/rhodecode/templates/changeset/raw_changeset.html
+++ b/rhodecode/templates/changeset/raw_changeset.html
@@ -1,8 +1,9 @@
+%if h.is_hg(c.scm_type):
# ${c.scm_type.upper()} changeset patch
# User ${c.changeset.author|n}
# Date ${c.changeset.date}
# Node ID ${c.changeset.raw_id}
${c.parent_tmpl}
${c.changeset.message}
-
+%endif
${c.diffs|n}
diff --git a/rhodecode/templates/files/files_annotate.html b/rhodecode/templates/files/files_annotate.html
index 7683a1ad..f33f5326 100644
--- a/rhodecode/templates/files/files_annotate.html
+++ b/rhodecode/templates/files/files_annotate.html
@@ -34,8 +34,8 @@
<dd>
<div>
${h.form(h.url('files_diff_home',repo_name=c.repo_name,f_path=c.f_path),method='get')}
- ${h.hidden('diff2',c.file.last_changeset.raw_id)}
- ${h.select('diff1',c.file.last_changeset.raw_id,c.file_history)}
+ ${h.hidden('diff2',c.file.changeset.raw_id)}
+ ${h.select('diff1',c.file.changeset.raw_id,c.file_history)}
${h.submit('diff','diff to revision',class_="ui-btn")}
${h.submit('show_rev','show at revision',class_="ui-btn")}
${h.end_form()}
@@ -46,7 +46,7 @@
<div class="code-header">
<div class="stats">
<div class="left"><img src="${h.url('/images/icons/file.png')}"/></div>
- <div class="left item">${h.link_to("r%s:%s" % (c.file.last_changeset.revision,h.short_id(c.file.last_changeset.raw_id)),h.url('changeset_home',repo_name=c.repo_name,revision=c.file.last_changeset.raw_id))}</div>
+ <div class="left item">${h.link_to("r%s:%s" % (c.file.changeset.revision,h.short_id(c.file.changeset.raw_id)),h.url('changeset_home',repo_name=c.repo_name,revision=c.file.changeset.raw_id))}</div>
<div class="left item">${h.format_byte_size(c.file.size,binary=True)}</div>
<div class="left item last">${c.file.mimetype}</div>
<div class="buttons">
diff --git a/rhodecode/templates/files/files_browser.html b/rhodecode/templates/files/files_browser.html
index d95f017d..98be6d60 100644
--- a/rhodecode/templates/files/files_browser.html
+++ b/rhodecode/templates/files/files_browser.html
@@ -47,7 +47,7 @@
<th>${_('Name')}</th>
<th>${_('Size')}</th>
<th>${_('Mimetype')}</th>
- <th>${_('Revision')}</th>
+ <th>${_('Last Revision')}</th>
<th>${_('Last modified')}</th>
<th>${_('Last commiter')}</th>
</tr>
@@ -70,7 +70,7 @@
%for cnt,node in enumerate(c.file):
<tr class="parity${cnt%2}">
<td>
- ${h.link_to(node.name,h.url('files_home',repo_name=c.repo_name,revision=c.changeset.raw_id,f_path=h.safe_unicode(node.path)),class_=file_class(node)+" ypjax-link")}
+ ${h.link_to(node.name,h.url('files_home',repo_name=c.repo_name,revision=c.changeset.raw_id,f_path=h.safe_unicode(node.path)),class_=file_class(node)+" ypjax-link")}
</td>
<td>
%if node.is_file():
diff --git a/rhodecode/templates/files/files_edit.html b/rhodecode/templates/files/files_edit.html
index f76d5bfb..c31b0384 100644
--- a/rhodecode/templates/files/files_edit.html
+++ b/rhodecode/templates/files/files_edit.html
@@ -42,7 +42,7 @@
<div class="code-header">
<div class="stats">
<div class="left"><img src="${h.url('/images/icons/file.png')}"/></div>
- <div class="left item">${h.link_to("r%s:%s" % (c.file.last_changeset.revision,h.short_id(c.file.last_changeset.raw_id)),h.url('changeset_home',repo_name=c.repo_name,revision=c.file.last_changeset.raw_id))}</div>
+ <div class="left item">${h.link_to("r%s:%s" % (c.file.changeset.revision,h.short_id(c.file.changeset.raw_id)),h.url('changeset_home',repo_name=c.repo_name,revision=c.file.changeset.raw_id))}</div>
<div class="left item">${h.format_byte_size(c.file.size,binary=True)}</div>
<div class="left item last">${c.file.mimetype}</div>
<div class="buttons">
diff --git a/rhodecode/templates/files/files_source.html b/rhodecode/templates/files/files_source.html
index 42c4e108..ec2c1d49 100644
--- a/rhodecode/templates/files/files_source.html
+++ b/rhodecode/templates/files/files_source.html
@@ -3,8 +3,8 @@
<dd>
<div>
${h.form(h.url('files_diff_home',repo_name=c.repo_name,f_path=c.f_path),method='get')}
- ${h.hidden('diff2',c.file.last_changeset.raw_id)}
- ${h.select('diff1',c.file.last_changeset.raw_id,c.file_history)}
+ ${h.hidden('diff2',c.file.changeset.raw_id)}
+ ${h.select('diff1',c.file.changeset.raw_id,c.file_history)}
${h.submit('diff','diff to revision',class_="ui-btn")}
${h.submit('show_rev','show at revision',class_="ui-btn")}
${h.end_form()}
@@ -16,27 +16,27 @@
<div class="code-header">
<div class="stats">
<div class="left img"><img src="${h.url('/images/icons/file.png')}"/></div>
- <div class="left item"><pre>${h.link_to("r%s:%s" % (c.file.last_changeset.revision,h.short_id(c.file.last_changeset.raw_id)),h.url('changeset_home',repo_name=c.repo_name,revision=c.file.last_changeset.raw_id))}</pre></div>
+ <div class="left item"><pre>${h.link_to("r%s:%s" % (c.file.changeset.revision,h.short_id(c.file.changeset.raw_id)),h.url('changeset_home',repo_name=c.repo_name,revision=c.file.changeset.raw_id))}</pre></div>
<div class="left item"><pre>${h.format_byte_size(c.file.size,binary=True)}</pre></div>
<div class="left item last"><pre>${c.file.mimetype}</pre></div>
<div class="buttons">
- ${h.link_to(_('show annotation'),h.url('files_annotate_home',repo_name=c.repo_name,revision=c.file.last_changeset.raw_id,f_path=c.f_path),class_="ui-btn")}
- ${h.link_to(_('show as raw'),h.url('files_raw_home',repo_name=c.repo_name,revision=c.file.last_changeset.raw_id,f_path=c.f_path),class_="ui-btn")}
- ${h.link_to(_('download as raw'),h.url('files_rawfile_home',repo_name=c.repo_name,revision=c.file.last_changeset.raw_id,f_path=c.f_path),class_="ui-btn")}
+ ${h.link_to(_('show annotation'),h.url('files_annotate_home',repo_name=c.repo_name,revision=c.file.changeset.raw_id,f_path=c.f_path),class_="ui-btn")}
+ ${h.link_to(_('show as raw'),h.url('files_raw_home',repo_name=c.repo_name,revision=c.file.changeset.raw_id,f_path=c.f_path),class_="ui-btn")}
+ ${h.link_to(_('download as raw'),h.url('files_rawfile_home',repo_name=c.repo_name,revision=c.file.changeset.raw_id,f_path=c.f_path),class_="ui-btn")}
% if h.HasRepoPermissionAny('repository.write','repository.admin')(c.repo_name):
% if not c.file.is_binary:
- ${h.link_to(_('edit'),h.url('files_edit_home',repo_name=c.repo_name,revision=c.file.last_changeset.raw_id,f_path=c.f_path),class_="ui-btn")}
+ ${h.link_to(_('edit'),h.url('files_edit_home',repo_name=c.repo_name,revision=c.file.changeset.raw_id,f_path=c.f_path),class_="ui-btn")}
% endif
% endif
</div>
</div>
<div class="author">
<div class="gravatar">
- <img alt="gravatar" src="${h.gravatar_url(h.email(c.file.last_changeset.author),16)}"/>
+ <img alt="gravatar" src="${h.gravatar_url(h.email(c.file.changeset.author),16)}"/>
</div>
- <div title="${c.file.last_changeset.author}" class="user">${h.person(c.file.last_changeset.author)}</div>
+ <div title="${c.file.changeset.author}" class="user">${h.person(c.file.changeset.author)}</div>
</div>
- <div class="commit">${h.urlify_commit(c.file.last_changeset.message,c.repo_name)}</div>
+ <div class="commit">${h.urlify_commit(c.file.changeset.message,c.repo_name)}</div>
</div>
<div class="code-body">
%if c.file.is_binary:
@@ -46,7 +46,7 @@
${h.pygmentize(c.file,linenos=True,anchorlinenos=True,lineanchors='L',cssclass="code-highlight")}
%else:
${_('File is too big to display')} ${h.link_to(_('show as raw'),
- h.url('files_raw_home',repo_name=c.repo_name,revision=c.file.last_changeset.raw_id,f_path=c.f_path))}
+ h.url('files_raw_home',repo_name=c.repo_name,revision=c.file.changeset.raw_id,f_path=c.f_path))}
%endif
<script type="text/javascript">
function highlight_lines(lines){
diff --git a/rhodecode/tests/functional/test_files.py b/rhodecode/tests/functional/test_files.py
index d564bab6..1af4f4c7 100644
--- a/rhodecode/tests/functional/test_files.py
+++ b/rhodecode/tests/functional/test_files.py
@@ -75,7 +75,7 @@ class TestFilesController(TestController):
#test or history
response.mustcontain("""<optgroup label="Changesets">
-<option selected="selected" value="8911406ad776fdd3d0b9932a2e89677e57405a48">r167:8911406ad776 (default)</option>
+<option value="8911406ad776fdd3d0b9932a2e89677e57405a48">r167:8911406ad776 (default)</option>
<option value="aa957ed78c35a1541f508d2ec90e501b0a9e3167">r165:aa957ed78c35 (default)</option>
<option value="48e11b73e94c0db33e736eaeea692f990cb0b5f1">r140:48e11b73e94c (default)</option>
<option value="adf3cbf483298563b968a6c673cd5bde5f7d5eea">r126:adf3cbf48329 (default)</option>
@@ -110,23 +110,20 @@ class TestFilesController(TestController):
<option value="3803844fdbd3b711175fc3da9bdacfcd6d29a6fb">r7:3803844fdbd3 (default)</option>
</optgroup>
<optgroup label="Branches">
-<option value="27cd5cce30c96924232dffcd24178a07ffeb5dfc">default</option>
+<option selected="selected" value="27cd5cce30c96924232dffcd24178a07ffeb5dfc">default</option>
<option value="97e8b885c04894463c51898e14387d80c30ed1ee">git</option>
<option value="2e6a2bf9356ca56df08807f4ad86d480da72a8f4">web</option>
</optgroup>
<optgroup label="Tags">
-<option value="27cd5cce30c96924232dffcd24178a07ffeb5dfc">tip</option>
+<option selected="selected" value="27cd5cce30c96924232dffcd24178a07ffeb5dfc">tip</option>
<option value="fd4bdb5e9b2a29b4393a4ac6caef48c17ee1a200">0.1.4</option>
<option value="17544fbfcd33ffb439e2b728b5d526b1ef30bfcf">0.1.3</option>
<option value="a7e60bff65d57ac3a1a1ce3b12a70f8a9e8a7720">0.1.2</option>
<option value="eb3a60fc964309c1a318b8dfe26aa2d1586c85ae">0.1.1</option>
-</optgroup>""")
+</optgroup>
+""")
- response.mustcontain("""<div class="commit">Partially implemented #16. filecontent/commit message/author/node name are safe_unicode now.
-In addition some other __str__ are unicode as well
-Added test for unicode
-Improved test to clone into uniq repository.
-removed extra unicode conversion in diff.</div>""")
+ response.mustcontain("""<div class="commit">merge</div>""")
response.mustcontain("""<span style="text-transform: uppercase;"><a href="#">branch: default</a></span>""")
@@ -139,7 +136,7 @@ removed extra unicode conversion in diff.</div>""")
response.mustcontain("""<optgroup label="Changesets">
-<option selected="selected" value="8911406ad776fdd3d0b9932a2e89677e57405a48">r167:8911406ad776 (default)</option>
+<option value="8911406ad776fdd3d0b9932a2e89677e57405a48">r167:8911406ad776 (default)</option>
<option value="aa957ed78c35a1541f508d2ec90e501b0a9e3167">r165:aa957ed78c35 (default)</option>
<option value="48e11b73e94c0db33e736eaeea692f990cb0b5f1">r140:48e11b73e94c (default)</option>
<option value="adf3cbf483298563b968a6c673cd5bde5f7d5eea">r126:adf3cbf48329 (default)</option>
@@ -174,18 +171,17 @@ removed extra unicode conversion in diff.</div>""")
<option value="3803844fdbd3b711175fc3da9bdacfcd6d29a6fb">r7:3803844fdbd3 (default)</option>
</optgroup>
<optgroup label="Branches">
-<option value="27cd5cce30c96924232dffcd24178a07ffeb5dfc">default</option>
+<option selected="selected" value="27cd5cce30c96924232dffcd24178a07ffeb5dfc">default</option>
<option value="97e8b885c04894463c51898e14387d80c30ed1ee">git</option>
<option value="2e6a2bf9356ca56df08807f4ad86d480da72a8f4">web</option>
</optgroup>
<optgroup label="Tags">
-<option value="27cd5cce30c96924232dffcd24178a07ffeb5dfc">tip</option>
+<option selected="selected" value="27cd5cce30c96924232dffcd24178a07ffeb5dfc">tip</option>
<option value="fd4bdb5e9b2a29b4393a4ac6caef48c17ee1a200">0.1.4</option>
<option value="17544fbfcd33ffb439e2b728b5d526b1ef30bfcf">0.1.3</option>
<option value="a7e60bff65d57ac3a1a1ce3b12a70f8a9e8a7720">0.1.2</option>
<option value="eb3a60fc964309c1a318b8dfe26aa2d1586c85ae">0.1.1</option>
-</optgroup>
-""")
+</optgroup>""")
response.mustcontain("""<span style="text-transform: uppercase;"><a href="#">branch: default</a></span>""")