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

Better Mercurial 2.3 support for the big-push and kiln extensions.

Changeset eb3f0219a412

Parent 4a84d4eacaf7

by Profile picture of User 276Kevin Gessner <kevin@fogcreek.com>

Changes to 2 files · Browse files at eb3f0219a412 Showing diff from parent 4a84d4eacaf7 Diff from another changeset...

Change 1 of 1 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
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
 # Copyright (C) 2009-2011 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.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)   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')) - other = hg.repository(remoteui(repo, opts), source) + 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   remote_heads = repo.push(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 4 Show Entire File kiln.py Stacked
 
463
464
465
466
467
468
469
470
 
 
 
 
 
471
472
473
474
 
 
 
475
476
477
 
 
478
479
480
481
482
483
484
 
 
 
 
 
485
486
487
 
514
515
516
 
 
 
 
 
 
517
518
519
 
526
527
528
529
 
530
531
532
 
900
901
902
903
 
904
905
906
 
463
464
465
 
 
 
 
 
466
467
468
469
470
471
 
 
 
472
473
474
475
 
 
476
477
478
479
 
 
 
 
 
480
481
482
483
484
485
486
487
 
514
515
516
517
518
519
520
521
522
523
524
525
 
532
533
534
 
535
536
537
538
 
906
907
908
 
909
910
911
912
@@ -463,25 +463,25 @@
  ntarget = [normalize_name(t) for t in target[1:4]]   aliases = [normalize_name(s) for s in target[4]]   - if ndest.count('/') == 0 and \ - (ntarget[0] == ndest or \ - ntarget[1] == ndest or \ - ntarget[2] == ndest or \ - ndest in aliases): + if (ndest.count('/') == 0 and + (ntarget[0] == ndest or + ntarget[1] == ndest or + ntarget[2] == ndest or + ndest in aliases)):   matches.append(url) - elif ndest.count('/') == 1 and \ - '/'.join(ntarget[0:2]) == ndest or \ - '/'.join(ntarget[1:3]) == ndest: + elif (ndest.count('/') == 1 and + '/'.join(ntarget[0:2]) == ndest or + '/'.join(ntarget[1:3]) == ndest):   matches.append(url) - elif ndest.count('/') == 2 and \ - '/'.join(ntarget[0:3]) == ndest: + elif (ndest.count('/') == 2 and + '/'.join(ntarget[0:3]) == ndest):   matches.append(url)   - if (ntarget[0].startswith(ndest) or \ - ntarget[1].startswith(ndest) or \ - ntarget[2].startswith(ndest) or \ - '/'.join(ntarget[0:2]).startswith(ndest) or \ - '/'.join(ntarget[1:3]).startswith(ndest) or \ + if (ntarget[0].startswith(ndest) or + ntarget[1].startswith(ndest) or + ntarget[2].startswith(ndest) or + '/'.join(ntarget[0:2]).startswith(ndest) or + '/'.join(ntarget[1:3]).startswith(ndest) or   '/'.join(ntarget[0:3]).startswith(ndest)):   prefixmatches.append(url)   @@ -514,6 +514,12 @@
  return tails    def get_targets(repo): + def get_kiln_repo_url_prefix(default_prefix): + '''Checks repo paths and returns server url for ssh:. For http(s) falls back to default_prefix.''' + default_path = repo.ui.config('paths', 'default') + if default_path and default_path.startswith('ssh:'): + return default_path.rsplit('/', 3)[0] + return default_prefix   targets = []   kilnschemes = repo.ui.configitems('kiln_scheme')   for scheme in kilnschemes: @@ -526,7 +532,7 @@
  # 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) - targets.extend([[url, + targets.extend([[get_kiln_repo_url_prefix(url),   related_repo['sProjectSlug'],   related_repo['sGroupSlug'],   related_repo['sSlug'], @@ -900,7 +906,7 @@
  try:   from mercurial.httprepo import httprepository   httprepo = httprepository - except ImportError: + except (ImportError, AttributeError):   from mercurial.httppeer import httppeer   httprepo = httppeer   if issubclass(repo.__class__, httprepo):