On Tue, Feb 17, 2009 at 02:29:39AM +0300, Dmitry V. Levin wrote: > On Mon, Feb 16, 2009 at 04:05:08PM +0300, Alexey Tourbin wrote: > > On Mon, Feb 16, 2009 at 03:23:12PM +0300, Dmitry V. Levin wrote: > > > On Mon, Feb 16, 2009 at 11:16:51AM +0300, Alexey Tourbin wrote: > > > [...] > > > > 0:1.0-alt1 cmp 1.0-alt2 should yield 1. > > > > > > Why? > > > > > > > Zero serial is greater than no serial. > > > > > > Why? > > > > This is because how rpm-4.0 works. > > > > lib/psm.c: > > 72 int rpmVersionCompare(Header first, Header second) > > If rpmVersionCompare() works this way, why rpmEVRcmp() doesn't work the > same way? Let's fix librpm rather than multiply workarounds. apt-pkg/rpm/rpmversion.cc: 94 // --------------------------------------------------------------------- 95 /* This fragments the version into E:V-R triples and compares each 96 portion separately. */ 97 int rpmVersioningSystem::DoCmpVersion(const char *A,const char *AEnd, 98 const char *B,const char *BEnd) 99 { 100 char *AE, *AV, *AR; 101 char *BE, *BV, *BR; 102 int rc = 0; 103 ParseVersion(A, AEnd, &AE, &AV, &AR); 104 ParseVersion(B, BEnd, &BE, &BV, &BR); 105 if (AE && !BE) 106 rc = 1; 107 else if (!AE && BE) 108 rc = -1; 109 else if (AE && BE) 110 { 111 int AEi, BEi; 112 AEi = atoi(AE); 113 BEi = atoi(BE); 114 if (AEi < BEi) 115 rc = -1; 116 else if (AEi > BEi) 117 rc = 1; 118 } 119 if (rc == 0) 120 { 121 rc = rpmvercmp(AV, BV); 122 if (rc == 0) { 123 if (AR && !BR) 124 rc = 1; 125 else if (!AR && BR) 126 rc = -1; 127 else if (AR && BR) 128 rc = rpmvercmp(AR, BR); 129 } 130 } 131 free(AE);free(AV);free(AR);; 132 free(BE);free(BV);free(BR);; 133 return rc; 134 } vercmp seems to be reliable. evrcmp is a "sdelai sam" thing.