comparison mercurial/merge.py @ 3102:36b08cd92fb7

merge: add codes to action list, eliminate None elements
author Matt Mackall <mpm@selenic.com>
date Sun, 17 Sep 2006 15:24:00 -0500
parents 87ea5a71f7b9
children 22336ad45cf2
comparison
equal deleted inserted replaced
3101:87ea5a71f7b9 3102:36b08cd92fb7
144 if n != m2[f]: 144 if n != m2[f]:
145 a = ma.get(f, nullid) 145 a = ma.get(f, nullid)
146 # are both different from the ancestor? 146 # are both different from the ancestor?
147 if not overwrite and n != a and m2[f] != a: 147 if not overwrite and n != a and m2[f] != a:
148 repo.ui.debug(_(" %s versions differ, resolve\n") % f) 148 repo.ui.debug(_(" %s versions differ, resolve\n") % f)
149 action.append((f, fmerge(f, m1, m2, ma), n[:20], m2[f])) 149 action.append((f, "m", fmerge(f, m1, m2, ma), n[:20], m2[f]))
150 queued = 1 150 queued = 1
151 # are we clobbering? 151 # are we clobbering?
152 # is remote's version newer? 152 # is remote's version newer?
153 # or are we going back in time and clean? 153 # or are we going back in time and clean?
154 elif overwrite or m2[f] != a or (backwards and not n[20:]): 154 elif overwrite or m2[f] != a or (backwards and not n[20:]):
155 repo.ui.debug(_(" remote %s is newer, get\n") % f) 155 repo.ui.debug(_(" remote %s is newer, get\n") % f)
156 action.append((f, m2.execf(f), m2[f], None)) 156 action.append((f, "g", m2.execf(f), m2[f]))
157 queued = 1 157 queued = 1
158 elif n[20:] in ("u","a"): 158 elif n[20:] in ("u","a"):
159 # this unknown file is the same as the checkout 159 # this unknown file is the same as the checkout
160 # we need to reset the dirstate if the file was added 160 # we need to reset the dirstate if the file was added
161 action.append((f, m2.execf(f), m2[f], None)) 161 action.append((f, "g", m2.execf(f), m2[f]))
162 162
163 # do we still need to look at mode bits? 163 # do we still need to look at mode bits?
164 if not queued and m1.execf(f) != m2.execf(f): 164 if not queued and m1.execf(f) != m2.execf(f):
165 if overwrite: 165 if overwrite:
166 repo.ui.debug(_(" updating permissions for %s\n") % f) 166 repo.ui.debug(_(" updating permissions for %s\n") % f)
177 if not overwrite: 177 if not overwrite:
178 r = repo.ui.prompt( 178 r = repo.ui.prompt(
179 (_(" local changed %s which remote deleted\n") % f) + 179 (_(" local changed %s which remote deleted\n") % f) +
180 _("(k)eep or (d)elete?"), _("[kd]"), _("k")) 180 _("(k)eep or (d)elete?"), _("[kd]"), _("k"))
181 if r == _("d"): 181 if r == _("d"):
182 action.append((f, None, None, None)) 182 action.append((f, "r"))
183 else: 183 else:
184 repo.ui.debug(_("other deleted %s\n") % f) 184 repo.ui.debug(_("other deleted %s\n") % f)
185 action.append((f, None, None, None)) 185 action.append((f, "r"))
186 else: 186 else:
187 # file is created on branch or in working directory 187 # file is created on branch or in working directory
188 if overwrite and n[20:] != "u": 188 if overwrite and n[20:] != "u":
189 repo.ui.debug(_("remote deleted %s, clobbering\n") % f) 189 repo.ui.debug(_("remote deleted %s, clobbering\n") % f)
190 action.append((f, None, None, None)) 190 action.append((f, "r"))
191 elif not n[20:]: # same as parent 191 elif not n[20:]: # same as parent
192 if backwards: 192 if backwards:
193 repo.ui.debug(_("remote deleted %s\n") % f) 193 repo.ui.debug(_("remote deleted %s\n") % f)
194 action.append((f, None, None, None)) 194 action.append((f, "r"))
195 else: 195 else:
196 repo.ui.debug(_("local modified %s, keeping\n") % f) 196 repo.ui.debug(_("local modified %s, keeping\n") % f)
197 else: 197 else:
198 repo.ui.debug(_("working dir created %s, keeping\n") % f) 198 repo.ui.debug(_("working dir created %s, keeping\n") % f)
199 199
205 if not overwrite: 205 if not overwrite:
206 r = repo.ui.prompt( 206 r = repo.ui.prompt(
207 (_("remote changed %s which local deleted\n") % f) + 207 (_("remote changed %s which local deleted\n") % f) +
208 _("(k)eep or (d)elete?"), _("[kd]"), _("k")) 208 _("(k)eep or (d)elete?"), _("[kd]"), _("k"))
209 if r == _("k"): 209 if r == _("k"):
210 action.append((f, m2.execf(f), n, None)) 210 action.append((f, "g", m2.execf(f), n))
211 elif f not in ma: 211 elif f not in ma:
212 repo.ui.debug(_("remote created %s\n") % f) 212 repo.ui.debug(_("remote created %s\n") % f)
213 action.append((f, m2.execf(f), n, None)) 213 action.append((f, "g", m2.execf(f), n))
214 else: 214 else:
215 if overwrite or backwards: 215 if overwrite or backwards:
216 repo.ui.debug(_("local deleted %s, recreating\n") % f) 216 repo.ui.debug(_("local deleted %s, recreating\n") % f)
217 action.append((f, m2.execf(f), n, None)) 217 action.append((f, "g", m2.execf(f), n))
218 else: 218 else:
219 repo.ui.debug(_("local deleted %s\n") % f) 219 repo.ui.debug(_("local deleted %s\n") % f)
220 220
221 del m1, m2, ma 221 del m1, m2, ma
222 222
235 235
236 # update files 236 # update files
237 updated, merged, removed, unresolved = 0, 0, 0, 0 237 updated, merged, removed, unresolved = 0, 0, 0, 0
238 action.sort() 238 action.sort()
239 for a in action: 239 for a in action:
240 f, flag, my, other = a 240 f, m = a[:2]
241 if f[0] == "/": 241 if f[0] == "/":
242 continue 242 continue
243 if not my: 243 if m == "r": # remove
244 repo.ui.note(_("removing %s\n") % f) 244 repo.ui.note(_("removing %s\n") % f)
245 util.audit_path(f) 245 util.audit_path(f)
246 try: 246 try:
247 util.unlink(repo.wjoin(f)) 247 util.unlink(repo.wjoin(f))
248 except OSError, inst: 248 except OSError, inst:
249 if inst.errno != errno.ENOENT: 249 if inst.errno != errno.ENOENT:
250 repo.ui.warn(_("update failed to remove %s: %s!\n") % 250 repo.ui.warn(_("update failed to remove %s: %s!\n") %
251 (f, inst.strerror)) 251 (f, inst.strerror))
252 removed +=1 252 removed +=1
253 elif other: 253 elif m == "m": # merge
254 flag, my, other = a[2:]
254 repo.ui.status(_("merging %s\n") % f) 255 repo.ui.status(_("merging %s\n") % f)
255 if merge3(repo, f, my, other, xp1, xp2): 256 if merge3(repo, f, my, other, xp1, xp2):
256 unresolved += 1 257 unresolved += 1
257 util.set_exec(repo.wjoin(f), flag) 258 util.set_exec(repo.wjoin(f), flag)
258 merged += 1 259 merged += 1
259 else: 260 elif m == "g": # get
261 flag, node = a[2:]
260 repo.ui.note(_("getting %s\n") % f) 262 repo.ui.note(_("getting %s\n") % f)
261 t = repo.file(f).read(my) 263 t = repo.file(f).read(node)
262 repo.wwrite(f, t) 264 repo.wwrite(f, t)
263 util.set_exec(repo.wjoin(f), flag) 265 util.set_exec(repo.wjoin(f), flag)
264 updated += 1 266 updated += 1
265 267
266 # update dirstate 268 # update dirstate
267 if not partial: 269 if not partial:
268 repo.dirstate.setparents(p1, p2) 270 repo.dirstate.setparents(p1, p2)
269 repo.dirstate.forget(forget) 271 repo.dirstate.forget(forget)
270 for a in action: 272 for a in action:
271 f, flag, my, other = a 273 f, m = a[:2]
272 if not my: 274 if m == "r": # remove
273 if branchmerge: 275 if branchmerge:
274 repo.dirstate.update([f], 'r') 276 repo.dirstate.update([f], 'r')
275 else: 277 else:
276 repo.dirstate.forget([f]) 278 repo.dirstate.forget([f])
277 elif not other: 279 elif m == "g": # get
278 if branchmerge: 280 if branchmerge:
279 repo.dirstate.update([f], 'n', st_mtime=-1) 281 repo.dirstate.update([f], 'n', st_mtime=-1)
280 else: 282 else:
281 repo.dirstate.update([f], 'n') 283 repo.dirstate.update([f], 'n')
282 else: 284 elif m == "m": # merge
285 flag, my, other = a[2:]
283 if branchmerge: 286 if branchmerge:
284 # We've done a branch merge, mark this file as merged 287 # We've done a branch merge, mark this file as merged
285 # so that we properly record the merger later 288 # so that we properly record the merger later
286 repo.dirstate.update([f], 'm') 289 repo.dirstate.update([f], 'm')
287 else: 290 else: