summaryrefslogtreecommitdiff
path: root/src/maintenance-tools/meld-src-pkgbuilds
blob: df08c9f884902efd8ad981763f429a3e45d7bd39 (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
#!/bin/bash

# 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 PKGS_DIR="$(source "$(grep 'WORKDIR=' /etc/libretools.conf)" ; echo "${WORKDIR}")"
echo "PKGS_DIR=${PKGS_DIR:-/packages}"


[[ ! -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:

  $0 [ -a | -g ] PKGBUILD-or-srcpkg-or-pkgname PKGBUILD-or-srcpkg

OPTIONS:

  $0 [ -a ] UseAbs
  $0 [ -g ] UseGui

EXAMPLES:

  # local srcpkg_a='icecat'
  # local srcpkg_a="$(SelectSrcpkg "${pkgname}")"
  # local srcpkg_=/packages/abslibre/libre/icecat/PKGBUILD
  # local srcpkg_=/packages/abslibre/libre/icecat/icecat-78.10.0_pre2-1-x86_64.src.tar.gz
USAGE_MSG

readonly UseAbs=0
readonly 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 $(( ! $? )) ; )

  [[ -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}
       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" )"
            srcpkg_b="$( SelectSrcpkg "$1" || GitPkgbuilds "$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=$(  echo $(( is_src_pkg_a  && is_src_pkg_b  )) )
  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}"
       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 ;

main "$@"