changeset 636:ffd07396d315 beta

Fixes for raw_id, needed for git Renamed hg controller to home css html changes
author Marcin Kuzminski <marcin@python-works.com>
date Tue, 26 Oct 2010 03:20:32 +0200
parents fd63782c4426
children b04d5214fd3c
files rhodecode/config/routing.py rhodecode/controllers/admin/repos.py rhodecode/controllers/changelog.py rhodecode/controllers/changeset.py rhodecode/controllers/feed.py rhodecode/controllers/files.py rhodecode/controllers/hg.py rhodecode/controllers/home.py rhodecode/controllers/login.py rhodecode/controllers/settings.py rhodecode/lib/helpers.py rhodecode/lib/utils.py rhodecode/model/hg.py rhodecode/public/css/style.css rhodecode/templates/base/base.html rhodecode/templates/branches/branches_data.html rhodecode/templates/changelog/changelog.html rhodecode/templates/changeset/changeset.html rhodecode/templates/errors/error_404.html rhodecode/templates/files/file_diff.html rhodecode/templates/files/files.html rhodecode/templates/files/files_annotate.html rhodecode/templates/files/files_source.html rhodecode/templates/index.html rhodecode/templates/shortlog/shortlog_data.html rhodecode/templates/summary/summary.html rhodecode/templates/tags/tags_data.html
diffstat 27 files changed, 346 insertions(+), 328 deletions(-) [+]
line wrap: on
line diff
--- a/rhodecode/config/routing.py	Mon Oct 25 03:19:01 2010 +0200
+++ b/rhodecode/config/routing.py	Tue Oct 26 03:20:32 2010 +0200
@@ -35,7 +35,7 @@
     #==========================================================================
 
     #MAIN PAGE
-    map.connect('hg_home', '/', controller='hg', action='index')
+    map.connect('home', '/', controller='home', action='index')
     map.connect('bugtracker', "http://bitbucket.org/marcinkuzminski/rhodecode/issues", _static=True)
     map.connect('gpl_license', "http://www.gnu.org/licenses/gpl.html", _static=True)
     #ADMIN REPOSITORY REST ROUTES
--- a/rhodecode/controllers/admin/repos.py	Mon Oct 25 03:19:01 2010 +0200
+++ b/rhodecode/controllers/admin/repos.py	Tue Oct 26 03:20:32 2010 +0200
@@ -48,22 +48,22 @@
     # To properly map this controller, ensure your config/routing.py
     # file has a resource setup:
     #     map.resource('repo', 'repos')
-    
+
     @LoginRequired()
     @HasPermissionAnyDecorator('hg.admin', 'hg.create.repository')
     def __before__(self):
         c.admin_user = session.get('admin_user')
         c.admin_username = session.get('admin_username')
         super(ReposController, self).__before__()
-    
-    @HasPermissionAllDecorator('hg.admin')            
+
+    @HasPermissionAllDecorator('hg.admin')
     def index(self, format='html'):
         """GET /repos: All items in the collection"""
         # url('repos')
         cached_repo_list = HgModel().get_repos()
         c.repos_list = sorted(cached_repo_list, key=itemgetter('name_sort'))
         return render('admin/repos/repos.html')
-    
+
     @HasPermissionAnyDecorator('hg.admin', 'hg.create.repository')
     def create(self):
         """POST /repos: Create a new item"""
@@ -83,22 +83,22 @@
                               form_result['repo_name'], '', self.sa)
             else:
                 action_logger(self.rhodecode_user, 'admin_created_repo',
-                              form_result['repo_name'], '', self.sa)                
-                                                                             
+                              form_result['repo_name'], '', self.sa)
+
         except formencode.Invalid, errors:
             c.new_repo = errors.value['repo_name']
-            
+
             if request.POST.get('user_created'):
                 r = render('admin/repos/repo_add_create_repository.html')
-            else:              
+            else:
                 r = render('admin/repos/repo_add.html')
-            
+
             return htmlfill.render(
                 r,
                 defaults=errors.value,
                 errors=errors.error_dict or {},
                 prefix_error=False,
-                encoding="UTF-8")      
+                encoding="UTF-8")
 
         except Exception:
             log.error(traceback.format_exc())
@@ -106,9 +106,9 @@
                     % form_result.get('repo_name')
             h.flash(msg, category='error')
         if request.POST.get('user_created'):
-            return redirect(url('hg_home'))    
+            return redirect(url('home'))
         return redirect(url('repos'))
-    
+
     @HasPermissionAllDecorator('hg.admin')
     def new(self, format='html'):
         """GET /repos/new: Form to create a new item"""
@@ -116,7 +116,7 @@
         c.new_repo = h.repo_name_slug(new_repo)
 
         return render('admin/repos/repo_add.html')
-    
+
     @HasPermissionAllDecorator('hg.admin')
     def update(self, repo_name):
         """PUT /repos/repo_name: Update an existing item"""
@@ -129,7 +129,7 @@
         repo_model = RepoModel()
         changed_name = repo_name
         _form = RepoForm(edit=True, old_data={'repo_name':repo_name})()
-        
+
         try:
             form_result = _form.to_python(dict(request.POST))
             repo_model.update(repo_name, form_result)
@@ -147,14 +147,14 @@
                 errors=errors.error_dict or {},
                 prefix_error=False,
                 encoding="UTF-8")
- 
+
         except Exception:
             log.error(traceback.format_exc())
             h.flash(_('error occured during update of repository %s') \
                     % repo_name, category='error')
-            
+
         return redirect(url('edit_repo', repo_name=changed_name))
-    
+
     @HasPermissionAllDecorator('hg.admin')
     def delete(self, repo_name):
         """DELETE /repos/repo_name: Delete an existing item"""
@@ -164,65 +164,65 @@
         #    h.form(url('repo', repo_name=ID),
         #           method='delete')
         # url('repo', repo_name=ID)
-        
+
         repo_model = RepoModel()
         repo = repo_model.get(repo_name)
         if not repo:
-            h.flash(_('%s repository is not mapped to db perhaps' 
+            h.flash(_('%s repository is not mapped to db perhaps'
                       ' it was moved or renamed  from the filesystem'
                       ' please run the application again'
                       ' in order to rescan repositories') % repo_name,
                       category='error')
-        
+
             return redirect(url('repos'))
         try:
             action_logger(self.rhodecode_user, 'admin_deleted_repo',
                               repo_name, '', self.sa)
-            repo_model.delete(repo)            
+            repo_model.delete(repo)
             invalidate_cache('cached_repo_list')
             h.flash(_('deleted repository %s') % repo_name, category='success')
-           
+
         except Exception, e:
             log.error(traceback.format_exc())
             h.flash(_('An error occured during deletion of %s') % repo_name,
                     category='error')
-        
+
         return redirect(url('repos'))
-    
-    @HasPermissionAllDecorator('hg.admin')        
+
+    @HasPermissionAllDecorator('hg.admin')
     def delete_perm_user(self, repo_name):
         """
         DELETE an existing repository permission user
         :param repo_name:
         """
-        
+
         try:
             repo_model = RepoModel()
-            repo_model.delete_perm_user(request.POST, repo_name)            
+            repo_model.delete_perm_user(request.POST, repo_name)
         except Exception, e:
             h.flash(_('An error occured during deletion of repository user'),
                     category='error')
             raise HTTPInternalServerError()
-    
-    @HasPermissionAllDecorator('hg.admin')    
+
+    @HasPermissionAllDecorator('hg.admin')
     def show(self, repo_name, format='html'):
         """GET /repos/repo_name: Show a specific item"""
         # url('repo', repo_name=ID)
-    
-    @HasPermissionAllDecorator('hg.admin')    
+
+    @HasPermissionAllDecorator('hg.admin')
     def edit(self, repo_name, format='html'):
         """GET /repos/repo_name/edit: Form to edit an existing item"""
         # url('edit_repo', repo_name=ID)
         repo_model = RepoModel()
         c.repo_info = repo = repo_model.get(repo_name)
         if not repo:
-            h.flash(_('%s repository is not mapped to db perhaps' 
+            h.flash(_('%s repository is not mapped to db perhaps'
                       ' it was created or renamed from the filesystem'
                       ' please run the application again'
                       ' in order to rescan repositories') % repo_name,
                       category='error')
-        
-            return redirect(url('repos'))        
+
+            return redirect(url('repos'))
         defaults = c.repo_info.__dict__
         if c.repo_info.user:
             defaults.update({'user':c.repo_info.user.username})
@@ -230,16 +230,16 @@
             replacement_user = self.sa.query(User)\
             .filter(User.admin == True).first().username
             defaults.update({'user':replacement_user})
-            
+
         c.users_array = repo_model.get_users_js()
-        
+
         for p in c.repo_info.repo_to_perm:
-            defaults.update({'perm_%s' % p.user.username: 
+            defaults.update({'perm_%s' % p.user.username:
                              p.permission.permission_name})
-            
+
         return htmlfill.render(
             render('admin/repos/repo_edit.html'),
             defaults=defaults,
             encoding="UTF-8",
             force_defaults=False
-        )          
+        )
--- a/rhodecode/controllers/changelog.py	Mon Oct 25 03:19:01 2010 +0200
+++ b/rhodecode/controllers/changelog.py	Tue Oct 26 03:20:32 2010 +0200
@@ -38,13 +38,13 @@
 log = logging.getLogger(__name__)
 
 class ChangelogController(BaseController):
-    
+
     @LoginRequired()
     @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
-                                   'repository.admin')    
+                                   'repository.admin')
     def __before__(self):
         super(ChangelogController, self).__before__()
-                
+
     def index(self):
         limit = 100
         default = 20
@@ -53,7 +53,7 @@
                 int_size = int(request.params.get('size'))
             except ValueError:
                 int_size = default
-            int_size = int_size if int_size <= limit else limit 
+            int_size = int_size if int_size <= limit else limit
             c.size = int_size
             session['changelog_size'] = c.size
             session.save()
@@ -61,35 +61,37 @@
             c.size = int(session.get('changelog_size', default))
 
         changesets = HgModel().get_repo(c.repo_name)
-            
+
         p = int(request.params.get('page', 1))
         c.total_cs = len(changesets)
         c.pagination = Page(changesets, page=p, item_count=c.total_cs,
                             items_per_page=c.size)
-            
+
         self._graph(changesets, c.size, p)
-        
+
         return render('changelog/changelog.html')
 
 
     def _graph(self, repo, size, p):
         revcount = size
         if not repo.revisions:return json.dumps([]), 0
-        
+
         max_rev = repo.revisions[-1]
+
         offset = 1 if p == 1 else  ((p - 1) * revcount + 1)
+
         rev_start = repo.revisions[(-1 * offset)]
-        
+
         revcount = min(max_rev, revcount)
         rev_end = max(0, rev_start - revcount)
         dag = graph_rev(repo.repo, rev_start, rev_end)
-        
+
         c.dag = tree = list(colored(dag))
         data = []
         for (id, type, ctx, vtx, edges) in tree:
             if type != CHANGESET:
                 continue
             data.append(('', vtx, edges))
-    
-        c.jsdata = json.dumps(data) 
 
+        c.jsdata = json.dumps(data)
+
--- a/rhodecode/controllers/changeset.py	Mon Oct 25 03:19:01 2010 +0200
+++ b/rhodecode/controllers/changeset.py	Tue Oct 26 03:20:32 2010 +0200
@@ -37,44 +37,44 @@
 log = logging.getLogger(__name__)
 
 class ChangesetController(BaseController):
-    
+
     @LoginRequired()
     @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
-                                   'repository.admin')       
+                                   'repository.admin')
     def __before__(self):
         super(ChangesetController, self).__before__()
-        
+
     def index(self, revision):
         hg_model = HgModel()
         cut_off_limit = 1024 * 250
-        
+
         def wrap_to_table(str):
-            
+
             return '''<table class="code-difftable">
                         <tr class="line">
                         <td class="lineno new"></td>
                         <td class="code"><pre>%s</pre></td>
                         </tr>
                       </table>''' % str
-            
+
         try:
             c.changeset = hg_model.get_repo(c.repo_name).get_changeset(revision)
         except RepositoryError:
             log.error(traceback.format_exc())
-            return redirect(url('hg_home'))
+            return redirect(url('home'))
         else:
             try:
                 c.changeset_old = c.changeset.parents[0]
             except IndexError:
                 c.changeset_old = None
             c.changes = []
-            
+
             #===================================================================
             # ADDED FILES
             #===================================================================
             c.sum_added = 0
             for node in c.changeset.added:
-                
+
                 filenode_old = FileNode(node.path, '', EmptyChangeset())
                 if filenode_old.is_binary or node.is_binary:
                     diff = wrap_to_table(_('binary file'))
@@ -83,29 +83,29 @@
                     if c.sum_added < cut_off_limit:
                         f_udiff = differ.get_udiff(filenode_old, node)
                         diff = differ.DiffProcessor(f_udiff).as_html()
-                                                    
+
                     else:
                         diff = wrap_to_table(_('Changeset is to big and was cut'
                                             ' off, see raw changeset instead'))
-                        
+
                 cs1 = None
-                cs2 = node.last_changeset.short_id                                        
+                cs2 = node.last_changeset.raw_id
                 c.changes.append(('added', node, diff, cs1, cs2))
-            
+
             #===================================================================
             # CHANGED FILES
             #===================================================================
-            c.sum_removed = 0    
+            c.sum_removed = 0
             for node in c.changeset.changed:
                 try:
                     filenode_old = c.changeset_old.get_node(node.path)
                 except ChangesetError:
                     filenode_old = FileNode(node.path, '', EmptyChangeset())
-                    
+
                 if filenode_old.is_binary or node.is_binary:
                     diff = wrap_to_table(_('binary file'))
                 else:
-                    
+
                     if c.sum_removed < cut_off_limit:
                         f_udiff = differ.get_udiff(filenode_old, node)
                         diff = differ.DiffProcessor(f_udiff).as_html()
@@ -114,68 +114,68 @@
                     else:
                         diff = wrap_to_table(_('Changeset is to big and was cut'
                                             ' off, see raw changeset instead'))
-                
-                
-                cs1 = filenode_old.last_changeset.short_id
-                cs2 = node.last_changeset.short_id                    
+
+
+                cs1 = filenode_old.last_changeset.raw_id
+                cs2 = node.last_changeset.raw_id
                 c.changes.append(('changed', node, diff, cs1, cs2))
-                
+
             #===================================================================
             # REMOVED FILES    
             #===================================================================
             for node in c.changeset.removed:
-                c.changes.append(('removed', node, None, None, None))            
-            
+                c.changes.append(('removed', node, None, None, None))
+
         return render('changeset/changeset.html')
 
     def raw_changeset(self, revision):
-        
+
         hg_model = HgModel()
         method = request.GET.get('diff', 'show')
         try:
             c.changeset = hg_model.get_repo(c.repo_name).get_changeset(revision)
         except RepositoryError:
             log.error(traceback.format_exc())
-            return redirect(url('hg_home'))
+            return redirect(url('home'))
         else:
             try:
                 c.changeset_old = c.changeset.parents[0]
             except IndexError:
                 c.changeset_old = None
             c.changes = []
-            
+
             for node in c.changeset.added:
                 filenode_old = FileNode(node.path, '')
                 if filenode_old.is_binary or node.is_binary:
                     diff = _('binary file')
-                else:    
+                else:
                     f_udiff = differ.get_udiff(filenode_old, node)
                     diff = differ.DiffProcessor(f_udiff).raw_diff()
 
                 cs1 = None
-                cs2 = node.last_changeset.short_id                                        
+                cs2 = node.last_changeset.raw_id
                 c.changes.append(('added', node, diff, cs1, cs2))
-                
+
             for node in c.changeset.changed:
                 filenode_old = c.changeset_old.get_node(node.path)
                 if filenode_old.is_binary or node.is_binary:
                     diff = _('binary file')
-                else:    
+                else:
                     f_udiff = differ.get_udiff(filenode_old, node)
                     diff = differ.DiffProcessor(f_udiff).raw_diff()
 
-                cs1 = filenode_old.last_changeset.short_id
-                cs2 = node.last_changeset.short_id                    
-                c.changes.append(('changed', node, diff, cs1, cs2))      
-        
+                cs1 = filenode_old.last_changeset.raw_id
+                cs2 = node.last_changeset.raw_id
+                c.changes.append(('changed', node, diff, cs1, cs2))
+
         response.content_type = 'text/plain'
         if method == 'download':
-            response.content_disposition = 'attachment; filename=%s.patch' % revision 
+            response.content_disposition = 'attachment; filename=%s.patch' % revision
         parent = True if len(c.changeset.parents) > 0 else False
         c.parent_tmpl = 'Parent  %s' % c.changeset.parents[0].raw_id if parent else ''
-    
+
         c.diffs = ''
         for x in c.changes:
             c.diffs += x[2]
-            
+
         return render('changeset/raw_changeset.html')
--- a/rhodecode/controllers/feed.py	Mon Oct 25 03:19:01 2010 +0200
+++ b/rhodecode/controllers/feed.py	Tue Oct 26 03:20:32 2010 +0200
@@ -54,7 +54,7 @@
         for cs in changesets[:self.feed_nr]:
             feed.add_item(title=cs.message,
                           link=url('changeset_home', repo_name=repo_name,
-                                   revision=cs.short_id, qualified=True),
+                                   revision=cs.raw_id, qualified=True),
                                    description=str(cs.date))
         
         response.content_type = feed.mime_type
@@ -73,7 +73,7 @@
         for cs in changesets[:self.feed_nr]:
             feed.add_item(title=cs.message,
                           link=url('changeset_home', repo_name=repo_name,
-                                   revision=cs.short_id, qualified=True),
+                                   revision=cs.raw_id, qualified=True),
                           description=str(cs.date))
             
         response.content_type = feed.mime_type
--- a/rhodecode/controllers/files.py	Mon Oct 25 03:19:01 2010 +0200
+++ b/rhodecode/controllers/files.py	Tue Oct 26 03:20:32 2010 +0200
@@ -36,14 +36,14 @@
 import logging
 import rhodecode.lib.helpers as h
 import tempfile
-        
+
 log = logging.getLogger(__name__)
 
 class FilesController(BaseController):
-    
+
     @LoginRequired()
     @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
-                                   'repository.admin')       
+                                   'repository.admin')
     def __before__(self):
         super(FilesController, self).__before__()
         c.file_size_limit = 250 * 1024 #limit of file size to display
@@ -52,41 +52,41 @@
         hg_model = HgModel()
         c.repo = repo = hg_model.get_repo(c.repo_name)
         revision = request.POST.get('at_rev', None) or revision
-        
+
         def get_next_rev(cur):
             max_rev = len(c.repo.revisions) - 1
             r = cur + 1
             if r > max_rev:
                 r = max_rev
             return r
-            
+
         def get_prev_rev(cur):
             r = cur - 1
             return r
 
         c.f_path = f_path
-     
-        
+
+
         try:
             cur_rev = repo.get_changeset(revision).revision
-            prev_rev = repo.get_changeset(get_prev_rev(cur_rev)).short_id
-            next_rev = repo.get_changeset(get_next_rev(cur_rev)).short_id
-                    
+            prev_rev = repo.get_changeset(get_prev_rev(cur_rev)).raw_id
+            next_rev = repo.get_changeset(get_next_rev(cur_rev)).raw_id
+
             c.url_prev = url('files_home', repo_name=c.repo_name,
-                             revision=prev_rev, f_path=f_path) 
+                             revision=prev_rev, f_path=f_path)
             c.url_next = url('files_home', repo_name=c.repo_name,
-                             revision=next_rev, f_path=f_path)   
-                    
+                             revision=next_rev, f_path=f_path)
+
             c.changeset = repo.get_changeset(revision)
-                        
-            c.cur_rev = c.changeset.short_id
+
+            c.cur_rev = c.changeset.raw_id
             c.rev_nr = c.changeset.revision
             c.files_list = c.changeset.get_node(f_path)
             c.file_history = self._get_history(repo, c.files_list, f_path)
-            
+
         except (RepositoryError, ChangesetError):
             c.files_list = None
-        
+
         return render('files/files.html')
 
     def rawfile(self, repo_name, revision, f_path):
@@ -95,7 +95,7 @@
         file_node = c.repo.get_changeset(revision).get_node(f_path)
         response.content_type = file_node.mimetype
         response.content_disposition = 'attachment; filename=%s' \
-                                                    % f_path.split('/')[-1] 
+                                                    % f_path.split('/')[-1]
         return file_node.content
 
     def raw(self, repo_name, revision, f_path):
@@ -103,21 +103,21 @@
         c.repo = hg_model.get_repo(c.repo_name)
         file_node = c.repo.get_changeset(revision).get_node(f_path)
         response.content_type = 'text/plain'
-        
+
         return file_node.content
-    
+
     def annotate(self, repo_name, revision, f_path):
         hg_model = HgModel()
         c.repo = hg_model.get_repo(c.repo_name)
         cs = c.repo.get_changeset(revision)
         c.file = cs.get_node(f_path)
         c.file_msg = cs.get_file_message(f_path)
-        c.cur_rev = cs.short_id
-        c.rev_nr = cs.revision        
+        c.cur_rev = cs.raw_id
+        c.rev_nr = cs.revision
         c.f_path = f_path
 
         return render('files/files_annotate.html')
-      
+
     def archivefile(self, repo_name, revision, fileformat):
         archive_specs = {
           '.tar.bz2': ('application/x-tar', 'tbz2'),
@@ -126,7 +126,7 @@
         }
         if not archive_specs.has_key(fileformat):
             return 'Unknown archive type %s' % fileformat
-                        
+
         def read_in_chunks(file_object, chunk_size=1024 * 40):
             """Lazy function (generator) to read a file piece by piece.
             Default chunk size: 40k."""
@@ -134,8 +134,8 @@
                 data = file_object.read(chunk_size)
                 if not data:
                     break
-                yield data        
-            
+                yield data
+
         archive = tempfile.TemporaryFile()
         repo = HgModel().get_repo(repo_name).repo
         fname = '%s-%s%s' % (repo_name, revision, fileformat)
@@ -145,7 +145,7 @@
         response.content_disposition = 'attachment; filename=%s' % fname
         archive.seek(0)
         return read_in_chunks(archive)
-    
+
     def diff(self, repo_name, f_path):
         hg_model = HgModel()
         diff1 = request.GET.get('diff1')
@@ -162,7 +162,7 @@
             else:
                 c.changeset_1 = EmptyChangeset()
                 node1 = FileNode('.', '', changeset=c.changeset_1)
-                
+
             if diff2 not in ['', None, 'None', '0' * 12, '0' * 40]:
                 c.changeset_2 = c.repo.get_changeset(diff2)
                 node2 = c.changeset_2.get_node(f_path)
@@ -173,19 +173,16 @@
             return redirect(url('files_home',
                                 repo_name=c.repo_name, f_path=f_path))
 
-        c.diff1 = 'r%s:%s' % (c.changeset_1.revision, c.changeset_1.short_id)
-        c.diff2 = 'r%s:%s' % (c.changeset_2.revision, c.changeset_2.short_id)
-        
         f_udiff = differ.get_udiff(node1, node2)
         diff = differ.DiffProcessor(f_udiff)
-                                
+
         if c.action == 'download':
             diff_name = '%s_vs_%s.diff' % (diff1, diff2)
             response.content_type = 'text/plain'
             response.content_disposition = 'attachment; filename=%s' \
-                                                    % diff_name             
+                                                    % diff_name
             return diff.raw_diff()
-        
+
         elif c.action == 'raw':
             c.cur_diff = '<pre class="raw">%s</pre>' % h.escape(diff.raw_diff())
         elif c.action == 'diff':
@@ -199,10 +196,10 @@
                 c.cur_diff = _('Diff is to big to display')
             else:
                 c.cur_diff = diff.as_html()
-        
-        if not c.cur_diff: c.no_changes = True    
+
+        if not c.cur_diff: c.no_changes = True
         return render('files/file_diff.html')
-    
+
     def _get_history(self, repo, node, f_path):
         from vcs.nodes import NodeKind
         if not node.kind is NodeKind.FILE:
@@ -211,5 +208,5 @@
         hist_l = []
         for chs in changesets:
             n_desc = 'r%s:%s' % (chs.revision, chs.short_id)
-            hist_l.append((chs.short_id, n_desc,))
+            hist_l.append((chs.raw_id, n_desc,))
         return hist_l
--- a/rhodecode/controllers/hg.py	Mon Oct 25 03:19:01 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-#!/usr/bin/env python
-# encoding: utf-8
-# hg controller for pylons
-# Copyright (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
-# 
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; version 2
-# of the License or (at your opinion) any later version of the license.
-# 
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-# 
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-# MA  02110-1301, USA.
-"""
-Created on February 18, 2010
-hg controller for pylons
-@author: marcink
-"""
-from operator import itemgetter
-from pylons import tmpl_context as c, request
-from rhodecode.lib.auth import LoginRequired
-from rhodecode.lib.base import BaseController, render
-from rhodecode.model.hg import HgModel
-import logging
-log = logging.getLogger(__name__)
-
-class HgController(BaseController):
-
-    @LoginRequired()
-    def __before__(self):
-        super(HgController, self).__before__()
-        
-    def index(self):
-        sortables = ['name', 'description', 'last_change', 'tip', 'contact']
-        current_sort = request.GET.get('sort', 'name')
-        current_sort_slug = current_sort.replace('-', '')
-        
-        if current_sort_slug not in sortables:
-            c.sort_by = 'name'
-            current_sort_slug = c.sort_by
-        else:
-            c.sort_by = current_sort
-        c.sort_slug = current_sort_slug
-        cached_repo_list = HgModel().get_repos()
-        
-        sort_key = current_sort_slug + '_sort'
-        if c.sort_by.startswith('-'):
-            c.repos_list = sorted(cached_repo_list, key=itemgetter(sort_key), reverse=True)
-        else:
-            c.repos_list = sorted(cached_repo_list, key=itemgetter(sort_key), reverse=False)
-            
-        return render('/index.html')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/controllers/home.py	Tue Oct 26 03:20:32 2010 +0200
@@ -0,0 +1,58 @@
+#!/usr/bin/env python
+# encoding: utf-8
+# hg controller for pylons
+# Copyright (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; version 2
+# of the License or (at your opinion) any later version of the license.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA  02110-1301, USA.
+"""
+Created on February 18, 2010
+hg controller for pylons
+@author: marcink
+"""
+from operator import itemgetter
+from pylons import tmpl_context as c, request
+from rhodecode.lib.auth import LoginRequired
+from rhodecode.lib.base import BaseController, render
+from rhodecode.model.hg import HgModel
+import logging
+log = logging.getLogger(__name__)
+
+class HomeController(BaseController):
+
+    @LoginRequired()
+    def __before__(self):
+        super(HomeController, self).__before__()
+
+    def index(self):
+        sortables = ['name', 'description', 'last_change', 'tip', 'contact']
+        current_sort = request.GET.get('sort', 'name')
+        current_sort_slug = current_sort.replace('-', '')
+
+        if current_sort_slug not in sortables:
+            c.sort_by = 'name'
+            current_sort_slug = c.sort_by
+        else:
+            c.sort_by = current_sort
+        c.sort_slug = current_sort_slug
+        cached_repo_list = HgModel().get_repos()
+
+        sort_key = current_sort_slug + '_sort'
+        if c.sort_by.startswith('-'):
+            c.repos_list = sorted(cached_repo_list, key=itemgetter(sort_key), reverse=True)
+        else:
+            c.repos_list = sorted(cached_repo_list, key=itemgetter(sort_key), reverse=False)
+
+        return render('/index.html')
--- a/rhodecode/controllers/login.py	Mon Oct 25 03:19:01 2010 +0200
+++ b/rhodecode/controllers/login.py	Tue Oct 26 03:20:32 2010 +0200
@@ -28,7 +28,7 @@
 from pylons.controllers.util import abort, redirect
 from rhodecode.lib.auth import AuthUser, HasPermissionAnyDecorator
 from rhodecode.lib.base import BaseController, render
-import rhodecode.lib.helpers as h 
+import rhodecode.lib.helpers as h
 from pylons.i18n.translation import _
 from rhodecode.model.forms import LoginForm, RegisterForm, PasswordResetForm
 from rhodecode.model.user import UserModel
@@ -45,10 +45,10 @@
     def index(self):
         #redirect if already logged in
         c.came_from = request.GET.get('came_from', None)
-        
+
         if c.rhodecode_user.is_authenticated:
-            return redirect(url('hg_home'))
-        
+            return redirect(url('home'))
+
         if request.POST:
             #import Login Form validator class
             login_form = LoginForm()
@@ -66,14 +66,14 @@
                 session['rhodecode_user'] = auth_user
                 session.save()
                 log.info('user %s is now authenticated', username)
-                
+
                 user.update_lastlogin()
-                                        
+
                 if c.came_from:
                     return redirect(c.came_from)
                 else:
-                    return redirect(url('hg_home'))
-                               
+                    return redirect(url('home'))
+
             except formencode.Invalid, errors:
                 return htmlfill.render(
                     render('/login.html'),
@@ -81,9 +81,9 @@
                     errors=errors.error_dict or {},
                     prefix_error=False,
                     encoding="UTF-8")
-                        
+
         return render('/login.html')
-    
+
     @HasPermissionAnyDecorator('hg.admin', 'hg.register.auto_activate',
                                'hg.register.manual_activate')
     def register(self):
@@ -93,18 +93,18 @@
             if perm.permission.permission_name == 'hg.register.auto_activate':
                 c.auto_active = True
                 break
-                        
+
         if request.POST:
-                
+
             register_form = RegisterForm()()
             try:
                 form_result = register_form.to_python(dict(request.POST))
                 form_result['active'] = c.auto_active
                 user_model.create_registration(form_result)
                 h.flash(_('You have successfully registered into rhodecode'),
-                            category='success')                
+                            category='success')
                 return redirect(url('login_home'))
-                               
+
             except formencode.Invalid, errors:
                 return htmlfill.render(
                     render('/register.html'),
@@ -112,21 +112,21 @@
                     errors=errors.error_dict or {},
                     prefix_error=False,
                     encoding="UTF-8")
-        
+
         return render('/register.html')
 
     def password_reset(self):
         user_model = UserModel()
         if request.POST:
-                
+
             password_reset_form = PasswordResetForm()()
             try:
                 form_result = password_reset_form.to_python(dict(request.POST))
                 user_model.reset_password(form_result)
                 h.flash(_('Your new password was sent'),
-                            category='success')                 
+                            category='success')
                 return redirect(url('login_home'))
-                               
+
             except formencode.Invalid, errors:
                 return htmlfill.render(
                     render('/password_reset.html'),
@@ -134,11 +134,11 @@
                     errors=errors.error_dict or {},
                     prefix_error=False,
                     encoding="UTF-8")
-        
+
         return render('/password_reset.html')
-        
+
     def logout(self):
         session['rhodecode_user'] = AuthUser()
         session.save()
         log.info('Logging out and setting user as Empty')
-        redirect(url('hg_home'))
+        redirect(url('home'))
--- a/rhodecode/controllers/settings.py	Mon Oct 25 03:19:01 2010 +0200
+++ b/rhodecode/controllers/settings.py	Tue Oct 26 03:20:32 2010 +0200
@@ -41,35 +41,35 @@
 class SettingsController(BaseController):
 
     @LoginRequired()
-    @HasRepoPermissionAllDecorator('repository.admin')           
+    @HasRepoPermissionAllDecorator('repository.admin')
     def __before__(self):
         super(SettingsController, self).__before__()
-        
+
     def index(self, repo_name):
         repo_model = RepoModel()
         c.repo_info = repo = repo_model.get(repo_name)
         if not repo:
-            h.flash(_('%s repository is not mapped to db perhaps' 
+            h.flash(_('%s repository is not mapped to db perhaps'
                       ' it was created or renamed from the filesystem'
                       ' please run the application again'
                       ' in order to rescan repositories') % repo_name,
                       category='error')
-        
-            return redirect(url('hg_home'))        
+
+            return redirect(url('home'))
         defaults = c.repo_info.__dict__
         defaults.update({'user':c.repo_info.user.username})
         c.users_array = repo_model.get_users_js()
-        
+
         for p in c.repo_info.repo_to_perm:
-            defaults.update({'perm_%s' % p.user.username: 
+            defaults.update({'perm_%s' % p.user.username:
                              p.permission.permission_name})
-            
+
         return htmlfill.render(
             render('settings/repo_settings.html'),
             defaults=defaults,
             encoding="UTF-8",
             force_defaults=False
-        )  
+        )
 
     def update(self, repo_name):
         repo_model = RepoModel()
@@ -81,7 +81,7 @@
             invalidate_cache('cached_repo_list')
             h.flash(_('Repository %s updated successfully' % repo_name),
                     category='success')
-            changed_name = form_result['repo_name']               
+            changed_name = form_result['repo_name']
         except formencode.Invalid, errors:
             c.repo_info = repo_model.get(repo_name)
             c.users_array = repo_model.get_users_js()
@@ -91,17 +91,17 @@
                 defaults=errors.value,
                 errors=errors.error_dict or {},
                 prefix_error=False,
-                encoding="UTF-8") 
+                encoding="UTF-8")
         except Exception:
             log.error(traceback.format_exc())
             h.flash(_('error occured during update of repository %s') \
                     % repo_name, category='error')
-                    
+
         return redirect(url('repo_settings_home', repo_name=changed_name))
 
 
 
-    def delete(self, repo_name):    
+    def delete(self, repo_name):
         """DELETE /repos/repo_name: Delete an existing item"""
         # Forms posted to this method should contain a hidden field:
         #    <input type="hidden" name="_method" value="DELETE" />
@@ -109,45 +109,45 @@
         #    h.form(url('repo_settings_delete', repo_name=ID),
         #           method='delete')
         # url('repo_settings_delete', repo_name=ID)
-        
+
         repo_model = RepoModel()
         repo = repo_model.get(repo_name)
         if not repo:
-            h.flash(_('%s repository is not mapped to db perhaps' 
+            h.flash(_('%s repository is not mapped to db perhaps'
                       ' it was moved or renamed  from the filesystem'
                       ' please run the application again'
                       ' in order to rescan repositories') % repo_name,
                       category='error')
-        
-            return redirect(url('hg_home'))
+
+            return redirect(url('home'))
         try:
             action_logger(self.rhodecode_user, 'user_deleted_repo',
-                              repo_name, '', self.sa)            
-            repo_model.delete(repo)            
+                              repo_name, '', self.sa)
+            repo_model.delete(repo)
             invalidate_cache('cached_repo_list')
             h.flash(_('deleted repository %s') % repo_name, category='success')
         except Exception:
             h.flash(_('An error occurred during deletion of %s') % repo_name,
                     category='error')
-        
-        return redirect(url('hg_home'))
-    
+
+        return redirect(url('home'))
+
     def fork(self, repo_name):
         repo_model = RepoModel()
         c.repo_info = repo = repo_model.get(repo_name)
         if not repo:
-            h.flash(_('%s repository is not mapped to db perhaps' 
+            h.flash(_('%s repository is not mapped to db perhaps'
                       ' it was created or renamed from the filesystem'
                       ' please run the application again'
                       ' in order to rescan repositories') % repo_name,
                       category='error')
-        
-            return redirect(url('hg_home'))
-        
+
+            return redirect(url('home'))
+
         return render('settings/repo_fork.html')
-    
-    
-    
+
+
+
     def fork_create(self, repo_name):
         repo_model = RepoModel()
         c.repo_info = repo_model.get(repo_name)
@@ -161,15 +161,15 @@
                       % (repo_name, form_result['fork_name']),
                     category='success')
             action_logger(self.rhodecode_user, 'user_forked_repo',
-                            repo_name, '', self.sa)                                                 
+                            repo_name, '', self.sa)
         except formencode.Invalid, errors:
             c.new_repo = errors.value['fork_name']
             r = render('settings/repo_fork.html')
-            
+
             return htmlfill.render(
                 r,
                 defaults=errors.value,
                 errors=errors.error_dict or {},
                 prefix_error=False,
-                encoding="UTF-8")   
-        return redirect(url('hg_home'))
+                encoding="UTF-8")
+        return redirect(url('home'))
--- a/rhodecode/lib/helpers.py	Mon Oct 25 03:19:01 2010 +0200
+++ b/rhodecode/lib/helpers.py	Tue Oct 26 03:20:32 2010 +0200
@@ -272,12 +272,12 @@
                                                changeset.date,
                                                tooltip(changeset.message))
         lnk_format = 'r%-5s:%s' % (changeset.revision,
-                                 changeset.short_id)
+                                 changeset.raw_id)
         uri = link_to(
                 lnk_format,
                 url('changeset_home', repo_name=changeset.repository.name,
-                    revision=changeset.short_id),
-                style=get_color_string(changeset.short_id),
+                    revision=changeset.raw_id),
+                style=get_color_string(changeset.raw_id),
                 class_='tooltip',
                 tooltip_title=tooltip_html
               )
@@ -352,6 +352,7 @@
 email = util.email
 email_or_none = lambda x: util.email(x) if util.email(x) != x else None
 person = lambda x: _person(x)
+short_id = lambda x: x[:12]
 
 #==============================================================================
 # PERMS
--- a/rhodecode/lib/utils.py	Mon Oct 25 03:19:01 2010 +0200
+++ b/rhodecode/lib/utils.py	Tue Oct 26 03:20:32 2010 +0200
@@ -303,6 +303,7 @@
     message = ''
     author = ''
     date = ''
+
     @LazyProperty
     def raw_id(self):
         """
--- a/rhodecode/model/hg.py	Mon Oct 25 03:19:01 2010 +0200
+++ b/rhodecode/model/hg.py	Tue Oct 26 03:20:32 2010 +0200
@@ -158,7 +158,7 @@
             tmp_d['description_sort'] = tmp_d['description']
             tmp_d['last_change'] = last_change
             tmp_d['last_change_sort'] = time.mktime(last_change.timetuple())
-            tmp_d['tip'] = tip.short_id
+            tmp_d['tip'] = tip.raw_id
             tmp_d['tip_sort'] = tip.revision
             tmp_d['rev'] = tip.revision
             tmp_d['contact'] = repo.contact
--- a/rhodecode/public/css/style.css	Mon Oct 25 03:19:01 2010 +0200
+++ b/rhodecode/public/css/style.css	Tue Oct 26 03:20:32 2010 +0200
@@ -1701,6 +1701,7 @@
 width:auto;
 opacity:1px;
 padding:8px;
+white-space: pre;
 }
 
 .ac {
--- a/rhodecode/templates/base/base.html	Mon Oct 25 03:19:01 2010 +0200
+++ b/rhodecode/templates/base/base.html	Tue Oct 26 03:20:32 2010 +0200
@@ -31,7 +31,7 @@
         <div id="header-inner" class="title top-left-rounded-corner top-right-rounded-corner">
             <!-- logo -->
             <div id="logo">
-                <h1><a href="${h.url('hg_home')}">${c.rhodecode_name}</a></h1>
+                <h1><a href="${h.url('home')}">${c.rhodecode_name}</a></h1>
             </div>
             <!-- end logo -->
             <!-- menu -->
@@ -146,7 +146,7 @@
                             <ul>
                             %if c.repository_branches.values():
 						        %for cnt,branch in enumerate(c.repository_branches.items()):
-						            <li>${h.link_to('%s - %s' % (branch[0],branch[1]),h.url('files_home',repo_name=c.repo_name,revision=branch[1]))}</li>
+						            <li>${h.link_to('%s - %s' % (branch[0],h.short_id(branch[1])),h.url('files_home',repo_name=c.repo_name,revision=branch[1]))}</li>
 						        %endfor
 						    %else:
 						    	<li>${h.link_to(_('There are no branches yet'),'#')}</li>
@@ -158,7 +158,7 @@
                             <ul>
                             %if c.repository_tags.values():
                                 %for cnt,tag in enumerate(c.repository_tags.items()):
-                                 <li>${h.link_to('%s - %s' % (tag[0],tag[1]),h.url('files_home',repo_name=c.repo_name,revision=tag[1]))}</li>
+                                 <li>${h.link_to('%s - %s' % (tag[0],h.short_id(tag[1])),h.url('files_home',repo_name=c.repo_name,revision=tag[1]))}</li>
                                 %endfor
                             %else:
                             	<li>${h.link_to(_('There are no tags yet'),'#')}</li>
@@ -219,7 +219,7 @@
 		    ##ROOT MENU
             <ul id="quick">
                 <li>
-                    <a title="${_('Home')}"  href="${h.url('hg_home')}">
+                    <a title="${_('Home')}"  href="${h.url('home')}">
                     <span class="icon">
                         <img src="/images/icons/home_16.png" alt="${_('Home')}" />
                     </span>
--- a/rhodecode/templates/branches/branches_data.html	Mon Oct 25 03:19:01 2010 +0200
+++ b/rhodecode/templates/branches/branches_data.html	Tue Oct 26 03:20:32 2010 +0200
@@ -2,24 +2,26 @@
     <table class="table_disp">
         <tr>
             <th class="left">${_('date')}</th>
+            <th class="left">${_('name')}</th>
+            <th class="left">${_('author')}</th>
             <th class="left">${_('revision')}</th>
-            <th class="left">${_('name')}</th>
             <th class="left">${_('links')}</th>
         </tr>
 		%for cnt,branch in enumerate(c.repo_branches.items()):
 		<tr class="parity${cnt%2}">
-			<td>${h.age(branch[1].date)}</td>
-			<td>r${branch[1].revision}:${branch[1].short_id}</td>
-			<td>
-				<span class="logtags">
-					<span class="branchtag">${h.link_to(branch[0],
-					h.url('changeset_home',repo_name=c.repo_name,revision=branch[1].short_id))}</span>
-				</span>			
-			</td>
+            <td>${branch[1].date} - ${h.age(branch[1].date)}</td>
+            <td>
+                <span class="logtags">
+                    <span class="branchtag">${h.link_to(branch[0],
+                    h.url('changeset_home',repo_name=c.repo_name,revision=branch[1].raw_id))}</span>
+                </span>         
+            </td>		
+            <td title="${branch[1].author}">${h.person(branch[1].author)}</td>
+            <td>r${branch[1].revision}:${h.short_id(branch[1].raw_id)}</td>
 			<td class="nowrap">
-			${h.link_to(_('changeset'),h.url('changeset_home',repo_name=c.repo_name,revision=branch[1].short_id))}
+			${h.link_to(_('changeset'),h.url('changeset_home',repo_name=c.repo_name,revision=branch[1].raw_id))}
 			|
-			${h.link_to(_('files'),h.url('files_home',repo_name=c.repo_name,revision=branch[1].short_id))}
+			${h.link_to(_('files'),h.url('files_home',repo_name=c.repo_name,revision=branch[1].raw_id))}
 			</td>
 		</tr>	
 		%endfor
--- a/rhodecode/templates/changelog/changelog.html	Mon Oct 25 03:19:01 2010 +0200
+++ b/rhodecode/templates/changelog/changelog.html	Tue Oct 26 03:20:32 2010 +0200
@@ -46,7 +46,7 @@
 				%for cnt,cs in enumerate(c.pagination):
 					<div id="chg_${cnt+1}" class="container">
 						<div class="left">
-							<div class="date">${_('commit')} ${cs.revision}: ${cs.short_id}@${cs.date}</div>
+							<div class="date">${_('commit')} ${cs.revision}: ${cs.raw_id}@${cs.date}</div>
 							<div class="author">
 								<div class="gravatar">
 									<img alt="gravatar" src="${h.gravatar_url(h.email(cs.author),20)}"/>
@@ -54,7 +54,7 @@
 								<span>${h.person(cs.author)}</span><br/>
 								<span><a href="mailto:${h.email_or_none(cs.author)}">${h.email_or_none(cs.author)}</a></span><br/>
 							</div>
-							<div class="message">${h.link_to(h.wrap_paragraphs(cs.message),h.url('changeset_home',repo_name=c.repo_name,revision=cs.short_id))}</div>
+							<div class="message">${h.link_to(h.wrap_paragraphs(cs.message),h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id))}</div>
 						</div>	
 						<div class="right">
 									<div class="changes">
@@ -69,8 +69,8 @@
 										%endif
 								   %if cs.parents:							
 									%for p_cs in reversed(cs.parents):
-										<div class="parent">${_('Parent')} ${p_cs.revision}: ${h.link_to(p_cs.short_id,
-											h.url('changeset_home',repo_name=c.repo_name,revision=p_cs.short_id),title=p_cs.message)}
+										<div class="parent">${_('Parent')} ${p_cs.revision}: ${h.link_to(p_cs.raw_id,
+											h.url('changeset_home',repo_name=c.repo_name,revision=p_cs.raw_id),title=p_cs.message)}
 										</div>
 									%endfor
 								   %else:	
@@ -79,10 +79,10 @@
                     									
 								<span class="logtags">
 									<span class="branchtag" title="${'%s %s' % (_('branch'),cs.branch)}">
-									${h.link_to(cs.branch,h.url('files_home',repo_name=c.repo_name,revision=cs.short_id))}</span>
+									${h.link_to(cs.branch,h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id))}</span>
 									%for tag in cs.tags:
 										<span class="tagtag"  title="${'%s %s' % (_('tag'),tag)}">
-										${h.link_to(tag,h.url('files_home',repo_name=c.repo_name,revision=cs.short_id))}</span>
+										${h.link_to(tag,h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id))}</span>
 									%endfor
 								</span>																	
 						</div>				
--- a/rhodecode/templates/changeset/changeset.html	Mon Oct 25 03:19:01 2010 +0200
+++ b/rhodecode/templates/changeset/changeset.html	Tue Oct 26 03:20:32 2010 +0200
@@ -1,7 +1,7 @@
 <%inherit file="/base/base.html"/>
 
 <%def name="title()">
-    ${c.repo_name} ${_('Changeset')} - r${c.changeset.revision}:${c.changeset.short_id}  - ${c.rhodecode_name}
+    ${c.repo_name} ${_('Changeset')} - r${c.changeset.revision}:${h.short_id(c.changeset.raw_id)} - ${c.rhodecode_name}
 </%def>
 
 <%def name="breadcrumbs_links()">
@@ -9,7 +9,7 @@
     &raquo;
     ${h.link_to(c.repo_name,h.url('summary_home',repo_name=c.repo_name))}
     &raquo;
-    ${_('Changeset')} - r${c.changeset.revision}:${c.changeset.short_id}
+    ${_('Changeset')} - r${c.changeset.revision}:${h.short_id(c.changeset.raw_id)}
 </%def>
 
 <%def name="page_nav()">
@@ -26,18 +26,18 @@
 		<div id="body" class="diffblock">
 			<div class="code-header">
 				<div>
-				${_('Changeset')} - r${c.changeset.revision}:${c.changeset.short_id}
+				${_('Changeset')} - r${c.changeset.revision}:${h.short_id(c.changeset.raw_id)}
 				 &raquo; <span>${h.link_to(_('raw diff'),
-				h.url('raw_changeset_home',repo_name=c.repo_name,revision=c.changeset.short_id,diff='show'))}</span>
+				h.url('raw_changeset_home',repo_name=c.repo_name,revision=c.changeset.raw_id,diff='show'))}</span>
 				 &raquo; <span>${h.link_to(_('download diff'),
-				h.url('raw_changeset_home',repo_name=c.repo_name,revision=c.changeset.short_id,diff='download'))}</span>
+				h.url('raw_changeset_home',repo_name=c.repo_name,revision=c.changeset.raw_id,diff='download'))}</span>
 				</div>
 			</div>
 		</div>
 	    <div id="changeset_content">
 			<div class="container">
 	             <div class="left">
-	                 <div class="date">${_('commit')} ${c.changeset.revision}: ${c.changeset.short_id}@${c.changeset.date}</div>
+	                 <div class="date">${_('commit')} ${c.changeset.revision}: ${h.short_id(c.changeset.raw_id)}@${c.changeset.date}</div>
 	                 <div class="author">
 	                     <div class="gravatar">
 	                         <img alt="gravatar" src="${h.gravatar_url(h.email(c.changeset.author),20)}"/>
@@ -45,7 +45,7 @@
 	                     <span>${h.person(c.changeset.author)}</span><br/>
 	                     <span><a href="mailto:${h.email_or_none(c.changeset.author)}">${h.email_or_none(c.changeset.author)}</a></span><br/>
 	                 </div>
-	                 <div class="message">${h.link_to(h.wrap_paragraphs(c.changeset.message),h.url('changeset_home',repo_name=c.repo_name,revision=c.changeset.short_id))}</div>
+	                 <div class="message">${h.link_to(h.wrap_paragraphs(c.changeset.message),h.url('changeset_home',repo_name=c.repo_name,revision=c.changeset.raw_id))}</div>
 	             </div>
 	             <div class="right">
 		             <div class="changes">
@@ -61,8 +61,8 @@
 		                 
 		            %if c.changeset.parents:
 		             %for p_cs in reversed(c.changeset.parents):
-		                 <div class="parent">${_('Parent')} ${p_cs.revision}: ${h.link_to(p_cs.short_id,
-		                     h.url('changeset_home',repo_name=c.repo_name,revision=p_cs.short_id),title=p_cs.message)}
+		                 <div class="parent">${_('Parent')} ${p_cs.revision}: ${h.link_to(h.short_id(p_cs.raw_id),
+		                     h.url('changeset_home',repo_name=c.repo_name,revision=p_cs.raw_id),title=p_cs.message)}
 		                 </div>
 		             %endfor
                     %else: 
@@ -70,10 +70,10 @@
                     %endif		             
 		         <span class="logtags">
 		             <span class="branchtag" title="${'%s %s' % (_('branch'),c.changeset.branch)}">
-		             ${h.link_to(c.changeset.branch,h.url('files_home',repo_name=c.repo_name,revision=c.changeset.short_id))}</span>
+		             ${h.link_to(c.changeset.branch,h.url('files_home',repo_name=c.repo_name,revision=c.changeset.raw_id))}</span>
 		             %for tag in c.changeset.tags:
 		                 <span class="tagtag"  title="${'%s %s' % (_('tag'),tag)}">
-		                 ${h.link_to(tag,h.url('files_home',repo_name=c.repo_name,revision=c.changeset.short_id))}</span>
+		                 ${h.link_to(tag,h.url('files_home',repo_name=c.repo_name,revision=c.changeset.raw_id))}</span>
 		             %endfor
 		         </span>                                                                 
 	                </div>              
@@ -96,7 +96,7 @@
 				<div>
 					<span>
 						${h.link_to_if(change!='removed',filenode.path,h.url('files_home',repo_name=c.repo_name,
-						revision=filenode.changeset.short_id,f_path=filenode.path))}
+						revision=filenode.changeset.raw_id,f_path=filenode.path))}
 					</span>
 					%if 1:
 					&raquo; <span>${h.link_to(_('diff'),
--- a/rhodecode/templates/errors/error_404.html	Mon Oct 25 03:19:01 2010 +0200
+++ b/rhodecode/templates/errors/error_404.html	Tue Oct 26 03:20:32 2010 +0200
@@ -6,7 +6,7 @@
 </%def>
 
 <%def name="breadcrumbs()">
-	${h.link_to(u'Home',h.url('hg_home'))}
+	${h.link_to(u'Home',h.url('home'))}
 	 / 
 	${h.link_to(u'Admin',h.url('admin_home'))}
 </%def>
@@ -26,7 +26,7 @@
     ${_('Create "%s" repository as %s' % (c.repo_name,c.repo_name_cleaned))}</a>
 
     </p>
-    <p class="normal">${h.link_to(_('Go back to the main repository list page'),h.url('hg_home'))}</p>
+    <p class="normal">${h.link_to(_('Go back to the main repository list page'),h.url('home'))}</p>
     <div class="page-footer">
     </div>
 </%def>
\ No newline at end of file
--- a/rhodecode/templates/files/file_diff.html	Mon Oct 25 03:19:01 2010 +0200
+++ b/rhodecode/templates/files/file_diff.html	Tue Oct 26 03:20:32 2010 +0200
@@ -9,7 +9,7 @@
     &raquo;
     ${h.link_to(c.repo_name,h.url('summary_home',repo_name=c.repo_name))}
     &raquo;
-    ${'%s:  %s %s %s' % (_('File diff'),c.diff2,'&rarr;',c.diff1)|n}
+    ${_('File diff')} r${c.changeset_1.revision}:${h.short_id(c.changeset_1.raw_id)} &rarr; r${c.changeset_2.revision}:${h.short_id(c.changeset_2.raw_id)}
 </%def>
 
 <%def name="page_nav()">
@@ -26,13 +26,13 @@
 			<div class="code-header">
 				<div>
 				<span>${h.link_to(c.f_path,h.url('files_home',repo_name=c.repo_name,
-				revision=c.diff2.split(':')[1],f_path=c.f_path))}</span>
+				revision=c.changeset_2.raw_id,f_path=c.f_path))}</span>
 				 &raquo; <span>${h.link_to(_('diff'),
-				h.url.current(diff2=c.diff2.split(':')[-1],diff1=c.diff1.split(':')[-1],diff='diff'))}</span>
+				h.url.current(diff2=c.changeset_2.raw_id,diff1=c.changeset_1.raw_id,diff='diff'))}</span>
 				 &raquo; <span>${h.link_to(_('raw diff'),
-				h.url.current(diff2=c.diff2.split(':')[-1],diff1=c.diff1.split(':')[-1],diff='raw'))}</span>
+				h.url.current(diff2=c.changeset_2.raw_id,diff1=c.changeset_1.raw_id,diff='raw'))}</span>
 				 &raquo; <span>${h.link_to(_('download diff'),
-				h.url.current(diff2=c.diff2.split(':')[-1],diff1=c.diff1.split(':')[-1],diff='download'))}</span>
+				h.url.current(diff2=c.changeset_2.raw_id,diff1=c.changeset_1.raw_id,diff='download'))}</span>
 				</div>
 			</div>
 			<div class="code-body">
--- a/rhodecode/templates/files/files.html	Mon Oct 25 03:19:01 2010 +0200
+++ b/rhodecode/templates/files/files.html	Tue Oct 26 03:20:32 2010 +0200
@@ -11,7 +11,7 @@
     &raquo;
     ${_('files')}
     %if c.files_list:
-        @ R${c.rev_nr}:${c.cur_rev}
+        @ R${c.rev_nr}:${h.short_id(c.cur_rev)}
     %endif        
 </%def>
 
--- a/rhodecode/templates/files/files_annotate.html	Mon Oct 25 03:19:01 2010 +0200
+++ b/rhodecode/templates/files/files_annotate.html	Tue Oct 26 03:20:32 2010 +0200
@@ -26,8 +26,8 @@
 			<h3 class="files_location">${_('Location')}: ${h.files_breadcrumbs(c.repo_name,c.cur_rev,c.file.path)}</h3>
 			<dl class="overview">
 				<dt>${_('Last revision')}</dt>
-				<dd>${h.link_to("r%s:%s" % (c.file.last_changeset.revision,c.file.last_changeset.short_id),
-						h.url('files_annotate_home',repo_name=c.repo_name,revision=c.file.last_changeset.short_id,f_path=c.f_path))} </dd>
+				<dd>${h.link_to("r%s:%s" % (c.file.last_changeset.revision,c.file.last_changeset.raw_id),
+						h.url('files_annotate_home',repo_name=c.repo_name,revision=c.file.last_changeset.raw_id,f_path=c.f_path))} </dd>
 				<dt>${_('Size')}</dt>
 				<dd>${h.format_byte_size(c.file.size,binary=True)}</dd>
     			<dt>${_('Mimetype')}</dt>
@@ -43,7 +43,7 @@
 			</dl>
 			<div id="body" class="codeblock">
 				<div class="code-header">
-					<div class="revision">${c.file.name}@r${c.file.last_changeset.revision}:${c.file.last_changeset.short_id}</div>
+					<div class="revision">${c.file.name}@r${c.file.last_changeset.revision}:${c.file.last_changeset.raw_id}</div>
 					<div class="commit">"${c.file_msg}"</div>
 				</div>
 				<div class="code-body">
--- a/rhodecode/templates/files/files_source.html	Mon Oct 25 03:19:01 2010 +0200
+++ b/rhodecode/templates/files/files_source.html	Tue Oct 26 03:20:32 2010 +0200
@@ -1,8 +1,8 @@
 <dl>
 	<dt>${_('Last revision')}</dt>
 	<dd>
-		${h.link_to("r%s:%s" % (c.files_list.last_changeset.revision,c.files_list.last_changeset.short_id),
-						h.url('files_home',repo_name=c.repo_name,revision=c.files_list.last_changeset.short_id,f_path=c.f_path))} 
+		${h.link_to("r%s:%s" % (c.files_list.last_changeset.revision,h.short_id(c.files_list.last_changeset.raw_id)),
+						h.url('files_home',repo_name=c.repo_name,revision=c.files_list.last_changeset.raw_id,f_path=c.f_path))} 
 	</dd>
 	<dt>${_('Size')}</dt>
 	<dd>${h.format_byte_size(c.files_list.size,binary=True)}</dd>
@@ -20,8 +20,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.files_list.last_changeset.short_id)}
-		${h.select('diff1',c.files_list.last_changeset.short_id,c.file_history)}
+		${h.hidden('diff2',c.files_list.last_changeset.raw_id)}
+		${h.select('diff1',c.files_list.last_changeset.raw_id,c.file_history)}
 		${h.submit('diff','diff to revision',class_="ui-button ui-widget ui-state-default ui-corner-all")}
 		${h.submit('show_rev','show at revision',class_="ui-button ui-widget ui-state-default ui-corner-all")}
 		${h.end_form()}
@@ -32,7 +32,7 @@
 	
 <div id="body" class="codeblock">
 	<div class="code-header">
-		<div class="revision">${c.files_list.name}@r${c.files_list.last_changeset.revision}:${c.files_list.last_changeset.short_id}</div>
+		<div class="revision">${c.files_list.name}@r${c.files_list.last_changeset.revision}:${h.short_id(c.files_list.last_changeset.raw_id)}</div>
 		<div class="commit">"${c.files_list.last_changeset.message}"</div>
 	</div>
 	<div class="code-body">
--- a/rhodecode/templates/index.html	Mon Oct 25 03:19:01 2010 +0200
+++ b/rhodecode/templates/index.html	Tue Oct 26 03:20:32 2010 +0200
@@ -56,33 +56,36 @@
 					        <tr class="parity${cnt%2}">
 					            <td>
 					             %if repo['repo'].dbrepo.repo_type =='hg':
-					               <img class="icon" alt="${_('Mercurial repository')}" src="/images/icons/hgicon.png"/>
+					               <img class="icon" title="${_('Mercurial repository')}" alt="${_('Mercurial repository')}" src="/images/icons/hgicon.png"/>
 					             %elif repo['repo'].dbrepo.repo_type =='git':
-					               <img class="icon" alt="${_('Git repository')}" src="/images/icons/giticon.png"/>
+					               <img class="icon" title="${_('Git repository')}" alt="${_('Git repository')}" src="/images/icons/giticon.png"/>
 					             %else:
 					               
 					             %endif 
 					            
 					             %if repo['repo'].dbrepo.private:
-					                <img class="icon" alt="${_('private')}" src="/images/icons/lock.png"/>
+					                <img class="icon" title="${_('private repository')}" alt="${_('private repository')}" src="/images/icons/lock.png"/>
 					             %else:
-					                <img class="icon" alt="${_('public')}" src="/images/icons/lock_open.png"/>
+					                <img class="icon" title="${_('public repository')}" alt="${_('public repository')}" src="/images/icons/lock_open.png"/>
 					             %endif  
 					            ${h.link_to(repo['name'],
 					                h.url('summary_home',repo_name=repo['name']))}
 					            %if repo['repo'].dbrepo.fork:
 					            	<a href="${h.url('summary_home',repo_name=repo['repo'].dbrepo.fork.repo_name)}">
-					            	<img class="icon" alt="${_('public')}"
+					            	<img class="icon" alt="${_('fork')}"
 					            	title="${_('Fork of')} ${repo['repo'].dbrepo.fork.repo_name}" 
 					            	src="/images/icons/arrow_divide.png"/></a>
 					            %endif
 					            </td>
-					            <td title="${repo['description']}">${h.truncate(repo['description'],60)}</td>
+					            <td><span class="tooltip" tooltip_title="${repo['description']}">
+					               ${h.truncate(repo['description'],60)}</span>
+					            </td>
 					            <td><span class="tooltip" tooltip_title="${repo['last_change']}">
-					                ${h.age(repo['last_change'])} </span></td>
+					                ${h.age(repo['last_change'])} </span>
+					            </td>
 					            <td>
 					            	%if repo['rev']>=0:
-					            	${h.link_to('r%s:%s' % (repo['rev'],repo['tip']),
+					            	${h.link_to('r%s:%s' % (repo['rev'],h.short_id(repo['tip'])),
 					                h.url('changeset_home',repo_name=repo['name'],revision=repo['tip']),
 					                class_="tooltip",
 					                tooltip_title=h.tooltip(repo['last_msg']))}
--- a/rhodecode/templates/shortlog/shortlog_data.html	Mon Oct 25 03:19:01 2010 +0200
+++ b/rhodecode/templates/shortlog/shortlog_data.html	Tue Oct 26 03:20:32 2010 +0200
@@ -3,9 +3,9 @@
 <table>
 	<tr>
 		<th class="left">${_('date')}</th>
+		<th class="left">${_('commit message')}</th>
 		<th class="left">${_('author')}</th>
 		<th class="left">${_('revision')}</th>
-		<th class="left">${_('commit message')}</th>
 		<th class="left">${_('branch')}</th>
 		<th class="left">${_('tags')}</th>
 		<th class="left">${_('links')}</th>
@@ -13,14 +13,14 @@
 	</tr>
 %for cnt,cs in enumerate(c.repo_changesets):
 	<tr class="parity${cnt%2}">
-		<td>${h.age(cs.date)} - ${cs.date} </td>
+		<td>${cs.date} - ${h.age(cs.date)}</td>
+        <td>
+            ${h.link_to(h.truncate(cs.message,60),
+            h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id),
+            title=cs.message)}
+        </td>		
 		<td title="${cs.author}">${h.person(cs.author)}</td>
-		<td>r${cs.revision}:${cs.short_id}</td>
-		<td>
-			${h.link_to(h.truncate(cs.message,60),
-			h.url('changeset_home',repo_name=c.repo_name,revision=cs.short_id),
-			title=cs.message)}
-		</td>
+		<td>r${cs.revision}:${h.short_id(cs.raw_id)}</td>
 		<td>
 			<span class="logtags">
 				<span class="branchtag">${cs.branch}</span>
@@ -34,9 +34,9 @@
 			</span>
 		</td>
 		<td class="nowrap">
-		${h.link_to(_('changeset'),h.url('changeset_home',repo_name=c.repo_name,revision=cs.short_id))}
+		${h.link_to(_('changeset'),h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id))}
 		|
-		${h.link_to(_('files'),h.url('files_home',repo_name=c.repo_name,revision=cs.short_id))}
+		${h.link_to(_('files'),h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id))}
 		</td>
 	</tr>
 %endfor
--- a/rhodecode/templates/summary/summary.html	Mon Oct 25 03:19:01 2010 +0200
+++ b/rhodecode/templates/summary/summary.html	Tue Oct 26 03:20:32 2010 +0200
@@ -42,10 +42,19 @@
 			      <label>${_('Name')}:</label>
 			  </div>
 			  <div class="input-short">
+			  
+		          %if c.repo_info.dbrepo.repo_type =='hg':
+		            <img style="margin-bottom:2px" class="icon" title="${_('Mercurial repository')}" alt="${_('Mercurial repository')}" src="/images/icons/hgicon.png"/>
+		          %elif c.repo_info.dbrepo.repo_type =='git':
+		            <img style="margin-bottom:2px" class="icon" title="${_('Git repository')}" alt="${_('Git repository')}" src="/images/icons/giticon.png"/>
+		          %else:
+		            
+		          %endif 
+                                 			  
 	             %if c.repo_info.dbrepo.private:
-	                <img style="margin-bottom:2px" class="icon" title="${_('private repository')}" alt="${_('private')}" src="/images/icons/lock.png"/>
+	                <img style="margin-bottom:2px" class="icon" title="${_('private repository')}" alt="${_('private repository')}" src="/images/icons/lock.png"/>
 	             %else:
-	                <img style="margin-bottom:2px" class="icon" title="${_('public repository')}" alt="${_('public')}" src="/images/icons/lock_open.png"/>
+	                <img style="margin-bottom:2px" class="icon" title="${_('public repository')}" alt="${_('public repository')}" src="/images/icons/lock_open.png"/>
 	             %endif
 			      <span style="font-size: 1.6em;font-weight: bold;vertical-align: baseline;">${c.repo_info.name}</span>
 			      <br/>
--- a/rhodecode/templates/tags/tags_data.html	Mon Oct 25 03:19:01 2010 +0200
+++ b/rhodecode/templates/tags/tags_data.html	Tue Oct 26 03:20:32 2010 +0200
@@ -1,25 +1,27 @@
 %if c.repo_tags:    
     <table>
     	<tr>
-			<th class="left">${_('date')}</th>
-			<th class="left">${_('revision')}</th>
-			<th class="left">${_('name')}</th>
+	        <th class="left">${_('date')}</th>
+	        <th class="left">${_('name')}</th>
+	        <th class="left">${_('author')}</th>
+	        <th class="left">${_('revision')}</th>
 			<th class="left">${_('links')}</th>
     	</tr>
 		%for cnt,tag in enumerate(c.repo_tags.items()):
-		<tr class="parity${cnt%2}">
-			<td>${h.age(tag[1].date)}</td>
-			<td>r${tag[1].revision}:${tag[1].short_id}</td>
-			<td>
-				<span class="logtags">
-					<span class="tagtag">${h.link_to(tag[0],
-					h.url('changeset_home',repo_name=c.repo_name,revision=tag[1].short_id))}</span>
-				</span>
-			</td>
+		<tr class="parity${cnt%2}">		
+	        <td>${tag[1].date} - ${h.age(tag[1].date)}</td>
+            <td>
+                <span class="logtags">
+                    <span class="tagtag">${h.link_to(tag[0],
+                    h.url('changeset_home',repo_name=c.repo_name,revision=tag[1].raw_id))}</span>
+                </span>
+            </td>	        
+	        <td title="${tag[1].author}">${h.person(tag[1].author)}</td>
+	        <td>r${tag[1].revision}:${h.short_id(tag[1].raw_id)}</td>
 			<td class="nowrap">
-			${h.link_to(_('changeset'),h.url('changeset_home',repo_name=c.repo_name,revision=tag[1].short_id))}
+			${h.link_to(_('changeset'),h.url('changeset_home',repo_name=c.repo_name,revision=tag[1].raw_id))}
 			|
-			${h.link_to(_('files'),h.url('files_home',repo_name=c.repo_name,revision=tag[1].short_id))}
+			${h.link_to(_('files'),h.url('files_home',repo_name=c.repo_name,revision=tag[1].raw_id))}
 			</td>
 		</tr>	
 		%endfor