summaryrefslogtreecommitdiff
path: root/packaging/edit-xml-catalog.sh
blob: 38df58dd6124baf4538e10216a88db824808ec28 (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
#!/bin/bash

# $0 $for_root_catalog add|del
export LC_ALL=C

usage="\
$0 [-a|-d] [--add|--del] [-c|--catalog /etc/xml/CATALOG] CATALOG_FRAGMENT_FILE"
# TEMP=$(getopt -o ac:dghv \
#   --long add,cat:,catalog:,del,delete,group,help,verbose \
#   -n "$0" -- "$@")
# # Note the quotes around `$TEMP': they are essential!
# eval set -- "$TEMP"

ROOTCATALOG=/etc/xml/catalog
mode=add
echo=true
while test $# -gt 0; do
# while true ; do
  case "$1" in
    -h|--help) echo "$usage"; exit 0 ;;
    -a|--add) mode=add; shift ;;
    -c|--cat*) if test $# -gt 1; then ROOTCATALOG="$2"; shift 2;
      else echo "$usage"; exit 1; fi ;;
    -d|--del*) mode=del; shift ;;
    -g|--group) marker=group; shift ;;
    -v|--verbose) verbose="-v"; echo=echo; shift ;;
    --) shift ; break ;;
    *) break ;;
    # *) echo "Internal error!" ; exit 1 ;;
  esac
done
FOR_ROOT_CAT=$1

[ -z "$FOR_ROOT_CAT" ] && { echo $usage; exit 1; }

xmlcat=/usr/bin/xmlcatalog
xmllint=/usr/bin/xmllint

for b in $xmlcat $xmllint; do
  [ -x $b ] || { echo "error: $b does not exist" ; exit 1; }
done

prep_catalog () {
  local cat=$1
  [ -s $cat ] || rm -f $cat
  if [ -r $cat ]; then
    if grep -q '"urn:oasis:names:tc:entity:xmlns:xml:catalog"/>' $cat; then
      rm -f $cat
    fi
  fi
  if [ ! -r $cat ] ; then
    $xmlcat --create | sed 's:/>:>\
</catalog>:' >$cat
  # echo Failed creating XML Catalog root $1
  fi
}

# Check /etc/xml/catalog
prep_catalog /etc/xml/catalog

if [ "$ROOTCATALOG" != /etc/xml/catalog ]; then
  root=${ROOTCATALOG#/etc/xml/}
  if ! grep -q "nextCatalog.*catalog=\"${root}\"" /etc/xml/catalog; then
    sed -i "/<\/catalog>/i\\
<nextCatalog catalog=\"${root}\"/>" /etc/xml/catalog
  fi
  prep_catalog "$ROOTCATALOG"
fi

add_entry () {
  {
    sed '/<\/catalog>/d' $ROOTCATALOG
    $xmllint --nocatalogs --format ${FOR_ROOT_CAT} \
      | awk '\
/<\/catalog>/{next}
s == 1 {print}
/<catalog/{s=1}
END{print "</catalog>"}'
  } >$ROOTCATALOG.tmp
  if [ -x /bin/chmod ]; then
    /bin/chmod --reference=$ROOTCATALOG $ROOTCATALOG.tmp
  fi
  $xmllint --nocatalogs --noout $ROOTCATALOG.tmp \
    && mv $ROOTCATALOG.tmp $ROOTCATALOG
}

del_entry () {
  pattern=$FOR_ROOT_CAT
  $echo $pattern
  if [ -r $ROOTCATALOG ]; then
    # Either delete <group>...</group>
    # or  <!-- pac_start: ... -->...<!-- pac_end: ... -->
    if [ "$marker" = "group" ]; then
      $xmllint --nocatalogs --format $ROOTCATALOG \
        | awk "\
/<\/group>/ && s == 1 {s=0;next}
s == 1 {next}
/<group id=\"$pattern\">/{s=1;next}
{print}" > $ROOTCATALOG.tmp
    else
    $xmllint --nocatalogs --format $ROOTCATALOG \
      | awk "\
/<!-- pac_end: $pattern do not remove! -->/{s=0;next}
s == 1 {next}
/<!-- pac_start: $pattern do not remove! -->/{s=1;next}
{print}" > $ROOTCATALOG.tmp
    fi
    if [ -x /bin/chmod ]; then
      /bin/chmod --reference=$ROOTCATALOG $ROOTCATALOG.tmp
    fi
    $xmllint --nocatalogs --noout $ROOTCATALOG.tmp \
      && mv $ROOTCATALOG.tmp $ROOTCATALOG
  fi
}

case "$mode" in
  del)
    del_entry
    ;;
  add)
    [ -r ${FOR_ROOT_CAT} ] || { echo \"$FOR_ROOT_CAT\" does not exist; exit 1; }
    add_entry
    ;;
  *)
esac

exit