diff --git a/docs/changelog.rst b/docs/changelog.rst --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -16,6 +16,8 @@ news - 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 @@ news - 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 @@ fixes 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**) ---------------------- diff --git a/rhodecode/config/post_receive_tmpl.py b/rhodecode/config/post_receive_tmpl.py new file mode 100644 --- /dev/null +++ b/rhodecode/config/post_receive_tmpl.py @@ -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() diff --git a/rhodecode/config/rcextensions/__init__.py b/rhodecode/config/rcextensions/__init__.py --- a/rhodecode/config/rcextensions/__init__.py +++ b/rhodecode/config/rcextensions/__init__.py @@ -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 @@ def _crhook(*args, **kwargs): :param group_id: :param created_by: """ + return 0 CREATE_REPO_HOOK = _crhook diff --git a/rhodecode/config/rcextensions/make_rcextensions.py b/rhodecode/config/rcextensions/make_rcextensions.py --- a/rhodecode/config/rcextensions/make_rcextensions.py +++ b/rhodecode/config/rcextensions/make_rcextensions.py @@ -54,7 +54,7 @@ class MakeRcExt(BasePasterCommand): 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 @@ class MakeRcExt(BasePasterCommand): 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 diff --git a/rhodecode/config/routing.py b/rhodecode/config/routing.py --- a/rhodecode/config/routing.py +++ b/rhodecode/config/routing.py @@ -341,7 +341,12 @@ def make_map(config): 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") diff --git a/rhodecode/controllers/admin/settings.py b/rhodecode/controllers/admin/settings.py --- a/rhodecode/controllers/admin/settings.py +++ b/rhodecode/controllers/admin/settings.py @@ -174,7 +174,8 @@ class SettingsController(BaseController) 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 @@ class SettingsController(BaseController) #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) diff --git a/rhodecode/controllers/feed.py b/rhodecode/controllers/feed.py --- a/rhodecode/controllers/feed.py +++ b/rhodecode/controllers/feed.py @@ -73,7 +73,7 @@ class FeedController(BaseRepoController) def __get_desc(self, cs): desc_msg = [] desc_msg.append('%s %s %s:
' % (cs.author, _('commited on'), - cs.date)) + h.fmt_date(cs.date))) desc_msg.append('
')
         desc_msg.append(cs.message)
         desc_msg.append('\n')
diff --git a/rhodecode/controllers/files.py b/rhodecode/controllers/files.py
--- a/rhodecode/controllers/files.py
+++ b/rhodecode/controllers/files.py
@@ -487,4 +487,4 @@ class FilesController(BaseRepoController
             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}
diff --git a/rhodecode/controllers/journal.py b/rhodecode/controllers/journal.py
--- a/rhodecode/controllers/journal.py
+++ b/rhodecode/controllers/journal.py
@@ -49,8 +49,6 @@ class JournalController(BaseController):
 
     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 @@ class JournalController(BaseController):
             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 @@ class JournalController(BaseController):
             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 @@ class JournalController(BaseController):
             .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 @@ class JournalController(BaseController):
             .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)
diff --git a/rhodecode/i18n/fr/LC_MESSAGES/rhodecode.mo b/rhodecode/i18n/fr/LC_MESSAGES/rhodecode.mo
index fb39cf1ad12c73232c2f2c8d16b9cec1ae7a36af..c4d8e0f2fecf2ad5dd3d79d5b44c9ad7137233ef
GIT binary patch
literal 45107
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

diff --git a/rhodecode/i18n/fr/LC_MESSAGES/rhodecode.po b/rhodecode/i18n/fr/LC_MESSAGES/rhodecode.po
--- a/rhodecode/i18n/fr/LC_MESSAGES/rhodecode.po
+++ b/rhodecode/i18n/fr/LC_MESSAGES/rhodecode.po
@@ -7,8 +7,8 @@ msgid ""
 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 \n"
 "Language-Team: fr \n"
 "Plural-Forms: nplurals=2; plural=(n > 1)\n"
@@ -17,7 +17,7 @@ msgstr ""
 "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 @@ msgstr ""
 "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 @@ msgid "Unknown archive type"
 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 @@ msgstr ""
 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 @@ msgstr "Réinitialisation du mot de passe"
 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 @@ msgstr "Veuillez entrer un mot de passe"
 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 @@ msgid "Dashboard"
 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 @@ msgstr "Membre"
 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 @@ msgstr "Groupes"
 
 #: 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 @@ msgstr "Administration générale"
 
 #: 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 @@ msgstr "Chargement…"
 #: 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 @@ msgstr "Aller"
 #: 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 @@ msgstr "Permissions"
 
 #: 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 @@ msgid "Group"
 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 @@ msgstr "Signets"
 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 @@ msgstr "Auteur"
 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 @@ msgid "affected %s files"
 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 @@ msgstr "Se connecter maintenant"
 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 @@ msgstr "Afficher les commentaires"
 #: 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 @@ msgid "You will be redirected to %s in %
 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 @@ msgstr "Aucun fichier ne correspond"
 
 #: 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 @@ msgstr "Revenir en arrière"
 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 @@ msgstr "MÀJ après le clonage"
 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 @@ msgstr "Les noms de fichiers"
 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 @@ msgstr "Pusher le nouveau dépôt"
 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 @@ msgstr "Il n’y a pas encore de téléchargements proposés."
 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 @@ msgstr "Activité de commit par jour et par auteur"
 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 @@ msgstr "fichié modifié"
 msgid "file removed"
 msgstr "fichier supprimé"
 
+#: rhodecode/templates/tags/tags.html:5
+#, python-format
+msgid "%s Tags"
+msgstr "Tags de %s"
+
diff --git a/rhodecode/i18n/rhodecode.pot b/rhodecode/i18n/rhodecode.pot
--- a/rhodecode/i18n/rhodecode.pot
+++ b/rhodecode/i18n/rhodecode.pot
@@ -8,7 +8,7 @@ msgid ""
 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 \n"
 "Language-Team: LANGUAGE \n"
@@ -17,7 +17,7 @@ msgstr ""
 "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 @@ msgid ""
 "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 @@ msgid "Unknown archive type"
 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 @@ msgstr ""
 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 @@ msgstr ""
 msgid "on line %s"
 msgstr ""
 
-#: rhodecode/model/comment.py:113
+#: rhodecode/model/comment.py:114
 msgid "[Mention]"
 msgstr ""
 
@@ -938,19 +944,19 @@ msgstr ""
 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 @@ msgid "Dashboard"
 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 @@ msgstr ""
 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 @@ msgstr ""
 
 #: 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 @@ msgstr ""
 #: 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 @@ msgstr ""
 #: 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 @@ msgid "permissions"
 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 @@ msgid "Group"
 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 @@ msgstr ""
 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 @@ msgstr ""
 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 @@ msgid "affected %s files"
 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 @@ msgstr ""
 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 @@ msgstr ""
 #: 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 @@ msgid "You will be redirected to %s in %
 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 @@ msgstr ""
 
 #: 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 @@ msgstr ""
 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 @@ msgstr ""
 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 @@ msgstr ""
 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 @@ msgstr ""
 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 @@ msgstr ""
 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 @@ msgstr ""
 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 @@ msgstr ""
 msgid "file removed"
 msgstr ""
 
+#: rhodecode/templates/tags/tags.html:5
+#, python-format
+msgid "%s Tags"
+msgstr ""
+
diff --git a/rhodecode/lib/helpers.py b/rhodecode/lib/helpers.py
--- a/rhodecode/lib/helpers.py
+++ b/rhodecode/lib/helpers.py
@@ -109,7 +109,7 @@ class _GetError(object):
 
     def __call__(self, field_name, form_errors):
         tmpl = """%s"""
-        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 @@ get_error = _GetError()
 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('<', '<').replace('>', '>')
+        return tooltip_title
 tooltip = _ToolTip()
 
 
@@ -346,6 +349,14 @@ short_id = lambda x: x[:12]
 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
diff --git a/rhodecode/lib/hooks.py b/rhodecode/lib/hooks.py
--- a/rhodecode/lib/hooks.py
+++ b/rhodecode/lib/hooks.py
@@ -30,9 +30,9 @@ from inspect import isfunction
 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 @@ def log_pull_action(ui, repo, **kwargs):
 
     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 @@ def log_push_action(ui, repo, **kwargs):
 
         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 @@ def log_create_repository(repository_dic
      'repo_name'
 
     """
-
+    from rhodecode import EXTENSIONS
     callback = getattr(EXTENSIONS, 'CREATE_REPO_HOOK', None)
     if isfunction(callback):
         kw = {}
@@ -190,3 +194,67 @@ def log_create_repository(repository_dic
         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)
diff --git a/rhodecode/lib/middleware/pygrack.py b/rhodecode/lib/middleware/pygrack.py
--- a/rhodecode/lib/middleware/pygrack.py
+++ b/rhodecode/lib/middleware/pygrack.py
@@ -41,7 +41,7 @@ class GitRepository(object):
     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 @@ class GitRepository(object):
         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 @@ class GitRepository(object):
             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 GitRepository(object):
 
 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 @@ class GitDirectory(object):
         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)
diff --git a/rhodecode/lib/middleware/simplegit.py b/rhodecode/lib/middleware/simplegit.py
--- a/rhodecode/lib/middleware/simplegit.py
+++ b/rhodecode/lib/middleware/simplegit.py
@@ -68,8 +68,9 @@ dulserver.DEFAULT_HANDLERS = {
   '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.utils2 import safe_st
 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 @@ class SimpleGit(BaseVCSController):
             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 @@ class SimpleGit(BaseVCSController):
         app = make_wsgi_app(
             repo_root=os.path.dirname(repo_path),
             repo_name=repo_name,
+            username=username,
         )
         return app
 
@@ -268,7 +270,10 @@ class SimpleGit(BaseVCSController):
         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 @@ class SimpleGit(BaseVCSController):
         _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={}):
diff --git a/rhodecode/lib/subprocessio.py b/rhodecode/lib/subprocessio.py
--- a/rhodecode/lib/subprocessio.py
+++ b/rhodecode/lib/subprocessio.py
@@ -276,7 +276,7 @@ class BufferedGenerator():
         return self.data[i]
 
 
-class SubprocessIOChunker():
+class SubprocessIOChunker(object):
     '''
     Processor class wrapping handling of subprocess IO.
 
@@ -321,7 +321,7 @@ class SubprocessIOChunker():
 
     '''
     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 @@ class SubprocessIOChunker():
             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)
diff --git a/rhodecode/model/db.py b/rhodecode/model/db.py
--- a/rhodecode/model/db.py
+++ b/rhodecode/model/db.py
@@ -242,7 +242,7 @@ class RhodeCodeUi(Base, BaseModel):
 
     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 @@ class RhodeCodeUi(Base, BaseModel):
         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 @@ class Repository(Base, BaseModel):
         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)
 
diff --git a/rhodecode/model/forms.py b/rhodecode/model/forms.py
--- a/rhodecode/model/forms.py
+++ b/rhodecode/model/forms.py
@@ -731,7 +731,7 @@ def ApplicationUiSettingsForm():
         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
diff --git a/rhodecode/model/permission.py b/rhodecode/model/permission.py
--- a/rhodecode/model/permission.py
+++ b/rhodecode/model/permission.py
@@ -31,7 +31,8 @@ from sqlalchemy.exc import DatabaseError
 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 @@ class PermissionModel(BaseModel):
                                        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':
diff --git a/rhodecode/model/repo.py b/rhodecode/model/repo.py
--- a/rhodecode/model/repo.py
+++ b/rhodecode/model/repo.py
@@ -22,10 +22,13 @@
 #
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see .
+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 @@ class RepoModel(BaseModel):
         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)
 
diff --git a/rhodecode/public/js/rhodecode.js b/rhodecode/public/js/rhodecode.js
--- a/rhodecode/public/js/rhodecode.js
+++ b/rhodecode/public/js/rhodecode.js
@@ -611,8 +611,8 @@ var renderInlineComments = function(file
 }
 
 
-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 @@ var fileBrowserListeners = function(curr
 	  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 @@ var fileBrowserListeners = function(curr
 	                    match.push('{2}'.format(t,node_url.replace('__FPATH__',n),n_hl));
 	                }
 	                if(match.length >= matches_max){
-	                    match.push('{0}'.format(truncated_lbl));
+	                    match.push('{0}'.format(_TM['search truncated']));
 	                }
-	                
 	            }                       
 	        }
 	        if(query != ""){
@@ -695,7 +694,7 @@ var fileBrowserListeners = function(curr
 	            YUD.setStyle('tbody_filtered','display','');
 	            
 	            if (match.length==0){
-	              match.push('{0}'.format(nomatch_lbl));
+	              match.push('{0}'.format(_TM['no matching files']));
 	            }                           
 	            
 	            YUD.get('tbody_filtered').innerHTML = match.join("");   
diff --git a/rhodecode/templates/admin/admin_log.html b/rhodecode/templates/admin/admin_log.html
--- a/rhodecode/templates/admin/admin_log.html
+++ b/rhodecode/templates/admin/admin_log.html
@@ -25,7 +25,7 @@
 		%endif
 		
 
-		${l.action_date}
+		${h.fmt_date(l.action_date)}
 		${l.user_ip}
 	
 	%endfor
diff --git a/rhodecode/templates/admin/repos/repo_edit_perms.html b/rhodecode/templates/admin/repos/repo_edit_perms.html
--- a/rhodecode/templates/admin/repos/repo_edit_perms.html
+++ b/rhodecode/templates/admin/repos/repo_edit_perms.html
@@ -16,7 +16,7 @@
                     ${_('private repository')}
                     
                 
-                ${r2p.user.username}
+                ${_('default')}
             
         %else:
         
@@ -25,7 +25,7 @@
             ${h.radio('u_perm_%s' % r2p.user.username,'repository.write')}
             ${h.radio('u_perm_%s' % r2p.user.username,'repository.admin')}
             
-                ${r2p.user.username}
+                ${r2p.user.username if r2p.user.username != 'default' else _('default')}
             
             
               %if r2p.user.username !='default':
diff --git a/rhodecode/templates/admin/repos/repos.html b/rhodecode/templates/admin/repos/repos.html
--- a/rhodecode/templates/admin/repos/repos.html
+++ b/rhodecode/templates/admin/repos/repos.html
@@ -56,7 +56,7 @@
               
               ##LAST CHANGE
               
-                ${h.age(repo['last_change'])}
+                ${h.age(repo['last_change'])}
               
               ##LAST REVISION
               
diff --git a/rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html b/rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html
--- a/rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html
+++ b/rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html
@@ -15,7 +15,7 @@
             ${h.radio('u_perm_%s' % r2p.user.username,'group.write')}
             ${h.radio('u_perm_%s' % r2p.user.username,'group.admin')}
             
-                ${r2p.user.username}
+                ${r2p.user.username if r2p.user.username != 'default' else _('default')}
             
             
               %if r2p.user.username !='default':
diff --git a/rhodecode/templates/admin/settings/settings.html b/rhodecode/templates/admin/settings/settings.html
--- a/rhodecode/templates/admin/settings/settings.html
+++ b/rhodecode/templates/admin/settings/settings.html
@@ -148,8 +148,8 @@
 						
 					
                     
- ${h.checkbox('hooks_pretxnchangegroup_push_logger','True')} - + ${h.checkbox('hooks_changegroup_push_logger','True')} +
${h.checkbox('hooks_preoutgoing_pull_logger','True')} diff --git a/rhodecode/templates/admin/users/users.html b/rhodecode/templates/admin/users/users.html --- a/rhodecode/templates/admin/users/users.html +++ b/rhodecode/templates/admin/users/users.html @@ -40,13 +40,13 @@ ${_('action')} %for cnt,user in enumerate(c.users_list): - %if user.name !='default': + %if user.username !='default':
gravatar
${h.link_to(user.username,h.url('edit_user', id=user.user_id))} ${user.name} ${user.lastname} - ${user.last_login} + ${h.fmt_date(user.last_login)} ${h.bool2icon(user.active)} ${h.bool2icon(user.admin)} ${h.bool2icon(bool(user.ldap_dn))} diff --git a/rhodecode/templates/admin/users_groups/users_groups.html b/rhodecode/templates/admin/users_groups/users_groups.html --- a/rhodecode/templates/admin/users_groups/users_groups.html +++ b/rhodecode/templates/admin/users_groups/users_groups.html @@ -37,7 +37,7 @@ %for cnt,u_group in enumerate(c.users_groups_list): ${h.link_to(u_group.users_group_name,h.url('edit_users_group', id=u_group.users_group_id))} - ${len(u_group.members)} + ${len(u_group.members)} ${h.bool2icon(u_group.users_group_active)} ${h.form(url('users_group', id=u_group.users_group_id),method='delete')} diff --git a/rhodecode/templates/base/root.html b/rhodecode/templates/base/root.html --- a/rhodecode/templates/base/root.html +++ b/rhodecode/templates/base/root.html @@ -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 name="js_extra()"> ${self.js()} + <%def name="head_extra()"> + ${self.head_extra()} ## IE hacks diff --git a/rhodecode/templates/bookmarks/bookmarks.html b/rhodecode/templates/bookmarks/bookmarks.html --- a/rhodecode/templates/bookmarks/bookmarks.html +++ b/rhodecode/templates/bookmarks/bookmarks.html @@ -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} diff --git a/rhodecode/templates/bookmarks/bookmarks_data.html b/rhodecode/templates/bookmarks/bookmarks_data.html --- a/rhodecode/templates/bookmarks/bookmarks_data.html +++ b/rhodecode/templates/bookmarks/bookmarks_data.html @@ -17,7 +17,7 @@ h.url('files_home',repo_name=c.repo_name,revision=book[1].raw_id))} - ${book[1].date} + ${h.fmt_date(book[1].date)} ${h.person(book[1].author)}
diff --git a/rhodecode/templates/branches/branches.html b/rhodecode/templates/branches/branches.html --- a/rhodecode/templates/branches/branches.html +++ b/rhodecode/templates/branches/branches.html @@ -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 name="breadcrumbs_links()"> diff --git a/rhodecode/templates/branches/branches_data.html b/rhodecode/templates/branches/branches_data.html --- a/rhodecode/templates/branches/branches_data.html +++ b/rhodecode/templates/branches/branches_data.html @@ -18,7 +18,7 @@ h.url('files_home',repo_name=c.repo_name,revision=branch[1].raw_id))} - ${branch[1].date} + ${h.fmt_date(branch[1].date)} ${h.person(branch[1].author)}
@@ -40,7 +40,7 @@ h.url('changeset_home',repo_name=c.repo_name,revision=branch[1].raw_id))} - ${branch[1].date} + ${h.fmt_date(branch[1].date)} ${h.person(branch[1].author)}
diff --git a/rhodecode/templates/changelog/changelog.html b/rhodecode/templates/changelog/changelog.html --- a/rhodecode/templates/changelog/changelog.html +++ b/rhodecode/templates/changelog/changelog.html @@ -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 name="breadcrumbs_links()"> @@ -55,7 +55,7 @@
${h.checkbox(cs.short_id,class_="changeset_range")} - ${cs.revision}:${h.short_id(cs.raw_id)} + ${cs.revision}:${h.short_id(cs.raw_id)}
@@ -63,15 +63,15 @@
${h.shorter(h.person(cs.author),22)}
-
${cs.date}
+
${h.fmt_date(cs.date)}
-
${h.urlify_commit(h.wrap_paragraphs(cs.message),c.repo_name,h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id))}
+
${h.urlify_commit(cs.message, c.repo_name,h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id))}
↓ ${_('show more')} ↓
-
${len(cs.affected_files)}
+
${len(cs.affected_files)}
%if len(c.comments.get(cs.raw_id,[])) > 0:
diff --git a/rhodecode/templates/changelog/changelog_details.html b/rhodecode/templates/changelog/changelog_details.html --- a/rhodecode/templates/changelog/changelog_details.html +++ b/rhodecode/templates/changelog/changelog_details.html @@ -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: -${len(c.cs.removed)} -${len(c.cs.changed)} -${len(c.cs.added)} +${len(c.cs.removed)} +${len(c.cs.changed)} +${len(c.cs.added)} % else: - ! - ! - ! + ! + ! + ! % endif diff --git a/rhodecode/templates/changeset/changeset.html b/rhodecode/templates/changeset/changeset.html --- a/rhodecode/templates/changeset/changeset.html +++ b/rhodecode/templates/changeset/changeset.html @@ -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 name="breadcrumbs_links()"> @@ -31,7 +31,7 @@ r${c.changeset.revision}:${h.short_id(c.changeset.raw_id)}
- ${c.changeset.date} + ${h.fmt_date(c.changeset.date)}
%if c.statuses: @@ -40,8 +40,8 @@ %endif
- - + + ${c.ignorews_url(request.GET)} ${c.context_url(request.GET)}
@@ -58,7 +58,7 @@ ${h.person(c.changeset.author)}
${h.email_or_none(c.changeset.author)}
-
${h.urlify_commit(h.wrap_paragraphs(c.changeset.message),c.repo_name)}
+
${h.urlify_commit(c.changeset.message, c.repo_name)}
diff --git a/rhodecode/templates/changeset/changeset_file_comment.html b/rhodecode/templates/changeset/changeset_file_comment.html --- a/rhodecode/templates/changeset/changeset_file_comment.html +++ b/rhodecode/templates/changeset/changeset_file_comment.html @@ -43,9 +43,12 @@ ${h.form(h.url('changeset_comment', repo_name=c.repo_name, revision=changeset.raw_id),class_='inline-form')}
${_('Commenting on line {1}.')} - ${(_('Comments parsed using %s syntax with %s support.') % (('RST' % h.url('rst_help')), - '@mention' % - _('Use @username inside this text to send notification to this RhodeCode user')))|n} + ${(_('Comments parsed using %s syntax with %s support.') % ( + ('RST' % h.url('rst_help')), + ('@mention' % _('Use @username inside this text to send notification to this RhodeCode user')) + ) + )|n + }
diff --git a/rhodecode/templates/changeset/changeset_range.html b/rhodecode/templates/changeset/changeset_range.html --- a/rhodecode/templates/changeset/changeset_range.html +++ b/rhodecode/templates/changeset/changeset_range.html @@ -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 name="breadcrumbs_links()"> @@ -43,7 +43,7 @@ ${cs.date} %if c.statuses: -
+
%endif
${h.urlify_commit(h.wrap_paragraphs(cs.message),c.repo_name)}
diff --git a/rhodecode/templates/changeset/diff_block.html b/rhodecode/templates/changeset/diff_block.html --- a/rhodecode/templates/changeset/diff_block.html +++ b/rhodecode/templates/changeset/diff_block.html @@ -16,9 +16,9 @@ revision=filenode.changeset.raw_id,f_path=h.safe_unicode(filenode.path)))}
- - - + + + ${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))}
diff --git a/rhodecode/templates/files/file_diff.html b/rhodecode/templates/files/file_diff.html --- a/rhodecode/templates/files/file_diff.html +++ b/rhodecode/templates/files/file_diff.html @@ -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 name="breadcrumbs_links()"> diff --git a/rhodecode/templates/files/files.html b/rhodecode/templates/files/files.html --- a/rhodecode/templates/files/files.html +++ b/rhodecode/templates/files/files.html @@ -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 name="breadcrumbs_links()"> @@ -41,8 +41,6 @@ var YPJAX_TITLE = "${c.repo_name} ${_('F 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); diff --git a/rhodecode/templates/files/files_add.html b/rhodecode/templates/files/files_add.html --- a/rhodecode/templates/files/files_add.html +++ b/rhodecode/templates/files/files_add.html @@ -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 name="js_extra()"> diff --git a/rhodecode/templates/files/files_browser.html b/rhodecode/templates/files/files_browser.html --- a/rhodecode/templates/files/files_browser.html +++ b/rhodecode/templates/files/files_browser.html @@ -88,14 +88,14 @@ %if node.is_file(): -
+
${'r%s:%s' % (node.last_changeset.revision,node.last_changeset.short_id)}
%endif %if node.is_file(): - + ${h.age(node.last_changeset.date)} %endif diff --git a/rhodecode/templates/files/files_edit.html b/rhodecode/templates/files/files_edit.html --- a/rhodecode/templates/files/files_edit.html +++ b/rhodecode/templates/files/files_edit.html @@ -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 name="js_extra()"> diff --git a/rhodecode/templates/files/files_source.html b/rhodecode/templates/files/files_source.html --- a/rhodecode/templates/files/files_source.html +++ b/rhodecode/templates/files/files_source.html @@ -16,7 +16,7 @@
-
${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))}
+
${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))}
${h.format_byte_size(c.file.size,binary=True)}
${c.file.mimetype}
diff --git a/rhodecode/templates/followers/followers.html b/rhodecode/templates/followers/followers.html --- a/rhodecode/templates/followers/followers.html +++ b/rhodecode/templates/followers/followers.html @@ -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 name="breadcrumbs_links()"> diff --git a/rhodecode/templates/followers/followers_data.html b/rhodecode/templates/followers/followers_data.html --- a/rhodecode/templates/followers/followers_data.html +++ b/rhodecode/templates/followers/followers_data.html @@ -9,8 +9,8 @@ ${f.user.username} (${f.user.name} ${f.user.lastname})
-
${_('Started following')} - - ${h.age(f.follows_from)}
+
${_('Started following -')} + ${h.age(f.follows_from)}
% endfor diff --git a/rhodecode/templates/forks/fork.html b/rhodecode/templates/forks/fork.html --- a/rhodecode/templates/forks/fork.html +++ b/rhodecode/templates/forks/fork.html @@ -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 name="breadcrumbs_links()"> diff --git a/rhodecode/templates/forks/forks.html b/rhodecode/templates/forks/forks.html --- a/rhodecode/templates/forks/forks.html +++ b/rhodecode/templates/forks/forks.html @@ -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 name="breadcrumbs_links()"> diff --git a/rhodecode/templates/forks/forks_data.html b/rhodecode/templates/forks/forks_data.html --- a/rhodecode/templates/forks/forks_data.html +++ b/rhodecode/templates/forks/forks_data.html @@ -15,7 +15,7 @@
${_('forked')} - - ${h.age(f.created_on)}
+ ${h.age(f.created_on)}
% endfor diff --git a/rhodecode/templates/index_base.html b/rhodecode/templates/index_base.html --- a/rhodecode/templates/index_base.html +++ b/rhodecode/templates/index_base.html @@ -89,7 +89,7 @@ ##LAST CHANGE DATE - ${h.age(repo['last_change'])} + ${h.age(repo['last_change'])} ##LAST REVISION diff --git a/rhodecode/templates/journal/journal.html b/rhodecode/templates/journal/journal.html --- a/rhodecode/templates/journal/journal.html +++ b/rhodecode/templates/journal/journal.html @@ -9,6 +9,10 @@ <%def name="page_nav()"> ${self.menu('home')} +<%def name="head_extra()"> + + + <%def name="main()">
@@ -17,8 +21,13 @@
${_('Journal')}
diff --git a/rhodecode/templates/journal/journal_data.html b/rhodecode/templates/journal/journal_data.html --- a/rhodecode/templates/journal/journal_data.html +++ b/rhodecode/templates/journal/journal_data.html @@ -24,7 +24,7 @@
${h.literal(h.action_parser(entry)[1]())}
-
${h.age(entry.action_date)}
+
${h.age(entry.action_date)}
%endfor
diff --git a/rhodecode/templates/journal/public_journal.html b/rhodecode/templates/journal/public_journal.html --- a/rhodecode/templates/journal/public_journal.html +++ b/rhodecode/templates/journal/public_journal.html @@ -9,33 +9,35 @@ <%def name="page_nav()"> ${self.menu('home')} +<%def name="head_extra()"> + + + <%def name="main()"> -
- -
-
${_('Public Journal')}
- - -
- -
${c.journal_data}
-
+
+ +
+
${_('Public Journal')}
+ +
+ +
${c.journal_data}
+
diff --git a/rhodecode/templates/repo_switcher_list.html b/rhodecode/templates/repo_switcher_list.html --- a/rhodecode/templates/repo_switcher_list.html +++ b/rhodecode/templates/repo_switcher_list.html @@ -1,7 +1,7 @@ ## -*- coding: utf-8 -*-
  • - +
  • %for repo in c.repos_list: diff --git a/rhodecode/templates/settings/repo_settings.html b/rhodecode/templates/settings/repo_settings.html --- a/rhodecode/templates/settings/repo_settings.html +++ b/rhodecode/templates/settings/repo_settings.html @@ -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 name="breadcrumbs_links()"> diff --git a/rhodecode/templates/shortlog/shortlog.html b/rhodecode/templates/shortlog/shortlog.html --- a/rhodecode/templates/shortlog/shortlog.html +++ b/rhodecode/templates/shortlog/shortlog.html @@ -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} diff --git a/rhodecode/templates/shortlog/shortlog_data.html b/rhodecode/templates/shortlog/shortlog_data.html --- a/rhodecode/templates/shortlog/shortlog_data.html +++ b/rhodecode/templates/shortlog/shortlog_data.html @@ -19,7 +19,7 @@ h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id), title=cs.message)} - + ${h.age(cs.date)} ${h.person(cs.author)} diff --git a/rhodecode/templates/summary/summary.html b/rhodecode/templates/summary/summary.html --- a/rhodecode/templates/summary/summary.html +++ b/rhodecode/templates/summary/summary.html @@ -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 name="breadcrumbs_links()"> @@ -16,6 +16,11 @@ ${self.menu('summary')} +<%def name="head_extra()"> + + + + <%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)} - ${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")} + ${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")} - + %endif
    diff --git a/rhodecode/templates/tags/tags.html b/rhodecode/templates/tags/tags.html --- a/rhodecode/templates/tags/tags.html +++ b/rhodecode/templates/tags/tags.html @@ -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} diff --git a/rhodecode/templates/tags/tags_data.html b/rhodecode/templates/tags/tags_data.html --- a/rhodecode/templates/tags/tags_data.html +++ b/rhodecode/templates/tags/tags_data.html @@ -18,7 +18,7 @@ - ${tag[1].date} + ${h.fmt_date(tag[1].date)} ${h.person(tag[1].author)}
    diff --git a/rhodecode/tests/functional/test_home.py b/rhodecode/tests/functional/test_home.py --- a/rhodecode/tests/functional/test_home.py +++ b/rhodecode/tests/functional/test_home.py @@ -18,5 +18,7 @@ class TestHomeController(TestController) """open.png"/>""") response.mustcontain( -"""r173:27cd5cce30c9""") +"""r173:27cd5cce30c9""" +)