Installation

From packages

Easiest way is to install pipx, then use it to install mdedup:

$ pipx install mail-deduplicate

Note

pipx is to pip what npx is to npm: a clean way to install and run Python applications in isolated environments.

You can install the latest stable release and its dependencies with a simple pip call:

$ python -m pip install mail-deduplicate

On some system, due to the Python 2.x to 3.x migration, you’ll have to call python3 directly:

$ python3 -m pip install mail-deduplicate

Other variations includes:

$ pip install mail-deduplicate
$ pip3 install mail-deduplicate

If you have difficulties to use pip, see pip’s own installation instructions.

Binaries

Binaries are compiled at each release, so you can skip the installation process above and download the standalone executables directly.

This is the preferred way of testing mdedup without polluting your machine. They also offer the possibility of running the CLI on older systems not supporting the minimal Python version required by mdedup.

All links above points to the latest released version of mdedup.

See also

Older releases If you need to test previous versions for regression, compatibility or general troubleshooting, you’ll find the old binaries attached as assets to past releases on GitHub.

Caution

Development builds Each commit to the development branch triggers the compilation of binaries. This way you can easily test the bleeding edge version of mdedup and report any issue.

Look at the list of latest binary builds. Then select the latest Build & release/release.yaml workflow run and download the binary artifact corresponding to your platform and architecture.

Note

ABI targets

$ file ./mdedup*
./mdedup-linux-x64.bin:   ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=ffc3a60c86bcfcd817c7c76ae3c527acd7c810e0, for GNU/Linux 3.2.0, stripped
./mdedup-macos-arm64.bin: Mach-O 64-bit executable arm64
./mdedup-macos-x64.bin:   Mach-O 64-bit executable x86_64
./mdedup-windows-x64.exe: PE32+ executable (console) x86-64, for MS Windows

Run mdedup

Mail Deduplicate should now be available system-wide:

$ mdedup --version
mdedup, version 7.0.0
(...)

If not, you can directly execute the module from Python:

$ python -m mail_deduplicate --version
mdedup, version 7.0.0
(...)

Or on some systems:

$ python3 -m mail_deduplicate --version
mdedup, version 7.0.0
(...)

Shell completion

Completion for popular shell rely on Click feature.

Add this to ~/.bashrc:

eval "$(_MDEDUP_COMPLETE=bash_source mdedup)"

Add this to ~/.zshrc:

eval "$(_MDEDUP_COMPLETE=zsh_source mdedup)"

Add this to ~/.config/fish/completions/mdedup.fish:

eval (env _MDEDUP_COMPLETE=fish_source mdedup)

Alternatively, export the generated completion code as a static script to be executed:

$ _MDEDUP_COMPLETE=bash_source mdedup > ~/.mdedup-complete.bash

Then source it from ~/.bashrc:

. ~/.mdedup-complete.bash
$ _MDEDUP_COMPLETE=zsh_source mdedup > ~/.mdedup-complete.zsh

Then source it from ~/.zshrc:

. ~/.mdedup.zsh
_MDEDUP_COMPLETE=fish_source mdedup > ~/.config/fish/completions/mdedup.fish

Python dependencies

FYI, here is a graph of Python package dependencies:

        flowchart TD
    classDef missing stroke-dasharray: 5
    arrow["arrow\n1.3.0"]
    boltons["boltons\n24.1.0"]
    bracex["bracex\n2.5.post1"]
    certifi["certifi\n2024.8.30"]
    charset-normalizer["charset-normalizer\n3.4.0"]
    click-extra["click-extra\n4.11.6"]
    click_0["click\n8.1.7"]
    cloup["cloup\n3.0.5"]
    commentjson["commentjson\n0.9.0"]
    distro["distro\n1.9.0"]
    extra-platforms["extra-platforms\n1.6.0"]
    idna["idna\n3.10"]
    lark-parser["lark-parser\n0.7.8"]
    mail-deduplicate["mail-deduplicate\n7.6.1"]
    mergedeep["mergedeep\n1.3.4"]
    python-dateutil["python-dateutil\n2.9.0.post0"]
    pyyaml["PyYAML\n6.0.2"]
    requests["requests\n2.32.3"]
    six["six\n1.16.0"]
    tabulate["tabulate\n0.9.0"]
    types-python-dateutil["types-python-dateutil\n2.9.0.20241003"]
    urllib3["urllib3\n2.2.3"]
    wcmatch["wcmatch\n10.0"]
    xmltodict["xmltodict\n0.14.2"]
    arrow -- ">=2.7.0" --> python-dateutil
    arrow -- ">=2.8.10" --> types-python-dateutil
    click-extra -- "~=0.14.2" --> xmltodict
    click-extra -- "~=0.9" --> tabulate
    click-extra -- "~=0.9.0" --> commentjson
    click-extra -- "~=1.3.4" --> mergedeep
    click-extra -- "~=1.6.0" --> extra-platforms
    click-extra -- "~=10.0" --> wcmatch
    click-extra -- "~=2.32.3" --> requests
    click-extra -- "~=24.1.0" --> boltons
    click-extra -- "~=3.0.5" --> cloup
    click-extra -- "~=6.0.0" --> pyyaml
    click-extra -- "~=8.1.4" --> click_0
    cloup -- ">=8.0,<9.0" --> click_0
    commentjson -- ">=0.7.1,<0.8.0" --> lark-parser
    extra-platforms -- "~=1.9.0" --> distro
    extra-platforms -- "~=24.1.0" --> boltons
    mail-deduplicate -- "~=0.9" --> tabulate
    mail-deduplicate -- "~=1.3.0" --> arrow
    mail-deduplicate -- "~=24.1.0" --> boltons
    mail-deduplicate -- "~=4.11.6" --> click-extra
    python-dateutil -- ">=1.5" --> six
    requests -- ">=1.21.1,<3" --> urllib3
    requests -- ">=2,<4" --> charset-normalizer
    requests -- ">=2.5,<4" --> idna
    requests -- ">=2017.4.17" --> certifi
    wcmatch -- ">=2.1.1" --> bracex