Mercurial > public > mercurial-scm > hg
comparison mercurial/subrepo.py @ 16530:e37199a1f9d4 stable
subrepo/svn: improve error message on missing files
From:
abort: failed to commit svn changes
to:
abort: cannot commit missing svn entries
author | Patrick Mezard <patrick@mezard.eu> |
---|---|
date | Thu, 26 Apr 2012 12:13:20 +0200 |
parents | 3d5d204a08c7 |
children | ae2664ee0223 |
comparison
equal
deleted
inserted
replaced
16529:3d5d204a08c7 | 16530:e37199a1f9d4 |
---|---|
678 | 678 |
679 def _wcrev(self): | 679 def _wcrev(self): |
680 return self._wcrevs()[0] | 680 return self._wcrevs()[0] |
681 | 681 |
682 def _wcchanged(self): | 682 def _wcchanged(self): |
683 """Return (changes, extchanges) where changes is True | 683 """Return (changes, extchanges, missing) where changes is True |
684 if the working directory was changed, and extchanges is | 684 if the working directory was changed, extchanges is |
685 True if any of these changes concern an external entry. | 685 True if any of these changes concern an external entry and missing |
686 is True if any change is a missing entry. | |
686 """ | 687 """ |
687 output, err = self._svncommand(['status', '--xml']) | 688 output, err = self._svncommand(['status', '--xml']) |
688 externals, changes = [], [] | 689 externals, changes, missing = [], [], [] |
689 doc = xml.dom.minidom.parseString(output) | 690 doc = xml.dom.minidom.parseString(output) |
690 for e in doc.getElementsByTagName('entry'): | 691 for e in doc.getElementsByTagName('entry'): |
691 s = e.getElementsByTagName('wc-status') | 692 s = e.getElementsByTagName('wc-status') |
692 if not s: | 693 if not s: |
693 continue | 694 continue |
694 item = s[0].getAttribute('item') | 695 item = s[0].getAttribute('item') |
695 props = s[0].getAttribute('props') | 696 props = s[0].getAttribute('props') |
696 path = e.getAttribute('path') | 697 path = e.getAttribute('path') |
697 if item == 'external': | 698 if item == 'external': |
698 externals.append(path) | 699 externals.append(path) |
700 elif item == 'missing': | |
701 missing.append(path) | |
699 if (item not in ('', 'normal', 'unversioned', 'external') | 702 if (item not in ('', 'normal', 'unversioned', 'external') |
700 or props not in ('', 'none', 'normal')): | 703 or props not in ('', 'none', 'normal')): |
701 changes.append(path) | 704 changes.append(path) |
702 for path in changes: | 705 for path in changes: |
703 for ext in externals: | 706 for ext in externals: |
704 if path == ext or path.startswith(ext + os.sep): | 707 if path == ext or path.startswith(ext + os.sep): |
705 return True, True | 708 return True, True, bool(missing) |
706 return bool(changes), False | 709 return bool(changes), False, bool(missing) |
707 | 710 |
708 def dirty(self, ignoreupdate=False): | 711 def dirty(self, ignoreupdate=False): |
709 if not self._wcchanged()[0]: | 712 if not self._wcchanged()[0]: |
710 if self._state[1] in self._wcrevs() or ignoreupdate: | 713 if self._state[1] in self._wcrevs() or ignoreupdate: |
711 return False | 714 return False |
714 def basestate(self): | 717 def basestate(self): |
715 return self._wcrev() | 718 return self._wcrev() |
716 | 719 |
717 def commit(self, text, user, date): | 720 def commit(self, text, user, date): |
718 # user and date are out of our hands since svn is centralized | 721 # user and date are out of our hands since svn is centralized |
719 changed, extchanged = self._wcchanged() | 722 changed, extchanged, missing = self._wcchanged() |
720 if not changed: | 723 if not changed: |
721 return self._wcrev() | 724 return self._wcrev() |
722 if extchanged: | 725 if extchanged: |
723 # Do not try to commit externals | 726 # Do not try to commit externals |
724 raise util.Abort(_('cannot commit svn externals')) | 727 raise util.Abort(_('cannot commit svn externals')) |
728 if missing: | |
729 # svn can commit with missing entries but aborting like hg | |
730 # seems a better approach. | |
731 raise util.Abort(_('cannot commit missing svn entries')) | |
725 commitinfo, err = self._svncommand(['commit', '-m', text]) | 732 commitinfo, err = self._svncommand(['commit', '-m', text]) |
726 self._ui.status(commitinfo) | 733 self._ui.status(commitinfo) |
727 newrev = re.search('Committed revision ([0-9]+).', commitinfo) | 734 newrev = re.search('Committed revision ([0-9]+).', commitinfo) |
728 if not newrev: | 735 if not newrev: |
729 if not commitinfo.strip(): | 736 if not commitinfo.strip(): |
771 # update to a directory which has since been deleted and recreated. | 778 # update to a directory which has since been deleted and recreated. |
772 args.append('%s@%s' % (state[0], state[1])) | 779 args.append('%s@%s' % (state[0], state[1])) |
773 status, err = self._svncommand(args, failok=True) | 780 status, err = self._svncommand(args, failok=True) |
774 if not re.search('Checked out revision [0-9]+.', status): | 781 if not re.search('Checked out revision [0-9]+.', status): |
775 if ('is already a working copy for a different URL' in err | 782 if ('is already a working copy for a different URL' in err |
776 and (self._wcchanged() == (False, False))): | 783 and (self._wcchanged()[:2] == (False, False))): |
777 # obstructed but clean working copy, so just blow it away. | 784 # obstructed but clean working copy, so just blow it away. |
778 self.remove() | 785 self.remove() |
779 self.get(state, overwrite=False) | 786 self.get(state, overwrite=False) |
780 return | 787 return |
781 raise util.Abort((status or err).splitlines()[-1]) | 788 raise util.Abort((status or err).splitlines()[-1]) |