459 def wlock(self, wait=1): |
459 def wlock(self, wait=1): |
460 return self.do_lock("wlock", wait, self.dirstate.write, |
460 return self.do_lock("wlock", wait, self.dirstate.write, |
461 self.wreload, |
461 self.wreload, |
462 desc=_('working directory of %s') % self.origroot) |
462 desc=_('working directory of %s') % self.origroot) |
463 |
463 |
464 def checkfilemerge(self, filename, text, filelog, manifest1, manifest2): |
464 def filecommit(self, fn, manifest1, manifest2, linkrev, transaction, changelist): |
465 """ |
465 """ |
466 Determine whether a new filenode is needed and what parent |
466 commit an individual file as part of a larger transaction |
467 and rename information is needed for a file commit. |
|
468 |
|
469 Returns (old entry, file parent 1, file parent 2, metadata) |
|
470 |
|
471 If old entry is not None, a commit is not needed. |
|
472 """ |
467 """ |
473 fp1 = manifest1.get(filename, nullid) |
468 |
474 fp2 = manifest2.get(filename, nullid) |
469 t = self.wread(fn) |
|
470 fl = self.file(fn) |
|
471 fp1 = manifest1.get(fn, nullid) |
|
472 fp2 = manifest2.get(fn, nullid) |
475 |
473 |
476 meta = {} |
474 meta = {} |
477 cp = self.dirstate.copied(filename) |
475 cp = self.dirstate.copied(fn) |
478 if cp: |
476 if cp: |
479 meta["copy"] = cp |
477 meta["copy"] = cp |
480 if not manifest2: # not a branch merge |
478 if not manifest2: # not a branch merge |
481 meta["copyrev"] = hex(manifest1.get(cp, nullid)) |
479 meta["copyrev"] = hex(manifest1.get(cp, nullid)) |
482 fp2 = nullid |
480 fp2 = nullid |
484 meta["copyrev"] = hex(manifest1.get(cp, nullid)) |
482 meta["copyrev"] = hex(manifest1.get(cp, nullid)) |
485 else: # copied on local side, reversed |
483 else: # copied on local side, reversed |
486 meta["copyrev"] = hex(manifest2.get(cp)) |
484 meta["copyrev"] = hex(manifest2.get(cp)) |
487 fp2 = nullid |
485 fp2 = nullid |
488 self.ui.debug(_(" %s: copy %s:%s\n") % |
486 self.ui.debug(_(" %s: copy %s:%s\n") % |
489 (filename, cp, meta["copyrev"])) |
487 (fn, cp, meta["copyrev"])) |
490 fp1 = nullid |
488 fp1 = nullid |
491 elif fp2 != nullid: |
489 elif fp2 != nullid: |
492 # is one parent an ancestor of the other? |
490 # is one parent an ancestor of the other? |
493 fpa = filelog.ancestor(fp1, fp2) |
491 fpa = fl.ancestor(fp1, fp2) |
494 if fpa == fp1: |
492 if fpa == fp1: |
495 fp1, fp2 = fp2, nullid |
493 fp1, fp2 = fp2, nullid |
496 elif fpa == fp2: |
494 elif fpa == fp2: |
497 fp2 = nullid |
495 fp2 = nullid |
498 |
496 |
499 # is the file unmodified from the parent? report existing entry |
497 # is the file unmodified from the parent? report existing entry |
500 if fp2 == nullid and not filelog.cmp(fp1, text): |
498 if fp2 == nullid and not fl.cmp(fp1, t): |
501 return (fp1, None, None, {}) |
499 return fp1 |
502 |
500 |
503 return (None, fp1, fp2, meta) |
501 changelist.append(fn) |
|
502 return fl.add(t, meta, transaction, linkrev, fp1, fp2) |
504 |
503 |
505 def rawcommit(self, files, text, user, date, p1=None, p2=None, wlock=None): |
504 def rawcommit(self, files, text, user, date, p1=None, p2=None, wlock=None): |
506 orig_parent = self.dirstate.parents()[0] or nullid |
505 orig_parent = self.dirstate.parents()[0] or nullid |
507 p1 = p1 or self.dirstate.parents()[0] or nullid |
506 p1 = p1 or self.dirstate.parents()[0] or nullid |
508 p2 = p2 or self.dirstate.parents()[1] or nullid |
507 p2 = p2 or self.dirstate.parents()[1] or nullid |
522 l = self.lock() |
521 l = self.lock() |
523 tr = self.transaction() |
522 tr = self.transaction() |
524 linkrev = self.changelog.count() |
523 linkrev = self.changelog.count() |
525 for f in files: |
524 for f in files: |
526 try: |
525 try: |
527 t = self.wread(f) |
526 m1[f] = self.filecommit(f, m1, m2, linkrev, tr, changed) |
528 m1.set(f, util.is_exec(self.wjoin(f), m1.execf(f))) |
527 m1.set(f, util.is_exec(self.wjoin(f), m1.execf(f))) |
529 r = self.file(f) |
|
530 |
|
531 entry, fp1, fp2, meta = self.checkfilemerge(f, t, r, m1, m2) |
|
532 if entry: |
|
533 m1[f] = entry |
|
534 continue |
|
535 |
|
536 m1[f] = r.add(t, meta, tr, linkrev, fp1, fp2) |
|
537 changed.append(f) |
|
538 if update_dirstate: |
|
539 self.dirstate.update([f], "n") |
|
540 except IOError: |
528 except IOError: |
541 try: |
529 try: |
542 del m1[f] |
530 del m1[f] |
543 if update_dirstate: |
531 if update_dirstate: |
544 self.dirstate.forget([f]) |
532 self.dirstate.forget([f]) |
601 linkrev = self.changelog.count() |
589 linkrev = self.changelog.count() |
602 commit.sort() |
590 commit.sort() |
603 for f in commit: |
591 for f in commit: |
604 self.ui.note(f + "\n") |
592 self.ui.note(f + "\n") |
605 try: |
593 try: |
|
594 new[f] = self.filecommit(f, m1, m2, linkrev, tr, changed) |
606 m1.set(f, util.is_exec(self.wjoin(f), m1.execf(f))) |
595 m1.set(f, util.is_exec(self.wjoin(f), m1.execf(f))) |
607 t = self.wread(f) |
|
608 except IOError: |
596 except IOError: |
609 self.ui.warn(_("trouble committing %s!\n") % f) |
597 self.ui.warn(_("trouble committing %s!\n") % f) |
610 raise |
598 raise |
611 |
|
612 r = self.file(f) |
|
613 |
|
614 entry, fp1, fp2, meta = self.checkfilemerge(f, t, r, m1, m2) |
|
615 if entry: |
|
616 new[f] = entry |
|
617 continue |
|
618 |
|
619 new[f] = r.add(t, meta, tr, linkrev, fp1, fp2) |
|
620 # remember what we've added so that we can later calculate |
|
621 # the files to pull from a set of changesets |
|
622 changed.append(f) |
|
623 |
599 |
624 # update manifest |
600 # update manifest |
625 m1.update(new) |
601 m1.update(new) |
626 for f in remove: |
602 for f in remove: |
627 if f in m1: |
603 if f in m1: |
628 del m1[f] |
604 del m1[f] |
629 mn = self.manifest.add(m1, tr, linkrev, c1[0], c2[0], |
605 mn = self.manifest.add(m1, tr, linkrev, c1[0], c2[0], (new, remove)) |
630 (new, remove)) |
|
631 |
606 |
632 # add changeset |
607 # add changeset |
633 new = new.keys() |
608 new = new.keys() |
634 new.sort() |
609 new.sort() |
635 |
610 |