Mercurial > public > mercurial-scm > hg-stable
annotate mercurial/localrepo.py @ 2471:6904e1ef8ad1
merge with crew.
author | Vadim Gelfer <vadim.gelfer@gmail.com> |
---|---|
date | Tue, 20 Jun 2006 23:58:45 -0700 |
parents | fe1689273f84 6ab016edd5c4 |
children | 7a77934ece46 |
rev | line source |
---|---|
1089 | 1 # localrepo.py - read/write repository class for mercurial |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
2 # |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
3 # Copyright 2005 Matt Mackall <mpm@selenic.com> |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
4 # |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
5 # This software may be used and distributed according to the terms |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
6 # of the GNU General Public License, incorporated herein by reference. |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
7 |
1089 | 8 from node import * |
1400
cf9a1233738a
i18n first part: make '_' available for files who need it
Benoit Boissinot <benoit.boissinot@ens-lyon.org
parents:
1398
diff
changeset
|
9 from i18n import gettext as _ |
262 | 10 from demandload import * |
1998
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
11 demandload(globals(), "appendfile changegroup") |
2470
fe1689273f84
use demandload more.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
12 demandload(globals(), "changelog dirstate filelog manifest repo") |
2155
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
13 demandload(globals(), "re lock transaction tempfile stat mdiff errno ui") |
2470
fe1689273f84
use demandload more.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
14 demandload(globals(), "os revlog util") |
499 | 15 |
1559
59b3639df0a9
Convert all classes to new-style classes by deriving them from object.
Eric Hopper <hopper@omnifarious.org>
parents:
1551
diff
changeset
|
16 class localrepository(object): |
2439
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
17 capabilities = () |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
18 |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
19 def __del__(self): |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
20 self.transhandle = None |
1839
876e4e6ad82b
Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1838
diff
changeset
|
21 def __init__(self, parentui, path=None, create=0): |
1101 | 22 if not path: |
23 p = os.getcwd() | |
24 while not os.path.isdir(os.path.join(p, ".hg")): | |
25 oldp = p | |
26 p = os.path.dirname(p) | |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
27 if p == oldp: |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
28 raise repo.RepoError(_("no repo found")) |
1101 | 29 path = p |
30 self.path = os.path.join(path, ".hg") | |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
31 |
1101 | 32 if not create and not os.path.isdir(self.path): |
1588
a679a364436a
Better error message (without /.hg appended) when repository is not found.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1586
diff
changeset
|
33 raise repo.RepoError(_("repository %s not found") % path) |
405 | 34 |
933
9c43d68ad59f
Fixed --repository option when handling relative path
tksoh@users.sf.net
parents:
926
diff
changeset
|
35 self.root = os.path.abspath(path) |
2016
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
36 self.origroot = path |
1839
876e4e6ad82b
Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1838
diff
changeset
|
37 self.ui = ui.ui(parentui=parentui) |
1102 | 38 self.opener = util.opener(self.path) |
39 self.wopener = util.opener(self.root) | |
2072 | 40 |
41 try: | |
42 self.ui.readconfig(self.join("hgrc"), self.root) | |
43 except IOError: | |
44 pass | |
45 | |
46 v = self.ui.revlogopts | |
2222
c9e264b115e6
Use revlogng and inlined data files by default
mason@suse.com
parents:
2221
diff
changeset
|
47 self.revlogversion = int(v.get('format', revlog.REVLOG_DEFAULT_FORMAT)) |
2152
57729c56a23c
Show repo's revlog format on verify only if it doesn't match the default format.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2150
diff
changeset
|
48 self.revlogv1 = self.revlogversion != revlog.REVLOGV0 |
2222
c9e264b115e6
Use revlogng and inlined data files by default
mason@suse.com
parents:
2221
diff
changeset
|
49 fl = v.get('flags', None) |
2073 | 50 flags = 0 |
2222
c9e264b115e6
Use revlogng and inlined data files by default
mason@suse.com
parents:
2221
diff
changeset
|
51 if fl != None: |
c9e264b115e6
Use revlogng and inlined data files by default
mason@suse.com
parents:
2221
diff
changeset
|
52 for x in fl.split(): |
c9e264b115e6
Use revlogng and inlined data files by default
mason@suse.com
parents:
2221
diff
changeset
|
53 flags |= revlog.flagstr(x) |
c9e264b115e6
Use revlogng and inlined data files by default
mason@suse.com
parents:
2221
diff
changeset
|
54 elif self.revlogv1: |
c9e264b115e6
Use revlogng and inlined data files by default
mason@suse.com
parents:
2221
diff
changeset
|
55 flags = revlog.REVLOG_DEFAULT_FLAGS |
2073 | 56 |
57 v = self.revlogversion | flags | |
58 self.manifest = manifest.manifest(self.opener, v) | |
59 self.changelog = changelog.changelog(self.opener, v) | |
2072 | 60 |
2073 | 61 # the changelog might not have the inline index flag |
62 # on. If the format of the changelog is the same as found in | |
63 # .hgrc, apply any flags found in the .hgrc as well. | |
64 # Otherwise, just version from the changelog | |
65 v = self.changelog.version | |
66 if v == self.revlogversion: | |
67 v |= flags | |
68 self.revlogversion = v | |
69 | |
343 | 70 self.tagscache = None |
71 self.nodetagscache = None | |
1258 | 72 self.encodepats = None |
73 self.decodepats = None | |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
74 self.transhandle = None |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
75 |
1133
899b619a7eb2
Create [web] section with short username as contact on hg init and hg clone.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1117
diff
changeset
|
76 if create: |
899b619a7eb2
Create [web] section with short username as contact on hg init and hg clone.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1117
diff
changeset
|
77 os.mkdir(self.path) |
899b619a7eb2
Create [web] section with short username as contact on hg init and hg clone.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1117
diff
changeset
|
78 os.mkdir(self.join("data")) |
899b619a7eb2
Create [web] section with short username as contact on hg init and hg clone.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1117
diff
changeset
|
79 |
1839
876e4e6ad82b
Create local ui object per repository, so .hg/hgrc don't get mixed.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1838
diff
changeset
|
80 self.dirstate = dirstate.dirstate(self.opener, self.ui, self.root) |
2155
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
81 |
1718
c1996b84d4f5
make hook code nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1717
diff
changeset
|
82 def hook(self, name, throw=False, **args): |
2155
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
83 def callhook(hname, funcname): |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
84 '''call python hook. hook is callable object, looked up as |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
85 name in python module. if callable returns "true", hook |
2221
05b6c13f43c6
reverse sense of return value from python hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2190
diff
changeset
|
86 fails, else passes. if hook raises exception, treated as |
05b6c13f43c6
reverse sense of return value from python hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2190
diff
changeset
|
87 hook failure. exception propagates if throw is "true". |
05b6c13f43c6
reverse sense of return value from python hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2190
diff
changeset
|
88 |
05b6c13f43c6
reverse sense of return value from python hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2190
diff
changeset
|
89 reason for "true" meaning "hook failed" is so that |
05b6c13f43c6
reverse sense of return value from python hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2190
diff
changeset
|
90 unmodified commands (e.g. mercurial.commands.update) can |
05b6c13f43c6
reverse sense of return value from python hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2190
diff
changeset
|
91 be run as hooks without wrappers to convert return values.''' |
2155
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
92 |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
93 self.ui.note(_("calling hook %s: %s\n") % (hname, funcname)) |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
94 d = funcname.rfind('.') |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
95 if d == -1: |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
96 raise util.Abort(_('%s hook is invalid ("%s" not in a module)') |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
97 % (hname, funcname)) |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
98 modname = funcname[:d] |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
99 try: |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
100 obj = __import__(modname) |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
101 except ImportError: |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
102 raise util.Abort(_('%s hook is invalid ' |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
103 '(import of "%s" failed)') % |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
104 (hname, modname)) |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
105 try: |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
106 for p in funcname.split('.')[1:]: |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
107 obj = getattr(obj, p) |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
108 except AttributeError, err: |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
109 raise util.Abort(_('%s hook is invalid ' |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
110 '("%s" is not defined)') % |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
111 (hname, funcname)) |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
112 if not callable(obj): |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
113 raise util.Abort(_('%s hook is invalid ' |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
114 '("%s" is not callable)') % |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
115 (hname, funcname)) |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
116 try: |
2190
b67fcd91dd1b
fix minor bugs in localrepo.hook.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2175
diff
changeset
|
117 r = obj(ui=self.ui, repo=self, hooktype=name, **args) |
2155
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
118 except (KeyboardInterrupt, util.SignalInterrupt): |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
119 raise |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
120 except Exception, exc: |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
121 if isinstance(exc, util.Abort): |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
122 self.ui.warn(_('error: %s hook failed: %s\n') % |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
123 (hname, exc.args[0] % exc.args[1:])) |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
124 else: |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
125 self.ui.warn(_('error: %s hook raised an exception: ' |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
126 '%s\n') % (hname, exc)) |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
127 if throw: |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
128 raise |
2335
f0680b2d1d64
add ui.print_exc(), make all traceback printing central.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2320
diff
changeset
|
129 self.ui.print_exc() |
2221
05b6c13f43c6
reverse sense of return value from python hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2190
diff
changeset
|
130 return True |
05b6c13f43c6
reverse sense of return value from python hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2190
diff
changeset
|
131 if r: |
2155
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
132 if throw: |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
133 raise util.Abort(_('%s hook failed') % hname) |
2221
05b6c13f43c6
reverse sense of return value from python hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2190
diff
changeset
|
134 self.ui.warn(_('warning: %s hook failed\n') % hname) |
2155
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
135 return r |
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
136 |
1480
ae0d8d632b83
allow multiples hook
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1477
diff
changeset
|
137 def runhook(name, cmd): |
ae0d8d632b83
allow multiples hook
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1477
diff
changeset
|
138 self.ui.note(_("running hook %s: %s\n") % (name, cmd)) |
2288
dfa17bd1d45e
remove non-prefixed environment variables from hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2269
diff
changeset
|
139 env = dict([('HG_' + k.upper(), v) for k, v in args.iteritems()]) |
1882
c0320567931f
merge util.esystem and util.system.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1880
diff
changeset
|
140 r = util.system(cmd, environ=env, cwd=self.root) |
487 | 141 if r: |
1718
c1996b84d4f5
make hook code nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1717
diff
changeset
|
142 desc, r = util.explain_exit(r) |
c1996b84d4f5
make hook code nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1717
diff
changeset
|
143 if throw: |
c1996b84d4f5
make hook code nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1717
diff
changeset
|
144 raise util.Abort(_('%s hook %s') % (name, desc)) |
2221
05b6c13f43c6
reverse sense of return value from python hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2190
diff
changeset
|
145 self.ui.warn(_('warning: %s hook %s\n') % (name, desc)) |
05b6c13f43c6
reverse sense of return value from python hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2190
diff
changeset
|
146 return r |
1480
ae0d8d632b83
allow multiples hook
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1477
diff
changeset
|
147 |
2221
05b6c13f43c6
reverse sense of return value from python hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2190
diff
changeset
|
148 r = False |
1838
429bf036f2cb
Call hooks in alphabetical (=defined) order, of course still grouped by type.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1835
diff
changeset
|
149 hooks = [(hname, cmd) for hname, cmd in self.ui.configitems("hooks") |
429bf036f2cb
Call hooks in alphabetical (=defined) order, of course still grouped by type.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1835
diff
changeset
|
150 if hname.split(".", 1)[0] == name and cmd] |
429bf036f2cb
Call hooks in alphabetical (=defined) order, of course still grouped by type.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1835
diff
changeset
|
151 hooks.sort() |
429bf036f2cb
Call hooks in alphabetical (=defined) order, of course still grouped by type.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1835
diff
changeset
|
152 for hname, cmd in hooks: |
2155
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
153 if cmd.startswith('python:'): |
2221
05b6c13f43c6
reverse sense of return value from python hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2190
diff
changeset
|
154 r = callhook(hname, cmd[7:].strip()) or r |
2155
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
155 else: |
2221
05b6c13f43c6
reverse sense of return value from python hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2190
diff
changeset
|
156 r = runhook(hname, cmd) or r |
1480
ae0d8d632b83
allow multiples hook
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1477
diff
changeset
|
157 return r |
487 | 158 |
343 | 159 def tags(self): |
160 '''return a mapping of tag to node''' | |
477
520540fd6b64
Handle errors in .hgtags or hgrc [tags] section more gracefully.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
471
diff
changeset
|
161 if not self.tagscache: |
343 | 162 self.tagscache = {} |
659 | 163 |
1986
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
164 def parsetag(line, context): |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
165 if not line: |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
166 return |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
167 s = l.split(" ", 1) |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
168 if len(s) != 2: |
2320
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2301
diff
changeset
|
169 self.ui.warn(_("%s: cannot parse entry\n") % context) |
1986
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
170 return |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
171 node, key = s |
2320
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2301
diff
changeset
|
172 key = key.strip() |
1986
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
173 try: |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
174 bin_n = bin(node) |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
175 except TypeError: |
2320
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2301
diff
changeset
|
176 self.ui.warn(_("%s: node '%s' is not well formed\n") % |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2301
diff
changeset
|
177 (context, node)) |
1986
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
178 return |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
179 if bin_n not in self.changelog.nodemap: |
2320
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2301
diff
changeset
|
180 self.ui.warn(_("%s: tag '%s' refers to unknown node\n") % |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2301
diff
changeset
|
181 (context, key)) |
1986
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
182 return |
2320
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2301
diff
changeset
|
183 self.tagscache[key] = bin_n |
1986
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
184 |
2320
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2301
diff
changeset
|
185 # read the tags file from each head, ending with the tip, |
1986
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
186 # and add each tag found to the map, with "newer" ones |
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
187 # taking precedence |
2320
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2301
diff
changeset
|
188 heads = self.heads() |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2301
diff
changeset
|
189 heads.reverse() |
1986
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
190 fl = self.file(".hgtags") |
2320
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2301
diff
changeset
|
191 for node in heads: |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2301
diff
changeset
|
192 change = self.changelog.read(node) |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2301
diff
changeset
|
193 rev = self.changelog.rev(node) |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2301
diff
changeset
|
194 fn, ff = self.manifest.find(change[0], '.hgtags') |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2301
diff
changeset
|
195 if fn is None: continue |
1986
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
196 count = 0 |
2320
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2301
diff
changeset
|
197 for l in fl.read(fn).splitlines(): |
1986
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
198 count += 1 |
2320
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2301
diff
changeset
|
199 parsetag(l, _(".hgtags (rev %d:%s), line %d") % |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2301
diff
changeset
|
200 (rev, short(node), count)) |
609
2acf1f5df2e6
[PATCH] hg tag: local tag support in file .hg/localtags
Matt Mackall <mpm@selenic.com>
parents:
608
diff
changeset
|
201 try: |
2acf1f5df2e6
[PATCH] hg tag: local tag support in file .hg/localtags
Matt Mackall <mpm@selenic.com>
parents:
608
diff
changeset
|
202 f = self.opener("localtags") |
1986
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
203 count = 0 |
609
2acf1f5df2e6
[PATCH] hg tag: local tag support in file .hg/localtags
Matt Mackall <mpm@selenic.com>
parents:
608
diff
changeset
|
204 for l in f: |
1986
719cf07b076d
add checking for invalid entries in tag files
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1983
diff
changeset
|
205 count += 1 |
2320
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2301
diff
changeset
|
206 parsetag(l, _("localtags, line %d") % count) |
609
2acf1f5df2e6
[PATCH] hg tag: local tag support in file .hg/localtags
Matt Mackall <mpm@selenic.com>
parents:
608
diff
changeset
|
207 except IOError: |
2acf1f5df2e6
[PATCH] hg tag: local tag support in file .hg/localtags
Matt Mackall <mpm@selenic.com>
parents:
608
diff
changeset
|
208 pass |
659 | 209 |
343 | 210 self.tagscache['tip'] = self.changelog.tip() |
659 | 211 |
343 | 212 return self.tagscache |
213 | |
214 def tagslist(self): | |
215 '''return a list of tags ordered by revision''' | |
216 l = [] | |
477
520540fd6b64
Handle errors in .hgtags or hgrc [tags] section more gracefully.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
471
diff
changeset
|
217 for t, n in self.tags().items(): |
343 | 218 try: |
219 r = self.changelog.rev(n) | |
220 except: | |
221 r = -2 # sort to the beginning of the list if unknown | |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
222 l.append((r, t, n)) |
343 | 223 l.sort() |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
224 return [(t, n) for r, t, n in l] |
343 | 225 |
226 def nodetags(self, node): | |
227 '''return the tags associated with a node''' | |
228 if not self.nodetagscache: | |
229 self.nodetagscache = {} | |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
230 for t, n in self.tags().items(): |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
231 self.nodetagscache.setdefault(n, []).append(t) |
343 | 232 return self.nodetagscache.get(node, []) |
233 | |
234 def lookup(self, key): | |
67 | 235 try: |
343 | 236 return self.tags()[key] |
67 | 237 except KeyError: |
658
f8098ae9f5b6
Generate a friendlier except for failed lookups
Matt Mackall <mpm@selenic.com>
parents:
657
diff
changeset
|
238 try: |
f8098ae9f5b6
Generate a friendlier except for failed lookups
Matt Mackall <mpm@selenic.com>
parents:
657
diff
changeset
|
239 return self.changelog.lookup(key) |
f8098ae9f5b6
Generate a friendlier except for failed lookups
Matt Mackall <mpm@selenic.com>
parents:
657
diff
changeset
|
240 except: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
241 raise repo.RepoError(_("unknown revision '%s'") % key) |
67 | 242 |
634
da5378d39269
Add a repo method to report repo device
Matt Mackall <mpm@selenic.com>
parents:
627
diff
changeset
|
243 def dev(self): |
2448
b77a2ef61b81
replace os.stat with os.lstat in some where.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2439
diff
changeset
|
244 return os.lstat(self.path).st_dev |
634
da5378d39269
Add a repo method to report repo device
Matt Mackall <mpm@selenic.com>
parents:
627
diff
changeset
|
245 |
926 | 246 def local(self): |
1101 | 247 return True |
926 | 248 |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
249 def join(self, f): |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
250 return os.path.join(self.path, f) |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
251 |
244 | 252 def wjoin(self, f): |
253 return os.path.join(self.root, f) | |
254 | |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
255 def file(self, f): |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
256 if f[0] == '/': |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
257 f = f[1:] |
2072 | 258 return filelog.filelog(self.opener, f, self.revlogversion) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
259 |
627 | 260 def getcwd(self): |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
839
diff
changeset
|
261 return self.dirstate.getcwd() |
627 | 262 |
291
2c4f2be05587
Add wopener for opening files in the working directory
mpm@selenic.com
parents:
288
diff
changeset
|
263 def wfile(self, f, mode='r'): |
2c4f2be05587
Add wopener for opening files in the working directory
mpm@selenic.com
parents:
288
diff
changeset
|
264 return self.wopener(f, mode) |
2c4f2be05587
Add wopener for opening files in the working directory
mpm@selenic.com
parents:
288
diff
changeset
|
265 |
1019
a9cca981c423
Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents:
1013
diff
changeset
|
266 def wread(self, filename): |
1258 | 267 if self.encodepats == None: |
268 l = [] | |
269 for pat, cmd in self.ui.configitems("encode"): | |
1947
65aff2ed61ae
fix the call to util.matcher (the args should be (reporoot, cwd, ...))
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1938
diff
changeset
|
270 mf = util.matcher(self.root, "", [pat], [], [])[1] |
1258 | 271 l.append((mf, cmd)) |
272 self.encodepats = l | |
273 | |
274 data = self.wopener(filename, 'r').read() | |
275 | |
276 for mf, cmd in self.encodepats: | |
277 if mf(filename): | |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
278 self.ui.debug(_("filtering %s through %s\n") % (filename, cmd)) |
1258 | 279 data = util.filter(data, cmd) |
280 break | |
281 | |
282 return data | |
1019
a9cca981c423
Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents:
1013
diff
changeset
|
283 |
a9cca981c423
Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents:
1013
diff
changeset
|
284 def wwrite(self, filename, data, fd=None): |
1258 | 285 if self.decodepats == None: |
286 l = [] | |
287 for pat, cmd in self.ui.configitems("decode"): | |
1947
65aff2ed61ae
fix the call to util.matcher (the args should be (reporoot, cwd, ...))
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1938
diff
changeset
|
288 mf = util.matcher(self.root, "", [pat], [], [])[1] |
1258 | 289 l.append((mf, cmd)) |
290 self.decodepats = l | |
291 | |
292 for mf, cmd in self.decodepats: | |
293 if mf(filename): | |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
294 self.ui.debug(_("filtering %s through %s\n") % (filename, cmd)) |
1258 | 295 data = util.filter(data, cmd) |
296 break | |
297 | |
1019
a9cca981c423
Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents:
1013
diff
changeset
|
298 if fd: |
a9cca981c423
Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents:
1013
diff
changeset
|
299 return fd.write(data) |
a9cca981c423
Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents:
1013
diff
changeset
|
300 return self.wopener(filename, 'w').write(data) |
a9cca981c423
Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents:
1013
diff
changeset
|
301 |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
302 def transaction(self): |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
303 tr = self.transhandle |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
304 if tr != None and tr.running(): |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
305 return tr.nest() |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
306 |
2362
482d3fb47d80
Renamed localrepo.undo() to rollback() and talk about "rollback information".
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2354
diff
changeset
|
307 # save dirstate for rollback |
263 | 308 try: |
309 ds = self.opener("dirstate").read() | |
310 except IOError: | |
311 ds = "" | |
785 | 312 self.opener("journal.dirstate", "w").write(ds) |
515 | 313 |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
314 tr = transaction.transaction(self.ui.warn, self.opener, |
1880
05c7d75be925
fix broken environment save/restore when a hook runs.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1853
diff
changeset
|
315 self.join("journal"), |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
316 aftertrans(self.path)) |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
317 self.transhandle = tr |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
318 return tr |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
319 |
210 | 320 def recover(self): |
1749
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
321 l = self.lock() |
557 | 322 if os.path.exists(self.join("journal")): |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
323 self.ui.status(_("rolling back interrupted transaction\n")) |
1516
0b1b029b4de3
Automatically run "verify" whenever we run "recover"
Matt Mackall <mpm@selenic.com>
parents:
1510
diff
changeset
|
324 transaction.rollback(self.opener, self.join("journal")) |
1784
2e0a288ca93e
revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1782
diff
changeset
|
325 self.reload() |
1516
0b1b029b4de3
Automatically run "verify" whenever we run "recover"
Matt Mackall <mpm@selenic.com>
parents:
1510
diff
changeset
|
326 return True |
210 | 327 else: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
328 self.ui.warn(_("no interrupted transaction available\n")) |
1516
0b1b029b4de3
Automatically run "verify" whenever we run "recover"
Matt Mackall <mpm@selenic.com>
parents:
1510
diff
changeset
|
329 return False |
210 | 330 |
2362
482d3fb47d80
Renamed localrepo.undo() to rollback() and talk about "rollback information".
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2354
diff
changeset
|
331 def rollback(self, wlock=None): |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
332 if not wlock: |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
333 wlock = self.wlock() |
1749
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
334 l = self.lock() |
210 | 335 if os.path.exists(self.join("undo")): |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
336 self.ui.status(_("rolling back last transaction\n")) |
262 | 337 transaction.rollback(self.opener, self.join("undo")) |
421 | 338 util.rename(self.join("undo.dirstate"), self.join("dirstate")) |
1784
2e0a288ca93e
revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1782
diff
changeset
|
339 self.reload() |
2e0a288ca93e
revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1782
diff
changeset
|
340 self.wreload() |
163 | 341 else: |
2362
482d3fb47d80
Renamed localrepo.undo() to rollback() and talk about "rollback information".
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2354
diff
changeset
|
342 self.ui.warn(_("no rollback information available\n")) |
162 | 343 |
1784
2e0a288ca93e
revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1782
diff
changeset
|
344 def wreload(self): |
2e0a288ca93e
revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1782
diff
changeset
|
345 self.dirstate.read() |
2e0a288ca93e
revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1782
diff
changeset
|
346 |
2e0a288ca93e
revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1782
diff
changeset
|
347 def reload(self): |
2e0a288ca93e
revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1782
diff
changeset
|
348 self.changelog.load() |
2e0a288ca93e
revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1782
diff
changeset
|
349 self.manifest.load() |
2e0a288ca93e
revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1782
diff
changeset
|
350 self.tagscache = None |
2e0a288ca93e
revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1782
diff
changeset
|
351 self.nodetagscache = None |
2e0a288ca93e
revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1782
diff
changeset
|
352 |
2016
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
353 def do_lock(self, lockname, wait, releasefn=None, acquirefn=None, |
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
354 desc=None): |
161 | 355 try: |
2016
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
356 l = lock.lock(self.join(lockname), 0, releasefn, desc=desc) |
1531
2ba8bf7defda
add localrepo.wlock for protecting the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1516
diff
changeset
|
357 except lock.LockHeld, inst: |
2ba8bf7defda
add localrepo.wlock for protecting the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1516
diff
changeset
|
358 if not wait: |
2016
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
359 raise |
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
360 self.ui.warn(_("waiting for lock on %s held by %s\n") % |
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
361 (desc, inst.args[0])) |
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
362 # default to 600 seconds timeout |
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
363 l = lock.lock(self.join(lockname), |
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
364 int(self.ui.config("ui", "timeout") or 600), |
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
365 releasefn, desc=desc) |
1751
e9bf415a8ecb
localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
366 if acquirefn: |
e9bf415a8ecb
localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
367 acquirefn() |
e9bf415a8ecb
localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
368 return l |
e9bf415a8ecb
localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
369 |
e9bf415a8ecb
localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
370 def lock(self, wait=1): |
2016
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
371 return self.do_lock("lock", wait, acquirefn=self.reload, |
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
372 desc=_('repository %s') % self.origroot) |
1751
e9bf415a8ecb
localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
373 |
e9bf415a8ecb
localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
374 def wlock(self, wait=1): |
2016
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
375 return self.do_lock("wlock", wait, self.dirstate.write, |
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
376 self.wreload, |
ff5c9a92f556
fix backtrace printed when cannot get lock.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
377 desc=_('working directory of %s') % self.origroot) |
1531
2ba8bf7defda
add localrepo.wlock for protecting the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1516
diff
changeset
|
378 |
1716
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
379 def checkfilemerge(self, filename, text, filelog, manifest1, manifest2): |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
380 "determine whether a new filenode is needed" |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
381 fp1 = manifest1.get(filename, nullid) |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
382 fp2 = manifest2.get(filename, nullid) |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
383 |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
384 if fp2 != nullid: |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
385 # is one parent an ancestor of the other? |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
386 fpa = filelog.ancestor(fp1, fp2) |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
387 if fpa == fp1: |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
388 fp1, fp2 = fp2, nullid |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
389 elif fpa == fp2: |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
390 fp2 = nullid |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
391 |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
392 # is the file unmodified from the parent? report existing entry |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
393 if fp2 == nullid and text == filelog.read(fp1): |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
394 return (fp1, None, None) |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
395 |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
396 return (None, fp1, fp2) |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
397 |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
398 def rawcommit(self, files, text, user, date, p1=None, p2=None, wlock=None): |
442 | 399 orig_parent = self.dirstate.parents()[0] or nullid |
452
a1e91c24dab5
rawcommit: do lookup of parents at the appropriate layer
mpm@selenic.com
parents:
442
diff
changeset
|
400 p1 = p1 or self.dirstate.parents()[0] or nullid |
a1e91c24dab5
rawcommit: do lookup of parents at the appropriate layer
mpm@selenic.com
parents:
442
diff
changeset
|
401 p2 = p2 or self.dirstate.parents()[1] or nullid |
302 | 402 c1 = self.changelog.read(p1) |
403 c2 = self.changelog.read(p2) | |
404 m1 = self.manifest.read(c1[0]) | |
405 mf1 = self.manifest.readflags(c1[0]) | |
406 m2 = self.manifest.read(c2[0]) | |
992
f859e9cba1b9
Fix up some bugs introduced by recent merge changes
mpm@selenic.com
parents:
991
diff
changeset
|
407 changed = [] |
302 | 408 |
442 | 409 if orig_parent == p1: |
410 update_dirstate = 1 | |
411 else: | |
412 update_dirstate = 0 | |
413 | |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
414 if not wlock: |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
415 wlock = self.wlock() |
1749
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
416 l = self.lock() |
203 | 417 tr = self.transaction() |
302 | 418 mm = m1.copy() |
419 mfm = mf1.copy() | |
203 | 420 linkrev = self.changelog.count() |
421 for f in files: | |
422 try: | |
1019
a9cca981c423
Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents:
1013
diff
changeset
|
423 t = self.wread(f) |
441 | 424 tm = util.is_exec(self.wjoin(f), mfm.get(f, False)) |
302 | 425 r = self.file(f) |
426 mfm[f] = tm | |
990 | 427 |
1716
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
428 (entry, fp1, fp2) = self.checkfilemerge(f, t, r, m1, m2) |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
429 if entry: |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
430 mm[f] = entry |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
431 continue |
990 | 432 |
433 mm[f] = r.add(t, {}, tr, linkrev, fp1, fp2) | |
992
f859e9cba1b9
Fix up some bugs introduced by recent merge changes
mpm@selenic.com
parents:
991
diff
changeset
|
434 changed.append(f) |
442 | 435 if update_dirstate: |
436 self.dirstate.update([f], "n") | |
203 | 437 except IOError: |
314
3402cb9a4c06
More tweaking to rawcommit for repo conversion
mpm@selenic.com
parents:
313
diff
changeset
|
438 try: |
3402cb9a4c06
More tweaking to rawcommit for repo conversion
mpm@selenic.com
parents:
313
diff
changeset
|
439 del mm[f] |
3402cb9a4c06
More tweaking to rawcommit for repo conversion
mpm@selenic.com
parents:
313
diff
changeset
|
440 del mfm[f] |
442 | 441 if update_dirstate: |
442 self.dirstate.forget([f]) | |
314
3402cb9a4c06
More tweaking to rawcommit for repo conversion
mpm@selenic.com
parents:
313
diff
changeset
|
443 except: |
3402cb9a4c06
More tweaking to rawcommit for repo conversion
mpm@selenic.com
parents:
313
diff
changeset
|
444 # deleted from p2? |
3402cb9a4c06
More tweaking to rawcommit for repo conversion
mpm@selenic.com
parents:
313
diff
changeset
|
445 pass |
203 | 446 |
302 | 447 mnode = self.manifest.add(mm, mfm, tr, linkrev, c1[0], c2[0]) |
608
d2994b5298fb
Add username/merge/editor to .hgrc
Matt Mackall <mpm@selenic.com>
parents:
588
diff
changeset
|
448 user = user or self.ui.username() |
992
f859e9cba1b9
Fix up some bugs introduced by recent merge changes
mpm@selenic.com
parents:
991
diff
changeset
|
449 n = self.changelog.add(mnode, changed, text, tr, p1, p2, user, date) |
203 | 450 tr.close() |
442 | 451 if update_dirstate: |
452 self.dirstate.setparents(n, nullid) | |
203 | 453 |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
454 def commit(self, files=None, text="", user=None, date=None, |
2267
d812d91c5a84
Force editor to appear for an 'hg backout' if a message or logfile aren't
john.levon@sun.com
parents:
2259
diff
changeset
|
455 match=util.always, force=False, lock=None, wlock=None, |
d812d91c5a84
Force editor to appear for an 'hg backout' if a message or logfile aren't
john.levon@sun.com
parents:
2259
diff
changeset
|
456 force_editor=False): |
220 | 457 commit = [] |
458 remove = [] | |
992
f859e9cba1b9
Fix up some bugs introduced by recent merge changes
mpm@selenic.com
parents:
991
diff
changeset
|
459 changed = [] |
f859e9cba1b9
Fix up some bugs introduced by recent merge changes
mpm@selenic.com
parents:
991
diff
changeset
|
460 |
220 | 461 if files: |
462 for f in files: | |
463 s = self.dirstate.state(f) | |
244 | 464 if s in 'nmai': |
220 | 465 commit.append(f) |
466 elif s == 'r': | |
467 remove.append(f) | |
468 else: | |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
469 self.ui.warn(_("%s not tracked!\n") % f) |
220 | 470 else: |
1619
1ba0d7041ac4
Distinguish removed and deleted files. Tests are not fixed yet.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1618
diff
changeset
|
471 modified, added, removed, deleted, unknown = self.changes(match=match) |
1618
ff339dd21976
Renamed c, a, d, u to modified, added, removed, unknown for users of changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1617
diff
changeset
|
472 commit = modified + added |
ff339dd21976
Renamed c, a, d, u to modified, added, removed, unknown for users of changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1617
diff
changeset
|
473 remove = removed |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
474 |
990 | 475 p1, p2 = self.dirstate.parents() |
476 c1 = self.changelog.read(p1) | |
477 c2 = self.changelog.read(p2) | |
478 m1 = self.manifest.read(c1[0]) | |
479 mf1 = self.manifest.readflags(c1[0]) | |
480 m2 = self.manifest.read(c2[0]) | |
481 | |
482 if not commit and not remove and not force and p2 == nullid: | |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
483 self.ui.status(_("nothing changed\n")) |
901
120cba94d5aa
Change repo.comit to return None on error or the new revision number on
mason@suse.com
parents:
900
diff
changeset
|
484 return None |
151 | 485 |
1721
801756d0ca84
add pretxncommit hook.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1719
diff
changeset
|
486 xp1 = hex(p1) |
801756d0ca84
add pretxncommit hook.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1719
diff
changeset
|
487 if p2 == nullid: xp2 = '' |
801756d0ca84
add pretxncommit hook.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1719
diff
changeset
|
488 else: xp2 = hex(p2) |
801756d0ca84
add pretxncommit hook.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1719
diff
changeset
|
489 |
1727
019e6a47a53e
fix names of parent changeset ids in hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1726
diff
changeset
|
490 self.hook("precommit", throw=True, parent1=xp1, parent2=xp2) |
487 | 491 |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
492 if not wlock: |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
493 wlock = self.wlock() |
1807
f1f43ea22cbf
Allow repo lock to be passed in to localrepo.commit for performance
mason@suse.com
parents:
1806
diff
changeset
|
494 if not lock: |
f1f43ea22cbf
Allow repo lock to be passed in to localrepo.commit for performance
mason@suse.com
parents:
1806
diff
changeset
|
495 lock = self.lock() |
151 | 496 tr = self.transaction() |
497 | |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
498 # check in files |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
499 new = {} |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
500 linkrev = self.changelog.count() |
220 | 501 commit.sort() |
502 for f in commit: | |
83 | 503 self.ui.note(f + "\n") |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
504 try: |
441 | 505 mf1[f] = util.is_exec(self.wjoin(f), mf1.get(f, False)) |
1019
a9cca981c423
Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents:
1013
diff
changeset
|
506 t = self.wread(f) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
507 except IOError: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
508 self.ui.warn(_("trouble committing %s!\n") % f) |
220 | 509 raise |
510 | |
1117 | 511 r = self.file(f) |
512 | |
363 | 513 meta = {} |
514 cp = self.dirstate.copied(f) | |
515 if cp: | |
516 meta["copy"] = cp | |
517 meta["copyrev"] = hex(m1.get(cp, m2.get(cp, nullid))) | |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
518 self.ui.debug(_(" %s: copy %s:%s\n") % (f, cp, meta["copyrev"])) |
1117 | 519 fp1, fp2 = nullid, nullid |
520 else: | |
1716
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
521 entry, fp1, fp2 = self.checkfilemerge(f, t, r, m1, m2) |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
522 if entry: |
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
523 new[f] = entry |
990 | 524 continue |
525 | |
363 | 526 new[f] = r.add(t, meta, tr, linkrev, fp1, fp2) |
992
f859e9cba1b9
Fix up some bugs introduced by recent merge changes
mpm@selenic.com
parents:
991
diff
changeset
|
527 # remember what we've added so that we can later calculate |
f859e9cba1b9
Fix up some bugs introduced by recent merge changes
mpm@selenic.com
parents:
991
diff
changeset
|
528 # the files to pull from a set of changesets |
f859e9cba1b9
Fix up some bugs introduced by recent merge changes
mpm@selenic.com
parents:
991
diff
changeset
|
529 changed.append(f) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
530 |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
531 # update manifest |
1629
3024cacfb2c9
Copy manifest map before modifying it (see issue86)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1621
diff
changeset
|
532 m1 = m1.copy() |
229 | 533 m1.update(new) |
416
5e9e8b8d2629
[PATCH] Removal of a file added by merging branches
mpm@selenic.com
parents:
415
diff
changeset
|
534 for f in remove: |
5e9e8b8d2629
[PATCH] Removal of a file added by merging branches
mpm@selenic.com
parents:
415
diff
changeset
|
535 if f in m1: |
5e9e8b8d2629
[PATCH] Removal of a file added by merging branches
mpm@selenic.com
parents:
415
diff
changeset
|
536 del m1[f] |
741 | 537 mn = self.manifest.add(m1, mf1, tr, linkrev, c1[0], c2[0], |
538 (new, remove)) | |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
539 |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
540 # add changeset |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
541 new = new.keys() |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
542 new.sort() |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
543 |
1983
ae12a81549a7
Pass correct username as $HGUSER to hgeditor if "commit -u" is used.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1981
diff
changeset
|
544 user = user or self.ui.username() |
2267
d812d91c5a84
Force editor to appear for an 'hg backout' if a message or logfile aren't
john.levon@sun.com
parents:
2259
diff
changeset
|
545 if not text or force_editor: |
d812d91c5a84
Force editor to appear for an 'hg backout' if a message or logfile aren't
john.levon@sun.com
parents:
2259
diff
changeset
|
546 edittext = [] |
d812d91c5a84
Force editor to appear for an 'hg backout' if a message or logfile aren't
john.levon@sun.com
parents:
2259
diff
changeset
|
547 if text: |
d812d91c5a84
Force editor to appear for an 'hg backout' if a message or logfile aren't
john.levon@sun.com
parents:
2259
diff
changeset
|
548 edittext.append(text) |
d812d91c5a84
Force editor to appear for an 'hg backout' if a message or logfile aren't
john.levon@sun.com
parents:
2259
diff
changeset
|
549 edittext.append("") |
992
f859e9cba1b9
Fix up some bugs introduced by recent merge changes
mpm@selenic.com
parents:
991
diff
changeset
|
550 if p2 != nullid: |
1709
069129d24b26
Create default commit message in a more pythonic way.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1708
diff
changeset
|
551 edittext.append("HG: branch merge") |
069129d24b26
Create default commit message in a more pythonic way.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1708
diff
changeset
|
552 edittext.extend(["HG: changed %s" % f for f in changed]) |
069129d24b26
Create default commit message in a more pythonic way.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1708
diff
changeset
|
553 edittext.extend(["HG: removed %s" % f for f in remove]) |
992
f859e9cba1b9
Fix up some bugs introduced by recent merge changes
mpm@selenic.com
parents:
991
diff
changeset
|
554 if not changed and not remove: |
1709
069129d24b26
Create default commit message in a more pythonic way.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1708
diff
changeset
|
555 edittext.append("HG: no files changed") |
069129d24b26
Create default commit message in a more pythonic way.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1708
diff
changeset
|
556 edittext.append("") |
1706
20b621154e17
Run commit message editor in the repo root (like hooks).
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1680
diff
changeset
|
557 # run editor in the repository root |
20b621154e17
Run commit message editor in the repo root (like hooks).
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1680
diff
changeset
|
558 olddir = os.getcwd() |
20b621154e17
Run commit message editor in the repo root (like hooks).
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1680
diff
changeset
|
559 os.chdir(self.root) |
2301
7c2623aedeb4
Strip empty lines and trailing spaces around commit messages.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2288
diff
changeset
|
560 text = self.ui.edit("\n".join(edittext), user) |
1706
20b621154e17
Run commit message editor in the repo root (like hooks).
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1680
diff
changeset
|
561 os.chdir(olddir) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
562 |
2301
7c2623aedeb4
Strip empty lines and trailing spaces around commit messages.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2288
diff
changeset
|
563 lines = [line.rstrip() for line in text.rstrip().splitlines()] |
7c2623aedeb4
Strip empty lines and trailing spaces around commit messages.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2288
diff
changeset
|
564 while lines and not lines[0]: |
7c2623aedeb4
Strip empty lines and trailing spaces around commit messages.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2288
diff
changeset
|
565 del lines[0] |
7c2623aedeb4
Strip empty lines and trailing spaces around commit messages.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2288
diff
changeset
|
566 if not lines: |
7c2623aedeb4
Strip empty lines and trailing spaces around commit messages.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2288
diff
changeset
|
567 return None |
7c2623aedeb4
Strip empty lines and trailing spaces around commit messages.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2288
diff
changeset
|
568 text = '\n'.join(lines) |
1645
c6ffedc4f11b
add removed files to the changelog file list
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1632
diff
changeset
|
569 n = self.changelog.add(mn, changed + remove, text, tr, p1, p2, user, date) |
1727
019e6a47a53e
fix names of parent changeset ids in hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1726
diff
changeset
|
570 self.hook('pretxncommit', throw=True, node=hex(n), parent1=xp1, |
019e6a47a53e
fix names of parent changeset ids in hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1726
diff
changeset
|
571 parent2=xp2) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
572 tr.close() |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
573 |
229 | 574 self.dirstate.setparents(n) |
220 | 575 self.dirstate.update(new, "n") |
576 self.dirstate.forget(remove) | |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
577 |
1727
019e6a47a53e
fix names of parent changeset ids in hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1726
diff
changeset
|
578 self.hook("commit", node=hex(n), parent1=xp1, parent2=xp2) |
901
120cba94d5aa
Change repo.comit to return None on error or the new revision number on
mason@suse.com
parents:
900
diff
changeset
|
579 return n |
660
2c83350784c3
Move commit hook after commit completes
Matt Mackall <mpm@selenic.com>
parents:
659
diff
changeset
|
580 |
2029
d436b21b20dc
rewrite revert command. fix issues 93, 123, 147.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
581 def walk(self, node=None, files=[], match=util.always, badmatch=None): |
724
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
723
diff
changeset
|
582 if node: |
1582
63799b01985c
fix the cat command
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
583 fdict = dict.fromkeys(files) |
726
809a870a0e73
Add a source designator to the walk methods.
Bryan O'Sullivan <bos@serpentine.com>
parents:
725
diff
changeset
|
584 for fn in self.manifest.read(self.changelog.read(node)[0]): |
1582
63799b01985c
fix the cat command
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
585 fdict.pop(fn, None) |
63799b01985c
fix the cat command
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
586 if match(fn): |
63799b01985c
fix the cat command
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
587 yield 'm', fn |
63799b01985c
fix the cat command
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
588 for fn in fdict: |
2029
d436b21b20dc
rewrite revert command. fix issues 93, 123, 147.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
589 if badmatch and badmatch(fn): |
d436b21b20dc
rewrite revert command. fix issues 93, 123, 147.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
590 if match(fn): |
d436b21b20dc
rewrite revert command. fix issues 93, 123, 147.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
591 yield 'b', fn |
d436b21b20dc
rewrite revert command. fix issues 93, 123, 147.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
592 else: |
d436b21b20dc
rewrite revert command. fix issues 93, 123, 147.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
593 self.ui.warn(_('%s: No such file in rev %s\n') % ( |
d436b21b20dc
rewrite revert command. fix issues 93, 123, 147.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2022
diff
changeset
|
594 util.pathto(self.getcwd(), fn), short(node))) |
724
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
723
diff
changeset
|
595 else: |
2042
a514c7509fa9
small changes to revert command.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2038
diff
changeset
|
596 for src, fn in self.dirstate.walk(files, match, badmatch=badmatch): |
726
809a870a0e73
Add a source designator to the walk methods.
Bryan O'Sullivan <bos@serpentine.com>
parents:
725
diff
changeset
|
597 yield src, fn |
723 | 598 |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
599 def changes(self, node1=None, node2=None, files=[], match=util.always, |
2022
a59da8cc35e4
New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2021
diff
changeset
|
600 wlock=None, show_ignored=None): |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
601 """return changes between two nodes or node and working directory |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
602 |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
603 If node1 is None, use the first dirstate parent instead. |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
604 If node2 is None, compare node1 with working directory. |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
605 """ |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
606 |
536 | 607 def fcmp(fn, mf): |
1019
a9cca981c423
Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents:
1013
diff
changeset
|
608 t1 = self.wread(fn) |
994
88c15682d9b0
Fix callers to file.revision to use file.read
mpm@selenic.com
parents:
993
diff
changeset
|
609 t2 = self.file(fn).read(mf.get(fn, nullid)) |
29 | 610 return cmp(t1, t2) |
611 | |
723 | 612 def mfmatches(node): |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
613 change = self.changelog.read(node) |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
614 mf = dict(self.manifest.read(change[0])) |
723 | 615 for fn in mf.keys(): |
616 if not match(fn): | |
617 del mf[fn] | |
618 return mf | |
741 | 619 |
1802
8a7a24b96697
speed up hg log --debug
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
1789
diff
changeset
|
620 if node1: |
8a7a24b96697
speed up hg log --debug
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
1789
diff
changeset
|
621 # read the manifest from node1 before the manifest from node2, |
8a7a24b96697
speed up hg log --debug
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
1789
diff
changeset
|
622 # so that we'll hit the manifest cache if we're going through |
8a7a24b96697
speed up hg log --debug
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
1789
diff
changeset
|
623 # all the revisions in parent->child order. |
8a7a24b96697
speed up hg log --debug
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
1789
diff
changeset
|
624 mf1 = mfmatches(node1) |
8a7a24b96697
speed up hg log --debug
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
1789
diff
changeset
|
625 |
536 | 626 # are we comparing the working directory? |
561 | 627 if not node2: |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
628 if not wlock: |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
629 try: |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
630 wlock = self.wlock(wait=0) |
1754
fdfe89a3962d
use repo.lock when cloning via copy, use lock.LockException when necessary
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1752
diff
changeset
|
631 except lock.LockException: |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
632 wlock = None |
2022
a59da8cc35e4
New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2021
diff
changeset
|
633 lookup, modified, added, removed, deleted, unknown, ignored = ( |
a59da8cc35e4
New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2021
diff
changeset
|
634 self.dirstate.changes(files, match, show_ignored)) |
536 | 635 |
636 # are we comparing working dir against its parent? | |
561 | 637 if not node1: |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
638 if lookup: |
536 | 639 # do a full compare of any files that might have changed |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
640 mf2 = mfmatches(self.dirstate.parents()[0]) |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
641 for f in lookup: |
561 | 642 if fcmp(f, mf2): |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
643 modified.append(f) |
1532
27077812fffb
reset mtime when two files are equal
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1531
diff
changeset
|
644 elif wlock is not None: |
27077812fffb
reset mtime when two files are equal
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1531
diff
changeset
|
645 self.dirstate.update([f], "n") |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
646 else: |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
647 # we are comparing working dir against non-parent |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
648 # generate a pseudo-manifest for the working dir |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
649 mf2 = mfmatches(self.dirstate.parents()[0]) |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
650 for f in lookup + modified + added: |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
651 mf2[f] = "" |
1617
ece5d785e87a
Make localrepo.changes() internally distinguish between removed and deleted.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1616
diff
changeset
|
652 for f in removed: |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
653 if f in mf2: |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
654 del mf2[f] |
536 | 655 else: |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
656 # we are comparing two revisions |
2022
a59da8cc35e4
New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2021
diff
changeset
|
657 deleted, unknown, ignored = [], [], [] |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
658 mf2 = mfmatches(node2) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
659 |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
660 if node1: |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
661 # flush lists from dirstate before comparing manifests |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
662 modified, added = [], [] |
566 | 663 |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
664 for fn in mf2: |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
665 if mf1.has_key(fn): |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
666 if mf1[fn] != mf2[fn] and (mf2[fn] != "" or fcmp(fn, mf1)): |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
667 modified.append(fn) |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
668 del mf1[fn] |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
669 else: |
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
670 added.append(fn) |
515 | 671 |
1617
ece5d785e87a
Make localrepo.changes() internally distinguish between removed and deleted.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1616
diff
changeset
|
672 removed = mf1.keys() |
ece5d785e87a
Make localrepo.changes() internally distinguish between removed and deleted.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1616
diff
changeset
|
673 |
1616
f0f9e84849e7
Cleaned up localrepo.changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1615
diff
changeset
|
674 # sort and return results: |
2022
a59da8cc35e4
New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2021
diff
changeset
|
675 for l in modified, added, removed, deleted, unknown, ignored: |
561 | 676 l.sort() |
2022
a59da8cc35e4
New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2021
diff
changeset
|
677 if show_ignored is None: |
a59da8cc35e4
New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2021
diff
changeset
|
678 return (modified, added, removed, deleted, unknown) |
a59da8cc35e4
New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2021
diff
changeset
|
679 else: |
a59da8cc35e4
New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2021
diff
changeset
|
680 return (modified, added, removed, deleted, unknown, ignored) |
32 | 681 |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
682 def add(self, list, wlock=None): |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
683 if not wlock: |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
684 wlock = self.wlock() |
220 | 685 for f in list: |
244 | 686 p = self.wjoin(f) |
611
48c3eb2bf844
* clean up error handling when user requests to use a non file object
shaleh@speakeasy.net
parents:
609
diff
changeset
|
687 if not os.path.exists(p): |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
688 self.ui.warn(_("%s does not exist!\n") % f) |
611
48c3eb2bf844
* clean up error handling when user requests to use a non file object
shaleh@speakeasy.net
parents:
609
diff
changeset
|
689 elif not os.path.isfile(p): |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
690 self.ui.warn(_("%s not added: only files supported currently\n") |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
691 % f) |
724
1c0c413cccdd
Get add and locate to use new repo and dirstate walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents:
723
diff
changeset
|
692 elif self.dirstate.state(f) in 'an': |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
693 self.ui.warn(_("%s already tracked!\n") % f) |
220 | 694 else: |
695 self.dirstate.update([f], "a") | |
696 | |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
697 def forget(self, list, wlock=None): |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
698 if not wlock: |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
699 wlock = self.wlock() |
220 | 700 for f in list: |
701 if self.dirstate.state(f) not in 'ai': | |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
702 self.ui.warn(_("%s not added!\n") % f) |
220 | 703 else: |
704 self.dirstate.forget([f]) | |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
705 |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
706 def remove(self, list, unlink=False, wlock=None): |
1415
c6e6ca96a033
refactor some unlink/remove code and make sure we prune empty dir
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
707 if unlink: |
c6e6ca96a033
refactor some unlink/remove code and make sure we prune empty dir
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
708 for f in list: |
c6e6ca96a033
refactor some unlink/remove code and make sure we prune empty dir
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
709 try: |
c6e6ca96a033
refactor some unlink/remove code and make sure we prune empty dir
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
710 util.unlink(self.wjoin(f)) |
c6e6ca96a033
refactor some unlink/remove code and make sure we prune empty dir
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
711 except OSError, inst: |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
712 if inst.errno != errno.ENOENT: |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
713 raise |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
714 if not wlock: |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
715 wlock = self.wlock() |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
716 for f in list: |
244 | 717 p = self.wjoin(f) |
611
48c3eb2bf844
* clean up error handling when user requests to use a non file object
shaleh@speakeasy.net
parents:
609
diff
changeset
|
718 if os.path.exists(p): |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
719 self.ui.warn(_("%s still exists!\n") % f) |
402 | 720 elif self.dirstate.state(f) == 'a': |
657
22bc6fb9aefc
dirstate.forget() takes a list
Matt Mackall <mpm@selenic.com>
parents:
656
diff
changeset
|
721 self.dirstate.forget([f]) |
220 | 722 elif f not in self.dirstate: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
723 self.ui.warn(_("%s not tracked!\n") % f) |
220 | 724 else: |
725 self.dirstate.update([f], "r") | |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
726 |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
727 def undelete(self, list, wlock=None): |
1448
182879d71922
Allow reverting a deleted file with two parents
Matt Mackall <mpm@selenic.com>
parents:
1447
diff
changeset
|
728 p = self.dirstate.parents()[0] |
1447
508a3f559553
revert added and removed files to their normal state before reverting
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1427
diff
changeset
|
729 mn = self.changelog.read(p)[0] |
508a3f559553
revert added and removed files to their normal state before reverting
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1427
diff
changeset
|
730 mf = self.manifest.readflags(mn) |
508a3f559553
revert added and removed files to their normal state before reverting
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1427
diff
changeset
|
731 m = self.manifest.read(mn) |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
732 if not wlock: |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
733 wlock = self.wlock() |
1447
508a3f559553
revert added and removed files to their normal state before reverting
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1427
diff
changeset
|
734 for f in list: |
508a3f559553
revert added and removed files to their normal state before reverting
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1427
diff
changeset
|
735 if self.dirstate.state(f) not in "r": |
508a3f559553
revert added and removed files to their normal state before reverting
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1427
diff
changeset
|
736 self.ui.warn("%s not removed!\n" % f) |
508a3f559553
revert added and removed files to their normal state before reverting
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1427
diff
changeset
|
737 else: |
508a3f559553
revert added and removed files to their normal state before reverting
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1427
diff
changeset
|
738 t = self.file(f).read(m[f]) |
1477
d3566eda2bcb
util.opener already create the base directory if it doesn't exist
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1473
diff
changeset
|
739 self.wwrite(f, t) |
1447
508a3f559553
revert added and removed files to their normal state before reverting
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1427
diff
changeset
|
740 util.set_exec(self.wjoin(f), mf[f]) |
508a3f559553
revert added and removed files to their normal state before reverting
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1427
diff
changeset
|
741 self.dirstate.update([f], "n") |
508a3f559553
revert added and removed files to their normal state before reverting
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1427
diff
changeset
|
742 |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
743 def copy(self, source, dest, wlock=None): |
363 | 744 p = self.wjoin(dest) |
781 | 745 if not os.path.exists(p): |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
746 self.ui.warn(_("%s does not exist!\n") % dest) |
781 | 747 elif not os.path.isfile(p): |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
748 self.ui.warn(_("copy failed: %s is not a file\n") % dest) |
363 | 749 else: |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
750 if not wlock: |
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
751 wlock = self.wlock() |
363 | 752 if self.dirstate.state(dest) == '?': |
753 self.dirstate.update([dest], "a") | |
754 self.dirstate.copy(source, dest) | |
755 | |
1551
e793cbc8be00
Fixes to "hg heads -r FOO":
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1550
diff
changeset
|
756 def heads(self, start=None): |
1550
ccb9b62de892
add a -r/--rev option to heads to show only heads descendant from rev
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1532
diff
changeset
|
757 heads = self.changelog.heads(start) |
ccb9b62de892
add a -r/--rev option to heads to show only heads descendant from rev
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1532
diff
changeset
|
758 # sort the output in rev descending order |
ccb9b62de892
add a -r/--rev option to heads to show only heads descendant from rev
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1532
diff
changeset
|
759 heads = [(-self.changelog.rev(h), h) for h in heads] |
ccb9b62de892
add a -r/--rev option to heads to show only heads descendant from rev
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1532
diff
changeset
|
760 heads.sort() |
ccb9b62de892
add a -r/--rev option to heads to show only heads descendant from rev
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1532
diff
changeset
|
761 return [n for (r, n) in heads] |
222 | 762 |
898 | 763 # branchlookup returns a dict giving a list of branches for |
764 # each head. A branch is defined as the tag of a node or | |
765 # the branch of the node's parents. If a node has multiple | |
766 # branch tags, tags are eliminated if they are visible from other | |
767 # branch tags. | |
768 # | |
769 # So, for this graph: a->b->c->d->e | |
770 # \ / | |
771 # aa -----/ | |
919 | 772 # a has tag 2.6.12 |
898 | 773 # d has tag 2.6.13 |
774 # e would have branch tags for 2.6.12 and 2.6.13. Because the node | |
775 # for 2.6.12 can be reached from the node 2.6.13, that is eliminated | |
776 # from the list. | |
777 # | |
778 # It is possible that more than one head will have the same branch tag. | |
779 # callers need to check the result for multiple heads under the same | |
780 # branch tag if that is a problem for them (ie checkout of a specific | |
781 # branch). | |
782 # | |
783 # passing in a specific branch will limit the depth of the search | |
784 # through the parents. It won't limit the branches returned in the | |
785 # result though. | |
786 def branchlookup(self, heads=None, branch=None): | |
787 if not heads: | |
788 heads = self.heads() | |
789 headt = [ h for h in heads ] | |
790 chlog = self.changelog | |
791 branches = {} | |
792 merges = [] | |
793 seenmerge = {} | |
794 | |
795 # traverse the tree once for each head, recording in the branches | |
796 # dict which tags are visible from this head. The branches | |
797 # dict also records which tags are visible from each tag | |
798 # while we traverse. | |
799 while headt or merges: | |
800 if merges: | |
801 n, found = merges.pop() | |
802 visit = [n] | |
803 else: | |
804 h = headt.pop() | |
805 visit = [h] | |
806 found = [h] | |
807 seen = {} | |
808 while visit: | |
809 n = visit.pop() | |
810 if n in seen: | |
811 continue | |
812 pp = chlog.parents(n) | |
813 tags = self.nodetags(n) | |
814 if tags: | |
815 for x in tags: | |
816 if x == 'tip': | |
817 continue | |
818 for f in found: | |
819 branches.setdefault(f, {})[n] = 1 | |
820 branches.setdefault(n, {})[n] = 1 | |
821 break | |
822 if n not in found: | |
823 found.append(n) | |
824 if branch in tags: | |
825 continue | |
826 seen[n] = 1 | |
827 if pp[1] != nullid and n not in seenmerge: | |
828 merges.append((pp[1], [x for x in found])) | |
829 seenmerge[n] = 1 | |
830 if pp[0] != nullid: | |
831 visit.append(pp[0]) | |
832 # traverse the branches dict, eliminating branch tags from each | |
833 # head that are visible from another branch tag for that head. | |
834 out = {} | |
835 viscache = {} | |
836 for h in heads: | |
837 def visible(node): | |
838 if node in viscache: | |
839 return viscache[node] | |
840 ret = {} | |
841 visit = [node] | |
842 while visit: | |
843 x = visit.pop() | |
844 if x in viscache: | |
845 ret.update(viscache[x]) | |
846 elif x not in ret: | |
847 ret[x] = 1 | |
848 if x in branches: | |
849 visit[len(visit):] = branches[x].keys() | |
850 viscache[node] = ret | |
851 return ret | |
852 if h not in branches: | |
853 continue | |
854 # O(n^2), but somewhat limited. This only searches the | |
855 # tags visible from a specific head, not all the tags in the | |
856 # whole repo. | |
857 for b in branches[h]: | |
858 vis = False | |
859 for bb in branches[h].keys(): | |
860 if b != bb: | |
861 if b in visible(bb): | |
862 vis = True | |
863 break | |
864 if not vis: | |
865 l = out.setdefault(h, []) | |
866 l[len(l):] = self.nodetags(b) | |
867 return out | |
868 | |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
869 def branches(self, nodes): |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
870 if not nodes: |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
871 nodes = [self.changelog.tip()] |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
872 b = [] |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
873 for n in nodes: |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
874 t = n |
2345
4f7745fc9823
n is always 'True', we can only stop the loop with the break statement
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2320
diff
changeset
|
875 while 1: |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
876 p = self.changelog.parents(n) |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
877 if p[1] != nullid or p[0] == nullid: |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
878 b.append((t, n, p[0], p[1])) |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
879 break |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
880 n = p[0] |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
881 return b |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
882 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
883 def between(self, pairs): |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
884 r = [] |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
885 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
886 for top, bottom in pairs: |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
887 n, l, i = top, [], 0 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
888 f = 1 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
889 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
890 while n != bottom: |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
891 p = self.changelog.parents(n)[0] |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
892 if i == f: |
575 | 893 l.append(n) |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
894 f = f * 2 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
895 n = p |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
896 i += 1 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
897 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
898 r.append(l) |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
899 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
900 return r |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
901 |
1959
d53a18f592be
add -f/--force to pull, incoming, outgoing, to work on unrelated repo.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1947
diff
changeset
|
902 def findincoming(self, remote, base=None, heads=None, force=False): |
2339
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
903 """Return list of roots of the subsets of missing nodes from remote |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
904 |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
905 If base dict is specified, assume that these nodes and their parents |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
906 exist on the remote side and that no child of a node of base exists |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
907 in both remote and self. |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
908 Furthermore base will be updated to include the nodes that exists |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
909 in self and remote but no children exists in self and remote. |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
910 If a list of heads is specified, return only nodes which are heads |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
911 or ancestors of these heads. |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
912 |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
913 All the ancestors of base are in self and in remote. |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
914 All the descendants of the list returned are missing in self. |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
915 (and so we know that the rest of the nodes are missing in remote, see |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
916 outgoing) |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
917 """ |
65
d40cc5aacc31
Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents:
64
diff
changeset
|
918 m = self.changelog.nodemap |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
919 search = [] |
1072 | 920 fetch = {} |
148
c32286d0a665
Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents:
146
diff
changeset
|
921 seen = {} |
c32286d0a665
Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents:
146
diff
changeset
|
922 seenbranch = {} |
816
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
923 if base == None: |
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
924 base = {} |
192 | 925 |
2108
30c7564f6dfc
Move empty local repo logic for pull into findincoming
Matt Mackall <mpm@selenic.com>
parents:
2107
diff
changeset
|
926 if not heads: |
30c7564f6dfc
Move empty local repo logic for pull into findincoming
Matt Mackall <mpm@selenic.com>
parents:
2107
diff
changeset
|
927 heads = remote.heads() |
30c7564f6dfc
Move empty local repo logic for pull into findincoming
Matt Mackall <mpm@selenic.com>
parents:
2107
diff
changeset
|
928 |
30c7564f6dfc
Move empty local repo logic for pull into findincoming
Matt Mackall <mpm@selenic.com>
parents:
2107
diff
changeset
|
929 if self.changelog.tip() == nullid: |
2339
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
930 base[nullid] = 1 |
2108
30c7564f6dfc
Move empty local repo logic for pull into findincoming
Matt Mackall <mpm@selenic.com>
parents:
2107
diff
changeset
|
931 if heads != [nullid]: |
30c7564f6dfc
Move empty local repo logic for pull into findincoming
Matt Mackall <mpm@selenic.com>
parents:
2107
diff
changeset
|
932 return [nullid] |
30c7564f6dfc
Move empty local repo logic for pull into findincoming
Matt Mackall <mpm@selenic.com>
parents:
2107
diff
changeset
|
933 return [] |
30c7564f6dfc
Move empty local repo logic for pull into findincoming
Matt Mackall <mpm@selenic.com>
parents:
2107
diff
changeset
|
934 |
636
ac0ec421e3a5
Move the empty changeset detection out of findincoming to pull
Matt Mackall <mpm@selenic.com>
parents:
635
diff
changeset
|
935 # assume we're closer to the tip than the root |
579
ffeb2c3a1966
Actually warn on pulling from an unrelated repository
mpm@selenic.com
parents:
578
diff
changeset
|
936 # and start by examining the heads |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
937 self.ui.status(_("searching for changes\n")) |
816
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
938 |
222 | 939 unknown = [] |
940 for h in heads: | |
941 if h not in m: | |
942 unknown.append(h) | |
621
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
943 else: |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
944 base[h] = 1 |
46 | 945 |
222 | 946 if not unknown: |
1895
d7c038e805e9
findincoming should return an iterable
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1893
diff
changeset
|
947 return [] |
324 | 948 |
2339
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
949 req = dict.fromkeys(unknown) |
324 | 950 reqcnt = 0 |
515 | 951 |
579
ffeb2c3a1966
Actually warn on pulling from an unrelated repository
mpm@selenic.com
parents:
578
diff
changeset
|
952 # search through remote branches |
ffeb2c3a1966
Actually warn on pulling from an unrelated repository
mpm@selenic.com
parents:
578
diff
changeset
|
953 # a 'branch' here is a linear segment of history, with four parts: |
ffeb2c3a1966
Actually warn on pulling from an unrelated repository
mpm@selenic.com
parents:
578
diff
changeset
|
954 # head, root, first parent, second parent |
ffeb2c3a1966
Actually warn on pulling from an unrelated repository
mpm@selenic.com
parents:
578
diff
changeset
|
955 # (a branch always has two parents (or none) by definition) |
222 | 956 unknown = remote.branches(unknown) |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
957 while unknown: |
324 | 958 r = [] |
959 while unknown: | |
960 n = unknown.pop(0) | |
961 if n[0] in seen: | |
962 continue | |
148
c32286d0a665
Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents:
146
diff
changeset
|
963 |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
964 self.ui.debug(_("examining %s:%s\n") |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
965 % (short(n[0]), short(n[1]))) |
2339
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
966 if n[0] == nullid: # found the end of the branch |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
967 pass |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
968 elif n in seenbranch: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
969 self.ui.debug(_("branch already found\n")) |
324 | 970 continue |
2339
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
971 elif n[1] and n[1] in m: # do we know the base? |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
972 self.ui.debug(_("found incomplete branch %s:%s\n") |
324 | 973 % (short(n[0]), short(n[1]))) |
974 search.append(n) # schedule branch range for scanning | |
328 | 975 seenbranch[n] = 1 |
324 | 976 else: |
977 if n[1] not in seen and n[1] not in fetch: | |
978 if n[2] in m and n[3] in m: | |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
979 self.ui.debug(_("found new changeset %s\n") % |
324 | 980 short(n[1])) |
1072 | 981 fetch[n[1]] = 1 # earliest unknown |
2339
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
982 for p in n[2:4]: |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
983 if p in m: |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
984 base[p] = 1 # latest known |
324 | 985 |
2339
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
986 for p in n[2:4]: |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
987 if p not in req and p not in m: |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
988 r.append(p) |
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
989 req[p] = 1 |
328 | 990 seen[n[0]] = 1 |
991 | |
324 | 992 if r: |
993 reqcnt += 1 | |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
994 self.ui.debug(_("request %d: %s\n") % |
324 | 995 (reqcnt, " ".join(map(short, r)))) |
996 for p in range(0, len(r), 10): | |
997 for b in remote.branches(r[p:p+10]): | |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
998 self.ui.debug(_("received %s:%s\n") % |
148
c32286d0a665
Improve pruning of branches in outstanding changeset algorithm
mpm@selenic.com
parents:
146
diff
changeset
|
999 (short(b[0]), short(b[1]))) |
2339
11422943cf72
document and fix findincoming
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2335
diff
changeset
|
1000 unknown.append(b) |
515 | 1001 |
579
ffeb2c3a1966
Actually warn on pulling from an unrelated repository
mpm@selenic.com
parents:
578
diff
changeset
|
1002 # do binary search on the branches we found |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1003 while search: |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1004 n = search.pop(0) |
324 | 1005 reqcnt += 1 |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1006 l = remote.between([(n[0], n[1])])[0] |
328 | 1007 l.append(n[1]) |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1008 p = n[0] |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1009 f = 1 |
328 | 1010 for i in l: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1011 self.ui.debug(_("narrowing %d:%d %s\n") % (f, len(l), short(i))) |
65
d40cc5aacc31
Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents:
64
diff
changeset
|
1012 if i in m: |
85 | 1013 if f <= 2: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1014 self.ui.debug(_("found new branch changeset %s\n") % |
83 | 1015 short(p)) |
1072 | 1016 fetch[p] = 1 |
579
ffeb2c3a1966
Actually warn on pulling from an unrelated repository
mpm@selenic.com
parents:
578
diff
changeset
|
1017 base[i] = 1 |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1018 else: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1019 self.ui.debug(_("narrowed branch search to %s:%s\n") |
83 | 1020 % (short(p), short(i))) |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1021 search.append((p, i)) |
65
d40cc5aacc31
Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents:
64
diff
changeset
|
1022 break |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1023 p, f = i, f * 2 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
1024 |
579
ffeb2c3a1966
Actually warn on pulling from an unrelated repository
mpm@selenic.com
parents:
578
diff
changeset
|
1025 # sanity check our fetch list |
1072 | 1026 for f in fetch.keys(): |
65
d40cc5aacc31
Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents:
64
diff
changeset
|
1027 if f in m: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1028 raise repo.RepoError(_("already have changeset ") + short(f[:4])) |
83 | 1029 |
579
ffeb2c3a1966
Actually warn on pulling from an unrelated repository
mpm@selenic.com
parents:
578
diff
changeset
|
1030 if base.keys() == [nullid]: |
1959
d53a18f592be
add -f/--force to pull, incoming, outgoing, to work on unrelated repo.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1947
diff
changeset
|
1031 if force: |
d53a18f592be
add -f/--force to pull, incoming, outgoing, to work on unrelated repo.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1947
diff
changeset
|
1032 self.ui.warn(_("warning: repository is unrelated\n")) |
d53a18f592be
add -f/--force to pull, incoming, outgoing, to work on unrelated repo.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1947
diff
changeset
|
1033 else: |
d53a18f592be
add -f/--force to pull, incoming, outgoing, to work on unrelated repo.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1947
diff
changeset
|
1034 raise util.Abort(_("repository is unrelated")) |
511 | 1035 |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1036 self.ui.note(_("found new changesets starting at ") + |
83 | 1037 " ".join([short(f) for f in fetch]) + "\n") |
65
d40cc5aacc31
Fix up a bunch of bugs in the new merge code
mpm@selenic.com
parents:
64
diff
changeset
|
1038 |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1039 self.ui.debug(_("%d total queries\n") % reqcnt) |
324 | 1040 |
1072 | 1041 return fetch.keys() |
516 | 1042 |
1959
d53a18f592be
add -f/--force to pull, incoming, outgoing, to work on unrelated repo.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1947
diff
changeset
|
1043 def findoutgoing(self, remote, base=None, heads=None, force=False): |
2021
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1044 """Return list of nodes that are roots of subsets not in remote |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1045 |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1046 If base dict is specified, assume that these nodes and their parents |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1047 exist on the remote side. |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1048 If a list of heads is specified, return only nodes which are heads |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1049 or ancestors of these heads, and return a second element which |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1050 contains all remote heads which get new children. |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1051 """ |
816
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
1052 if base == None: |
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
1053 base = {} |
1959
d53a18f592be
add -f/--force to pull, incoming, outgoing, to work on unrelated repo.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1947
diff
changeset
|
1054 self.findincoming(remote, base, heads, force=force) |
816
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
1055 |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1056 self.ui.debug(_("common changesets up to ") |
1072 | 1057 + " ".join(map(short, base.keys())) + "\n") |
1058 | |
621
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1059 remain = dict.fromkeys(self.changelog.nodemap) |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1060 |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1061 # prune everything remote has from the tree |
637
31e090c34d3b
Fix up the broken bits in findoutgoing
Matt Mackall <mpm@selenic.com>
parents:
636
diff
changeset
|
1062 del remain[nullid] |
621
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1063 remove = base.keys() |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1064 while remove: |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1065 n = remove.pop(0) |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1066 if n in remain: |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1067 del remain[n] |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1068 for p in self.changelog.parents(n): |
637
31e090c34d3b
Fix up the broken bits in findoutgoing
Matt Mackall <mpm@selenic.com>
parents:
636
diff
changeset
|
1069 remove.append(p) |
621
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1070 |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1071 # find every node whose parents have been pruned |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1072 subset = [] |
2021
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1073 # find every remote head that will get new children |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1074 updated_heads = {} |
621
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1075 for n in remain: |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1076 p1, p2 = self.changelog.parents(n) |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1077 if p1 not in remain and p2 not in remain: |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1078 subset.append(n) |
2021
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1079 if heads: |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1080 if p1 in heads: |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1081 updated_heads[p1] = True |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1082 if p2 in heads: |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1083 updated_heads[p2] = True |
621
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1084 |
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1085 # this is the set of all roots we have to push |
2021
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1086 if heads: |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1087 return subset, updated_heads.keys() |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1088 else: |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1089 return subset |
621
004e811f7706
Add a function to calculate the outgoing changegroup
Matt Mackall <mpm@selenic.com>
parents:
616
diff
changeset
|
1090 |
1959
d53a18f592be
add -f/--force to pull, incoming, outgoing, to work on unrelated repo.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1947
diff
changeset
|
1091 def pull(self, remote, heads=None, force=False): |
1749
d457fec76ab0
fix warnings from pychecker (unused variables and shadowing)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
1092 l = self.lock() |
636
ac0ec421e3a5
Move the empty changeset detection out of findincoming to pull
Matt Mackall <mpm@selenic.com>
parents:
635
diff
changeset
|
1093 |
2108
30c7564f6dfc
Move empty local repo logic for pull into findincoming
Matt Mackall <mpm@selenic.com>
parents:
2107
diff
changeset
|
1094 fetch = self.findincoming(remote, force=force) |
30c7564f6dfc
Move empty local repo logic for pull into findincoming
Matt Mackall <mpm@selenic.com>
parents:
2107
diff
changeset
|
1095 if fetch == [nullid]: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1096 self.ui.status(_("requesting all changes\n")) |
636
ac0ec421e3a5
Move the empty changeset detection out of findincoming to pull
Matt Mackall <mpm@selenic.com>
parents:
635
diff
changeset
|
1097 |
622
e9fe5d5e67f7
Add generic repo commands for pull and push
Matt Mackall <mpm@selenic.com>
parents:
621
diff
changeset
|
1098 if not fetch: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1099 self.ui.status(_("no changes found\n")) |
2019
ced2d3620f95
add merge command. means same thing as "update -m".
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
1100 return 0 |
622
e9fe5d5e67f7
Add generic repo commands for pull and push
Matt Mackall <mpm@selenic.com>
parents:
621
diff
changeset
|
1101 |
1461
02099220ad49
Implementing clone -r, which clones all changesets needed to reach a
Eric Hopper <hopper@omnifarious.org>
parents:
1460
diff
changeset
|
1102 if heads is None: |
1736
50de0887bbcd
add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1732
diff
changeset
|
1103 cg = remote.changegroup(fetch, 'pull') |
1461
02099220ad49
Implementing clone -r, which clones all changesets needed to reach a
Eric Hopper <hopper@omnifarious.org>
parents:
1460
diff
changeset
|
1104 else: |
1736
50de0887bbcd
add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1732
diff
changeset
|
1105 cg = remote.changegroupsubset(fetch, heads, 'pull') |
2230
332950340788
localrepository.addchangegroup: add more source infos to hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2229
diff
changeset
|
1106 return self.addchangegroup(cg, 'pull') |
622
e9fe5d5e67f7
Add generic repo commands for pull and push
Matt Mackall <mpm@selenic.com>
parents:
621
diff
changeset
|
1107 |
1781
284fc722c342
add an optional argument to push only the specified revisions (push -r)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1713
diff
changeset
|
1108 def push(self, remote, force=False, revs=None): |
2439
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1109 # there are two ways to push to remote repo: |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1110 # |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1111 # addchangegroup assumes local user can lock remote |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1112 # repo (local filesystem, old ssh servers). |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1113 # |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1114 # unbundle assumes local user cannot lock remote repo (new ssh |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1115 # servers, http servers). |
816
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
1116 |
2439
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1117 if 'unbundle' in remote.capabilities: |
2463
6ab016edd5c4
localrepository.push: propagate return value
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1118 return self.push_unbundle(remote, force, revs) |
6ab016edd5c4
localrepository.push: propagate return value
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2448
diff
changeset
|
1119 return self.push_addchangegroup(remote, force, revs) |
2439
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1120 |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1121 def prepush(self, remote, force, revs): |
816
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
1122 base = {} |
2021
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1123 remote_heads = remote.heads() |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1124 inc = self.findincoming(remote, base, remote_heads, force=force) |
816
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
1125 if not force and inc: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1126 self.ui.warn(_("abort: unsynced remote changes!\n")) |
2021
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1127 self.ui.status(_("(did you forget to sync?" |
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1128 " use push -f to force)\n")) |
2439
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1129 return None, 1 |
816
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
1130 |
2021
fc22ed56afe3
Fix hg push and hg push -r sometimes creating new heads without --force.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2020
diff
changeset
|
1131 update, updated_heads = self.findoutgoing(remote, base, remote_heads) |
1781
284fc722c342
add an optional argument to push only the specified revisions (push -r)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1713
diff
changeset
|
1132 if revs is not None: |
284fc722c342
add an optional argument to push only the specified revisions (push -r)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1713
diff
changeset
|
1133 msng_cl, bases, heads = self.changelog.nodesbetween(update, revs) |
284fc722c342
add an optional argument to push only the specified revisions (push -r)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1713
diff
changeset
|
1134 else: |
284fc722c342
add an optional argument to push only the specified revisions (push -r)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1713
diff
changeset
|
1135 bases, heads = update, self.changelog.heads() |
284fc722c342
add an optional argument to push only the specified revisions (push -r)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1713
diff
changeset
|
1136 |
284fc722c342
add an optional argument to push only the specified revisions (push -r)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1713
diff
changeset
|
1137 if not bases: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1138 self.ui.status(_("no changes found\n")) |
2439
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1139 return None, 1 |
816
8674b7803714
Warn on pushing unsynced repo or adding new heads
mpm@selenic.com
parents:
814
diff
changeset
|
1140 elif not force: |
2109
1b183976e007
Revert push new heads logic
Matt Mackall <mpm@selenic.com>
parents:
2108
diff
changeset
|
1141 # FIXME we don't properly detect creation of new heads |
1b183976e007
Revert push new heads logic
Matt Mackall <mpm@selenic.com>
parents:
2108
diff
changeset
|
1142 # in the push -r case, assume the user knows what he's doing |
1b183976e007
Revert push new heads logic
Matt Mackall <mpm@selenic.com>
parents:
2108
diff
changeset
|
1143 if not revs and len(remote_heads) < len(heads) \ |
1b183976e007
Revert push new heads logic
Matt Mackall <mpm@selenic.com>
parents:
2108
diff
changeset
|
1144 and remote_heads != [nullid]: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1145 self.ui.warn(_("abort: push creates new remote branches!\n")) |
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1146 self.ui.status(_("(did you forget to merge?" |
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1147 " use push -f to force)\n")) |
2439
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1148 return None, 1 |
622
e9fe5d5e67f7
Add generic repo commands for pull and push
Matt Mackall <mpm@selenic.com>
parents:
621
diff
changeset
|
1149 |
1781
284fc722c342
add an optional argument to push only the specified revisions (push -r)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1713
diff
changeset
|
1150 if revs is None: |
1782 | 1151 cg = self.changegroup(update, 'push') |
1781
284fc722c342
add an optional argument to push only the specified revisions (push -r)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1713
diff
changeset
|
1152 else: |
1782 | 1153 cg = self.changegroupsubset(update, revs, 'push') |
2439
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1154 return cg, remote_heads |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1155 |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1156 def push_addchangegroup(self, remote, force, revs): |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1157 lock = remote.lock() |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1158 |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1159 ret = self.prepush(remote, force, revs) |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1160 if ret[0] is not None: |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1161 cg, remote_heads = ret |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1162 return remote.addchangegroup(cg, 'push') |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1163 return ret[1] |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1164 |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1165 def push_unbundle(self, remote, force, revs): |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1166 # local repo finds heads on server, finds out what revs it |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1167 # must push. once revs transferred, if server finds it has |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1168 # different heads (someone else won commit/push race), server |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1169 # aborts. |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1170 |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1171 ret = self.prepush(remote, force, revs) |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1172 if ret[0] is not None: |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1173 cg, remote_heads = ret |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1174 if force: remote_heads = ['force'] |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1175 return remote.unbundle(cg, remote_heads, 'push') |
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
1176 return ret[1] |
622
e9fe5d5e67f7
Add generic repo commands for pull and push
Matt Mackall <mpm@selenic.com>
parents:
621
diff
changeset
|
1177 |
1736
50de0887bbcd
add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1732
diff
changeset
|
1178 def changegroupsubset(self, bases, heads, source): |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1179 """This function generates a changegroup consisting of all the nodes |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1180 that are descendents of any of the bases, and ancestors of any of |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1181 the heads. |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1182 |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1183 It is fairly complex as determining which filenodes and which |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1184 manifest nodes need to be included for the changeset to be complete |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1185 is non-trivial. |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1186 |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1187 Another wrinkle is doing the reverse, figuring out which changeset in |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1188 the changegroup a particular filenode or manifestnode belongs to.""" |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1189 |
1736
50de0887bbcd
add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1732
diff
changeset
|
1190 self.hook('preoutgoing', throw=True, source=source) |
50de0887bbcd
add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1732
diff
changeset
|
1191 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1192 # Set up some initial variables |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1193 # Make it easy to refer to self.changelog |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1194 cl = self.changelog |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1195 # msng is short for missing - compute the list of changesets in this |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1196 # changegroup. |
1460
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1197 msng_cl_lst, bases, heads = cl.nodesbetween(bases, heads) |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1198 # Some bases may turn out to be superfluous, and some heads may be |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1199 # too. nodesbetween will return the minimal set of bases and heads |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1200 # necessary to re-create the changegroup. |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1201 |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1202 # Known heads are the list of heads that it is assumed the recipient |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1203 # of this changegroup will know about. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1204 knownheads = {} |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1205 # We assume that all parents of bases are known heads. |
1460
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1206 for n in bases: |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1207 for p in cl.parents(n): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1208 if p != nullid: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1209 knownheads[p] = 1 |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1210 knownheads = knownheads.keys() |
1460
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1211 if knownheads: |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1212 # Now that we know what heads are known, we can compute which |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1213 # changesets are known. The recipient must know about all |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1214 # changesets required to reach the known heads from the null |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1215 # changeset. |
1460
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1216 has_cl_set, junk, junk = cl.nodesbetween(None, knownheads) |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1217 junk = None |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1218 # Transform the list into an ersatz set. |
1464
00117edce2dd
Fixed silly bug involving a non-existent variable.
Eric Hopper <hopper@omnifarious.org>
parents:
1462
diff
changeset
|
1219 has_cl_set = dict.fromkeys(has_cl_set) |
1460
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1220 else: |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1221 # If there were no known heads, the recipient cannot be assumed to |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1222 # know about any changesets. |
1460
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1223 has_cl_set = {} |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1224 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1225 # Make it easy to refer to self.manifest |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1226 mnfst = self.manifest |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1227 # We don't know which manifests are missing yet |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1228 msng_mnfst_set = {} |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1229 # Nor do we know which filenodes are missing. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1230 msng_filenode_set = {} |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1231 |
1460
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1232 junk = mnfst.index[mnfst.count() - 1] # Get around a bug in lazyindex |
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1233 junk = None |
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1234 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1235 # A changeset always belongs to itself, so the changenode lookup |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1236 # function for a changenode is identity. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1237 def identity(x): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1238 return x |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1239 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1240 # A function generating function. Sets up an environment for the |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1241 # inner function. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1242 def cmp_by_rev_func(revlog): |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1243 # Compare two nodes by their revision number in the environment's |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1244 # revision history. Since the revision number both represents the |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1245 # most efficient order to read the nodes in, and represents a |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1246 # topological sorting of the nodes, this function is often useful. |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1247 def cmp_by_rev(a, b): |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1248 return cmp(revlog.rev(a), revlog.rev(b)) |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1249 return cmp_by_rev |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1250 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1251 # If we determine that a particular file or manifest node must be a |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1252 # node that the recipient of the changegroup will already have, we can |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1253 # also assume the recipient will have all the parents. This function |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1254 # prunes them from the set of missing nodes. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1255 def prune_parents(revlog, hasset, msngset): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1256 haslst = hasset.keys() |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1257 haslst.sort(cmp_by_rev_func(revlog)) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1258 for node in haslst: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1259 parentlst = [p for p in revlog.parents(node) if p != nullid] |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1260 while parentlst: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1261 n = parentlst.pop() |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1262 if n not in hasset: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1263 hasset[n] = 1 |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1264 p = [p for p in revlog.parents(n) if p != nullid] |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1265 parentlst.extend(p) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1266 for n in hasset: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1267 msngset.pop(n, None) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1268 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1269 # This is a function generating function used to set up an environment |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1270 # for the inner function to execute in. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1271 def manifest_and_file_collector(changedfileset): |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1272 # This is an information gathering function that gathers |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1273 # information from each changeset node that goes out as part of |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1274 # the changegroup. The information gathered is a list of which |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1275 # manifest nodes are potentially required (the recipient may |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1276 # already have them) and total list of all files which were |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1277 # changed in any changeset in the changegroup. |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1278 # |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1279 # We also remember the first changenode we saw any manifest |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1280 # referenced by so we can later determine which changenode 'owns' |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1281 # the manifest. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1282 def collect_manifests_and_files(clnode): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1283 c = cl.read(clnode) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1284 for f in c[3]: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1285 # This is to make sure we only have one instance of each |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1286 # filename string for each filename. |
1460
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1287 changedfileset.setdefault(f, f) |
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1288 msng_mnfst_set.setdefault(c[0], clnode) |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1289 return collect_manifests_and_files |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1290 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1291 # Figure out which manifest nodes (of the ones we think might be part |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1292 # of the changegroup) the recipient must know about and remove them |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1293 # from the changegroup. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1294 def prune_manifests(): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1295 has_mnfst_set = {} |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1296 for n in msng_mnfst_set: |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1297 # If a 'missing' manifest thinks it belongs to a changenode |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1298 # the recipient is assumed to have, obviously the recipient |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1299 # must have that manifest. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1300 linknode = cl.node(mnfst.linkrev(n)) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1301 if linknode in has_cl_set: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1302 has_mnfst_set[n] = 1 |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1303 prune_parents(mnfst, has_mnfst_set, msng_mnfst_set) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1304 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1305 # Use the information collected in collect_manifests_and_files to say |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1306 # which changenode any manifestnode belongs to. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1307 def lookup_manifest_link(mnfstnode): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1308 return msng_mnfst_set[mnfstnode] |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1309 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1310 # A function generating function that sets up the initial environment |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1311 # the inner function. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1312 def filenode_collector(changedfiles): |
1462
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1313 next_rev = [0] |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1314 # This gathers information from each manifestnode included in the |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1315 # changegroup about which filenodes the manifest node references |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1316 # so we can include those in the changegroup too. |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1317 # |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1318 # It also remembers which changenode each filenode belongs to. It |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1319 # does this by assuming the a filenode belongs to the changenode |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1320 # the first manifest that references it belongs to. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1321 def collect_msng_filenodes(mnfstnode): |
1462
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1322 r = mnfst.rev(mnfstnode) |
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1323 if r == next_rev[0]: |
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1324 # If the last rev we looked at was the one just previous, |
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1325 # we only need to see a diff. |
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1326 delta = mdiff.patchtext(mnfst.delta(mnfstnode)) |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1327 # For each line in the delta |
1462
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1328 for dline in delta.splitlines(): |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1329 # get the filename and filenode for that line |
1462
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1330 f, fnode = dline.split('\0') |
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1331 fnode = bin(fnode[:40]) |
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1332 f = changedfiles.get(f, None) |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1333 # And if the file is in the list of files we care |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1334 # about. |
1462
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1335 if f is not None: |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1336 # Get the changenode this manifest belongs to |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1337 clnode = msng_mnfst_set[mnfstnode] |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1338 # Create the set of filenodes for the file if |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1339 # there isn't one already. |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1340 ndset = msng_filenode_set.setdefault(f, {}) |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1341 # And set the filenode's changelog node to the |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1342 # manifest's if it hasn't been set already. |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1343 ndset.setdefault(fnode, clnode) |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1344 else: |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1345 # Otherwise we need a full manifest. |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1346 m = mnfst.read(mnfstnode) |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1347 # For every file in we care about. |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1348 for f in changedfiles: |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1349 fnode = m.get(f, None) |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1350 # If it's in the manifest |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1351 if fnode is not None: |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1352 # See comments above. |
1462
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1353 clnode = msng_mnfst_set[mnfstnode] |
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1354 ndset = msng_filenode_set.setdefault(f, {}) |
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1355 ndset.setdefault(fnode, clnode) |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1356 # Remember the revision we hope to see next. |
1462
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1357 next_rev[0] = r + 1 |
1460
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1358 return collect_msng_filenodes |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1359 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1360 # We have a list of filenodes we think we need for a file, lets remove |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1361 # all those we now the recipient must have. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1362 def prune_filenodes(f, filerevlog): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1363 msngset = msng_filenode_set[f] |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1364 hasset = {} |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1365 # If a 'missing' filenode thinks it belongs to a changenode we |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1366 # assume the recipient must have, then the recipient must have |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1367 # that filenode. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1368 for n in msngset: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1369 clnode = cl.node(filerevlog.linkrev(n)) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1370 if clnode in has_cl_set: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1371 hasset[n] = 1 |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1372 prune_parents(filerevlog, hasset, msngset) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1373 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1374 # A function generator function that sets up the a context for the |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1375 # inner function. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1376 def lookup_filenode_link_func(fname): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1377 msngset = msng_filenode_set[fname] |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1378 # Lookup the changenode the filenode belongs to. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1379 def lookup_filenode_link(fnode): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1380 return msngset[fnode] |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1381 return lookup_filenode_link |
515 | 1382 |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1383 # Now that we have all theses utility functions to help out and |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1384 # logically divide up the task, generate the group. |
635
85e2209d401c
Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents:
634
diff
changeset
|
1385 def gengroup(): |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1386 # The set of changed files starts empty. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1387 changedfiles = {} |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1388 # Create a changenode group generator that will call our functions |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1389 # back to lookup the owning changenode and collect information. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1390 group = cl.group(msng_cl_lst, identity, |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1391 manifest_and_file_collector(changedfiles)) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1392 for chnk in group: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1393 yield chnk |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1394 |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1395 # The list of manifests has been collected by the generator |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1396 # calling our functions back. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1397 prune_manifests() |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1398 msng_mnfst_lst = msng_mnfst_set.keys() |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1399 # Sort the manifestnodes by revision number. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1400 msng_mnfst_lst.sort(cmp_by_rev_func(mnfst)) |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1401 # Create a generator for the manifestnodes that calls our lookup |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1402 # and data collection functions back. |
1460
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1403 group = mnfst.group(msng_mnfst_lst, lookup_manifest_link, |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1404 filenode_collector(changedfiles)) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1405 for chnk in group: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1406 yield chnk |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1407 |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1408 # These are no longer needed, dereference and toss the memory for |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1409 # them. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1410 msng_mnfst_lst = None |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1411 msng_mnfst_set.clear() |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1412 |
1462
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1413 changedfiles = changedfiles.keys() |
12a8d772fa32
Optimizing manifest reads in changegroupsubset by using deltas.
Eric Hopper <hopper@omnifarious.org>
parents:
1461
diff
changeset
|
1414 changedfiles.sort() |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1415 # Go through all our files in order sorted by name. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1416 for fname in changedfiles: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1417 filerevlog = self.file(fname) |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1418 # Toss out the filenodes that the recipient isn't really |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1419 # missing. |
1630
5ecf05541e11
This fixes a bug that Chris Mason found. As for a test case, I can't
Eric Hopper <hopper@omnifarious.org>
parents:
1621
diff
changeset
|
1420 if msng_filenode_set.has_key(fname): |
5ecf05541e11
This fixes a bug that Chris Mason found. As for a test case, I can't
Eric Hopper <hopper@omnifarious.org>
parents:
1621
diff
changeset
|
1421 prune_filenodes(fname, filerevlog) |
5ecf05541e11
This fixes a bug that Chris Mason found. As for a test case, I can't
Eric Hopper <hopper@omnifarious.org>
parents:
1621
diff
changeset
|
1422 msng_filenode_lst = msng_filenode_set[fname].keys() |
5ecf05541e11
This fixes a bug that Chris Mason found. As for a test case, I can't
Eric Hopper <hopper@omnifarious.org>
parents:
1621
diff
changeset
|
1423 else: |
5ecf05541e11
This fixes a bug that Chris Mason found. As for a test case, I can't
Eric Hopper <hopper@omnifarious.org>
parents:
1621
diff
changeset
|
1424 msng_filenode_lst = [] |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1425 # If any filenodes are left, generate the group for them, |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1426 # otherwise don't bother. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1427 if len(msng_filenode_lst) > 0: |
1981
736b6c96bbbc
make incoming work via ssh (issue139); move chunk code into separate module.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1967
diff
changeset
|
1428 yield changegroup.genchunk(fname) |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1429 # Sort the filenodes by their revision # |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1430 msng_filenode_lst.sort(cmp_by_rev_func(filerevlog)) |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1431 # Create a group generator and only pass in a changenode |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1432 # lookup function as we need to collect no information |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1433 # from filenodes. |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1434 group = filerevlog.group(msng_filenode_lst, |
1460
40d08cf1c544
Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
Eric Hopper <hopper@omnifarious.org>
parents:
1458
diff
changeset
|
1435 lookup_filenode_link_func(fname)) |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1436 for chnk in group: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1437 yield chnk |
1630
5ecf05541e11
This fixes a bug that Chris Mason found. As for a test case, I can't
Eric Hopper <hopper@omnifarious.org>
parents:
1621
diff
changeset
|
1438 if msng_filenode_set.has_key(fname): |
5ecf05541e11
This fixes a bug that Chris Mason found. As for a test case, I can't
Eric Hopper <hopper@omnifarious.org>
parents:
1621
diff
changeset
|
1439 # Don't need this anymore, toss it to free memory. |
5ecf05541e11
This fixes a bug that Chris Mason found. As for a test case, I can't
Eric Hopper <hopper@omnifarious.org>
parents:
1621
diff
changeset
|
1440 del msng_filenode_set[fname] |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1441 # Signal that no more groups are left. |
1981
736b6c96bbbc
make incoming work via ssh (issue139); move chunk code into separate module.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1967
diff
changeset
|
1442 yield changegroup.closechunk() |
635
85e2209d401c
Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents:
634
diff
changeset
|
1443 |
2150
f15c6394d90d
fix a NameError in changegroupsubset
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2149
diff
changeset
|
1444 if msng_cl_lst: |
2149
43ce1c17e644
allow to pull from an empty repo without getting a backtrace
Vincent Danjean <vdanjean@free.fr>
parents:
2143
diff
changeset
|
1445 self.hook('outgoing', node=hex(msng_cl_lst[0]), source=source) |
1736
50de0887bbcd
add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1732
diff
changeset
|
1446 |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1447 return util.chunkbuffer(gengroup()) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1448 |
1736
50de0887bbcd
add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1732
diff
changeset
|
1449 def changegroup(self, basenodes, source): |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1450 """Generate a changegroup of all nodes that we have that a recipient |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1451 doesn't. |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1452 |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1453 This is much easier than the previous function as we can assume that |
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
1454 the recipient has any changenode we aren't sending them.""" |
1736
50de0887bbcd
add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1732
diff
changeset
|
1455 |
50de0887bbcd
add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1732
diff
changeset
|
1456 self.hook('preoutgoing', throw=True, source=source) |
50de0887bbcd
add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1732
diff
changeset
|
1457 |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1458 cl = self.changelog |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1459 nodes = cl.nodesbetween(basenodes, None)[0] |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1460 revset = dict.fromkeys([cl.rev(n) for n in nodes]) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1461 |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1462 def identity(x): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1463 return x |
635
85e2209d401c
Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents:
634
diff
changeset
|
1464 |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1465 def gennodelst(revlog): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1466 for r in xrange(0, revlog.count()): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1467 n = revlog.node(r) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1468 if revlog.linkrev(n) in revset: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1469 yield n |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1470 |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1471 def changed_file_collector(changedfileset): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1472 def collect_changed_files(clnode): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1473 c = cl.read(clnode) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1474 for fname in c[3]: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1475 changedfileset[fname] = 1 |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1476 return collect_changed_files |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1477 |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1478 def lookuprevlink_func(revlog): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1479 def lookuprevlink(n): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1480 return cl.node(revlog.linkrev(n)) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1481 return lookuprevlink |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1482 |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1483 def gengroup(): |
635
85e2209d401c
Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents:
634
diff
changeset
|
1484 # construct a list of all changed files |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1485 changedfiles = {} |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1486 |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1487 for chnk in cl.group(nodes, identity, |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1488 changed_file_collector(changedfiles)): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1489 yield chnk |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1490 changedfiles = changedfiles.keys() |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1491 changedfiles.sort() |
635
85e2209d401c
Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents:
634
diff
changeset
|
1492 |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1493 mnfst = self.manifest |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1494 nodeiter = gennodelst(mnfst) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1495 for chnk in mnfst.group(nodeiter, lookuprevlink_func(mnfst)): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1496 yield chnk |
635
85e2209d401c
Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents:
634
diff
changeset
|
1497 |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1498 for fname in changedfiles: |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1499 filerevlog = self.file(fname) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1500 nodeiter = gennodelst(filerevlog) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1501 nodeiter = list(nodeiter) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1502 if nodeiter: |
1981
736b6c96bbbc
make incoming work via ssh (issue139); move chunk code into separate module.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1967
diff
changeset
|
1503 yield changegroup.genchunk(fname) |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1504 lookup = lookuprevlink_func(filerevlog) |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1505 for chnk in filerevlog.group(nodeiter, lookup): |
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1506 yield chnk |
635
85e2209d401c
Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents:
634
diff
changeset
|
1507 |
1981
736b6c96bbbc
make incoming work via ssh (issue139); move chunk code into separate module.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1967
diff
changeset
|
1508 yield changegroup.closechunk() |
2107
7ff92c04f8e5
Don't die calling outgoing hook if we have no changesets
Matt Mackall <mpm@selenic.com>
parents:
2098
diff
changeset
|
1509 |
7ff92c04f8e5
Don't die calling outgoing hook if we have no changesets
Matt Mackall <mpm@selenic.com>
parents:
2098
diff
changeset
|
1510 if nodes: |
7ff92c04f8e5
Don't die calling outgoing hook if we have no changesets
Matt Mackall <mpm@selenic.com>
parents:
2098
diff
changeset
|
1511 self.hook('outgoing', node=hex(nodes[0]), source=source) |
635
85e2209d401c
Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents:
634
diff
changeset
|
1512 |
1458
1033892bbb87
This changes the revlog.group and re-implements the localrepo.changeroup
Eric Hopper <hopper@omnifarious.org>
parents:
1457
diff
changeset
|
1513 return util.chunkbuffer(gengroup()) |
635
85e2209d401c
Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents:
634
diff
changeset
|
1514 |
2230
332950340788
localrepository.addchangegroup: add more source infos to hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2229
diff
changeset
|
1515 def addchangegroup(self, source, srctype): |
2019
ced2d3620f95
add merge command. means same thing as "update -m".
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
1516 """add changegroup to repo. |
ced2d3620f95
add merge command. means same thing as "update -m".
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
1517 returns number of heads modified or added + 1.""" |
635
85e2209d401c
Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents:
634
diff
changeset
|
1518 |
222 | 1519 def csmap(x): |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1520 self.ui.debug(_("add changeset %s\n") % short(x)) |
1998
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1521 return cl.count() |
222 | 1522 |
1523 def revmap(x): | |
1998
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1524 return cl.rev(x) |
222 | 1525 |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1526 if not source: |
2019
ced2d3620f95
add merge command. means same thing as "update -m".
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
1527 return 0 |
1730
0f1d2c75db5e
add prechangegroup and pretxnchangegroup hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1721
diff
changeset
|
1528 |
2230
332950340788
localrepository.addchangegroup: add more source infos to hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2229
diff
changeset
|
1529 self.hook('prechangegroup', throw=True, source=srctype) |
1730
0f1d2c75db5e
add prechangegroup and pretxnchangegroup hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1721
diff
changeset
|
1530 |
222 | 1531 changesets = files = revisions = 0 |
225 | 1532 |
222 | 1533 tr = self.transaction() |
1534 | |
2395
8ed45fb1053a
remove appendfile for the manifest when adding a changegroup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2362
diff
changeset
|
1535 # write changelog data to temp files so concurrent readers will not see |
8ed45fb1053a
remove appendfile for the manifest when adding a changegroup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2362
diff
changeset
|
1536 # inconsistent view |
2232
ef3c039e7ab8
Always remove appendopener tmp files (fixes issue235).
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2230
diff
changeset
|
1537 cl = None |
ef3c039e7ab8
Always remove appendopener tmp files (fixes issue235).
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2230
diff
changeset
|
1538 try: |
ef3c039e7ab8
Always remove appendopener tmp files (fixes issue235).
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2230
diff
changeset
|
1539 cl = appendfile.appendchangelog(self.opener, self.changelog.version) |
1998
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1540 |
2232
ef3c039e7ab8
Always remove appendopener tmp files (fixes issue235).
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2230
diff
changeset
|
1541 oldheads = len(cl.heads()) |
1040
35e883d1ff9b
Show number of new heads when doing a pull
mpm@selenic.com
parents:
1019
diff
changeset
|
1542 |
2232
ef3c039e7ab8
Always remove appendopener tmp files (fixes issue235).
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2230
diff
changeset
|
1543 # pull off the changeset group |
ef3c039e7ab8
Always remove appendopener tmp files (fixes issue235).
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2230
diff
changeset
|
1544 self.ui.status(_("adding changesets\n")) |
2347
5b178298b7f4
use a more reliable way to find what are the new changesets on pull/unbundle
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2346
diff
changeset
|
1545 cor = cl.count() - 1 |
2232
ef3c039e7ab8
Always remove appendopener tmp files (fixes issue235).
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2230
diff
changeset
|
1546 chunkiter = changegroup.chunkiter(source) |
2354
16276b1c0658
Manifest groups may be empty, so don't abort in this case (fixes issue210).
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2347
diff
changeset
|
1547 if cl.addgroup(chunkiter, csmap, tr, 1) is None: |
16276b1c0658
Manifest groups may be empty, so don't abort in this case (fixes issue210).
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2347
diff
changeset
|
1548 raise util.Abort(_("received changelog group is empty")) |
2347
5b178298b7f4
use a more reliable way to find what are the new changesets on pull/unbundle
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2346
diff
changeset
|
1549 cnr = cl.count() - 1 |
2232
ef3c039e7ab8
Always remove appendopener tmp files (fixes issue235).
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2230
diff
changeset
|
1550 changesets = cnr - cor |
222 | 1551 |
2395
8ed45fb1053a
remove appendfile for the manifest when adding a changegroup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2362
diff
changeset
|
1552 # pull off the manifest group |
8ed45fb1053a
remove appendfile for the manifest when adding a changegroup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2362
diff
changeset
|
1553 self.ui.status(_("adding manifests\n")) |
8ed45fb1053a
remove appendfile for the manifest when adding a changegroup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2362
diff
changeset
|
1554 chunkiter = changegroup.chunkiter(source) |
8ed45fb1053a
remove appendfile for the manifest when adding a changegroup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2362
diff
changeset
|
1555 # no need to check for empty manifest group here: |
8ed45fb1053a
remove appendfile for the manifest when adding a changegroup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2362
diff
changeset
|
1556 # if the result of the merge of 1 and 2 is the same in 3 and 4, |
8ed45fb1053a
remove appendfile for the manifest when adding a changegroup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2362
diff
changeset
|
1557 # no new manifest will be created and the manifest group will |
8ed45fb1053a
remove appendfile for the manifest when adding a changegroup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2362
diff
changeset
|
1558 # be empty during the pull |
8ed45fb1053a
remove appendfile for the manifest when adding a changegroup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2362
diff
changeset
|
1559 self.manifest.addgroup(chunkiter, revmap, tr) |
222 | 1560 |
2395
8ed45fb1053a
remove appendfile for the manifest when adding a changegroup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2362
diff
changeset
|
1561 # process the files |
8ed45fb1053a
remove appendfile for the manifest when adding a changegroup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2362
diff
changeset
|
1562 self.ui.status(_("adding file changes\n")) |
8ed45fb1053a
remove appendfile for the manifest when adding a changegroup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2362
diff
changeset
|
1563 while 1: |
8ed45fb1053a
remove appendfile for the manifest when adding a changegroup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2362
diff
changeset
|
1564 f = changegroup.getchunk(source) |
8ed45fb1053a
remove appendfile for the manifest when adding a changegroup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2362
diff
changeset
|
1565 if not f: |
8ed45fb1053a
remove appendfile for the manifest when adding a changegroup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2362
diff
changeset
|
1566 break |
8ed45fb1053a
remove appendfile for the manifest when adding a changegroup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2362
diff
changeset
|
1567 self.ui.debug(_("adding %s revisions\n") % f) |
8ed45fb1053a
remove appendfile for the manifest when adding a changegroup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2362
diff
changeset
|
1568 fl = self.file(f) |
8ed45fb1053a
remove appendfile for the manifest when adding a changegroup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2362
diff
changeset
|
1569 o = fl.count() |
8ed45fb1053a
remove appendfile for the manifest when adding a changegroup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2362
diff
changeset
|
1570 chunkiter = changegroup.chunkiter(source) |
8ed45fb1053a
remove appendfile for the manifest when adding a changegroup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2362
diff
changeset
|
1571 if fl.addgroup(chunkiter, revmap, tr) is None: |
8ed45fb1053a
remove appendfile for the manifest when adding a changegroup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2362
diff
changeset
|
1572 raise util.Abort(_("received file revlog group is empty")) |
8ed45fb1053a
remove appendfile for the manifest when adding a changegroup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2362
diff
changeset
|
1573 revisions += fl.count() - o |
8ed45fb1053a
remove appendfile for the manifest when adding a changegroup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2362
diff
changeset
|
1574 files += 1 |
222 | 1575 |
2232
ef3c039e7ab8
Always remove appendopener tmp files (fixes issue235).
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2230
diff
changeset
|
1576 cl.writedata() |
ef3c039e7ab8
Always remove appendopener tmp files (fixes issue235).
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2230
diff
changeset
|
1577 finally: |
ef3c039e7ab8
Always remove appendopener tmp files (fixes issue235).
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2230
diff
changeset
|
1578 if cl: |
ef3c039e7ab8
Always remove appendopener tmp files (fixes issue235).
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2230
diff
changeset
|
1579 cl.cleanup() |
1998
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1580 |
2395
8ed45fb1053a
remove appendfile for the manifest when adding a changegroup
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2362
diff
changeset
|
1581 # make changelog see real files again |
2082
856f0ba200bc
Additional appendfile fixes for interleaved data/index files
mason@suse.com
parents:
2075
diff
changeset
|
1582 self.changelog = changelog.changelog(self.opener, self.changelog.version) |
2075
343aeefb553b
Make the appendfile class inline-data index friendly
mason@suse.com
parents:
2073
diff
changeset
|
1583 self.changelog.checkinlinesize(tr) |
1998
65cc17ae9649
fix race in localrepo.addchangegroup.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1995
diff
changeset
|
1584 |
1040
35e883d1ff9b
Show number of new heads when doing a pull
mpm@selenic.com
parents:
1019
diff
changeset
|
1585 newheads = len(self.changelog.heads()) |
35e883d1ff9b
Show number of new heads when doing a pull
mpm@selenic.com
parents:
1019
diff
changeset
|
1586 heads = "" |
2424
092039246d73
Report on push/pull if heads are merged, too, like for new heads.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2395
diff
changeset
|
1587 if oldheads and newheads != oldheads: |
092039246d73
Report on push/pull if heads are merged, too, like for new heads.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2395
diff
changeset
|
1588 heads = _(" (%+d heads)") % (newheads - oldheads) |
1040
35e883d1ff9b
Show number of new heads when doing a pull
mpm@selenic.com
parents:
1019
diff
changeset
|
1589 |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1590 self.ui.status(_("added %d changesets" |
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1591 " with %d changes to %d files%s\n") |
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1592 % (changesets, revisions, files, heads)) |
222 | 1593 |
2259
181b0643ffb1
fix a traceback when unbundling does not add any changesets
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2232
diff
changeset
|
1594 if changesets > 0: |
181b0643ffb1
fix a traceback when unbundling does not add any changesets
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2232
diff
changeset
|
1595 self.hook('pretxnchangegroup', throw=True, |
181b0643ffb1
fix a traceback when unbundling does not add any changesets
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2232
diff
changeset
|
1596 node=hex(self.changelog.node(cor+1)), source=srctype) |
1730
0f1d2c75db5e
add prechangegroup and pretxnchangegroup hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1721
diff
changeset
|
1597 |
222 | 1598 tr.close() |
780 | 1599 |
1375
f2b00be33e2c
Fix traceback when nothing was added during unbundle
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1353
diff
changeset
|
1600 if changesets > 0: |
2229
0ff326c2b286
changegroup hooks: add source to hook parameters
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2222
diff
changeset
|
1601 self.hook("changegroup", node=hex(self.changelog.node(cor+1)), |
2230
332950340788
localrepository.addchangegroup: add more source infos to hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2229
diff
changeset
|
1602 source=srctype) |
780 | 1603 |
1375
f2b00be33e2c
Fix traceback when nothing was added during unbundle
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1353
diff
changeset
|
1604 for i in range(cor + 1, cnr + 1): |
2229
0ff326c2b286
changegroup hooks: add source to hook parameters
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2222
diff
changeset
|
1605 self.hook("incoming", node=hex(self.changelog.node(i)), |
2230
332950340788
localrepository.addchangegroup: add more source infos to hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2229
diff
changeset
|
1606 source=srctype) |
1316 | 1607 |
2019
ced2d3620f95
add merge command. means same thing as "update -m".
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
1608 return newheads - oldheads + 1 |
ced2d3620f95
add merge command. means same thing as "update -m".
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
1609 |
588 | 1610 def update(self, node, allow=False, force=False, choose=None, |
2175
b2ae81a7df29
Make hg update more verbose by default (issue12)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2167
diff
changeset
|
1611 moddirstate=True, forcemerge=False, wlock=None, show_stats=True): |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1612 pl = self.dirstate.parents() |
275 | 1613 if not force and pl[1] != nullid: |
2264
fdb699b5e132
localrepo.update: abort if outstanding merges, instead of warn/return 1
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2259
diff
changeset
|
1614 raise util.Abort(_("outstanding uncommitted merges")) |
46 | 1615 |
1663
d529cdc0a3ee
return a non-zero exit code when a merge failed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1645
diff
changeset
|
1616 err = False |
d529cdc0a3ee
return a non-zero exit code when a merge failed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1645
diff
changeset
|
1617 |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1618 p1, p2 = pl[0], node |
305 | 1619 pa = self.changelog.ancestor(p1, p2) |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1620 m1n = self.changelog.read(p1)[0] |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1621 m2n = self.changelog.read(p2)[0] |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1622 man = self.manifest.ancestor(m1n, m2n) |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1623 m1 = self.manifest.read(m1n) |
276 | 1624 mf1 = self.manifest.readflags(m1n) |
1629
3024cacfb2c9
Copy manifest map before modifying it (see issue86)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1621
diff
changeset
|
1625 m2 = self.manifest.read(m2n).copy() |
276 | 1626 mf2 = self.manifest.readflags(m2n) |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1627 ma = self.manifest.read(man) |
412 | 1628 mfa = self.manifest.readflags(man) |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1629 |
1619
1ba0d7041ac4
Distinguish removed and deleted files. Tests are not fixed yet.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1618
diff
changeset
|
1630 modified, added, removed, deleted, unknown = self.changes() |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1631 |
1674
dee55c4a4963
abort when using 'update -m' and this is not a merge
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1667
diff
changeset
|
1632 # is this a jump, or a merge? i.e. is there a linear path |
dee55c4a4963
abort when using 'update -m' and this is not a merge
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1667
diff
changeset
|
1633 # from p1 to p2? |
dee55c4a4963
abort when using 'update -m' and this is not a merge
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1667
diff
changeset
|
1634 linear_path = (pa == p1 or pa == p2) |
dee55c4a4963
abort when using 'update -m' and this is not a merge
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1667
diff
changeset
|
1635 |
dee55c4a4963
abort when using 'update -m' and this is not a merge
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1667
diff
changeset
|
1636 if allow and linear_path: |
dee55c4a4963
abort when using 'update -m' and this is not a merge
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1667
diff
changeset
|
1637 raise util.Abort(_("there is nothing to merge, " |
dee55c4a4963
abort when using 'update -m' and this is not a merge
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1667
diff
changeset
|
1638 "just use 'hg update'")) |
1581
db10b7114de0
abort when merging two heads and repository has local changes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
1639 if allow and not forcemerge: |
1618
ff339dd21976
Renamed c, a, d, u to modified, added, removed, unknown for users of changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1617
diff
changeset
|
1640 if modified or added or removed: |
1995
2da2d46862fb
Spelling fix: "commited" -> "committed"
mcmillen@cs.cmu.edu
parents:
1986
diff
changeset
|
1641 raise util.Abort(_("outstanding uncommitted changes")) |
2266
3f7692b0ff13
hooks: add preupdate and update hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2264
diff
changeset
|
1642 |
1581
db10b7114de0
abort when merging two heads and repository has local changes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
1643 if not forcemerge and not force: |
1618
ff339dd21976
Renamed c, a, d, u to modified, added, removed, unknown for users of changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1617
diff
changeset
|
1644 for f in unknown: |
1581
db10b7114de0
abort when merging two heads and repository has local changes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
1645 if f in m2: |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1646 t1 = self.wread(f) |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1647 t2 = self.file(f).read(m2[f]) |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1648 if cmp(t1, t2) != 0: |
1581
db10b7114de0
abort when merging two heads and repository has local changes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
1649 raise util.Abort(_("'%s' already exists in the working" |
db10b7114de0
abort when merging two heads and repository has local changes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
1650 " dir and differs from remote") % f) |
db10b7114de0
abort when merging two heads and repository has local changes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
1651 |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1652 # resolve the manifest to determine which files |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1653 # we care about merging |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1654 self.ui.note(_("resolving manifests\n")) |
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1655 self.ui.debug(_(" force %s allow %s moddirstate %s linear %s\n") % |
650
2c934c7b79dc
Fix bug in reverting deleted files
Matt Mackall <mpm@selenic.com>
parents:
649
diff
changeset
|
1656 (force, allow, moddirstate, linear_path)) |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1657 self.ui.debug(_(" ancestor %s local %s remote %s\n") % |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1658 (short(man), short(m1n), short(m2n))) |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1659 |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1660 merge = {} |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1661 get = {} |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1662 remove = [] |
46 | 1663 |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1664 # construct a working dir manifest |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1665 mw = m1.copy() |
276 | 1666 mfw = mf1.copy() |
1618
ff339dd21976
Renamed c, a, d, u to modified, added, removed, unknown for users of changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1617
diff
changeset
|
1667 umap = dict.fromkeys(unknown) |
576 | 1668 |
1618
ff339dd21976
Renamed c, a, d, u to modified, added, removed, unknown for users of changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1617
diff
changeset
|
1669 for f in added + modified + unknown: |
254 | 1670 mw[f] = "" |
441 | 1671 mfw[f] = util.is_exec(self.wjoin(f), mfw.get(f, False)) |
576 | 1672 |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
1673 if moddirstate and not wlock: |
1531
2ba8bf7defda
add localrepo.wlock for protecting the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1516
diff
changeset
|
1674 wlock = self.wlock() |
2ba8bf7defda
add localrepo.wlock for protecting the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1516
diff
changeset
|
1675 |
1621
ee16f06174bd
Restored old behaviour for 'hg co' and 'hg co -C' for removed files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1619
diff
changeset
|
1676 for f in deleted + removed: |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1677 if f in mw: |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1678 del mw[f] |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1679 |
408
3695fbd2c33b
[PATCH] Merging files that are deleted in both branches
mpm@selenic.com
parents:
407
diff
changeset
|
1680 # If we're jumping between revisions (as opposed to merging), |
3695fbd2c33b
[PATCH] Merging files that are deleted in both branches
mpm@selenic.com
parents:
407
diff
changeset
|
1681 # and if neither the working directory nor the target rev has |
3695fbd2c33b
[PATCH] Merging files that are deleted in both branches
mpm@selenic.com
parents:
407
diff
changeset
|
1682 # the file, then we need to remove it from the dirstate, to |
3695fbd2c33b
[PATCH] Merging files that are deleted in both branches
mpm@selenic.com
parents:
407
diff
changeset
|
1683 # prevent the dirstate from listing the file when it is no |
3695fbd2c33b
[PATCH] Merging files that are deleted in both branches
mpm@selenic.com
parents:
407
diff
changeset
|
1684 # longer in the manifest. |
588 | 1685 if moddirstate and linear_path and f not in m2: |
408
3695fbd2c33b
[PATCH] Merging files that are deleted in both branches
mpm@selenic.com
parents:
407
diff
changeset
|
1686 self.dirstate.forget((f,)) |
3695fbd2c33b
[PATCH] Merging files that are deleted in both branches
mpm@selenic.com
parents:
407
diff
changeset
|
1687 |
576 | 1688 # Compare manifests |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1689 for f, n in mw.iteritems(): |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1690 if choose and not choose(f): |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1691 continue |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1692 if f in m2: |
277
79279550c8ff
merge: update permissions even if file contents didn't change
mpm@selenic.com
parents:
276
diff
changeset
|
1693 s = 0 |
79279550c8ff
merge: update permissions even if file contents didn't change
mpm@selenic.com
parents:
276
diff
changeset
|
1694 |
407
0e0d0670b2bc
[PATCH] Merging identical changes from another branch
mpm@selenic.com
parents:
405
diff
changeset
|
1695 # is the wfile new since m1, and match m2? |
428 | 1696 if f not in m1: |
1019
a9cca981c423
Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents:
1013
diff
changeset
|
1697 t1 = self.wread(f) |
994
88c15682d9b0
Fix callers to file.revision to use file.read
mpm@selenic.com
parents:
993
diff
changeset
|
1698 t2 = self.file(f).read(m2[f]) |
407
0e0d0670b2bc
[PATCH] Merging identical changes from another branch
mpm@selenic.com
parents:
405
diff
changeset
|
1699 if cmp(t1, t2) == 0: |
0e0d0670b2bc
[PATCH] Merging identical changes from another branch
mpm@selenic.com
parents:
405
diff
changeset
|
1700 n = m2[f] |
0e0d0670b2bc
[PATCH] Merging identical changes from another branch
mpm@selenic.com
parents:
405
diff
changeset
|
1701 del t1, t2 |
0e0d0670b2bc
[PATCH] Merging identical changes from another branch
mpm@selenic.com
parents:
405
diff
changeset
|
1702 |
296
a3d83bf86755
hg update: fix clobbering files when going backwards
mpm@selenic.com
parents:
292
diff
changeset
|
1703 # are files different? |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1704 if n != m2[f]: |
254 | 1705 a = ma.get(f, nullid) |
296
a3d83bf86755
hg update: fix clobbering files when going backwards
mpm@selenic.com
parents:
292
diff
changeset
|
1706 # are both different from the ancestor? |
254 | 1707 if n != a and m2[f] != a: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1708 self.ui.debug(_(" %s versions differ, resolve\n") % f) |
276 | 1709 # merge executable bits |
1710 # "if we changed or they changed, change in merge" | |
1711 a, b, c = mfa.get(f, 0), mfw[f], mf2[f] | |
1712 mode = ((a^b) | (a^c)) ^ a | |
1713 merge[f] = (m1.get(f, nullid), m2[f], mode) | |
277
79279550c8ff
merge: update permissions even if file contents didn't change
mpm@selenic.com
parents:
276
diff
changeset
|
1714 s = 1 |
305 | 1715 # are we clobbering? |
1716 # is remote's version newer? | |
1717 # or are we going back in time? | |
1718 elif force or m2[f] != a or (p2 == pa and mw[f] == m1[f]): | |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1719 self.ui.debug(_(" remote %s is newer, get\n") % f) |
254 | 1720 get[f] = m2[f] |
277
79279550c8ff
merge: update permissions even if file contents didn't change
mpm@selenic.com
parents:
276
diff
changeset
|
1721 s = 1 |
2065
2ff37e3bf780
fix update when a locally added file match the target revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2042
diff
changeset
|
1722 elif f in umap or f in added: |
576 | 1723 # this unknown file is the same as the checkout |
2065
2ff37e3bf780
fix update when a locally added file match the target revision
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2042
diff
changeset
|
1724 # we need to reset the dirstate if the file was added |
576 | 1725 get[f] = m2[f] |
277
79279550c8ff
merge: update permissions even if file contents didn't change
mpm@selenic.com
parents:
276
diff
changeset
|
1726 |
79279550c8ff
merge: update permissions even if file contents didn't change
mpm@selenic.com
parents:
276
diff
changeset
|
1727 if not s and mfw[f] != mf2[f]: |
79279550c8ff
merge: update permissions even if file contents didn't change
mpm@selenic.com
parents:
276
diff
changeset
|
1728 if force: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1729 self.ui.debug(_(" updating permissions for %s\n") % f) |
441 | 1730 util.set_exec(self.wjoin(f), mf2[f]) |
277
79279550c8ff
merge: update permissions even if file contents didn't change
mpm@selenic.com
parents:
276
diff
changeset
|
1731 else: |
79279550c8ff
merge: update permissions even if file contents didn't change
mpm@selenic.com
parents:
276
diff
changeset
|
1732 a, b, c = mfa.get(f, 0), mfw[f], mf2[f] |
79279550c8ff
merge: update permissions even if file contents didn't change
mpm@selenic.com
parents:
276
diff
changeset
|
1733 mode = ((a^b) | (a^c)) ^ a |
79279550c8ff
merge: update permissions even if file contents didn't change
mpm@selenic.com
parents:
276
diff
changeset
|
1734 if mode != b: |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1735 self.ui.debug(_(" updating permissions for %s\n") |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1736 % f) |
441 | 1737 util.set_exec(self.wjoin(f), mode) |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1738 del m2[f] |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1739 elif f in ma: |
616 | 1740 if n != ma[f]: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1741 r = _("d") |
616 | 1742 if not force and (linear_path or allow): |
415
c2b9502a4e96
[PATCH] Don't prompt user for keep-vs-delete when the merge is about to be aborted
mpm@selenic.com
parents:
413
diff
changeset
|
1743 r = self.ui.prompt( |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1744 (_(" local changed %s which remote deleted\n") % f) + |
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1745 _("(k)eep or (d)elete?"), _("[kd]"), _("k")) |
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1746 if r == _("d"): |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1747 remove.append(f) |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1748 else: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1749 self.ui.debug(_("other deleted %s\n") % f) |
254 | 1750 remove.append(f) # other deleted it |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1751 else: |
1236
67a28636ea64
Fix bug with co -C across branches, update tests
mpm@selenic.com
parents:
1234
diff
changeset
|
1752 # file is created on branch or in working directory |
67a28636ea64
Fix bug with co -C across branches, update tests
mpm@selenic.com
parents:
1234
diff
changeset
|
1753 if force and f not in umap: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1754 self.ui.debug(_("remote deleted %s, clobbering\n") % f) |
1236
67a28636ea64
Fix bug with co -C across branches, update tests
mpm@selenic.com
parents:
1234
diff
changeset
|
1755 remove.append(f) |
67a28636ea64
Fix bug with co -C across branches, update tests
mpm@selenic.com
parents:
1234
diff
changeset
|
1756 elif n == m1.get(f, nullid): # same as parent |
1234
9ee8428d84a1
Revert unrelated changes in previous commit
mpm@selenic.com
parents:
1233
diff
changeset
|
1757 if p2 == pa: # going backwards? |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1758 self.ui.debug(_("remote deleted %s\n") % f) |
1234
9ee8428d84a1
Revert unrelated changes in previous commit
mpm@selenic.com
parents:
1233
diff
changeset
|
1759 remove.append(f) |
9ee8428d84a1
Revert unrelated changes in previous commit
mpm@selenic.com
parents:
1233
diff
changeset
|
1760 else: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1761 self.ui.debug(_("local modified %s, keeping\n") % f) |
254 | 1762 else: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1763 self.ui.debug(_("working dir created %s, keeping\n") % f) |
46 | 1764 |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1765 for f, n in m2.iteritems(): |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1766 if choose and not choose(f): |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1767 continue |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1768 if f[0] == "/": |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1769 continue |
616 | 1770 if f in ma and n != ma[f]: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1771 r = _("k") |
616 | 1772 if not force and (linear_path or allow): |
415
c2b9502a4e96
[PATCH] Don't prompt user for keep-vs-delete when the merge is about to be aborted
mpm@selenic.com
parents:
413
diff
changeset
|
1773 r = self.ui.prompt( |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1774 (_("remote changed %s which local deleted\n") % f) + |
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1775 _("(k)eep or (d)elete?"), _("[kd]"), _("k")) |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1776 if r == _("k"): |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1777 get[f] = n |
616 | 1778 elif f not in ma: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1779 self.ui.debug(_("remote created %s\n") % f) |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1780 get[f] = n |
616 | 1781 else: |
680
4b7b79d2db2c
Handle undeletion of files when checking out old revisions
Matt Mackall <mpm@selenic.com>
parents:
679
diff
changeset
|
1782 if force or p2 == pa: # going backwards? |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1783 self.ui.debug(_("local deleted %s, recreating\n") % f) |
650
2c934c7b79dc
Fix bug in reverting deleted files
Matt Mackall <mpm@selenic.com>
parents:
649
diff
changeset
|
1784 get[f] = n |
680
4b7b79d2db2c
Handle undeletion of files when checking out old revisions
Matt Mackall <mpm@selenic.com>
parents:
679
diff
changeset
|
1785 else: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1786 self.ui.debug(_("local deleted %s\n") % f) |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1787 |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1788 del mw, m1, m2, ma |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1789 |
275 | 1790 if force: |
1791 for f in merge: | |
1792 get[f] = merge[f][1] | |
1793 merge = {} | |
1794 | |
690 | 1795 if linear_path or force: |
254 | 1796 # we don't need to do any magic, just jump to the new rev |
993 | 1797 branch_merge = False |
254 | 1798 p1, p2 = p2, nullid |
1799 else: | |
275 | 1800 if not allow: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1801 self.ui.status(_("this update spans a branch" |
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1802 " affecting the following files:\n")) |
305 | 1803 fl = merge.keys() + get.keys() |
1804 fl.sort() | |
1805 for f in fl: | |
1806 cf = "" | |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1807 if f in merge: |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1808 cf = _(" (resolve)") |
305 | 1809 self.ui.status(" %s%s\n" % (f, cf)) |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1810 self.ui.warn(_("aborting update spanning branches!\n")) |
2019
ced2d3620f95
add merge command. means same thing as "update -m".
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1998
diff
changeset
|
1811 self.ui.status(_("(use 'hg merge' to merge across branches" |
2038
5c4496ed152d
Tell the user the real "hg update -C" command, not just "-C" when aborting.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2029
diff
changeset
|
1812 " or 'hg update -C' to lose changes)\n")) |
275 | 1813 return 1 |
993 | 1814 branch_merge = True |
254 | 1815 |
2266
3f7692b0ff13
hooks: add preupdate and update hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2264
diff
changeset
|
1816 xp1 = hex(p1) |
3f7692b0ff13
hooks: add preupdate and update hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2264
diff
changeset
|
1817 xp2 = hex(p2) |
3f7692b0ff13
hooks: add preupdate and update hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2264
diff
changeset
|
1818 if p2 == nullid: xxp2 = '' |
3f7692b0ff13
hooks: add preupdate and update hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2264
diff
changeset
|
1819 else: xxp2 = xp2 |
3f7692b0ff13
hooks: add preupdate and update hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2264
diff
changeset
|
1820 |
3f7692b0ff13
hooks: add preupdate and update hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2264
diff
changeset
|
1821 self.hook('preupdate', throw=True, parent1=xp1, parent2=xxp2) |
3f7692b0ff13
hooks: add preupdate and update hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2264
diff
changeset
|
1822 |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1823 # get the files we don't need to change |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1824 files = get.keys() |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1825 files.sort() |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1826 for f in files: |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1827 if f[0] == "/": |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
1828 continue |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1829 self.ui.note(_("getting %s\n") % f) |
276 | 1830 t = self.file(f).read(get[f]) |
1477
d3566eda2bcb
util.opener already create the base directory if it doesn't exist
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1473
diff
changeset
|
1831 self.wwrite(f, t) |
441 | 1832 util.set_exec(self.wjoin(f), mf2[f]) |
588 | 1833 if moddirstate: |
993 | 1834 if branch_merge: |
1835 self.dirstate.update([f], 'n', st_mtime=-1) | |
992
f859e9cba1b9
Fix up some bugs introduced by recent merge changes
mpm@selenic.com
parents:
991
diff
changeset
|
1836 else: |
f859e9cba1b9
Fix up some bugs introduced by recent merge changes
mpm@selenic.com
parents:
991
diff
changeset
|
1837 self.dirstate.update([f], 'n') |
46 | 1838 |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1839 # merge the tricky bits |
1922
6d50d6189269
ui: output the number of file updated/merged/removed/... on update
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1893
diff
changeset
|
1840 failedmerge = [] |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1841 files = merge.keys() |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1842 files.sort() |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1843 for f in files: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1844 self.ui.status(_("merging %s\n") % f) |
993 | 1845 my, other, flag = merge[f] |
1883
b98160cfb2f3
give more info to hgmerge script.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1882
diff
changeset
|
1846 ret = self.merge3(f, my, other, xp1, xp2) |
1663
d529cdc0a3ee
return a non-zero exit code when a merge failed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1645
diff
changeset
|
1847 if ret: |
d529cdc0a3ee
return a non-zero exit code when a merge failed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1645
diff
changeset
|
1848 err = True |
1922
6d50d6189269
ui: output the number of file updated/merged/removed/... on update
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1893
diff
changeset
|
1849 failedmerge.append(f) |
441 | 1850 util.set_exec(self.wjoin(f), flag) |
862
d70c1c31fd45
Fix 3-way-merge of original parent, workdir and new parent.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
861
diff
changeset
|
1851 if moddirstate: |
993 | 1852 if branch_merge: |
1853 # We've done a branch merge, mark this file as merged | |
1854 # so that we properly record the merger later | |
1855 self.dirstate.update([f], 'm') | |
862
d70c1c31fd45
Fix 3-way-merge of original parent, workdir and new parent.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
861
diff
changeset
|
1856 else: |
993 | 1857 # We've update-merged a locally modified file, so |
1858 # we set the dirstate to emulate a normal checkout | |
1859 # of that file some time in the past. Thus our | |
1860 # merge will appear as a normal local file | |
1861 # modification. | |
1862 f_len = len(self.file(f).read(other)) | |
1863 self.dirstate.update([f], 'n', st_size=f_len, st_mtime=-1) | |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1864 |
681 | 1865 remove.sort() |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1866 for f in remove: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1867 self.ui.note(_("removing %s\n") % f) |
1835
bdfb524d728a
Validate paths before reading or writing files in repository or working dir.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1807
diff
changeset
|
1868 util.audit_path(f) |
690 | 1869 try: |
1415
c6e6ca96a033
refactor some unlink/remove code and make sure we prune empty dir
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1402
diff
changeset
|
1870 util.unlink(self.wjoin(f)) |
690 | 1871 except OSError, inst: |
1398
3f76ac60130d
make update quieter when nothing is wrong
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1384
diff
changeset
|
1872 if inst.errno != errno.ENOENT: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1873 self.ui.warn(_("update failed to remove %s: %s!\n") % |
1398
3f76ac60130d
make update quieter when nothing is wrong
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1384
diff
changeset
|
1874 (f, inst.strerror)) |
588 | 1875 if moddirstate: |
993 | 1876 if branch_merge: |
1877 self.dirstate.update(remove, 'r') | |
1878 else: | |
588 | 1879 self.dirstate.forget(remove) |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1880 |
1495
1e265c2bec94
Deal with merge abort more gracefully
Matt Mackall <mpm@selenic.com>
parents:
1493
diff
changeset
|
1881 if moddirstate: |
1e265c2bec94
Deal with merge abort more gracefully
Matt Mackall <mpm@selenic.com>
parents:
1493
diff
changeset
|
1882 self.dirstate.setparents(p1, p2) |
1922
6d50d6189269
ui: output the number of file updated/merged/removed/... on update
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1893
diff
changeset
|
1883 |
2175
b2ae81a7df29
Make hg update more verbose by default (issue12)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2167
diff
changeset
|
1884 if show_stats: |
b2ae81a7df29
Make hg update more verbose by default (issue12)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2167
diff
changeset
|
1885 stats = ((len(get), _("updated")), |
b2ae81a7df29
Make hg update more verbose by default (issue12)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2167
diff
changeset
|
1886 (len(merge) - len(failedmerge), _("merged")), |
b2ae81a7df29
Make hg update more verbose by default (issue12)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2167
diff
changeset
|
1887 (len(remove), _("removed")), |
b2ae81a7df29
Make hg update more verbose by default (issue12)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2167
diff
changeset
|
1888 (len(failedmerge), _("unresolved"))) |
b2ae81a7df29
Make hg update more verbose by default (issue12)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2167
diff
changeset
|
1889 note = ", ".join([_("%d files %s") % s for s in stats]) |
b2ae81a7df29
Make hg update more verbose by default (issue12)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2167
diff
changeset
|
1890 self.ui.status("%s\n" % note) |
b2ae81a7df29
Make hg update more verbose by default (issue12)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2167
diff
changeset
|
1891 if moddirstate: |
b2ae81a7df29
Make hg update more verbose by default (issue12)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2167
diff
changeset
|
1892 if branch_merge: |
b2ae81a7df29
Make hg update more verbose by default (issue12)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2167
diff
changeset
|
1893 if failedmerge: |
b2ae81a7df29
Make hg update more verbose by default (issue12)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2167
diff
changeset
|
1894 self.ui.status(_("There are unresolved merges," |
b2ae81a7df29
Make hg update more verbose by default (issue12)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2167
diff
changeset
|
1895 " you can redo the full merge using:\n" |
b2ae81a7df29
Make hg update more verbose by default (issue12)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2167
diff
changeset
|
1896 " hg update -C %s\n" |
b2ae81a7df29
Make hg update more verbose by default (issue12)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2167
diff
changeset
|
1897 " hg merge %s\n" |
b2ae81a7df29
Make hg update more verbose by default (issue12)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2167
diff
changeset
|
1898 % (self.changelog.rev(p1), |
b2ae81a7df29
Make hg update more verbose by default (issue12)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2167
diff
changeset
|
1899 self.changelog.rev(p2)))) |
b2ae81a7df29
Make hg update more verbose by default (issue12)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2167
diff
changeset
|
1900 else: |
b2ae81a7df29
Make hg update more verbose by default (issue12)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2167
diff
changeset
|
1901 self.ui.status(_("(branch merge, don't forget to commit)\n")) |
b2ae81a7df29
Make hg update more verbose by default (issue12)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2167
diff
changeset
|
1902 elif failedmerge: |
b2ae81a7df29
Make hg update more verbose by default (issue12)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2167
diff
changeset
|
1903 self.ui.status(_("There are unresolved merges with" |
b2ae81a7df29
Make hg update more verbose by default (issue12)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2167
diff
changeset
|
1904 " locally modified files.\n")) |
1922
6d50d6189269
ui: output the number of file updated/merged/removed/... on update
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1893
diff
changeset
|
1905 |
2266
3f7692b0ff13
hooks: add preupdate and update hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2264
diff
changeset
|
1906 self.hook('update', parent1=xp1, parent2=xxp2, error=int(err)) |
1663
d529cdc0a3ee
return a non-zero exit code when a merge failed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1645
diff
changeset
|
1907 return err |
1495
1e265c2bec94
Deal with merge abort more gracefully
Matt Mackall <mpm@selenic.com>
parents:
1493
diff
changeset
|
1908 |
1883
b98160cfb2f3
give more info to hgmerge script.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1882
diff
changeset
|
1909 def merge3(self, fn, my, other, p1, p2): |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1910 """perform a 3-way merge in the working directory""" |
249 | 1911 |
96 | 1912 def temp(prefix, node): |
1913 pre = "%s~%s." % (os.path.basename(fn), prefix) | |
2165
d821918e3bee
Use better names (hg-{usage}-{random}.{suffix}) for temporary files.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2156
diff
changeset
|
1914 (fd, name) = tempfile.mkstemp(prefix=pre) |
417 | 1915 f = os.fdopen(fd, "wb") |
1019
a9cca981c423
Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents:
1013
diff
changeset
|
1916 self.wwrite(fn, fl.read(node), f) |
96 | 1917 f.close() |
1918 return name | |
1919 | |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1920 fl = self.file(fn) |
96 | 1921 base = fl.ancestor(my, other) |
244 | 1922 a = self.wjoin(fn) |
346 | 1923 b = temp("base", base) |
1924 c = temp("other", other) | |
96 | 1925 |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1926 self.ui.note(_("resolving %s\n") % fn) |
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1927 self.ui.debug(_("file %s: my %s other %s ancestor %s\n") % |
1349
c6295d2a361e
More info on file merge for update --debug
Matt Mackall <mpm@selenic.com>
parents:
1346
diff
changeset
|
1928 (fn, short(my), short(other), short(base))) |
96 | 1929 |
703
fb6f85ecc863
merge program setting from hgrc wasn't used.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
691
diff
changeset
|
1930 cmd = (os.environ.get("HGMERGE") or self.ui.config("ui", "merge") |
fb6f85ecc863
merge program setting from hgrc wasn't used.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
691
diff
changeset
|
1931 or "hgmerge") |
1885
c4d577262d00
run merge program in repo root.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1883
diff
changeset
|
1932 r = util.system('%s "%s" "%s" "%s"' % (cmd, a, b, c), cwd=self.root, |
c4d577262d00
run merge program in repo root.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1883
diff
changeset
|
1933 environ={'HG_FILE': fn, |
1883
b98160cfb2f3
give more info to hgmerge script.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1882
diff
changeset
|
1934 'HG_MY_NODE': p1, |
b98160cfb2f3
give more info to hgmerge script.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1882
diff
changeset
|
1935 'HG_OTHER_NODE': p2, |
b98160cfb2f3
give more info to hgmerge script.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1882
diff
changeset
|
1936 'HG_FILE_MY_NODE': hex(my), |
b98160cfb2f3
give more info to hgmerge script.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1882
diff
changeset
|
1937 'HG_FILE_OTHER_NODE': hex(other), |
b98160cfb2f3
give more info to hgmerge script.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1882
diff
changeset
|
1938 'HG_FILE_BASE_NODE': hex(base)}) |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1939 if r: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1940 self.ui.warn(_("merging %s failed!\n") % fn) |
232
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1941 |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1942 os.unlink(b) |
fc4a6e5b5812
hg resolve: merge a given node into the working directory
mpm@selenic.com
parents:
231
diff
changeset
|
1943 os.unlink(c) |
1663
d529cdc0a3ee
return a non-zero exit code when a merge failed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1645
diff
changeset
|
1944 return r |
96 | 1945 |
247 | 1946 def verify(self): |
1947 filelinkrevs = {} | |
1948 filenodes = {} | |
1949 changesets = revisions = files = 0 | |
1383
3d6d45faf8b2
hg verify: add an error reporting helper function
Matt Mackall <mpm@selenic.com>
parents:
1382
diff
changeset
|
1950 errors = [0] |
2143
3053fc33f545
Show repo's revlog format on verify. Warn if some files use a different format.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2142
diff
changeset
|
1951 warnings = [0] |
1382
b113e7db06e9
hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents:
1375
diff
changeset
|
1952 neededmanifests = {} |
247 | 1953 |
1383
3d6d45faf8b2
hg verify: add an error reporting helper function
Matt Mackall <mpm@selenic.com>
parents:
1382
diff
changeset
|
1954 def err(msg): |
3d6d45faf8b2
hg verify: add an error reporting helper function
Matt Mackall <mpm@selenic.com>
parents:
1382
diff
changeset
|
1955 self.ui.warn(msg + "\n") |
3d6d45faf8b2
hg verify: add an error reporting helper function
Matt Mackall <mpm@selenic.com>
parents:
1382
diff
changeset
|
1956 errors[0] += 1 |
3d6d45faf8b2
hg verify: add an error reporting helper function
Matt Mackall <mpm@selenic.com>
parents:
1382
diff
changeset
|
1957 |
2143
3053fc33f545
Show repo's revlog format on verify. Warn if some files use a different format.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2142
diff
changeset
|
1958 def warn(msg): |
3053fc33f545
Show repo's revlog format on verify. Warn if some files use a different format.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2142
diff
changeset
|
1959 self.ui.warn(msg + "\n") |
3053fc33f545
Show repo's revlog format on verify. Warn if some files use a different format.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2142
diff
changeset
|
1960 warnings[0] += 1 |
3053fc33f545
Show repo's revlog format on verify. Warn if some files use a different format.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2142
diff
changeset
|
1961 |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1663
diff
changeset
|
1962 def checksize(obj, name): |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1663
diff
changeset
|
1963 d = obj.checksize() |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1663
diff
changeset
|
1964 if d[0]: |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1663
diff
changeset
|
1965 err(_("%s data length off by %d bytes") % (name, d[0])) |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1663
diff
changeset
|
1966 if d[1]: |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1663
diff
changeset
|
1967 err(_("%s index contains %d extra bytes") % (name, d[1])) |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1663
diff
changeset
|
1968 |
2143
3053fc33f545
Show repo's revlog format on verify. Warn if some files use a different format.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2142
diff
changeset
|
1969 def checkversion(obj, name): |
3053fc33f545
Show repo's revlog format on verify. Warn if some files use a different format.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2142
diff
changeset
|
1970 if obj.version != revlog.REVLOGV0: |
3053fc33f545
Show repo's revlog format on verify. Warn if some files use a different format.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2142
diff
changeset
|
1971 if not revlogv1: |
3053fc33f545
Show repo's revlog format on verify. Warn if some files use a different format.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2142
diff
changeset
|
1972 warn(_("warning: `%s' uses revlog format 1") % name) |
3053fc33f545
Show repo's revlog format on verify. Warn if some files use a different format.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2142
diff
changeset
|
1973 elif revlogv1: |
3053fc33f545
Show repo's revlog format on verify. Warn if some files use a different format.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2142
diff
changeset
|
1974 warn(_("warning: `%s' uses revlog format 0") % name) |
3053fc33f545
Show repo's revlog format on verify. Warn if some files use a different format.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2142
diff
changeset
|
1975 |
3053fc33f545
Show repo's revlog format on verify. Warn if some files use a different format.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2142
diff
changeset
|
1976 revlogv1 = self.revlogversion != revlog.REVLOGV0 |
2152
57729c56a23c
Show repo's revlog format on verify only if it doesn't match the default format.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2150
diff
changeset
|
1977 if self.ui.verbose or revlogv1 != self.revlogv1: |
57729c56a23c
Show repo's revlog format on verify only if it doesn't match the default format.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2150
diff
changeset
|
1978 self.ui.status(_("repository uses revlog format %d\n") % |
57729c56a23c
Show repo's revlog format on verify only if it doesn't match the default format.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2150
diff
changeset
|
1979 (revlogv1 and 1 or 0)) |
2143
3053fc33f545
Show repo's revlog format on verify. Warn if some files use a different format.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2142
diff
changeset
|
1980 |
302 | 1981 seen = {} |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1982 self.ui.status(_("checking changesets\n")) |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1663
diff
changeset
|
1983 checksize(self.changelog, "changelog") |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1663
diff
changeset
|
1984 |
247 | 1985 for i in range(self.changelog.count()): |
1986 changesets += 1 | |
1987 n = self.changelog.node(i) | |
1382
b113e7db06e9
hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents:
1375
diff
changeset
|
1988 l = self.changelog.linkrev(n) |
b113e7db06e9
hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents:
1375
diff
changeset
|
1989 if l != i: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1990 err(_("incorrect link (%d) for changeset revision %d") %(l, i)) |
302 | 1991 if n in seen: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1992 err(_("duplicate changeset at revision %d") % i) |
302 | 1993 seen[n] = 1 |
515 | 1994 |
247 | 1995 for p in self.changelog.parents(n): |
1996 if p not in self.changelog.nodemap: | |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
1997 err(_("changeset %s has unknown parent %s") % |
247 | 1998 (short(n), short(p))) |
1999 try: | |
2000 changes = self.changelog.read(n) | |
1492
5f0522d31967
Allow interrupting all parts of verify
Matt Mackall <mpm@selenic.com>
parents:
1480
diff
changeset
|
2001 except KeyboardInterrupt: |
5f0522d31967
Allow interrupting all parts of verify
Matt Mackall <mpm@selenic.com>
parents:
1480
diff
changeset
|
2002 self.ui.warn(_("interrupted")) |
5f0522d31967
Allow interrupting all parts of verify
Matt Mackall <mpm@selenic.com>
parents:
1480
diff
changeset
|
2003 raise |
247 | 2004 except Exception, inst: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
2005 err(_("unpacking changeset %s: %s") % (short(n), inst)) |
1853
5ac811b720de
Fix some problems when working on broken repositories:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1839
diff
changeset
|
2006 continue |
247 | 2007 |
1382
b113e7db06e9
hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents:
1375
diff
changeset
|
2008 neededmanifests[changes[0]] = n |
b113e7db06e9
hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents:
1375
diff
changeset
|
2009 |
247 | 2010 for f in changes[3]: |
2011 filelinkrevs.setdefault(f, []).append(i) | |
2012 | |
302 | 2013 seen = {} |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
2014 self.ui.status(_("checking manifests\n")) |
2143
3053fc33f545
Show repo's revlog format on verify. Warn if some files use a different format.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2142
diff
changeset
|
2015 checkversion(self.manifest, "manifest") |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1663
diff
changeset
|
2016 checksize(self.manifest, "manifest") |
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1663
diff
changeset
|
2017 |
247 | 2018 for i in range(self.manifest.count()): |
2019 n = self.manifest.node(i) | |
1382
b113e7db06e9
hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents:
1375
diff
changeset
|
2020 l = self.manifest.linkrev(n) |
b113e7db06e9
hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents:
1375
diff
changeset
|
2021 |
b113e7db06e9
hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents:
1375
diff
changeset
|
2022 if l < 0 or l >= self.changelog.count(): |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
2023 err(_("bad manifest link (%d) at revision %d") % (l, i)) |
1382
b113e7db06e9
hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents:
1375
diff
changeset
|
2024 |
b113e7db06e9
hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents:
1375
diff
changeset
|
2025 if n in neededmanifests: |
b113e7db06e9
hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents:
1375
diff
changeset
|
2026 del neededmanifests[n] |
b113e7db06e9
hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents:
1375
diff
changeset
|
2027 |
302 | 2028 if n in seen: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
2029 err(_("duplicate manifest at revision %d") % i) |
1383
3d6d45faf8b2
hg verify: add an error reporting helper function
Matt Mackall <mpm@selenic.com>
parents:
1382
diff
changeset
|
2030 |
302 | 2031 seen[n] = 1 |
515 | 2032 |
247 | 2033 for p in self.manifest.parents(n): |
2034 if p not in self.manifest.nodemap: | |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
2035 err(_("manifest %s has unknown parent %s") % |
1383
3d6d45faf8b2
hg verify: add an error reporting helper function
Matt Mackall <mpm@selenic.com>
parents:
1382
diff
changeset
|
2036 (short(n), short(p))) |
247 | 2037 |
2038 try: | |
2039 delta = mdiff.patchtext(self.manifest.delta(n)) | |
2040 except KeyboardInterrupt: | |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
2041 self.ui.warn(_("interrupted")) |
1097 | 2042 raise |
247 | 2043 except Exception, inst: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
2044 err(_("unpacking manifest %s: %s") % (short(n), inst)) |
1853
5ac811b720de
Fix some problems when working on broken repositories:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1839
diff
changeset
|
2045 continue |
247 | 2046 |
1853
5ac811b720de
Fix some problems when working on broken repositories:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1839
diff
changeset
|
2047 try: |
5ac811b720de
Fix some problems when working on broken repositories:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1839
diff
changeset
|
2048 ff = [ l.split('\0') for l in delta.splitlines() ] |
5ac811b720de
Fix some problems when working on broken repositories:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1839
diff
changeset
|
2049 for f, fn in ff: |
5ac811b720de
Fix some problems when working on broken repositories:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1839
diff
changeset
|
2050 filenodes.setdefault(f, {})[bin(fn[:40])] = 1 |
5ac811b720de
Fix some problems when working on broken repositories:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1839
diff
changeset
|
2051 except (ValueError, TypeError), inst: |
5ac811b720de
Fix some problems when working on broken repositories:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1839
diff
changeset
|
2052 err(_("broken delta in manifest %s: %s") % (short(n), inst)) |
247 | 2053 |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
2054 self.ui.status(_("crosschecking files in changesets and manifests\n")) |
1382
b113e7db06e9
hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents:
1375
diff
changeset
|
2055 |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
2056 for m, c in neededmanifests.items(): |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
2057 err(_("Changeset %s refers to unknown manifest %s") % |
1384
d729850d52fa
hg verify: add some bin to hex conversions
Matt Mackall <mpm@selenic.com>
parents:
1383
diff
changeset
|
2058 (short(m), short(c))) |
1382
b113e7db06e9
hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents:
1375
diff
changeset
|
2059 del neededmanifests |
b113e7db06e9
hg verify: more consistency checking between changesets and manifests
Matt Mackall <mpm@selenic.com>
parents:
1375
diff
changeset
|
2060 |
247 | 2061 for f in filenodes: |
2062 if f not in filelinkrevs: | |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
2063 err(_("file %s in manifest but not in changesets") % f) |
247 | 2064 |
2065 for f in filelinkrevs: | |
2066 if f not in filenodes: | |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
2067 err(_("file %s in changeset but not in manifest") % f) |
247 | 2068 |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
2069 self.ui.status(_("checking files\n")) |
247 | 2070 ff = filenodes.keys() |
2071 ff.sort() | |
2072 for f in ff: | |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
2073 if f == "/dev/null": |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
2074 continue |
247 | 2075 files += 1 |
1853
5ac811b720de
Fix some problems when working on broken repositories:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1839
diff
changeset
|
2076 if not f: |
5ac811b720de
Fix some problems when working on broken repositories:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1839
diff
changeset
|
2077 err(_("file without name in manifest %s") % short(n)) |
5ac811b720de
Fix some problems when working on broken repositories:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1839
diff
changeset
|
2078 continue |
247 | 2079 fl = self.file(f) |
2143
3053fc33f545
Show repo's revlog format on verify. Warn if some files use a different format.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2142
diff
changeset
|
2080 checkversion(fl, f) |
1667
daff3ef0de8d
verify: notice extra data in indices
Matt Mackall <mpm@selenic.com>
parents:
1663
diff
changeset
|
2081 checksize(fl, f) |
1493
1a216cb4ee64
verify: add check for mismatch of index and data length
Matt Mackall <mpm@selenic.com>
parents:
1492
diff
changeset
|
2082 |
1615
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
2083 nodes = {nullid: 1} |
302 | 2084 seen = {} |
247 | 2085 for i in range(fl.count()): |
2086 revisions += 1 | |
2087 n = fl.node(i) | |
2088 | |
302 | 2089 if n in seen: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
2090 err(_("%s: duplicate revision %d") % (f, i)) |
247 | 2091 if n not in filenodes[f]: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
2092 err(_("%s: %d:%s not in manifests") % (f, i, short(n))) |
247 | 2093 else: |
2094 del filenodes[f][n] | |
2095 | |
2096 flr = fl.linkrev(n) | |
1853
5ac811b720de
Fix some problems when working on broken repositories:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1839
diff
changeset
|
2097 if flr not in filelinkrevs.get(f, []): |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
2098 err(_("%s:%s points to unexpected changeset %d") |
1383
3d6d45faf8b2
hg verify: add an error reporting helper function
Matt Mackall <mpm@selenic.com>
parents:
1382
diff
changeset
|
2099 % (f, short(n), flr)) |
247 | 2100 else: |
2101 filelinkrevs[f].remove(flr) | |
2102 | |
2103 # verify contents | |
2104 try: | |
2105 t = fl.read(n) | |
1492
5f0522d31967
Allow interrupting all parts of verify
Matt Mackall <mpm@selenic.com>
parents:
1480
diff
changeset
|
2106 except KeyboardInterrupt: |
5f0522d31967
Allow interrupting all parts of verify
Matt Mackall <mpm@selenic.com>
parents:
1480
diff
changeset
|
2107 self.ui.warn(_("interrupted")) |
5f0522d31967
Allow interrupting all parts of verify
Matt Mackall <mpm@selenic.com>
parents:
1480
diff
changeset
|
2108 raise |
247 | 2109 except Exception, inst: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
2110 err(_("unpacking file %s %s: %s") % (f, short(n), inst)) |
247 | 2111 |
2112 # verify parents | |
2113 (p1, p2) = fl.parents(n) | |
2114 if p1 not in nodes: | |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
2115 err(_("file %s:%s unknown parent 1 %s") % |
1383
3d6d45faf8b2
hg verify: add an error reporting helper function
Matt Mackall <mpm@selenic.com>
parents:
1382
diff
changeset
|
2116 (f, short(n), short(p1))) |
247 | 2117 if p2 not in nodes: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
2118 err(_("file %s:%s unknown parent 2 %s") % |
247 | 2119 (f, short(n), short(p1))) |
2120 nodes[n] = 1 | |
2121 | |
2122 # cross-check | |
2123 for node in filenodes[f]: | |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
2124 err(_("node %s in manifests not in %s") % (hex(node), f)) |
247 | 2125 |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
2126 self.ui.status(_("%d files, %d changesets, %d total revisions\n") % |
247 | 2127 (files, changesets, revisions)) |
2128 | |
2143
3053fc33f545
Show repo's revlog format on verify. Warn if some files use a different format.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2142
diff
changeset
|
2129 if warnings[0]: |
3053fc33f545
Show repo's revlog format on verify. Warn if some files use a different format.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2142
diff
changeset
|
2130 self.ui.warn(_("%d warnings encountered!\n") % warnings[0]) |
1383
3d6d45faf8b2
hg verify: add an error reporting helper function
Matt Mackall <mpm@selenic.com>
parents:
1382
diff
changeset
|
2131 if errors[0]: |
1402
9d2c2e6b32b5
i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1400
diff
changeset
|
2132 self.ui.warn(_("%d integrity errors encountered!\n") % errors[0]) |
247 | 2133 return 1 |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
2134 |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
2135 # used to avoid circular references so destructors work |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
2136 def aftertrans(base): |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
2137 p = base |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
2138 def a(): |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
2139 util.rename(os.path.join(p, "journal"), os.path.join(p, "undo")) |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
2140 util.rename(os.path.join(p, "journal.dirstate"), |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
2141 os.path.join(p, "undo.dirstate")) |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
2142 return a |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
2143 |