8 Commits
Author SHA1 Message Date
seung6lee c8e663fd91 add codex 2026-08-25 07:54:05 +09:00
seung6lee ae452038e7 add mactex & claude-code 2026-08-24 22:37:59 +09:00
seung6lee 825fd81ca7 edit apps.csv 2026-08-18 11:55:39 +09:00
seung6lee 08cc0e7e5a add draw.io 2026-08-04 23:32:49 +09:00
Seungjun Lee 6f7ec6e245 remove texty from auto installing 2026-08-01 07:29:00 +09:00
Seungjun Lee 100fe99f94 add even-better-toml vscode extension 2026-07-30 09:42:01 +09:00
Seungjun Lee a959fdfead add tmux 2026-07-25 22:50:35 +09:00
Seungjun Lee e5ba30d4d1 format code & add todo 2026-07-25 22:50:05 +09:00
3 changed files with 230 additions and 184 deletions
+1
View File
@@ -2,3 +2,4 @@
Todo:
☐ Make dependency not hardcoded
☐ Pass depencency detect if package is in list
☐ add type in brewfile_tool.py
+64 -52
View File
@@ -1,59 +1,75 @@
name,type,mas_id,install_on_setup,category,description,price
rcmd,cask,,yes,personalization,Keyboard based app switcher,paid
ente-auth,cask,,yes,security,Free secure two-factor auth service,free
android-platform-tools,cask,,no,utilities,ADB tools,free
sozercan/repo/kaset,cask,,yes,media,MacOS YTM client,free
latest,cask,,yes,utilities,Check all app update,free
localsend,cask,,no,network,Share file between devices,free
modern-csv,cask,,no,development,CSV viewer for large file,free
motrix,cask,,no,network,Torrent download client,free
orbstack,cask,,yes,development,Docker replacement,free
pika,cask,,yes,utilities,Color picker,free
timescribe,cask,,yes,productivity,Time and App usage tracker,free
warp,cask,,yes,development,Best Terminal,free
fluent-reader,cask,,yes,productivity,RSS Reader,free
lunacy,cask,,yes,creativity,Figma alternative,free
zen,cask,,yes,productivity,Firefox based main browser,free
opencloud,cask,,yes,network,Opencloud desktop client,free
raycast,cask,,yes,personalization,Superior version of spotlight,free
claude,cask,,yes,ai,Claude desktop client,free
lookaway,cask,,yes,personalization,Eye protection,paid
notion,cask,,yes,knowledge,Notion desktop client,free
visual-studio-code,cask,,yes,development,Code editor,free
maccy,cask,,yes,personalization,Clipboard manager,free
iina,cask,,yes,media,Media player,free
itsycal,cask,,yes,personalization,Menubar calendar app,free
sidenotes,cask,,yes,knowledge,Sidepanel note app,paid
rectangle,cask,,yes,personalization,Window management tool,free
karabiner-elements,cask,,yes,personalization,Keyboard customization tool,free
zotero,cask,,no,knowledge,Reference organize tool,free
affine,cask,,yes,knowledge,Opensource notion alternative,free
affinity,cask,,yes,creativity,Photoshop alternative by canva,free
android-platform-tools,cask,,no,utilities,ADB tools,free
android-studio,cask,,no,development,Tools for building Android applications,free
appcleaner,cask,,yes,utilities,Remove app without residue,free
arduino-ide,cask,,no,development,Arduino IDE,free
claude,cask,,yes,ai,Claude desktop client,free
claude-code,cask,,no,productivity,llm agent,free
clop,cask,,yes,personalization,File compressor,free
cloudflare-warp,cask,,no,network,Bypass https lock,free
codex,cask,,ne,productivity,llm agent,free
discord,cask,,yes,social,Discord desktop client,free
shifty,cask,,yes,personalization,Night shift adjust tool,free
drawio,cask,,no,development,Diagram design,free
ente-auth,cask,,yes,security,Free secure two-factor auth service,free
fluent-reader,cask,,yes,productivity,RSS Reader,free
iina,cask,,yes,media,Media player,free
insomnia,cask,,yes,development,API tester,free
itsycal,cask,,yes,personalization,Menubar calendar app,free
karabiner-elements,cask,,yes,personalization,Keyboard customization tool,free
keka,cask,,yes,utilities,File extraction enhancer,free
keyboardcleantool,cask,,yes,utilities,Lock keyboard input during cleaning,free
appcleaner,cask,,yes,utilities,Remove app without residue,free
latest,cask,,yes,utilities,Check all app update,free
localsend,cask,,no,network,Share file between devices,free
lookaway,cask,,yes,personalization,Eye protection,paid
lunacy,cask,,yes,creativity,Figma alternative,free
maccy,cask,,yes,personalization,Clipboard manager,free
mactex,cask,,yes,productivity,Latex integration,free
modern-csv,cask,,no,development,CSV viewer for large file,free
monitorcontrol,cask,,yes,personalization,Control external monitor brightness,free
tunnelbear,cask,,yes,network,VPN,free
arduino-ide,cask,,no,development,Arduino IDE,free
clop,cask,,yes,personalization,File compressor,free
insomnia,cask,,yes,development,API tester,free
motrix,cask,,no,network,Torrent download client,free
notion,cask,,yes,knowledge,Notion desktop client,free
obsidian,cask,,yes,knowledge,Knowledge management tool,free
opencloud,cask,,yes,network,Opencloud desktop client,free
openmtp,cask,,yes,utilities,Android device connector,free
orbstack,cask,,yes,development,Docker replacement,free
pika,cask,,yes,utilities,Color picker,free
quarto,cask,,no,utilities,File converter,free
raycast,cask,,yes,personalization,Superior version of spotlight,free
rcmd,cask,,yes,personalization,Keyboard based app switcher,paid
rectangle,cask,,yes,personalization,Window management tool,free
responsively,cask,,no,development,Browser for responsible website development,free
shifty,cask,,yes,personalization,Night shift adjust tool,free
sidenotes,cask,,yes,knowledge,Sidepanel note app,paid
sozercan/repo/kaset,cask,,yes,media,MacOS YTM client,free
telegram,cask,,yes,social,Telegram desktop client,free
wireshark-app,cask,,no,network,Network packets capturer,free
git,formula,,yes,development,File version manager,free
mole,formula,,yes,utilities,System optimizer,free
fastfetch,formula,,yes,utilities,Neofetch alternative,free
mas,formula,,yes,utilities,CLI appstore,free
tree,formula,,yes,utilities,File structure tree,free
scrcpy,formula,,no,utilities,Android screen mirroring,free
thaw,cask,,yes,personalization,Menubar hidder,free
timescribe,cask,,yes,productivity,Time and App usage tracker,free
tunnelbear,cask,,yes,network,VPN,free
visual-studio-code,cask,,yes,development,Code editor,free
warp,cask,,yes,development,Best Terminal,free
wireshark-app,cask,,no,network,Network packets capturer,free
zen,cask,,yes,productivity,Firefox based main browser,free
zotero,cask,,no,knowledge,Reference organize tool,free
caddy,formula,,no,network,Reverse proxy,free
fastfetch,formula,,yes,utilities,Neofetch alternative,free
git,formula,,yes,development,File version manager,free
mas,formula,,yes,utilities,CLI appstore,free
mise,formula,,yes,development,Package version manager,free
mole,formula,,yes,utilities,System optimizer,free
nmap,formula,,no,network,Network scanner,free
scrcpy,formula,,no,utilities,Android screen mirroring,free
tmux,formula,,yes,development,Terminal multiplexer,free
tree,formula,,yes,utilities,File structure tree,free
typst,formula,,no,utilities,Markup writing system,free
uv,formula,,yes,development,Python virtual environment,free
wget,formula,,yes,utilities,File downloader,free
davinci resolve ,manual,,no,creativity,Video editor,free
tageditor,mas,984278082,no,utilities,Audio file metadata editor,free
droppy,manual,,no,personalization,Notch customization,paid
Microsoft excel,manual,,no,productivity,Microsoft excel,paid
Microsoft powerpoint,manual,,no,productivity,Microsoft powerpoint,paid
Microsoft word,manual,,no,productivity,Microsoft word,paid
Allkdic,mas,1033453958,yes,productivity,Menubar dictionary,free
Bitwarden,mas,1352778147,yes,security,Password manager,free
Hancom Office HWP Viewer,mas,416746898,yes,productivity,Hancom Office HWP Viewer,free
@@ -62,12 +78,14 @@ Linearity Curve,mas,1219074514,no,creativity,Vector based design tool,free
Poolsuite FM,mas,1514817810,no,media,Internet music radio,free
Print to PDF,mas,1639234272,yes,utilities,Save pdf to file,free
RunCat Neo,mas,6757801838,yes,personalization,Menubar system usage visualizer,free
Texty,mas,1538996043,yes,social,Third-party google chat desktop client,free
tageditor,mas,984278082,no,utilities,Audio file metadata editor,free
Texty,mas,1538996043,no,social,Third-party google chat desktop client,free
Windows App,mas,1295203466,yes,productivity,Windows RDP client,free
WireGuard,mas,1451685025,yes,network,Wireguard client,free
Xcode,mas,497799835,no,development,Xcode,free
anthropic.claude-code,vscode,,yes,tool,Claude integration,free
bierner.markdown-mermaid,vscode,,yes,integration,Support mermaid,free
charliermarsh.ruff,vscode,,yes,format,Python formatter,free
esbenp.prettier-vscode,vscode,,yes,format,Formatter,free
fabiospampinato.vscode-todo-plus,vscode,,yes,tool,Todo management,free
formulahendry.code-runner,vscode,,yes,tool,Code runner with shortcuts support,free
@@ -77,8 +95,8 @@ marp-team.marp-vscode,vscode,,no,integration,Support marp(MD based presentation)
matt-meyers.vscode-dbml,vscode,,yes,integration,Support DBML,free
mechatroner.rainbow-csv,vscode,,yes,format,CSV highlighter,free
ms-azuretools.vscode-containers,vscode,,yes,tool,Container tool,free
ms-python.python,vscode,,yes,language,Python integration,free
ms-python.debugpy,vscode,,yes,language,Dependency of ms-python.python,free
ms-python.python,vscode,,yes,language,Python integration,free
ms-python.vscode-pylance,vscode,,yes,language,Dependency of ms-python.python,free
ms-python.vscode-python-envs,vscode,,yes,language,Dependency of ms-python.python,free
ms-vscode-remote.remote-ssh,vscode,,yes,tool,SSH conntection,free
@@ -86,17 +104,11 @@ ms-vscode-remote.remote-ssh-edit,vscode,,yes,tool,Dependency of ms-vscode-remote
ms-vscode.remote-explorer,vscode,,yes,tool,Dependency of ms-vscode-remote.remote-ssh,free
pkief.material-icon-theme,vscode,,yes,theme,Best icon,free
pkief.material-product-icons,vscode,,yes,theme,Best product icon,free
pomdtr.excalidraw-editor,vscode,,no,integration,Excalidraw integration,free
pomdtr.excalidraw-editor,vscode,,yes,integration,Excalidraw integration,free
rickaym.manim-sideview,vscode,,no,integration,Manim integration,free
ritwickdey.liveserver,vscode,,no,tool,Web frontend live server,free
svelte.svelte-vscode,vscode,,yes,language,Sevelte integration,free
tamasfe.even-better-toml,vscode,,yes,language,TOML integration,free
wayou.vscode-todo-highlight,vscode,,yes,tool,Todo file highlighter,free
yzhang.markdown-all-in-one,vscode,,yes,language,Markdown highlighter & formatter,free
zhuangtongfa.material-theme,vscode,,yes,theme,Best darkmode theme (One Dark Pro),free
charliermarsh.ruff,vscode,,yes,format,Python formatter,free
droppy,manual,,no,personalization,Notch customization,paid
Microsoft word,manual,,no,productivity,Microsoft word,paid
Microsoft excel,manual,,no,productivity,Microsoft excel,paid
Microsoft powerpoint,manual,,no,productivity,Microsoft powerpoint,paid
wget,formula,,yes,utilities,File downloader,free
mise,formula,,yes,development,Package version manager,free
1 name type mas_id install_on_setup category description price
rcmd cask yes personalization Keyboard based app switcher paid
ente-auth cask yes security Free secure two-factor auth service free
android-platform-tools cask no utilities ADB tools free
sozercan/repo/kaset cask yes media MacOS YTM client free
latest cask yes utilities Check all app update free
localsend cask no network Share file between devices free
modern-csv cask no development CSV viewer for large file free
motrix cask no network Torrent download client free
orbstack cask yes development Docker replacement free
pika cask yes utilities Color picker free
timescribe cask yes productivity Time and App usage tracker free
warp cask yes development Best Terminal free
fluent-reader cask yes productivity RSS Reader free
lunacy cask yes creativity Figma alternative free
zen cask yes productivity Firefox based main browser free
opencloud cask yes network Opencloud desktop client free
raycast cask yes personalization Superior version of spotlight free
claude cask yes ai Claude desktop client free
lookaway cask yes personalization Eye protection paid
notion cask yes knowledge Notion desktop client free
visual-studio-code cask yes development Code editor free
maccy cask yes personalization Clipboard manager free
iina cask yes media Media player free
itsycal cask yes personalization Menubar calendar app free
sidenotes cask yes knowledge Sidepanel note app paid
rectangle cask yes personalization Window management tool free
karabiner-elements cask yes personalization Keyboard customization tool free
zotero cask no knowledge Reference organize tool free
2 affine cask yes knowledge Opensource notion alternative free
3 affinity cask yes creativity Photoshop alternative by canva free
4 android-platform-tools cask no utilities ADB tools free
5 android-studio cask no development Tools for building Android applications free
6 appcleaner cask yes utilities Remove app without residue free
7 arduino-ide cask no development Arduino IDE free
8 claude cask yes ai Claude desktop client free
9 claude-code cask no productivity llm agent free
10 clop cask yes personalization File compressor free
11 cloudflare-warp cask no network Bypass https lock free
12 codex cask ne productivity llm agent free
13 discord cask yes social Discord desktop client free
14 shifty drawio cask yes no personalization development Night shift adjust tool Diagram design free
15 ente-auth cask yes security Free secure two-factor auth service free
16 fluent-reader cask yes productivity RSS Reader free
17 iina cask yes media Media player free
18 insomnia cask yes development API tester free
19 itsycal cask yes personalization Menubar calendar app free
20 karabiner-elements cask yes personalization Keyboard customization tool free
21 keka cask yes utilities File extraction enhancer free
22 keyboardcleantool cask yes utilities Lock keyboard input during cleaning free
23 appcleaner latest cask yes utilities Remove app without residue Check all app update free
24 localsend cask no network Share file between devices free
25 lookaway cask yes personalization Eye protection paid
26 lunacy cask yes creativity Figma alternative free
27 maccy cask yes personalization Clipboard manager free
28 mactex cask yes productivity Latex integration free
29 modern-csv cask no development CSV viewer for large file free
30 monitorcontrol cask yes personalization Control external monitor brightness free
31 tunnelbear motrix cask yes no network VPN Torrent download client free
32 arduino-ide notion cask no yes development knowledge Arduino IDE Notion desktop client free
clop cask yes personalization File compressor free
insomnia cask yes development API tester free
33 obsidian cask yes knowledge Knowledge management tool free
34 opencloud cask yes network Opencloud desktop client free
35 openmtp cask yes utilities Android device connector free
36 orbstack cask yes development Docker replacement free
37 pika cask yes utilities Color picker free
38 quarto cask no utilities File converter free
39 raycast cask yes personalization Superior version of spotlight free
40 rcmd cask yes personalization Keyboard based app switcher paid
41 rectangle cask yes personalization Window management tool free
42 responsively cask no development Browser for responsible website development free
43 shifty cask yes personalization Night shift adjust tool free
44 sidenotes cask yes knowledge Sidepanel note app paid
45 sozercan/repo/kaset cask yes media MacOS YTM client free
46 telegram cask yes social Telegram desktop client free
wireshark-app cask no network Network packets capturer free
git formula yes development File version manager free
mole formula yes utilities System optimizer free
fastfetch formula yes utilities Neofetch alternative free
mas formula yes utilities CLI appstore free
tree formula yes utilities File structure tree free
scrcpy formula no utilities Android screen mirroring free
47 thaw cask yes personalization Menubar hidder free
48 timescribe cask yes productivity Time and App usage tracker free
49 tunnelbear cask yes network VPN free
50 visual-studio-code cask yes development Code editor free
51 warp cask yes development Best Terminal free
52 wireshark-app cask no network Network packets capturer free
53 zen cask yes productivity Firefox based main browser free
54 zotero cask no knowledge Reference organize tool free
55 caddy formula no network Reverse proxy free
56 fastfetch formula yes utilities Neofetch alternative free
57 git formula yes development File version manager free
58 mas formula yes utilities CLI appstore free
59 mise formula yes development Package version manager free
60 mole formula yes utilities System optimizer free
61 nmap formula no network Network scanner free
62 scrcpy formula no utilities Android screen mirroring free
63 tmux formula yes development Terminal multiplexer free
64 tree formula yes utilities File structure tree free
65 typst formula no utilities Markup writing system free
66 uv formula yes development Python virtual environment free
67 wget formula yes utilities File downloader free
68 davinci resolve manual no creativity Video editor free
69 tageditor droppy mas manual 984278082 no utilities personalization Audio file metadata editor Notch customization free paid
70 Microsoft excel manual no productivity Microsoft excel paid
71 Microsoft powerpoint manual no productivity Microsoft powerpoint paid
72 Microsoft word manual no productivity Microsoft word paid
73 Allkdic mas 1033453958 yes productivity Menubar dictionary free
74 Bitwarden mas 1352778147 yes security Password manager free
75 Hancom Office HWP Viewer mas 416746898 yes productivity Hancom Office HWP Viewer free
78 Poolsuite FM mas 1514817810 no media Internet music radio free
79 Print to PDF mas 1639234272 yes utilities Save pdf to file free
80 RunCat Neo mas 6757801838 yes personalization Menubar system usage visualizer free
81 Texty tageditor mas 1538996043 984278082 yes no social utilities Third-party google chat desktop client Audio file metadata editor free
82 Texty mas 1538996043 no social Third-party google chat desktop client free
83 Windows App mas 1295203466 yes productivity Windows RDP client free
84 WireGuard mas 1451685025 yes network Wireguard client free
85 Xcode mas 497799835 no development Xcode free
86 anthropic.claude-code vscode yes tool Claude integration free
87 bierner.markdown-mermaid vscode yes integration Support mermaid free
88 charliermarsh.ruff vscode yes format Python formatter free
89 esbenp.prettier-vscode vscode yes format Formatter free
90 fabiospampinato.vscode-todo-plus vscode yes tool Todo management free
91 formulahendry.code-runner vscode yes tool Code runner with shortcuts support free
95 matt-meyers.vscode-dbml vscode yes integration Support DBML free
96 mechatroner.rainbow-csv vscode yes format CSV highlighter free
97 ms-azuretools.vscode-containers vscode yes tool Container tool free
ms-python.python vscode yes language Python integration free
98 ms-python.debugpy vscode yes language Dependency of ms-python.python free
99 ms-python.python vscode yes language Python integration free
100 ms-python.vscode-pylance vscode yes language Dependency of ms-python.python free
101 ms-python.vscode-python-envs vscode yes language Dependency of ms-python.python free
102 ms-vscode-remote.remote-ssh vscode yes tool SSH conntection free
104 ms-vscode.remote-explorer vscode yes tool Dependency of ms-vscode-remote.remote-ssh free
105 pkief.material-icon-theme vscode yes theme Best icon free
106 pkief.material-product-icons vscode yes theme Best product icon free
107 pomdtr.excalidraw-editor vscode no yes integration Excalidraw integration free
108 rickaym.manim-sideview vscode no integration Manim integration free
109 ritwickdey.liveserver vscode no tool Web frontend live server free
110 svelte.svelte-vscode vscode yes language Sevelte integration free
111 tamasfe.even-better-toml vscode yes language TOML integration free
112 wayou.vscode-todo-highlight vscode yes tool Todo file highlighter free
113 yzhang.markdown-all-in-one vscode yes language Markdown highlighter & formatter free
114 zhuangtongfa.material-theme vscode yes theme Best darkmode theme (One Dark Pro) free
charliermarsh.ruff vscode yes format Python formatter free
droppy manual no personalization Notch customization paid
Microsoft word manual no productivity Microsoft word paid
Microsoft excel manual no productivity Microsoft excel paid
Microsoft powerpoint manual no productivity Microsoft powerpoint paid
wget formula yes utilities File downloader free
mise formula yes development Package version manager free
+113 -80
View File
@@ -1,25 +1,47 @@
import csv
import subprocess
import shutil
import datetime
import sys
import re
import shutil
import subprocess
import sys
# ====== Config ======
CSV_FILE = './apps.csv'
BREWFILE = './Brewfile'
CSV_FILE = "./apps.csv"
BREWFILE = "./Brewfile"
SUPPORT_CONFIG = {
'formula': {'token': 'brew', 'structure': lambda data: f'brew "{data["name"]}"', 'dependency': [] },
'cask' : {'token': 'cask', 'structure': lambda data: f'cask "{data["name"]}"', 'dependency': [] },
'mas': {'token': 'mas', 'structure': lambda data: f'mas "{data["name"]}", id: {data["mas_id"]}', 'dependency': [{'name': 'mas', 'script': ['brew', 'install', 'mas']}] },
'vscode': {'token': 'vscode', 'structure': lambda data: f'vscode "{data["name"]}"', 'dependency': [{'name': 'code', 'script': ['brew', 'install', '--cask', 'visual-studio-code']}] }
"formula": {
"token": "brew",
"structure": lambda data: f'brew "{data["name"]}"',
"dependency": [],
},
"cask": {
"token": "cask",
"structure": lambda data: f'cask "{data["name"]}"',
"dependency": [],
},
"mas": {
"token": "mas",
"structure": lambda data: f'mas "{data["name"]}", id: {data["mas_id"]}',
"dependency": [{"name": "mas", "script": ["brew", "install", "mas"]}],
},
"vscode": {
"token": "vscode",
"structure": lambda data: f'vscode "{data["name"]}"',
"dependency": [
{
"name": "code",
"script": ["brew", "install", "--cask", "visual-studio-code"],
}
MANUAL_TYPE = 'manual'
],
},
}
MANUAL_TYPE = "manual"
support_types = list(SUPPORT_CONFIG.keys())
def clear():
subprocess.run(['clear'])
subprocess.run(["clear"])
def check_package(name):
@@ -28,28 +50,32 @@ def check_package(name):
return False
return True
def check_brew():
if not check_package('brew'):
print('❌ Unable to find brew')
if not check_package("brew"):
print("❌ Unable to find brew")
sys.exit()
def get_csv():
with open(CSV_FILE, 'r', encoding='utf-8-sig') as f:
with open(CSV_FILE, "r", encoding="utf-8-sig") as f:
return list(csv.DictReader(f))
def extract_tap(name):
parts = name.split('/')
parts = name.split("/")
if len(parts) == 3:
return f'{parts[0]}/{parts[1]}'
return f"{parts[0]}/{parts[1]}"
return None
def create_brewfile():
try:
with open(BREWFILE, 'r') as old:
stamp = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
with open(f'./Brewfile_{stamp}.backup', 'w') as new:
with open(BREWFILE, "r") as old:
stamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
with open(f"./Brewfile_{stamp}.backup", "w") as new:
new.writelines(old.readlines())
print(f'📢 Backup old Brewfile (Brewfile_{stamp}.backup)')
print(f"📢 Backup old Brewfile (Brewfile_{stamp}.backup)")
except FileNotFoundError:
pass
@@ -58,94 +84,97 @@ def create_brewfile():
taps = set()
for row in raw_list:
pkg_type = row['type']
pkg_type = row["type"]
if pkg_type in temp.keys():
if row['install_on_setup'] == 'yes':
tap = extract_tap(row['name'])
if row["install_on_setup"] == "yes":
tap = extract_tap(row["name"])
if tap:
taps.add(tap)
content = f'# {row["description"]}\n{SUPPORT_CONFIG[pkg_type]["structure"](row)}\n'
content = f"# {row['description']}\n{SUPPORT_CONFIG[pkg_type]['structure'](row)}\n"
temp[pkg_type].append(content)
elif pkg_type != MANUAL_TYPE:
print(f'Error: {row["name"]} {pkg_type}')
print(f"Error: {row['name']} {pkg_type}")
sys.exit()
with open(BREWFILE, 'w') as f:
with open(BREWFILE, "w") as f:
if taps:
f.write(f'# {"=" * 15} tap {"=" * 15}\n')
f.write(f"# {'=' * 15} tap {'=' * 15}\n")
for tap in sorted(taps):
f.write(f'tap "{tap}"\n')
f.write('\n')
f.write("\n")
for pkg_type in support_types:
f.write(f'# {"=" * 15} {pkg_type} {"=" * 15}\n')
f.write(f"# {'=' * 15} {pkg_type} {'=' * 15}\n")
f.writelines(temp[pkg_type])
f.write('\n')
f.write("\n")
print("✅ Successfully created Brewfile")
print('✅ Successfully created Brewfile')
def handle_untrusted_taps():
taps = set()
try:
with open(BREWFILE, 'r') as f:
with open(BREWFILE, "r") as f:
for line in f:
m = re.fullmatch(r'tap "([^/]+/[^/]+)"', line.strip())
if m:
taps.add(m.group(1))
except FileNotFoundError:
print('❌ Unable to find Brewfile (create it first)')
print("❌ Unable to find Brewfile (create it first)")
return False
if taps:
print('⚠️ These third-party taps are needed')
print("⚠️ These third-party taps are needed")
for tap in sorted(taps):
print(f' - {tap}')
print(' These taps is not official and my execute certain script.\n')
if input('Trust these taps? (y/N): ').strip().lower() !='y':
print('📢 Operation is canceled as these taps are not allowed.')
print(f" - {tap}")
print(" These taps is not official and my execute certain script.\n")
if input("Trust these taps? (y/N): ").strip().lower() != "y":
print("📢 Operation is canceled as these taps are not allowed.")
return False
for tap in sorted(taps):
try:
subprocess.run(['brew', 'tap', tap], check=True)
subprocess.run(['brew', 'trust', tap], check=True)
subprocess.run(["brew", "tap", tap], check=True)
subprocess.run(["brew", "trust", tap], check=True)
print(f'✅ Successfully installed tap "{tap}"')
except subprocess.CalledProcessError as e:
print(f'❌ Failed to install tap "{tap}" ({e.returncode})')
return False
except FileNotFoundError:
print('❌ Unable to find brew')
print("❌ Unable to find brew")
return False
return True
def get_brewfile_types():
token_to_type = {SUPPORT_CONFIG[t]['token']: t for t in support_types}
token_to_type = {SUPPORT_CONFIG[t]["token"]: t for t in support_types}
types = set()
try:
with open(BREWFILE, 'r') as f:
with open(BREWFILE, "r") as f:
for line in f:
token = line.strip().split(' ', 1)[0]
token = line.strip().split(" ", 1)[0]
if token in token_to_type:
types.add(token_to_type[token])
except FileNotFoundError:
print('❌ Unable to find Brewfile (create it first)')
print("❌ Unable to find Brewfile (create it first)")
return types
def install_dependencies():
dependencies = []
seen = set()
for pkg_type in get_brewfile_types():
for dep in SUPPORT_CONFIG[pkg_type]['dependency']:
if dep['name'] not in seen:
seen.add(dep['name'])
for dep in SUPPORT_CONFIG[pkg_type]["dependency"]:
if dep["name"] not in seen:
seen.add(dep["name"])
dependencies.append(dep)
for dep in dependencies:
if check_package(dep['name']):
if check_package(dep["name"]):
print(f'✅ Dependency "{dep["name"]}" already installed')
continue
print(f'📢 Installing missing dependency "{dep["name"]}"...')
try:
subprocess.run(dep['script'], check=True)
subprocess.run(dep["script"], check=True)
print(f'✅ Successfully installed dependency "{dep["name"]}"')
except subprocess.CalledProcessError as e:
print(f'❌ Failed to install dependency "{dep["name"]}" ({e.returncode})')
@@ -155,79 +184,82 @@ def install_dependencies():
return False
return True
def bundle_install():
if not handle_untrusted_taps():
return
if not install_dependencies():
print('❌ Aborting install due to missing dependency')
print("❌ Aborting install due to missing dependency")
return
try:
subprocess.run(['brew', 'bundle', 'install', f'--file={BREWFILE}'], check=True)
print('✅ Successfully install all packages')
subprocess.run(["brew", "bundle", "install", f"--file={BREWFILE}"], check=True)
print("✅ Successfully install all packages")
except subprocess.CalledProcessError as e:
print(f'❌ Failed to install some packages ({e.returncode})')
print(f"❌ Failed to install some packages ({e.returncode})")
except FileNotFoundError:
print('❌ Unable to find brew')
print("❌ Unable to find brew")
def bundle_check():
try:
print('📢 Check script running')
print("📢 Check script running")
result = subprocess.run(
['brew', 'bundle', 'check', f'--file={BREWFILE}', '--verbose']
["brew", "bundle", "check", f"--file={BREWFILE}", "--verbose"]
)
if result.returncode == 0:
print('✅ All packages are installed')
print("✅ All packages are installed")
return True
else:
print('⚠️ There are uninstalled package(s)')
print("⚠️ There are uninstalled package(s)")
return False
except FileNotFoundError:
print('❌ Unable to find brew')
print("❌ Unable to find brew")
return False
def bundle_cleanup():
try:
subprocess.run(['brew', 'bundle', 'cleanup', f'--file={BREWFILE}'])
if input('⚠️ Are sure to remove? (y/N): ').strip().lower() == 'y':
subprocess.run(['brew', 'bundle', 'cleanup', f'--file={BREWFILE}', '--force'], check=True)
print('✅ Successfully cleanup')
subprocess.run(["brew", "bundle", "cleanup", f"--file={BREWFILE}"])
if input("⚠️ Are sure to remove? (y/N): ").strip().lower() == "y":
subprocess.run(
["brew", "bundle", "cleanup", f"--file={BREWFILE}", "--force"],
check=True,
)
print("✅ Successfully cleanup")
else:
print('📢 Canceled')
print("📢 Canceled")
except subprocess.CalledProcessError as e:
print(f'❌ Failed to cleanup ({e.returncode})')
print(f"❌ Failed to cleanup ({e.returncode})")
except FileNotFoundError:
print('❌ Unable to find brew')
print("❌ Unable to find brew")
def select_option():
options = [
{'text': 'Create Brewfile', 'func': create_brewfile},
{'text': 'Install packages', 'func': bundle_install},
{'text': 'Check packages', 'func': bundle_check},
{'text': 'Cleanup packages', 'func': bundle_cleanup},
{'text': 'Exit', 'func': sys.exit}
{"text": "Create Brewfile", "func": create_brewfile},
{"text": "Install packages", "func": bundle_install},
{"text": "Check packages", "func": bundle_check},
{"text": "Cleanup packages", "func": bundle_cleanup},
{"text": "Exit", "func": sys.exit},
]
while True:
print('Select option')
print("Select option")
for idx, row in enumerate(options, 1):
print(f' {idx}) {row["text"]}')
raw = input('option: ').strip()
print(f" {idx}) {row['text']}")
raw = input("option: ").strip()
try:
clear()
idx = int(raw) - 1
if 0 <= idx < len(options):
options[idx]['func']()
options[idx]["func"]()
print()
return
else:
print('⚠️ Write valid number\n')
print("⚠️ Write valid number\n")
except ValueError:
print('⚠️ Write valid number\n')
print("⚠️ Write valid number\n")
def main():
@@ -235,5 +267,6 @@ def main():
while True:
select_option()
if __name__ == '__main__':
if __name__ == "__main__":
main()