comparison mercurial/merge.py @ 3100:87ea5a71f7b9

merge: convert actions to list
author Matt Mackall <mpm@selenic.com>
date Sun, 17 Sep 2006 15:10:56 -0500
parents 1b738357bba9
children 36b08cd92fb7
comparison
equal deleted inserted replaced
2981:1b738357bba9 3100:87ea5a71f7b9
105 repo.ui.debug(_(" overwrite %s branchmerge %s partial %s linear %s\n") % 105 repo.ui.debug(_(" overwrite %s branchmerge %s partial %s linear %s\n") %
106 (overwrite, branchmerge, bool(partial), linear_path)) 106 (overwrite, branchmerge, bool(partial), linear_path))
107 repo.ui.debug(_(" ancestor %s local %s remote %s\n") % 107 repo.ui.debug(_(" ancestor %s local %s remote %s\n") %
108 (short(p1), short(p2), short(pa))) 108 (short(p1), short(p2), short(pa)))
109 109
110 action = {} 110 action = []
111 forget = [] 111 forget = []
112 112
113 # update m1 from working dir 113 # update m1 from working dir
114 umap = dict.fromkeys(unknown) 114 umap = dict.fromkeys(unknown)
115 115
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[f] = (fmerge(f, m1, m2, ma), n[:20], m2[f]) 149 action.append((f, 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[f] = (m2.execf(f), m2[f], None) 156 action.append((f, m2.execf(f), m2[f], None))
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[f] = (m2.execf(f), m2[f], None) 161 action.append((f, m2.execf(f), m2[f], None))
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[f] = (None, None, None) 182 action.append((f, None, None, None))
183 else: 183 else:
184 repo.ui.debug(_("other deleted %s\n") % f) 184 repo.ui.debug(_("other deleted %s\n") % f)
185 action[f] = (None, None, None) 185 action.append((f, None, None, None))
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[f] = (None, None, None) 190 action.append((f, None, None, None))
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[f] = (None, None, None) 194 action.append((f, None, None, None))
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[f] = (m2.execf(f), n, None) 210 action.append((f, m2.execf(f), n, None))
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[f] = (m2.execf(f), n, None) 213 action.append((f, m2.execf(f), n, None))
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[f] = (m2.execf(f), n, None) 217 action.append((f, m2.execf(f), n, None))
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
233 233
234 repo.hook('preupdate', throw=True, parent1=xp1, parent2=xxp2) 234 repo.hook('preupdate', throw=True, parent1=xp1, parent2=xxp2)
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 files = action.keys() 238 action.sort()
239 files.sort() 239 for a in action:
240 for f in files: 240 f, flag, my, other = a
241 flag, my, other = action[f]
242 if f[0] == "/": 241 if f[0] == "/":
243 continue 242 continue
244 if not my: 243 if not my:
245 repo.ui.note(_("removing %s\n") % f) 244 repo.ui.note(_("removing %s\n") % f)
246 util.audit_path(f) 245 util.audit_path(f)
266 265
267 # update dirstate 266 # update dirstate
268 if not partial: 267 if not partial:
269 repo.dirstate.setparents(p1, p2) 268 repo.dirstate.setparents(p1, p2)
270 repo.dirstate.forget(forget) 269 repo.dirstate.forget(forget)
271 files = action.keys() 270 for a in action:
272 files.sort() 271 f, flag, my, other = a
273 for f in files:
274 flag, my, other = action[f]
275 if not my: 272 if not my:
276 if branchmerge: 273 if branchmerge:
277 repo.dirstate.update([f], 'r') 274 repo.dirstate.update([f], 'r')
278 else: 275 else:
279 repo.dirstate.forget([f]) 276 repo.dirstate.forget([f])