xref: /aosp_15_r20/external/regex-re2/lib/git/commit-msg.hook (revision ccdc9c3e24c519bfa4832a66aa2e83a52c19f295)
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