Supertag is a tag-based filesystem, written in Rust, for Linux and MacOS

Overview
Logo

Build Status Docs

Supertag is a tag-based filesystem, written in Rust, for Linux and MacOS. It provides a tag-based view of your files by removing the hierarchy constraints typically imposed on files and folders. In other words, it allows you to think about your files not as objects stored in folders, but as objects that can be filtered by folders.

Intersection

Installation

Linux

curl -Ls https://github.com/amoffat/supertag/releases/latest/download/supertag-x86_64.AppImage > tag
sudo install tag /usr/local/bin

Mac

brew install amoffat/rnd/supertag
Issues
  • Problem tagging multiple files with glob expansion

    Problem tagging multiple files with glob expansion

    Hey, very cool project! I have been looking for a performant file tag organizer and this looks promising. I just have some UX issues I hope can be resolved without too much hassle.

    Tagging multiple files at once My first issue is me wanting to tag multiple files in the same directory using a wildcard. I tried:

    tag ln * escher/art

    Expecting all files in my directory to be added to escher & art tags but instead I got an error:

    Error: IO error: Os { code: 2, kind: NotFound, message: "No such file or directory" }

    cannot reproduce 
    opened by SeanPedersen 15
  • Importing directory hierarchies as tag groups

    Importing directory hierarchies as tag groups

    I think it would be a really useful feature to import existing directory hierarchies as tag groups. By that I mean the following: I have an existing collection of art images, e.g. Wallpapers/art/escher, Wallpapers/art/munch, etc. and I want to import them into my tag collection as tag groups like so: $ cd Wallpapers $ tag ln import .

    This should result in subdirs of art/ being grouped as art+ and files of escher and munch being tagged with their respectives parent dir names. I hope it is clear what I mean, if not I am available for further discussion.

    I can try helping out implementing this as well, though I have little experience with Rust as of now (I code more in Python and TypeScript) but would like to learn more Rust anyway.

    wontfix 
    opened by SeanPedersen 13
  • Do not hardcode /mnt as base path for mounting.

    Do not hardcode /mnt as base path for mounting.

    Like the title says. A program should not presume that it knows where a user wants to mount something.

    Also, please use something other than GitHub.

    opened by raingloom 4
  • Does not work on arch linux

    Does not work on arch linux

    $ ./tag -vvv mount -f tmptest
    Mounting to "/mnt/tmptest"
    Error: ExitStatus { cmd: "xdg-open (internal)", status: ExitStatus(ExitStatus(768)), stderr: "XPCOMGlueLoad error for file /usr/lib/firefox/libmozgtk.so:\nlibselinux.so.1: cannot open shared object file: No such file or directory\nCouldn\'t load XPCOM.\nXPCOMGlueLoad error for file /usr/lib/firefox/libmozgtk.so:\nlibselinux.so.1: cannot open shared object file: No such file or directory\nCouldn\'t load XPCOM.\nxdg-open: no method available for opening \'/mnt/tmptest\'\n" }
    
    $ uname -a
    Linux ws 5.9.3-arch1-1 #1 SMP PREEMPT Sun, 01 Nov 2020 12:58:59 +0000 x86_64 GNU/Linux
    

    selinux is required? Should that not be bundled with the appimage?

    bug 
    opened by dgengtek 3
  • Sorting folders?

    Sorting folders?

    My personal programming projects folder is a disaster, and this seems just about perfect for sorting it. How could I do that?

    question 
    opened by moonheart08 3
  • Add related projects section

    Add related projects section

    opened by SeanPedersen 3
  • Update dependencies

    Update dependencies

    • Update code dependencies except nix
    • supertag, fuse-sys: update nix crate to 0.19.1.

    This PR updates some dependencies for supertag and fuse-sys. The tests run the same, i.e.they all pass except itests::remove::test_remove_and_relink_tag_manual. I didnt try & update the macos-specific deps. I gave up updating bindgen for fuse-sys.

    opened by ngirard 2
  • Complement tags

    Complement tags

    For example, ~math matches everything that does not have the tag math. So you can go to pdf/~math to get all pdfs which are not about math.

    opened by suhr 2
  • README.rst: simplify installation instructions on Linux

    README.rst: simplify installation instructions on Linux

    • [X] I have signed the CLA

    This PR simplifies the installation instructions on Linux. I'd suggest updating the "Installation" part of the docs too.

    Cheers, and thanks for your work !

    opened by ngirard 1
  • documentation typo?

    documentation typo?

    https://amoffat.github.io/supertag/tips_and_tricks.html states:

    However, "stat transparency" means that although person-1 isn't the immediate child of photos, we can treat it as if it was. This means that you can do ls people/person-1/โ‹‚ to list the intersection of those two tags, without needing to go through the people tag group.

    Should this be: ls photos/person-1/โ‹‚ ?

    opened by jhnc 0
  • `pdf/-plt/-math/โ‹‚` shows pdf files with the `plt` tag

    `pdf/-plt/-math/โ‹‚` shows pdf files with the `plt` tag

    The actual intersection should contain pdfs which are neither plt nor math.

    opened by suhr 0
  • Feature suggestion: default to tagging files into current collection when tag binary cwd is within that collection

    Feature suggestion: default to tagging files into current collection when tag binary cwd is within that collection

    This would make it slightly easier to edit tags on secondary collections. I keep accidentally tagging things into my primary collection!

    opened by lahwran 1
  • chaining exclusions results in no files being excluded

    chaining exclusions results in no files being excluded

    eg. given this setup:

    # install current release version as of this issue
    curl -Ls https://github.com/amoffat/supertag/releases/download/v0.1.4/supertag-x86_64.AppImage > /tmp/tag-0.1.4
    chmod +x /tmp/tag-0.1.4
    function tag() { /tmp/tag-0.1.4 "[email protected]"; }
    
    # make a debug collection
    cd /mnt # change to your base (mine is ~)
    sudo mkdir -p supertagdebug
    sudo chown $USER:$USER supertagdebug
    tag mount supertagdebug
    cd supertagdebug
    

    this test case fails:

    touch /tmp/{a1,a2,ab,b1,b2,c1}
    tag ln /tmp/{a1,a2,ab,b1,b2,c} $PWD/basetag/
    tag ln /tmp/{a1,a2,ab} $PWD/basetag/a
    tag ln /tmp/{ab,b1,b2} $PWD/basetag/b
    tag ln /tmp/c1 $PWD/basetag/c
    
    echo "actual:"
    ls basetag/-a/-b/_/
    echo "actual vs expected:"
    diff <(ls basetag/-a/-b/_/) - << EXPECTED
    c1
    EXPECTED
    echo "actual vs no filtering:"
    diff <(ls basetag/-a/-b/_/) <(ls basetag/_/)
    

    I get the output:

    actual:
    a1
    a2
    b1
    b2
    c1
    actual vs expected:
    1,4d0
    < a1
    < a2
    < b1
    < b2
    actual vs no filtering:
    2a3
    > ab
    

    it seems to be excluding the intersection of the intersected tags, rather than individually excluding each separate exclude tag.

    opened by lahwran 1
  • Publish fuse-sys on crates.io

    Publish fuse-sys on crates.io

    Apparently that's needed for cargo package to work. Ran into that while trying to package Supertag for Guix.

    And again, I am not thrilled to have to through GitHub to report issues.

    opened by raingloom 2
  • Unable to compile or install supertag with macFUSE 4.0.5

    Unable to compile or install supertag with macFUSE 4.0.5

    I have manually installed MacFUSE 4.0.5; homebrew casks only have 3.11.2.

    Running brew install amoffat/rnd/supertag as directed in the docs produced this error:

    Warning: Calling depends_on :osxfuse is deprecated! There is no replacement.
    Please report this issue to the amoffat/rnd tap (not Homebrew/brew or Homebrew/core):
      /usr/local/Homebrew/Library/Taps/amoffat/homebrew-rnd/supertag.rb:8
    

    I've opened https://github.com/amoffat/homebrew-rnd/issues/1 for that.

    Next, I tried to install supertag using cargo, but there was a compilation error:

      thread 'main' panicked at 'Invalid version of osxfuse: Failure { command: "\"pkg-config\" \"--libs\" \"--cflags\" \"osxfuse\" \"osxfuse >= 2.6.0\"", output: Output { status: ExitStatus(ExitStatus(256)), stdout: "", stderr: "Package osxfuse was not found in the pkg-config search path.\nPerhaps you should add the directory containing `osxfuse.pc\'\nto the PKG_CONFIG_PATH environment variable\nNo package \'osxfuse\' found\nPackage osxfuse was not found in the pkg-config search path.\nPerhaps you should add the directory containing `osxfuse.pc\'\nto the PKG_CONFIG_PATH environment variable\nNo package \'osxfuse\' found\n" } }', fuse-sys/build.rs:36:10
    

    According to the MacFUSE release notes, the library is now simply named fuse, rather than osxfuse. So I edited fuse-sys/build.rs to change osxfuse to fuse on line 27 and then I got a new build error and decided this was beyond my current knowledge.

    opened by inklesspen 1
  • Provide a comparison with TMSU

    Provide a comparison with TMSU

    I think it would be very useful to provide a comparison with TMSU. It is similar in scope, written in Go, and in active development.

    I understood from the Reddit thread that you weren't familiar with it, and IMHO it is an additional reason for this comparison. I'm pretty sure that it would be beneficial for you to get to know about TMSU's design choices and feature set.

    Furthermore, TMSU's author (@oniony) started to program in Rust, so there could be an opportunity for you guys to join your forces and work together, which would be amazing.

    opened by ngirard 0
  • Unsure how to import a large number of files

    Unsure how to import a large number of files

    The documentation -- which is great btw -- doesn't seem to address how to import a large number of files into a Supertag collection, and I couldn't find any script of program in the repo tree that would help.

    Do you have any best practices to share ? Could we imagine a helper tool for this ? I guess what I'm thinking of, is a program (or a subcommand) that would take as arguments:

    • a name of a Supertag collection, or a mount point;
    • a <path> to the directory to import
    • a tag name that would be affected to all imported files (e.g. inbox)
    • an optional number of path components to strip (e.g. --strip-components=2)

    and that would

    • find all files from <path> (possibly ignoring .git dirs using the ignore crate)
    • treat all path components as tags (excluding the leading components if necessary)
    • add the files to the Supertag collection, tagging them with the tags corresponding to the path components, plus the tag given as a parameter (e.g.inbox).

    What do you think ?

    enhancement help wanted 
    opened by ngirard 1
  • Consider adding SQL indexes

    Consider adding SQL indexes

    Unless I'm mistaken, the code doesn't seem to create SQL indexes, and a quick look at the queries leaves me under the impression that they would benefit from indexes.

    Any thoughts ?

    good first issue performance 
    opened by ngirard 4
  • Lints in clippy::restriction group are meant to be picked one by one

    Lints in clippy::restriction group are meant to be picked one by one

    Hi @amoffat, thanks for this cool project!

    I noticed you enabled the whole restriction category of Clippy. Lints in that group are not meant to be all enabled, as they are thought for very specific codebases, and some of them are even against idiomatic Rust. You should pick them one by one, if you find any of them useful.

    Clippy should warn you against that, but you may be using an older version. Just wanted to make sure you are aware of that!

    good first issue cleanup 
    opened by ebroto 1
Releases(v0.1.4)
Owner
Andrew Moffat
Tech Generalist
Andrew Moffat
The reference implementation of the Linux FUSE (Filesystem in Userspace) interface

libfuse About FUSE (Filesystem in Userspace) is an interface for userspace programs to export a filesystem to the Linux kernel. The FUSE project consi

null 3.5k Nov 24, 2021
A Tauri Plugin to watch the filesystem for changes

Tauri Plugin FSWatch This plugin provides a "classical" Tauri Plugin Interface to watch changes on files and directories through notify. Architecture

Tauri 6 Oct 28, 2021
ergonomic paths and files in rust

path_abs: ergonomic paths and files in rust. This library aims to provide ergonomic path and file operations to rust with reasonable performance. See

Rett Berg 44 Aug 17, 2021
Expanding opportunities standard library std::fs and std::io

fs_extra A Rust library that provides additional functionality not present in std::fs. Documentation Migrations to 1.x.x version Key features: Copy fi

Denis Kurilenko 110 Nov 17, 2021
Merge together and efficiently time-sort compressed .pcap files stored in AWS S3 object storage (or locally) to stdout for pipelined processing.

Merge together and efficiently time-sort compressed .pcap files stored in AWS S3 object storage (or locally) to stdout for pipelined processing. High performance and parallel implementation for > 10 Gbps playback throughput with large numbers of files (~4k).

null 1 Nov 28, 2021
High level FFI binding around the sys mount & umount2 calls, for Rust

sys-mount High level FFI bindings to the mount and umount2 system calls, for Rust. Examples Mount This is how the mount command could be written with

Pop!_OS 21 Nov 8, 2021
Temporary directory management for Rust

tempdir A Rust library for creating a temporary directory and deleting its entire contents when the directory is dropped. Documentation Deprecation No

null 132 Nov 16, 2021
Temporary file library for rust

tempfile A secure, cross-platform, temporary file library for Rust. In addition to creating temporary files, this library also allows users to securel

Steven Allen 554 Nov 27, 2021
Extended attribute library for rust.

xattr A small library for setting, getting, and listing extended attributes. Supported Platforms: Linux, MacOS, FreeBSD, and NetBSD. API Documentation

Steven Allen 24 Nov 8, 2021
Rust implemention of Ascon

Ascon Pure Rust implementation of the lightweight Authenticated Encryption and Associated Data (AEAD) Ascon-128 and Ascon-128a. Security Notes This cr

Sebastian Ramacher 4 Nov 9, 2021
Lightweight Google Cloud Storage sync Rust Client with better performance than gsutil rsync

gcs-rsync Lightweight and efficient Rust gcs rsync for Google Cloud Storage. gcs-sync is faster than gsutil rsync when files change a lot while perfor

@cboudereau 1 Nov 2, 2021
A POSIX select I/O Multiplexing Rust library.

A POSIX select I/O Multiplexing Rust library.

b23r0 32 Nov 11, 2021
the file filesystem: mount semi-structured data (like JSON) as a Unix filesystem

ffs: the file filesystem ffs, the file filessytem, let's you mount semi-structured data as a fileystem---a tree structure you already know how to work

Michael Greenberg 145 Nov 9, 2021
A floating, tag-based window manager written in Rust

worm worm is a floating, tag-based window manager for X11. It is written in the Rust programming language, using the X11RB library. Install cargo buil

null 144 Nov 18, 2021
Travis CI and AppVeyor template to test your Rust crate on 5 architectures and publish binary releases of it for Linux, macOS and Windows

trust Travis CI and AppVeyor template to test your Rust crate on 5 architectures and publish binary releases of it for Linux, macOS and Windows Featur

Jorge Aparicio 1.1k Nov 19, 2021
GitHub Actions for mdBook (rust-lang/mdBook) โšก๏ธ Setup mdBook quickly and build your site fast. Linux (Ubuntu), macOS, and Windows are supported.

GitHub Actions for mdBook rust-lang/mdBook Setup Action. We can run mdBook on a virtual machine of GitHub Actions by this mdBook action. Linux, macOS,

Shohei Ueda 160 Nov 30, 2021
Advanced Fuzzing Library - Slot your Fuzzer together in Rust! Scales across cores and machines. For Windows, Android, MacOS, Linux, no_std, ...

LibAFL, the fuzzer library. Advanced Fuzzing Library - Slot your own fuzzers together and extend their features using Rust. LibAFL is written and main

Advanced Fuzzing League ++ 604 Nov 24, 2021
Borderlands 3 Save/Profile Editor for Windows/MacOS and Linux!

Borderlands 3 Save Editor A tool to help you modify your Borderlands 3 Saves and Profiles. Currently it runs on Windows, Mac OS and Linux. It supports

Zak 94 Nov 29, 2021
The reference implementation of the Linux FUSE (Filesystem in Userspace) interface

libfuse About FUSE (Filesystem in Userspace) is an interface for userspace programs to export a filesystem to the Linux kernel. The FUSE project consi

null 3.5k Nov 24, 2021
A WHATWG-compliant HTML5 tokenizer and tag soup parser

html5gum html5gum is a WHATWG-compliant HTML tokenizer. use std::fmt::Write; use html5gum::{Tokenizer, Token}; let html = "<title >hello world</tit

Markus Unterwaditzer 19 Nov 26, 2021
Fuse filesystem that returns symlinks to executables based on the PATH of the requesting process.

Envfs Fuse filesystem that returns symlinks to executables based on the PATH of the requesting process. This is useful to execute shebangs on NixOS th

Jรถrg Thalheim 44 Nov 22, 2021
fd is a program to find entries in your filesystem. It is a simple, fast and user-friendly alternative to find

fd is a program to find entries in your filesystem. It is a simple, fast and user-friendly alternative to find. While it does not aim to support all of find's powerful functionality, it provides sensible (opinionated) defaults for a majority of use cases.

David Peter 19.6k Nov 24, 2021
๐Ÿšง (Alpha stage software) Binary that supports remote filesystem and process operations. ๐Ÿšง

distant Binary to connect with a remote machine to edit files and run programs. ?? (Alpha stage software) This program is in rapid development and may

Chip Senkbeil 124 Nov 20, 2021
mach-dump can parse Mach-O core dumps taken with lldb from macOS and iOS devices.

mach-dump mach-dump can parse Mach-O core dumps taken with lldb from macOS and iOS devices. It has no external dependencies. Example use std::path::Pa

Tobi 2 Oct 5, 2021
A faster way to navigate your filesystem

zoxide A faster way to navigate your filesystem Table of contents Introduction Examples Getting started Step 1: Install zoxide Step 2: Install fzf (op

Ajeet D'Souza 4.3k Nov 23, 2021
rpg-cli โ€”your filesystem as a dungeon!

rpg-cli is a bare-bones JRPG-inspired terminal game written in Rust. It can work as an alternative to cd where you randomly encounter enemies as you change directories.

Facundo Olano 1.1k Nov 27, 2021
A Tauri Plugin to watch the filesystem for changes

Tauri Plugin FSWatch This plugin provides a "classical" Tauri Plugin Interface to watch changes on files and directories through notify. Architecture

Tauri 6 Oct 28, 2021
A filesystem-tracer

fstracer A filesystem-tracer. Actually this is just an experiment of mine to learn more about Rust's Foreign Function Interface (FFI), writing LD_PREL

null 1 Nov 17, 2021