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:
parent
befaa350b1
commit
97351c3852
@ -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
1
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
|
||||
|
||||
|
2
configure
vendored
2
configure
vendored
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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 '";
|
||||
|
@ -70,6 +70,7 @@ public:
|
||||
void printDependent();
|
||||
void printDiff();
|
||||
void printQuickDiff();
|
||||
void listOrphans();
|
||||
|
||||
void createCache();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user