diff --git a/ChangeLog b/ChangeLog index dfdfc50..0e37792 100644 --- a/ChangeLog +++ b/ChangeLog @@ -13,6 +13,7 @@ - add timestamps to log files - fix aliasing bug introduce earlier in the .12 session (thanks Mark) - add --recursive and --tree for dependent +- add listorphans command * 0.5.11 29.05.2005 Johannes Winkelmann - add --path to 'ls' diff --git a/TODO b/TODO index 7cc58d2..c170d91 100644 --- a/TODO +++ b/TODO @@ -5,7 +5,6 @@ $PKGMK_PACKAGE_DIR` to determine PACKAGE_DIR - add update-footprint, update-md5sum commands (patch in trac) - allow dependency injection for sysup, with previews - prefer toolchain (patch in trac) -- dependent --list-orphaned; should simplify pkgfoster - logging: check for non-root owned symlinks - logging: reject relative logfile names diff --git a/configure b/configure index fa8fe49..2a60eec 100755 --- a/configure +++ b/configure @@ -1614,7 +1614,7 @@ fi # Define the identity of the package. PACKAGE=prt-get - VERSION=0.5.12pre4 + VERSION=0.5.12pre5 cat >>confdefs.h <<_ACEOF diff --git a/configure.in b/configure.in index b3494f7..6f6cdf8 100644 --- a/configure.in +++ b/configure.in @@ -1,7 +1,7 @@ # Process this file with autoconf to produce a configure script. AC_INIT AC_CONFIG_SRCDIR([src/prtget.cpp]) -AM_INIT_AUTOMAKE(prt-get,0.5.12pre4) +AM_INIT_AUTOMAKE(prt-get,0.5.12pre5) dnl Determine default prefix diff --git a/doc/prt-get.8 b/doc/prt-get.8 index eb2ae90..58e8b61 100644 --- a/doc/prt-get.8 +++ b/doc/prt-get.8 @@ -322,6 +322,10 @@ It's also possible to use shell like .B wildcards for the listinst command. Make sure you escape where needed +.TP +.B listorphans [\-v|\-vv] +List installed ports which have no dependent packages + .TP diff --git a/misc/prt-get_complete b/misc/prt-get_complete index c1be89a..57dfc01 100644 --- a/misc/prt-get_complete +++ b/misc/prt-get_complete @@ -20,7 +20,7 @@ _prt-get() dependent sysup current lock unlock \ listlocked diff quickdiff depends quickdep \ dup isinst cat ls edit deptree \ - remove listinst' $cur )) + remove listinst dumpconfig listofphans' $cur )) fi diff --git a/src/argparser.cpp b/src/argparser.cpp index 1aabbc4..85aa149 100644 --- a/src/argparser.cpp +++ b/src/argparser.cpp @@ -121,7 +121,7 @@ const string& ArgParser::alternateConfigFile() const */ bool ArgParser::parse() { - const int commandCount = 34; + const int commandCount = 35; string commands[commandCount] = { "list", "search", "dsearch", "info", "depends", "install", "depinst", @@ -132,7 +132,8 @@ bool ArgParser::parse() "dependent", "sysup", "current", "fsearch", "lock", "unlock", "listlocked", "cat", "ls", "edit", - "remove", "deptree", "dumpconfig" }; + "remove", "deptree", "dumpconfig", + "listorphans" }; Type commandID[commandCount] = { LIST, SEARCH, DSEARCH, INFO, DEPENDS, INSTALL, DEPINST, @@ -143,7 +144,7 @@ bool ArgParser::parse() DEPENDENT, SYSUP, CURRENT, FSEARCH, LOCK, UNLOCK, LISTLOCKED, CAT, LS, EDIT, REMOVE, DEPTREE, - DUMPCONFIG }; + DUMPCONFIG, LISTORPHANS }; if ( m_argc < 2 ) { return false; } diff --git a/src/argparser.h b/src/argparser.h index 0260f06..b560448 100644 --- a/src/argparser.h +++ b/src/argparser.h @@ -37,7 +37,7 @@ public: LISTINST, PRINTF, README, DEPENDENT, SYSUP, CURRENT, FSEARCH, LOCK, UNLOCK, LISTLOCKED, CAT, LS, EDIT, REMOVE, - DEPTREE, DUMPCONFIG }; + DEPTREE, DUMPCONFIG, LISTORPHANS }; bool isCommandGiven() const; bool isForced() const; diff --git a/src/main.cpp b/src/main.cpp index 64904af..abbd52f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -160,6 +160,9 @@ int main( int argc, char** argv ) case ArgParser::DUMPCONFIG: prtGet.dumpConfig(); break; + case ArgParser::LISTORPHANS: + prtGet.listOrphans(); + break; default: cerr << "unknown command" << endl; break; diff --git a/src/prtget.cpp b/src/prtget.cpp index 02fdc91..78e79f0 100644 --- a/src/prtget.cpp +++ b/src/prtget.cpp @@ -107,6 +107,8 @@ void PrtGet::printUsage() << endl; cout << " listinst [] show a list of installed ports" << endl; + cout << " listorphans list of ports with no " + << "packages depending on them" << endl; cout << " info show info about a port" << endl; cout << " path show path of a port" << endl; cout << " readme show a port's readme file " @@ -145,6 +147,9 @@ void PrtGet::printUsage() cout << " where opt can be:" << endl; cout << " --all list all dependent packages, not " << "only installed" << endl; + cout << " --recursive print recursive listing" << endl; + cout << " --true print recursive tree listing" + << endl; cout << "\nSEARCHING" << endl; cout << " search show port names containing 'expr'" << endl; @@ -1280,8 +1285,17 @@ void PrtGet::printDependent(const string& dep, int level) } } } - - // prepared for recursive search + + // - there are two modes, tree and non-tree recursive mode; in + // tree mode, packages are shown multiple times, in non tree + // recursive mode they're only printed the first time; this is not + // necessarily optimal for rebuilding: + // + // a -> b -> d + // \ ^ + // > c / + // + // trying to rebuild 'd' before 'c' might possibly fail string indent = ""; if (m_parser->printTree()) { for (int i = 0; i < level; ++i) { @@ -1318,6 +1332,48 @@ void PrtGet::printDependent(const string& dep, int level) } } +void PrtGet::listOrphans() +{ + initRepo(); + map installed = m_pkgDB->installedPackages(); + map required; + map::iterator it = installed.begin(); + + for (; it != installed.end(); ++it) { + list tokens; + const Package* p = m_repo->getPackage(it->first); + if (p) { + StringHelper::split( p->dependencies(), ',', tokens ); + list::iterator lit = tokens.begin(); + for (; lit != tokens.end(); ++lit) { + required[*lit] = true; + } + } + } + + // - we could store the package pointer in another map to avoid + // another getPackage lockup, but it seems better to optimized for + // memory since it's only used when called with -vv + + it = installed.begin(); + for (; it != installed.end(); ++it) { + if (!required[it->first]) { + cout << it->first; + if ( m_parser->verbose() > 0 ) { + cout << " " << it->second; + } + if ( m_parser->verbose() > 1 ) { + const Package* p = m_repo->getPackage(it->first); + if (p) { + cout << ": " << p->description(); + } + } + cout << endl; + } + } +} + + void PrtGet::warnPackageNotFound(InstallTransaction& transaction) { cerr << "The package '"; diff --git a/src/prtget.h b/src/prtget.h index 602f8c2..1936b05 100644 --- a/src/prtget.h +++ b/src/prtget.h @@ -70,6 +70,7 @@ public: void printDependent(); void printDiff(); void printQuickDiff(); + void listOrphans(); void createCache();