Browse code

tools: add spec file checker

`make check-spec-files` verifies unstaged local changes in
.spec files for corectness

`make check-spec-files BASE_COMMIT=<commit hash>` verifies .spec files
corectness for all commits between <commit hash> and HEAD

Change-Id: If8b306fc00683f5465e13925da659bc6a2fa6e57
Reviewed-on: http://photon-jenkins.eng.vmware.com:8082/5837
Tested-by: gerrit-photon <photon-checkins@vmware.com>
Reviewed-by: Srivatsa S. Bhat <srivatsab@vmware.com>
Reviewed-by: Alexey Makhalov <amakhalov@vmware.com>

Alexey Makhalov authored on 2018/10/02 16:13:20
Showing 2 changed files
... ...
@@ -249,7 +249,10 @@ clean-stage-for-incremental-build:
249 249
 	@test -n "$$(git diff --name-only $(BASE_COMMIT) @ | grep SPECS)" && $(PHOTON_SPECDEPS) -s $(PHOTON_SPECS_DIR) -i remove-upward-deps -p $$(echo `git diff --name-only $(BASE_COMMIT) @ | grep .spec | xargs -n1 basename 2>/dev/null` | tr ' ' :) ||:
250 250
 	@test -n "$$(git diff --name-only $(BASE_COMMIT) @ | grep support)" && $(RM) -rf $(PHOTON_RPMS_DIR) ||:
251 251
 
252
-packages: check-docker-py check-tools $(PHOTON_STAGE) $(PHOTON_PUBLISH_XRPMS) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) $(CONTAIN) generate-dep-lists
252
+check-spec-files:
253
+	@./tools/scripts/check_spec_files.sh $(BASE_COMMIT)
254
+
255
+packages: check-docker-py check-tools $(PHOTON_STAGE) $(PHOTON_PUBLISH_XRPMS) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) $(CONTAIN) check-spec-files generate-dep-lists
253 256
 	@echo "Building all RPMS..."
254 257
 	@cd $(PHOTON_PKG_BUILDER_DIR) && \
255 258
         $(PHOTON_PACKAGE_BUILDER) \
... ...
@@ -613,7 +616,7 @@ check: packages
613 613
                 $(rpmcheck_stop_on_error) \
614 614
                 -t ${THREADS}
615 615
 
616
-%: check-tools $(PHOTON_PUBLISH_RPMS) $(PHOTON_PUBLISH_XRPMS) $(PHOTON_SOURCES) $(CONTAIN) $(eval PKG_NAME = $@)
616
+%: check-tools $(PHOTON_PUBLISH_RPMS) $(PHOTON_PUBLISH_XRPMS) $(PHOTON_SOURCES) $(CONTAIN) check-spec-files $(eval PKG_NAME = $@)
617 617
 	$(eval PKG_NAME = $@)
618 618
 	@echo "Building package $(PKG_NAME) ..."
619 619
 	@cd $(PHOTON_PKG_BUILDER_DIR) && \
620 620
new file mode 100755
... ...
@@ -0,0 +1,91 @@
0
+#! /bin/bash
1
+
2
+# Dist tag must present in Release:
3
+function check-for-dist-tag()
4
+{
5
+  cat $1 | grep "Release:" | grep "%{?dist}" > /dev/null
6
+  if [ "$?" -ne 0 ];then
7
+    echo "ERROR in $1: Release field doesn't contain %{?dist} tag"
8
+    cat $1 | grep "Release:"
9
+    exit 1
10
+  fi
11
+}
12
+
13
+# Check for Version-Release matching top entry from the Changelog
14
+function check-for-correct-version()
15
+{
16
+  versions=`sed -e '1,/%changelog/d' $1 | grep '<' | grep '>' | grep '*' | cut -f 2 -d '>'`;
17
+  latest_version_in_changelog=`echo $versions | cut -d ' ' -f 1`
18
+  version=`cat $1 | grep Version: | cut -f 2 -d ':'  | sed 's/ //g'  | sed '1!d'`;
19
+  sub_version=`cat $1 | grep Release: | cut -f 2 -d ':' | cut -f 1 -d '%' | sed 's/ //g' | tr -d ' '`
20
+  s=`echo ${sub_version//[[:blank:]]/}`
21
+  v=`echo ${version//[[:blank:]]/}`
22
+  full_version=${v}-${s};
23
+  if [ "${latest_version_in_changelog}" != "${full_version}" ]; then
24
+    echo "ERROR in $1: Top changelog entry version ${latest_version_in_changelog} does NOT MATCH package version ${full_version}"
25
+    echo "Please update %changelog or Version,Release: in $1 to make them match each other"
26
+    exit 1
27
+  fi
28
+}
29
+
30
+# Changelog should have correct dates
31
+function check-for-bogus-dates()
32
+{
33
+  local IFS=$'\n'
34
+  for entry in `sed -e '1,/%changelog/d' $i | grep '<' | grep '>' | grep '*' | sed 's/^*//g' | sed 's/ \+/ /g'` ; do
35
+    IFS=$' ' read D m d y s <<< $entry
36
+    day=`date --date "$m $d $y" +%a`
37
+    if [ "${D}" != "${day}" ]; then
38
+      echo "ERROR in $1: bogus date in $entry"
39
+      echo "$m $d $y is $day"
40
+      exit 1
41
+    fi
42
+  done
43
+}
44
+
45
+# No trailing spaces
46
+function check-for-trailing-spaces()
47
+{
48
+  grep -e " $" $1
49
+  if [ $? -eq 0 ] ; then
50
+      echo "ERROR in $1: trailing spaces detected"
51
+      exit 1
52
+  fi
53
+}
54
+
55
+# Do not use ./configure
56
+function check-for-configure()
57
+{
58
+  grep -e "./configure" $1
59
+  if [ $? -eq 0 ] ; then
60
+      echo "ERROR in $1: use %configure instead of ./configure"
61
+      exit 1
62
+  fi
63
+}
64
+
65
+# All BuildRequires should on the top
66
+function check-for-buildrequires()
67
+{
68
+  sed -e '1,/%description/d' $1 | grep -e "^BuildRequires"
69
+  if [ $? -eq 0 ] ; then
70
+      echo "ERROR in $1: BuildRequires in subpackages detected."
71
+      echo "Move all BuildRequires to the top"
72
+      exit 1
73
+  fi
74
+}
75
+
76
+SPECS=`git diff --name-only $1 @ | grep -e "SPECS/.*.spec$"`
77
+for i in `echo $SPECS`;
78
+do
79
+  echo Analyzing $i ...
80
+  if [ ! -f $i ]; then
81
+     echo "$i is removed by the current changeset."
82
+  else
83
+    check-for-dist-tag $i
84
+    check-for-correct-version $i
85
+    check-for-bogus-dates $i
86
+    check-for-trailing-spaces $i
87
+    check-for-configure $i
88
+    check-for-buildrequires $i
89
+  fi
90
+done