import os import re schema_path = 'database/schema/mysql-schema.sql' # Discard manual changes first by git checkout os.system(f'git checkout -- {schema_path}') # Read clean schema with open(schema_path, 'r') as f: lines = f.readlines() schema_content = ''.join(lines) schema_tables = set(re.findall(r'CREATE TABLE `([^`]+)`', schema_content)) print("Tables in schema dump:", len(schema_tables)) # Filter out old migration inserts new_lines = [] for line in lines: if 'INSERT INTO `migrations` ' not in line: new_lines.append(line) # Scan migrations <= 2026_03_10 migrations_to_mark = [] for f in sorted(os.listdir('database/migrations')): if f.endswith('.php'): m = re.match(r'^(\d{4}_\d{2}_\d{2}_\d{6})_(.+)\.php$', f) if m: timestamp = m.group(1) name = f[:-4] if timestamp <= '2026_03_10_235959': # Check if it creates or modifies any table with open(os.path.join('database/migrations', f), 'r') as mf: content = mf.read() created_tables = re.findall(r"Schema::create\s*\(\s*['\"]([^'\"]+)['\"]", content) modified_tables = re.findall(r"Schema::table\s*\(\s*['\"]([^'\"]+)['\"]", content) all_tables = set(created_tables + modified_tables) # Logic: If ALL tables referenced (created or modified) already exist in the schema dump, # we can mark this migration as completed. # If only SOME tables exist, we should NOT mark it as completed, but print a warning. all_exist = True any_exist = False for t in all_tables: if t in schema_tables: any_exist = True else: all_exist = False # Only mark as completed if it only creates tables and they all exist, or if it doesn't reference any tables. # Do not mark as completed if it modifies tables (Schema::table), so that column updates are applied. if (len(created_tables) > 0 and len(modified_tables) == 0 and all_exist) or len(all_tables) == 0: migrations_to_mark.append(name) elif any_exist: print(f"Warning: Migration {name} has partial tables. Exist: {all_tables & schema_tables}, Missing: {all_tables - schema_tables}. Will execute.") else: print(f"Migration {name} references tables {all_tables} which are all missing from schema dump. Will execute.") # Append migration inserts to mysql-schema.sql new_lines.append('\n-- Marked migrations <= 2026-03-10 whose tables/logic exist in schema baseline\n') for i, m in enumerate(migrations_to_mark, start=1): new_lines.append(f"INSERT INTO `migrations` (`id`, `migration`, `batch`) VALUES ({i}, '{m}', 1);\n") # Write back to mysql-schema.sql with open(schema_path, 'w') as f: f.writelines(new_lines) print('Success! Updated schema dump with', len(migrations_to_mark), 'migrations.')