equal
deleted
inserted
replaced
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: |