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