Add WebDAV server (ie "mount" on Windows) #4754
Draft
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
What does this PR change? What problem does it solve?
It allows browsing repositories on operating systems where Fuse isn't available.
This PR should work on all OSes and adds no external dependencies (though I suppose x/net/webdav is "external", but it's part of golang). It does no write operation on the repository so it should be safe and I encourage you to try it! But you shouldn't blindly trust the data that it gives you. Performance might also be an issue on large repositories with overly eager clients (like Windows Explorer).
Whilst I'd be happy to see this PR through (fix my reckless path handling, lack of concurrency locks, performance issues, and add documentation and tests), I do no believe it will be accepted as is.
Realistically,
internal/fuse
needs to be abstracted into a VFS that could be shared by Fuse, WebDAV, HTML, etc. It does everything needed already (paths templating, snapshots tree building in a performant manner, file reading, it handles concurrency, etc) but it directly depends onanacrolix/fuse
which isn't present in Windows builds. I do not think it would be very hard to refactor, but I feel unqualified since it's deep in the internals of restic and would touch a lot of files.Special thanks to @wrouesnel, although I wasn't able to use his code in the end (^ that refactoring would be needed first), his attempt is what motivated to work on this.
demo.mp4
Was the change previously discussed in an issue or on the forum?
#485
#60
Checklist
changelog/unreleased/
that describes the changes for our users (see template).gofmt
on the code in all commits.