comparison mercurial/util.py @ 2085:f71e9656524f

merge revlogng with mpm tip
author Chris Mason <mason@suse.com>
date Tue, 18 Apr 2006 19:50:12 -0400
parents 345107e167a0 67a0a3852024
children eb40db373717
comparison
equal deleted inserted replaced
2084:d66278012853 2085:f71e9656524f
69 for name, fn in filtertable.iteritems(): 69 for name, fn in filtertable.iteritems():
70 if cmd.startswith(name): 70 if cmd.startswith(name):
71 return fn(s, cmd[len(name):].lstrip()) 71 return fn(s, cmd[len(name):].lstrip())
72 return pipefilter(s, cmd) 72 return pipefilter(s, cmd)
73 73
74 def find_in_path(name, path, default=None):
75 '''find name in search path. path can be string (will be split
76 with os.pathsep), or iterable thing that returns strings. if name
77 found, return path to name. else return default.'''
78 if isinstance(path, str):
79 path = path.split(os.pathsep)
80 for p in path:
81 p_name = os.path.join(p, name)
82 if os.path.exists(p_name):
83 return p_name
84 return default
85
74 def patch(strip, patchname, ui): 86 def patch(strip, patchname, ui):
75 """apply the patch <patchname> to the working directory. 87 """apply the patch <patchname> to the working directory.
76 a list of patched files is returned""" 88 a list of patched files is returned"""
77 fp = os.popen('patch -p%d < "%s"' % (strip, patchname)) 89 patcher = find_in_path('gpatch', os.environ.get('PATH', ''), 'patch')
90 fp = os.popen('"%s" -p%d < "%s"' % (patcher, strip, patchname))
78 files = {} 91 files = {}
79 for line in fp: 92 for line in fp:
80 line = line.rstrip() 93 line = line.rstrip()
81 ui.status("%s\n" % line) 94 ui.status("%s\n" % line)
82 if line.startswith('patching file '): 95 if line.startswith('patching file '):
371 384
372 def unlink(f): 385 def unlink(f):
373 """unlink and remove the directory if it is empty""" 386 """unlink and remove the directory if it is empty"""
374 os.unlink(f) 387 os.unlink(f)
375 # try removing directories that might now be empty 388 # try removing directories that might now be empty
376 try: os.removedirs(os.path.dirname(f)) 389 try:
377 except: pass 390 os.removedirs(os.path.dirname(f))
391 except OSError:
392 pass
378 393
379 def copyfiles(src, dst, hardlink=None): 394 def copyfiles(src, dst, hardlink=None):
380 """Copy a directory tree using hardlinks if possible""" 395 """Copy a directory tree using hardlinks if possible"""
381 396
382 if hardlink is None: 397 if hardlink is None:
528 self.close() 543 self.close()
529 raise IOError(errno.EPIPE, 'Broken pipe') 544 raise IOError(errno.EPIPE, 'Broken pipe')
530 545
531 sys.stdout = winstdout(sys.stdout) 546 sys.stdout = winstdout(sys.stdout)
532 547
548 def system_rcpath():
549 return [r'c:\mercurial\mercurial.ini']
550
533 def os_rcpath(): 551 def os_rcpath():
534 '''return default os-specific hgrc search path''' 552 '''return default os-specific hgrc search path'''
535 try: 553 return system_rcpath() + [os.path.join(os.path.expanduser('~'),
536 import win32api, win32process 554 'mercurial.ini')]
537 proc = win32api.GetCurrentProcess()
538 filename = win32process.GetModuleFileNameEx(proc, 0)
539 systemrc = os.path.join(os.path.dirname(filename), 'mercurial.ini')
540 except ImportError:
541 systemrc = r'c:\mercurial\mercurial.ini'
542
543 return [systemrc,
544 os.path.join(os.path.expanduser('~'), 'mercurial.ini')]
545 555
546 def parse_patch_output(output_line): 556 def parse_patch_output(output_line):
547 """parses the output produced by patch and returns the file name""" 557 """parses the output produced by patch and returns the file name"""
548 pf = output_line[14:] 558 pf = output_line[14:]
549 if pf[0] == '`': 559 if pf[0] == '`':
550 pf = pf[1:-1] # Remove the quotes 560 pf = pf[1:-1] # Remove the quotes
551 return pf 561 return pf
552 562
553 try: # Mark Hammond's win32all package allows better functionality on Windows 563 def testpid(pid):
554 import win32api, win32con, win32file, pywintypes 564 '''return False if pid dead, True if running or not known'''
555 565 return True
556 # create hard links using win32file module
557 def os_link(src, dst): # NB will only succeed on NTFS
558 win32file.CreateHardLink(dst, src)
559
560 def nlinks(pathname):
561 """Return number of hardlinks for the given file."""
562 try:
563 fh = win32file.CreateFile(pathname,
564 win32file.GENERIC_READ, win32file.FILE_SHARE_READ,
565 None, win32file.OPEN_EXISTING, 0, None)
566 res = win32file.GetFileInformationByHandle(fh)
567 fh.Close()
568 return res[7]
569 except:
570 return os.stat(pathname).st_nlink
571
572 def testpid(pid):
573 '''return True if pid is still running or unable to
574 determine, False otherwise'''
575 try:
576 import win32process, winerror
577 handle = win32api.OpenProcess(
578 win32con.PROCESS_QUERY_INFORMATION, False, pid)
579 if handle:
580 status = win32process.GetExitCodeProcess(handle)
581 return status == win32con.STILL_ACTIVE
582 except pywintypes.error, details:
583 return details[0] != winerror.ERROR_INVALID_PARAMETER
584 return True
585
586 except ImportError:
587 def testpid(pid):
588 '''return False if pid dead, True if running or not known'''
589 return True
590 566
591 def is_exec(f, last): 567 def is_exec(f, last):
592 return last 568 return last
593 569
594 def set_exec(f, mode): 570 def set_exec(f, mode):
609 makelock = _makelock_file 585 makelock = _makelock_file
610 readlock = _readlock_file 586 readlock = _readlock_file
611 587
612 def explain_exit(code): 588 def explain_exit(code):
613 return _("exited with status %d") % code, code 589 return _("exited with status %d") % code, code
590
591 try:
592 # override functions with win32 versions if possible
593 from util_win32 import *
594 except ImportError:
595 pass
614 596
615 else: 597 else:
616 nulldev = '/dev/null' 598 nulldev = '/dev/null'
617 599
618 def rcfiles(path): 600 def rcfiles(path):