/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/repofmt/pack_repo.py

Merge bzr.dev into cleanup

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006, 2007, 2008 Canonical Ltd
 
1
# Copyright (C) 2007-2010 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
1545
1545
                self._remove_pack_from_memory(pack)
1546
1546
        # record the newly available packs and stop advertising the old
1547
1547
        # packs
1548
 
        result = self._save_pack_names(clear_obsolete_packs=True)
1549
 
        # Move the old packs out of the way now they are no longer referenced.
1550
 
        for revision_count, packs in pack_operations:
1551
 
            self._obsolete_packs(packs)
 
1548
        to_be_obsoleted = []
 
1549
        for _, packs in pack_operations:
 
1550
            to_be_obsoleted.extend(packs)
 
1551
        result = self._save_pack_names(clear_obsolete_packs=True,
 
1552
                                       obsolete_packs=to_be_obsoleted)
1552
1553
        return result
1553
1554
 
1554
1555
    def _flush_new_pack(self):
1788
1789
        :param return: None.
1789
1790
        """
1790
1791
        for pack in packs:
1791
 
            pack.pack_transport.rename(pack.file_name(),
1792
 
                '../obsolete_packs/' + pack.file_name())
 
1792
            try:
 
1793
                pack.pack_transport.rename(pack.file_name(),
 
1794
                    '../obsolete_packs/' + pack.file_name())
 
1795
            except (errors.PathError, errors.TransportError), e:
 
1796
                # TODO: Should these be warnings or mutters?
 
1797
                mutter("couldn't rename obsolete pack, skipping it:\n%s"
 
1798
                       % (e,))
1793
1799
            # TODO: Probably needs to know all possible indices for this pack
1794
1800
            # - or maybe list the directory and move all indices matching this
1795
1801
            # name whether we recognize it or not?
1797
1803
            if self.chk_index is not None:
1798
1804
                suffixes.append('.cix')
1799
1805
            for suffix in suffixes:
1800
 
                self._index_transport.rename(pack.name + suffix,
1801
 
                    '../obsolete_packs/' + pack.name + suffix)
 
1806
                try:
 
1807
                    self._index_transport.rename(pack.name + suffix,
 
1808
                        '../obsolete_packs/' + pack.name + suffix)
 
1809
                except (errors.PathError, errors.TransportError), e:
 
1810
                    mutter("couldn't rename obsolete index, skipping it:\n%s"
 
1811
                           % (e,))
1802
1812
 
1803
1813
    def pack_distribution(self, total_revisions):
1804
1814
        """Generate a list of the number of revisions to put in each pack.
1876
1886
        disk_nodes = set()
1877
1887
        for index, key, value in self._iter_disk_pack_index():
1878
1888
            disk_nodes.add((key, value))
 
1889
        orig_disk_nodes = set(disk_nodes)
1879
1890
 
1880
1891
        # do a two-way diff against our original content
1881
1892
        current_nodes = set()
1894
1905
        disk_nodes.difference_update(deleted_nodes)
1895
1906
        disk_nodes.update(new_nodes)
1896
1907
 
1897
 
        return disk_nodes, deleted_nodes, new_nodes
 
1908
        return disk_nodes, deleted_nodes, new_nodes, orig_disk_nodes
1898
1909
 
1899
1910
    def _syncronize_pack_names_from_disk_nodes(self, disk_nodes):
1900
1911
        """Given the correct set of pack files, update our saved info.
1940
1951
                added.append(name)
1941
1952
        return removed, added, modified
1942
1953
 
1943
 
    def _save_pack_names(self, clear_obsolete_packs=False):
 
1954
    def _save_pack_names(self, clear_obsolete_packs=False, obsolete_packs=None):
1944
1955
        """Save the list of packs.
1945
1956
 
1946
1957
        This will take out the mutex around the pack names list for the
1950
1961
 
1951
1962
        :param clear_obsolete_packs: If True, clear out the contents of the
1952
1963
            obsolete_packs directory.
 
1964
        :param obsolete_packs: Packs that are obsolete once the new pack-names
 
1965
            file has been written.
1953
1966
        :return: A list of the names saved that were not previously on disk.
1954
1967
        """
 
1968
        already_obsolete = []
1955
1969
        self.lock_names()
1956
1970
        try:
1957
1971
            builder = self._index_builder_class()
1958
 
            disk_nodes, deleted_nodes, new_nodes = self._diff_pack_names()
 
1972
            (disk_nodes, deleted_nodes, new_nodes,
 
1973
             orig_disk_nodes) = self._diff_pack_names()
1959
1974
            # TODO: handle same-name, index-size-changes here -
1960
1975
            # e.g. use the value from disk, not ours, *unless* we're the one
1961
1976
            # changing it.
1963
1978
                builder.add_node(key, value)
1964
1979
            self.transport.put_file('pack-names', builder.finish(),
1965
1980
                mode=self.repo.bzrdir._get_file_mode())
1966
 
            # move the baseline forward
1967
1981
            self._packs_at_load = disk_nodes
1968
1982
            if clear_obsolete_packs:
1969
 
                self._clear_obsolete_packs()
 
1983
                to_preserve = None
 
1984
                if obsolete_packs:
 
1985
                    to_preserve = set([o.name for o in obsolete_packs])
 
1986
                already_obsolete = self._clear_obsolete_packs(to_preserve)
1970
1987
        finally:
1971
1988
            self._unlock_names()
1972
1989
        # synchronise the memory packs list with what we just wrote:
1973
1990
        self._syncronize_pack_names_from_disk_nodes(disk_nodes)
 
1991
        if obsolete_packs:
 
1992
            # TODO: We could add one more condition here. "if o.name not in
 
1993
            #       orig_disk_nodes and o != the new_pack we haven't written to
 
1994
            #       disk yet. However, the new pack object is not easily
 
1995
            #       accessible here (it would have to be passed through the
 
1996
            #       autopacking code, etc.)
 
1997
            obsolete_packs = [o for o in obsolete_packs
 
1998
                              if o.name not in already_obsolete]
 
1999
            self._obsolete_packs(obsolete_packs)
1974
2000
        return [new_node[0][0] for new_node in new_nodes]
1975
2001
 
1976
2002
    def reload_pack_names(self):
1991
2017
        if first_read:
1992
2018
            return True
1993
2019
        # out the new value.
1994
 
        disk_nodes, _, _ = self._diff_pack_names()
1995
 
        self._packs_at_load = disk_nodes
 
2020
        (disk_nodes, deleted_nodes, new_nodes,
 
2021
         orig_disk_nodes) = self._diff_pack_names()
 
2022
        # _packs_at_load is meant to be the explicit list of names in
 
2023
        # 'pack-names' at then start. As such, it should not contain any
 
2024
        # pending names that haven't been written out yet.
 
2025
        self._packs_at_load = orig_disk_nodes
1996
2026
        (removed, added,
1997
2027
         modified) = self._syncronize_pack_names_from_disk_nodes(disk_nodes)
1998
2028
        if removed or added or modified:
2007
2037
            raise
2008
2038
        raise errors.RetryAutopack(self.repo, False, sys.exc_info())
2009
2039
 
2010
 
    def _clear_obsolete_packs(self):
 
2040
    def _clear_obsolete_packs(self, preserve=None):
2011
2041
        """Delete everything from the obsolete-packs directory.
 
2042
 
 
2043
        :return: A list of pack identifiers (the filename without '.pack') that
 
2044
            were found in obsolete_packs.
2012
2045
        """
 
2046
        found = []
2013
2047
        obsolete_pack_transport = self.transport.clone('obsolete_packs')
 
2048
        if preserve is None:
 
2049
            preserve = set()
2014
2050
        for filename in obsolete_pack_transport.list_dir('.'):
 
2051
            name, ext = osutils.splitext(filename)
 
2052
            if ext == '.pack':
 
2053
                found.append(name)
 
2054
            if name in preserve:
 
2055
                continue
2015
2056
            try:
2016
2057
                obsolete_pack_transport.delete(filename)
2017
2058
            except (errors.PathError, errors.TransportError), e:
2018
 
                warning("couldn't delete obsolete pack, skipping it:\n%s" % (e,))
 
2059
                warning("couldn't delete obsolete pack, skipping it:\n%s"
 
2060
                        % (e,))
 
2061
        return found
2019
2062
 
2020
2063
    def _start_write_group(self):
2021
2064
        # Do not permit preparation for writing if we're not in a 'write lock'.