comparison mercurial/util.py @ 1285:1546c2aa6b30

Make 'hg import' platform independent. - moved popen("patch ...") from commands.py to util.py - files may not be single quoted in popen under windows: fixed - patch returns the files quoted under windows. quotes need to be stripped off: fixed
author Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
date Tue, 20 Sep 2005 21:35:51 -0700
parents fc3b41570082
children 141951276ba1 2073e5a71008
comparison
equal deleted inserted replaced
1284:59d07a6bd513 1285:1546c2aa6b30
28 f = pout.read() 28 f = pout.read()
29 pout.close() 29 pout.close()
30 w.join() 30 w.join()
31 return f 31 return f
32 32
33 def patch(strip, patchname, ui):
34 """apply the patch <patchname> to the working directory.
35 a list of patched files is returned"""
36 fp = os.popen('patch -p%d < "%s"' % (strip, patchname))
37 files = {}
38 for line in fp:
39 line = line.rstrip()
40 ui.status("%s\n" % line)
41 if line.startswith('patching file '):
42 pf = parse_patch_output(line)
43 files.setdefault(pf, 1)
44 code = fp.close()
45 if code:
46 raise Abort("patch command failed: exit status %s " % code)
47 return files.keys()
48
33 def binary(s): 49 def binary(s):
34 """return true if a string is binary data using diff's heuristic""" 50 """return true if a string is binary data using diff's heuristic"""
35 if s and '\0' in s[:4096]: 51 if s and '\0' in s[:4096]:
36 return True 52 return True
37 return False 53 return False
313 329
314 # Platform specific variants 330 # Platform specific variants
315 if os.name == 'nt': 331 if os.name == 'nt':
316 nulldev = 'NUL:' 332 nulldev = 'NUL:'
317 333
334 def parse_patch_output(output_line):
335 """parses the output produced by patch and returns the file name"""
336 pf = output_line[14:]
337 if pf[0] == '`':
338 pf = pf[1:-1] # Remove the quotes
339 return pf
340
318 try: # ActivePython can create hard links using win32file module 341 try: # ActivePython can create hard links using win32file module
319 import win32file 342 import win32file
320 343
321 def os_link(src, dst): # NB will only succeed on NTFS 344 def os_link(src, dst): # NB will only succeed on NTFS
322 win32file.CreateHardLink(dst, src) 345 win32file.CreateHardLink(dst, src)
357 def explain_exit(code): 380 def explain_exit(code):
358 return "exited with status %d" % code, code 381 return "exited with status %d" % code, code
359 382
360 else: 383 else:
361 nulldev = '/dev/null' 384 nulldev = '/dev/null'
385
386 def parse_patch_output(output_line):
387 """parses the output produced by patch and returns the file name"""
388 return output_line[14:]
362 389
363 def is_exec(f, last): 390 def is_exec(f, last):
364 """check whether a file is executable""" 391 """check whether a file is executable"""
365 return (os.stat(f).st_mode & 0100 != 0) 392 return (os.stat(f).st_mode & 0100 != 0)
366 393