1*ccdc9c3eSSadaf Ebrahimi#!/bin/sh 2*ccdc9c3eSSadaf Ebrahimi# From Gerrit Code Review 2.2.1 3*ccdc9c3eSSadaf Ebrahimi# 4*ccdc9c3eSSadaf Ebrahimi# Part of Gerrit Code Review (http://code.google.com/p/gerrit/) 5*ccdc9c3eSSadaf Ebrahimi# 6*ccdc9c3eSSadaf Ebrahimi# Copyright (C) 2009 The Android Open Source Project 7*ccdc9c3eSSadaf Ebrahimi# 8*ccdc9c3eSSadaf Ebrahimi# Licensed under the Apache License, Version 2.0 (the "License"); 9*ccdc9c3eSSadaf Ebrahimi# you may not use this file except in compliance with the License. 10*ccdc9c3eSSadaf Ebrahimi# You may obtain a copy of the License at 11*ccdc9c3eSSadaf Ebrahimi# 12*ccdc9c3eSSadaf Ebrahimi# http://www.apache.org/licenses/LICENSE-2.0 13*ccdc9c3eSSadaf Ebrahimi# 14*ccdc9c3eSSadaf Ebrahimi# Unless required by applicable law or agreed to in writing, software 15*ccdc9c3eSSadaf Ebrahimi# distributed under the License is distributed on an "AS IS" BASIS, 16*ccdc9c3eSSadaf Ebrahimi# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17*ccdc9c3eSSadaf Ebrahimi# See the License for the specific language governing permissions and 18*ccdc9c3eSSadaf Ebrahimi# limitations under the License. 19*ccdc9c3eSSadaf Ebrahimi# 20*ccdc9c3eSSadaf Ebrahimi 21*ccdc9c3eSSadaf EbrahimiCHANGE_ID_AFTER="Bug|Issue" 22*ccdc9c3eSSadaf EbrahimiMSG="$1" 23*ccdc9c3eSSadaf Ebrahimi 24*ccdc9c3eSSadaf Ebrahimi# Check for, and add if missing, a unique Change-Id 25*ccdc9c3eSSadaf Ebrahimi# 26*ccdc9c3eSSadaf Ebrahimiadd_ChangeId() { 27*ccdc9c3eSSadaf Ebrahimi clean_message=`sed -e ' 28*ccdc9c3eSSadaf Ebrahimi /^diff --git a\/.*/{ 29*ccdc9c3eSSadaf Ebrahimi s/// 30*ccdc9c3eSSadaf Ebrahimi q 31*ccdc9c3eSSadaf Ebrahimi } 32*ccdc9c3eSSadaf Ebrahimi /^Signed-off-by:/d 33*ccdc9c3eSSadaf Ebrahimi /^#/d 34*ccdc9c3eSSadaf Ebrahimi ' "$MSG" | git stripspace` 35*ccdc9c3eSSadaf Ebrahimi if test -z "$clean_message" 36*ccdc9c3eSSadaf Ebrahimi then 37*ccdc9c3eSSadaf Ebrahimi return 38*ccdc9c3eSSadaf Ebrahimi fi 39*ccdc9c3eSSadaf Ebrahimi 40*ccdc9c3eSSadaf Ebrahimi if grep -i '^Change-Id:' "$MSG" >/dev/null 41*ccdc9c3eSSadaf Ebrahimi then 42*ccdc9c3eSSadaf Ebrahimi return 43*ccdc9c3eSSadaf Ebrahimi fi 44*ccdc9c3eSSadaf Ebrahimi 45*ccdc9c3eSSadaf Ebrahimi id=`_gen_ChangeId` 46*ccdc9c3eSSadaf Ebrahimi perl -e ' 47*ccdc9c3eSSadaf Ebrahimi $MSG = shift; 48*ccdc9c3eSSadaf Ebrahimi $id = shift; 49*ccdc9c3eSSadaf Ebrahimi $CHANGE_ID_AFTER = shift; 50*ccdc9c3eSSadaf Ebrahimi 51*ccdc9c3eSSadaf Ebrahimi undef $/; 52*ccdc9c3eSSadaf Ebrahimi open(I, $MSG); $_ = <I>; close I; 53*ccdc9c3eSSadaf Ebrahimi s|^diff --git a/.*||ms; 54*ccdc9c3eSSadaf Ebrahimi s|^#.*$||mg; 55*ccdc9c3eSSadaf Ebrahimi exit unless $_; 56*ccdc9c3eSSadaf Ebrahimi 57*ccdc9c3eSSadaf Ebrahimi @message = split /\n/; 58*ccdc9c3eSSadaf Ebrahimi $haveFooter = 0; 59*ccdc9c3eSSadaf Ebrahimi $startFooter = @message; 60*ccdc9c3eSSadaf Ebrahimi for($line = @message - 1; $line >= 0; $line--) { 61*ccdc9c3eSSadaf Ebrahimi $_ = $message[$line]; 62*ccdc9c3eSSadaf Ebrahimi 63*ccdc9c3eSSadaf Ebrahimi if (/^[a-zA-Z0-9-]+:/ && !m,^[a-z0-9-]+://,) { 64*ccdc9c3eSSadaf Ebrahimi $haveFooter++; 65*ccdc9c3eSSadaf Ebrahimi next; 66*ccdc9c3eSSadaf Ebrahimi } 67*ccdc9c3eSSadaf Ebrahimi next if /^[ []/; 68*ccdc9c3eSSadaf Ebrahimi $startFooter = $line if ($haveFooter && /^\r?$/); 69*ccdc9c3eSSadaf Ebrahimi last; 70*ccdc9c3eSSadaf Ebrahimi } 71*ccdc9c3eSSadaf Ebrahimi 72*ccdc9c3eSSadaf Ebrahimi @footer = @message[$startFooter+1..@message]; 73*ccdc9c3eSSadaf Ebrahimi @message = @message[0..$startFooter]; 74*ccdc9c3eSSadaf Ebrahimi push(@footer, "") unless @footer; 75*ccdc9c3eSSadaf Ebrahimi 76*ccdc9c3eSSadaf Ebrahimi for ($line = 0; $line < @footer; $line++) { 77*ccdc9c3eSSadaf Ebrahimi $_ = $footer[$line]; 78*ccdc9c3eSSadaf Ebrahimi next if /^($CHANGE_ID_AFTER):/i; 79*ccdc9c3eSSadaf Ebrahimi last; 80*ccdc9c3eSSadaf Ebrahimi } 81*ccdc9c3eSSadaf Ebrahimi splice(@footer, $line, 0, "Change-Id: I$id"); 82*ccdc9c3eSSadaf Ebrahimi 83*ccdc9c3eSSadaf Ebrahimi $_ = join("\n", @message, @footer); 84*ccdc9c3eSSadaf Ebrahimi open(O, ">$MSG"); print O; close O; 85*ccdc9c3eSSadaf Ebrahimi ' "$MSG" "$id" "$CHANGE_ID_AFTER" 86*ccdc9c3eSSadaf Ebrahimi} 87*ccdc9c3eSSadaf Ebrahimi_gen_ChangeIdInput() { 88*ccdc9c3eSSadaf Ebrahimi echo "tree `git write-tree`" 89*ccdc9c3eSSadaf Ebrahimi if parent=`git rev-parse HEAD^0 2>/dev/null` 90*ccdc9c3eSSadaf Ebrahimi then 91*ccdc9c3eSSadaf Ebrahimi echo "parent $parent" 92*ccdc9c3eSSadaf Ebrahimi fi 93*ccdc9c3eSSadaf Ebrahimi echo "author `git var GIT_AUTHOR_IDENT`" 94*ccdc9c3eSSadaf Ebrahimi echo "committer `git var GIT_COMMITTER_IDENT`" 95*ccdc9c3eSSadaf Ebrahimi echo 96*ccdc9c3eSSadaf Ebrahimi printf '%s' "$clean_message" 97*ccdc9c3eSSadaf Ebrahimi} 98*ccdc9c3eSSadaf Ebrahimi_gen_ChangeId() { 99*ccdc9c3eSSadaf Ebrahimi _gen_ChangeIdInput | 100*ccdc9c3eSSadaf Ebrahimi git hash-object -t commit --stdin 101*ccdc9c3eSSadaf Ebrahimi} 102*ccdc9c3eSSadaf Ebrahimi 103*ccdc9c3eSSadaf Ebrahimi 104*ccdc9c3eSSadaf Ebrahimiadd_ChangeId 105