summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Winkelmann <jw@smts.ch>2006-04-12 18:35:00 +0000
committerJohannes Winkelmann <jw@smts.ch>2006-04-12 18:35:00 +0000
commit97351c38522767c62c81861dc6f694e4716f9236 (patch)
treea340bdfae400a62aafa8a48980ed5c78ece1fbdb
parentbefaa350b1cf847a920d75edaf93fcb340c31288 (diff)
downloadprt-get-97351c38522767c62c81861dc6f694e4716f9236.tar.gz
prt-get-97351c38522767c62c81861dc6f694e4716f9236.tar.xz
prt-get: add 'listorphans' command
git-svn-id: https://crux.nu/svn/tools/prt-get/trunk@1236 0b5ae1c7-2405-0410-a7fc-ba219f786e1e
-rw-r--r--ChangeLog1
-rw-r--r--TODO1
-rwxr-xr-xconfigure2
-rw-r--r--configure.in2
-rw-r--r--doc/prt-get.84
-rw-r--r--misc/prt-get_complete2
-rw-r--r--src/argparser.cpp7
-rw-r--r--src/argparser.h2
-rw-r--r--src/main.cpp3
-rw-r--r--src/prtget.cpp60
-rw-r--r--src/prtget.h1
11 files changed, 75 insertions, 10 deletions
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 [<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 '";
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();

Generated by cgit