extras-repoclosure rc-modified, NONE, 1.1 rc-report.py, NONE, 1.1 rc-run.py, NONE, 1.1 repoclosure.patch, NONE, 1.1 yum.repoclosure.conf, NONE, 1.1

Michael Schwendt (mschwendt) fedora-extras-commits at redhat.com
Sun Apr 30 11:11:54 UTC 2006


Author: mschwendt

Update of /cvs/fedora/extras-repoclosure
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv32253

Added Files:
	rc-modified rc-report.py rc-run.py repoclosure.patch 
	yum.repoclosure.conf 
Log Message:
initial import


--- NEW FILE rc-modified ---
#!/usr/bin/python -t

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Library General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# seth vidal 2005 (c) etc etc


#Read in the metadata of a series of repositories and check all the
#   dependencies in all packages for resolution. Print out the list of
#   packages with unresolved dependencies

import sys
import os

import yum
import yum.Errors
from yum.misc import getCacheDir
from optparse import OptionParser
import rpmUtils.arch
from yum.constants import *
from repomd.packageSack import ListPackageSack


def parseArgs():
    usage = "usage: %s [-c <config file>] [-a <arch>] [-r <repoid>] [-r <repoid2>]" % sys.argv[0]
    parser = OptionParser(usage=usage)
    parser.add_option("-c", "--config", default='/etc/yum.conf',
        help='config file to use (defaults to /etc/yum.conf)')
    parser.add_option("-a", "--arch", default=None,
        help='check as if running the specified arch (default: current arch)')
    parser.add_option("-r", "--repoid", default=[], action='append',
        help="specify repo ids to query, can be specified multiple times (default is all enabled)")
    parser.add_option("-t", "--tempcache", default=False, action="store_true", 
        help="Use a temp dir for storing/accessing yum-cache")
    parser.add_option("-q", "--quiet", default=0, action="store_true", 
                      help="quiet (no output to stderr)")
    parser.add_option("-n", "--newest", default=0, action="store_true",
                      help="check only the newest packages in the repos")
    (opts, args) = parser.parse_args()
    return (opts, args)

class RepoClosure(yum.YumBase):
    def __init__(self, arch = None, config = "/etc/yum.conf"):
        yum.YumBase.__init__(self)

        self.arch = arch
        self.doConfigSetup(fn = config)
        if hasattr(self.repos, 'sqlite'):
            self.repos.sqlite = False
            self.repos._selectSackType()
    
    def evrTupletoVer(self,tuple):
        """convert and evr tuple to a version string, return None if nothing
        to convert"""
    
        e, v,r = tuple

        if v is None:
            return None
    
        val = ''
        if e is not None:
            val = '%s:%s' % (e, v)
    
        if r is not None:
            val = '%s-%s' % (val, r)
    
        return val
    
    def readMetadata(self):
        self.doRepoSetup()
        self.doSackSetup(rpmUtils.arch.getArchList(self.arch))
        for repo in self.repos.listEnabled():
            self.repos.populateSack(which=[repo.id], with='filelists')

    def getBrokenDeps(self, newest=False):
        unresolved = {}
        resolved = {}
        if newest:
            pkgs = []
            for l in self.pkgSack.returnNewestByName():
                for p in l:
                    pkgs.append(p)
        else:
            pkgs = self.pkgSack

        mypkgSack = ListPackageSack(pkgs)
        pkgtuplist = mypkgSack.simplePkgList()
        
        for pkg in pkgs:
            for (req, flags, (reqe, reqv, reqr)) in pkg.returnPrco('requires'):
                if req.startswith('rpmlib'): continue # ignore rpmlib deps
            
                ver = self.evrTupletoVer((reqe, reqv, reqr))
                if resolved.has_key((req,flags,ver)):
                    continue
                try:
                    resolve_sack = self.whatProvides(req, flags, ver)
                except yum.Errors.RepoError, e:
                    pass
            
                if len(resolve_sack) < 1:
                    if not unresolved.has_key(pkg):
                        unresolved[pkg] = []
                    unresolved[pkg].append((req, flags, ver))
                    continue
                    
                if newest:
                    resolved_by_newest = False
                    for po in resolve_sack:# look through and make sure all our answers are newest-only
                        if po.pkgtup in pkgtuplist:
                            resolved_by_newest = True
                            break

                    if resolved_by_newest:                    
                        resolved[(req,flags,ver)] = 1
                    else:
                        if not unresolved.has_key(pkg):
                            unresolved[pkg] = []
                        unresolved[pkg].append((req, flags, ver))                        
                        
        return unresolved
    
    
    def log(self, value, msg):
        pass

def main():
    (opts, cruft) = parseArgs()
    my = RepoClosure(arch = opts.arch, config = opts.config)
    
    if opts.repoid:
        for repo in my.repos.repos.values():
            if repo.id not in opts.repoid:
                repo.disable()
            else:
                repo.enable()

    if os.geteuid() != 0 or opts.tempcache:
        cachedir = getCacheDir()
        if cachedir is None:
            print "Error: Could not make cachedir, exiting"
            sys.exit(50)
            
        my.repos.setCacheDir(cachedir)

    if not opts.quiet:
        print 'Reading in repository metadata - please wait....'

    try:
        my.readMetadata()
    except yum.Errors.RepoError, e:
        print 'Filelists not available for repo: %s' % repo
        print 'Some dependencies may not be complete for this repository'
        print 'Run as root to get all dependencies or use -t to enable a user temp cache'

    if not opts.quiet:
        print 'Checking Dependencies'

    baddeps = my.getBrokenDeps(opts.newest)
    if opts.newest:
        pkgs = []
        for l in my.pkgSack.returnNewestByName():
            for p in l:
                pkgs.append(p)
        num = len(pkgs)
    else:
        num = len(my.pkgSack)
        
    repos = my.repos.listEnabled()

    if not opts.quiet:
        print 'Repos looked at: %s' % len(repos)
        for repo in repos:
            print '   %s' % repo
        print 'Num Packages in Repos: %s' % num
    
    pkgs = baddeps.keys()
    pkgs.sort()
    for pkg in pkgs:
        srcrpm = pkg.returnSimple('sourcerpm')
        print 'source rpm: %s\npackage: %s from %s\n  unresolved deps: ' % (srcrpm, pkg, pkg.repoid)
        for (n, f, v) in baddeps[pkg]:
            req = '%s' % n
            if f: 
                flag = LETTERFLAGS[f]
                req = '%s %s'% (req, flag)
            if v:
                req = '%s %s' % (req, v)
            
            print '     %s' % req
        print

if __name__ == "__main__":
    main()
        


--- NEW FILE rc-report.py ---
#!/usr/bin/python
# -*- mode: Python; indent-tabs-mode: nil; -*-

import commands
import datetime, time
import os, sys
import re
import smtplib

domail = 1
mailsummary = 1
savehistory = 1
usehistory = True

maxmailsize = 39*1024

fromaddr = 'Fedora Extras repoclosure <buildsys at fedoraproject.org>'
replytoaddr = 'fedora-extras-list at redhat.com'
subject = 'Broken dependencies in Fedora Extras'

mailserver = 'localhost'
mailuser = ''
mailpasswd = ''

# Don't repeat a report for a src.rpm for 14 days.
waitdelta = datetime.timedelta( days = 14 )
today = datetime.date.today()


# Interface to Fedora Extras CVS owners/owners.list
class OwnersList:
    
    owners = {}  # map package name to email address, owners[name]

    def Download(self):
        # Remove 'owners' directory.
        for root, dirs, files in os.walk( 'owners', topdown=False ):
            for fname in files:
                os.remove(os.path.join( root, fname ))
            for dname in dirs:
                os.rmdir(os.path.join( root, dname ))
        # Retry CVS checkout a few times.
        for count in range(3):
            (rc, rv) = commands.getstatusoutput('LC_ALL=C CVS_RSH=rsh CVSROOT=:pserver:anonymous at cvs.fedora.redhat.com:/cvs/extras cvs co owners')
            if not rc:
                break
            time.sleep(300)
        if rc:
            print rv
            sys.exit(1)

    def Refresh(self):
        self.ownersfile = 'owners/owners.list'
        self.owners = {}
        # Dumb caching. Check that file exists and is "quite recent".
        try:
            fstats = os.stat(self.ownersfile)
            if ( not fstats.st_size or ((time.time() - fstats.st_ctime) > 3600*2) ):
                raise Exception
        except:
            self.Download()
        try:
            f = file( self.ownersfile )
        except:
            print 'ERROR: could not open %s' % self.ownersfile
            sys.exit(5)
        for line in f:
            if line.startswith('#') or line.isspace():
                continue
            try:
                (repo,pkgname,summary,email,qacontact,cc) = line.split('|')
                if email.find('@') < 0:  # owners.list is broken
                    raise Exception
                self.owners[pkgname] = email
                #print '%s -> %s' % (pkgname, self.owners[pkgname])
            except:
                print 'ERROR: owners.list is broken'
                print line
        f.close()

    def GetOwner(self,name):
        try:
            r = self.owners[name]
        except KeyError:
            r = ''
        return r
        
    def __init__(self):
        self.Refresh()



# We identify broken packages based on their src.rpm name and don't report
# them more than once until expiration.
class History:

    history = {}
    incoming = {}

    def __init__(self): # Load history map file and expire its contents.
        try:
            f = file ('history.txt')
            for line in f:
                (srcrpm,timestamp) = line.rstrip().split(' ')
                (y,m,d) = timestamp.split('-')
                timestamp = datetime.date( int(y), int(m), int(d) )
                if ( timestamp+waitdelta > today ):   # Filter out entries which are too old.
                    self.history[srcrpm] = timestamp
            f.close()
        except IOError:
            print 'WARNING: could not open history file for reading'
        except:
            pass

    def Save(self):
        for srcrpm,timestamp in self.incoming.iteritems():
            self.Set(srcrpm,timestamp)
        try:
            f = file ('history.txt','w')
            for srcrpm,timestamp in self.history.iteritems():
                f.write(  ('%s %s\n' % (srcrpm,timestamp)) )
            f.close()
        except:
            print 'WARNING: could not open history file for writing'

    def Set(self,srcrpmname,timestamp):
        self.history[srcrpmname] = timestamp

    def SetDelayed(self,srcrpmname,timestamp):
        self.incoming[srcrpmname] = timestamp

    def Get(self,srcrpmname):
        try:
            r = self.history[srcrpmname]
        except KeyError:
            r = 0
        return r



def mail(smtp, fromaddr, toaddrs, replytoaddr, subject, body):
    from email.Header import Header
    from email.MIMEText import MIMEText
    msg = MIMEText( body, 'plain' )
    from email.Utils import make_msgid
    msg['Message-Id'] = make_msgid()
    msg['Subject'] = Header(subject)
    msg['From'] = Header(fromaddr)
    from email.Utils import formatdate
    msg['Date'] = formatdate()
    if len(replytoaddr):
        msg['ReplyTo'] = Header(replytoaddr)

    if isinstance(toaddrs, basestring):
        toaddrs = [toaddrs]
    to = ''
    for t in toaddrs:
        if len(to):
            to += ', '
        to += t
    msg['To'] = Header(to)

    try:
        r = smtp.sendmail( fromaddr, toaddrs, msg.as_string(False) )
        for (name, errormsg) in r.iteritems():
            print name, ':', errormsg
    except smtplib.SMTPRecipientsRefused, obj:
        print 'ERROR: SMTPRecipientsRefused'
        for (addr, errormsg) in obj.recipients.iteritems():
            print addr, ':', errormsg
    except smtplib.SMTPException:
        print 'ERROR: SMTPException'



def mailsplit(smtp, fromaddr, toaddrs, replytoaddr, subject, body):
    # NB: crude implementation - could also split at line positions
    parts = 0
    start = 0
    end = len(body)
    slices = []
    while ( start < end ):
        if ( (end-start) > maxmailsize ):
            nextstart = body.rfind( 'package: ', start, start+maxmailsize )
            if ( nextstart < 0 ):
                nextstart = body.rfind( '\n', start, start+maxmailsize )
                if ( nextstart < 0 ):
                    print 'ERROR: cannot split mail body cleanly'
                    nextstart = end
        else:
            nextstart = end
        slices.append( (start, nextstart) )
        start = nextstart
        parts += 1

    curpart = 1
    for (start,end) in slices:
        if (parts>1):
            subjectmodified = ( '(%d/%d) %s' % (curpart, parts, subject) )
        else:
            subjectmodified = subject
        slicedbody = body[start:end]
        mail(smtp,fromaddr,toaddrs,replytoaddr,subjectmodified,slicedbody)
        curpart += 1



if len(sys.argv) != 3:
    print 'SYNTAX: %s <release> <logfile>' % sys.argv[0]
    sys.exit(22)
release = sys.argv[1]
logfilename = sys.argv[2]

# This is ugly to get the report date from the report file name.
datere = re.compile('-(?P<timestamp>[0-9]+-[0-9]+-[0-9]+).txt$')
res = datere.search(logfilename)
if res:
    datestring = res.group('timestamp')
else:
    datestring = today

subject += (' %s - %s' % (release,datestring))
summail = ''

owners = OwnersList()
history = History()
report = {}  # Map, report[email], mail message body to be sent to somebody.
summary = []  # list of "package version.arch" lines
oldproblems = []
repoids = {}  # affected repository ids

pkgre = re.compile('(?P<name>.*)-[^-]+-[^-]+$')
inbody = False
srcrpm = ''
ownedby = ''
createreport = False
try:
    f = file( logfilename )
except:
    print 'ERROR: could not open input file'
    sys.exit(5)

for line in f:
    if line.startswith('source rpm: '):
        w = line.rstrip().split(' ')
        if ( len(w) >= 3 ):
            srcrpm = w[2]
            inbody = True
            createreport = not (usehistory and history.Get(srcrpm))
            if not history.Get(srcrpm):
                history.SetDelayed(srcrpm,today)
        else:
            inbody = False
        continue
    elif inbody and line.startswith('package: '):
        w = line.rstrip().split(' ')
        repoid = w[5]
        # Only report broken packages in Fedora Extras.
        if ( repoid.find('extras') < 0 ):
            inbody = False
            continue

        res = pkgre.search(srcrpm) # try to get src.rpm "name"
        if not res: # only true for invalid input
            inbody = False
            continue
        name = res.group('name')
        
        ownedby = owners.GetOwner(name)
        if ownedby == '':
            x = 'ERROR: %s not in owners.list\nERROR: source rpm is %s' % ( name, srcrpm )
            summail += x + '\n'
            inbody = False
            continue
        # name  EVR.arch
        summary.append ( ' '.join( ['\t', w[1], '  ', w[3], repoid] ) )
        repoids[repoid] = 1
    if inbody:
        # Construct report for package owner.
        if createreport:
            try:
                report[ownedby] += line
            except KeyError:
                report[ownedby] = line
        else:
            oldproblems.append(line)

if savehistory:
    history.Save()

summary.sort()
repos = repoids.keys()
repos.sort()
for repoid in repos:
    count = 0
    summail += ('Summary of broken packages in %s:\n' % repoid) + '-'*70+'\n'
    for name in summary:
        p = name.find(repoid)
        if p >= 0:
            summail += name[:p]
            summail += '\n'
            count += 1
    if not count:
        summail += 'None\n'
    summail += '\n'

if domail:
    srv = smtplib.SMTP( mailserver )
    #srv.set_debuglevel(1)
    if ( len(mailuser) and len(mailpasswd) ):
        try:
            srv.login( mailuser, mailpasswd )
        except smtplib.SMTPException:
            print 'ERROR: mailserver login failed'
            sys.exit(-1)

# Send mail to every package owner with broken package dependencies.
for toaddr,body in report.iteritems():
    x = '='*70
    summail += x+'\n'
    x = 'New report for: %s\n\n%s' % ( toaddr.replace('@',' AT '), body)
    summail += x

    mailtext = 'This is an automated mail created by an experimental script.\nYour following packages in the repository contain broken dependencies:\n\n'
    mailtext += body
    if domail:
        mailsplit( srv, fromaddr, toaddr, replytoaddr, subject, mailtext )

if len(oldproblems):
    summail += '\n'+'='*70+'\n'
    for line in oldproblems:
        summail += line
if domail and mailsummary:
    toaddr = replytoaddr  # mail summary to list
    mailsplit( srv, fromaddr, toaddr, '', ('Summary - %s' % subject), summail )

if domail:
    srv.quit()


--- NEW FILE rc-run.py ---
#!/usr/bin/python
# -*- mode: Python; indent-tabs-mode: nil; -*-

# If executed as "rc-run-all.py" it processes all releases.

import fcntl, os, sys
import datetime, time

allreleases = [ '3', '4', '5', 'development' ]

archs = { '3' : ['i386','x86_64'],
          '4' : ['i386','x86_64','ppc'],
          '5' : ['i386','x86_64','ppc'],
          'development' : ['i386','x86_64','ppc']
          }

repos = { '3' : ['fedora-core','fedora-core-updates','fedora-extras'],
          '4' : ['fedora-core','fedora-core-updates','fedora-extras'],
          '5' : ['fedora-core','fedora-core-updates','fedora-extras'],
          'development' : ['fedora-core','fedora-extras']
          }

targetarchs = { 'i386' : 'i686',
                'x86_64' : 'x86_64',
                'ppc' : 'ppc'
                }

def makereport():
    try:
        os.remove(logfilename)
    except:
        pass
    for arch in archs[release]:
        rcargs = ('-a %s ' % targetarchs[arch])
        for r in repos[release]:
            repoid = '%s-%s-%s' % (r,release,arch)
            rcargs += ('-r %s ' % repoid)
        # -n, --newest : yum-utils 0.5
        rc = os.system('./rc-modified -q -n -c ./yum.repoclosure.conf %s >> %s' % (rcargs,logfilename))
        if rc:
            return False
    return True

# Main.

# Delete old log files.
import glob
now = time.time()
for file in glob.glob('./rc-fe*.txt'):
    if ( (now - os.stat(file).st_mtime) > 3600*24*14 ):
        try:
            os.remove(file)
        except:
            pass

today = datetime.date.today()
releases = []

f = open('rc-run.lockfile','w')
try:
    rc = fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB)
    f.write( ('%s' % today) )
except IOError:
    print 'ERROR: script locked via lockfile - it seems to be running already'
    sys.exit(11)

if sys.argv[0].endswith('rc-run-all.py'): # process all releases
    for release in allreleases:
        releases.append(release)
else: # process one release given as command-line argument
    if len(sys.argv) != 2:
        print 'SYNTAX: %s <release>' % sys.argv[0]
        sys.exit(22)
    release = sys.argv[1]
    if release not in archs:
        print 'ERROR: release %s is not supported' % release
        sys.exit(22)
    releases = [release]

goodlogs = []
badlogs = []
for release in releases:
    logfilename = ('rc-fe%s-%s.txt' % (release,today))
    rv = False
    for count in range(3):
        rv = makereport()
        if ( rv ):
            goodlogs.append( (release,logfilename) )
            break
        print 'ERROR: running repoclosure for %s failed' % release
        time.sleep(720)
    if ( not rv ):
        badlogs.append( (release,logfilename) )

for (release,logfilename) in goodlogs:
    rc = os.system('./rc-report.py %s %s' % (release,logfilename))

fcntl.flock(f, fcntl.LOCK_UN)
f.close()
sys.exit(0)

repoclosure.patch:

--- NEW FILE repoclosure.patch ---
Against yum-utils-0.5:

--- /usr/bin/repoclosure	2006-02-23 18:06:16.000000000 +0100
+++ rc-modified	2006-04-30 13:02:35.000000000 +0200
@@ -88,7 +88,10 @@
         unresolved = {}
         resolved = {}
         if newest:
-            pkgs = self.pkgSack.returnNewestByNameArch()
+            pkgs = []
+            for l in self.pkgSack.returnNewestByName():
+                for p in l:
+                    pkgs.append(p)
         else:
             pkgs = self.pkgSack
 
@@ -167,7 +170,11 @@
 
     baddeps = my.getBrokenDeps(opts.newest)
     if opts.newest:
-        num = len(my.pkgSack.returnNewestByNameArch())
+        pkgs = []
+        for l in my.pkgSack.returnNewestByName():
+            for p in l:
+                pkgs.append(p)
+        num = len(pkgs)
     else:
         num = len(my.pkgSack)
         
@@ -182,7 +189,8 @@
     pkgs = baddeps.keys()
     pkgs.sort()
     for pkg in pkgs:
-        print 'package: %s from %s\n  unresolved deps: ' % (pkg, pkg.repoid)
+        srcrpm = pkg.returnSimple('sourcerpm')
+        print 'source rpm: %s\npackage: %s from %s\n  unresolved deps: ' % (srcrpm, pkg, pkg.repoid)
         for (n, f, v) in baddeps[pkg]:
             req = '%s' % n
             if f: 
@@ -192,6 +200,7 @@
                 req = '%s %s' % (req, v)
             
             print '     %s' % req
+        print
 
 if __name__ == "__main__":
     main()


--- NEW FILE yum.repoclosure.conf ---
[main]
cachedir=/var/cache/yum
debuglevel=2
logfile=/var/log/yum.log
pkgpolicy=newest
distroverpkg=redhat-release
tolerant=1
exactarch=1
retries=20
obsoletes=1
gpgcheck=1


# ===============================================================
# ATTENTION!
# Fedora Extras repository ids must contain the string 'extras'!
# ===============================================================

# Fedora Extras Development

[fedora-core-development-i386]
name=Fedora Core development i386
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/development/i386/
enabled=0

[fedora-extras-development-i386]
name=Fedora Extras development i386
baseurl=http://fedoraproject.org/extras/development/i386/
enabled=0


[fedora-core-development-x86_64]
name=Fedora Core development x86_64
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/development/x86_64/
enabled=0

[fedora-extras-development-x86_64]
name=Fedora Extras development x86_64
baseurl=http://fedoraproject.org/extras/development/x86_64/
enabled=0


[fedora-core-development-ppc]
name=Fedora Core development ppc
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/development/ppc/
enabled=0

[fedora-extras-development-ppc]
name=Fedora Extras development ppc
baseurl=http://fedoraproject.org/extras/development/ppc/
enabled=0


# Fedora Extras 5

[fedora-core-5-i386]
name=Fedora Core 5 i386
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/5/i386/os/
enabled=0

[fedora-core-updates-5-i386]
name=Fedora Core 5 Updates i386
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/updates/5/i386/
enabled=0

[fedora-extras-5-i386]
name=Fedora Extras 5 i386
baseurl=http://fedoraproject.org/extras/5/i386/
enabled=0


[fedora-core-5-x86_64]
name=Fedora Core 5 x86_64
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/5/x86_64/os/
enabled=0

[fedora-core-updates-5-x86_64]
name=Fedora Core 5 Updates x86_64
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/updates/5/x86_64/
enabled=0

[fedora-extras-5-x86_64]
name=Fedora Extras 5 x86_64
baseurl=http://fedoraproject.org/extras/5/x86_64/
enabled=0


[fedora-core-5-ppc]
name=Fedora Core 5 ppc
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/5/ppc/os/
enabled=0

[fedora-core-updates-5-ppc]
name=Fedora Core 5 Updates ppc
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/updates/5/ppc/
enabled=0

[fedora-extras-5-ppc]
name=Fedora Extras 5 ppc
baseurl=http://fedoraproject.org/extras/5/ppc/
enabled=0


## Fedora Extras 4

[fedora-core-4-i386]
name=Fedora Core 4 i386
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/4/i386/os/
enabled=0

[fedora-core-updates-4-i386]
name=Fedora Core 4 Updates i386
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/updates/4/i386/
enabled=0

[fedora-extras-4-i386]
name=Fedora Extras 4 i386
baseurl=http://fedoraproject.org/extras/4/i386/
enabled=0


[fedora-core-4-x86_64]
name=Fedora Core 4 x86_64
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/4/x86_64/os/
enabled=0

[fedora-core-updates-4-x86_64]
name=Fedora Core 4 Updates x86_64
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/updates/4/x86_64/
enabled=0

[fedora-extras-4-x86_64]
name=Fedora Extras 4 x86_64
baseurl=http://fedoraproject.org/extras/4/x86_64/
enabled=0


[fedora-core-4-ppc]
name=Fedora Core 4 ppc
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/4/ppc/os/
enabled=0

[fedora-core-updates-4-ppc]
name=Fedora Core 4 Updates ppc
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/updates/4/ppc/
enabled=0

[fedora-extras-4-ppc]
name=Fedora Extras 4 ppc
baseurl=http://fedoraproject.org/extras/4/ppc/
enabled=0


## Fedora Extras 3

[fedora-core-3-i386]
name=Fedora Core 3 i386
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/3/i386/os/
enabled=0

[fedora-core-updates-3-i386]
name=Fedora Core 3 Updates i386
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/updates/3/i386/
enabled=0

[fedora-extras-3-i386]
name=Fedora Extras 3 i386
baseurl=http://fedoraproject.org/extras/3/i386/
enabled=0


[fedora-core-3-x86_64]
name=Fedora Core 3 x86_64
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/3/x86_64/os/
enabled=0

[fedora-core-updates-3-x86_64]
name=Fedora Core 3 Updates x86_64
baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/updates/3/x86_64/
enabled=0

[fedora-extras-3-x86_64]
name=Fedora Extras 3 x86_64
baseurl=http://fedoraproject.org/extras/3/x86_64/
enabled=0





More information about the scm-commits mailing list