From d783fd1d27664ef89b8296b12945f209ea0f46a4 Mon Sep 17 00:00:00 2001 From: Dean Jackson Date: Fri, 1 Dec 2017 23:12:10 +0100 Subject: [PATCH] Update to Alfred-Workflow 1.29 --- .gitignore | 1 + ...alfredworkflow => Fixum-0.7.alfredworkflow | Bin 107441 -> 109475 bytes src/icon.png | Bin 5855 -> 3550 bytes src/info.plist | 92 +++++++------- src/workflow/background.py | 120 ++++++++++++------ src/workflow/version | 2 +- 6 files changed, 129 insertions(+), 86 deletions(-) rename Fixum-0.6.alfredworkflow => Fixum-0.7.alfredworkflow (82%) diff --git a/.gitignore b/.gitignore index d42c028..debf94a 100644 --- a/.gitignore +++ b/.gitignore @@ -60,6 +60,7 @@ Session.vim # Packages *.egg *.egg-info/ +*.dist-info/ dist/ build/ eggs/ diff --git a/Fixum-0.6.alfredworkflow b/Fixum-0.7.alfredworkflow similarity index 82% rename from Fixum-0.6.alfredworkflow rename to Fixum-0.7.alfredworkflow index 881438e5aa99a66167d4c8307b771dc5ff8415d2..0397cf07b181bd937d22a6910bb3fe0ff83dedd3 100644 GIT binary patch delta 15868 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 delta 13910 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 HU$FlV@?%T1 diff --git a/src/icon.png b/src/icon.png index e9456ea982fdedfcab83c5cf08cc46c1618667b2..ff3742f51ac34d88047625ae8e22a41778e76b73 100644 GIT binary patch delta 773 zcmcbwdrx}9Gp>53N1iT@Ar-gY-nv+L$Uwv;&}_2g^auY=7jyor(qy!oapK#&%ML83 zc6-dY&dq=yRH*yc1R5J}o3@_cTZqx%#fKRNM=m($^CbOPXwGE#|%?DgGe z8#4W1dKIuR>Y?Uh%5gAYieZWr@J8-!m^pK5{r@xX_Aj_$cKjBj&$M$3gc)`)f!&L# z168CR{mNghaf$z#RXpiQKSK)(}d zKhpzUXz(s@3e!(WJ7yMO-Ei`fWC;^PIC9WK6+Jjt)av@f(qQW0?LX2F_%S@-g87oQ zXliSPki*pnu@5*KfT2{&1dQ8ti~*&8_Qx=|FdTl*#js@_!yKj$FXQDH1P^?e&hEfs z@aHL`03%O*B}f5KSn9Isq}R9 Kb6Mw<&;$TDWx(VB delta 3097 zcmc&$YfzJC8vXL|p@|@b1Ql-(z=$nEbc+fEns^138bv@Blu)Z?2!bFOklUAdL1tB; z3Mv)_%S}L%=*l&O1W{2@Kqv@=5H6N`2-k#Ll8v^z?d*)x&UCkZe?2qLob#UdywA*Y zI#x=oxV?*Dou1u0wz`EQq+-eyvHOyRqjT9yQi`C*Svo5G)kJRn5^mM=JC?zht&b5< z?89j1btsgM$L;=(tH+OQDf35K-m`SJL4cL#Q2PrWO3}iz9VXKJr#6@s6j^D=mxPqs zG{%T5wXRe~6r7b+XKdO6LP#`@%mffW74Uzmzoh7dYakD*Tpy!W4jv_rlTUR{=M@+a zo{7mXY;sgiY%eI#pG=^QSZ$1KYG@v+$g!RxSx+jb0uP1zi<>!>;lx4npvA0%MCtYFinq0Cg6EQ~Y1cNOUw>5mkQ1Q1 zXBkbrm}G`LoF?>F(|Hn^zM*Pr7OrrV^IR7QPxnda-ULN={IjA{XTUK~Ilw9o6OB|k zLLCXDwnM~i>L&Yl0d`Vq%s6kN@AhRno9f$I6HQUaw2Iyd_Ph?u)?r!-CWz96lw$X4 zR8-%q4&y_Wo8nVH2W~jcMP4-?cT8{I^=ZRK2C{=r}`9 zw$c1#h3?J8IksA!Y-w0uLVHkiEuPyZpwF4q?Qa|fY~QvukDJJk3HNKUR^o$>*XfhA zOnijT7}NKn10*J=V8ikr^b50k4m#>Sb=BnHi-_1X#N@&q@d;4SNiYMNrAWFWN!tMj zTRITG*Ef@_?kX-%d{ZwP1^UGjqMNW1bp_kcIl4)H0|$77CE$ZXH7F0o75nktk}9oq zwQ*=owvi0whUt%lr*+zO^_eQKe~6M}*@r;2fu|2#&KS1Z3WQH}JoFa6twvpu%%MQv zRRVMDeQO+$Cj*o>m!g5JYR=3c2&T{K)x&-W#Quo++nnEOcd8!|U+VR%!%}F)qJq4{ydxQU z=f#a7Ka{$aMn;Hxr&}M)pxFHV7gk^LL_No8o}pTk!SIQ9n!hOO(LBNco>B5vmg1ExbZC}9IKa;b1#>d}V`NoPzo&h`y9MFBTzy-%=0?s5eZA=^%4Fnf?tWESG z1DPh@f~cn`B-7U066;LB0SyVxET~&!d1^s2Dsvec7;wrYgTWf|+U8eKgAR;jPMW*o zShkvfqxl~P2ecvbtiflAwspulgfKA&Nv)^(cOxIc4-VfFdn}b$I@870m7q=@Hk-COQJOk z(imBZP9pmzF##j|N0K#2W}zhldlJH5K^qAaSV%~xLHutpMg(q|O<8Ogq8^@ChuEC! z!5W#?D`3?{gKA~>#!Cyy{zHPOhd2}LeRFP1SSSYtrt|GqRF0u^G2#C8!5m{oIPgF; z+mzol%_N($DiqY^;=ouS-0x>96D^|(#ifNp9cg>Y-3zj-Moi6}_v?I$7a8#a zyOEFUXe6(I61ZsmE?JvZ(MN@cqxA#}PW0Cp1T5fxj1QXq)<&1~`gdSkc;HZ7v$S!p zNHi0+OJO^&>x*a!REP7@FiM6^Y!9}?0F36Oy$0D z1w!&{;p~$@5noLv-s}$M7}9{6bp6MIJK_N80N*b3h(XDExLz@R@b4q@dw2TP0-IO9 z?_td4`ZVirPK%`Y>Z4Kz30kTu7iFfMR!jQuV+!0riiw^mRY3AM;n0Vm@o4JWh(=Xe zOMLsorXrt_XRB)#WE+E2_jJ-b1w+kOcd5$NbJVHG40Uwb7tE|KZ8~De#2y>hfoM)x z8g4ZN-+}!cjsxp2TA9{UQYu88s6V_BP*h{{kl3H1+@h diff --git a/src/info.plist b/src/info.plist index fd782ec..38da786 100644 --- a/src/info.plist +++ b/src/info.plist @@ -48,44 +48,23 @@ config - concurrently + lastpathcomponent - escaping - 102 - script - mode=$1 -datadir="$alfred_workflow_data" -cachedir="$alfred_workflow_cache" -blacklist="${datadir}/blacklist.txt" -logfile="${cachedir}/net.deanishe.alfred.fixum.log" - -# create data & cache directories, logfile and blacklist -test -d "$cachedir" || mkdir -p "$cachedir" -test -f "$logfile" || touch "$logfile" - -test -d "$datadir" || mkdir -p "$datadir" -test -f "$blacklist" || cp blacklist.default.txt "$blacklist" - -# script actions -[[ "$mode" = dryrun ]] && /usr/bin/python fixum.py --nothing -[[ "$mode" = fix ]] && /usr/bin/python fixum.py -[[ "$mode" = blacklist ]] && open "$blacklist" -[[ "$mode" = log ]] && open -a Console "$logfile" - -exit 0 - scriptargtype - 1 - scriptfile - - type - 5 + onlyshowifquerypopulated + + removeextension + + text + {query} + title + Fixum type - alfred.workflow.action.script + alfred.workflow.output.notification uid - 97033D94-9B6F-446C-94E5-AB677B5ABB4F + 90302262-60E4-4C1C-AAEA-2A5C3F4C025A version - 2 + 1 config @@ -137,23 +116,44 @@ exit 0 config - lastpathcomponent - - onlyshowifquerypopulated - - removeextension + concurrently - text - {query} - title - Fixum + escaping + 102 + script + mode=$1 +datadir="$alfred_workflow_data" +cachedir="$alfred_workflow_cache" +blacklist="${datadir}/blacklist.txt" +logfile="${cachedir}/net.deanishe.alfred.fixum.log" + +# create data & cache directories, logfile and blacklist +test -d "$cachedir" || mkdir -p "$cachedir" +test -f "$logfile" || touch "$logfile" + +test -d "$datadir" || mkdir -p "$datadir" +test -f "$blacklist" || cp blacklist.default.txt "$blacklist" + +# script actions +[[ "$mode" = dryrun ]] && /usr/bin/python fixum.py --nothing +[[ "$mode" = fix ]] && /usr/bin/python fixum.py +[[ "$mode" = blacklist ]] && open "$blacklist" +[[ "$mode" = log ]] && open -a Console "$logfile" + +exit 0 + scriptargtype + 1 + scriptfile + + type + 5 type - alfred.workflow.output.notification + alfred.workflow.action.script uid - 90302262-60E4-4C1C-AAEA-2A5C3F4C025A + 97033D94-9B6F-446C-94E5-AB677B5ABB4F version - 1 + 2 readme @@ -185,7 +185,7 @@ It is primarily a workaround to fix bugs that are preventing the workflows from version - 0.6 + 0.7 webaddress diff --git a/src/workflow/background.py b/src/workflow/background.py index a382000..cd5400b 100644 --- a/src/workflow/background.py +++ b/src/workflow/background.py @@ -19,6 +19,7 @@ from __future__ import print_function, unicode_literals +import signal import sys import os import subprocess @@ -82,6 +83,31 @@ def _process_exists(pid): return True +def _job_pid(name): + """Get PID of job or `None` if job does not exist. + + Args: + name (str): Name of job. + + Returns: + int: PID of job process (or `None` if job doesn't exist). + """ + pidfile = _pid_file(name) + if not os.path.exists(pidfile): + return + + with open(pidfile, 'rb') as fp: + pid = int(fp.read()) + + if _process_exists(pid): + return pid + + try: + os.unlink(pidfile) + except Exception: # pragma: no cover + pass + + def is_running(name): """Test whether task ``name`` is currently running. @@ -91,26 +117,18 @@ def is_running(name): :rtype: bool """ - pidfile = _pid_file(name) - if not os.path.exists(pidfile): - return False - - with open(pidfile, 'rb') as file_obj: - pid = int(file_obj.read().strip()) - - if _process_exists(pid): + if _job_pid(name) is not None: return True - elif os.path.exists(pidfile): - os.unlink(pidfile) - return False -def _background(stdin='/dev/null', stdout='/dev/null', +def _background(pidfile, stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'): # pragma: no cover """Fork the current process into a background daemon. + :param pidfile: file to write PID of daemon process to. + :type pidfile: filepath :param stdin: where to read input :type stdin: filepath :param stdout: where to write stdout output @@ -119,24 +137,31 @@ def _background(stdin='/dev/null', stdout='/dev/null', :type stderr: filepath """ - def _fork_and_exit_parent(errmsg): + def _fork_and_exit_parent(errmsg, wait=False, write=False): try: pid = os.fork() if pid > 0: + if write: # write PID of child process to `pidfile` + tmp = pidfile + '.tmp' + with open(tmp, 'wb') as fp: + fp.write(str(pid)) + os.rename(tmp, pidfile) + if wait: # wait for child process to exit + os.waitpid(pid, 0) os._exit(0) except OSError as err: _log().critical('%s: (%d) %s', errmsg, err.errno, err.strerror) raise err - # Do first fork. - _fork_and_exit_parent('fork #1 failed') + # Do first fork and wait for second fork to finish. + _fork_and_exit_parent('fork #1 failed', wait=True) # Decouple from parent environment. os.chdir(wf().workflowdir) os.setsid() - # Do second fork. - _fork_and_exit_parent('fork #2 failed') + # Do second fork and write PID to pidfile. + _fork_and_exit_parent('fork #2 failed', write=True) # Now I am a daemon! # Redirect standard file descriptors. @@ -151,10 +176,30 @@ def _fork_and_exit_parent(errmsg): os.dup2(se.fileno(), sys.stderr.fileno()) +def kill(name, sig=signal.SIGTERM): + """Send a signal to job ``name`` via :func:`os.kill`. + + .. versionadded:: 1.29 + + Args: + name (str): Name of the job + sig (int, optional): Signal to send (default: SIGTERM) + + Returns: + bool: `False` if job isn't running, `True` if signal was sent. + """ + pid = _job_pid(name) + if pid is None: + return False + + os.kill(pid, sig) + return True + + def run_in_background(name, args, **kwargs): r"""Cache arguments then call this script again via :func:`subprocess.call`. - :param name: name of task + :param name: name of job :type name: unicode :param args: arguments passed as first argument to :func:`subprocess.call` :param \**kwargs: keyword arguments to :func:`subprocess.call` @@ -183,18 +228,20 @@ def run_in_background(name, args, **kwargs): argcache = _arg_cache(name) # Cache arguments - with open(argcache, 'wb') as file_obj: - pickle.dump({'args': args, 'kwargs': kwargs}, file_obj) + with open(argcache, 'wb') as fp: + pickle.dump({'args': args, 'kwargs': kwargs}, fp) _log().debug('[%s] command cached: %s', name, argcache) # Call this script cmd = ['/usr/bin/python', __file__, name] _log().debug('[%s] passing job to background runner: %r', name, cmd) retcode = subprocess.call(cmd) + if retcode: # pragma: no cover - _log().error('[%s] background runner failed with %d', retcode) + _log().error('[%s] background runner failed with %d', name, retcode) else: _log().debug('[%s] background job started', name) + return retcode @@ -209,12 +256,17 @@ def main(wf): # pragma: no cover name = wf.args[0] argcache = _arg_cache(name) if not os.path.exists(argcache): - log.critical('[%s] command cache not found: %r', name, argcache) - return 1 + msg = '[{0}] command cache not found: {1}'.format(name, argcache) + log.critical(msg) + raise IOError(msg) + + # Fork to background and run command + pidfile = _pid_file(name) + _background(pidfile) # Load cached arguments - with open(argcache, 'rb') as file_obj: - data = pickle.load(file_obj) + with open(argcache, 'rb') as fp: + data = pickle.load(fp) # Cached arguments args = data['args'] @@ -223,28 +275,18 @@ def main(wf): # pragma: no cover # Delete argument cache file os.unlink(argcache) - pidfile = _pid_file(name) - - # Fork to background - _background() - - # Write PID to file - with open(pidfile, 'wb') as file_obj: - file_obj.write(str(os.getpid())) - - # Run the command try: + # Run the command log.debug('[%s] running command: %r', name, args) retcode = subprocess.call(args, **kwargs) if retcode: log.error('[%s] command failed with status %d', name, retcode) - finally: - if os.path.exists(pidfile): - os.unlink(pidfile) - log.debug('[%s] job complete', name) + os.unlink(pidfile) + + log.debug('[%s] job complete', name) if __name__ == '__main__': # pragma: no cover diff --git a/src/workflow/version b/src/workflow/version index e787e4c..476d2ce 100644 --- a/src/workflow/version +++ b/src/workflow/version @@ -1 +1 @@ -1.28.1 \ No newline at end of file +1.29 \ No newline at end of file