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
#!/bin/sh
#
# Copyright (C) 2023 Etersoft
# Copyright (C) 2023 Vitaly Lipatov <lav@etersoft.ru>
#
# 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 <http://www.gnu.org/licenses/>.
#
load_helper epm-sh-altlinux
load_helper epm-assure
load_helper epm-repack
[ -n "$EPM_PACK_SCRIPTS_DIR" ] || EPM_PACK_SCRIPTS_DIR="$CONFIGDIR/pack.d"
__epm_pack()
{
local packname="$1"
local tarname="$2"
returntarname=''
local repackcode="$EPM_PACK_SCRIPTS_DIR/$packname.sh"
[ -x "$repackcode" ] || fatal "Can't find script $repackcode for packname $packname"
[ -f "$repackcode.rpmnew" ] && warning "There is .rpmnew file(s) in $EPM_PACK_SCRIPTS_DIR dir. The pack script can be outdated."
tmpdir=$(mktemp -d)
filefortarname="$tmpdir/filefortarname"
trap "rm -rf $tmpdir" EXIT
set_sudo
export SUDO
# TODO: inside () ?
export PATH=$PROGDIR:$PATH
local bashopt=''
[ -n "$verbose" ] && bashopt='-x'
#info "Running $($script --description 2>/dev/null) ..."
( unset EPMCURDIR ; docmd $CMDSHELL $bashopt $repackcode "$tarname" "$filefortarname" ) || fatal
returntarname="$(cat "$filefortarname")" || fatal "pack script $repackcode didn't set tarname"
rm -rf $tmpdir
[ -s "$returntarname" ] || fatal "pack script $repackcode didn't return tarname"
#local newname="$(basename "$returntarname")"
# now it is by default in the current dir
#if [ "$returntarname" != "$(realpath $newname)" ; then
# # repack put its result to the current dir
# mv -v $returntarname . || fatal
#fi
if [ -n "$download_only" ] ; then
return
fi
trap "rm -v $returntarname" EXIT
# FIXME: __epm_repack will drop trap
repacked_pkgs=''
# repack to our target
if __epm_repack_if_needed $returntarname ; then
[ -n "$repacked_pkgs" ] || fatal "Can't repack $returntarname"
# if repack is forced or repack rule (not disabled) is exists
elif [ -n "$repack" ] || [ -z "$norepack" ] && __epm_have_repack_rule $returntarname ; then
__epm_repack "$returntarname"
[ -n "$repacked_pkgs" ] || fatal "Can't repack $returntarname"
fi
if [ -n "$repacked_pkgs" ] ; then
rm -v $returntarname
mv -v $repacked_pkgs . || fatal
pkgname=$(pwd)/"$(basename $repacked_pkgs)"
else
pkgname="$returntarname"
fi
if [ -n "$install" ] ; then
trap "rm -v $pkgname" EXIT
docmd epm install $pkgname
return
fi
trap "" EXIT
}
epm_pack_help()
{
cat <<EOF
epm pack - create rpm package from files
Usage: epm pack [options] <packname> <tar|url|dir>
Options:
<packname> - receipt
<dir> - create tarball from the dir before
<url> - download tar from url
--install - install after pack result
--repack - force repack ever if returned package can be installed without repack
--download-only - save pack result and exit
--save-only - save repacked packages and exit (this is default behaviour)
EOF
}
epm_pack()
{
if [ "$1" = "-h" ] || [ "$1" = "--help" ] ; then
epm_pack_help
exit
fi
#TODO
trap "__epm_remove_tmp_files" EXIT
local packname="$1"
local tarname="$2"
[ -n "$packname" ] || fatal "run with packname, see --help"
if is_url "$tarname"; then
pkg_urls="$tarname"
load_helper epm-download
__handle_pkg_urls_to_install
# drop spaces and get full path
tarname="$(realpath $pkg_files)"
elif [ -d "$tarname" ] ; then
fatal "FIXME: implement packing of the dir $tarname?"
tarname=''
elif [ -s "$tarname" ] ; then
# get full path for real name
tarname="$(realpath "$tarname")"
else
# just pass name
true
fi
__epm_pack "$packname" "$tarname"
}