5 # This software may be used and distributed according to the terms |
5 # This software may be used and distributed according to the terms |
6 # of the GNU General Public License, incorporated herein by reference. |
6 # of the GNU General Public License, incorporated herein by reference. |
7 |
7 |
8 from node import * |
8 from node import * |
9 from i18n import _ |
9 from i18n import _ |
10 import repo, appendfile, changegroup |
10 import repo, changegroup |
11 import changelog, dirstate, filelog, manifest, context |
11 import changelog, dirstate, filelog, manifest, context |
12 import re, lock, transaction, tempfile, stat, mdiff, errno, ui |
12 import re, lock, transaction, tempfile, stat, mdiff, errno, ui |
13 import os, revlog, time, util |
13 import os, revlog, time, util |
14 |
14 |
15 class localrepository(repo.repository): |
15 class localrepository(repo.repository): |
1780 |
1780 |
1781 tr = self.transaction() |
1781 tr = self.transaction() |
1782 |
1782 |
1783 # write changelog data to temp files so concurrent readers will not see |
1783 # write changelog data to temp files so concurrent readers will not see |
1784 # inconsistent view |
1784 # inconsistent view |
1785 cl = None |
1785 cl = self.changelog |
1786 try: |
1786 cl.delayupdate() |
1787 cl = appendfile.appendchangelog(self.sopener) |
1787 oldheads = len(cl.heads()) |
1788 oldheads = len(cl.heads()) |
1788 |
1789 |
1789 # pull off the changeset group |
1790 # pull off the changeset group |
1790 self.ui.status(_("adding changesets\n")) |
1791 self.ui.status(_("adding changesets\n")) |
1791 cor = cl.count() - 1 |
1792 cor = cl.count() - 1 |
1792 chunkiter = changegroup.chunkiter(source) |
|
1793 if cl.addgroup(chunkiter, csmap, tr, 1) is None: |
|
1794 raise util.Abort(_("received changelog group is empty")) |
|
1795 cnr = cl.count() - 1 |
|
1796 changesets = cnr - cor |
|
1797 |
|
1798 # pull off the manifest group |
|
1799 self.ui.status(_("adding manifests\n")) |
|
1800 chunkiter = changegroup.chunkiter(source) |
|
1801 # no need to check for empty manifest group here: |
|
1802 # if the result of the merge of 1 and 2 is the same in 3 and 4, |
|
1803 # no new manifest will be created and the manifest group will |
|
1804 # be empty during the pull |
|
1805 self.manifest.addgroup(chunkiter, revmap, tr) |
|
1806 |
|
1807 # process the files |
|
1808 self.ui.status(_("adding file changes\n")) |
|
1809 while 1: |
|
1810 f = changegroup.getchunk(source) |
|
1811 if not f: |
|
1812 break |
|
1813 self.ui.debug(_("adding %s revisions\n") % f) |
|
1814 fl = self.file(f) |
|
1815 o = fl.count() |
1793 chunkiter = changegroup.chunkiter(source) |
1816 chunkiter = changegroup.chunkiter(source) |
1794 if cl.addgroup(chunkiter, csmap, tr, 1) is None: |
1817 if fl.addgroup(chunkiter, revmap, tr) is None: |
1795 raise util.Abort(_("received changelog group is empty")) |
1818 raise util.Abort(_("received file revlog group is empty")) |
1796 cnr = cl.count() - 1 |
1819 revisions += fl.count() - o |
1797 changesets = cnr - cor |
1820 files += 1 |
1798 |
|
1799 # pull off the manifest group |
|
1800 self.ui.status(_("adding manifests\n")) |
|
1801 chunkiter = changegroup.chunkiter(source) |
|
1802 # no need to check for empty manifest group here: |
|
1803 # if the result of the merge of 1 and 2 is the same in 3 and 4, |
|
1804 # no new manifest will be created and the manifest group will |
|
1805 # be empty during the pull |
|
1806 self.manifest.addgroup(chunkiter, revmap, tr) |
|
1807 |
|
1808 # process the files |
|
1809 self.ui.status(_("adding file changes\n")) |
|
1810 while 1: |
|
1811 f = changegroup.getchunk(source) |
|
1812 if not f: |
|
1813 break |
|
1814 self.ui.debug(_("adding %s revisions\n") % f) |
|
1815 fl = self.file(f) |
|
1816 o = fl.count() |
|
1817 chunkiter = changegroup.chunkiter(source) |
|
1818 if fl.addgroup(chunkiter, revmap, tr) is None: |
|
1819 raise util.Abort(_("received file revlog group is empty")) |
|
1820 revisions += fl.count() - o |
|
1821 files += 1 |
|
1822 |
|
1823 cl.writedata() |
|
1824 finally: |
|
1825 if cl: |
|
1826 cl.cleanup() |
|
1827 |
1821 |
1828 # make changelog see real files again |
1822 # make changelog see real files again |
1829 self.changelog = changelog.changelog(self.sopener) |
1823 cl.finalize(tr) |
1830 self.changelog.checkinlinesize(tr) |
|
1831 |
1824 |
1832 newheads = len(self.changelog.heads()) |
1825 newheads = len(self.changelog.heads()) |
1833 heads = "" |
1826 heads = "" |
1834 if oldheads and newheads != oldheads: |
1827 if oldheads and newheads != oldheads: |
1835 heads = _(" (%+d heads)") % (newheads - oldheads) |
1828 heads = _(" (%+d heads)") % (newheads - oldheads) |