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 8 files changed, 168 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 (limited to 'Offlink.app/Contents') 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 -- cgit v1.2.3