comparison mercurial/hg.py @ 363:ae96b7e1318d

Add hg copy -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Add hg copy extend dirstate to remember copies add copy command add copy repo operation write copy metadata with commit manifest hash: 9f42c7b4a2400d35807b5f18c05a31814fa3e375 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCsMBTywK+sNU5EO8RAjXpAJ9fvNtTP1A/4veqFWQHcWGro7buyACgoVXz /ngGOFowxS/zGkvUvGavYGQ= =drb1 -----END PGP SIGNATURE-----
author mpm@selenic.com
date Wed, 15 Jun 2005 15:57:07 -0800
parents 10519e4cbd02
children 4b0f562c61f4 e5d769afd3ef
comparison
equal deleted inserted replaced
362:410373162036 363:ae96b7e1318d
202 self.root = root 202 self.root = root
203 self.dirty = 0 203 self.dirty = 0
204 self.ui = ui 204 self.ui = ui
205 self.map = None 205 self.map = None
206 self.pl = None 206 self.pl = None
207 self.copies = {}
207 208
208 def __del__(self): 209 def __del__(self):
209 if self.dirty: 210 if self.dirty:
210 self.write() 211 self.write()
211 212
251 while pos < len(st): 252 while pos < len(st):
252 e = struct.unpack(">cllll", st[pos:pos+17]) 253 e = struct.unpack(">cllll", st[pos:pos+17])
253 l = e[4] 254 l = e[4]
254 pos += 17 255 pos += 17
255 f = st[pos:pos + l] 256 f = st[pos:pos + l]
257 if '\0' in f:
258 f, c = f.split('\0')
259 self.copies[f] = c
256 self.map[f] = e[:4] 260 self.map[f] = e[:4]
257 pos += l 261 pos += l
262
263 def copy(self, source, dest):
264 self.read()
265 self.dirty = 1
266 self.copies[dest] = source
267
268 def copied(self, file):
269 return self.copies.get(file, None)
258 270
259 def update(self, files, state): 271 def update(self, files, state):
260 ''' current states: 272 ''' current states:
261 n normal 273 n normal
262 m needs merging 274 m needs merging
290 302
291 def write(self): 303 def write(self):
292 st = self.opener("dirstate", "w") 304 st = self.opener("dirstate", "w")
293 st.write("".join(self.pl)) 305 st.write("".join(self.pl))
294 for f, e in self.map.items(): 306 for f, e in self.map.items():
307 c = self.copied(f)
308 if c:
309 f = f + "\0" + c
295 e = struct.pack(">cllll", e[0], e[1], e[2], e[3], len(f)) 310 e = struct.pack(">cllll", e[0], e[1], e[2], e[3], len(f))
296 st.write(e + f) 311 st.write(e + f)
297 self.dirty = 0 312 self.dirty = 0
298 313
299 def copy(self): 314 def dup(self):
300 self.read() 315 self.read()
301 return self.map.copy() 316 return self.map.copy()
302 317
303 # used to avoid circular references so destructors work 318 # used to avoid circular references so destructors work
304 def opener(base): 319 def opener(base):
554 t = file(fp).read() 569 t = file(fp).read()
555 except IOError: 570 except IOError:
556 self.warn("trouble committing %s!\n" % f) 571 self.warn("trouble committing %s!\n" % f)
557 raise 572 raise
558 573
574 meta = {}
575 cp = self.dirstate.copied(f)
576 if cp:
577 meta["copy"] = cp
578 meta["copyrev"] = hex(m1.get(cp, m2.get(cp, nullid)))
579 self.ui.debug(" %s: copy %s:%s\n" % (f, cp, meta["copyrev"]))
580
559 r = self.file(f) 581 r = self.file(f)
560 fp1 = m1.get(f, nullid) 582 fp1 = m1.get(f, nullid)
561 fp2 = m2.get(f, nullid) 583 fp2 = m2.get(f, nullid)
562 new[f] = r.add(t, {}, tr, linkrev, fp1, fp2) 584 new[f] = r.add(t, meta, tr, linkrev, fp1, fp2)
563 585
564 # update manifest 586 # update manifest
565 m1.update(new) 587 m1.update(new)
566 for f in remove: del m1[f] 588 for f in remove: del m1[f]
567 mn = self.manifest.add(m1, mf1, tr, linkrev, c1[0], c2[0]) 589 mn = self.manifest.add(m1, mf1, tr, linkrev, c1[0], c2[0])
598 dc = dict.fromkeys(mf) 620 dc = dict.fromkeys(mf)
599 else: 621 else:
600 changeset = self.dirstate.parents()[0] 622 changeset = self.dirstate.parents()[0]
601 change = self.changelog.read(changeset) 623 change = self.changelog.read(changeset)
602 mf = self.manifest.read(change[0]) 624 mf = self.manifest.read(change[0])
603 dc = self.dirstate.copy() 625 dc = self.dirstate.dup()
604 626
605 def fcmp(fn): 627 def fcmp(fn):
606 t1 = self.wfile(fn).read() 628 t1 = self.wfile(fn).read()
607 t2 = self.file(fn).revision(mf[fn]) 629 t2 = self.file(fn).revision(mf[fn])
608 return cmp(t1, t2) 630 return cmp(t1, t2)
686 self.ui.warn("%s still exists!\n" % f) 708 self.ui.warn("%s still exists!\n" % f)
687 elif f not in self.dirstate: 709 elif f not in self.dirstate:
688 self.ui.warn("%s not tracked!\n" % f) 710 self.ui.warn("%s not tracked!\n" % f)
689 else: 711 else:
690 self.dirstate.update([f], "r") 712 self.dirstate.update([f], "r")
713
714 def copy(self, source, dest):
715 p = self.wjoin(dest)
716 if not os.path.isfile(dest):
717 self.ui.warn("%s does not exist!\n" % dest)
718 else:
719 if self.dirstate.state(dest) == '?':
720 self.dirstate.update([dest], "a")
721 self.dirstate.copy(source, dest)
691 722
692 def heads(self): 723 def heads(self):
693 return self.changelog.heads() 724 return self.changelog.heads()
694 725
695 def branches(self, nodes): 726 def branches(self, nodes):