]> git.pld-linux.org Git - packages/rpm-build-tools.git/blame - builder.sh
fix some fedora packages
[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
1653 local specdir=$(insert_gitlog $SPECFILE)
1654 # FIXME: eval here is exactly why?
6dd8b9cc 1655 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
1656 retval=$?
1657 rm -r $specdir
1658
1659 if [ -n "$logfile" ] && [ -n "$LOGDIROK" ] && [ -n "$LOGDIRFAIL" ]; then
1660 if [ "$retval" -eq "0" ]; then
1661 mv $logfile $LOGDIROK
1662 else
1663 mv $logfile $LOGDIRFAIL
cd445739 1664 fi
8ba5cdda 1665 fi
12da9e3d
ER
1666
1667 if [ "$retval" -ne "0" ]; then
cd445739 1668 if [ -n "$TRY_UPGRADE" ]; then
cacef28c 1669 echo "\nUpgrade package to new version failed."
257af81b 1670 if [ "$REVERT_BROKEN_UPGRADE" = "yes" ]; then
cacef28c 1671 echo "Restoring old spec file."
257af81b
ER
1672 mv -f $SPECFILE.bak $SPECFILE
1673 fi
cacef28c 1674 echo ""
cd445739 1675 fi
518ff1fb 1676 Exit_error err_build_fail
cd445739
AM
1677 fi
1678 unset BUILD_SWITCH
1679}
1680
f6711e2a 1681nourl() {
cd445739
AM
1682 echo "$@" | sed 's#\<\(ftp\|http\|https\|cvs\|svn\)://[^ ]*/##g'
1683}
1684
f6711e2a 1685install_required_packages() {
cd445739
AM
1686 run_poldek -vi $1
1687 return $?
1688}
1689
f6711e2a 1690find_spec_bcond() { # originally from /usr/lib/rpm/find-spec-bcond
fa4bf1df 1691 local SPEC="$1"
fa4bf1df
ER
1692 awk -F"\n" '
1693 /^%changelog/ { exit }
fa4bf1df
ER
1694 /^%bcond_with/{
1695 match($0, /bcond_with(out)?[ \t]+[_a-zA-Z0-9]+/);
8ff97f39
ER
1696 bcond = substr($0, RSTART + 6, RLENGTH - 6);
1697 gsub(/[ \t]+/, "_", bcond);
fa4bf1df
ER
1698 print bcond
1699 }' $SPEC | LC_ALL=C sort -u
1700}
1701
117d9861 1702process_bcondrc() {
301cbfd4
ER
1703 # expand bconds from ~/.bcondrc
1704 # The file structure is like gentoo's package.use:
1705 # ---
1706 # * -selinux
1707 # samba -mysql -pgsql
47a8df12 1708 # w32codec-installer license_agreement
301cbfd4
ER
1709 # php +mysqli
1710 # ---
15e34b63 1711 if [ -f $HOME/.bcondrc ] || ([ -n $HOME_ETC ] && [ -f $HOME_ETC/.bcondrc ]); then
117d9861
ER
1712 :
1713 else
1714 return
1715 fi
301cbfd4 1716
117d9861 1717 SN=${SPECFILE%%\.spec}
c8a3e2ac 1718
117d9861
ER
1719 local bcondrc=$HOME/.bcondrc
1720 [ -n $HOME_ETC ] && [ -f $HOME_ETC/.bcondrc ] && bcondrc=$HOME_ETC/.bcondrc
301cbfd4 1721
117d9861 1722 local bcond_avail=$(find_spec_bcond $SPECFILE)
301cbfd4 1723
117d9861
ER
1724 while read pkg flags; do
1725 # ignore comments
1726 [[ "$pkg" == \#* ]] && continue
1727
1728 # any package or current package?
1729 if [ "$pkg" = "*" ] || [ "$pkg" = "$PACKAGE_NAME" ] || [ "$pkg" = "$SN" ]; then
1730 for flag in $flags; do
1731 local opt=${flag#[+-]}
1732
1733 # use only flags which are in this package.
1734 if [[ $bcond_avail = *${opt}* ]]; then
1735 if [[ $flag = -* ]]; then
1736 if [[ $BCOND != *--with?${opt}* ]]; then
1737 BCOND="$BCOND --without $opt"
1738 fi
1739 else
1740 if [[ $BCOND != *--without?${opt}* ]]; then
1741 BCOND="$BCOND --with $opt"
301cbfd4
ER
1742 fi
1743 fi
117d9861
ER
1744 fi
1745 done
1746 fi
1747 done < $bcondrc
1748 update_shell_title "parse ~/.bcondrc: DONE!"
1749}
1750
8ff97f39 1751set_bconds_values() {
117d9861
ER
1752 update_shell_title "set bcond values"
1753
1754 AVAIL_BCONDS_WITHOUT=""
1755 AVAIL_BCONDS_WITH=""
8ff97f39 1756
5a28189c 1757 if grep -Eq '^# *_with' ${SPECFILE}; then
8ff97f39
ER
1758 echo >&2 "ERROR: This spec has old style bconds."
1759 exit 1
1760 fi
1761
1762 if ! grep -q '^%bcond' ${SPECFILE}; then
117d9861 1763 return
301cbfd4
ER
1764 fi
1765
117d9861
ER
1766 local bcond_avail=$(find_spec_bcond $SPECFILE)
1767 process_bcondrc "$SPECFILE"
1768
fa4bf1df 1769 update_shell_title "parse bconds"
2a5f078d 1770
8ff97f39
ER
1771 local opt bcond
1772 for opt in $bcond_avail; do
1773 case "$opt" in
1774 without_*)
1775 bcond=${opt#without_}
10d92f71
ER
1776 case "$BCOND" in
1777 *--without?${bcond}*)
8ff97f39 1778 AVAIL_BCONDS_WITHOUT="$AVAIL_BCONDS_WITHOUT <$bcond>"
10d92f71
ER
1779 ;;
1780 *)
8ff97f39 1781 AVAIL_BCONDS_WITHOUT="$AVAIL_BCONDS_WITHOUT $bcond"
10d92f71
ER
1782 ;;
1783 esac
cd445739 1784 ;;
8ff97f39
ER
1785 with_*)
1786 bcond=${opt#with_}
10d92f71
ER
1787 case "$BCOND" in
1788 *--with?${bcond}*)
8ff97f39 1789 AVAIL_BCONDS_WITH="$AVAIL_BCONDS_WITH <$bcond>"
10d92f71
ER
1790 ;;
1791 *)
8ff97f39 1792 AVAIL_BCONDS_WITH="$AVAIL_BCONDS_WITH $bcond"
10d92f71
ER
1793 ;;
1794 esac
cd445739 1795 ;;
8ff97f39
ER
1796 *)
1797 echo >&2 "ERROR: unexpected '$opt' in set_bconds_values"
1798 exit 1
1799 ;;
1800 esac
1801 done
cd445739
AM
1802}
1803
f6711e2a 1804run_sub_builder() {
cd445739 1805 package_name="${1}"
af6b168f 1806 update_shell_title "run_sub_builder $package_name"
cd445739 1807 #
8f64e264
ER
1808 # No i tutaj bym chciał zrobić sztuczną inteligencję, która spróbuje tego
1809 # pakieta zbudować. Aktualnie niewiele dziala, bo generalnie nie widze do
cd445739
AM
1810 # konca algorytmu... Ale damy rade. :) Na razie po prostu sie wyjebie tak samo
1811 # jakby nie bylo tego kawalka kodu.
1812 #
8f64e264
ER
1813 # Update: Poprawiłem parę rzeczy i zaczęło generować pakiety spoza zadanej listy.
1814 # Jednym słowem budowanie niespoldkowanych zależności działa w paru przypadkach.
cd445739
AM
1815 #
1816 #
1817 # y0shi.
a8c9a155 1818 # kurwa. translate that ^^^^
cd445739
AM
1819
1820 parent_spec_name=''
1821
cd445739 1822 # Istnieje taki spec? ${package}.spec
9c909460 1823 if [ -f "${PACKAGE_DIR}/${package}.spec" ]; then
cd445739 1824 parent_spec_name=${package}.spec
9c909460 1825 elif [ -f "${PACKAGE_DIR}/$(echo ${package_name} | sed -e s,-devel.*,,g -e s,-static,,g).spec" ]; then
a8c9a155 1826 parent_spec_name="$(echo ${package_name} | sed -e s,-devel.*,,g -e s,-static,,g).spec"
d6a77ddb 1827 else
9c909460 1828 for provides_line in $(grep -r ^Provides:.*$package ${PACKAGE_DIR}); do
cd445739
AM
1829 echo $provides_line
1830 done
1831 fi
1832
1833 if [ "${parent_spec_name}" != "" ]; then
af6b168f 1834 spawn_sub_builder $parent_spec_name
cd445739
AM
1835 fi
1836 NOT_INSTALLED_PACKAGES="$NOT_INSTALLED_PACKAGES $package_name"
1837}
1838
aa7e48da
ER
1839# install package with poldek
1840# @return exit code from poldek
1841#
1842# this requires following sudo rules:
dd5f5cd7 1843# - poldek --noask --caplookup -uG
aa7e48da 1844poldek_install() {
d95f0e69 1845 LANG=C $POLDEK_CMD --noask --caplookup --uniq -uG "$@"
aa7e48da
ER
1846}
1847
1848# install packages
dd5f5cd7
ER
1849#
1850# this requires following sudo rules:
1851# - poldek -q --update --upa
aa7e48da
ER
1852install_packages() {
1853 # sync poldek indexes once per invocation
1854 if [ -z "$package_indexes_updated" ]; then
1855 update_shell_title "poldek: update indexes"
1856 $POLDEK_CMD -q --update --upa
1857 package_indexes_updated=true
1858 fi
1859
1860 update_shell_title "install packages: $*"
1861 poldek_install "$@" && return
1862
1863 # retry install, install packages one by one
1864 # this is slower one
1865 local rc=0 package
1866 for package in $*; do
1867 package=$(depspecname $package)
1868 update_shell_title "install package: $package"
1869 poldek_install "$package" || rc=$?
1870 done
1871 return $rc
1872}
1873
1874uninstall_packages() {
1875 update_shell_title "uninstall packages: $*"
1876 $POLDEK_CMD --noask --nofollow -ev "$@"
1877}
1878
f6711e2a 1879spawn_sub_builder() {
ce40491a
ER
1880 package_name="${1}"
1881 update_shell_title "spawn_sub_builder $package_name"
af6b168f 1882
ce40491a 1883 sub_builder_opts=''
c2d6312c 1884 if [ "${FETCH_BUILD_REQUIRES}" = "yes" ]; then
ce40491a
ER
1885 sub_builder_opts="${sub_builder_opts} -R"
1886 fi
c2d6312c 1887 if [ "${REMOVE_BUILD_REQUIRES}" = "nice" ]; then
ce40491a 1888 sub_builder_opts="${sub_builder_opts} -RB"
c2d6312c 1889 elif [ "${REMOVE_BUILD_REQUIRES}" = "force" ]; then
ce40491a
ER
1890 sub_builder_opts="${sub_builder_opts} -FRB"
1891 fi
c2d6312c 1892 if [ "${UPDATE_POLDEK_INDEXES}" = "yes" ]; then
ce40491a
ER
1893 sub_builder_opts="${sub_builder_opts} -Upi"
1894 fi
af6b168f 1895
9c909460 1896 cd "${PACKAGE_DIR}"
ce40491a 1897 ./builder ${sub_builder_opts} "$@"
af6b168f
ER
1898}
1899
f6711e2a 1900remove_build_requires() {
cd445739
AM
1901 if [ "$INSTALLED_PACKAGES" != "" ]; then
1902 case "$REMOVE_BUILD_REQUIRES" in
1903 "force")
1904 run_poldek --noask -ve $INSTALLED_PACKAGES
1905 ;;
1906 "nice")
1907 run_poldek --ask -ve $INSTALLED_PACKAGES
1908 ;;
1909 *)
1910 echo You may want to manually remove following BuildRequires fetched:
1911 echo $INSTALLED_PACKAGES
90baf90b 1912 echo "Try poldek -e \`cat $(pwd)/.${SPECFILE}_INSTALLED_PACKAGES\`"
cd445739
AM
1913 ;;
1914 esac
1915 fi
1916}
1917
f6711e2a 1918display_bconds() {
8ff97f39
ER
1919 if [ "$AVAIL_BCONDS_WITH" -o "$AVAIL_BCONDS_WITHOUT" ]; then
1920 if [ "$BCOND" ]; then
10d92f71
ER
1921 echo ""
1922 echo "Building $SPECFILE with the following conditional flags:"
1923 echo -n "$BCOND"
cd445739 1924 else
10d92f71
ER
1925 echo ""
1926 echo "No conditional flags passed"
cd445739 1927 fi
10d92f71
ER
1928 echo ""
1929 echo "from available:"
1930 echo "--with :\t$AVAIL_BCONDS_WITH"
1931 echo "--without:\t$AVAIL_BCONDS_WITHOUT"
1932 echo ""
cd445739
AM
1933 fi
1934}
1935
f6711e2a 1936display_branches() {
a0fc9d5b 1937 echo -n "Available branches: "
9fd1eb80 1938 git branch -r 2>/dev/null | grep "^ ${REMOTE_PLD}" | grep -v ${REMOTE_PLD}/HEAD | sed "s#^ *${REMOTE_PLD}/##" | xargs
ec4dbe02
AM
1939}
1940
aa7e48da 1941# checks a given list of packages/files/provides against current rpmdb.
ea26d7fc 1942# outputs all dependencies which current rpmdb doesn't satisfy.
af213c6e 1943# input can be either STDIN or parameters
f6711e2a 1944_rpm_prov_check() {
e99e2f34 1945 local deps out
af213c6e 1946
ea26d7fc 1947 if [ $# -gt 0 ]; then
e99e2f34 1948 deps="$@"
ce40491a 1949 else
e99e2f34 1950 deps=$(cat)
ce40491a 1951 fi
af213c6e 1952
e99e2f34 1953 out=$(LC_ALL=C rpm -q --whatprovides $deps 2>&1)
af213c6e 1954
ce40491a 1955 # packages
e99e2f34 1956 echo "$out" | awk '/^no package provides/ { print $NF }'
af213c6e 1957
ce40491a 1958 # other deps (files)
e99e2f34 1959 echo "$out" | sed -rne 's/file (.*): No such file or directory/\1/p'
af213c6e
ER
1960}
1961
1962# checks if given package/files/provides exists in rpmdb.
ea26d7fc
ER
1963# input can be either stdin or parameters
1964# returns packages which are present in the rpmdb
f6711e2a 1965_rpm_cnfl_check() {
ce40491a 1966 local DEPS
af213c6e 1967
ea26d7fc 1968 if [ $# -gt 0 ]; then
ce40491a
ER
1969 DEPS="$@"
1970 else
1971 DEPS=$(cat)
1972 fi
af213c6e 1973
5ce6ccff 1974 LANG=C rpm -q --whatprovides $DEPS 2>/dev/null | awk '!/no package provides/ { print }'
af213c6e
ER
1975}
1976
18e0f841
ER
1977# install deps via information from 'rpm-getdeps' or 'rpm --specsrpm'
1978install_build_requires_rpmdeps() {
aa7e48da 1979 local DEPS CNFL
18e0f841
ER
1980 if [ "$FETCH_BUILD_REQUIRES_RPMGETDEPS" = "yes" ]; then
1981 # TODO: Conflicts list doesn't check versions
aa7e48da
ER
1982 CNFL=$(rpm-getdeps $BCOND $SPECFILE 2> /dev/null | awk '/^\-/ { print $3 } ' | _rpm_cnfl_check | xargs)
1983 DEPS=$(rpm-getdeps $BCOND $SPECFILE 2> /dev/null | awk '/^\+/ { print $3 } ' | _rpm_prov_check | xargs)
18e0f841
ER
1984 fi
1985 if [ "$FETCH_BUILD_REQUIRES_RPMSPECSRPM" = "yes" ]; then
aa7e48da
ER
1986 CNFL=$(rpm -q --specsrpm --conflicts $BCOND $SPECFILE | awk '{print $1}' | _rpm_cnfl_check | xargs)
1987 DEPS=$(rpm -q --specsrpm --requires $BCOND $SPECFILE | awk '{print $1}' | _rpm_prov_check | xargs)
18e0f841
ER
1988 fi
1989
18e0f841 1990 if [ -n "$CNFL" ]; then
e99e2f34 1991 echo "Uninstall conflicting packages: $CNFL"
aa7e48da
ER
1992 uninstall_packages $CNFL
1993 fi
1994
1995 if [ -n "$DEPS" ]; then
e99e2f34 1996 echo "Install dependencies: $DEPS"
aa7e48da
ER
1997 install_packages $DEPS
1998 fi
18e0f841 1999}
af213c6e 2000
18e0f841
ER
2001fetch_build_requires()
2002{
2003 if [ "${FETCH_BUILD_REQUIRES}" != "yes" ]; then
2004 return
2005 fi
2dddf439 2006
18e0f841
ER
2007 update_shell_title "fetch build requires"
2008 if [ "$FETCH_BUILD_REQUIRES_RPMGETDEPS" = "yes" ] || [ "$FETCH_BUILD_REQUIRES_RPMSPECSRPM" = "yes" ]; then
2009 install_build_requires_rpmdeps
2010 return
2011 fi
2a5f078d 2012
aa7e48da 2013 die "need rpm-getdeps tool"
cd445739
AM
2014}
2015
b0600c6a
KK
2016init_repository() {
2017 local remoterepo=$1
2018 local localrepo=$2
2019
2020 if [ ! -e $localrepo ]; then
2021 git clone -o $REMOTE_PLD ${GIT_SERVER}/$remoterepo $localrepo
2022 git --git-dir=$localrepo/.git remote set-url --push $REMOTE_PLD ssh://${GIT_PUSH}/$remoterepo
2023 fi
2024}
2025
ce5daafb 2026init_rpm_dir() {
0bf6d4a9
ER
2027 local TOP_DIR=$(eval $RPM $RPMOPTS --eval '%{_topdir}')
2028 local rpmdir=$(eval $RPM $RPMOPTS --eval '%{_rpmdir}')
2029 local buildir=$(eval $RPM $RPMOPTS --eval '%{_builddir}')
2030 local srpmdir=$(eval $RPM $RPMOPTS --eval '%{_srcrpmdir}')
ceda6f3c 2031 local TEMPLATES=template-specs
0bf6d4a9 2032 local tmp
ce5daafb 2033
0c8e5e9d 2034 echo "Initializing rpm directories to $TOP_DIR from $GIT_SERVER"
0bf6d4a9
ER
2035 mkdir -p $TOP_DIR $rpmdir $buildir $srpmdir
2036
2911d25f 2037 cd "$TOP_DIR"
b0600c6a
KK
2038 init_repository ${PACKAGES_DIR}/rpm-build-tools.git ../rpm-build-tools
2039 init_repository projects/$TEMPLATES ../$TEMPLATES
639c7cec 2040 for a in adapter builder fetchsrc_request compile repackage; do
a4161989 2041 ln -sf ../rpm-build-tools/${a}.sh $a
885f2a00 2042 done
6e0b69d5
ER
2043 for a in md5; do
2044 ln -sf ../rpm-build-tools/${a} $a
2045 done
a4161989 2046 ln -sf ../rpm-build-tools/mirrors mirrors
ce5daafb 2047 init_builder
ce5daafb
ER
2048}
2049
6f10b394
ER
2050mr_proper() {
2051 init_builder
2052 NOCVSSPEC="yes"
2053 DONT_PRINT_REVISION="yes"
66a79c87
KK
2054
2055 # remove spec and sources
664084c6 2056 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 2057 rm -rf $PACKAGE_DIR/{.git,.gitignore}
d37defc1 2058 rmdir --ignore-fail-on-non-empty $PACKAGE_DIR
6f10b394
ER
2059}
2060
cd445739
AM
2061#---------------------------------------------
2062# main()
2063
2d5c07df 2064if [ $# = 0 ]; then
518ff1fb 2065 usage
cd445739
AM
2066 exit 1
2067fi
2068
0b668a05
ER
2069# stuff global $BUILDER_OPTS from env as args
2070if [ "$BUILDER_OPTS" ]; then
2071 set -- "$BUILDER_OPTS" "$@"
2072fi
2073
2d5c07df 2074while [ $# -gt 0 ]; do
cd445739 2075 case "${1}" in
5efcb865
ER
2076 -4|-6)
2077 # NOTE: we should be fetcher specific, like fille WGET_OPTS, but
2078 # unfortunately $GETURI is already formed
2079 GETURI="$GETURI $1"
2080 shift
2081 ;;
2d5c07df 2082 -5 | --update-md5)
518ff1fb 2083 COMMAND="update_md5"
cd445739
AM
2084 NODIST="yes"
2085 NOCVSSPEC="yes"
cd445739
AM
2086 shift ;;
2087 -a5 | --add-md5 )
518ff1fb 2088 COMMAND="update_md5"
cd445739 2089 NODIST="yes"
cd445739 2090 NOCVSSPEC="yes"
cd445739
AM
2091 ADD5="yes"
2092 shift ;;
2093 -n5 | --no-md5 )
2094 NO5="yes"
2095 shift ;;
2096 -D | --debug )
2097 DEBUG="yes"; shift ;;
2098 -V | --version )
2099 COMMAND="version"; shift ;;
d43959a2
ER
2100 --short-version )
2101 COMMAND="short-version"; shift ;;
db9fdf51
ER
2102 -a | --add_cvs)
2103 COMMAND="add_cvs";
2104 shift ;;
3f79cb18
KK
2105 --all-branches )
2106 ALL_BRANCHES="yes"
2107 shift ;;
cd445739
AM
2108 -b | -ba | --build )
2109 COMMAND="build"; shift ;;
2110 -bb | --build-binary )
2111 COMMAND="build-binary"; shift ;;
6594293d
AG
2112 -bc )
2113 COMMAND="build-build"; shift ;;
2114 -bi )
2115 COMMAND="build-install"; shift ;;
2116 -bl )
2117 COMMAND="build-list"; shift ;;
cd445739
AM
2118 -bp | --build-prep )
2119 COMMAND="build-prep"; shift ;;
6594293d
AG
2120 -bs | --build-source )
2121 COMMAND="build-source"; shift ;;
cd445739
AM
2122 -B | --branch )
2123 COMMAND="branch"; shift; TAG="${1}"; shift;;
2124 -c | --clean )
387eaf99 2125 CLEAN="--clean"; shift ;;
39dcc7de 2126 -cf | --cvs-force )
df1306b5 2127 CVS_FORCE="-f"; shift;;
3189511a
KK
2128 --depth )
2129 DEPTH="--depth=$2"
2130 shift 2
2131 ;;
cd445739
AM
2132 -g | --get )
2133 COMMAND="get"; shift ;;
2134 -h | --help )
2135 COMMAND="usage"; shift ;;
fd71d65c
ER
2136 --ftp )
2137 PROTOCOL="ftp"; shift ;;
cd445739
AM
2138 --http )
2139 PROTOCOL="http"; shift ;;
6c5362e5
ER
2140 -j)
2141 RPMOPTS="${RPMOPTS} --define \"_smp_mflags -j$2\""
2142 shift 2
2143 ;;
2144 -j[0-9]*)
2145 RPMOPTS="${RPMOPTS} --define \"_smp_mflags $1\""
2146 shift
2147 ;;
d4c8d3a9
ER
2148 -p)
2149 PARALLEL_DOWNLOADS=$2
2150 shift 2
2151 ;;
2152 -p[0-9])
2153 PARALLEL_DOWNLOADS=${1#-p}
2154 shift
2155 ;;
cd445739
AM
2156 -l | --logtofile )
2157 shift; LOGFILE="${1}"; shift ;;
2158 -ni| --nice )
2159 shift; DEF_NICE_LEVEL=${1}; shift ;;
18e5347d
ER
2160 -ske | --skip-existing-files)
2161 SKIP_EXISTING_FILES="yes"; shift ;;
cd445739
AM
2162 -m | --mr-proper )
2163 COMMAND="mr-proper"; shift ;;
cd445739
AM
2164 -ncs | --no-cvs-specs )
2165 NOCVSSPEC="yes"; shift ;;
2166 -nd | --no-distfiles )
2167 NODIST="yes"; shift ;;
2168 -nm | --no-mirrors )
2169 NOMIRRORS="yes"; shift ;;
2170 -nu | --no-urls )
2171 NOURLS="yes"; shift ;;
2172 -ns | --no-srcs )
2173 NOSRCS="yes"; shift ;;
2174 -ns0 | --no-source0 )
2175 NOSOURCE0="yes"; shift ;;
2176 -nn | --no-net )
cd445739
AM
2177 NOCVSSPEC="yes"
2178 NODIST="yes"
2179 NOMIRRORS="yes"
2180 NOURLS="yes"
2181 NOSRCS="yes"
f09c0772 2182 ALWAYS_CVSUP="no"
cd445739 2183 shift;;
bc10f694
JB
2184 -pm | --prefer-mirrors )
2185 PREFMIRRORS="yes"
2186 shift;;
89e05bdd 2187 --noinit | --no-init )
29e90b02
JR
2188 NOINIT="yes"
2189 shift;;
cd445739 2190 --opts )
4250a189 2191 shift; RPMOPTS="${RPMOPTS} ${1}"; shift ;;
469e5fd1 2192 --nopatch | -np )
3accf718 2193 shift; RPMOPTS="${RPMOPTS} --define \"patch${1} : ignoring patch${1}; exit 1; \""; shift ;;
8bd5e66d
ER
2194 --skip-patch | -sp )
2195 shift; RPMOPTS="${RPMOPTS} --define \"patch${1} : skiping patch${1}\""; shift ;;
dfa39149
ER
2196 --topdir)
2197 RPMOPTS="${RPMOPTS} --define \"_topdir $2\""
2198 shift 2
2199 ;;
cd445739
AM
2200 --with | --without )
2201 case $GROUP_BCONDS in
2202 "yes")
2203 COND=${1}
2204 shift
c2e1d2a2 2205 # XXX: broken: ./builder -bb ucspi-tcp.spec --without mysql
cd445739
AM
2206 while ! `echo ${1}|grep -qE '(^-|spec)'`
2207 do
2208 BCOND="$BCOND $COND $1"
2209 shift
2210 done;;
2211 "no")
d4d1ec20 2212 if [[ "$2" = *,* ]]; then
ce40491a
ER
2213 for a in $(echo "$2" | tr , ' '); do
2214 BCOND="$BCOND $1 $a"
2215 done
d4d1ec20 2216 else
ce40491a 2217 BCOND="$BCOND $1 $2"
d4d1ec20
ER
2218 fi
2219 shift 2 ;;
cd445739
AM
2220 esac
2221 ;;
64ea5308 2222 --target )
2223 shift; TARGET="${1}"; shift ;;
6dd19291 2224 --target=* )
2225 TARGET=$(echo "${1}" | sed 's/^--target=//'); shift ;;
cd445739
AM
2226 -q | --quiet )
2227 QUIET="--quiet"; shift ;;
2228 --date )
d383b191
KK
2229 CVSDATE="${2}"; shift 2
2230 date -d "$CVSDATE" > /dev/null 2>&1 || { echo >&2 "No valid date specified"; exit 3; }
2231 ;;
cd445739 2232 -r | --cvstag )
3ccc5cef
ER
2233 CVSTAG="$2"
2234 shift 2
2235 ;;
5323fffd 2236 -A)
3ccc5cef 2237 shift
aa43ca3e 2238 CVSTAG="master"
3ccc5cef 2239 ;;
cd445739
AM
2240 -R | --fetch-build-requires)
2241 FETCH_BUILD_REQUIRES="yes"
2242 NOT_INSTALLED_PACKAGES=
2243 shift ;;
2244 -RB | --remove-build-requires)
2245 REMOVE_BUILD_REQUIRES="nice"
2246 shift ;;
2247 -FRB | --force-remove-build-requires)
2248 REMOVE_BUILD_REQUIRES="force"
2249 shift ;;
f982c603 2250 -sc | --source-cvs)
e15852ab
JR
2251 COMMAND="list-sources-cvs"
2252 shift ;;
ae58a474 2253 -sd | --source-distfiles)
06541433
JR
2254 COMMAND="list-sources-distfiles"
2255 shift ;;
ae58a474 2256 -sdp | --source-distfiles-paths)
06541433
JR
2257 COMMAND="list-sources-distfiles-paths"
2258 shift ;;
ae58a474 2259 -sf | --source-files)
a7eefc54 2260 COMMAND="list-sources-files"
95ad5bf0 2261 shift ;;
ae58a474 2262 -lsp | --source-paths)
a7eefc54 2263 COMMAND="list-sources-local-paths"
95ad5bf0 2264 shift ;;
ae58a474 2265 -su | --source-urls)
2dddf439
ER
2266 COMMAND="list-sources-urls"
2267 shift ;;
cd445739 2268 -Tvs | --tag-version-stable )
518ff1fb 2269 COMMAND="tag"
cd445739
AM
2270 TAG="STABLE"
2271 TAG_VERSION="yes"
2272 shift;;
cd445739 2273 -Ts | --tag-stable )
518ff1fb 2274 COMMAND="tag"
cd445739
AM
2275 TAG="STABLE"
2276 TAG_VERSION="no"
2277 shift;;
cd445739 2278 -Tv | --tag-version )
518ff1fb 2279 COMMAND="tag"
cd445739
AM
2280 TAG=""
2281 TAG_VERSION="yes"
2282 shift;;
2283 -Tp | --tag-prefix )
2284 TAG_PREFIX="$2"
2285 shift 2;;
2286 -tt | --test-tag )
2287 TEST_TAG="yes"
2288 shift;;
2289 -T | --tag )
518ff1fb 2290 COMMAND="tag"
cd445739
AM
2291 shift
2292 TAG="$1"
2293 TAG_VERSION="no"
2294 shift;;
50321881
JK
2295 -ir | --integer-release-only )
2296 INTEGER_RELEASE="yes"
2297 shift;;
cd445739 2298 -U | --update )
ecba6ad5 2299 COMMAND="update_md5"
cd445739
AM
2300 UPDATE="yes"
2301 NOCVSSPEC="yes"
2302 NODIST="yes"
cd445739
AM
2303 shift ;;
2304 -Upi | --update-poldek-indexes )
2305 UPDATE_POLDEK_INDEXES="yes"
2306 shift ;;
5eb1d24b 2307 --init-rpm-dir|--init)
518ff1fb 2308 COMMAND="init_rpm_dir"
ce5daafb 2309 shift ;;
cd445739
AM
2310 -u | --try-upgrade )
2311 TRY_UPGRADE="1"; shift ;;
0907f1eb
ER
2312 --upgrade-version )
2313 shift; UPGRADE_VERSION="$1"; shift;;
cd445739
AM
2314 -un | --try-upgrade-with-float-version )
2315 TRY_UPGRADE="1"; FLOAT_VERSION="1"; shift ;;
2316 -v | --verbose )
2317 BE_VERBOSE="1"; shift ;;
2318 --define)
2319 shift
2320 MACRO="${1}"
cf264933 2321 shift
2322 if echo "${MACRO}" | grep -q '\W'; then
2323 RPMOPTS="${RPMOPTS} --define \"${MACRO}\""
2324 else
2325 VALUE="${1}"
2326 shift
2327 RPMOPTS="${RPMOPTS} --define \"${MACRO} ${VALUE}\""
2328 fi
cd445739 2329 ;;
44058243
ER
2330 --alt_kernel)
2331 shift
5153358c 2332 RPMOPTS="${RPMOPTS} --define \"alt_kernel $1\" --define \"build_kernels $1\""
44058243
ER
2333 shift
2334 ;;
6594293d
AG
2335 --short-circuit)
2336 RPMBUILDOPTS="${RPMBUILDOPTS} --short-circuit"
2337 shift
2338 ;;
dfe2cb9a 2339 --show-bconds | -show-bconds | -print-bconds | --print-bconds | -display-bconds | --display-bconds )
518ff1fb 2340 COMMAND="show_bconds"
dfe2cb9a
MK
2341 shift
2342 ;;
9b78be50
ER
2343 --show-bcond-args)
2344 COMMAND="show_bcond_args"
2345 shift
2346 ;;
24a97174
ER
2347 --show-avail-bconds)
2348 COMMAND="show_avail_bconds"
2349 shift
2350 ;;
cd445739
AM
2351 --nodeps)
2352 shift
2353 RPMOPTS="${RPMOPTS} --nodeps"
2354 ;;
9243e80b 2355 -debug)
a08d92fc
ER
2356 RPMBUILDOPTS="${RPMBUILDOPTS} -debug"; shift
2357 ;;
bb4d488a 2358 -*)
a08d92fc
ER
2359 Exit_error err_invalid_cmdline "$1"
2360 ;;
bb4d488a 2361 *)
76997578 2362 SPECFILE=${1%/}; shift
f19103b5
AG
2363 # check if specname was passed as specname:cvstag
2364 if [ "${SPECFILE##*:}" != "${SPECFILE}" ]; then
518ff1fb
ER
2365 CVSTAG="${SPECFILE##*:}"
2366 SPECFILE="${SPECFILE%%:*}"
f19103b5 2367 fi
8f7946e0
ER
2368 # always have SPECFILE ending with .spec extension
2369 SPECFILE=${SPECFILE%%.spec}.spec
a8c9a155 2370 ASSUMED_NAME=$(basename ${SPECFILE%%.spec})
cd445739
AM
2371 esac
2372done
2373
3ccc5cef
ER
2374if [ "$CVSTAG" ]; then
2375 # pass $CVSTAG used by builder to rpmbuild too, so specs could use it
2376 RPMOPTS="$RPMOPTS --define \"_cvstag $CVSTAG\""
2377fi
2378
3f79cb18
KK
2379if [ -n "$ALL_BRANCHES" -a -z "$DEPTH" ]; then
2380 echo >&2 "--all branches requires --depth <number>"
2381 Exit_error err_invalid_cmdline
2382fi
2383
cd445739 2384if [ -n "$DEBUG" ]; then
518ff1fb
ER
2385 set -x
2386 set -v
cd445739
AM
2387fi
2388
2a5f078d 2389if [ -n "$TARGET" ]; then
2390 case "$RPMBUILD" in
2391 "rpmbuild")
2392 TARGET_SWITCH="--target $TARGET" ;;
2393 "rpm")
2394 TARGET_SWITCH="--target=$TARGET" ;;
2395 esac
2396fi
2397
86aafdbe
ER
2398if [ "$SCHEDTOOL" != "no" ]; then
2399 NICE_COMMAND="$SCHEDTOOL"
2400else
2401 NICE_COMMAND="nice -n ${DEF_NICE_LEVEL}"
2402fi
2403
6dd8b9cc
ER
2404# see time(1) for output format that could be used
2405TIME_COMMAND="time -p"
2406
c890b916 2407update_shell_title "$COMMAND"
cd445739 2408case "$COMMAND" in
117d9861
ER
2409 "show_bconds")
2410 init_builder
8b7889f3
ER
2411 if [ -z "$SPECFILE" ]; then
2412 Exit_error err_no_spec_in_cmdl
117d9861 2413 fi
8b7889f3
ER
2414 get_spec > /dev/null
2415 parse_spec
2416 set_bconds_values
2417 display_bconds
117d9861 2418 ;;
9b78be50
ER
2419 "show_bcond_args")
2420 init_builder
8b7889f3
ER
2421 if [ -z "$SPECFILE" ]; then
2422 Exit_error err_no_spec_in_cmdl
9b78be50 2423 fi
8b7889f3
ER
2424 get_spec > /dev/null
2425 parse_spec
2426 set_bconds_values
2427 echo "$BCOND"
24a97174
ER
2428 ;;
2429 "show_avail_bconds")
2430 init_builder
8b7889f3
ER
2431 if [ -z "$SPECFILE" ]; then
2432 Exit_error err_no_spec_in_cmdl
24a97174
ER
2433 fi
2434
8b7889f3
ER
2435 get_spec > /dev/null
2436 parse_spec
2437 local bcond_avail=$(find_spec_bcond $SPECFILE)
2438 local opt bcond bconds
2439 for opt in $bcond_avail; do
2440 case "$opt" in
2441 without_*)
2442 bcond=${opt#without_}
2443 bconds="$bconds $bcond"
2444 ;;
2445 with_*)
2446 bcond=${opt#with_}
2447 bconds="$bconds $bcond"
2448 ;;
2449 *)
2450 echo >&2 "ERROR: unexpected '$opt' in show_avail_bconds"
2451 exit 1
2452 ;;
2453 esac
2454 done
2455 echo $bconds
2456
9b78be50 2457 ;;
6594293d 2458 "build" | "build-binary" | "build-source" | "build-prep" | "build-build" | "build-install" | "build-list")
117d9861 2459 init_builder
db9fdf51
ER
2460 if [ -z "$SPECFILE" ]; then
2461 Exit_error err_no_spec_in_cmdl
2462 fi
62623fc0 2463
db9fdf51
ER
2464 # display SMP make flags if set
2465 smp_mflags=$(rpm -E %{?_smp_mflags})
2466 if [ "$smp_mflags" ]; then
2467 echo "builder: SMP make flags are set to $smp_mflags"
2468 fi
2469
2470 get_spec
2471 parse_spec
2472 set_bconds_values
2473 display_bconds
2474 display_branches
2475 if [ "$COMMAND" != "build-source" ]; then
2476 check_buildarch
2477 fi
2478 fetch_build_requires
2479 if [ "$INTEGER_RELEASE" = "yes" ]; then
2480 echo "Checking release $PACKAGE_RELEASE..."
2481 if echo $PACKAGE_RELEASE | grep -q '^[^.]*\.[^.]*$' 2>/dev/null ; then
2482 Exit_error err_fract_rel "$PACKAGE_RELEASE"
cd445739 2483 fi
db9fdf51 2484 fi
cd445739 2485
db9fdf51
ER
2486 # ./builder -bs test.spec -r AC-branch -Tp auto-ac- -tt
2487 if [ -n "$TEST_TAG" ]; then
2488 local TAGVER=`make_tagver`
2fc07e25 2489 tag_exist $TAGVER || [ $TAGVER = $CVSTAG ] || Exit_error err_tag_exists $TAGVER
8c043136 2490 # check also tags created in CVS
2fc07e25 2491 local TAGVER_CVS=$(echo $TAGVER | tr '[.@]' '[_#]')
d03404e7
KK
2492 local CVSTAG_CVS=$(echo $CVSTAG | tr '[.@]' '[_#]')
2493 tag_exist $TAGVER_CVS || [ $TAGVER_CVS = $CVSTAG_CVS ] \
2494 || Exit_error err_tag_exists $TAGVER_CVS
db9fdf51 2495 # - do not allow to build from HEAD when XX-branch exists
2200d50e 2496 TREE_PREFIX=$(echo "$TAG_PREFIX" | sed -e 's#^auto/\([a-zA-Z]\+\)/.*#\1#g')
b6c4f6ba 2497 if [ "$TAGVER" != "$CVSTAG" -a "$TAGVER_CVS" != "$CVSTAG" -a "$TREE_PREFIX" != "$TAG_PREFIX" ]; then
db9fdf51 2498 TAG_BRANCH="${TREE_PREFIX}-branch"
f9b0409c
KK
2499 if [ -n "$DEPTH" ]; then
2500 cmd_branches="git ls-remote --heads"
2501 ref_prefix=refs/heads
2502 else
2503 cmd_branches="git show-ref"
2504 ref_prefix=refs/remotes/${REMOTE_PLD}
2505 fi
0c6ce8b5
KK
2506 TAG_STATUS=$($cmd_branches | grep -i "${ref_prefix}/$TAG_BRANCH$" | cut -c'-40')
2507 if [ -n "$TAG_STATUS" -a "$TAG_STATUS" != $(git rev-parse "$CVSTAG") ]; then
db9fdf51 2508 Exit_error err_branch_exists "$TAG_STATUS"
074de301 2509 fi
2a5f078d 2510 fi
2511
cd445739 2512 fi
db9fdf51
ER
2513
2514 if [ -n "$NOSOURCE0" ] ; then
2515 SOURCES=`echo $SOURCES | xargs | sed -e 's/[^ ]*//'`
2516 fi
2517 try_upgrade
2518 case $? in
2519 0)
2520 get_files $SOURCES $PATCHES
d3df4e78 2521 check_md5 $SOURCES $PATCHES
db9fdf51
ER
2522 ;;
2523 *)
2524 NODIST="yes" get_files $SOURCES $PATCHES
647e3d7f 2525 update_md5 $SOURCES $PATCHES
db9fdf51
ER
2526 ;;
2527 esac
2528 build_package
fe7c0a38 2529 if [ "$UPDATE_POLDEK_INDEXES" = "yes" ] && [ "$COMMAND" = "build" -o "$COMMAND" = "build-binary" ]; then
8a390970 2530 run_poldek --sdir="${POLDEK_INDEX_DIR}" ${UPDATE_POLDEK_INDEXES_OPTS} --mkidxz
db9fdf51
ER
2531 fi
2532 remove_build_requires
2a5f078d 2533 ;;
cd445739 2534 "branch" )
518ff1fb 2535 init_builder
db9fdf51 2536 if [ -z "$SPECFILE" ]; then
518ff1fb 2537 Exit_error err_no_spec_in_cmdl
cd445739 2538 fi
db9fdf51
ER
2539
2540 get_spec
2541 parse_spec
f663f264 2542 branch_files $TAG
cd445739 2543 ;;
703b6deb
ER
2544 "add_cvs" )
2545 init_builder
2546 if [ -z "$SPECFILE" ]; then
2547 Exit_error err_no_spec_in_cmdl
2548 fi
2549
406b9ecf
KK
2550 create_git_repo
2551 if [ -n "$NEW_REPO" ]; then
2552 parse_spec
2553 local file
2554 for file in $SOURCES $PATCHES; do
2555 if [ -z $(src_md5 "$file") ]; then
2556 git add $file || Exit_error err_no_source_in_repo $file
2557 else
2558 cvsignore_df `nourl $file`
2559 fi
2560 done
2561 git add $SPECFILE
c9933bf8 2562 echo "When you are ready commit your changes and run git push origin master"
406b9ecf
KK
2563 else
2564 echo "You had already git repository. Push chosen branches to remote: ${REMOTE_PLD}"
703b6deb 2565 fi
703b6deb 2566 ;;
cd445739 2567 "get" )
518ff1fb 2568 init_builder
db9fdf51 2569 if [ -z "$SPECFILE" ]; then
518ff1fb 2570 Exit_error err_no_spec_in_cmdl
ecba6ad5 2571 fi
db9fdf51
ER
2572
2573 get_spec
2574 parse_spec
2575
2576 if [ -n "$NOSOURCE0" ] ; then
2577 SOURCES=`echo $SOURCES | xargs | sed -e 's/[^ ]*//'`
2578 fi
2579 get_files $SOURCES $PATCHES
2580 check_md5 $SOURCES
ecba6ad5
ER
2581 ;;
2582 "update_md5" )
518ff1fb 2583 init_builder
db9fdf51 2584 if [ -z "$SPECFILE" ]; then
518ff1fb 2585 Exit_error err_no_spec_in_cmdl
cd445739 2586 fi
db9fdf51
ER
2587
2588 get_spec
2589 parse_spec
2590
2591 if [ -n "$NOSOURCE0" ] ; then
2592 SOURCES=`echo $SOURCES | xargs | sed -e 's/[^ ]*//'`
2593 fi
647e3d7f 2594 update_md5 $SOURCES $PATCHES
cd445739
AM
2595 ;;
2596 "tag" )
2597 NOURLS=1
f7b91886 2598 NODIST="yes"
518ff1fb 2599 init_builder
db9fdf51 2600 if [ -z "$SPECFILE" ]; then
518ff1fb 2601 Exit_error err_no_spec_in_cmdl
cd445739 2602 fi
db9fdf51 2603
db9fdf51 2604 parse_spec
cc4edaf4
KK
2605 if [ ! -d .git ]; then
2606 echo "No git reposiotory" >&2
2607 exit 101
2608 fi
1fb35df5 2609 tag_files
cd445739
AM
2610 ;;
2611 "mr-proper" )
6f10b394 2612 mr_proper
cd445739 2613 ;;
a7eefc54 2614 "list-sources-files" )
2615 init_builder
2616 NOCVSSPEC="yes"
2617 DONT_PRINT_REVISION="yes"
2618 get_spec
2619 parse_spec
ecba6ad5 2620 for SAP in $SOURCES $PATCHES; do
ce40491a 2621 echo $SAP | awk '{gsub(/.*\//,"") ; print}'
a7eefc54 2622 done
2623 ;;
2dddf439 2624 "list-sources-urls" )
fe61ecd4 2625 init_builder >&2
2dddf439
ER
2626 NOCVSSPEC="yes"
2627 DONT_PRINT_REVISION="yes"
fe61ecd4
ER
2628 get_spec >&2
2629 parse_spec >&2
2dddf439 2630 SAPS="$SOURCES $PATCHES"
fe61ecd4 2631 for SAP in $SAPS; do
ce40491a 2632 echo $SAP
2dddf439
ER
2633 done
2634 ;;
a7eefc54 2635 "list-sources-local-paths" )
2636 init_builder
2637 NOCVSSPEC="yes"
2638 DONT_PRINT_REVISION="yes"
2639 get_spec
2640 parse_spec
ecba6ad5 2641 for SAP in $SOURCES $PATCHES; do
9c909460 2642 echo $PACKAGE_DIR/$(echo $SAP | awk '{gsub(/.*\//,"") ; print }')
a7eefc54 2643 done
2644 ;;
06541433
JR
2645 "list-sources-distfiles-paths" )
2646 init_builder
2647 NOCVSSPEC="yes"
2648 DONT_PRINT_REVISION="yes"
2649 get_spec
2650 parse_spec
ecba6ad5 2651 for SAP in $SOURCES $PATCHES; do
06541433
JR
2652 if [ -n "$(src_md5 "$SAP")" ]; then
2653 distfiles_path "$SAP"
2654 fi
2655 done
2656 ;;
2657 "list-sources-distfiles" )
2658 init_builder
2659 NOCVSSPEC="yes"
2660 DONT_PRINT_REVISION="yes"
2661 get_spec
2662 parse_spec
ecba6ad5 2663 for SAP in $SOURCES $PATCHES; do
06541433
JR
2664 if [ -n "$(src_md5 "$SAP")" ]; then
2665 distfiles_url "$SAP"
2666 fi
2667 done
2668 ;;
e15852ab
JR
2669 "list-sources-cvs" )
2670 init_builder
2671# NOCVSSPEC="yes"
2672 DONT_PRINT_REVISION="yes"
2673 get_spec
2674 parse_spec
2675 for SAP in $SOURCES $PATCHES; do
2676 if [ -z "$(src_md5 "$SAP")" ]; then
2677 echo $SAP | awk '{gsub(/.*\//,"") ; print}'
2678 fi
2679 done
2680 ;;
ce5daafb
ER
2681 "init_rpm_dir")
2682 init_rpm_dir
2683 ;;
cd445739 2684 "usage" )
d43959a2
ER
2685 usage
2686 ;;
2687 "short-version" )
2688 echo "$VERSION"
2689 ;;
cd445739 2690 "version" )
d43959a2
ER
2691 echo "$VERSIONSTRING"
2692 ;;
bde1c404 2693esac
31898c61
AM
2694if [ -f "`pwd`/.${SPECFILE}_INSTALLED_PACKAGES" -a "$REMOVE_BUILD_REQUIRES" != "" ]; then
2695 rm "`pwd`/.${SPECFILE}_INSTALLED_PACKAGES"
03d5c71d 2696fi
cd445739
AM
2697cd "$__PWD"
2698
73848362 2699# vi:syntax=sh:ts=4:sw=4:noet
This page took 1.098188 seconds and 4 git commands to generate.