npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

grunt-contrib-githooks

v0.0.2

Published

A Grunt plugin to help bind Grunt tasks to Git hooks

Downloads

8

Readme

grunt-contrib-githooks

Build Status

A Grunt plugin to help bind Grunt tasks to Git hooks

This project is orginally based of the work from grunt-githooks and brings one major improvement:

  • Uses spawn instead of exec to send a stream instead of waiting for the hook completion to send back the stdout.
  • Won't break on you if your buffer exceeds 200k.

Getting Started

This plugin requires Grunt ~0.4.1

If you haven't used Grunt before, be sure to check out the Getting Started guide, as it explains how to create a Gruntfile as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command:

npm install grunt-contrib-githooks --save-dev

Once the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:

grunt.loadNpmTasks('grunt-contrib-githooks');

The "githooks" task

Overview

In your project's Gruntfile, add a section named githooks to the data object passed into grunt.initConfig().

grunt.initConfig({
  githooks: {
    options: {
      // Task-specific options go here.
    },
    all: {
      options: {
        // Target-specific options go here
      },
      // Hook definitions go there
    }
  },
})

Defining a few hooks

Hooks are listed as keys of your target configuration. Any key other than option is considered the name of a hook you want to create. The simplest way to define a hook is to provide a space-separated list of the tasks you want the hook to run as the value.

For example:

grunt.initConfig({
  githooks: {
    all: {
      // Will run the jshint and test:unit tasks at every commit
      'pre-commit': 'jshint test:unit',
    }
  }
});

The plugin warns you if the name matches one of the hooks announced in the Git documentation. It will still create the hook, though, in case Git introduces new hooks in the future.

Hook specific options

If you need to override a few options for a given hook only, you can use and Object instead of a String. The taskNames property will then correspond to the tasks you want to run. Any other key will be merged into the options.

grunt.initConfig({
  githooks: {
    all: {
      options: {
        template: 'path/to/a/template'
      },
      // Will bind the jshint and test:unit tasks 
      // with the template specified above
      'pre-commit': 'jshint test:unit',

      // Will bind the bower:install task
      // with a specific template
      'post-merge': {
        taskNames: 'bower:install',
        template: 'path/to/another/template'
      }
    }
  }
})

Working with existing hooks

If you happen to have existing hooks in your hook folder, the plugin appends the code launching Grunt at the end of your hooks. You can also insert marker comments in your hooks to specify exactly where you want them inserted. Your existing hook would look something like this:

// Some code run before Grunt starts

// GRUNT-contrib-GITHOOKS START // GRUNT-contrib-GITHOOKS END

// Some code run after Grunt starts

The markers get automatically inserted when the plugin appends code, so hooks get updated cleanly the next time you run grunt githooks.

Customising hook output

By default, the plugin generate NodeJS scripts for the hooks. Reasonning behind this is that creating Shell scripts won't work well for people using Windows. Plus, NodeJS is already installed as Grunt kinda needs it. However, you're not tied to it and you can customise the generated script entirely. In case of a Shell script:

grunt.initConfig({
  githooks: {
    all: {
      options: {
        // Customize the hashbang to say 'Shell script'
        hashbang: '#!/bin/sh',
        // Plugin comes in with a sheel script template already. Handy, innit?
        template: './node_modules/grunt-contrib-githooks/templates/shell.hb',
        // Customize the markers so comments start with #
        startMarker: '## LET THE FUN BEGIN',
        endMarker: '## PARTY IS OVER'
      }
    }
  }
});

In the template, you've got access to the following variables:

  • command: String with the name of the command to run
  • task: String with the name of the tasks to be run
  • args: String with the list of arguments to provide to the task
  • gruntfileDirectory: Absolute path to the directory containing the Gruntfile
  • preventExit: Flag telling if the hook should avoid exiting after the grunt task
  • options: The options provided to the grunt-contrib-githooks task to create this hook

Extending the plugin

Pretty annoying when you're using a library that's missing the exact extension point you need to tweak its functionalities? grunt-contrib-githooks is based on a lot of small functions and most of them are exposed so you can override them. If you need feel, free to tinker with the internals (at your own risk though ;)). Could be something along:

var gruntGithooks = require('grunt-contrib-githooks/tasks/githooks');

var originalFunction = gruntGithooks.internals.Hook.prototype.getHookContent;
gruntGithooks.internals.Hook.prototype.getHookContent = function () {
  console.log('Loading content of an existing hook');
  originalFunction.apply(this, arguments);
};

Options

command

Type: String Defaults: grunt

The command that will be run by the hook. This has initally been introduced to allow specifying the full path to Grunt in some specific cases. It can also allow you to run another command than Grunt if you need.

taskNames

Type: String

A space separated list of tasks that will be run by the hook.

args

Type: String

Additional CLI arguments to be passed to the command run by the hook.

hashbang

Type: String Defaults: '#!/usr/bin/env node'

The hashbang that will be used at the top of the hook script file. If a hook already exist, the hashbang will be used to check if its ok to append/insert code in it (to avoid inserting Node code in a Python hook for example).

template

Type: String

Path to the Handlebars template used to generate the code that will run Grunt in the hook. Default template is the node.js.hb file located in the templates folder of the plugin. It also contains a shell.hb file with the template for a shell script hook.

Note: Handlebars escapes HTML special characters if you use only two curly braces to insert a variable in your template. Make sure you use three {{{my_var}}} if you need to insert variable that containt quotes, chevrons or anything that would be HTML escaped

startMarker

Type: String Default: '// GRUNT-contrib-GITHOOKS START'

endMarker

Type: String Default: '// GRUNT-contrib-GITHOOKS END'

startMarker and endMarker are markers the plugin use to know where to insert code if a hook already exist. If the existing hook doesn't have these markers, the code will simply be appended.

preventExit

Type: Boolean Default false

By default, the inserted code will exit the process after Grunt has run, using a -1 exit code if the task(s) failed. If you're inserting the code running Grunt in the middle of an existing hook, you might want to disable this so any code after what was inserted by the plugin runs.

dest

Type: String Default value: '.git/hooks'

This option allows you to choose in which directory the hooks should be generated. Comes in handy if your Gruntfile is not at the root of your Git project.

Contributing

In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using Grunt.

Release History

  • 2014-06-25 v0.0.2 fixed buffer output and exit
  • 2014-06-25 v0.0.1 Forked from grunt-githooks, replaced exec with spawn v0.3.1