summaryrefslogtreecommitdiff
path: root/bumpPkgrel
blob: 3ec110398f6fca6c68cfc7ce03eed77752c5e65b (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
#!/bin/bash

if [ $# -eq 0 ]; then
  >&2 echo 'usage: bumpPkgrel [-n] $pkg1 $pkg2 $pkg3 ...'
  exit 1
fi

if [ "x$1" = 'x-n' ]; then
  commit=false
  commit_flag='-n'
  shift
else
  commit=true
  commit_flag=''
fi

pin_dependency() {
  sed '
    s/=.*$//
    /^$/d
  ' \
  | sort -k1,1 \
  | join -1 1 -2 2 - "${provided}" \
  | sed '
    s/^\(\S\+\) \(\S\+\)$/'"${1}'"'\1=\2'"'"'/
    t
    d
  '
}

if [ $# -eq 1 ]; then

  provided=$(mktemp)
  trap 'rm -f "${provided}"' EXIT

  find /var/lib/pacman/sync/ -name '*.db' \
    -not -exec tar -Oxzf {} --wildcards '*/desc' \; \
    -not -exec tar -OxJf {} --wildcards '*/desc' \; \
    -not -exec tar -Oxjf {} --wildcards '*/desc' \; \
    -not -exec tar -Oxf {} --wildcards '*/desc' \; \
  2>/dev/null \
  | sed -n '
    /^%\(NAME\|VERSION\)%$/ {
      N
      s/\n/ /
      p
    }
    /^%PROVIDES%$/,/^$/ {
      /^[^%]/ p
    }
  ' \
  | sed -n '
    s/=/ /
    T no_provides
    p
    d
    :no_provides
    /^%NAME%/ {
      N
      s/^%NAME% \(\S\+\)\n%VERSION% \(\S\+\)-\S\+$/\2 \1/
      T
      p
    }
  ' \
  | sort -k2,2 -k1Vr,1 \
  | uniq -f1 \
  >"${provided}"

  cd "$(dirname "$0")"

  pkg="${1%/}"
  cd "${pkg}"
  while IFS=$(printf '\n') read -r line; do
    if printf '%s\n' "${line}" \
    | grep -q '^\s*pkgrel='; then
      eval "${line}"
      printf '%s=%s\n' "${line%%=*}" "$((pkgrel+1))"
      continue
    fi
    if printf '%s\n' "${line}" \
    | grep -q '^\s*_pinned_dependencies=('; then
      space="${line%%_pinned_dependencies=(}"
      printf '%s_pinned_dependencies=(\n' "${space}"
      line="${line#*_pinned_dependencies=(}"
      {
        while ! printf '%s\n' "${line}" \
        | grep -qF ')'; do
          printf '%s\n' ${line%%#*}
          IFS=$(printf '\n') read -r line
        done
        printf '%s\n' ${line%%)*}
      } \
      | pin_dependency "${space}  "
      printf '%s)%s\n' "${space}" "${line#*)}"
      continue
    fi
    printf '%s\n' "${line}"
  done \
  < 'PKGBUILD' \
  | sponge 'PKGBUILD'
  if ${commit}; then
    if [ -d '.git' ] || [ -f '.git' ]; then
      makepkg --printsrcinfo > .SRCINFO
      git commit 'PKGBUILD' '.SRCINFO' -m "${pkg}: rebuild"
      for remote in $(
        git remote
      ); do
        git push "${remote}" || exit 1
      done
      cd ..
      git commit "${pkg}" -m "${pkg}: rebuild"
    else
      git commit 'PKGBUILD' -m "${pkg}: rebuild"
    fi
  fi

else

  printf '%s\n' "$@" \
    | xargs -rn1 "$0" ${commit_flag}

fi