Compare commits

...

2 Commits

+55 -30
View File
@@ -68,59 +68,84 @@ with open(compose_file, "r", encoding="utf-8") as f:
lines = f.readlines()
out = []
in_app = False
in_app_service = False
app_indent = None
app_service_indent = None
skip_build_block = False
build_found = False
def leading_spaces(text):
return len(text) - len(text.lstrip(" "))
for line in lines:
i = 0
while i < len(lines):
line = lines[i]
stripped = line.lstrip(" ")
indent = leading_spaces(line)
if not in_app and re.match(r"^\s*app:\s*$", line):
in_app = True
# Check if we're starting the app service
if not in_app_service and re.match(r"^\s*app:\s*$", line):
in_app_service = True
app_indent = indent
app_service_indent = None
skip_build_block = False
build_found = False
out.append(line)
i += 1
continue
if in_app:
# Check if we've exited the app service (found another top-level service)
if in_app_service and indent <= app_indent and re.match(r"^[A-Za-z0-9_-]+:\s*$", stripped):
# We've left the app service - insert image if we haven't already
if build_found and app_service_indent is not None:
out.append(f"{' ' * app_service_indent}image: {target_image}\n")
in_app_service = False
out.append(line)
i += 1
continue
# Process lines within the app service
if in_app_service:
if app_service_indent is None and indent > app_indent:
app_service_indent = indent
if indent <= app_indent and re.match(r"^[A-Za-z0-9_-]+:\s*$", stripped):
in_app = False
app_indent = None
app_service_indent = None
skip_build_block = False
# Check for image key (already has an image, don't add)
if re.match(rf"^\s+image:\s*", line):
in_app_service = False
out.append(line)
i += 1
continue
if in_app:
if app_service_indent is None:
app_service_indent = indent
# Check for build block
if re.match(rf"^\s+build:\s*$", line):
build_found = True
out.append(line)
i += 1
# Skip all lines that are part of the build block (indented more than app_service_indent)
while i < len(lines):
next_line = lines[i]
next_indent = leading_spaces(next_line)
if next_indent > app_service_indent and next_line.strip():
out.append(next_line)
i += 1
else:
break
continue
if skip_build_block:
if indent > app_service_indent:
continue
skip_build_block = False
if re.match(rf"^\s{{{app_service_indent}}}build:\s*$", line):
skip_build_block = True
continue
if re.match(rf"^\s{{{app_service_indent}}}image:\s*", line):
continue
if re.match(rf"^\s{{{app_service_indent}}}[A-Za-z0-9_-]+:\s*$", line):
# Insert image after build block before first property
if build_found and app_service_indent is not None and indent == app_service_indent:
# Check if this is a property line (not build)
if not re.match(rf"^\s+build:", line):
out.append(f"{' ' * app_service_indent}image: {target_image}\n")
app_service_indent = None
build_found = False # Mark that we've inserted the image
out.append(line)
i += 1
continue
out.append(line)
i += 1
if in_app and app_service_indent is not None:
# If we ended while still in the app service, append image at the end
if in_app_service and build_found and app_service_indent is not None:
out.append(f"{' ' * app_service_indent}image: {target_image}\n")
with open(compose_file, "w", encoding="utf-8") as f: