Created
June 21, 2019 13:34
-
-
Save CharlesB2/0f86b217c4acf8176fe060c5169ec981 to your computer and use it in GitHub Desktop.
Revisions
-
CharlesB2 created this gist
Jun 21, 2019 .There are no files selected for viewing
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 charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,110 @@ #!/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'/home/charles/bin/clion-2018.2/bin/clion.sh' CONFIG_PATH = u'/home/charles/.CLion2018.2/config' SYSTEM_PATH = u'/home/charles/.CLion2018.2/system' 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 try: with open(port_path) as pf: port = int(pf.read()) with open(token_path) as tf: token = tf.read() except (ValueError): return False 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('/usr/bin/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)