summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--TODO10
-rw-r--r--__init__.py0
-rwxr-xr-xclean_repo.py96
-rw-r--r--config29
-rw-r--r--config.local.gerolde4
-rw-r--r--config.local.sigurd4
-rwxr-xr-xconfig.py68
-rwxr-xr-xcron-jobs/sourceballs30
-rwxr-xr-xcron-jobs/sourceballs286
-rw-r--r--db-functions25
-rwxr-xr-xdb-update9
-rwxr-xr-xfilter.py198
-rwxr-xr-xget_license.sh45
-rwxr-xr-xlibremessages77
-rw-r--r--local_config.example23
-rwxr-xr-xrepo-update36
-rw-r--r--test/__init__.py0
-rw-r--r--test/blacklist_sample2
-rw-r--r--test/core.db.tar.gzbin0 -> 1345 bytes
-rw-r--r--test/depends4
-rw-r--r--test/desc39
-rw-r--r--test/rsync_output_sample14
-rw-r--r--test/test_filter.py196
24 files changed, 946 insertions, 51 deletions
diff --git a/.gitignore b/.gitignore
index f47d96a..fb6241a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,5 @@
*~
+*.pyc
+local_config
/config.local
test/packages/*/*.pkg.tar.?z
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..3219b1c
--- /dev/null
+++ b/TODO
@@ -0,0 +1,10 @@
+* Test Suite for clean_repo.py
+
+ - Review all repo
+ - Remove all blacklisted packages
+ - Get pending list right
+ - Extract licenses all right
+
+* Fix db-move
+
+ - Make it use abslibre \ No newline at end of file
diff --git a/__init__.py b/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/__init__.py
diff --git a/clean_repo.py b/clean_repo.py
new file mode 100755
index 0000000..e1a17c2
--- /dev/null
+++ b/clean_repo.py
@@ -0,0 +1,96 @@
+#! /usr/bin/python
+#-*- encoding: utf-8 -*-
+from repm.filter import *
+import argparse
+
+def mkpending(packages_iterable, pending_file, blacklisted_names,
+ whitelisted_names):
+ """ Determine wich packages are pending for license auditing."""
+ search = tuple(blacklisted_names +
+ whitelisted_names)
+
+ try:
+ fsock=open(pending_file, "r")
+ pkgs=[pkg for pkg in packages_iterable
+ if pkg["name"] not in listado(pending_file)]
+ for line in fsock.readlines():
+ if line:
+ pkg=Package()
+ pkg["name"]=line.split(":")[0]
+ pkg["license"]=":".join(line.split(":")[1:])
+ pkgs.append(pkg)
+ pkgs=[pkg for pkg in pkgs if pkg["name"] not in search
+ and "custom" in pkg["license"]]
+ fsock=open(pending_file, "w")
+ fsock.write("\n".join([pkg["name"] + ":" + pkg["location"] +
+ ":" + pkg["license"]
+ for pkg in pkgs]) + "\n")
+ except(IOError):
+ raise NonValidFile("Can't read or write %s" % pending_file)
+ finally:
+ fsock.close()
+ return pkgs
+
+def remove_from_blacklist(path_to_db, blacklisted_names):
+ """ Check the blacklist and remove packages on the db"""
+ if "~" in path_to_db:
+ path_to_db=(os.path.expanduser(path_to_db))
+
+ pkgs=[pkg for pkg in pkginfo_from_db(path_to_db) if
+ pkg["name"] in blacklisted_names]
+ if pkgs:
+ lista=" ".join(pkgs)
+ cmd = "repo-remove " + path_to_db + " " + lista
+ printf(cmd)
+ a = check_output(cmd)
+ return pkgs
+
+def cleanup_nonfree_in_dir(directory, blacklisted_names):
+ if "~" in directory:
+ directory=(os.path.expanduser(directory))
+ pkgs=pkginfo_from_files_in_dir(directory)
+ for package in pkgs:
+ if package["name"] in blacklisted_names:
+ os.remove(package["location"])
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(
+ prog="clean_repo",
+ description="Clean a repo db and packages",)
+
+ parser.add_argument("-k", "--blacklist-file", type=str,
+ help="File containing blacklisted names",
+ required=True,)
+
+ group_dir=parser.add_argument_group("Clean non-free packages in dir")
+ group_dir.add_argument("-d", "--directory", type=str,
+ help="directory to clean",)
+
+ group_db=parser.add_argument_group("Clean non-free packages in db",
+ "All arguments need to be specified")
+ group_db.add_argument("-b", "--database", type=str,
+ help="dabatase to clean")
+ group_db.add_argument("-p", "--pending-file", type=str,
+ help="File in which to write pending list")
+ group_db.add_argument("-w", "--whitelist-file", type=str,
+ help="File containing whitelisted names")
+
+ args=parser.parse_args()
+
+ if not args.directory and not args.database:
+ parser.print_help()
+ elif not args.pending_file or not args.whitelist_file \
+ and args.database:
+ parser.print_help()
+ else:
+ blacklisted=listado(args.blacklist_file)
+
+ if args.database:
+ whitelisted=listado(args.whitelist_file)
+ pkgs=pkginfo_from_db(args.database)
+ remove_from_blacklist(args.database, blacklisted)
+ mkpending(pkgs, args.pending_file,
+ blacklisted, whitelisted)
+
+ if args.directory:
+ cleanup_nonfree_in_dir(args.directory, blacklisted)
diff --git a/config b/config
index 89e3633..300893a 100644
--- a/config
+++ b/config
@@ -1,34 +1,31 @@
-FTP_BASE="/srv/ftp"
-SVNREPO=''
-PKGREPOS=()
-PKGPOOL=''
-SRCPOOL=''
+FTP_BASE="/home/parabolavnx/parabolagnulinux.org/free"
+ARCH_BASE="/home/parabolavnx/parabolagnulinux.org/repo"
+SVNREPO="/home/parabolavnx/parabolagnulinux.org/abslibre"
+PKGREPOS=('core' 'extra' 'community' 'libre' 'libre-testing' 'social' 'sugar' 'testing' 'multilib')
+PKGPOOL='pool/packages'
+SRCPOOL='sources/packages'
-CLEANUP_DESTDIR="/srv/package-cleanup"
+CLEANUP_DESTDIR="$FTP_BASE/old/packages"
CLEANUP_DRYRUN=false
# Time in days to keep moved packages
CLEANUP_KEEP=30
-SOURCE_CLEANUP_DESTDIR="/srv/source-cleanup"
+SOURCE_CLEANUP_DESTDIR="$FTP_BASE/old/sources"
SOURCE_CLEANUP_DRYRUN=false
# Time in days to keep moved sourcepackages
-SOURCE_CLEANUP_KEEP=14
+SOURCE_CLEANUP_KEEP=30
REQUIRE_SIGNATURE=false
LOCK_DELAY=10
LOCK_TIMEOUT=300
-STAGING="$HOME/staging"
-TMPDIR="/srv/tmp"
-ARCHES=(i686 x86_64)
+STAGING="$FTP_BASE/staging"
+TMPDIR="$HOME/tmp"
+ARCHES=(i686 x86_64 mips64el)
DBEXT=".db.tar.gz"
FILESEXT=".files.tar.gz"
PKGEXT=".pkg.tar.?z"
SRCEXT=".src.tar.gz"
-# Allowed licenses: get sourceballs only for licenses in this array
-ALLOWED_LICENSES=('GPL' 'GPL1' 'GPL2' 'LGPL' 'LGPL1' 'LGPL2' 'LGPL2.1')
-
-# Override default config with config.local
-[ -f "$(dirname ${BASH_SOURCE[0]})/config.local" ] && . "$(dirname ${BASH_SOURCE[0]})/config.local"
+MAKEPKGCONF="$HOME/etc/makepkg.conf"
diff --git a/config.local.gerolde b/config.local.gerolde
deleted file mode 100644
index 4501a93..0000000
--- a/config.local.gerolde
+++ /dev/null
@@ -1,4 +0,0 @@
-PKGREPOS=('core' 'extra' 'testing' 'staging' 'kde-unstable' 'gnome-unstable')
-PKGPOOL='pool/packages'
-SRCPOOL='sources/packages'
-SVNREPO='file:///srv/svn-packages'
diff --git a/config.local.sigurd b/config.local.sigurd
deleted file mode 100644
index d28aa37..0000000
--- a/config.local.sigurd
+++ /dev/null
@@ -1,4 +0,0 @@
-PKGREPOS=('community' 'community-testing' 'community-staging' 'multilib' 'multilib-testing')
-PKGPOOL='pool/community'
-SRCPOOL='sources/community'
-SVNREPO='file:///srv/svn-packages'
diff --git a/config.py b/config.py
new file mode 100755
index 0000000..4e218a5
--- /dev/null
+++ b/config.py
@@ -0,0 +1,68 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+try:
+ from subprocess import check_output
+except(ImportError):
+ from commands import getoutput
+ def check_output(*popenargs,**kwargs):
+ cmd=" ".join(*popenargs)
+ return getoutput(cmd)
+import os
+
+
+# Rsync commands
+
+def printf(text, logfile=False):
+ """Guarda el texto en la variable log y puede imprimir en pantalla."""
+ print (str(text) + "\n")
+ if logfile:
+ try:
+ log = open(logfile, 'a')
+ log.write("\n" + str(text) + "\n")
+ except:
+ print("Can't open %s" % logfile)
+ finally:
+ log.close()
+
+
+# Classes and Exceptions
+class NonValidFile(ValueError): pass
+class NonValidDir(ValueError): pass
+class NonValidCommand(ValueError): pass
+
+class Package:
+ """ An object that has information about a package. """
+ package_info=dict()
+
+ def __init__(self):
+ self.package_info={ "name" : False,
+ "version" : False,
+ "release" : False,
+ "arch" : False,
+ "license" : False,
+ "location": False,
+ "depends" : False,}
+
+ def __setitem__(self, key, item):
+ if key in self.package_info.keys():
+ return self.package_info.__setitem__(key, item)
+ else:
+ raise ValueError("Package has no %s attribute" % key)
+
+ def __getitem__(self, key):
+ return self.package_info.__getitem__(key)
+
+ def __unicode__(self):
+ return str(self.package_info)
+
+ def __repr__(self):
+ return str(self.package_info)
+
+ def __eq__(self,x):
+ if not isinstance(x, Package):
+ return False
+ for key in self.package_info.keys():
+ if x[key] != self.package_info[key]:
+ return False
+ else:
+ return True
diff --git a/cron-jobs/sourceballs b/cron-jobs/sourceballs
index b55de05..ee074bd 100755
--- a/cron-jobs/sourceballs
+++ b/cron-jobs/sourceballs
@@ -21,10 +21,10 @@ renice +10 -p $$ > /dev/null
for repo in ${PKGREPOS[@]}; do
for arch in ${ARCHES[@]}; do
# Repo does not exist; skip it
- if [ ! -f "${FTP_BASE}/${repo}/os/${arch}/${repo}${DBEXT}" ]; then
+ if [ ! -f "${ARCH_BASE}/${repo}/os/${arch}/${repo}${DBEXT}" ]; then
continue
fi
- bsdtar -xOf "${FTP_BASE}/${repo}/os/${arch}/${repo}${DBEXT}" \
+ bsdtar -xOf "${ARCH_BASE}/${repo}/os/${arch}/${repo}${DBEXT}" \
| awk '/^%NAME%/ { getline b };
/^%BASE%/ { getline b };
/^%VERSION%/ { getline v };
@@ -46,7 +46,7 @@ for repo in ${PKGREPOS[@]}; do
done
# Create a list of all available source package file names
-find "${FTP_BASE}/${SRCPOOL}" -xtype f -name "*${SRCEXT}" -printf '%f\n' | sort -u > "${WORKDIR}/available-src-pkgs"
+find "${ARCH_BASE}/${SRCPOOL}" -xtype f -name "*${SRCEXT}" -printf '%f\n' | sort -u > "${WORKDIR}/available-src-pkgs"
# Check for all packages if we need to build a source package
for repo in ${PKGREPOS[@]}; do
@@ -59,14 +59,15 @@ for repo in ${PKGREPOS[@]}; do
pkgarch=${pkginfo[2]}
pkglicense=(${pkginfo[@]:3})
- # Should this package be skipped?
+ # Should this packages be skipped?
if grep -Fqx "${pkgbase}" "${dirname}/sourceballs.skip"; then
continue
fi
+ # Commenting out, we'll sourceball everything
# Check if the license or .force file does not enforce creating a source package
- if ! (chk_license ${pkglicense[@]} || grep -Fqx "${pkgbase}" "${dirname}/sourceballs.force"); then
- continue
- fi
+# if ! (chk_license ${pkglicense[@]} || grep -Fqx "${pkgbase}" "${dirname}/sourceballs.force"); then
+# continue
+# fi
# Store the expected file name of the source package
echo "${pkgbase}-${pkgver}${SRCEXT}" >> "${WORKDIR}/expected-src-pkgs"
@@ -79,8 +80,13 @@ for repo in ${PKGREPOS[@]}; do
# Get the sources from svn
mkdir -p "${WORKDIR}/pkgbuilds/${repo}-${pkgarch}"
- svn export -q "${SVNREPO}/${pkgbase}/repos/${repo}-${pkgarch}" \
- "${WORKDIR}/pkgbuilds/${repo}-${pkgarch}/${pkgbase}" >/dev/null 2>&1
+ #svn export -q "${SVNREPO}/${pkgbase}/repos/${repo}-${pkgarch}" \
+ # "${WORKDIR}/pkgbuilds/${repo}-${pkgarch}/${pkgbase}" >/dev/null 2>&1
+
+ # If it's on official repos, nor [libre], nor [libre-testing]
+ cp -r "${SVNREPO}/$repo/${pkgbase}" "${WORKDIR}/pkgbuilds/${repo}-${pkgarch}/" >/dev/null 2>&1 || \
+ cp -r "${SVNREPO}/libre/${pkgbase}" "${WORKDIR}/pkgbuilds/${repo}-${pkgarch}/" >/dev/null 2>&1 || \
+ cp -r "${SVNREPO}/libre-testing/${pkgbase}" "${WORKDIR}/pkgbuilds/${repo}-${pkgarch}/" >/dev/null 2>&1
if [ $? -ge 1 ]; then
failedpkgs[${#failedpkgs[*]}]="${pkgbase}-${pkgver}${SRCEXT}"
continue
@@ -88,9 +94,9 @@ for repo in ${PKGREPOS[@]}; do
# Build the actual source package
pushd "${WORKDIR}/pkgbuilds/${repo}-${pkgarch}/${pkgbase}" >/dev/null
- makepkg --nocolor --allsource --ignorearch >/dev/null 2>&1
+ makepkg --nocolor --allsource --ignorearch # >/dev/null 2>&1
if [ $? -eq 0 ] && [ -f "${pkgbase}-${pkgver}${SRCEXT}" ]; then
- mv "${pkgbase}-${pkgver}${SRCEXT}" "${FTP_BASE}/${SRCPOOL}"
+ mv "${pkgbase}-${pkgver}${SRCEXT}" "${ARCH_BASE}/${SRCPOOL}"
# Avoid creating the same source package for every arch
echo "${pkgbase}-${pkgver}${SRCEXT}" >> "${WORKDIR}/available-src-pkgs"
newpkgs[${#newpkgs[*]}]="${pkgbase}-${pkgver}${SRCEXT}"
@@ -126,7 +132,7 @@ if [ ${#old_pkgs[@]} -ge 1 ]; then
for old_pkg in ${old_pkgs[@]}; do
msg2 "${old_pkg}"
if ! ${SOURCE_CLEANUP_DRYRUN}; then
- mv "$FTP_BASE/${SRCPOOL}/${old_pkg}" "${SOURCE_CLEANUP_DESTDIR}"
+ mv "$ARCH_BASE/${SRCPOOL}/${old_pkg}" "${SOURCE_CLEANUP_DESTDIR}"
touch "${SOURCE_CLEANUP_DESTDIR}/${old_pkg}"
fi
done
diff --git a/cron-jobs/sourceballs2 b/cron-jobs/sourceballs2
new file mode 100755
index 0000000..2cd0296
--- /dev/null
+++ b/cron-jobs/sourceballs2
@@ -0,0 +1,86 @@
+#!/bin/bash
+# Steps
+# Traverse ABSLibre
+# Makepkg --allsource every package
+# Remove the old sourceballs
+
+dirname="$(dirname $(readlink -e $0))"
+. "${dirname}/../db-functions"
+. "${dirname}/../config"
+. "${MAKEPKGCONF}"
+
+pushd "${WORKDIR}" >/dev/null
+
+script_lock
+
+#adjust the nice level to run at a lower priority
+renice +10 -p $$ > /dev/null
+
+# Create a list of all available source package file names
+find "${ARCH_BASE}/${SRCPOOL}" -xtype f -name "*${SRCEXT}" -printf '%f\n' | sort -u > "${WORKDIR}/available-src-pkgs"
+
+pushd "${SVNREPO}" >/dev/null
+
+failedpkgs=()
+for repo in ${PKGREPOS[@]}; do
+ pushd $repo >/dev/null
+ find . -maxdepth 1 -type d | while read pkg; do
+ pushd "${SVNREPO}/$repo/$pkg" >/dev/null
+
+ [[ ! -e PKGBUILD ]] && {
+ warning "$repo/$pkg is not a package"
+ continue
+ }
+
+ unset pkgbase pkgname
+ source PKGBUILD
+ pkgbase=${pkgbase:-$pkgname}
+
+ echo "${pkgbase}-${pkgver}-${pkgrel}${SRCEXT}" >> "${WORKDIR}/expected-src-pkgs"
+
+ # Skip already sourceballed
+ [[ -e "${SRCPKGDEST}/${pkgbase}-${pkgver}-${pkgrel}${SRCEXT}" ]] && \
+ continue
+
+ makepkg --allsource --ignorearch -c >/dev/null 2>&1
+
+ [[ $? -ne 0 ]] && \
+ failedpkgs[${#failedpkgs[*]}]="${pkgbase}-${pkgver}-${pkgrel}${SRCEXT}"
+
+ done
+ popd >/dev/null
+done
+
+# Cleanup old source packages
+cat "${WORKDIR}/expected-src-pkgs" | sort -u > "${WORKDIR}/expected-src-pkgs.sort"
+cat "${WORKDIR}/available-src-pkgs" | sort -u > "${WORKDIR}/available-src-pkgs.sort"
+old_pkgs=($(comm -23 "${WORKDIR}/available-src-pkgs.sort" "${WORKDIR}/expected-src-pkgs.sort"))
+
+if [ ${#old_pkgs[@]} -ge 1 ]; then
+ msg "Removing old source packages..."
+ ${SOURCE_CLEANUP_DRYRUN} && warning 'dry run mode is active'
+ for old_pkg in ${old_pkgs[@]}; do
+ msg2 "${old_pkg}"
+ if ! ${SOURCE_CLEANUP_DRYRUN}; then
+ mv "$ARCH_BASE/${SRCPOOL}/${old_pkg}" "${SOURCE_CLEANUP_DESTDIR}"
+ touch "${SOURCE_CLEANUP_DESTDIR}/${old_pkg}"
+ fi
+ done
+fi
+
+old_pkgs=($(find ${SOURCE_CLEANUP_DESTDIR} -type f -name "*${SRCEXT}" -mtime +${SOURCE_CLEANUP_KEEP} -printf '%f\n'))
+if [ ${#old_pkgs[@]} -ge 1 ]; then
+ msg "Removing old source packages from the cleanup directory..."
+ for old_pkg in ${old_pkgs[@]}; do
+ msg2 "${old_pkg}"
+ ${SOURCE_CLEANUP_DRYRUN} || rm -f "${SOURCE_CLEANUP_DESTDIR}/${old_pkg}"
+ done
+fi
+
+msg "Failed"
+for _fail in ${failedpkgs[@]}; do
+ msg2 "$_fail"
+done
+
+script_unlock
+
diff --git a/db-functions b/db-functions
index a3e2168..20bfa0e 100644
--- a/db-functions
+++ b/db-functions
@@ -87,7 +87,7 @@ get_full_version() {
script_lock() {
local LOCKDIR="$TMPDIR/.scriptlock.$(basename $0)"
if ! mkdir "$LOCKDIR" >/dev/null 2>&1 ; then
- local _owner="$(/usr/bin/stat -c %U $LOCKDIR)"
+ local _owner="$(stat -c %U $LOCKDIR)"
error "Script $(basename $0) is already locked by $_owner."
exit 1
else
@@ -178,7 +178,7 @@ repo_lock () {
_count=0
while [ $_count -le $_trial ] || $_lockblock ; do
if ! mkdir "$LOCKDIR" >/dev/null 2>&1 ; then
- _owner="$(/usr/bin/stat -c %U $LOCKDIR)"
+ _owner="$(stat -c %U $LOCKDIR)"
warning "Repo [${1}] (${2}) is already locked by $_owner. "
msg2 "Retrying in $LOCK_DELAY seconds..."
else
@@ -211,7 +211,7 @@ repo_unlock () { #repo_unlock <repo-name> <arch>
_grep_pkginfo() {
local _ret
- _ret="$(/usr/bin/bsdtar -xOqf "$1" .PKGINFO | /bin/grep -m 1 "^${2} = ")"
+ _ret="$(bsdtar -xOqf "$1" .PKGINFO | /bin/grep -m 1 "^${2} = ")"
echo "${_ret#${2} = }"
}
@@ -375,6 +375,7 @@ check_splitpkgs() {
for pkgfile in ${pkgfiles[@]}; do
issplitpkg "${pkgfile}" || continue
local _pkgbase="$(getpkgbase ${pkgfile})"
+ msg2 "Checking $_pkgbase"
local _pkgname="$(getpkgname ${pkgfile})"
local _pkgarch="$(getpkgarch ${pkgfile})"
mkdir -p "${repo}/${_pkgarch}/${_pkgbase}"
@@ -382,9 +383,15 @@ check_splitpkgs() {
if [ ! -f "${WORKDIR}/pkgbuilds/${repo}-${_pkgarch}/${_pkgbase}" ]; then
mkdir -p "${WORKDIR}/pkgbuilds/${repo}-${_pkgarch}"
- svn export -q "${SVNREPO}/${_pkgbase}/repos/${repo}-${_pkgarch}/PKGBUILD" \
- "${WORKDIR}/pkgbuilds/${repo}-${_pkgarch}/${_pkgbase}" >/dev/null
- [ $? -ge 1 ] && return 1
+
+ cp -r ${SVNREPO}/$repo/$_pkgbase/PKGBUILD "${WORKDIR}/pkgbuilds/${repo}-${_pkgarch}/${_pkgbase}" >/dev/null 2>&1 || \
+ cp -r ${SVNREPO}/libre/$_pkgbase/PKGBUILD "${WORKDIR}/pkgbuilds/${repo}-${_pkgarch}/${_pkgbase}" >/dev/null 2>&1 || \
+ cp -r ${SVNREPO}/libre-testing/$_pkgbase/PKGBUILD "${WORKDIR}/pkgbuilds/${repo}-${_pkgarch}/$_pkgbase">/dev/null 2>&1
+
+ [[ $? -ge 1 ]] && {
+ echo "Failed $_pkgbase-$_pkgver-$_pkgarch"
+ return 1
+ }
fi
local svnnames=($(. "${WORKDIR}/pkgbuilds/${repo}-${_pkgarch}/${_pkgbase}"; echo ${pkgname[@]}))
@@ -473,7 +480,7 @@ set_repo_permission() {
local filesfile="${FTP_BASE}/${repo}/os/${arch}/${repo}${FILESEXT}"
if [ -w "${dbfile}" ]; then
- local group=$(/usr/bin/stat --printf='%G' "$(dirname "${dbfile}")")
+ local group=$(stat --printf='%G' "$(dirname "${dbfile}")")
chgrp $group "${dbfile}" || error "Could not change group of ${dbfile} to $group"
chgrp $group "${filesfile}" || error "Could not change group of ${filesfile} to $group"
chmod g+w "${dbfile}" || error "Could not set write permission for group $group to ${dbfile}"
@@ -490,7 +497,7 @@ arch_repo_add() {
# package files might be relative to repo dir
pushd "${FTP_BASE}/${repo}/os/${arch}" >/dev/null
- /usr/bin/repo-add -q "${repo}${DBEXT}" ${pkgs[@]} \
+ repo-add -q "${repo}${DBEXT}" ${pkgs[@]} >/dev/null \
|| error "repo-add ${repo}${DBEXT} ${pkgs[@]}"
/usr/bin/repo-add -f -q "${repo}${FILESEXT}" ${pkgs[@]} \
|| error "repo-add -f ${repo}${FILESEXT} ${pkgs[@]}"
@@ -509,7 +516,7 @@ arch_repo_remove() {
error "No database found at '${dbfile}'"
return 1
fi
- /usr/bin/repo-remove -q "${dbfile}" ${pkgs[@]} \
+ repo-remove -q "${dbfile}" ${pkgs[@]} >/dev/null \
|| error "repo-remove ${dbfile} ${pkgs[@]}"
/usr/bin/repo-remove -q "${filesfile}" ${pkgs[@]} \
|| error "repo-remove ${filesfile} ${pkgs[@]}"
diff --git a/db-update b/db-update
index 4b9c78f..6bd0209 100755
--- a/db-update
+++ b/db-update
@@ -35,12 +35,9 @@ for repo in ${repos[@]}; do
if ! check_pkgfile "${pkg}"; then
die "Package ${repo}/$(basename ${pkg}) is not consistent with its meta data"
fi
- if ! check_pkgsvn "${pkg}" "${repo}"; then
- die "Package ${repo}/$(basename ${pkg}) is not consistent with svn repository"
- fi
- if ! check_pkgrepos "${pkg}"; then
- die "Package ${repo}/$(basename ${pkg}) already exists in another repository"
- fi
+ #if ! check_pkgrepos "${pkg}"; then
+ # die "Package ${repo}/$(basename ${pkg}) already exists in another repository"
+ #fi
done
if ! check_splitpkgs ${repo} ${pkgs[@]}; then
die "Missing split packages for ${repo}"
diff --git a/filter.py b/filter.py
new file mode 100755
index 0000000..c71f54d
--- /dev/null
+++ b/filter.py
@@ -0,0 +1,198 @@
+ #! /usr/bin/python
+#-*- encoding: utf-8 -*-
+from glob import glob
+from repm.config import *
+import tarfile
+
+def listado(filename, start=0, end=None):
+ """Obtiene una lista de paquetes de un archivo."""
+ fsock = open(filename, "r")
+ lista = fsock.read().split("\n")
+ fsock.close()
+ if end is not None:
+ return [pkg.split(":")[start:end].rstrip()
+ for pkg in lista if pkg]
+ else:
+ return [pkg.split(":")[start].rstrip()
+ for pkg in lista if pkg]
+
+def pkginfo_from_filename(filename):
+ """ Generates a Package object with info from a filename,
+ filename can be relative or absolute
+
+ Parameters:
+ ----------
+ filename -> str Must contain .pkg.tar.
+
+ Returns:
+ ----------
+ pkg -> Package object"""
+ if ".pkg.tar." not in filename:
+ raise NonValidFile("File is not a pacman package")
+ pkg = Package()
+ pkg["location"] = filename
+ fileattrs = os.path.basename(filename).split("-")
+ pkg["arch"] = fileattrs.pop(-1).split(".")[0]
+ pkg["release"] = fileattrs.pop(-1)
+ pkg["version"] = fileattrs.pop(-1)
+ pkg["name"] = "-".join(fileattrs)
+ return pkg
+
+def pkginfo_from_desc(info_from_desc, pkg=Package()):
+ """ Returns pkginfo from desc file.
+
+ Parameters:
+ ----------
+ filename -> str File must exist
+
+ Returns:
+ ----------
+ pkg -> Package object"""
+ info=info_from_desc.rsplit()
+ info_map={"name" :("%NAME%" , None),
+ "version" :("%VERSION%" , 0 ),
+ "release" :("%VERSION%" , 1 ),
+ "arch" :("%ARCH%" , None),
+ "license" :("%LICENSE%" , None),
+ "location":("%FILENAME%", None),}
+
+ for key in info_map.keys():
+ field,pos=info_map[key]
+ pkg[key]=info[info.index(field)+1]
+ if pos is not None:
+ pkg[key]=pkg[key].split("-")[pos]
+ return pkg
+
+def pkginfo_from_rsync_output(rsync_output):
+ """ Generates a list of packages and versions from an rsync output
+ wich uses --list-only and --no-motd options.
+
+ Parameters:
+ ----------
+ rsync_output -> str Contains output from rsync
+
+ Returns:
+ ----------
+ package_list -> tuple Contains Package objects. """
+
+ def package_or_link(line):
+ """ Take info out of filename """
+ location_field = 4
+ return pkginfo_from_filename(line.rsplit()[location_field])
+
+ def do_nothing():
+ pass
+
+ options = { "d": do_nothing,
+ "l": package_or_link,
+ "-": package_or_link,
+ " ": do_nothing}
+
+ package_list=list()
+
+ lines=[x for x in rsync_output.split("\n") if ".pkg.tar" in x]
+
+ for line in lines:
+ pkginfo=options[line[0]](line)
+ if pkginfo:
+ package_list.append(pkginfo)
+
+ return tuple(package_list)
+
+def pkginfo_from_files_in_dir(directory):
+ """ Returns pkginfo from filenames of packages in dir
+ wich has .pkg.tar. on them
+
+ Parameters:
+ ----------
+ directory -> str Directory must exist
+
+ Returns:
+ ----------
+ package_list -> tuple Contains Package objects """
+ package_list=list()
+
+ if not os.path.isdir(directory):
+ raise NonValidDir
+
+ for filename in glob(os.path.join(directory,"*")):
+ if ".pkg.tar." in filename:
+ package_list.append(pkginfo_from_filename(filename))
+ return tuple(package_list)
+
+def pkginfo_from_db(path_to_db):
+ """ Get pkginfo from db.
+
+ Parameters:
+ ----------
+ path_to_db -> str Path to file
+
+ Output:
+ ----------
+ package_list -> tuple of Package objects"""
+ package_list=list()
+
+ if not os.path.isfile(path_to_db):
+ raise NonValidFile(path_to_db + " is not a file")
+
+ try:
+ dbsock = tarfile.open(path_to_db, 'r:gz')
+ desc_files=[desc for desc in dbsock.getnames()
+ if "/desc" in desc]
+ for name in desc_files:
+ desc=dbsock.extractfile(name).read().decode("UTF-8")
+ package_list.append(pkginfo_from_desc(desc))
+ except tarfile.ReadError:
+ raise NonValidFile("No valid db_file %s or not readable"
+ % path_to_db)
+ finally:
+ dbsock.close()
+ return package_list
+
+def rsyncBlacklist_from_blacklist(packages_iterable,
+ blacklisted_names,
+ exclude_file):
+ """ Generate an exclude list for rsync
+
+ Parameters:
+ ----------
+ package_iterable -> list or tuple Contains Package objects
+ blacklisted_names-> list or tuple Contains blacklisted names
+ exclude_file -> str Path to file
+ debug -> bool If True, file list gets logged
+
+ Output:
+ ----------
+ None """
+ pkgs=[pkg["location"] for pkg in packages_iterable
+ if isinstance(pkg, Package)
+ and pkg["name"] in blacklisted_names]
+ if exclude_file:
+ try:
+ fsock = open(exclude_file,"w")
+ fsock.write("\n".join(pkgs) + "\n")
+ except IOError:
+ printf("%s wasnt written" % exclude_file)
+ exit(1)
+ finally:
+ fsock.close()
+ return pkgs
+
+
+if __name__ == "__main__":
+ import argparse
+ parser=argparse.ArgumentParser()
+ parser.add_argument("-r", "--rsync-exclude-file", type=str,
+ help="File in which to generate exclude list",
+ required=True,)
+ parser.add_argument("-k", "--blacklist-file", type=str,
+ help="File containing blacklisted names",
+ required=True,)
+ parser.add_argument("-c", "--rsync-command", type=str,
+ help="This command will be run to get a pkg list",
+ required=True,)
+ args=parser.parse_args()
+ rsout=check_output(args.rsync_command.split())
+ packages=pkginfo_from_rsync_output(rsout)
+ rsyncBlaclist_from_blacklist(packages, listado(args.blacklist_file),
+ args.rsync_exclude_file)
diff --git a/get_license.sh b/get_license.sh
new file mode 100755
index 0000000..024876c
--- /dev/null
+++ b/get_license.sh
@@ -0,0 +1,45 @@
+#!/bin/bash
+# -*- coding: utf-8 -*-
+
+ # get_license.sh
+ # Copyright 2010 Joshua Ismael Haase Hernández
+
+ # ---------- GNU General Public License 3 ----------
+
+ # This file is part of Parabola.
+
+ # Parabola is free software: you can redistribute it and/or modify
+ # it under the terms of the GNU General Public License as published by
+ # the Free Software Foundation, either version 3 of the License, or
+ # (at your option) any later version.
+
+ # Parabola is distributed in the hope that it will be useful,
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ # GNU General Public License for more details.
+
+ # You should have received a copy of the GNU General Public License
+ # along with Parabola. If not, see <http://www.gnu.org/licenses/>.
+source ./config
+source ./local_config
+source ./libremessages
+
+msg "Creating pending licenses list"
+pushd ${licenses_dir}
+rm -rf ${licenses_dir}/*
+
+for repo in ${PKGREPOS[@]}; do
+ msg2 "Extracting licenses in ${repo}"
+ pending=($(cut -d: -f2 ${docs_dir}/pending-${repo}))
+ pushd ${repodir}/${repo}
+ for pkg in ${pending[@]}; do
+ plain "${pkg}"
+ bsdtar -xf ${pkg} usr/share/licenses || {
+ error "${pkg} has no licenses"
+ }
+ chmod -r ${pkg}
+ done
+done
+
+popd
+exit 0 \ No newline at end of file
diff --git a/libremessages b/libremessages
new file mode 100755
index 0000000..9fbbc2b
--- /dev/null
+++ b/libremessages
@@ -0,0 +1,77 @@
+# Copyright (c) 2006-2010 Pacman Development Team <pacman-dev@archlinux.org>
+# Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
+# Copyright (c) 2005 by Aurelien Foret <orelien@chez.com>
+# Copyright (c) 2006 by Miklos Vajna <vmiklos@frugalware.org>
+# Copyright (c) 2005 by Christian Hamar <krics@linuxforum.hu>
+# Copyright (c) 2006 by Alex Smith <alex@alex-smith.me.uk>
+# Copyright (c) 2006 by Andras Voroskoi <voroskoi@frugalware.org>
+# Copyright (c) 2011 by Joshua Haase <hahj87@gmail.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# gettext initialization
+export TEXTDOMAIN='libretools'
+export TEXTDOMAINDIR='/usr/share/locale'
+
+# check if messages are to be printed using color
+unset ALL_OFF BOLD BLUE GREEN RED YELLOW
+
+if tput setaf 0 &>/dev/null; then
+ ALL_OFF="$(tput sgr0)"
+ BOLD="$(tput bold)"
+ BLUE="${BOLD}$(tput setaf 4)"
+ GREEN="${BOLD}$(tput setaf 2)"
+ RED="${BOLD}$(tput setaf 1)"
+ YELLOW="${BOLD}$(tput setaf 3)"
+ PURPLE="${ALL_OFF}$(tput setaf 5)"
+else
+ ALL_OFF="\033[1;0m"
+ BOLD="\033[1;1m"
+ BLUE="${BOLD}\033[1;34m"
+ GREEN="${BOLD}\033[1;32m"
+ RED="${BOLD}\033[1;31m"
+ YELLOW="${BOLD}\033[1;33m"
+ PURPLE="${BOLD}\033[1;30;40m"
+fi
+
+stdnull() {
+ local action=$1;
+ eval "${action} >/dev/null 2>&1"
+}
+
+plain() {
+ local mesg=$1; shift
+ printf "${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
+}
+
+msg() {
+ local mesg=$1; shift
+ printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
+}
+
+msg2() {
+ local mesg=$1; shift
+ printf "${BLUE} ->${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
+}
+
+warning() {
+ local mesg=$1; shift
+ printf "${YELLOW}==> $(gettext "WARNING:")${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
+}
+
+error() {
+ local mesg=$1; shift
+ printf "${RED}==> $(gettext "ERROR:")${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
+}
+
diff --git a/local_config.example b/local_config.example
new file mode 100644
index 0000000..0a827f4
--- /dev/null
+++ b/local_config.example
@@ -0,0 +1,23 @@
+# Mirror options
+mirror="mirrors.eu.kernel.org"
+mirrorpath="::mirrors/archlinux"
+
+# Directories: they should end without /
+paraboladir=~/parabolagnulinux.org
+tempdir=~/tmp
+archdb=${tempdir}/db
+docs_dir=${paraboladir}/docs
+repodir=${paraboladir}/repo/staging
+licenses_dir=${docs_dir}/pending_licenses
+# End Directories
+
+# Files
+logname=${paraboladir}/log/$(date -u +%Y%m%d-%H:%M)-repo-maintainer.log
+blacklist=${docs_dir}/blacklist.txt
+whitelist=${docs_dir}/whitelist.txt
+rsync_blacklist=${docs_dir}/rsyncBlacklist
+rsync_not_needed=${tmp}/rsync_not_needed
+
+# Rsync commands
+rsync_list_command="rsync\ -ptgoL\ --list-only\ "
+rsync_update_command="rsync -ptgoL --exclude='*.abs.tar.*'"
diff --git a/repo-update b/repo-update
new file mode 100755
index 0000000..59a0658
--- /dev/null
+++ b/repo-update
@@ -0,0 +1,36 @@
+#!/bin/bash
+# -*- coding: utf-8 -*-
+
+source ./config
+source ./local_config
+source ./libremessages
+
+for repo in ${PKGREPOS[@]}; do
+ for arch in ${ARCHES[@]} 'any'; do
+ msg "Syncing ${repo} ${arch}"
+ filter.py -r "${rsync_blacklist}" -k "${blacklist}" -c \
+ \"${rsync_list_command}\ \
+ ${mirror}${mirrorpath}/${repo}/os/${arch}\ \
+ ${repodir}/${repo}/\"
+ find ${repodir}/${repo} -name *${PKGEXT} -print \
+ > ${rsync_not_needed}
+ ${rsync_update_command} \
+ ${mirror}${mirrorpath}/${repo}/os/${arch} \
+ ${repodir}/${repo} \
+ --exclude-from=${rsync_blacklist} \
+ --exclude-from=${rsync_not_needed}
+ done
+ for arch in ${ARCHES[@]}; do
+ if [ -r ${repodir}/${repo}/os/${arch}/${repo}${DBEXT} ]; then
+ clean_repo.py -k ${blacklist} -w ${whitelist} \
+ -p ${docs_dir}/pending-${repo} \
+ -b ${repodir}/${repo}/${repo}${DBEXT}
+ fi
+ clean_repo.py -k ${blacklist} -d ${repodir}/${repo}
+ done
+done
+
+db-update
+ftpdir-cleanup
+
+get_license.sh
diff --git a/test/__init__.py b/test/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/test/__init__.py
diff --git a/test/blacklist_sample b/test/blacklist_sample
new file mode 100644
index 0000000..2a02af6
--- /dev/null
+++ b/test/blacklist_sample
@@ -0,0 +1,2 @@
+alex:alex-libre: Aquí va un comentario
+gmime22 ::Non free dependencies \ No newline at end of file
diff --git a/test/core.db.tar.gz b/test/core.db.tar.gz
new file mode 100644
index 0000000..5eb2081
--- /dev/null
+++ b/test/core.db.tar.gz
Binary files differ
diff --git a/test/depends b/test/depends
new file mode 100644
index 0000000..7ff3ad4
--- /dev/null
+++ b/test/depends
@@ -0,0 +1,4 @@
+%DEPENDS%
+glibc>=2.13
+zlib
+
diff --git a/test/desc b/test/desc
new file mode 100644
index 0000000..abba644
--- /dev/null
+++ b/test/desc
@@ -0,0 +1,39 @@
+%FILENAME%
+binutils-2.21-4-x86_64.pkg.tar.xz
+
+%NAME%
+binutils
+
+%VERSION%
+2.21-4
+
+%DESC%
+A set of programs to assemble and manipulate binary and object files
+
+%GROUPS%
+base
+
+%CSIZE%
+3412892
+
+%ISIZE%
+17571840
+
+%MD5SUM%
+4e666f87c78998f4839f33dc06d2043a
+
+%URL%
+http://www.gnu.org/software/binutils/
+
+%LICENSE%
+GPL
+
+%ARCH%
+x86_64
+
+%BUILDDATE%
+1297240369
+
+%PACKAGER%
+Allan McRae <allan@archlinux.org>
+
diff --git a/test/rsync_output_sample b/test/rsync_output_sample
new file mode 100644
index 0000000..72d9cd0
--- /dev/null
+++ b/test/rsync_output_sample
@@ -0,0 +1,14 @@
+dr-xr-sr-x 4096 2010/09/11 11:37:10 .
+-rw-r--r-- 11 2011/02/08 00:00:01 lastsync
+drwxrwxr-x 15 2010/09/11 11:28:50 community-staging
+drwxrwxr-x 30 2010/09/11 11:28:50 community-staging/os
+drwxrwxr-x 8192 2011/02/07 17:00:01 community-staging/os/i686
+lrwxrwxrwx 52 2010/12/23 16:51:01 community-staging/os/i686/alex-2.3.4-1-i686.pkg.tar.xz -> ../../../pool/community/alex-2.3.4-1-i686.pkg.tar.xz
+lrwxrwxrwx 27 2011/02/07 14:02:54 community-staging/os/i686/community-staging.db -> community-staging.db.tar.gz
+-rw-rw-r-- 2237 2011/02/07 14:02:54 community-staging/os/i686/community-staging.db.tar.gz
+-rw-rw-r-- 3209 2011/02/07 14:00:13 community-staging/os/i686/community-staging.db.tar.gz.old
+drwxrwxr-x 15 2009/07/22 15:07:56 community
+drwxrwxr-x 40 2009/08/04 15:57:42 community/os
+drwxrwsr-x 36864 2011/02/03 05:00:01 community/os/any
+-rw-rw-r-- 303336 2010/07/16 10:06:28 community/os/any/any2dvd-0.34-4-any.pkg.tar.xz
+-rw-rw-r-- 221664 2010/03/28 15:55:48 community/os/x86_64/gmime22-2.2.26-1-x86_64.pkg.tar.xz
diff --git a/test/test_filter.py b/test/test_filter.py
new file mode 100644
index 0000000..d8006f9
--- /dev/null
+++ b/test/test_filter.py
@@ -0,0 +1,196 @@
+# -*- encoding: utf-8 -*-
+""" """
+
+__author__ = "Joshua Ismael Haase Hernández <hahj87@gmail.com>"
+__version__ = "$Revision: 1.1 $"
+__date__ = "$Date: 2011/02/08 $"
+__copyright__ = "Copyright (c) 2011 Joshua Ismael Haase Hernández"
+__license__ = "GPL3+"
+
+from repm.config import *
+from repm.filter import *
+import unittest
+
+class pkginfo_from_file_KnownValues(unittest.TestCase):
+ # (filename, name, version, release, arch)
+ # filename is location
+ known=(
+ ("community-testing/os/i686/inputattach-1.24-3-i686.pkg.tar.xz","inputattach","1.24","3","i686"),
+ ("community-testing/os/i686/ngspice-22-1-i686.pkg.tar.xz","ngspice","22","1","i686"),
+ ("community-testing/os/i686/tmux-1.4-2-i686.pkg.tar.xz","tmux","1.4","2","i686"),
+ ("community-testing/os/i686/tor-0.2.1.29-2-i686.pkg.tar.xz","tor","0.2.1.29","2","i686"),
+ ("../../../pool/community/tor-0.2.1.29-2-i686.pkg.tar.xz","tor","0.2.1.29","2","i686"),
+ ("community-testing/os/x86_64/inputattach-1.24-3-x86_64.pkg.tar.xz","inputattach","1.24","3","x86_64"),
+ ("../../../pool/community/inputattach-1.24-3-x86_64.pkg.tar.xz","inputattach","1.24","3","x86_64"),
+ ("tor-0.2.1.29-2-x86_64.pkg.tar.xz","tor","0.2.1.29","2","x86_64"),
+ )
+
+ def generate_results(self, example_tuple, attr):
+ location, name, version, release, arch = example_tuple
+ return pkginfo_from_filename(location)[attr], locals()[attr]
+
+ def testReturnPackageObject(self):
+ for i in self.known:
+ location, name, version, release, arch = i
+ self.assertIsInstance(pkginfo_from_filename(location),Package)
+
+ def testNames(self):
+ for i in self.known:
+ k,v = self.generate_results(example_tuple=i,attr="name")
+ self.assertEqual(k, v)
+
+ def testVersions(self):
+ for i in self.known:
+ k,v = self.generate_results(example_tuple=i,attr="version")
+ self.assertEqual(k, v)
+
+ def testArchs(self):
+ for i in self.known:
+ k,v = self.generate_results(example_tuple=i,attr="arch")
+ self.assertEqual(k, v)
+
+ def testReleases(self):
+ for i in self.known:
+ k,v = self.generate_results(example_tuple=i,attr="release")
+ self.assertEqual(k, v)
+
+ def testLocations(self):
+ for i in self.known:
+ k,v = self.generate_results(example_tuple=i,attr="location")
+ self.assertEqual(k, v)
+
+class pkginfo_from_file_BadInput(unittest.TestCase):
+ bad=("community-testing/os/i686/community-testing.db",
+ "community-testing/os/i686/community-testing.db.tar.gz",
+ "community-testing/os/i686/community-testing.db.tar.gz.old",
+ "community-testing/os/i686/community-testing.files",
+ "community-testing/os/i686/community-testing.files.tar.gz",
+ "community-testing/os/x86_64")
+
+ def testBadInput(self):
+ for i in self.bad:
+ self.assertRaises(NonValidFile,pkginfo_from_filename,i)
+
+class pkginfoFromRsyncOutput(unittest.TestCase):
+ example_package_list=(Package(),Package(),Package())
+ example_package_list[0].package_info={ "name" : "alex",
+ "version" : "2.3.4",
+ "release" : "1",
+ "arch" : "i686",
+ "license" : False,
+ "location": "community-staging/os/i686/alex-2.3.4-1-i686.pkg.tar.xz",
+ "depends" : False,}
+ example_package_list[1].package_info={ "name" : "any2dvd",
+ "version" : "0.34",
+ "release" : "4",
+ "arch" : "any",
+ "license" : False,
+ "location": "community/os/any/any2dvd-0.34-4-any.pkg.tar.xz",
+ "depends" : False,}
+ example_package_list[2].package_info={ "name" : "gmime22",
+ "version" : "2.2.26",
+ "release" : "1",
+ "arch" : "x86_64",
+ "license" : False,
+ "location": "community/os/x86_64/gmime22-2.2.26-1-x86_64.pkg.tar.xz",
+ "depends" : False,}
+
+ try:
+ output_file = open("rsync_output_sample")
+ rsync_out= output_file.read()
+ output_file.close()
+ except IOError: print("There is no rsync_output_sample file")
+
+ pkglist = pkginfo_from_rsync_output(rsync_out)
+
+ def testOutputArePackages(self):
+ if not self.pkglist:
+ self.fail("not pkglist:" + str(self.pkglist))
+ for pkg in self.pkglist:
+ self.assertIsInstance(pkg,Package)
+
+ def testPackageInfo(self):
+ if not self.pkglist:
+ self.fail("Pkglist doesn't exist: " + str(self.pkglist))
+ self.assertEqual(self.pkglist,self.example_package_list)
+
+class generateRsyncBlacklist(unittest.TestCase):
+ example_package_list=(Package(),Package(),Package())
+ example_package_list[0].package_info={ "name" : "alex",
+ "version" : "2.3.4",
+ "release" : "1",
+ "arch" : "i686",
+ "license" : False,
+ "location": "community-staging/os/i686/alex-2.3.4-1-i686.pkg.tar.xz",
+ "depends" : False,}
+ example_package_list[1].package_info={ "name" : "any2dvd",
+ "version" : "0.34",
+ "release" : "4",
+ "arch" : "any",
+ "license" : False,
+ "location": "community/os/any/any2dvd-0.34-4-any.pkg.tar.xz",
+ "depends" : False,}
+ example_package_list[2].package_info={ "name" : "gmime22",
+ "version" : "2.2.26",
+ "release" : "1",
+ "arch" : "x86_64",
+ "license" : False,
+ "location": "community/os/x86_64/gmime22-2.2.26-1-x86_64.pkg.tar.xz",
+ "depends" : False,}
+
+ def testListado(self):
+ self.assertEqual(listado("blacklist_sample"),["alex","gmime22"])
+
+ def testExcludeFiles(self):
+ a=rsyncBlacklist_from_blacklist(self.example_package_list,
+ listado("blacklist_sample"),
+ False)
+ b=[self.example_package_list[0]["location"],self.example_package_list[2]["location"]]
+ self.assertEqual(a,b)
+
+class pkginfo_from_descKnownValues(unittest.TestCase):
+ pkgsample=Package()
+ pkgsample.package_info={"name" : "binutils",
+ "version" : "2.21",
+ "release" : "4",
+ "arch" : "x86_64",
+ "license" : "GPL",
+ "location": "binutils-2.21-4-x86_64.pkg.tar.xz",
+ "depends" : False,}
+ fsock=open("desc")
+ pkggen=pkginfo_from_desc(fsock.read())
+ fsock.close()
+ def testPkginfoFromDesc(self):
+ if self.pkggen is None:
+ self.fail("return value is None")
+ self.assertEqual(self.pkgsample,self.pkggen)
+
+class pkginfo_from_db(unittest.TestCase):
+ archdb = os.path.join("./workdir")
+ example_package_list=(Package(),Package(),Package())
+ example_package_list[0].package_info={ "name" : "acl",
+ "version" : "2.2.49",
+ "release" : "2",
+ "arch" : "x86_64",
+ "license" : ("LGPL",),
+ "location": "acl-2.2.49-2-x86_64.pkg.tar.xz",
+ "depends" : ("attr>=2.4.41"),}
+ example_package_list[1].package_info={ "name" : "glibc",
+ "version" : "2.13",
+ "release" : "4",
+ "arch" : "x86_64",
+ "license" : ("GPL","LGPL"),
+ "location": "glibc-2.13-4-x86_64.pkg.tar.xz",
+ "depends" : ("linux-api-headers>=2.6.37","tzdata",),}
+ example_package_list[2].package_info={ "name" : "",
+ "version" : "2.2.26",
+ "release" : "1",
+ "arch" : "x86_64",
+ "license" : False,
+ "location": "",
+ "depends" : False,}
+
+
+if __name__ == "__main__":
+ unittest.main()
+