1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
|
# Copyright (C) 2005, 2006 Canonical Development Ltd
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
"""Lists of ignore files, etc."""
import errno
from bzrlib import config
# This was the full ignore list for bzr 0.8
# please keep these sorted (in C locale order) to aid merging
OLD_DEFAULTS = [
'#*#',
'*$',
'*,v',
'*.BAK',
'*.a',
'*.bak',
'*.elc',
'*.exe',
'*.la',
'*.lo',
'*.o',
'*.obj',
'*.orig',
'*.py[oc]',
'*.so',
'*.tmp',
'*~',
'.#*',
'.*.sw[nop]',
'.*.tmp',
# Our setup tests dump .python-eggs in the bzr source tree root
'./.python-eggs',
'.DS_Store',
'.arch-ids',
'.arch-inventory',
'.bzr.log',
'.del-*',
'.git',
'.hg',
'.jamdeps'
'.libs',
'.make.state',
'.sconsign*',
'.svn',
'.sw[nop]', # vim editing nameless file
'.tmp*',
'BitKeeper',
'CVS',
'CVS.adm',
'RCS',
'SCCS',
'TAGS',
'_darcs',
'aclocal.m4',
'autom4te*',
'config.h',
'config.h.in',
'config.log',
'config.status',
'config.sub',
'stamp-h',
'stamp-h.in',
'stamp-h1',
'{arch}',
]
# ~/.bazaar/ignore will be filled out using
# this ignore list, if it does not exist
# please keep these sorted (in C locale order) to aid merging
USER_DEFAULTS = [
'*.a',
'*.o',
'*.py[co]',
'*.so',
'*.sw[nop]',
'*~',
'.#*',
'[#]*#',
]
def parse_ignore_file(f):
"""Read in all of the lines in the file and turn it into an ignore list"""
ignored = []
for line in f.read().decode('utf8').split('\n'):
line = line.rstrip('\r\n')
if not line or line.startswith('#'):
continue
ignored.append(line)
return ignored
def get_user_ignores():
"""Get the list of user ignored files, possibly creating it."""
path = config.user_ignore_config_filename()
patterns = USER_DEFAULTS[:]
try:
f = open(path, 'rb')
except (IOError, OSError), e:
if e.errno not in (errno.ENOENT,):
raise
# Create the ignore file, and just return the default
# We want to ignore if we can't write to the file
# since get_* should be a safe operation
try:
set_user_ignores(USER_DEFAULTS)
except (IOError, OSError), e:
if e.errno not in (errno.EPERM,):
raise
return patterns
try:
return parse_ignore_file(f)
finally:
f.close()
def set_user_ignores(patterns):
"""Fill out the user ignore file with the given patterns
This may raise an error if it doesn't have permission to
write to the user ignore file.
"""
ignore_path = config.user_ignore_config_filename()
config.ensure_config_dir_exists()
# Create an empty file
f = open(ignore_path, 'wb')
try:
for pattern in patterns:
f.write(pattern.encode('utf8') + '\n')
finally:
f.close()
def add_unique_user_ignores(new_ignores):
"""Add entries to the user's ignore list if not present.
:param new_ignores: A list of ignore patterns
:return: The list of ignores that were added
"""
ignored = set(get_user_ignores())
to_add = []
for ignore in new_ignores:
if ignore not in ignored:
ignored.add(ignore)
to_add.append(ignore)
if not to_add:
return []
f = open(config.user_ignore_config_filename(), 'ab')
try:
for pattern in to_add:
f.write(pattern.encode('utf8') + '\n')
finally:
f.close()
return to_add
|