File: getversion.sh

package info (click to toggle)
smartmontools 7.5-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,080 kB
  • sloc: cpp: 53,631; ansic: 9,924; sh: 6,493; makefile: 1,017
file content (144 lines) | stat: -rwxr-xr-x 3,844 bytes parent folder | download | duplicates (2)
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
138
139
140
141
142
143
144
#!/bin/sh
#
# Create svnversion.h file or get package version
#
# Home page of code is: https://www.smartmontools.org
#
# Copyright (C) 2024 Christian Franke
#
# SPDX-License-Identifier: GPL-2.0-or-later
#
# $Id: getversion.sh 5597 2024-01-24 10:30:14Z chrfranke $
#

set -e
myname=$0

usage()
{
  cat <<EOF
Usage: $myname [-i] [-pq] [-r] [METHOD...] [> svnversion.h]

  -i          Print new contents of svnversion.h
  -p          Print package version from configure.ac
  -q          Prepend 'pre-' to package version if pre-release (implies -p)
  -r          Print svn revision (like 'svnversion')

  METHOD...   One or more of 'svn', 'ids' or 'git' [default: svn ids git]
EOF
  exit 1
}

error()
{
  echo "$myname: $*" >&2
  exit 1
}

i_opt=false; p_opt=false; q_opt=false; r_opt=false
while true; do case $1 in
  -i) i_opt=true ;;
  -p) p_opt=true ;;
  -q) p_opt=true; q_opt=true ;;
  -r) r_opt=true ;;
  -*) usage ;;
  *) break ;;
esac; shift; done
$i_opt || $p_opt || $r_opt || usage

if [ $# -ne 0 ]; then
  methods=$*
  for m in $methods; do case $m in
    svn|ids|git) ;;
    *) usage ;;
  esac; done
else
  methods="svn ids git"
fi

srcdir=${myname%/*}
test "$srcdir" != "$myname" || error 'unknown $srcdir'

files="
  ChangeLog NEWS Makefile.am configure.ac smart*.in
  *.cpp *.h os_win32/*.cpp os_win32/*.h
"
(cd "$srcdir" && ls -d $files >/dev/null) || error "sources not found in $srcdir"

revision_from_svn()
{
  local r t
  r=$(cd "$srcdir" && svnversion 2>/dev/null) || return 1
  case $r in [1-9][0-9]*) ;; *) return 1 ;; esac
  t=$(cd "$srcdir" && TZ='' LC_ALL=C svn info 2>/dev/null) || return 1
  t=$(echo "$t" | sed -n 's,^.* Date: *\(2[-0-9]*\) \([0-9][:0-9]*\) .*$,\1 \2,p')
  test -n "$t" || return 1
  svnrev=$r; revdate=${t% *}; revtime=${t#* }
  origin="svn info"
}

revision_from_ids()
{
  local x
  x=$(cd "$srcdir" && \
      sed -n 's,^.*\$[I][d]: [^ ]* \([0-9][0-9]*\) \([0-9][-0-9]*\) \([0-9][:0-9]*\)Z [^$]*\$.*$,\1 \2 \3,p' $files \
      | sort -n -r | sed -n 1p)
  test -n "$x" || return 1
  svnrev=${x%% *}; x=${x#* }; revdate=${x% *}; revtime=${x#* }
  origin="Id strings"
}

revision_from_git()
{
  local h r t x
  x=$(cd "$srcdir" && TZ='' LC_ALL=C git log -1 --date=iso 2>/dev/null) || return 1
  h=$(echo "$x" | sed -n 's,^commit \([0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]\).*$,\1,p')
  t=$(echo "$x" | sed -n 's,^Date: *\(2[-0-9]*\) \([0-9][:0-9]*\) .*$,\1 \2,p')
  r=$(echo "$x" | sed -n 's,^.*git-svn-id: [.:/a-z]*/smartmontools/code/trunk@\([1-9][0-9]*\) 4ea69e.*$,\1,p')
  test "${h:+y}${r:+y}${t:+y}" = "yyy" || return 1
  test -z "$(cd "$srcdir" && git status -s -uno 2>&1)" || r="${r}M"
  svnrev=$r; revdate=${t% *}; revtime=${t#* }; githash=$h
  origin="git log"
}

if $i_opt || $r_opt; then
  svnrev=; revdate=; revtime=; githash=
  origin="missing information"
  for m in $methods; do
    revision_from_$m || continue
    break
  done

  if $i_opt; then
    cat <<EOF
/* svnversion.h.  Generated by ${myname##*/} from $origin.  */
EOF
    test -z "$svnrev" || cat << EOF
#define SMARTMONTOOLS_SVN_REV  "$svnrev"
#define SMARTMONTOOLS_SVN_DATE "$revdate"
#define SMARTMONTOOLS_SVN_TIME "$revtime"
EOF
    test -z "$githash" || cat <<EOF
#define SMARTMONTOOLS_GIT_HASH "$githash"
EOF
  fi

  if $r_opt; then
    test -n "$svnrev" || error "svn revision not found using $methods"
    echo "$svnrev"
  fi
fi

if $p_opt; then
  p=$(sed -n 's|^AC_INIT[^,]*, *\[\([0-9.]*\)\] *,.*$|\1|p' "$srcdir/configure.ac") || exit 1
  test -n "$p" || error "package version not found in $srcdir/configure.ac"
  if $q_opt; then
    x=$(sed -n 's|^smartmontools_release_date=\(.*\)$|\1|p' "$srcdir/configure.ac") || exit 1
    case $x in
      20*) ;;
      \ \#*) p="pre-$p" ;;
      *) error "unable to detect pre-release state in $srcdir/configure.ac"
    esac
  fi
  echo "$p"
fi