sassc 2.0.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.gitmodules +1 -1
  4. data/.travis.yml +9 -3
  5. data/CHANGELOG.md +36 -0
  6. data/CODE_OF_CONDUCT.md +1 -1
  7. data/README.md +1 -1
  8. data/Rakefile +43 -7
  9. data/ext/depend +4 -0
  10. data/ext/extconf.rb +92 -0
  11. data/ext/libsass/VERSION +1 -0
  12. data/ext/libsass/include/sass/base.h +9 -1
  13. data/ext/libsass/include/sass/context.h +5 -1
  14. data/ext/libsass/src/MurmurHash2.hpp +91 -0
  15. data/ext/libsass/src/ast.cpp +755 -2028
  16. data/ext/libsass/src/ast.hpp +492 -2477
  17. data/ext/libsass/src/{to_c.cpp → ast2c.cpp} +22 -16
  18. data/ext/libsass/src/ast2c.hpp +39 -0
  19. data/ext/libsass/src/ast_def_macros.hpp +70 -10
  20. data/ext/libsass/src/ast_fwd_decl.cpp +5 -3
  21. data/ext/libsass/src/ast_fwd_decl.hpp +107 -296
  22. data/ext/libsass/src/ast_helpers.hpp +292 -0
  23. data/ext/libsass/src/ast_sel_cmp.cpp +396 -0
  24. data/ext/libsass/src/ast_sel_super.cpp +539 -0
  25. data/ext/libsass/src/ast_sel_unify.cpp +275 -0
  26. data/ext/libsass/src/ast_sel_weave.cpp +616 -0
  27. data/ext/libsass/src/ast_selectors.cpp +1043 -0
  28. data/ext/libsass/src/ast_selectors.hpp +522 -0
  29. data/ext/libsass/src/ast_supports.cpp +114 -0
  30. data/ext/libsass/src/ast_supports.hpp +121 -0
  31. data/ext/libsass/src/ast_values.cpp +1154 -0
  32. data/ext/libsass/src/ast_values.hpp +498 -0
  33. data/ext/libsass/src/backtrace.cpp +11 -7
  34. data/ext/libsass/src/backtrace.hpp +5 -5
  35. data/ext/libsass/src/base64vlq.cpp +5 -2
  36. data/ext/libsass/src/base64vlq.hpp +1 -1
  37. data/ext/libsass/src/bind.cpp +35 -34
  38. data/ext/libsass/src/bind.hpp +3 -1
  39. data/ext/libsass/src/c2ast.cpp +64 -0
  40. data/ext/libsass/src/c2ast.hpp +14 -0
  41. data/ext/libsass/src/cencode.c +4 -6
  42. data/ext/libsass/src/check_nesting.cpp +83 -88
  43. data/ext/libsass/src/check_nesting.hpp +39 -34
  44. data/ext/libsass/src/color_maps.cpp +168 -164
  45. data/ext/libsass/src/color_maps.hpp +152 -160
  46. data/ext/libsass/src/constants.cpp +20 -0
  47. data/ext/libsass/src/constants.hpp +19 -0
  48. data/ext/libsass/src/context.cpp +104 -121
  49. data/ext/libsass/src/context.hpp +43 -55
  50. data/ext/libsass/src/cssize.cpp +103 -188
  51. data/ext/libsass/src/cssize.hpp +45 -51
  52. data/ext/libsass/src/dart_helpers.hpp +199 -0
  53. data/ext/libsass/src/debugger.hpp +524 -361
  54. data/ext/libsass/src/emitter.cpp +26 -26
  55. data/ext/libsass/src/emitter.hpp +20 -18
  56. data/ext/libsass/src/environment.cpp +41 -27
  57. data/ext/libsass/src/environment.hpp +33 -22
  58. data/ext/libsass/src/error_handling.cpp +92 -94
  59. data/ext/libsass/src/error_handling.hpp +73 -50
  60. data/ext/libsass/src/eval.cpp +380 -515
  61. data/ext/libsass/src/eval.hpp +64 -57
  62. data/ext/libsass/src/eval_selectors.cpp +75 -0
  63. data/ext/libsass/src/expand.cpp +322 -263
  64. data/ext/libsass/src/expand.hpp +55 -39
  65. data/ext/libsass/src/extender.cpp +1188 -0
  66. data/ext/libsass/src/extender.hpp +399 -0
  67. data/ext/libsass/src/extension.cpp +43 -0
  68. data/ext/libsass/src/extension.hpp +89 -0
  69. data/ext/libsass/src/file.cpp +134 -88
  70. data/ext/libsass/src/file.hpp +28 -37
  71. data/ext/libsass/src/fn_colors.cpp +596 -0
  72. data/ext/libsass/src/fn_colors.hpp +85 -0
  73. data/ext/libsass/src/fn_lists.cpp +285 -0
  74. data/ext/libsass/src/fn_lists.hpp +34 -0
  75. data/ext/libsass/src/fn_maps.cpp +94 -0
  76. data/ext/libsass/src/fn_maps.hpp +30 -0
  77. data/ext/libsass/src/fn_miscs.cpp +244 -0
  78. data/ext/libsass/src/fn_miscs.hpp +40 -0
  79. data/ext/libsass/src/fn_numbers.cpp +227 -0
  80. data/ext/libsass/src/fn_numbers.hpp +45 -0
  81. data/ext/libsass/src/fn_selectors.cpp +205 -0
  82. data/ext/libsass/src/fn_selectors.hpp +35 -0
  83. data/ext/libsass/src/fn_strings.cpp +268 -0
  84. data/ext/libsass/src/fn_strings.hpp +34 -0
  85. data/ext/libsass/src/fn_utils.cpp +158 -0
  86. data/ext/libsass/src/fn_utils.hpp +62 -0
  87. data/ext/libsass/src/inspect.cpp +253 -266
  88. data/ext/libsass/src/inspect.hpp +72 -74
  89. data/ext/libsass/src/json.cpp +2 -2
  90. data/ext/libsass/src/lexer.cpp +25 -84
  91. data/ext/libsass/src/lexer.hpp +5 -16
  92. data/ext/libsass/src/listize.cpp +27 -43
  93. data/ext/libsass/src/listize.hpp +14 -11
  94. data/ext/libsass/src/mapping.hpp +1 -0
  95. data/ext/libsass/src/memory.hpp +12 -0
  96. data/ext/libsass/src/memory/allocator.cpp +48 -0
  97. data/ext/libsass/src/memory/allocator.hpp +138 -0
  98. data/ext/libsass/src/memory/config.hpp +20 -0
  99. data/ext/libsass/src/memory/memory_pool.hpp +186 -0
  100. data/ext/libsass/src/memory/shared_ptr.cpp +33 -0
  101. data/ext/libsass/src/memory/shared_ptr.hpp +332 -0
  102. data/ext/libsass/src/operation.hpp +193 -143
  103. data/ext/libsass/src/operators.cpp +56 -29
  104. data/ext/libsass/src/operators.hpp +11 -11
  105. data/ext/libsass/src/ordered_map.hpp +112 -0
  106. data/ext/libsass/src/output.cpp +59 -75
  107. data/ext/libsass/src/output.hpp +15 -22
  108. data/ext/libsass/src/parser.cpp +662 -818
  109. data/ext/libsass/src/parser.hpp +96 -100
  110. data/ext/libsass/src/parser_selectors.cpp +189 -0
  111. data/ext/libsass/src/permutate.hpp +164 -0
  112. data/ext/libsass/src/plugins.cpp +12 -8
  113. data/ext/libsass/src/plugins.hpp +8 -8
  114. data/ext/libsass/src/position.cpp +10 -26
  115. data/ext/libsass/src/position.hpp +44 -21
  116. data/ext/libsass/src/prelexer.cpp +14 -8
  117. data/ext/libsass/src/prelexer.hpp +9 -9
  118. data/ext/libsass/src/remove_placeholders.cpp +59 -57
  119. data/ext/libsass/src/remove_placeholders.hpp +20 -18
  120. data/ext/libsass/src/sass.cpp +25 -18
  121. data/ext/libsass/src/sass.hpp +22 -14
  122. data/ext/libsass/src/sass2scss.cpp +49 -18
  123. data/ext/libsass/src/sass_context.cpp +104 -132
  124. data/ext/libsass/src/sass_context.hpp +2 -2
  125. data/ext/libsass/src/sass_functions.cpp +7 -4
  126. data/ext/libsass/src/sass_functions.hpp +1 -1
  127. data/ext/libsass/src/sass_values.cpp +26 -21
  128. data/ext/libsass/src/settings.hpp +19 -0
  129. data/ext/libsass/src/source.cpp +69 -0
  130. data/ext/libsass/src/source.hpp +95 -0
  131. data/ext/libsass/src/source_data.hpp +32 -0
  132. data/ext/libsass/src/source_map.cpp +27 -20
  133. data/ext/libsass/src/source_map.hpp +14 -11
  134. data/ext/libsass/src/stylesheet.cpp +22 -0
  135. data/ext/libsass/src/stylesheet.hpp +57 -0
  136. data/ext/libsass/src/to_value.cpp +24 -22
  137. data/ext/libsass/src/to_value.hpp +18 -22
  138. data/ext/libsass/src/units.cpp +28 -22
  139. data/ext/libsass/src/units.hpp +9 -8
  140. data/ext/libsass/src/utf8/checked.h +12 -10
  141. data/ext/libsass/src/utf8/core.h +3 -0
  142. data/ext/libsass/src/utf8_string.cpp +12 -10
  143. data/ext/libsass/src/utf8_string.hpp +7 -6
  144. data/ext/libsass/src/util.cpp +97 -107
  145. data/ext/libsass/src/util.hpp +74 -30
  146. data/ext/libsass/src/util_string.cpp +125 -0
  147. data/ext/libsass/src/util_string.hpp +73 -0
  148. data/ext/libsass/src/values.cpp +33 -24
  149. data/ext/libsass/src/values.hpp +2 -2
  150. data/lib/sassc.rb +24 -0
  151. data/lib/sassc/engine.rb +7 -5
  152. data/lib/sassc/functions_handler.rb +11 -13
  153. data/lib/sassc/native.rb +10 -9
  154. data/lib/sassc/native/native_functions_api.rb +0 -5
  155. data/lib/sassc/script.rb +4 -6
  156. data/lib/sassc/version.rb +1 -1
  157. data/sassc.gemspec +32 -12
  158. data/test/engine_test.rb +32 -2
  159. data/test/functions_test.rb +38 -1
  160. data/test/native_test.rb +4 -4
  161. metadata +95 -109
  162. data/ext/Rakefile +0 -3
  163. data/ext/libsass/.editorconfig +0 -15
  164. data/ext/libsass/.gitattributes +0 -2
  165. data/ext/libsass/.github/CONTRIBUTING.md +0 -65
  166. data/ext/libsass/.github/ISSUE_TEMPLATE.md +0 -54
  167. data/ext/libsass/.gitignore +0 -85
  168. data/ext/libsass/.travis.yml +0 -64
  169. data/ext/libsass/COPYING +0 -25
  170. data/ext/libsass/GNUmakefile.am +0 -88
  171. data/ext/libsass/INSTALL +0 -1
  172. data/ext/libsass/LICENSE +0 -25
  173. data/ext/libsass/Makefile +0 -351
  174. data/ext/libsass/Makefile.conf +0 -55
  175. data/ext/libsass/Readme.md +0 -104
  176. data/ext/libsass/SECURITY.md +0 -10
  177. data/ext/libsass/appveyor.yml +0 -91
  178. data/ext/libsass/configure.ac +0 -138
  179. data/ext/libsass/contrib/libsass.spec +0 -66
  180. data/ext/libsass/docs/README.md +0 -20
  181. data/ext/libsass/docs/api-context-example.md +0 -45
  182. data/ext/libsass/docs/api-context-internal.md +0 -163
  183. data/ext/libsass/docs/api-context.md +0 -295
  184. data/ext/libsass/docs/api-doc.md +0 -215
  185. data/ext/libsass/docs/api-function-example.md +0 -67
  186. data/ext/libsass/docs/api-function-internal.md +0 -8
  187. data/ext/libsass/docs/api-function.md +0 -74
  188. data/ext/libsass/docs/api-importer-example.md +0 -112
  189. data/ext/libsass/docs/api-importer-internal.md +0 -20
  190. data/ext/libsass/docs/api-importer.md +0 -86
  191. data/ext/libsass/docs/api-value-example.md +0 -55
  192. data/ext/libsass/docs/api-value-internal.md +0 -76
  193. data/ext/libsass/docs/api-value.md +0 -154
  194. data/ext/libsass/docs/build-on-darwin.md +0 -27
  195. data/ext/libsass/docs/build-on-gentoo.md +0 -55
  196. data/ext/libsass/docs/build-on-windows.md +0 -139
  197. data/ext/libsass/docs/build-shared-library.md +0 -35
  198. data/ext/libsass/docs/build-with-autotools.md +0 -78
  199. data/ext/libsass/docs/build-with-makefiles.md +0 -68
  200. data/ext/libsass/docs/build-with-mingw.md +0 -107
  201. data/ext/libsass/docs/build-with-visual-studio.md +0 -90
  202. data/ext/libsass/docs/build.md +0 -97
  203. data/ext/libsass/docs/compatibility-plan.md +0 -48
  204. data/ext/libsass/docs/contributing.md +0 -17
  205. data/ext/libsass/docs/custom-functions-internal.md +0 -122
  206. data/ext/libsass/docs/dev-ast-memory.md +0 -223
  207. data/ext/libsass/docs/implementations.md +0 -56
  208. data/ext/libsass/docs/plugins.md +0 -47
  209. data/ext/libsass/docs/setup-environment.md +0 -68
  210. data/ext/libsass/docs/source-map-internals.md +0 -51
  211. data/ext/libsass/docs/trace.md +0 -26
  212. data/ext/libsass/docs/triage.md +0 -17
  213. data/ext/libsass/docs/unicode.md +0 -39
  214. data/ext/libsass/extconf.rb +0 -6
  215. data/ext/libsass/include/sass/version.h.in +0 -12
  216. data/ext/libsass/m4/.gitkeep +0 -0
  217. data/ext/libsass/m4/m4-ax_cxx_compile_stdcxx_11.m4 +0 -167
  218. data/ext/libsass/res/resource.rc +0 -35
  219. data/ext/libsass/script/bootstrap +0 -13
  220. data/ext/libsass/script/branding +0 -10
  221. data/ext/libsass/script/ci-build-libsass +0 -134
  222. data/ext/libsass/script/ci-build-plugin +0 -62
  223. data/ext/libsass/script/ci-install-compiler +0 -6
  224. data/ext/libsass/script/ci-install-deps +0 -20
  225. data/ext/libsass/script/ci-report-coverage +0 -42
  226. data/ext/libsass/script/spec +0 -5
  227. data/ext/libsass/script/tap-driver +0 -652
  228. data/ext/libsass/script/tap-runner +0 -1
  229. data/ext/libsass/script/test-leaks.pl +0 -103
  230. data/ext/libsass/src/GNUmakefile.am +0 -54
  231. data/ext/libsass/src/extend.cpp +0 -2130
  232. data/ext/libsass/src/extend.hpp +0 -86
  233. data/ext/libsass/src/functions.cpp +0 -2234
  234. data/ext/libsass/src/functions.hpp +0 -198
  235. data/ext/libsass/src/memory/SharedPtr.cpp +0 -114
  236. data/ext/libsass/src/memory/SharedPtr.hpp +0 -206
  237. data/ext/libsass/src/node.cpp +0 -319
  238. data/ext/libsass/src/node.hpp +0 -118
  239. data/ext/libsass/src/paths.hpp +0 -71
  240. data/ext/libsass/src/sass_util.cpp +0 -149
  241. data/ext/libsass/src/sass_util.hpp +0 -256
  242. data/ext/libsass/src/subset_map.cpp +0 -55
  243. data/ext/libsass/src/subset_map.hpp +0 -76
  244. data/ext/libsass/src/support/libsass.pc.in +0 -11
  245. data/ext/libsass/src/to_c.hpp +0 -39
  246. data/ext/libsass/test/test_node.cpp +0 -94
  247. data/ext/libsass/test/test_paths.cpp +0 -28
  248. data/ext/libsass/test/test_selector_difference.cpp +0 -25
  249. data/ext/libsass/test/test_specificity.cpp +0 -25
  250. data/ext/libsass/test/test_subset_map.cpp +0 -472
  251. data/ext/libsass/test/test_superselector.cpp +0 -69
  252. data/ext/libsass/test/test_unification.cpp +0 -31
  253. data/ext/libsass/version.sh +0 -10
  254. data/ext/libsass/win/libsass.sln +0 -39
  255. data/ext/libsass/win/libsass.sln.DotSettings +0 -9
  256. data/ext/libsass/win/libsass.targets +0 -118
  257. data/ext/libsass/win/libsass.vcxproj +0 -188
  258. data/ext/libsass/win/libsass.vcxproj.filters +0 -357
  259. data/lib/sassc/native/lib_c.rb +0 -21
  260. data/lib/tasks/libsass.rb +0 -33
@@ -1,35 +0,0 @@
1
- #include <windows.h>
2
-
3
- // DLL version information.
4
- VS_VERSION_INFO VERSIONINFO
5
- FILEVERSION 1,0,0,0
6
- PRODUCTVERSION 1,0,0,0
7
- FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
8
- #ifdef _DEBUG
9
- FILEFLAGS VS_FF_DEBUG | VS_FF_PRERELEASE
10
- #else
11
- FILEFLAGS 0
12
- #endif
13
- FILEOS VOS_NT_WINDOWS32
14
- FILETYPE VFT_DLL
15
- FILESUBTYPE VFT2_UNKNOWN
16
- BEGIN
17
- BLOCK "StringFileInfo"
18
- BEGIN
19
- BLOCK "080904b0"
20
- BEGIN
21
- VALUE "CompanyName", "Sass Open Source Foundation"
22
- VALUE "FileDescription", "A C/C++ implementation of a Sass compiler"
23
- VALUE "FileVersion", "1.0.0.0"
24
- VALUE "InternalName", "libsass"
25
- VALUE "LegalCopyright", "\251 2017 libsass.org"
26
- VALUE "OriginalFilename", "libsass.dll"
27
- VALUE "ProductName", "LibSass Library"
28
- VALUE "ProductVersion", "1.0.0.0"
29
- END
30
- END
31
- BLOCK "VarFileInfo"
32
- BEGIN
33
- VALUE "Translation", 0x809, 1200
34
- END
35
- END
@@ -1,13 +0,0 @@
1
- #!/bin/bash
2
-
3
- script/branding
4
-
5
- : ${SASS_SPEC_PATH:="sass-spec"}
6
- : ${SASS_SASSC_PATH:="sassc" }
7
-
8
- if [ ! -d $SASS_SPEC_PATH ]; then
9
- git clone https://github.com/sass/sass-spec.git $SASS_SPEC_PATH
10
- fi
11
- if [ ! -d $SASS_SASSC_PATH ]; then
12
- git clone https://github.com/sass/sassc.git $SASS_SASSC_PATH
13
- fi
@@ -1,10 +0,0 @@
1
- #! /bin/bash
2
-
3
- echo " "
4
- echo " _ ___ ____ ____ _ ____ ____ "
5
- echo "| | |_ _| __ ) ___| / \ / ___/ ___| "
6
- echo "| | | || _ \___ \ / _ \ \___ \___ \ "
7
- echo "| |___ | || |_) |__) / ___ \ ___) |__) |"
8
- echo "|_____|___|____/____/_/ \_\____/____/ "
9
- echo " "
10
-
@@ -1,134 +0,0 @@
1
- #!/bin/bash
2
-
3
- set -e
4
-
5
- script/bootstrap
6
-
7
- # export this path right here (was in script/spec before)
8
- export SASS_LIBSASS_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )"/../ && pwd )"
9
-
10
- # use some defaults if not running under travis ci
11
- if [ "x$CONTINUOUS_INTEGRATION" == "x" ]; then export CONTINUOUS_INTEGRATION=true; fi
12
- if [ "x$TRAVIS_BUILD_DIR" == "x" ]; then export TRAVIS_BUILD_DIR=$(pwd); fi
13
- if [ "x$SASS_SASSC_PATH" == "x" ]; then export SASS_SASSC_PATH=$(pwd)/sassc; fi
14
- if [ "x$SASS_SPEC_PATH" == "x" ]; then export SASS_SPEC_PATH=$(pwd)/sass-spec; fi
15
-
16
- # try to get the os name from uname (and filter via perl - probably not the most portable way?)
17
- if [ "x$TRAVIS_OS_NAME" == "x" ]; then export TRAVIS_OS_NAME=`uname -s | perl -ne 'print lc \$1 if\(/^([a-zA-Z]+)/'\)`; fi
18
-
19
- if [ "x$COVERAGE" == "xyes" ]; then
20
- COVERAGE_OPT="--enable-coverage"
21
- export EXTRA_CFLAGS="-fprofile-arcs -ftest-coverage"
22
- export EXTRA_CXXFLAGS="-fprofile-arcs -ftest-coverage"
23
- if [ "$TRAVIS_OS_NAME" == "osx" ]; then
24
- # osx doesn't seem to know gcov lib?
25
- export EXTRA_LDFLAGS="--coverage"
26
- else
27
- export EXTRA_LDFLAGS="-lgcov --coverage"
28
- fi
29
- else
30
- COVERAGE_OPT="--disable-coverage"
31
- fi
32
-
33
- if [ "x$BUILD" == "xstatic" ]; then
34
- SHARED_OPT="--disable-shared --enable-static"
35
- MAKE_TARGET="static"
36
- else
37
- # Makefile of sassc wants to link to static
38
- SHARED_OPT="--enable-shared --enable-static"
39
- MAKE_TARGET="shared"
40
- fi
41
-
42
- if [ "$(expr substr $(uname -s) 1 10)" == "MINGW32_NT" ]; then
43
- MAKE_OPTS="$MAKE_OPTS -j1 V=1"
44
- else
45
- MAKE_OPTS="$MAKE_OPTS -j5 V=1"
46
- fi
47
-
48
- if [ "x$PREFIX" == "x" ]; then
49
- if [ "x$TRAVIS_BUILD_DIR" == "x" ]; then
50
- PREFIX=$SASS_LIBSASS_PATH/build
51
- else
52
- PREFIX=$TRAVIS_BUILD_DIR/build
53
- fi
54
- fi
55
-
56
- # enable address sanitation
57
- # https://en.wikipedia.org/wiki/AddressSanitizer
58
- if [ "x$CC" == "xclang" ]; then
59
- if [ "x$COVERAGE" != "xyes" ]; then
60
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then
61
- export EXTRA_CFLAGS="$EXTRA_CFLAGS -fsanitize=address"
62
- export EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS -fsanitize=address"
63
- export EXTRA_LDFLAGS="$EXTRA_LDFLAGS -fsanitize=address"
64
- fi
65
- fi
66
- fi
67
-
68
- echo SASS_LIBSASS_PATH: $SASS_LIBSASS_PATH
69
- echo TRAVIS_BUILD_DIR: $TRAVIS_BUILD_DIR
70
- echo SASS_SASSC_PATH: $SASS_SASSC_PATH
71
- echo SASS_SPEC_PATH: $SASS_SPEC_PATH
72
- echo INSTALL_LOCATION: $PREFIX
73
-
74
- if [ "x$AUTOTOOLS" == "xyes" ]; then
75
-
76
- echo -en 'travis_fold:start:configure\r'
77
- autoreconf --force --install
78
- ./configure --enable-tests $COVERAGE_OPT \
79
- --disable-silent-rules \
80
- --with-sassc-dir=$SASS_SASSC_PATH \
81
- --with-sass-spec-dir=$SASS_SPEC_PATH \
82
- --prefix=$PREFIX \
83
- ${SHARED_OPT}
84
- echo -en 'travis_fold:end:configure\r'
85
-
86
- make $MAKE_OPTS clean
87
-
88
- # install to prefix directory
89
- PREFIX="$PREFIX" make $MAKE_OPTS install
90
-
91
- else
92
-
93
- make $MAKE_OPTS clean
94
-
95
- fi
96
-
97
- # install to prefix directory
98
- PREFIX="$PREFIX" make $MAKE_OPTS install
99
-
100
- ls -la $PREFIX/*
101
-
102
- echo successfully compiled libsass
103
- echo AUTOTOOLS=$AUTOTOOLS COVERAGE=$COVERAGE BUILD=$BUILD
104
-
105
- if [ "$CONTINUOUS_INTEGRATION" == "true" ] && [ "$TRAVIS_PULL_REQUEST" != "false" ] && [ "x$TRAVIS_PULL_REQUEST" != "x" ] &&
106
- ([ "$TRAVIS_OS_NAME" == "linux" ] || [ "$TRAVIS_OS_NAME" == "osx" ] || [ "$TRAVIS_OS_NAME" == "cygwin" ]);
107
- then
108
-
109
- echo "Fetching PR $TRAVIS_PULL_REQUEST"
110
-
111
- JSON=$(curl -L -sS https://api.github.com/repos/sass/libsass/pulls/$TRAVIS_PULL_REQUEST)
112
-
113
- if [[ $JSON =~ "API rate limit exceeded" ]];
114
- then
115
- echo "Travis rate limit on github exceeded"
116
- echo "Retrying via 'special purpose proxy'"
117
- JSON=$(curl -L -sS https://github-api-reverse-proxy.herokuapp.com/repos/sass/libsass/pulls/$TRAVIS_PULL_REQUEST)
118
- fi
119
-
120
- RE_SPEC_PR="sass\/sass-spec(#|\/pull\/)([0-9]+)"
121
-
122
- if [[ $JSON =~ $RE_SPEC_PR ]];
123
- then
124
- SPEC_PR="${BASH_REMATCH[2]}"
125
- echo "Fetching Sass Spec PR $SPEC_PR"
126
- git -C sass-spec fetch -u origin pull/$SPEC_PR/head:ci-spec-pr-$SPEC_PR
127
- git -C sass-spec checkout --force ci-spec-pr-$SPEC_PR
128
- LD_LIBRARY_PATH="$PREFIX/lib/" make $MAKE_OPTS test_probe
129
- else
130
- LD_LIBRARY_PATH="$PREFIX/lib/" make $MAKE_OPTS test_probe
131
- fi
132
- else
133
- LD_LIBRARY_PATH="$PREFIX/lib/" make $MAKE_OPTS test_probe
134
- fi
@@ -1,62 +0,0 @@
1
- #!/bin/bash
2
-
3
- PLUGIN=$1
4
- RUBY_BIN=ruby
5
- SASS_SPEC_PATH=sass-spec
6
- SASSC_BIN=sassc/bin/sassc
7
- SASS_SPEC_SPEC_DIR=plugins/libsass-${PLUGIN}/test
8
-
9
- if [ -e ./tester ] ; then
10
- SASSC_BIN=./tester
11
- fi
12
-
13
- if [ -d ./build/lib ] ; then
14
- cp -a build/lib lib
15
- fi
16
-
17
- if [ "x$1" == "x" ] ; then
18
- echo "No plugin name given"
19
- exit 1
20
- fi
21
-
22
- if [ "x$COVERAGE" == "0" ] ; then
23
- unset COVERAGE
24
- fi
25
-
26
- export EXTRA_CFLAGS=""
27
- export EXTRA_CXXFLAGS=""
28
- if [ "$TRAVIS_OS_NAME" == "osx" ]; then
29
- # osx doesn't seem to know gcov lib?
30
- export EXTRA_LDFLAGS="--coverage"
31
- else
32
- export EXTRA_LDFLAGS="-lgcov --coverage"
33
- fi
34
-
35
- mkdir -p plugins
36
- if [ ! -d plugins/libsass-${PLUGIN} ] ; then
37
- git clone https://github.com/mgreter/libsass-${PLUGIN} plugins/libsass-${PLUGIN}
38
- fi
39
- if [ ! -d plugins/libsass-${PLUGIN}/build ] ; then
40
- mkdir plugins/libsass-${PLUGIN}/build
41
- fi
42
- RETVAL=$?; if [ "$RETVAL" != "0" ]; then exit $RETVAL; fi
43
-
44
- cd plugins/libsass-${PLUGIN}/build
45
- cmake -G "Unix Makefiles" -D LIBSASS_DIR="../../.." ..
46
- RETVAL=$?; if [ "$RETVAL" != "0" ]; then exit $RETVAL; fi
47
- make VERBOSE=1 -j2
48
- RETVAL=$?; if [ "$RETVAL" != "0" ]; then exit $RETVAL; fi
49
- cd ../../..
50
-
51
- # glob only works on paths relative to imports
52
- if [ "x$PLUGIN" == "xglob" ]; then
53
- ${SASSC_BIN} --plugin-path plugins/libsass-${PLUGIN}/build ${SASS_SPEC_SPEC_DIR}/basic/input.scss > ${SASS_SPEC_SPEC_DIR}/basic/result.css
54
- ${SASSC_BIN} --plugin-path plugins/libsass-${PLUGIN}/build ${SASS_SPEC_SPEC_DIR}/basic/input.scss --sourcemap > /dev/null
55
- else
56
- cat ${SASS_SPEC_SPEC_DIR}/basic/input.scss | ${SASSC_BIN} --plugin-path plugins/libsass-${PLUGIN}/build -I ${SASS_SPEC_SPEC_DIR}/basic > ${SASS_SPEC_SPEC_DIR}/basic/result.css
57
- cat ${SASS_SPEC_SPEC_DIR}/basic/input.scss | ${SASSC_BIN} --plugin-path plugins/libsass-${PLUGIN}/build -I ${SASS_SPEC_SPEC_DIR}/basic --sourcemap > /dev/null
58
- fi
59
- RETVAL=$?; if [ "$RETVAL" != "0" ]; then exit $RETVAL; fi
60
-
61
- diff ${SASS_SPEC_SPEC_DIR}/basic/expected_output.css ${SASS_SPEC_SPEC_DIR}/basic/result.css
62
- RETVAL=$?; if [ "$RETVAL" != "0" ]; then exit $RETVAL; fi
@@ -1,6 +0,0 @@
1
- #!/bin/bash
2
-
3
- gem install minitest
4
- gem install minitap
5
-
6
- pip2 install --user 'requests[security]'
@@ -1,20 +0,0 @@
1
- #!/bin/bash
2
- if [ "x$COVERAGE" == "xyes" ]; then
3
- pip2 install --user gcovr
4
- pip2 install --user cpp-coveralls
5
- else
6
- echo "no dependencies to install"
7
- fi
8
-
9
- if [ "x$AUTOTOOLS" == "xyes" ]; then
10
- AUTOTOOLS=yes
11
-
12
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then
13
- sudo add-apt-repository -y ppa:rbose-debianizer/automake &> /dev/null
14
- sudo apt-get -qq update
15
- sudo apt-get -qq install automake
16
- fi
17
-
18
- fi
19
-
20
- exit 0
@@ -1,42 +0,0 @@
1
- #!/bin/bash
2
-
3
- if [ "x$COVERAGE" = "xyes" ]; then
4
-
5
- # find / -name "gcovr"
6
- # find / -name "coveralls"
7
- # this is only needed for mac os x builds!
8
- PATH=$PATH:/Users/travis/Library/Python/2.7/bin/
9
-
10
-
11
- # exclude some directories from profiling (.libs is from autotools)
12
- export EXCLUDE_COVERAGE="--exclude plugins
13
- --exclude sassc/sassc.c
14
- --exclude src/sass-spec
15
- --exclude src/.libs
16
- --exclude src/debug.hpp
17
- --exclude src/json.cpp
18
- --exclude src/json.hpp
19
- --exclude src/cencode.c
20
- --exclude src/b64
21
- --exclude src/utf8
22
- --exclude src/utf8_string.hpp
23
- --exclude src/utf8.h
24
- --exclude src/utf8_string.cpp
25
- --exclude src/sass2scss.h
26
- --exclude src/sass2scss.cpp
27
- --exclude src/test
28
- --exclude src/posix
29
- --exclude src/debugger.hpp"
30
- # debug used gcov version
31
- # option not available on mac
32
- if [ "$TRAVIS_OS_NAME" != "osx" ]; then
33
- gcov -v
34
- fi
35
- # create summarized report
36
- gcovr -r .
37
- # submit report to coveralls.io
38
- coveralls $EXCLUDE_COVERAGE --gcov-options '\-lp'
39
-
40
- else
41
- echo "skip coverage reporting"
42
- fi
@@ -1,5 +0,0 @@
1
- #!/bin/bash
2
-
3
- script/bootstrap
4
-
5
- make $MAKE_OPTS test_build
@@ -1,652 +0,0 @@
1
- #!/usr/bin/env sh
2
- # Copyright (C) 2011-2013 Free Software Foundation, Inc.
3
- #
4
- # This program is free software; you can redistribute it and/or modify
5
- # it under the terms of the GNU General Public License as published by
6
- # the Free Software Foundation; either version 2, or (at your option)
7
- # any later version.
8
- #
9
- # This program is distributed in the hope that it will be useful,
10
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
- # GNU General Public License for more details.
13
- #
14
- # You should have received a copy of the GNU General Public License
15
- # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
-
17
- # As a special exception to the GNU General Public License, if you
18
- # distribute this file as part of a program that contains a
19
- # configuration script generated by Autoconf, you may include it under
20
- # the same distribution terms that you use for the rest of that program.
21
-
22
- # This file is maintained in Automake, please report
23
- # bugs to <bug-automake@gnu.org> or send patches to
24
- # <automake-patches@gnu.org>.
25
-
26
- scriptversion=2011-12-27.17; # UTC
27
-
28
- # Make unconditional expansion of undefined variables an error. This
29
- # helps a lot in preventing typo-related bugs.
30
- set -u
31
-
32
- me=tap-driver.sh
33
-
34
- fatal ()
35
- {
36
- echo "$me: fatal: $*" >&2
37
- exit 1
38
- }
39
-
40
- usage_error ()
41
- {
42
- echo "$me: $*" >&2
43
- print_usage >&2
44
- exit 2
45
- }
46
-
47
- print_usage ()
48
- {
49
- cat <<END
50
- Usage:
51
- tap-driver.sh --test-name=NAME --log-file=PATH --trs-file=PATH
52
- [--expect-failure={yes|no}] [--color-tests={yes|no}]
53
- [--enable-hard-errors={yes|no}] [--ignore-exit]
54
- [--diagnostic-string=STRING] [--merge|--no-merge]
55
- [--comments|--no-comments] [--] TEST-COMMAND
56
- The \`--test-name', \`--log-file' and \`--trs-file' options are mandatory.
57
- END
58
- }
59
-
60
- # TODO: better error handling in option parsing (in particular, ensure
61
- # TODO: $log_file, $trs_file and $test_name are defined).
62
- test_name= # Used for reporting.
63
- log_file= # Where to save the result and output of the test script.
64
- trs_file= # Where to save the metadata of the test run.
65
- expect_failure=0
66
- color_tests=0
67
- merge=0
68
- ignore_exit=0
69
- comments=0
70
- diag_string='#'
71
- while test $# -gt 0; do
72
- case $1 in
73
- --help) print_usage; exit $?;;
74
- --version) echo "$me $scriptversion"; exit $?;;
75
- --test-name) test_name=$2; shift;;
76
- --log-file) log_file=$2; shift;;
77
- --trs-file) trs_file=$2; shift;;
78
- --color-tests) color_tests=$2; shift;;
79
- --expect-failure) expect_failure=$2; shift;;
80
- --enable-hard-errors) shift;; # No-op.
81
- --merge) merge=1;;
82
- --no-merge) merge=0;;
83
- --ignore-exit) ignore_exit=1;;
84
- --comments) comments=1;;
85
- --no-comments) comments=0;;
86
- --diagnostic-string) diag_string=$2; shift;;
87
- --) shift; break;;
88
- -*) usage_error "invalid option: '$1'";;
89
- esac
90
- shift
91
- done
92
-
93
- test $# -gt 0 || usage_error "missing test command"
94
-
95
- case $expect_failure in
96
- yes) expect_failure=1;;
97
- *) expect_failure=0;;
98
- esac
99
-
100
- if test $color_tests = yes; then
101
- init_colors='
102
- color_map["red"]="" # Red.
103
- color_map["grn"]="" # Green.
104
- color_map["lgn"]="" # Light green.
105
- color_map["blu"]="" # Blue.
106
- color_map["mgn"]="" # Magenta.
107
- color_map["std"]="" # No color.
108
- color_for_result["ERROR"] = "mgn"
109
- color_for_result["PASS"] = "grn"
110
- color_for_result["XPASS"] = "red"
111
- color_for_result["FAIL"] = "red"
112
- color_for_result["XFAIL"] = "lgn"
113
- color_for_result["SKIP"] = "blu"'
114
- else
115
- init_colors=''
116
- fi
117
-
118
- # :; is there to work around a bug in bash 3.2 (and earlier) which
119
- # does not always set '$?' properly on redirection failure.
120
- # See the Autoconf manual for more details.
121
- :;{
122
- (
123
- # Ignore common signals (in this subshell only!), to avoid potential
124
- # problems with Korn shells. Some Korn shells are known to propagate
125
- # to themselves signals that have killed a child process they were
126
- # waiting for; this is done at least for SIGINT (and usually only for
127
- # it, in truth). Without the `trap' below, such a behaviour could
128
- # cause a premature exit in the current subshell, e.g., in case the
129
- # test command it runs gets terminated by a SIGINT. Thus, the awk
130
- # script we are piping into would never seen the exit status it
131
- # expects on its last input line (which is displayed below by the
132
- # last `echo $?' statement), and would thus die reporting an internal
133
- # error.
134
- # For more information, see the Autoconf manual and the threads:
135
- # <http://lists.gnu.org/archive/html/bug-autoconf/2011-09/msg00004.html>
136
- # <http://mail.opensolaris.org/pipermail/ksh93-integration-discuss/2009-February/004121.html>
137
- trap : 1 3 2 13 15
138
- if test $merge -gt 0; then
139
- exec 2>&1
140
- else
141
- exec 2>&3
142
- fi
143
- "$@"
144
- echo $?
145
- ) | LC_ALL=C ${AM_TAP_AWK-awk} \
146
- -v me="$me" \
147
- -v test_script_name="$test_name" \
148
- -v log_file="$log_file" \
149
- -v trs_file="$trs_file" \
150
- -v expect_failure="$expect_failure" \
151
- -v merge="$merge" \
152
- -v ignore_exit="$ignore_exit" \
153
- -v comments="$comments" \
154
- -v diag_string="$diag_string" \
155
- '
156
- # FIXME: the usages of "cat >&3" below could be optimized when using
157
- # FIXME: GNU awk, and/on on systems that supports /dev/fd/.
158
-
159
- # Implementation note: in what follows, `result_obj` will be an
160
- # associative array that (partly) simulates a TAP result object
161
- # from the `TAP::Parser` perl module.
162
-
163
- ## ----------- ##
164
- ## FUNCTIONS ##
165
- ## ----------- ##
166
-
167
- function fatal(msg)
168
- {
169
- print me ": " msg | "cat >&2"
170
- exit 1
171
- }
172
-
173
- function abort(where)
174
- {
175
- fatal("internal error " where)
176
- }
177
-
178
- # Convert a boolean to a "yes"/"no" string.
179
- function yn(bool)
180
- {
181
- return bool ? "yes" : "no";
182
- }
183
-
184
- function add_test_result(result)
185
- {
186
- if (!test_results_index)
187
- test_results_index = 0
188
- test_results_list[test_results_index] = result
189
- test_results_index += 1
190
- test_results_seen[result] = 1;
191
- }
192
-
193
- # Whether the test script should be re-run by "make recheck".
194
- function must_recheck()
195
- {
196
- for (k in test_results_seen)
197
- if (k != "XFAIL" && k != "PASS" && k != "SKIP")
198
- return 1
199
- return 0
200
- }
201
-
202
- # Whether the content of the log file associated to this test should
203
- # be copied into the "global" test-suite.log.
204
- function copy_in_global_log()
205
- {
206
- for (k in test_results_seen)
207
- if (k != "PASS")
208
- return 1
209
- return 0
210
- }
211
-
212
- # FIXME: this can certainly be improved ...
213
- function get_global_test_result()
214
- {
215
- if ("ERROR" in test_results_seen)
216
- return "ERROR"
217
- if ("FAIL" in test_results_seen || "XPASS" in test_results_seen)
218
- return "FAIL"
219
- all_skipped = 1
220
- for (k in test_results_seen)
221
- if (k != "SKIP")
222
- all_skipped = 0
223
- if (all_skipped)
224
- return "SKIP"
225
- return "PASS";
226
- }
227
-
228
- function stringify_result_obj(result_obj)
229
- {
230
- if (result_obj["is_unplanned"] || result_obj["number"] != testno)
231
- return "ERROR"
232
-
233
- if (plan_seen == LATE_PLAN)
234
- return "ERROR"
235
-
236
- if (result_obj["directive"] == "TODO")
237
- return result_obj["is_ok"] ? "XPASS" : "XFAIL"
238
-
239
- if (result_obj["directive"] == "SKIP")
240
- return result_obj["is_ok"] ? "SKIP" : COOKED_FAIL;
241
-
242
- if (length(result_obj["directive"]))
243
- abort("in function stringify_result_obj()")
244
-
245
- return result_obj["is_ok"] ? COOKED_PASS : COOKED_FAIL
246
- }
247
-
248
- function decorate_result(result)
249
- {
250
- color_name = color_for_result[result]
251
- if (color_name)
252
- return color_map[color_name] "" result "" color_map["std"]
253
- # If we are not using colorized output, or if we do not know how
254
- # to colorize the given result, we should return it unchanged.
255
- return result
256
- }
257
-
258
- function report(result, details)
259
- {
260
- if (result ~ /^(X?(PASS|FAIL)|SKIP|ERROR)/)
261
- {
262
- msg = ": " test_script_name
263
- add_test_result(result)
264
- }
265
- else if (result == "#")
266
- {
267
- msg = " " test_script_name ":"
268
- }
269
- else
270
- {
271
- abort("in function report()")
272
- }
273
- if (length(details))
274
- msg = msg " " details
275
- # Output on console might be colorized.
276
- print decorate_result(result) msg
277
- # Log the result in the log file too, to help debugging (this is
278
- # especially true when said result is a TAP error or "Bail out!").
279
- print result msg | "cat >&3";
280
- }
281
-
282
- function testsuite_error(error_message)
283
- {
284
- report("ERROR", "- " error_message)
285
- }
286
-
287
- function handle_tap_result()
288
- {
289
- details = result_obj["number"];
290
- if (length(result_obj["description"]))
291
- details = details " " result_obj["description"]
292
-
293
- if (plan_seen == LATE_PLAN)
294
- {
295
- details = details " # AFTER LATE PLAN";
296
- }
297
- else if (result_obj["is_unplanned"])
298
- {
299
- details = details " # UNPLANNED";
300
- }
301
- else if (result_obj["number"] != testno)
302
- {
303
- details = sprintf("%s # OUT-OF-ORDER (expecting %d)",
304
- details, testno);
305
- }
306
- else if (result_obj["directive"])
307
- {
308
- details = details " # " result_obj["directive"];
309
- if (length(result_obj["explanation"]))
310
- details = details " " result_obj["explanation"]
311
- }
312
-
313
- report(stringify_result_obj(result_obj), details)
314
- }
315
-
316
- # `skip_reason` should be empty whenever planned > 0.
317
- function handle_tap_plan(planned, skip_reason)
318
- {
319
- planned += 0 # Avoid getting confused if, say, `planned` is "00"
320
- if (length(skip_reason) && planned > 0)
321
- abort("in function handle_tap_plan()")
322
- if (plan_seen)
323
- {
324
- # Error, only one plan per stream is acceptable.
325
- testsuite_error("multiple test plans")
326
- return;
327
- }
328
- planned_tests = planned
329
- # The TAP plan can come before or after *all* the TAP results; we speak
330
- # respectively of an "early" or a "late" plan. If we see the plan line
331
- # after at least one TAP result has been seen, assume we have a late
332
- # plan; in this case, any further test result seen after the plan will
333
- # be flagged as an error.
334
- plan_seen = (testno >= 1 ? LATE_PLAN : EARLY_PLAN)
335
- # If testno > 0, we have an error ("too many tests run") that will be
336
- # automatically dealt with later, so do not worry about it here. If
337
- # $plan_seen is true, we have an error due to a repeated plan, and that
338
- # has already been dealt with above. Otherwise, we have a valid "plan
339
- # with SKIP" specification, and should report it as a particular kind
340
- # of SKIP result.
341
- if (planned == 0 && testno == 0)
342
- {
343
- if (length(skip_reason))
344
- skip_reason = "- " skip_reason;
345
- report("SKIP", skip_reason);
346
- }
347
- }
348
-
349
- function extract_tap_comment(line)
350
- {
351
- if (index(line, diag_string) == 1)
352
- {
353
- # Strip leading `diag_string` from `line`.
354
- line = substr(line, length(diag_string) + 1)
355
- # And strip any leading and trailing whitespace left.
356
- sub("^[ \t]*", "", line)
357
- sub("[ \t]*$", "", line)
358
- # Return what is left (if any).
359
- return line;
360
- }
361
- return "";
362
- }
363
-
364
- # When this function is called, we know that line is a TAP result line,
365
- # so that it matches the (perl) RE "^(not )?ok\b".
366
- function setup_result_obj(line)
367
- {
368
- # Get the result, and remove it from the line.
369
- result_obj["is_ok"] = (substr(line, 1, 2) == "ok" ? 1 : 0)
370
- sub("^(not )?ok[ \t]*", "", line)
371
-
372
- # If the result has an explicit number, get it and strip it; otherwise,
373
- # automatically assing the next progresive number to it.
374
- if (line ~ /^[0-9]+$/ || line ~ /^[0-9]+[^a-zA-Z0-9_]/)
375
- {
376
- match(line, "^[0-9]+")
377
- # The final `+ 0` is to normalize numbers with leading zeros.
378
- result_obj["number"] = substr(line, 1, RLENGTH) + 0
379
- line = substr(line, RLENGTH + 1)
380
- }
381
- else
382
- {
383
- result_obj["number"] = testno
384
- }
385
-
386
- if (plan_seen == LATE_PLAN)
387
- # No further test results are acceptable after a "late" TAP plan
388
- # has been seen.
389
- result_obj["is_unplanned"] = 1
390
- else if (plan_seen && testno > planned_tests)
391
- result_obj["is_unplanned"] = 1
392
- else
393
- result_obj["is_unplanned"] = 0
394
-
395
- # Strip trailing and leading whitespace.
396
- sub("^[ \t]*", "", line)
397
- sub("[ \t]*$", "", line)
398
-
399
- # This will have to be corrected if we have a "TODO"/"SKIP" directive.
400
- result_obj["description"] = line
401
- result_obj["directive"] = ""
402
- result_obj["explanation"] = ""
403
-
404
- if (index(line, "#") == 0)
405
- return # No possible directive, nothing more to do.
406
-
407
- # Directives are case-insensitive.
408
- rx = "[ \t]*#[ \t]*([tT][oO][dD][oO]|[sS][kK][iI][pP])[ \t]*"
409
-
410
- # See whether we have the directive, and if yes, where.
411
- pos = match(line, rx "$")
412
- if (!pos)
413
- pos = match(line, rx "[^a-zA-Z0-9_]")
414
-
415
- # If there was no TAP directive, we have nothing more to do.
416
- if (!pos)
417
- return
418
-
419
- # Let`s now see if the TAP directive has been escaped. For example:
420
- # escaped: ok \# SKIP
421
- # not escaped: ok \\# SKIP
422
- # escaped: ok \\\\\# SKIP
423
- # not escaped: ok \ # SKIP
424
- if (substr(line, pos, 1) == "#")
425
- {
426
- bslash_count = 0
427
- for (i = pos; i > 1 && substr(line, i - 1, 1) == "\\"; i--)
428
- bslash_count += 1
429
- if (bslash_count % 2)
430
- return # Directive was escaped.
431
- }
432
-
433
- # Strip the directive and its explanation (if any) from the test
434
- # description.
435
- result_obj["description"] = substr(line, 1, pos - 1)
436
- # Now remove the test description from the line, that has been dealt
437
- # with already.
438
- line = substr(line, pos)
439
- # Strip the directive, and save its value (normalized to upper case).
440
- sub("^[ \t]*#[ \t]*", "", line)
441
- result_obj["directive"] = toupper(substr(line, 1, 4))
442
- line = substr(line, 5)
443
- # Now get the explanation for the directive (if any), with leading
444
- # and trailing whitespace removed.
445
- sub("^[ \t]*", "", line)
446
- sub("[ \t]*$", "", line)
447
- result_obj["explanation"] = line
448
- }
449
-
450
- function get_test_exit_message(status)
451
- {
452
- if (status == 0)
453
- return ""
454
- if (status !~ /^[1-9][0-9]*$/)
455
- abort("getting exit status")
456
- if (status < 127)
457
- exit_details = ""
458
- else if (status == 127)
459
- exit_details = " (command not found?)"
460
- else if (status >= 128 && status <= 255)
461
- exit_details = sprintf(" (terminated by signal %d?)", status - 128)
462
- else if (status > 256 && status <= 384)
463
- # We used to report an "abnormal termination" here, but some Korn
464
- # shells, when a child process die due to signal number n, can leave
465
- # in $? an exit status of 256+n instead of the more standard 128+n.
466
- # Apparently, both behaviours are allowed by POSIX (2008), so be
467
- # prepared to handle them both. See also Austing Group report ID
468
- # 0000051 <http://www.austingroupbugs.net/view.php?id=51>
469
- exit_details = sprintf(" (terminated by signal %d?)", status - 256)
470
- else
471
- # Never seen in practice.
472
- exit_details = " (abnormal termination)"
473
- return sprintf("exited with status %d%s", status, exit_details)
474
- }
475
-
476
- function write_test_results()
477
- {
478
- print ":global-test-result: " get_global_test_result() > trs_file
479
- print ":recheck: " yn(must_recheck()) > trs_file
480
- print ":copy-in-global-log: " yn(copy_in_global_log()) > trs_file
481
- for (i = 0; i < test_results_index; i += 1)
482
- print ":test-result: " test_results_list[i] > trs_file
483
- close(trs_file);
484
- }
485
-
486
- BEGIN {
487
-
488
- ## ------- ##
489
- ## SETUP ##
490
- ## ------- ##
491
-
492
- '"$init_colors"'
493
-
494
- # Properly initialized once the TAP plan is seen.
495
- planned_tests = 0
496
-
497
- COOKED_PASS = expect_failure ? "XPASS": "PASS";
498
- COOKED_FAIL = expect_failure ? "XFAIL": "FAIL";
499
-
500
- # Enumeration-like constants to remember which kind of plan (if any)
501
- # has been seen. It is important that NO_PLAN evaluates "false" as
502
- # a boolean.
503
- NO_PLAN = 0
504
- EARLY_PLAN = 1
505
- LATE_PLAN = 2
506
-
507
- testno = 0 # Number of test results seen so far.
508
- bailed_out = 0 # Whether a "Bail out!" directive has been seen.
509
-
510
- # Whether the TAP plan has been seen or not, and if yes, which kind
511
- # it is ("early" is seen before any test result, "late" otherwise).
512
- plan_seen = NO_PLAN
513
-
514
- ## --------- ##
515
- ## PARSING ##
516
- ## --------- ##
517
-
518
- is_first_read = 1
519
-
520
- while (1)
521
- {
522
- # Involutions required so that we are able to read the exit status
523
- # from the last input line.
524
- st = getline
525
- if (st < 0) # I/O error.
526
- fatal("I/O error while reading from input stream")
527
- else if (st == 0) # End-of-input
528
- {
529
- if (is_first_read)
530
- abort("in input loop: only one input line")
531
- break
532
- }
533
- if (is_first_read)
534
- {
535
- is_first_read = 0
536
- nextline = $0
537
- continue
538
- }
539
- else
540
- {
541
- curline = nextline
542
- nextline = $0
543
- $0 = curline
544
- }
545
- # Copy any input line verbatim into the log file.
546
- print | "cat >&3"
547
- # Parsing of TAP input should stop after a "Bail out!" directive.
548
- if (bailed_out)
549
- continue
550
-
551
- # TAP test result.
552
- if ($0 ~ /^(not )?ok$/ || $0 ~ /^(not )?ok[^a-zA-Z0-9_]/)
553
- {
554
- testno += 1
555
- setup_result_obj($0)
556
- handle_tap_result()
557
- }
558
- # TAP plan (normal or "SKIP" without explanation).
559
- else if ($0 ~ /^1\.\.[0-9]+[ \t]*$/)
560
- {
561
- # The next two lines will put the number of planned tests in $0.
562
- sub("^1\\.\\.", "")
563
- sub("[^0-9]*$", "")
564
- handle_tap_plan($0, "")
565
- continue
566
- }
567
- # TAP "SKIP" plan, with an explanation.
568
- else if ($0 ~ /^1\.\.0+[ \t]*#/)
569
- {
570
- # The next lines will put the skip explanation in $0, stripping
571
- # any leading and trailing whitespace. This is a little more
572
- # tricky in truth, since we want to also strip a potential leading
573
- # "SKIP" string from the message.
574
- sub("^[^#]*#[ \t]*(SKIP[: \t][ \t]*)?", "")
575
- sub("[ \t]*$", "");
576
- handle_tap_plan(0, $0)
577
- }
578
- # "Bail out!" magic.
579
- # Older versions of prove and TAP::Harness (e.g., 3.17) did not
580
- # recognize a "Bail out!" directive when preceded by leading
581
- # whitespace, but more modern versions (e.g., 3.23) do. So we
582
- # emulate the latter, "more modern" behaviour.
583
- else if ($0 ~ /^[ \t]*Bail out!/)
584
- {
585
- bailed_out = 1
586
- # Get the bailout message (if any), with leading and trailing
587
- # whitespace stripped. The message remains stored in `$0`.
588
- sub("^[ \t]*Bail out![ \t]*", "");
589
- sub("[ \t]*$", "");
590
- # Format the error message for the
591
- bailout_message = "Bail out!"
592
- if (length($0))
593
- bailout_message = bailout_message " " $0
594
- testsuite_error(bailout_message)
595
- }
596
- # Maybe we have too look for dianogtic comments too.
597
- else if (comments != 0)
598
- {
599
- comment = extract_tap_comment($0);
600
- if (length(comment))
601
- report("#", comment);
602
- }
603
- }
604
-
605
- ## -------- ##
606
- ## FINISH ##
607
- ## -------- ##
608
-
609
- # A "Bail out!" directive should cause us to ignore any following TAP
610
- # error, as well as a non-zero exit status from the TAP producer.
611
- if (!bailed_out)
612
- {
613
- if (!plan_seen)
614
- {
615
- testsuite_error("missing test plan")
616
- }
617
- else if (planned_tests != testno)
618
- {
619
- bad_amount = testno > planned_tests ? "many" : "few"
620
- testsuite_error(sprintf("too %s tests run (expected %d, got %d)",
621
- bad_amount, planned_tests, testno))
622
- }
623
- if (!ignore_exit)
624
- {
625
- # Fetch exit status from the last line.
626
- exit_message = get_test_exit_message(nextline)
627
- if (exit_message)
628
- testsuite_error(exit_message)
629
- }
630
- }
631
-
632
- write_test_results()
633
-
634
- exit 0
635
-
636
- } # End of "BEGIN" block.
637
- '
638
-
639
- # TODO: document that we consume the file descriptor 3 :-(
640
- } 3>"$log_file"
641
-
642
- test $? -eq 0 || fatal "I/O or internal error"
643
-
644
- # Local Variables:
645
- # mode: shell-script
646
- # sh-indentation: 2
647
- # eval: (add-hook 'write-file-hooks 'time-stamp)
648
- # time-stamp-start: "scriptversion="
649
- # time-stamp-format: "%:y-%02m-%02d.%02H"
650
- # time-stamp-time-zone: "UTC"
651
- # time-stamp-end: "; # UTC"
652
- # End: