Private GIT

Skip to content
Snippets Groups Projects
Select Git revision
  • 77b3165e8525ed33150ac1492deaf333d65d0444
  • master default protected
  • fix_nzb_cat
  • develop
  • guessit2-minimal
  • ssl_warning
  • UHD-qualities
  • fix_providers8
  • !
  • tvvault
  • provider_alpharatio
  • v5.1.1
  • v5.1
  • v5.0.3
  • v5.0.2
  • v5.0.1
  • v5.0
  • v4.2.1.07
  • v4.2.1.06
  • v4.2.1.05
  • v4.2.1.04
  • v4.2.1.03
  • v4.2.1.02
  • v4.2.1.01
  • v4.2.1.0
  • v4.2.0.6
  • v4.2.0.5
  • v4.2.0.4
  • v4.2.0.3
  • v4.2.0.2
  • v4.2.0.1
31 results

Gruntfile.js

Blame
  • Gruntfile.js 12.64 KiB
    module.exports = function(grunt) {
        grunt.registerTask('default', [
            'clean',
            'bower',
            'bower_concat',
            'copy',
            'uglify',
            'sass',
            'cssmin',
            'jshint',
            'mocha'
        ]);
    
        grunt.registerTask('travis', [
            'jshint',
            'mocha'
        ]);
        grunt.registerTask('update_trans', 'update translations', function() {
            var tasks = [
                'exec:babel_extract',
                'exec:babel_update',
                // + crowdin
                'exec:babel_compile',
                'po2json'
            ];
            if(process.env['CROWDIN_API_KEY']) { // jshint ignore:line
                tasks.splice(2, 0, 'exec:crowdin_upload', 'exec:crowdin_download'); // insert items at index 2
            } else {
                grunt.log.warn('WARNING: Env variable `CROWDIN_API_KEY` is not set, not syncing with Crowdin.');
            }
    
            grunt.task.run(tasks);
        });
        /****************************************
        *  Admin only                           *
        ****************************************/
        grunt.registerTask('publish', 'create a release tag and generate CHANGES.md\n(alias for newrelease and genchanges)', [
            'travis',
            // 'update_trans', // blocks git pull in newrelease
            'newrelease',
            'genchanges'
        ]);
    
        /****************************************
        *  Task configurations                  *
        ****************************************/
        require('load-grunt-tasks')(grunt); // loads all grunt tasks matching the ['grunt-*', '@*/grunt-*'] patterns
        grunt.initConfig({
            clean: {
                dist: './dist/',
                'bower_components': './bower_components',
                fonts: './gui/slick/css/*.ttf',
                options: {
                    force: true
                }
            },
            bower: {
                install: {
                    options: {
                        copy: false
                    }
                }
            },
            'bower_concat': {
                all: {
                    dest: {
                        js: './dist/bower.js',
                        css: './dist/bower.css'
                    },
                    exclude: [],
                    dependencies: {},
                    mainFiles: {
                        'tablesorter': [
                            'dist/js/jquery.tablesorter.combined.js',
                            'dist/js/widgets/widget-columnSelector.min.js',
                            'dist/js/widgets/widget-stickyHeaders.min.js',
                            'dist/css/theme.blue.min.css'
                        ],
                        'bootstrap': [
                            'dist/css/bootstrap.min.css',
                            'dist/js/bootstrap.min.js'
                        ],
                        'bootstrap-formhelpers': [
                            'dist/js/bootstrap-formhelpers.min.js'
                        ],
                        'isotope': [
                            "dist/isotope.pkgd.min.js"
                        ],
                        "outlayer": [
                            "item.js",
                            "outlayer.js"
                        ],
                        "openSans": [
                            "*.ttf", "*.css"
                        ]
                    },
                    bowerOptions: {
                        relative: false
                    }
                }
            },
            copy: {
                openSans: {
                    files: [{
                        expand: true,
                        dot: true,
                        cwd: 'bower_components/openSans',
                        src: [
                            '*.ttf'
                        ],
                        dest: './gui/slick/css/'
                    }]
                },
                glyphicon: {
                    files: [{
                        expand: true,
                        dot: true,
                        cwd: 'bower_components/bootstrap/fonts',
                        src: [
                            '*.eot',
                            '*.svg',
                            '*.ttf',
                            '*.woff',
                            '*.woff2'
                        ],
                        dest: './gui/slick/fonts/'
                    }]
                }
            },
            uglify: {
                bower: {
                    files: {
                        './gui/slick/js/vender.min.js': ['./dist/bower.js']
                    }
                },
                core: {
                    files: {
                        './gui/slick/js/core.min.js': ['./gui/slick/js/core.js']
                    }
                }
            },
            sass: {
                options: {
                    sourceMap: true
                },
                core: {
                    files: {
                        './dist/core.css': ['./gui/slick/scss/core.scss']
                    }
                }
            },
            cssmin: {
                options: {
                    shorthandCompacting: false,
                    roundingPrecision: -1
                },
                bower: {
                    files: {
                        './gui/slick/css/vender.min.css': ['./dist/bower.css']
                    }
                },
                core: {
                    files: {
                        './gui/slick/css/core.min.css': ['./dist/core.css']
                    }
                }
            },
            jshint: {
                options: {
                    jshintrc: './.jshintrc'
                },
                all: [
                    './gui/slick/js/**/*.js',
                    '!./gui/slick/js/lib/**/*.js',
                    '!./gui/slick/js/ajaxNotifications.js',
                    '!./gui/slick/js/**/*.min.js', // We use this because ignores doesn't seem to work :(
                ]
            },
            mocha: {
                all: {
                    src: ['tests/mocha/testrunner.html'],
                },
                options: {
                    run: true
                }
            },
            po2json: {
                messages: {
                    options: {
                        format: 'jed',
                        singleFile: true
                    },
                    files: [{
                        expand: true,
                        src: './locale/*/LC_MESSAGES/messages.po',
                        dest: '',
                        ext: '' // workaround for relative files
                    }]
                }
            },
            exec: {
                // Translations
                'babel_extract': {cmd: 'python setup.py extract_messages'},
                'babel_update': {cmd: 'python setup.py update_catalog'},
                'crowdin_upload': {cmd: 'crowdin-cli-py upload sources'},
                'crowdin_download': {cmd: 'crowdin-cli-py download'},
                'babel_compile': {cmd: 'python setup.py compile_catalog'},
    
                // Publish/Releases
                'git_checkout': {
                    cmd: function (b) { return 'git checkout ' + b; }
                },
                'git_pull': {
                    cmd: 'git pull'
                },
                'git_merge': {
                    cmd: function (b) { return 'git merge ' + b; },
                },
                'git_get_last_tag': {
                    cmd: 'git for-each-ref --sort=-refname --count=1 --format "%(refname:short)" refs/tags',
                    stdout: false,
                    callback: function(err, stdout) {
                        grunt.config('last_tag', stdout.trim());
                    }
                },
                'git_list_changes': {
                    cmd: function() { return 'git log --oneline ' + grunt.config('last_tag') + '..HEAD'; },
                    stdout: false,
                    callback: function(err, stdout) {
                        grunt.config('commits', stdout.replace(/^[a-f0-9]{9}\s/gm, '').trim()); // removes commit hashes
                    }
                },
                'git_tag_new': {
                    cmd: function (sign) {
                        sign = (sign !== "true"?'':'-s ');
                        return 'git tag ' + sign + grunt.config('next_tag') + ' -m "' + grunt.config('commits') + '"';
                    },
                    stdout: false
                },
                'git_push': {
                    cmd: function (remote, branch, tags) {
                        return 'git push ' + remote + ' ' + branch + (tags === 'true'?' --tags':'');
                    }
                },
                'git_list_tags': {
                    cmd: 'git for-each-ref --sort=refname --format="%(refname:short)|||%(objectname)|||%(contents)\\$$\\$" refs/tags',
                    stdout: false,
                    callback: function(err, stdout) {
                        var allTags = stdout.replace(/-*BEGIN PGP SIGNATURE-*(\n.*){9}\n/g, '').split('$$$');
                        allTags.splice(allTags.length-1, 1); // There's an empty object at the end
                        for (var i = 0; i < allTags.length; i++) {
                            var explode = allTags[i].split('|||');
                            allTags[i] = {
                                tag: explode[0].trim(),
                                hash: explode[1].trim(),
                                message: explode[2].trim().split('\n'),
                                previous: (i > 0 ? allTags[i-1].tag : null)
                            };
                        }
                        grunt.config('all_tags', allTags);
                    }
                },
                'commit_changelog': {
                    cmd: function() {
                        var file = grunt.config('changesmd_file');
                        if (!file) {
                            grunt.fatal('Missing file path.');
                        }
                        var path = file.substr(0, file.lastIndexOf('/', file.length-12)); // get sickrage.github.io folder
                        return 'cd ' + path +
                               ' && git commit -asm "Update changelog"';
                    },
                    stdout: true
                }
            }
        });
    
        /****************************************
        *  Sub-tasks of publish task            *
        ****************************************/
        grunt.registerTask('newrelease', "pull and merge develop to master, create and push a new release", [
            'exec:git_checkout:develop', 'exec:git_pull',
            'exec:git_checkout:master', 'exec:git_pull', 'exec:git_merge:develop',
            'exec:git_get_last_tag', 'exec:git_list_changes', '_get_next_tag',
            'exec:git_tag_new', 'exec:git_push:origin:master:true']);
    
        grunt.registerTask('genchanges', "generate CHANGES.md file", function() {
            var file = grunt.option('file'); // --file=path/to/sickrage.github.io/sickrage-news/CHANGES.md
            if (!file) {
                grunt.fatal('\tYou must provide a path to CHANGES.md to generate changes.\n' +
                    '\t\tUse --file=path/to/sickrage.github.io/sickrage-news/CHANGES.md');
            }
            grunt.config('changesmd_file', file);
            grunt.task.run(['exec:git_get_last_tag', 'exec:git_list_tags', '_genchanges',
                            'exec:commit_changelog', 'exec:git_push:origin:master']);
        });
    
        /****************************************
        *  Internal tasks                       *
        *****************************************/
        grunt.registerTask('_get_next_tag', '(internal) do not run', function() {
            function leadingZeros(number) {
                return ('0' + parseInt(number)).slice(-2);
            }
    
            var lastTag = grunt.config('last_tag');
            if (!lastTag) {
                grunt.fatal('internal task');
            }
    
            lastTag = lastTag.split('v')[1].split('-');
            var lastPatch = lastTag[1];
            lastTag = lastTag[0].split('.');
    
            var d = new Date();
            var year = d.getFullYear().toString();
            var month = leadingZeros(d.getMonth() + 1);
            var day = leadingZeros(d.getDate());
            var patch = '1';
    
            if (year === lastTag[0] && month === leadingZeros(lastTag[1]) && day === leadingZeros(lastTag[2])) {
                patch = (parseInt(lastPatch) + 1).toString();
            }
    
            grunt.config('next_tag', ('v' + year + '.' + month + '.' + day + '-' + patch));
        });
    
        grunt.registerTask('_genchanges', "(internal) do not run", function() {
            // actual generate changes
            var currentTag = grunt.config('last_tag');
            if (!currentTag) {
                grunt.fatal('internal task');
            }
            var allTags = grunt.config('all_tags');
            if (!allTags) {
                grunt.fatal('internal task');
            }
    
            var file = grunt.config('changesmd_file'); // --file=path/to/sickrage.github.io/sickrage-news/CHANGES.md
    
            var contents = "";
            allTags.reverse().forEach(function(tag) {
                contents += '### ' + tag.tag + '\n';
                contents += '\n';
                if (tag.previous) {
                    contents += '[full changelog](https://github.com/SickRage/SickRage/compare/' +
                        tag.previous + '...' + tag.tag + ')\n';
                }
                contents += '\n';
                tag.message.forEach(function (row) {
                    contents += '* ' + row + '\n';
                });
                contents += '\n';
            });
    
            if (contents) {
                grunt.file.write(file, contents);
                return true;
            }
            return false;
        });
    };