Compare commits

...

3 Commits

Author SHA1 Message Date
7705731dd5 docs : add explanation of what is unisync
also add an example
2026-01-20 23:39:48 +01:00
e639c12c20 docs : Add sphinx for handling documentation
Edit gitignore by ignoring the docs/build directory
Add sphinx dependencies to pyproject
Add docs folder
2026-01-04 19:18:57 +01:00
c10077392e Change TODOs format.
Use TODO: instead of TODO
2026-01-04 19:18:18 +01:00
12 changed files with 242 additions and 4 deletions

1
.gitignore vendored
View File

@@ -1,2 +1,3 @@
poetry.lock
__pycache__
docs/build

20
docs/Makefile Normal file
View File

@@ -0,0 +1,20 @@
# Minimal makefile for Sphinx documentation
#
# You can set these variables from the command line, and also
# from the environment for the first two.
SPHINXOPTS ?=
SPHINXBUILD ?= sphinx-build
SOURCEDIR = source
BUILDDIR = build
# Put it first so that "make" without argument is like "make help".
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
.PHONY: help Makefile
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

35
docs/make.bat Normal file
View File

@@ -0,0 +1,35 @@
@ECHO OFF
pushd %~dp0
REM Command file for Sphinx documentation
if "%SPHINXBUILD%" == "" (
set SPHINXBUILD=sphinx-build
)
set SOURCEDIR=source
set BUILDDIR=build
%SPHINXBUILD% >NUL 2>NUL
if errorlevel 9009 (
echo.
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
echo.installed, then set the SPHINXBUILD environment variable to point
echo.to the full path of the 'sphinx-build' executable. Alternatively you
echo.may add the Sphinx directory to PATH.
echo.
echo.If you don't have Sphinx installed, grab it from
echo.https://www.sphinx-doc.org/
exit /b 1
)
if "%1" == "" goto help
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
goto end
:help
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
:end
popd

36
docs/source/conf.py Normal file
View File

@@ -0,0 +1,36 @@
# Configuration file for the Sphinx documentation builder.
#
# For the full list of built-in configuration values, see the documentation:
# https://www.sphinx-doc.org/en/master/usage/configuration.html
# -- Project information -----------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
project = 'unisync'
copyright = '2026, Paul Retourné'
author = 'Paul Retourné'
release = '0.1.0'
# -- General configuration ---------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
extensions = [
'sphinx.ext.autodoc',
'sphinx.ext.viewcode',
'sphinx.ext.napoleon',
'sphinx.ext.todo'
]
templates_path = ['_templates']
exclude_patterns = []
# -- Options for HTML output -------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
#html_theme = 'alabaster'
html_theme = 'sphinx_rtd_theme'
html_static_path = ['_static']
autodoc_docstring_signature = True

24
docs/source/example.rst Normal file
View File

@@ -0,0 +1,24 @@
.. _example_how_it_works:
Example of how unisync works
============================
Let's say you have the following structure::
$ tree .
.
├── big_file
└── folder
   ├── file
   └── other_file
If you only want to synchronise `folder` and its content on your laptop the following will be automatically generated::
$ tree .
.
├── big_file -> ../.data/big_file
└── folder
   ├── file
   └── other_file
`big_file` is now a symbolic link and by mounting the remote directory you can still seemlessly access `big_file` through the network.

31
docs/source/index.rst Normal file
View File

@@ -0,0 +1,31 @@
.. unisync documentation master file, created by
sphinx-quickstart on Sun Jan 4 15:02:58 2026.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Documentation for unisync
=========================
Unisync is a data synchronising tool built around `unison`_ and expending on it.
Unisync tries to solve two problems that are often solved separately but never together :
* Keeping your data synchronised between multiple machines (through a central server), examples of this are rsync and of course unison.
* Being able to access and edit files stored on your server without having to download them, the gui interface of nextcloud for example.
* And of course I want to be able to do all of this without ever having to leave my terminal.
Unisync solves this problem by placing each file on your local machine but with only the selected files and folders being physically present on your drive,
the others are replaced by symbolic links pointing to a directory that is mounted from your server.
See this
:ref:`example_how_it_works`.
.. _unison: https://github.com/bcpierce00/unison
.. toctree::
:maxdepth: 2
:caption: Contents:
example
modules

7
docs/source/modules.rst Normal file
View File

@@ -0,0 +1,7 @@
unisync
=======
.. toctree::
:maxdepth: 4
unisync

77
docs/source/unisync.rst Normal file
View File

@@ -0,0 +1,77 @@
unisync package
===============
Submodules
----------
unisync.argparser module
------------------------
.. automodule:: unisync.argparser
:members:
:show-inheritance:
:undoc-members:
unisync.config module
---------------------
.. automodule:: unisync.config
:members:
:show-inheritance:
:undoc-members:
unisync.defaults module
-----------------------
.. automodule:: unisync.defaults
:members:
:show-inheritance:
:undoc-members:
unisync.errors module
---------------------
.. automodule:: unisync.errors
:members:
:show-inheritance:
:undoc-members:
unisync.main module
-------------------
.. automodule:: unisync.main
:members:
:show-inheritance:
:undoc-members:
unisync.paths module
--------------------
.. automodule:: unisync.paths
:members:
:show-inheritance:
:undoc-members:
unisync.runners module
----------------------
.. automodule:: unisync.runners
:members:
:show-inheritance:
:undoc-members:
unisync.synchroniser module
---------------------------
.. automodule:: unisync.synchroniser
:members:
:show-inheritance:
:undoc-members:
Module contents
---------------
.. automodule:: unisync
:members:
:show-inheritance:
:undoc-members:

View File

@@ -20,3 +20,10 @@ packages = [{include = "unisync", from = "src"}]
[build-system]
requires = ["poetry-core>=2.0.0,<3.0.0"]
build-backend = "poetry.core.masonry.api"
[dependency-groups]
docs = [
"sphinx (>=9.1.0,<10.0.0)",
"sphinx-rtd-theme (>=3.0.2,<4.0.0)",
]

View File

@@ -21,11 +21,11 @@ def main():
elif os.path.isfile(config_path):
config = load_config(config_path)
else:
# TODO replace the next line with something to do if no config file is found
# TODO: replace the next line with something to do if no config file is found
config = load_config(config_path)
pass
# TODO make the command line arguments work and override the config options
# TODO: make the command line arguments work and override the config options
synchroniser = Synchroniser(
config.roots.remote,

View File

@@ -14,7 +14,7 @@ def unisync_sync(synchroniser:Synchroniser, paths_manager:PathsManager):
synchroniser.sync_files(paths_manager.get_paths_to_sync())
synchroniser.sync_links(paths_manager.get_paths_to_sync())
# TODO check the config options and do or don't do the following
# TODO: check the config options and do or don't do the following
synchroniser.update_links()
#synchroniser.mount_remote_dir()

View File

@@ -75,7 +75,6 @@ class Synchroniser:
On slow connections one might want to increase this.
Returns:
An error code (0 success, 1 TimeoutExpired, 2 KeyboardInterrupt).
TODO change that to raising the exception.
"""
self.control_path = os.path.expanduser(control_path)
command = [
@@ -87,6 +86,7 @@ class Synchroniser:
"-p", str(self.remote_port)
]
master_ssh = subprocess.Popen(command)
# TODO: Raise an exception instead of changing the return value
try:
ret_code = master_ssh.wait(timeout=connection_timeout)
except subprocess.TimeoutExpired: