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]) |