Kallithea issues archive

Issue #128: Please provide "download at revision" feature in mercurial repository

Reported by: Alexander Nikitin
State: new
Created on: 2015-04-30 16:33
Updated on: 2015-05-01 04:51

Description

Hello Kallithea/RhodeCode/Python gurus!

I'm in the process of transferring my RhodeCode 1.7.1 installation to Kallithea 0.2.1 and have a small enhancement request.

In RhodeCode 1.7.1 I "patched" _get_download_links method (in summary.py) to be able to download mercurial repo (in zip format) at specified revision:

def _get_download_links(self, repo):
    download_l = []
    branches_group = ([], _("Branches"))
    tags_group = ([], _("Tags"))
    ////////////////////////////////////////////////////// patch start /////////////////////////////////////////
revisions_group = ([], _("Revisions"))
    new_collection = reversed(list(c.rhodecode_repo))
    for cs in new_collection:
        revisions_group[0].append(( cs.raw_id, h.show_id(cs) ),)
    download_l.append(revisions_group)
    ////////////////////////////////////////////////////////// patch end  /////////////////////////////////////////
    for name, chs in c.rhodecode_repo.branches.items():
        #chs = chs.split(':')[-1]
        branches_group[0].append((chs, name),)
    download_l.append(branches_group)
    for name, chs in c.rhodecode_repo.tags.items():
        #chs = chs.split(':')[-1]
        tags_group[0].append((chs, name),)
    download_l.append(tags_group)
    return download_l

I've tried to do the same trick in Kallithea 0.2.1 but it looks like that Branches/Tags/etc "download code" has moved somewhere in home.py (repo_refs_data method) which I failed to patch due to my zero skills in python. So is there are any chance to make it work in Kallithea 0.2.1 ?

PS Sorry for my weird code above - I'm C++/Java coder - not Python :)

Thanks in advance !

Attachments

Comments

Comment by Mads Kiilerich, on 2015-04-30 17:36

something like

--- a/kallithea/controllers/home.py
+++ b/kallithea/controllers/home.py
@@ -142,6 +142,10 @@ class HomeController(BaseController):
                 'text': _('Bookmark'),
                 'children': [{'id': rev, 'text': name, 'type': 'book'} for name, rev in _bookmarks]
             })
+        res.append({
+            'text': _('Revisions'),
+            'children': [{'id': cs.short_id, 'text': cs.short_id, 'type': 'revision'} for cs in repo]
+        })
         data = {
             'more': False,
             'results': res

might work for you.

It does however not scale to large repos.

A proper fix for this doesn't require a python programmer. It requires a front end programmer who knows how to implement this with or without select2.

Comment by Alexander Nikitin, on 2015-04-30 19:13

Thanks kiilerix ! I've applied your diff into home.py source code in my test environment and your patch works - now I can see my "hg revsions" in download list. I will try to make some enhancements in your code (displaying revisions in form of "mercurial_revision_number":"cs.short_id" and sorting data in "revisions list" )

Comment by Alexander Nikitin, on 2015-05-01 04:51

Here is the final code that allows 'download at revision'. I've tested it on 350+ commits mercurial repo and it didn't hang :)

diff --git a/kallithea/controllers/home.py b/kallithea/controllers/home.py
--- a/kallithea/controllers/home.py
+++ b/kallithea/controllers/home.py
@@ -142,6 +142,10 @@
                 'text': _('Bookmark'),
                 'children': [{'id': rev, 'text': name, 'type': 'book'} for name, rev in _bookmarks]
             })
+        res.append({
+            'text': _('Revisions'),
+            'children': [{'id': cs.raw_id, 'text': 'r' + str(index) + ':' + cs.short_id, 'type': 'revision'} for index, cs in reversed (list(enumerate(repo)))]
+        })
         data = {
             'more': False,
             'results': res

PS Sorry for my weird code above - I'm C++/Java coder - not Python :)