--- /dev/null
+/*---------------------------------------------------------------------------*\
+ ____ _ _ __ _ __ ___ _ _
+ |_ / || | '_ \ '_ \/ -_) '_|
+ /__|\_, | .__/ .__/\___|_|
+ |__/|_| |_|
+\*---------------------------------------------------------------------------*/
+
+/** \file PackageArgs.cc
+ *
+ */
+
+#include <iostream>
+#include "zypp/base/Logger.h"
+
+#include "PackageArgs.h"
+#include "Zypper.h"
+
+
+using namespace std;
+
+
+PackageArgs::PackageArgs()
+ : zypper(*Zypper::instance())
+{
+ preprocess(zypper.arguments());
+}
+
+PackageArgs::PackageArgs(const vector<string> & args)
+ : zypper(*Zypper::instance())
+{
+ preprocess(args);
+}
+
+void PackageArgs::preprocess(const vector<string> & args)
+{
+ vector<string>::size_type argc = args.size();
+
+ string tmp;
+ string arg;
+ bool op = false;
+ for(unsigned i = 0; i < argc; ++i)
+ {
+ tmp = args[i];
+
+ if (op)
+ {
+ arg += tmp;
+ op = false;
+ tmp.clear();
+ }
+ // standalone operator
+ else if (tmp == "=" || tmp == "==" || tmp == "<"
+ || tmp == ">" || tmp == "<=" || tmp == ">=")
+ {
+ // not at the start or the end
+ if (i && i < argc - 1)
+ op = true;
+ }
+ // operator at the end of a random string, e.g. 'zypper='
+ else if (tmp.find_last_of("=<>") == tmp.size() - 1 && i < argc - 1)
+ {
+ if (!arg.empty())
+ _args.insert(arg);
+ arg = tmp;
+ op = true;
+ continue;
+ }
+ // operator at the start of a random string e.g. '>=3.2.1'
+ else if (i && tmp.find_first_of("=<>") == 0)
+ {
+ arg += tmp;
+ tmp.clear();
+ op = false;
+ }
+
+ if (op)
+ arg += tmp;
+ else
+ {
+ if (!arg.empty())
+ _args.insert(arg);
+ arg = tmp;
+ }
+ }
+
+ if (!arg.empty())
+ _args.insert(arg);
+
+ DBG << "args received: ";
+ copy(args.begin(), args.end(), ostream_iterator<string>(DBG, " "));
+ DBG << endl;
+
+ DBG << "args compiled: ";
+ copy(_args.begin(), _args.end(), ostream_iterator<string>(DBG, " "));
+ DBG << endl;
+}
--- /dev/null
+/*---------------------------------------------------------------------------*\
+ ____ _ _ __ _ __ ___ _ _
+ |_ / || | '_ \ '_ \/ -_) '_|
+ /__|\_, | .__/ .__/\___|_|
+ |__/|_| |_|
+\*---------------------------------------------------------------------------*/
+
+/** \file PackageArgs.h
+ *
+ */
+
+#ifndef ZYPPER_PACKAGEARGS_H_
+#define ZYPPER_PACKAGEARGS_H_
+
+#include <set>
+#include <vector>
+#include <string>
+
+#include "zypp/Capability.h"
+
+class Zypper;
+
+class PackageArgs
+{
+ typedef std::set<std::string> StringSet;
+
+public:
+ PackageArgs();
+ PackageArgs(const std::vector<std::string> & args);
+ ~PackageArgs() {}
+
+ StringSet asStringSet() const
+ { return _args; }
+
+protected:
+ void preprocess(const std::vector<std::string> & args);
+
+private:
+ Zypper & zypper;
+ StringSet _args;
+};
+
+
+#endif /* ZYPPER_PACKAGEARGS_H_ */
--- /dev/null
+/*---------------------------------------------------------------------------*\
+ ____ _ _ __ _ __ ___ _ _
+ |_ / || | '_ \ '_ \/ -_) '_|
+ /__|\_, | .__/ .__/\___|_|
+ |__/|_| |_|
+\*---------------------------------------------------------------------------*/
+
+#include "TestSetup.h"
+#include "PackageArgs.h"
+
+using namespace std;
+
+BOOST_AUTO_TEST_CASE(preprocess_test)
+{
+ {
+ vector<string> rawargs;
+ rawargs.push_back("zypper");
+ rawargs.push_back("libzypp");
+ rawargs.push_back("satsolver-tools");
+
+ PackageArgs args(rawargs);
+ set<string> sargs = args.asStringSet();
+
+ BOOST_CHECK((sargs.find("zypper") != sargs.end()));
+ BOOST_CHECK((sargs.find("libzypp") != sargs.end()));
+ BOOST_CHECK((sargs.find("satsolver-tools") != sargs.end()));
+ BOOST_CHECK_EQUAL(sargs.size(), 3);
+ }
+
+ {
+ vector<string> rawargs;
+ rawargs.push_back("zypper");
+ rawargs.push_back("libzypp");
+ rawargs.push_back(">=");
+ rawargs.push_back("6.30.0");
+
+ PackageArgs args(rawargs);
+ set<string> sargs = args.asStringSet();
+
+ BOOST_CHECK((sargs.find("zypper") != sargs.end()));
+ BOOST_CHECK((sargs.find("libzypp>=6.30.0") != sargs.end()));
+ BOOST_CHECK_EQUAL(sargs.size(), 2);
+ }
+
+ {
+ vector<string> rawargs;
+ rawargs.push_back("vim");
+ rawargs.push_back("zypper>1.4.0");
+ rawargs.push_back("libzypp");
+ rawargs.push_back("<");
+ rawargs.push_back(">");
+ rawargs.push_back("6.30.0");
+
+ PackageArgs args(rawargs);
+ set<string> sargs = args.asStringSet();
+
+ BOOST_CHECK((sargs.find("vim") != sargs.end()));
+ BOOST_CHECK((sargs.find("zypper>1.4.0") != sargs.end()));
+ BOOST_CHECK((sargs.find("libzypp<>") != sargs.end()));
+ BOOST_CHECK((sargs.find("6.30.0") != sargs.end()));
+ BOOST_CHECK_EQUAL(sargs.size(), 4);
+ }
+
+ {
+ vector<string> rawargs;
+ rawargs.push_back("=");
+ rawargs.push_back("zypper=1.4.0");
+ rawargs.push_back("libzypp");
+ rawargs.push_back(">");
+ rawargs.push_back("6.30.0");
+ rawargs.push_back("=>");
+
+ PackageArgs args(rawargs);
+ set<string> sargs = args.asStringSet();
+
+ BOOST_CHECK((sargs.find("=") != sargs.end()));
+ BOOST_CHECK((sargs.find("zypper=1.4.0") != sargs.end()));
+ BOOST_CHECK((sargs.find("libzypp>6.30.0") != sargs.end()));
+ BOOST_CHECK((sargs.find("=>") != sargs.end()));
+ BOOST_CHECK_EQUAL(sargs.size(), 4);
+ }
+
+ {
+ vector<string> rawargs;
+ rawargs.push_back("=zypper");
+ rawargs.push_back("libzypp");
+ rawargs.push_back(">6.30.0");
+ rawargs.push_back("+vim");
+ rawargs.push_back("git<=");
+ rawargs.push_back("1.6.4.2");
+ rawargs.push_back("tree<=");
+
+ PackageArgs args(rawargs);
+ set<string> sargs = args.asStringSet();
+
+ BOOST_CHECK((sargs.find("=zypper") != sargs.end()));
+ BOOST_CHECK((sargs.find("libzypp>6.30.0") != sargs.end()));
+ BOOST_CHECK((sargs.find("+vim") != sargs.end()));
+ BOOST_CHECK((sargs.find("git<=1.6.4.2") != sargs.end()));
+ BOOST_CHECK((sargs.find("tree<=") != sargs.end()));
+ BOOST_CHECK_EQUAL(sargs.size(), 5);
+ }
+}
+
+// vim: set ts=2 sts=8 sw=2 ai et: