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