gitlog-to-emacslog 2.91 KB
Newer Older
1 2 3 4 5 6
#!/bin/sh

# Convert git log output to ChangeLog format for GNU Emacs.

# Copyright (C) 2014-2015 Free Software Foundation, Inc.

7 8
# Author: Paul Eggert

9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

LC_ALL=C
export LC_ALL

25
# The newest revision that should not appear in the generated ChangeLog.
26
gen_origin=f89080d18dd64e0c92c5f3d206182d65f23eafeb
27 28
force=
output=ChangeLog
29
nmax=2
30 31 32 33 34

while [ $# -gt 0 ]; do
  case "$1" in
      -g|--gen-origin) gen_origin="$2" ; shift ;;
      -f|--force) force=1 ;;
35
      -n|--nmax) nmax="$2"; shift ;;
36 37 38 39 40 41
      -o|--output) output="$2" ; shift ;;
      *) echo "Unrecognized argument: $1" >&2; exit 1 ;;
  esac
  shift
done

42 43 44 45 46 47
if [ ! -f ChangeLog.$nmax ]; then
    echo "Can't find ChangeLog.$nmax" >&2
    echo "Must be run from the top source directory" >&2
    exit 1
fi

48
if [ -f "$output" ]; then
49
    [ ! "$force" ] && echo "$output exists" >&2 && exit 1
50
    rm -f "$output" || exit 1
51
fi
52 53

# If this is not a Git repository, just generate an empty ChangeLog.
54
test -d .git || {
55
  >"$output"
56 57 58 59
  exit
}

# Use Gnulib's packaged ChangeLog generator.
60
./build-aux/gitlog-to-changelog --ignore-matching='^; ' \
61
  --ignore-line='^; ' --format='%B' \
62
  "$gen_origin.." >"ChangeLog.tmp" || exit
63

64
if test -s "ChangeLog.tmp"; then
65

66 67 68 69 70
  # Fix up bug references.
  # This would be better as eg a --transform option to gitlog-to-changelog,
  # but... effort.  FIXME does not handle rare cases like:
  # Fixes: debbugs:19434 debbugs:19519
  sed 's/	Fixes: \(debbugs:\|bug#\)\([0-9][0-9]*\)/	(Bug#\2)/' \
71 72
      "ChangeLog.tmp" > "ChangeLog.tmp2"
  mv "ChangeLog.tmp2" "ChangeLog.tmp"
73

74 75 76
  # Find the years covered by the generated ChangeLog, so that
  # a proper copyright notice can be output.
  years=`
77
    sed -n 's/^\([0-9][0-9]*\).*/\1/p' "ChangeLog.tmp" |
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
    sort -nu
  `
  start_year=
  end_year=
  for year in $years; do
    : ${start_year:=$year}
    end_year=$year
  done

  if test "$start_year" = "$end_year"; then
    year_range=$start_year
  else
    year_range=$start_year-$end_year
  fi

  # Append a proper copyright notice.
94 95 96
  sed -n '
    1i\

97 98
    /^See ChangeLog.[0-9]* for earlier/,${
       s/ChangeLog\.[0-9]*/ChangeLog.'$nmax'/
99 100 101
       s/\(Copyright[ (C)]*\)[0-9]*-[0-9]*/\1'"$year_range"'/
       p
    }
102
  ' <ChangeLog.$nmax >>"ChangeLog.tmp" || exit
103 104 105
fi

# Install the generated ChangeLog.
106
test "$output" = "ChangeLog.tmp" || mv "ChangeLog.tmp" "$output"