##// END OF EJS Templates
use fixtures for forking
marcink -
r3645:aef5f5ce beta
parent child Browse files
Show More
@@ -1,371 +1,368 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 import os
3 import os
4 import urllib
4 import urllib
5
5
6 from rhodecode.lib import vcs
6 from rhodecode.lib import vcs
7 from rhodecode.model.db import Repository, RepoGroup, UserRepoToPerm, User,\
7 from rhodecode.model.db import Repository, RepoGroup, UserRepoToPerm, User,\
8 Permission
8 Permission
9 from rhodecode.tests import *
9 from rhodecode.tests import *
10 from rhodecode.model.repos_group import ReposGroupModel
10 from rhodecode.model.repos_group import ReposGroupModel
11 from rhodecode.model.repo import RepoModel
11 from rhodecode.model.repo import RepoModel
12 from rhodecode.model.meta import Session
12 from rhodecode.model.meta import Session
13
13
14
14
15 def _get_permission_for_user(user, repo):
15 def _get_permission_for_user(user, repo):
16 perm = UserRepoToPerm.query()\
16 perm = UserRepoToPerm.query()\
17 .filter(UserRepoToPerm.repository ==
17 .filter(UserRepoToPerm.repository ==
18 Repository.get_by_repo_name(repo))\
18 Repository.get_by_repo_name(repo))\
19 .filter(UserRepoToPerm.user == User.get_by_username(user))\
19 .filter(UserRepoToPerm.user == User.get_by_username(user))\
20 .all()
20 .all()
21 return perm
21 return perm
22
22
23
23
24 class TestAdminReposController(TestController):
24 class TestAdminReposController(TestController):
25
25
26 def __make_repo(self):
27 pass
28
29 def test_index(self):
26 def test_index(self):
30 self.log_user()
27 self.log_user()
31 response = self.app.get(url('repos'))
28 response = self.app.get(url('repos'))
32 # Test response...
29 # Test response...
33
30
34 def test_index_as_xml(self):
31 def test_index_as_xml(self):
35 response = self.app.get(url('formatted_repos', format='xml'))
32 response = self.app.get(url('formatted_repos', format='xml'))
36
33
37 def test_create_hg(self):
34 def test_create_hg(self):
38 self.log_user()
35 self.log_user()
39 repo_name = NEW_HG_REPO
36 repo_name = NEW_HG_REPO
40 description = 'description for newly created repo'
37 description = 'description for newly created repo'
41 response = self.app.post(url('repos'),
38 response = self.app.post(url('repos'),
42 _get_repo_create_params(repo_private=False,
39 _get_repo_create_params(repo_private=False,
43 repo_name=repo_name,
40 repo_name=repo_name,
44 repo_description=description))
41 repo_description=description))
45 self.checkSessionFlash(response,
42 self.checkSessionFlash(response,
46 'Created repository <a href="/%s">%s</a>'
43 'Created repository <a href="/%s">%s</a>'
47 % (repo_name, repo_name))
44 % (repo_name, repo_name))
48
45
49 #test if the repo was created in the database
46 #test if the repo was created in the database
50 new_repo = self.Session().query(Repository)\
47 new_repo = self.Session().query(Repository)\
51 .filter(Repository.repo_name == repo_name).one()
48 .filter(Repository.repo_name == repo_name).one()
52
49
53 self.assertEqual(new_repo.repo_name, repo_name)
50 self.assertEqual(new_repo.repo_name, repo_name)
54 self.assertEqual(new_repo.description, description)
51 self.assertEqual(new_repo.description, description)
55
52
56 #test if repository is visible in the list ?
53 #test if repository is visible in the list ?
57 response = response.follow()
54 response = response.follow()
58
55
59 response.mustcontain(repo_name)
56 response.mustcontain(repo_name)
60
57
61 #test if repository was created on filesystem
58 #test if repository was created on filesystem
62 try:
59 try:
63 vcs.get_repo(os.path.join(TESTS_TMP_PATH, repo_name))
60 vcs.get_repo(os.path.join(TESTS_TMP_PATH, repo_name))
64 except Exception:
61 except Exception:
65 self.fail('no repo %s in filesystem' % repo_name)
62 self.fail('no repo %s in filesystem' % repo_name)
66
63
67 def test_create_hg_non_ascii(self):
64 def test_create_hg_non_ascii(self):
68 self.log_user()
65 self.log_user()
69 non_ascii = "Δ…Δ™Ε‚"
66 non_ascii = "Δ…Δ™Ε‚"
70 repo_name = "%s%s" % (NEW_HG_REPO, non_ascii)
67 repo_name = "%s%s" % (NEW_HG_REPO, non_ascii)
71 repo_name_unicode = repo_name.decode('utf8')
68 repo_name_unicode = repo_name.decode('utf8')
72 description = 'description for newly created repo' + non_ascii
69 description = 'description for newly created repo' + non_ascii
73 description_unicode = description.decode('utf8')
70 description_unicode = description.decode('utf8')
74 private = False
71 private = False
75 response = self.app.post(url('repos'),
72 response = self.app.post(url('repos'),
76 _get_repo_create_params(repo_private=False,
73 _get_repo_create_params(repo_private=False,
77 repo_name=repo_name,
74 repo_name=repo_name,
78 repo_description=description))
75 repo_description=description))
79 self.checkSessionFlash(response,
76 self.checkSessionFlash(response,
80 u'Created repository <a href="/%s">%s</a>'
77 u'Created repository <a href="/%s">%s</a>'
81 % (urllib.quote(repo_name), repo_name_unicode))
78 % (urllib.quote(repo_name), repo_name_unicode))
82 #test if the repo was created in the database
79 #test if the repo was created in the database
83 new_repo = self.Session().query(Repository)\
80 new_repo = self.Session().query(Repository)\
84 .filter(Repository.repo_name == repo_name_unicode).one()
81 .filter(Repository.repo_name == repo_name_unicode).one()
85
82
86 self.assertEqual(new_repo.repo_name, repo_name_unicode)
83 self.assertEqual(new_repo.repo_name, repo_name_unicode)
87 self.assertEqual(new_repo.description, description_unicode)
84 self.assertEqual(new_repo.description, description_unicode)
88
85
89 #test if repository is visible in the list ?
86 #test if repository is visible in the list ?
90 response = response.follow()
87 response = response.follow()
91
88
92 response.mustcontain(repo_name)
89 response.mustcontain(repo_name)
93
90
94 #test if repository was created on filesystem
91 #test if repository was created on filesystem
95 try:
92 try:
96 vcs.get_repo(os.path.join(TESTS_TMP_PATH, repo_name))
93 vcs.get_repo(os.path.join(TESTS_TMP_PATH, repo_name))
97 except Exception:
94 except Exception:
98 self.fail('no repo %s in filesystem' % repo_name)
95 self.fail('no repo %s in filesystem' % repo_name)
99
96
100 def test_create_hg_in_group(self):
97 def test_create_hg_in_group(self):
101 self.log_user()
98 self.log_user()
102
99
103 ## create GROUP
100 ## create GROUP
104 group_name = 'sometest'
101 group_name = 'sometest'
105 gr = ReposGroupModel().create(group_name=group_name,
102 gr = ReposGroupModel().create(group_name=group_name,
106 group_description='test',
103 group_description='test',
107 owner=TEST_USER_ADMIN_LOGIN)
104 owner=TEST_USER_ADMIN_LOGIN)
108 self.Session().commit()
105 self.Session().commit()
109
106
110 repo_name = 'ingroup'
107 repo_name = 'ingroup'
111 repo_name_full = RepoGroup.url_sep().join([group_name, repo_name])
108 repo_name_full = RepoGroup.url_sep().join([group_name, repo_name])
112 description = 'description for newly created repo'
109 description = 'description for newly created repo'
113 response = self.app.post(url('repos'),
110 response = self.app.post(url('repos'),
114 _get_repo_create_params(repo_private=False,
111 _get_repo_create_params(repo_private=False,
115 repo_name=repo_name,
112 repo_name=repo_name,
116 repo_description=description,
113 repo_description=description,
117 repo_group=gr.group_id,))
114 repo_group=gr.group_id,))
118
115
119 self.checkSessionFlash(response,
116 self.checkSessionFlash(response,
120 'Created repository <a href="/%s">%s</a>'
117 'Created repository <a href="/%s">%s</a>'
121 % (repo_name, repo_name))
118 % (repo_name, repo_name))
122 #test if the repo was created in the database
119 #test if the repo was created in the database
123 new_repo = self.Session().query(Repository)\
120 new_repo = self.Session().query(Repository)\
124 .filter(Repository.repo_name == repo_name_full).one()
121 .filter(Repository.repo_name == repo_name_full).one()
125
122
126 self.assertEqual(new_repo.repo_name, repo_name_full)
123 self.assertEqual(new_repo.repo_name, repo_name_full)
127 self.assertEqual(new_repo.description, description)
124 self.assertEqual(new_repo.description, description)
128
125
129 #test if repository is visible in the list ?
126 #test if repository is visible in the list ?
130 response = response.follow()
127 response = response.follow()
131
128
132 response.mustcontain(repo_name_full)
129 response.mustcontain(repo_name_full)
133
130
134 #test if repository was created on filesystem
131 #test if repository was created on filesystem
135 try:
132 try:
136 vcs.get_repo(os.path.join(TESTS_TMP_PATH, repo_name_full))
133 vcs.get_repo(os.path.join(TESTS_TMP_PATH, repo_name_full))
137 except Exception:
134 except Exception:
138 ReposGroupModel().delete(group_name)
135 ReposGroupModel().delete(group_name)
139 self.Session().commit()
136 self.Session().commit()
140 self.fail('no repo %s in filesystem' % repo_name)
137 self.fail('no repo %s in filesystem' % repo_name)
141
138
142 RepoModel().delete(repo_name_full)
139 RepoModel().delete(repo_name_full)
143 ReposGroupModel().delete(group_name)
140 ReposGroupModel().delete(group_name)
144 self.Session().commit()
141 self.Session().commit()
145
142
146 def test_create_git(self):
143 def test_create_git(self):
147 self.log_user()
144 self.log_user()
148 repo_name = NEW_GIT_REPO
145 repo_name = NEW_GIT_REPO
149 description = 'description for newly created repo'
146 description = 'description for newly created repo'
150
147
151 response = self.app.post(url('repos'),
148 response = self.app.post(url('repos'),
152 _get_repo_create_params(repo_private=False,
149 _get_repo_create_params(repo_private=False,
153 repo_type='git',
150 repo_type='git',
154 repo_name=repo_name,
151 repo_name=repo_name,
155 repo_description=description))
152 repo_description=description))
156 self.checkSessionFlash(response,
153 self.checkSessionFlash(response,
157 'Created repository <a href="/%s">%s</a>'
154 'Created repository <a href="/%s">%s</a>'
158 % (repo_name, repo_name))
155 % (repo_name, repo_name))
159
156
160 #test if the repo was created in the database
157 #test if the repo was created in the database
161 new_repo = self.Session().query(Repository)\
158 new_repo = self.Session().query(Repository)\
162 .filter(Repository.repo_name == repo_name).one()
159 .filter(Repository.repo_name == repo_name).one()
163
160
164 self.assertEqual(new_repo.repo_name, repo_name)
161 self.assertEqual(new_repo.repo_name, repo_name)
165 self.assertEqual(new_repo.description, description)
162 self.assertEqual(new_repo.description, description)
166
163
167 #test if repository is visible in the list ?
164 #test if repository is visible in the list ?
168 response = response.follow()
165 response = response.follow()
169
166
170 response.mustcontain(repo_name)
167 response.mustcontain(repo_name)
171
168
172 #test if repository was created on filesystem
169 #test if repository was created on filesystem
173 try:
170 try:
174 vcs.get_repo(os.path.join(TESTS_TMP_PATH, repo_name))
171 vcs.get_repo(os.path.join(TESTS_TMP_PATH, repo_name))
175 except Exception:
172 except Exception:
176 self.fail('no repo %s in filesystem' % repo_name)
173 self.fail('no repo %s in filesystem' % repo_name)
177
174
178 def test_create_git_non_ascii(self):
175 def test_create_git_non_ascii(self):
179 self.log_user()
176 self.log_user()
180 non_ascii = "Δ…Δ™Ε‚"
177 non_ascii = "Δ…Δ™Ε‚"
181 repo_name = "%s%s" % (NEW_GIT_REPO, non_ascii)
178 repo_name = "%s%s" % (NEW_GIT_REPO, non_ascii)
182 repo_name_unicode = repo_name.decode('utf8')
179 repo_name_unicode = repo_name.decode('utf8')
183 description = 'description for newly created repo' + non_ascii
180 description = 'description for newly created repo' + non_ascii
184 description_unicode = description.decode('utf8')
181 description_unicode = description.decode('utf8')
185 private = False
182 private = False
186 response = self.app.post(url('repos'),
183 response = self.app.post(url('repos'),
187 _get_repo_create_params(repo_private=False,
184 _get_repo_create_params(repo_private=False,
188 repo_type='git',
185 repo_type='git',
189 repo_name=repo_name,
186 repo_name=repo_name,
190 repo_description=description))
187 repo_description=description))
191
188
192 self.checkSessionFlash(response,
189 self.checkSessionFlash(response,
193 u'Created repository <a href="/%s">%s</a>'
190 u'Created repository <a href="/%s">%s</a>'
194 % (urllib.quote(repo_name), repo_name_unicode))
191 % (urllib.quote(repo_name), repo_name_unicode))
195
192
196 #test if the repo was created in the database
193 #test if the repo was created in the database
197 new_repo = self.Session().query(Repository)\
194 new_repo = self.Session().query(Repository)\
198 .filter(Repository.repo_name == repo_name_unicode).one()
195 .filter(Repository.repo_name == repo_name_unicode).one()
199
196
200 self.assertEqual(new_repo.repo_name, repo_name_unicode)
197 self.assertEqual(new_repo.repo_name, repo_name_unicode)
201 self.assertEqual(new_repo.description, description_unicode)
198 self.assertEqual(new_repo.description, description_unicode)
202
199
203 #test if repository is visible in the list ?
200 #test if repository is visible in the list ?
204 response = response.follow()
201 response = response.follow()
205
202
206 response.mustcontain(repo_name)
203 response.mustcontain(repo_name)
207
204
208 #test if repository was created on filesystem
205 #test if repository was created on filesystem
209 try:
206 try:
210 vcs.get_repo(os.path.join(TESTS_TMP_PATH, repo_name))
207 vcs.get_repo(os.path.join(TESTS_TMP_PATH, repo_name))
211 except Exception:
208 except Exception:
212 self.fail('no repo %s in filesystem' % repo_name)
209 self.fail('no repo %s in filesystem' % repo_name)
213
210
214 def test_update(self):
211 def test_update(self):
215 response = self.app.put(url('repo', repo_name=HG_REPO))
212 response = self.app.put(url('repo', repo_name=HG_REPO))
216
213
217 def test_update_browser_fakeout(self):
214 def test_update_browser_fakeout(self):
218 response = self.app.post(url('repo', repo_name=HG_REPO),
215 response = self.app.post(url('repo', repo_name=HG_REPO),
219 params=dict(_method='put'))
216 params=dict(_method='put'))
220
217
221 def test_delete_hg(self):
218 def test_delete_hg(self):
222 self.log_user()
219 self.log_user()
223 repo_name = 'vcs_test_new_to_delete'
220 repo_name = 'vcs_test_new_to_delete'
224 description = 'description for newly created repo'
221 description = 'description for newly created repo'
225 response = self.app.post(url('repos'),
222 response = self.app.post(url('repos'),
226 _get_repo_create_params(repo_private=False,
223 _get_repo_create_params(repo_private=False,
227 repo_type='hg',
224 repo_type='hg',
228 repo_name=repo_name,
225 repo_name=repo_name,
229 repo_description=description))
226 repo_description=description))
230
227
231 self.checkSessionFlash(response,
228 self.checkSessionFlash(response,
232 'Created repository <a href="/%s">%s</a>'
229 'Created repository <a href="/%s">%s</a>'
233 % (repo_name, repo_name))
230 % (repo_name, repo_name))
234 #test if the repo was created in the database
231 #test if the repo was created in the database
235 new_repo = self.Session().query(Repository)\
232 new_repo = self.Session().query(Repository)\
236 .filter(Repository.repo_name == repo_name).one()
233 .filter(Repository.repo_name == repo_name).one()
237
234
238 self.assertEqual(new_repo.repo_name, repo_name)
235 self.assertEqual(new_repo.repo_name, repo_name)
239 self.assertEqual(new_repo.description, description)
236 self.assertEqual(new_repo.description, description)
240
237
241 #test if repository is visible in the list ?
238 #test if repository is visible in the list ?
242 response = response.follow()
239 response = response.follow()
243
240
244 response.mustcontain(repo_name)
241 response.mustcontain(repo_name)
245
242
246 #test if repository was created on filesystem
243 #test if repository was created on filesystem
247 try:
244 try:
248 vcs.get_repo(os.path.join(TESTS_TMP_PATH, repo_name))
245 vcs.get_repo(os.path.join(TESTS_TMP_PATH, repo_name))
249 except Exception:
246 except Exception:
250 self.fail('no repo %s in filesystem' % repo_name)
247 self.fail('no repo %s in filesystem' % repo_name)
251
248
252 response = self.app.delete(url('repo', repo_name=repo_name))
249 response = self.app.delete(url('repo', repo_name=repo_name))
253
250
254 self.checkSessionFlash(response, 'Deleted repository %s' % (repo_name))
251 self.checkSessionFlash(response, 'Deleted repository %s' % (repo_name))
255
252
256 response.follow()
253 response.follow()
257
254
258 #check if repo was deleted from db
255 #check if repo was deleted from db
259 deleted_repo = self.Session().query(Repository)\
256 deleted_repo = self.Session().query(Repository)\
260 .filter(Repository.repo_name == repo_name).scalar()
257 .filter(Repository.repo_name == repo_name).scalar()
261
258
262 self.assertEqual(deleted_repo, None)
259 self.assertEqual(deleted_repo, None)
263
260
264 self.assertEqual(os.path.isdir(os.path.join(TESTS_TMP_PATH, repo_name)),
261 self.assertEqual(os.path.isdir(os.path.join(TESTS_TMP_PATH, repo_name)),
265 False)
262 False)
266
263
267 def test_delete_git(self):
264 def test_delete_git(self):
268 self.log_user()
265 self.log_user()
269 repo_name = 'vcs_test_new_to_delete'
266 repo_name = 'vcs_test_new_to_delete'
270 description = 'description for newly created repo'
267 description = 'description for newly created repo'
271 private = False
268 private = False
272 response = self.app.post(url('repos'),
269 response = self.app.post(url('repos'),
273 _get_repo_create_params(repo_private=False,
270 _get_repo_create_params(repo_private=False,
274 repo_type='git',
271 repo_type='git',
275 repo_name=repo_name,
272 repo_name=repo_name,
276 repo_description=description))
273 repo_description=description))
277
274
278 self.checkSessionFlash(response,
275 self.checkSessionFlash(response,
279 'Created repository <a href="/%s">%s</a>'
276 'Created repository <a href="/%s">%s</a>'
280 % (repo_name, repo_name))
277 % (repo_name, repo_name))
281 #test if the repo was created in the database
278 #test if the repo was created in the database
282 new_repo = self.Session().query(Repository)\
279 new_repo = self.Session().query(Repository)\
283 .filter(Repository.repo_name == repo_name).one()
280 .filter(Repository.repo_name == repo_name).one()
284
281
285 self.assertEqual(new_repo.repo_name, repo_name)
282 self.assertEqual(new_repo.repo_name, repo_name)
286 self.assertEqual(new_repo.description, description)
283 self.assertEqual(new_repo.description, description)
287
284
288 #test if repository is visible in the list ?
285 #test if repository is visible in the list ?
289 response = response.follow()
286 response = response.follow()
290
287
291 response.mustcontain(repo_name)
288 response.mustcontain(repo_name)
292
289
293 #test if repository was created on filesystem
290 #test if repository was created on filesystem
294 try:
291 try:
295 vcs.get_repo(os.path.join(TESTS_TMP_PATH, repo_name))
292 vcs.get_repo(os.path.join(TESTS_TMP_PATH, repo_name))
296 except Exception:
293 except Exception:
297 self.fail('no repo %s in filesystem' % repo_name)
294 self.fail('no repo %s in filesystem' % repo_name)
298
295
299 response = self.app.delete(url('repo', repo_name=repo_name))
296 response = self.app.delete(url('repo', repo_name=repo_name))
300
297
301 self.checkSessionFlash(response, 'Deleted repository %s' % (repo_name))
298 self.checkSessionFlash(response, 'Deleted repository %s' % (repo_name))
302
299
303 response.follow()
300 response.follow()
304
301
305 #check if repo was deleted from db
302 #check if repo was deleted from db
306 deleted_repo = self.Session().query(Repository)\
303 deleted_repo = self.Session().query(Repository)\
307 .filter(Repository.repo_name == repo_name).scalar()
304 .filter(Repository.repo_name == repo_name).scalar()
308
305
309 self.assertEqual(deleted_repo, None)
306 self.assertEqual(deleted_repo, None)
310
307
311 self.assertEqual(os.path.isdir(os.path.join(TESTS_TMP_PATH, repo_name)),
308 self.assertEqual(os.path.isdir(os.path.join(TESTS_TMP_PATH, repo_name)),
312 False)
309 False)
313
310
314 def test_delete_repo_with_group(self):
311 def test_delete_repo_with_group(self):
315 #TODO:
312 #TODO:
316 pass
313 pass
317
314
318 def test_delete_browser_fakeout(self):
315 def test_delete_browser_fakeout(self):
319 response = self.app.post(url('repo', repo_name=HG_REPO),
316 response = self.app.post(url('repo', repo_name=HG_REPO),
320 params=dict(_method='delete'))
317 params=dict(_method='delete'))
321
318
322 def test_show_hg(self):
319 def test_show_hg(self):
323 self.log_user()
320 self.log_user()
324 response = self.app.get(url('repo', repo_name=HG_REPO))
321 response = self.app.get(url('repo', repo_name=HG_REPO))
325
322
326 def test_show_git(self):
323 def test_show_git(self):
327 self.log_user()
324 self.log_user()
328 response = self.app.get(url('repo', repo_name=GIT_REPO))
325 response = self.app.get(url('repo', repo_name=GIT_REPO))
329
326
330
327
331 def test_edit(self):
328 def test_edit(self):
332 response = self.app.get(url('edit_repo', repo_name=HG_REPO))
329 response = self.app.get(url('edit_repo', repo_name=HG_REPO))
333
330
334 def test_set_private_flag_sets_default_to_none(self):
331 def test_set_private_flag_sets_default_to_none(self):
335 self.log_user()
332 self.log_user()
336 #initially repository perm should be read
333 #initially repository perm should be read
337 perm = _get_permission_for_user(user='default', repo=HG_REPO)
334 perm = _get_permission_for_user(user='default', repo=HG_REPO)
338 self.assertTrue(len(perm), 1)
335 self.assertTrue(len(perm), 1)
339 self.assertEqual(perm[0].permission.permission_name, 'repository.read')
336 self.assertEqual(perm[0].permission.permission_name, 'repository.read')
340 self.assertEqual(Repository.get_by_repo_name(HG_REPO).private, False)
337 self.assertEqual(Repository.get_by_repo_name(HG_REPO).private, False)
341
338
342 response = self.app.put(url('repo', repo_name=HG_REPO),
339 response = self.app.put(url('repo', repo_name=HG_REPO),
343 _get_repo_create_params(repo_private=1,
340 _get_repo_create_params(repo_private=1,
344 repo_name=HG_REPO,
341 repo_name=HG_REPO,
345 user=TEST_USER_ADMIN_LOGIN))
342 user=TEST_USER_ADMIN_LOGIN))
346 self.checkSessionFlash(response,
343 self.checkSessionFlash(response,
347 msg='Repository %s updated successfully' % (HG_REPO))
344 msg='Repository %s updated successfully' % (HG_REPO))
348 self.assertEqual(Repository.get_by_repo_name(HG_REPO).private, True)
345 self.assertEqual(Repository.get_by_repo_name(HG_REPO).private, True)
349
346
350 #now the repo default permission should be None
347 #now the repo default permission should be None
351 perm = _get_permission_for_user(user='default', repo=HG_REPO)
348 perm = _get_permission_for_user(user='default', repo=HG_REPO)
352 self.assertTrue(len(perm), 1)
349 self.assertTrue(len(perm), 1)
353 self.assertEqual(perm[0].permission.permission_name, 'repository.none')
350 self.assertEqual(perm[0].permission.permission_name, 'repository.none')
354
351
355 response = self.app.put(url('repo', repo_name=HG_REPO),
352 response = self.app.put(url('repo', repo_name=HG_REPO),
356 _get_repo_create_params(repo_private=False,
353 _get_repo_create_params(repo_private=False,
357 repo_name=HG_REPO,
354 repo_name=HG_REPO,
358 user=TEST_USER_ADMIN_LOGIN))
355 user=TEST_USER_ADMIN_LOGIN))
359 self.checkSessionFlash(response,
356 self.checkSessionFlash(response,
360 msg='Repository %s updated successfully' % (HG_REPO))
357 msg='Repository %s updated successfully' % (HG_REPO))
361 self.assertEqual(Repository.get_by_repo_name(HG_REPO).private, False)
358 self.assertEqual(Repository.get_by_repo_name(HG_REPO).private, False)
362
359
363 #we turn off private now the repo default permission should stay None
360 #we turn off private now the repo default permission should stay None
364 perm = _get_permission_for_user(user='default', repo=HG_REPO)
361 perm = _get_permission_for_user(user='default', repo=HG_REPO)
365 self.assertTrue(len(perm), 1)
362 self.assertTrue(len(perm), 1)
366 self.assertEqual(perm[0].permission.permission_name, 'repository.none')
363 self.assertEqual(perm[0].permission.permission_name, 'repository.none')
367
364
368 #update this permission back
365 #update this permission back
369 perm[0].permission = Permission.get_by_key('repository.read')
366 perm[0].permission = Permission.get_by_key('repository.read')
370 Session().add(perm[0])
367 Session().add(perm[0])
371 Session().commit()
368 Session().commit()
@@ -1,441 +1,417 b''
1 from rhodecode.tests import *
1 from rhodecode.tests import *
2 from rhodecode.model.repo import RepoModel
2 from rhodecode.model.repo import RepoModel
3 from rhodecode.model.meta import Session
3 from rhodecode.model.meta import Session
4 from rhodecode.model.db import Repository
4 from rhodecode.model.db import Repository
5 from rhodecode.model.scm import ScmModel
5 from rhodecode.model.scm import ScmModel
6 from rhodecode.lib.vcs.backends.base import EmptyChangeset
6 from rhodecode.lib.vcs.backends.base import EmptyChangeset
7
7 from rhodecode.tests.fixture import Fixture
8
9 def _fork_repo(fork_name, vcs_type, parent=None):
10 if vcs_type =='hg':
11 _REPO = HG_REPO
12 elif vcs_type == 'git':
13 _REPO = GIT_REPO
14
15 if parent:
16 _REPO = parent
17
8
18 form_data = dict(
9 fixture = Fixture()
19 repo_name=fork_name,
20 repo_name_full=fork_name,
21 repo_group=None,
22 repo_type=vcs_type,
23 description='',
24 private=False,
25 copy_permissions=False,
26 landing_rev='tip',
27 update_after_clone=False,
28 fork_parent_id=Repository.get_by_repo_name(_REPO),
29 )
30 RepoModel().create_fork(form_data, cur_user=TEST_USER_ADMIN_LOGIN)
31
32 Session().commit()
33 return Repository.get_by_repo_name(fork_name)
34
10
35
11
36 def _commit_change(repo, filename, content, message, vcs_type, parent=None, newfile=False):
12 def _commit_change(repo, filename, content, message, vcs_type, parent=None, newfile=False):
37 repo = Repository.get_by_repo_name(repo)
13 repo = Repository.get_by_repo_name(repo)
38 _cs = parent
14 _cs = parent
39 if not parent:
15 if not parent:
40 _cs = EmptyChangeset(alias=vcs_type)
16 _cs = EmptyChangeset(alias=vcs_type)
41
17
42 if newfile:
18 if newfile:
43 cs = ScmModel().create_node(
19 cs = ScmModel().create_node(
44 repo=repo.scm_instance, repo_name=repo.repo_name,
20 repo=repo.scm_instance, repo_name=repo.repo_name,
45 cs=_cs, user=TEST_USER_ADMIN_LOGIN,
21 cs=_cs, user=TEST_USER_ADMIN_LOGIN,
46 author=TEST_USER_ADMIN_LOGIN,
22 author=TEST_USER_ADMIN_LOGIN,
47 message=message,
23 message=message,
48 content=content,
24 content=content,
49 f_path=filename
25 f_path=filename
50 )
26 )
51 else:
27 else:
52 cs = ScmModel().commit_change(
28 cs = ScmModel().commit_change(
53 repo=repo.scm_instance, repo_name=repo.repo_name,
29 repo=repo.scm_instance, repo_name=repo.repo_name,
54 cs=parent, user=TEST_USER_ADMIN_LOGIN,
30 cs=parent, user=TEST_USER_ADMIN_LOGIN,
55 author=TEST_USER_ADMIN_LOGIN,
31 author=TEST_USER_ADMIN_LOGIN,
56 message=message,
32 message=message,
57 content=content,
33 content=content,
58 f_path=filename
34 f_path=filename
59 )
35 )
60 return cs
36 return cs
61
37
62
38
63 class TestCompareController(TestController):
39 class TestCompareController(TestController):
64
40
65 def setUp(self):
41 def setUp(self):
66 self.r1_id = None
42 self.r1_id = None
67 self.r2_id = None
43 self.r2_id = None
68
44
69 def tearDown(self):
45 def tearDown(self):
70 if self.r2_id:
46 if self.r2_id:
71 RepoModel().delete(self.r2_id)
47 RepoModel().delete(self.r2_id)
72 if self.r1_id:
48 if self.r1_id:
73 RepoModel().delete(self.r1_id)
49 RepoModel().delete(self.r1_id)
74 Session().commit()
50 Session().commit()
75 Session.remove()
51 Session.remove()
76
52
77 def test_compare_forks_on_branch_extra_commits_hg(self):
53 def test_compare_forks_on_branch_extra_commits_hg(self):
78 self.log_user()
54 self.log_user()
79 repo1 = RepoModel().create_repo(repo_name='one', repo_type='hg',
55 repo1 = RepoModel().create_repo(repo_name='one', repo_type='hg',
80 description='diff-test',
56 description='diff-test',
81 owner=TEST_USER_ADMIN_LOGIN)
57 owner=TEST_USER_ADMIN_LOGIN)
82 Session().commit()
58 Session().commit()
83 self.r1_id = repo1.repo_id
59 self.r1_id = repo1.repo_id
84 #commit something !
60 #commit something !
85 cs0 = _commit_change(repo1.repo_name, filename='file1', content='line1\n',
61 cs0 = _commit_change(repo1.repo_name, filename='file1', content='line1\n',
86 message='commit1', vcs_type='hg', parent=None, newfile=True)
62 message='commit1', vcs_type='hg', parent=None, newfile=True)
87
63
88 #fork this repo
64 #fork this repo
89 repo2 = _fork_repo('one-fork', 'hg', parent='one')
65 repo2 = fixture.create_fork('one', 'one-fork')
90 self.r2_id = repo2.repo_id
66 self.r2_id = repo2.repo_id
91
67
92 #add two extra commit into fork
68 #add two extra commit into fork
93 cs1 = _commit_change(repo2.repo_name, filename='file1', content='line1\nline2\n',
69 cs1 = _commit_change(repo2.repo_name, filename='file1', content='line1\nline2\n',
94 message='commit2', vcs_type='hg', parent=cs0)
70 message='commit2', vcs_type='hg', parent=cs0)
95
71
96 cs2 = _commit_change(repo2.repo_name, filename='file1', content='line1\nline2\nline3\n',
72 cs2 = _commit_change(repo2.repo_name, filename='file1', content='line1\nline2\nline3\n',
97 message='commit3', vcs_type='hg', parent=cs1)
73 message='commit3', vcs_type='hg', parent=cs1)
98
74
99 rev1 = 'default'
75 rev1 = 'default'
100 rev2 = 'default'
76 rev2 = 'default'
101
77
102 response = self.app.get(url(controller='compare', action='index',
78 response = self.app.get(url(controller='compare', action='index',
103 repo_name=repo1.repo_name,
79 repo_name=repo1.repo_name,
104 org_ref_type="branch",
80 org_ref_type="branch",
105 org_ref=rev2,
81 org_ref=rev2,
106 other_repo=repo2.repo_name,
82 other_repo=repo2.repo_name,
107 other_ref_type="branch",
83 other_ref_type="branch",
108 other_ref=rev1,
84 other_ref=rev1,
109 merge='1',
85 merge='1',
110 ))
86 ))
111
87
112 response.mustcontain('%s@%s -&gt; %s@%s' % (repo1.repo_name, rev2, repo2.repo_name, rev1))
88 response.mustcontain('%s@%s -&gt; %s@%s' % (repo1.repo_name, rev2, repo2.repo_name, rev1))
113 response.mustcontain("""Showing 2 commits""")
89 response.mustcontain("""Showing 2 commits""")
114 response.mustcontain("""1 file changed with 2 insertions and 0 deletions""")
90 response.mustcontain("""1 file changed with 2 insertions and 0 deletions""")
115
91
116 response.mustcontain("""<div class="message tooltip" title="commit2" style="white-space:normal">commit2</div>""")
92 response.mustcontain("""<div class="message tooltip" title="commit2" style="white-space:normal">commit2</div>""")
117 response.mustcontain("""<div class="message tooltip" title="commit3" style="white-space:normal">commit3</div>""")
93 response.mustcontain("""<div class="message tooltip" title="commit3" style="white-space:normal">commit3</div>""")
118
94
119 response.mustcontain("""<a href="/%s/changeset/%s">r1:%s</a>""" % (repo2.repo_name, cs1.raw_id, cs1.short_id))
95 response.mustcontain("""<a href="/%s/changeset/%s">r1:%s</a>""" % (repo2.repo_name, cs1.raw_id, cs1.short_id))
120 response.mustcontain("""<a href="/%s/changeset/%s">r2:%s</a>""" % (repo2.repo_name, cs2.raw_id, cs2.short_id))
96 response.mustcontain("""<a href="/%s/changeset/%s">r2:%s</a>""" % (repo2.repo_name, cs2.raw_id, cs2.short_id))
121 ## files
97 ## files
122 response.mustcontain("""<a href="/%s/compare/branch@%s...branch@%s?other_repo=%s&amp;merge=1#C--826e8142e6ba">file1</a>""" % (repo1.repo_name, rev2, rev1, repo2.repo_name))
98 response.mustcontain("""<a href="/%s/compare/branch@%s...branch@%s?other_repo=%s&amp;merge=1#C--826e8142e6ba">file1</a>""" % (repo1.repo_name, rev2, rev1, repo2.repo_name))
123 #swap
99 #swap
124 response.mustcontain("""<a href="/%s/compare/branch@%s...branch@%s?other_repo=%s&amp;merge=True">[swap]</a>""" % (repo2.repo_name, rev1, rev2, repo1.repo_name))
100 response.mustcontain("""<a href="/%s/compare/branch@%s...branch@%s?other_repo=%s&amp;merge=True">[swap]</a>""" % (repo2.repo_name, rev1, rev2, repo1.repo_name))
125
101
126 def test_compare_forks_on_branch_extra_commits_origin_has_incomming_hg(self):
102 def test_compare_forks_on_branch_extra_commits_origin_has_incomming_hg(self):
127 self.log_user()
103 self.log_user()
128
104
129 repo1 = RepoModel().create_repo(repo_name='one', repo_type='hg',
105 repo1 = RepoModel().create_repo(repo_name='one', repo_type='hg',
130 description='diff-test',
106 description='diff-test',
131 owner=TEST_USER_ADMIN_LOGIN)
107 owner=TEST_USER_ADMIN_LOGIN)
132 Session().commit()
108 Session().commit()
133 self.r1_id = repo1.repo_id
109 self.r1_id = repo1.repo_id
134
110
135 #commit something !
111 #commit something !
136 cs0 = _commit_change(repo1.repo_name, filename='file1', content='line1\n',
112 cs0 = _commit_change(repo1.repo_name, filename='file1', content='line1\n',
137 message='commit1', vcs_type='hg', parent=None, newfile=True)
113 message='commit1', vcs_type='hg', parent=None, newfile=True)
138
114
139 #fork this repo
115 #fork this repo
140 repo2 = _fork_repo('one-fork', 'hg', parent='one')
116 repo2 = fixture.create_fork('one', 'one-fork')
141 self.r2_id = repo2.repo_id
117 self.r2_id = repo2.repo_id
142
118
143 #now commit something to origin repo
119 #now commit something to origin repo
144 cs1_prim = _commit_change(repo1.repo_name, filename='file2', content='line1file2\n',
120 cs1_prim = _commit_change(repo1.repo_name, filename='file2', content='line1file2\n',
145 message='commit2', vcs_type='hg', parent=cs0, newfile=True)
121 message='commit2', vcs_type='hg', parent=cs0, newfile=True)
146
122
147 #add two extra commit into fork
123 #add two extra commit into fork
148 cs1 = _commit_change(repo2.repo_name, filename='file1', content='line1\nline2\n',
124 cs1 = _commit_change(repo2.repo_name, filename='file1', content='line1\nline2\n',
149 message='commit2', vcs_type='hg', parent=cs0)
125 message='commit2', vcs_type='hg', parent=cs0)
150
126
151 cs2 = _commit_change(repo2.repo_name, filename='file1', content='line1\nline2\nline3\n',
127 cs2 = _commit_change(repo2.repo_name, filename='file1', content='line1\nline2\nline3\n',
152 message='commit3', vcs_type='hg', parent=cs1)
128 message='commit3', vcs_type='hg', parent=cs1)
153
129
154 rev1 = 'default'
130 rev1 = 'default'
155 rev2 = 'default'
131 rev2 = 'default'
156
132
157 response = self.app.get(url(controller='compare', action='index',
133 response = self.app.get(url(controller='compare', action='index',
158 repo_name=repo1.repo_name,
134 repo_name=repo1.repo_name,
159 org_ref_type="branch",
135 org_ref_type="branch",
160 org_ref=rev2,
136 org_ref=rev2,
161 other_repo=repo2.repo_name,
137 other_repo=repo2.repo_name,
162 other_ref_type="branch",
138 other_ref_type="branch",
163 other_ref=rev1,
139 other_ref=rev1,
164 merge='x',
140 merge='x',
165 ))
141 ))
166 response.mustcontain('%s@%s -&gt; %s@%s' % (repo1.repo_name, rev2, repo2.repo_name, rev1))
142 response.mustcontain('%s@%s -&gt; %s@%s' % (repo1.repo_name, rev2, repo2.repo_name, rev1))
167 response.mustcontain("""Showing 2 commits""")
143 response.mustcontain("""Showing 2 commits""")
168 response.mustcontain("""1 file changed with 2 insertions and 0 deletions""")
144 response.mustcontain("""1 file changed with 2 insertions and 0 deletions""")
169
145
170 response.mustcontain("""<div class="message tooltip" title="commit2" style="white-space:normal">commit2</div>""")
146 response.mustcontain("""<div class="message tooltip" title="commit2" style="white-space:normal">commit2</div>""")
171 response.mustcontain("""<div class="message tooltip" title="commit3" style="white-space:normal">commit3</div>""")
147 response.mustcontain("""<div class="message tooltip" title="commit3" style="white-space:normal">commit3</div>""")
172
148
173 response.mustcontain("""<a href="/%s/changeset/%s">r1:%s</a>""" % (repo2.repo_name, cs1.raw_id, cs1.short_id))
149 response.mustcontain("""<a href="/%s/changeset/%s">r1:%s</a>""" % (repo2.repo_name, cs1.raw_id, cs1.short_id))
174 response.mustcontain("""<a href="/%s/changeset/%s">r2:%s</a>""" % (repo2.repo_name, cs2.raw_id, cs2.short_id))
150 response.mustcontain("""<a href="/%s/changeset/%s">r2:%s</a>""" % (repo2.repo_name, cs2.raw_id, cs2.short_id))
175 ## files
151 ## files
176 response.mustcontain("""<a href="/%s/compare/branch@%s...branch@%s?other_repo=%s&amp;merge=x#C--826e8142e6ba">file1</a>""" % (repo1.repo_name, rev2, rev1, repo2.repo_name))
152 response.mustcontain("""<a href="/%s/compare/branch@%s...branch@%s?other_repo=%s&amp;merge=x#C--826e8142e6ba">file1</a>""" % (repo1.repo_name, rev2, rev1, repo2.repo_name))
177 #swap
153 #swap
178 response.mustcontain("""<a href="/%s/compare/branch@%s...branch@%s?other_repo=%s&amp;merge=True">[swap]</a>""" % (repo2.repo_name, rev1, rev2, repo1.repo_name))
154 response.mustcontain("""<a href="/%s/compare/branch@%s...branch@%s?other_repo=%s&amp;merge=True">[swap]</a>""" % (repo2.repo_name, rev1, rev2, repo1.repo_name))
179
155
180 def test_compare_cherry_pick_changesets_from_bottom(self):
156 def test_compare_cherry_pick_changesets_from_bottom(self):
181
157
182 # repo1:
158 # repo1:
183 # cs0:
159 # cs0:
184 # cs1:
160 # cs1:
185 # repo1-fork- in which we will cherry pick bottom changesets
161 # repo1-fork- in which we will cherry pick bottom changesets
186 # cs0:
162 # cs0:
187 # cs1:
163 # cs1:
188 # cs2: x
164 # cs2: x
189 # cs3: x
165 # cs3: x
190 # cs4: x
166 # cs4: x
191 # cs5:
167 # cs5:
192 #make repo1, and cs1+cs2
168 #make repo1, and cs1+cs2
193 self.log_user()
169 self.log_user()
194
170
195 repo1 = RepoModel().create_repo(repo_name='repo1', repo_type='hg',
171 repo1 = RepoModel().create_repo(repo_name='repo1', repo_type='hg',
196 description='diff-test',
172 description='diff-test',
197 owner=TEST_USER_ADMIN_LOGIN)
173 owner=TEST_USER_ADMIN_LOGIN)
198 Session().commit()
174 Session().commit()
199 self.r1_id = repo1.repo_id
175 self.r1_id = repo1.repo_id
200
176
201 #commit something !
177 #commit something !
202 cs0 = _commit_change(repo1.repo_name, filename='file1', content='line1\n',
178 cs0 = _commit_change(repo1.repo_name, filename='file1', content='line1\n',
203 message='commit1', vcs_type='hg', parent=None,
179 message='commit1', vcs_type='hg', parent=None,
204 newfile=True)
180 newfile=True)
205 cs1 = _commit_change(repo1.repo_name, filename='file1', content='line1\nline2\n',
181 cs1 = _commit_change(repo1.repo_name, filename='file1', content='line1\nline2\n',
206 message='commit2', vcs_type='hg', parent=cs0)
182 message='commit2', vcs_type='hg', parent=cs0)
207 #fork this repo
183 #fork this repo
208 repo2 = _fork_repo('repo1-fork', 'hg', parent='repo1')
184 repo2 = fixture.create_fork('repo1', 'repo1-fork')
209 self.r2_id = repo2.repo_id
185 self.r2_id = repo2.repo_id
210 #now make cs3-6
186 #now make cs3-6
211 cs2 = _commit_change(repo1.repo_name, filename='file1', content='line1\nline2\nline3\n',
187 cs2 = _commit_change(repo1.repo_name, filename='file1', content='line1\nline2\nline3\n',
212 message='commit3', vcs_type='hg', parent=cs1)
188 message='commit3', vcs_type='hg', parent=cs1)
213 cs3 = _commit_change(repo1.repo_name, filename='file1', content='line1\nline2\nline3\nline4\n',
189 cs3 = _commit_change(repo1.repo_name, filename='file1', content='line1\nline2\nline3\nline4\n',
214 message='commit4', vcs_type='hg', parent=cs2)
190 message='commit4', vcs_type='hg', parent=cs2)
215 cs4 = _commit_change(repo1.repo_name, filename='file1', content='line1\nline2\nline3\nline4\nline5\n',
191 cs4 = _commit_change(repo1.repo_name, filename='file1', content='line1\nline2\nline3\nline4\nline5\n',
216 message='commit5', vcs_type='hg', parent=cs3)
192 message='commit5', vcs_type='hg', parent=cs3)
217 cs5 = _commit_change(repo1.repo_name, filename='file1', content='line1\nline2\nline3\nline4\nline5\nline6\n',
193 cs5 = _commit_change(repo1.repo_name, filename='file1', content='line1\nline2\nline3\nline4\nline5\nline6\n',
218 message='commit6', vcs_type='hg', parent=cs4)
194 message='commit6', vcs_type='hg', parent=cs4)
219
195
220 response = self.app.get(url(controller='compare', action='index',
196 response = self.app.get(url(controller='compare', action='index',
221 repo_name=repo2.repo_name,
197 repo_name=repo2.repo_name,
222 org_ref_type="rev",
198 org_ref_type="rev",
223 org_ref=cs1.short_id, # parent of cs2, in repo2
199 org_ref=cs1.short_id, # parent of cs2, in repo2
224 other_repo=repo1.repo_name,
200 other_repo=repo1.repo_name,
225 other_ref_type="rev",
201 other_ref_type="rev",
226 other_ref=cs4.short_id,
202 other_ref=cs4.short_id,
227 merge='True',
203 merge='True',
228 ))
204 ))
229 response.mustcontain('%s@%s -&gt; %s@%s' % (repo2.repo_name, cs1.short_id, repo1.repo_name, cs4.short_id))
205 response.mustcontain('%s@%s -&gt; %s@%s' % (repo2.repo_name, cs1.short_id, repo1.repo_name, cs4.short_id))
230 response.mustcontain("""Showing 3 commits""")
206 response.mustcontain("""Showing 3 commits""")
231 response.mustcontain("""1 file changed with 3 insertions and 0 deletions""")
207 response.mustcontain("""1 file changed with 3 insertions and 0 deletions""")
232
208
233 response.mustcontain("""<div class="message tooltip" title="commit3" style="white-space:normal">commit3</div>""")
209 response.mustcontain("""<div class="message tooltip" title="commit3" style="white-space:normal">commit3</div>""")
234 response.mustcontain("""<div class="message tooltip" title="commit4" style="white-space:normal">commit4</div>""")
210 response.mustcontain("""<div class="message tooltip" title="commit4" style="white-space:normal">commit4</div>""")
235 response.mustcontain("""<div class="message tooltip" title="commit5" style="white-space:normal">commit5</div>""")
211 response.mustcontain("""<div class="message tooltip" title="commit5" style="white-space:normal">commit5</div>""")
236
212
237 response.mustcontain("""<a href="/%s/changeset/%s">r2:%s</a>""" % (repo1.repo_name, cs2.raw_id, cs2.short_id))
213 response.mustcontain("""<a href="/%s/changeset/%s">r2:%s</a>""" % (repo1.repo_name, cs2.raw_id, cs2.short_id))
238 response.mustcontain("""<a href="/%s/changeset/%s">r3:%s</a>""" % (repo1.repo_name, cs3.raw_id, cs3.short_id))
214 response.mustcontain("""<a href="/%s/changeset/%s">r3:%s</a>""" % (repo1.repo_name, cs3.raw_id, cs3.short_id))
239 response.mustcontain("""<a href="/%s/changeset/%s">r4:%s</a>""" % (repo1.repo_name, cs4.raw_id, cs4.short_id))
215 response.mustcontain("""<a href="/%s/changeset/%s">r4:%s</a>""" % (repo1.repo_name, cs4.raw_id, cs4.short_id))
240 ## files
216 ## files
241 response.mustcontain("""#C--826e8142e6ba">file1</a>""")
217 response.mustcontain("""#C--826e8142e6ba">file1</a>""")
242
218
243 def test_compare_cherry_pick_changesets_from_top(self):
219 def test_compare_cherry_pick_changesets_from_top(self):
244 # repo1:
220 # repo1:
245 # cs0:
221 # cs0:
246 # cs1:
222 # cs1:
247 # repo1-fork- in which we will cherry pick bottom changesets
223 # repo1-fork- in which we will cherry pick bottom changesets
248 # cs0:
224 # cs0:
249 # cs1:
225 # cs1:
250 # cs2:
226 # cs2:
251 # cs3: x
227 # cs3: x
252 # cs4: x
228 # cs4: x
253 # cs5: x
229 # cs5: x
254 #
230 #
255 #make repo1, and cs1+cs2
231 #make repo1, and cs1+cs2
256 self.log_user()
232 self.log_user()
257 repo1 = RepoModel().create_repo(repo_name='repo1', repo_type='hg',
233 repo1 = RepoModel().create_repo(repo_name='repo1', repo_type='hg',
258 description='diff-test',
234 description='diff-test',
259 owner=TEST_USER_ADMIN_LOGIN)
235 owner=TEST_USER_ADMIN_LOGIN)
260 Session().commit()
236 Session().commit()
261 self.r1_id = repo1.repo_id
237 self.r1_id = repo1.repo_id
262
238
263 #commit something !
239 #commit something !
264 cs0 = _commit_change(repo1.repo_name, filename='file1', content='line1\n',
240 cs0 = _commit_change(repo1.repo_name, filename='file1', content='line1\n',
265 message='commit1', vcs_type='hg', parent=None,
241 message='commit1', vcs_type='hg', parent=None,
266 newfile=True)
242 newfile=True)
267 cs1 = _commit_change(repo1.repo_name, filename='file1', content='line1\nline2\n',
243 cs1 = _commit_change(repo1.repo_name, filename='file1', content='line1\nline2\n',
268 message='commit2', vcs_type='hg', parent=cs0)
244 message='commit2', vcs_type='hg', parent=cs0)
269 #fork this repo
245 #fork this repo
270 repo2 = _fork_repo('repo1-fork', 'hg', parent='repo1')
246 repo2 = fixture.create_fork('repo1', 'repo1-fork')
271 self.r2_id = repo2.repo_id
247 self.r2_id = repo2.repo_id
272 #now make cs3-6
248 #now make cs3-6
273 cs2 = _commit_change(repo1.repo_name, filename='file1', content='line1\nline2\nline3\n',
249 cs2 = _commit_change(repo1.repo_name, filename='file1', content='line1\nline2\nline3\n',
274 message='commit3', vcs_type='hg', parent=cs1)
250 message='commit3', vcs_type='hg', parent=cs1)
275 cs3 = _commit_change(repo1.repo_name, filename='file1', content='line1\nline2\nline3\nline4\n',
251 cs3 = _commit_change(repo1.repo_name, filename='file1', content='line1\nline2\nline3\nline4\n',
276 message='commit4', vcs_type='hg', parent=cs2)
252 message='commit4', vcs_type='hg', parent=cs2)
277 cs4 = _commit_change(repo1.repo_name, filename='file1', content='line1\nline2\nline3\nline4\nline5\n',
253 cs4 = _commit_change(repo1.repo_name, filename='file1', content='line1\nline2\nline3\nline4\nline5\n',
278 message='commit5', vcs_type='hg', parent=cs3)
254 message='commit5', vcs_type='hg', parent=cs3)
279 cs5 = _commit_change(repo1.repo_name, filename='file1', content='line1\nline2\nline3\nline4\nline5\nline6\n',
255 cs5 = _commit_change(repo1.repo_name, filename='file1', content='line1\nline2\nline3\nline4\nline5\nline6\n',
280 message='commit6', vcs_type='hg', parent=cs4)
256 message='commit6', vcs_type='hg', parent=cs4)
281 response = self.app.get(url(controller='compare', action='index',
257 response = self.app.get(url(controller='compare', action='index',
282 repo_name=repo1.repo_name,
258 repo_name=repo1.repo_name,
283 org_ref_type="rev",
259 org_ref_type="rev",
284 org_ref=cs2.short_id, # parent of cs3, not in repo2
260 org_ref=cs2.short_id, # parent of cs3, not in repo2
285 other_ref_type="rev",
261 other_ref_type="rev",
286 other_ref=cs5.short_id,
262 other_ref=cs5.short_id,
287 merge='1',
263 merge='1',
288 ))
264 ))
289
265
290 response.mustcontain('%s@%s -&gt; %s@%s' % (repo1.repo_name, cs2.short_id, repo1.repo_name, cs5.short_id))
266 response.mustcontain('%s@%s -&gt; %s@%s' % (repo1.repo_name, cs2.short_id, repo1.repo_name, cs5.short_id))
291 response.mustcontain("""Showing 3 commits""")
267 response.mustcontain("""Showing 3 commits""")
292 response.mustcontain("""1 file changed with 3 insertions and 0 deletions""")
268 response.mustcontain("""1 file changed with 3 insertions and 0 deletions""")
293
269
294 response.mustcontain("""<div class="message tooltip" title="commit4" style="white-space:normal">commit4</div>""")
270 response.mustcontain("""<div class="message tooltip" title="commit4" style="white-space:normal">commit4</div>""")
295 response.mustcontain("""<div class="message tooltip" title="commit5" style="white-space:normal">commit5</div>""")
271 response.mustcontain("""<div class="message tooltip" title="commit5" style="white-space:normal">commit5</div>""")
296 response.mustcontain("""<div class="message tooltip" title="commit6" style="white-space:normal">commit6</div>""")
272 response.mustcontain("""<div class="message tooltip" title="commit6" style="white-space:normal">commit6</div>""")
297
273
298 response.mustcontain("""<a href="/%s/changeset/%s">r3:%s</a>""" % (repo1.repo_name, cs3.raw_id, cs3.short_id))
274 response.mustcontain("""<a href="/%s/changeset/%s">r3:%s</a>""" % (repo1.repo_name, cs3.raw_id, cs3.short_id))
299 response.mustcontain("""<a href="/%s/changeset/%s">r4:%s</a>""" % (repo1.repo_name, cs4.raw_id, cs4.short_id))
275 response.mustcontain("""<a href="/%s/changeset/%s">r4:%s</a>""" % (repo1.repo_name, cs4.raw_id, cs4.short_id))
300 response.mustcontain("""<a href="/%s/changeset/%s">r5:%s</a>""" % (repo1.repo_name, cs5.raw_id, cs5.short_id))
276 response.mustcontain("""<a href="/%s/changeset/%s">r5:%s</a>""" % (repo1.repo_name, cs5.raw_id, cs5.short_id))
301 ## files
277 ## files
302 response.mustcontain("""#C--826e8142e6ba">file1</a>""")
278 response.mustcontain("""#C--826e8142e6ba">file1</a>""")
303
279
304 def test_compare_cherry_pick_changeset_mixed_branches(self):
280 def test_compare_cherry_pick_changeset_mixed_branches(self):
305 """
281 """
306
282
307 """
283 """
308 pass
284 pass
309 #TODO write this tastecase
285 #TODO write this tastecase
310
286
311 def test_compare_remote_branches_hg(self):
287 def test_compare_remote_branches_hg(self):
312 self.log_user()
288 self.log_user()
313
289
314 repo2 = _fork_repo(HG_FORK, 'hg')
290 repo2 = fixture.create_fork(HG_REPO, HG_FORK)
315 self.r2_id = repo2.repo_id
291 self.r2_id = repo2.repo_id
316 rev1 = '56349e29c2af'
292 rev1 = '56349e29c2af'
317 rev2 = '7d4bc8ec6be5'
293 rev2 = '7d4bc8ec6be5'
318
294
319 response = self.app.get(url(controller='compare', action='index',
295 response = self.app.get(url(controller='compare', action='index',
320 repo_name=HG_REPO,
296 repo_name=HG_REPO,
321 org_ref_type="rev",
297 org_ref_type="rev",
322 org_ref=rev1,
298 org_ref=rev1,
323 other_ref_type="rev",
299 other_ref_type="rev",
324 other_ref=rev2,
300 other_ref=rev2,
325 other_repo=HG_FORK,
301 other_repo=HG_FORK,
326 merge='1',
302 merge='1',
327 ))
303 ))
328 response.mustcontain('%s@%s -&gt; %s@%s' % (HG_REPO, rev1, HG_FORK, rev2))
304 response.mustcontain('%s@%s -&gt; %s@%s' % (HG_REPO, rev1, HG_FORK, rev2))
329 ## outgoing changesets between those revisions
305 ## outgoing changesets between those revisions
330
306
331 response.mustcontain("""<a href="/%s/changeset/2dda4e345facb0ccff1a191052dd1606dba6781d">r4:2dda4e345fac</a>""" % (HG_FORK))
307 response.mustcontain("""<a href="/%s/changeset/2dda4e345facb0ccff1a191052dd1606dba6781d">r4:2dda4e345fac</a>""" % (HG_FORK))
332 response.mustcontain("""<a href="/%s/changeset/6fff84722075f1607a30f436523403845f84cd9e">r5:6fff84722075</a>""" % (HG_FORK))
308 response.mustcontain("""<a href="/%s/changeset/6fff84722075f1607a30f436523403845f84cd9e">r5:6fff84722075</a>""" % (HG_FORK))
333 response.mustcontain("""<a href="/%s/changeset/7d4bc8ec6be56c0f10425afb40b6fc315a4c25e7">r6:%s</a>""" % (HG_FORK, rev2))
309 response.mustcontain("""<a href="/%s/changeset/7d4bc8ec6be56c0f10425afb40b6fc315a4c25e7">r6:%s</a>""" % (HG_FORK, rev2))
334
310
335 ## files
311 ## files
336 response.mustcontain("""<a href="/%s/compare/rev@%s...rev@%s?other_repo=%s&amp;merge=1#C--9c390eb52cd6">vcs/backends/hg.py</a>""" % (HG_REPO, rev1, rev2, HG_FORK))
312 response.mustcontain("""<a href="/%s/compare/rev@%s...rev@%s?other_repo=%s&amp;merge=1#C--9c390eb52cd6">vcs/backends/hg.py</a>""" % (HG_REPO, rev1, rev2, HG_FORK))
337 response.mustcontain("""<a href="/%s/compare/rev@%s...rev@%s?other_repo=%s&amp;merge=1#C--41b41c1f2796">vcs/backends/__init__.py</a>""" % (HG_REPO, rev1, rev2, HG_FORK))
313 response.mustcontain("""<a href="/%s/compare/rev@%s...rev@%s?other_repo=%s&amp;merge=1#C--41b41c1f2796">vcs/backends/__init__.py</a>""" % (HG_REPO, rev1, rev2, HG_FORK))
338 response.mustcontain("""<a href="/%s/compare/rev@%s...rev@%s?other_repo=%s&amp;merge=1#C--2f574d260608">vcs/backends/base.py</a>""" % (HG_REPO, rev1, rev2, HG_FORK))
314 response.mustcontain("""<a href="/%s/compare/rev@%s...rev@%s?other_repo=%s&amp;merge=1#C--2f574d260608">vcs/backends/base.py</a>""" % (HG_REPO, rev1, rev2, HG_FORK))
339
315
340 def test_org_repo_new_commits_after_forking_simple_diff(self):
316 def test_org_repo_new_commits_after_forking_simple_diff(self):
341 self.log_user()
317 self.log_user()
342
318
343 repo1 = RepoModel().create_repo(repo_name='one', repo_type='hg',
319 repo1 = RepoModel().create_repo(repo_name='one', repo_type='hg',
344 description='diff-test',
320 description='diff-test',
345 owner=TEST_USER_ADMIN_LOGIN)
321 owner=TEST_USER_ADMIN_LOGIN)
346
322
347 Session().commit()
323 Session().commit()
348 self.r1_id = repo1.repo_id
324 self.r1_id = repo1.repo_id
349 r1_name = repo1.repo_name
325 r1_name = repo1.repo_name
350
326
351 #commit something initially !
327 #commit something initially !
352 cs0 = ScmModel().create_node(
328 cs0 = ScmModel().create_node(
353 repo=repo1.scm_instance, repo_name=r1_name,
329 repo=repo1.scm_instance, repo_name=r1_name,
354 cs=EmptyChangeset(alias='hg'), user=TEST_USER_ADMIN_LOGIN,
330 cs=EmptyChangeset(alias='hg'), user=TEST_USER_ADMIN_LOGIN,
355 author=TEST_USER_ADMIN_LOGIN,
331 author=TEST_USER_ADMIN_LOGIN,
356 message='commit1',
332 message='commit1',
357 content='line1',
333 content='line1',
358 f_path='file1'
334 f_path='file1'
359 )
335 )
360 Session().commit()
336 Session().commit()
361 self.assertEqual(repo1.scm_instance.revisions, [cs0.raw_id])
337 self.assertEqual(repo1.scm_instance.revisions, [cs0.raw_id])
362 #fork the repo1
338 #fork the repo1
363 repo2 = RepoModel().create_repo(repo_name='one-fork', repo_type='hg',
339 repo2 = RepoModel().create_repo(repo_name='one-fork', repo_type='hg',
364 description='compare-test',
340 description='compare-test',
365 clone_uri=repo1.repo_full_path,
341 clone_uri=repo1.repo_full_path,
366 owner=TEST_USER_ADMIN_LOGIN, fork_of='one')
342 owner=TEST_USER_ADMIN_LOGIN, fork_of='one')
367 Session().commit()
343 Session().commit()
368 self.assertEqual(repo2.scm_instance.revisions, [cs0.raw_id])
344 self.assertEqual(repo2.scm_instance.revisions, [cs0.raw_id])
369 self.r2_id = repo2.repo_id
345 self.r2_id = repo2.repo_id
370 r2_name = repo2.repo_name
346 r2_name = repo2.repo_name
371
347
372 #make 3 new commits in fork
348 #make 3 new commits in fork
373 cs1 = ScmModel().create_node(
349 cs1 = ScmModel().create_node(
374 repo=repo2.scm_instance, repo_name=r2_name,
350 repo=repo2.scm_instance, repo_name=r2_name,
375 cs=repo2.scm_instance[-1], user=TEST_USER_ADMIN_LOGIN,
351 cs=repo2.scm_instance[-1], user=TEST_USER_ADMIN_LOGIN,
376 author=TEST_USER_ADMIN_LOGIN,
352 author=TEST_USER_ADMIN_LOGIN,
377 message='commit1-fork',
353 message='commit1-fork',
378 content='file1-line1-from-fork',
354 content='file1-line1-from-fork',
379 f_path='file1-fork'
355 f_path='file1-fork'
380 )
356 )
381 cs2 = ScmModel().create_node(
357 cs2 = ScmModel().create_node(
382 repo=repo2.scm_instance, repo_name=r2_name,
358 repo=repo2.scm_instance, repo_name=r2_name,
383 cs=cs1, user=TEST_USER_ADMIN_LOGIN,
359 cs=cs1, user=TEST_USER_ADMIN_LOGIN,
384 author=TEST_USER_ADMIN_LOGIN,
360 author=TEST_USER_ADMIN_LOGIN,
385 message='commit2-fork',
361 message='commit2-fork',
386 content='file2-line1-from-fork',
362 content='file2-line1-from-fork',
387 f_path='file2-fork'
363 f_path='file2-fork'
388 )
364 )
389 cs3 = ScmModel().create_node(
365 cs3 = ScmModel().create_node(
390 repo=repo2.scm_instance, repo_name=r2_name,
366 repo=repo2.scm_instance, repo_name=r2_name,
391 cs=cs2, user=TEST_USER_ADMIN_LOGIN,
367 cs=cs2, user=TEST_USER_ADMIN_LOGIN,
392 author=TEST_USER_ADMIN_LOGIN,
368 author=TEST_USER_ADMIN_LOGIN,
393 message='commit3-fork',
369 message='commit3-fork',
394 content='file3-line1-from-fork',
370 content='file3-line1-from-fork',
395 f_path='file3-fork'
371 f_path='file3-fork'
396 )
372 )
397
373
398 #compare !
374 #compare !
399 rev1 = 'default'
375 rev1 = 'default'
400 rev2 = 'default'
376 rev2 = 'default'
401
377
402 response = self.app.get(url(controller='compare', action='index',
378 response = self.app.get(url(controller='compare', action='index',
403 repo_name=r2_name,
379 repo_name=r2_name,
404 org_ref_type="branch",
380 org_ref_type="branch",
405 org_ref=rev1,
381 org_ref=rev1,
406 other_ref_type="branch",
382 other_ref_type="branch",
407 other_ref=rev2,
383 other_ref=rev2,
408 other_repo=r1_name,
384 other_repo=r1_name,
409 merge='1',
385 merge='1',
410 ))
386 ))
411 response.mustcontain('%s@%s -&gt; %s@%s' % (r2_name, rev1, r1_name, rev2))
387 response.mustcontain('%s@%s -&gt; %s@%s' % (r2_name, rev1, r1_name, rev2))
412 response.mustcontain('No files')
388 response.mustcontain('No files')
413 response.mustcontain('No changesets')
389 response.mustcontain('No changesets')
414
390
415 #add new commit into parent !
391 #add new commit into parent !
416 cs0 = ScmModel().create_node(
392 cs0 = ScmModel().create_node(
417 repo=repo1.scm_instance, repo_name=r1_name,
393 repo=repo1.scm_instance, repo_name=r1_name,
418 cs=EmptyChangeset(alias='hg'), user=TEST_USER_ADMIN_LOGIN,
394 cs=EmptyChangeset(alias='hg'), user=TEST_USER_ADMIN_LOGIN,
419 author=TEST_USER_ADMIN_LOGIN,
395 author=TEST_USER_ADMIN_LOGIN,
420 message='commit2-parent',
396 message='commit2-parent',
421 content='line1-added-after-fork',
397 content='line1-added-after-fork',
422 f_path='file2'
398 f_path='file2'
423 )
399 )
424 #compare !
400 #compare !
425 rev1 = 'default'
401 rev1 = 'default'
426 rev2 = 'default'
402 rev2 = 'default'
427 response = self.app.get(url(controller='compare', action='index',
403 response = self.app.get(url(controller='compare', action='index',
428 repo_name=r2_name,
404 repo_name=r2_name,
429 org_ref_type="branch",
405 org_ref_type="branch",
430 org_ref=rev1,
406 org_ref=rev1,
431 other_ref_type="branch",
407 other_ref_type="branch",
432 other_ref=rev2,
408 other_ref=rev2,
433 other_repo=r1_name,
409 other_repo=r1_name,
434 merge='1',
410 merge='1',
435 ))
411 ))
436
412
437 response.mustcontain('%s@%s -&gt; %s@%s' % (r2_name, rev1, r1_name, rev2))
413 response.mustcontain('%s@%s -&gt; %s@%s' % (r2_name, rev1, r1_name, rev2))
438
414
439 response.mustcontain("""commit2-parent""")
415 response.mustcontain("""commit2-parent""")
440 response.mustcontain("""1 file changed with 1 insertions and 0 deletions""")
416 response.mustcontain("""1 file changed with 1 insertions and 0 deletions""")
441 response.mustcontain("""line1-added-after-fork""")
417 response.mustcontain("""line1-added-after-fork""")
General Comments 0
You need to be logged in to leave comments. Login now