On Wed, 31 Oct 2018 at 19:52, Jason L Tibbitts III <tibbs(a)math.uh.edu> wrote:
>>>>> "IU" == Iñaki Ucar <iucar(a)fedoraproject.org>
writes:
IU>
https://cran.r-project.org/package=simmer&version=3.0.0
IU> returns a redirection (303) to the complete URL, with file
IU> extension.
303 is actually "See Other". Which is odd as that's usually sent in
response to a PUT or POST, not a GET. Maybe you can get the files via
POST as well; I'm not sure.
Why is this odd? It's not "moved", either permanently or temporarily
(301, 302). It clearly matches the "see other" case. 303 was
*primarily* motivated by the POST use case, but I think this is a
pretty fair use.
In any case, none of that has any effect on the filename that
spectool
(really curl) will use. It can't use data supplied by the remote host
for that, for obvious reasons.
IU> CRAN maintainers are pretty strict with this kind of stuff: if it
IU> works now, it's guaranteed to continue to work.
Well, that's good, but this is a hack so it's not a terrible idea to
inform them that we have to use this kind of thing so that they can
either bless this method or provide a cleaner one.
I'll raise the issue in the R-devel mailing list and report back.
IU> There are no other formats: every package is tar.gz. But, as
I
IU> pointed out above, the immutable URL is a redirection to the
IU> complete URL, so you can still extract the extension.
No, you can't. Not in the context and under the limitations where we're
running. Certainly we can't know anything about that in an RPM macro as
we have to provide an extension in a complete vacuum.
But given what you say, certainly defaulting to tar.gz will work for
everything now.
For what it's worth, this (the extension) is clearly specified in the
"Writing R Extensions" and the "R Installation and Administration"
manuals. It always has been the same, and I'd say it's *extremely*
unlikely to change.
Try dropping the below into /usr/lib/rpm/macros.d/macros.test
(temporarily, make sure to deleted it when you're done experimenting).
See if it gives the results you expect when you use %cran_url and
%cran_source. Do fedpkg prep or some local builds. Try spectool -g and
rpmspec -P.
Thanks, I'll give it a try and report back.
Note that I've snuck a bit of magic in there which I'm not
sure should
be kept: If you don't have %packname defined and you call either
%cran_url or %cran_source, then it will be automatically defined for you
by stripping the leading "R-" from the name.
This is great. However, in theory, given the naming guidelines, by
stripping the leading "R-" you should get the package name. In
practice, at least one package doesn't adhere to this: R-TH-data,
while the R package name is TH.data, not TH-data. I see that the SPEC
says "# Cannot use . in name", but this is clearly not true (maybe it
was true long ago?).
With this, you can just have:
Name: R-webp
Version: 0.4
Release: 3%{?dist}
Summary: A New Format for Lossless and Lossy Image Compression
License: MIT
URL: %cran_url
Source0: %cran_source
And use %packname in %prep as usual without explicitly defining it. But
I'm not sure that much magic is a good idea.
(And while we're doing R macros, that package suggests that we should
also have a macro defined to %_libdir/R/library....)
That would require a good ton of magic. You have seen something like this:
%global rlibdir %{_libdir}/R/library
The thing is, this is the path for R packages *with* compiled code,
while R packages *without* compiled code must go to
%_datadir/R/library. That's why every R package has this global on top
of the SPEC. Are you able to detect that and set the path
appropriately with an RPM macro? :) That would certainly be very
convenient for us, packagers.
- J<
# Macros to replace overly complicated references to CRAN URLs and source files.
# %cran_source -
# Expands to the CRAN URL for a package
# Accepts zero to three arguments:
# 1: The CRAN project name, defaulting to %packname if it is defined.
# If not, R- will be stripped from %name and %packname defined to that.
# 2: The CRAN version, defaulting to %version.
# 3: The file extension, defaulting to %__cran_default_extension (tar.gz).
# Requires %__cran_package_url_template and %__cran_default_extension to be defined.
# %__cran_package_url_template will undergo substitution (case-sensitive):
# * "PACKNAME" will be replaced with the above CRAN project name.
# * "PACKVERSION" will be replaced with the above CRAN version.
# * "EXTENSION" will be replaced with the above extension.
#
# %cran_url -
# Expands to the CRAN URL for a package
# Accepts zero or one arguments:
# 1: The CRAN project name, defaulting to %packname if it is defined.
# If not, R- will be stripped from %name and %packname defined to that.
# Requires %__cran_project_url_template to be defined.
# %__cran_project_url_template will undergo substitution (case-sensitive):
# * "PACKNAME" will be replaced with the above CRAN project name.
%__cran_project_url_template
https://cran.r-project.org/package=PACKNAME
%__cran_package_url_template
%{__cran_project_url_template}&version=PACKVERSION#/PACKNAME_PACKVERSION.EXTENSION
%__cran_default_extension tar.gz
%cran_source() %{lua:
local src = rpm.expand('%1')
local ver = rpm.expand('%2')
local ext = rpm.expand('%3')
local url = rpm.expand('%__cran_package_url_template')
\
-- If no first argument, try %packname, then %name with 'R-' stripped.
-- Note that rpm leaves macros unchanged if they are not defined.
if src == '%1' then
src = rpm.expand('%packname')
end
if src == '%packname' then
src = string.gsub(rpm.expand('%name'), "^R%-", "")
-- Since packname wasn't defined, define it for convenience.
rpm.define("packname " .. src)
end
\
-- If no second argument, use %version
if ver == '%2' then
ver = rpm.expand('%version')
end
\
-- If no third argument, use the preset default extension
if ext == '%3' then
ext = rpm.expand('%__cran_default_extension')
end
\
-- Now substitute in all the values
url = string.gsub(url, "PACKNAME", src)
url = string.gsub(url, "PACKVERSION", ver)
url = string.gsub(url, "EXTENSION", ext)
\
print(url)
}
%cran_url() %{lua:
local src = rpm.expand('%1')
local url = rpm.expand('%__cran_project_url_template')
\
-- If no first argument, try %packname, then %name with 'R-' stripped.
-- Note that rpm leaves macros unchanged if they are not defined.
if src == '%1' then
src = rpm.expand('%packname')
end
if src == '%packname' then
src = string.gsub(rpm.expand('%name'), "^R%-", "")
-- Since packname wasn't defined, define it for convenience.
rpm.define("packname " .. src)
end
\
-- Substitute in the URL value
url = string.gsub(url, "PACKNAME", src)
\
print(url)
}
--
Iñaki Ucar