]> git.pld-linux.org Git - packages/rpm-build-tools.git/blame - builder.sh
run wget --help once
[packages/rpm-build-tools.git] / builder.sh
CommitLineData
10d92f71 1#!/bin/ksh
44058243 2#
dece74ed
AM
3# This program is free software, distributed under the terms of
4# the GNU General Public License Version 2.
5#
cd445739 6# -----------
cd445739 7# Exit codes:
2a5f078d 8# 0 - succesful
9# 1 - help displayed
10# 2 - no spec file name in cmdl parameters
11# 3 - spec file not stored in repo
12# 4 - some source, patch or icon files not stored in repo
13# 5 - package build failed
14# 6 - spec file with errors
15# 7 - wrong source in /etc/poldek.conf
16# 8 - Failed installing buildrequirements and subrequirements
17# 9 - Requested tag already exist
18# 10 - Refused to build fractional release
19# 100 - Unknown error (should not happen)
67963237 20# 110 - Functions not yet implemented
cd445739 21
f8e50be5 22# Notes (todo/bugs):
f8e50be5
ER
23# - when Icon: field is present, -5 and -a5 doesn't work
24# - builder -R skips installing BR if spec is not present before builder invocation (need to run builder twice)
19aa2571 25# - does not respect NoSource: X, and tries to cvs up such files [ example: VirtualBox-bin.spec and its Source0 ]
f8e50be5
ER
26# TODO:
27# - ability to do ./builder -bb foo.spec foo2.spec foo3.spec
1ffcdaff
ER
28# - funny bug, if source-md5 is set then builder will download from distfiles even if there is no url present:
29# Source10: forwardfix.pl
30# # Source10-md5: 8bf85f7368933a4e0cb4f875bac28733
6ca6f876
ZU
31# - builder --help:
32# basename: missing operand
33# Try `basename --help' for more information.
34# -- and the normal usage info --
35
9d99a240
ER
36PROGRAM=${0##*/}
37APPDIR=$(d=$0; [ -L "$d" ] && d=$(readlink -f "$d"); dirname "$d")
b1f2a05a 38VERSION="v0.35"
d43959a2 39VERSIONSTRING="\
b71f5024 40Build package utility from PLD Linux Packages repository
be93ada0 41$VERSION (C) 1999-2016 Free Penguins".
d43959a2 42
670b1ed4 43CLEAN_PATH="/bin:/usr/bin:/usr/sbin:/sbin:/usr/X11R6/bin"
b03f053b 44
b7cc0c94
ER
45# required rpm-build-macros
46RPM_MACROS_VER=1.534
47
cd445739 48COMMAND="build"
64ea5308 49TARGET=""
cd445739 50
bde1c404 51SPECFILE=""
d287305c 52BE_VERBOSE=""
4003ad8c 53QUIET=""
cd445739
AM
54CLEAN=""
55DEBUG=""
56NOURLS=""
cd445739
AM
57NOCVSSPEC=""
58NODIST=""
47761337 59NOINIT=""
bc10f694 60PREFMIRRORS=""
cd445739 61UPDATE=""
cd445739
AM
62ADD5=""
63NO5=""
64ALWAYS_CVSUP=${ALWAYS_CVSUP:-"yes"}
cd445739 65
6c1b2e7d
PZ
66# use rpm 4.4.6+ digest format instead of comments if non-zero
67USEDIGEST=
68
e3aa6f5e
ER
69# user agent when fetching files
70USER_AGENT="PLD/Builder($VERSION)"
71
cd445739
AM
72# It can be used i.e. in log file naming.
73# See LOGFILE example.
74DATE=`date +%Y-%m-%d_%H-%M-%S`
75
7534a77d
ER
76# target arch, can also be used for log file naming
77TARGET=$(rpm -E %{_target})
78
01d8ce69 79# Note the *single* quotes, this allows using shell variables expanded at build time
cd445739
AM
80# Example: LOGFILE='../log.$PACKAGE_NAME'
81# Example: LOGFILE='../LOGS/log.$PACKAGE_NAME.$DATE'
d280fd97 82# Example: LOGFILE='$PACKAGE_NAME/$PACKAGE_NAME.$DATE.log'
f5687002 83# Example: LOGFILE='$PACKAGE_NAME.$DATE.log'
01d8ce69 84# Example: LOGFILE='.log.$PACKAGE_NAME-$PACKAGE_VERSION-$PACKAGE_RELEASE.$TARGET.$DATE'
cd445739
AM
85LOGFILE=''
86
12da9e3d
ER
87# use teeboth Perl wrapper
88# temporary option to disable if broken
89USE_TEEBOTH=yes
90
cd445739
AM
91LOGDIR=""
92LOGDIROK=""
93LOGDIRFAIL=""
94LASTLOG_FILE=""
95
96CHMOD="no"
1da227e8 97CHMOD_MODE="0644"
cd445739 98RPMOPTS=""
d1c5a9a7 99RPMBUILDOPTS=""
cd445739
AM
100BCOND=""
101GROUP_BCONDS="no"
ccffa567
ER
102
103# create symlinks for tools in PACKAGE_DIR, see get_spec()
2dd0af86 104SYMLINK_TOOLS="no"
d287305c 105
106PATCHES=""
107SOURCES=""
cd445739 108ICONS=""
d287305c 109PACKAGE_RELEASE=""
110PACKAGE_VERSION=""
111PACKAGE_NAME=""
14bead22 112ASSUMED_NAME=""
fd71d65c 113PROTOCOL="http"
6d641507 114IPOPT=""
2060f498
AM
115
116# use lftp by default when available
f4bac425 117USE_LFTP=
2060f498 118lftp --version > /dev/null 2>&1 && USE_LFTP=yes
d4c8d3a9 119PARALLEL_DOWNLOADS=10
2060f498 120
cd445739 121WGET_RETRIES=${MAX_WGET_RETRIES:-0}
cd445739 122
939f2c12 123CVS_FORCE=""
f123bcb5 124CVSIGNORE_DF="yes"
cd445739 125CVSTAG=""
7446994b
KK
126GIT_SERVER="git://git.pld-linux.org"
127GIT_PUSH="git@git.pld-linux.org"
76636346 128PACKAGES_DIR="packages"
a8f917c2 129HEAD_DETACHED=""
3189511a 130DEPTH=""
3f79cb18 131ALL_BRANCHES=""
608c01a7 132REMOTE_PLD="origin"
406b9ecf 133NEW_REPO=""
939f2c12 134
cd445739
AM
135RES_FILE=""
136
cd445739 137DISTFILES_SERVER="://distfiles.pld-linux.org"
d4730dae 138ATTICDISTFILES_SERVER="://attic-distfiles.pld-linux.org"
cd445739 139
36d03934 140DEF_NICE_LEVEL=19
86aafdbe 141SCHEDTOOL="auto"
cd445739
AM
142
143FAIL_IF_NO_SOURCES="yes"
144
18e5347d
ER
145# let get_files skip over files which are present to get those damn files fetched
146SKIP_EXISTING_FILES="no"
147
975d7b23 148TRY_UPGRADE=""
257af81b
ER
149# should the specfile be restored if upgrade failed?
150REVERT_BROKEN_UPGRADE="yes"
151
90baf90b
ER
152if rpm --specsrpm 2>/dev/null; then
153 FETCH_BUILD_REQUIRES_RPMSPECSRPM="yes"
ce40491a 154 FETCH_BUILD_REQUIRES_RPMGETDEPS="no"
90baf90b
ER
155else
156 FETCH_BUILD_REQUIRES_RPMSPECSRPM="no"
157 if [ -x /usr/bin/rpm-getdeps ]; then
158 FETCH_BUILD_REQUIRES_RPMGETDEPS="yes"
159 else
160 FETCH_BUILD_REQUIRES_RPMGETDEPS="no"
161 fi
ab4a2b6e
ER
162fi
163
8a390970 164UPDATE_POLDEK_INDEXES_OPTS=""
90baf90b 165
cd445739
AM
166# Here we load saved user environment used to
167# predefine options set above, or passed to builder
168# in command line.
169# This one reads global system environment settings:
170if [ -f ~/etc/builderrc ]; then
171 . ~/etc/builderrc
172fi
173# And this one cascades settings using user personal
174# builder settings.
175# Example of ~/.builderrc:
176#
177#UPDATE_POLDEK_INDEXES="yes"
8a390970 178#UPDATE_POLDEK_INDEXES_OPTS="--mo=nodiff"
cd445739
AM
179#FETCH_BUILD_REQUIRES="yes"
180#REMOVE_BUILD_REQUIRES="force"
181#GROUP_BCONDS="yes"
182#LOGFILE='../LOGS/log.$PACKAGE_NAME.$DATE'
982e358c 183#TITLECHANGE=no
aa7e48da
ER
184
185SU_SUDO="sudo"
186
cd445739
AM
187if [ -n "$HOME_ETC" ]; then
188 USER_CFG="$HOME_ETC/.builderrc"
20117088 189 BUILDER_MACROS="$HOME_ETC/.builder-rpmmacros"
cd445739
AM
190else
191 USER_CFG=~/.builderrc
20117088 192 BUILDER_MACROS=~/.builder-rpmmacros
cd445739
AM
193fi
194
195[ -f "$USER_CFG" ] && . "$USER_CFG"
196
86aafdbe
ER
197if [ "$SCHEDTOOL" = "auto" ]; then
198 if [ -x /usr/bin/schedtool ] && schedtool -B -e echo >/dev/null; then
199 SCHEDTOOL="schedtool -B -e"
200 else
201 SCHEDTOOL="no"
202 fi
203fi
204
ca2e6c31 205if [ -n "$USE_PROZILLA" ]; then
6d641507 206 GETURI=download_proz
ca2e6c31 207elif [ -n "$USE_AXEL" ]; then
6d641507 208 GETURI=download_axel
9639be96 209elif [ -n "$USE_LFTP" ]; then
9639be96 210 GETURI=download_lftp
ca2e6c31 211else
6d641507 212 GETURI=download_wget
2bc5451f 213fi
11468b23 214
e0c78ad6 215GETLOCAL=${GETLOCAL:-cp -a}
11468b23 216
ac128191
JR
217RPM="rpm"
218RPMBUILD="rpmbuild"
11468b23 219
c86939e2 220#
221# sanity checks
222#
223if [ -d $HOME/rpm/SOURCES ]; then
224 echo "ERROR: ~/rpm/{SPECS,SOURCES} structure is obsolete" >&2
225 echo "ERROR: get rid of your ~/rpm/SOURCES" >&2
226 exit 1
227fi
228
a8c9a155 229POLDEK_INDEX_DIR="$($RPM --eval %_rpmdir)/"
aa7e48da 230POLDEK_CMD="$SU_SUDO /usr/bin/poldek"
11468b23 231
12da9e3d 232# TODO: add teeboth
aa7e48da 233# TODO: what this function does?
f6711e2a 234run_poldek() {
390d081d 235 RES_FILE=$(tempfile)
cd445739
AM
236 if [ -n "$LOGFILE" ]; then
237 LOG=`eval echo $LOGFILE`
238 if [ -n "$LASTLOG_FILE" ]; then
239 echo "LASTLOG=$LOG" > $LASTLOG_FILE
240 fi
aa7e48da 241 (${NICE_COMMAND} ${POLDEK_CMD} --noask `while test $# -gt 0; do echo "$1 ";shift;done` ; echo $? > ${RES_FILE})|tee -a $LOG
12da9e3d 242 # FIXME $exit_pldk undefined
cd445739
AM
243 return $exit_pldk
244 else
aa7e48da 245 (${NICE_COMMAND} ${POLDEK_CMD} --noask `while test $# -gt 0; do echo "$1 ";shift;done` ; echo $? > ${RES_FILE}) 1>&2 >/dev/null
cd445739
AM
246 return `cat ${RES_FILE}`
247 rm -rf ${RES_FILE}
248 fi
249}
250
cd445739
AM
251#---------------------------------------------
252# functions
da946cd6 253
6d641507
AM
254download_prozilla() {
255 local outfile=$1 url=$2 retval
256
257 proz --no-getch -r -P ./ -t$WGET_RETRIES $PROZILLA_OPTS -O "$outfile" "$url"
258 retval=$?
259
260 return $retval
261}
262
263download_axel() {
264 local outfile=$1 url=$2 retval
265
266 axel -a $AXEL_OPTS -o "$outfile" "$url"
267 retval=$?
268
269 return $retval
270}
271
272download_wget() {
20494437 273 local outfile=$1 url=$2 retval wget_help
94750043 274 if [ -z "${WGET_OPTS_SET+x}" ]; then
20494437
JP
275 wget_help="$(wget --help 2>&1)"
276 echo "$wget_help" | grep -q -- ' --no-check-certificate ' && WGET_OPTS="$WGET_OPTS --no-check-certificate"
277 echo "$wget_help" | grep -q -- ' --inet ' && WGET_OPTS="$WGET_OPTS --inet"
278 echo "$wget_help" | grep -q -- ' --retry-connrefused ' && WGET_OPTS="$WGET_OPTS --retry-connrefused"
279 echo "$wget_help" | grep -q -- ' --no-iri ' && WGET_OPTS="$WGET_OPTS --no-iri"
94750043
JP
280 WGET_OPTS="-c -nd -t$WGET_RETRIES $WGET_OPTS --user-agent=$USER_AGENT $IPOPT --passive-ftp"
281 WGET_OPTS_SET=1
282 fi
6d641507 283
94750043 284 wget $WGET_OPTS -O "$outfile" "$url"
6d641507
AM
285 retval=$?
286 if [ $retval -ne 0 ]; then
287 if [ "`echo $url | grep -E 'ftp://'`" ]; then
288 ${GETURI} -O "$outfile" "$url"
289 retval=$?
290 fi
291 fi
292 return $retval
293}
294
f4bac425 295download_lftp() {
6928bb29 296 local outfile=$1 url=$2 retval tmpfile
72b75eec 297 tmpfile=$(tempfile) || exit 1
4d1fc6ce
AM
298 lftp -c "
299 $([ "$DEBUG" = "yes" ] && echo "debug 5;")
6d641507
AM
300 $([ "$IPOPT" = "-4" ] && echo "set dns:order \"inet\";")
301 $([ "$IPOPT" = "-6" ] && echo "set dns:order \"inet6\";")
78ff632e 302 set ssl:verify-certificate no;
4d1fc6ce
AM
303 set net:max-retries $WGET_RETRIES;
304 set http:user-agent \"$USER_AGENT\";
d4c8d3a9 305 pget -n $PARALLEL_DOWNLOADS -c \"$url\" -o \"$tmpfile\"
4d1fc6ce 306 "
f4bac425
ER
307
308 retval=$?
309 if [ $retval -eq 0 ]; then
310 mv -f "$tmpfile" "$outfile"
311 else
312 rm -f "$tmpfile"
313 fi
314 return $retval
315}
316
f6711e2a 317usage() {
cd445739 318 if [ -n "$DEBUG" ]; then set -xv; fi
647fead0
ER
319# NOTE:
320# to make this output parseable by bash-completion _parse_help()
321# if the line contains short and long option, it will take only the long option
322# but if you want both being completed, put the short option to separate line
cd445739 323 echo "\
3f79cb18 324Usage: builder [--all-branches] [-D|--debug] [-V|--version] [--short-version] [-a|--add_cvs] [-b|-ba|--build]
6594293d 325[-bb|--build-binary] [-bs|--build-source] [-bc] [-bi] [-bl] [-u|--try-upgrade]
0c8e5e9d 326[{-cf|--cvs-force}] [{-B|--branch} <branch>] [--depth <number>]
fd71d65c 327[-g|--get] [-h|--help] [--ftp] [--http] [{-l|--logtofile} <logfile>] [-m|--mr-proper]
ccb03bc0 328[-q|--quiet] [--date <yyyy-mm-dd> [-r <tag>] [{-T|--tag <tag>]
a7b2951c 329[-Tvs|--tag-version-stable] [-Ts|--tag-stable] [-Tv|--tag-version]
b3b584c5 330[{-Tp|--tag-prefix} <prefix>] [{-tt|--test-tag}]
6594293d 331[-nu|--no-urls] [-v|--verbose] [--opts <rpm opts>] [--short-circuit]
3009b80d 332[--show-bconds] [--with/--without <feature>] [--define <macro> <value>]
ccb03bc0 333<package>[.spec][:tag]
2a5f078d 334
647fead0
ER
335-4 - force IPv4 when transferring files
336-6 - force IPv6 when transferring files
337-5,
338--update-md5 - update md5 comments in spec, implies -nd -ncs
339-a5,
340--add-md5 - add md5 comments to URL sources, implies -nc -nd -ncs
4ca1edbd 341--all-branches - make shallow fetch of all branches; --depth required
cd445739 342-n5, --no-md5 - ignore md5 comments in spec
9243e80b
ER
343-D, --debug - enable builder script debugging mode,
344-debug - produce rpm debug package (same as --opts -debug)
d43959a2
ER
345-V, --version - output builder version string
346--short-version - output builder short version
647fead0
ER
347-a - try add new package to PLD repo.
348-b,
349-ba
350 - get all files from PLD repo or HTTP/FTP and build package
cd445739 351 from <package>.spec,
647fead0 352-bb - get all files from PLD repo or HTTP/FTP and build binary
cd445739 353 only package from <package>.spec,
647fead0 354-bp - execute the %prep phase of <package>.spec,
6594293d
AG
355-bc - execute the %build phase of <package>.spec,
356-bi - execute the %install phase of <package>.spec
4ca1edbd 357-bl - execute the %files phase of <package>.spec
647fead0 358-bs - get all files from PLD repo or HTTP/FTP and only pack
cd445739 359 them into src.rpm,
6594293d 360--short-circuit - short-circuit build
cd445739 361-B, --branch - add branch
647fead0
ER
362-c,
363--clean - clean all temporarily created files (in BUILD\$RPM_BUILD_ROOT) after rpmbuild commands.
387eaf99 364 may be used with building process.
6f10b394 365-m, --mr-proper - clean all temporarily created files (in BUILD, SOURCES,
4ca1edbd
KK
366 SPECS and \$RPM_BUILD_ROOT). Doesn't run any rpm building.
367-cf, --cvs-force - use -f when tagging
eccfb714 368--define '<macro> <value>'
cd445739 369 - define a macro <macro> with value <value>,
4ca1edbd 370--depth <number> - make shallow fetch
44058243
ER
371--alt_kernel <kernel>
372 - same as --define 'alt_kernel <kernel>'
cd445739 373--nodeps - rpm won't check any dependences
647fead0
ER
374-g
375--get - get <package>.spec and all related files from PLD repo
cd445739 376-h, --help - this message,
647fead0
ER
377-j N - set %_smp_mflags to propagate concurrent jobs
378--ftp - use FTP protocol to access distfiles server
379--http - use HTTP protocol to access distfiles server
380-l <logfile>, --logtofile=<logfile>
cd445739 381 - log all to file,
cd445739 382-ncs, --no-cvs-specs
ccb03bc0 383 - don't pull from PLD repo
cd445739
AM
384-nd, --no-distfiles - don't download from distfiles
385-nm, --no-mirrors - don't download from mirror, if source URL is given,
386-nu, --no-urls - don't try to download from FTP/HTTP location,
7cbc2d88 387-ns, --no-srcs - don't download Sources/Patches
cd445739
AM
388-ns0, --no-source0 - don't download Source0
389-nn, --no-net - don't download anything from the net
647fead0 390-p N - set PARALLEL_DOWNLOADS to N (default $PARALLEL_DOWNLOADS)
4ca1edbd
KK
391-pm, --prefer-mirrors
392 - prefer mirrors (if any) over distfiles for SOURCES
b572253e 393--no-init - don't initialize builder paths (SPECS and SOURCES)
18e5347d 394-ske,
4ca1edbd
KK
395--skip-existing-files
396 - skip existing files in get_files
cd445739
AM
397--opts <rpm opts> - additional options for rpm
398-q, --quiet - be quiet,
ccb03bc0
KK
399--date yyyy-mm-dd - build package using resources from specified date,
400-r <tag>, --cvstag <ref>
401 - build package using resources from specified branch/tag,
5053a974 402-A - build package using master branch as any sticky tags/branch/date being reset.
cd445739
AM
403-R, --fetch-build-requires
404 - fetch what is BuildRequired,
405-RB, --remove-build-requires
406 - remove all you fetched with -R or --fetch-build-requires
407 remember, this option requires confirmation,
408-FRB, --force-remove-build-requires
409 - remove all you fetched with -R or --fetch-build-requires
410 remember, this option works without confirmation,
4ca1edbd
KK
411-sd, --source-distfiles
412 - list sources available from distfiles (intended for offline
06541433
JR
413 operations; does not work when Icon field is present
414 but icon file is absent),
4ca1edbd
KK
415-sc, --source-cvs - list sources available from PLD repo
416-sdp, --source-distfiles-paths
417 - list sources available from distfiles -
06541433
JR
418 paths relative to distfiles directory (intended for offline
419 operations; does not work when Icon field is present
420 but icon file is absent),
a7eefc54 421-sf, --source-files - list sources - bare filenames (intended for offline
422 operations; does not work when Icon field is present
3621e588 423 but icon file is absent),
4ca1edbd
KK
424-lsp, --source-paths
425 - list sources - filenames with full local paths (intended for
a7eefc54 426 offline operations; does not work when Icon field is present
3621e588 427 but icon file is absent),
2dddf439
ER
428-su, --source-urls - list urls - urls to sources and patches
429 intended for copying urls with spec with lots of macros in urls
ccb03bc0
KK
430-T <tag> , --tag <tag>
431 - add git tag <tag> for files,
cd445739 432-Tvs, --tag-version-stable
ccb03bc0 433 - add git tags STABLE and NAME-VERSION-RELEASE for files,
cd445739 434-Ts, --tag-stable
ccb03bc0 435 - add git tag STABLE for files,
647fead0
ER
436-Tv,
437--tag-version - add git tag NAME-VERSION-RELEASE for files,
cd445739
AM
438-Tp, --tag-prefix <prefix>
439 - add <prefix> to NAME-VERSION-RELEASE tags,
440-tt, --test-tag <prefix>
441 - fail if tag is already present,
50321881
JK
442-ir, --integer-release-only
443 - allow only integer and snapshot releases
cd445739
AM
444-v, --verbose - be verbose,
445-u, --try-upgrade - check version, and try to upgrade package
446-un, --try-upgrade-with-float-version
447 - as above, but allow float version
4ca1edbd 448 php-pear-Services_Digg/
0907f1eb 449--upgrade-version - upgrade to specified version in try-upgrade
deccc50e 450-U, --update - refetch sources, don't use distfiles, and update md5 comments
cd445739
AM
451-Upi, --update-poldek-indexes
452 - refresh or make poldek package index files.
647fead0
ER
453-sp <patchnumber>,
454--skip-patch <patchnumber>
8bd5e66d 455 - don't apply <patchnumber>. may be repeated.
647fead0
ER
456-np <patchnumber>,
457--nopatch <patchnumber>
8bd5e66d 458 - abort instead of applying patch <patchnumber>
fc8edbe5
ER
459--noinit
460 - do not initialize SPECS_DIR and SOURCES_DIR (set them to .)
dfe2cb9a
MK
461--show-bconds - show available conditional builds, which can be used
462 - with --with and/or --without switches.
b05205af
BZ
463--show-bcond-args - show active bconds, from ~/.bcondrc. this is used by ./repackage.sh script.
464 In other words, the output is parseable by scripts.
24a97174 465--show-avail-bconds - show available bconds
647fead0
ER
466--with <feature>,
467--without <feature>
cd445739
AM
468 - conditional build package depending on %_with_<feature>/
469 %_without_<feature> macro switch. You may now use
470 --with feat1 feat2 feat3 --without feat4 feat5 --with feat6
471 constructions. Set GROUP_BCONDS to yes to make use of it.
6dd19291 472--target <platform>, --target=<platform>
a6494cd4 473 - build for platform <platform>.
5eb1d24b
ER
474--init-rpm-dir, --init
475 - initialize ~/rpm directory structure
5a491465 476"
477}
478
390d081d
ER
479# create tempfile. as secure as possible
480tempfile() {
aa7e48da
ER
481 local prefix=builder.$PACKAGE_NAME${1:+.$1}
482 mktemp --tmpdir -t $prefix.XXXXXX || echo ${TMPDIR:-/tmp}/$prefix.$RANDOM.$$
390d081d
ER
483}
484
397fa865 485tempdir() {
aa7e48da
ER
486 local prefix=builder.$PACKAGE_NAME${1:+.$1}
487 mktemp --tmpdir -d $prefix.XXXXXX
397fa865
KK
488}
489
8cc8f5c0 490# inserts git log instead of %changelog
053a88fc 491# @output directory containing modified specfile
8cc8f5c0 492insert_gitlog() {
397fa865 493 local SPECFILE=$1 specdir=$(tempdir) gitlog=$(tempfile) speclog=$(tempfile)
8cc8f5c0
ER
494
495 # allow this being customized
496 local log_entries=$(rpm -E '%{?_buildchangelogtruncate}')
497
498 # rpm5.org/rpm.org do not parse any other date format than 'Wed Jan 1 1997'
499 # otherwise i'd use --date=iso here
500 # http://rpm5.org/cvs/fileview?f=rpm/build/parseChangelog.c&v=2.44.2.1
b34dcd91 501 # http://rpm.org/gitweb?p=rpm.git;a=blob;f=build/parseChangelog.c;h=56ba69daa41d65ec9fd18c9f371b8ff14118cdca;hb=a113baa510a004476edc44b5ebaaf559238a18b6#l33
8cc8f5c0
ER
502 # NOTE: changelog date is always in UTC for rpmbuild
503 # * 1265749244 +0000 Random Hacker <nikt@pld-linux.org> 9370900
9fd1eb80 504 git rev-list --date-order -${log_entries:-20} HEAD 2>/dev/null | while read sha1; do
f8704064 505 local logfmt='%B%n'
31f3bc1c
ER
506 git notes list $sha1 > /dev/null 2>&1 && logfmt='%N'
507 git log -n 1 $sha1 --format=format:"* %ad %an <%ae> %h%n- ${logfmt}%n" --date=raw | sed -re 's/^- +- */- /'| sed '/^$/q'
9c0fe78c 508 done > $gitlog
9e269b3c
ER
509
510 # add link to full git logs
e93ee6d9 511 local giturl="http://git.pld-linux.org/?p=packages/${SPECFILE%.spec}.git;a=log"
9e269b3c
ER
512 if [ -n "$CVSTAG" ]; then
513 giturl="$giturl;h=$CVSTAG"
514 fi
515 local gitauthor="PLD Linux Team <feedback@pld-linux.org>"
516 LC_ALL=C gawk -vgiturl="$giturl" -vgitauthor="$gitauthor" -vpackage=$PACKAGE_NAME 'BEGIN{
517 printf("* %s %s\n- For complete changelog see: %s\n", strftime("%a %b %d %Y"), gitauthor, giturl);
518 print;
519 exit
520 }' > $speclog
521
522 LC_ALL=C gawk '/^\* /{printf("* %s %s\n", strftime("%a %b %d %Y", $2), substr($0, length($1)+length($2)+length($3)+4)); next}{print}' $gitlog >> $speclog
8cc8f5c0
ER
523 sed '/^%changelog/,$d' $SPECFILE | sed -e "\${
524 a%changelog
525 r $speclog
526 }
397fa865 527 " > $specdir/$SPECFILE
8cc8f5c0 528 rm -f $gitlog $speclog
397fa865 529 echo $specdir
8cc8f5c0
ER
530}
531
12da9e3d
ER
532# @param string logfile
533# @param varargs... commands to execute
534teeboth() {
535 local rc
536 # use teeboth from toys/cleanbuild, if available and enabled
537 if [ "$USE_TEEBOTH" = "yes" ] && [ -x $APPDIR/teeboth ]; then
538 $APPDIR/teeboth "$@"
539 rc=$?
540 else
541 local efile rc logfile=$1; shift
542 if [ "$logfile" ]; then
543 efile=$(tempfile)
806a7b72 544 { "$@" 2>&1; echo $? > $efile; } | tee -a $logfile
12da9e3d
ER
545 rc=$(< $efile)
546 rm -f $efile
547 else
551a62ae 548 "$@"
12da9e3d
ER
549 rc=$?
550 fi
551 fi
552 return $rc
553}
554
31d2bd0b
ER
555# change dependency to specname
556# common changes:
557# - perl(Package::Name) -> perl-Package-Name
558depspecname() {
aa7e48da
ER
559 local DEPS
560
561 if [ $# -gt 0 ]; then
562 DEPS="$@"
563 else
564 DEPS=$(cat)
565 fi
566
567 echo "$DEPS" | tr ' ' '\n' | sed -re '
568 # perl virtual deps
569 /perl\(.*\)/{
570 s/perl\((.*)\)/perl-\1/
571 s/::/-/g
572 }
31d2bd0b 573
aa7e48da
ER
574 s/apache\(EAPI\)-devel/apache-devel/
575
576 s/db-devel/db5.3-devel/
577 s/libjpeg-devel/libjpeg-turbo-devel/
578 '
31d2bd0b
ER
579}
580
c890b916 581update_shell_title() {
6c40c5a2 582 [ -t 2 ] || return
0b65d15e 583 local len=${COLUMNS:-80}
5c795f16 584 local msg="$(echo "$*" | cut -c-$len)"
0b65d15e 585
e225de91
ER
586 if [ -n "$BE_VERBOSE" ]; then
587 echo >&2 "$(date +%s.%N) $*"
588 fi
589
5c795f16 590 if [ "x$TITLECHANGE" = "xyes" -o "x$TITLECHANGE" = "x" ]; then
138bbc98
ER
591 local pkg
592 if [ -n "$PACKAGE_NAME" ]; then
593 pkg=${PACKAGE_NAME}-${PACKAGE_VERSION}-${PACKAGE_RELEASE}
594 else
595 pkg=${SPECFILE}
596 fi
597
598 msg="$pkg: ${SHELL_TITLE_PREFIX:+$SHELL_TITLE_PREFIX }$msg"
a8c9a155 599 msg=$(echo $msg | tr -d '\n\r')
982e358c
MP
600 case "$TERM" in
601 cygwin|xterm*)
602 echo >&2 -ne "\033]1;$msg\007\033]2;$msg\007"
603 ;;
604 screen*)
605 echo >&2 -ne "\033]0;$msg\007"
606 ;;
607 esac
608 fi
c890b916
ER
609}
610
7e40520f
ER
611# set TARGET from BuildArch: from SPECFILE
612set_spec_target() {
ce40491a 613 if [ -n "$SPECFILE" ] && [ -z "$TARGET" ]; then
8c91ee46 614 local tmp=$(awk '/^BuildArch:/ { print $NF; exit }' $ASSUMED_NAME/$SPECFILE)
ce40491a 615 if [ "$tmp" ]; then
8c91ee46 616 local target_platform=$(rpm -E '%{_target_vendor}-%{_target_os}%{?_gnu}')
7e40520f
ER
617 TARGET="$tmp"
618 case "$RPMBUILD" in
619 "rpmbuild")
f9109a96 620 TARGET_SWITCH="--target ${TARGET}-${target_platform}" ;;
7e40520f 621 "rpm")
ce40491a 622 TARGET_SWITCH="--target=$TARGET" ;;
7e40520f 623 esac
ce40491a
ER
624 fi
625 fi
7e40520f
ER
626}
627
ace3fd80
ER
628# runs rpm with minimal macroset
629minirpm() {
ace3fd80 630 # TODO: move these to /usr/lib/rpm/macros
20117088 631 cat > $BUILDER_MACROS <<'EOF'
5b5e5f7f 632%x8664 x86_64 amd64 ia32e
f78a0bb7 633%alt_kernel %{nil}
634%_alt_kernel %{nil}
5ff15c97 635%bootstrap_release() %{1}
407b204b
ER
636%requires_releq_kernel_up(s:n:) %{nil}
637%requires_releq_kernel_smp(s:n:) %{nil}
638%requires_releq_kernel(s:n:) %{nil}
6b8134e3 639%requires_releq() %{nil}
bb01dee9 640%pyrequires_eq() %{nil}
559d511f 641%requires_eq() %{nil}
c13be3d1 642%requires_eq_to() %{nil}
99c05e13 643%requires_ge() %{nil}
500b0eb8
ER
644%requires_ge_to() %{nil}
645%requires_ge() %{nil}
407b204b
ER
646%releq_kernel_up(n:) ERROR
647%releq_kernel_smp(n:) ERROR
648%releq_kernel(n:) ERROR
e94e25f9 649%py_postclean(x:) ERROR
74d9fd14 650%kgcc_package ERROR
237bd3f1 651%_fontsdir ERROR
7141278d 652%ruby_version ERROR
653%ruby_ver_requires_eq() %{nil}
654%ruby_mod_ver_requires_eq() %{nil}
c13be3d1 655%__php_api_requires() %{nil}
7141278d 656%php_major_version ERROR
657%php_api_version ERROR
99f819cf
AM
658%requires_xorg_xserver_extension %{nil}
659%requires_xorg_xserver_xinput %{nil}
660%requires_xorg_xserver_font %{nil}
661%requires_xorg_xserver_videodrv %{nil}
7141278d 662%py_ver ERROR
41035426
ER
663%perl_vendorarch ERROR
664%perl_vendorlib ERROR
703ae20b
ER
665# damn. need it here! - copied from /usr/lib/rpm/macros.build
666%tmpdir %(echo "${TMPDIR:-/tmp}")
1f28fcb7
ER
667%patchset_source(f:b:) %(
668 base=%{-b*}%{!-b*:10000};
669 start=$(expr $base + %1);
670 end=$(expr $base + %{?2}%{!?2:%{1}});
671 # we need to call seq twice as it doesn't allow two formats
672 seq -f 'Patch%g:' $start $end > %{tmpdir}/__ps1;
673 seq -f '%{-f*}' %1 %{?2}%{!?2:%{1}} > %{tmpdir}/__ps2;
674 paste %{tmpdir}/__ps{1,2};
675 rm -f %{tmpdir}/__ps{1,2};
676) \
677%{nil}
991f09a5
ER
678%add_etc_shells(p) %{p:<lua>}
679%remove_etc_shells(p) %{p:<lua>}
709995c4
ER
680%lua_add_etc_shells() %{nil}
681%lua_remove_etc_shells() %{nil}
5adfcd17 682%required_jdk jdk
0ca65fa4 683%buildrequires_jdk %{nil}
f9063abe 684%pear_package_print_optionalpackages %{nil}
fb198857 685EOF
3d12d055 686 if [ "$NOINIT" = "yes" ] ; then
20117088 687 cat >> $BUILDER_MACROS <<'EOF'
3d12d055
JR
688%_specdir ./
689%_sourcedir ./
690EOF
c039643c 691 fi
4a857a1f 692 if rpm --version 2>&1 | grep -qE '5\.[0-9]+\.[0-9]+'; then
ac128191
JR
693 safe_macrofiles=$(rpm $TARGET_SWITCH --showrc | awk -F: '/^macrofiles/ { gsub(/^macrofiles[ \t]+:/, "", $0); print $0 } ')
694 eval PATH=$CLEAN_PATH $RPMBUILD $TARGET_SWITCH --macros "$safe_macrofiles:$BUILDER_MACROS" $QUIET $RPMOPTS $RPMBUILDOPTS $BCOND $* 2>&1
695 else
696 eval PATH=$CLEAN_PATH $RPMBUILD $TARGET_SWITCH --load "$BUILDER_MACROS" $QUIET $RPMOPTS $RPMBUILDOPTS $BCOND $* 2>&1
697 fi
ace3fd80
ER
698}
699
700cache_rpm_dump() {
701 if [ -n "$DEBUG" ]; then
702 set -x
703 set -v
704 fi
705
d1d24c14 706 if [ -x /usr/bin/rpm-specdump ]; then
525bf240 707 update_shell_title "cache_rpm_dump using rpm-specdump command"
646d81cf 708 rpm_dump_cache=$(rpm-specdump $TARGET_SWITCH $BCOND --define "_specdir $PACKAGE_DIR" --define "_sourcedir $PACKAGE_DIR" $PACKAGE_DIR/$SPECFILE)
d1d24c14 709 else
525bf240 710 update_shell_title "cache_rpm_dump using rpmbuild command"
d1d24c14
ER
711 local rpm_dump
712 rpm_dump=`
713 # what we need from dump is NAME, VERSION, RELEASE and PATCHES/SOURCES.
714 dump='%{echo:dummy: PACKAGE_NAME %{name} }%dump'
715 case "$RPMBUILD" in
716 rpm)
717 ARGS='-bp'
718 ;;
719 rpmbuild)
720 ARGS='--nodigest --nosignature --nobuild'
721 ;;
722 esac
723 minirpm $ARGS --define "'prep $dump'" --nodeps $SPECFILE
724 `
725 if [ $? -gt 0 ]; then
726 error=$(echo "$rpm_dump" | sed -ne '/^error:/,$p')
727 echo "$error" >&2
728 Exit_error err_build_fail
729 fi
d05e8080 730
d1d24c14
ER
731 # make small dump cache
732 rpm_dump_cache=`echo "$rpm_dump" | awk '
733 $2 ~ /^SOURCEURL/ {print}
734 $2 ~ /^PATCHURL/ {print}
735 $2 ~ /^nosource/ {print}
736 $2 ~ /^PACKAGE_/ {print}
737 '`
738 fi
d05e8080 739
13974367 740 update_shell_title "cache_rpm_dump: OK!"
cd445739
AM
741}
742
ace3fd80 743rpm_dump() {
cd445739 744 if [ -z "$rpm_dump_cache" ] ; then
45e2a818 745 echo >&2 "internal error: cache_rpm_dump not called! (missing %prep?)"
cd445739
AM
746 fi
747 echo "$rpm_dump_cache"
748}
749
f6711e2a 750get_icons() {
d05e8080 751 update_shell_title "get icons"
9d99a240 752 ICONS=$(awk '/^Icon:/ {print $2}' $PACKAGE_DIR/${SPECFILE})
d05e8080
ER
753 if [ -z "$ICONS" ]; then
754 return
755 fi
756
975d7b23 757 rpm_dump_cache="kalasaba" NODIST="yes" get_files $ICONS
d05e8080
ER
758}
759
f6711e2a 760parse_spec() {
af4d5315 761 update_shell_title "parsing specfile"
cd445739 762 if [ -n "$DEBUG" ]; then
518ff1fb
ER
763 set -x
764 set -v
cd445739 765 fi
b2975fc3 766
d05e8080 767 # icons are needed for successful spec parse
518ff1fb 768 get_icons
d05e8080 769
9c909460 770 cd $PACKAGE_DIR
cd445739 771 cache_rpm_dump
00fcec7e 772
15e34b63 773 if rpm_dump | grep -qEi ":.*nosource.*1"; then
cd445739
AM
774 FAIL_IF_NO_SOURCES="no"
775 fi
776
7cbc2d88
ER
777 if [ "$NOSRCS" != "yes" ]; then
778 SOURCES=$(rpm_dump | awk '$2 ~ /^SOURCEURL[0-9]+/ {print substr($2, length("SOURCEURL") + 1), $3}' | LC_ALL=C sort -n | awk '{print $2}')
779 PATCHES=$(rpm_dump | awk '$2 ~ /^PATCHURL[0-9]+/ {print substr($2, length("PATCHURL") + 1), $3}' | LC_ALL=C sort -n | awk '{print $2}')
780 ICONS=$(awk '/^Icon:/ {print $2}' ${SPECFILE})
781 fi
782
dfe2b2d9
ER
783 PACKAGE_NAME=$(rpm_dump | awk '$2 == "PACKAGE_NAME" { print $3; exit}')
784 PACKAGE_VERSION=$(rpm_dump | awk '$2 == "PACKAGE_VERSION" { print $3; exit}')
785 PACKAGE_RELEASE=$(rpm_dump | awk '$2 == "PACKAGE_RELEASE" { print $3; exit}')
78eab2a1 786
0b4119a2 787 if [ "$PACKAGE_NAME" != "$ASSUMED_NAME" ]; then
7854d40c 788 echo >&2 "WARNING! Spec name ($ASSUMED_NAME) does not agree with package name ($PACKAGE_NAME)"
0b4119a2
JR
789 fi
790
cd445739
AM
791 if [ -n "$BE_VERBOSE" ]; then
792 echo "- Sources : `nourl $SOURCES`"
793 if [ -n "$PATCHES" ]; then
794 echo "- Patches : `nourl $PATCHES`"
795 else
796 echo "- Patches : *no patches needed*"
797 fi
798 if [ -n "$ICONS" ]; then
799 echo "- Icon : `nourl $ICONS`"
800 else
801 echo "- Icon : *no package icon*"
802 fi
803 echo "- Name : $PACKAGE_NAME"
804 echo "- Version : $PACKAGE_VERSION"
805 echo "- Release : $PACKAGE_RELEASE"
806 fi
13974367
ER
807
808 update_shell_title "parse_spec: OK!"
cd445739
AM
809}
810
aa7e48da
ER
811# aborts program abnormally
812die() {
813 local rc=${2:-1}
814 echo >&2 "$PROGRAM: ERROR: $*"
815 exit $rc
816}
817
f6711e2a 818Exit_error() {
cd445739 819 if [ -n "$DEBUG" ]; then
518ff1fb
ER
820 set -x
821 set -v
cd445739
AM
822 fi
823
824 cd "$__PWD"
825
826 case "$1" in
827 "err_no_spec_in_cmdl" )
828 remove_build_requires
45e2a818 829 echo >&2 "ERROR: spec file name not specified."
cd445739 830 exit 2 ;;
a08d92fc 831 "err_invalid_cmdline" )
45e2a818 832 echo >&2 "ERROR: invalid command line arg ($2)."
a08d92fc 833 exit 2 ;;
cd445739
AM
834 "err_no_spec_in_repo" )
835 remove_build_requires
e55ef62b
ER
836 echo >&2 "Error: spec file not stored in repository."
837 if [ -n "$2" ]; then
838 echo >&2 "Tried: $2"
839 fi
840
cd445739
AM
841 exit 3 ;;
842 "err_no_source_in_repo" )
843 remove_build_requires
bba21388 844 echo >&2 "Error: some source, patch or icon files not stored in PLD repo. ($2)"
cd445739 845 exit 4 ;;
703b6deb 846 "err_cvs_add_failed" )
bba21388 847 echo >&2 "Error: failed to add package to PLD repo."
703b6deb 848 exit 4 ;;
cd445739
AM
849 "err_build_fail" )
850 remove_build_requires
45e2a818 851 echo >&2 "Error: package build failed. (${2:-no more info})"
cd445739 852 exit 5 ;;
78eab2a1
AM
853 "err_no_package_data" )
854 remove_build_requires
45e2a818 855 echo >&2 "Error: couldn't get out package name/version/release from spec file."
78eab2a1 856 exit 6 ;;
ce40491a 857 "err_tag_exists" )
50321881 858 remove_build_requires
d2842af2 859 echo >&2 "Tag ${2} already exists"
50321881 860 exit 9 ;;
ce40491a 861 "err_fract_rel" )
50321881 862 remove_build_requires
45e2a818 863 echo >&2 "Release ${2} not integer and not a snapshot."
50321881 864 exit 10 ;;
fb96e0b5
AM
865 "err_branch_exists" )
866 remove_build_requires
45e2a818 867 echo >&2 "Tree branch already exists (${2})."
fb96e0b5 868 exit 11 ;;
cfc497c0
ER
869 "err_acl_deny" )
870 remove_build_requires
45e2a818 871 echo >&2 "Error: conditions reject building this spec (${2})."
cfc497c0 872 exit 12 ;;
406b9ecf
KK
873 "err_remote_problem" )
874 remove_build_requires
875 echo >&2 "Error: problem with remote (${2})"
876 exit 13 ;;
6217f407
KK
877 "err_no_checkut" )
878 echo >&2 "Error: cannot checkout $2"
879 exit 14 ;;
67963237 880 "err_not_implemented" )
779fcca4 881 remove_build_requires
67963237
KK
882 echo >&2 "Error: functionality not yet imlemented"
883 exit 110 ;;
cd445739 884 esac
45e2a818 885 echo >&2 "Unknown error."
73848362 886 exit 100
cd445739
AM
887}
888
f6711e2a 889init_builder() {
cd445739 890 if [ -n "$DEBUG" ]; then
518ff1fb
ER
891 set -x
892 set -v
0dd6320d 893 fi
cd445739 894
4aeb9973 895 if [ "$NOINIT" != "yes" ] ; then
9c909460 896 TOP_DIR=$(eval $RPM $RPMOPTS --eval '%{_topdir}')
b7cc0c94 897
09bf17c9 898 local macros_ver=$(rpm -E %?rpm_build_macros)
b7cc0c94
ER
899 if [ -z "$macros_ver" ]; then
900 REPO_DIR=$TOP_DIR/packages
901 PACKAGE_DIR=$TOP_DIR/packages/$ASSUMED_NAME
902 else
903 if awk "BEGIN{exit($macros_ver>=$RPM_MACROS_VER)}"; then
904 echo >&2 "builder requires rpm-build-macros >= $RPM_MACROS_VER"
905 exit 1
906 fi
907 REPO_DIR=$TOP_DIR
908 PACKAGE_DIR=$REPO_DIR/$ASSUMED_NAME
909 fi
29e90b02 910 else
d723feca
ER
911 TOP_DIR=$(pwd)
912 PACKAGE_DIR=$TOP_DIR
5c41c44d 913 REPO_DIR=$PACKAGE_DIR
d723feca 914 RPMBUILDOPTS="$RPMBUILDOPTS --define '_topdir $TOP_DIR' --define '_builddir %_topdir' --define '_rpmdir %_topdir' --define '_srcrpmdir %_topdir'"
29e90b02 915 fi
52f3ced3
KK
916 export GIT_WORK_TREE=$PACKAGE_DIR
917 export GIT_DIR=$PACKAGE_DIR/.git
cd445739 918
acd0d41d 919 if [ -d "$GIT_DIR" ] && [ -z "$CVSTAG" ] && git rev-parse --verify -q HEAD > /dev/null; then
a095de80
KK
920 if CVSTAG=$(GIT_DIR=$GIT_DIR git symbolic-ref HEAD) 2>/dev/null; then
921 CVSTAG=${CVSTAG#refs/heads/}
922 if [ "$CVSTAG" != "master" ]; then
923 echo >&2 "builder: Active branch $CVSTAG. Use -r BRANCHNAME to override"
924 fi
925 else
926 echo >&2 "On detached HEAD. Use -r BRANCHNAME to override"
927 HEAD_DETACHED="yes"
928 fi
929 elif [ "$CVSTAG" = "HEAD" ]; then
930 # assume -r HEAD is same as -A
931 CVSTAG="master"
932 fi
933
a8c9a155 934 __PWD=$(pwd)
00fcec7e 935}
936
406b9ecf
KK
937create_git_repo() {
938 update_shell_title "add_package"
939
940 if [ -n "$DEBUG" ]; then
941 set -x
942 set -v
943 fi
944
945 cd "$REPO_DIR"
946 SPECFILE=$(basename $SPECFILE)
947 if [ ! -f "$ASSUMED_NAME/$SPECFILE" ]; then
948 echo "ERROR: No package to add ($ASSUMED_NAME/$SPECFILE)" >&2
949 exit 101
950 fi
951 [ -d "$ASSUMED_NAME/.git" ] || NEW_REPO=yes
c6418b06 952 ssh $GIT_PUSH create ${ASSUMED_NAME} || Exit_error err_cvs_add_failed
d8dbe300
ER
953 (
954 set -e
406b9ecf 955 git init
d8dbe300
ER
956 git remote add $REMOTE_PLD ${GIT_SERVER}/${PACKAGES_DIR}/${ASSUMED_NAME}.git
957 git remote set-url --push $REMOTE_PLD ssh://${GIT_PUSH}/${PACKAGES_DIR}/${ASSUMED_NAME}
958
959 git config --local push.default current
960 git config --local branch.master.remote $REMOTE_PLD
961 git config --local branch.master.merge refs/heads/master
962 )
963 test $? = 0 || Exit_error err_remote_problem $REMOTE_PLD
406b9ecf
KK
964}
965
f6711e2a 966get_spec() {
c890b916 967
2e5be021 968 update_shell_title "get_spec"
c890b916 969
cd445739 970 if [ -n "$DEBUG" ]; then
518ff1fb
ER
971 set -x
972 set -v
cd445739
AM
973 fi
974
9c909460 975 cd "$REPO_DIR"
e0ddd96d 976 SPECFILE=$(basename $SPECFILE)
1ef6f5de 977 if [ "$NOCVSSPEC" != "yes" ]; then
3189511a 978 if [ -z "$DEPTH" ]; then
30419e36 979 if [ -d "$PACKAGE_DIR/.git" ]; then
6d641507 980 git fetch $IPOPT $REMOTE_PLD || Exit_error err_no_spec_in_repo
3189511a 981 elif [ "$ADD_PACKAGE_CVS" = "yes" ]; then
30419e36
ER
982 if [ ! -r "$PACKAGE_DIR/$SPECFILE" ]; then
983 echo "ERROR: No package to add ($PACKAGE_DIR/$SPECFILE)" >&2
3189511a
KK
984 exit 101
985 fi
986 Exit_error err_not_implemented
987 else
988 (
989 unset GIT_WORK_TREE
6d641507 990 git clone $IPOPT -o $REMOTE_PLD ${GIT_SERVER}/${PACKAGES_DIR}/${ASSUMED_NAME}.git || {
588cb3a9 991 # softfail if new package, i.e not yet added to PLD rep
30419e36 992 [ ! -f "$PACKAGE_DIR/$SPECFILE" ] && Exit_error err_no_spec_in_repo
c8c52be7 993 echo "Warning: package not in Git - assuming new package"
3189511a
KK
994 NOCVSSPEC="yes"
995 }
71435fd3
ER
996 git config --local --add "remote.$REMOTE_PLD.fetch" 'refs/notes/*:refs/notes/*'
997 git config --local --add "remote.$REMOTE_PLD.push" 'refs/notes/*:refs/notes/*'
998 git config --local --add "remote.$REMOTE_PLD.push" HEAD
999 git config --local push.default current
eda17ab7 1000 git remote set-url --push $REMOTE_PLD ssh://${GIT_PUSH}/${PACKAGES_DIR}/${ASSUMED_NAME}
3189511a 1001 )
703b6deb 1002 fi
9c909460 1003 else
30419e36
ER
1004 if [ ! -d "$PACKAGE_DIR/.git" ]; then
1005 if [ ! -d "$PACKAGE_DIR" ]; then
1006 install -d $PACKAGE_DIR
3189511a
KK
1007 fi
1008 git init
a153a767 1009 git remote add $REMOTE_PLD ${GIT_SERVER}/${PACKAGES_DIR}/${ASSUMED_NAME}.git
71435fd3
ER
1010 git config --local --add "remote.$REMOTE_PLD.fetch" 'refs/notes/*:refs/notes/*'
1011 git config --local --add "remote.$REMOTE_PLD.push" 'refs/heads/*:refs/remotes/origin/*'
1012 git config --local --add "remote.$REMOTE_PLD.push" HEAD
1013 git config --local push.default current
48184c96 1014 git remote set-url --push $REMOTE_PLD ssh://${GIT_PUSH}/${PACKAGES_DIR}/${ASSUMED_NAME}
6a9f8358 1015 CVSTAG=${CVSTAG:-"master"}
3189511a 1016 fi
3f79cb18
KK
1017 local refs=''
1018 if [ -z "$ALL_BRANCHES" ]; then
1019 refs="${CVSTAG}:remotes/${REMOTE_PLD}/${CVSTAG}"
1020 fi
6d641507 1021 git fetch $IPOPT $DEPTH $REMOTE_PLD $refs || {
3189511a
KK
1022 echo >&2 "Error: branch $CVSTAG does not exist"
1023 exit 3
1024 }
703b6deb 1025 fi
6d641507 1026 git fetch $IPOPT $REMOTE_PLD 'refs/notes/*:refs/notes/*'
0c3beb90 1027
0d494abd 1028 cvsignore_df .gitignore
703b6deb 1029
588cb3a9 1030 # add default log format to .gitignore if it is relative to package dir
703b6deb
ER
1031 if [ -n "$LOGFILE" -a "$LOGFILE" = "${LOGFILE##*/}" ]; then
1032 # substitute known "macros" to glob
3870f979 1033 local logfile=$(echo "$LOGFILE" | sed -r -e 's,\$(PACKAGE_(NAME|VERSION|RELEASE)|DATE|TARGET),*,g')
703b6deb
ER
1034 if [ "$logfile" ]; then
1035 cvsignore_df "$logfile"
daeab113 1036 fi
9c909460 1037 fi
703b6deb
ER
1038
1039 # create symlinks for tools
30419e36 1040 if [ "$SYMLINK_TOOLS" != "no" -a -d "$PACKAGE_DIR" ]; then
4ec6d58b 1041 for a in dropin md5 builder {relup,compile,repackage,rsync,pearize}.sh; do
046b715f 1042 # skip tools that don't exist in top dir
703b6deb 1043 [ -f $a ] || continue
046b715f 1044 # skip tools that already exist
30419e36
ER
1045 [ -f $PACKAGE_DIR/$a ] && continue
1046 ln -s ../$a $PACKAGE_DIR
703b6deb
ER
1047 cvsignore_df $a
1048 done
1049 fi
cd445739 1050 fi
049ab214 1051
b0121b45 1052 if [ -n "$CVSTAG" ]; then
c8c52be7 1053 if git rev-parse --verify -q "$CVSTAG" >/dev/null; then
6217f407
KK
1054 git checkout "$CVSTAG" --
1055 elif git rev-parse --verify -q "refs/remotes/${REMOTE_PLD}/$CVSTAG"; then
1056 git checkout -t "refs/remotes/${REMOTE_PLD}/$CVSTAG" > /dev/null
1057 fi
1058 if [ $(git rev-parse "$CVSTAG") != $(git rev-parse HEAD) ]; then
1059 Exit_error "err_no_checkut" "$CVSTAG"
1060 fi
c8c52be7
ER
1061
1062 git merge --ff-only '@{u}'
2226518e 1063 git symbolic-ref -q HEAD > /dev/null && [ "$NOCVSSPEC" != "yes" ] &&
52020f4c 1064 if [ -n "$CVSDATE" ]; then
c4c0f339
KK
1065 git checkout $(git rev-list -n1 --before="'$CVSDATE'" $CVSTAG) || exit 1
1066 fi
b0121b45
KK
1067 fi
1068
30419e36 1069 if [ ! -f "$PACKAGE_DIR/$SPECFILE" ]; then
e55ef62b 1070 Exit_error err_no_spec_in_repo "$PACKAGE_DIR/$SPECFILE"
cd445739
AM
1071 fi
1072
1073 if [ "$CHMOD" = "yes" -a -n "$SPECFILE" ]; then
30419e36 1074 chmod $CHMOD_MODE $PACKAGE_DIR/$SPECFILE
cd445739
AM
1075 fi
1076 unset OPTIONS
30419e36 1077 [ -n "$DONT_PRINT_REVISION" ] || grep -E -m 1 "^#.*Revision:.*Date" $PACKAGE_DIR/$SPECFILE
7e40520f 1078
ce40491a 1079 set_spec_target
cd445739
AM
1080}
1081
236af16b
ER
1082# find mirrors in this order. first match wins:
1083# - package dir (~/rpm/packages/foo)
1084# - repository dir (~/rpm/packages)
1085# - tools dir dir (~/rpm/packages/rpm-build-tools)
f6711e2a 1086find_mirror() {
782518da 1087 local url="$1"
cd445739 1088
236af16b
ER
1089 update_shell_title "find_mirror[$url][$REPO_DIR]"
1090
1091 # NOTE: as while loop runs in subshell,
1092 # we use exit 2 to indicate that the match was found
1093 # otherwise we end up outputing mirror url and origin url.
1094
782518da 1095 local origin mirror name rest ol prefix
236af16b
ER
1096 IFS="|"
1097 cat "$PACKAGE_DIR/mirrors" "$REPO_DIR/mirrors" "$REPO_DIR/../rpm-build-tools/mirrors" /dev/null 2>/dev/null | \
782518da
ER
1098 while read origin mirror name rest; do
1099 # skip comments and empty lines
2faa4c32 1100 if [ -z "$origin" ] || [ "${origin#\#}" != "$origin" ]; then
782518da
ER
1101 continue
1102 fi
a8c9a155
ER
1103 ol=$(echo -n "$origin" | wc -c)
1104 prefix=$(echo -n "$url" | head -c $ol)
cd445739 1105 if [ "$prefix" = "$origin" ] ; then
a8c9a155 1106 suffix=$(echo "$url" | cut -b $((ol+1))-)
cd445739 1107 echo -n "$mirror$suffix"
236af16b 1108 exit 2
cd445739 1109 fi
236af16b 1110 done && echo "$url"
cd445739
AM
1111}
1112
e7e0d4ec 1113# Warning: unpredictable results if same URL used twice
f6711e2a 1114src_no() {
8510980a
AM
1115 local file="$1"
1116 # escape some regexp characters if part of file name
298e75e2 1117 file=$(echo "$file" | sed -e 's#\([\+\*\.\&\#\?]\)#\\\1#g')
9c909460 1118 cd $PACKAGE_DIR
cd445739 1119 rpm_dump | \
8510980a 1120 grep -E "(SOURCE|PATCH)URL[0-9]*[ ]*${file}""[ ]*$" | \
647e3d7f
KK
1121 sed -e 's/.*\(SOURCE\|PATCH\)URL\([0-9][0-9]*\).*/\1\2/' | \
1122 head -n 1 | tr OURCEATH ourceath | xargs
1471f6d6 1123}
1124
f6711e2a 1125src_md5() {
e7e0d4ec 1126 [ "$NO5" = "yes" ] && return
cd445739
AM
1127 no=$(src_no "$1")
1128 [ -z "$no" ] && return
9c909460 1129 cd $PACKAGE_DIR
e7e0d4ec
ER
1130 local md5
1131
edcaeac2
ER
1132 # use "sources" file from package dir, like vim
1133 if [ -f sources ]; then
1134 md5=$(grep -s -v '^#' sources | \
5fe6b5d9 1135 grep -E "[ *]$(basename "$1")([ ,]|\$)" | \
e7e0d4ec
ER
1136 sed -e 's/^\([0-9a-f]\{32\}\).*/\1/' | \
1137 grep -E '^[0-9a-f]{32}$')
1138
1139 if [ "$md5" ]; then
1140 if [ $(echo "$md5" | wc -l) != 1 ] ; then
edcaeac2 1141 echo "$SPECFILE: more then one entry in sources for $1" 1>&2
e7e0d4ec
ER
1142 fi
1143 echo "$md5" | tail -n 1
1144 return
1145 fi
cd445739 1146 fi
e7e0d4ec 1147
32131a0e 1148 source_md5=$(grep -iE "^#[ ]*(No)?$no-md5[ ]*:" $SPECFILE | sed -e 's/.*://')
e7e0d4ec
ER
1149 if [ -n "$source_md5" ]; then
1150 echo $source_md5
cd445739 1151 else
7805dcb4
PZ
1152 source_md5=`grep -i "BuildRequires:[ ]*digest(%SOURCE$no)[ ]*=" $SPECFILE | sed -e 's/.*=//'`
1153 if [ -n "$source_md5" ]; then
1154 echo $source_md5
1155 else
1156 # we have empty SourceX-md5, but it is still possible
1157 # that we have NoSourceX-md5 AND NoSource: X
647e3d7f 1158 nosource_md5=`grep -i "^#[ ]*No$no-md5[ ]*:" $SPECFILE | sed -e 's/.*://'`
7805dcb4
PZ
1159 if [ -n "$nosource_md5" -a -n "`grep -i "^NoSource:[ ]*$no$" $SPECFILE`" ] ; then
1160 echo $nosource_md5
1161 fi
cd445739 1162 fi
cd445739
AM
1163 fi
1164}
1165
f6711e2a 1166distfiles_path() {
06541433
JR
1167 echo "by-md5/$(src_md5 "$1" | sed -e 's|^\(.\)\(.\)|\1/\2/&|')/$(basename "$1")"
1168}
1169
f6711e2a 1170distfiles_url() {
06541433 1171 echo "$PROTOCOL$DISTFILES_SERVER/distfiles/$(distfiles_path "$1")"
cd445739
AM
1172}
1173
f6711e2a 1174distfiles_attic_url() {
06541433 1175 echo "$PROTOCOL$ATTICDISTFILES_SERVER/distfiles/Attic/$(distfiles_path "$1")"
cd445739
AM
1176}
1177
f6711e2a 1178good_md5() {
cd445739
AM
1179 md5=$(src_md5 "$1")
1180 [ "$md5" = "" ] || \
1181 [ "$md5" = "$(md5sum $(nourl "$1") 2> /dev/null | sed -e 's/ .*//')" ]
8ba5cdda
PG
1182}
1183
f6711e2a 1184good_size() {
a8c9a155 1185 size=$(find $(nourl "$1") -printf "%s" 2>/dev/null)
ce40491a 1186 [ -n "$size" -a "$size" -gt 0 ]
a4b50627
AF
1187}
1188
f6711e2a 1189cvsignore_df() {
947025e5 1190 if [ "$CVSIGNORE_DF" != "yes" ]; then
1191 return
1192 fi
be93ada0 1193 local cvsignore=${PACKAGE_DIR}/.git/info/exclude
7dc8d095
ER
1194
1195 # add only if not yet there
aa189b05 1196 if ! awk -vf="$1" -vc=1 '$0 == f { c = 0 } END { exit c }' $cvsignore 2>/dev/null; then
947025e5 1197 echo "$1" >> $cvsignore
1198 fi
1199}
1200
71f8e908 1201# returns true if "$1" is ftp, http or https protocol url
f6711e2a 1202is_url() {
71f8e908
ER
1203 case "$1" in
1204 ftp://*|http://*|https://*)
1205 return 0
1206 ;;
1207 esac
1208 return 1
1209}
1210
f6711e2a 1211update_md5() {
ecba6ad5
ER
1212 if [ $# -eq 0 ]; then
1213 return
1214 fi
1215
1216 update_shell_title "update md5"
1217 if [ -n "$DEBUG" ]; then
518ff1fb
ER
1218 set -x
1219 set -v
ecba6ad5
ER
1220 fi
1221
9c909460 1222 cd "$PACKAGE_DIR"
ecba6ad5
ER
1223
1224 # pass 1: check files to be fetched
1225 local todo
1226 local need_files
1227 for i in "$@"; do
1228 local fp=$(nourl "$i")
1229 local srcno=$(src_no "$i")
6392b5fd
ER
1230 if [ -n "$ADD5" ]; then
1231 [ "$fp" = "$i" ] && continue # FIXME what is this check doing?
647e3d7f 1232 grep -qiE '^#[ ]*'$srcno'-md5[ ]*:' $PACKAGE_DIR/$SPECFILE && continue
9c909460 1233 grep -qiE '^BuildRequires:[ ]*digest[(]%SOURCE'$srcno'[)][ ]*=' $PACKAGE_DIR/$SPECFILE && continue
6392b5fd 1234 else
647e3d7f 1235 grep -qiE '^#[ ]*'$srcno'-md5[ ]*:' $PACKAGE_DIR/$SPECFILE || grep -qiE '^BuildRequires:[ ]*digest[(]%SOURCE'$srcno'[)][ ]*=' $PACKAGE_DIR/$SPECFILE || continue
ecba6ad5
ER
1236 fi
1237 if [ ! -f "$fp" ] || [ $ALWAYS_CVSUP = "yes" ]; then
1238 need_files="$need_files $i"
1239 fi
1240 done
1241
1242 # pass 1a: get needed files
1243 if [ "$need_files" ]; then
1244 get_files $need_files
1245 fi
1246
1247 # pass 2: proceed with md5 adding or updating
1248 for i in "$@"; do
1249 local fp=$(nourl "$i")
1250 local srcno=$(src_no "$i")
647e3d7f 1251 local md5=$(grep -iE '^#[ ]*(No)?'$srcno'-md5[ ]*:' $PACKAGE_DIR/$SPECFILE )
e19ad799 1252 if [ -z "$md5" ]; then
9c909460 1253 md5=$(grep -iE '^[ ]*BuildRequires:[ ]*digest[(]%SOURCE'$srcno'[)][ ]*=' $PACKAGE_DIR/$SPECFILE )
6c1b2e7d 1254 fi
71f8e908 1255 if [ -n "$ADD5" ] && is_url $i || [ -n "$md5" ]; then
647e3d7f 1256 local tag="# $srcno-md5:\t"
71f8e908 1257 if [[ "$md5" == *NoSource* ]]; then
6663e1f3 1258 tag="# No$srcno-md5:\t"
6c1b2e7d
PZ
1259 elif [ -n "$USEDIGEST" ]; then
1260 tag="BuildRequires:\tdigest(%SOURCE$srcno) = "
71f8e908 1261 fi
ecba6ad5 1262 md5=$(md5sum "$fp" | cut -f1 -d' ')
647e3d7f 1263 echo "Updating $srcno ($md5: $fp)."
ecba6ad5 1264 perl -i -ne '
647e3d7f
KK
1265 print unless (/^\s*#\s*(No)?'$srcno'-md5\s*:/i or /^\s*BuildRequires:\s*digest\(%SOURCE'$srcno'\)/i);
1266 print "'"$tag$md5"'\n" if /^'$srcno'\s*:\s+/i;
ecba6ad5 1267 ' \
9c909460 1268 $PACKAGE_DIR/$SPECFILE
ecba6ad5
ER
1269 fi
1270 done
1271}
1272
f6711e2a 1273check_md5() {
60499e54 1274 local bad
3fbff8b8
ER
1275 [ "$NO5" = "yes" ] && return
1276
ecba6ad5
ER
1277 update_shell_title "check md5"
1278
1279 for i in "$@"; do
60499e54
AM
1280 bad=0
1281 if ! good_md5 "$i"; then
1282 echo -n "MD5 sum mismatch."
1283 bad=1
1284 fi
1285 if ! good_size "$i"; then
1286 echo -n "0 sized file."
1287 bad=1
ecba6ad5
ER
1288 fi
1289
60499e54
AM
1290 if [ $bad -eq 1 ]; then
1291 echo " Use -U to refetch sources,"
1292 echo "or -5 to update md5 sums, if you're sure files are correct."
1293 Exit_error err_no_source_in_repo $i
1294 fi
ecba6ad5
ER
1295 done
1296}
1297
f6711e2a 1298get_files() {
7cb24972 1299 update_shell_title "get_files"
cd445739
AM
1300
1301 if [ -n "$DEBUG" ]; then
518ff1fb
ER
1302 set -x
1303 set -v
cd445739
AM
1304 fi
1305
f09c0772 1306 if [ $# -gt 0 ]; then
9c909460 1307 cd "$PACKAGE_DIR"
cd445739 1308
f2e42a41 1309 local nc=0
e7fa3b9f 1310 local get_files_cvs=""
3815b69a 1311 for i in "$@"; do
f2e42a41 1312 nc=$((nc + 1))
dcebdffb 1313 local cvsup=0
3815b69a 1314 SHELL_TITLE_PREFIX="get_files[$nc/$#]"
f2e42a41 1315 update_shell_title "$i"
f09c0772 1316 local fp=`nourl "$i"`
ecba6ad5 1317 if [ "$SKIP_EXISTING_FILES" = "yes" ] && [ -f "$fp" ]; then
ce40491a 1318 continue
18e5347d 1319 fi
ecba6ad5 1320
cd445739 1321 FROM_DISTFILES=0
e7e0d4ec 1322 local srcmd5=$(src_md5 "$i")
ecba6ad5
ER
1323
1324 # we know if source/patch is present in cvs/distfiles
1325 # - has md5 (in distfiles)
1326 # - in cvs... ideas?
1327
1328 # CHECK: local file didn't exist or always cvs up (first) requested.
f09c0772 1329 if [ ! -f "$fp" ] || [ $ALWAYS_CVSUP = "yes" ]; then
cd445739
AM
1330 if echo $i | grep -vE '(http|ftp|https|cvs|svn)://' | grep -qE '\.(gz|bz2)$']; then
1331 echo "Warning: no URL given for $i"
1332 fi
08908161 1333 target="$fp"
cd445739 1334
e7e0d4ec 1335 if [ -z "$NODIST" ] && [ -n "$srcmd5" ]; then
a4b50627 1336 if good_md5 "$i" && good_size "$i"; then
e7e0d4ec 1337 echo "$fp having proper md5sum already exists"
cd445739
AM
1338 continue
1339 fi
28b34560 1340
bc10f694 1341 # optionally prefer mirror over distfiles if there's mirror
28b34560 1342 # TODO: build url list and then try each url from the list
bc10f694 1343 if [ -n "$PREFMIRRORS" ] && [ -z "$NOMIRRORS" ] && im=$(find_mirror "$i") && [ "$im" != "$i" ]; then
28b34560
ER
1344 url="$im"
1345 else
1346 url=$(distfiles_url "$i")
1347 fi
1348
cd445739
AM
1349 url_attic=$(distfiles_attic_url "$i")
1350 FROM_DISTFILES=1
ecba6ad5
ER
1351 # is $url local file?
1352 if [[ "$url" = [./]* ]]; then
18a52930 1353 update_shell_title "${GETLOCAL%% *}: $url"
cd445739
AM
1354 ${GETLOCAL} $url $target
1355 else
9e9f8920
ER
1356 local uri=${url}
1357 # make shorter message for distfiles urls
1358 if [[ "$uri" = ${PROTOCOL}${DISTFILES_SERVER}* ]] || [[ "$uri" = ${PROTOCOL}${ATTICDISTFILES_SERVER}* ]]; then
1359 uri=${uri#${PROTOCOL}${DISTFILES_SERVER}/distfiles/by-md5/?/?/*/}
1360 uri=${uri#${PROTOCOL}${ATTICDISTFILES_SERVER}/distfiles/by-md5/?/?/*/}
1361 uri="df: $uri"
1362 fi
1363 update_shell_title "${GETURI%% *}: $uri"
6d641507 1364 ${GETURI} "$target" "$url"
cd445739 1365 fi
ecba6ad5
ER
1366
1367 # is it empty file?
1368 if [ ! -s "$target" ]; then
cd445739
AM
1369 rm -f "$target"
1370 if [ `echo $url_attic | grep -E '^(\.|/)'` ]; then
18a52930 1371 update_shell_title "${GETLOCAL%% *}: $url_attic"
cd445739
AM
1372 ${GETLOCAL} $url_attic $target
1373 else
18a52930 1374 update_shell_title "${GETURI%% *}: $url_attic"
6d641507 1375 ${GETURI} "$target" "$url_attic"
1cd7fc57 1376 test -s "$target" || rm -f "$target"
cd445739
AM
1377 fi
1378 fi
ecba6ad5
ER
1379
1380 if [ -s "$target" ]; then
947025e5 1381 cvsignore_df $target
1382 else
cd445739
AM
1383 rm -f "$target"
1384 FROM_DISTFILES=0
1385 fi
cd445739
AM
1386 fi
1387
f09c0772 1388 if [ -z "$NOURLS" ] && [ ! -f "$fp" -o -n "$UPDATE" ] && [ "`echo $i | grep -E 'ftp://|http://|https://'`" ]; then
cd445739 1389 if [ -z "$NOMIRRORS" ]; then
a8c9a155 1390 im=$(find_mirror "$i")
cd445739
AM
1391 else
1392 im="$i"
1393 fi
ce40491a 1394 update_shell_title "${GETURI%% *}: $im"
6d641507 1395 ${GETURI} "$target" "$im"
1cd7fc57 1396 test -s "$target" || rm -f "$target"
cd445739
AM
1397 fi
1398
dcebdffb
ER
1399 if [ "$cvsup" = 1 ]; then
1400 continue
1401 fi
1402
cd445739 1403 fi
ecba6ad5
ER
1404
1405 # the md5 check must be moved elsewhere as if we've called from update_md5 the md5 is wrong.
f09c0772 1406 if [ ! -f "$fp" -a "$FAIL_IF_NO_SOURCES" != "no" ]; then
b3b584c5 1407 Exit_error err_no_source_in_repo $i
cd445739 1408 fi
2a5f078d 1409
ecba6ad5 1410 # we check md5 here just only to refetch immediately
a4b50627 1411 if good_md5 "$i" && good_size "$i"; then
cd445739
AM
1412 :
1413 elif [ "$FROM_DISTFILES" = 1 ]; then
deccc50e 1414 # wrong md5 from distfiles: remove the file and try again
cd445739 1415 # but only once ...
deccc50e 1416 echo "MD5 sum mismatch. Trying full fetch."
cd445739
AM
1417 FROM_DISTFILES=2
1418 rm -f $target
18a52930 1419 update_shell_title "${GETURI%% *}: $url"
6d641507 1420 ${GETURI} "$target" "$url"
ecba6ad5 1421 if [ ! -s "$target" ]; then
cd445739 1422 rm -f "$target"
18a52930 1423 update_shell_title "${GETURI%% *}: $url_attic"
6d641507 1424 ${GETURI} "$target" "$url_attic"
cd445739
AM
1425 fi
1426 test -s "$target" || rm -f "$target"
1427 fi
cd445739 1428 done
e7fa3b9f
ER
1429 SHELL_TITLE_PREFIX=""
1430
cd445739
AM
1431
1432 if [ "$CHMOD" = "yes" ]; then
a8c9a155 1433 CHMOD_FILES=$(nourl "$@")
cd445739
AM
1434 if [ -n "$CHMOD_FILES" ]; then
1435 chmod $CHMOD_MODE $CHMOD_FILES
1436 fi
1437 fi
cd445739
AM
1438 fi
1439}
1440
7605fe95 1441tag_exist() {
8b6d1795
KK
1442# If tag exists and points to other commit exit with error
1443# If it existsts and points to HEAD return 1
1444# If it doesn't exist return 0
f8bfce7d 1445 local _tag="$1"
8b6d1795 1446 local sha1=$(git rev-parse HEAD)
7605fe95
KK
1447 echo "Searching for tag $_tag..."
1448 if [ -n "$DEPTH" ]; then
8b6d1795 1449 local ref=$(git ls-remote $REMOTE_PLD "refs/tags/$_tag" | cut -c -40)
7605fe95 1450 else
7baf7b2f 1451 local ref=$(git show-ref -s "refs/tags/$_tag")
7605fe95 1452 fi
8b6d1795
KK
1453 [ -z "$ref" ] && return 0
1454 [ "$ref" = "$sha1" ] || Exit_error err_tag_exists "$_tag"
1455 return 1
7605fe95
KK
1456}
1457
cd445739 1458make_tagver() {
ce40491a 1459 if [ -n "$DEBUG" ]; then
518ff1fb
ER
1460 set -x
1461 set -v
ce40491a 1462 fi
78eab2a1 1463
ce40491a
ER
1464 # Check whether first character of PACKAGE_NAME is legal for tag name
1465 if [ -z "${PACKAGE_NAME##[_0-9]*}" -a -z "$TAG_PREFIX" ]; then
1466 TAG_PREFIX=tag_
1467 fi
d712cc12
ER
1468
1469 # NOTE: CVS tags may must not contain the characters `$,.:;@'
8c043136 1470 TAGVER=$(echo $TAG_PREFIX$PACKAGE_NAME-$PACKAGE_VERSION-$PACKAGE_RELEASE)
d712cc12 1471
8c043136 1472 # Remove @kernel.version_release from TAGVER because tagging sources
ce40491a 1473 # could occur with different kernel-headers than kernel-headers used at build time.
d712cc12
ER
1474 # besides, %{_kernel_ver_str} is not expanded.
1475
8c043136 1476 # TAGVER=auto-ac-madwifi-ng-0-0_20070225_1@%{_kernel_ver_str}
d712cc12
ER
1477 # TAGVER=auto-ac-madwifi-ng-0-0_20070225_1
1478
8c043136 1479 TAGVER=${TAGVER%@*}
ce40491a 1480 echo -n "$TAGVER"
cd445739
AM
1481}
1482
f6711e2a 1483tag_files() {
cd445739 1484 if [ -n "$DEBUG" ]; then
518ff1fb
ER
1485 set -x
1486 set -v
cd445739
AM
1487 fi
1488
73ef63d8
ER
1489 echo "Version: $PACKAGE_VERSION"
1490 echo "Release: $PACKAGE_RELEASE"
cd445739 1491
c9100f10 1492 local _tag
73ef63d8 1493 if [ "$TAG_VERSION" = "yes" ]; then
c9100f10 1494 _tag=`make_tagver`
73ef63d8
ER
1495 fi
1496 if [ -n "$TAG" ]; then
c9100f10 1497 _tag="$TAG"
73ef63d8 1498 fi
c9100f10 1499 echo "tag: $_tag"
cd445739 1500
39dcc7de 1501 local OPTIONS="tag $CVS_FORCE"
cd445739 1502
9c909460 1503 cd "$PACKAGE_DIR"
03db3356 1504
ace99bc6
KK
1505 if tag_exist $_tag || [ -n "$CVS_FORCE" ]; then
1506 update_shell_title "tag sources: $_tag"
1507 git $OPTIONS $_tag || exit
6d641507 1508 git push $IPOPT $CVS_FORCE $REMOTE_PLD tag $_tag || Exit_error err_remote_problem $REMOTE_PLD
ace99bc6
KK
1509 else
1510 echo "Tag $_tag already exists and points to the same commit"
1511 fi
cd445739
AM
1512}
1513
f6711e2a 1514branch_files() {
cd445739 1515 TAG=$1
f663f264 1516 echo "Git branch: $TAG"
518ff1fb 1517 shift
cd445739 1518
cd445739 1519 if [ -n "$DEBUG" ]; then
518ff1fb
ER
1520 set -x
1521 set -v
cd445739
AM
1522 fi
1523
f663f264 1524 local OPTIONS="branch $CVS_FORCE"
c10fa4fa 1525
9c909460 1526 cd "$PACKAGE_DIR"
f663f264 1527 git $OPTIONS $TAG || exit
cd445739
AM
1528}
1529
1530
3009b80d
ER
1531# this function should exit early if package can't be built for this arch
1532# this avoids unneccessary BR filling.
1533check_buildarch() {
1534 local out ret
13c3c336 1535 out=$(minirpm --short-circuit -bp --define "'prep exit 0'" --nodeps $SPECFILE 2>&1)
3009b80d
ER
1536 ret=$?
1537 if [ $ret -ne 0 ]; then
1538 echo >&2 "$out"
1539 exit $ret
1540 fi
1541}
1542
9d99a240
ER
1543# from relup.sh
1544set_release() {
1545 local specfile="$1"
1546 local rel="$2"
1547 local newrel="$3"
1548 sed -i -e "
1549 s/^\(%define[ \t]\+_\?rel[ \t]\+\)$rel\$/\1$newrel/
1550 s/^\(Release:[ \t]\+\)$rel\$/\1$newrel/
1551 " $specfile
1552}
1553
1554set_version() {
1555 local specfile="$1"
bc8502e6
ER
1556 local ver="$2" subver=$ver
1557 local newver="$3" newsubver=$newver
1558
1559 # try handling subver, everything that's not numeric-dotted in version
1560 if grep -Eq '%define\s+subver' $specfile; then
1561 subver=$(echo "$ver" | sed -re 's,^[0-9.]+,,')
1562 ver=${ver%$subver}
1563 newsubver=$(echo "$newver" | sed -re 's,^[0-9.]+,,')
1564 newver=${newver%$newsubver}
1565 fi
9d99a240
ER
1566 sed -i -e "
1567 s/^\(%define[ \t]\+_\?ver[ \t]\+\)$ver\$/\1$newver/
bc8502e6 1568 s/^\(%define[ \t]\+subver[ \t]\+\)$subver\$/\1$newsubver/
9d99a240
ER
1569 s/^\(Version:[ \t]\+\)$ver\$/\1$newver/
1570 " $specfile
1571}
1572
52a2ef00
ER
1573# try to upgrade .spec to new version
1574# if --upgrade-version is specified, use that as new version, otherwise invoke pldnotify to find new version
1575#
1576# return 1: if .spec was updated
1577# return 0: no changes to .spec
1578# exit 1 in case of error
cacef28c 1579try_upgrade() {
52a2ef00
ER
1580 if [ -z "$TRY_UPGRADE" ]; then
1581 return 0
1582 fi
9d99a240 1583
52a2ef00
ER
1584 local TNOTIFY TNEWVER TOLDVER
1585 update_shell_title "build_package: try_upgrade"
cd445739 1586
52a2ef00 1587 cd "$PACKAGE_DIR"
b9bef5ce 1588
52a2ef00
ER
1589 if [ "$UPGRADE_VERSION" ]; then
1590 TNEWVER=$UPGRADE_VERSION
1591 echo "Updating spec file to version $TNEWVER"
1592 else
1593 if [ -n "$FLOAT_VERSION" ]; then
d1d44ebd 1594 TNOTIFY=$(pldnotify ${BE_VERBOSE:+-vDEBUG=1} $SPECFILE -n) || exit 1
52a2ef00 1595 else
d1d44ebd 1596 TNOTIFY=$(pldnotify ${BE_VERBOSE:+-vDEBUG=1} $SPECFILE) || exit 1
0907f1eb 1597 fi
cd445739 1598
d1d44ebd 1599 # pldnotify does not set exit codes, but it has match for ERROR
52a2ef00
ER
1600 # in output which means so.
1601 if [[ "$TNOTIFY" = *ERROR* ]]; then
1602 echo >&2 "$TNOTIFY"
1603 exit 1
cd445739 1604 fi
52a2ef00
ER
1605
1606 TOLDVER=`echo $TNOTIFY | awk '{ print $3; }'`
1607 echo "New version found, updating spec file from $TOLDVER to version $TNEWVER"
1608
1609 TNEWVER=$(echo $TNOTIFY | awk '{ match($4,/\[NEW\]/); print $5 }')
1610 fi
1611
1612 if [ -z "$TNEWVER" ]; then
1613 return 0
1614 fi
1615
1616 if [ "$REVERT_BROKEN_UPGRADE" = "yes" ]; then
1617 cp -f $SPECFILE $SPECFILE.bak
1618 fi
1619 chmod +w $SPECFILE
1620 set_version $SPECFILE $PACKAGE_VERSION $TNEWVER
1621 set_release $SPECFILE $PACKAGE_RELEASE 1
1622 parse_spec
1623 if [ "$PACKAGE_VERSION" != "$TNEWVER" ]; then
1624 echo >&2 "Upgrading version failed, you need to update spec yourself"
1625 exit 1
cd445739 1626 fi
52a2ef00 1627 return 1
cacef28c 1628}
1629
1630build_package() {
1631 update_shell_title "build_package"
1632 if [ -n "$DEBUG" ]; then
1633 set -x
1634 set -v
1635 fi
1636
9c909460 1637 cd "$PACKAGE_DIR"
2a5f078d 1638
cd445739
AM
1639 case "$COMMAND" in
1640 build )
1641 BUILD_SWITCH="-ba" ;;
1642 build-binary )
1643 BUILD_SWITCH="-bb" ;;
1644 build-source )
1645 BUILD_SWITCH="-bs --nodeps" ;;
1646 build-prep )
1647 BUILD_SWITCH="-bp --nodeps" ;;
6594293d
AG
1648 build-build )
1649 BUILD_SWITCH="-bc" ;;
1650 build-install )
1651 BUILD_SWITCH="-bi" ;;
1652 build-list )
1653 BUILD_SWITCH="-bl" ;;
1654
cd445739 1655 esac
c890b916 1656
2e5be021 1657 update_shell_title "build_package: $COMMAND"
12da9e3d 1658 local logfile retval
cd445739 1659 if [ -n "$LOGFILE" ]; then
12da9e3d
ER
1660 logfile=`eval echo $LOGFILE`
1661 if [ -d "$logfile" ]; then
1662 echo "Log file $logfile is a directory."
cd445739 1663 echo "Parse error in the spec?"
518ff1fb 1664 Exit_error err_build_fail
cd445739
AM
1665 fi
1666 if [ -n "$LASTLOG_FILE" ]; then
12da9e3d 1667 echo "LASTLOG=$logfile" > $LASTLOG_FILE
cd445739 1668 fi
12da9e3d
ER
1669 fi
1670
bfea86a5
ER
1671 # unset these, should not be exposed to builder shell!
1672 unset GIT_WORK_TREE GIT_DIR
c69e0c61 1673 # these are set by jenkins
bfea86a5 1674 unset GIT_PREVIOUS_COMMIT GIT_URL GIT_PREVIOUS_SUCCESSFUL_COMMIT GIT_BRANCH GIT_COMMIT
256edc2e
ER
1675 # this may be set by user
1676 unset GIT_SSH
4666645f 1677 # may be set by user
6aa9db85 1678 unset GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_TESTING_PORCELAIN_COMMAND_LIST
bfea86a5
ER
1679 # fail if something still set
1680 env | grep ^GIT_ && Exit_error err_build_fail
1681
12da9e3d 1682 local specdir=$(insert_gitlog $SPECFILE)
4754e795 1683 ulimit -c unlimited
12da9e3d 1684 # FIXME: eval here is exactly why?
6dd8b9cc 1685 PATH=$CLEAN_PATH eval teeboth "'$logfile'" ${TIME_COMMAND} ${NICE_COMMAND} $RPMBUILD $TARGET_SWITCH $BUILD_SWITCH -v $QUIET $CLEAN $RPMOPTS $RPMBUILDOPTS $BCOND --define \'_specdir $PACKAGE_DIR\' --define \'_sourcedir $PACKAGE_DIR\' $specdir/$SPECFILE
12da9e3d
ER
1686 retval=$?
1687 rm -r $specdir
1688
1689 if [ -n "$logfile" ] && [ -n "$LOGDIROK" ] && [ -n "$LOGDIRFAIL" ]; then
1690 if [ "$retval" -eq "0" ]; then
1691 mv $logfile $LOGDIROK
1692 else
1693 mv $logfile $LOGDIRFAIL
cd445739 1694 fi
8ba5cdda 1695 fi
12da9e3d
ER
1696
1697 if [ "$retval" -ne "0" ]; then
cd445739 1698 if [ -n "$TRY_UPGRADE" ]; then
cacef28c 1699 echo "\nUpgrade package to new version failed."
257af81b 1700 if [ "$REVERT_BROKEN_UPGRADE" = "yes" ]; then
cacef28c 1701 echo "Restoring old spec file."
257af81b
ER
1702 mv -f $SPECFILE.bak $SPECFILE
1703 fi
cacef28c 1704 echo ""
cd445739 1705 fi
518ff1fb 1706 Exit_error err_build_fail
cd445739
AM
1707 fi
1708 unset BUILD_SWITCH
1709}
1710
f6711e2a 1711nourl() {
cd445739
AM
1712 echo "$@" | sed 's#\<\(ftp\|http\|https\|cvs\|svn\)://[^ ]*/##g'
1713}
1714
f6711e2a 1715install_required_packages() {
cd445739
AM
1716 run_poldek -vi $1
1717 return $?
1718}
1719
f6711e2a 1720find_spec_bcond() { # originally from /usr/lib/rpm/find-spec-bcond
fa4bf1df 1721 local SPEC="$1"
fa4bf1df
ER
1722 awk -F"\n" '
1723 /^%changelog/ { exit }
fa4bf1df
ER
1724 /^%bcond_with/{
1725 match($0, /bcond_with(out)?[ \t]+[_a-zA-Z0-9]+/);
8ff97f39
ER
1726 bcond = substr($0, RSTART + 6, RLENGTH - 6);
1727 gsub(/[ \t]+/, "_", bcond);
fa4bf1df
ER
1728 print bcond
1729 }' $SPEC | LC_ALL=C sort -u
1730}
1731
117d9861 1732process_bcondrc() {
301cbfd4
ER
1733 # expand bconds from ~/.bcondrc
1734 # The file structure is like gentoo's package.use:
1735 # ---
1736 # * -selinux
1737 # samba -mysql -pgsql
47a8df12 1738 # w32codec-installer license_agreement
301cbfd4
ER
1739 # php +mysqli
1740 # ---
15e34b63 1741 if [ -f $HOME/.bcondrc ] || ([ -n $HOME_ETC ] && [ -f $HOME_ETC/.bcondrc ]); then
117d9861
ER
1742 :
1743 else
1744 return
1745 fi
301cbfd4 1746
117d9861 1747 SN=${SPECFILE%%\.spec}
c8a3e2ac 1748
117d9861
ER
1749 local bcondrc=$HOME/.bcondrc
1750 [ -n $HOME_ETC ] && [ -f $HOME_ETC/.bcondrc ] && bcondrc=$HOME_ETC/.bcondrc
301cbfd4 1751
117d9861 1752 local bcond_avail=$(find_spec_bcond $SPECFILE)
301cbfd4 1753
117d9861
ER
1754 while read pkg flags; do
1755 # ignore comments
1756 [[ "$pkg" == \#* ]] && continue
1757
1758 # any package or current package?
1759 if [ "$pkg" = "*" ] || [ "$pkg" = "$PACKAGE_NAME" ] || [ "$pkg" = "$SN" ]; then
1760 for flag in $flags; do
1761 local opt=${flag#[+-]}
1762
1763 # use only flags which are in this package.
1764 if [[ $bcond_avail = *${opt}* ]]; then
1765 if [[ $flag = -* ]]; then
1766 if [[ $BCOND != *--with?${opt}* ]]; then
1767 BCOND="$BCOND --without $opt"
1768 fi
1769 else
1770 if [[ $BCOND != *--without?${opt}* ]]; then
1771 BCOND="$BCOND --with $opt"
301cbfd4
ER
1772 fi
1773 fi
117d9861
ER
1774 fi
1775 done
1776 fi
1777 done < $bcondrc
1778 update_shell_title "parse ~/.bcondrc: DONE!"
1779}
1780
8ff97f39 1781set_bconds_values() {
117d9861
ER
1782 update_shell_title "set bcond values"
1783
1784 AVAIL_BCONDS_WITHOUT=""
1785 AVAIL_BCONDS_WITH=""
8ff97f39 1786
5a28189c 1787 if grep -Eq '^# *_with' ${SPECFILE}; then
8ff97f39
ER
1788 echo >&2 "ERROR: This spec has old style bconds."
1789 exit 1
1790 fi
1791
1792 if ! grep -q '^%bcond' ${SPECFILE}; then
117d9861 1793 return
301cbfd4
ER
1794 fi
1795
117d9861
ER
1796 local bcond_avail=$(find_spec_bcond $SPECFILE)
1797 process_bcondrc "$SPECFILE"
1798
fa4bf1df 1799 update_shell_title "parse bconds"
2a5f078d 1800
8ff97f39
ER
1801 local opt bcond
1802 for opt in $bcond_avail; do
1803 case "$opt" in
1804 without_*)
1805 bcond=${opt#without_}
10d92f71
ER
1806 case "$BCOND" in
1807 *--without?${bcond}*)
8ff97f39 1808 AVAIL_BCONDS_WITHOUT="$AVAIL_BCONDS_WITHOUT <$bcond>"
10d92f71
ER
1809 ;;
1810 *)
8ff97f39 1811 AVAIL_BCONDS_WITHOUT="$AVAIL_BCONDS_WITHOUT $bcond"
10d92f71
ER
1812 ;;
1813 esac
cd445739 1814 ;;
8ff97f39
ER
1815 with_*)
1816 bcond=${opt#with_}
10d92f71
ER
1817 case "$BCOND" in
1818 *--with?${bcond}*)
8ff97f39 1819 AVAIL_BCONDS_WITH="$AVAIL_BCONDS_WITH <$bcond>"
10d92f71
ER
1820 ;;
1821 *)
8ff97f39 1822 AVAIL_BCONDS_WITH="$AVAIL_BCONDS_WITH $bcond"
10d92f71
ER
1823 ;;
1824 esac
cd445739 1825 ;;
8ff97f39
ER
1826 *)
1827 echo >&2 "ERROR: unexpected '$opt' in set_bconds_values"
1828 exit 1
1829 ;;
1830 esac
1831 done
cd445739
AM
1832}
1833
f6711e2a 1834run_sub_builder() {
cd445739 1835 package_name="${1}"
af6b168f 1836 update_shell_title "run_sub_builder $package_name"
cd445739 1837 #
8f64e264
ER
1838 # No i tutaj bym chciał zrobić sztuczną inteligencję, która spróbuje tego
1839 # pakieta zbudować. Aktualnie niewiele dziala, bo generalnie nie widze do
cd445739
AM
1840 # konca algorytmu... Ale damy rade. :) Na razie po prostu sie wyjebie tak samo
1841 # jakby nie bylo tego kawalka kodu.
1842 #
8f64e264
ER
1843 # Update: Poprawiłem parę rzeczy i zaczęło generować pakiety spoza zadanej listy.
1844 # Jednym słowem budowanie niespoldkowanych zależności działa w paru przypadkach.
cd445739
AM
1845 #
1846 #
1847 # y0shi.
a8c9a155 1848 # kurwa. translate that ^^^^
cd445739
AM
1849
1850 parent_spec_name=''
1851
cd445739 1852 # Istnieje taki spec? ${package}.spec
9c909460 1853 if [ -f "${PACKAGE_DIR}/${package}.spec" ]; then
cd445739 1854 parent_spec_name=${package}.spec
9c909460 1855 elif [ -f "${PACKAGE_DIR}/$(echo ${package_name} | sed -e s,-devel.*,,g -e s,-static,,g).spec" ]; then
a8c9a155 1856 parent_spec_name="$(echo ${package_name} | sed -e s,-devel.*,,g -e s,-static,,g).spec"
d6a77ddb 1857 else
9c909460 1858 for provides_line in $(grep -r ^Provides:.*$package ${PACKAGE_DIR}); do
cd445739
AM
1859 echo $provides_line
1860 done
1861 fi
1862
1863 if [ "${parent_spec_name}" != "" ]; then
af6b168f 1864 spawn_sub_builder $parent_spec_name
cd445739
AM
1865 fi
1866 NOT_INSTALLED_PACKAGES="$NOT_INSTALLED_PACKAGES $package_name"
1867}
1868
aa7e48da
ER
1869# install package with poldek
1870# @return exit code from poldek
1871#
1872# this requires following sudo rules:
6a9f0e96 1873# - poldek --noask --caplookup -ug
aa7e48da 1874poldek_install() {
a390597a 1875 LANG=C $POLDEK_CMD --noask --caplookup --uniq -ug "$@"
aa7e48da
ER
1876}
1877
1878# install packages
dd5f5cd7
ER
1879#
1880# this requires following sudo rules:
1881# - poldek -q --update --upa
aa7e48da
ER
1882install_packages() {
1883 # sync poldek indexes once per invocation
1884 if [ -z "$package_indexes_updated" ]; then
1885 update_shell_title "poldek: update indexes"
00f72562 1886 $POLDEK_CMD -q --update --upa --mo=nodesc
aa7e48da
ER
1887 package_indexes_updated=true
1888 fi
1889
1890 update_shell_title "install packages: $*"
1891 poldek_install "$@" && return
1892
1893 # retry install, install packages one by one
1894 # this is slower one
1895 local rc=0 package
1896 for package in $*; do
1897 package=$(depspecname $package)
1898 update_shell_title "install package: $package"
1899 poldek_install "$package" || rc=$?
1900 done
1901 return $rc
1902}
1903
1904uninstall_packages() {
1905 update_shell_title "uninstall packages: $*"
1906 $POLDEK_CMD --noask --nofollow -ev "$@"
1907}
1908
f6711e2a 1909spawn_sub_builder() {
ce40491a
ER
1910 package_name="${1}"
1911 update_shell_title "spawn_sub_builder $package_name"
af6b168f 1912
ce40491a 1913 sub_builder_opts=''
c2d6312c 1914 if [ "${FETCH_BUILD_REQUIRES}" = "yes" ]; then
ce40491a
ER
1915 sub_builder_opts="${sub_builder_opts} -R"
1916 fi
c2d6312c 1917 if [ "${REMOVE_BUILD_REQUIRES}" = "nice" ]; then
ce40491a 1918 sub_builder_opts="${sub_builder_opts} -RB"
c2d6312c 1919 elif [ "${REMOVE_BUILD_REQUIRES}" = "force" ]; then
ce40491a
ER
1920 sub_builder_opts="${sub_builder_opts} -FRB"
1921 fi
c2d6312c 1922 if [ "${UPDATE_POLDEK_INDEXES}" = "yes" ]; then
ce40491a
ER
1923 sub_builder_opts="${sub_builder_opts} -Upi"
1924 fi
af6b168f 1925
9c909460 1926 cd "${PACKAGE_DIR}"
ce40491a 1927 ./builder ${sub_builder_opts} "$@"
af6b168f
ER
1928}
1929
f6711e2a 1930remove_build_requires() {
cd445739
AM
1931 if [ "$INSTALLED_PACKAGES" != "" ]; then
1932 case "$REMOVE_BUILD_REQUIRES" in
1933 "force")
1934 run_poldek --noask -ve $INSTALLED_PACKAGES
1935 ;;
1936 "nice")
1937 run_poldek --ask -ve $INSTALLED_PACKAGES
1938 ;;
1939 *)
1940 echo You may want to manually remove following BuildRequires fetched:
1941 echo $INSTALLED_PACKAGES
90baf90b 1942 echo "Try poldek -e \`cat $(pwd)/.${SPECFILE}_INSTALLED_PACKAGES\`"
cd445739
AM
1943 ;;
1944 esac
1945 fi
1946}
1947
f6711e2a 1948display_bconds() {
8ff97f39
ER
1949 if [ "$AVAIL_BCONDS_WITH" -o "$AVAIL_BCONDS_WITHOUT" ]; then
1950 if [ "$BCOND" ]; then
10d92f71
ER
1951 echo ""
1952 echo "Building $SPECFILE with the following conditional flags:"
1953 echo -n "$BCOND"
cd445739 1954 else
10d92f71
ER
1955 echo ""
1956 echo "No conditional flags passed"
cd445739 1957 fi
10d92f71
ER
1958 echo ""
1959 echo "from available:"
1960 echo "--with :\t$AVAIL_BCONDS_WITH"
1961 echo "--without:\t$AVAIL_BCONDS_WITHOUT"
1962 echo ""
cd445739
AM
1963 fi
1964}
1965
f6711e2a 1966display_branches() {
a0fc9d5b 1967 echo -n "Available branches: "
9fd1eb80 1968 git branch -r 2>/dev/null | grep "^ ${REMOTE_PLD}" | grep -v ${REMOTE_PLD}/HEAD | sed "s#^ *${REMOTE_PLD}/##" | xargs
ec4dbe02
AM
1969}
1970
aa7e48da 1971# checks a given list of packages/files/provides against current rpmdb.
ea26d7fc 1972# outputs all dependencies which current rpmdb doesn't satisfy.
af213c6e 1973# input can be either STDIN or parameters
f6711e2a 1974_rpm_prov_check() {
e99e2f34 1975 local deps out
af213c6e 1976
ea26d7fc 1977 if [ $# -gt 0 ]; then
e99e2f34 1978 deps="$@"
ce40491a 1979 else
e99e2f34 1980 deps=$(cat)
ce40491a 1981 fi
af213c6e 1982
e99e2f34 1983 out=$(LC_ALL=C rpm -q --whatprovides $deps 2>&1)
af213c6e 1984
ce40491a 1985 # packages
e99e2f34 1986 echo "$out" | awk '/^no package provides/ { print $NF }'
af213c6e 1987
ce40491a 1988 # other deps (files)
e99e2f34 1989 echo "$out" | sed -rne 's/file (.*): No such file or directory/\1/p'
af213c6e
ER
1990}
1991
1992# checks if given package/files/provides exists in rpmdb.
ea26d7fc
ER
1993# input can be either stdin or parameters
1994# returns packages which are present in the rpmdb
f6711e2a 1995_rpm_cnfl_check() {
ce40491a 1996 local DEPS
af213c6e 1997
ea26d7fc 1998 if [ $# -gt 0 ]; then
ce40491a
ER
1999 DEPS="$@"
2000 else
2001 DEPS=$(cat)
2002 fi
af213c6e 2003
5ce6ccff 2004 LANG=C rpm -q --whatprovides $DEPS 2>/dev/null | awk '!/no package provides/ { print }'
af213c6e
ER
2005}
2006
18e0f841
ER
2007# install deps via information from 'rpm-getdeps' or 'rpm --specsrpm'
2008install_build_requires_rpmdeps() {
aa7e48da 2009 local DEPS CNFL
18e0f841
ER
2010 if [ "$FETCH_BUILD_REQUIRES_RPMGETDEPS" = "yes" ]; then
2011 # TODO: Conflicts list doesn't check versions
74ede51d
ER
2012 CNFL=$(eval rpm-getdeps $BCOND $RPMOPTS $SPECFILE 2> /dev/null | awk '/^\-/ { print $3 } ' | _rpm_cnfl_check | xargs)
2013 DEPS=$(eval rpm-getdeps $BCOND $RPMOPTS $SPECFILE 2> /dev/null | awk '/^\+/ { print $3 } ' | _rpm_prov_check | xargs)
18e0f841
ER
2014 fi
2015 if [ "$FETCH_BUILD_REQUIRES_RPMSPECSRPM" = "yes" ]; then
74ede51d
ER
2016 CNFL=$(eval rpm -q --specsrpm --conflicts $BCOND $RPMOPTS $SPECFILE | awk '{print $1}' | _rpm_cnfl_check | xargs)
2017 DEPS=$(eval rpm -q --specsrpm --requires $BCOND $RPMOPTS $SPECFILE | awk '{print $1}' | _rpm_prov_check | xargs)
18e0f841
ER
2018 fi
2019
18e0f841 2020 if [ -n "$CNFL" ]; then
e99e2f34 2021 echo "Uninstall conflicting packages: $CNFL"
aa7e48da
ER
2022 uninstall_packages $CNFL
2023 fi
2024
2025 if [ -n "$DEPS" ]; then
e99e2f34 2026 echo "Install dependencies: $DEPS"
aa7e48da
ER
2027 install_packages $DEPS
2028 fi
18e0f841 2029}
af213c6e 2030
18e0f841
ER
2031fetch_build_requires()
2032{
2033 if [ "${FETCH_BUILD_REQUIRES}" != "yes" ]; then
2034 return
2035 fi
2dddf439 2036
18e0f841
ER
2037 update_shell_title "fetch build requires"
2038 if [ "$FETCH_BUILD_REQUIRES_RPMGETDEPS" = "yes" ] || [ "$FETCH_BUILD_REQUIRES_RPMSPECSRPM" = "yes" ]; then
2039 install_build_requires_rpmdeps
2040 return
2041 fi
2a5f078d 2042
aa7e48da 2043 die "need rpm-getdeps tool"
cd445739
AM
2044}
2045
b0600c6a
KK
2046init_repository() {
2047 local remoterepo=$1
2048 local localrepo=$2
2049
2050 if [ ! -e $localrepo ]; then
6d641507 2051 git clone $IPOPT -o $REMOTE_PLD ${GIT_SERVER}/$remoterepo $localrepo
b0600c6a
KK
2052 git --git-dir=$localrepo/.git remote set-url --push $REMOTE_PLD ssh://${GIT_PUSH}/$remoterepo
2053 fi
2054}
2055
ce5daafb 2056init_rpm_dir() {
0bf6d4a9
ER
2057 local TOP_DIR=$(eval $RPM $RPMOPTS --eval '%{_topdir}')
2058 local rpmdir=$(eval $RPM $RPMOPTS --eval '%{_rpmdir}')
2059 local buildir=$(eval $RPM $RPMOPTS --eval '%{_builddir}')
2060 local srpmdir=$(eval $RPM $RPMOPTS --eval '%{_srcrpmdir}')
ceda6f3c 2061 local TEMPLATES=template-specs
0bf6d4a9 2062 local tmp
ce5daafb 2063
0c8e5e9d 2064 echo "Initializing rpm directories to $TOP_DIR from $GIT_SERVER"
0bf6d4a9
ER
2065 mkdir -p $TOP_DIR $rpmdir $buildir $srpmdir
2066
2911d25f 2067 cd "$TOP_DIR"
b0600c6a
KK
2068 init_repository ${PACKAGES_DIR}/rpm-build-tools.git ../rpm-build-tools
2069 init_repository projects/$TEMPLATES ../$TEMPLATES
4ec6d58b 2070 for a in builder fetchsrc_request compile repackage; do
a4161989 2071 ln -sf ../rpm-build-tools/${a}.sh $a
885f2a00 2072 done
6e0b69d5
ER
2073 for a in md5; do
2074 ln -sf ../rpm-build-tools/${a} $a
2075 done
a4161989 2076 ln -sf ../rpm-build-tools/mirrors mirrors
ce5daafb 2077 init_builder
ce5daafb
ER
2078}
2079
6f10b394
ER
2080mr_proper() {
2081 init_builder
2082 NOCVSSPEC="yes"
2083 DONT_PRINT_REVISION="yes"
66a79c87
KK
2084
2085 # remove spec and sources
664084c6 2086 PATH=$CLEAN_PATH $RPMBUILD --clean --rmsource --rmspec --nodeps --define "__urlgetfile() %nil" --define "_specdir $PACKAGE_DIR" --define "_sourcedir $PACKAGE_DIR" --define "_builddir $builddir" $PACKAGE_DIR/$SPECFILE
bd71e706 2087 rm -rf $PACKAGE_DIR/{.git,.gitignore}
d37defc1 2088 rmdir --ignore-fail-on-non-empty $PACKAGE_DIR
6f10b394
ER
2089}
2090
cd445739
AM
2091#---------------------------------------------
2092# main()
2093
2d5c07df 2094if [ $# = 0 ]; then
518ff1fb 2095 usage
cd445739
AM
2096 exit 1
2097fi
2098
0b668a05
ER
2099# stuff global $BUILDER_OPTS from env as args
2100if [ "$BUILDER_OPTS" ]; then
2101 set -- "$BUILDER_OPTS" "$@"
2102fi
2103
2d5c07df 2104while [ $# -gt 0 ]; do
cd445739 2105 case "${1}" in
5efcb865 2106 -4|-6)
6d641507 2107 IPOPT="${1}"
5efcb865
ER
2108 shift
2109 ;;
2d5c07df 2110 -5 | --update-md5)
518ff1fb 2111 COMMAND="update_md5"
cd445739
AM
2112 NODIST="yes"
2113 NOCVSSPEC="yes"
cd445739
AM
2114 shift ;;
2115 -a5 | --add-md5 )
518ff1fb 2116 COMMAND="update_md5"
cd445739 2117 NODIST="yes"
cd445739 2118 NOCVSSPEC="yes"
cd445739
AM
2119 ADD5="yes"
2120 shift ;;
2121 -n5 | --no-md5 )
2122 NO5="yes"
2123 shift ;;
2124 -D | --debug )
2125 DEBUG="yes"; shift ;;
2126 -V | --version )
2127 COMMAND="version"; shift ;;
d43959a2
ER
2128 --short-version )
2129 COMMAND="short-version"; shift ;;
db9fdf51
ER
2130 -a | --add_cvs)
2131 COMMAND="add_cvs";
2132 shift ;;
3f79cb18
KK
2133 --all-branches )
2134 ALL_BRANCHES="yes"
2135 shift ;;
cd445739
AM
2136 -b | -ba | --build )
2137 COMMAND="build"; shift ;;
2138 -bb | --build-binary )
2139 COMMAND="build-binary"; shift ;;
6594293d
AG
2140 -bc )
2141 COMMAND="build-build"; shift ;;
2142 -bi )
2143 COMMAND="build-install"; shift ;;
2144 -bl )
2145 COMMAND="build-list"; shift ;;
cd445739
AM
2146 -bp | --build-prep )
2147 COMMAND="build-prep"; shift ;;
6594293d
AG
2148 -bs | --build-source )
2149 COMMAND="build-source"; shift ;;
cd445739
AM
2150 -B | --branch )
2151 COMMAND="branch"; shift; TAG="${1}"; shift;;
2152 -c | --clean )
387eaf99 2153 CLEAN="--clean"; shift ;;
39dcc7de 2154 -cf | --cvs-force )
df1306b5 2155 CVS_FORCE="-f"; shift;;
3189511a
KK
2156 --depth )
2157 DEPTH="--depth=$2"
2158 shift 2
2159 ;;
cd445739
AM
2160 -g | --get )
2161 COMMAND="get"; shift ;;
2162 -h | --help )
2163 COMMAND="usage"; shift ;;
fd71d65c
ER
2164 --ftp )
2165 PROTOCOL="ftp"; shift ;;
cd445739
AM
2166 --http )
2167 PROTOCOL="http"; shift ;;
6c5362e5
ER
2168 -j)
2169 RPMOPTS="${RPMOPTS} --define \"_smp_mflags -j$2\""
2170 shift 2
2171 ;;
2172 -j[0-9]*)
2173 RPMOPTS="${RPMOPTS} --define \"_smp_mflags $1\""
2174 shift
2175 ;;
d4c8d3a9
ER
2176 -p)
2177 PARALLEL_DOWNLOADS=$2
2178 shift 2
2179 ;;
2180 -p[0-9])
2181 PARALLEL_DOWNLOADS=${1#-p}
2182 shift
2183 ;;
cd445739
AM
2184 -l | --logtofile )
2185 shift; LOGFILE="${1}"; shift ;;
2186 -ni| --nice )
2187 shift; DEF_NICE_LEVEL=${1}; shift ;;
18e5347d
ER
2188 -ske | --skip-existing-files)
2189 SKIP_EXISTING_FILES="yes"; shift ;;
cd445739
AM
2190 -m | --mr-proper )
2191 COMMAND="mr-proper"; shift ;;
cd445739
AM
2192 -ncs | --no-cvs-specs )
2193 NOCVSSPEC="yes"; shift ;;
2194 -nd | --no-distfiles )
2195 NODIST="yes"; shift ;;
2196 -nm | --no-mirrors )
2197 NOMIRRORS="yes"; shift ;;
2198 -nu | --no-urls )
2199 NOURLS="yes"; shift ;;
2200 -ns | --no-srcs )
2201 NOSRCS="yes"; shift ;;
2202 -ns0 | --no-source0 )
2203 NOSOURCE0="yes"; shift ;;
2204 -nn | --no-net )
cd445739
AM
2205 NOCVSSPEC="yes"
2206 NODIST="yes"
2207 NOMIRRORS="yes"
2208 NOURLS="yes"
2209 NOSRCS="yes"
f09c0772 2210 ALWAYS_CVSUP="no"
cd445739 2211 shift;;
bc10f694
JB
2212 -pm | --prefer-mirrors )
2213 PREFMIRRORS="yes"
2214 shift;;
89e05bdd 2215 --noinit | --no-init )
29e90b02
JR
2216 NOINIT="yes"
2217 shift;;
cd445739 2218 --opts )
4250a189 2219 shift; RPMOPTS="${RPMOPTS} ${1}"; shift ;;
469e5fd1 2220 --nopatch | -np )
3accf718 2221 shift; RPMOPTS="${RPMOPTS} --define \"patch${1} : ignoring patch${1}; exit 1; \""; shift ;;
8bd5e66d
ER
2222 --skip-patch | -sp )
2223 shift; RPMOPTS="${RPMOPTS} --define \"patch${1} : skiping patch${1}\""; shift ;;
dfa39149
ER
2224 --topdir)
2225 RPMOPTS="${RPMOPTS} --define \"_topdir $2\""
2226 shift 2
2227 ;;
cd445739
AM
2228 --with | --without )
2229 case $GROUP_BCONDS in
2230 "yes")
2231 COND=${1}
2232 shift
c2e1d2a2 2233 # XXX: broken: ./builder -bb ucspi-tcp.spec --without mysql
cd445739
AM
2234 while ! `echo ${1}|grep -qE '(^-|spec)'`
2235 do
2236 BCOND="$BCOND $COND $1"
2237 shift
2238 done;;
2239 "no")
d4d1ec20 2240 if [[ "$2" = *,* ]]; then
ce40491a
ER
2241 for a in $(echo "$2" | tr , ' '); do
2242 BCOND="$BCOND $1 $a"
2243 done
d4d1ec20 2244 else
ce40491a 2245 BCOND="$BCOND $1 $2"
d4d1ec20
ER
2246 fi
2247 shift 2 ;;
cd445739
AM
2248 esac
2249 ;;
64ea5308 2250 --target )
2251 shift; TARGET="${1}"; shift ;;
6dd19291 2252 --target=* )
2253 TARGET=$(echo "${1}" | sed 's/^--target=//'); shift ;;
cd445739
AM
2254 -q | --quiet )
2255 QUIET="--quiet"; shift ;;
2256 --date )
d383b191
KK
2257 CVSDATE="${2}"; shift 2
2258 date -d "$CVSDATE" > /dev/null 2>&1 || { echo >&2 "No valid date specified"; exit 3; }
2259 ;;
cd445739 2260 -r | --cvstag )
3ccc5cef
ER
2261 CVSTAG="$2"
2262 shift 2
2263 ;;
5323fffd 2264 -A)
3ccc5cef 2265 shift
aa43ca3e 2266 CVSTAG="master"
3ccc5cef 2267 ;;
cd445739
AM
2268 -R | --fetch-build-requires)
2269 FETCH_BUILD_REQUIRES="yes"
2270 NOT_INSTALLED_PACKAGES=
2271 shift ;;
2272 -RB | --remove-build-requires)
2273 REMOVE_BUILD_REQUIRES="nice"
2274 shift ;;
2275 -FRB | --force-remove-build-requires)
2276 REMOVE_BUILD_REQUIRES="force"
2277 shift ;;
f982c603 2278 -sc | --source-cvs)
e15852ab
JR
2279 COMMAND="list-sources-cvs"
2280 shift ;;
ae58a474 2281 -sd | --source-distfiles)
06541433
JR
2282 COMMAND="list-sources-distfiles"
2283 shift ;;
ae58a474 2284 -sdp | --source-distfiles-paths)
06541433
JR
2285 COMMAND="list-sources-distfiles-paths"
2286 shift ;;
ae58a474 2287 -sf | --source-files)
a7eefc54 2288 COMMAND="list-sources-files"
95ad5bf0 2289 shift ;;
ae58a474 2290 -lsp | --source-paths)
a7eefc54 2291 COMMAND="list-sources-local-paths"
95ad5bf0 2292 shift ;;
ae58a474 2293 -su | --source-urls)
2dddf439
ER
2294 COMMAND="list-sources-urls"
2295 shift ;;
cd445739 2296 -Tvs | --tag-version-stable )
518ff1fb 2297 COMMAND="tag"
cd445739
AM
2298 TAG="STABLE"
2299 TAG_VERSION="yes"
2300 shift;;
cd445739 2301 -Ts | --tag-stable )
518ff1fb 2302 COMMAND="tag"
cd445739
AM
2303 TAG="STABLE"
2304 TAG_VERSION="no"
2305 shift;;
cd445739 2306 -Tv | --tag-version )
518ff1fb 2307 COMMAND="tag"
cd445739
AM
2308 TAG=""
2309 TAG_VERSION="yes"
2310 shift;;
2311 -Tp | --tag-prefix )
2312 TAG_PREFIX="$2"
2313 shift 2;;
2314 -tt | --test-tag )
2315 TEST_TAG="yes"
2316 shift;;
2317 -T | --tag )
518ff1fb 2318 COMMAND="tag"
cd445739
AM
2319 shift
2320 TAG="$1"
2321 TAG_VERSION="no"
2322 shift;;
50321881
JK
2323 -ir | --integer-release-only )
2324 INTEGER_RELEASE="yes"
2325 shift;;
cd445739 2326 -U | --update )
ecba6ad5 2327 COMMAND="update_md5"
cd445739
AM
2328 UPDATE="yes"
2329 NOCVSSPEC="yes"
2330 NODIST="yes"
cd445739
AM
2331 shift ;;
2332 -Upi | --update-poldek-indexes )
2333 UPDATE_POLDEK_INDEXES="yes"
2334 shift ;;
5eb1d24b 2335 --init-rpm-dir|--init)
518ff1fb 2336 COMMAND="init_rpm_dir"
ce5daafb 2337 shift ;;
cd445739
AM
2338 -u | --try-upgrade )
2339 TRY_UPGRADE="1"; shift ;;
0907f1eb
ER
2340 --upgrade-version )
2341 shift; UPGRADE_VERSION="$1"; shift;;
cd445739
AM
2342 -un | --try-upgrade-with-float-version )
2343 TRY_UPGRADE="1"; FLOAT_VERSION="1"; shift ;;
2344 -v | --verbose )
2345 BE_VERBOSE="1"; shift ;;
2346 --define)
2347 shift
2348 MACRO="${1}"
cf264933 2349 shift
2350 if echo "${MACRO}" | grep -q '\W'; then
2351 RPMOPTS="${RPMOPTS} --define \"${MACRO}\""
2352 else
2353 VALUE="${1}"
2354 shift
2355 RPMOPTS="${RPMOPTS} --define \"${MACRO} ${VALUE}\""
2356 fi
cd445739 2357 ;;
44058243
ER
2358 --alt_kernel)
2359 shift
5153358c 2360 RPMOPTS="${RPMOPTS} --define \"alt_kernel $1\" --define \"build_kernels $1\""
44058243
ER
2361 shift
2362 ;;
6594293d
AG
2363 --short-circuit)
2364 RPMBUILDOPTS="${RPMBUILDOPTS} --short-circuit"
2365 shift
2366 ;;
dfe2cb9a 2367 --show-bconds | -show-bconds | -print-bconds | --print-bconds | -display-bconds | --display-bconds )
518ff1fb 2368 COMMAND="show_bconds"
dfe2cb9a
MK
2369 shift
2370 ;;
9b78be50
ER
2371 --show-bcond-args)
2372 COMMAND="show_bcond_args"
2373 shift
2374 ;;
24a97174
ER
2375 --show-avail-bconds)
2376 COMMAND="show_avail_bconds"
2377 shift
2378 ;;
cd445739
AM
2379 --nodeps)
2380 shift
2381 RPMOPTS="${RPMOPTS} --nodeps"
2382 ;;
9243e80b 2383 -debug)
a08d92fc
ER
2384 RPMBUILDOPTS="${RPMBUILDOPTS} -debug"; shift
2385 ;;
bb4d488a 2386 -*)
a08d92fc
ER
2387 Exit_error err_invalid_cmdline "$1"
2388 ;;
bb4d488a 2389 *)
76997578 2390 SPECFILE=${1%/}; shift
f19103b5
AG
2391 # check if specname was passed as specname:cvstag
2392 if [ "${SPECFILE##*:}" != "${SPECFILE}" ]; then
518ff1fb
ER
2393 CVSTAG="${SPECFILE##*:}"
2394 SPECFILE="${SPECFILE%%:*}"
f19103b5 2395 fi
8f7946e0
ER
2396 # always have SPECFILE ending with .spec extension
2397 SPECFILE=${SPECFILE%%.spec}.spec
a8c9a155 2398 ASSUMED_NAME=$(basename ${SPECFILE%%.spec})
cd445739
AM
2399 esac
2400done
2401
3ccc5cef
ER
2402if [ "$CVSTAG" ]; then
2403 # pass $CVSTAG used by builder to rpmbuild too, so specs could use it
2404 RPMOPTS="$RPMOPTS --define \"_cvstag $CVSTAG\""
2405fi
2406
3f79cb18
KK
2407if [ -n "$ALL_BRANCHES" -a -z "$DEPTH" ]; then
2408 echo >&2 "--all branches requires --depth <number>"
2409 Exit_error err_invalid_cmdline
2410fi
2411
cd445739 2412if [ -n "$DEBUG" ]; then
518ff1fb
ER
2413 set -x
2414 set -v
cd445739
AM
2415fi
2416
2a5f078d 2417if [ -n "$TARGET" ]; then
2418 case "$RPMBUILD" in
2419 "rpmbuild")
2420 TARGET_SWITCH="--target $TARGET" ;;
2421 "rpm")
2422 TARGET_SWITCH="--target=$TARGET" ;;
2423 esac
2424fi
2425
86aafdbe
ER
2426if [ "$SCHEDTOOL" != "no" ]; then
2427 NICE_COMMAND="$SCHEDTOOL"
2428else
2429 NICE_COMMAND="nice -n ${DEF_NICE_LEVEL}"
2430fi
2431
6dd8b9cc
ER
2432# see time(1) for output format that could be used
2433TIME_COMMAND="time -p"
2434
c890b916 2435update_shell_title "$COMMAND"
cd445739 2436case "$COMMAND" in
117d9861
ER
2437 "show_bconds")
2438 init_builder
8b7889f3
ER
2439 if [ -z "$SPECFILE" ]; then
2440 Exit_error err_no_spec_in_cmdl
117d9861 2441 fi
8b7889f3
ER
2442 get_spec > /dev/null
2443 parse_spec
2444 set_bconds_values
2445 display_bconds
117d9861 2446 ;;
9b78be50
ER
2447 "show_bcond_args")
2448 init_builder
8b7889f3
ER
2449 if [ -z "$SPECFILE" ]; then
2450 Exit_error err_no_spec_in_cmdl
9b78be50 2451 fi
8b7889f3
ER
2452 get_spec > /dev/null
2453 parse_spec
2454 set_bconds_values
2455 echo "$BCOND"
24a97174
ER
2456 ;;
2457 "show_avail_bconds")
2458 init_builder
8b7889f3
ER
2459 if [ -z "$SPECFILE" ]; then
2460 Exit_error err_no_spec_in_cmdl
24a97174
ER
2461 fi
2462
8b7889f3
ER
2463 get_spec > /dev/null
2464 parse_spec
2465 local bcond_avail=$(find_spec_bcond $SPECFILE)
2466 local opt bcond bconds
2467 for opt in $bcond_avail; do
2468 case "$opt" in
2469 without_*)
2470 bcond=${opt#without_}
2471 bconds="$bconds $bcond"
2472 ;;
2473 with_*)
2474 bcond=${opt#with_}
2475 bconds="$bconds $bcond"
2476 ;;
2477 *)
2478 echo >&2 "ERROR: unexpected '$opt' in show_avail_bconds"
2479 exit 1
2480 ;;
2481 esac
2482 done
2483 echo $bconds
2484
9b78be50 2485 ;;
6594293d 2486 "build" | "build-binary" | "build-source" | "build-prep" | "build-build" | "build-install" | "build-list")
117d9861 2487 init_builder
db9fdf51
ER
2488 if [ -z "$SPECFILE" ]; then
2489 Exit_error err_no_spec_in_cmdl
2490 fi
62623fc0 2491
db9fdf51
ER
2492 # display SMP make flags if set
2493 smp_mflags=$(rpm -E %{?_smp_mflags})
2494 if [ "$smp_mflags" ]; then
2495 echo "builder: SMP make flags are set to $smp_mflags"
2496 fi
2497
2498 get_spec
2499 parse_spec
2500 set_bconds_values
2501 display_bconds
2502 display_branches
2503 if [ "$COMMAND" != "build-source" ]; then
2504 check_buildarch
2505 fi
2506 fetch_build_requires
2507 if [ "$INTEGER_RELEASE" = "yes" ]; then
2508 echo "Checking release $PACKAGE_RELEASE..."
2509 if echo $PACKAGE_RELEASE | grep -q '^[^.]*\.[^.]*$' 2>/dev/null ; then
2510 Exit_error err_fract_rel "$PACKAGE_RELEASE"
cd445739 2511 fi
db9fdf51 2512 fi
cd445739 2513
db9fdf51
ER
2514 # ./builder -bs test.spec -r AC-branch -Tp auto-ac- -tt
2515 if [ -n "$TEST_TAG" ]; then
2516 local TAGVER=`make_tagver`
2fc07e25 2517 tag_exist $TAGVER || [ $TAGVER = $CVSTAG ] || Exit_error err_tag_exists $TAGVER
8c043136 2518 # check also tags created in CVS
2fc07e25 2519 local TAGVER_CVS=$(echo $TAGVER | tr '[.@]' '[_#]')
d03404e7
KK
2520 local CVSTAG_CVS=$(echo $CVSTAG | tr '[.@]' '[_#]')
2521 tag_exist $TAGVER_CVS || [ $TAGVER_CVS = $CVSTAG_CVS ] \
2522 || Exit_error err_tag_exists $TAGVER_CVS
db9fdf51 2523 # - do not allow to build from HEAD when XX-branch exists
2200d50e 2524 TREE_PREFIX=$(echo "$TAG_PREFIX" | sed -e 's#^auto/\([a-zA-Z]\+\)/.*#\1#g')
b6c4f6ba 2525 if [ "$TAGVER" != "$CVSTAG" -a "$TAGVER_CVS" != "$CVSTAG" -a "$TREE_PREFIX" != "$TAG_PREFIX" ]; then
db9fdf51 2526 TAG_BRANCH="${TREE_PREFIX}-branch"
f9b0409c
KK
2527 if [ -n "$DEPTH" ]; then
2528 cmd_branches="git ls-remote --heads"
2529 ref_prefix=refs/heads
2530 else
2531 cmd_branches="git show-ref"
2532 ref_prefix=refs/remotes/${REMOTE_PLD}
2533 fi
0c6ce8b5
KK
2534 TAG_STATUS=$($cmd_branches | grep -i "${ref_prefix}/$TAG_BRANCH$" | cut -c'-40')
2535 if [ -n "$TAG_STATUS" -a "$TAG_STATUS" != $(git rev-parse "$CVSTAG") ]; then
db9fdf51 2536 Exit_error err_branch_exists "$TAG_STATUS"
074de301 2537 fi
2a5f078d 2538 fi
2539
cd445739 2540 fi
db9fdf51
ER
2541
2542 if [ -n "$NOSOURCE0" ] ; then
2543 SOURCES=`echo $SOURCES | xargs | sed -e 's/[^ ]*//'`
2544 fi
2545 try_upgrade
2546 case $? in
2547 0)
2548 get_files $SOURCES $PATCHES
d3df4e78 2549 check_md5 $SOURCES $PATCHES
db9fdf51
ER
2550 ;;
2551 *)
2552 NODIST="yes" get_files $SOURCES $PATCHES
647e3d7f 2553 update_md5 $SOURCES $PATCHES
db9fdf51
ER
2554 ;;
2555 esac
2556 build_package
fe7c0a38 2557 if [ "$UPDATE_POLDEK_INDEXES" = "yes" ] && [ "$COMMAND" = "build" -o "$COMMAND" = "build-binary" ]; then
8a390970 2558 run_poldek --sdir="${POLDEK_INDEX_DIR}" ${UPDATE_POLDEK_INDEXES_OPTS} --mkidxz
db9fdf51
ER
2559 fi
2560 remove_build_requires
2a5f078d 2561 ;;
cd445739 2562 "branch" )
518ff1fb 2563 init_builder
db9fdf51 2564 if [ -z "$SPECFILE" ]; then
518ff1fb 2565 Exit_error err_no_spec_in_cmdl
cd445739 2566 fi
db9fdf51
ER
2567
2568 get_spec
2569 parse_spec
f663f264 2570 branch_files $TAG
cd445739 2571 ;;
703b6deb
ER
2572 "add_cvs" )
2573 init_builder
2574 if [ -z "$SPECFILE" ]; then
2575 Exit_error err_no_spec_in_cmdl
2576 fi
2577
406b9ecf
KK
2578 create_git_repo
2579 if [ -n "$NEW_REPO" ]; then
2580 parse_spec
2581 local file
2582 for file in $SOURCES $PATCHES; do
2583 if [ -z $(src_md5 "$file") ]; then
2584 git add $file || Exit_error err_no_source_in_repo $file
2585 else
2586 cvsignore_df `nourl $file`
2587 fi
2588 done
2589 git add $SPECFILE
c9933bf8 2590 echo "When you are ready commit your changes and run git push origin master"
406b9ecf
KK
2591 else
2592 echo "You had already git repository. Push chosen branches to remote: ${REMOTE_PLD}"
703b6deb 2593 fi
703b6deb 2594 ;;
cd445739 2595 "get" )
518ff1fb 2596 init_builder
db9fdf51 2597 if [ -z "$SPECFILE" ]; then
518ff1fb 2598 Exit_error err_no_spec_in_cmdl
ecba6ad5 2599 fi
db9fdf51
ER
2600
2601 get_spec
2602 parse_spec
2603
2604 if [ -n "$NOSOURCE0" ] ; then
2605 SOURCES=`echo $SOURCES | xargs | sed -e 's/[^ ]*//'`
2606 fi
2607 get_files $SOURCES $PATCHES
2608 check_md5 $SOURCES
652dc2d1 2609 fetch_build_requires
ecba6ad5
ER
2610 ;;
2611 "update_md5" )
518ff1fb 2612 init_builder
db9fdf51 2613 if [ -z "$SPECFILE" ]; then
518ff1fb 2614 Exit_error err_no_spec_in_cmdl
cd445739 2615 fi
db9fdf51
ER
2616
2617 get_spec
2618 parse_spec
2619
2620 if [ -n "$NOSOURCE0" ] ; then
2621 SOURCES=`echo $SOURCES | xargs | sed -e 's/[^ ]*//'`
2622 fi
647e3d7f 2623 update_md5 $SOURCES $PATCHES
cd445739
AM
2624 ;;
2625 "tag" )
2626 NOURLS=1
f7b91886 2627 NODIST="yes"
518ff1fb 2628 init_builder
db9fdf51 2629 if [ -z "$SPECFILE" ]; then
518ff1fb 2630 Exit_error err_no_spec_in_cmdl
cd445739 2631 fi
db9fdf51 2632
db9fdf51 2633 parse_spec
cc4edaf4
KK
2634 if [ ! -d .git ]; then
2635 echo "No git reposiotory" >&2
2636 exit 101
2637 fi
1fb35df5 2638 tag_files
cd445739
AM
2639 ;;
2640 "mr-proper" )
6f10b394 2641 mr_proper
cd445739 2642 ;;
a7eefc54 2643 "list-sources-files" )
2644 init_builder
2645 NOCVSSPEC="yes"
2646 DONT_PRINT_REVISION="yes"
2647 get_spec
2648 parse_spec
ecba6ad5 2649 for SAP in $SOURCES $PATCHES; do
ce40491a 2650 echo $SAP | awk '{gsub(/.*\//,"") ; print}'
a7eefc54 2651 done
2652 ;;
2dddf439 2653 "list-sources-urls" )
fe61ecd4 2654 init_builder >&2
2dddf439
ER
2655 NOCVSSPEC="yes"
2656 DONT_PRINT_REVISION="yes"
fe61ecd4
ER
2657 get_spec >&2
2658 parse_spec >&2
2dddf439 2659 SAPS="$SOURCES $PATCHES"
fe61ecd4 2660 for SAP in $SAPS; do
ce40491a 2661 echo $SAP
2dddf439
ER
2662 done
2663 ;;
a7eefc54 2664 "list-sources-local-paths" )
2665 init_builder
2666 NOCVSSPEC="yes"
2667 DONT_PRINT_REVISION="yes"
2668 get_spec
2669 parse_spec
ecba6ad5 2670 for SAP in $SOURCES $PATCHES; do
9c909460 2671 echo $PACKAGE_DIR/$(echo $SAP | awk '{gsub(/.*\//,"") ; print }')
a7eefc54 2672 done
2673 ;;
06541433
JR
2674 "list-sources-distfiles-paths" )
2675 init_builder
2676 NOCVSSPEC="yes"
2677 DONT_PRINT_REVISION="yes"
2678 get_spec
2679 parse_spec
ecba6ad5 2680 for SAP in $SOURCES $PATCHES; do
06541433
JR
2681 if [ -n "$(src_md5 "$SAP")" ]; then
2682 distfiles_path "$SAP"
2683 fi
2684 done
2685 ;;
2686 "list-sources-distfiles" )
2687 init_builder
2688 NOCVSSPEC="yes"
2689 DONT_PRINT_REVISION="yes"
2690 get_spec
2691 parse_spec
ecba6ad5 2692 for SAP in $SOURCES $PATCHES; do
06541433
JR
2693 if [ -n "$(src_md5 "$SAP")" ]; then
2694 distfiles_url "$SAP"
2695 fi
2696 done
2697 ;;
e15852ab
JR
2698 "list-sources-cvs" )
2699 init_builder
2700# NOCVSSPEC="yes"
2701 DONT_PRINT_REVISION="yes"
2702 get_spec
2703 parse_spec
2704 for SAP in $SOURCES $PATCHES; do
2705 if [ -z "$(src_md5 "$SAP")" ]; then
2706 echo $SAP | awk '{gsub(/.*\//,"") ; print}'
2707 fi
2708 done
2709 ;;
ce5daafb
ER
2710 "init_rpm_dir")
2711 init_rpm_dir
2712 ;;
cd445739 2713 "usage" )
d43959a2
ER
2714 usage
2715 ;;
2716 "short-version" )
2717 echo "$VERSION"
2718 ;;
cd445739 2719 "version" )
d43959a2
ER
2720 echo "$VERSIONSTRING"
2721 ;;
bde1c404 2722esac
31898c61
AM
2723if [ -f "`pwd`/.${SPECFILE}_INSTALLED_PACKAGES" -a "$REMOVE_BUILD_REQUIRES" != "" ]; then
2724 rm "`pwd`/.${SPECFILE}_INSTALLED_PACKAGES"
03d5c71d 2725fi
cd445739
AM
2726cd "$__PWD"
2727
73848362 2728# vi:syntax=sh:ts=4:sw=4:noet
This page took 1.395571 seconds and 4 git commands to generate.