changeset 2430:9f37281195a2 codereview

merge with beta
author Marcin Kuzminski <marcin@python-works.com>
date Sat, 09 Jun 2012 15:30:22 +0200
parents 51e3d60fed2f (current diff) d6efacde970f (diff)
children 60dfc369df1d
files rhodecode/config/routing.py rhodecode/controllers/journal.py rhodecode/lib/helpers.py rhodecode/model/db.py rhodecode/public/js/rhodecode.js rhodecode/templates/branches/branches.html rhodecode/templates/branches/branches_data.html rhodecode/templates/changelog/changelog.html rhodecode/templates/changelog/changelog_details.html rhodecode/templates/changeset/changeset.html rhodecode/templates/changeset/changeset_file_comment.html rhodecode/templates/changeset/changeset_range.html rhodecode/templates/changeset/diff_block.html rhodecode/templates/repo_switcher_list.html
diffstat 63 files changed, 760 insertions(+), 367 deletions(-) [+]
line wrap: on
line diff
--- a/docs/changelog.rst	Wed Jun 06 01:23:02 2012 +0200
+++ b/docs/changelog.rst	Sat Jun 09 15:30:22 2012 +0200
@@ -16,6 +16,8 @@
 - new codereview system
 - email map, allowing users to have multiple email addresses mapped into
   their accounts
+- improved git-hook system. Now all actions for git are logged into journal
+  including pushed revisions, user and IP address
 - changed setup-app into setup-rhodecode and added default options to it.
 - new git repos are created as bare now by default
 - #464 added links to groups in permission box
@@ -25,6 +27,10 @@
 - rhodecode-api CLI client
 - new git http protocol replaced buggy dulwich implementation.
   Now based on pygrack & gitweb
+- Improved RSS/ATOM feeds. Discoverable by browsers using proper headers, and 
+  reformated based on user suggestions. Additional rss/atom feeds for user
+  journal
+- various i18n improvements
 
 fixes
 +++++
@@ -41,6 +47,8 @@
   commands.
 - fixed #413. Don't disable .git directory for bare repos on deleting
 - fixed issue #459. Changed the way of obtaining logger in reindex task.
+- fixed #453 added ID field in whoosh SCHEMA that solves the issue of
+  reindexing modified files
 
 1.3.6 (**2012-05-17**)
 ----------------------
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/config/post_receive_tmpl.py	Sat Jun 09 15:30:22 2012 +0200
@@ -0,0 +1,29 @@
+#!/usr/bin/env python
+import os
+import sys
+
+try:
+    import rhodecode
+    from rhodecode.lib.hooks import handle_git_post_receive
+except ImportError:
+    rhodecode = None
+
+
+def main():
+    if rhodecode is None:
+        # exit with success if we cannot import rhodecode !!
+        # this allows simply push to this repo even without
+        # rhodecode
+        sys.exit(0)
+
+    repo_path = os.path.abspath('.')
+    push_data = sys.stdin.read().strip().split(' ')
+    # os.environ is modified here by a subprocess call that
+    # runs git and later git executes this hook.
+    # Environ get's some additional info from rhodecode system
+    # like IP or username from basic-auth
+    handle_git_post_receive(repo_path, push_data, os.environ)
+    sys.exit(0)
+
+if __name__ == '__main__':
+    main()
--- a/rhodecode/config/rcextensions/__init__.py	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/config/rcextensions/__init__.py	Sat Jun 09 15:30:22 2012 +0200
@@ -1,6 +1,7 @@
 # Additional mappings that are not present in the pygments lexers
 # used for building stats
-# format is {'ext':'Name'} eg. {'py':'Python'}
+# format is {'ext':['Names']} eg. {'py':['Python']} note: there can be
+# more than one name for extension
 # NOTE: that this will overide any mappings in LANGUAGES_EXTENSIONS_MAP
 # build by pygments
 EXTRA_MAPPINGS = {}
@@ -39,6 +40,7 @@
      :param group_id:
      :param created_by:
     """
+
     return 0
 CREATE_REPO_HOOK = _crhook
 
--- a/rhodecode/config/rcextensions/make_rcextensions.py	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/config/rcextensions/make_rcextensions.py	Sat Jun 09 15:30:22 2012 +0200
@@ -54,7 +54,7 @@
         logging.config.fileConfig(self.path_to_ini_file)
         from pylons import config
 
-        def _make_file(ext_file):
+        def _make_file(ext_file, tmpl):
             bdir = os.path.split(ext_file)[0]
             if not os.path.isdir(bdir):
                 os.makedirs(bdir)
@@ -71,11 +71,11 @@
             msg = ('Extension file already exists, do you want '
                    'to overwrite it ? [y/n]')
             if ask_ok(msg):
-                _make_file(ext_file)
+                _make_file(ext_file, tmpl)
             else:
                 log.info('nothing done...')
         else:
-            _make_file(ext_file)
+            _make_file(ext_file, tmpl)
 
     def update_parser(self):
         pass
--- a/rhodecode/config/routing.py	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/config/routing.py	Sat Jun 09 15:30:22 2012 +0200
@@ -341,7 +341,12 @@
         m.connect('api', '/api')
 
     #USER JOURNAL
-    rmap.connect('journal', '%s/journal' % ADMIN_PREFIX, controller='journal')
+    rmap.connect('journal', '%s/journal' % ADMIN_PREFIX,
+                 controller='journal', action='index')
+    rmap.connect('journal_rss', '%s/journal/rss' % ADMIN_PREFIX,
+                 controller='journal', action='journal_rss')
+    rmap.connect('journal_atom', '%s/journal/atom' % ADMIN_PREFIX,
+                 controller='journal', action='journal_atom')
 
     rmap.connect('public_journal', '%s/public_journal' % ADMIN_PREFIX,
                  controller='journal', action="public_journal")
--- a/rhodecode/controllers/admin/settings.py	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/controllers/admin/settings.py	Sat Jun 09 15:30:22 2012 +0200
@@ -174,7 +174,8 @@
             application_form = ApplicationUiSettingsForm()()
             try:
                 form_result = application_form.to_python(dict(request.POST))
-
+                # fix namespaces for hooks
+                _f = lambda s: s.replace('.', '_')
                 try:
 
                     hgsettings1 = self.sa.query(RhodeCodeUi)\
@@ -187,28 +188,28 @@
 
                     #HOOKS
                     hgsettings3 = self.sa.query(RhodeCodeUi)\
-                    .filter(RhodeCodeUi.ui_key == 'changegroup.update').one()
-                    hgsettings3.ui_active = \
-                        bool(form_result['hooks_changegroup_update'])
+                    .filter(RhodeCodeUi.ui_key == RhodeCodeUi.HOOK_UPDATE)\
+                    .one()
+                    hgsettings3.ui_active = bool(form_result[_f('hooks_%s' %
+                                                 RhodeCodeUi.HOOK_UPDATE)])
 
                     hgsettings4 = self.sa.query(RhodeCodeUi)\
-                    .filter(RhodeCodeUi.ui_key ==
-                            'changegroup.repo_size').one()
-                    hgsettings4.ui_active = \
-                        bool(form_result['hooks_changegroup_repo_size'])
+                    .filter(RhodeCodeUi.ui_key == RhodeCodeUi.HOOK_REPO_SIZE)\
+                    .one()
+                    hgsettings4.ui_active = bool(form_result[_f('hooks_%s' %
+                                                 RhodeCodeUi.HOOK_REPO_SIZE)])
 
                     hgsettings5 = self.sa.query(RhodeCodeUi)\
-                    .filter(RhodeCodeUi.ui_key ==
-                            'pretxnchangegroup.push_logger').one()
-                    hgsettings5.ui_active = \
-                        bool(form_result['hooks_pretxnchangegroup'
-                                         '_push_logger'])
+                    .filter(RhodeCodeUi.ui_key == RhodeCodeUi.HOOK_PUSH)\
+                    .one()
+                    hgsettings5.ui_active = bool(form_result[_f('hooks_%s' %
+                                                 RhodeCodeUi.HOOK_PUSH)])
 
                     hgsettings6 = self.sa.query(RhodeCodeUi)\
-                    .filter(RhodeCodeUi.ui_key ==
-                            'preoutgoing.pull_logger').one()
-                    hgsettings6.ui_active = \
-                        bool(form_result['hooks_preoutgoing_pull_logger'])
+                    .filter(RhodeCodeUi.ui_key == RhodeCodeUi.HOOK_PULL)\
+                    .one()
+                    hgsettings6.ui_active = bool(form_result[_f('hooks_%s' %
+                                                 RhodeCodeUi.HOOK_PULL)])
 
                     self.sa.add(hgsettings1)
                     self.sa.add(hgsettings2)
--- a/rhodecode/controllers/feed.py	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/controllers/feed.py	Sat Jun 09 15:30:22 2012 +0200
@@ -73,7 +73,7 @@
     def __get_desc(self, cs):
         desc_msg = []
         desc_msg.append('%s %s %s:<br/>' % (cs.author, _('commited on'),
-                                           cs.date))
+                                           h.fmt_date(cs.date)))
         desc_msg.append('<pre>')
         desc_msg.append(cs.message)
         desc_msg.append('\n')
--- a/rhodecode/controllers/files.py	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/controllers/files.py	Sat Jun 09 15:30:22 2012 +0200
@@ -487,4 +487,4 @@
             cs = self.__get_cs_or_redirect(revision, repo_name)
             _d, _f = ScmModel().get_nodes(repo_name, cs.raw_id, f_path,
                                           flat=False)
-            return _d + _f
+            return {'nodes': _d + _f}
--- a/rhodecode/controllers/journal.py	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/controllers/journal.py	Sat Jun 09 15:30:22 2012 +0200
@@ -49,8 +49,6 @@
 
     def __before__(self):
         super(JournalController, self).__before__()
-        self.rhodecode_user = self.rhodecode_user
-        self.title = _('%s public journal %s feed') % (c.rhodecode_name, '%s')
         self.language = 'en-us'
         self.ttl = "5"
         self.feed_nr = 20
@@ -84,6 +82,30 @@
             return c.journal_data
         return render('journal/journal.html')
 
+    @LoginRequired(api_access=True)
+    @NotAnonymous()
+    def journal_atom(self):
+        """
+        Produce an atom-1.0 feed via feedgenerator module
+        """
+        following = self.sa.query(UserFollowing)\
+            .filter(UserFollowing.user_id == self.rhodecode_user.user_id)\
+            .options(joinedload(UserFollowing.follows_repository))\
+            .all()
+        return self._atom_feed(following, public=False)
+
+    @LoginRequired(api_access=True)
+    @NotAnonymous()
+    def journal_rss(self):
+        """
+        Produce an rss feed via feedgenerator module
+        """
+        following = self.sa.query(UserFollowing)\
+            .filter(UserFollowing.user_id == self.rhodecode_user.user_id)\
+            .options(joinedload(UserFollowing.follows_repository))\
+            .all()
+        return self._rss_feed(following, public=False)
+
     def _get_daily_aggregate(self, journal):
         groups = []
         for k, g in groupby(journal, lambda x: x.action_as_day):
@@ -173,6 +195,80 @@
             return c.journal_data
         return render('journal/public_journal.html')
 
+    def _atom_feed(self, repos, public=True):
+        journal = self._get_journal_data(repos)
+        if public:
+            _link = url('public_journal_atom', qualified=True)
+            _desc = '%s %s %s' % (c.rhodecode_name, _('public journal'),
+                                  'atom feed')
+        else:
+            _link = url('journal_atom', qualified=True)
+            _desc = '%s %s %s' % (c.rhodecode_name, _('journal'), 'atom feed')
+
+        feed = Atom1Feed(title=_desc,
+                         link=_link,
+                         description=_desc,
+                         language=self.language,
+                         ttl=self.ttl)
+
+        for entry in journal[:self.feed_nr]:
+            action, action_extra, ico = h.action_parser(entry, feed=True)
+            title = "%s - %s %s" % (entry.user.short_contact, action(),
+                                 entry.repository.repo_name)
+            desc = action_extra()
+            _url = None
+            if entry.repository is not None:
+                _url = url('changelog_home',
+                           repo_name=entry.repository.repo_name,
+                           qualified=True)
+
+            feed.add_item(title=title,
+                          pubdate=entry.action_date,
+                          link=_url or url('', qualified=True),
+                          author_email=entry.user.email,
+                          author_name=entry.user.full_contact,
+                          description=desc)
+
+        response.content_type = feed.mime_type
+        return feed.writeString('utf-8')
+
+    def _rss_feed(self, repos, public=True):
+        journal = self._get_journal_data(repos)
+        if public:
+            _link = url('public_journal_atom', qualified=True)
+            _desc = '%s %s %s' % (c.rhodecode_name, _('public journal'),
+                                  'rss feed')
+        else:
+            _link = url('journal_atom', qualified=True)
+            _desc = '%s %s %s' % (c.rhodecode_name, _('journal'), 'rss feed')
+
+        feed = Rss201rev2Feed(title=_desc,
+                         link=_link,
+                         description=_desc,
+                         language=self.language,
+                         ttl=self.ttl)
+
+        for entry in journal[:self.feed_nr]:
+            action, action_extra, ico = h.action_parser(entry, feed=True)
+            title = "%s - %s %s" % (entry.user.short_contact, action(),
+                                 entry.repository.repo_name)
+            desc = action_extra()
+            _url = None
+            if entry.repository is not None:
+                _url = url('changelog_home',
+                           repo_name=entry.repository.repo_name,
+                           qualified=True)
+
+            feed.add_item(title=title,
+                          pubdate=entry.action_date,
+                          link=_url or url('', qualified=True),
+                          author_email=entry.user.email,
+                          author_name=entry.user.full_contact,
+                          description=desc)
+
+        response.content_type = feed.mime_type
+        return feed.writeString('utf-8')
+
     @LoginRequired(api_access=True)
     def public_journal_atom(self):
         """
@@ -183,28 +279,7 @@
             .options(joinedload(UserFollowing.follows_repository))\
             .all()
 
-        journal = self._get_journal_data(c.following)
-
-        feed = Atom1Feed(title=self.title % 'atom',
-                         link=url('public_journal_atom', qualified=True),
-                         description=_('Public journal'),
-                         language=self.language,
-                         ttl=self.ttl)
-
-        for entry in journal[:self.feed_nr]:
-            action, action_extra, ico = h.action_parser(entry, feed=True)
-            title = "%s - %s %s" % (entry.user.short_contact, action(),
-                                 entry.repository.repo_name)
-            desc = action_extra()
-            feed.add_item(title=title,
-                          pubdate=entry.action_date,
-                          link=url('', qualified=True),
-                          author_email=entry.user.email,
-                          author_name=entry.user.full_contact,
-                          description=desc)
-
-        response.content_type = feed.mime_type
-        return feed.writeString('utf-8')
+        return self._atom_feed(c.following)
 
     @LoginRequired(api_access=True)
     def public_journal_rss(self):
@@ -216,25 +291,4 @@
             .options(joinedload(UserFollowing.follows_repository))\
             .all()
 
-        journal = self._get_journal_data(c.following)
-
-        feed = Rss201rev2Feed(title=self.title % 'rss',
-                         link=url('public_journal_rss', qualified=True),
-                         description=_('Public journal'),
-                         language=self.language,
-                         ttl=self.ttl)
-
-        for entry in journal[:self.feed_nr]:
-            action, action_extra, ico = h.action_parser(entry, feed=True)
-            title = "%s - %s %s" % (entry.user.short_contact, action(),
-                                 entry.repository.repo_name)
-            desc = action_extra()
-            feed.add_item(title=title,
-                          pubdate=entry.action_date,
-                          link=url('', qualified=True),
-                          author_email=entry.user.email,
-                          author_name=entry.user.full_contact,
-                          description=desc)
-
-        response.content_type = feed.mime_type
-        return feed.writeString('utf-8')
+        return self._rss_feed(c.following)
Binary file rhodecode/i18n/fr/LC_MESSAGES/rhodecode.mo has changed
--- a/rhodecode/i18n/fr/LC_MESSAGES/rhodecode.po	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/i18n/fr/LC_MESSAGES/rhodecode.po	Sat Jun 09 15:30:22 2012 +0200
@@ -7,8 +7,8 @@
 msgstr ""
 "Project-Id-Version: RhodeCode 1.1.5\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2012-06-03 01:06+0200\n"
-"PO-Revision-Date: 2012-05-20 11:36+0100\n"
+"POT-Creation-Date: 2012-06-05 20:42+0200\n"
+"PO-Revision-Date: 2012-06-05 20:07+0100\n"
 "Last-Translator: Vincent Duvert <vincent@duvert.net>\n"
 "Language-Team: fr <LL@li.org>\n"
 "Plural-Forms: nplurals=2; plural=(n > 1)\n"
@@ -17,7 +17,7 @@
 "Content-Transfer-Encoding: 8bit\n"
 "Generated-By: Babel 0.9.6\n"
 
-#: rhodecode/controllers/changelog.py:95
+#: rhodecode/controllers/changelog.py:94
 msgid "All Branches"
 msgstr "Toutes les branches"
 
@@ -69,16 +69,20 @@
 "La requête n’a pu être traitée en raison d’une erreur survenue sur le "
 "serveur."
 
-#: rhodecode/controllers/feed.py:48
+#: rhodecode/controllers/feed.py:49
 #, python-format
 msgid "Changes on %s repository"
 msgstr "Changements sur le dépôt %s"
 
-#: rhodecode/controllers/feed.py:49
+#: rhodecode/controllers/feed.py:50
 #, python-format
 msgid "%s %s feed"
 msgstr "Flux %s de %s"
 
+#: rhodecode/controllers/feed.py:75
+msgid "commited on"
+msgstr "a commité, le"
+
 #: rhodecode/controllers/files.py:86
 #: rhodecode/templates/admin/repos/repo_add.html:13
 msgid "add new"
@@ -138,19 +142,16 @@
 msgstr "Type d’archive inconnu"
 
 #: rhodecode/controllers/files.py:461
-#: rhodecode/templates/changeset/changeset_range.html:5
 #: rhodecode/templates/changeset/changeset_range.html:13
 #: rhodecode/templates/changeset/changeset_range.html:31
 msgid "Changesets"
 msgstr "Changesets"
 
 #: rhodecode/controllers/files.py:462 rhodecode/controllers/summary.py:230
-#: rhodecode/templates/branches/branches.html:5
 msgid "Branches"
 msgstr "Branches"
 
 #: rhodecode/controllers/files.py:463 rhodecode/controllers/summary.py:231
-#: rhodecode/templates/tags/tags.html:5
 msgid "Tags"
 msgstr "Tags"
 
@@ -661,133 +662,123 @@
 msgid "No changes detected"
 msgstr "Aucun changement détecté."
 
-#: rhodecode/lib/helpers.py:415
+#: rhodecode/lib/helpers.py:350
+#, python-format
+msgid "%a, %d %b %Y %H:%M:%S"
+msgstr "%d/%m/%Y à %H:%M:%S"
+
+#: rhodecode/lib/helpers.py:423
 msgid "True"
 msgstr "Vrai"
 
-#: rhodecode/lib/helpers.py:419
+#: rhodecode/lib/helpers.py:427
 msgid "False"
 msgstr "Faux"
 
-#: rhodecode/lib/helpers.py:463
-#, fuzzy
+#: rhodecode/lib/helpers.py:471
 msgid "Changeset not found"
-msgstr "Dépôt vide"
-
-#: rhodecode/lib/helpers.py:486
+msgstr "Ensemble de changements non trouvé"
+
+#: rhodecode/lib/helpers.py:494
 #, python-format
 msgid "Show all combined changesets %s->%s"
 msgstr "Afficher les changements combinés %s->%s"
 
-#: rhodecode/lib/helpers.py:492
+#: rhodecode/lib/helpers.py:500
 msgid "compare view"
 msgstr "vue de comparaison"
 
-#: rhodecode/lib/helpers.py:512
+#: rhodecode/lib/helpers.py:520
 msgid "and"
 msgstr "et"
 
-#: rhodecode/lib/helpers.py:513
+#: rhodecode/lib/helpers.py:521
 #, python-format
 msgid "%s more"
 msgstr "%s de plus"
 
-#: rhodecode/lib/helpers.py:514 rhodecode/templates/changelog/changelog.html:40
+#: rhodecode/lib/helpers.py:522 rhodecode/templates/changelog/changelog.html:40
 msgid "revisions"
 msgstr "révisions"
 
-#: rhodecode/lib/helpers.py:537
+#: rhodecode/lib/helpers.py:545
 msgid "fork name "
 msgstr "Nom du fork"
 
-#: rhodecode/lib/helpers.py:550
+#: rhodecode/lib/helpers.py:558
 msgid "[deleted] repository"
 msgstr "[a supprimé] le dépôt"
 
-#: rhodecode/lib/helpers.py:552 rhodecode/lib/helpers.py:562
+#: rhodecode/lib/helpers.py:560 rhodecode/lib/helpers.py:570
 msgid "[created] repository"
 msgstr "[a créé] le dépôt"
 
-#: rhodecode/lib/helpers.py:554
+#: rhodecode/lib/helpers.py:562
 msgid "[created] repository as fork"
 msgstr "[a créé] le dépôt en tant que fork"
 
-#: rhodecode/lib/helpers.py:556 rhodecode/lib/helpers.py:564
+#: rhodecode/lib/helpers.py:564 rhodecode/lib/helpers.py:572
 msgid "[forked] repository"
 msgstr "[a forké] le dépôt"
 
-#: rhodecode/lib/helpers.py:558 rhodecode/lib/helpers.py:566
+#: rhodecode/lib/helpers.py:566 rhodecode/lib/helpers.py:574
 msgid "[updated] repository"
 msgstr "[a mis à jour] le dépôt"
 
-#: rhodecode/lib/helpers.py:560
-msgid "[delete] repository"
-msgstr "[a supprimé] le dépôt"
-
 #: rhodecode/lib/helpers.py:568
-#, fuzzy, python-format
-#| msgid "created user %s"
-msgid "[created] user"
-msgstr "utilisateur %s créé"
-
-#: rhodecode/lib/helpers.py:570
-#, fuzzy, python-format
-#| msgid "updated users group %s"
-msgid "[updated] user"
-msgstr "Le groupe d’utilisateurs %s a été mis à jour."
-
-#: rhodecode/lib/helpers.py:572
-#, fuzzy, python-format
-#| msgid "created users group %s"
-msgid "[created] users group"
-msgstr "Le groupe d’utilisateurs %s a été créé."
-
-#: rhodecode/lib/helpers.py:574
-#, fuzzy, python-format
-#| msgid "updated users group %s"
-msgid "[updated] users group"
-msgstr "Le groupe d’utilisateurs %s a été mis à jour."
+msgid "[delete] repository"
+msgstr "[a supprimé] le dépôt"
 
 #: rhodecode/lib/helpers.py:576
-#, fuzzy
-#| msgid "[created] repository"
-msgid "[commented] on revision in repository"
-msgstr "[a créé] le dépôt"
+msgid "[created] user"
+msgstr "[a créé] l’utilisateur"
 
 #: rhodecode/lib/helpers.py:578
-msgid "[pushed] into"
-msgstr "[a pushé] dans"
+msgid "[updated] user"
+msgstr "[a mis à jour] l’utilisateur"
 
 #: rhodecode/lib/helpers.py:580
-#, fuzzy
-#| msgid "[committed via RhodeCode] into"
-msgid "[committed via RhodeCode] into repository"
-msgstr "[a commité via RhodeCode] dans"
+msgid "[created] users group"
+msgstr "[a créé] le groupe d’utilisateurs"
 
 #: rhodecode/lib/helpers.py:582
-#, fuzzy
-#| msgid "[pulled from remote] into"
-msgid "[pulled from remote] into repository"
-msgstr "[a pullé depuis un site distant] dans"
+msgid "[updated] users group"
+msgstr "[a mis à jour] le groupe d’utilisateurs"
 
 #: rhodecode/lib/helpers.py:584
+msgid "[commented] on revision in repository"
+msgstr "[a commenté] une révision du dépôt"
+
+#: rhodecode/lib/helpers.py:586
+msgid "[pushed] into"
+msgstr "[a pushé] dans"
+
+#: rhodecode/lib/helpers.py:588
+msgid "[committed via RhodeCode] into repository"
+msgstr "[a commité via RhodeCode] dans le dépôt"
+
+#: rhodecode/lib/helpers.py:590
+msgid "[pulled from remote] into repository"
+msgstr "[a pullé depuis un site distant] dans le dépôt"
+
+#: rhodecode/lib/helpers.py:592
 msgid "[pulled] from"
 msgstr "[a pullé] depuis"
 
-#: rhodecode/lib/helpers.py:586
+#: rhodecode/lib/helpers.py:594
 msgid "[started following] repository"
 msgstr "[suit maintenant] le dépôt"
 
-#: rhodecode/lib/helpers.py:588
+#: rhodecode/lib/helpers.py:596
 msgid "[stopped following] repository"
 msgstr "[ne suit plus] le dépôt"
 
-#: rhodecode/lib/helpers.py:752
+#: rhodecode/lib/helpers.py:760
 #, python-format
 msgid " and %s more"
 msgstr "et %s de plus"
 
-#: rhodecode/lib/helpers.py:756
+#: rhodecode/lib/helpers.py:764
 msgid "No Files"
 msgstr "Aucun fichier"
 
@@ -856,7 +847,7 @@
 msgid "on line %s"
 msgstr "à la ligne %s"
 
-#: rhodecode/model/comment.py:113
+#: rhodecode/model/comment.py:114
 msgid "[Mention]"
 msgstr "[Mention]"
 
@@ -1005,19 +996,19 @@
 msgid "Enter %(min)i characters or more"
 msgstr "Entrez au moins %(min)i caractères"
 
-#: rhodecode/model/notification.py:175
+#: rhodecode/model/notification.py:178
 msgid "commented on commit"
 msgstr "a posté un commentaire sur le commit"
 
-#: rhodecode/model/notification.py:176
+#: rhodecode/model/notification.py:179
 msgid "sent message"
 msgstr "a envoyé un message"
 
-#: rhodecode/model/notification.py:177
+#: rhodecode/model/notification.py:180
 msgid "mentioned you"
 msgstr "vous a mentioné"
 
-#: rhodecode/model/notification.py:178
+#: rhodecode/model/notification.py:181
 msgid "registered in RhodeCode"
 msgstr "s’est enregistré sur RhodeCode"
 
@@ -1051,13 +1042,14 @@
 msgstr "Tableau de bord"
 
 #: rhodecode/templates/index_base.html:6
+#: rhodecode/templates/repo_switcher_list.html:4
 #: rhodecode/templates/admin/users/user_edit_my_account.html:31
 #: rhodecode/templates/bookmarks/bookmarks.html:10
 #: rhodecode/templates/branches/branches.html:9
 #: rhodecode/templates/journal/journal.html:31
 #: rhodecode/templates/tags/tags.html:10
 msgid "quick filter..."
-msgstr "filtre rapide"
+msgstr "Filtre rapide…"
 
 #: rhodecode/templates/index_base.html:6 rhodecode/templates/base/base.html:218
 msgid "repositories"
@@ -1807,6 +1799,12 @@
 msgid "private repository"
 msgstr "Dépôt privé"
 
+#: rhodecode/templates/admin/repos/repo_edit_perms.html:19
+#: rhodecode/templates/admin/repos/repo_edit_perms.html:28
+#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:18
+msgid "default"
+msgstr "[Par défaut]"
+
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:33
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:58
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:23
@@ -1857,7 +1855,7 @@
 
 #: rhodecode/templates/admin/repos_groups/repos_groups.html:12
 msgid "with"
-msgstr "avec support de"
+msgstr "comprenant"
 
 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:5
 msgid "Add repos group"
@@ -1939,7 +1937,6 @@
 
 #: rhodecode/templates/admin/settings/hooks.html:9
 #: rhodecode/templates/admin/settings/settings.html:9
-#: rhodecode/templates/settings/repo_settings.html:5
 #: rhodecode/templates/settings/repo_settings.html:13
 msgid "Settings"
 msgstr "Options"
@@ -2379,14 +2376,12 @@
 #: rhodecode/templates/data_table/_dt_elements.html:9
 #: rhodecode/templates/data_table/_dt_elements.html:11
 #: rhodecode/templates/data_table/_dt_elements.html:13
-#: rhodecode/templates/summary/summary.html:4
 msgid "Summary"
 msgstr "Résumé"
 
 #: rhodecode/templates/base/base.html:166
 #: rhodecode/templates/base/base.html:168
 #: rhodecode/templates/base/base.html:170
-#: rhodecode/templates/changelog/changelog.html:6
 #: rhodecode/templates/changelog/changelog.html:15
 #: rhodecode/templates/data_table/_dt_elements.html:17
 #: rhodecode/templates/data_table/_dt_elements.html:19
@@ -2406,7 +2401,6 @@
 #: rhodecode/templates/data_table/_dt_elements.html:25
 #: rhodecode/templates/data_table/_dt_elements.html:27
 #: rhodecode/templates/data_table/_dt_elements.html:29
-#: rhodecode/templates/files/files.html:4
 #: rhodecode/templates/files/files.html:40
 msgid "Files"
 msgstr "Fichiers"
@@ -2454,13 +2448,11 @@
 
 #: rhodecode/templates/base/base.html:235
 #: rhodecode/templates/base/base.html:237
-#: rhodecode/templates/followers/followers.html:5
 msgid "Followers"
 msgstr "Followers"
 
 #: rhodecode/templates/base/base.html:243
 #: rhodecode/templates/base/base.html:245
-#: rhodecode/templates/forks/forks.html:5
 msgid "Forks"
 msgstr "Forks"
 
@@ -2493,8 +2485,9 @@
 msgstr "Groupe"
 
 #: rhodecode/templates/bookmarks/bookmarks.html:5
-msgid "Bookmarks"
-msgstr "Signets"
+#, python-format
+msgid "%s Bookmarks"
+msgstr "Signets de %s"
 
 #: rhodecode/templates/bookmarks/bookmarks.html:39
 #: rhodecode/templates/bookmarks/bookmarks_data.html:8
@@ -2504,6 +2497,11 @@
 msgid "Author"
 msgstr "Auteur"
 
+#: rhodecode/templates/branches/branches.html:5
+#, python-format
+msgid "%s Branches"
+msgstr "Branches de %s"
+
 #: rhodecode/templates/branches/branches_data.html:7
 msgid "date"
 msgstr "Date"
@@ -2518,6 +2516,11 @@
 msgid "revision"
 msgstr "Révision"
 
+#: rhodecode/templates/changelog/changelog.html:6
+#, python-format
+msgid "%s Changelog"
+msgstr "Historique de %s"
+
 #: rhodecode/templates/changelog/changelog.html:15
 #, python-format
 msgid "showing %d out of %d revision"
@@ -2605,6 +2608,10 @@
 msgstr "%s fichiers affectés"
 
 #: rhodecode/templates/changeset/changeset.html:6
+#, python-format
+msgid "%s Changeset"
+msgstr "Changeset de %s"
+
 #: rhodecode/templates/changeset/changeset.html:14
 msgid "Changeset"
 msgstr "Changements"
@@ -2689,6 +2696,11 @@
 msgid "Leave a comment"
 msgstr "Laisser un commentaire"
 
+#: rhodecode/templates/changeset/changeset_range.html:5
+#, python-format
+msgid "%s Changesets"
+msgstr "Changesets de %s"
+
 #: rhodecode/templates/changeset/changeset_range.html:29
 msgid "Compare View"
 msgstr "Comparaison"
@@ -2708,7 +2720,6 @@
 #: rhodecode/templates/data_table/_dt_elements.html:33
 #: rhodecode/templates/data_table/_dt_elements.html:35
 #: rhodecode/templates/data_table/_dt_elements.html:37
-#: rhodecode/templates/forks/fork.html:5
 msgid "Fork"
 msgstr "Fork"
 
@@ -2750,10 +2761,19 @@
 msgstr "Vous serez redirigé vers %s dans %s secondes."
 
 #: rhodecode/templates/files/file_diff.html:4
+#, python-format
+msgid "%s File diff"
+msgstr "Diff de fichier de %s"
+
 #: rhodecode/templates/files/file_diff.html:12
 msgid "File diff"
 msgstr "Diff de fichier"
 
+#: rhodecode/templates/files/files.html:4
+#, python-format
+msgid "%s Files"
+msgstr "Fichiers de %s"
+
 #: rhodecode/templates/files/files.html:12
 #: rhodecode/templates/summary/summary.html:328
 msgid "files"
@@ -2769,8 +2789,9 @@
 
 #: rhodecode/templates/files/files_add.html:4
 #: rhodecode/templates/files/files_edit.html:4
-msgid "Edit file"
-msgstr "Éditer un fichier"
+#, python-format
+msgid "%s Edit file"
+msgstr "Edition de fichier de %s"
 
 #: rhodecode/templates/files/files_add.html:19
 msgid "add file"
@@ -2929,13 +2950,23 @@
 msgid "No files at given path"
 msgstr "Aucun fichier à cet endroit"
 
+#: rhodecode/templates/followers/followers.html:5
+#, python-format
+msgid "%s Followers"
+msgstr "Followers de %s"
+
 #: rhodecode/templates/followers/followers.html:13
 msgid "followers"
 msgstr "followers"
 
 #: rhodecode/templates/followers/followers_data.html:12
-msgid "Started following"
-msgstr "Date de début"
+msgid "Started following -"
+msgstr "A commencé à suivre le dépôt :"
+
+#: rhodecode/templates/forks/fork.html:5
+#, python-format
+msgid "%s Fork"
+msgstr "Fork de %s"
 
 #: rhodecode/templates/forks/fork.html:31
 msgid "Fork name"
@@ -2957,6 +2988,11 @@
 msgid "fork this repository"
 msgstr "Forker ce dépôt"
 
+#: rhodecode/templates/forks/forks.html:5
+#, python-format
+msgid "%s Forks"
+msgstr "Forks de %s"
+
 #: rhodecode/templates/forks/forks.html:13
 msgid "forks"
 msgstr "forks"
@@ -3028,10 +3064,15 @@
 msgid "Permission denied"
 msgstr "Permission refusée"
 
+#: rhodecode/templates/settings/repo_settings.html:5
+#, python-format
+msgid "%s Settings"
+msgstr "Réglages de %s"
+
 #: rhodecode/templates/shortlog/shortlog.html:5
-#: rhodecode/templates/summary/summary.html:209
-msgid "Shortlog"
-msgstr "Résumé des changements"
+#, python-format
+msgid "%s Shortlog"
+msgstr "Résumé de %s"
 
 #: rhodecode/templates/shortlog/shortlog.html:14
 msgid "shortlog"
@@ -3057,6 +3098,11 @@
 msgid "Existing repository?"
 msgstr "Le dépôt existe déjà ?"
 
+#: rhodecode/templates/summary/summary.html:4
+#, python-format
+msgid "%s Summary"
+msgstr "Résumé de %s"
+
 #: rhodecode/templates/summary/summary.html:12
 msgid "summary"
 msgstr "résumé"
@@ -3113,6 +3159,10 @@
 msgid "Downloads are disabled for this repository"
 msgstr "Les téléchargements sont désactivés pour ce dépôt."
 
+#: rhodecode/templates/summary/summary.html:161
+msgid "Download as zip"
+msgstr "Télécharger en ZIP"
+
 #: rhodecode/templates/summary/summary.html:164
 msgid "Check this to download archive with subrepos"
 msgstr "Télécharger une archive contenant également les sous-dépôts éventuels"
@@ -3129,6 +3179,10 @@
 msgid "Stats gathered: "
 msgstr "Statistiques obtenues :"
 
+#: rhodecode/templates/summary/summary.html:209
+msgid "Shortlog"
+msgstr "Résumé des changements"
+
 #: rhodecode/templates/summary/summary.html:211
 msgid "Quick start"
 msgstr "Démarrage rapide"
@@ -3170,3 +3224,8 @@
 msgid "file removed"
 msgstr "fichier supprimé"
 
+#: rhodecode/templates/tags/tags.html:5
+#, python-format
+msgid "%s Tags"
+msgstr "Tags de %s"
+
--- a/rhodecode/i18n/rhodecode.pot	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/i18n/rhodecode.pot	Sat Jun 09 15:30:22 2012 +0200
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: RhodeCode 1.4.0\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2012-06-03 01:06+0200\n"
+"POT-Creation-Date: 2012-06-05 20:42+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,7 +17,7 @@
 "Content-Transfer-Encoding: 8bit\n"
 "Generated-By: Babel 0.9.6\n"
 
-#: rhodecode/controllers/changelog.py:95
+#: rhodecode/controllers/changelog.py:94
 msgid "All Branches"
 msgstr ""
 
@@ -65,16 +65,20 @@
 "fulfilling the request."
 msgstr ""
 
-#: rhodecode/controllers/feed.py:48
+#: rhodecode/controllers/feed.py:49
 #, python-format
 msgid "Changes on %s repository"
 msgstr ""
 
-#: rhodecode/controllers/feed.py:49
+#: rhodecode/controllers/feed.py:50
 #, python-format
 msgid "%s %s feed"
 msgstr ""
 
+#: rhodecode/controllers/feed.py:75
+msgid "commited on"
+msgstr ""
+
 #: rhodecode/controllers/files.py:86
 #: rhodecode/templates/admin/repos/repo_add.html:13
 msgid "add new"
@@ -134,19 +138,16 @@
 msgstr ""
 
 #: rhodecode/controllers/files.py:461
-#: rhodecode/templates/changeset/changeset_range.html:5
 #: rhodecode/templates/changeset/changeset_range.html:13
 #: rhodecode/templates/changeset/changeset_range.html:31
 msgid "Changesets"
 msgstr ""
 
 #: rhodecode/controllers/files.py:462 rhodecode/controllers/summary.py:230
-#: rhodecode/templates/branches/branches.html:5
 msgid "Branches"
 msgstr ""
 
 #: rhodecode/controllers/files.py:463 rhodecode/controllers/summary.py:231
-#: rhodecode/templates/tags/tags.html:5
 msgid "Tags"
 msgstr ""
 
@@ -619,118 +620,123 @@
 msgid "No changes detected"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:415
+#: rhodecode/lib/helpers.py:350
+#, python-format
+msgid "%a, %d %b %Y %H:%M:%S"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:423
 msgid "True"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:419
+#: rhodecode/lib/helpers.py:427
 msgid "False"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:463
+#: rhodecode/lib/helpers.py:471
 msgid "Changeset not found"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:486
+#: rhodecode/lib/helpers.py:494
 #, python-format
 msgid "Show all combined changesets %s->%s"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:492
+#: rhodecode/lib/helpers.py:500
 msgid "compare view"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:512
+#: rhodecode/lib/helpers.py:520
 msgid "and"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:513
+#: rhodecode/lib/helpers.py:521
 #, python-format
 msgid "%s more"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:514 rhodecode/templates/changelog/changelog.html:40
+#: rhodecode/lib/helpers.py:522 rhodecode/templates/changelog/changelog.html:40
 msgid "revisions"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:537
+#: rhodecode/lib/helpers.py:545
 msgid "fork name "
 msgstr ""
 
-#: rhodecode/lib/helpers.py:550
+#: rhodecode/lib/helpers.py:558
 msgid "[deleted] repository"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:552 rhodecode/lib/helpers.py:562
+#: rhodecode/lib/helpers.py:560 rhodecode/lib/helpers.py:570
 msgid "[created] repository"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:554
+#: rhodecode/lib/helpers.py:562
 msgid "[created] repository as fork"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:556 rhodecode/lib/helpers.py:564
+#: rhodecode/lib/helpers.py:564 rhodecode/lib/helpers.py:572
 msgid "[forked] repository"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:558 rhodecode/lib/helpers.py:566
+#: rhodecode/lib/helpers.py:566 rhodecode/lib/helpers.py:574
 msgid "[updated] repository"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:560
-msgid "[delete] repository"
-msgstr ""
-
 #: rhodecode/lib/helpers.py:568
-msgid "[created] user"
-msgstr ""
-
-#: rhodecode/lib/helpers.py:570
-msgid "[updated] user"
-msgstr ""
-
-#: rhodecode/lib/helpers.py:572
-msgid "[created] users group"
-msgstr ""
-
-#: rhodecode/lib/helpers.py:574
-msgid "[updated] users group"
+msgid "[delete] repository"
 msgstr ""
 
 #: rhodecode/lib/helpers.py:576
-msgid "[commented] on revision in repository"
+msgid "[created] user"
 msgstr ""
 
 #: rhodecode/lib/helpers.py:578
-msgid "[pushed] into"
+msgid "[updated] user"
 msgstr ""
 
 #: rhodecode/lib/helpers.py:580
-msgid "[committed via RhodeCode] into repository"
+msgid "[created] users group"
 msgstr ""
 
 #: rhodecode/lib/helpers.py:582
-msgid "[pulled from remote] into repository"
+msgid "[updated] users group"
 msgstr ""
 
 #: rhodecode/lib/helpers.py:584
-msgid "[pulled] from"
+msgid "[commented] on revision in repository"
 msgstr ""
 
 #: rhodecode/lib/helpers.py:586
-msgid "[started following] repository"
+msgid "[pushed] into"
 msgstr ""
 
 #: rhodecode/lib/helpers.py:588
+msgid "[committed via RhodeCode] into repository"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:590
+msgid "[pulled from remote] into repository"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:592
+msgid "[pulled] from"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:594
+msgid "[started following] repository"
+msgstr ""
+
+#: rhodecode/lib/helpers.py:596
 msgid "[stopped following] repository"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:752
+#: rhodecode/lib/helpers.py:760
 #, python-format
 msgid " and %s more"
 msgstr ""
 
-#: rhodecode/lib/helpers.py:756
+#: rhodecode/lib/helpers.py:764
 msgid "No Files"
 msgstr ""
 
@@ -799,7 +805,7 @@
 msgid "on line %s"
 msgstr ""
 
-#: rhodecode/model/comment.py:113
+#: rhodecode/model/comment.py:114
 msgid "[Mention]"
 msgstr ""
 
@@ -938,19 +944,19 @@
 msgid "Enter %(min)i characters or more"
 msgstr ""
 
-#: rhodecode/model/notification.py:175
+#: rhodecode/model/notification.py:178
 msgid "commented on commit"
 msgstr ""
 
-#: rhodecode/model/notification.py:176
+#: rhodecode/model/notification.py:179
 msgid "sent message"
 msgstr ""
 
-#: rhodecode/model/notification.py:177
+#: rhodecode/model/notification.py:180
 msgid "mentioned you"
 msgstr ""
 
-#: rhodecode/model/notification.py:178
+#: rhodecode/model/notification.py:181
 msgid "registered in RhodeCode"
 msgstr ""
 
@@ -978,6 +984,7 @@
 msgstr ""
 
 #: rhodecode/templates/index_base.html:6
+#: rhodecode/templates/repo_switcher_list.html:4
 #: rhodecode/templates/admin/users/user_edit_my_account.html:31
 #: rhodecode/templates/bookmarks/bookmarks.html:10
 #: rhodecode/templates/branches/branches.html:9
@@ -1708,6 +1715,12 @@
 msgid "private repository"
 msgstr ""
 
+#: rhodecode/templates/admin/repos/repo_edit_perms.html:19
+#: rhodecode/templates/admin/repos/repo_edit_perms.html:28
+#: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:18
+msgid "default"
+msgstr ""
+
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:33
 #: rhodecode/templates/admin/repos/repo_edit_perms.html:58
 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:23
@@ -1840,7 +1853,6 @@
 
 #: rhodecode/templates/admin/settings/hooks.html:9
 #: rhodecode/templates/admin/settings/settings.html:9
-#: rhodecode/templates/settings/repo_settings.html:5
 #: rhodecode/templates/settings/repo_settings.html:13
 msgid "Settings"
 msgstr ""
@@ -2268,13 +2280,11 @@
 #: rhodecode/templates/data_table/_dt_elements.html:9
 #: rhodecode/templates/data_table/_dt_elements.html:11
 #: rhodecode/templates/data_table/_dt_elements.html:13
-#: rhodecode/templates/summary/summary.html:4
 msgid "Summary"
 msgstr ""
 
 #: rhodecode/templates/base/base.html:166 rhodecode/templates/base/base.html:168
 #: rhodecode/templates/base/base.html:170
-#: rhodecode/templates/changelog/changelog.html:6
 #: rhodecode/templates/changelog/changelog.html:15
 #: rhodecode/templates/data_table/_dt_elements.html:17
 #: rhodecode/templates/data_table/_dt_elements.html:19
@@ -2292,7 +2302,7 @@
 #: rhodecode/templates/data_table/_dt_elements.html:25
 #: rhodecode/templates/data_table/_dt_elements.html:27
 #: rhodecode/templates/data_table/_dt_elements.html:29
-#: rhodecode/templates/files/files.html:4 rhodecode/templates/files/files.html:40
+#: rhodecode/templates/files/files.html:40
 msgid "Files"
 msgstr ""
 
@@ -2336,12 +2346,10 @@
 msgstr ""
 
 #: rhodecode/templates/base/base.html:235 rhodecode/templates/base/base.html:237
-#: rhodecode/templates/followers/followers.html:5
 msgid "Followers"
 msgstr ""
 
 #: rhodecode/templates/base/base.html:243 rhodecode/templates/base/base.html:245
-#: rhodecode/templates/forks/forks.html:5
 msgid "Forks"
 msgstr ""
 
@@ -2372,7 +2380,8 @@
 msgstr ""
 
 #: rhodecode/templates/bookmarks/bookmarks.html:5
-msgid "Bookmarks"
+#, python-format
+msgid "%s Bookmarks"
 msgstr ""
 
 #: rhodecode/templates/bookmarks/bookmarks.html:39
@@ -2382,6 +2391,11 @@
 msgid "Author"
 msgstr ""
 
+#: rhodecode/templates/branches/branches.html:5
+#, python-format
+msgid "%s Branches"
+msgstr ""
+
 #: rhodecode/templates/branches/branches_data.html:7
 msgid "date"
 msgstr ""
@@ -2396,6 +2410,11 @@
 msgid "revision"
 msgstr ""
 
+#: rhodecode/templates/changelog/changelog.html:6
+#, python-format
+msgid "%s Changelog"
+msgstr ""
+
 #: rhodecode/templates/changelog/changelog.html:15
 #, python-format
 msgid "showing %d out of %d revision"
@@ -2483,6 +2502,10 @@
 msgstr ""
 
 #: rhodecode/templates/changeset/changeset.html:6
+#, python-format
+msgid "%s Changeset"
+msgstr ""
+
 #: rhodecode/templates/changeset/changeset.html:14
 msgid "Changeset"
 msgstr ""
@@ -2563,6 +2586,11 @@
 msgid "Leave a comment"
 msgstr ""
 
+#: rhodecode/templates/changeset/changeset_range.html:5
+#, python-format
+msgid "%s Changesets"
+msgstr ""
+
 #: rhodecode/templates/changeset/changeset_range.html:29
 msgid "Compare View"
 msgstr ""
@@ -2582,7 +2610,6 @@
 #: rhodecode/templates/data_table/_dt_elements.html:33
 #: rhodecode/templates/data_table/_dt_elements.html:35
 #: rhodecode/templates/data_table/_dt_elements.html:37
-#: rhodecode/templates/forks/fork.html:5
 msgid "Fork"
 msgstr ""
 
@@ -2624,10 +2651,19 @@
 msgstr ""
 
 #: rhodecode/templates/files/file_diff.html:4
+#, python-format
+msgid "%s File diff"
+msgstr ""
+
 #: rhodecode/templates/files/file_diff.html:12
 msgid "File diff"
 msgstr ""
 
+#: rhodecode/templates/files/files.html:4
+#, python-format
+msgid "%s Files"
+msgstr ""
+
 #: rhodecode/templates/files/files.html:12
 #: rhodecode/templates/summary/summary.html:328
 msgid "files"
@@ -2643,7 +2679,8 @@
 
 #: rhodecode/templates/files/files_add.html:4
 #: rhodecode/templates/files/files_edit.html:4
-msgid "Edit file"
+#, python-format
+msgid "%s Edit file"
 msgstr ""
 
 #: rhodecode/templates/files/files_add.html:19
@@ -2803,12 +2840,22 @@
 msgid "No files at given path"
 msgstr ""
 
+#: rhodecode/templates/followers/followers.html:5
+#, python-format
+msgid "%s Followers"
+msgstr ""
+
 #: rhodecode/templates/followers/followers.html:13
 msgid "followers"
 msgstr ""
 
 #: rhodecode/templates/followers/followers_data.html:12
-msgid "Started following"
+msgid "Started following -"
+msgstr ""
+
+#: rhodecode/templates/forks/fork.html:5
+#, python-format
+msgid "%s Fork"
 msgstr ""
 
 #: rhodecode/templates/forks/fork.html:31
@@ -2831,6 +2878,11 @@
 msgid "fork this repository"
 msgstr ""
 
+#: rhodecode/templates/forks/forks.html:5
+#, python-format
+msgid "%s Forks"
+msgstr ""
+
 #: rhodecode/templates/forks/forks.html:13
 msgid "forks"
 msgstr ""
@@ -2902,9 +2954,14 @@
 msgid "Permission denied"
 msgstr ""
 
+#: rhodecode/templates/settings/repo_settings.html:5
+#, python-format
+msgid "%s Settings"
+msgstr ""
+
 #: rhodecode/templates/shortlog/shortlog.html:5
-#: rhodecode/templates/summary/summary.html:209
-msgid "Shortlog"
+#, python-format
+msgid "%s Shortlog"
 msgstr ""
 
 #: rhodecode/templates/shortlog/shortlog.html:14
@@ -2931,6 +2988,11 @@
 msgid "Existing repository?"
 msgstr ""
 
+#: rhodecode/templates/summary/summary.html:4
+#, python-format
+msgid "%s Summary"
+msgstr ""
+
 #: rhodecode/templates/summary/summary.html:12
 msgid "summary"
 msgstr ""
@@ -2987,6 +3049,10 @@
 msgid "Downloads are disabled for this repository"
 msgstr ""
 
+#: rhodecode/templates/summary/summary.html:161
+msgid "Download as zip"
+msgstr ""
+
 #: rhodecode/templates/summary/summary.html:164
 msgid "Check this to download archive with subrepos"
 msgstr ""
@@ -3003,6 +3069,10 @@
 msgid "Stats gathered: "
 msgstr ""
 
+#: rhodecode/templates/summary/summary.html:209
+msgid "Shortlog"
+msgstr ""
+
 #: rhodecode/templates/summary/summary.html:211
 msgid "Quick start"
 msgstr ""
@@ -3044,3 +3114,8 @@
 msgid "file removed"
 msgstr ""
 
+#: rhodecode/templates/tags/tags.html:5
+#, python-format
+msgid "%s Tags"
+msgstr ""
+
--- a/rhodecode/lib/helpers.py	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/lib/helpers.py	Sat Jun 09 15:30:22 2012 +0200
@@ -109,7 +109,7 @@
 
     def __call__(self, field_name, form_errors):
         tmpl = """<span class="error_msg">%s</span>"""
-        if form_errors and form_errors.has_key(field_name):
+        if form_errors and field_name in form_errors:
             return literal(tmpl % form_errors.get(field_name))
 
 get_error = _GetError()
@@ -118,12 +118,15 @@
 class _ToolTip(object):
 
     def __call__(self, tooltip_title, trim_at=50):
-        """Special function just to wrap our text into nice formatted
+        """
+        Special function just to wrap our text into nice formatted
         autowrapped text
 
         :param tooltip_title:
         """
-        return escape(tooltip_title)
+        tooltip_title = escape(tooltip_title)
+        tooltip_title = tooltip_title.replace('<', '&lt;').replace('>', '&gt;')
+        return tooltip_title
 tooltip = _ToolTip()
 
 
@@ -346,6 +349,14 @@
 hide_credentials = lambda x: ''.join(credentials_filter(x))
 
 
+def fmt_date(date):
+    if date:
+        return (date.strftime(_(u"%a, %d %b %Y %H:%M:%S").encode('utf8'))
+            .decode('utf8'))
+
+    return ""
+
+
 def is_git(repository):
     if hasattr(repository, 'alias'):
         _type = repository.alias
--- a/rhodecode/lib/hooks.py	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/lib/hooks.py	Sat Jun 09 15:30:22 2012 +0200
@@ -30,9 +30,9 @@
 from mercurial.scmutil import revrange
 from mercurial.node import nullrev
 
-from rhodecode import EXTENSIONS
 from rhodecode.lib import helpers as h
 from rhodecode.lib.utils import action_logger
+from rhodecode.lib.vcs.backends.base import EmptyChangeset
 
 
 def _get_scm_size(alias, root_path):
@@ -99,6 +99,7 @@
 
     action_logger(username, action, repository, extras['ip'], commit=True)
     # extension hook call
+    from rhodecode import EXTENSIONS
     callback = getattr(EXTENSIONS, 'PULL_HOOK', None)
 
     if isfunction(callback):
@@ -137,15 +138,18 @@
 
         stop, start = get_revs(repo, [node + ':'])
         h = binascii.hexlify
-        revs = (h(repo[r].node()) for r in xrange(start, stop + 1))
+        revs = [h(repo[r].node()) for r in xrange(start, stop + 1)]
     elif scm == 'git':
-        revs = []
+        revs = kwargs.get('_git_revs', [])
+        if '_git_revs' in kwargs:
+            kwargs.pop('_git_revs')
 
     action = action % ','.join(revs)
 
     action_logger(username, action, repository, extras['ip'], commit=True)
 
     # extension hook call
+    from rhodecode import EXTENSIONS
     callback = getattr(EXTENSIONS, 'PUSH_HOOK', None)
     if isfunction(callback):
         kw = {'pushed_revs': revs}
@@ -180,7 +184,7 @@
      'repo_name'
 
     """
-
+    from rhodecode import EXTENSIONS
     callback = getattr(EXTENSIONS, 'CREATE_REPO_HOOK', None)
     if isfunction(callback):
         kw = {}
@@ -190,3 +194,67 @@
         return callback(**kw)
 
     return 0
+
+
+def handle_git_post_receive(repo_path, revs, env):
+    """
+    A really hacky method that is runned by git post-receive hook and logs
+    an push action together with pushed revisions. It's executed by subprocess
+    thus needs all info to be able to create a on the fly pylons enviroment,
+    connect to database and run the logging code. Hacky as sh*t but works.
+
+    :param repo_path:
+    :type repo_path:
+    :param revs:
+    :type revs:
+    :param env:
+    :type env:
+    """
+    from paste.deploy import appconfig
+    from sqlalchemy import engine_from_config
+    from rhodecode.config.environment import load_environment
+    from rhodecode.model import init_model
+    from rhodecode.model.db import RhodeCodeUi
+    from rhodecode.lib.utils import make_ui
+    from rhodecode.model.db import Repository
+
+    path, ini_name = os.path.split(env['RHODECODE_CONFIG_FILE'])
+    conf = appconfig('config:%s' % ini_name, relative_to=path)
+    load_environment(conf.global_conf, conf.local_conf)
+
+    engine = engine_from_config(conf, 'sqlalchemy.db1.')
+    init_model(engine)
+
+    baseui = make_ui('db')
+    repo = Repository.get_by_full_path(repo_path)
+
+    _hooks = dict(baseui.configitems('hooks')) or {}
+    # if push hook is enabled via web interface
+    if _hooks.get(RhodeCodeUi.HOOK_PUSH):
+
+        extras = {
+         'username': env['RHODECODE_USER'],
+         'repository': repo.repo_name,
+         'scm': 'git',
+         'action': 'push',
+         'ip': env['RHODECODE_CONFIG_IP'],
+        }
+        for k, v in extras.items():
+            baseui.setconfig('rhodecode_extras', k, v)
+        repo = repo.scm_instance
+        repo.ui = baseui
+        old_rev, new_rev, ref = revs
+        if old_rev == EmptyChangeset().raw_id:
+            cmd = "for-each-ref --format='%(refname)' 'refs/heads/*'"
+            heads = repo.run_git_command(cmd)[0]
+            heads = heads.replace(ref, '')
+            heads = ' '.join(map(lambda c: c.strip('\n').strip(),
+                                 heads.splitlines()))
+            cmd = ('log ' + new_rev +
+                   ' --reverse --pretty=format:"%H" --not ' + heads)
+        else:
+            cmd = ('log ' + old_rev + '..' + new_rev +
+                   ' --reverse --pretty=format:"%H"')
+        git_revs = repo.run_git_command(cmd)[0].splitlines()
+
+        log_push_action(baseui, repo, _git_revs=git_revs)
--- a/rhodecode/lib/middleware/pygrack.py	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/lib/middleware/pygrack.py	Sat Jun 09 15:30:22 2012 +0200
@@ -41,7 +41,7 @@
     git_folder_signature = set(['config', 'head', 'info', 'objects', 'refs'])
     commands = ['git-upload-pack', 'git-receive-pack']
 
-    def __init__(self, repo_name, content_path):
+    def __init__(self, repo_name, content_path, username):
         files = set([f.lower() for f in os.listdir(content_path)])
         if  not (self.git_folder_signature.intersection(files)
                 == self.git_folder_signature):
@@ -50,6 +50,7 @@
         self.valid_accepts = ['application/x-%s-result' %
                               c for c in self.commands]
         self.repo_name = repo_name
+        self.username = username
 
     def _get_fixedpath(self, path):
         """
@@ -115,11 +116,26 @@
             inputstream = environ['wsgi.input']
 
         try:
+            gitenv = os.environ
+            from rhodecode import CONFIG
+            from rhodecode.lib.base import _get_ip_addr
+            gitenv['RHODECODE_USER'] = self.username
+            gitenv['RHODECODE_CONFIG_IP'] = _get_ip_addr(environ)
+            # forget all configs
+            gitenv['GIT_CONFIG_NOGLOBAL'] = '1'
+            # we need current .ini file used to later initialize rhodecode
+            # env and connect to db
+            gitenv['RHODECODE_CONFIG_FILE'] = CONFIG['__file__']
+            opts = dict(
+                env=gitenv,
+                cwd=os.getcwd()
+            )
             out = subprocessio.SubprocessIOChunker(
                 r'git %s --stateless-rpc "%s"' % (git_command[4:],
                                                   self.content_path),
-                inputstream=inputstream
-                )
+                inputstream=inputstream,
+                **opts
+            )
         except EnvironmentError, e:
             log.exception(e)
             raise exc.HTTPExpectationFailed()
@@ -156,7 +172,7 @@
 
 class GitDirectory(object):
 
-    def __init__(self, repo_root, repo_name):
+    def __init__(self, repo_root, repo_name, username):
         repo_location = os.path.join(repo_root, repo_name)
         if not os.path.isdir(repo_location):
             raise OSError(repo_location)
@@ -164,18 +180,20 @@
         self.content_path = repo_location
         self.repo_name = repo_name
         self.repo_location = repo_location
+        self.username = username
 
     def __call__(self, environ, start_response):
         content_path = self.content_path
         try:
-            app = GitRepository(self.repo_name, content_path)
+            app = GitRepository(self.repo_name, content_path, self.username)
         except (AssertionError, OSError):
             if os.path.isdir(os.path.join(content_path, '.git')):
-                app = GitRepository(os.path.join(content_path, '.git'))
+                app = GitRepository(self.repo_name,
+                                    os.path.join(content_path, '.git'))
             else:
-                return exc.HTTPNotFound()(environ, start_response)
+                return exc.HTTPNotFound()(environ, start_response, self.username)
         return app(environ, start_response)
 
 
-def make_wsgi_app(repo_name, repo_root):
-    return GitDirectory(repo_root, repo_name)
+def make_wsgi_app(repo_name, repo_root, username):
+    return GitDirectory(repo_root, repo_name, username)
--- a/rhodecode/lib/middleware/simplegit.py	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/lib/middleware/simplegit.py	Sat Jun 09 15:30:22 2012 +0200
@@ -68,8 +68,9 @@
   'git-receive-pack': dulserver.ReceivePackHandler,
 }
 
-from dulwich.repo import Repo
-from dulwich.web import make_wsgi_chain
+# not used for now until dulwich get's fixed
+#from dulwich.repo import Repo
+#from dulwich.web import make_wsgi_chain
 
 from paste.httpheaders import REMOTE_USER, AUTH_TYPE
 
@@ -77,7 +78,7 @@
 from rhodecode.lib.base import BaseVCSController
 from rhodecode.lib.auth import get_container_username
 from rhodecode.lib.utils import is_valid_repo, make_ui
-from rhodecode.model.db import User
+from rhodecode.model.db import User, RhodeCodeUi
 
 from webob.exc import HTTPNotFound, HTTPForbidden, HTTPInternalServerError
 
@@ -205,13 +206,13 @@
             self._handle_githooks(repo_name, action, baseui, environ)
 
             log.info('%s action on GIT repo "%s"' % (action, repo_name))
-            app = self.__make_app(repo_name, repo_path)
+            app = self.__make_app(repo_name, repo_path, username)
             return app(environ, start_response)
         except Exception:
             log.error(traceback.format_exc())
             return HTTPInternalServerError()(environ, start_response)
 
-    def __make_app(self, repo_name, repo_path):
+    def __make_app(self, repo_name, repo_path, username):
         """
         Make an wsgi application using dulserver
 
@@ -223,6 +224,7 @@
         app = make_wsgi_app(
             repo_root=os.path.dirname(repo_path),
             repo_name=repo_name,
+            username=username,
         )
         return app
 
@@ -268,7 +270,10 @@
         return op
 
     def _handle_githooks(self, repo_name, action, baseui, environ):
-        from rhodecode.lib.hooks import log_pull_action, log_push_action
+        """
+        Handles pull action, push is handled by post-receive hook
+        """
+        from rhodecode.lib.hooks import log_pull_action
         service = environ['QUERY_STRING'].split('=')
         if len(service) < 2:
             return
@@ -278,12 +283,8 @@
         _repo = _repo.scm_instance
         _repo._repo.ui = baseui
 
-        push_hook = 'pretxnchangegroup.push_logger'
-        pull_hook = 'preoutgoing.pull_logger'
         _hooks = dict(baseui.configitems('hooks')) or {}
-        if action == 'push' and _hooks.get(push_hook):
-            log_push_action(ui=baseui, repo=_repo._repo)
-        elif action == 'pull' and _hooks.get(pull_hook):
+        if action == 'pull' and _hooks.get(RhodeCodeUi.HOOK_PULL):
             log_pull_action(ui=baseui, repo=_repo._repo)
 
     def __inject_extras(self, repo_path, baseui, extras={}):
--- a/rhodecode/lib/subprocessio.py	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/lib/subprocessio.py	Sat Jun 09 15:30:22 2012 +0200
@@ -276,7 +276,7 @@
         return self.data[i]
 
 
-class SubprocessIOChunker():
+class SubprocessIOChunker(object):
     '''
     Processor class wrapping handling of subprocess IO.
 
@@ -321,7 +321,7 @@
 
     '''
     def __init__(self, cmd, inputstream=None, buffer_size=65536,
-                 chunk_size=4096, starting_values=[]):
+                 chunk_size=4096, starting_values=[], **kwargs):
         '''
         Initializes SubprocessIOChunker
 
@@ -342,7 +342,8 @@
             shell=True,
             stdin=inputstream,
             stdout=subprocess.PIPE,
-            stderr=subprocess.PIPE
+            stderr=subprocess.PIPE,
+            **kwargs
             )
 
         bg_out = BufferedGenerator(_p.stdout, buffer_size, chunk_size, starting_values)
--- a/rhodecode/model/db.py	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/model/db.py	Sat Jun 09 15:30:22 2012 +0200
@@ -242,7 +242,7 @@
 
     HOOK_UPDATE = 'changegroup.update'
     HOOK_REPO_SIZE = 'changegroup.repo_size'
-    HOOK_PUSH = 'pretxnchangegroup.push_logger'
+    HOOK_PUSH = 'changegroup.push_logger'
     HOOK_PULL = 'preoutgoing.pull_logger'
 
     ui_id = Column("ui_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
@@ -273,6 +273,10 @@
         return q.all()
 
     @classmethod
+    def get_repos_location(cls):
+        return cls.get_by_key('/').one().ui_value
+
+    @classmethod
     def create_or_update_hook(cls, key, val):
         new_ui = cls.get_by_key(key).scalar() or cls()
         new_ui.ui_section = 'hooks'
@@ -587,6 +591,11 @@
         return q.scalar()
 
     @classmethod
+    def get_by_full_path(cls, repo_full_path):
+        repo_name = repo_full_path.split(cls.base_path(), 1)[-1]
+        return cls.get_by_repo_name(repo_name.strip(URL_SEP))
+
+    @classmethod
     def get_repo_forks(cls, repo_id):
         return cls.query().filter(Repository.fork_id == repo_id)
 
--- a/rhodecode/model/forms.py	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/model/forms.py	Sat Jun 09 15:30:22 2012 +0200
@@ -731,7 +731,7 @@
         paths_root_path = All(ValidPath(), UnicodeString(strip=True, min=1, not_empty=True))
         hooks_changegroup_update = OneOf(['True', 'False'], if_missing=False)
         hooks_changegroup_repo_size = OneOf(['True', 'False'], if_missing=False)
-        hooks_pretxnchangegroup_push_logger = OneOf(['True', 'False'], if_missing=False)
+        hooks_changegroup_push_logger = OneOf(['True', 'False'], if_missing=False)
         hooks_preoutgoing_pull_logger = OneOf(['True', 'False'], if_missing=False)
 
     return _ApplicationUiSettingsForm
--- a/rhodecode/model/permission.py	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/model/permission.py	Sat Jun 09 15:30:22 2012 +0200
@@ -31,7 +31,8 @@
 from rhodecode.lib.caching_query import FromCache
 
 from rhodecode.model import BaseModel
-from rhodecode.model.db import User, Permission, UserToPerm, UserRepoToPerm
+from rhodecode.model.db import User, Permission, UserToPerm, UserRepoToPerm,\
+    UserRepoGroupToPerm
 
 log = logging.getLogger(__name__)
 
@@ -87,23 +88,33 @@
                                        form_result['default_perm'])
                     self.sa.add(p)
 
-                if p.permission.permission_name.startswith('hg.register.'):
+                elif p.permission.permission_name.startswith('hg.register.'):
                     p.permission = self.get_permission_by_name(
                                        form_result['default_register'])
                     self.sa.add(p)
 
-                if p.permission.permission_name.startswith('hg.create.'):
+                elif p.permission.permission_name.startswith('hg.create.'):
                     p.permission = self.get_permission_by_name(
                                         form_result['default_create'])
                     self.sa.add(p)
 
+            _def_name = form_result['default_perm'].split('repository.')[-1]
             #stage 2 update all default permissions for repos if checked
             if form_result['overwrite_default'] == True:
+                _def = self.get_permission_by_name('repository.' + _def_name)
+                # repos
                 for r2p in self.sa.query(UserRepoToPerm)\
-                               .filter(UserRepoToPerm.user == perm_user).all():
-                    r2p.permission = self.get_permission_by_name(
-                                         form_result['default_perm'])
+                               .filter(UserRepoToPerm.user == perm_user)\
+                               .all():
+                    r2p.permission = _def
                     self.sa.add(r2p)
+                # groups
+                _def = self.get_permission_by_name('group.' + _def_name)
+                for g2p in self.sa.query(UserRepoGroupToPerm)\
+                               .filter(UserRepoGroupToPerm.user == perm_user)\
+                               .all():
+                    g2p.permission = _def
+                    self.sa.add(g2p)
 
             # stage 3 set anonymous access
             if perm_user.username == 'default':
--- a/rhodecode/model/repo.py	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/model/repo.py	Sat Jun 09 15:30:22 2012 +0200
@@ -22,10 +22,13 @@
 #
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
+from __future__ import with_statement
 import os
 import shutil
 import logging
 import traceback
+import pkg_resources
+from os.path import dirname as dn, join as jn
 from datetime import datetime
 
 from rhodecode.lib.vcs.backends import get_backend
@@ -461,7 +464,23 @@
         if alias == 'hg':
             backend(repo_path, create=True, src_url=clone_uri)
         elif alias == 'git':
-            backend(repo_path, create=True, src_url=clone_uri, bare=True)
+            r = backend(repo_path, create=True, src_url=clone_uri, bare=True)
+            # add rhodecode hook into this repo
+
+            loc = jn(r.path, 'hooks')
+            if not r.bare:
+                loc = jn(r.path, '.git', 'hooks')
+            if not os.path.isdir(loc):
+                os.makedirs(loc)
+
+            tmpl = pkg_resources.resource_string(
+                'rhodecode', jn('config', 'post_receive_tmpl.py')
+            )
+            _hook_file = jn(loc, 'post-receive')
+            with open(_hook_file, 'wb') as f:
+                f.write(tmpl)
+            os.chmod(_hook_file, 0755)
+
         else:
             raise Exception('Undefined alias %s' % alias)
 
--- a/rhodecode/public/js/rhodecode.js	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/public/js/rhodecode.js	Sat Jun 09 15:30:22 2012 +0200
@@ -611,8 +611,8 @@
 }
 
 
-var fileBrowserListeners = function(current_url, node_list_url, url_base,
-									truncated_lbl, nomatch_lbl){
+var fileBrowserListeners = function(current_url, node_list_url, url_base){
+	
 	var current_url_branch = +"?branch=__BRANCH__";
 	var url = url_base;
 	var node_url = node_list_url;	
@@ -641,7 +641,7 @@
 	  YUC.initHeader('X-PARTIAL-XHR',true);
 	  YUC.asyncRequest('GET',url,{
 	      success:function(o){
-	        nodes = JSON.parse(o.responseText);
+	        nodes = JSON.parse(o.responseText).nodes;
 	        YUD.setStyle('node_filter_box_loading','display','none');
 	        YUD.setStyle('node_filter_box','display','');
 	        n_filter.focus();
@@ -685,9 +685,8 @@
 	                    match.push('<tr><td><a class="browser-{0}" href="{1}">{2}</a></td><td colspan="5"></td></tr>'.format(t,node_url.replace('__FPATH__',n),n_hl));
 	                }
 	                if(match.length >= matches_max){
-	                    match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(truncated_lbl));
+	                    match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(_TM['search truncated']));
 	                }
-	                
 	            }                       
 	        }
 	        if(query != ""){
@@ -695,7 +694,7 @@
 	            YUD.setStyle('tbody_filtered','display','');
 	            
 	            if (match.length==0){
-	              match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(nomatch_lbl));
+	              match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(_TM['no matching files']));
 	            }                           
 	            
 	            YUD.get('tbody_filtered').innerHTML = match.join("");   
--- a/rhodecode/templates/admin/admin_log.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/admin/admin_log.html	Sat Jun 09 15:30:22 2012 +0200
@@ -25,7 +25,7 @@
 		%endif
 		</td>
 
-		<td>${l.action_date}</td>
+		<td>${h.fmt_date(l.action_date)}</td>
 		<td>${l.user_ip}</td>
 	</tr>
 	%endfor
--- a/rhodecode/templates/admin/repos/repo_edit_perms.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/admin/repos/repo_edit_perms.html	Sat Jun 09 15:30:22 2012 +0200
@@ -16,7 +16,7 @@
                     ${_('private repository')}
                     </span>
                 </td>
-                <td class="private_repo_msg"><img style="vertical-align:bottom" src="${h.url('/images/icons/user.png')}"/>${r2p.user.username}</td>
+                <td class="private_repo_msg"><img style="vertical-align:bottom" src="${h.url('/images/icons/user.png')}"/>${_('default')}</td>
             </tr>
         %else:
         <tr id="id${id(r2p.user.username)}">
@@ -25,7 +25,7 @@
             <td>${h.radio('u_perm_%s' % r2p.user.username,'repository.write')}</td>
             <td>${h.radio('u_perm_%s' % r2p.user.username,'repository.admin')}</td>
             <td style="white-space: nowrap;">
-                <img class="perm-gravatar" src="${h.gravatar_url(r2p.user.email,14)}"/>${r2p.user.username}
+                <img class="perm-gravatar" src="${h.gravatar_url(r2p.user.email,14)}"/>${r2p.user.username if r2p.user.username != 'default' else _('default')}
             </td>
             <td>
               %if r2p.user.username !='default':
--- a/rhodecode/templates/admin/repos/repos.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/admin/repos/repos.html	Sat Jun 09 15:30:22 2012 +0200
@@ -56,7 +56,7 @@
               </td>
               ##LAST CHANGE
               <td>
-                <span class="tooltip" title="${repo['last_change']}">${h.age(repo['last_change'])}</span>
+                <span class="tooltip" title="${h.tooltip(repo['last_change'])}">${h.age(repo['last_change'])}</span>
               </td>
               ##LAST REVISION
               <td>
--- a/rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html	Sat Jun 09 15:30:22 2012 +0200
@@ -15,7 +15,7 @@
             <td>${h.radio('u_perm_%s' % r2p.user.username,'group.write')}</td>
             <td>${h.radio('u_perm_%s' % r2p.user.username,'group.admin')}</td>
             <td style="white-space: nowrap;">
-                <img class="perm-gravatar" src="${h.gravatar_url(r2p.user.email,14)}"/>${r2p.user.username}
+                <img class="perm-gravatar" src="${h.gravatar_url(r2p.user.email,14)}"/>${r2p.user.username if r2p.user.username != 'default' else _('default')}
             </td>
             <td>
               %if r2p.user.username !='default':
--- a/rhodecode/templates/admin/settings/settings.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/admin/settings/settings.html	Sat Jun 09 15:30:22 2012 +0200
@@ -148,8 +148,8 @@
 						<label for="hooks_changegroup_repo_size">${_('Show repository size after push')}</label>
 					</div>
                     <div class="checkbox">
-                        ${h.checkbox('hooks_pretxnchangegroup_push_logger','True')}
-                        <label for="hooks_pretxnchangegroup_push_logger">${_('Log user push commands')}</label>
+                        ${h.checkbox('hooks_changegroup_push_logger','True')}
+                        <label for="hooks_changegroup_push_logger">${_('Log user push commands')}</label>
                     </div>
                     <div class="checkbox">
                         ${h.checkbox('hooks_preoutgoing_pull_logger','True')}
--- a/rhodecode/templates/admin/users/users.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/admin/users/users.html	Sat Jun 09 15:30:22 2012 +0200
@@ -40,13 +40,13 @@
             <th class="left">${_('action')}</th>
         </tr>
             %for cnt,user in enumerate(c.users_list):
-             %if user.name !='default':
+             %if user.username !='default':
                 <tr class="parity${cnt%2}">
                 	<td><div class="gravatar"><img alt="gravatar" src="${h.gravatar_url(user.email,24)}"/> </div></td>
                     <td>${h.link_to(user.username,h.url('edit_user', id=user.user_id))}</td>
                     <td>${user.name}</td>
                     <td>${user.lastname}</td>
-                    <td>${user.last_login}</td>
+                    <td>${h.fmt_date(user.last_login)}</td>
                     <td>${h.bool2icon(user.active)}</td>
                     <td>${h.bool2icon(user.admin)}</td>
                     <td>${h.bool2icon(bool(user.ldap_dn))}</td>
--- a/rhodecode/templates/admin/users_groups/users_groups.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/admin/users_groups/users_groups.html	Sat Jun 09 15:30:22 2012 +0200
@@ -37,7 +37,7 @@
             %for cnt,u_group in enumerate(c.users_groups_list):
                 <tr class="parity${cnt%2}">
                     <td>${h.link_to(u_group.users_group_name,h.url('edit_users_group', id=u_group.users_group_id))}</td>
-                    <td><span class="tooltip" title="${', '.join(map(h.safe_unicode,[x.user.username for x in u_group.members[:50]]))}">${len(u_group.members)}</span></td>
+                    <td><span class="tooltip" title="${h.tooltip(', '.join(map(h.safe_unicode,[x.user.username for x in u_group.members[:50]])))}">${len(u_group.members)}</span></td>
                     <td>${h.bool2icon(u_group.users_group_active)}</td>
                     <td>
                         ${h.form(url('users_group', id=u_group.users_group_id),method='delete')}
--- a/rhodecode/templates/base/root.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/base/root.html	Sat Jun 09 15:30:22 2012 +0200
@@ -43,7 +43,9 @@
                 'Stop following this repository':"${_('Stop following this repository')}",
                 'Start following this repository':"${_('Start following this repository')}",
                 'Group':"${_('Group')}",
-                'members':"${_('members')}"
+                'members':"${_('members')}",
+                'search truncated': "${_('search truncated')}",
+                'no matching files': "${_('no matching files')}"                
 
             };
             var _TM = TRANSLATION_MAP;
@@ -137,6 +139,8 @@
         </%def>
         <%def name="js_extra()"></%def>
         ${self.js()}
+        <%def name="head_extra()"></%def>
+        ${self.head_extra()}
     </head>
     <body id="body">
      ## IE hacks
--- a/rhodecode/templates/bookmarks/bookmarks.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/bookmarks/bookmarks.html	Sat Jun 09 15:30:22 2012 +0200
@@ -2,7 +2,7 @@
 <%inherit file="/base/base.html"/>
 
 <%def name="title()">
-    ${c.repo_name} ${_('Bookmarks')} - ${c.rhodecode_name}
+    ${_('%s Bookmarks') % c.repo_name} - ${c.rhodecode_name}
 </%def>
 
 
--- a/rhodecode/templates/bookmarks/bookmarks_data.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/bookmarks/bookmarks_data.html	Sat Jun 09 15:30:22 2012 +0200
@@ -17,7 +17,7 @@
                     h.url('files_home',repo_name=c.repo_name,revision=book[1].raw_id))}</span>
                 </span>
             </td>
-            <td><span class="tooltip" title="${h.age(book[1].date)}">${book[1].date}</span></td>
+            <td><span class="tooltip" title="${h.tooltip(h.age(book[1].date))}">${h.fmt_date(book[1].date)}</span></td>
 	        <td title="${book[1].author}">${h.person(book[1].author)}</td>
 	        <td>
               <div>
--- a/rhodecode/templates/branches/branches.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/branches/branches.html	Sat Jun 09 15:30:22 2012 +0200
@@ -2,7 +2,7 @@
 <%inherit file="/base/base.html"/>
 
 <%def name="title()">
-    ${c.repo_name} ${_('Branches')} - ${c.rhodecode_name}
+    ${_('%s Branches') % c.repo_name} - ${c.rhodecode_name}
 </%def>
 
 <%def name="breadcrumbs_links()">
--- a/rhodecode/templates/branches/branches_data.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/branches/branches_data.html	Sat Jun 09 15:30:22 2012 +0200
@@ -18,7 +18,7 @@
                     h.url('files_home',repo_name=c.repo_name,revision=branch[1].raw_id))}</span>
                 </span>
             </td>
-            <td><span class="tooltip" title="${h.age(branch[1].date)}">${branch[1].date}</span></td>
+            <td><span class="tooltip" title="${h.tooltip(h.age(branch[1].date))}">${h.fmt_date(branch[1].date)}</span></td>
             <td title="${branch[1].author}">${h.person(branch[1].author)}</td>
             <td>
                 <div>
@@ -40,7 +40,7 @@
                       h.url('changeset_home',repo_name=c.repo_name,revision=branch[1].raw_id))}</span>
                   </span>
               </td>
-              <td><span class="tooltip" title="${h.age(branch[1].date)}">${branch[1].date}</span></td>
+              <td><span class="tooltip" title="${h.tooltip(h.age(branch[1].date))}">${h.fmt_date(branch[1].date)}</span></td>
               <td title="${branch[1].author}">${h.person(branch[1].author)}</td>
               <td>
                 <div>
--- a/rhodecode/templates/changelog/changelog.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/changelog/changelog.html	Sat Jun 09 15:30:22 2012 +0200
@@ -3,7 +3,7 @@
 <%inherit file="/base/base.html"/>
 
 <%def name="title()">
-${c.repo_name} ${_('Changelog')} - ${c.rhodecode_name}
+${_('%s Changelog') % c.repo_name} - ${c.rhodecode_name}
 </%def>
 
 <%def name="breadcrumbs_links()">
@@ -55,7 +55,7 @@
 						<div class="left">
 							<div>
 							${h.checkbox(cs.short_id,class_="changeset_range")}
-							<span class="tooltip" title="${h.age(cs.date)}"><a href="${h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id)}"><span class="changeset_id">${cs.revision}:<span class="changeset_hash">${h.short_id(cs.raw_id)}</span></span></a></span>
+							<span class="tooltip" title="${h.tooltip(h.age(cs.date))}"><a href="${h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id)}"><span class="changeset_id">${cs.revision}:<span class="changeset_hash">${h.short_id(cs.raw_id)}</span></span></a></span>
 							</div>
 							<div class="author">
 								<div class="gravatar">
@@ -63,15 +63,15 @@
 								</div>
 								<div title="${cs.author}" class="user">${h.shorter(h.person(cs.author),22)}</div>
 							</div>
-                            <div class="date">${cs.date}</div>
+                            <div class="date">${h.fmt_date(cs.date)}</div>
 						</div>
 						<div class="mid">
-                            <div class="message">${h.urlify_commit(h.wrap_paragraphs(cs.message),c.repo_name,h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id))}</div>
+                            <div class="message">${h.urlify_commit(cs.message, c.repo_name,h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id))}</div>
                             <div class="expand"><span class="expandtext">&darr; ${_('show more')} &darr;</span></div>
 						</div>
 						<div class="right">
 									<div class="changes">
-                                        <div id="${cs.raw_id}"  style="float:right;" class="changed_total tooltip" title="${_('Affected number of files, click to show more details')}">${len(cs.affected_files)}</div>
+                                        <div id="${cs.raw_id}"  style="float:right;" class="changed_total tooltip" title="${h.tooltip(_('Affected number of files, click to show more details'))}">${len(cs.affected_files)}</div>
                                         <div class="comments-container">
                                         %if len(c.comments.get(cs.raw_id,[])) > 0:
                                             <div class="comments-cnt" title="${('comments')}">
--- a/rhodecode/templates/changelog/changelog_details.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/changelog/changelog_details.html	Sat Jun 09 15:30:22 2012 +0200
@@ -1,11 +1,11 @@
 ## small box that displays changed/added/removed details fetched by AJAX
 
 % if len(c.cs.affected_files) <= c.affected_files_cut_off:
-<span class="removed tooltip" title="<b>${_('removed')}</b>${h.changed_tooltip(c.cs.removed)}">${len(c.cs.removed)}</span>
-<span class="changed tooltip" title="<b>${_('changed')}</b>${h.changed_tooltip(c.cs.changed)}">${len(c.cs.changed)}</span>
-<span class="added tooltip" title="<b>${_('added')}</b>${h.changed_tooltip(c.cs.added)}">${len(c.cs.added)}</span>
+<span class="removed tooltip" title="<b>${h.tooltip(_('removed'))}</b>${h.changed_tooltip(c.cs.removed)}">${len(c.cs.removed)}</span>
+<span class="changed tooltip" title="<b>${h.tooltip(_('changed'))}</b>${h.changed_tooltip(c.cs.changed)}">${len(c.cs.changed)}</span>
+<span class="added tooltip"   title="<b>${h.tooltip(_('added'))}</b>${h.changed_tooltip(c.cs.added)}">${len(c.cs.added)}</span>
 % else:
- <span class="removed tooltip" title="${_('affected %s files') % len(c.cs.affected_files)}">!</span>
- <span class="changed tooltip" title="${_('affected %s files') % len(c.cs.affected_files)}">!</span>
- <span class="added tooltip"   title="${_('affected %s files') % len(c.cs.affected_files)}">!</span>
+ <span class="removed tooltip" title="${h.tooltip(_('affected %s files') % len(c.cs.affected_files))}">!</span>
+ <span class="changed tooltip" title="${h.tooltip(_('affected %s files') % len(c.cs.affected_files))}">!</span>
+ <span class="added tooltip"   title="${h.tooltip(_('affected %s files') % len(c.cs.affected_files))}">!</span>
 % endif
--- a/rhodecode/templates/changeset/changeset.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/changeset/changeset.html	Sat Jun 09 15:30:22 2012 +0200
@@ -3,7 +3,7 @@
 <%inherit file="/base/base.html"/>
 
 <%def name="title()">
-    ${c.repo_name} ${_('Changeset')} - r${c.changeset.revision}:${h.short_id(c.changeset.raw_id)} - ${c.rhodecode_name}
+    ${_('%s Changeset') % c.repo_name} - r${c.changeset.revision}:${h.short_id(c.changeset.raw_id)} - ${c.rhodecode_name}
 </%def>
 
 <%def name="breadcrumbs_links()">
@@ -31,7 +31,7 @@
                  r${c.changeset.revision}:${h.short_id(c.changeset.raw_id)}
                 </div>
                 <div class="date">
-                  ${c.changeset.date}
+                  ${h.fmt_date(c.changeset.date)}
                 </div>
                 <div class="changeset-status-container">
                     %if c.statuses:
@@ -40,8 +40,8 @@
                     %endif
                 </div>
                 <div class="diff-actions">
-                  <a href="${h.url('raw_changeset_home',repo_name=c.repo_name,revision=c.changeset.raw_id,diff='show')}" title="${_('raw diff')}" class="tooltip"><img class="icon" src="${h.url('/images/icons/page_white.png')}"/></a>
-                  <a href="${h.url('raw_changeset_home',repo_name=c.repo_name,revision=c.changeset.raw_id,diff='download')}" title="${_('download diff')}" class="tooltip"><img class="icon" src="${h.url('/images/icons/page_white_get.png')}"/></a>
+                  <a href="${h.url('raw_changeset_home',repo_name=c.repo_name,revision=c.changeset.raw_id,diff='show')}"  class="tooltip" title="${h.tooltip(_('raw diff'))}"><img class="icon" src="${h.url('/images/icons/page_white.png')}"/></a>
+                  <a href="${h.url('raw_changeset_home',repo_name=c.repo_name,revision=c.changeset.raw_id,diff='download')}"  class="tooltip" title="${h.tooltip(_('download diff'))}"><img class="icon" src="${h.url('/images/icons/page_white_get.png')}"/></a>
                   ${c.ignorews_url(request.GET)}
                   ${c.context_url(request.GET)}
                 </div>
@@ -58,7 +58,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.urlify_commit(h.wrap_paragraphs(c.changeset.message),c.repo_name)}</div>
+	                 <div class="message">${h.urlify_commit(c.changeset.message, c.repo_name)}</div>
 	             </div>
 	             <div class="right">
 		             <div class="changes">
--- a/rhodecode/templates/changeset/changeset_file_comment.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/changeset/changeset_file_comment.html	Sat Jun 09 15:30:22 2012 +0200
@@ -43,9 +43,12 @@
       ${h.form(h.url('changeset_comment', repo_name=c.repo_name, revision=changeset.raw_id),class_='inline-form')}
       <div class="clearfix">
           <div class="comment-help">${_('Commenting on line {1}.')}
-          ${(_('Comments parsed using %s syntax with %s support.') % (('<a href="%s">RST</a>' % h.url('rst_help')),
-          	'<span style="color:#003367" class="tooltip" title="%s">@mention</span>' %
-          	_('Use @username inside this text to send notification to this RhodeCode user')))|n}
+          ${(_('Comments parsed using %s syntax with %s support.') % (
+                 ('<a href="%s">RST</a>' % h.url('rst_help')),
+          	     ('<span style="color:#003367" class="tooltip" title="%s">@mention</span>' % _('Use @username inside this text to send notification to this RhodeCode user'))
+               )
+            )|n
+           }
           </div>
             <div class="mentions-container" id="mentions_container_{1}"></div>
             <textarea id="text_{1}" name="text" class="yui-ac-input"></textarea>
--- a/rhodecode/templates/changeset/changeset_range.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/changeset/changeset_range.html	Sat Jun 09 15:30:22 2012 +0200
@@ -2,7 +2,7 @@
 <%inherit file="/base/base.html"/>
 
 <%def name="title()">
-    ${c.repo_name} ${_('Changesets')} - r${c.cs_ranges[0].revision}:${h.short_id(c.cs_ranges[0].raw_id)} -> r${c.cs_ranges[-1].revision}:${h.short_id(c.cs_ranges[-1].raw_id)} - ${c.rhodecode_name}
+    ${_('%s Changesets') % c.repo_name} - r${c.cs_ranges[0].revision}:${h.short_id(c.cs_ranges[0].raw_id)} -> r${c.cs_ranges[-1].revision}:${h.short_id(c.cs_ranges[-1].raw_id)} - ${c.rhodecode_name}
 </%def>
 
 <%def name="breadcrumbs_links()">
@@ -43,7 +43,7 @@
                 <td><span class="tooltip" title="${h.age(cs.date)}">${cs.date}</span></td>
                 <td>
                   %if c.statuses:
-                    <div title="${_('Changeset status')}" class="changeset-status-ico"><img src="${h.url('/images/icons/flag_status_%s.png' % c.statuses[cnt])}" /></div>
+                    <div title="${h.tooltip(_('Changeset status'))}" class="changeset-status-ico"><img src="${h.url('/images/icons/flag_status_%s.png' % c.statuses[cnt])}" /></div>
                   %endif
                 </td>
                 <td><div class="message">${h.urlify_commit(h.wrap_paragraphs(cs.message),c.repo_name)}</div></td>
--- a/rhodecode/templates/changeset/diff_block.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/changeset/diff_block.html	Sat Jun 09 15:30:22 2012 +0200
@@ -16,9 +16,9 @@
                     revision=filenode.changeset.raw_id,f_path=h.safe_unicode(filenode.path)))}
                 </div>
                 <div class="diff-actions">
-                  <a href="${h.url('files_diff_home',repo_name=c.repo_name,f_path=h.safe_unicode(filenode.path),diff2=cs2,diff1=cs1,diff='diff',fulldiff=1)}" title="${_('diff')}" class="tooltip"><img class="icon" src="${h.url('/images/icons/page_white_go.png')}"/></a>
-                  <a href="${h.url('files_diff_home',repo_name=c.repo_name,f_path=h.safe_unicode(filenode.path),diff2=cs2,diff1=cs1,diff='raw')}" title="${_('raw diff')}" class="tooltip"><img class="icon" src="${h.url('/images/icons/page_white.png')}"/></a>
-                  <a href="${h.url('files_diff_home',repo_name=c.repo_name,f_path=h.safe_unicode(filenode.path),diff2=cs2,diff1=cs1,diff='download')}" title="${_('download diff')}" class="tooltip"><img class="icon" src="${h.url('/images/icons/page_white_get.png')}"/></a>
+                  <a href="${h.url('files_diff_home',repo_name=c.repo_name,f_path=h.safe_unicode(filenode.path),diff2=cs2,diff1=cs1,diff='diff',fulldiff=1)}" class="tooltip" title="${h.tooltip(_('diff'))}"><img class="icon" src="${h.url('/images/icons/page_white_go.png')}"/></a>
+                  <a href="${h.url('files_diff_home',repo_name=c.repo_name,f_path=h.safe_unicode(filenode.path),diff2=cs2,diff1=cs1,diff='raw')}" class="tooltip" title="${h.tooltip(_('raw diff'))}"><img class="icon" src="${h.url('/images/icons/page_white.png')}"/></a>
+                  <a href="${h.url('files_diff_home',repo_name=c.repo_name,f_path=h.safe_unicode(filenode.path),diff2=cs2,diff1=cs1,diff='download')}" class="tooltip" title="${h.tooltip(_('download diff'))}"><img class="icon" src="${h.url('/images/icons/page_white_get.png')}"/></a>
                   ${c.ignorews_url(request.GET, h.FID(filenode.changeset.raw_id,filenode.path))}
                   ${c.context_url(request.GET, h.FID(filenode.changeset.raw_id,filenode.path))}
                 </div>
--- a/rhodecode/templates/files/file_diff.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/files/file_diff.html	Sat Jun 09 15:30:22 2012 +0200
@@ -1,7 +1,7 @@
 <%inherit file="/base/base.html"/>
 
 <%def name="title()">
-    ${c.repo_name} ${_('File diff')} - ${c.rhodecode_name}
+    ${_('%s File diff') % c.repo_name} - ${c.rhodecode_name}
 </%def>
 
 <%def name="breadcrumbs_links()">
--- a/rhodecode/templates/files/files.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/files/files.html	Sat Jun 09 15:30:22 2012 +0200
@@ -1,7 +1,7 @@
 <%inherit file="/base/base.html"/>
 
 <%def name="title()">
-    ${c.repo_name} ${_('Files')} - ${c.rhodecode_name}
+    ${_('%s Files') % c.repo_name} - ${c.rhodecode_name}
 </%def>
 
 <%def name="breadcrumbs_links()">
@@ -41,8 +41,6 @@
 var current_url = "${h.url.current()}";
 var node_list_url = '${h.url("files_home",repo_name=c.repo_name,revision=c.changeset.raw_id,f_path='__FPATH__')}';
 var url_base = '${h.url("files_nodelist_home",repo_name=c.repo_name,revision=c.changeset.raw_id,f_path=c.file.path)}';
-var truncated_lbl = "${_('search truncated')}";
-var nomatch_lbl = "${_('no matching files')}";
-fileBrowserListeners(current_url, node_list_url, url_base, truncated_lbl, nomatch_lbl);
+fileBrowserListeners(current_url, node_list_url, url_base);
 </script>
 </%def>
--- a/rhodecode/templates/files/files_add.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/files/files_add.html	Sat Jun 09 15:30:22 2012 +0200
@@ -1,7 +1,7 @@
 <%inherit file="/base/base.html"/>
 
 <%def name="title()">
-    ${c.repo_name} ${_('Edit file')} - ${c.rhodecode_name}
+    ${_('%s Edit file') % c.repo_name} - ${c.rhodecode_name}
 </%def>
 
 <%def name="js_extra()">
--- a/rhodecode/templates/files/files_browser.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/files/files_browser.html	Sat Jun 09 15:30:22 2012 +0200
@@ -88,14 +88,14 @@
 		             </td>
 		             <td>
 		             	%if node.is_file():
-		             		<div class="tooltip" title="${node.last_changeset.message}">
+		             		<div class="tooltip" title="${h.tooltip(node.last_changeset.message)}">
 		             		<pre>${'r%s:%s' % (node.last_changeset.revision,node.last_changeset.short_id)}</pre>
                             </div>
 		             	%endif
 		             </td>
 		             <td>
 		             	%if node.is_file():
-		             		<span class="tooltip" title="${node.last_changeset.date}">
+		             		<span class="tooltip" title="${h.tooltip(h.fmt_date(node.last_changeset.date))}">
                             ${h.age(node.last_changeset.date)}</span>
 		             	%endif
 		             </td>
--- a/rhodecode/templates/files/files_edit.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/files/files_edit.html	Sat Jun 09 15:30:22 2012 +0200
@@ -1,7 +1,7 @@
 <%inherit file="/base/base.html"/>
 
 <%def name="title()">
-    ${c.repo_name} ${_('Edit file')} - ${c.rhodecode_name}
+    ${_('%s Edit file') % c.repo_name} - ${c.rhodecode_name}
 </%def>
 
 <%def name="js_extra()">
--- a/rhodecode/templates/files/files_source.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/files/files_source.html	Sat Jun 09 15:30:22 2012 +0200
@@ -16,7 +16,7 @@
 	<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 class="tooltip" title="${c.file.changeset.date}">${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 class="tooltip" title="${h.tooltip(h.fmt_date(c.file.changeset.date))}">${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">
--- a/rhodecode/templates/followers/followers.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/followers/followers.html	Sat Jun 09 15:30:22 2012 +0200
@@ -2,7 +2,7 @@
 <%inherit file="/base/base.html"/>
 
 <%def name="title()">
-    ${c.repo_name} ${_('Followers')} - ${c.rhodecode_name}
+    ${_('%s Followers') % c.repo_name} - ${c.rhodecode_name}
 </%def>
 
 <%def name="breadcrumbs_links()">
--- a/rhodecode/templates/followers/followers_data.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/followers/followers_data.html	Sat Jun 09 15:30:22 2012 +0200
@@ -9,8 +9,8 @@
             <span style="font-size: 20px"> <b>${f.user.username}</b> (${f.user.name} ${f.user.lastname})</span>
         </div>
         <div style="clear:both;padding-top: 10px"></div>
-        <div class="follower_date">${_('Started following')} -
-        <span class="tooltip" title="${f.follows_from}"> ${h.age(f.follows_from)}</span></div>
+        <div class="follower_date">${_('Started following -')}
+        <span class="tooltip" title="${h.tooltip(f.follows_from)}"> ${h.age(f.follows_from)}</span></div>
         <div style="border-bottom: 1px solid #DDD;margin:10px 0px 10px 0px"></div>
     </div>
 % endfor
--- a/rhodecode/templates/forks/fork.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/forks/fork.html	Sat Jun 09 15:30:22 2012 +0200
@@ -2,7 +2,7 @@
 <%inherit file="/base/base.html"/>
 
 <%def name="title()">
-    ${c.repo_name} ${_('Fork')} - ${c.rhodecode_name}
+    ${_('%s Fork') % c.repo_name} - ${c.rhodecode_name}
 </%def>
 
 <%def name="breadcrumbs_links()">
--- a/rhodecode/templates/forks/forks.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/forks/forks.html	Sat Jun 09 15:30:22 2012 +0200
@@ -2,7 +2,7 @@
 <%inherit file="/base/base.html"/>
 
 <%def name="title()">
-    ${c.repo_name} ${_('Forks')} - ${c.rhodecode_name}
+    ${_('%s Forks') % c.repo_name} - ${c.rhodecode_name}
 </%def>
 
 <%def name="breadcrumbs_links()">
--- a/rhodecode/templates/forks/forks_data.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/forks/forks_data.html	Sat Jun 09 15:30:22 2012 +0200
@@ -15,7 +15,7 @@
 	        </div>
 	        <div style="clear:both;padding-top: 10px"></div>
 	        <div class="follower_date">${_('forked')} -
-	        <span class="tooltip" title="${f.created_on}"> ${h.age(f.created_on)}</span></div>
+	        <span class="tooltip" title="${h.tooltip(h.fmt_date(f.created_on))}"> ${h.age(f.created_on)}</span></div>
 	        <div style="border-bottom: 1px solid #DDD;margin:10px 0px 10px 0px"></div>
 	    </div>
 	% endfor
--- a/rhodecode/templates/index_base.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/index_base.html	Sat Jun 09 15:30:22 2012 +0200
@@ -89,7 +89,7 @@
                     </td>
                     ##LAST CHANGE DATE
                     <td>
-                      <span class="tooltip" title="${repo['last_change']}">${h.age(repo['last_change'])}</span>
+                      <span class="tooltip" title="${h.tooltip(h.fmt_date(repo['last_change']))}">${h.age(repo['last_change'])}</span>
                     </td>
                     ##LAST REVISION
                     <td>
--- a/rhodecode/templates/journal/journal.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/journal/journal.html	Sat Jun 09 15:30:22 2012 +0200
@@ -9,6 +9,10 @@
 <%def name="page_nav()">
 	${self.menu('home')}
 </%def>
+<%def name="head_extra()">
+<link href="${h.url('journal_atom', api_key=c.rhodecode_user.api_key)}" rel="alternate" title="${_('ATOM journal feed')}" type="application/atom+xml" />
+<link href="${h.url('journal_rss', api_key=c.rhodecode_user.api_key)}" rel="alternate" title="${_('RSS journal feed')}" type="application/rss+xml" />
+</%def>
 <%def name="main()">
 
     <div class="box box-left">
@@ -17,8 +21,13 @@
 	        <h5>${_('Journal')}</h5>
              <ul class="links">
                <li>
-                 <span><a id="refresh" href="${h.url('journal')}"><img class="icon" title="${_('Refresh')}" alt="${_('Refresh')}" src="${h.url('/images/icons/arrow_refresh.png')}"/>
-                 </a></span>
+                 <span><a id="refresh" href="${h.url('journal')}"><img class="icon" title="${_('Refresh')}" alt="${_('Refresh')}" src="${h.url('/images/icons/arrow_refresh.png')}"/></a></span>
+               </li>
+               <li>
+                 <span><a href="${h.url('journal_rss', api_key=c.rhodecode_user.api_key)}"><img class="icon" title="${_('RSS feed')}" alt="${_('RSS feed')}" src="${h.url('/images/icons/rss_16.png')}"/></a></span>
+               </li>
+               <li>
+                 <span><a href="${h.url('journal_atom', api_key=c.rhodecode_user.api_key)}"><img class="icon" title="${_('ATOM feed')}" alt="${_('ATOM feed')}" src="${h.url('/images/icons/atom.png')}"/></a></span>
                </li>
              </ul>
 	    </div>
--- a/rhodecode/templates/journal/journal_data.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/journal/journal_data.html	Sat Jun 09 15:30:22 2012 +0200
@@ -24,7 +24,7 @@
 		                </span>
 		            </div>
 		            <div class="journal_action_params">${h.literal(h.action_parser(entry)[1]())}</div>
-		            <div class="date"><span class="tooltip" title="${entry.action_date}">${h.age(entry.action_date)}</span></div>
+		            <div class="date"><span class="tooltip" title="${h.tooltip(h.fmt_date(entry.action_date))}">${h.age(entry.action_date)}</span></div>
 	            %endfor
 	            </div>
 	        </div>
--- a/rhodecode/templates/journal/public_journal.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/journal/public_journal.html	Sat Jun 09 15:30:22 2012 +0200
@@ -9,33 +9,35 @@
 <%def name="page_nav()">
 	${self.menu('home')}
 </%def>
+<%def name="head_extra()">
+<link href="${h.url('public_journal_atom')}" rel="alternate" title="${_('ATOM public journal feed')}" type="application/atom+xml" />
+<link href="${h.url('public_journal_rss')}" rel="alternate" title="${_('RSS public journal feed')}" type="application/rss+xml" />
+</%def>
 <%def name="main()">
 
-    <div class="box">
-	    <!-- box / title -->
-	    <div class="title">
-	        <h5>${_('Public Journal')}</h5>
-                <ul class="links">
-                  <li>
-                    <span>${h.link_to(_('RSS'),h.url('public_journal_rss'),class_='rss_icon')}</span>
-                  </li>
-                  <li>
-                    <span>${h.link_to(_('Atom'),h.url('public_journal_atom'),class_='atom_icon')}</span>
-                  </li>
-
-                </ul>
-
-	    </div>
-		<script type="text/javascript">
-		function show_more_event(){
-		YUE.on(YUD.getElementsByClassName('show_more'),'click',function(e){
-		    var el = e.target;
-		    YUD.setStyle(YUD.get(el.id.substring(1)),'display','');
-		    YUD.setStyle(el.parentNode,'display','none');
-		});
-		}
-		</script>
-	    <div id="journal">${c.journal_data}</div>
-    </div>
+<div class="box">
+  <!-- box / title -->
+  <div class="title">
+    <h5>${_('Public Journal')}</h5>
+      <ul class="links">
+      <li>
+       <span><a href="${h.url('public_journal_rss')}"><img class="icon" title="${_('RSS feed')}" alt="${_('RSS feed')}" src="${h.url('/images/icons/atom.png')}"/></a></span>
+     </li>
+     <li>
+       <span><a href="${h.url('public_journal_atom')}"><img class="icon" title="${_('ATOM feed')}" alt="${_('ATOM feed')}" src="${h.url('/images/icons/rss_16.png')}"/></a></span>
+     </li>
+     </ul>
+  </div>
+  <script type="text/javascript">
+  function show_more_event(){
+  YUE.on(YUD.getElementsByClassName('show_more'),'click',function(e){
+      var el = e.target;
+      YUD.setStyle(YUD.get(el.id.substring(1)),'display','');
+      YUD.setStyle(el.parentNode,'display','none');
+  });
+  }
+  </script>
+  <div id="journal">${c.journal_data}</div>
+</div>
 
 </%def>
--- a/rhodecode/templates/repo_switcher_list.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/repo_switcher_list.html	Sat Jun 09 15:30:22 2012 +0200
@@ -1,7 +1,7 @@
 ## -*- coding: utf-8 -*-
 
 <li class="qfilter_rs">
-    <input type="text" style="border:0" value="quick filter..." name="filter" size="25" id="q_filter_rs" />
+    <input type="text" style="border:0" value="${_('quick filter...')}" name="filter" size="20" id="q_filter_rs" />
 </li>
 
 %for repo in c.repos_list:
--- a/rhodecode/templates/settings/repo_settings.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/settings/repo_settings.html	Sat Jun 09 15:30:22 2012 +0200
@@ -2,7 +2,7 @@
 <%inherit file="/base/base.html"/>
 
 <%def name="title()">
-    ${c.repo_name} ${_('Settings')} - ${c.rhodecode_name}
+    ${_('%s Settings') % c.repo_name} - ${c.rhodecode_name}
 </%def>
 
 <%def name="breadcrumbs_links()">
--- a/rhodecode/templates/shortlog/shortlog.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/shortlog/shortlog.html	Sat Jun 09 15:30:22 2012 +0200
@@ -2,7 +2,7 @@
 <%inherit file="/base/base.html"/>
 
 <%def name="title()">
-    ${c.repo_name} ${_('Shortlog')} - ${c.rhodecode_name}
+    ${_('%s Shortlog') % c.repo_name} - ${c.rhodecode_name}
 </%def>
 
 
--- a/rhodecode/templates/shortlog/shortlog_data.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/shortlog/shortlog_data.html	Sat Jun 09 15:30:22 2012 +0200
@@ -19,7 +19,7 @@
             h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id),
             title=cs.message)}
         </td>
-        <td><span class="tooltip" title="${cs.date}">
+        <td><span class="tooltip" title="${h.tooltip(h.fmt_date(cs.date))}">
                       ${h.age(cs.date)}</span>
         </td>
 		<td title="${cs.author}">${h.person(cs.author)}</td>
--- a/rhodecode/templates/summary/summary.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/summary/summary.html	Sat Jun 09 15:30:22 2012 +0200
@@ -1,7 +1,7 @@
 <%inherit file="/base/base.html"/>
 
 <%def name="title()">
-    ${c.repo_name} ${_('Summary')} - ${c.rhodecode_name}
+    ${_('%s Summary') % c.repo_name} - ${c.rhodecode_name}
 </%def>
 
 <%def name="breadcrumbs_links()">
@@ -16,6 +16,11 @@
 	${self.menu('summary')}
 </%def>
 
+<%def name="head_extra()">
+<link href="${h.url('atom_feed_home',repo_name=c.dbrepo.repo_name,api_key=c.rhodecode_user.api_key)}" rel="alternate" title="${_('repo %s ATOM feed') % c.repo_name}" type="application/atom+xml" />
+<link href="${h.url('rss_feed_home',repo_name=c.dbrepo.repo_name,api_key=c.rhodecode_user.api_key)}" rel="alternate" title="${_('repo %s RSS feed') % c.repo_name}" type="application/rss+xml" />
+</%def>
+
 <%def name="main()">
     <%
     summary = lambda n:{False:'summary-short'}.get(n)
@@ -158,10 +163,10 @@
                     %endif
 		        %else:
 			        ${h.select('download_options',c.rhodecode_repo.get_changeset().raw_id,c.download_options)}
-			             <span id="${'zip_link'}">${h.link_to('Download as zip',h.url('files_archive_home',repo_name=c.dbrepo.repo_name,fname='tip.zip'),class_="archive_icon ui-btn")}</span>
+			             <span id="${'zip_link'}">${h.link_to(_('Download as zip'), h.url('files_archive_home',repo_name=c.dbrepo.repo_name,fname='tip.zip'),class_="archive_icon ui-btn")}</span>
                     <span style="vertical-align: bottom">
                         <input id="archive_subrepos" type="checkbox" name="subrepos" />
-                        <label for="archive_subrepos" class="tooltip" title="${_('Check this to download archive with subrepos')}" >${_('with subrepos')}</label>
+                        <label for="archive_subrepos" class="tooltip" title="${h.tooltip(_('Check this to download archive with subrepos'))}" >${_('with subrepos')}</label>
                     </span>
 			    %endif
 			  </div>
--- a/rhodecode/templates/tags/tags.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/tags/tags.html	Sat Jun 09 15:30:22 2012 +0200
@@ -2,7 +2,7 @@
 <%inherit file="/base/base.html"/>
 
 <%def name="title()">
-    ${c.repo_name} ${_('Tags')} - ${c.rhodecode_name}
+    ${_('%s Tags') % c.repo_name} - ${c.rhodecode_name}
 </%def>
 
 
--- a/rhodecode/templates/tags/tags_data.html	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/templates/tags/tags_data.html	Sat Jun 09 15:30:22 2012 +0200
@@ -18,7 +18,7 @@
                     </span>
                 </span>
             </td>
-            <td><span class="tooltip" title="${h.age(tag[1].date)}">${tag[1].date}</span></td>
+            <td><span class="tooltip" title="${h.tooltip(h.age(tag[1].date))}">${h.fmt_date(tag[1].date)}</span></td>
 	        <td title="${tag[1].author}">${h.person(tag[1].author)}</td>
 	        <td>
                 <div>
--- a/rhodecode/tests/functional/test_home.py	Wed Jun 06 01:23:02 2012 +0200
+++ b/rhodecode/tests/functional/test_home.py	Sat Jun 09 15:30:22 2012 +0200
@@ -18,5 +18,7 @@
                         """open.png"/>""")
 
         response.mustcontain(
-"""<a title="Marcin Kuzminski &lt;marcin@python-works.com&gt;:\n
-merge" class="tooltip" href="/vcs_test_hg/changeset/27cd5cce30c96924232dffcd24178a07ffeb5dfc">r173:27cd5cce30c9</a>""")
+"""<a title="Marcin Kuzminski &amp;lt;marcin@python-works.com&amp;gt;:\n
+merge" class="tooltip" href="/vcs_test_hg/changeset/27cd5cce30c96924232"""
+"""dffcd24178a07ffeb5dfc">r173:27cd5cce30c9</a>"""
+)