Compare commits
7 Commits
a0eb371a65
...
4dcab777ca
| Author | SHA1 | Date | |
|---|---|---|---|
|
4dcab777ca
|
|||
|
a169890351
|
|||
|
b70070ba1a
|
|||
|
bd72d740e6
|
|||
|
e43c16adb3
|
|||
|
10200fceb9
|
|||
|
138bc6d24a
|
@@ -23,5 +23,4 @@ The issue is that you need to know what data is stored on the server to avoid co
|
||||
# Developement
|
||||
|
||||
Unisync was at first a simple bash script but as it grew more complex I started struggling to maintain it which is why I am porting it to python. It will make everything more robust, easier to maintain and to add functionalities.
|
||||
I am in the early stages of the developement process, this should be usable in the upcoming weeks.
|
||||
Help will be welcome in the future but is not desirable right now as I want to shape this the way I want to.
|
||||
I am in the early stages of the developement process, this should be usable someday (hopefully).
|
||||
|
||||
@@ -3,20 +3,34 @@
|
||||
|
||||
import argparse
|
||||
|
||||
def create_argparser() -> argparse.ArgumentParser:
|
||||
def create_argparser(sync_function, add_function, mount_function) -> argparse.ArgumentParser:
|
||||
"""
|
||||
Creates an argument parser to parse the command line arguments.
|
||||
We use subparsers and set a default function for each to perform the correct action.
|
||||
"""
|
||||
parser = argparse.ArgumentParser(
|
||||
prog='unisync',
|
||||
description='File synchronisation application',
|
||||
epilog="""
|
||||
Copyright © 2025 Paul Retourné.
|
||||
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>."""
|
||||
epilog="Copyright © 2025 Paul Retourné.\n"
|
||||
"License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.",
|
||||
formatter_class=argparse.RawDescriptionHelpFormatter
|
||||
)
|
||||
parser.add_argument("local", nargs="?")
|
||||
parser.add_argument("remote", nargs="?")
|
||||
parser.set_defaults(func=sync_function)
|
||||
|
||||
remote_addr_group = parser.add_mutually_exclusive_group()
|
||||
remote_addr_group.add_argument("--ip")
|
||||
remote_addr_group.add_argument("--hostname")
|
||||
|
||||
parser.add_argument("--config", help="Path to the configuration file", metavar="path_to_config")
|
||||
|
||||
subparsers = parser.add_subparsers(help='Actions other than synchronisation')
|
||||
|
||||
parser_add = subparsers.add_parser('add', help='Add files to be synchronised.')
|
||||
parser_add.set_defaults(func=add_function)
|
||||
|
||||
parser_mount = subparsers.add_parser('mount', help='Mount the remote.')
|
||||
parser_mount.set_defaults(func=mount_function)
|
||||
|
||||
return parser
|
||||
|
||||
@@ -16,7 +16,7 @@ class ServerConfig:
|
||||
sshargs: str = ""
|
||||
hostname: str = ""
|
||||
ip: str = ""
|
||||
port: int | None = 22
|
||||
port: int = 22
|
||||
|
||||
def __post_init__(self):
|
||||
"""
|
||||
@@ -85,7 +85,7 @@ def load_config(config_path:str) -> Config:
|
||||
config.get(server_section, "sshargs", fallback=""),
|
||||
config.get(server_section, "hostname", fallback=""),
|
||||
config.get(server_section, "ip", fallback=""),
|
||||
config.getint(server_section, "port", fallback=None)
|
||||
config.getint(server_section, "port", fallback=22)
|
||||
)
|
||||
roots_config = RootsConfig(
|
||||
config.get(roots_section, "local"),
|
||||
|
||||
@@ -3,24 +3,29 @@
|
||||
|
||||
import os
|
||||
from argparser import create_argparser
|
||||
from config import RootsConfig, ServerConfig, Config, load_config
|
||||
from runners import unisync_sync, unisync_add, unisync_mount
|
||||
from config import load_config
|
||||
from synchroniser import Synchroniser
|
||||
from pathlib import Path, PosixPath
|
||||
from pathlib import Path
|
||||
from paths import *
|
||||
|
||||
def main():
|
||||
parser = create_argparser()
|
||||
base_namespace = parser.parse_args()
|
||||
parser = create_argparser(unisync_sync, unisync_add, unisync_mount)
|
||||
cli_args = parser.parse_args()
|
||||
|
||||
config_path = os.path.expanduser("~/.config/unisync/config.ini")
|
||||
if base_namespace.config != None and os.path.isfile(base_namespace.config):
|
||||
config = load_config(base_namespace.config)
|
||||
# Check if --config is set
|
||||
if cli_args.config != None and os.path.isfile(cli_args.config):
|
||||
config = load_config(cli_args.config)
|
||||
elif os.path.isfile(config_path):
|
||||
config = load_config(config_path)
|
||||
else:
|
||||
# TODO make the command line arguments work and override the config options
|
||||
# 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
|
||||
|
||||
synchroniser = Synchroniser(
|
||||
config.roots.remote,
|
||||
config.roots.local,
|
||||
@@ -33,18 +38,7 @@ def main():
|
||||
|
||||
paths_manager = PathsManager(Path(config.roots.local), config.other.cache_dir_path)
|
||||
|
||||
if synchroniser.create_ssh_master_connection() != 0:
|
||||
print("Connection failed quitting")
|
||||
return 1
|
||||
print("Connected to the remote.")
|
||||
|
||||
#synchroniser.sync_files()
|
||||
#synchroniser.update_links(background=False)
|
||||
#synchroniser.mount_remote_dir()
|
||||
|
||||
synchroniser.close_ssh_master_connection()
|
||||
print(paths_manager.get_paths_to_sync())
|
||||
|
||||
cli_args.func(synchroniser, paths_manager)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
@@ -106,7 +106,7 @@ class PathsManager:
|
||||
if not is_contained and new_path not in paths_to_add:
|
||||
paths_to_add.append(new_path)
|
||||
|
||||
with self.paths_file.open("w") as f:
|
||||
with self.paths_file.open("a") as f:
|
||||
for p in paths_to_add:
|
||||
f.write(p + "\n")
|
||||
|
||||
|
||||
32
src/unisync/runners.py
Normal file
32
src/unisync/runners.py
Normal file
@@ -0,0 +1,32 @@
|
||||
from synchroniser import Synchroniser
|
||||
from paths import PathsManager
|
||||
|
||||
|
||||
def unisync_sync(synchroniser:Synchroniser, paths_manager:PathsManager):
|
||||
if synchroniser.create_ssh_master_connection() != 0:
|
||||
print("Connection failed quitting")
|
||||
return 1
|
||||
print("Connected to the remote.")
|
||||
|
||||
synchroniser.sync_files(paths_manager.get_paths_to_sync())
|
||||
synchroniser.update_links(background=False)
|
||||
|
||||
# TODO check the config options
|
||||
#synchroniser.mount_remote_dir()
|
||||
|
||||
synchroniser.close_ssh_master_connection()
|
||||
|
||||
|
||||
def unisync_add(synchroniser:Synchroniser, paths_manager:PathsManager):
|
||||
if synchroniser.create_ssh_master_connection() != 0:
|
||||
print("Connection failed quitting")
|
||||
return 1
|
||||
print("Connected to the remote.")
|
||||
|
||||
paths_manager.add_files_to_sync()
|
||||
|
||||
synchroniser.close_ssh_master_connection()
|
||||
|
||||
|
||||
def unisync_mount(synchroniser:Synchroniser, paths_manager:PathsManager):
|
||||
synchroniser.mount_remote_dir()
|
||||
Reference in New Issue
Block a user