Nullifying Precipitation Machine
    Wondering what’s next for npm?Check out our public roadmap! »

    grunt-svn-workflow

    0.2.10 • Public • Published

    grunt-svn-workflow

    Build Status: Linux dependencies NPM version

    中文

    An SVN operation automation solution

    Facilitate to realize and improve automatic processes for SVN directory operation.

    Example directory provides a simple management process based on SVN project.

    Can copy from the last package to the current log through a SVN route, and use it as the log of the latest code.

    Set a prompt in the task queue, and determine whether to interrupt tasks based on options.

    Realize a configuration with relative path and reuse it for many projects.

    For

    It is used for projects which still need to use SVN.

    Prepare

    node, npm.

    SVN >= 1.6

    Need to install SVN CLI, set the language edition as English. (Options for CLI installation are provided when Tortoise SVN is installed)

    Grunt CLI

    Quick Start

    1. Create a svn directory for your project, and use it as the svn root path for project management.

    2. Create a tools directory in svn directory, and use it for storing various automated tools.

    3. Create a local directory, and use it as the local root path and for deploying your project. Attention: it is not a svn directory and not to be detected.

    4. Detect tools directory in the local project directory.

    5. Copy files under example/tools to tools folder under your project directory.

    Suppose your project name is svn-workflow, then, the structure of the local project directory is shown below:

    image

    1. Install npm component for project independency:
    npm install -d
    1. Structure of svn directory of initialized project:
    grunt svnConfig svnInit
    1. Deploy local project files:
    grunt deploy
    1. Release project files:
    grunt publish

    Getting Started

    1. This plugin is required to use Grunt ~0.4.0

    If you have never used Grunt, please refer to Grunt description: Getting Started, which introduces how to create a Gruntfile and how to install and use grunt plugin. When you get familiar with this process, install the plugin with the command:

    npm install grunt-svn-workflow --save-dev
    1. After the plugin is installed, get it started with javascript code:
    grunt.loadNpmTasks('grunt-svn-workflow');
    1. Refer to sample file to configure task file, or directly copy task configuration and use it as the project template.

    svnConfig multitask

    It is used for configuration of svn root path. If svn root path of the project is obtained from local svn path, task svnConfig should be executed before other tasks are fulfilled.

    examples

    grunt.registerTask('deploy', [
        'svnConfig',
        'svnCheckout:deploy'
    ]);

    Task name type: String

    Type: String

    Default: ''

    In case of no options but a character string, this character string shall be directly used as svn root path of the project.

    examples

    grunt.initConfig({
        svnConfig : {
            project : 'https://svn.sinaapp.com/gruntsvnworkflow/1/svn-workflow/'
        }
    });

    from

    Type: String

    It is used for obtaining the local svn directory of svn root path.

    to

    Type: String | Function

    It is the svn path which need to be located finally and the relative path of svn path corresponding to local directory.

    It can be a function, which uses the svn path transmitted as the parameter and figures out the target svn path to be located.

    It facilitates to realize efficient reuse of configuration file after the project directory is standardized and established.

    svnConfig usage examples

    var path = require('path');
    grunt.initConfig({
        svnConfig : {
            project : {
                from : path.resolve(__dirname, 'test/test/base'),
                to : '../'
            },
            compute : {
                from : path.resolve(__dirname, 'test/test/base'),
                to : function(url){
                    return url.replace(/base$/, '');
                }
            }
        }
    });

    Suppose the local directory 'test/test/base' is a svn directory, corresponding svn directory is "https://svn.sinaapp.com/gruntsvnworkflow/1/svn-workflow/test/base".

    After task svnConfig:project is fulfilled, obtain the address of the online svn directory and use it as that of svn root path of the project:

    grunt.config.get('svnConfig.project') === "https://svn.sinaapp.com/gruntsvnworkflow/1/svn-workflow/test/"。

    svnInit multitask

    svn directory of initialized project.

    options.repository / repository

    Type: String

    Project svn root path.

    options.cwd / cwd

    Type: String

    Project local root path.

    map

    Type: Object

    It describes the structure of svn directory

    svnInit usage examples

    var path = require('path');
     
    grunt.initConfig({
        projectDir : path.resolve(__dirname, '../'),
        svnConfig : {
            project : {
                from : path.resolve(__dirname),
                to : '../'
            }
        },
        svnInit : {
            options : {
                repository: '<%=svnConfig.project%>',
                cwd: '<%=projectDir%>'
            },
            project : {
                // Build pathes according to the map.
                map : {
                    'dev' : {
                        'branches' : 'folder',
                        'tags' : 'folder',
                        'trunk' : {
                            'html' : 'folder',
                            'css' : 'folder',
                            'js' : 'folder'
                        }
                    },
                    'online' : {
                        'tags' : 'folder',
                        'trunk' : 'folder'
                    }
                }
            }
        }
    });
    grunt svnConfig svnInit

    Then, figure out the structure of svn directory as below:

    image

    svnCheckout multitask

    It is used for lot inspection of files and directories.

    options.repository / repository

    Type: String

    Project svn root path.

    options.cwd / cwd

    Type: String

    Project local root path.

    map

    Type: Object

    It describes the mapping relation between svn path and local directory.

    It is a key : value format

    key is a relative path to the local root directory

    value is a svnCommit multitask relative to svn

    svnCheckout usage examples

    var path = require('path');
     
    grunt.initConfig({
        projectDir : path.resolve(__dirname, '../'),
        svnConfig : {
            project : {
                from : path.resolve(__dirname),
                to : '../'
            }
        },
        svnCheckout : {
            options : {
                repository: '<%=svnConfig.project%>',
                cwd: '<%=projectDir%>'
            },
            deploy : {
                map : {
                    'trunk' : 'dev/trunk',
                    'dist' : 'online/trunk'
                }
            }
        }
    });
    grunt svnConfig svnCheckout

    svnCommit multitask

    It is used for submitting the code automatically.

    options.repository / repository

    Type: String

    Project svn root path.

    options.cwd / cwd

    Type: String

    Project local root path.

    svn

    Type: String

    It is a relative path to svn root path.

    src

    Type: String

    It is a relative path to local root path.

    question

    Type: String

    Question prompts are user-defined for keeping the log manually.

    log

    Type: String | Function

    Log to be submitted.

    It can be set as a function, the returned value can be the log when questions are submitted.

    If it is packaged with a bracket, provide a relative path to svn root path.

    If the address is not an absolute path, calculate svn path automatically according to the attribute of repository.

    The log of this target svn path will be copied and used as the log to be submitted.

    Copy only the log larger than the current version number of svn target path to be submitted.

    In case of keeping the log manually, {ask} field should exist in the attribute, which will be replaced by information filled manually.

    svnCommit usage examples

    var path = require('path');
     
    grunt.initConfig({
        projectDir : path.resolve(__dirname, '../'),
        svnConfig : {
            project : {
                from : path.resolve(__dirname),
                to : '../'
            }
        },
        svnCommit : {
            options : {
                repository: '<%=svnConfig.project%>',
                cwd: '<%=projectDir%>'
            },
            // The default log is :"Auto commit by task svnCommit:auto"
            auto : {
                svn : 'online/trunk',
                src : 'trunk'
            },
            // The log should be a string , could use grunt template.
            custom : {
                log : 'custom log.'
                svn : 'online/trunk',
                src : 'trunk'
            },
            // Use a function return the log string.
            useFunction : {
                log : function(){
                    return 'custom log ' + Date.now();
                },
                svn : 'online/trunk',
                src : 'trunk'
            },
            // Give a prompt in console. Let the user fill the log.
            ask : {
                log : 'Custom log: {ask}'
                svn : 'online/trunk',
                src : 'tools/temp/online'
            },
            // Custom the prompt in console.
            askCustom : {
                question : 'Input the log:',
                log : 'Custom your logs: {ask}'
                svn : 'online/trunk',
                src : 'tools/temp/online'
            },
            // If svn root path is "https://svn.sinaapp.com/gruntsvnworkflow/1/svn-workflow/example/"。
            // If local project root path is "~/work/svn-workflow/example"
            // Execute the follow task, will commit in directory: "~/work/svn-workflow/example/tools/temp/online" 。
            // Commit to : "https://svn.sinaapp.com/gruntsvnworkflow/1/svn-workflow/example/online/trunk" 。
            // The log will be getted from the svn path: "https://svn.sinaapp.com/gruntsvnworkflow/1/svn-workflow/example/dev/trunk"
            copyLogFrom : {
                log : '[dev/trunk]',
                svn : 'online/trunk',
                src : 'tools/temp/online'
            }
        }
    });
    grunt svnConfig svnCommit

    svnCopy multitask

    Copy a svn directory, and use it for automatic generation of tag process and branch process generally.

    options.repository / repository

    Type: String

    Project svn root path.

    from

    Type: String

    To copy the directory, fill in relative path to project svn root path.

    to

    Type: String

    To copy the directory to the target svn directory, fill in the relative path to project svn root path.

    question

    Type: String

    In case of obtain the rename of the directory to the copied from the console, user-define questions of the console through attributes.

    rename

    Type: String | Function

    Copy the renamed name of the directory.

    In case of rename attribute, use the svn version number (revision) of the directory to be copied as the renamed name.

    User-define the renamed name with a function which will use a json object as the parameter.

    • info : argument of function。
    • info.name : name of the directory to be copied.
    • info.revision : current version number of the directory to be copied.
    • info.lastLog : the latest log of the target directory for storing copied directories.
    • info.ask : user input obtained from the console.

    Set rename as a template character string, and replace contents in the brace by corresponding attribute value in info object automatically.

    E.g. set rename as '{name}_{revision}'. If the name of the copied directory is trunk, and the latest version number is 13542, the copied directory is renamed as: trunk_13542.

    If '{ask}' field in the attribute of rename, the console will give prompts and request the user to replace this field by files.

    svnCopy usage examples

    var path = require('path');
     
    grunt.initConfig({
        projectDir : path.resolve(__dirname, '../'),
        svnConfig : {
            project : {
                from : path.resolve(__dirname),
                to : '../'
            }
        },
        svnCopy : {
            options : {
                repository: '<%=svnConfig.project%>'
            },
            // Rename by revision of "online/trunk", copy "online/trunk" to "online/tags/{revision}".
            // If project svn root path is "https://svn.sinaapp.com/gruntsvnworkflow/1/svn-workflow/example/"。
            // Execute the followed task, will copy the directory : "https://svn.sinaapp.com/gruntsvnworkflow/1/svn-workflow/example/online/trunk"
            // If the revision of original directory is 13542, The directory will be copied to svn svnpath:
            // "https://svn.sinaapp.com/gruntsvnworkflow/1/svn-workflow/example/online/tags/13542"
            autoTag : {
                from : 'online/trunk',
                to : 'online/tags'
            },
            // Ask for the name in console.
            branch : {
                question : 'Input the branch name:'.
                rename : 'branch_{ask}',
                from : 'dev/trunk',
                to : 'dev/branches'
            },
            // Give a name by a function.
            // The argument info give the informations for computing.
            tagByCompute : {
                rename : function(info){
                    var tagName = '';
                    // Compute tagName by info
                    return tagName;
                },
                from : 'dev/trunk',
                to : 'dev/branches'
            }
        }
    });
    grunt svnConfig svnCopy

    confirm multitask

    Create a question and answer during task execution to determine whether to continue task flows.

    msg

    Type: String

    Prompt message

    confirm usage examples

    grunt.initConfig({
        confirm : {
            distribute : {
                msg : 'publish ?'
            }
        }
    });

    example

    A demo of gruntfile config.

    var $path = require('path');
     
    module.exports = function(grunt) {
     
        // Project configuration.
        grunt.initConfig({
            toolsDir : $path.resolve(__dirname),
            projectDir : $path.resolve(__dirname, '../'),
            // Clean files for example publish.
            clean: {
                beforePublish: [
                    'temp'
                ]
            },
            // Copy files for example publish.
            copy: {
                forPublish: {
                    expand : true,
                    cwd : 'temp/trunk/',
                    src : '**/*',
                    dest : 'temp/online/'
                }
            },
            confirm : {
                distribute : {
                    msg : 'publish ?'
                }
            },
            svnConfig : {
                project : {
                    from : '<%=toolsDir%>',
                    to : '../'
                }
            },
            svnInit : {
                options : {
                    repository: '<%=svnConfig.project%>',
                    cwd: '<%=toolsDir%>'
                },
                project : {
                    map : {
                        'dev' : {
                            'branches' : 'folder',
                            'tags' : 'folder',
                            'trunk' : {
                                'html' : 'folder',
                                'css' : 'folder',
                                'js' : 'folder'
                            }
                        },
                        'online' : {
                            'tags' : 'folder',
                            'trunk' : 'folder'
                        }
                    }
                }
            },
            svnCheckout : {
                options : {
                    repository: '<%=svnConfig.project%>',
                    cwd: '<%=projectDir%>'
                },
                deploy : {
                    map : {
                        'dist' : 'online/trunk',
                        'trunk' : 'dev/trunk'
                    }
                },
                prepareForPublish : {
                    cwd : '<%=toolsDir%>',
                    map : {
                        'temp/online' : 'online/trunk',
                        'temp/trunk' : 'dev/trunk'
                    }
                }
            },
            svnCommit : {
                options : {
                    repository: '<%=svnConfig.project%>',
                    cwd: '<%=projectDir%>'
                },
                publish : {
                    cwd : '<%=toolsDir%>',
                    log : '[dev/trunk]',
                    svn : 'online/trunk',
                    src : 'temp/online'
                }
            },
            svnCopy : {
                options : {
                    repository: '<%=svnConfig.project%>'
                },
                tagForDev : {
                    rename : function(info){
                        grunt.config.set('svnCopy.tagForDev.revision', info.revision);
                        return info.revision;
                    },
                    from : 'dev/trunk',
                    to : 'dev/tags'
                },
                tagForOnline : {
                    rename : function(info){
                        return grunt.config.get('svnCopy.tagForDev.revision');
                    },
                    from : 'online/trunk',
                    to : 'online/tags'
                }
            }
        });
     
        grunt.loadNpmTasks('grunt-contrib-clean');
        grunt.loadNpmTasks('grunt-contrib-copy');
        grunt.loadNpmTasks('grunt-svn-workflow');
     
        grunt.registerTask(
            'deploy',
            'Deploy development environment.',
            [
                'svnConfig',
                'svnCheckout:deploy'
            ]
        );
     
        grunt.registerTask(
            'prepareForPublish',
            'Copy, pack and compress files, things like that.',
            [
                'clean:beforePublish',
                'svnConfig',
                'svnCheckout:prepareForPublish',
                'copy:forPublish'
            ]
        );
     
        grunt.registerTask(
            'distribute',
            'Distribute file to online svn folder',
            [
                'confirm:distribute',
                'svnCommit:publish',
                'svnCopy:tagForDev',
                'svnCopy:tagForOnline'
            ]
        );
     
        grunt.registerTask(
            'publish',
            'The full publish workflow.',
            [
                'prepareForPublish',
                'distribute'
            ]
        );
     
        grunt.registerTask(
            'default',
            'The default task',
            [
                'deploy'
            ]
        );
     
    };

    Release History

    • 2016-07-18 v0.2.10 Remove peerDependencies.
    • 2015-11-20 v0.2.9 Update github id.
    • 2015-09-17 v0.2.8 Support windows cmd.
    • 2015-09-17 v0.2.6 If the copy target url is existence, will throw a fatal error.
    • 2015-08-27 v0.2.5 Provide English document.
    • 2015-08-27 v0.2.4 The "rename" option in svnCopy task could get return value as answer template.
    • 2015-08-26 v0.2.3 The option "to" of task svnConfig could be a function.
    • 2015-08-25 v0.2.2 Fix git url.
    • 2015-08-20 v0.2.1 Improve docs. Give a new example.
    • 2015-08-18 v0.2.0 Important update. Remove svnTag task, add svnCopy task, refactor all task files.
    • 2015-04-01 v0.1.2 Add log option for svnCommit task.
    • 2014-12-09 v0.1.1 Fix the bug that get an error occasionally in task running.
    • 2014-12-04 v0.1.0 The first official release, base on Grunt 0.4.X.

    Install

    npm i grunt-svn-workflow

    DownloadsWeekly Downloads

    4

    Version

    0.2.10

    License

    MIT

    Last publish

    Collaborators

    • avatar