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':
${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>
<%def name="js_extra()">%def>
${self.js()}
+ <%def name="head_extra()">%def>
+ ${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}
%def>
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>
<%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>
<%def name="breadcrumbs_links()">
@@ -55,7 +55,7 @@ ${c.repo_name} ${_('Changelog')} - ${c.r
${h.checkbox(cs.short_id,class_="changeset_range")}
- ${cs.revision}:${h.short_id(cs.raw_id)}
+ ${cs.revision}:${h.short_id(cs.raw_id)}
- ${cs.date}
+ ${h.fmt_date(cs.date)}
-
+
- ${len(cs.affected_files)}
+ ${len(cs.affected_files)}
+
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>
<%def name="breadcrumbs_links()">
@@ -43,7 +43,7 @@
${cs.date}
%if c.statuses:
-
+
%endif
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)))}
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>
<%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>
<%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);
%def>
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>
<%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>
<%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}
- ${_('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>
<%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>
<%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>
+<%def name="head_extra()">
+
+
+%def>
<%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>
+<%def name="head_extra()">
+
+
+%def>
<%def name="main()">
-
-
-
- ${_('Public Journal')}
-
- -
- ${h.link_to(_('RSS'),h.url('public_journal_rss'),class_='rss_icon')}
-
- -
- ${h.link_to(_('Atom'),h.url('public_journal_atom'),class_='atom_icon')}
-
-
-
-
-
-
- ${c.journal_data}
-
+
%def>
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>
<%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}
%def>
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>
<%def name="breadcrumbs_links()">
@@ -16,6 +16,11 @@
${self.menu('summary')}
%def>
+<%def name="head_extra()">
+
+
+%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)}
- ${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}
%def>
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"""
+)
${h.email_or_none(c.changeset.author)}