Skip to content

Commit 438a7a5

Browse files
committed
Restore sync artifacts after validate
1 parent 8a33e79 commit 438a7a5

3 files changed

Lines changed: 86 additions & 23 deletions

File tree

docs/msra-repo-b-sync.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,47 @@ jobs:
179179
run: |
180180
python -m msra_codegen validate ../target
181181
182+
- name: Restore preserved artifacts and remove generated noise
183+
run: |
184+
python - <<'PY'
185+
from fnmatch import fnmatch
186+
from pathlib import Path
187+
import shutil
188+
189+
target = Path("target")
190+
preserved_root = Path("preserved")
191+
preserve_paths = ["tests/__snapshots__"]
192+
ignored_patterns = ["**/__pycache__", "**/*.pyc"]
193+
194+
def is_ignored(relative_path: Path) -> bool:
195+
relative_text = relative_path.as_posix()
196+
return any(fnmatch(relative_text, pattern) for pattern in ignored_patterns)
197+
198+
def remove_ignored(root: Path) -> None:
199+
ignored_paths = sorted(
200+
[path for path in root.rglob("*") if is_ignored(path.relative_to(root))],
201+
key=lambda path: len(path.parts),
202+
reverse=True,
203+
)
204+
for path in ignored_paths:
205+
if path.is_dir():
206+
shutil.rmtree(path)
207+
else:
208+
path.unlink()
209+
210+
for relative_path in preserve_paths:
211+
source_path = preserved_root / relative_path
212+
destination_path = target / relative_path
213+
if source_path.is_dir():
214+
shutil.copytree(source_path, destination_path, dirs_exist_ok=True)
215+
else:
216+
destination_path.parent.mkdir(parents=True, exist_ok=True)
217+
shutil.copy2(source_path, destination_path)
218+
219+
remove_ignored(target)
220+
shutil.rmtree(preserved_root, ignore_errors=True)
221+
PY
222+
182223
- name: Commit and push
183224
working-directory: target
184225
run: |

msra_codegen/templates/github/workflows/source-sync.yml.tpl

Lines changed: 40 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -89,18 +89,6 @@ jobs:
8989
destination_path.parent.mkdir(parents=True, exist_ok=True)
9090
shutil.copy2(item, destination_path)
9191

92-
def remove_ignored(root: Path) -> None:
93-
ignored_paths = sorted(
94-
[path for path in root.rglob("*") if is_ignored(path.relative_to(root))],
95-
key=lambda path: len(path.parts),
96-
reverse=True,
97-
)
98-
for path in ignored_paths:
99-
if path.is_dir():
100-
shutil.rmtree(path)
101-
else:
102-
path.unlink()
103-
10492
for relative_path in preserve_paths:
10593
source_path = target / relative_path
10694
if not source_path.exists():
@@ -121,6 +109,46 @@ jobs:
121109
child.unlink()
122110

123111
copy_tree(generated, target)
112+
PY
113+
114+
- name: Install target project dependencies
115+
working-directory: target
116+
run: |
117+
python -m pip install --upgrade pip
118+
python -m pip install -r requirements-dev.txt
119+
120+
- name: Validate generated project
121+
working-directory: logic
122+
run: |
123+
python -m msra_codegen validate ../target
124+
125+
- name: Restore preserved artifacts and remove generated noise
126+
run: |
127+
python - <<'PY'
128+
from fnmatch import fnmatch
129+
from pathlib import Path
130+
import shutil
131+
132+
target = Path("target")
133+
preserved_root = Path("preserved")
134+
preserve_paths = {{ source_sync.preserved_target_paths | tojson }}
135+
ignored_patterns = {{ source_sync.ignored_generated_patterns | tojson }}
136+
137+
def is_ignored(relative_path: Path) -> bool:
138+
relative_text = relative_path.as_posix()
139+
return any(fnmatch(relative_text, pattern) for pattern in ignored_patterns)
140+
141+
def remove_ignored(root: Path) -> None:
142+
ignored_paths = sorted(
143+
[path for path in root.rglob("*") if is_ignored(path.relative_to(root))],
144+
key=lambda path: len(path.parts),
145+
reverse=True,
146+
)
147+
for path in ignored_paths:
148+
if path.is_dir():
149+
shutil.rmtree(path)
150+
else:
151+
path.unlink()
124152

125153
for relative_path in preserve_paths:
126154
source_path = preserved_root / relative_path
@@ -135,17 +163,6 @@ jobs:
135163
shutil.rmtree(preserved_root, ignore_errors=True)
136164
PY
137165

138-
- name: Install target project dependencies
139-
working-directory: target
140-
run: |
141-
python -m pip install --upgrade pip
142-
python -m pip install -r requirements-dev.txt
143-
144-
- name: Validate generated project
145-
working-directory: logic
146-
run: |
147-
python -m msra_codegen validate ../target
148-
149166
- name: Commit and push
150167
working-directory: target
151168
run: |

tests/codegen.test.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -877,6 +877,11 @@ test("source sync workflow preserves target artifacts from app.sync", () => {
877877
);
878878
assert.match(sourceSyncWorkflowText, /preserve_paths = \["tests\/__snapshots__"\]/);
879879
assert.match(sourceSyncWorkflowText, /ignored_patterns = \["\*\*\/__pycache__", "\*\*\/\*\.pyc"\]/);
880+
assert.match(sourceSyncWorkflowText, /Restore preserved artifacts and remove generated noise/);
881+
assert.ok(
882+
sourceSyncWorkflowText.indexOf("Validate generated project") < sourceSyncWorkflowText.indexOf("Restore preserved artifacts and remove generated noise"),
883+
"expected preserved artifacts to be restored after validate",
884+
);
880885
} finally {
881886
rmSync(workDir, { recursive: true, force: true });
882887
}

0 commit comments

Comments
 (0)