Mercurial > public > mercurial-scm > hg
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): |