~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/textfile.py

  • Committer: Patch Queue Manager
  • Date: 2014-04-09 13:36:25 UTC
  • mfrom: (6592.1.2 1303879-py27-issues)
  • Revision ID: pqm@pqm.ubuntu.com-20140409133625-s24spv3kha2w2860
(vila) Fix python-2.7.6 test failures. (Vincent Ladeuil)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2006 Canonical Ltd
 
2
#
 
3
# This program is free software; you can redistribute it and/or modify
 
4
# it under the terms of the GNU General Public License as published by
 
5
# the Free Software Foundation; either version 2 of the License, or
 
6
# (at your option) any later version.
 
7
#
 
8
# This program is distributed in the hope that it will be useful,
 
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
11
# GNU General Public License for more details.
 
12
#
 
13
# You should have received a copy of the GNU General Public License
 
14
# along with this program; if not, write to the Free Software
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
16
 
 
17
"""Utilities for distinguishing binary files from text files"""
 
18
 
 
19
from __future__ import absolute_import
 
20
 
 
21
from itertools import chain
 
22
 
 
23
from bzrlib.errors import BinaryFile
 
24
from bzrlib.iterablefile import IterableFile
 
25
from bzrlib.osutils import file_iterator
 
26
 
 
27
 
 
28
def text_file(input):
 
29
    """Produce a file iterator that is guaranteed to be text, without seeking.
 
30
    BinaryFile is raised if the file contains a NUL in the first 1024 bytes.
 
31
    """
 
32
    first_chunk = input.read(1024)
 
33
    if '\x00' in first_chunk:
 
34
        raise BinaryFile()
 
35
    return IterableFile(chain((first_chunk,), file_iterator(input)))
 
36
 
 
37
 
 
38
def check_text_lines(lines):
 
39
    """Raise BinaryFile if the supplied lines contain NULs.
 
40
    Only the first 1024 characters are checked.
 
41
    """
 
42
    f = IterableFile(lines)
 
43
    if '\x00' in f.read(1024):
 
44
        raise BinaryFile()
 
45
 
 
46
 
 
47
def check_text_path(path):
 
48
    """Check whether the supplied path is a text, not binary file.
 
49
    Raise BinaryFile if a NUL occurs in the first 1024 bytes.
 
50
    """
 
51
    f = open(path, 'rb')
 
52
    try:
 
53
        text_file(f)
 
54
    finally:
 
55
        f.close()