147 |
147 |
148 def __init__(self, name, prefix, mtime): |
148 def __init__(self, name, prefix, mtime): |
149 if prefix: |
149 if prefix: |
150 raise util.Abort(_('cannot give prefix when archiving to files')) |
150 raise util.Abort(_('cannot give prefix when archiving to files')) |
151 self.basedir = name |
151 self.basedir = name |
152 self.dirs = {} |
152 self.opener = util.opener(self.basedir) |
153 self.oflags = (os.O_CREAT | os.O_EXCL | os.O_WRONLY | |
|
154 getattr(os, 'O_BINARY', 0) | |
|
155 getattr(os, 'O_NOFOLLOW', 0)) |
|
156 |
153 |
157 def addfile(self, name, mode, data): |
154 def addfile(self, name, mode, data): |
|
155 f = self.opener(name, "w", atomictemp=True) |
|
156 f.write(data) |
|
157 f.rename() |
158 destfile = os.path.join(self.basedir, name) |
158 destfile = os.path.join(self.basedir, name) |
159 destdir = os.path.dirname(destfile) |
159 os.chmod(destfile, mode) |
160 if destdir not in self.dirs: |
|
161 if not os.path.isdir(destdir): |
|
162 os.makedirs(destdir) |
|
163 self.dirs[destdir] = 1 |
|
164 os.fdopen(os.open(destfile, self.oflags, mode), 'wb').write(data) |
|
165 |
160 |
166 def done(self): |
161 def done(self): |
167 pass |
162 pass |
168 |
163 |
169 archivers = { |
164 archivers = { |