summaryrefslogtreecommitdiff
path: root/meld-src-pkgbuilds
blob: 6d420e9aa84b3f6fe84793cae8159bf03b2ae2aa (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
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
#!/bin/bash

# meld-src-pkgbuilds - compare source packages
#
# Copyright (C) 2020 bill-auger <bill-auger@programmer.net>
#
# SPDX-License-Identifier: AGPL-3.0-or-later
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.


# echo "$(grep 'WORKDIR=' /etc/libretools.conf | sed 's|^WORKDIR="\([^"]*\)"|\1|') IN"
# echo "$(grep 'WORKDIR=' /etc/libretools.conf | sed 's|^WORKDIR=||' | tr '"' ' ') IN"


readonly PKGS_DIR="$(source /etc/libretools.conf ; echo "${WORKDIR}" ;)"
readonly ABS_DIR=${PKGS_DIR}/arch
readonly ABSLIBRE_DIR=${PKGS_DIR}/abslibre

[[ ! -d "${PKGS_DIR:-/packages}" ]] && echo "no such dir" && exit 1


# readonly PKGS_DIR=$(grep 'WORKDIR=' /etc/libretools.conf | sed 's|.*WORKDIR="\([^"]*\)*"|\1|')

read -r -d '' USAGE <<-'USAGE_MSG'
USAGE:

  meld-src-pkgbuilds [ -a ] [ -g ] PKGBUILD-or-srcpkg-or-pkgname PKGBUILD-or-srcpkg

OPTIONS:

  -a UseAbs
  -g UseGui

EXAMPLES:

  # prompt for selection
  $ meld-src-pkgbuilds base

  # compare across repos
  $ meld-src-pkgbuilds libre/base/PKGBUILD nonsystemd/base/PKGBUILD

  # compare across versions
  $ meld-src-pkgbuilds libre/base/base-*-any.src.tar.gz
USAGE_MSG

declare -i UseAbs=0
declare -i UseGui=0


SelectSrcpkg() # (pkgname)
{
  # echo back parameter, if not a valid pkgname
  local pkgname=$1
  local pkgname_rx='^[0-9a-z][0-9a-zA-Z_-]*$'
  local pkg

# echo "SelectSrcpkg() pkgname='$pkgname' sourcepkg $( [[ "$pkgname" =~ ${pkgname_rx} ]] && pacman -Si "$pkgname" &> /dev/null || echo " not")exists" >&2 ;

  [[ "${pkgname}" =~ ${pkgname_rx} ]] && pacman -Si ${pkgname} &> /dev/null || return 1

# echo "SelectSrcpkg() pkgname=${pkgname} PKGS_DIR=$PKGS_DIR is $( pacman -Qsq ${pkgname} &> /dev/null || echo 'not ') installed" >&2

  local srcpkgs_glob="${pkgname}-*.src.tar.gz"
  local pkgs=( $(find "${PKGS_DIR}"/abslibre/ -type f -name "${srcpkgs_glob}" 2> /dev/null) \
               $(find "${PKGS_DIR}"/sources/  -type f -name "${srcpkgs_glob}" 2> /dev/null) )

# printf "SelectSrcpkg() ${#pkgs[@]} pkgs=%s\n" "${pkgs[@]}" >&2

  (( ${#pkgs[@]} )) && [[ -n "${pkgs[@]}" ]] || return 1

  select pkg in "${pkgs[@]}" ; do echo "${pkg}" ; break ; done
}

GitPkgbuilds()
{
# echo "GitPkgbuilds() pkgname='$1' $( [[ "$1" =~ '^[-@\._\+0-9a-z]+$' ]] && echo t || echo f )" >&2
#   local pkgbuild=$( [[ "$1" =~ /PKGBUILD$ ]] && echo "$1" )


#   local pkgname_rx='^[-@\._\+0-9a-z]+$'
  local pkgname_rx='^[0-9a-z][0-9a-zA-Z_-]*$'
  local pkgname=$(    [[ "$1" =~ ${pkgname_rx} ]] && echo "$1"        )
  local sort_order=$( [[ "$2" == '--reverse'   ]] && echo '--reverse' )
#   [[ -z "${pkgname}" ]]                           && echo "invalid pkgname: '$1'" >&2 && return 1
  [[ -z "${pkgname}" ]]                           && return 1

  local arch_dirs="$( find -L $ABS_DIR/      -maxdepth 2 -type d -name $pkgname | sort $sort_order)"
  local abs_dirs="$(  find    $ABSLIBRE_DIR/ -maxdepth 2 -type d -name $pkgname | sort $sort_order)"
  local arch_dir="$(  head -n 1 <<<${arch_dirs})"
  local abs_dir="$(   head -n 1 <<<${abs_dirs} )"
  local is_writable=$(touch ${abs_dir}/PKGBUILD &> /dev/null ; echo $(( ! $? )) ; )

echo -e "GitPkgbuilds() OUT\n  arch_dirs=$arch_dir\n  abs_dirs=$abs_dirs\n  arch_dir=$arch_dir\n  abs_dir=$abs_dir\n  is_writable=$is_writable" >&2

  [[ -z "$arch_dir"                             ]] && echo "no such arch PKGBUILD"     >&2 && return 1
  [[ -z "$abs_dir"                              ]] && echo "no such parabola PKGBUILD" >&2 && return 1

  [[ "$arch_dir" =~ $ABS_DIR.+$ABS_DIR          ]] && echo "multiple arch PKGBUILDs found (try --reverse)"
  [[ "$abs_dir" =~ $ABSLIBRE_DIR.+$ABSLIBRE_DIR ]] && echo "multiple abslibre PKGBUILDs found (try --reverse)"
  (( ! ${is_writable}                           )) && echo "fixing 'dev' group perms on ABS dir" && mkdev ${abs_dir}/
  ls --color=auto --group-directories-first -F -l ${arch_dir}/trunk/ ${abs_dir}/
}

DoDiff()
{
  local pkgbuild_a="$1"
  local pkgbuild_b="$2"
  local srcpkg_a="$3"
  local srcpkg_b="$4"
  local sed_rx='s|(\-\-\-\|\+\+\+) /dev/fd/[0-9]*\s*(.*)|\1 /PKGBUILD \2|'
  local patch_file=srcpkgbuild.patch

echo "DoDiff() pkgbuild_a=$pkgbuild_a pkgbuild_b=$pkgbuild_b"

  [[ -n "${pkgbuild_a}" && -n "${pkgbuild_b}" ]] || return 1

  if   [[ -n "${srcpkg_a}" && -n "${srcpkg_b}" ]]
  then if   diff "${srcpkg_a}" "${srcpkg_b}" &> /dev/null
       then echo "source packages identical" ; return ;
       else echo "source packages differ"
       fi
  fi

  if   diff "${pkgbuild_a}" "${pkgbuild_b}" &> /dev/null
  then echo "PKGBUILDs identical"
  else echo "PKGBUILDs differ"
       if   (( UseGui ))
       then echo "launching meld"
            meld       "${pkgbuild_a}" "${pkgbuild_b}"
       else diff -u -r "${pkgbuild_a}" "${pkgbuild_b}" | sed -E "${sed_rx}" | tee ${patch_file} >&2
       fi
  fi
}

main()
{
echo -e "meld-src-pkgbuilds() IN\n  n_args$#\n  1=$1\n  2=$2\n  GitPkgbuilds='$(GitPkgbuilds "$1")'" ; # $# $@" >&2 ; local in=$# ;

  local pkgname_rx='^[0-9a-z][0-9a-zA-Z_-]*$'
  local is_pkg_name=$(   [[ "$1" =~ ${pkgname_rx} ]] ; echo $(( ! $? )) )
  local is_src_pkg_a=$(  [[ "$1" =~ src\.tar\.gz$ ]] ; echo $(( ! $? )) )
  local is_src_pkg_b=$(  [[ "$2" =~ src\.tar\.gz$ ]] ; echo $(( ! $? )) )
  local is_pkgbuild_a=$( [[ "$1" =~ /PKGBUILD$    ]] ; echo $(( ! $? )) )
  local is_pkgbuild_b=$( [[ "$2" =~ /PKGBUILD$    ]] ; echo $(( ! $? )) )
  local srcpkg_a
  local srcpkg_b

  if   (( is_pkg_name ))
  then if   (( UseAbs ))
       then srcpkgs=( "$(GitPkgbuilds "$1")" )
            srcpkg_a=${srcpkgs[0]}
            srcpkg_b=${srcpkgs[1]}
       else srcpkg_a="$( SelectSrcpkg "$1" || GitPkgbuilds "$1" )" ; is_src_pkg_a=1 ;
            srcpkg_b="$( SelectSrcpkg "$1" || GitPkgbuilds "$1" )" ; is_src_pkg_b=1 ;
       fi
  else (( is_src_pkg_a  && is_src_pkg_b  )) && srcpkg_a="$1" srcpkg_b="$2"
       (( is_pkgbuild_a && is_pkgbuild_b )) && srcpkg_a="$1" srcpkg_b="$2"
  fi

  local are_src_pkgs=$(  (( is_src_pkg_a     && is_src_pkg_b        )) ; echo $(( ! $? )) )
  local are_abs_dirs=$(  (( UseAbs        )) && [[ -d "${srcpkg_a}" && \
                                                   -d "${srcpkg_b}" ]] ; echo $(( ! $? )) )
  local are_pkgbuilds=$( (( is_pkgbuild_a )) && [[ -f "${srcpkg_a}" ]]                   && \
                         (( is_pkgbuild_b )) && [[ -f "${srcpkg_b}" ]] ; echo $(( ! $? )) )

echo -e "meld-src-pkgbuilds()\n  srcpkg_a=${srcpkg_a}\n  srcpkg_b=${srcpkg_b}\n  are_src_pkgs=$are_src_pkgs\n  are_abs_dirs=$are_abs_dirs\n  are_pkgbuilds=$are_pkgbuilds">&2

  if   [[ -z "${srcpkg_a}" || -z "${srcpkg_b}" || "${srcpkg_a}" == "${srcpkg_b}" ]]
  then echo "arguments must be one <pkgname>, or two unique *.src.tar.gz or PKGBUILD"

  elif (( are_src_pkgs ))
  then local pkgbuild_a="$( [[ -f "${srcpkg_a}" ]] && tar -ztf "${srcpkg_a}" | grep PKGBUILD )"
       local pkgbuild_b="$( [[ -f "${srcpkg_b}" ]] && tar -ztf "${srcpkg_b}" | grep PKGBUILD )"

echo -e "meld-src-pkgbuilds()\n  pkgbuild_a=${pkgbuild_a}\n  pkgbuild_b=${pkgbuild_b}\n  tar_a_cmd=${tar_a_cmd[@]}\n  tar_b_cmd=${tar_b_cmd[@]}" >&2

       if   [[ -n "${pkgbuild_a}" && -n "${pkgbuild_b}" ]]
       then cd /tmp
            tar -zxf "${srcpkg_a}" "${pkgbuild_a}" > ./srcpkgbuild_a
            tar -zxf "${srcpkg_b}" "${pkgbuild_b}" > ./srcpkgbuild_b
            DoDiff ./srcpkgbuild_a ./srcpkgbuild_b "${srcpkg_a}" "${srcpkg_b}"
            rm ./srcpkgbuild_a ./srcpkgbuild_b
       fi

  elif (( are_abs_dirs ))
  then DoDiff "${srcpkg_a}/PKGBUILD" "${srcpkg_b}/PKGBUILD"

  elif (( are_pkgbuilds ))
  then DoDiff "${srcpkg_a}" "${srcpkg_b}"
  fi
}


#   local UseGui=$( [[ "$1" == '--gui' ]] ; echo ! $(($?)) ) ; (( UseGui )) && shift ;
#   local UseGui=$( while getopts 'g' opt ; do [[ "${opt}" == 'g' ]] ; echo $(( ! $? )) ; done ; shift $(( OPTIND - 1 )) ; )
while getopts 'ag' opt
do case "$opt" in
   a) UseAbs=1                                                  ;;
   g) UseGui=1                                                  ;;
   *) echo "invalid option: '%s'" "${opt}\n${USAGE}" ; return 1 ;;
   esac
done ; shift $(( OPTIND - 1 )) ; (( $# )) || ! echo "args err" || exit 1 ;
readonly UseAbs UseGui


main "$@"