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) 73 { 74 const char * one, * two; 75 int_32 * epochOne, * epochTwo; 76 int rc; 77 78 if (!headerGetEntry(first, RPMTAG_EPOCH, NULL, (void **) &epochOne, NULL)) 79 epochOne = NULL; 80 if (!headerGetEntry(second, RPMTAG_EPOCH, NULL, (void **) &epochTwo, 81 NULL)) 82 epochTwo = NULL; 83 84 if (epochOne && !epochTwo) 85 return 1; 86 else if (!epochOne && epochTwo) 87 return -1; 88 else if (epochOne && epochTwo) { 89 if (*epochOne < *epochTwo) 90 return -1; 91 else if (*epochOne > *epochTwo) 92 return 1; 93 } 94 95 rc = headerGetEntry(first, RPMTAG_VERSION, NULL, (void **) &one, NULL); 96 rc = headerGetEntry(second, RPMTAG_VERSION, NULL, (void **) &two, NULL); 97 98 rc = rpmvercmp(one, two); 99 if (rc) 100 return rc; 101 102 (void) headerGetEntry(first, RPMTAG_RELEASE, NULL, (void **) &one, NULL); 103 (void) headerGetEntry(second, RPMTAG_RELEASE, NULL, (void **) &two, NULL); 104 105 rc = rpmvercmp(one, two); 106 if (rc) 107 return rc; 108 109 if (upgrade_honor_buildtime()) 110 return rpmBuildTimeCompare(first, second); 111 112 return 0; 113 } Thus, rpm will not upgrade a package (by default), and apt-rpm will not consider an upgrade, if zero serial gets removed (and, say, release number is increased). Let's try to remove zero serial from e.g. kbd and see what happens.