mercurial/cmdutil.py
changeset 27391 4eeef1b2d689
parent 27344 43c00ca887d1
parent 27370 d9e3ebe56970
child 27411 c84a07530040
equal deleted inserted replaced
27390:8bc6ece9a2e1 27391:4eeef1b2d689
     5 # This software may be used and distributed according to the terms of the
     5 # This software may be used and distributed according to the terms of the
     6 # GNU General Public License version 2 or any later version.
     6 # GNU General Public License version 2 or any later version.
     7 
     7 
     8 from node import hex, bin, nullid, nullrev, short
     8 from node import hex, bin, nullid, nullrev, short
     9 from i18n import _
     9 from i18n import _
    10 import os, sys, errno, re, tempfile, cStringIO, shutil
    10 import os, sys, errno, re, tempfile, cStringIO
    11 import util, scmutil, templater, patch, error, templatekw, revlog, copies
    11 import util, scmutil, templater, patch, error, templatekw, revlog, copies
    12 import match as matchmod
    12 import match as matchmod
    13 import repair, graphmod, revset, phases, obsolete, pathutil
    13 import repair, graphmod, revset, phases, obsolete, pathutil
    14 import changelog
    14 import changelog
    15 import bookmarks
    15 import bookmarks
   165             for f in tobackup:
   165             for f in tobackup:
   166                 fd, tmpname = tempfile.mkstemp(prefix=f.replace('/', '_')+'.',
   166                 fd, tmpname = tempfile.mkstemp(prefix=f.replace('/', '_')+'.',
   167                                                dir=backupdir)
   167                                                dir=backupdir)
   168                 os.close(fd)
   168                 os.close(fd)
   169                 ui.debug('backup %r as %r\n' % (f, tmpname))
   169                 ui.debug('backup %r as %r\n' % (f, tmpname))
   170                 util.copyfile(repo.wjoin(f), tmpname)
   170                 util.copyfile(repo.wjoin(f), tmpname, copystat=True)
   171                 shutil.copystat(repo.wjoin(f), tmpname)
       
   172                 backups[f] = tmpname
   171                 backups[f] = tmpname
   173 
   172 
   174             fp = cStringIO.StringIO()
   173             fp = cStringIO.StringIO()
   175             for c in chunks:
   174             for c in chunks:
   176                 fname = c.filename()
   175                 fname = c.filename()
   215                         # without normallookup, restoring timestamp
   214                         # without normallookup, restoring timestamp
   216                         # may cause partially committed files
   215                         # may cause partially committed files
   217                         # to be treated as unmodified
   216                         # to be treated as unmodified
   218                         dirstate.normallookup(realname)
   217                         dirstate.normallookup(realname)
   219 
   218 
   220                     util.copyfile(tmpname, repo.wjoin(realname))
   219                     # copystat=True here and above are a hack to trick any
   221                     # Our calls to copystat() here and above are a
   220                     # editors that have f open that we haven't modified them.
   222                     # hack to trick any editors that have f open that
       
   223                     # we haven't modified them.
       
   224                     #
   221                     #
   225                     # Also note that this racy as an editor could
   222                     # Also note that this racy as an editor could notice the
   226                     # notice the file's mtime before we've finished
   223                     # file's mtime before we've finished writing it.
   227                     # writing it.
   224                     util.copyfile(tmpname, repo.wjoin(realname), copystat=True)
   228                     shutil.copystat(tmpname, repo.wjoin(realname))
       
   229                     os.unlink(tmpname)
   225                     os.unlink(tmpname)
   230                 if tobackup:
   226                 if tobackup:
   231                     os.rmdir(backupdir)
   227                     os.rmdir(backupdir)
   232             except OSError:
   228             except OSError:
   233                 pass
   229                 pass