Skip to content

Commit 7d8b343

Browse files
authored
Update omnipkg_vs_pip2.yml
1 parent 21f7059 commit 7d8b343

1 file changed

Lines changed: 144 additions & 115 deletions

File tree

.github/workflows/omnipkg_vs_pip2.yml

Lines changed: 144 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ on:
44
schedule:
55
- cron: '0 * * * *' # Run every hour
66
workflow_dispatch:
7-
push:
8-
branches: [ 'main', 'test-workflows-feature' ]
97

108
jobs:
119
comparison-test:
@@ -42,6 +40,7 @@ jobs:
4240
4341
- name: ⚙️ Configure omnipkg
4442
run: |
43+
# Your configuration script remains the same
4544
python - << 'EOF'
4645
import sys, site, json, os, sysconfig
4746
from pathlib import Path
@@ -66,55 +65,60 @@ jobs:
6665
json.dump(config_data, f, indent=2)
6766
EOF
6867
68+
# --- CONFLICT INSTALLATION TESTS (Managing the Managers) ---
69+
6970
- name: 🚀 omnipkg | Battle Test (PASS Expected)
7071
id: omnipkg_conflict_test
7172
run: |
72-
echo "--- Testing omnipkg: pip==24.0, pip==23.2.1 ---"
73+
echo "--- Testing omnipkg installing conflicting versions of pip ---"
7374
if omnipkg install pip==24.0 pip==23.2.1 --yes; then
7475
echo "OMNIPKG_CONFLICT_RESULT=PASS" >> $GITHUB_ENV
75-
echo "✅ omnipkg: Installed multiple pip versions"
7676
else
7777
echo "OMNIPKG_CONFLICT_RESULT=FAIL" >> $GITHUB_ENV
78-
echo "❌ omnipkg: Failed to install multiple pip versions"
7978
fi
8079
8180
- name: 💥 pip | Battle Test (FAIL Expected)
8281
id: pip_conflict_test
8382
run: |
84-
echo "--- Testing pip: pip==24.0, pip==23.2.1 ---"
85-
pip install pip==24.0 > pip_conflict.log 2>&1
86-
pip install pip==23.2.1 >> pip_conflict.log 2>&1
83+
echo "--- Testing pip overwriting itself ---"
84+
pip install pip==24.0 > /dev/null 2>&1
85+
pip install pip==23.2.1 > /dev/null 2>&1
86+
# This is an expected failure where it overwrites, so we report FAIL for the stats
8787
echo "PIP_CONFLICT_RESULT=FAIL" >> $GITHUB_ENV
88-
echo "❌ pip: Overwrote pip version (expected)"
89-
cat pip_conflict.log
9088
9189
- name: ⚡️ uv | Battle Test (FAIL Expected)
9290
id: uv_conflict_test
9391
run: |
94-
echo "--- Testing uv: pip==24.0, pip==23.2.1 ---"
95-
uv pip install pip==24.0 > uv_conflict.log 2>&1
96-
uv pip install pip==23.2.1 >> uv_conflict.log 2>&1
92+
echo "--- Testing uv overwriting pip ---"
93+
uv pip install pip==24.0 > /dev/null 2>&1
94+
uv pip install pip==23.2.1 > /dev/null 2>&1
95+
# This is an expected failure where it overwrites, so we report FAIL for the stats
9796
echo "UV_CONFLICT_RESULT=FAIL" >> $GITHUB_ENV
98-
echo "❌ uv: Overwrote pip version (expected)"
99-
cat uv_conflict.log
97+
98+
# --- RESILIENCE TEST (Self-Sabotage & Revert) ---
10099

101100
- name: 🛡️ omnipkg | Resilience Test (PASS Expected)
102101
id: omnipkg_revert_test
103102
run: |
104-
echo "--- Testing omnipkg: Revert uv self-sabotage ---"
103+
echo "--- Testing omnipkg reverting uv's self-sabotage ---"
104+
# 1. Establish a known good state with the latest uv
105105
omnipkg install uv --yes
106-
latest_uv=$(uv --version | awk '{print $2}')
107-
echo "Baseline uv: $latest_uv"
108-
uv pip install uv==0.7.1 --system > revert.log 2>&1
109-
echo "After sabotage: $(uv --version | awk '{print $2}')"
110-
if omnipkg revert --yes >> revert.log 2>&1; then
106+
LATEST_UV_VER=$(uv --version | awk '{print $2}')
107+
echo "Established good state with uv version: $LATEST_UV_VER"
108+
109+
# 2. Let uv damage the environment by downgrading itself
110+
uv pip install uv==0.7.1 --system
111+
echo "uv version after self-sabotage: $(uv --version | awk '{print $2}')"
112+
113+
# 3. omni revert! The logs will show the "uv in jail" status.
114+
if omnipkg revert --yes; then
111115
echo "OMNIPKG_REVERT_RESULT=PASS" >> $GITHUB_ENV
112-
echo "✅ omnipkg: Reverted to uv $latest_uv"
116+
echo "Revert successful! Final uv version: $(uv --version | awk '{print $2}')"
113117
else
114118
echo "OMNIPKG_REVERT_RESULT=FAIL" >> $GITHUB_ENV
115-
echo "❌ omnipkg: Revert failed"
116119
fi
117-
cat revert.log
120+
121+
# --- REPORTING ---
118122

119123
- name: 📥 Download Previous Battle History
120124
uses: actions/download-artifact@v4
@@ -125,98 +129,124 @@ jobs:
125129
- name: 📊 Update Battle Report and README
126130
run: |
127131
cat > update_battle_report.py << 'EOF'
128-
import json, os
129-
from pathlib import Path
130-
from datetime import datetime
131-
132-
RESULTS_FILE = Path("battle_results_history.json")
133-
README_FILE = Path("README.md")
134-
135-
history_data = {
136-
"omnipkg_conflict": {"wins": 0, "losses": 0},
137-
"pip_conflict": {"wins": 0, "losses": 0},
138-
"uv_conflict": {"wins": 0, "losses": 0},
139-
"omnipkg_revert": {"wins": 0, "losses": 0},
140-
"recent_tests": []
141-
}
142-
143-
if RESULTS_FILE.exists():
144-
try:
145-
with open(RESULTS_FILE, 'r') as f:
146-
history_data = json.load(f)
147-
except Exception as e:
148-
print(f"Warning: Could not load history: {e}")
149-
150-
results = {
151-
"omnipkg_conflict": os.environ.get('OMNIPKG_CONFLICT_RESULT', 'FAIL'),
152-
"pip_conflict": os.environ.get('PIP_CONFLICT_RESULT', 'FAIL'),
153-
"uv_conflict": os.environ.get('UV_CONFLICT_RESULT', 'FAIL'),
154-
"omnipkg_revert": os.environ.get('OMNIPKG_REVERT_RESULT', 'FAIL')
155-
}
156-
test_timestamp = datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S UTC')
157-
158-
for test, result in results.items():
159-
history_data[test]['wins' if result == 'PASS' else 'losses'] += 1
160-
161-
history_data['recent_tests'].insert(0, {
162-
"date": test_timestamp,
163-
"scenario": "pip==24.0, pip==23.2.1 (conflict); uv self-sabotage revert",
164-
"omnipkg_conflict": results['omnipkg_conflict'],
165-
"pip_conflict": results['pip_conflict'],
166-
"uv_conflict": results['uv_conflict'],
167-
"omnipkg_revert": results['omnipkg_revert']
168-
})
169-
history_data['recent_tests'] = history_data['recent_tests'][:5]
170-
171-
def win_rate(wins, losses):
172-
total = wins + losses
173-
return f"{(wins / total * 100):.0f}%" if total > 0 else "0%"
174-
175-
battle_stats = f"""\
176-
## 🥊 omnipkg vs The World
177-
178-
Package manager conflict and resilience tests.
179-
180-
| Package Manager | Test | Wins | Losses | Win Rate |
181-
|-----------------|------|------|--------|----------|
182-
| omnipkg 🚀 | Conflict | {history_data['omnipkg_conflict']['wins']} | {history_data['omnipkg_conflict']['losses']} | {win_rate(history_data['omnipkg_conflict']['wins'], history_data['omnipkg_conflict']['losses'])} |
183-
| pip 💥 | Conflict | {history_data['pip_conflict']['wins']} | {history_data['pip_conflict']['losses']} | {win_rate(history_data['pip_conflict']['wins'], history_data['pip_conflict']['losses'])} |
184-
| uv ⚡️ | Conflict | {history_data['uv_conflict']['wins']} | {history_data['uv_conflict']['losses']} | {win_rate(history_data['uv_conflict']['wins'], history_data['uv_conflict']['losses'])} |
185-
| omnipkg 🛡️ | Revert | {history_data['omnipkg_revert']['wins']} | {history_data['omnipkg_revert']['losses']} | {win_rate(history_data['omnipkg_revert']['wins'], history_data['omnipkg_revert']['losses'])} |
186-
187-
### 📊 Recent Test Results
188-
| Date | Scenario | omnipkg Conflict | pip Conflict | uv Conflict | omnipkg Revert |
189-
|------|----------|------------------|--------------|-------------|----------------|
190-
"""
191-
for test in history_data['recent_tests']:
192-
battle_stats += f"| {test['date']} | {test['scenario']} | {test['omnipkg_conflict']} | {test['pip_conflict']} | {test['uv_conflict']} | {test['omnipkg_revert']} |\n"
132+
import json
133+
import os
134+
from pathlib import Path
135+
from datetime import datetime
136+
137+
RESULTS_FILE = Path("battle_results_history.json")
138+
README_FILE = Path("README.md")
139+
140+
# A lean data structure
141+
default_data = {
142+
"omnipkg": {"wins": 0, "losses": 0, "saves": 0},
143+
"pip": {"wins": 0, "losses": 0},
144+
"uv": {"wins": 0, "losses": 0},
145+
"recent_tests": []
146+
}
147+
148+
# Load existing history
149+
history_data = default_data
150+
if RESULTS_FILE.exists():
151+
try:
152+
with open(RESULTS_FILE, 'r') as f:
153+
loaded_data = json.load(f)
154+
# Basic validation to ensure new keys exist
155+
for key, value in default_data.items():
156+
if key not in loaded_data:
157+
loaded_data[key] = value
158+
if isinstance(value, dict):
159+
for sub_key in value:
160+
if sub_key not in loaded_data.get(key, {}):
161+
loaded_data[key][sub_key] = value[sub_key]
162+
history_data = loaded_data
163+
except Exception as e:
164+
print(f"Warning: Could not load or migrate history, starting fresh: {e}")
165+
history_data = default_data
166+
167+
# Read results from environment variables
168+
omnipkg_conflict = os.environ.get('OMNIPKG_CONFLICT_RESULT', 'FAIL')
169+
pip_conflict = os.environ.get('PIP_CONFLICT_RESULT', 'FAIL')
170+
uv_conflict = os.environ.get('UV_CONFLICT_RESULT', 'FAIL')
171+
omnipkg_revert = os.environ.get('OMNIPKG_REVERT_RESULT', 'FAIL')
172+
test_timestamp = datetime.utcnow().strftime('%Y-%m-%d %H:%M')
173+
174+
# Update stats
175+
history_data['omnipkg']['wins' if omnipkg_conflict == 'PASS' else 'losses'] += 1
176+
history_data['pip']['wins' if pip_conflict == 'PASS' else 'losses'] += 1
177+
history_data['uv']['wins' if uv_conflict == 'PASS' else 'losses'] += 1
178+
if omnipkg_revert == 'PASS':
179+
history_data['omnipkg']['saves'] += 1
180+
181+
# Update recent tests log
182+
history_data['recent_tests'].insert(0, {
183+
"date": test_timestamp,
184+
"conflict_omnipkg": omnipkg_conflict,
185+
"conflict_pip": pip_conflict,
186+
"conflict_uv": uv_conflict,
187+
"revert_omnipkg": omnipkg_revert
188+
})
189+
history_data['recent_tests'] = history_data['recent_tests'][:5]
190+
191+
# --- GENERATE CONCISE README CONTENT ---
192+
193+
def calculate_win_rate(wins, losses):
194+
total = wins + losses
195+
return f"{(wins / total * 100):.0f}%" if total > 0 else "0%"
196+
197+
omnipkg_stats = history_data['omnipkg']
198+
pip_stats = history_data['pip']
199+
uv_stats = history_data['uv']
200+
201+
omnipkg_wr = calculate_win_rate(omnipkg_stats['wins'], omnipkg_stats['losses'])
202+
pip_wr = calculate_win_rate(pip_stats['wins'], pip_stats['losses'])
203+
uv_wr = calculate_win_rate(uv_stats['wins'], uv_stats['losses'])
204+
205+
battle_stats_section_content = f"""## 🥊 omnipkg vs The World: Battle Statistics
206+
*Live-updated results from our continuous integration tests.*
207+
208+
| Package Manager | Conflict Test Wins | Environment Saves | Result |
209+
|:----------------|:------------------:|:-------------------:|:-------|
210+
| **omnipkg 🚀** | **{omnipkg_stats['wins']}** ({omnipkg_wr} Win Rate) | **{omnipkg_stats['saves']}** | ✅ **Solves Conflicts & Heals Environment** |
211+
| **pip 💥** | {pip_stats['wins']} ({pip_wr} Win Rate) | N/A | ❌ Overwrites Packages |
212+
| **uv ⚡️** | {uv_stats['wins']} ({uv_wr} Win Rate) | N/A | ❌ Overwrites Packages |
193213

194-
battle_stats += """\
195214
**Test Scenarios:**
196-
- **Conflict Test**: Install pip==24.0 and pip==23.2.1 simultaneously
197-
- **Revert Test**: Revert uv self-sabotage (downgrade to 0.7.1)
198-
- ✅ **PASS**: Success in conflict or revert
199-
- ❌ **FAIL**: Overwrites or fails to handle conflict/revert
215+
- **Conflict Test**: Attempting to install conflicting versions of another package manager (e.g., `pip==24.0` and `pip==23.2.1`). A "Win" means both versions are usable.
216+
- **Environment Save**: After another tool (`uv`) damages the environment by downgrading itself, `omnipkg revert` is run. A "Save" means the environment was successfully restored.
217+
218+
### 📊 Recent Test Log
219+
| Date (UTC) | omnipkg (Conflict) | pip (Conflict) | uv (Conflict) | omnipkg (Revert) |
220+
|:-----------|:------------------:|:--------------:|:-------------:|:----------------:|
200221
"""
201-
202-
try:
203-
readme_content = README_FILE.read_text()
204-
start, end = "<!-- BATTLE_STATS_START -->", "<!-- BATTLE_STATS_END -->"
205-
if start in readme_content and end in readme_content:
206-
before, after = readme_content.split(start)[0], readme_content.split(end)[1]
207-
README_FILE.write_text(before + start + "\n" + battle_stats + "\n" + end + after)
208-
print("✅ README.md updated")
209-
else:
210-
print("❌ Error: Add <!-- BATTLE_STATS_START --> and <!-- BATTLE_STATS_END --> to README.md")
211-
except Exception as e:
212-
print(f"Error updating README: {e}")
213-
214-
try:
215-
with open(RESULTS_FILE, 'w') as f:
216-
json.dump(history_data, f, indent=2)
217-
print(f"✅ Saved history to {RESULTS_FILE}")
218-
except Exception as e:
219-
print(f"Error saving history: {e}")
222+
for test in history_data['recent_tests']:
223+
battle_stats_section_content += f"| {test['date']} | {test['conflict_omnipkg']} | {test['conflict_pip']} | {test['conflict_uv']} | {test['revert_omnipkg']} |\n"
224+
225+
226+
# --- UPDATE THE README FILE ---
227+
228+
try:
229+
readme_content = README_FILE.read_text(encoding='utf-8') if README_FILE.exists() else "# omnipkg\n\n"
230+
start_marker, end_marker = "<!-- BATTLE_STATS_START -->", "<!-- BATTLE_STATS_END -->"
231+
232+
if start_marker in readme_content and end_marker in readme_content:
233+
before, after = readme_content.split(start_marker)[0], readme_content.split(end_marker)[1]
234+
README_FILE.write_text(before + start_marker + "\n" + battle_stats_section_content + "\n" + end_marker + after, encoding='utf-8')
235+
print("✅ README.md updated with concise battle stats")
236+
else:
237+
updated_content = readme_content.rstrip() + "\n\n" + start_marker + "\n" + battle_stats_section_content + "\n" + end_marker + "\n"
238+
README_FILE.write_text(updated_content, encoding='utf-8')
239+
print("✅ README.md updated (markers added automatically)")
240+
except Exception as e:
241+
print(f"Error updating README: {e}")
242+
243+
# --- SAVE HISTORY FOR NEXT RUN ---
244+
try:
245+
with open(RESULTS_FILE, 'w') as f:
246+
json.dump(history_data, f, indent=2)
247+
print(f"✅ Saved history to {RESULTS_FILE}")
248+
except Exception as e:
249+
print(f"Error saving history: {e}")
220250
EOF
221251
python update_battle_report.py
222252

@@ -225,7 +255,6 @@ Package manager conflict and resilience tests.
225255
with:
226256
name: battle-history
227257
path: battle_results_history.json
228-
retention-days: 90
229258

230259
- name: 💾 Commit README Updates
231260
run: |
@@ -235,6 +264,6 @@ Package manager conflict and resilience tests.
235264
if git diff --staged --quiet; then
236265
echo "No changes to commit"
237266
else
238-
git commit -m "🥊 Battle update: omnipkg vs The World - $(date -u '+%Y-%m-%d %H:%M UTC')"
267+
git commit -m "🥊 Battle update: omnipkg vs The World results"
239268
git push
240269
fi

0 commit comments

Comments
 (0)