| 848 | } |
| 849 | |
| 850 | int cbm_compare_versions(const char *a, const char *b) { |
| 851 | int pa[SEMVER_PARTS]; |
| 852 | int pb[SEMVER_PARTS]; |
| 853 | parse_semver(a, pa); |
| 854 | parse_semver(b, pb); |
| 855 | |
| 856 | for (int i = 0; i < SEMVER_PARTS; i++) { |
| 857 | if (pa[i] != pb[i]) { |
| 858 | return pa[i] - pb[i]; |
| 859 | } |
| 860 | } |
| 861 | |
| 862 | /* Same base version — non-dev beats dev */ |
| 863 | bool a_pre = has_prerelease(a); |
| 864 | bool b_pre = has_prerelease(b); |
| 865 | if (a_pre && !b_pre) { |
| 866 | return CLI_ERR; |
| 867 | } |
| 868 | if (!a_pre && b_pre) { |
| 869 | return CLI_TRUE; |
| 870 | } |
| 871 | return 0; |
| 872 | } |
| 873 | |
| 874 | /* ── Shell RC detection ───────────────────────────────────────── */ |
| 875 |
no test coverage detected