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
- 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'

1
TODO
View File

@ -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

2
configure vendored
View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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;
}

View File

@ -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;

View File

@ -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;

View File

@ -107,6 +107,8 @@ void PrtGet::printUsage()
<< endl;
cout << " listinst [<filter>] show a list of installed ports"
<< endl;
cout << " listorphans list of ports with no "
<< "packages depending on them" << endl;
cout << " info <port> show info about a port" << endl;
cout << " path <port> show path of a port" << endl;
cout << " readme <port> 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 <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 = "";
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<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)
{
cerr << "The package '";

View File

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