Mercurial > hg-stable
comparison mercurial/patch.py @ 7391:27d304c8cc03
patch: pass an opener to patchfile
author | Patrick Mezard <pmezard@gmail.com> |
---|---|
date | Wed, 19 Nov 2008 13:27:57 +0100 |
parents | 72f0e4ebd9e6 |
children | 564326a6ef9c |
comparison
equal
deleted
inserted
replaced
7390:0d1c770c6be1 | 7391:27d304c8cc03 |
---|---|
226 # @@ -start,len +start,len @@ or @@ -start +start @@ if len is 1 | 226 # @@ -start,len +start,len @@ or @@ -start +start @@ if len is 1 |
227 unidesc = re.compile('@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))? @@') | 227 unidesc = re.compile('@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))? @@') |
228 contextdesc = re.compile('(---|\*\*\*) (\d+)(,(\d+))? (---|\*\*\*)') | 228 contextdesc = re.compile('(---|\*\*\*) (\d+)(,(\d+))? (---|\*\*\*)') |
229 | 229 |
230 class patchfile: | 230 class patchfile: |
231 def __init__(self, ui, fname, missing=False): | 231 def __init__(self, ui, fname, opener, missing=False): |
232 self.fname = fname | 232 self.fname = fname |
233 self.opener = opener | |
233 self.ui = ui | 234 self.ui = ui |
234 self.lines = [] | 235 self.lines = [] |
235 self.exists = False | 236 self.exists = False |
236 self.missing = missing | 237 self.missing = missing |
237 if not missing: | 238 if not missing: |
238 try: | 239 try: |
239 fp = file(fname, 'rb') | 240 fp = self.opener(fname, 'r') |
240 self.lines = fp.readlines() | 241 self.lines = fp.readlines() |
242 fp.close() | |
241 self.exists = True | 243 self.exists = True |
242 except IOError: | 244 except IOError: |
243 pass | 245 pass |
244 else: | 246 else: |
245 self.ui.warn(_("unable to find '%s' for patching\n") % self.fname) | 247 self.ui.warn(_("unable to find '%s' for patching\n") % self.fname) |
246 | |
247 if not self.exists: | |
248 dirname = os.path.dirname(fname) | |
249 if dirname and not os.path.isdir(dirname): | |
250 os.makedirs(dirname) | |
251 | 248 |
252 self.hash = {} | 249 self.hash = {} |
253 self.dirty = 0 | 250 self.dirty = 0 |
254 self.offset = 0 | 251 self.offset = 0 |
255 self.rej = [] | 252 self.rej = [] |
305 | 302 |
306 fname = self.fname + ".rej" | 303 fname = self.fname + ".rej" |
307 self.ui.warn( | 304 self.ui.warn( |
308 _("%d out of %d hunks FAILED -- saving rejects to file %s\n") % | 305 _("%d out of %d hunks FAILED -- saving rejects to file %s\n") % |
309 (len(self.rej), self.hunks, fname)) | 306 (len(self.rej), self.hunks, fname)) |
310 fp = file(fname, 'wb') | |
311 base = os.path.basename(self.fname) | 307 base = os.path.basename(self.fname) |
308 fp = self.opener(fname, 'w') | |
312 fp.write("--- %s\n+++ %s\n" % (base, base)) | 309 fp.write("--- %s\n+++ %s\n" % (base, base)) |
313 for x in self.rej: | 310 for x in self.rej: |
314 for l in x.hunk: | 311 for l in x.hunk: |
315 fp.write(l) | 312 fp.write(l) |
316 if l[-1] != '\n': | 313 if l[-1] != '\n': |
317 fp.write("\n\ No newline at end of file\n") | 314 fp.write("\n\ No newline at end of file\n") |
315 fp.close() | |
318 | 316 |
319 def write(self, dest=None): | 317 def write(self, dest=None): |
320 if self.dirty: | 318 if not self.dirty: |
321 if not dest: | 319 return |
322 dest = self.fname | 320 if not dest: |
323 st = None | 321 dest = self.fname |
324 try: | 322 fp = self.opener(dest, 'w') |
325 st = os.lstat(dest) | 323 for l in self.lines: |
326 except OSError, inst: | 324 fp.write(l) |
327 if inst.errno != errno.ENOENT: | 325 fp.close() |
328 raise | |
329 if st and st.st_nlink > 1: | |
330 os.unlink(dest) | |
331 fp = file(dest, 'wb') | |
332 if st and st.st_nlink > 1: | |
333 os.chmod(dest, st.st_mode) | |
334 fp.writelines(self.lines) | |
335 fp.close() | |
336 | 326 |
337 def close(self): | 327 def close(self): |
338 self.write() | 328 self.write() |
339 self.write_rej() | 329 self.write_rej() |
340 | 330 |
933 | 923 |
934 rejects = 0 | 924 rejects = 0 |
935 err = 0 | 925 err = 0 |
936 current_file = None | 926 current_file = None |
937 gitpatches = None | 927 gitpatches = None |
928 opener = util.opener(os.getcwd()) | |
938 | 929 |
939 def closefile(): | 930 def closefile(): |
940 if not current_file: | 931 if not current_file: |
941 return 0 | 932 return 0 |
942 current_file.close() | 933 current_file.close() |
955 elif state == 'file': | 946 elif state == 'file': |
956 rejects += closefile() | 947 rejects += closefile() |
957 afile, bfile, first_hunk = values | 948 afile, bfile, first_hunk = values |
958 try: | 949 try: |
959 if sourcefile: | 950 if sourcefile: |
960 current_file = patchfile(ui, sourcefile) | 951 current_file = patchfile(ui, sourcefile, opener) |
961 else: | 952 else: |
962 current_file, missing = selectfile(afile, bfile, first_hunk, | 953 current_file, missing = selectfile(afile, bfile, first_hunk, |
963 strip, reverse) | 954 strip, reverse) |
964 current_file = patchfile(ui, current_file, missing) | 955 current_file = patchfile(ui, current_file, opener, missing) |
965 except PatchError, err: | 956 except PatchError, err: |
966 ui.warn(str(err) + '\n') | 957 ui.warn(str(err) + '\n') |
967 current_file, current_hunk = None, None | 958 current_file, current_hunk = None, None |
968 rejects += 1 | 959 rejects += 1 |
969 continue | 960 continue |