Changes in / [1dfe409:08246ee]
- Files:
-
- 1 added
- 22 edited
Legend:
- Unmodified
- Added
- Removed
-
.travis.yml
r1dfe409 r08246ee 9 9 os: linux 10 10 compiler: gcc 11 env: WAFOPTS="--build-type=debug"12 11 - python: 2.7 13 12 os: linux -
ChangeLog
r1dfe409 r08246ee 1 2018-12-19 Paul Brossier <piem@aubio.org>2 3 [ Overview ]4 5 * VERSION: bump to 0.4.96 * library: improve stability, fixing potential crashes and memory leaks on7 invalid arguments; improve library messages and reporting of system errors8 * tests/: major clean-up, check return codes, increase code coverage9 * python/tests/: switch to pytest (closes gh-163), check emitted warnings10 * python/: add pages to manual with brief descriptions of classes11 12 [ Fixes ]13 14 * security: improve arguments validation in new_aubio_filterbank (prevent15 possible null-pointer dereference on invalid n_filters, CVE-2018-19801),16 new_aubio-tempo (prevent possible buffer overflow, CVE-2018-19800), and17 new_aubio_onset (prevent null-pointer dereference, CVE-2018-19802). Thanks18 to Guoxiang Niu (@niugx), from the EaglEye Team for reporting these issues.19 * tempo: fix delay_ms methods20 * filterbank: fix aubio_filterbank_get_power (thanks to @romanbsd who21 also noticed this issue)22 * dct: creation fail on negative sizes or invalid accelerate radix,23 fix typo in error and warning messages, prevent possible memory leak24 * pitch: prevent null pointer dereference in yinfast, comment out unused25 functions in mcomb and yin, prevent possible leak in specacf26 * mfcc: always use dct module, strengthen input validation, change27 get_{scale,power} to return smpl_t28 * specdesc: improve error message29 * notes: prevent null pointer dereference30 * hist: add validation for size argument, prevent possible leak31 * awhitening: use shortest length available (closes gh-216)32 * io: add macros to display system errors, add helpers to validate input33 arguments of source and sink methods, always clean-up after failure34 * source: validate input sizes to prevent invalid reads35 * apple_audio: use native format conversions in source and sink, prevent36 possible apple_audio crash on empty string, get_duration returns 0 on failure37 * ffmpeg/avcodec: prevent deprecation warnings, read after close, and skipped38 samples warnings, improve warning messages, only show a warning when39 swr_convert failed, prevent possible memory leak when closing swr context40 * wavwrite: copy to all channels if needed, check fseek and fwrite return41 values, call fflush in open to return failure on full disk-system42 * source_sndfile: fix reading sizes when resampling, set error message when43 reading after close44 * aubio_priv.h: include blas first (see gh-225), add STRERROR macros45 46 [ Python ]47 48 * documentation: add pages to manual, add minimal docstrings for fft,49 digital_filter, and generated objects, improve specdesc documentation50 * filterbank: add get_norm/power documentation51 * source: take a copy of the last frame before resizing it, raise an52 exception when read failed, fix compilation warning53 * fixes: remove unneeded check convert with PyFloat_FromDouble or54 PyFloat_FromDouble, check if sink, digital_filter, were created before55 deleting56 57 [ Tests ]58 59 * python/tests/: switch to pytest (slightly slower than nose2 but better at60 capturing warnings and parametrization), improve coding style and coverage.61 Tests should now be run with `pytest`.62 * tests/: Each test program in C must now return 0, otherwise the test will63 fail. Examples have been modified to run themselves on a test audio file,64 but can still be run with arguments. Tests for `source` and `sink` have been65 factorised, and some code cleaning. A python script is used to create a66 test sound file. Tested on linux, macos, and windows, improvements to67 test-mfcc (closes gh-219).68 69 [ Build system ]70 71 * waf: upgrade to 2.0.14, check the return code of each test program,72 update rules to build manual and api documentation into build/, check73 for errno.h74 * osx: use -Os in scripts/build_apple_frameworks75 * Makefile: improve coverage reports76 * appveyor, travis, circleci: switch to pytest, set one travis config to use77 sndfile only78 * travis: add py3.6, drop py3.4, use py3.5 to test debug mode79 * azure: add basic configuration80 81 1 2018-11-21 Paul Brossier <piem@aubio.org> 82 2 -
README.md
r1dfe409 r08246ee 4 4 [![Travis build status](https://travis-ci.org/aubio/aubio.svg?branch=master)](https://travis-ci.org/aubio/aubio "Travis build status") 5 5 [![Appveyor build status](https://img.shields.io/appveyor/ci/piem/aubio/master.svg)](https://ci.appveyor.com/project/piem/aubio "Appveyor build status") 6 [![Landscape code health](https://landscape.io/github/aubio/aubio/master/landscape.svg?style=flat)](https://landscape.io/github/aubio/aubio/master "Landscape code health") 6 7 [![Commits since last release](https://img.shields.io/github/commits-since/aubio/aubio/latest.svg)](https://github.com/aubio/aubio "Commits since last release") 7 8 -
VERSION
r1dfe409 r08246ee 1 1 AUBIO_MAJOR_VERSION=0 2 AUBIO_MINOR_VERSION= 53 AUBIO_PATCH_VERSION= 02 AUBIO_MINOR_VERSION=4 3 AUBIO_PATCH_VERSION=9 4 4 AUBIO_VERSION_STATUS='~alpha' 5 5 LIBAUBIO_LT_CUR=5 -
azure-pipelines.yml
r1dfe409 r08246ee 4 4 - job: linux 5 5 pool: 6 vmImage: ' ubuntu-16.04'6 vmImage: 'Ubuntu 16.04' 7 7 steps: 8 8 - script: | … … 14 14 - job: windows 15 15 pool: 16 vmI mage: 'vs2017-win2016'16 vmIMage: 'VS2017-Win2016' 17 17 steps: 18 18 - script: | … … 25 25 - job: macos 26 26 pool: 27 vmI mage: 'macos-10.13'27 vmIMage: macOS-10.13 28 28 steps: 29 29 - script: | -
doc/statuslinks.rst
r1dfe409 r08246ee 10 10 :alt: Appveyor build status 11 11 12 .. image:: https://landscape.io/github/aubio/aubio/master/landscape.svg?style=flat 13 :target: https://landscape.io/github/aubio/aubio/master 14 :alt: Landscape code health 15 12 16 .. image:: https://readthedocs.org/projects/aubio/badge/?version=latest 13 17 :target: https://aubio.readthedocs.io/en/latest/?badge=latest -
python/demos/demo_wav2midi.py
r1dfe409 r08246ee 64 64 if new_note[2] > 0: 65 65 track.append(Message('note_off', note=int(new_note[2]), 66 velocity=127, time= delta)66 velocity=127, time=0) 67 67 ) 68 68 track.append(Message('note_on', -
python/ext/py-source.c
r1dfe409 r08246ee 582 582 } else if (PyLong_AsLong(size) > 0) { 583 583 // short read, return a shorter array 584 PyObject *vec = PyTuple_GetItem(done, 0); 585 // take a copy to prevent resizing internal arrays 586 PyArrayObject *shortread = (PyArrayObject*)PyArray_FROM_OTF(vec, 587 NPY_NOTYPE, NPY_ARRAY_ENSURECOPY); 584 PyArrayObject *shortread = (PyArrayObject*)PyTuple_GetItem(done, 0); 588 585 PyArray_Dims newdims; 589 586 PyObject *reshaped; … … 598 595 reshaped = PyArray_Newshape(shortread, &newdims, NPY_CORDER); 599 596 Py_DECREF(shortread); 600 Py_DECREF(vec);601 597 return reshaped; 602 598 } else { -
python/lib/moresetuptools.py
r1dfe409 r08246ee 69 69 for define_macro in ['HAVE_STDLIB_H', 'HAVE_STDIO_H', 70 70 'HAVE_MATH_H', 'HAVE_STRING_H', 71 'HAVE_ ERRNO_H', 'HAVE_C99_VARARGS_MACROS',71 'HAVE_C99_VARARGS_MACROS', 72 72 'HAVE_LIMITS_H', 'HAVE_STDARG_H', 73 73 'HAVE_MEMCPY_HACKS']: -
python/tests/test_sink.py
r1dfe409 r08246ee 4 4 from aubio import fvec, source, sink 5 5 from utils import list_all_sounds, get_tmp_sink_path, del_tmp_sink_path 6 from utils import parse_file_samplerate 7 from _tools import parametrize, skipTest, assert_raises, assert_warns 6 from _tools import parametrize, skipTest, assert_raises 8 7 9 8 list_of_sounds = list_all_sounds('sounds') … … 62 61 @parametrize('hop_size, samplerate, path', all_params) 63 62 def test_read_and_write(self, hop_size, samplerate, path): 64 orig_samplerate = parse_file_samplerate(soundfile)65 63 try: 66 if orig_samplerate is not None and orig_samplerate < samplerate: 67 # upsampling should emit a warning 68 with assert_warns(UserWarning): 69 f = source(soundfile, samplerate, hop_size) 70 else: 71 f = source(soundfile, samplerate, hop_size) 64 f = source(path, samplerate, hop_size) 72 65 except RuntimeError as e: 73 66 err_msg = '{:s} (hop_s = {:d}, samplerate = {:d})' … … 86 79 @parametrize('hop_size, samplerate, path', all_params) 87 80 def test_read_and_write_multi(self, hop_size, samplerate, path): 88 orig_samplerate = parse_file_samplerate(soundfile)89 81 try: 90 if orig_samplerate is not None and orig_samplerate < samplerate: 91 # upsampling should emit a warning 92 with assert_warns(UserWarning): 93 f = source(soundfile, samplerate, hop_size) 94 else: 95 f = source(soundfile, samplerate, hop_size) 82 f = source(path, samplerate, hop_size) 96 83 except RuntimeError as e: 97 84 err_msg = '{:s} (hop_s = {:d}, samplerate = {:d})' -
python/tests/test_source.py
r1dfe409 r08246ee 4 4 from numpy.testing import TestCase, assert_equal 5 5 from aubio import source 6 from utils import list_all_sounds , parse_file_samplerate6 from utils import list_all_sounds 7 7 import unittest 8 from _tools import assert_raises, assert_equal, assert_warns 9 from _tools import parametrize, skipTest 8 from _tools import parametrize, assert_raises, assert_equal, skipTest 10 9 11 10 list_of_sounds = list_all_sounds('sounds') … … 24 23 25 24 _debug = False 26 27 25 28 26 class Test_aubio_source_test_case(TestCase): … … 77 75 @parametrize('hop_size, samplerate, soundfile', all_params) 78 76 def test_samplerate_hopsize(self, hop_size, samplerate, soundfile): 79 orig_samplerate = parse_file_samplerate(soundfile)80 77 try: 81 if orig_samplerate is not None and orig_samplerate < samplerate: 82 # upsampling should emit a warning 83 with assert_warns(UserWarning): 84 f = source(soundfile, samplerate, hop_size) 85 else: 86 f = source(soundfile, samplerate, hop_size) 78 f = source(soundfile, samplerate, hop_size) 87 79 except RuntimeError as e: 88 80 err_msg = 'failed opening with hop_s={:d}, samplerate={:d} ({:s})' -
python/tests/utils.py
r1dfe409 r08246ee 2 2 3 3 import os 4 import re5 4 import glob 6 5 import numpy as np … … 79 78 total_files += 1 80 79 return total_files 81 82 def parse_file_samplerate(soundfile):83 samplerate = None84 # parse samplerate85 re_sr = re.compile(r'/([0-9]{4,})Hz_.*')86 match_samplerate = re_sr.findall(soundfile)87 if match_samplerate:88 samplerate = int(match_samplerate[0])89 else:90 import warnings91 warnings.warn(UserWarning("could not parse samplerate for {:s}"92 .format(soundfile)))93 return samplerate -
scripts/get_waf.sh
r1dfe409 r08246ee 4 4 #set -x 5 5 6 WAFVERSION=2.0.1 46 WAFVERSION=2.0.13 7 7 WAFTARBALL=waf-$WAFVERSION.tar.bz2 8 8 WAFURL=https://waf.io/$WAFTARBALL -
src/aubio_priv.h
r1dfe409 r08246ee 63 63 #endif 64 64 65 #ifdef HAVE_ERRNO_H66 #include <errno.h>67 #endif68 69 65 #ifdef HAVE_LIMITS_H 70 66 #include <limits.h> // for CHAR_BIT, in C99 standard … … 75 71 #endif 76 72 77 #if defined(HAVE_BLAS) // --enable-blas=true 78 // check which cblas header we found 73 #if defined(HAVE_ACCELERATE) 74 #define HAVE_ATLAS 1 75 #define HAVE_BLAS 1 76 #include <Accelerate/Accelerate.h> 77 #elif defined(HAVE_ATLAS_CBLAS_H) 78 #elif defined(HAVE_BLAS) 79 79 #if defined(HAVE_ATLAS_CBLAS_H) 80 80 #define HAVE_ATLAS 1 … … 84 84 #elif defined(HAVE_CBLAS_H) 85 85 #include <cblas.h> 86 #elif !defined(HAVE_ACCELERATE) 87 #error "HAVE_BLAS was defined, but no blas header was found" 88 #endif /* end of cblas includes */ 89 #endif 90 91 #if defined(HAVE_ACCELERATE) 92 // include accelerate framework after blas 93 #define HAVE_ATLAS 1 94 #define HAVE_BLAS 1 86 #endif 87 #endif 88 89 #ifdef HAVE_ACCELERATE 95 90 #include <Accelerate/Accelerate.h> 96 97 91 #ifndef HAVE_AUBIO_DOUBLE 98 92 #define aubio_vDSP_mmov vDSP_mmov … … 337 331 #endif 338 332 339 #ifdef HAVE_C99_VARARGS_MACROS340 #define AUBIO_STRERR(...) \341 char errorstr[256]; \342 AUBIO_STRERROR(errno, errorstr, sizeof(errorstr)); \343 AUBIO_ERR(__VA_ARGS__)344 #else345 #define AUBIO_STRERR(format, args...) \346 char errorstr[256]; \347 AUBIO_STRERROR(errno, errorstr, sizeof(errorstr)); \348 AUBIO_ERR(format, ##args)349 #endif350 351 333 /* handy shortcuts */ 352 334 #define DB2LIN(g) (POW(10.0,(g)*0.05f)) -
src/io/sink.c
r1dfe409 r08246ee 216 216 217 217 void del_aubio_sink(aubio_sink_t * s) { 218 //AUBIO_ASSERT(s);218 AUBIO_ASSERT(s); 219 219 if (s && s->s_del && s->sink) 220 220 s->s_del((void *)s->sink); -
src/io/sink_wavwrite.c
r1dfe409 r08246ee 28 28 #include "io/sink_wavwrite.h" 29 29 #include "io/ioutils.h" 30 31 #include <errno.h> 30 32 31 33 #define MAX_SIZE 4096 … … 166 168 s->fid = fopen((const char *)s->path, "wb"); 167 169 if (!s->fid) { 168 AUBIO_STRERR("sink_wavwrite: could not open %s (%s)\n", s->path, errorstr); 170 char errorstr[256]; 171 AUBIO_STRERROR(errno, errorstr, sizeof(errorstr)); 172 AUBIO_ERR("sink_wavwrite: could not open %s (%s)\n", s->path, errorstr); 169 173 goto beach; 170 174 } … … 212 216 213 217 // fwrite(*, *, 1, s->fid) was called 13 times, check success 214 if (written != 13 || fflush(s->fid)) {215 AUBIO_STRERR("sink_wavwrite: writing header to %s failed"216 " (wrote %d/%d, %s)\n", s->path, written, 13, errorstr);217 fclose(s->fid);218 s->fid = NULL;218 if (written != 13) { 219 char errorstr[256]; 220 AUBIO_STRERROR(errno, errorstr, sizeof(errorstr)); 221 AUBIO_WRN("sink_wavwrite: writing header to %s failed, expected %d" 222 " write but got only %d (%s)\n", s->path, 13, written, errorstr); 219 223 return AUBIO_FAIL; 220 224 } … … 243 247 244 248 if (written_frames != write) { 245 AUBIO_STRERR("sink_wavwrite: trying to write %d frames to %s, but only %d" 249 char errorstr[256]; 250 AUBIO_STRERROR(errno, errorstr, sizeof(errorstr)); 251 AUBIO_WRN("sink_wavwrite: trying to write %d frames to %s, but only %d" 246 252 " could be written (%s)\n", write, s->path, written_frames, errorstr); 247 253 } … … 292 298 written += fwrite(write_little_endian(data_size, buf, 4), 4, 1, s->fid); 293 299 if (written != 2 || err != 0) { 294 AUBIO_STRERR("sink_wavwrite: updating header of %s failed, expected %d" 300 char errorstr[256]; 301 AUBIO_STRERROR(errno, errorstr, sizeof(errorstr)); 302 AUBIO_WRN("sink_wavwrite: updating header of %s failed, expected %d" 295 303 " write but got only %d (%s)\n", s->path, 2, written, errorstr); 296 304 } 297 305 // close file 298 306 if (fclose(s->fid)) { 299 AUBIO_STRERR("sink_wavwrite: Error closing file %s (%s)\n", s->path, errorstr); 307 char errorstr[256]; 308 AUBIO_STRERROR(errno, errorstr, sizeof(errorstr)); 309 AUBIO_ERR("sink_wavwrite: Error closing file %s (%s)\n", s->path, errorstr); 300 310 } 301 311 s->fid = NULL; -
src/io/source.c
r1dfe409 r08246ee 139 139 140 140 void del_aubio_source(aubio_source_t * s) { 141 //AUBIO_ASSERT(s);141 AUBIO_ASSERT(s); 142 142 if (s && s->s_del && s->source) 143 143 s->s_del((void *)s->source); -
src/io/source_avcodec.c
r1dfe409 r08246ee 31 31 #endif 32 32 #include <libavutil/opt.h> 33 #include <stdlib.h> 33 34 34 35 // determine whether we use libavformat from ffmpeg or from libav … … 120 121 uint_t samplerate, uint_t hop_size) { 121 122 aubio_source_avcodec_t * s = AUBIO_NEW(aubio_source_avcodec_t); 122 AVFormatContext *avFormatCtx = NULL;123 AVCodecContext *avCodecCtx = NULL;124 AVFrame *avFrame = NULL;123 AVFormatContext *avFormatCtx = s->avFormatCtx; 124 AVCodecContext *avCodecCtx = s->avCodecCtx; 125 AVFrame *avFrame = s->avFrame; 125 126 sint_t selected_stream = -1; 126 127 #if FF_API_LAVF_AVCTX … … 464 465 (const uint8_t **)avFrame->data, in_samples); 465 466 #endif /* HAVE_AVRESAMPLE || HAVE_SWRESAMPLE */ 466 if (out_samples < 0) {467 AUBIO_WRN("source_avcodec: error while resampling %s (%d)\n",468 s->path , out_samples);467 if (out_samples <= 0) { 468 AUBIO_WRN("source_avcodec: no sample found while converting frame (%s)\n", 469 s->path); 469 470 goto beach; 470 471 } … … 473 474 474 475 beach: 476 s->avFormatCtx = avFormatCtx; 477 s->avCodecCtx = avCodecCtx; 478 s->avFrame = avFrame; 479 #if defined(HAVE_AVRESAMPLE) || defined(HAVE_SWRESAMPLE) 480 s->avr = avr; 481 #endif /* HAVE_AVRESAMPLE || HAVE_SWRESAMPLE */ 482 s->output = output; 483 475 484 av_packet_unref(&avPacket); 476 485 } … … 620 629 #ifdef HAVE_AVRESAMPLE 621 630 avresample_close( s->avr ); 631 #elif defined(HAVE_SWRESAMPLE) 632 swr_close ( s->avr ); 633 #endif 622 634 av_free ( s->avr ); 623 #elif defined(HAVE_SWRESAMPLE)624 swr_close ( s->avr );625 swr_free ( &s->avr );626 #endif627 635 } 628 636 s->avr = NULL; -
src/io/source_sndfile.c
r1dfe409 r08246ee 175 175 sf_count_t read_samples = aubio_sf_read_smpl (s->handle, s->scratch_data, 176 176 s->scratch_size); 177 uint_t read_length = read_samples / s->input_channels;178 179 /* where to store de-interleaved data */180 smpl_t *ptr_data;181 182 177 if (!s->handle) { 183 178 AUBIO_ERR("source_sndfile: could not read from %s (file was closed)\n", … … 187 182 } 188 183 184 uint_t read_length = read_samples / s->input_channels; 185 186 /* where to store de-interleaved data */ 187 smpl_t *ptr_data; 189 188 #ifdef HAVE_SAMPLERATE 190 189 if (s->ratio != 1) { … … 227 226 sf_count_t read_samples = aubio_sf_read_smpl (s->handle, s->scratch_data, 228 227 s->scratch_size); 229 uint_t read_length = read_samples / s->input_channels;230 231 /* where to store de-interleaved data */232 smpl_t **ptr_data;233 234 228 if (!s->handle) { 235 229 AUBIO_ERR("source_sndfile: could not read from %s (file was closed)\n", … … 239 233 } 240 234 235 uint_t read_length = read_samples / s->input_channels; 236 237 /* where to store de-interleaved data */ 238 smpl_t **ptr_data; 241 239 #ifdef HAVE_SAMPLERATE 242 240 if (s->ratio != 1) { -
src/io/source_wavread.c
r1dfe409 r08246ee 28 28 #include "source_wavread.h" 29 29 30 #include <errno.h> 31 30 32 #define AUBIO_WAVREAD_BUFSIZE 1024 31 33 32 //#define SHORT_TO_FLOAT(x) (smpl_t)(x * 3.0517578125e-05)34 #define SHORT_TO_FLOAT(x) (smpl_t)(x * 3.0517578125e-05) 33 35 34 36 struct _aubio_source_wavread_t { … … 99 101 s->fid = fopen((const char *)path, "rb"); 100 102 if (!s->fid) { 101 AUBIO_ STRERR("source_wavread: Failed opening %s (%s)\n", s->path, errorstr);103 AUBIO_ERR("source_wavread: Failed opening %s (System error: %s)\n", s->path, strerror(errno)); 102 104 goto beach; 103 105 } … … 132 134 bytes_junk += read_little_endian(buf, 4); 133 135 if (fseek(s->fid, bytes_read + bytes_junk, SEEK_SET) != 0) { 134 AUBIO_ STRERR("source_wavread: Failed opening %s (could not seek past JUNK Chunk: %s)\n",135 s->path, errorstr);136 AUBIO_ERR("source_wavread: Failed opening %s (could not seek past JUNK Chunk: %s)\n", 137 s->path, strerror(errno)); 136 138 goto beach; 137 139 } … … 260 262 bytes_junk += read_little_endian(buf, 4); 261 263 if (fseek(s->fid, bytes_read + bytes_junk, SEEK_SET) != 0) { 262 AUBIO_ STRERR("source_wavread: could not seek past unknown chunk in %s (%s)\n",263 s->path, errorstr);264 AUBIO_ERR("source_wavread: could not seek past unknown chunk in %s (%s)\n", 265 s->path, strerror(errno)); 264 266 goto beach; 265 267 } … … 441 443 ret = fseek(s->fid, s->seek_start + pos * s->blockalign, SEEK_SET); 442 444 if (ret != 0) { 443 AUBIO_ STRERR("source_wavread: could not seek %s at %d (%s)\n", s->path, pos, errorstr);445 AUBIO_ERR("source_wavread: could not seek %s at %d (%s)\n", s->path, pos, strerror(errno)); 444 446 return AUBIO_FAIL; 445 447 } … … 462 464 } 463 465 if (fclose(s->fid)) { 464 AUBIO_ STRERR("source_wavread: could not close %s (%s)\n", s->path, errorstr);466 AUBIO_ERR("source_wavread: could not close %s (%s)\n", s->path, strerror(errno)); 465 467 return AUBIO_FAIL; 466 468 } -
tests/src/spectral/test-mfcc.c
r1dfe409 r08246ee 34 34 aubio_mfcc_t *mfcc = 0; 35 35 36 fvec_t *in = new_fvec ( hop_s); // phase vocoder input37 cvec_t *fftgrain = new_cvec (win_s); // pvoc output / mfcc input38 fvec_t *out = new_fvec (n_coeffs); // mfcc output36 fvec_t *in = new_fvec (win_s); // input buffer 37 cvec_t *fftgrain = new_cvec (win_s); // input buffer 38 fvec_t *out = new_fvec (n_coeffs); // output coefficients 39 39 40 40 if (!in || !fftgrain || !out) { err = 1; goto failure; } -
wscript
r1dfe409 r08246ee 146 146 ctx.check(header_name='math.h') 147 147 ctx.check(header_name='string.h') 148 ctx.check(header_name='errno.h')149 148 ctx.check(header_name='limits.h') 150 149 ctx.check(header_name='stdarg.h') … … 651 650 ctx.excl += ' **/.cache' 652 651 ctx.excl += ' **/**.zip **/**.tar.bz2' 653 ctx.excl += ' **.tar.bz2 **'652 ctx.excl += ' **.tar.bz2' 654 653 ctx.excl += ' **/doc/full/* **/doc/web/*' 655 654 ctx.excl += ' **/doc/full.cfg' … … 663 662 ctx.excl += ' **/.DS_Store' 664 663 ctx.excl += ' **/.travis.yml' 664 ctx.excl += ' **/.landscape.yml' 665 665 ctx.excl += ' **/.appveyor.yml' 666 666 ctx.excl += ' **/.circleci/*'
Note: See TracChangeset
for help on using the changeset viewer.