changeset 5946:ffe4d5060d91 stable

api: avoid duplicating group name when updating repo (Issue #37) The api incorrectly passed repo.repo_name as repo_name, and the model update function incorrectly always required repo_name.
author Mads Kiilerich <madski@unity3d.com>
date Mon, 30 May 2016 15:32:22 +0200
parents 34ef164e0635
children 6754597990cb
files kallithea/controllers/api/api.py kallithea/model/repo.py kallithea/tests/api/api_base.py
diffstat 3 files changed, 48 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/kallithea/controllers/api/api.py	Mon May 30 15:32:22 2016 +0200
+++ b/kallithea/controllers/api/api.py	Mon May 30 15:32:22 2016 +0200
@@ -1567,10 +1567,7 @@
                     'Only Kallithea admin can specify `owner` param'
                 )
 
-        updates = {
-            # update function requires this.
-            'repo_name': repo.repo_name
-        }
+        updates = {}
         repo_group = group
         if not isinstance(repo_group, Optional):
             repo_group = get_repo_group_or_error(repo_group)
--- a/kallithea/model/repo.py	Mon May 30 15:32:22 2016 +0200
+++ b/kallithea/model/repo.py	Mon May 30 15:32:22 2016 +0200
@@ -322,6 +322,7 @@
 
             if 'repo_group' in kwargs:
                 cur_repo.group = RepoGroup.get(kwargs['repo_group'])
+                cur_repo.repo_name = cur_repo.get_new_name(cur_repo.just_name)
             log.debug('Updating repo %s with params:%s', cur_repo, kwargs)
             for k in ['repo_enable_downloads',
                       'repo_description',
@@ -336,10 +337,10 @@
             if clone_uri is not None and clone_uri != cur_repo.clone_uri_hidden:
                 cur_repo.clone_uri = clone_uri
 
-            new_name = cur_repo.get_new_name(kwargs['repo_name'])
-            cur_repo.repo_name = new_name
+            if 'repo_name' in kwargs:
+                cur_repo.repo_name = cur_repo.get_new_name(kwargs['repo_name'])
+
             #if private flag is set, reset default permission to NONE
-
             if kwargs.get('repo_private'):
                 EMPTY_PERM = 'repository.none'
                 RepoModel().grant_user_permission(
@@ -355,9 +356,9 @@
                     self.sa.add(ex_field)
             self.sa.add(cur_repo)
 
-            if org_repo_name != new_name:
+            if org_repo_name != cur_repo.repo_name:
                 # rename repository
-                self._rename_filesystem_repo(old=org_repo_name, new=new_name)
+                self._rename_filesystem_repo(old=org_repo_name, new=cur_repo.repo_name)
 
             return cur_repo
         except Exception:
--- a/kallithea/tests/api/api_base.py	Mon May 30 15:32:22 2016 +0200
+++ b/kallithea/tests/api/api_base.py	Mon May 30 15:32:22 2016 +0200
@@ -1171,6 +1171,47 @@
             if changing_attr == 'repo_group':
                 fixture.destroy_repo_group(updates['group'])
 
+    @parameterized.expand([
+        ('owner', {'owner': TEST_USER_REGULAR_LOGIN}),
+        ('description', {'description': u'new description'}),
+        ('active', {'active': True}),
+        ('active', {'active': False}),
+        ('clone_uri', {'clone_uri': 'http://example.com/repo'}),
+        ('clone_uri', {'clone_uri': None}),
+        ('landing_rev', {'landing_rev': 'branch:master'}),
+        ('enable_statistics', {'enable_statistics': True}),
+        ('enable_locking', {'enable_locking': True}),
+        ('enable_downloads', {'enable_downloads': True}),
+        ('name', {'name': u'new_repo_name'}),
+        ('repo_group', {'group': u'test_group_for_update'}),
+    ])
+    def test_api_update_group_repo(self, changing_attr, updates):
+        group_name = u'lololo'
+        fixture.create_repo_group(group_name)
+        repo_name = u'%s/api_update_me' % group_name
+        repo = fixture.create_repo(repo_name, repo_group=group_name, repo_type=self.REPO_TYPE)
+        if changing_attr == 'repo_group':
+            fixture.create_repo_group(updates['group'])
+
+        id_, params = _build_data(self.apikey, 'update_repo',
+                                  repoid=repo_name, **updates)
+        response = api_call(self, params)
+        if changing_attr == 'name':
+            repo_name = u'%s/%s' % (group_name, updates['name'])
+        if changing_attr == 'repo_group':
+            repo_name = u'/'.join([updates['group'], repo_name.rsplit('/', 1)[-1]])
+        try:
+            expected = {
+                'msg': 'updated repo ID:%s %s' % (repo.repo_id, repo_name),
+                'repository': repo.get_api_data()
+            }
+            self._compare_ok(id_, expected, given=response.body)
+        finally:
+            fixture.destroy_repo(repo_name)
+            if changing_attr == 'repo_group':
+                fixture.destroy_repo_group(updates['group'])
+        fixture.destroy_repo_group(group_name)
+
     def test_api_update_repo_repo_group_does_not_exist(self):
         repo_name = 'admin_owned'
         fixture.create_repo(repo_name)