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