mercurial/subrepo.py
branchstable
changeset 13553 dea6efdd7ec4
parent 13531 67fbe566eff1
child 13558 f854b775c386
child 13559 42a34c0aeddc
equal deleted inserted replaced
13552:7ab85fec60c3 13553:dea6efdd7ec4
   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             self._ui.status(_('cloning subrepo %s\n') % self._relpath)
   766             self._ui.status(_('cloning subrepo %s\n') % self._relpath)
   764             self._gitnodir(['clone', self._abssource(source), self._abspath])
   767             self._gitnodir(['clone', self._abssource(source), self._abspath])
   765         if self._githavelocally(revision):
   768         if self._githavelocally(revision):
   766             return
   769             return
   767         self._ui.status(_('pulling subrepo %s\n') % self._relpath)
   770         self._ui.status(_('pulling subrepo %s\n') % self._relpath)
   770         if not self._githavelocally(revision):
   773         if not self._githavelocally(revision):
   771             raise util.Abort(_("revision %s does not exist in subrepo %s\n") %
   774             raise util.Abort(_("revision %s does not exist in subrepo %s\n") %
   772                                (revision, self._relpath))
   775                                (revision, self._relpath))
   773 
   776 
   774     def dirty(self, ignoreupdate=False):
   777     def dirty(self, ignoreupdate=False):
       
   778         if self._gitmissing():
       
   779             return True
   775         if not ignoreupdate and self._state[1] != self._gitstate():
   780         if not ignoreupdate and self._state[1] != self._gitstate():
   776             # different version checked out
   781             # different version checked out
   777             return True
   782             return True
   778         # check for staged changes or modified files; ignore untracked files
   783         # check for staged changes or modified files; ignore untracked files
   779         out, code = self._gitdir(['diff-index', '--quiet', 'HEAD'])
   784         out, code = self._gitdir(['diff-index', '--quiet', 'HEAD'])
   858         else:
   863         else:
   859             # a real merge would be required, just checkout the revision
   864             # a real merge would be required, just checkout the revision
   860             rawcheckout()
   865             rawcheckout()
   861 
   866 
   862     def commit(self, text, user, date):
   867     def commit(self, text, user, date):
       
   868         if self._gitmissing():
       
   869             raise util.Abort(_("subrepo %s is missing") % self._relpath)
   863         cmd = ['commit', '-a', '-m', text]
   870         cmd = ['commit', '-a', '-m', text]
   864         env = os.environ.copy()
   871         env = os.environ.copy()
   865         if user:
   872         if user:
   866             cmd += ['--author', user]
   873             cmd += ['--author', user]
   867         if date:
   874         if date:
   894                     mergefunc()
   901                     mergefunc()
   895         else:
   902         else:
   896             mergefunc()
   903             mergefunc()
   897 
   904 
   898     def push(self, force):
   905     def push(self, force):
       
   906         if self._gitmissing():
       
   907             raise util.Abort(_("subrepo %s is missing") % self._relpath)
   899         # if a branch in origin contains the revision, nothing to do
   908         # if a branch in origin contains the revision, nothing to do
   900         branch2rev, rev2branch = self._gitbranchmap()
   909         branch2rev, rev2branch = self._gitbranchmap()
   901         if self._state[1] in rev2branch:
   910         if self._state[1] in rev2branch:
   902             for b in rev2branch[self._state[1]]:
   911             for b in rev2branch[self._state[1]]:
   903                 if b.startswith('refs/remotes/origin/'):
   912                 if b.startswith('refs/remotes/origin/'):
   927                             'cannot push revision %s') %
   936                             'cannot push revision %s') %
   928                           (self._relpath, self._state[1]))
   937                           (self._relpath, self._state[1]))
   929             return False
   938             return False
   930 
   939 
   931     def remove(self):
   940     def remove(self):
       
   941         if self._gitmissing():
       
   942             return
   932         if self.dirty():
   943         if self.dirty():
   933             self._ui.warn(_('not removing repo %s because '
   944             self._ui.warn(_('not removing repo %s because '
   934                             'it has changes.\n') % self._relpath)
   945                             'it has changes.\n') % self._relpath)
   935             return
   946             return
   936         # we can't fully delete the repository as it may contain
   947         # we can't fully delete the repository as it may contain
   970                         unit=_('files'))
   981                         unit=_('files'))
   971         ui.progress(_('archiving (%s)') % relpath, None)
   982         ui.progress(_('archiving (%s)') % relpath, None)
   972 
   983 
   973 
   984 
   974     def status(self, rev2, **opts):
   985     def status(self, rev2, **opts):
       
   986         if self._gitmissing():
       
   987             # if the repo is missing, return no results
       
   988             return [], [], [], [], [], [], []
   975         rev1 = self._state[1]
   989         rev1 = self._state[1]
   976         modified, added, removed = [], [], []
   990         modified, added, removed = [], [], []
   977         if rev2:
   991         if rev2:
   978             command = ['diff-tree', rev1, rev2]
   992             command = ['diff-tree', rev1, rev2]
   979         else:
   993         else: