~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/diff.py

  • Committer: Jelmer Vernooij
  • Date: 2011-05-16 13:39:39 UTC
  • mto: (5923.1.1 trunk)
  • mto: This revision was merged to the branch mainline in revision 5925.
  • Revision ID: jelmer@samba.org-20110516133939-8u1pc9utas3uw1lt
Require a unicode prompt to be passed into all methods that prompt.

Show diffs side-by-side

added added

removed removed

Lines of Context:
463
463
    """Show in text form the changes from one tree to another.
464
464
 
465
465
    :param to_file: The output stream.
466
 
    :param specific_files: Include only changes to these files - None for all
 
466
    :param specific_files:Include only changes to these files - None for all
467
467
        changes.
468
468
    :param external_diff_options: If set, use an external GNU diff and pass 
469
469
        these options.
745
745
 
746
746
    def _get_command(self, old_path, new_path):
747
747
        my_map = {'old_path': old_path, 'new_path': new_path}
748
 
        command = [AtTemplate(t).substitute(my_map) for t in
749
 
                   self.command_template]
750
 
        if sys.platform == 'win32': # Popen doesn't accept unicode on win32
751
 
            command_encoded = []
752
 
            for c in command:
753
 
                if isinstance(c, unicode):
754
 
                    command_encoded.append(c.encode('mbcs'))
755
 
                else:
756
 
                    command_encoded.append(c)
757
 
            return command_encoded
758
 
        else:
759
 
            return command
 
748
        return [AtTemplate(t).substitute(my_map) for t in
 
749
                self.command_template]
760
750
 
761
751
    def _execute(self, old_path, new_path):
762
752
        command = self._get_command(old_path, new_path)
782
772
                raise
783
773
        return True
784
774
 
785
 
    @staticmethod
786
 
    def _fenc():
787
 
        """Returns safe encoding for passing file path to diff tool"""
788
 
        if sys.platform == 'win32':
789
 
            return 'mbcs'
790
 
        else:
791
 
            # Don't fallback to 'utf-8' because subprocess may not be able to
792
 
            # handle utf-8 correctly when locale is not utf-8.
793
 
            return sys.getfilesystemencoding() or 'ascii'
794
 
 
795
 
    def _is_safepath(self, path):
796
 
        """Return true if `path` may be able to pass to subprocess."""
797
 
        fenc = self._fenc()
798
 
        try:
799
 
            return path == path.encode(fenc).decode(fenc)
800
 
        except UnicodeError:
801
 
            return False
802
 
 
803
 
    def _safe_filename(self, prefix, relpath):
804
 
        """Replace unsafe character in `relpath` then join `self._root`,
805
 
        `prefix` and `relpath`."""
806
 
        fenc = self._fenc()
807
 
        # encoded_str.replace('?', '_') may break multibyte char.
808
 
        # So we should encode, decode, then replace(u'?', u'_')
809
 
        relpath_tmp = relpath.encode(fenc, 'replace').decode(fenc, 'replace')
810
 
        relpath_tmp = relpath_tmp.replace(u'?', u'_')
811
 
        return osutils.pathjoin(self._root, prefix, relpath_tmp)
812
 
 
813
775
    def _write_file(self, file_id, tree, prefix, relpath, force_temp=False,
814
776
                    allow_write=False):
815
777
        if not force_temp and isinstance(tree, WorkingTree):
816
 
            full_path = tree.abspath(tree.id2path(file_id))
817
 
            if self._is_safepath(full_path):
818
 
                return full_path
819
 
 
820
 
        full_path = self._safe_filename(prefix, relpath)
 
778
            return tree.abspath(tree.id2path(file_id))
 
779
        
 
780
        full_path = osutils.pathjoin(self._root, prefix, relpath)
821
781
        if not force_temp and self._try_symlink_root(tree, prefix):
822
782
            return full_path
823
783
        parent_dir = osutils.dirname(full_path)
880
840
        """
881
841
        old_path = self.old_tree.id2path(file_id)
882
842
        new_path = self.new_tree.id2path(file_id)
883
 
        old_abs_path, new_abs_path = self._prepare_files(
884
 
                                            file_id, old_path, new_path,
885
 
                                            allow_write_new=True,
886
 
                                            force_temp=True)
887
 
        command = self._get_command(old_abs_path, new_abs_path)
 
843
        new_abs_path = self._prepare_files(file_id, old_path, new_path,
 
844
                                           allow_write_new=True,
 
845
                                           force_temp=True)[1]
 
846
        command = self._get_command(osutils.pathjoin('old', old_path),
 
847
                                    osutils.pathjoin('new', new_path))
888
848
        subprocess.call(command, cwd=self._root)
889
 
        new_file = open(new_abs_path, 'rb')
 
849
        new_file = open(new_abs_path, 'r')
890
850
        try:
891
851
            return new_file.read()
892
852
        finally:
942
902
        """Factory for producing a DiffTree.
943
903
 
944
904
        Designed to accept options used by show_diff_trees.
945
 
 
946
905
        :param old_tree: The tree to show as old in the comparison
947
906
        :param new_tree: The tree to show as new in the comparison
948
907
        :param to_file: File to write comparisons to