mercurial/subrepo.py
changeset 10273 e898bc7810ad
parent 10272 886858b834da
child 10299 e768941f14c1
equal deleted inserted replaced
10272:886858b834da 10273:e898bc7810ad
   280         entries = doc.getElementsByTagName('entry')
   280         entries = doc.getElementsByTagName('entry')
   281         if not entries:
   281         if not entries:
   282             return 0
   282             return 0
   283         return int(entries[0].getAttribute('revision') or 0)
   283         return int(entries[0].getAttribute('revision') or 0)
   284 
   284 
   285     def _wcclean(self):
   285     def _wcchanged(self):
       
   286         """Return (changes, extchanges) where changes is True
       
   287         if the working directory was changed, and extchanges is
       
   288         True if any of these changes concern an external entry.
       
   289         """
   286         output = self._svncommand(['status', '--xml'])
   290         output = self._svncommand(['status', '--xml'])
       
   291         externals, changes = [], []
   287         doc = xml.dom.minidom.parseString(output)
   292         doc = xml.dom.minidom.parseString(output)
   288         for s in doc.getElementsByTagName('wc-status'):
   293         for e in doc.getElementsByTagName('entry'):
   289             st = s.getAttribute('item')
   294             s = e.getElementsByTagName('wc-status')
   290             if st and st != 'unversioned':
   295             if not s:
   291                 return False
   296                 continue
   292             props = s.getAttribute('props')
   297             item = s[0].getAttribute('item')
   293             if props and props != 'none':
   298             props = s[0].getAttribute('props')
   294                 return False
   299             path = e.getAttribute('path')
   295         return True
   300             if item == 'external':
       
   301                 externals.append(path)
       
   302             if (item not in ('', 'normal', 'unversioned', 'external')
       
   303                 or props not in ('', 'none')):
       
   304                 changes.append(path)
       
   305         for path in changes:
       
   306             for ext in externals:
       
   307                 if path == ext or path.startswith(ext + os.sep):
       
   308                     return True, True
       
   309         return bool(changes), False
   296 
   310 
   297     def dirty(self):
   311     def dirty(self):
   298         if self._wcrev() == self._state[1] and self._wcclean():
   312         if self._wcrev() == self._state[1] and not self._wcchanged()[0]:
   299             return False
   313             return False
   300         return True
   314         return True
   301 
   315 
   302     def commit(self, text, user, date):
   316     def commit(self, text, user, date):
   303         # user and date are out of our hands since svn is centralized
   317         # user and date are out of our hands since svn is centralized
   304         if self._wcclean():
   318         changed, extchanged = self._wcchanged()
       
   319         if not changed:
   305             return self._wcrev()
   320             return self._wcrev()
       
   321         if extchanged:
       
   322             # Do not try to commit externals
       
   323             raise util.Abort(_('cannot commit svn externals'))
   306         commitinfo = self._svncommand(['commit', '-m', text])
   324         commitinfo = self._svncommand(['commit', '-m', text])
   307         self._ui.status(commitinfo)
   325         self._ui.status(commitinfo)
   308         newrev = re.search('Committed revision ([\d]+).', commitinfo)
   326         newrev = re.search('Committed revision ([\d]+).', commitinfo)
   309         if not newrev:
   327         if not newrev:
   310             raise util.Abort(commitinfo.splitlines()[-1])
   328             raise util.Abort(commitinfo.splitlines()[-1])