Let zypper remove lock follow addlock with respect to args and behavior (bnc#751976)
authorMichael Andres <ma@suse.de>
Mon, 16 Apr 2012 18:55:00 +0000 (20:55 +0200)
committerMichael Andres <ma@suse.de>
Mon, 16 Apr 2012 18:55:00 +0000 (20:55 +0200)
doc/zypper.8
src/Zypper.cc
src/locks.cc
src/locks.h

index 36c0f67..76b414d 100644 (file)
@@ -1436,6 +1436,12 @@ or by the package name.
 .TP
 .I \-r, \-\-repo <alias|name|#|URI>
 Restrict the lock to the specified repository.
+.TP
+.I \-t, \-\-type <type>
+Restrict the lock to packages of specified type (default: package).
+See section \fBPackage Types\fR for list
+of available package types.
+
 
 .TP
 .B cleanlocks (cl)
index 2f3ceec..52ff2fc 100644 (file)
@@ -2183,6 +2183,7 @@ void Zypper::processCommandOptions()
   {
     static struct option options[] =
     {
+      {"type", required_argument, 0, 't'},
       {"repo", required_argument, 0, 'r'},
       // rug compatiblity (although rug does not seem to support this)
       {"catalog", required_argument, 0, 'c'},
@@ -2198,7 +2199,9 @@ void Zypper::processCommandOptions()
       "\n"
       "  Command options:\n"
       "-r, --repo <alias|#|URI>  Remove only locks with specified repository.\n"
-    ), "zypper locks");
+      "-t, --type <type>         Type of package (%s).\n"
+      "                          Default: %s.\n"
+    ), "zypper locks", "package, patch, pattern, product", "package");
     break;
   }
 
@@ -4411,21 +4414,34 @@ copts.end())
       return;
     }
 
-    if (_arguments.size() < 1)
+    if (_arguments.empty())
     {
       report_required_arg_missing(out(), _command_help);
       setExitCode(ZYPPER_EXIT_ERR_INVALID_ARGS);
       return;
     }
 
-    initRepoManager();
-    init_target(*this);
-    init_repos(*this);
-    if (exitCode() != ZYPPER_EXIT_OK)
-      return;
-    load_resolvables(*this);
+    ResKindSet kinds;
+    if (copts.count("type"))
+    {
+      std::list<std::string>::const_iterator it;
+      for (it = copts["type"].begin(); it != copts["type"].end(); ++it)
+      {
+        kind = string_to_kind( *it );
+        if (kind == ResObject::Kind())
+        {
+          out().error(boost::str(format(
+            _("Unknown package type '%s'.")) % *it));
+          setExitCode(ZYPPER_EXIT_ERR_INVALID_ARGS);
+          return;
+        }
+        kinds.insert(kind);
+      }
+    }
+    //else
+    //  let remove_locks determine the appropriate type
 
-    remove_locks(*this, _arguments);
+    remove_locks(*this, _arguments, kinds);
 
     break;
   }
index d5a6517..6717a3a 100644 (file)
@@ -116,13 +116,12 @@ void safe_lexical_cast (Source s, Target &tr) {
 
 void add_locks(Zypper & zypper, const Zypper::ArgList & args, const ResKindSet & kinds)
 {
-  Locks::size_type start = 0;
   try
   {
     Locks & locks = Locks::instance();
     locks.read(Pathname::assertprefix
         (zypper.globalOpts().root_dir, ZConfig::instance().locksFile()));
-    start = locks.size();
+    Locks::size_type start = locks.size();
     for_(it,args.begin(),args.end())
     {
       PoolQuery q;
@@ -174,7 +173,7 @@ void add_locks(Zypper & zypper, const Zypper::ArgList & args, const ResKindSet &
 }
 
 
-void remove_locks(Zypper & zypper, const Zypper::ArgList & args)
+void remove_locks(Zypper & zypper, const Zypper::ArgList & args, const ResKindSet & kinds)
 {
   try
   {
@@ -199,11 +198,21 @@ void remove_locks(Zypper & zypper, const Zypper::ArgList & args)
         //TODO fill query in one method to have consistent add/remove
         //TODO what to do with repo and kinds?
         PoolQuery q;
-         // derive kind from the name: (rl should also support -t)
-        sat::Solvable::SplitIdent split( *args_it );
-        q.addAttribute( sat::SolvAttr::name, split.name().asString() );
-        q.addKind( split.kind() );
-        q.setMatchGlob();
+       if ( kinds.empty() ) // derive it from the name
+       {
+         // derive kind from the name: (rl should also support -t)
+         sat::Solvable::SplitIdent split( *args_it );
+         q.addAttribute( sat::SolvAttr::name, split.name().asString() );
+         q.addKind( split.kind() );
+       }
+       else
+       {
+         q.addAttribute(sat::SolvAttr::name, *args_it);
+         for_(itk, kinds.begin(), kinds.end()) {
+           q.addKind(*itk);
+         }
+       }
+       q.setMatchGlob();
         parsed_opts::const_iterator itr;
         if ((itr = copts.find("repo")) != copts.end())
         {
index 0dfc9e8..caa6ffb 100644 (file)
@@ -5,6 +5,6 @@
 
 void list_locks(Zypper & zypper);
 void add_locks(Zypper & zypper, const Zypper::ArgList & args, const ResKindSet & kinds);
-void remove_locks(Zypper & zypper, const Zypper::ArgList & args);
+void remove_locks(Zypper & zypper, const Zypper::ArgList & args, const ResKindSet & kinds);
 
 #endif /*ZYPPERLOCKS_H_*/