Show More
@@ -747,125 +747,12 b' def linematch(el, l):' | |||
|
747 | 747 | return '+glob' |
|
748 | 748 | return False |
|
749 | 749 | |
|
750 | def tsttest(test, wd, options, replacements, env): | |
|
751 | # We generate a shell script which outputs unique markers to line | |
|
752 | # up script results with our source. These markers include input | |
|
753 | # line number and the last return code | |
|
754 | salt = "SALT" + str(time.time()) | |
|
755 | def addsalt(line, inpython): | |
|
756 | if inpython: | |
|
757 | script.append('%s %d 0\n' % (salt, line)) | |
|
758 | else: | |
|
759 | script.append('echo %s %s $?\n' % (salt, line)) | |
|
760 | ||
|
761 | # After we run the shell script, we re-unify the script output | |
|
762 | # with non-active parts of the source, with synchronization by our | |
|
763 | # SALT line number markers. The after table contains the | |
|
764 | # non-active components, ordered by line number | |
|
765 | after = {} | |
|
766 | pos = prepos = -1 | |
|
767 | ||
|
768 | # Expected shell script output | |
|
769 | expected = {} | |
|
770 | ||
|
771 | # We keep track of whether or not we're in a Python block so we | |
|
772 | # can generate the surrounding doctest magic | |
|
773 | inpython = False | |
|
774 | ||
|
775 | # True or False when in a true or false conditional section | |
|
776 | skipping = None | |
|
777 | ||
|
778 | def hghave(reqs): | |
|
779 | # TODO: do something smarter when all other uses of hghave is gone | |
|
780 | tdir = TESTDIR.replace('\\', '/') | |
|
781 | proc = Popen4('%s -c "%s/hghave %s"' % | |
|
782 | (options.shell, tdir, ' '.join(reqs)), wd, 0) | |
|
783 | stdout, stderr = proc.communicate() | |
|
784 | ret = proc.wait() | |
|
785 | if wifexited(ret): | |
|
786 | ret = os.WEXITSTATUS(ret) | |
|
787 | if ret == 2: | |
|
788 | print stdout | |
|
789 | sys.exit(1) | |
|
790 | return ret == 0 | |
|
791 | ||
|
750 | def tsttest(t, test, wd, options, replacements, env): | |
|
792 | 751 | f = open(test) |
|
793 | t = f.readlines() | |
|
752 | tlines = f.readlines() | |
|
794 | 753 | f.close() |
|
795 | 754 | |
|
796 | script = [] | |
|
797 | if options.debug: | |
|
798 | script.append('set -x\n') | |
|
799 | if os.getenv('MSYSTEM'): | |
|
800 | script.append('alias pwd="pwd -W"\n') | |
|
801 | n = 0 | |
|
802 | for n, l in enumerate(t): | |
|
803 | if not l.endswith('\n'): | |
|
804 | l += '\n' | |
|
805 | if l.startswith('#if'): | |
|
806 | lsplit = l.split() | |
|
807 | if len(lsplit) < 2 or lsplit[0] != '#if': | |
|
808 | after.setdefault(pos, []).append(' !!! invalid #if\n') | |
|
809 | if skipping is not None: | |
|
810 | after.setdefault(pos, []).append(' !!! nested #if\n') | |
|
811 | skipping = not hghave(lsplit[1:]) | |
|
812 | after.setdefault(pos, []).append(l) | |
|
813 | elif l.startswith('#else'): | |
|
814 | if skipping is None: | |
|
815 | after.setdefault(pos, []).append(' !!! missing #if\n') | |
|
816 | skipping = not skipping | |
|
817 | after.setdefault(pos, []).append(l) | |
|
818 | elif l.startswith('#endif'): | |
|
819 | if skipping is None: | |
|
820 | after.setdefault(pos, []).append(' !!! missing #if\n') | |
|
821 | skipping = None | |
|
822 | after.setdefault(pos, []).append(l) | |
|
823 | elif skipping: | |
|
824 | after.setdefault(pos, []).append(l) | |
|
825 | elif l.startswith(' >>> '): # python inlines | |
|
826 | after.setdefault(pos, []).append(l) | |
|
827 | prepos = pos | |
|
828 | pos = n | |
|
829 | if not inpython: | |
|
830 | # we've just entered a Python block, add the header | |
|
831 | inpython = True | |
|
832 | addsalt(prepos, False) # make sure we report the exit code | |
|
833 | script.append('%s -m heredoctest <<EOF\n' % PYTHON) | |
|
834 | addsalt(n, True) | |
|
835 | script.append(l[2:]) | |
|
836 | elif l.startswith(' ... '): # python inlines | |
|
837 | after.setdefault(prepos, []).append(l) | |
|
838 | script.append(l[2:]) | |
|
839 | elif l.startswith(' $ '): # commands | |
|
840 | if inpython: | |
|
841 | script.append("EOF\n") | |
|
842 | inpython = False | |
|
843 | after.setdefault(pos, []).append(l) | |
|
844 | prepos = pos | |
|
845 | pos = n | |
|
846 | addsalt(n, False) | |
|
847 | cmd = l[4:].split() | |
|
848 | if len(cmd) == 2 and cmd[0] == 'cd': | |
|
849 | l = ' $ cd %s || exit 1\n' % cmd[1] | |
|
850 | script.append(l[4:]) | |
|
851 | elif l.startswith(' > '): # continuations | |
|
852 | after.setdefault(prepos, []).append(l) | |
|
853 | script.append(l[4:]) | |
|
854 | elif l.startswith(' '): # results | |
|
855 | # queue up a list of expected results | |
|
856 | expected.setdefault(pos, []).append(l[2:]) | |
|
857 | else: | |
|
858 | if inpython: | |
|
859 | script.append("EOF\n") | |
|
860 | inpython = False | |
|
861 | # non-command/result - queue up for merged output | |
|
862 | after.setdefault(pos, []).append(l) | |
|
863 | ||
|
864 | if inpython: | |
|
865 | script.append("EOF\n") | |
|
866 | if skipping is not None: | |
|
867 | after.setdefault(pos, []).append(' !!! missing #endif\n') | |
|
868 | addsalt(n + 1, False) | |
|
755 | salt, script, after, expected = t._parsetest(tlines, wd) | |
|
869 | 756 | |
|
870 | 757 | # Write out the script and execute it |
|
871 | 758 | name = wd + '.sh' |
@@ -946,9 +833,132 b' class TTest(Test):' | |||
|
946 | 833 | """A "t test" is a test backed by a .t file.""" |
|
947 | 834 | |
|
948 | 835 | def _run(self, testtmp, replacements, env): |
|
949 | return tsttest(self._path, testtmp, self._options, replacements, | |
|
836 | return tsttest(self, self._path, testtmp, self._options, replacements, | |
|
950 | 837 | env) |
|
951 | 838 | |
|
839 | def _hghave(self, reqs, testtmp): | |
|
840 | # TODO do something smarter when all other uses of hghave are gone. | |
|
841 | tdir = TESTDIR.replace('\\', '/') | |
|
842 | proc = Popen4('%s -c "%s/hghave %s"' % | |
|
843 | (self._options.shell, tdir, ' '.join(reqs)), | |
|
844 | testtmp, 0) | |
|
845 | stdout, stderr = proc.communicate() | |
|
846 | ret = proc.wait() | |
|
847 | if wifexited(ret): | |
|
848 | ret = os.WEXITSTATUS(ret) | |
|
849 | if ret == 2: | |
|
850 | print stdout | |
|
851 | sys.exit(1) | |
|
852 | ||
|
853 | return ret == 0 | |
|
854 | ||
|
855 | def _parsetest(self, lines, testtmp): | |
|
856 | # We generate a shell script which outputs unique markers to line | |
|
857 | # up script results with our source. These markers include input | |
|
858 | # line number and the last return code. | |
|
859 | salt = "SALT" + str(time.time()) | |
|
860 | def addsalt(line, inpython): | |
|
861 | if inpython: | |
|
862 | script.append('%s %d 0\n' % (salt, line)) | |
|
863 | else: | |
|
864 | script.append('echo %s %s $?\n' % (salt, line)) | |
|
865 | ||
|
866 | script = [] | |
|
867 | ||
|
868 | # After we run the shell script, we re-unify the script output | |
|
869 | # with non-active parts of the source, with synchronization by our | |
|
870 | # SALT line number markers. The after table contains the non-active | |
|
871 | # components, ordered by line number. | |
|
872 | after = {} | |
|
873 | ||
|
874 | # Expected shell script output. | |
|
875 | expected = {} | |
|
876 | ||
|
877 | pos = prepos = -1 | |
|
878 | ||
|
879 | # True or False when in a true or false conditional section | |
|
880 | skipping = None | |
|
881 | ||
|
882 | # We keep track of whether or not we're in a Python block so we | |
|
883 | # can generate the surrounding doctest magic. | |
|
884 | inpython = False | |
|
885 | ||
|
886 | if self._options.debug: | |
|
887 | script.append('set -x\n') | |
|
888 | if os.getenv('MSYSTEM'): | |
|
889 | script.append('alias pwd="pwd -W"\n') | |
|
890 | ||
|
891 | for n, l in enumerate(lines): | |
|
892 | if not l.endswith('\n'): | |
|
893 | l += '\n' | |
|
894 | if l.startswith('#if'): | |
|
895 | lsplit = l.split() | |
|
896 | if len(lsplit) < 2 or lsplit[0] != '#if': | |
|
897 | after.setdefault(pos, []).append(' !!! invalid #if\n') | |
|
898 | if skipping is not None: | |
|
899 | after.setdefault(pos, []).append(' !!! nested #if\n') | |
|
900 | skipping = not self._hghave(lsplit[1:], testtmp) | |
|
901 | after.setdefault(pos, []).append(l) | |
|
902 | elif l.startswith('#else'): | |
|
903 | if skipping is None: | |
|
904 | after.setdefault(pos, []).append(' !!! missing #if\n') | |
|
905 | skipping = not skipping | |
|
906 | after.setdefault(pos, []).append(l) | |
|
907 | elif l.startswith('#endif'): | |
|
908 | if skipping is None: | |
|
909 | after.setdefault(pos, []).append(' !!! missing #if\n') | |
|
910 | skipping = None | |
|
911 | after.setdefault(pos, []).append(l) | |
|
912 | elif skipping: | |
|
913 | after.setdefault(pos, []).append(l) | |
|
914 | elif l.startswith(' >>> '): # python inlines | |
|
915 | after.setdefault(pos, []).append(l) | |
|
916 | prepos = pos | |
|
917 | pos = n | |
|
918 | if not inpython: | |
|
919 | # We've just entered a Python block. Add the header. | |
|
920 | inpython = True | |
|
921 | addsalt(prepos, False) # Make sure we report the exit code. | |
|
922 | script.append('%s -m heredoctest <<EOF\n' % PYTHON) | |
|
923 | addsalt(n, True) | |
|
924 | script.append(l[2:]) | |
|
925 | elif l.startswith(' ... '): # python inlines | |
|
926 | after.setdefault(prepos, []).append(l) | |
|
927 | script.append(l[2:]) | |
|
928 | elif l.startswith(' $ '): # commands | |
|
929 | if inpython: | |
|
930 | script.append('EOF\n') | |
|
931 | inpython = False | |
|
932 | after.setdefault(pos, []).append(l) | |
|
933 | prepos = pos | |
|
934 | pos = n | |
|
935 | addsalt(n, False) | |
|
936 | cmd = l[4:].split() | |
|
937 | if len(cmd) == 2 and cmd[0] == 'cd': | |
|
938 | l = ' $ cd %s || exit 1\n' % cmd[1] | |
|
939 | script.append(l[4:]) | |
|
940 | elif l.startswith(' > '): # continuations | |
|
941 | after.setdefault(prepos, []).append(l) | |
|
942 | script.append(l[4:]) | |
|
943 | elif l.startswith(' '): # results | |
|
944 | # Queue up a list of expected results. | |
|
945 | expected.setdefault(pos, []).append(l[2:]) | |
|
946 | else: | |
|
947 | if inpython: | |
|
948 | script.append('EOF\n') | |
|
949 | inpython = False | |
|
950 | # Non-command/result. Queue up for merged output. | |
|
951 | after.setdefault(pos, []).append(l) | |
|
952 | ||
|
953 | if inpython: | |
|
954 | script.append('EOF\n') | |
|
955 | if skipping is not None: | |
|
956 | after.setdefault(pos, []).append(' !!! missing #endif\n') | |
|
957 | addsalt(n + 1, False) | |
|
958 | ||
|
959 | return salt, script, after, expected | |
|
960 | ||
|
961 | ||
|
952 | 962 | wifexited = getattr(os, "WIFEXITED", lambda x: False) |
|
953 | 963 | def run(cmd, wd, options, replacements, env): |
|
954 | 964 | """Run command in a sub-process, capturing the output (stdout and stderr). |
General Comments 0
You need to be logged in to leave comments.
Login now