| Line 67: |
Line 67: |
| | To avoid opening the terminal window, create the following AppleScript and save as an application. | | To avoid opening the terminal window, create the following AppleScript and save as an application. |
| | | | |
| − | set resultsText to do shell script "unison /Users/houpt/uniDisk ssh://houptlab.org/uniDisk -ui text -batch -times -terse -ignore 'Name .DS_Store'"
| + | try |
| | + | -- add "-terse" if you want less verbose results |
| | + | set resultsText to do shell script "unison /Users/houpt/uniDisk ssh://houptlab.org/uniDisk -ui text -batch -times -ignore 'Name .DS_Store'" |
| | + | |
| | + | on error errStr number errorNumber |
| | + | |
| | + | set unisonResultCodeString to (errStr & return & return & "Result: number " & errorNumber & return & return) |
| | + | |
| | + | if (errorNumber is equal to 0) then |
| | + | |
| | + | set resultsText to (unisonResultCodeString & "Successful synchronization; everything is up-to-date now") |
| | + | |
| | + | else if (errorNumber is equal to 1) then |
| | + | |
| | + | set resultsText to (unisonResultCodeString & "Some files were skipped, but all file transfers were successful.") |
| | + | |
| | + | else if (errorNumber is equal to 2) then |
| | + | |
| | + | set resultsText to (unisonResultCodeString & "Non-fatal failures occurred during file transfer.") |
| | + | |
| | + | else if (errorNumber is equal to 3) then |
| | + | |
| | + | set resultsText to (unisonResultCodeString & "A fatal error occurred, or the execution was interrupted.") |
| | + | |
| | + | else |
| | + | |
| | + | set resultsText to unisonResultCodeString |
| | + | |
| | + | end if |
| | + | |
| | + | |
| | + | end try |
| | | | |
| − | -- display the results text in a new TextEdit window | + | |
| − | -- note that if "-terse" is set, then unison only returns a result if there are conflicts
| + | display alert "Unison completed sync" giving up after 2 |
| − | tell application "TextEdit"
| + | |
| − | activate
| + | -- display the results text in a new TextEdit window |
| − | set NewDoc to make new document
| + | tell application "TextEdit" |
| − | if (0 is length of resultsText) then
| + | activate |
| − | set text of NewDoc to (date string of (current date)) & (time string of (current date)) & return & return & "Unison reports no conflicts."
| + | set NewDoc to make new document |
| − | else
| + | if (0 is length of resultsText) then |
| − | set text of NewDoc to (date string of (current date)) & (time string of (current date)) & return & return & resultsText
| + | set text of NewDoc to (date string of (current date)) & " " & (time string of (current date)) & return & return & "Unison reports no conflicts." |
| − | end if
| + | else |
| − | end tell
| + | set text of NewDoc to (date string of (current date)) & " " &(time string of (current date)) & return & return & resultsText |
| | + | end if |
| | + | end tell |
| | | | |
| | tell me to quit | | tell me to quit |
| | | | |
| | | | |
| − | Results of the synch will be silent, but will be stored in the "unison.log" file. If there are conflicts to be resolved, then the applescript will post a TextEdit window. | + | Results of the synch will be stored in the "unison.log" file, and the applescript will display results in a TextEdit window. |
| | + | |
| | + | ===Unison With Scrivener=== |
| | + | |
| | + | Scrivener stores its projects as bundles (i.e. folders). Because Unison does not sync modification times of folders, changes to Scrivener projects do not get properly propagated. To get around this, I use this more complicated AppleScript to zip up any Scrivener projects -- the zipped file gets propagated properly, with the Scrivener project modification times properly preserved and transmitted. Needless to say, this is a hack; but I really want to sync my Scrivener projects on multiple machines! |
| | + | |
| | + | -- |
| | + | -- AppDelegate.applescript |
| | + | -- SyncUniDisk |
| | + | -- |
| | + | -- Created by Tom Houpt on 12/12/28. |
| | + | -- Copyright (c) 2012 Tom Houpt. All rights reserved. |
| | + | -- |
| | + | |
| | + | script AppDelegate |
| | + | property parent : class "NSObject" |
| | + | |
| | + | on applicationWillFinishLaunching_(aNotification) |
| | + | -- Insert code here to initialize your application before any files are opened |
| | + | |
| | + | -- to handle incompatibilities of Unison file-synching with Scrivener's use of bundles for files |
| | + | -- T.A. Houpt, 2014-1-22 |
| | + | -- |
| | + | -- find all Scrivener "*.scriv" files (actually bundles) and zip them up |
| | + | -- then rename original file as "*.scriv YYYYMMDD hhmmss" |
| | + | -- then call unison in batch mode |
| | + | -- post an alert that we finished syncing |
| | + | -- display the unison results in a TextEdit window |
| | + | -- (we could unzip any *.scriv.zip files, but we do the unzipping manually for the moment) |
| | + | |
| | + | try |
| | + | |
| | + | set allScrivenerFileNames to do shell script "find '/Users/houpt/uniDisk' -name '*.scriv' -print" |
| | + | set AppleScript's text item delimiters to return |
| | + | set scrivenerFileRecords to text items of allScrivenerFileNames |
| | + | |
| | + | -- zip all the .scriv files |
| | + | -- for each .scriv file we found: |
| | + | -- 1) delete previous zip file if it exists |
| | + | -- 2) zip the .scriv file |
| | + | -- 3) if we created the zip file, rename the "*.scriv" file as "*.scriv YYYYMMDD hhmmss" |
| | + | |
| | + | repeat with aRecord in scrivenerFileRecords |
| | + | if length of aRecord is greater than 0 then |
| | + | |
| | + | set scrivenerFile to aRecord |
| | + | set filePath to quoted form of scrivenerFile |
| | + | set zipFile to quoted form of (scrivenerFile & ".zip") |
| | + | |
| | + | -- if there is a previous zip file, then delete it |
| | + | set existsResults to do shell script "[ -e " & zipFile & " ] && echo 'Found' || echo 'Not found'" |
| | + | |
| | + | if (existsResults is "Found") then |
| | + | do shell script "rm -f " & filePath |
| | + | end if |
| | + | |
| | + | do shell script "zip -r " & zipFile & " " & filePath |
| | + | |
| | + | -- if the file was zipped, then rename the original file with date & time |
| | + | set existsResults to do shell script "[ -e " & zipFile & " ] && echo 'Found' || echo 'Not found'" |
| | + | |
| | + | if (existsResults is "Found") then |
| | + | set {year:y, month:m, day:d, hours:h, minutes:mi, seconds:s} to (current date) |
| | + | set dateNumber to y * 10000 + m * 100 + d |
| | + | set timeNumber to h * 10000 + mi * 100 + s |
| | + | |
| | + | set newFilePath to quoted form of (scrivenerFile & " " & dateNumber & " " & timeNumber) |
| | + | |
| | + | do shell script "mv " & filePath & " " & newFilePath |
| | + | end if |
| | + | end if |
| | + | end repeat |
| | + | |
| | + | on error errStr number errorNumber |
| | + | |
| | + | set zipErrorString to ("Zip Error: " & errStr & " number " & errorNumber) |
| | + | |
| | + | display alert zipErrorString giving up after 10 |
| | + | |
| | + | end try |
| | + | |
| | + | |
| | + | try |
| | + | -- -terse |
| | + | set resultsText to do shell script "unison /Users/houpt/uniDisk ssh://houptlab.org/uniDisk -ui text -batch -times -ignore 'Name .DS_Store'" |
| | + | |
| | + | on error errStr number errorNumber |
| | + | |
| | + | set unisonResultCodeString to (errStr & return & return & "Result: number " & errorNumber & return & return) |
| | + | |
| | + | if (errorNumber is equal to 0) then |
| | + | |
| | + | set resultsText to (unisonResultCodeString & "Successful synchronization; everything is up-to-date now") |
| | + | |
| | + | else if (errorNumber is equal to 1) then |
| | + | |
| | + | set resultsText to (unisonResultCodeString & "Some files were skipped, but all file transfers were successful.") |
| | + | |
| | + | else if (errorNumber is equal to 2) then |
| | + | |
| | + | set resultsText to (unisonResultCodeString & "Non-fatal failures occurred during file transfer.") |
| | + | |
| | + | else if (errorNumber is equal to 3) then |
| | + | |
| | + | set resultsText to (unisonResultCodeString & "A fatal error occurred, or the execution was interrupted.") |
| | + | |
| | + | else |
| | + | |
| | + | set resultsText to unisonResultCodeString |
| | + | |
| | + | end if |
| | + | |
| | + | |
| | + | end try |
| | + | |
| | + | |
| | + | display alert "Unison completed sync" giving up after 2 |
| | + | |
| | + | -- display the results text in a new TextEdit window |
| | + | tell application "TextEdit" |
| | + | activate |
| | + | set NewDoc to make new document |
| | + | if (0 is length of resultsText) then |
| | + | set text of NewDoc to (date string of (current date)) & " " & (time string of (current date)) & return & return & "Unison reports no conflicts." |
| | + | else |
| | + | set text of NewDoc to (date string of (current date)) & " " &(time string of (current date)) & return & return & resultsText |
| | + | end if |
| | + | end tell |
| | + | |
| | + | |
| | + | tell me to quit |
| | + | |
| | + | end applicationWillFinishLaunching_ |
| | + | |
| | + | on applicationShouldTerminate_(sender) |
| | + | -- Insert code here to do any housekeeping before your application quits |
| | + | return current application's NSTerminateNow |
| | + | end applicationShouldTerminate_ |
| | + | |
| | + | end script |
| | | | |
| | ==Conflicts== | | ==Conflicts== |