Last active
October 8, 2024 17:09
-
-
Save lakshits11/236bd5d475fdd50072b3e6803e7342dd to your computer and use it in GitHub Desktop.
This file contains 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
""" | |
Extension Cleaner Script | |
Problem: Even after uninstalling extensions, they still remain in the extensions directory. | |
This script removes extra extensions from the extensions directory of various | |
VS Code based editors (e.g., Visual Studio Code, Visual Studio Code Insiders, Codium). | |
Usage: | |
python code_extension_cleaner.py | |
Requirements: | |
- Python 3.x | |
- os, re, and shutil modules | |
- Code editors (e.g., Visual Studio Code, Visual Studio Code Insiders, Codium) | |
must be installed and configured properly. | |
Author: | |
LAKSHIT SOMANI | |
""" | |
import os | |
import re | |
import shutil | |
def get_installed_extensions(program): | |
""" | |
Run the command to get the list of installed extensions. | |
Args: | |
program (str): The program to run (e.g., 'code', 'code-insiders', 'codium') | |
Returns: | |
list: A list of installed extension identifiers | |
Raises: | |
Exception: If the command fails to execute or returns an error. | |
""" | |
command = f'{program} --list-extensions' | |
try: | |
stream = os.popen(command) | |
output = stream.read().strip().split('\n') | |
return output | |
except Exception as e: | |
print(f"Error: Failed to get installed extensions for {program}: {e}") | |
return [] | |
def get_extension_folders(extensions_dir): | |
""" | |
Get all directories in the extensions folder. | |
Args: | |
extensions_dir (str): The path to the extensions directory | |
Returns: | |
list: A list of extension folder names | |
Raises: | |
FileNotFoundError: If the extensions directory does not exist. | |
""" | |
try: | |
return [d for d in os.listdir(extensions_dir) if os.path.isdir(os.path.join(extensions_dir, d))] | |
except FileNotFoundError: | |
print(f"Error: Extensions directory not found: {extensions_dir}") | |
return [] | |
def remove_extra_extensions(installed_extensions, extensions_dir): | |
""" | |
Remove extra extensions from the extensions directory. | |
Args: | |
installed_extensions (list): A list of installed extension identifiers | |
extensions_dir (str): The path to the extensions directory | |
Returns: | |
None | |
Raises: | |
Exception: If an error occurs while removing an extension. | |
""" | |
print(f"Removing extra extensions from {extensions_dir}") | |
extension_folders = get_extension_folders(extensions_dir) | |
for folder in extension_folders: | |
# Extract the extension identifier from the folder name | |
match = re.match(r'([^-]+(?:-[^-]+)*)-\d+\.\d+\.\d+', folder) | |
if match: | |
extension_id = match.group(1) | |
if extension_id not in installed_extensions: | |
folder_path = os.path.join(extensions_dir, folder) | |
print(f"Removing extra extension: {folder}") | |
try: | |
shutil.rmtree(folder_path) | |
print(f"Removed: {folder}") | |
except Exception as e: | |
print(f"Error: Failed to remove extension: {folder} - {e}") | |
else: | |
print(f"Skipping folder with unexpected format: {folder}") | |
print(f"Done removing extra extensions from {extensions_dir}") | |
print("--------------------------------------") | |
if __name__ == "__main__": | |
# Define the programs and their corresponding extensions directories | |
programs = { | |
'code': '~/.vscode/extensions', | |
'code-insiders': '~/.vscode-insiders/extensions', | |
'codium': '~/.vscode-oss/extensions' | |
} | |
for program, extensions_dir in programs.items(): | |
extensions_dir = os.path.expanduser(extensions_dir) | |
installed_extensions = get_installed_extensions(program) | |
remove_extra_extensions(installed_extensions, extensions_dir) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment