diff -Naur kdeadmin-3.5.4/kpackage/fpmInterface.cpp kdeadmin-3.5.4-fw/kpackage/fpmInterface.cpp --- kdeadmin-3.5.4/kpackage/fpmInterface.cpp 1970-01-01 01:00:00.000000000 +0100 +++ kdeadmin-3.5.4-fw/kpackage/fpmInterface.cpp 2006-10-05 01:24:27.000000000 +0200 @@ -0,0 +1,469 @@ +/* +** Copyright (C) 1999,2000 Toivo Pedaste +** +*/ + +/* +** 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 2 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 in a file called COPYING; if not, write to +** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +** MA 02110-1301, USA. +*/ + +/* +** Bug reports and questions can be sent to kde-devel@kde.org +*/ + + +////////////////////////////////////////////////////////////////////////////// +/// +/// FPM Program version +/// +////////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include + +#include "kpPty.h" +#include "kpackage.h" +#include "fpmInterface.h" +#include "updateLoc.h" +#include "cache.h" + +using namespace std; + +FPM::FPM():pkgInterface() +{ + head = "Frugalware"; + name = i18n("Frugalware"); + icon = "fpm"; + + pict = UserIcon(icon); + updated_pict = UserIcon("kupdated"); + new_pict = UserIcon("knew"); + + packagePattern = "*.fpm"; + typeID = "/fpm"; + + // FIXME + paramsInst.append(new param(i18n("Upgrade"),TRUE,FALSE,"-U","-i")); + paramsInst.append(new param(i18n("Replace Files"),FALSE,FALSE,"--replacefiles")); + paramsInst.append(new param(i18n("Replace Packages"),TRUE,FALSE,"--replacepkgs")); + paramsInst.append(new param(i18n("Check Dependencies"),TRUE,TRUE,"--nodeps")); + paramsInst.append(new param(i18n("Test (do not install)"),FALSE,FALSE,"--test")); + + paramsUninst.append(new param(i18n("Use Scripts"),TRUE,TRUE,"--noscripts")); + paramsUninst.append(new param(i18n("Check Dependencies"),TRUE,TRUE,"--nodeps")); + paramsUninst.append(new param(i18n("Test (do not uninstall)"),FALSE,FALSE,"--test")); + + + queryMsg = i18n("Querying FPM package list: "); + + hasProgram = ifExe("pacman"); + + alpm_initialize(PM_ROOT); + db_local = alpm_db_register("local"); +} + + FPM::~FPM(){ + alpm_release(); + } + +bool FPM::isType(char *buf, const QString & /* fname */) +{ + return false; +} + +bool FPM::parseName(const QString &name, QString *n, QString *v) +{ + // Taken from the portage code, should be correct + QRegExp r("^(.+)-([^-]+-[^-]+)-[^-]+$"); + + r.search(name); + + *n = r.cap(1); + *v = r.cap(2); + + if (n->isEmpty() || v->isEmpty()) + return false; + else + return true; +} + +void FPM::listInstalledPackages(QPtrList *pki) +{ + packageInfo *p; + PM_LIST *lp; + + kpackage->setStatus(i18n("Querying FPM package list")); + kpackage->setPercent(0); + lp = alpm_db_getpkgcache(db_local); + + kpackage->setStatus(i18n("Processing FPM package list")); + kpackage->setPercent(50); + + for(; lp; lp = alpm_list_next(lp)) { + PM_PKG *pkg = (PM_PKG*)alpm_list_getdata(lp); + p = collectInfo(pkg); + if (p) { + if (!p->pkgInsert(pki, typeID, TRUE)) { + delete p; + } + } + } + + kpackage->setStatus(i18n("DEB APT")); + kpackage->setPercent(100); +} +packageInfo* FPM::collectInfo(PM_PKG *pkg) { + + bool haveName = FALSE; + QMap a; + + QString name, value; + + a.insert("name", (char*)alpm_pkg_getinfo(pkg, PM_PKG_NAME)); + a.insert("group", (char*)alpm_list_getdata((PM_LIST*)alpm_pkg_getinfo(pkg, PM_PKG_GROUPS))); + a.insert("size", QString::number((long int)alpm_pkg_getinfo(pkg, PM_PKG_SIZE))); + // for -Si? + //a.insert("file-size", "100"); + // for -Syu? + //a.insert("old-version", "0.1"); + a.insert("version", (char *)alpm_pkg_getinfo(pkg, PM_PKG_VERSION)); + a.insert("arch", (char *)alpm_pkg_getinfo(pkg, PM_PKG_ARCH)); + a.insert("summary", (char *)alpm_pkg_getinfo(pkg, PM_PKG_DESC)); + packageInfo *i = new packageInfo(a,this); + if(!strcmp("local", (char*)alpm_db_getinfo(((PM_DB*)alpm_pkg_getinfo(pkg, PM_PKG_DATA)), PM_DB_TREENAME))) + i->packageState = packageInfo::INSTALLED; + else + i->packageState = packageInfo::AVAILABLE; + i->fixup(); + return i; +} + +////////////////////////////////////////////////////////////////////////////// + +QStringList FPM::getChangeLog(packageInfo *p) +{ + QStringList clog; + QString fn; + if (p->packageState == packageInfo::INSTALLED) + { + //QString cmd = "pacman -Qc "; + //cmd += p->getProperty("name"); + + QStringList filelist;// = kpty->run(cmd); + fn = (QString)PM_ROOT + PM_DBPATH + "/local/" + p->getProperty("name") + "-" + p->getProperty("version") + "/changelog"; + kdDebug() << "clog file: " << fn <<"\n"; + ifstream infile; + infile.open (fn.ascii()); + if(infile.is_open()) + { + char line[256]; + while (infile.good()) + { + infile.getline(line, 256); + filelist << line; + } + infile.close(); + } + else + kdDebug() << "failed to open the clfile!\n"; + return filelist; + } + + return clog; +} + + +bool FPM::filesTab(packageInfo *p) { + if (p->packageState == packageInfo::INSTALLED) { + return true; + } + return false; +} + +bool FPM::changeTab(packageInfo *p) { + if (p->packageState == packageInfo::INSTALLED) { + return true; + } + return false; +} + +////////////////////////////////////////////////////////////////////////////// + + +QStringList FPM::getFileList(packageInfo *p) +{ + QStringList filelist; + PM_LIST *i, *pkgfiles; + PM_PKG *pkg=NULL; + + //kdDebug() << "filename: " << p->getFilename() <<"\n"; + + for(i = alpm_db_getpkgcache(db_local); i; i = alpm_list_next(i)) + { + pkg = (PM_PKG*)alpm_list_getdata(i); + if(!strcmp((char*)alpm_pkg_getinfo(pkg, PM_PKG_NAME),p->getProperty("name").ascii())) + break; + } + + pkgfiles = (PM_LIST*)alpm_pkg_getinfo(pkg, PM_PKG_FILES); + for(i = pkgfiles; i; i = alpm_list_next(i)) { + filelist << PM_ROOT + (QString)(char *)alpm_list_getdata(i); + } + + return filelist; +} + +/////////////////////// END OF REVIEWED CODE /////////////// + +////////////////////////////////////////////////////////////////////////////// +packageInfo *FPM::getPackageInfo(char mode, const QString &name, const QString &) +{ + /*if (mode == 'i') { + return getIPackageInfo(name); + } else + return getUPackageInfo(name);*/ +} + +packageInfo *FPM::getIPackageInfo( const QString &name ) +{ + // query an installed package! + QString cmd = "pacman -Qi "; + cmd += name; + + QStringList infoList = kpty->run(cmd); + packageInfo *pki;// = collectInfo(infoList); + if (pki) { + pki->packageState = packageInfo::INSTALLED; + collectDepends(pki,name,0); + } + return pki; +} + +packageInfo *FPM::getUPackageInfo( const QString &name ) +{ + // query an uninstalled package + QString cmd = "rpm -q"; + cmd += " -p "; + cmd += quotePath(name); + + QStringList infoList = kpty->run(cmd); + packageInfo *pki;// = collectInfo(infoList); + if (pki) { + pki->updated = TRUE; + pki->packageState = packageInfo::AVAILABLE; + if (pki->hasProperty("install time")) + pki->info.remove("install time"); + collectDepends(pki,name,1); + } + + return pki; +} + +QString FPM::provMap( const QString &p ) +{ + QString *r = provides[p]; + if (r) { + QString s = *r; + // printf("%s=>%s\n",p.data(),s.data()); + return s; + } else { + return p; + } +} + + +////////////////////////////////////////////////////////////////////////////// +void FPM::collectDepends(packageInfo *p, const QString &name, int src) +{ + QString cmd = "rpm -V --nofiles "; + if (src) { + cmd += "-p "; + } + cmd += quotePath(name); + + // cmd = "cat /home/toivo/rpm.deps"; + QStringList list = kpty->run(cmd); + + if (list.count() > 0) { + QStringList::Iterator it = list.begin(); + int pt = (*it).find(":"); + if (pt > 0) { + QString s = (*it).mid(pt+1); + if (!s.isEmpty()) { + p->info.insert("unsatisfied dependencies", s); + } + } + } +} + +////////////////////////////////////////////////////////////////////////////// +void FPM::setLocation() +{ + return; +} + +void FPM::setAvail(LcacheObj *slist) +{ + if (packageLoc) + delete packageLoc; + packageLoc = slist; +} + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +QString FPM::uninstall(int uninstallFlags, QPtrList *plist, bool &test) +{ + QStringList files; + + packageInfo *pk; + for (pk = plist->first(); pk != 0; pk = plist->next()) { + files.append( pk->getProperty("name") ); + } + + if (getuid() == 0) { + return doUninst(uninstallFlags,files, test); + } else { + return doUninstP(uninstallFlags,files, test); + } +} + +QString FPM::uninstall(int uninstallFlags, packageInfo *p, bool &test) +{ + QStringList files; + files.append( p->getProperty("name") ); + + if (getuid() == 0) { + return doUninstP(uninstallFlags,files, test); + } else { + return doUninstP(uninstallFlags,files, test); + } +} + +QString FPM::doUninstP(int uninstallFlags, const QStringList &files, bool &test) +{ + QString s = "pacman -R "; + s += setOptions(uninstallFlags, paramsUninst); + + for (QStringList::ConstIterator it = files.begin(); it != files.end(); ++it ) { + s += " "; + s += *it; + } + + if (uninstallFlags>>2 & 1) + test = TRUE; + + kdDebug() << "uCMD=" << s << " test=" << test << "\n"; + + return s; +} + + + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +QString FPM::install(int installFlags, QPtrList *plist, bool &test) +{ + QStringList files; + + for (packageInfo *pk = plist->first(); pk != 0; pk = plist->next()) { + QString fname( pk->fetchFilename() ); + if (!fname.isEmpty()) { + files.append(quotePath(fname)); + } + } + + if (getuid() == 0) { + return doinstP(installFlags,files,test); + } else { + return doinstP(installFlags,files,test); + } +} + +QString FPM::install(int installFlags, packageInfo *p, bool &test) +{ + QStringList files; + files.append(quotePath(p->fetchFilename())); + if (getuid() == 0) { + return doinstP(installFlags,files,test); + } else { + return doinstP(installFlags,files,test); + } +} + + +QString FPM::doinstP(int installFlags, const QStringList &files, bool &test) +{ + QString s = "rpm "; + s += setOptions(installFlags, paramsInst); + + for (QStringList::ConstIterator it = files.begin(); it != files.end(); ++it ) { + s += " "; + s += *it; + } + + if (installFlags>>4 & 1) + test = TRUE; + + kdDebug() << "iCMD=" << s << " test=" << test << "\n"; + + return s; +} + + QStringList FPM::verify(packageInfo *p, const QStringList &files){ + return pkgInterface::verify(p,files);} + +////////////////////////////////////////////////////////////////////////////// +QStringList FPM::FindFile(const QString &name, bool) { + QString cmd = "rpm -q -a --filesbypkg"; + + QStringList list = kpty->run(cmd); + QStringList retlist; + if (kpty->Result > 0) { + list.clear(); + } else { + for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) { + int p = (*it).find(" "); + int nm = (*it).find(name,p); + if (nm >= 0) { + (*it).replace(p, 1, "\t"); + retlist.append(*it); + } + } + } + + return retlist; +} + +////////////////////////////////////////////////////////////////////////////// +QString FPM::quotePath( const QString &path) { + QString s = path; + s = s.replace(" ","\\ "); + return ( "'" + s + "'" ); +} + +////////////////////////////////////////////////////////////////////////////// + QStringList FPM::depends(const QString &, int){return 0;} + + QString FPM::doUninst(int, const QStringList &, bool &){return "0=";} + QString FPM::doinst(int, const QStringList &, bool &){return "0=";} + + +//#include "fpmInterface.moc" diff -Naur kdeadmin-3.5.4/kpackage/fpmInterface.h kdeadmin-3.5.4-fw/kpackage/fpmInterface.h --- kdeadmin-3.5.4/kpackage/fpmInterface.h 1970-01-01 01:00:00.000000000 +0100 +++ kdeadmin-3.5.4-fw/kpackage/fpmInterface.h 2006-10-04 03:26:31.000000000 +0200 @@ -0,0 +1,106 @@ +/* +** Copyright (C) 1999,2000 Toivo Pedaste +** +*/ + +/* +** 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 2 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 in a file called COPYING; if not, write to +** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +** MA 02110-1301, USA. +*/ + +/* +** Bug reports and questions can be sent to kde-devel@kde.org +*/ + +#ifndef FPM_IFACE_H +#define FPM_IFACE_H + +#include "../config.h" + + +#include +#include + +#include "packageInfo.h" +#include "pkgInterface.h" + +class KDir; +class cacheObj; + +class FPM : public pkgInterface +{ + Q_OBJECT + +public: + FPM(); + ~FPM(); + + bool isType(char *buf, const QString &fname); + + packageInfo *getPackageInfo(char mode, const QString &name, const QString &version); + QStringList getFileList(packageInfo *p); + QStringList getChangeLog(packageInfo *p); + + bool filesTab(packageInfo *p); + // If files tab is to be enabled + + bool changeTab(packageInfo *p); + // If change log tab is to be enabled + + QStringList depends(const QString &name, int src); + QStringList verify(packageInfo *p, const QStringList &files); + + QString uninstall(int uninstallFlags, QPtrList *p, bool &test); + QString uninstall(int uninstallFlags, packageInfo *p, bool &test); + QString doUninst(int uninstallFlags, const QStringList &files, bool &test); + QString doUninstP(int uninstallFlags, const QStringList &files, bool &test); + + QString install(int installFlags, QPtrList *p, bool &test); + QString install(int installFlags, packageInfo *p, bool &test); + QString doinst(int installFlags, const QStringList &files, bool &test); + QString doinstP(int installFlags, const QStringList &files, bool &test); + + QStringList FindFile(const QString &name, bool seachAll=false); + void collectDepends(packageInfo *p, const QString &name, int src); + bool parseName(const QString &name, QString *n, QString *v); + + QString provMap(const QString &p); + +public slots: + void setLocation(); + void setAvail(LcacheObj *); + +private: + packageInfo* collectInfo(PM_PKG *pkg); + + void listInstalledPackages(QPtrList *pki); + + QDict provides; + PM_DB *db_local; + QStringList infoList; + + QString packageQuery(); + + packageInfo *getIPackageInfo( const QString &name); + packageInfo *getUPackageInfo( const QString &name); + + QString quotePath( const QString &path); + + }; + +#endif + + + diff -Naur kdeadmin-3.5.4/kpackage/kpackage.h kdeadmin-3.5.4-fw/kpackage/kpackage.h --- kdeadmin-3.5.4/kpackage/kpackage.h 2005-10-10 16:53:28.000000000 +0200 +++ kdeadmin-3.5.4-fw/kpackage/kpackage.h 2006-10-03 23:01:51.000000000 +0200 @@ -56,7 +56,7 @@ class KAction; class kpRun; -#define kpinterfaceN 7 +#define kpinterfaceN 8 ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// diff -Naur kdeadmin-3.5.4/kpackage/main.cpp kdeadmin-3.5.4-fw/kpackage/main.cpp --- kdeadmin-3.5.4/kpackage/main.cpp 2006-01-19 17:20:10.000000000 +0100 +++ kdeadmin-3.5.4-fw/kpackage/main.cpp 2006-10-03 23:00:27.000000000 +0200 @@ -53,6 +53,7 @@ #include "fbsdInterface.h" #include "rpmInterface.h" #include "gentooInterface.h" +#include "fpmInterface.h" static const char description[] = @@ -124,6 +125,7 @@ kpinterface[j++] = new fbsdInterface(); kpinterface[j++] = new SLACK(); // Also catched BSD packages... kpinterface[j++] = new Gentoo(); + kpinterface[j++] = new FPM(); opts->readLaterSettings(); diff -Naur kdeadmin-3.5.4/kpackage/Makefile.am kdeadmin-3.5.4-fw/kpackage/Makefile.am --- kdeadmin-3.5.4/kpackage/Makefile.am 2005-09-10 10:14:31.000000000 +0200 +++ kdeadmin-3.5.4-fw/kpackage/Makefile.am 2006-10-04 00:37:37.000000000 +0200 @@ -15,12 +15,12 @@ updateLoc.cpp procbuf.cpp kplview.cpp \ pkgInterface.cpp rpmInterface.cpp kissInterface.cpp \ slackInterface.cpp fbsdInterface.cpp gentooInterface.cpp \ - kpPty.cpp kpTerm.cpp + kpPty.cpp kpTerm.cpp fpmInterface.cpp kpackage_METASOURCES = AUTO # the library search path -kpackage_LDFLAGS = $(all_libraries) $(KDE_RPATH) +kpackage_LDFLAGS = $(all_libraries) $(KDE_RPATH) -lalpm # the libraries to link against. Be aware of the order. First the libraries, # that depend on the following ones.