Created
August 2, 2017 12:05
-
-
Save AlJohri/67565210406871d4ac25c5bf5834d239 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env python | |
| # -*- coding: utf-8 -*- | |
| import socket | |
| import struct | |
| import sys | |
| import os | |
| import time | |
| # see com.intellij.idea.SocketLock for the server side of this interface | |
| RUN_PATH = u'/Applications/PyCharm CE.app' | |
| CONFIG_PATH = u'/Users/johria/Library/Preferences/PyCharmCE2017.1' | |
| SYSTEM_PATH = u'/Users/johria/Library/Caches/PyCharmCE2017.1' | |
| def print_usage(cmd): | |
| print(('Usage:\n' + | |
| ' {0} -h | -? | --help\n' + | |
| ' {0} [project_dir]\n' + | |
| ' {0} [-l|--line line] [project_dir|--temp-project] file[:line]\n' + | |
| ' {0} diff <left> <right>\n' + | |
| ' {0} merge <local> <remote> [base] <merged>').format(cmd)) | |
| def process_args(argv): | |
| args = [] | |
| skip_next = False | |
| for i, arg in enumerate(argv[1:]): | |
| if arg == '-h' or arg == '-?' or arg == '--help': | |
| print_usage(argv[0]) | |
| exit(0) | |
| elif i == 0 and (arg == 'diff' or arg == 'merge' or arg == '--temp-project'): | |
| args.append(arg) | |
| elif arg == '-l' or arg == '--line': | |
| args.append(arg) | |
| skip_next = True | |
| elif skip_next: | |
| args.append(arg) | |
| skip_next = False | |
| else: | |
| path = arg | |
| if ':' in arg: | |
| file_path, line_number = arg.rsplit(':', 1) | |
| if line_number.isdigit(): | |
| args.append('-l') | |
| args.append(line_number) | |
| path = file_path | |
| args.append(os.path.abspath(path)) | |
| return args | |
| def try_activate_instance(args): | |
| port_path = os.path.join(CONFIG_PATH, 'port') | |
| token_path = os.path.join(SYSTEM_PATH, 'token') | |
| if not (os.path.exists(port_path) and os.path.exists(token_path)): | |
| return False | |
| with open(port_path) as pf: | |
| port = int(pf.read()) | |
| with open(token_path) as tf: | |
| token = tf.read() | |
| s = socket.socket() | |
| s.settimeout(0.3) | |
| try: | |
| s.connect(('127.0.0.1', port)) | |
| except (socket.error, IOError): | |
| return False | |
| found = False | |
| while True: | |
| try: | |
| path_len = struct.unpack('>h', s.recv(2))[0] | |
| path = s.recv(path_len).decode('utf-8') | |
| if os.path.abspath(path) == os.path.abspath(CONFIG_PATH): | |
| found = True | |
| break | |
| except (socket.error, IOError): | |
| return False | |
| if found: | |
| cmd = 'activate ' + token + '\0' + os.getcwd() + '\0' + '\0'.join(args) | |
| if sys.version_info.major >= 3: cmd = cmd.encode('utf-8') | |
| encoded = struct.pack('>h', len(cmd)) + cmd | |
| s.send(encoded) | |
| time.sleep(0.5) # don't close the socket immediately | |
| return True | |
| return False | |
| def start_new_instance(args): | |
| if sys.platform == 'darwin': | |
| if len(args) > 0: | |
| args.insert(0, '--args') | |
| os.execvp('open', ['-a', RUN_PATH] + args) | |
| else: | |
| bin_file = os.path.split(RUN_PATH)[1] | |
| os.execv(RUN_PATH, [bin_file] + args) | |
| ide_args = process_args(sys.argv) | |
| if not try_activate_instance(ide_args): | |
| start_new_instance(ide_args) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment