scripts/dtrx

branch
trunk
changeset 58
16506464d57b
parent 55
494516c027c4
child 59
7a0aafe2fe87
equal deleted inserted replaced
57:5f6afe2cf9e1 58:16506464d57b
69 mimetypes.types_map.setdefault('.gem', 'application/x-ruby-gem') 69 mimetypes.types_map.setdefault('.gem', 'application/x-ruby-gem')
70 70
71 logger = logging.getLogger('dtrx-log') 71 logger = logging.getLogger('dtrx-log')
72 72
73 class FilenameChecker(object): 73 class FilenameChecker(object):
74 free_func = os.open
75 free_args = (os.O_CREAT | os.O_EXCL,)
76 free_close = os.close
77
74 def __init__(self, original_name): 78 def __init__(self, original_name):
75 self.original_name = original_name 79 self.original_name = original_name
76 80
77 def is_free(self, filename): 81 def is_free(self, filename):
78 return not os.path.exists(filename) 82 try:
83 result = self.free_func(filename, *self.free_args)
84 except OSError, error:
85 if error.errno == errno.EEXIST:
86 return False
87 raise
88 if self.free_close:
89 self.free_close(result)
90 return True
79 91
80 def create(self): 92 def create(self):
81 fd, filename = tempfile.mkstemp(prefix=self.original_name + '.', 93 fd, filename = tempfile.mkstemp(prefix=self.original_name + '.',
82 dir='.') 94 dir='.')
83 os.close(fd) 95 os.close(fd)
84 return filename 96 return filename
85 97
86 def check(self): 98 def check(self):
87 if self.is_free(self.original_name):
88 return self.original_name
89 for suffix in [''] + ['.%s' % (x,) for x in range(1, 10)]: 99 for suffix in [''] + ['.%s' % (x,) for x in range(1, 10)]:
90 filename = '%s%s' % (self.original_name, suffix) 100 filename = '%s%s' % (self.original_name, suffix)
91 if self.is_free(filename): 101 if self.is_free(filename):
92 return filename 102 return filename
93 return self.create() 103 return self.create()
94 104
95 105
96 class DirectoryChecker(FilenameChecker): 106 class DirectoryChecker(FilenameChecker):
97 def is_free(self, filename): 107 free_func = os.mkdir
98 try: 108 free_args = ()
99 os.mkdir(filename) 109 free_close = None
100 except OSError, error:
101 if error.errno == errno.EEXIST:
102 return False
103 raise
104 return True
105 110
106 def create(self): 111 def create(self):
107 return tempfile.mkdtemp(prefix=self.original_name + '.', dir='.') 112 return tempfile.mkdtemp(prefix=self.original_name + '.', dir='.')
108 113
109 114

mercurial