Kiln » Kiln Extensions
Clone URL:  
Pushed to 2 repositories · View In Graph Contained in tip

Kiln 3.1.469 extensions

Changeset e12087422420

Parent 1f18453ba26a

by Profile picture of William ZimrinWilliam Zimrin

Changes to 5 files · Browse files at e12087422420 Showing diff from parent 1f18453ba26a Diff from another changeset...

Change 1 of 2 Show Changes Only big-push.py Stacked
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
 
 
 
 
 
 
 
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
 
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
 # Copyright (C) 2009-2013 Fog Creek Software. All rights reserved.  #  # This program is free software; you can redistribute it and/or modify  # it under the terms of the GNU General Public License as published by  # the Free Software Foundation; either version 2 of the License, or  # (at your option) any later version.  #  # This program is distributed in the hope that it will be useful,  # but WITHOUT ANY WARRANTY; without even the implied warranty of  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the  # GNU General Public License for more details.  #  # You should have received a copy of the GNU General Public License  # along with this program; if not, write to the Free Software  # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.    '''automatically push large repositories in chunks'''   -from mercurial import cmdutil, commands, hg, extensions +from mercurial import cmdutil, commands, hg, extensions, exchange  from mercurial.i18n import _    max_push_size = 1000      def findoutgoing(repo, other):   try:   # Mercurial 1.6 through 1.8   from mercurial import discovery   return discovery.findoutgoing(repo, other, force=False)   except AttributeError:   # Mercurial 1.9 and higher   common, _anyinc, _heads = discovery.findcommonincoming(repo, other, force=False)   return repo.changelog.findmissing(common)   except ImportError:   # Mercurial 1.5 and lower   return repo.findoutgoing(other, force=False)      def prepush(repo, other, force, revs):   try:   from mercurial import discovery   try:   # Mercurial 1.6 through 2.0   return discovery.prepush(repo, other, force, revs, False)   except AttributeError:   # Mercurial 2.1 and higher   fci = discovery.findcommonincoming(repo, other, force=force)   outgoing = discovery.findcommonoutgoing(repo, other, onlyheads=revs, commoninc=fci, force=force)   if not force: - discovery.checkheads(repo, other, outgoing, fci[2], False) + try: + discovery.checkheads(repo, other, outgoing, fci[2], False) + except TypeError: + pushop = exchange.pushoperation(repo, other, newbranch=False) + pushop.outgoing = outgoing + pushop.remoteheads = fci[2] + discovery.checkheads(pushop)   return [True]   except ImportError:   # Mercurial 1.5 and lower   return repo.prepush(other, False, revs)      def remoteui(repo, opts):   if hasattr(cmdutil, 'remoteui'):   # Mercurial 1.5 and lower   return cmdutil.remoteui(repo, opts)   else:   # Mercurial 1.6 and higher   return hg.remoteui(repo, opts)      def bigpush(push_fn, ui, repo, dest=None, *files, **opts):   '''Pushes this repository to a target repository.     If this repository is small, behaves as the native push command.   For large, remote repositories, the repository is pushed in chunks   of size optimized for performance on the network.'''   if not opts.get('chunked'):   return push_fn(ui, repo, dest, **opts)     source, revs = parseurl(ui.expandpath(dest or 'default-push', dest or 'default'))   try:   other = hg.repository(remoteui(repo, opts), source)   except:   # hg 2.3+   other = hg.peer(repo, opts, source)   if hasattr(hg, 'addbranchrevs'):   revs = hg.addbranchrevs(repo, other, revs, opts.get('rev'))[0]   if revs:   revs = [repo.lookup(rev) for rev in revs]   if other.local():   return push_fn(ui, repo, dest, **opts)     ui.status(_('pushing to %s\n') % other.path)     outgoing = findoutgoing(repo, other)   if outgoing:   outgoing = repo.changelog.nodesbetween(outgoing, revs)[0]     # if the push will create multiple heads and isn't forced, fail now   # (prepush prints an error message, so we can just exit)   if not opts.get('force') and not opts.get('new_branch') and None == prepush(repo, other, False, revs)[0]:   return   try:   push_size = 1   while len(outgoing) > 0:   ui.debug('start: %d to push\n' % len(outgoing))   current_push_size = min(push_size, len(outgoing))   ui.debug('pushing: %d\n' % current_push_size)   # force the push, because we checked above that by the time the whole push is done, we'll have merged back to one head   try:   # mercurial < 3.2   remote_heads = repo.push(other, force=True, revs=outgoing[:current_push_size])   except AttributeError:   # mercurial 3.2+   from mercurial import exchange   remote_heads = exchange.push(repo, other, force=True, revs=outgoing[:current_push_size])   if remote_heads: # push succeeded   outgoing = outgoing[current_push_size:]   ui.debug('pushed %d ok\n' % current_push_size)   if push_size < max_push_size:   push_size *= 2   else: # push failed; try again with a smaller size   push_size /= 2   ui.debug('failed, trying %d\n' % current_push_size)   if push_size == 0:   raise UnpushableChangesetError   except UnpushableChangesetError:   ui.status(_('unable to push changeset %s\n') % outgoing[0])   ui.debug('done\n')      def parseurl(source):   '''wrap hg.parseurl to work on 1.3 -> 1.5'''   return hg.parseurl(source, None)[:2]      def uisetup(ui):   push_cmd = extensions.wrapcommand(commands.table, 'push', bigpush)   push_cmd[1].extend([('', 'chunked', None, 'push large repository in chunks')])      class UnpushableChangesetError(Exception):   pass
Change 1 of 3 Show Entire File kiln.py Stacked
 
242
243
244
245
 
 
 
 
 
 
 
 
246
247
 
248
249
250
 
569
570
571
572
 
573
 
 
 
 
574
575
576
 
577
578
579
580
 
581
582
583
 
657
658
659
660
661
662
663
664
665
 
 
 
 
 
666
667
668
669
670
671
672
673
674
675
676
 
242
243
244
 
245
246
247
248
249
250
251
252
253
 
254
255
256
257
 
576
577
578
 
579
580
581
582
583
584
585
586
 
587
588
589
590
 
591
592
593
594
 
668
669
670
 
 
 
 
 
 
671
672
673
674
675
676
677
 
 
 
 
 
 
678
679
680
@@ -242,9 +242,16 @@
  user = ui.prompt('username:')   pw = ui.getpass()   - token = call_api(ui, url, 'Api/1.0/Auth/Login', dict(sUser=user, sPassword=pw)) + try: + token = call_api(ui, url, 'Api/1.0/Auth/Login', dict(sUser=user, sPassword=pw)) + except APIError as e: + if 'BadAuthenticationTFA' in e.errors: + ui.write(_('Two-Factor Authentication is enabled for your account\n')) + ui.write(_('Please go into your settings page, generate an API key,\n')) + ui.write(_('and enter it here (press enter to skip)\n')) + token = ui.getpass('token: ')   - if token: + if token and token != '':   return token   raise util.Abort(_('authorization failed'))   @@ -569,15 +576,19 @@
  for tup in urls:   url = tup[1]   baseurl = get_api_url(url) - if baseurl is None or baseurl.startswith('ssh:'): + if baseurl is None:   continue + if baseurl.startswith('ssh:'): + apiurl = 'https://' + baseurl[baseurl.find('@') + 1:] + else: + apiurl = baseurl     tails = get_tails(repo) - token = get_token(repo.ui, baseurl) + token = get_token(repo.ui, apiurl)     # We have an token at this point   params = dict(revTails=tails, token=token) - related_repos = call_api(repo.ui, baseurl, 'Api/1.0/Repo/Related', params) + related_repos = call_api(repo.ui, apiurl, 'Api/1.0/Repo/Related', params)   stripped = baseurl.rstrip('/')   if not stripped.startswith('ssh:'):   stripped += "/Code" @@ -657,20 +668,13 @@
  except urllib2.HTTPError:   raise util.Abort(_('Invalid URL: %s') % url)   - def find_slug(slug, l, attr=None): - if not l: - return None - for candidate in l.get(attr) if attr else l: - if candidate['sSlug'] == slug or (slug == 'Group' and candidate['sSlug'] == ''): - return candidate + paths = url.split('/') + project, group, repo = paths[-3:] + repo = call_api(repo.ui, baseurl, 'Api/1.0/Project/%s/Group/%s/Repo/%s' % (project, group, repo), dict(token=token)) + + if 'errors' in repo:   return None   - paths = url.split('/') - kiln_projects = call_api(repo.ui, baseurl, 'Api/1.0/Project/', dict(token=token)) - project, group, repo = paths[-3:] - project = find_slug(project, kiln_projects) - group = find_slug(group, project, 'repoGroups') - repo = find_slug(repo, group, 'repos')   return repo    
 
23
24
25
26
 
 
 
 
27
28
29
 
32
33
34
35
 
 
 
 
36
37
38
 
42
43
44
45
 
 
 
 
46
47
 
 
 
 
48
49
 
 
 
 
50
51
 
 
 
 
52
53
 
 
 
 
54
55
56
 
23
24
25
 
26
27
28
29
30
31
32
 
35
36
37
 
38
39
40
41
42
43
44
 
48
49
50
 
51
52
53
54
55
 
56
57
58
59
60
 
61
62
63
64
65
 
66
67
68
69
70
 
71
72
73
74
75
76
77
@@ -23,7 +23,10 @@
 hgt.hg(['commit', '-m', 'add file'])  hgt.hg(['push'], stdout='''pushing to %s  searching for changes -remote: kiln: successfully pushed one changeset +remote: adding changesets +remote: adding manifests +remote: adding file changes +remote: added 1 changesets with 1 changes to 1 files  ''' % hgt.test_url())  hgt.writefile('n2', 'n2')  hgt.hg(['add', 'n2']) @@ -32,7 +35,10 @@
 searching for changes  searching for changes  searching for changes -remote: kiln: successfully pushed one changeset +remote: adding changesets +remote: adding manifests +remote: adding file changes +remote: added 1 changesets with 1 changes to 1 files  ''' % hgt.test_url())  for i in range(3, 25):   hgt.writefile('n%d' % i, 'dummy') @@ -42,15 +48,30 @@
 searching for changes  searching for changes  searching for changes -remote: kiln: successfully pushed one changeset +remote: adding changesets +remote: adding manifests +remote: adding file changes +remote: added 1 changesets with 1 changes to 1 files  searching for changes -remote: kiln: successfully pushed 2 changesets +remote: adding changesets +remote: adding manifests +remote: adding file changes +remote: added 2 changesets with 2 changes to 2 files  searching for changes -remote: kiln: successfully pushed 4 changesets +remote: adding changesets +remote: adding manifests +remote: adding file changes +remote: added 4 changesets with 4 changes to 4 files  searching for changes -remote: kiln: successfully pushed 8 changesets +remote: adding changesets +remote: adding manifests +remote: adding file changes +remote: added 8 changesets with 8 changes to 8 files  searching for changes -remote: kiln: successfully pushed 7 changesets +remote: adding changesets +remote: adding manifests +remote: adding file changes +remote: added 7 changesets with 7 changes to 7 files  ''' % hgt.test_url())  hgt.hg(['pull'], stdout='''pulling from %s  searching for changes
 
16
17
18
19
 
 
 
20
21
22
 
31
32
33
34
 
 
 
 
16
17
18
 
19
20
21
22
23
24
 
33
34
35
 
36
37
38
@@ -16,7 +16,9 @@
 hgt.hg(['logout'])    hgt.hg(['pull'], stdin='\n\n', status=-1, - stderr='abort: http authorization required for %s' % hgt.test_url()) + stderr='abort: http authorization required for %s' % hgt.test_url(), + stdout='''pulling from %s +''' % hgt.test_url())    hgt.hg(['pull'], auth=True,   stdout='''pulling from %s @@ -31,4 +33,6 @@
 hgt.hg(['logout'])    hgt.hg(['pull'], stdin='\n\n', status=-1, - stderr='abort: http authorization required for %s' % hgt.test_url()) + stderr='abort: http authorization required for %s' % hgt.test_url(), + stdout='''pulling from %s +''' % hgt.test_url())
 
24
25
26
27
 
 
 
 
28
29
30
 
43
44
45
46
 
 
 
 
47
48
49
 
66
67
68
69
 
 
 
 
70
71
72
 
24
25
26
 
27
28
29
30
31
32
33
 
46
47
48
 
49
50
51
52
53
54
55
 
72
73
74
 
75
76
77
78
79
80
81
@@ -24,7 +24,10 @@
 hgt.hg(['commit', '-m', 'add file'])  hgt.hg(['push'], stdout='''pushing to %s  searching for changes -remote: kiln: successfully pushed one changeset +remote: adding changesets +remote: adding manifests +remote: adding file changes +remote: added 1 changesets with 1 changes to 1 files  ''' % hgt.test_url())  testbranch = hgt.createtestbranch(token, ixParent)  hgt.hg(['kiln', '-t'], '''The following Kiln targets are available for this repository: @@ -43,7 +46,10 @@
 ''' % (hgt.test_url(), hgt.test_branch_url()))  hgt.hg(['push'], stdout='''pushing to %s  searching for changes -remote: kiln: successfully pushed one changeset +remote: adding changesets +remote: adding manifests +remote: adding file changes +remote: added 1 changesets with 1 changes to 1 files  ''' % hgt.test_url())  hgt.writefile('n3', 'n3')  hgt.hg(['add', 'n3']) @@ -66,7 +72,10 @@
   hgt.hg(['push', 'TestBranch'], stdout='''pushing to %s  searching for changes -remote: kiln: successfully pushed 2 changesets +remote: adding changesets +remote: adding manifests +remote: adding file changes +remote: added 2 changesets with 2 changes to 2 files  ''' % hgt.test_branch_url())  os.chdir('..')  hgt.hg(['clone', hgt.test_url(), 'repo2'], log=False,