mercurial/localrepo.py
changeset 23852 99e125626352
parent 23775 885c0290f7d5
child 23853 0cc663e44258
equal deleted inserted replaced
23851:948a8ca27152 23852:99e125626352
   323         maxchainlen = self.ui.configint('format', 'maxchainlen')
   323         maxchainlen = self.ui.configint('format', 'maxchainlen')
   324         if maxchainlen is not None:
   324         if maxchainlen is not None:
   325             self.sopener.options['maxchainlen'] = maxchainlen
   325             self.sopener.options['maxchainlen'] = maxchainlen
   326 
   326 
   327     def _writerequirements(self):
   327     def _writerequirements(self):
   328         reqfile = self.opener("requires", "w")
   328         reqfile = self.vfs("requires", "w")
   329         for r in sorted(self.requirements):
   329         for r in sorted(self.requirements):
   330             reqfile.write("%s\n" % r)
   330             reqfile.write("%s\n" % r)
   331         reqfile.close()
   331         reqfile.close()
   332 
   332 
   333     def _checknested(self, path):
   333     def _checknested(self, path):
   447                     warned[0] = True
   447                     warned[0] = True
   448                     self.ui.warn(_("warning: ignoring unknown"
   448                     self.ui.warn(_("warning: ignoring unknown"
   449                                    " working parent %s!\n") % short(node))
   449                                    " working parent %s!\n") % short(node))
   450                 return nullid
   450                 return nullid
   451 
   451 
   452         return dirstate.dirstate(self.opener, self.ui, self.root, validate)
   452         return dirstate.dirstate(self.vfs, self.ui, self.root, validate)
   453 
   453 
   454     def __getitem__(self, changeid):
   454     def __getitem__(self, changeid):
   455         if changeid is None:
   455         if changeid is None:
   456             return context.workingctx(self)
   456             return context.workingctx(self)
   457         if isinstance(changeid, slice):
   457         if isinstance(changeid, slice):
   529             fp.close()
   529             fp.close()
   530 
   530 
   531         prevtags = ''
   531         prevtags = ''
   532         if local:
   532         if local:
   533             try:
   533             try:
   534                 fp = self.opener('localtags', 'r+')
   534                 fp = self.vfs('localtags', 'r+')
   535             except IOError:
   535             except IOError:
   536                 fp = self.opener('localtags', 'a')
   536                 fp = self.vfs('localtags', 'a')
   537             else:
   537             else:
   538                 prevtags = fp.read()
   538                 prevtags = fp.read()
   539 
   539 
   540             # local tags are stored in the current charset
   540             # local tags are stored in the current charset
   541             writetags(fp, names, None, prevtags)
   541             writetags(fp, names, None, prevtags)
   907                 hint=_("run 'hg recover' to clean up transaction"))
   907                 hint=_("run 'hg recover' to clean up transaction"))
   908 
   908 
   909         self._writejournal(desc)
   909         self._writejournal(desc)
   910         renames = [(vfs, x, undoname(x)) for vfs, x in self._journalfiles()]
   910         renames = [(vfs, x, undoname(x)) for vfs, x in self._journalfiles()]
   911         rp = report and report or self.ui.warn
   911         rp = report and report or self.ui.warn
   912         vfsmap = {'plain': self.opener} # root of .hg/
   912         vfsmap = {'plain': self.vfs} # root of .hg/
   913         tr = transaction.transaction(rp, self.sopener, vfsmap,
   913         tr = transaction.transaction(rp, self.sopener, vfsmap,
   914                                      "journal",
   914                                      "journal",
   915                                      aftertrans(renames),
   915                                      aftertrans(renames),
   916                                      self.store.createmode)
   916                                      self.store.createmode)
   917         # note: writing the fncache only during finalize mean that the file is
   917         # note: writing the fncache only during finalize mean that the file is
   931 
   931 
   932     def undofiles(self):
   932     def undofiles(self):
   933         return [(vfs, undoname(x)) for vfs, x in self._journalfiles()]
   933         return [(vfs, undoname(x)) for vfs, x in self._journalfiles()]
   934 
   934 
   935     def _writejournal(self, desc):
   935     def _writejournal(self, desc):
   936         self.opener.write("journal.dirstate",
   936         self.vfs.write("journal.dirstate",
   937                           self.opener.tryread("dirstate"))
   937                           self.vfs.tryread("dirstate"))
   938         self.opener.write("journal.branch",
   938         self.vfs.write("journal.branch",
   939                           encoding.fromlocal(self.dirstate.branch()))
   939                           encoding.fromlocal(self.dirstate.branch()))
   940         self.opener.write("journal.desc",
   940         self.vfs.write("journal.desc",
   941                           "%d\n%s\n" % (len(self), desc))
   941                           "%d\n%s\n" % (len(self), desc))
   942         self.opener.write("journal.bookmarks",
   942         self.vfs.write("journal.bookmarks",
   943                           self.opener.tryread("bookmarks"))
   943                           self.vfs.tryread("bookmarks"))
   944         self.sopener.write("journal.phaseroots",
   944         self.sopener.write("journal.phaseroots",
   945                            self.sopener.tryread("phaseroots"))
   945                            self.sopener.tryread("phaseroots"))
   946 
   946 
   947     def recover(self):
   947     def recover(self):
   948         lock = self.lock()
   948         lock = self.lock()
   949         try:
   949         try:
   950             if self.svfs.exists("journal"):
   950             if self.svfs.exists("journal"):
   951                 self.ui.status(_("rolling back interrupted transaction\n"))
   951                 self.ui.status(_("rolling back interrupted transaction\n"))
   952                 vfsmap = {'': self.sopener,
   952                 vfsmap = {'': self.sopener,
   953                           'plain': self.opener,}
   953                           'plain': self.vfs,}
   954                 transaction.rollback(self.sopener, vfsmap, "journal",
   954                 transaction.rollback(self.sopener, vfsmap, "journal",
   955                                      self.ui.warn)
   955                                      self.ui.warn)
   956                 self.invalidate()
   956                 self.invalidate()
   957                 return True
   957                 return True
   958             else:
   958             else:
   976 
   976 
   977     @unfilteredmethod # Until we get smarter cache management
   977     @unfilteredmethod # Until we get smarter cache management
   978     def _rollback(self, dryrun, force):
   978     def _rollback(self, dryrun, force):
   979         ui = self.ui
   979         ui = self.ui
   980         try:
   980         try:
   981             args = self.opener.read('undo.desc').splitlines()
   981             args = self.vfs.read('undo.desc').splitlines()
   982             (oldlen, desc, detail) = (int(args[0]), args[1], None)
   982             (oldlen, desc, detail) = (int(args[0]), args[1], None)
   983             if len(args) >= 3:
   983             if len(args) >= 3:
   984                 detail = args[2]
   984                 detail = args[2]
   985             oldtip = oldlen - 1
   985             oldtip = oldlen - 1
   986 
   986 
  1005         if dryrun:
  1005         if dryrun:
  1006             return 0
  1006             return 0
  1007 
  1007 
  1008         parents = self.dirstate.parents()
  1008         parents = self.dirstate.parents()
  1009         self.destroying()
  1009         self.destroying()
  1010         vfsmap = {'plain': self.opener}
  1010         vfsmap = {'plain': self.vfs}
  1011         transaction.rollback(self.sopener, vfsmap, 'undo', ui.warn)
  1011         transaction.rollback(self.sopener, vfsmap, 'undo', ui.warn)
  1012         if self.vfs.exists('undo.bookmarks'):
  1012         if self.vfs.exists('undo.bookmarks'):
  1013             self.vfs.rename('undo.bookmarks', 'bookmarks')
  1013             self.vfs.rename('undo.bookmarks', 'bookmarks')
  1014         if self.svfs.exists('undo.phaseroots'):
  1014         if self.svfs.exists('undo.phaseroots'):
  1015             self.svfs.rename('undo.phaseroots', 'phaseroots')
  1015             self.svfs.rename('undo.phaseroots', 'phaseroots')
  1018         parentgone = (parents[0] not in self.changelog.nodemap or
  1018         parentgone = (parents[0] not in self.changelog.nodemap or
  1019                       parents[1] not in self.changelog.nodemap)
  1019                       parents[1] not in self.changelog.nodemap)
  1020         if parentgone:
  1020         if parentgone:
  1021             self.vfs.rename('undo.dirstate', 'dirstate')
  1021             self.vfs.rename('undo.dirstate', 'dirstate')
  1022             try:
  1022             try:
  1023                 branch = self.opener.read('undo.branch')
  1023                 branch = self.vfs.read('undo.branch')
  1024                 self.dirstate.setbranch(encoding.tolocal(branch))
  1024                 self.dirstate.setbranch(encoding.tolocal(branch))
  1025             except IOError:
  1025             except IOError:
  1026                 ui.warn(_('named branch could not be reset: '
  1026                 ui.warn(_('named branch could not be reset: '
  1027                           'current branch is still \'%s\'\n')
  1027                           'current branch is still \'%s\'\n')
  1028                         % self.dirstate.branch())
  1028                         % self.dirstate.branch())
  1820     def debugwireargs(self, one, two, three=None, four=None, five=None):
  1820     def debugwireargs(self, one, two, three=None, four=None, five=None):
  1821         '''used to test argument passing over the wire'''
  1821         '''used to test argument passing over the wire'''
  1822         return "%s %s %s %s %s" % (one, two, three, four, five)
  1822         return "%s %s %s %s %s" % (one, two, three, four, five)
  1823 
  1823 
  1824     def savecommitmessage(self, text):
  1824     def savecommitmessage(self, text):
  1825         fp = self.opener('last-message.txt', 'wb')
  1825         fp = self.vfs('last-message.txt', 'wb')
  1826         try:
  1826         try:
  1827             fp.write(text)
  1827             fp.write(text)
  1828         finally:
  1828         finally:
  1829             fp.close()
  1829             fp.close()
  1830         return self.pathto(fp.name[len(self.root) + 1:])
  1830         return self.pathto(fp.name[len(self.root) + 1:])