##// END OF EJS Templates
merge: pull manifest comparison out into separate function
Matt Mackall -
r3105:7c7469d4 default
parent child Browse files
Show More
@@ -52,6 +52,99 b' def merge3(repo, fn, my, other, p1, p2):'
52 os.unlink(c)
52 os.unlink(c)
53 return r
53 return r
54
54
55 def manifestmerge(ui, m1, m2, ma, overwrite, backwards):
56 """
57 Merge manifest m1 with m2 using ancestor ma and generate merge action list
58 """
59
60 action = []
61
62 # Compare manifests
63 for f, n in m1.iteritems():
64 if f in m2:
65 queued = 0
66
67 # are files different?
68 if n != m2[f]:
69 a = ma.get(f, nullid)
70 # are both different from the ancestor?
71 if not overwrite and n != a and m2[f] != a:
72 ui.debug(_(" %s versions differ, resolve\n") % f)
73 action.append((f, "m", fmerge(f, m1, m2, ma), n[:20], m2[f]))
74 queued = 1
75 # are we clobbering?
76 # is remote's version newer?
77 # or are we going back in time and clean?
78 elif overwrite or m2[f] != a or (backwards and not n[20:]):
79 ui.debug(_(" remote %s is newer, get\n") % f)
80 action.append((f, "g", m2.execf(f), m2[f]))
81 queued = 1
82 elif n[20:] in ("u","a"):
83 # this unknown file is the same as the checkout
84 # we need to reset the dirstate if the file was added
85 action.append((f, "g", m2.execf(f), m2[f]))
86
87 # do we still need to look at mode bits?
88 if not queued and m1.execf(f) != m2.execf(f):
89 if overwrite:
90 ui.debug(_(" updating permissions for %s\n") % f)
91 action.append((f, "e", m2.execf(f)))
92 else:
93 mode = fmerge(f, m1, m2, ma)
94 if mode != m1.execf(f):
95 ui.debug(_(" updating permissions for %s\n")
96 % f)
97 action.append((f, "e", m2.execf(f)))
98 del m2[f]
99 elif f in ma:
100 if n != ma[f]:
101 r = _("d")
102 if not overwrite:
103 r = ui.prompt(
104 (_(" local changed %s which remote deleted\n") % f) +
105 _("(k)eep or (d)elete?"), _("[kd]"), _("k"))
106 if r == _("d"):
107 action.append((f, "r"))
108 else:
109 ui.debug(_("other deleted %s\n") % f)
110 action.append((f, "r"))
111 else:
112 # file is created on branch or in working directory
113 if overwrite and n[20:] != "u":
114 ui.debug(_("remote deleted %s, clobbering\n") % f)
115 action.append((f, "r"))
116 elif not n[20:]: # same as parent
117 if backwards:
118 ui.debug(_("remote deleted %s\n") % f)
119 action.append((f, "r"))
120 else:
121 ui.debug(_("local modified %s, keeping\n") % f)
122 else:
123 ui.debug(_("working dir created %s, keeping\n") % f)
124
125 for f, n in m2.iteritems():
126 if f[0] == "/":
127 continue
128 if f in ma and n != ma[f]:
129 r = _("k")
130 if not overwrite:
131 r = ui.prompt(
132 (_("remote changed %s which local deleted\n") % f) +
133 _("(k)eep or (d)elete?"), _("[kd]"), _("k"))
134 if r == _("k"):
135 action.append((f, "g", m2.execf(f), n))
136 elif f not in ma:
137 ui.debug(_("remote created %s\n") % f)
138 action.append((f, "g", m2.execf(f), n))
139 else:
140 if overwrite or backwards:
141 ui.debug(_("local deleted %s, recreating\n") % f)
142 action.append((f, "g", m2.execf(f), n))
143 else:
144 ui.debug(_("local deleted %s\n") % f)
145
146 return action
147
55 def update(repo, node, branchmerge=False, force=False, partial=None,
148 def update(repo, node, branchmerge=False, force=False, partial=None,
56 wlock=None, show_stats=True, remind=True):
149 wlock=None, show_stats=True, remind=True):
57
150
@@ -134,90 +227,7 b' def update(repo, node, branchmerge=False'
134 for f in m2.keys():
227 for f in m2.keys():
135 if not partial(f): del m2[f]
228 if not partial(f): del m2[f]
136
229
137 # Compare manifests
230 action += manifestmerge(repo.ui, m1, m2, ma, overwrite, backwards)
138 for f, n in m1.iteritems():
139 if f in m2:
140 queued = 0
141
142 # are files different?
143 if n != m2[f]:
144 a = ma.get(f, nullid)
145 # are both different from the ancestor?
146 if not overwrite and n != a and m2[f] != a:
147 repo.ui.debug(_(" %s versions differ, resolve\n") % f)
148 action.append((f, "m", fmerge(f, m1, m2, ma), n[:20], m2[f]))
149 queued = 1
150 # are we clobbering?
151 # is remote's version newer?
152 # or are we going back in time and clean?
153 elif overwrite or m2[f] != a or (backwards and not n[20:]):
154 repo.ui.debug(_(" remote %s is newer, get\n") % f)
155 action.append((f, "g", m2.execf(f), m2[f]))
156 queued = 1
157 elif n[20:] in ("u","a"):
158 # this unknown file is the same as the checkout
159 # we need to reset the dirstate if the file was added
160 action.append((f, "g", m2.execf(f), m2[f]))
161
162 # do we still need to look at mode bits?
163 if not queued and m1.execf(f) != m2.execf(f):
164 if overwrite:
165 repo.ui.debug(_(" updating permissions for %s\n") % f)
166 action.append((f, "e", m2.execf(f)))
167 else:
168 mode = fmerge(f, m1, m2, ma)
169 if mode != m1.execf(f):
170 repo.ui.debug(_(" updating permissions for %s\n")
171 % f)
172 action.append((f, "e", m2.execf(f)))
173 del m2[f]
174 elif f in ma:
175 if n != ma[f]:
176 r = _("d")
177 if not overwrite:
178 r = repo.ui.prompt(
179 (_(" local changed %s which remote deleted\n") % f) +
180 _("(k)eep or (d)elete?"), _("[kd]"), _("k"))
181 if r == _("d"):
182 action.append((f, "r"))
183 else:
184 repo.ui.debug(_("other deleted %s\n") % f)
185 action.append((f, "r"))
186 else:
187 # file is created on branch or in working directory
188 if overwrite and n[20:] != "u":
189 repo.ui.debug(_("remote deleted %s, clobbering\n") % f)
190 action.append((f, "r"))
191 elif not n[20:]: # same as parent
192 if backwards:
193 repo.ui.debug(_("remote deleted %s\n") % f)
194 action.append((f, "r"))
195 else:
196 repo.ui.debug(_("local modified %s, keeping\n") % f)
197 else:
198 repo.ui.debug(_("working dir created %s, keeping\n") % f)
199
200 for f, n in m2.iteritems():
201 if f[0] == "/":
202 continue
203 if f in ma and n != ma[f]:
204 r = _("k")
205 if not overwrite:
206 r = repo.ui.prompt(
207 (_("remote changed %s which local deleted\n") % f) +
208 _("(k)eep or (d)elete?"), _("[kd]"), _("k"))
209 if r == _("k"):
210 action.append((f, "g", m2.execf(f), n))
211 elif f not in ma:
212 repo.ui.debug(_("remote created %s\n") % f)
213 action.append((f, "g", m2.execf(f), n))
214 else:
215 if overwrite or backwards:
216 repo.ui.debug(_("local deleted %s, recreating\n") % f)
217 action.append((f, "g", m2.execf(f), n))
218 else:
219 repo.ui.debug(_("local deleted %s\n") % f)
220
221 del m1, m2, ma
231 del m1, m2, ma
222
232
223 ### apply phase
233 ### apply phase
General Comments 0
You need to be logged in to leave comments. Login now