tech-pkg archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: wip/mk/git-package.mk cleanups



On 2014-05-06 16:21, Aleksej Saushev wrote:
>> I believe that the risks associated with creating the symlinks are lower
>> than the risks associated with overriding WRKSRC in every package that
>> uses {cvs,git,hg,svn}-package.mk.  Note that the symlink and its
>> referent are siblings in the filesystem hierarchy, so any relative paths
>> spanning both sides of WRKSRC shouldn't be a problem.
> 
> So far the only reason for symlink is setting WRKSRC.
> Why don't you want to provide default value to it instead?

I did this because a package is allowed to both download a tarball and
check out sources from a repository.  For example, a hypothetical
package foo might do the following:

  1. download foo-1.2.3.tar.gz
  2. extract foo-1.2.3.tar.gz to ${WRKDIR}/foo-1.2.3
  3. clone url://to/bar.git into ${WRKDIR}/bar
  4. build and install the sources in ${WRKDIR}/foo-1.2.3
  5. install ${WRKDIR}/bar/nifty-script to /usr/bin

If I change the default value of WRKSRC, then this package would try to
build the sources in ${WRKDIR}/bar instead of ${WRKDIR}/foo-1.2.3.

Maybe it's OK to require a package developers to manually reset
WRKDIR=${WRKSRC}/${DISTNAME} if they both download a tarball and check
out a repository.  If so, I think this would do what we want:

.if ${CVS_REPOSITORIES:[\#]} == 1
WRKSRC?=        ${WRKDIR}/${CVS_MODULE.${CVS_REPOSITORIES:[1]}}
.endif


BTW, I just noticed that there is a (minor) bug in my patches:  If a
package checks out two different types of repositories (e.g., it both
clones a Git repo and checks out a CVS module) and ${WRKSRC} doesn't
exist by post-extract, then it's a race to determine which symlink will
win.  I'm not sure this is worth fixing; the package developer should
set WRKSRC in this case anyway.

> 
>> If a symlink causes a problem in a particular package, the package
>> maintainer can still set WRKSRC (as required without these patches) to
>> prevent the symlink from being created.
>>
>> I'd like to hear more from the community about this issue (especially
>> alternative suggestions) before I exclude the symlink feature.
> 
> It's a hack that is potentially broken in general on at least one major 
> platform.

Broken how?  On which platform?

> We don't do such a thing in general case.
> As for me, these are enough reasons not to do this.
> 
>> @@ -214,7 +216,7 @@ do-cvs-extract: .PHONY
>>      ${SETENV} ${_CVS_ENV}                                           \
>>        ${_CVS_CMD} ${_CVS_FLAGS} -d ${CVS_ROOT.${repo}:Q}            \
>>          checkout ${_CVS_CHECKOUT_FLAGS} ${_CVS_TAG_FLAG.${repo}}    \
>> -          -d ${repo} ${CVS_MODULE.${repo}:Q};                               
>> \
>> +          ${CVS_MODULE.${repo}:Q};                                  \
>>      ${_CVS_CREATE_CACHE.${repo}}
>>  .endfor
> 
> This goes against your style of providing explicit destination directory,
> but that's alright to me.

Yeah, I was debating which way was better.  Because you brought it up I
think I'll add '-d ${CVS_MODULE.${repo}:Q}' for consistency (even though
it's redundant).

> 
>> --- a/mk/cvs-package.mk
>> +++ b/mk/cvs-package.mk
>> @@ -178,17 +178,19 @@ _CVS_DISTFILE.${repo}= 
>> ${PKGBASE}-${CVS_MODULE.${repo}}-${_CVS_TAG.${repo}}.tar.
>>  
>>  #   command to extract cache file
>>  _CVS_EXTRACT_CACHED.${repo}=        \
>> -    if [ -f ${_CVS_DISTDIR:Q}/${_CVS_DISTFILE.${repo}:Q} ]; then    \
>> -      ${STEP_MSG} "Extracting cached CVS archive 
>> "${_CVS_DISTFILE.${repo}:Q}"."; \
>> -      gzip -d -c ${_CVS_DISTDIR:Q}/${_CVS_DISTFILE.${repo}:Q} | pax -r;     
>> \
>> -      exit 0;                                                       \
>> +    tarball=${_CVS_DISTFILE.${repo}:Q};                             \
>> +    fulltarball=${_CVS_DISTDIR:Q}/$$tarball;                        \
>> +    if [ -f "$$fulltarball" ]; then                                 \
>> +            ${STEP_MSG} "Extracting cached CVS archive $$tarball."; \
>> +            gzip -d -c "$$fulltarball" | pax -r;                    \
>> +            exit 0;                                                 \
>>      fi
> 
> I'm afraid that this change mostly undoes your efforts on proper quoting.

How so?  As far as I can tell everything here is sufficiently quoted.

Note:  POSIX shells do not subject variable assignments to word
splitting.  Thus, in the following script, quotes are unnecessary around
$1 but are necessary around $2 (because bar="$2" is not a variable
assignment; it's an argument to the export command):

   foo=$1
   export bar="$2"

> Anyway, I find this quoting wars against make and sh not productive enough.
> This is less an issue than what is described below.
> 
>>  #   create cache archive
>>  _CVS_CREATE_CACHE.${repo}=  \
>> -    ${STEP_MSG} "Creating cached CVS archive 
>> "${_CVS_DISTFILE.${repo}:Q}"."; \
>> +    ${STEP_MSG} "Creating cached CVS archive $$tarball.";           \
>>      ${MKDIR} ${_CVS_DISTDIR:Q};                                     \
>> -    pax -w ${CVS_MODULE.${repo}:Q} | gzip > 
>> ${_CVS_DISTDIR:Q}/${_CVS_DISTFILE.${repo}:Q}
>> +    pax -w ${CVS_MODULE.${repo}:Q} | gzip >$$fulltarball
>>  .endfor
> 
> Because this makes the code hard to track,

If they were inlined it would be easier to read.  :)

> I suggest that you introduce
> variables in make rather than in sh.

This defeats the purpose -- the make variables and their expansion
modifiers would be very long, e.g. ${_CVS_DISTFILE.${repo}:Q} and
${_CVS_FULLTARBALL.${repo}:Q} instead of $$tarball and $$fulltarball.

I can scrap this commit, though I prefer not to; I hate working with
code that has lines longer than 80 characters.

> 
>> -            gzip -d -c "$$fulltarball" | pax -r;                    \
>> +            pax -r -z -f "$$fulltarball";                           \
> 
> This is wrong. The code was changed from "pax -zrf" to "gzip -dc | pax -r"
> for a reason: not all platforms support "-z".

That's unfortunate.  I'll switch it back and add comments to scare off
future attempts to change it.

> 
>> +post-extract: do-git-post-extract
> 
> ...and similar.
> 
> Because "post-extract" is user-definable, it needs more consideration.
> It may make the code essentially non-deterministic in the sense
> that it may break for some but not for others. It is unclear whether
> this is theoretical or practical as of now. I'd say that you shouldn't use it.

Note that cvs-package.mk already does:

pre-extract: do-cvs-extract
do-cvs-extract: .PHONY
        ...

I would suspect that any argument against do-cvs-post-extract also
applies to do-cvs-extract.  Given that do-cvs-extract seems to work OK,
I don't see a problem with do-cvs-post-extract.

Also note that do-cvs-post-extract is a prerequisite to post-extract, so
it is guaranteed to run before the user-definable post-extract rule.

> 
>> -GIT_MODULE.${repo}?=        ${repo}
>> +# follow the same algorithm that 'git clone' does when "humanizing"
>> +# the clone URL.  first, start with the URL
>> +_GIT_MODULE_D_0.${repo}=    ${GIT_REPO.${repo}}
> 
> I don't like it, but alright. Still, because this code is really unclear
> and messy, please, provide a reference to git documentation where this
> algorithm is described.

It's not documented -- the algorithm is only in source code.  Maybe I'll
scrap this commit to be consistent with the others.

-Richard


Home | Main Index | Thread Index | Old Index