~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transform.py

  • Committer: INADA Naoki
  • Date: 2011-05-17 00:45:09 UTC
  • mfrom: (5875 +trunk)
  • mto: This revision was merged to the branch mainline in revision 5891.
  • Revision ID: songofacandy@gmail.com-20110517004509-q58negjbdjh7t6u1
mergeĀ fromĀ lp:bzr

Show diffs side-by-side

added added

removed removed

Lines of Context:
1898
1898
        path = self._tree_id_paths.get(trans_id)
1899
1899
        if path is None:
1900
1900
            return None
1901
 
        file_id = self._tree.path2id(path)
1902
 
        try:
1903
 
            return self._tree.kind(file_id)
1904
 
        except errors.NoSuchFile:
1905
 
            return None
 
1901
        kind = self._tree.path_content_summary(path)[0]
 
1902
        if kind == 'missing':
 
1903
            kind = None
 
1904
        return kind
1906
1905
 
1907
1906
    def _set_mode(self, trans_id, mode_id, typefunc):
1908
1907
        """Set the mode of new file contents.
1977
1976
            vf.fallback_versionedfiles.append(base_vf)
1978
1977
        return tree_revision
1979
1978
 
1980
 
    def _stat_limbo_file(self, file_id):
1981
 
        trans_id = self._transform.trans_id_file_id(file_id)
 
1979
    def _stat_limbo_file(self, file_id=None, trans_id=None):
 
1980
        if trans_id is None:
 
1981
            trans_id = self._transform.trans_id_file_id(file_id)
1982
1982
        name = self._transform._limbo_name(trans_id)
1983
1983
        return os.lstat(name)
1984
1984
 
2199
2199
 
2200
2200
    def get_file_size(self, file_id):
2201
2201
        """See Tree.get_file_size"""
 
2202
        trans_id = self._transform.trans_id_file_id(file_id)
 
2203
        kind = self._transform.final_kind(trans_id)
 
2204
        if kind != 'file':
 
2205
            return None
 
2206
        if trans_id in self._transform._new_contents:
 
2207
            return self._stat_limbo_file(trans_id=trans_id).st_size
2202
2208
        if self.kind(file_id) == 'file':
2203
2209
            return self._transform._tree.get_file_size(file_id)
2204
2210
        else:
2232
2238
            except errors.NoSuchId:
2233
2239
                return False
2234
2240
 
 
2241
    def has_filename(self, path):
 
2242
        trans_id = self._path2trans_id(path)
 
2243
        if trans_id in self._transform._new_contents:
 
2244
            return True
 
2245
        elif trans_id in self._transform._removed_contents:
 
2246
            return False
 
2247
        else:
 
2248
            return self._transform._tree.has_filename(path)
 
2249
 
2235
2250
    def path_content_summary(self, path):
2236
2251
        trans_id = self._path2trans_id(path)
2237
2252
        tt = self._transform
2325
2340
                                   self.get_file(file_id).readlines(),
2326
2341
                                   default_revision)
2327
2342
 
2328
 
    def get_symlink_target(self, file_id):
 
2343
    def get_symlink_target(self, file_id, path=None):
2329
2344
        """See Tree.get_symlink_target"""
2330
2345
        if not self._content_change(file_id):
2331
2346
            return self._transform._tree.get_symlink_target(file_id)
2842
2857
                 backups, merge_modified, basis_tree=None):
2843
2858
    if basis_tree is not None:
2844
2859
        basis_tree.lock_read()
2845
 
    change_list = target_tree.iter_changes(working_tree,
 
2860
    # We ask the working_tree for its changes relative to the target, rather
 
2861
    # than the target changes relative to the working tree. Because WT4 has an
 
2862
    # optimizer to compare itself to a target, but no optimizer for the
 
2863
    # reverse.
 
2864
    change_list = working_tree.iter_changes(target_tree,
2846
2865
        specific_files=specific_files, pb=pb)
2847
2866
    if target_tree.get_root_id() is None:
2848
2867
        skip_root = True
2852
2871
        deferred_files = []
2853
2872
        for id_num, (file_id, path, changed_content, versioned, parent, name,
2854
2873
                kind, executable) in enumerate(change_list):
2855
 
            if skip_root and file_id[0] is not None and parent[0] is None:
 
2874
            target_path, wt_path = path
 
2875
            target_versioned, wt_versioned = versioned
 
2876
            target_parent, wt_parent = parent
 
2877
            target_name, wt_name = name
 
2878
            target_kind, wt_kind = kind
 
2879
            target_executable, wt_executable = executable
 
2880
            if skip_root and wt_parent is None:
2856
2881
                continue
2857
2882
            trans_id = tt.trans_id_file_id(file_id)
2858
2883
            mode_id = None
2859
2884
            if changed_content:
2860
2885
                keep_content = False
2861
 
                if kind[0] == 'file' and (backups or kind[1] is None):
 
2886
                if wt_kind == 'file' and (backups or target_kind is None):
2862
2887
                    wt_sha1 = working_tree.get_file_sha1(file_id)
2863
2888
                    if merge_modified.get(file_id) != wt_sha1:
2864
2889
                        # acquire the basis tree lazily to prevent the
2870
2895
                        if file_id in basis_tree:
2871
2896
                            if wt_sha1 != basis_tree.get_file_sha1(file_id):
2872
2897
                                keep_content = True
2873
 
                        elif kind[1] is None and not versioned[1]:
 
2898
                        elif target_kind is None and not target_versioned:
2874
2899
                            keep_content = True
2875
 
                if kind[0] is not None:
 
2900
                if wt_kind is not None:
2876
2901
                    if not keep_content:
2877
2902
                        tt.delete_contents(trans_id)
2878
 
                    elif kind[1] is not None:
2879
 
                        parent_trans_id = tt.trans_id_file_id(parent[0])
 
2903
                    elif target_kind is not None:
 
2904
                        parent_trans_id = tt.trans_id_file_id(wt_parent)
2880
2905
                        backup_name = tt._available_backup_name(
2881
 
                            name[0], parent_trans_id)
 
2906
                            wt_name, parent_trans_id)
2882
2907
                        tt.adjust_path(backup_name, parent_trans_id, trans_id)
2883
 
                        new_trans_id = tt.create_path(name[0], parent_trans_id)
2884
 
                        if versioned == (True, True):
 
2908
                        new_trans_id = tt.create_path(wt_name, parent_trans_id)
 
2909
                        if wt_versioned and target_versioned:
2885
2910
                            tt.unversion_file(trans_id)
2886
2911
                            tt.version_file(file_id, new_trans_id)
2887
2912
                        # New contents should have the same unix perms as old
2888
2913
                        # contents
2889
2914
                        mode_id = trans_id
2890
2915
                        trans_id = new_trans_id
2891
 
                if kind[1] in ('directory', 'tree-reference'):
 
2916
                if target_kind in ('directory', 'tree-reference'):
2892
2917
                    tt.create_directory(trans_id)
2893
 
                    if kind[1] == 'tree-reference':
 
2918
                    if target_kind == 'tree-reference':
2894
2919
                        revision = target_tree.get_reference_revision(file_id,
2895
 
                                                                      path[1])
 
2920
                                                                      target_path)
2896
2921
                        tt.set_tree_reference(revision, trans_id)
2897
 
                elif kind[1] == 'symlink':
 
2922
                elif target_kind == 'symlink':
2898
2923
                    tt.create_symlink(target_tree.get_symlink_target(file_id),
2899
2924
                                      trans_id)
2900
 
                elif kind[1] == 'file':
 
2925
                elif target_kind == 'file':
2901
2926
                    deferred_files.append((file_id, (trans_id, mode_id)))
2902
2927
                    if basis_tree is None:
2903
2928
                        basis_tree = working_tree.basis_tree()
2911
2936
                        merge_modified[file_id] = new_sha1
2912
2937
 
2913
2938
                    # preserve the execute bit when backing up
2914
 
                    if keep_content and executable[0] == executable[1]:
2915
 
                        tt.set_executability(executable[1], trans_id)
2916
 
                elif kind[1] is not None:
2917
 
                    raise AssertionError(kind[1])
2918
 
            if versioned == (False, True):
 
2939
                    if keep_content and wt_executable == target_executable:
 
2940
                        tt.set_executability(target_executable, trans_id)
 
2941
                elif target_kind is not None:
 
2942
                    raise AssertionError(target_kind)
 
2943
            if not wt_versioned and target_versioned:
2919
2944
                tt.version_file(file_id, trans_id)
2920
 
            if versioned == (True, False):
 
2945
            if wt_versioned and not target_versioned:
2921
2946
                tt.unversion_file(trans_id)
2922
 
            if (name[1] is not None and
2923
 
                (name[0] != name[1] or parent[0] != parent[1])):
2924
 
                if name[1] == '' and parent[1] is None:
 
2947
            if (target_name is not None and
 
2948
                (wt_name != target_name or wt_parent != target_parent)):
 
2949
                if target_name == '' and target_parent is None:
2925
2950
                    parent_trans = ROOT_PARENT
2926
2951
                else:
2927
 
                    parent_trans = tt.trans_id_file_id(parent[1])
2928
 
                if parent[0] is None and versioned[0]:
2929
 
                    tt.adjust_root_path(name[1], parent_trans)
 
2952
                    parent_trans = tt.trans_id_file_id(target_parent)
 
2953
                if wt_parent is None and wt_versioned:
 
2954
                    tt.adjust_root_path(target_name, parent_trans)
2930
2955
                else:
2931
 
                    tt.adjust_path(name[1], parent_trans, trans_id)
2932
 
            if executable[0] != executable[1] and kind[1] == "file":
2933
 
                tt.set_executability(executable[1], trans_id)
 
2956
                    tt.adjust_path(target_name, parent_trans, trans_id)
 
2957
            if wt_executable != target_executable and target_kind == "file":
 
2958
                tt.set_executability(target_executable, trans_id)
2934
2959
        if working_tree.supports_content_filtering():
2935
2960
            for index, ((trans_id, mode_id), bytes) in enumerate(
2936
2961
                target_tree.iter_files_bytes(deferred_files)):