repository NAME. The repo must be refreshed with zypp
so package meta data is available locally. With emtpy
NAME all enabled repositories are used.
+ a url can specify a remote repo.
--rpms path1:path2:...
Specify path where to find the RPMs for the build system
--root rootdir
Use 'rootdir' to setup chroot environment
+ --cachedir cachedir
+ Use 'cachedir' to cache remote repo's packages, the
+ default cache dir is /var/cache/build, every repo
+ given by --repository corresponds to a subdir named
+ as md5sum of its repo url, forx eaxmple:
+ /var/cache/build/3e8ea9b47808629414a0cebc33ea285e
+
--oldpackages oldpackagesdir
Define a directory with a former build
BUILD_ROOT="$ARG"
shift
;;
+ *-cachedir)
+ CACHE_DIR="$ARG"
+ shift
+ ;;
*-oldpackages)
OLD_PACKAGES="$ARG"
shift
esac
done
+test -z "$CACHE_DIR" && CACHE_DIR=/var/cache/build
+
if test -n "$KILL" ; then
test -z "$SRCDIR" || usage
if test -n "$VM_IMAGE" -a -n "$VM_SWAP" -a -n "$VM_TYPE"; then
}
for SPECFILE in $BUILD_ROOT/usr/src/packages/SPECS/*.spec ; do : ; done
fi
- init_buildsystem --list-state "${definesnstuff[@]}" "${repos[@]}" $USEUSEDFORBUILD $SPECFILE $BUILD_EXTRA_PACKS
+ init_buildsystem --cachedir "$CACHE_DIR" --list-state "${definesnstuff[@]}" "${repos[@]}" $USEUSEDFORBUILD $SPECFILE $BUILD_EXTRA_PACKS
ERR=$?
rm -rf $BUILD_ROOT
cleanup_and_exit $ERR
if test "$DO_INIT" = true ; then
# do fist stage of init_buildsystem
rm -f $BUILD_ROOT/.build.success
- set -- init_buildsystem --prepare "${definesnstuff[@]}" "${repos[@]}" $CLEAN_BUILD $USEUSEDFORBUILD $RPMLIST "$MYSRCDIR/$SPECFILE" $ADDITIONAL_PACKS
+ set -- init_buildsystem --cachedir "$CACHE_DIR" --prepare "${definesnstuff[@]}" "${repos[@]}" $CLEAN_BUILD $USEUSEDFORBUILD $RPMLIST "$MYSRCDIR/$SPECFILE" $ADDITIONAL_PACKS
echo "$* ..."
"$@" || cleanup_and_exit 1
check_exit
echo "BUILD_INCARNATION=$INCARNATION" > $BUILD_ROOT/.buildenv
CREATE_BUILD_BINARIES=
egrep '^#[ ]*needsbinariesforbuild[ ]*$' >/dev/null <$MYSRCDIR/$SPECFILE && CREATE_BUILD_BINARIES=--create-build-binaries
- set -- init_buildsystem "${definesnstuff[@]}" "${repos[@]}" $CLEAN_BUILD $USEUSEDFORBUILD $CREATE_BUILD_BINARIES $RPMLIST "$MYSRCDIR/$SPECFILE" $ADDITIONAL_PACKS
+ set -- init_buildsystem --cachedir "$CACHE_DIR" "${definesnstuff[@]}" "${repos[@]}" $CLEAN_BUILD $USEUSEDFORBUILD $CREATE_BUILD_BINARIES $RPMLIST "$MYSRCDIR/$SPECFILE" $ADDITIONAL_PACKS
echo "$* ..."
"$@" || cleanup_and_exit 1
check_exit
use Data::Dumper;
use Getopt::Long;
use Build::Rpm;
+use Digest::MD5 qw(md5 md5_hex md5_base64);
+use File::Path qw(mkpath rmtree);
+use File::Basename;
+use LWP::UserAgent;
+use URI;
Getopt::Long::Configure("no_ignore_case");
my @parent = [];
}
}
+sub getmetadata
+{
+ my $url = $_[0];
+ my $dir = $_[1];
+
+ my $dest = $dir . "repodata";
+ mkpath($dest);
+ system($INC[0].'/download', $dest, $url . "repodata/repomd.xml");
+}
+
### main
GetOptions (
} else {
die "unsupported repo type: $type\n";
}
+ } elsif ($url =~ /^http:\/\/([^\/]*)\/?/) {
+ my $repoid = md5_hex($url);
+ my $cachedir = ($::ENV{'CACHE_DIR'} || '/var/cache/build');
+ $dir = "$cachedir/$repoid/";
+ getmetadata($url, $dir);
+ $baseurl = $url;
} else {
$dir = $url;
$dir .= '/' unless $dir =~ /\/$/;
@cursor = ([undef, $primaryparser]);
my $u = $dir . $f->{'location'};
+ if ($url =~ /^http:\/\/([^\/]*)\/?/) {
+ system($INC[0].'/download', $dir . "repodata/", $baseurl . "repodata/" . basename($u));
+ }
$u = 'gzip -cd ' . $u . '|' if ($u =~ /\.gz$/); # XXX
my $fh;
CLEAN_BUILD="$1"
shift
;;
+ --cachedir)
+ CACHE_DIR="$2"
+ shift 2
+ ;;
*)
break
;;
test -z "$SRC" && SRC=`pwd`
if [ "${SRC#zypp://}" != "$SRC" ]; then
set -- $BUILD_DIR/createrepomddeps "$SRC"
+ elif [ "${SRC#http://}" != "$SRC" ]; then
+ mkdir -p "$(getcachedir "$SRC")"
+ set -- env CACHE_DIR="$CACHE_DIR" $BUILD_DIR/createrepomddeps "$SRC"
elif [ ! -e "$SRC" ]; then
echo "*** $SRC does not exist" >&2
cleanup_and_exit 1
}
# modify $SRC
-download_zypp()
+downloadpkg()
{
local url="$1"
- local zd="/var/cache/zypp/packages/"
- SRC=$zd${url#zypp://}
+ local cachedir
+
+ if [ "${url:0:7}" == "zypp://" ] ; then
+ cachedir="/var/cache/zypp/packages/"
+ SRC="$cachedir${url#zypp://}"
+ mkdir -p "$(dirname $SRC)"
+ elif [ "${url:0:7}" == "http://" ] ; then
+ cachedir="$(getcachedir "$url")"
+ local name="$(basename "$url")"
+ SRC="$cachedir/$name"
+ else
+ echo "Invalid url: $url"
+ cleanup_and_exit 1
+ fi
+
if [ ! -e "$SRC" ]; then
- local destdir="$zd/tmp"
+ local destdir="$cachedir/tmp"
mkdir -p "$destdir"
echo "downloading $url ... ";
$BUILD_DIR/download "$destdir" "$url" || cleanup_and_exit 1
fi
}
+getcachedir()
+{
+ url=$1
+ for repo in "${repos[@]}" ; do
+ if [ "${url:0:${#repo}}" == "$repo" ] ; then
+ read repoid dummy < <(echo -n "$repo" | md5sum)
+ echo "$CACHE_DIR/$repoid"
+ break
+ fi
+ done
+}
+
+get_pkg_filename()
+{
+ local url="$1"
+ local name=$(basename $url)
+ local cachedir=$(getcachedir $url)
+ local destfile="$cachedir/$name"
+ echo $destfile
+}
+
set_build_arch
trap fail_exit EXIT
if [ "${SRC#/}" = "$SRC" ]; then
url="$SRC"
case "$url" in
- zypp://*)
- download_zypp "$url"
+ zypp://* | http://*)
+ downloadpkg "$url"
;;
*)
echo "unsupported url: $url" >&2
;;
esac
fi
- ln -s "$SRC" "$BUILD_ROOT/.init_b_cache/rpms/$PKG.${SRC##*.}"
+ if [ "${SRC:0:7}" == "http://" ] ; then
+ target_file=$(get_pkg_filename "$SRC")
+ ln -s "$target_file" "$BUILD_ROOT/.init_b_cache/rpms/$PKG.${SRC##*.}"
+ else
+ ln -s "$SRC" "$BUILD_ROOT/.init_b_cache/rpms/$PKG.${SRC##*.}"
+ fi
PACKAGES_TO_INSTALL="$PACKAGES_TO_INSTALL $PKG"
done < $RPMLIST