diff --git a/README.md b/README.md index bb387bc7..4b12e3bd 100644 --- a/README.md +++ b/README.md @@ -1028,6 +1028,8 @@ to save some time, you can provide a regex pattern for filepaths to only index similarly, you can fully ignore files/folders using `--no-idx [...]` and `:c,noidx=\.iso$` +* when running on macos, all the usual apple metadata files are excluded by default + if you set `--no-hash [...]` globally, you can enable hashing for specific volumes using flag `:c,nohash=` ### filesystem guards diff --git a/copyparty/__main__.py b/copyparty/__main__.py index d999134f..9c5f9484 100755 --- a/copyparty/__main__.py +++ b/copyparty/__main__.py @@ -20,12 +20,13 @@ import time import traceback import uuid -from .__init__ import ANYWIN, CORES, EXE, PY2, VT100, WINDOWS, E, EnvParams, unicode +from .__init__ import ANYWIN, CORES, EXE, MACOS, PY2, VT100, WINDOWS, E, EnvParams, unicode from .__version__ import CODENAME, S_BUILD_DT, S_VERSION from .authsrv import expand_config_file, split_cfg_ln, upgrade_cfg_fmt from .cfg import flagcats, onedash from .svchub import SvcHub from .util import ( + APPLESAN_TXT, DEF_EXP, DEF_MTE, DEF_MTH, @@ -1166,6 +1167,7 @@ def add_transcoding(ap): def add_db_general(ap, hcores): + noidx = APPLESAN_TXT if MACOS else "" ap2 = ap.add_argument_group('general db options') ap2.add_argument("-e2d", action="store_true", help="enable up2k database, making files searchable + enables upload deduplication") ap2.add_argument("-e2ds", action="store_true", help="scan writable folders for new files on startup; sets \033[33m-e2d\033[0m") @@ -1175,7 +1177,7 @@ def add_db_general(ap, hcores): ap2.add_argument("-e2vp", action="store_true", help="on hash mismatch: panic and quit copyparty") ap2.add_argument("--hist", metavar="PATH", type=u, help="where to store volume data (db, thumbs) (volflag=hist)") ap2.add_argument("--no-hash", metavar="PTN", type=u, help="regex: disable hashing of matching absolute-filesystem-paths during e2ds folder scans (volflag=nohash)") - ap2.add_argument("--no-idx", metavar="PTN", type=u, help="regex: disable indexing of matching absolute-filesystem-paths during e2ds folder scans (volflag=noidx)") + ap2.add_argument("--no-idx", metavar="PTN", type=u, default=noidx, help="regex: disable indexing of matching absolute-filesystem-paths during e2ds folder scans (volflag=noidx)") ap2.add_argument("--no-dhash", action="store_true", help="disable rescan acceleration; do full database integrity check -- makes the db ~5%% smaller and bootup/rescans 3~10x slower") ap2.add_argument("--re-dhash", action="store_true", help="rebuild the cache if it gets out of sync (for example crash on startup during metadata scanning)") ap2.add_argument("--no-forget", action="store_true", help="never forget indexed files, even when deleted from disk -- makes it impossible to ever upload the same file twice -- only useful for offloading uploads to a cloud service or something (volflag=noforget)") diff --git a/copyparty/httpcli.py b/copyparty/httpcli.py index bba6ff96..3183e52e 100644 --- a/copyparty/httpcli.py +++ b/copyparty/httpcli.py @@ -37,6 +37,7 @@ from .star import StreamTar from .sutil import StreamArc, gfilter from .szip import StreamZip from .util import ( + APPLESAN_RE, HTTPCODE, META_NOBOTS, UTC, @@ -1384,8 +1385,7 @@ class HttpCli(object): return False vp = "/" + self.vpath - ptn = r"/\.(_|DS_Store|Spotlight-|fseventsd|Trashes|AppleDouble)|/__MACOS" - if re.search(ptn, vp): + if re.search(APPLESAN_RE, vp): zt = '\n{}' zb = zt.format(vp).encode("utf-8", "replace") self.reply(zb, 423, "text/xml; charset=utf-8") @@ -3396,7 +3396,7 @@ class HttpCli(object): pt = "404 not found ┐( ´ -`)┌" if self.ua.startswith("curl/") or self.ua.startswith("fetch"): - pt = "# acct: %s\n%s" % (self.uname, pt) + pt = "# acct: %s\n%s\n" % (self.uname, pt) self.reply(pt.encode("utf-8"), status=rc) return True diff --git a/copyparty/util.py b/copyparty/util.py index a9697ef3..5ff98850 100644 --- a/copyparty/util.py +++ b/copyparty/util.py @@ -343,6 +343,11 @@ CMD_EXEB = set(_exestr.encode("utf-8").split()) CMD_EXES = set(_exestr.split()) +# mostly from https://github.com/github/gitignore/blob/main/Global/macOS.gitignore +APPLESAN_TXT = r"/(__MACOS|Icon\r\r)|/\.(_|DS_Store|AppleDouble|LSOverride|DocumentRevisions-|fseventsd|Spotlight-|TemporaryItems|Trashes|VolumeIcon\.icns|com\.apple\.timemachine\.donotpresent|AppleDB|AppleDesktop|apdisk)" +APPLESAN_RE = re.compile(APPLESAN_TXT) + + pybin = sys.executable or "" if EXE: pybin = ""