User Tools

Site Tools


git_hooks

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
Next revisionBoth sides next revision
git_hooks [2014/04/03 19:24] – created admingit_hooks [2017/12/20 02:16] – [How it works] admin
Line 1: Line 1:
 ====== Git Hooks ====== ====== Git Hooks ======
  
-<code bash> +===== pre-receive Hook (Server-Side) =====
-#!/bin/sh+
  
-# LOCATION: MagentoRoot/app/etc/local.xml +This is a hook i use along with GitlabIts global and will be triggerd for all repositories when data ist send to the server.
-mageConfig='../../var/www/clients/client1/web20/web/app/etc/local.xml'+
  
-# USE MAGNTOs ROOT DIRECTORY +==== Setup ====
-sqlStorage='/root/hook/mysql_structure.sql'+
  
-# WARNING: cat IS CALLED FOR EACH VARIABLE - TODO: IMPROVE LOGIC/SYNTAX +For Gitlab Omnibus installations place ''pre-receive'' file in this Folder (if it does not existcreate it
-host=$(cat ${mageConfig} | sed -n '/<connection>/,/<\/connection>/p| sed -n -e 's/.*<host>\(.*\)<\/host>.*/\1/p| sed -n -e 's/.*CDATA\[\(.*\)\]\].*/\1/p'+''/opt/gitlab/embedded/service/gitlab-shell/hooks/pre-receive.d/''
-username=$(cat ${mageConfig} | sed -n '/<connection>/,/<\/connection>/p' | sed -n -e 's/.*<username>\(.*\)<\/username>.*/\1/p' | sed -n -e 's/.*CDATA\[\(.*\)\]\].*/\1/p'+
-password=$(cat ${mageConfig} | sed -n '/<connection>/,/<\/connection>/p' | sed -n -e 's/.*<password>\(.*\)<\/password>.*/\1/p' | sed -n -e 's/.*CDATA\[\(.*\)\]\].*/\1/p'+
-dbname=$(cat ${mageConfig} | sed -n '/<connection>/,/<\/connection>/p' | sed -n -e 's/.*<dbname>\(.*\)<\/dbname>.*/\1/p| sed -n -e 's/.*CDATA\[\(.*\)\]\].*/\1/p')+
  
-echo '' +Make sure the file ist executable using ''chmod +x pre-receive'
-echo '--> Tagwork<one>: EXPORT SQL STRUCTURE <--' + 
-echo $host +==== How it works ==== 
-echo $username + 
-echo $password +The branch you do not want to be merged in any other branch create a file named <code>.do_not_merge__THE-BRANCH-NAME</code> 
-echo $dbname +Make sure **THE-BRANCH-NAME** its exactly the same name as the Branch. 
-echo '--> END Tagwork<one>: EXPORT SQL STRUCTURE <--' + 
-echo ''+Given you have the branch ''develop'' and want to avoid merge into any other branch, simply create a file named <code>.do_not_merge__develop</code> 
 + 
 +==== The Hook ==== 
 + 
 +<code ruby pre-receive> 
 +#!/opt/gitlab/embedded/bin/ruby --disable-gems 
 +# Fix the PATH so that gitlab-shell can find git-upload-pack and friends. 
 +ENV['PATH'] = '/opt/gitlab/bin:/opt/gitlab/embedded/bin:' + ENV['PATH'] 
 + 
 +require 'net/http' 
 +require 'json' 
 +require 'cgi' 
 + 
 +################### 
 +# General variables 
 +################### 
 +refs = $stdin.read 
 +key_id = ENV.delete('GL_ID') 
 +proto = $stdin 
 +protocol = ENV.delete('GL_PROTOCOL'
 +repo_path = Dir.pwd 
 +gl_repository = ENV['GL_REPOSITORY'
 + 
 +# Read given hashes 
 +hash = refs.split(' ') 
 +hash_from = hash[0] 
 +hash_to = hash[1] 
 +@branch = hash[2] 
 + 
 +################# 
 +# Colorize output 
 +################# 
 +class String 
 +    def red;            "\033[31m#{self}\033[0m" end 
 +    def green;          "\033[32m#{self}\033[0m" end 
 +    def blue;           "\033[34m#{self}\033[0m" end 
 +end 
 + 
 +########################## 
 +# Pull a Chuck Norris Joke 
 +########################## 
 +def get_joke(author = ''
 +    begin 
 +        plain_uri = 'http://api.icndb.com/jokes/random'         
 +        url = URI.parse(plain_uri) 
 +        req = Net::HTTP::Get.new(url.to_s) 
 +         
 +        res = Net::HTTP.start(url.host, url.port) {|http| 
 +            http.request(req) 
 +        } 
 +        joke = CGI.unescapeHTML(JSON.parse(res.body)['value']['joke']) 
 +     
 +    rescue StandardError 
 +    joke = "Chuck Norris never sleeps? Well, even Chuck Norris needs a power nap every once in a while ..." 
 +    end   
 +   
 +    return joke 
 +end 
 + 
 +# Get changed files between hashes check if commits contain file named '.do_not_merge' 
 +changed_files = `git diff --name-only --stat #{hash_from}..#{hash_to}`.chop 
 +do_not_merge = changed_files.split(/\n/
 + 
 +################################################## 
 +# Check if this is the .do_not_merge__ORIGIN Branch 
 +################################################## 
 +def is_not_origin_branch(origin_branch) 
 +    current_branch = @branch.split(/\//).last 
 +    origin_branch = origin_branch.split(/__/).last 
 +    return current_branch != origin_branch 
 +end 
 + 
 +###################################### 
 +# Decide whether to ban or not to ban 
 +###################################### 
 +do_not_merge.each do |file|     
 +    if (file[/^.do_not_merge__/]) 
 +        if(is_not_origin_branch(file)) 
 +            puts "☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️" 
 +            puts get_joke().blue 
 +            puts "" 
 +            puts "The file #{file} stops you from pushing your changes to remote.".red 
 +            puts "You don't want to commit your changes done in DO_NOT_MERGE Branch to master or any other Branch.".red 
 +            puts "" 
 +            puts "To reset your branch use 'git reset --hard origin/#{@branch.split(/\//).last}'. This will reset your Branch to the state of the origin/remote branch" 
 +            puts "\n☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️  ☠️" 
 +            exit 1 
 +        end 
 +    end 
 +end                                                                                                                                                                </code>
  
-# EXPORT SQL STRUCTURE 
-mysqldump -d -h $host -u $username -p$password $dbname > $sqlStorage 
-</code> 
git_hooks.txt · Last modified: 2017/12/20 02:34 by admin