New Ticket     Tickets     Wiki     Browse Source     Timeline     Roadmap     Ticket Reports     Search

Ticket #28084 (closed defect: fixed)

Opened 4 years ago

Last modified 3 years ago

Use of composite version specs should be avoided

Reported by: ken@… Owned by: macports-tickets@…
Priority: Normal Milestone: MacPorts 2.0.0
Component: base Version: 1.9.2
Keywords: registry version Cc:
Port:

Description

If a port has an underscore ('_') in its version, then any attempt to install it will result in a registry error:

Error: Target org.macports.activate returned: Registry error: No port of <port> installed.

Examples include aspell-dict-it, whose version is 2.2_20050523-0, and aspell-dict-pl, whose version is 6.0_20061121-0.

I have worked around this problem by editing the Portfile to a) manually substitute the original value of version into the distname, and b) changing the underscore in the version to a dash ('-').

I suspect that something in the registry lookup is scanning for the "_${revision}" that's appended to the port version, but it is scanning forward for the underscore starting at the beginning of the string instead of scanning backward from the end.

Change History

comment:1 Changed 4 years ago by ryandesign@…

  • Component changed from ports to base

comment:2 follow-up: ↓ 3 Changed 4 years ago by ryandesign@…

Are you using the flat registry or the sql registry? (See portdbformat in macports.conf)

comment:3 in reply to: ↑ 2 Changed 4 years ago by ken@…

Replying to ryandesign@…:

Are you using the flat registry or the sql registry? (See portdbformat in macports.conf)

The SQL registry.

comment:4 follow-up: ↓ 5 Changed 4 years ago by jmr@…

Works for me (I maintain iozone, for example). This sounds a lot like #23966. Are you sure you're using the 1.9.2 release and not some old pre-1.9 trunk version?

comment:5 in reply to: ↑ 4 Changed 4 years ago by ken@…

Replying to jmr@…:

Works for me (I maintain iozone, for example). This sounds a lot like #23966. Are you sure you're using the 1.9.2 release and not some old pre-1.9 trunk version?

I did a "sudo port selfupdate" immediately before encountering this issue. This is from just now:

$ port version
Version: 1.9.2

Would it help if I revert my edit to the Portfiles and collect a log?

comment:6 follow-up: ↓ 8 Changed 4 years ago by jmr@…

Actually I do see this for the ports you mention, but not for all ports with an underscore in the version.

comment:7 Changed 4 years ago by jmr@…

Using a full version spec when activating or deactivating works, so something is not figuring out the version from the registry correctly when no version is given.

comment:8 in reply to: ↑ 6 Changed 4 years ago by ken@…

Replying to jmr@…:

Actually I do see this for the ports you mention, but not for all ports with an underscore in the version.

I believe I have identified the issue. It's the underscore and the dash in "2.2_20050523-0". iozone's version is 3_373, which has no dash.

Now, look at proc decode_spec (/opt/local/share/macports/Tcl/registry2.0/registry_util.tcl:55):

proc decode_spec {specifier version revision variants} {
    upvar 1 $version ver $revision rev $variants var
    return [regexp {^([^+]+?)(_(\d+)(([-+][^-+]+)*))?$} $specifier - ver - rev v
ar]
}

Experimenting interactively with that regexp:

$ tclsh
% echo [regexp {^([^+]+?)(_(\d+)(([-+][^-+]+)*))?$} "2.2_20050523-0_0" - ver - rev var]
1
% echo $ver
2.2
% echo $rev
20050523
% echo $var
-0_0
% echo [regexp {^([^+]+?)(_(\d+)(([-+][^-+]+)*))?$} "3_373_0" - ver - rev var]
1
% echo $ver
3_373
% echo $rev
0
% echo $var

%

comment:9 Changed 4 years ago by jmr@…

simul-posted with the above :-)

So, this is interpreting the version spec 2.2_20050523-0_0 obtained from the registry as version 2.2, revision 20050523, and variants -0_0. I believe this is a genuine ambiguity in the syntax. We can probably make it better by requiring variant names to have at least one letter, but the possibility of misinterpretation remains for ports with letters in their version.

comment:10 Changed 4 years ago by jmr@…

  • Summary changed from Registry error for ports with underscore ('_') in version to Use of composite version specs should be avoided

So basically we want to be passing around separate version,revision,variants values whenever possible. The use of composite versions is a holdover from the flat registry, which ironically avoided this problem by actually storing the values this way. (So it would only run into trouble if there actually were two versions of a port installed at the same time where a different possible interpretation was correct for each.)

comment:11 Changed 4 years ago by jmr@…

Added at-least-one-letter requirement to variant name parsing in r75336.

comment:12 Changed 3 years ago by jmr@…

  • Status changed from new to closed
  • Resolution set to fixed
  • Milestone set to MacPorts 2.0.0

This should be taken care of on the registry side by r79167. The front end could potentially need some more work, since it accepts composite version specs as user input, but we'll see how this goes.

Note: See TracTickets for help on using tickets.