prt-get: add 'listorphans' command

git-svn-id: https://crux.nu/svn/tools/prt-get/trunk@1236 0b5ae1c7-2405-0410-a7fc-ba219f786e1e
This commit is contained in:
Johannes Winkelmann 2006-04-12 18:35:00 +00:00
parent befaa350b1
commit 97351c3852
11 changed files with 75 additions and 10 deletions

View File

@ -13,6 +13,7 @@
- add timestamps to log files - add timestamps to log files
- fix aliasing bug introduce earlier in the .12 session (thanks Mark) - fix aliasing bug introduce earlier in the .12 session (thanks Mark)
- add --recursive and --tree for dependent - add --recursive and --tree for dependent
- add listorphans command
* 0.5.11 29.05.2005 Johannes Winkelmann * 0.5.11 29.05.2005 Johannes Winkelmann
- add --path to 'ls' - add --path to 'ls'

1
TODO
View File

@ -5,7 +5,6 @@ $PKGMK_PACKAGE_DIR` to determine PACKAGE_DIR
- add update-footprint, update-md5sum commands (patch in trac) - add update-footprint, update-md5sum commands (patch in trac)
- allow dependency injection for sysup, with previews - allow dependency injection for sysup, with previews
- prefer toolchain (patch in trac) - prefer toolchain (patch in trac)
- dependent --list-orphaned; should simplify pkgfoster
- logging: check for non-root owned symlinks - logging: check for non-root owned symlinks
- logging: reject relative logfile names - logging: reject relative logfile names

2
configure vendored
View File

@ -1614,7 +1614,7 @@ fi
# Define the identity of the package. # Define the identity of the package.
PACKAGE=prt-get PACKAGE=prt-get
VERSION=0.5.12pre4 VERSION=0.5.12pre5
cat >>confdefs.h <<_ACEOF cat >>confdefs.h <<_ACEOF

View File

@ -1,7 +1,7 @@
# Process this file with autoconf to produce a configure script. # Process this file with autoconf to produce a configure script.
AC_INIT AC_INIT
AC_CONFIG_SRCDIR([src/prtget.cpp]) 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 dnl Determine default prefix

View File

@ -322,6 +322,10 @@ It's also possible to use shell like
.B wildcards .B wildcards
for the listinst command. Make sure you escape where needed for the listinst command. Make sure you escape where needed
.TP
.B listorphans [\-v|\-vv]
List installed ports which have no dependent packages
.TP .TP

View File

@ -20,7 +20,7 @@ _prt-get()
dependent sysup current lock unlock \ dependent sysup current lock unlock \
listlocked diff quickdiff depends quickdep \ listlocked diff quickdiff depends quickdep \
dup isinst cat ls edit deptree \ dup isinst cat ls edit deptree \
remove listinst' $cur )) remove listinst dumpconfig listofphans' $cur ))
fi fi

View File

@ -121,7 +121,7 @@ const string& ArgParser::alternateConfigFile() const
*/ */
bool ArgParser::parse() bool ArgParser::parse()
{ {
const int commandCount = 34; const int commandCount = 35;
string commands[commandCount] = { "list", "search", "dsearch", string commands[commandCount] = { "list", "search", "dsearch",
"info", "info",
"depends", "install", "depinst", "depends", "install", "depinst",
@ -132,7 +132,8 @@ bool ArgParser::parse()
"dependent", "sysup", "current", "dependent", "sysup", "current",
"fsearch", "lock", "unlock", "fsearch", "lock", "unlock",
"listlocked", "cat", "ls", "edit", "listlocked", "cat", "ls", "edit",
"remove", "deptree", "dumpconfig" }; "remove", "deptree", "dumpconfig",
"listorphans" };
Type commandID[commandCount] = { LIST, SEARCH, DSEARCH, INFO, Type commandID[commandCount] = { LIST, SEARCH, DSEARCH, INFO,
DEPENDS, INSTALL, DEPINST, DEPENDS, INSTALL, DEPINST,
@ -143,7 +144,7 @@ bool ArgParser::parse()
DEPENDENT, SYSUP, CURRENT, DEPENDENT, SYSUP, CURRENT,
FSEARCH, LOCK, UNLOCK, LISTLOCKED, FSEARCH, LOCK, UNLOCK, LISTLOCKED,
CAT, LS, EDIT, REMOVE, DEPTREE, CAT, LS, EDIT, REMOVE, DEPTREE,
DUMPCONFIG }; DUMPCONFIG, LISTORPHANS };
if ( m_argc < 2 ) { if ( m_argc < 2 ) {
return false; return false;
} }

View File

@ -37,7 +37,7 @@ public:
LISTINST, PRINTF, README, DEPENDENT, SYSUP, LISTINST, PRINTF, README, DEPENDENT, SYSUP,
CURRENT, FSEARCH, LOCK, UNLOCK, LISTLOCKED, CURRENT, FSEARCH, LOCK, UNLOCK, LISTLOCKED,
CAT, LS, EDIT, REMOVE, CAT, LS, EDIT, REMOVE,
DEPTREE, DUMPCONFIG }; DEPTREE, DUMPCONFIG, LISTORPHANS };
bool isCommandGiven() const; bool isCommandGiven() const;
bool isForced() const; bool isForced() const;

View File

@ -160,6 +160,9 @@ int main( int argc, char** argv )
case ArgParser::DUMPCONFIG: case ArgParser::DUMPCONFIG:
prtGet.dumpConfig(); prtGet.dumpConfig();
break; break;
case ArgParser::LISTORPHANS:
prtGet.listOrphans();
break;
default: default:
cerr << "unknown command" << endl; cerr << "unknown command" << endl;
break; break;

View File

@ -107,6 +107,8 @@ void PrtGet::printUsage()
<< endl; << endl;
cout << " listinst [<filter>] show a list of installed ports" cout << " listinst [<filter>] show a list of installed ports"
<< endl; << endl;
cout << " listorphans list of ports with no "
<< "packages depending on them" << endl;
cout << " info <port> show info about a port" << endl; cout << " info <port> show info about a port" << endl;
cout << " path <port> show path of a port" << endl; cout << " path <port> show path of a port" << endl;
cout << " readme <port> show a port's readme file " cout << " readme <port> show a port's readme file "
@ -145,6 +147,9 @@ void PrtGet::printUsage()
cout << " where opt can be:" << endl; cout << " where opt can be:" << endl;
cout << " --all list all dependent packages, not " cout << " --all list all dependent packages, not "
<< "only installed" << endl; << "only installed" << endl;
cout << " --recursive print recursive listing" << endl;
cout << " --true print recursive tree listing"
<< endl;
cout << "\nSEARCHING" << endl; cout << "\nSEARCHING" << endl;
cout << " search <expr> show port names containing 'expr'" << endl; cout << " search <expr> 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 = ""; string indent = "";
if (m_parser->printTree()) { if (m_parser->printTree()) {
for (int i = 0; i < level; ++i) { for (int i = 0; i < level; ++i) {
@ -1318,6 +1332,48 @@ void PrtGet::printDependent(const string& dep, int level)
} }
} }
void PrtGet::listOrphans()
{
initRepo();
map<string, string> installed = m_pkgDB->installedPackages();
map<string, bool> required;
map<string, string>::iterator it = installed.begin();
for (; it != installed.end(); ++it) {
list<string> tokens;
const Package* p = m_repo->getPackage(it->first);
if (p) {
StringHelper::split( p->dependencies(), ',', tokens );
list<string>::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) void PrtGet::warnPackageNotFound(InstallTransaction& transaction)
{ {
cerr << "The package '"; cerr << "The package '";

View File

@ -70,6 +70,7 @@ public:
void printDependent(); void printDependent();
void printDiff(); void printDiff();
void printQuickDiff(); void printQuickDiff();
void listOrphans();
void createCache(); void createCache();