File: check_plugins_changes.sh

package info (click to toggle)
eclipse-tracecompass 6.2.0%2Brepack-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 77,440 kB
  • sloc: java: 316,465; xml: 99,829; perl: 400; sh: 353; makefile: 43; javascript: 29; python: 18
file content (137 lines) | stat: -rwxr-xr-x 5,074 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#!/bin/bash
###############################################################################
# Copyright (c) 2016 Ericsson
#
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Eclipse Public License 2.0
# which accompanies this distribution, and is available at
# https://www.eclipse.org/legal/epl-2.0/
#
# SPDX-License-Identifier: EPL-2.0
###############################################################################

# A script that checks every plugin for modifications since last release
# and prompt to bump the micro version if necessary. Major and minor
# version changes are handled by the API tooling already.
#
# Usage  ./check_plugins_changes.sh [ignoredCommit1,ignoredCommit2,...]
#
# Where ignoredcommit is a 7 characters commit hash which will not be
# considered in the diffs (useful for big commits that didn't affect code)
#
# For example ./check_plugins_changes.sh 1325468,1325469

IFS=', ' read -r -a IGNORED_COMMITS <<< "$1"

PREV_RELEASE_VERSION=$(git tag -l | tail -1 | cut -c 2-)
echo "Baseline version detected: $PREV_RELEASE_VERSION. If this is wrong, stop the script (Ctrl-C)"
read -rsp $'Press any key to continue...\n' -n1 key

# Stats for the summary
num_new_plugins=0
num_bumped_already=0
num_bumped=0
num_not_bumped=0
num_no_bump_needed=0

ALL_PLUGIN_PATHS=($(dirname $(dirname $(find ../.. -name "MANIFEST.MF"))))

#For each plugin
for plugin_path in "${ALL_PLUGIN_PATHS[@]}"; do

	commit_summary=$(git log  --oneline --max-count=1 -- $plugin_path)
	commit_id=$(echo $commit_summary | awk '{print $1}')

	# Check if the commit we are about to consider should be ignored
	# and choose a better one if that's the case.
	check_ignored_commit=1
	while [ $check_ignored_commit -eq 1 ]; do
		check_ignored_commit=0
		for ignored_commit in "${IGNORED_COMMITS[@]}"; do
			if [ "$ignored_commit" = "$commit_id" ]
			then
				echo Ignoring commit $commit_id
				commit_summary=$(git log $commit_id~1  --oneline --max-count=1 -- "$plugin_path")
				commit_id=$(echo $commit_summary | awk '{print $1}')
				echo New commit: $commit_id
				check_ignored_commit=1
			fi
		done
	done

	manifest_diff=$(git diff v$PREV_RELEASE_VERSION -- $plugin_path/META-INF/MANIFEST.MF)
	is_new_file=$(echo "$manifest_diff" | grep "\-\-\- /dev/null")

	# We don't need to do anything for a new pluging that wasn't there
	# before, the initial version is always good
	if [[ -n "$is_new_file" ]]
	then
		echo "new plugin   $plugin_path"
		num_new_plugins=$((num_new_plugins+1))
		continue
	fi

	old_version=$(echo "$manifest_diff" | grep "\-Bundle-Version" | cut -c 2-)
	cur_version=$(grep Bundle-Version "$plugin_path/META-INF/MANIFEST.MF")

	plugin_diff=$(git diff v$PREV_RELEASE_VERSION $commit_id -- "$plugin_path")
	# Is the plugin bump needed? Check if the last commit of the plugin matches the previous release tag
        # or if there was no difference (aside from the ignored commits)
	tags_containing=$(git tag --contains $commit_id)
	if [[ -z "$plugin_diff" || ($tags_containing == *"$PREV_RELEASE_VERSION"*) ]]
	then
		echo "no update needed  $plugin_path   ($cur_version)"
		num_no_bump_needed=$((num_no_bump_needed+1))
		continue
	fi

	# Is the plugin already bumped? Check if versions are different
	if [[ -n "$old_version" && ("$cur_version" != "$old_version") ]]
	then
		echo "bumped already   $plugin_path   ($old_version -> $cur_version)"
		num_bumped_already=$((num_bumped_already+1))
		continue
	fi

	# At this point, we have a potential version bump necessary. We will ask the user to decide what to do.

	cur_major_minor=$(echo $cur_version | sed -rn 's/Bundle-Version:\s([0-9][0-9]*\.[0-9][0-9]*).*/\1/p')
	cur_micro=$(echo $cur_version | sed -rn 's/Bundle-Version:\s[0-9][0-9]*\.[0-9][0-9]*\.([0-9][0-9]*).*/\1/p')
	next_micro=$cur_micro
	let next_micro+=1
	git diff v$PREV_RELEASE_VERSION $commit_id -- "$plugin_path"
	echo "Might need bump:  $plugin_path   ($cur_version)   ($commit_summary)"
	while true; do
		read -p "Bump version from $cur_major_minor.$cur_micro to $cur_major_minor.$next_micro? (y/n) " answer
		case $answer in
			[Yy]* ) break;;
			[Nn]* ) break;;
			* ) echo "yes (y) or no (n).";;
		esac
	done

	if [[ $answer == "Y" || $answer == "y" ]]
	then
		num_bumped=$((num_bumped+1))
		sed -i -E  's/(Bundle-Version:\s)[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*(.*)/\1'$cur_major_minor.$next_micro'\2/g' "$plugin_path/META-INF/MANIFEST.MF"
	else
		num_not_bumped=$((num_not_bumped+1))
	fi
done

# Print a little summary of how the plugins were processed

echo Total plugins: ${#ALL_PLUGIN_PATHS[@]}
echo New: $num_new_plugins
echo Already bumped: $num_bumped_already
echo Bumped: $num_bumped
echo Not bumped by choice: $num_not_bumped
echo No bump needed: $num_no_bump_needed

num_processed=$(($num_new_plugins + $num_bumped_already + $num_bumped + $num_not_bumped + $num_no_bump_needed))
if [[ $num_processed -ne ${#ALL_PLUGIN_PATHS[@]} ]]
then
	echo "Number of plugins processed mismatch! ($num_processed vs ${#ALL_PLUGIN_PATHS[@]})"
else
	echo "All plugins processed."
fi