├── .github └── workflows │ ├── mac.yml │ ├── master.yml │ └── windows.yml ├── .gitignore ├── .travis.yml ├── Build.PL ├── Changes ├── LICENSE ├── META.json ├── README.md ├── RELEASE.md ├── cpanfile ├── docker-compose.yml ├── lib └── Devel │ └── Cover │ └── Report │ └── Coveralls.pm ├── minil.toml └── t ├── 00_compile.t ├── 01_basic.t └── example.pl /.github/workflows/mac.yml: -------------------------------------------------------------------------------- 1 | name: mac 2 | 3 | on: 4 | push: 5 | branches: 6 | - '*' 7 | tags-ignore: 8 | - '*' 9 | pull_request: 10 | 11 | jobs: 12 | perl: 13 | runs-on: macOS-latest 14 | 15 | steps: 16 | - uses: actions/checkout@master 17 | - name: perl -V 18 | run: perl -V 19 | - name: Install dependencies 20 | run: curl -sL https://git.io/cpm | perl - install -g --with-recommends --with-test --with-configure --show-build-log-on-failure 21 | - name: Run build 22 | run: perl Build.PL 23 | - name: Run test 24 | env: 25 | COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} 26 | run: ./Build build && ./Build test 27 | -------------------------------------------------------------------------------- /.github/workflows/master.yml: -------------------------------------------------------------------------------- 1 | name: master 2 | 3 | on: 4 | push: 5 | branches: 6 | - '*' 7 | tags-ignore: 8 | - '*' 9 | pull_request: 10 | 11 | jobs: 12 | perl: 13 | runs-on: ubuntu-latest 14 | 15 | strategy: 16 | matrix: 17 | perl-version: 18 | - '5.14' 19 | - '5.18' 20 | - '5.28' 21 | - 'latest' 22 | 23 | container: 24 | image: perl:${{ matrix.perl-version }} 25 | 26 | steps: 27 | - uses: actions/checkout@master 28 | - name: Configure git 29 | run: git config --system --add safe.directory '*' 30 | - name: perl -V 31 | run: perl -V 32 | - name: Install dependencies 33 | run: cpanm --quiet --notest --installdeps --with-recommends --with-configure . 34 | - name: Run build 35 | run: | 36 | perl Build.PL 37 | ./Build build 38 | ./Build test 39 | - name: Run Cover 40 | env: 41 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 42 | COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} 43 | run: | 44 | ./Build install 45 | HARNESS_PERL_SWITCHES=-MDevel::Cover DEVEL_COVER_SELF=1 ./Build test 46 | cover -report coveralls 47 | if: matrix.perl-version == 'latest' 48 | -------------------------------------------------------------------------------- /.github/workflows/windows.yml: -------------------------------------------------------------------------------- 1 | name: windows 2 | 3 | on: 4 | push: 5 | branches: 6 | - '*' 7 | tags-ignore: 8 | - '*' 9 | pull_request: 10 | 11 | jobs: 12 | perl: 13 | runs-on: windows-latest 14 | 15 | steps: 16 | - uses: actions/checkout@master 17 | - name: Set up Perl 18 | run: | 19 | choco install strawberryperl 20 | Add-Content $env:GITHUB_PATH "C:\strawberry\c\bin;C:\strawberry\perl\site\bin;C:\strawberry\perl\bin" 21 | - name: perl -V 22 | run: perl -V 23 | - name: Install dependencies 24 | run: cpanm --quiet --notest --installdeps --with-recommends --with-configure . 25 | - name: Run build 26 | run: perl Build.PL 27 | - name: Run test 28 | env: 29 | COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} 30 | run: ./Build build && ./Build test 31 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | Makefile 2 | inc/ 3 | .c 4 | ppport.h 5 | *.sw[po] 6 | *.bak 7 | *.old 8 | *~ 9 | Build 10 | _build/ 11 | xshelper.h 12 | tags 13 | pm_to_blib 14 | blib/ 15 | META.yml 16 | MYMETA.* 17 | META.yml 18 | README 19 | /.build/ 20 | carton.lock 21 | /local/ 22 | /.carton/ 23 | /nytprof.out 24 | /nytprof/ 25 | /_build_params 26 | .build 27 | _build_params 28 | /Build 29 | !Build/ 30 | !META.json 31 | /.build 32 | /Devel-Cover-Report-Coveralls-* 33 | !LICENSE 34 | .idea 35 | docker-compose-local.yml 36 | .pause -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | dist: trusty 2 | sudo: false 3 | language: perl 4 | branches: 5 | only: 6 | - "/travis/" 7 | perl: 8 | - 5.30 9 | before_install: 10 | - cpanm -n Devel::Cover::Report::Coveralls 11 | script: perl Build.PL && ./Build build && cover -test -report coveralls 12 | -------------------------------------------------------------------------------- /Build.PL: -------------------------------------------------------------------------------- 1 | # ========================================================================= 2 | # THIS FILE IS AUTOMATICALLY GENERATED BY MINILLA. 3 | # DO NOT EDIT DIRECTLY. 4 | # ========================================================================= 5 | 6 | use 5.008_001; 7 | use strict; 8 | 9 | use Module::Build::Tiny 0.035; 10 | 11 | Build_PL(); 12 | 13 | -------------------------------------------------------------------------------- /Changes: -------------------------------------------------------------------------------- 1 | Revision history for Perl extension Devel-Cover-Report-Coveralls 2 | 3 | {{$NEXT}} 4 | 5 | 0.32.1 2023-05-19T14:06:26Z 6 | - fix test (thanks chylli-deriv) 7 | 8 | 0.32 2023-04-25T09:30:49Z 9 | - decode git log output (thanks voegelas) 10 | - some bug fix (thanks voegelas) 11 | 12 | 0.31 2022-01-31T11:25:25Z 13 | - add support for pull requests (thanks sirtoobii) 14 | - fixed CircleCI workflow_id (thanks sirtoobii) 15 | 16 | 0.30 2022-01-18T13:24:06Z 17 | - support DroneCI (thanks sirtoobii) 18 | - support coveralls parallel mode (thanks sirtoobii) 19 | 20 | 0.20 2020-11-08T09:23:58Z 21 | - support COVERALLS_FLAG_NAME, different COVERALLS_ENDPOINT (thanks mohawk2) 22 | - support GitHub actions in more native way without special secret (thanks mohawk2) 23 | 24 | 0.15 2020-04-29T02:21:23Z 25 | - support Azure-Pipeline (thanks jacquesg) 26 | - setting and code fix (thanks bayashi) 27 | 28 | 0.14 2020-03-13T11:18:43Z 29 | - Fix Github Actions service_name "github-actions" to "github" (thanks Songmu) 30 | 31 | 0.13 2020-01-30T08:52:29Z 32 | - Support for getting branch name on Github Actions (thanks bayashi) 33 | 34 | 0.12 2020-01-29T07:33:05Z 35 | - support Github Actions (thanks bayashi) 36 | 37 | 0.11 2014-10-08T09:13:22Z 38 | - depends HTTP::Tiny 0.043 or later (thanks tobyink) 39 | 40 | 0.10 2014-10-04T02:28:03Z 41 | - fixed metadata (thanks pjfl) 42 | - support uncoverable statement comment (thanks tobyink) 43 | - fix source file path 44 | 45 | 0.09 2014-10-02T06:28:44Z 46 | - Use core HTTP::Tiny instead of Furl (thanks JRaspass) 47 | 48 | 0.08 2014-06-16T09:21:06Z 49 | - Add IO::Socket::SSL prereq (thanks haarg) 50 | 51 | 0.07 2014-06-16T04:36:24Z 52 | - depend JSON::XS to JSON::PP (thanks fioux, karenetheridge) 53 | 54 | 0.06 2013-07-14T13:23:11Z 55 | - fixed pod (thanks dsteinbrunner) 56 | 57 | 0.05 2013-05-27T07:18:02Z 58 | - need Devel::Cover 1.02 (cover -test exists with the staus of the underlying test run) 59 | 60 | 0.04 2013-05-22T12:55:18Z 61 | - fixed bugs at coveralls API result broken (thanks songmu) 62 | 63 | 0.03 2013-05-22T10:04:22Z 64 | - fixed document 65 | - remove debug print (thanks songmu) 66 | 67 | 0.02 2013-05-08T06:18:23Z 68 | - fixed test at travis ci 69 | 70 | 0.01 2013-04-15T07:34:55Z 71 | 72 | - original version 73 | 74 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | This software is copyright (c) 2013 by Kan Fushihara . 2 | 3 | This is free software; you can redistribute it and/or modify it under 4 | the same terms as the Perl 5 programming language system itself. 5 | 6 | Terms of the Perl programming language system itself 7 | 8 | a) the GNU General Public License as published by the Free 9 | Software Foundation; either version 1, or (at your option) any 10 | later version, or 11 | b) the "Artistic License" 12 | 13 | --- The GNU General Public License, Version 1, February 1989 --- 14 | 15 | This software is Copyright (c) 2013 by Kan Fushihara . 16 | 17 | This is free software, licensed under: 18 | 19 | The GNU General Public License, Version 1, February 1989 20 | 21 | GNU GENERAL PUBLIC LICENSE 22 | Version 1, February 1989 23 | 24 | Copyright (C) 1989 Free Software Foundation, Inc. 25 | 51 Franklin St, Suite 500, Boston, MA 02110-1335 USA 26 | 27 | Everyone is permitted to copy and distribute verbatim copies 28 | of this license document, but changing it is not allowed. 29 | 30 | Preamble 31 | 32 | The license agreements of most software companies try to keep users 33 | at the mercy of those companies. By contrast, our General Public 34 | License is intended to guarantee your freedom to share and change free 35 | software--to make sure the software is free for all its users. The 36 | General Public License applies to the Free Software Foundation's 37 | software and to any other program whose authors commit to using it. 38 | You can use it for your programs, too. 39 | 40 | When we speak of free software, we are referring to freedom, not 41 | price. Specifically, the General Public License is designed to make 42 | sure that you have the freedom to give away or sell copies of free 43 | software, that you receive source code or can get it if you want it, 44 | that you can change the software or use pieces of it in new free 45 | programs; and that you know you can do these things. 46 | 47 | To protect your rights, we need to make restrictions that forbid 48 | anyone to deny you these rights or to ask you to surrender the rights. 49 | These restrictions translate to certain responsibilities for you if you 50 | distribute copies of the software, or if you modify it. 51 | 52 | For example, if you distribute copies of a such a program, whether 53 | gratis or for a fee, you must give the recipients all the rights that 54 | you have. You must make sure that they, too, receive or can get the 55 | source code. And you must tell them their rights. 56 | 57 | We protect your rights with two steps: (1) copyright the software, and 58 | (2) offer you this license which gives you legal permission to copy, 59 | distribute and/or modify the software. 60 | 61 | Also, for each author's protection and ours, we want to make certain 62 | that everyone understands that there is no warranty for this free 63 | software. If the software is modified by someone else and passed on, we 64 | want its recipients to know that what they have is not the original, so 65 | that any problems introduced by others will not reflect on the original 66 | authors' reputations. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | GNU GENERAL PUBLIC LICENSE 72 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 73 | 74 | 0. This License Agreement applies to any program or other work which 75 | contains a notice placed by the copyright holder saying it may be 76 | distributed under the terms of this General Public License. The 77 | "Program", below, refers to any such program or work, and a "work based 78 | on the Program" means either the Program or any work containing the 79 | Program or a portion of it, either verbatim or with modifications. Each 80 | licensee is addressed as "you". 81 | 82 | 1. You may copy and distribute verbatim copies of the Program's source 83 | code as you receive it, in any medium, provided that you conspicuously and 84 | appropriately publish on each copy an appropriate copyright notice and 85 | disclaimer of warranty; keep intact all the notices that refer to this 86 | General Public License and to the absence of any warranty; and give any 87 | other recipients of the Program a copy of this General Public License 88 | along with the Program. You may charge a fee for the physical act of 89 | transferring a copy. 90 | 91 | 2. You may modify your copy or copies of the Program or any portion of 92 | it, and copy and distribute such modifications under the terms of Paragraph 93 | 1 above, provided that you also do the following: 94 | 95 | a) cause the modified files to carry prominent notices stating that 96 | you changed the files and the date of any change; and 97 | 98 | b) cause the whole of any work that you distribute or publish, that 99 | in whole or in part contains the Program or any part thereof, either 100 | with or without modifications, to be licensed at no charge to all 101 | third parties under the terms of this General Public License (except 102 | that you may choose to grant warranty protection to some or all 103 | third parties, at your option). 104 | 105 | c) If the modified program normally reads commands interactively when 106 | run, you must cause it, when started running for such interactive use 107 | in the simplest and most usual way, to print or display an 108 | announcement including an appropriate copyright notice and a notice 109 | that there is no warranty (or else, saying that you provide a 110 | warranty) and that users may redistribute the program under these 111 | conditions, and telling the user how to view a copy of this General 112 | Public License. 113 | 114 | d) You may charge a fee for the physical act of transferring a 115 | copy, and you may at your option offer warranty protection in 116 | exchange for a fee. 117 | 118 | Mere aggregation of another independent work with the Program (or its 119 | derivative) on a volume of a storage or distribution medium does not bring 120 | the other work under the scope of these terms. 121 | 122 | 3. You may copy and distribute the Program (or a portion or derivative of 123 | it, under Paragraph 2) in object code or executable form under the terms of 124 | Paragraphs 1 and 2 above provided that you also do one of the following: 125 | 126 | a) accompany it with the complete corresponding machine-readable 127 | source code, which must be distributed under the terms of 128 | Paragraphs 1 and 2 above; or, 129 | 130 | b) accompany it with a written offer, valid for at least three 131 | years, to give any third party free (except for a nominal charge 132 | for the cost of distribution) a complete machine-readable copy of the 133 | corresponding source code, to be distributed under the terms of 134 | Paragraphs 1 and 2 above; or, 135 | 136 | c) accompany it with the information you received as to where the 137 | corresponding source code may be obtained. (This alternative is 138 | allowed only for noncommercial distribution and only if you 139 | received the program in object code or executable form alone.) 140 | 141 | Source code for a work means the preferred form of the work for making 142 | modifications to it. For an executable file, complete source code means 143 | all the source code for all modules it contains; but, as a special 144 | exception, it need not include source code for modules which are standard 145 | libraries that accompany the operating system on which the executable 146 | file runs, or for standard header files or definitions files that 147 | accompany that operating system. 148 | 149 | 4. You may not copy, modify, sublicense, distribute or transfer the 150 | Program except as expressly provided under this General Public License. 151 | Any attempt otherwise to copy, modify, sublicense, distribute or transfer 152 | the Program is void, and will automatically terminate your rights to use 153 | the Program under this License. However, parties who have received 154 | copies, or rights to use copies, from you under this General Public 155 | License will not have their licenses terminated so long as such parties 156 | remain in full compliance. 157 | 158 | 5. By copying, distributing or modifying the Program (or any work based 159 | on the Program) you indicate your acceptance of this license to do so, 160 | and all its terms and conditions. 161 | 162 | 6. Each time you redistribute the Program (or any work based on the 163 | Program), the recipient automatically receives a license from the original 164 | licensor to copy, distribute or modify the Program subject to these 165 | terms and conditions. You may not impose any further restrictions on the 166 | recipients' exercise of the rights granted herein. 167 | 168 | 7. The Free Software Foundation may publish revised and/or new versions 169 | of the General Public License from time to time. Such new versions will 170 | be similar in spirit to the present version, but may differ in detail to 171 | address new problems or concerns. 172 | 173 | Each version is given a distinguishing version number. If the Program 174 | specifies a version number of the license which applies to it and "any 175 | later version", you have the option of following the terms and conditions 176 | either of that version or of any later version published by the Free 177 | Software Foundation. If the Program does not specify a version number of 178 | the license, you may choose any version ever published by the Free Software 179 | Foundation. 180 | 181 | 8. If you wish to incorporate parts of the Program into other free 182 | programs whose distribution conditions are different, write to the author 183 | to ask for permission. For software which is copyrighted by the Free 184 | Software Foundation, write to the Free Software Foundation; we sometimes 185 | make exceptions for this. Our decision will be guided by the two goals 186 | of preserving the free status of all derivatives of our free software and 187 | of promoting the sharing and reuse of software generally. 188 | 189 | NO WARRANTY 190 | 191 | 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 192 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 193 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 194 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 195 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 196 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 197 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 198 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 199 | REPAIR OR CORRECTION. 200 | 201 | 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 202 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 203 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 204 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 205 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 206 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 207 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 208 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 209 | POSSIBILITY OF SUCH DAMAGES. 210 | 211 | END OF TERMS AND CONDITIONS 212 | 213 | Appendix: How to Apply These Terms to Your New Programs 214 | 215 | If you develop a new program, and you want it to be of the greatest 216 | possible use to humanity, the best way to achieve this is to make it 217 | free software which everyone can redistribute and change under these 218 | terms. 219 | 220 | To do so, attach the following notices to the program. It is safest to 221 | attach them to the start of each source file to most effectively convey 222 | the exclusion of warranty; and each file should have at least the 223 | "copyright" line and a pointer to where the full notice is found. 224 | 225 | 226 | Copyright (C) 19yy 227 | 228 | This program is free software; you can redistribute it and/or modify 229 | it under the terms of the GNU General Public License as published by 230 | the Free Software Foundation; either version 1, or (at your option) 231 | any later version. 232 | 233 | This program is distributed in the hope that it will be useful, 234 | but WITHOUT ANY WARRANTY; without even the implied warranty of 235 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 236 | GNU General Public License for more details. 237 | 238 | You should have received a copy of the GNU General Public License 239 | along with this program; if not, write to the Free Software 240 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA 241 | 242 | 243 | Also add information on how to contact you by electronic and paper mail. 244 | 245 | If the program is interactive, make it output a short notice like this 246 | when it starts in an interactive mode: 247 | 248 | Gnomovision version 69, Copyright (C) 19xx name of author 249 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 250 | This is free software, and you are welcome to redistribute it 251 | under certain conditions; type `show c' for details. 252 | 253 | The hypothetical commands `show w' and `show c' should show the 254 | appropriate parts of the General Public License. Of course, the 255 | commands you use may be called something other than `show w' and `show 256 | c'; they could even be mouse-clicks or menu items--whatever suits your 257 | program. 258 | 259 | You should also get your employer (if you work as a programmer) or your 260 | school, if any, to sign a "copyright disclaimer" for the program, if 261 | necessary. Here a sample; alter the names: 262 | 263 | Yoyodyne, Inc., hereby disclaims all copyright interest in the 264 | program `Gnomovision' (a program to direct compilers to make passes 265 | at assemblers) written by James Hacker. 266 | 267 | , 1 April 1989 268 | Ty Coon, President of Vice 269 | 270 | That's all there is to it! 271 | 272 | 273 | --- The Artistic License 1.0 --- 274 | 275 | This software is Copyright (c) 2013 by Kan Fushihara . 276 | 277 | This is free software, licensed under: 278 | 279 | The Artistic License 1.0 280 | 281 | The Artistic License 282 | 283 | Preamble 284 | 285 | The intent of this document is to state the conditions under which a Package 286 | may be copied, such that the Copyright Holder maintains some semblance of 287 | artistic control over the development of the package, while giving the users of 288 | the package the right to use and distribute the Package in a more-or-less 289 | customary fashion, plus the right to make reasonable modifications. 290 | 291 | Definitions: 292 | 293 | - "Package" refers to the collection of files distributed by the Copyright 294 | Holder, and derivatives of that collection of files created through 295 | textual modification. 296 | - "Standard Version" refers to such a Package if it has not been modified, 297 | or has been modified in accordance with the wishes of the Copyright 298 | Holder. 299 | - "Copyright Holder" is whoever is named in the copyright or copyrights for 300 | the package. 301 | - "You" is you, if you're thinking about copying or distributing this Package. 302 | - "Reasonable copying fee" is whatever you can justify on the basis of media 303 | cost, duplication charges, time of people involved, and so on. (You will 304 | not be required to justify it to the Copyright Holder, but only to the 305 | computing community at large as a market that must bear the fee.) 306 | - "Freely Available" means that no fee is charged for the item itself, though 307 | there may be fees involved in handling the item. It also means that 308 | recipients of the item may redistribute it under the same conditions they 309 | received it. 310 | 311 | 1. You may make and give away verbatim copies of the source form of the 312 | Standard Version of this Package without restriction, provided that you 313 | duplicate all of the original copyright notices and associated disclaimers. 314 | 315 | 2. You may apply bug fixes, portability fixes and other modifications derived 316 | from the Public Domain or from the Copyright Holder. A Package modified in such 317 | a way shall still be considered the Standard Version. 318 | 319 | 3. You may otherwise modify your copy of this Package in any way, provided that 320 | you insert a prominent notice in each changed file stating how and when you 321 | changed that file, and provided that you do at least ONE of the following: 322 | 323 | a) place your modifications in the Public Domain or otherwise make them 324 | Freely Available, such as by posting said modifications to Usenet or an 325 | equivalent medium, or placing the modifications on a major archive site 326 | such as ftp.uu.net, or by allowing the Copyright Holder to include your 327 | modifications in the Standard Version of the Package. 328 | 329 | b) use the modified Package only within your corporation or organization. 330 | 331 | c) rename any non-standard executables so the names do not conflict with 332 | standard executables, which must also be provided, and provide a separate 333 | manual page for each non-standard executable that clearly documents how it 334 | differs from the Standard Version. 335 | 336 | d) make other distribution arrangements with the Copyright Holder. 337 | 338 | 4. You may distribute the programs of this Package in object code or executable 339 | form, provided that you do at least ONE of the following: 340 | 341 | a) distribute a Standard Version of the executables and library files, 342 | together with instructions (in the manual page or equivalent) on where to 343 | get the Standard Version. 344 | 345 | b) accompany the distribution with the machine-readable source of the Package 346 | with your modifications. 347 | 348 | c) accompany any non-standard executables with their corresponding Standard 349 | Version executables, giving the non-standard executables non-standard 350 | names, and clearly documenting the differences in manual pages (or 351 | equivalent), together with instructions on where to get the Standard 352 | Version. 353 | 354 | d) make other distribution arrangements with the Copyright Holder. 355 | 356 | 5. You may charge a reasonable copying fee for any distribution of this 357 | Package. You may charge any fee you choose for support of this Package. You 358 | may not charge a fee for this Package itself. However, you may distribute this 359 | Package in aggregate with other (possibly commercial) programs as part of a 360 | larger (possibly commercial) software distribution provided that you do not 361 | advertise this Package as a product of your own. 362 | 363 | 6. The scripts and library files supplied as input to or produced as output 364 | from the programs of this Package do not automatically fall under the copyright 365 | of this Package, but belong to whomever generated them, and may be sold 366 | commercially, and may be aggregated with this Package. 367 | 368 | 7. C or perl subroutines supplied by you and linked into this Package shall not 369 | be considered part of this Package. 370 | 371 | 8. The name of the Copyright Holder may not be used to endorse or promote 372 | products derived from this software without specific prior written permission. 373 | 374 | 9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED 375 | WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 376 | MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 377 | 378 | The End 379 | -------------------------------------------------------------------------------- /META.json: -------------------------------------------------------------------------------- 1 | { 2 | "abstract" : "coveralls backend for Devel::Cover", 3 | "author" : [ 4 | "Kan Fushihara " 5 | ], 6 | "dynamic_config" : 0, 7 | "generated_by" : "Minilla/v3.1.21, CPAN::Meta::Converter version 2.150010", 8 | "license" : [ 9 | "perl_5" 10 | ], 11 | "meta-spec" : { 12 | "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", 13 | "version" : 2 14 | }, 15 | "name" : "Devel-Cover-Report-Coveralls", 16 | "no_index" : { 17 | "directory" : [ 18 | "t", 19 | "xt", 20 | "inc", 21 | "share", 22 | "eg", 23 | "examples", 24 | "author", 25 | "builder" 26 | ] 27 | }, 28 | "prereqs" : { 29 | "configure" : { 30 | "requires" : { 31 | "Module::Build::Tiny" : "0.035" 32 | } 33 | }, 34 | "develop" : { 35 | "requires" : { 36 | "CPAN::Uploader" : "0", 37 | "Minilla" : "0", 38 | "Pod::Markdown::Github" : "0", 39 | "Test::CPAN::Meta" : "0", 40 | "Test::MinimumVersion::Fast" : "0.04", 41 | "Test::PAUSE::Permissions" : "0.07", 42 | "Test::Pod" : "1.41", 43 | "Test::Spellunker" : "v0.2.7", 44 | "Version::Next" : "0" 45 | } 46 | }, 47 | "runtime" : { 48 | "requires" : { 49 | "Devel::Cover" : "1.02", 50 | "HTTP::Tiny" : "0.043", 51 | "IO::Socket::SSL" : "1.42", 52 | "JSON::PP" : "0", 53 | "Mozilla::CA" : "0", 54 | "Net::SSLeay" : "1.49", 55 | "YAML" : "0", 56 | "perl" : "5.008005" 57 | } 58 | }, 59 | "test" : { 60 | "requires" : { 61 | "FindBin" : "0", 62 | "Test::More" : "0.98" 63 | } 64 | } 65 | }, 66 | "release_status" : "unstable", 67 | "resources" : { 68 | "bugtracker" : { 69 | "web" : "https://github.com/kan/coveralls-perl/issues" 70 | }, 71 | "homepage" : "https://github.com/kan/coveralls-perl", 72 | "repository" : { 73 | "type" : "git", 74 | "url" : "https://github.com/kan/coveralls-perl.git", 75 | "web" : "https://github.com/kan/coveralls-perl" 76 | } 77 | }, 78 | "version" : "0.32.1", 79 | "x_contributors" : [ 80 | "Andreas Vögele ", 81 | "David Steinbrunner ", 82 | "Ed J ", 83 | "Graham Knop ", 84 | "Jacques Germishuys ", 85 | "James Raspass ", 86 | "Songmu ", 87 | "Tobias Bossert ", 88 | "bayashi ", 89 | "chylli-deriv <52912308+chylli-deriv@users.noreply.github.com>" 90 | ], 91 | "x_serialization_backend" : "JSON::PP version 4.02", 92 | "x_static_install" : 1 93 | } 94 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Actions Status](https://github.com/kan/coveralls-perl/workflows/master/badge.svg)](https://github.com/kan/coveralls-perl/actions) [![Actions Status](https://github.com/kan/coveralls-perl/workflows/windows/badge.svg)](https://github.com/kan/coveralls-perl/actions) [![Actions Status](https://github.com/kan/coveralls-perl/workflows/mac/badge.svg)](https://github.com/kan/coveralls-perl/actions) 2 | # NAME 3 | 4 | Devel::Cover::Report::Coveralls - coveralls backend for Devel::Cover 5 | 6 | # USAGE 7 | 8 | ## GitHub Actions 9 | 10 | 1\. Add your repo to coveralls. [https://coveralls.io/repos/new](https://coveralls.io/repos/new) 11 | 12 | 2\. Add settings to one of your GitHub workflows. Here assuming you're 13 | calling it `.github/workflows/ci.yml`: 14 | 15 | ```perl 16 | jobs: 17 | ubuntu: 18 | runs-on: ${{ matrix.os }} 19 | strategy: 20 | fail-fast: false 21 | matrix: 22 | os: [ubuntu-latest] 23 | perl-version: ['5.10', '5.14', '5.20'] 24 | include: 25 | - perl-version: '5.30' 26 | os: ubuntu-latest 27 | release-test: true 28 | coverage: true 29 | container: perl:${{ matrix.perl-version }} 30 | steps: 31 | - uses: actions/checkout@v2 32 | # do other stuff like installing external deps here 33 | - run: cpanm -n --installdeps . 34 | - run: perl -V 35 | - name: Run release tests # before others as may install useful stuff 36 | if: ${{ matrix.release-test }} 37 | env: 38 | RELEASE_TESTING: 1 39 | run: | 40 | cpanm -n --installdeps --with-develop . 41 | prove -lr xt 42 | - name: Run tests (no coverage) 43 | if: ${{ !matrix.coverage }} 44 | run: prove -l t 45 | - name: Run tests (with coverage) 46 | if: ${{ matrix.coverage }} 47 | env: 48 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 49 | run: | 50 | cpanm -n Devel::Cover::Report::Coveralls 51 | cover -test -report Coveralls 52 | ``` 53 | 54 | 3\. Push new change to GitHub 55 | 56 | 4\. Coveralls should update your project page 57 | 58 | ## Travis CI 59 | 60 | 1\. Add your repo to coveralls. [https://coveralls.io/repos/new](https://coveralls.io/repos/new) 61 | 62 | 2\. Add setting to `.travis.yaml` (`before_install` and `script` section) 63 | 64 | ``` 65 | language: perl 66 | perl: 67 | - 5.16.3 68 | - 5.14.4 69 | before_install: 70 | cpanm -n Devel::Cover::Report::Coveralls 71 | script: 72 | perl Build.PL && ./Build build && cover -test -report coveralls 73 | ``` 74 | 75 | 3\. push new change to github 76 | 77 | 4\. updated coveralls your project page 78 | 79 |
80 | 81 |
82 | 83 | ## another CI 84 | 85 | 1\. Get repo\_token from your project page in coveralls. 86 | 87 | 2\. Write `.coveralls.yml` (don't add this to public repo) 88 | 89 | ``` 90 | repo_token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 91 | ``` 92 | 93 | 3\. Run CI. 94 | 95 | # DESCRIPTION 96 | 97 | [https://coveralls.io/](https://coveralls.io/) is service to publish your coverage stats online with a lot of nice features. This module provides seamless integration with [Devel::Cover](https://metacpan.org/pod/Devel%3A%3ACover) in your perl projects. 98 | 99 | # ENVIRONMENT 100 | 101 | Set these environment variables to control the behaviour. Various other 102 | variables, set by particular CI environments, will be interpreted silently 103 | and correctly. 104 | 105 | ## COVERALLS\_REPO\_TOKEN 106 | 107 | The Coveralls authentication token for this particular repo. 108 | 109 | ## COVERALLS\_ENDPOINT 110 | 111 | If you have an enterprise installation, set this to change from the 112 | default of `https://coveralls.io`. The rest of the URL (`/api`, etc) 113 | won't change, and will be correct. 114 | 115 | ## COVERALLS\_FLAG\_NAME 116 | 117 | Describe the particular tests being done, e.g. `Unit` or `Functional`. 118 | 119 | ## COVERALLS\_PARALLEL 120 | 121 | Set this to `true` in case you run your tests in a parallel environment. It is important to note though: 122 | If you use this feature, you must ensure that your CI solution calls the parallel webhook when everything is done. Moreover, 123 | regardless of what CI you use, you have to make sure that the `build_number` is constant across the different jobs, otherwise 124 | coveralls is unable to group them together as one build. 125 | 126 | See [https://docs.coveralls.io/parallel-build-webhook](https://docs.coveralls.io/parallel-build-webhook) 127 | 128 | # SEE ALSO 129 | 130 | [https://coveralls.io/](https://coveralls.io/) 131 | [https://coveralls.io/docs](https://coveralls.io/docs) 132 | [https://github.com/coagulant/coveralls-python](https://github.com/coagulant/coveralls-python) 133 | [Devel::Cover](https://metacpan.org/pod/Devel%3A%3ACover) 134 | 135 | ## EXAMPLE 136 | 137 | [https://coveralls.io/r/kan/p5-smart-options](https://coveralls.io/r/kan/p5-smart-options) 138 | 139 | # LICENSE 140 | 141 | Copyright (C) Kan Fushihara 142 | 143 | This library is free software; you can redistribute it and/or modify 144 | it under the same terms as Perl itself. 145 | 146 | # AUTHOR 147 | 148 | Kan Fushihara 149 | -------------------------------------------------------------------------------- /RELEASE.md: -------------------------------------------------------------------------------- 1 | # リリース手順 2 | 3 | ## リポジトリをcloneし、.pauseを作成 4 | 5 | ``` 6 | git clone git@github.com:kan/coveralls-perl.git 7 | vim .pause # PAUSEアカウント情報は1passwordを参照 8 | ``` 9 | 10 | ## モジュールのVERSIONを変更し、Changesを更新 11 | 12 | リリース内容の最終確認 13 | 14 | ## docker-compose で環境を作成・起動してperlコンテナに入る 15 | 16 | ``` 17 | docker-compose up -d 18 | docker-compose exec perl bash 19 | ``` 20 | 21 | 以下、perlコンテナ内で作業 22 | 23 | ## .pauseを ~/ 直下にコピーしてMinillaによるリリースを実行 24 | 25 | ``` 26 | cp .pause ~/ 27 | cpm install --with-develop 28 | local/bin/minil release 29 | ``` 30 | -------------------------------------------------------------------------------- /cpanfile: -------------------------------------------------------------------------------- 1 | on test => sub { 2 | requires 'Test::More', 0.98; 3 | requires 'FindBin'; 4 | }; 5 | 6 | on configure => sub { 7 | requires 'Module::Build::Tiny'; 8 | }; 9 | 10 | on 'develop' => sub { 11 | requires 'Minilla'; 12 | requires 'Pod::Markdown::Github'; 13 | requires 'Version::Next'; 14 | requires 'Test::MinimumVersion::Fast'; 15 | requires 'Test::PAUSE::Permissions'; 16 | requires 'Test::Pod'; 17 | requires 'Test::Spellunker'; 18 | requires 'CPAN::Uploader'; 19 | }; 20 | 21 | requires 'Devel::Cover', 1.02; 22 | requires 'HTTP::Tiny', 0.043; 23 | requires 'IO::Socket::SSL', 1.42; 24 | requires 'JSON::PP'; 25 | requires 'Mozilla::CA'; 26 | requires 'Net::SSLeay', 1.49; 27 | requires 'YAML'; 28 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '2' 2 | services: 3 | perl: 4 | image: ghcr.io/kan/docker-perl-cpm/perl-cpm:5.30.1 5 | volumes: 6 | - ./:/app 7 | - perl-local:/app/local 8 | environment: 9 | PERL5LIB: /app/local/lib/perl5 10 | tty: true 11 | volumes: 12 | perl-local: 13 | driver: local 14 | -------------------------------------------------------------------------------- /lib/Devel/Cover/Report/Coveralls.pm: -------------------------------------------------------------------------------- 1 | package Devel::Cover::Report::Coveralls; 2 | use strict; 3 | use warnings; 4 | use 5.008005; 5 | our $VERSION = "0.32.1"; 6 | 7 | our $CONFIG_FILE = '.coveralls.yml'; 8 | our $API_ENDPOINT_STEM = '/api/v1/jobs'; 9 | our $API_ENDPOINT = 'https://coveralls.io'; 10 | our $SERVICE_NAME = 'coveralls-perl'; 11 | 12 | use Devel::Cover::DB; 13 | use HTTP::Tiny; 14 | use JSON::PP; 15 | use YAML; 16 | use Data::Dumper; 17 | 18 | sub get_source { 19 | my ($file, $callback) = @_; 20 | 21 | my $source = ''; 22 | my @coverage; 23 | 24 | open my $fh, '<', $file or warn("Unable to open $file: $!\n"), return; 25 | 26 | while (defined(my $l = <$fh>)) { 27 | chomp $l; 28 | my $n = $.; 29 | 30 | $source .= "$l\n"; 31 | push @coverage, $callback->($n); 32 | } 33 | 34 | close($fh); 35 | 36 | $file =~ s!^blib/!!; 37 | 38 | return +{ 39 | name => $file, 40 | source => $source, 41 | coverage => \@coverage, 42 | }; 43 | } 44 | 45 | sub git_log { 46 | my $format = shift; 47 | 48 | my $text = ''; 49 | 50 | my $command = "git log -1 --encoding=UTF-8 --pretty=format:'$format'"; 51 | if (open(my $fh, '-|:encoding(UTF-8)', $command)) { 52 | $text = do { local $/; <$fh> }; 53 | close $fh; 54 | } 55 | 56 | return $text; 57 | } 58 | 59 | sub get_git_info { 60 | my $git = { 61 | head => { 62 | id => git_log('%H'), 63 | author_name => git_log('%aN'), 64 | author_email => git_log('%ae'), 65 | committer_name => git_log('%cN'), 66 | committer_email => git_log('%ce'), 67 | message => git_log('%s') 68 | }, 69 | remotes => [ 70 | map { 71 | my ( $name, $url ) = split( " ", $_ ); 72 | +{ name => $name, url => $url } 73 | } split( "\n", `git remote -v` ) 74 | ], 75 | }; 76 | my ($branch,) = grep { /^\* / } split( "\n", `git branch` ); 77 | $branch =~ s/^\* //; 78 | $git->{branch} = $branch; 79 | 80 | if ($ENV{GITHUB_REF} && $ENV{GITHUB_REF} =~ m![^/]+/[^/]+/(.+)$!) { 81 | $git->{branch} = $1; 82 | } elsif ($ENV{BUILD_SOURCEBRANCHNAME}) { 83 | $git->{branch} = $ENV{BUILD_SOURCEBRANCHNAME}; 84 | } 85 | 86 | return $git; 87 | } 88 | 89 | sub get_config { 90 | my $config = {}; 91 | if (-f $CONFIG_FILE) { 92 | $config = YAML::LoadFile($CONFIG_FILE); 93 | } 94 | 95 | my $json = {}; 96 | $json->{repo_token} = $config->{repo_token} if $config->{repo_token}; 97 | $json->{repo_token} = $ENV{COVERALLS_REPO_TOKEN} if $ENV{COVERALLS_REPO_TOKEN}; 98 | $json->{flag_name} = $ENV{COVERALLS_FLAG_NAME} if $ENV{COVERALLS_FLAG_NAME}; 99 | $json->{parallel} = \1 if $ENV{COVERALLS_PARALLEL}; 100 | 101 | my $is_travis; 102 | my $endpoint = ($ENV{COVERALLS_ENDPOINT} || $API_ENDPOINT) . $API_ENDPOINT_STEM; 103 | if ($ENV{TRAVIS}) { 104 | $is_travis = 1; 105 | $json->{service_name} = $config->{service_name} || 'travis-ci'; 106 | $json->{service_job_id} = $ENV{TRAVIS_JOB_ID}; 107 | if($ENV{TRAVIS_PULL_REQUEST} && $ENV{TRAVIS_PULL_REQUEST} ne 'false'){ 108 | $json->{service_pull_request} = $ENV{TRAVIS_PULL_REQUEST}; 109 | } 110 | } elsif ($ENV{CIRCLECI}) { 111 | $json->{service_name} = 'circleci'; 112 | $json->{service_number} = $ENV{CIRCLE_WORKFLOW_ID}; 113 | # Unfortunately, circle-ci reports the url to PR.. 114 | } elsif($ENV{DRONE}) { 115 | $json->{service_name} = 'drone'; 116 | $json->{service_number} = $ENV{DRONE_BUILD_NUMBER}; 117 | $json->{service_pull_request} = $ENV{DRONE_PULL_REQUEST} if $ENV{DRONE_PULL_REQUEST}; 118 | } elsif ($ENV{SEMAPHORE}) { 119 | $json->{service_name} = 'semaphore'; 120 | $json->{service_number} = $ENV{SEMAPHORE_BUILD_NUMBER} if $ENV{SEMAPHORE_BUILD_NUMBER}; 121 | # Also support semaphore 2.x 122 | $json->{service_number} = $ENV{SEMAPHORE_WORKFLOW_ID} if $ENV{SEMAPHORE_WORKFLOW_ID}; 123 | $json->{service_pull_request} = $ENV{SEMAPHORE_GIT_PR_NUMBER} if $ENV{SEMAPHORE_GIT_PR_NUMBER}; 124 | } elsif ($ENV{JENKINS_URL}) { 125 | $json->{service_name} = 'jenkins'; 126 | $json->{service_number} = $ENV{BUILD_NUM}; 127 | # In jenkins, the PR number is not available as an env var.. 128 | } elsif ($ENV{GITHUB_TOKEN}) { 129 | # from info as at 2020-11-07 130 | # https://github.com/coverallsapp/github-action/blob/master/src/run.ts 131 | # https://github.com/nickmerwin/node-coveralls/blob/master/lib/getOptions.js 132 | # we use GITHUB_TOKEN just to differentiate from still-working setup 133 | # in next option, but which requires a secret setting up 134 | $json->{service_name} = 'github'; 135 | $json->{repo_token} = $ENV{GITHUB_TOKEN}; 136 | $json->{service_job_id} = $ENV{GITHUB_RUN_ID}; 137 | if (($ENV{GITHUB_EVENT_NAME}||'') eq 'pull_request') { 138 | if (open my $fh, '<:raw', $ENV{GITHUB_EVENT_PATH}) { 139 | local $/; 140 | my $text = <$fh>; 141 | my $pr = decode_json $text; 142 | if (my ($match) = ($pr->{number}||'') =~ /(\d+)$/) { 143 | $json->{service_pull_request} = $match; 144 | } 145 | } 146 | } 147 | } elsif ($ENV{GITHUB_ACTIONS} && $ENV{GITHUB_SHA}) { 148 | $json->{service_name} = 'github-actions'; 149 | $json->{service_number} = substr($ENV{GITHUB_SHA}, 0, 9); 150 | } elsif ($ENV{SYSTEM_TEAMFOUNDATIONSERVERURI}) { 151 | $json->{service_name} = 'azure-pipelines'; 152 | $json->{service_number} = $ENV{BUILD_BUILDID}; 153 | } else { 154 | $is_travis = 0; 155 | $json->{service_name} = $config->{service_name} || $SERVICE_NAME; 156 | $json->{service_event_type} = 'manual'; 157 | } 158 | 159 | die "required repo_token in $CONFIG_FILE, make sure the environment var \"COVERALLS_REPO_TOKEN\" is set or launch via Travis" if !$json->{repo_token} && !$is_travis; 160 | 161 | if (exists $ENV{COVERALLS_PERL_SERVICE_NAME} && $ENV{COVERALLS_PERL_SERVICE_NAME}) { 162 | $json->{service_name} = $ENV{COVERALLS_PERL_SERVICE_NAME}; 163 | } 164 | 165 | return ($json, $endpoint); 166 | } 167 | 168 | sub _parse_line ($) { 169 | my $c = shift; 170 | 171 | return sub { 172 | my $l = $c->location(shift); 173 | 174 | return $l unless $l; 175 | 176 | if ($l->[0]->uncoverable) { 177 | return undef; 178 | } else { 179 | return $l->[0]->covered; 180 | } 181 | }; 182 | } 183 | 184 | sub report { 185 | my ($pkg, $db, $options) = @_; 186 | 187 | my $cover = $db->cover; 188 | 189 | my @sfs; 190 | 191 | for my $file (@{$options->{file}}) { 192 | my $f = $cover->file($file); 193 | my $c = $f->statement(); 194 | 195 | push @sfs, get_source( $file, _parse_line $c ); 196 | } 197 | 198 | my ($json, $endpoint) = get_config(); 199 | $json->{git} = eval { get_git_info() } || {}; 200 | $json->{source_files} = \@sfs; 201 | 202 | my $coder = JSON::PP->new->ascii; 203 | 204 | my $response = HTTP::Tiny->new( verify_SSL => 1 ) 205 | ->post_form( $endpoint, { json => $coder->encode($json) } ); 206 | 207 | my $res = eval { decode_json $response->{content} }; 208 | 209 | 210 | print("- Report::Coveralls --------\n"); 211 | if(exists($json->{service_number})){ 212 | print "My build number: ". $json->{service_number} ."\n"; 213 | } 214 | if ($@) { 215 | print "error: " . $response->{content}; 216 | } elsif ($response->{success}) { 217 | print "register: " . $res->{url} . "\n"; 218 | } else { 219 | print "error: " . $res->{message} . "\n"; 220 | } 221 | if($ENV{COVERALLS_PARALLEL}){ 222 | print "Parallel mode: True". "\n" 223 | } 224 | print("----------------------------\n"); 225 | } 226 | 227 | 228 | 1; 229 | __END__ 230 | 231 | =encoding utf-8 232 | 233 | =head1 NAME 234 | 235 | Devel::Cover::Report::Coveralls - coveralls backend for Devel::Cover 236 | 237 | =head1 USAGE 238 | 239 | =head2 GitHub Actions 240 | 241 | 1. Add your repo to coveralls. L 242 | 243 | 2. Add settings to one of your GitHub workflows. Here assuming you're 244 | calling it F<.github/workflows/ci.yml>: 245 | 246 | jobs: 247 | ubuntu: 248 | runs-on: ${{ matrix.os }} 249 | strategy: 250 | fail-fast: false 251 | matrix: 252 | os: [ubuntu-latest] 253 | perl-version: ['5.10', '5.14', '5.20'] 254 | include: 255 | - perl-version: '5.30' 256 | os: ubuntu-latest 257 | release-test: true 258 | coverage: true 259 | container: perl:${{ matrix.perl-version }} 260 | steps: 261 | - uses: actions/checkout@v2 262 | # do other stuff like installing external deps here 263 | - run: cpanm -n --installdeps . 264 | - run: perl -V 265 | - name: Run release tests # before others as may install useful stuff 266 | if: ${{ matrix.release-test }} 267 | env: 268 | RELEASE_TESTING: 1 269 | run: | 270 | cpanm -n --installdeps --with-develop . 271 | prove -lr xt 272 | - name: Run tests (no coverage) 273 | if: ${{ !matrix.coverage }} 274 | run: prove -l t 275 | - name: Run tests (with coverage) 276 | if: ${{ matrix.coverage }} 277 | env: 278 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 279 | run: | 280 | cpanm -n Devel::Cover::Report::Coveralls 281 | cover -test -report Coveralls 282 | 283 | 3. Push new change to GitHub 284 | 285 | 4. Coveralls should update your project page 286 | 287 | =head2 Travis CI 288 | 289 | 1. Add your repo to coveralls. L 290 | 291 | 2. Add setting to F<.travis.yaml> (C and C