mercurial/archival.py
changeset 4861 74f36b1027f4
parent 4731 1d5a2ee683b0
child 4862 6f08bc1bd00b
equal deleted inserted replaced
4860:0403b80352c9 4861:74f36b1027f4
   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 = {