Comparer les révisions
18 Révisions
Auteur | SHA1 | Date | |
---|---|---|---|
fac6ed1853 | |||
ae2097fe6a | |||
9e3d3b1dd4 | |||
4f3abb3f67 | |||
3ca6e4df3c | |||
0d81452a67 | |||
3e14498437 | |||
3102a952df | |||
3903f18854 | |||
60a91967bb | |||
c6550e81bb | |||
744fa2ec7a | |||
f8542dc96a | |||
fdae7fd065 | |||
f8d6a1a586 | |||
61fa7ca16d | |||
61a446ec2d | |||
0e5abf96c8 |
29
CHANGELOG.md
Fichier normal
29
CHANGELOG.md
Fichier normal
@ -0,0 +1,29 @@
|
||||
# looqs: Release notes
|
||||
|
||||
## 2022-06-06 - v0.1
|
||||
The first release comes with basic functionality. It's a start that can be considered useful to some degree.
|
||||
|
||||
looqs is still at an early stage and may exhibit some weirdness and contain bugs.
|
||||
|
||||
Tested architectures: amd64.
|
||||
|
||||
CHANGES:
|
||||
- CLI command "looqs" to add/update/delete and search
|
||||
- GUI: "looqs-gui" to search, render previews, and add files to index
|
||||
- General: Add multi-threaded indexing of all files (paths, mtime)
|
||||
- General: Generate sqlite based full-text search index for: .pdf,.odt,.ods, text files
|
||||
- General: Sandboxed content processing
|
||||
- GUI: Sandboxed IPC sub-process to render previews.
|
||||
- GUI: Add previews for pdf: Render the page the search keywords were found. Highlight the keywords when rendering the page.
|
||||
- GUI: Add previews for plaintext files: Extract snippets. Highlight the keywords when rendering the page.
|
||||
- General: Add basic filters for query.
|
||||
- GUI: Add icon. Special thanks to the following sources:
|
||||
https://www.svgrepo.com/svg/151751/magnifier-with-small-handle
|
||||
https://www.svgrepo.com/svg/52764/open-book
|
||||
|
||||
Thanks!
|
||||
- General: Documentation.
|
||||
|
||||
- Add packages: Ubuntu 21.10, 22.04
|
||||
|
||||
Thanks to all those who provided feedback (and endured bugs) at various stages. You know who you are, thx!
|
26
CONTRIBUTING.md
Fichier normal
26
CONTRIBUTING.md
Fichier normal
@ -0,0 +1,26 @@
|
||||
# looqs - Contributing
|
||||
Contributions are welcome, please use the following guidelines.
|
||||
|
||||
## Repository
|
||||
The github repository https://github.com/quitesimpleorg/looqs is the primary one. Pull-Requests and Issues go there, but you can also submit your feedback there.
|
||||
|
||||
Those who prefer a more classical approach can mail their patches etc. to looqs at quitesimple org. Ideally git-format patch and git send-email.
|
||||
|
||||
The repository at https://gitea.quitesimple.org/crtxcr/looqs was supposed to be the main one, but these
|
||||
plans are on hold for the time being. Just ignore it.
|
||||
|
||||
## Pull-Requests & Rebasing
|
||||
Your merge requests should be submitted against the dev branch. master branch won't be rebased. I'll try to avoid in the dev branch. I definitly rebase WIP/feature branches.
|
||||
|
||||
|
||||
## Commit messages
|
||||
Commit messages begin with the component your change affects, e. g. "gui:", "cli:", "shared:", followed by the class.
|
||||
Then choose an appropriate verb in present tense. Wrong: Fixed, Fixes. Correct: Fix. Make sure lines are not too long,
|
||||
I personally go by gut feeling in this matter.
|
||||
|
||||
If your change has an issue, link it at the end: Closes: https://github.com/quitesimpleorg/looqs/issues/1
|
||||
|
||||
Example: "shared: Indexer: Use WildcardMatcher to ignore paths"
|
||||
|
||||
## License
|
||||
You license your changes under the GPLv3 by contributing.
|
31
HACKING.md
Fichier normal
31
HACKING.md
Fichier normal
@ -0,0 +1,31 @@
|
||||
# looqs - Hacking
|
||||
|
||||
## Introduction
|
||||
Without elaborating here, I hacked looqs because I was not satisfied with the state of desktop search on Linux.
|
||||
|
||||
Originally a set of CLI python scripts, it is now written in C++ and offers a GUI made using Qt. While a "web app" would have been an option, I prefer a desktop application for something like looqs. I chose Qt because I am more familiar with it than with any other GUI framework. To my knowledge, potential alternatives like GTK do not include as many "batteries" as Qt anyway, so the job presumably would have been harder there.
|
||||
|
||||
[CONTRIBUTING.md](CONTRIBUTING.md) contains the instructions on how to submit patches etc.
|
||||
|
||||
## Security
|
||||
The architecture ensures that the parsing of documents and the preview generation is sandboxed by [exile.h](https://github.com/quitesimpleorg/exile.h). looqs uses a multi-process architecture to achieve this.
|
||||
|
||||
Qt code is considered trusted in this model. While one may critize this, it was the only practical solution. looqs uses its serialization mechanism and other classes to communicate between the non-sandboxed GUI process and the sandboxed processes.
|
||||
|
||||
## Database
|
||||
The heart is sqlite, with the FTS5 extensions behind the full-text search. I definitly did not
|
||||
want to run some heavy Java based solutions. I explored other options like Postgresql, I've discard them due to some limitations back then.
|
||||
|
||||
Down the road, alternatives will be explored of course if sqlite should not suffice anymore.
|
||||
|
||||
## File format support
|
||||
The pdf library is libpoppler. Files such as .odt or .docx documents are opened with libquazip. The XML files in there are not parsed,
|
||||
looqs simply strips the tags and that seems to work fine so far. Naturally, this is not the "proper way", so there is room for improvement maybehere. However, those file formats are not a huge priortiy for me personally. libuchardet does encoding detection and conversion.
|
||||
|
||||
Naturally looqs won't be able to index and render previews for everything. Such approach would create a huge bloated binary. In the future, there will be some plugin system of some sorts, either we will load .so objects or use subprocesses.
|
||||
|
||||
## Name
|
||||
looqs looks for files. You as the user can also look inside them. The 'k' was replaced by a 'q'. Originally wanted my projects to have "qs" (for quitesimple) in their name. While abandoned now, this got us to looqs.
|
||||
|
||||
|
||||
|
75
README.md
75
README.md
@ -2,45 +2,74 @@
|
||||
looqs is a tool that creates a full-text search index for your files. It allows you to look at previews where your
|
||||
search terms have been found, as shown in the screenshots below.
|
||||
|
||||
|
||||
## Screenshots
|
||||
The screenshots in this section may occasionally be slightly outdated, but they are usually recent enough to get an overall impression of the current state.
|
||||
|
||||
### List
|
||||

|
||||
The screenshots in this section may occasionally be slightly outdated, but they are usually recent enough to get an overall impression of the current state of the GUI.
|
||||
|
||||
### Preview
|
||||
looqs allow you to look inside files. It marks what you have searched for.
|
||||
|
||||

|
||||

|
||||
|
||||
### Results list
|
||||
#### Classic results list
|
||||
Just enter what you want to find, it will search paths and file content.
|
||||

|
||||
|
||||
#### Searching with filters
|
||||
You can be more specific to get what you want with filters
|
||||
|
||||
**Filters (long form)**
|
||||

|
||||
|
||||
**Filters (short form)**
|
||||
|
||||
There is no need to write the long form of filters. There are also booleans available
|
||||
|
||||

|
||||
|
||||
|
||||
## Current status
|
||||
Last version: 2022-0X-XX, v0.1
|
||||
Last version: 2022-06-06, v0.1
|
||||
|
||||
Please see [Changelog](CHANGELOG.md) for a human readable list of changes.
|
||||
Please see [Changelog](CHANGELOG.md) for a human readable list of changes.
|
||||
|
||||
|
||||
## Goals and principles
|
||||
* **Find & Preview**. Instead of merely telling you where your search phrase has been found, it should also render the corresponding portion/pages of the documents and highlight the searched words.
|
||||
* **No daemons**. As some other desktop search projects are prone to have annoying daemons running that eat system resources away, this solution should make do without daemons where possible.
|
||||
* **Easy setup**. Similiarly, there should be no need for heavy-weight databases. Instead, this solution tries to squeeze out the most from simple approaches. In particular, it relies on sqlite.
|
||||
* **Easy setup**. Similarly, there should be no need for heavy-weight databases. Instead, looqs tries to squeeze out the most from simple approaches. In particular, it relies on sqlite.
|
||||
* **GUI & CLI**. Provide CLI interfaces and GUI interfaces
|
||||
* **Sandboxing**. As reading and rendering lots of formats naturally opens the door for security bugs, those tasks are offloaded to small, sandboxed sub-processes to mitigate the effect of exploited vulnerabilities.
|
||||
|
||||
|
||||
## Features
|
||||
- GUI, CLI interface
|
||||
- Indexing of file path and some metadata.
|
||||
- Indexing of file file content for FTS search. Currently: .pdf, odt, docx, plaintext.
|
||||
- Preview of file formats: Currently: .pdf, plaintext
|
||||
- Highlight searched terms.
|
||||
- Quickly open PDF viewer or text editor at location of preview
|
||||
- Search filters
|
||||
|
||||
## Supported platforms
|
||||
Linux (on amd64) is currently the main focus. Currently, I don't plan on supporting anything else and the sandboxing architecture does not make it likely. I suppose a version without sandboxing might be conceivable for other platforms, but I have no plans or resources to actively target anything but Linux at this point.
|
||||
|
||||
### Licence
|
||||
GPLv3.
|
||||
GPLv3.
|
||||
|
||||
### Contributing
|
||||
Fow now, github issues and pull-requests are preferred, but you can also just email
|
||||
your patches or issues to: looqs at quitesimple.org
|
||||
Please see the [Contribution guidelines](CONTRIBUTING.md) file.
|
||||
|
||||
## Documentation
|
||||
Please see [USAGE.md](USAGE.md) for the user manual. There is also [HACKING.md](HACKING.md) with more technical information.
|
||||
|
||||
|
||||
## Build
|
||||
|
||||
### Ubuntu 21.10/22.04
|
||||
|
||||
To build on Ubuntu and Debian, clone the repo and then run:
|
||||
```
|
||||
git submodule init
|
||||
git submodule update
|
||||
@ -49,10 +78,24 @@ qmake
|
||||
make
|
||||
```
|
||||
|
||||
|
||||
|
||||
## Documentation
|
||||
Please see [Usage.md](USAGE.md) for the user manual.
|
||||
The GUI is located in `gui/looqs-gui`, the binary for the CLI is in `cli/looqs`
|
||||
|
||||
## Packages
|
||||
Coming soon™
|
||||
At this point, looqs is not in any official distro package repo, but I maintain some packages.
|
||||
|
||||
### Ubuntu 21.10/22.04
|
||||
Latest release can be installed using apt from the repo.
|
||||
```
|
||||
# First, obtain key, assume it's trusted.
|
||||
wget -O- https://repo.quitesimple.org/repo.quitesimple.org.asc | gpg --dearmor > repo.quitesimple.org-keyring.gpg
|
||||
cat repo.quitesimple.org-keyring.gpg | sudo tee -a /usr/share/keyrings/repo.quitesimple.org.gpg > /dev/null
|
||||
|
||||
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/repo.quitesimple.org.gpg] https://repo.quitesimple.org/debian/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/quitesimple.list
|
||||
sudo apt-get update
|
||||
sudo apt-get install looqs
|
||||
```
|
||||
|
||||
### Other distros
|
||||
I'll probably add a package for voidlinux at some point and maybe will provide a Gentoo ebuild. However, I would appreciate help for others distros. If you create a package, let me know!
|
||||
|
||||
As for distro-agnostic packages, I will also take a look into appimage / flatpak etc. and/or maybe just provide a self-contained archive.
|
||||
|
176
USAGE.md
Fichier normal
176
USAGE.md
Fichier normal
@ -0,0 +1,176 @@
|
||||
# looqs - User guide
|
||||
This document is still work in progress.
|
||||
|
||||
## General points
|
||||
Please consult the [README](README.md) for a description of what looqs is and on how to obtain it.
|
||||
|
||||
looqs is still at an early stage and may exhibit some weirdness and contain bugs.
|
||||
|
||||
## Current Limitations and things to know
|
||||
You should be aware of the following:
|
||||
|
||||
- It may seem natural, but the GUI and CLI operate on the same database, so if you add files using the CLI, the GUI will search them too.
|
||||
|
||||
- If a file is listed in the "Search results" tab, it does not imply that a preview will be available in the "Previews" tab, as looqs can search more file formats than it can generate previews for currently.
|
||||
|
||||
- Database paths are stored inefficiently, not deduplicated to simplify queries. This may add up quickly. Also, each PDF text is stored twice. Each page separately + the whole document to simplify queries.
|
||||
To give you some idea: At the time this section was written, 167874 files were in my index. A FTS index was built for 14280 of those, of which 4146 were PDF documents. The PDFs take around 10GB storage space on the filesystem. All files for which an FTS has been built are around 7GB in size on the filesystem. The looqs database had a size of 1.6 GB.
|
||||
|
||||
- Existing files are considered modified when the mtime has changed. looqs currently does not check whether the content
|
||||
has changed.
|
||||
|
||||
## Config
|
||||
The config file is in `$HOME/.config/quitesimple.org/looqs.conf`. It will be created on first execution of the CLI or GUI
|
||||
interface. The GUI has a menu entry to quickly open this config file. This is to be considered temporary and will be removed once the GUI itself can edit all settings.
|
||||
|
||||
Database default path: `$HOME/.local/share/quitesimple.org/looqs/looqs.sqlite`. If this does not work for
|
||||
you, move it and adjust adjust the path in the config file.
|
||||
|
||||
|
||||
## GUI
|
||||
The GUI is minimal at this point. Depending on what you want to do, you may need to open the config file and change the settings there. Chances are that you may not need to do that.
|
||||
|
||||
### First run
|
||||
You will be presented with an empty list. Go to the **"Index"** tab, add some directories and click **"Start indexing"**.
|
||||
|
||||
For large directories the progress bar is essentially just decoration. As long as you see the counters
|
||||
increase, everything is fine even if it seems the progress bar is stuck.
|
||||
|
||||
The indexing can be stopped. If you run it again you do not start from scratch, because looqs knows
|
||||
which files have been modified or not since they have been added to the index. Thus, files will
|
||||
only be reprocedded when necessary. Note that cancellation itself may take a moment as files finish processing.
|
||||
|
||||
### Search
|
||||
The text field at the top is where you type your query. It can be selected quickly using **CTRL + L**. Filters are avalable,
|
||||
see this document at the end. By default, both the full path and the content are searched. Path names take precedence.
|
||||
|
||||
### Configuring PDF viewer
|
||||
It's most convenient if, when you click on a preview, the PDF reader opens the page you clicked. For that, looqs needs to know which viewer you want to launch.
|
||||
|
||||
It tries to auto detect some common viewers. You must set the value of the ```pdfviewer=``` config entry yourself if it doesn't do something you
|
||||
like, such as not opening your favorite viewer. In the command line options, "%f" represents the filepath, "%p" the page number.
|
||||
|
||||
### Preview tab
|
||||
The preview tab shows previews. It marks your search keywords too. Click on a preview to open the file.
|
||||
A right click on a preview allows you to copy the file path, or to open the containing folder. Hovering tells you which file the preview originates from.
|
||||
|
||||
### Syncing index
|
||||
Over time, files get deleted or their content changes. Go to **looqs** -> **Sync index**. looqs will reindex the content of files which have been changed. Files that cannot be found anymore will be removed from the index.
|
||||
|
||||
Reindexing a path using the "Index" tab will index new files and update existing ones. Currently however, this does not deal with deleted files.
|
||||
|
||||
I recommend doing a sync from time to time.
|
||||
|
||||
## CLI
|
||||
The CLI command "looqs" comes with helptext. This documentation is incomplete at the moment.
|
||||
|
||||
### First run
|
||||
There is no point in using the "search" command on the first run. Add some files if not done so already.
|
||||
|
||||
### Adding files
|
||||
To add files to the index, run ```looqs add [path]```, where 'path' can be a directory or a single file.
|
||||
If the path is a directory, the directory will be recursively descended, and all files in there added.
|
||||
|
||||
"Skipped" implies the file has not been changed since it has been added to the index. If it has changed, the index content will be updated.
|
||||
|
||||
### Searching files
|
||||
Of course the CLI will not render any previews, but it can show you the paths where search results
|
||||
have been found.
|
||||
|
||||
```
|
||||
looqs search [terms...]
|
||||
```
|
||||
|
||||
There is an implicit "AND" condition, meaning if you search for "photo" and "mountain", only paths
|
||||
will be shown containing both terms, but not either alone.
|
||||
|
||||
### Deletion and Fixing Out of sync index
|
||||
You sometimes delete files, to get rid of those from the index too, run:
|
||||
|
||||
```
|
||||
looqs delete --deleted --dry-run
|
||||
```
|
||||
|
||||
This commands lists all files which are indexed, but which cannot be found anymore.
|
||||
|
||||
Remove them using:
|
||||
```
|
||||
looqs delete --deleted --verbose
|
||||
```
|
||||
|
||||
You can also delete by pattern:
|
||||
|
||||
```
|
||||
looqs delete --pattern '*.java'
|
||||
```
|
||||
|
||||
Delete never removes anything from the file system, it only operates on the database.
|
||||
|
||||
The equivalent of the GUI sync command is:
|
||||
```
|
||||
looks update -v --continue --delete
|
||||
```
|
||||
|
||||
|
||||
### Updating files
|
||||
The content and metadata index for files can be updated:
|
||||
|
||||
```
|
||||
looqs update -n
|
||||
```
|
||||
|
||||
Those files still exist, but the content that has been indexed it out of date. This can be corrected with
|
||||
|
||||
```
|
||||
looqs update
|
||||
```
|
||||
|
||||
This will not add new files, you must run ```looqs add``` for this. For this reason, most users
|
||||
will probably seldomly use the 'update' command alone.
|
||||
|
||||
|
||||
## Tips
|
||||
|
||||
### Keeping index up to date
|
||||
The most obvious way is to use the GUI and add your favorite paths in the "Index" tab. Then occasionally, just rescan. This works for me personally, looqs quickly picks up new files. This however may not be good enough for some users.
|
||||
|
||||
Some users may prefer setting up cronjobs or wire up the CLI interface with file system monitoring tools such as [adhocify](https://github.com/quitesimpleorg/adhocify).
|
||||
|
||||
### lh shell alias
|
||||
If you are in a shell and you know your file is somewhere in your current directory or its subdirs, and those
|
||||
are indexed by looqs, you may find the lh (look here) alias useful:
|
||||
|
||||
```
|
||||
alias lh='looqs search $(pwd)'
|
||||
```
|
||||
|
||||
So typing "lh recipes" searchs the current dir and its subdirs for a file containing 'recipes'.
|
||||
|
||||
## Query syntax / Search filters
|
||||
A number of search filters are available.
|
||||
|
||||
| Filter (long) | Filter (short) | Explanation |
|
||||
| ----------- | ----------- |----------- |
|
||||
| path.contains:(term) | p:(term) | Pretty much a SQL LIKE '%term%' conditions, just searches the path string |
|
||||
| path.ends:(term) | pe:(term) | Filters path ending with the specified term, e. g.: pe:(.ogg) |
|
||||
| path.begins:(term) | pb:(term) | Filters path beginning with the specified term |
|
||||
| contains:(terms) | c:(terms) | ull-text search, also understands quotes |
|
||||
|
||||
Filters can be combined. The booleans AND and OR are supported. Negations can be applied too, except for c:().
|
||||
The AND boolean is implicit and thus entering it strictly optional.
|
||||
|
||||
Examples:
|
||||
|
||||
| Query | Explanation |
|
||||
| ----------- | ----------- |
|
||||
|pe:(.ogg) p:(marley)| Finds paths that end with .ogg and contain 'marley' (case-insensitive)
|
||||
|p:(slides) support vector machine |Performs a content search for 'support vector machine' in all paths containing 'slides'|
|
||||
|p:(notes) (pe:(odt) OR pe:(docx)) |Finds files such as notes.docx, notes.odt but also any .docs and .odt when the path contains the string 'notes'|
|
||||
|memcpy !(pe:(.c) OR pe:(.cpp))| Performs a FTS search for 'memcpy' but excludes .cpp and .c files.
|
||||
|c:("I think, therefore")|Performs a FTS search for the phrase "I think, therefore".
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -29,8 +29,12 @@ void CommandAdd::indexerFinished()
|
||||
}
|
||||
}
|
||||
|
||||
/* TODO maybe not 0 if keepGoing not given */
|
||||
emit finishedCmd(0);
|
||||
int ret = 0;
|
||||
if(!keepGoing && failedPathsCount > 0)
|
||||
{
|
||||
ret = 1;
|
||||
}
|
||||
emit finishedCmd(ret);
|
||||
}
|
||||
|
||||
int CommandAdd::handle(QStringList arguments)
|
||||
@ -40,15 +44,13 @@ int CommandAdd::handle(QStringList arguments)
|
||||
"Continue adding files, don't exit on first error. If this option is not given, looqs will "
|
||||
"exit asap, but it's possible that a few files will still be processed. "
|
||||
"Set -t 1 to avoid this behavior, but processing will be slower. "},
|
||||
{{"v", "verbose"}, "Print skipped and added files"},
|
||||
{{"t", "threads"}, "Number of threads to use.", "threads"}});
|
||||
|
||||
parser.addHelpOption();
|
||||
parser.addPositionalArgument("add", "Add paths to the index", "add [paths...]");
|
||||
|
||||
parser.process(arguments);
|
||||
bool keepGoing = parser.isSet("continue");
|
||||
bool verbose = parser.isSet("verbose");
|
||||
this->keepGoing = parser.isSet("continue");
|
||||
if(parser.isSet("threads"))
|
||||
{
|
||||
QString threadsCount = parser.value("threads");
|
||||
@ -70,17 +72,15 @@ int CommandAdd::handle(QStringList arguments)
|
||||
|
||||
indexer = new Indexer(*this->dbService);
|
||||
indexer->setTargetPaths(files.toVector());
|
||||
indexer->setKeepGoing(keepGoing);
|
||||
|
||||
connect(indexer, &Indexer::pathsCountChanged, this,
|
||||
[](int pathsCount) { Logger::info() << "Found paths: " << pathsCount << Qt::endl; });
|
||||
|
||||
connect(indexer, &Indexer::indexProgress, this,
|
||||
[](int pathsCount, unsigned int added, unsigned int skipped, unsigned int failed, unsigned int totalCount)
|
||||
{ Logger::info() << "Processed files: " << pathsCount << Qt::endl; });
|
||||
connect(indexer, &Indexer::finished, this, &CommandAdd::indexerFinished);
|
||||
|
||||
/* TODO: keepGoing, verbose */
|
||||
|
||||
this->autoFinish = false;
|
||||
indexer->beginIndexing();
|
||||
|
||||
|
@ -10,6 +10,7 @@ class CommandAdd : public Command
|
||||
private:
|
||||
SaveFileResult addFile(QString path);
|
||||
Indexer *indexer;
|
||||
bool keepGoing = true;
|
||||
|
||||
protected:
|
||||
public:
|
||||
|
@ -78,4 +78,4 @@ else:win32:!win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$OUT_PW
|
||||
else:win32:!win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$OUT_PWD/../shared/debug/shared.lib
|
||||
else:unix: PRE_TARGETDEPS += $$OUT_PWD/../shared/libshared.a
|
||||
|
||||
RESOURCES = ../icon.svg
|
||||
RESOURCES = ../looqs.svg
|
||||
|
@ -128,7 +128,7 @@ int main(int argc, char *argv[])
|
||||
return 1;
|
||||
}
|
||||
QApplication a(argc, argv);
|
||||
a.setWindowIcon(QIcon(":/icon.svg"));
|
||||
a.setWindowIcon(QIcon(":/looqs.svg"));
|
||||
QObject::connect(&a, &QApplication::aboutToQuit, &process, &QProcess::kill);
|
||||
|
||||
qRegisterMetaType<QVector<SearchResult>>("QVector<SearchResult>");
|
||||
|
@ -502,7 +502,7 @@ void MainWindow::makePreviews(int page)
|
||||
scaleText.chop(1);
|
||||
|
||||
QVector<QString> wordsToHighlight;
|
||||
QRegularExpression extractor(R"#("([^"]*)"|(\w+))#");
|
||||
QRegularExpression extractor(R"#("([^"]*)"|(\p{L}+))#");
|
||||
for(const Token &token : this->contentSearchQuery.getTokens())
|
||||
{
|
||||
if(token.type == FILTER_CONTENT_CONTAINS)
|
||||
|
@ -1,6 +1,6 @@
|
||||
[Desktop Entry]
|
||||
Name=looqs
|
||||
Exec=/usr/bin/looqs-gui
|
||||
Exec=looqs-gui
|
||||
Terminal=false
|
||||
Type=Application
|
||||
Icon=looqs
|
||||
|
Avant Largeur: | Hauteur: | Taille: 13 KiB Après Largeur: | Hauteur: | Taille: 13 KiB |
@ -19,6 +19,7 @@
|
||||
#define SETTINGS_KEY_IPCSOCKETPATH "ipcsocketpath"
|
||||
#define SETTINGS_KEY_PDFVIEWER "pdfviewer"
|
||||
#define SETTINGS_KEY_EXCLUDEDPATHS "excludedpaths"
|
||||
#define SETTINGS_KEY_MOUNTPATHS "mountpaths"
|
||||
|
||||
inline void initResources()
|
||||
{
|
||||
@ -180,6 +181,32 @@ QStringList Common::excludedPaths()
|
||||
return ::excludedPaths;
|
||||
}
|
||||
|
||||
QStringList Common::mountPaths()
|
||||
{
|
||||
static int ran = false;
|
||||
static QStringList mountPaths;
|
||||
if(!ran)
|
||||
{
|
||||
QSettings settings;
|
||||
mountPaths = settings.value(SETTINGS_KEY_MOUNTPATHS, QStringList{"/media", "/mnt"}).toStringList();
|
||||
ran = true;
|
||||
}
|
||||
return mountPaths;
|
||||
}
|
||||
|
||||
bool Common::isMountPath(QString path)
|
||||
{
|
||||
QStringList mountPaths = Common::mountPaths();
|
||||
for(QString &mountPath : mountPaths)
|
||||
{
|
||||
if(path.startsWith(mountPath))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Common::isTextFile(QFileInfo fileInfo)
|
||||
{
|
||||
/* TODO: This is not sandboxed yet ... */
|
||||
|
@ -12,7 +12,9 @@ QString findInPath(QString needle);
|
||||
bool initSqliteDatabase(QString path);
|
||||
void ensureConfigured();
|
||||
QStringList excludedPaths();
|
||||
QStringList mountPaths();
|
||||
bool isTextFile(QFileInfo fileInfo);
|
||||
bool isMountPath(QString path);
|
||||
QString versionText();
|
||||
} // namespace Common
|
||||
#endif
|
||||
|
@ -36,10 +36,14 @@ void Indexer::beginIndexing()
|
||||
this->filePathTargetsQueue.enqueue(path);
|
||||
}
|
||||
}
|
||||
this->dirScanner->setPaths(dirs);
|
||||
this->dirScanner->setIgnorePatterns(this->ignorePattern);
|
||||
|
||||
this->dirScanner->scan();
|
||||
if(!dirs.empty())
|
||||
{
|
||||
this->dirScanner->setPaths(dirs);
|
||||
this->dirScanner->setIgnorePatterns(this->ignorePattern);
|
||||
|
||||
this->dirScanner->scan();
|
||||
}
|
||||
|
||||
this->workerCancellationToken.store(false, std::memory_order_seq_cst);
|
||||
launchWorker(this->filePathTargetsQueue, this->filePathTargetsQueue.remaining());
|
||||
@ -55,6 +59,16 @@ void Indexer::setTargetPaths(QVector<QString> pathsToScan)
|
||||
this->pathsToScan = pathsToScan;
|
||||
}
|
||||
|
||||
void Indexer::setVerbose(bool verbose)
|
||||
{
|
||||
this->verbose = verbose;
|
||||
}
|
||||
|
||||
void Indexer::setKeepGoing(bool keepGoing)
|
||||
{
|
||||
this->keepGoing = keepGoing;
|
||||
}
|
||||
|
||||
void Indexer::requestCancellation()
|
||||
{
|
||||
this->dirScanner->cancel();
|
||||
@ -68,7 +82,7 @@ IndexResult Indexer::getResult()
|
||||
|
||||
void Indexer::dirScanFinished()
|
||||
{
|
||||
Logger::info() << "Dir scan finished";
|
||||
Logger::info() << "Dir scan finished" << Qt::endl;
|
||||
if(!isRunning())
|
||||
{
|
||||
emit finished();
|
||||
@ -92,17 +106,24 @@ void Indexer::dirScanProgress(int current, int total)
|
||||
|
||||
void Indexer::processFileScanResult(FileScanResult result)
|
||||
{
|
||||
if(verbose)
|
||||
if(result.second == DBFAIL || result.second == PROCESSFAIL || result.second == NOTFOUND)
|
||||
{
|
||||
this->currentIndexResult.results.append(result);
|
||||
if(!keepGoing)
|
||||
{
|
||||
this->requestCancellation();
|
||||
emit finished();
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(result.second == DBFAIL || result.second == PROCESSFAIL || result.second == NOTFOUND)
|
||||
if(verbose)
|
||||
{
|
||||
this->currentIndexResult.results.append(result);
|
||||
}
|
||||
}
|
||||
|
||||
if(result.second == OK)
|
||||
{
|
||||
++this->currentIndexResult.addedPaths;
|
||||
|
@ -67,6 +67,8 @@ class Indexer : public QObject
|
||||
void beginIndexing();
|
||||
void setIgnorePattern(QStringList ignorePattern);
|
||||
void setTargetPaths(QVector<QString> pathsToScan);
|
||||
void setVerbose(bool verbose);
|
||||
void setKeepGoing(bool keepGoing);
|
||||
|
||||
void requestCancellation();
|
||||
|
||||
|
@ -55,6 +55,11 @@ void IndexSyncer::sync()
|
||||
emit finished(totalUpdatesFilesCount, totalDeletedFilesCount, totalErroredFilesCount);
|
||||
return;
|
||||
}
|
||||
if(Common::isMountPath(fileData.absPath))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
QFileInfo fileInfo(fileData.absPath);
|
||||
if(fileInfo.exists())
|
||||
{
|
||||
|
@ -180,8 +180,9 @@ LooqsQuery LooqsQuery::build(QString expression, TokenType loneWordsTokenType, b
|
||||
|
||||
QStringList loneWords;
|
||||
LooqsQuery result;
|
||||
QRegularExpression rx("((?<filtername>(\\.|\\w)+):(?<args>\\((?<innerargs>[^\\)]+)\\)|([\\w,])+)|(?<boolean>AND|OR)"
|
||||
"|(?<negation>!)|(?<bracket>\\(|\\))|(?<loneword>[\"\\w]+))");
|
||||
QRegularExpression rx(
|
||||
"((?<filtername>(\\.|\\w)+):(?<args>\\((?<innerargs>[^\\)]+)\\)|([\\p{L},])+)|(?<boolean>AND|OR)"
|
||||
"|(?<negation>!)|(?<bracket>\\(|\\))|(?<loneword>[\"\\p{L}]+))");
|
||||
QRegularExpressionMatchIterator i = rx.globalMatch(expression);
|
||||
auto previousWasBool = [&result] { return !result.tokens.empty() && ((result.tokens.last().type & BOOL) == BOOL); };
|
||||
auto previousWas = [&result](TokenType t) { return !result.tokens.empty() && (result.tokens.last().type == t); };
|
||||
|
Sous-module submodules/exile.h mis-à-jour : bbbdfc44da...42d44b0cc1
Référencer dans un nouveau ticket
Bloquer un utilisateur