Tison,

> On Apr 28, 2024, at 12:10 PM, tison <wander4...@gmail.com> wrote:
> 
> Thank you, Dave :D
> 
> It gives a reason. I'm OK with this explanation now so that I won't bring
> it to the INFRA.
> 
> Back to the original purpose of this thread, I suggest:
> 
> 1. Go through our Incubator Guide and find if we have some references to
> this release distribution policy (maybe in [1][2]). Then, make this
> requirement clear and discoverable.
> 2. Try to implement the preview feature and add the verify items in one
> project so later we use it as a reference.
> 
> [1] https://incubator.apache.org/guides/distribution.html
> [2] https://incubator.apache.org/guides/releasemanagement.html

FYI - The incubator clutch analysis includes generated release download 
sections for all releases it finds in the incubator directory on the 
dist.apache.org svn repository:

For example: https://incubator.apache.org/clutch/streampark.html

See https://svn.apache.org/repos/asf/incubator/public/trunk/clutch2status.py:

    print("== Releases",file=f)
    print("",file=f)
    print("=== Current",file=f)
    print("",file=f)
    hasKeys = False
    url1 = urls['keys']
    if len(url1) > 0:
        hasKeys = True
        print("*{0}[Signing Keys]*".format(url1),file=f)
        url1 = "/".join(url1.split("/")[:-1])+"/"
        print("",file=f)
        print("It is essential that you verify the integrity of release 
downloads. See https://www.apache.org/dyn/closer.cgi#verify[instructions 
here]",file=f)
    else:
        print("*No PGP Signing Keys*",file=f)
    jj = 0
    fsize = 0
    if len(projects[k]['releases']) > 0 and hasKeys:
        j = 1
        for r in sorted(projects[k]['releases']):
            path = 
"{0}/{1}/{2}".format(k,projects[k]['releases'][r]['folder'],r)
            print("",file=f)
            print("==== {0}: {1}".format(j,r),file=f)
            print("",file=f)
            print("| *{0}{1}[Download]* | *{2}{3}.asc[Signature]* | 
*{4}{5}.{6}[Hash]* | {7}".format(
                  "https://www.apache.org/dyn/closer.lua/incubator/";, path,
                  "https://downloads.apache.org/incubator/";, path,
                  "https://downloads.apache.org/incubator/";, path, 
projects[k]['releases'][r]['hash'],
                  r),file=f)
            print("-- Filesize: 
{0}".format(humanbytes(float(projects[k]['releases'][r]['size']))),file=f)
            print("-- Released: {0} by {1} in {2}".format(
                  projects[k]['releases'][r]['dtm'],
                  projects[k]['releases'][r]['user'],
                  projects[k]['releases'][r]['revision']),file=f)
            j += 1
            fsize += int(projects[k]['releases'][r]['size'])
        print("",file=f)
        print("Total size of all downloads = 
{0}".format(humanbytes(float(fsize))),file=f)
    elif hasKeys:
        print(NO_RELEASES.format(projects[k]['fullName']),file=f)
    print("",file=f)

And https://svn.apache.org/repos/asf/incubator/public/trunk/clutch2.py

with osPopen(['svn', 'ls', '-Rv', 
'https://dist.apache.org/repos/dist/release/incubator']) as s:
    for line in s.stdout:
        line = line.strip()
        if line[-1:] == '/':
            # skip directories                                                  
                                                                                
   
            continue
        listing = line.split(' ')
        revision = "r{0}".format(listing[0])
        user = listing[1]
        if listing[-6] == '':
            dtm1 = datetime.datetime.strptime(" ".join(listing[-4:-2])+" 
"+str(gatherYear),"%b %d %Y")
            if dtm1 > gatherDate:
                dtm1 = datetime.datetime.strptime(" ".join(listing[-4:-2])+" 
"+str(gatherYear-1),"%b %d %Y")
            fsize = listing[-5]
        else:
            dtm1 = datetime.datetime.strptime(" ".join(listing[-5:-1]),"%b %d 
%Y")
            fsize = listing[-6]
        dtm = dtm1.strftime("%m/%d/%Y")
        line = listing[-1]
        releasesListing[line] = {
            'user': user,
            'revision': revision,
            'dtm': dtm,
            'size': fsize
            }
        fields = line.split('/')
        podling = fields[0]
        distareas[podling] = True
        file = fields[-1]
        if file:
            if re.search('KEYS(\.txt)?$', file):
                keysList[podling] = 
"{0}/{1}".format("https://downloads.apache.org/incubator";, line)
            if re.search('\.(asc|sig)$', file, flags=re.IGNORECASE):
                path = "/".join(fields[1:])
                if optionVerbose:
                    print("DEBUG: {0} - {1}".format(podling,path))
                try:
                    if distributions[podling]:
                        distributions[podling].append(path)
                except:
                    distributions[podling] = []
                    distributions[podling].append(path)
                if re.search('incubat(ing|or)', file, flags=re.IGNORECASE):
                    releases[podling] = True
                else:
                    releasesBadName[podling] = True
                    if podling in projects and podling != "netbeans":
                        # netbeans has over 600 release parts and had legacy 
naming requirements                                                             
     
                        errorMsg = "WARN: {0}: Release is missing 
incubator/incubating in file name {1}".format(podling,file)
                        print(errorMsg)
                        errorMsg = ["42","Distribution is missing 
incubator/incubating in file name {0}".format(file)]
                        projects[podling]['zFixMeList'].append(errorMsg)
            if re.search('\.(sha512|sha1|sha256|sha|md5)$', file, 
flags=re.IGNORECASE):
                path = "/".join(fields[1:])
                if optionVerbose:
                    print("DEBUG: {0} - {1}".format(podling,path))
                try:
                    # some projects have done a hash on the detached signature. 
Identify and ignore.                                                            
  
                    part0 = ".".join(path.split('.')[-2:-1])
                    if part0 == "asc":
                        continue
                    # see if this is not the first hash for this release        
                                                                                
   
                    # sha512 is preferred and it will be the last provided.     
                                                                                
   
                    part1 = ".".join(distribHash[podling][-1].split('.')[:-1])
                    part2 = ".".join(path.split('.')[:-1])
                    if part1 == part2:
                        distribHash[podling][-1] = path
                    else:
                        distribHash[podling].append(path)
                except:
                    distribHash[podling] = []
                    distribHash[podling].append(path)

Best,
Dave
> 
> I'll try my best to find time to work on it, but I don't declare it an
> assignment.
> 
> Best,
> tison.
> 
> 
> Dave Fisher <w...@apache.org> 于2024年4月29日周一 02:46写道:
> 
>> 
>> 
>>> On Apr 28, 2024, at 9:58 AM, tison <wander4...@gmail.com> wrote:
>>> 
>>> Thank you!
>>> 
>>> I found there is no rationale for these links, and thus, it's quite a bit
>>> challenging in memory.
>>> 
>>> IIRC the closer.lua script is for selecting the most proper CDN for
>>> source/binary bundles in use. They can, technically, work for SHASUM and
>>> signatures also. Why do we use https://downloads.apache.org for the
>> latter
>>> two?
>> 
>> Historically we had a mirror network and closer.lua picked out a mirror
>> near you. In order to be sure that the download source or binary on the
>> mirror was not altered on (or on its way to or from) the mirror, the
>> detached signature and checksums must be served from ASF controlled
>> resources.
>> 
>> Whether or not this still makes sense is a discussion for Infra since they
>> are charged with enforcing and supporting the release distribution policy.
>> 
>> Best,
>> Dave
>> 
>>> 
>>> Best,
>>> tison.
>>> 
>>> 
>>> sebb <seb...@gmail.com> 于2024年4月29日周一 00:34写道:
>>> 
>>>> On Sun, 28 Apr 2024 at 15:38, tison <wander4...@gmail.com> wrote:
>>>>> 
>>>>> Yeah. I support that we always need to release sources on our platform.
>>>>> 
>>>>> Given the links to downloads.apache.org, archive.apache.org,
>>>>> https://www.apache.org/dyn/closer.lua, can be unintuitive for users, I
>>>>> agree that we can have a simple Download page for such library-only
>>>>> projects.
>>>> 
>>>> The download page can also be used for links to release notes, and to
>>>> provide other support information.
>>>> 
>>>>> Here is a patch to cover a minimal download page [1], which is derived
>>>> from
>>>>> OpenDAL's download page [2]. Welcome to leave comments if you find any
>>>>> issues or things we can improve on.
>>>>> 
>>>>> [1] https://github.com/apache/datafusion/pull/10271
>>>> 
>>>> The closer.lua script is only intended for the source and binary
>> bundles.
>>>> 
>>>> The sigs and hashes (and KEYS) should link directly to
>>>> https://downloads.apache.org/datafusion/...
>>>> 
>>>>> [2] https://opendal.apache.org/download
>>>>> 
>>>>> Best,
>>>>> tison.
>>>>> 
>>>>> 
>>>>> Justin Mclean <jus...@classsoftware.com> 于2024年4月28日周日 10:02写道:
>>>>> 
>>>>>> Hi,
>>>>>> 
>>>>>> Projects need to make source releases on ASF infrastructure and have a
>>>>>> download page for good reasons. Some users need a place to verify and
>>>>>> download a trusted release. Having it hosted on ASF infrastructure
>>>> means
>>>>>> people can 100% trust it, unlike 3rd party providers. 3rd party
>>>> providers
>>>>>> have gone rogue in the past (e.g . Source Forge), disappeared (e.g.
>>>> Google
>>>>>> Code), or had multiple serious issues (e.g. NPM). Also by placing a
>>>> release
>>>>>> in the ASF distribution area / a project download page gives
>> confidence
>>>>>> that the ASF release process has been followed and that it is not a
>>>> release
>>>>>> by a 3rd party or an unofficial release of some sort.  IMO, all
>>>> projects
>>>>>> need to have a download page, even if it may not be used by the
>>>> majority of
>>>>>> users.
>>>>>> 
>>>>>> Kind Regards,
>>>>>> Justin
>>>>>> ---------------------------------------------------------------------
>>>>>> To unsubscribe, e-mail: general-unsubscr...@incubator.apache.org
>>>>>> For additional commands, e-mail: general-h...@incubator.apache.org
>>>>>> 
>>>>>> 
>>>> 
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: general-unsubscr...@incubator.apache.org
>>>> For additional commands, e-mail: general-h...@incubator.apache.org
>>>> 
>>>> 
>> 
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: general-unsubscr...@incubator.apache.org
>> For additional commands, e-mail: general-h...@incubator.apache.org
>> 
>> 


---------------------------------------------------------------------
To unsubscribe, e-mail: general-unsubscr...@incubator.apache.org
For additional commands, e-mail: general-h...@incubator.apache.org

Reply via email to