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 |