| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- import warnings
- import os
- import platform
- import subprocess
- import time
- import threading
- # Ignore specific SyntaxWarning
- warnings.filterwarnings("ignore", category=SyntaxWarning, module="DrissionPage")
- CURSOR_LOGO = """
- ██████╗██╗ ██╗██████╗ ███████╗ ██████╗ ██████╗
- ██╔════╝██║ ██║██╔══██╗██╔════╝██╔═══██╗██╔══██╗
- ██║ ██║ ██║██████╔╝███████╗██║ ██║██████╔╝
- ██║ ██║ ██║██╔══██╗╚════██║██║ ██║██╔══██╗
- ╚██████╗╚██████╔╝██║ ██║███████║╚██████╔╝██║ ██║
- ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═╝ ╚═╝
- """
- class LoadingAnimation:
- def __init__(self):
- self.is_running = False
- self.animation_thread = None
- def start(self, message="Building"):
- self.is_running = True
- self.animation_thread = threading.Thread(target=self._animate, args=(message,))
- self.animation_thread.start()
- def stop(self):
- self.is_running = False
- if self.animation_thread:
- self.animation_thread.join()
- print("\r" + " " * 70 + "\r", end="", flush=True) # Clear the line
- def _animate(self, message):
- animation = "|/-\\"
- idx = 0
- while self.is_running:
- print(f"\r{message} {animation[idx % len(animation)]}", end="", flush=True)
- idx += 1
- time.sleep(0.1)
- def print_logo():
- print("\033[96m" + CURSOR_LOGO + "\033[0m")
- print("\033[93m" + "Building Cursor Keep Alive...".center(56) + "\033[0m\n")
- def progress_bar(progress, total, prefix="", length=50):
- filled = int(length * progress // total)
- bar = "█" * filled + "░" * (length - filled)
- percent = f"{100 * progress / total:.1f}"
- print(f"\r{prefix} |{bar}| {percent}% Complete", end="", flush=True)
- if progress == total:
- print()
- def simulate_progress(message, duration=1.0, steps=20):
- print(f"\033[94m{message}\033[0m")
- for i in range(steps + 1):
- time.sleep(duration / steps)
- progress_bar(i, steps, prefix="Progress:", length=40)
- def filter_output(output):
- """ImportantMessage"""
- if not output:
- return ""
- important_lines = []
- for line in output.split("\n"):
- # Only keep lines containing specific keywords
- if any(
- keyword in line.lower()
- for keyword in ["error:", "failed:", "completed", "directory:"]
- ):
- important_lines.append(line)
- return "\n".join(important_lines)
- def build():
- # Clear screen
- os.system("cls" if platform.system().lower() == "windows" else "clear")
- # Print logo
- print_logo()
- system = platform.system().lower()
- spec_file = os.path.join("CursorKeepAlive.spec")
- # if system not in ["darwin", "windows"]:
- # print(f"\033[91mUnsupported operating system: {system}\033[0m")
- # return
- output_dir = f"dist/{system if system != 'darwin' else 'mac'}"
- # Create output directory
- os.makedirs(output_dir, exist_ok=True)
- simulate_progress("Creating output directory...", 0.5)
- # Run PyInstaller with loading animation
- pyinstaller_command = [
- "pyinstaller",
- spec_file,
- "--distpath",
- output_dir,
- "--workpath",
- f"build/{system}",
- "--noconfirm",
- ]
- loading = LoadingAnimation()
- try:
- simulate_progress("Running PyInstaller...", 2.0)
- loading.start("Building in progress")
- result = subprocess.run(
- pyinstaller_command, check=True, capture_output=True, text=True
- )
- loading.stop()
- if result.stderr:
- filtered_errors = [
- line
- for line in result.stderr.split("\n")
- if any(
- keyword in line.lower()
- for keyword in ["error:", "failed:", "completed", "directory:"]
- )
- ]
- if filtered_errors:
- print("\033[93mBuild Warnings/Errors:\033[0m")
- print("\n".join(filtered_errors))
- except subprocess.CalledProcessError as e:
- loading.stop()
- print(f"\033[91mBuild failed with error code {e.returncode}\033[0m")
- if e.stderr:
- print("\033[91mError Details:\033[0m")
- print(e.stderr)
- return
- except FileNotFoundError:
- loading.stop()
- print(
- "\033[91mError: Please ensure PyInstaller is installed (pip install pyinstaller)\033[0m"
- )
- return
- except KeyboardInterrupt:
- loading.stop()
- print("\n\033[91mBuild cancelled by user\033[0m")
- return
- finally:
- loading.stop()
- # Copy config file
- if os.path.exists("config.ini.example"):
- simulate_progress("Copying configuration file...", 0.5)
- if system == "windows":
- subprocess.run(
- ["copy", "config.ini.example", f"{output_dir}\\config.ini"], shell=True
- )
- else:
- subprocess.run(["cp", "config.ini.example", f"{output_dir}/config.ini"])
- # Copy .env.example file
- if os.path.exists(".env.example"):
- simulate_progress("Copying environment file...", 0.5)
- if system == "windows":
- subprocess.run(["copy", ".env.example", f"{output_dir}\\.env"], shell=True)
- else:
- subprocess.run(["cp", ".env.example", f"{output_dir}/.env"])
- print(
- f"\n\033[92mBuild completed successfully! Output directory: {output_dir}\033[0m"
- )
- if __name__ == "__main__":
- build()
|