mercurial/subrepo.py
changeset 13558 f854b775c386
parent 13532 d4c2f2ac3ff7
parent 13553 dea6efdd7ec4
child 13560 a2734c8322ac
equal deleted inserted replaced
13555:970150ddaaf8 13558:f854b775c386
   701             raise util.Abort('git %s error %d in %s' %
   701             raise util.Abort('git %s error %d in %s' %
   702                              (command, p.returncode, self._relpath))
   702                              (command, p.returncode, self._relpath))
   703 
   703 
   704         return retdata, p.returncode
   704         return retdata, p.returncode
   705 
   705 
       
   706     def _gitmissing(self):
       
   707         return not os.path.exists(os.path.join(self._abspath, '.git'))
       
   708 
   706     def _gitstate(self):
   709     def _gitstate(self):
   707         return self._gitcommand(['rev-parse', 'HEAD'])
   710         return self._gitcommand(['rev-parse', 'HEAD'])
   708 
   711 
   709     def _gitcurrentbranch(self):
   712     def _gitcurrentbranch(self):
   710         current, err = self._gitdir(['symbolic-ref', 'HEAD', '--quiet'])
   713         current, err = self._gitdir(['symbolic-ref', 'HEAD', '--quiet'])
   757     def _abssource(self, source):
   760     def _abssource(self, source):
   758         self._subsource = source
   761         self._subsource = source
   759         return _abssource(self)
   762         return _abssource(self)
   760 
   763 
   761     def _fetch(self, source, revision):
   764     def _fetch(self, source, revision):
   762         if not os.path.exists(os.path.join(self._abspath, '.git')):
   765         if self._gitmissing():
   763             source = self._abssource(source)
   766             source = self._abssource(source)
   764             self._ui.status(_('cloning subrepo %s from %s\n') %
   767             self._ui.status(_('cloning subrepo %s from %s\n') %
   765                             (self._relpath, source))
   768                             (self._relpath, source))
   766             self._gitnodir(['clone', source, self._abspath])
   769             self._gitnodir(['clone', source, self._abspath])
   767         if self._githavelocally(revision):
   770         if self._githavelocally(revision):
   772         if not self._githavelocally(revision):
   775         if not self._githavelocally(revision):
   773             raise util.Abort(_("revision %s does not exist in subrepo %s\n") %
   776             raise util.Abort(_("revision %s does not exist in subrepo %s\n") %
   774                                (revision, self._relpath))
   777                                (revision, self._relpath))
   775 
   778 
   776     def dirty(self, ignoreupdate=False):
   779     def dirty(self, ignoreupdate=False):
       
   780         if self._gitmissing():
       
   781             return True
   777         if not ignoreupdate and self._state[1] != self._gitstate():
   782         if not ignoreupdate and self._state[1] != self._gitstate():
   778             # different version checked out
   783             # different version checked out
   779             return True
   784             return True
   780         # check for staged changes or modified files; ignore untracked files
   785         # check for staged changes or modified files; ignore untracked files
   781         out, code = self._gitdir(['diff-index', '--quiet', 'HEAD'])
   786         out, code = self._gitdir(['diff-index', '--quiet', 'HEAD'])
   860         else:
   865         else:
   861             # a real merge would be required, just checkout the revision
   866             # a real merge would be required, just checkout the revision
   862             rawcheckout()
   867             rawcheckout()
   863 
   868 
   864     def commit(self, text, user, date):
   869     def commit(self, text, user, date):
       
   870         if self._gitmissing():
       
   871             raise util.Abort(_("subrepo %s is missing") % self._relpath)
   865         cmd = ['commit', '-a', '-m', text]
   872         cmd = ['commit', '-a', '-m', text]
   866         env = os.environ.copy()
   873         env = os.environ.copy()
   867         if user:
   874         if user:
   868             cmd += ['--author', user]
   875             cmd += ['--author', user]
   869         if date:
   876         if date:
   896                     mergefunc()
   903                     mergefunc()
   897         else:
   904         else:
   898             mergefunc()
   905             mergefunc()
   899 
   906 
   900     def push(self, force):
   907     def push(self, force):
       
   908         if self._gitmissing():
       
   909             raise util.Abort(_("subrepo %s is missing") % self._relpath)
   901         # if a branch in origin contains the revision, nothing to do
   910         # if a branch in origin contains the revision, nothing to do
   902         branch2rev, rev2branch = self._gitbranchmap()
   911         branch2rev, rev2branch = self._gitbranchmap()
   903         if self._state[1] in rev2branch:
   912         if self._state[1] in rev2branch:
   904             for b in rev2branch[self._state[1]]:
   913             for b in rev2branch[self._state[1]]:
   905                 if b.startswith('refs/remotes/origin/'):
   914                 if b.startswith('refs/remotes/origin/'):
   929                             'cannot push revision %s') %
   938                             'cannot push revision %s') %
   930                           (self._relpath, self._state[1]))
   939                           (self._relpath, self._state[1]))
   931             return False
   940             return False
   932 
   941 
   933     def remove(self):
   942     def remove(self):
       
   943         if self._gitmissing():
       
   944             return
   934         if self.dirty():
   945         if self.dirty():
   935             self._ui.warn(_('not removing repo %s because '
   946             self._ui.warn(_('not removing repo %s because '
   936                             'it has changes.\n') % self._relpath)
   947                             'it has changes.\n') % self._relpath)
   937             return
   948             return
   938         # we can't fully delete the repository as it may contain
   949         # we can't fully delete the repository as it may contain
   972                         unit=_('files'))
   983                         unit=_('files'))
   973         ui.progress(_('archiving (%s)') % relpath, None)
   984         ui.progress(_('archiving (%s)') % relpath, None)
   974 
   985 
   975 
   986 
   976     def status(self, rev2, **opts):
   987     def status(self, rev2, **opts):
       
   988         if self._gitmissing():
       
   989             # if the repo is missing, return no results
       
   990             return [], [], [], [], [], [], []
   977         rev1 = self._state[1]
   991         rev1 = self._state[1]
   978         modified, added, removed = [], [], []
   992         modified, added, removed = [], [], []
   979         if rev2:
   993         if rev2:
   980             command = ['diff-tree', rev1, rev2]
   994             command = ['diff-tree', rev1, rev2]
   981         else:
   995         else: