From 0369aa7d20d464e96098144dbd6edb9067e5a383 Mon Sep 17 00:00:00 2001 From: Filipp Lepalaan Date: Fri, 29 Apr 2016 19:45:46 +0300 Subject: Initial commit --- Offlink.app/Contents/Info.plist | 63 +++++++++++++ Offlink.app/Contents/MacOS/droplet | Bin 0 -> 25028 bytes Offlink.app/Contents/MacOS/helper.py | 100 +++++++++++++++++++++ Offlink.app/Contents/PkgInfo | 1 + Offlink.app/Contents/Resources/Scripts/main.scpt | Bin 0 -> 5042 bytes .../Contents/Resources/description.rtfd/TXT.rtf | 4 + Offlink.app/Contents/Resources/droplet.icns | Bin 0 -> 74052 bytes Offlink.app/Contents/Resources/droplet.rsrc | Bin 0 -> 362 bytes README.md | 35 ++++++++ 9 files changed, 203 insertions(+) create mode 100644 Offlink.app/Contents/Info.plist create mode 100755 Offlink.app/Contents/MacOS/droplet create mode 100755 Offlink.app/Contents/MacOS/helper.py create mode 100644 Offlink.app/Contents/PkgInfo create mode 100644 Offlink.app/Contents/Resources/Scripts/main.scpt create mode 100644 Offlink.app/Contents/Resources/description.rtfd/TXT.rtf create mode 100644 Offlink.app/Contents/Resources/droplet.icns create mode 100644 Offlink.app/Contents/Resources/droplet.rsrc create mode 100644 README.md diff --git a/Offlink.app/Contents/Info.plist b/Offlink.app/Contents/Info.plist new file mode 100644 index 0000000..ec06067 --- /dev/null +++ b/Offlink.app/Contents/Info.plist @@ -0,0 +1,63 @@ + + + + + CFBundleAllowMixedLocalizations + + CFBundleDevelopmentRegion + English + CFBundleDocumentTypes + + + CFBundleTypeExtensions + + * + + CFBundleTypeOSTypes + + **** + + CFBundleTypeRole + Viewer + + + CFBundleExecutable + droplet + CFBundleIconFile + droplet + CFBundleIdentifier + com.apple.ScriptEditor.id.App + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + dplt + LSMinimumSystemVersionByArchitecture + + x86_64 + 10.6 + + LSRequiresCarbon + + WindowState + + dividerCollapsed + + eventLogLevel + -1 + name + ScriptWindowState + positionOfDivider + 422.5 + savedFrame + 62 116 1228 736 0 0 1440 878 + selectedTabView + event log + + + diff --git a/Offlink.app/Contents/MacOS/droplet b/Offlink.app/Contents/MacOS/droplet new file mode 100755 index 0000000..4f7d67b Binary files /dev/null and b/Offlink.app/Contents/MacOS/droplet differ diff --git a/Offlink.app/Contents/MacOS/helper.py b/Offlink.app/Contents/MacOS/helper.py new file mode 100755 index 0000000..686c194 --- /dev/null +++ b/Offlink.app/Contents/MacOS/helper.py @@ -0,0 +1,100 @@ +#!/usr/bin/env python + +import os.path +import plistlib +import subprocess + +PREF = os.path.expanduser("~/Library/Preferences/com.github.filipp.offlink.plist") + +def open_plist(): + try: + return plistlib.readPlist(PREF) + except Exception: + d = dict(folders=[]) + return plistlib.writePlist(d, PREF) + +def is_linked(path): + """ + Returns True if path is in the linked list + + >>> is_linked("/tmp2") + False + """ + plist = open_plist() + for x in plist['folders']: + if x['source'] == path: + return True + return False + +def add_path(source, target): + """ + Adds source and target to list of synced folders + + >>> add_path('/blaa', '/bluu') #doctest: +ELLIPSIS + Traceback (most recent call last): + ... + ValueError... + >>> add_path('/var', '/tmp') + /var linked with /tmp + """ + plist = open_plist() + for path in (source, target,): + if not os.path.exists(path): + raise ValueError("%s is not a valid path" % path) + f = dict(source=source, target=target) + plist['folders'] = plist['folders'] + [f] + plistlib.writePlist(plist, PREF) + + print("%s linked with %s" % (source, target)) + +def forget_path(path): + """ + Removes this source from the linked folders list + + >>> forget_path("/var") + /var removed from synced list + """ + plist = open_plist() + newlist = [] + + for x in plist['folders']: + if x['source'] != path: + newlist.append(x) + plist['folders'] = newlist + plistlib.writePlist(plist, PREF) + + print("%s removed from synced list" % path) + +def sync(source, target): + subprocess.call(["/usr/bin/rsync", "-auE", source, target]) + print("%s synced with %s" % (source, target)) + +def source_to_target(): + plist = open_plist() + + for x in plist['folders']: + sync(x['source'], x['target']) + +def target_to_source(): + plist = open_plist() + + for x in plist['folders']: + sync(x['target'], x['source']) + + +if __name__ == '__main__': + import sys + import doctest + + if len(sys.argv) == 1: + doctest.testmod() + sys.exit() + + if sys.argv[1] == 'add': + add_path(sys.argv[2], sys.argv[3]) + if sys.argv[1] == 'forget': + forget_path(sys.argv[2]) + if sys.argv[1] == 'check': + sys.exit(255) if is_linked(sys.argv[2]) else sys.exit(0) + if sys.argv[1] == 'sync': + source_to_target() diff --git a/Offlink.app/Contents/PkgInfo b/Offlink.app/Contents/PkgInfo new file mode 100644 index 0000000..b999e99 --- /dev/null +++ b/Offlink.app/Contents/PkgInfo @@ -0,0 +1 @@ +APPLdplt \ No newline at end of file diff --git a/Offlink.app/Contents/Resources/Scripts/main.scpt b/Offlink.app/Contents/Resources/Scripts/main.scpt new file mode 100644 index 0000000..d060e2d Binary files /dev/null and b/Offlink.app/Contents/Resources/Scripts/main.scpt differ diff --git a/Offlink.app/Contents/Resources/description.rtfd/TXT.rtf b/Offlink.app/Contents/Resources/description.rtfd/TXT.rtf new file mode 100644 index 0000000..116a631 --- /dev/null +++ b/Offlink.app/Contents/Resources/description.rtfd/TXT.rtf @@ -0,0 +1,4 @@ +{\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210 +{\fonttbl} +{\colortbl;\red255\green255\blue255;} +} \ No newline at end of file diff --git a/Offlink.app/Contents/Resources/droplet.icns b/Offlink.app/Contents/Resources/droplet.icns new file mode 100644 index 0000000..4783f3f Binary files /dev/null and b/Offlink.app/Contents/Resources/droplet.icns differ diff --git a/Offlink.app/Contents/Resources/droplet.rsrc b/Offlink.app/Contents/Resources/droplet.rsrc new file mode 100644 index 0000000..a091d9e Binary files /dev/null and b/Offlink.app/Contents/Resources/droplet.rsrc differ diff --git a/README.md b/README.md new file mode 100644 index 0000000..41f3b18 --- /dev/null +++ b/README.md @@ -0,0 +1,35 @@ +### Introduction + +This tool synchronizes shared folders for offline editing. It may come in useful if you have some folders on a file server that you would like to "take with you" - you then simply drag those folders to + +It has 3 modes of operation: + +- Dragging new folder: create "link" between source and target and sync +- Dragging previously synced folder: "unlink" source and target +- Launch without drag/drop: sync folders + +### How to + +- Drag your source items onto the Offlink droplet +- Run the Offlink droplet before you go "offline" +- To remove items from the "linked list", just drag the source file/folders onto it again + +### Bugs + +It would be nice to be able to sync files back to the source directory as well and the rsync code is in there, but I don't know how to trigger that behaviour (alt-clicking would be an option, but stock AppleScript cannot detect that). + +### License + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2016 Filipp Lepalaan + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. -- cgit v1.2.3