diff --git a/cli/cli.pro b/cli/cli.pro index e495bf8..35e22d6 100644 --- a/cli/cli.pro +++ b/cli/cli.pro @@ -15,6 +15,7 @@ DEFINES += QT_DEPRECATED_WARNINGS # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ + commandtag.cpp \ main.cpp \ commandadd.cpp \ commanddelete.cpp \ @@ -27,6 +28,7 @@ HEADERS += \ command.h \ commandadd.h \ commanddelete.h \ + commandtag.h \ commandupdate.h \ commandsearch.h \ commandlist.h diff --git a/cli/command.cpp b/cli/command.cpp index 699c885..3c4a2a9 100644 --- a/cli/command.cpp +++ b/cli/command.cpp @@ -2,7 +2,6 @@ #include #include #include "command.h" -#include "looqsgeneralexception.h" void Command::execute() { diff --git a/cli/commandsearch.cpp b/cli/commandsearch.cpp index 2877797..960c40b 100644 --- a/cli/commandsearch.cpp +++ b/cli/commandsearch.cpp @@ -1,6 +1,5 @@ #include #include "commandsearch.h" -#include "databasefactory.h" #include "logger.h" int CommandSearch::handle(QStringList arguments) diff --git a/cli/commandtag.cpp b/cli/commandtag.cpp new file mode 100644 index 0000000..68aaa02 --- /dev/null +++ b/cli/commandtag.cpp @@ -0,0 +1,65 @@ +#include +#include "commandtag.h" +#include "logger.h" + +int CommandTag::handle(QStringList arguments) +{ + QCommandLineParser parser; + parser.addPositionalArgument("add", "Adds a tag to a file", + "add [tag] [paths...]. Adds the tag to the specified paths"); + parser.addPositionalArgument("remove", "Removes a file associated to tag", "remove [tag] [file]"); + parser.addPositionalArgument("delete", "Deletes a tag", "delete [tag]"); + parser.addPositionalArgument("list", "Lists paths associated with a tag, or all tags", "list [tag]"); + parser.addHelpOption(); + + parser.parse(arguments); + + QStringList args = parser.positionalArguments(); + if(args.length() == 0) + { + parser.showHelp(EXIT_FAILURE); + return EXIT_FAILURE; + } + + QString cmd = args[0]; + qDebug() << cmd; + if(cmd == "add") + { + if(args.length() < 3) + { + Logger::error() << "Not enough arguments provided. 'add' requires a tag followed by at least one path" + << Qt::endl; + return EXIT_FAILURE; + } + QString tag = args[1]; + auto paths = args.mid(2).toVector(); + for(int i = 0; i < paths.size(); i++) + { + QFileInfo info{paths[i]}; + if(!info.exists()) + { + Logger::error() << "Can't add tag for file " + info.absoluteFilePath() + " because it does not exist" + << Qt::endl; + return EXIT_FAILURE; + } + QString absolutePath = info.absoluteFilePath(); + if(!this->dbService->fileExistsInDatabase(absolutePath)) + { + Logger::error() << "Only files that have been indexed can be tagged. File not in index: " + absolutePath + << Qt::endl; + return EXIT_FAILURE; + } + paths[i] = absolutePath; + } + + bool result = this->dbService->addTag(tag, paths); + if(!result) + { + Logger::error() << "Failed to assign tags" << Qt::endl; + return EXIT_FAILURE; + } + return EXIT_SUCCESS; + } + + return 0; +} diff --git a/cli/commandtag.h b/cli/commandtag.h new file mode 100644 index 0000000..5091443 --- /dev/null +++ b/cli/commandtag.h @@ -0,0 +1,13 @@ +#ifndef COMMANDTAG_H +#define COMMANDTAG_H +#include "command.h" + +class CommandTag : public Command +{ + public: + using Command::Command; + + int handle(QStringList arguments) override; +}; + +#endif // COMMANDTAG_H diff --git a/cli/main.cpp b/cli/main.cpp index 1daea74..af80420 100644 --- a/cli/main.cpp +++ b/cli/main.cpp @@ -21,6 +21,7 @@ #include "commandupdate.h" #include "commandsearch.h" #include "commandlist.h" +#include "commandtag.h" #include "databasefactory.h" #include "logger.h" #include "sandboxedprocessor.h" @@ -31,7 +32,7 @@ void printUsage(QString argv0) { qInfo() << "Usage:" << argv0 << "command"; - qInfo() << "Valid commands: add, update, delete, search, list. Each command has a --help option."; + qInfo() << "Valid commands: add, update, search, delete, tag, list. Each command has a --help option."; } Command *commandFromName(QString name, SqliteDbService &dbService) @@ -56,6 +57,10 @@ Command *commandFromName(QString name, SqliteDbService &dbService) { return new CommandList(dbService); } + if(name == "tag") + { + return new CommandTag(dbService); + } return nullptr; }