~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/ignores.py

  • Committer: Gordon Tyler
  • Date: 2010-05-03 04:51:58 UTC
  • mto: This revision was merged to the branch mainline in revision 5207.
  • Revision ID: gordon@doxxx.net-20100503045158-q9smvxm7oelm8nm5
Fixed preservation of existing line endings and added tests for that and Unicode handling.

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
"""Lists of ignore files, etc."""
18
18
 
19
19
import errno
 
20
import os
20
21
from cStringIO import StringIO
21
22
 
22
23
import bzrlib
188
189
    # read in the existing ignores set
189
190
    ifn = tree.abspath(bzrlib.IGNORE_FILENAME)
190
191
    if tree.has_filename(ifn):
191
 
        f = open(ifn, 'rt')
 
192
        f = open(ifn, 'rU')
192
193
        try:
193
 
            # grab a copy of the raw contents of the file
194
 
            file_contents = StringIO(f.read())
 
194
            file_contents = f.read()
195
195
            # figure out what kind of line endings are used
196
196
            newline = getattr(f, 'newlines', None)
197
197
            if type(newline) is tuple:
198
198
                newline = newline[0]
199
199
            elif newline is None:
200
 
                newline = '\n'
 
200
                newline = os.linesep
201
201
        finally:
202
202
            f.close()
203
203
    else:
204
 
        file_contents = StringIO()
205
 
        newline = '\n'
206
 
 
207
 
    try:
208
 
        ignores = parse_ignore_file(file_contents)
209
 
    
210
 
        # write out the updated ignores set
211
 
        f = atomicfile.AtomicFile(ifn, 'wb')
212
 
        try:
213
 
            s = file_contents.getvalue()
214
 
            f.write(s)
215
 
            if len(s) > 0 and not s.endswith(newline):
 
204
        file_contents = ""
 
205
        newline = os.linesep
 
206
    
 
207
    sio = StringIO(file_contents)
 
208
    try:
 
209
        ignores = parse_ignore_file(sio)
 
210
    finally:
 
211
        sio.close()
 
212
    
 
213
    # write out the updated ignores set
 
214
    f = atomicfile.AtomicFile(ifn, 'wb')
 
215
    try:
 
216
        # write the original contents, preserving original line endings
 
217
        f.write(newline.join(file_contents.split('\n')))
 
218
        if len(file_contents) > 0 and not file_contents.endswith('\n'):
 
219
            f.write(newline)
 
220
        for pattern in name_pattern_list:
 
221
            if not pattern in ignores:
 
222
                f.write(pattern.encode('utf-8'))
216
223
                f.write(newline)
217
 
            for pattern in name_pattern_list:
218
 
                if not pattern in ignores:
219
 
                    f.write(pattern.encode('utf-8'))
220
 
                    f.write(newline)
221
 
            f.commit()
222
 
        finally:
223
 
            f.close()
 
224
        f.commit()
224
225
    finally:
225
 
        file_contents.close()
 
226
        f.close()
226
227
 
227
228
    if not tree.path2id(bzrlib.IGNORE_FILENAME):
228
229
        tree.add([bzrlib.IGNORE_FILENAME])