summaryrefslogtreecommitdiff
path: root/config/srclist-update
blob: 0021c1b6eb5b5eae4b45c00c1f6302cbd54c655a (plain)
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
#!/bin/sh
# Check for files in directory $1 being up to date, according to the
# list on stdin.  Don't actually make any changes, just show the diffs.
#
# Empty (or only whitespace) input lines are ignored.
# Lines beginning with # are ignored.
# Lines with just one word are ignored.
# Otherwise, the line has two or more whitespace-separated words:
#   the first word is the source directory, which can be a top-level
#   directory of source archive,
#   the second word is the source file name relative to the source
#   directory, and
#   the third word is the destination, other optional words are
#   options.
# The possible options are "gpl" (to replace the license with the GPL)
#   and "doclicense" (to replace @include doclicense.texi with fdl.texi)
#   and "strip-trailing-space" (to strip trailing white space from lines)
#   and "release" (to use the release version instead of the
#   development version).
#   Unrecognized options are ignored.
# $VARIABLE expansions are done (with sh eval).
#
# This script is used in gnulib and texinfo; the input files are named
# srclist.txt.
#
# Copyright (C) 2002-2003, 2005, 2007-2023 Free Software Foundation, Inc.
#
# 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 <https://www.gnu.org/licenses/>.

# Originally written by Karl Berry.


if test -n "$1"; then
  cd "$1" || exit 1
fi

verbose=false
#chicken="echo (would)"

: "${TMPDIR=/tmp}"
dsttmp=$TMPDIR/srclist.dst

# Source `dirname $0`/srclistvars.sh first, if it exists.
mydir=`dirname $0`
test -r $mydir/srclistvars.sh && . $mydir/srclistvars.sh


# 
# sed command to fix the license to be GPL.
fixlicense='
  /^[[:space:]]*#[[:space:]]*Th[ei][ s].* is free software/,/^[[:space:]]*#.*USA\./c\
#   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 <https://www.gnu.org/licenses/>.

  /Th[ei][ s].* is free software/,/\*\//c\
   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 <https://www.gnu.org/licenses/>.  */
'

# sed command to remove lines containing $Id lines.
# Quote the $ so that CVS does not expand it in this script.
remove_id_lines='/[$]Id:.*[$]/d'

# $1 is input file, $2 is output.
# Remove $Id lines, since they'll differ between source
# locations.  If $options contains "gpl", change the license to be the
# standard GPL.  We use this for libc files, et al.
#
fixfile() \
{
  sed_command="$remove_id_lines"

  case " $options " in
  *' strip-trailing-space '*)
    sed_command="$sed_command; s/[[:space:]]*\$//";;
  esac

  case " $options " in
  *' gpl '*)
    sed_command="$sed_command; $fixlicense";;

  *' doclicense '*)
    sed_command="$sed_command; s/@include doclicense.texi/@include fdl.texi/";;
  esac

  sed "$sed_command" $1 >$2-t && mv $2-t $2
}


# 
cat | while read top src dst options; do
  #echo "top=$top, src=$src, dst=$dst, options=$options" >&2
  case $top:$src:$dst in
    *: ) continue;;    # skip lines without last element
    '#'* ) continue;;  # skip comment-only lines
  esac

  release=false
  case " $options " in
    *' release '*)
      release=true
      ;;
  esac

  eval top=$top
  if $release && test ! -d $top/.git; then
    echo "$0: 'release' option only works with git checkout"
    release=false
  fi

  # Expand variables and make sure we have an input file.
  src1=$src
  eval src=$top/$src
  if test ! -r $src; then
    echo "$0: cannot read $src" >&2
    continue
  fi

  # Ignore subdirs in src dir.  E.g., if input spec is
  #   src/subdir/foo.c dst
  # then write destination file dst/foo.c.
  eval dst=$dst
  test -d $dst && dst=$dst/`basename $src`

  if $release; then
    rev=$(git --git-dir=$top/.git describe --abbrev=0)
    reltmp=$TMPDIR/`basename $src1`:$rev
    git --git-dir=$top/.git show $rev:$src1 > $reltmp
    fixfile $reltmp $reltmp
  fi

  # Fix files in both src and dst, for the sake
  # of a clean comparison.
  srctmp=$TMPDIR/`basename $src`
  fixfile $src $srctmp
  test -r $dst && fixfile $dst $dsttmp

  # if src was executable, make dst executable, to placate git.
  test -x $src && chmod a+x $dst

  if test ! -e $dst; then
    echo "## $srctmp $dst  # new"
    $chicken cp -p $srctmp $dst
  elif $release && cmp -s $reltmp $dsttmp; then
    $verbose && echo "## $reltmp $dst  # unchanged"
  elif cmp -s $srctmp $dsttmp; then
    $verbose && echo "## $srctmp $dst  # unchanged"
  else
    echo "## $srctmp $dst  # changes"
    diff -C 2 $dst $srctmp
  fi
done

rm -f $dsttmp