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