---
name: "mddiff"
section: "1"
platform: "linux"
package: "syncmaildir"
version: "1.3.0-1"
release: "Debian 10 (Buster)"
platforms: ["linux"]
url: "https://new.carta.tech/mddiff"
---

# mddiff(1)

computes diff for maildirs

## NAME

**mddiff** - computes diff for maildirs

## SYNOPSIS

```
mddiff [--max-mailno mno] [--db-file dbf] [-l|--list] [-s|--symlink]
       [--exclude globexpr] [-v|--verbose] [-d|--dry-run]
       [-n|--no-delete] [--no-move] [--help] [--sha1sum] paths
```

## DESCRIPTION

**mddiff** computes the delta from an old status of a maildir (previously recorded in a support file, called db file) and the current status,  generating a set of commands (a diff) that a third party software can  apply to synchronize a (eventually remote) copy of the maildir.

If *paths* is a single file name, and that file is a fifo, **mddiff** reads from it file names separated by new line and outputs the sha1 of its header and body separated by space.

```
      $ mddiff /tmp/fifo_for_mddiff
      806a0ffe4f29766effd764... 463e543da9dac8e298...
      582cbb6a5cd3ce13965c8c... 8fa60a7458b1157193...
      ...
```

If *paths* is a single file name, and that file is a fifo, and the **-s** option is passed, **mddiff** reads from that fifo two lines at a time, respectively a source name and a target name. It then creates a symlink named as as the target name pointing to the source name. If some dictories need to be created in order to create the symlink, this is also done. **mddiff** will print 'OK' on stdout to signal a success, 'ERROR' to signal an error.

If *paths* is a list of directories, **mddiff** outputs a list of actions a client has to perform to synchronize a copy of the same maildirs. This set of actions is relative to a previous status of the maildir stored in the db file. The input directories are traversed recursively, and every file encountered inside directories named cur/ and new/ is a potential mail message (if it  contains no \\n\\n it is skipped).

```
      $ mddiff ~/Mail/
      ADD ~/Mail/cur/1239038050.14937_1.garfield:2,S 66532ebb05b252e...
      ...
```

Every client (endpoint using **mddiff** for synchronization) must use a different db-file, and the db-file is strictly related with the set of directories given as arguments, and should not be used with a different directory set. Adding items to the directory set is safe, while removing them may not do what you want (delete actions are generated).

**mddiff** does not alter the *dbf* file, it generates a new one called dbf.new. It is up to the higher level tool [**smd-server**(1)](/smd-server/1.md) to rename dbf.new to *dbf*  in case the other endpoint successfully applied the diff.

The **--exclude** option tells **mddiff** to ignore all *paths* matching the given [**glob**(7)](/glob/7.md) expression. This option can be passed multiple times. Matching is performed using [**fnmatch**(3)](/fnmatch/3.md) with no special flags, thus '\*' and '?' match any character including '/'. Matching is performed when a directory is entered. If the match is successful, the directory and all its  subedirectories are skipped.

The **--no-delete** option tells **mddiff** to not output a DELETE action for files that disappear. Note that a DELETE action is anyway generated for files that are moved (i.e. move is COPY plus DELETE). The result is that deletions are not propagated to the other endpoint.

## OPTIONS

- **--max-mailno *mno***

  Estimation of max mail message number (defaults to the number of messages in the db-file + 1000 or 500000 if there is no db-file). You may want to decrease it for the first run on small systems. It is anyway increased automatically when needed

- **--db-file *dbf***

  Name of the cache for the endpoint (default db.txt)

- **--exclude *globexpr***

  Exclude *paths* maching the given expression

- **--sha1sum**

  Behaves like the sha1sum utility

- **--mkdir-p**

  Behaves like mkdir **-p**

- **--mkfifo**

  Behaves like mkfifo

- **-l --list**

  Only list the mailboxes recursively contained in *paths*

- **-s --symlink**

  Create symlinks for *paths* read on the input fifo

- **-v --verbose**

  Increase program verbosity (printed on stderr)

- **-d --dry-run**

  Do not generate a new db-file

- **-n --no-delete**

  Do not track deleted files

- **--no-move**

  Do not generate MOVE (only COPY + DELETE)

- **--help**

  This help screen

## NOTES

**mddiff** is a low level utility, used by smd-server and smd-client. You should use higher level tools like [**smd-pull**(1)](/smd-pull/1.md), [**smd-push**(1)](/smd-push/1.md) and [**smd-loop**(1)](/smd-loop/1.md)

## SEE ALSO

[**smd-client**(1)](/smd-client/1.md), [**smd-server**(1)](/smd-server/1.md), [**smd-pull**(1)](/smd-pull/1.md), [**smd-push**(1)](/smd-push/1.md), [**smd-loop**(1)](/smd-loop/1.md)

## AUTHOR

Enrico Tassi \<gares@fettunta.org\>
