[master][PATCH] Add automatic fetching of RPMs for new Defines & Requires

Martin Kolman mkolman at redhat.com
Thu Jul 25 08:53:08 UTC 2013


On Wed, 2013-07-24 at 12:06 -0700, Brian C. Lane wrote:
> On Wed, Jul 24, 2013 at 03:03:16PM +0200, Martin Kolman wrote:
> > When the -f or --fetch flag is used, the Anaconda spec file
> > diff will be checked for new packages specified with Defines and
> > Requires and will then automatically download and include RPMs
> > belonging to those packages in the updates image.
> 
> Nice idea!
Thanks!
> 
> > +RPM_FOLDER_NAME = "updates_rpm_cache"
> 
> This should probably go in ~/.updates_rpm_cache so that it doesn't get
> clobbered by a git clean -xdf
> 
> > +KOJI_BASE_URL = "http://kojipkgs.fedoraproject.org//packages/%s/%s/%s/%s/%s"
> >  
> >  def getArchiveTag(configure, spec):
> >      tag = ""
> > @@ -82,6 +88,19 @@ def getArchiveTagOffset(configure, spec, offset):
> >      except IndexError:
> >          return tag
> >  
> > +def get_anaconda_version():
> > +    """Get current anaconda version as string from the configure script"""
> > +    f = open("configure.ac", "rc")
> > +    match = re.search(r"AC_INIT\(\[.*\],\ \[(.*)\],\ \[.*\]\)", f.read())
> > +    f.close()
> > +    return match.groups()[0]
> > +
> > +def get_fedora_version():
> > +    """Return integer representing current Fedora number,
> > +    based on Anaconda version"""
> > +    anaconda_version = get_anaconda_version()
> > +    return int(anaconda_version.split(".")[0])
> > +
> >  def doGitDiff(tag, args=[]):
> >      proc = subprocess.Popen(['git', 'diff', '--name-status', tag] + args,
> >                              stdout=subprocess.PIPE,
> > @@ -90,6 +109,44 @@ def doGitDiff(tag, args=[]):
> >      lines = proc[0].split('\n')
> >      return lines
> >  
> > +def doGitContentDiff(tag, args=[]):
> > +    proc = subprocess.Popen(['git', 'diff', tag] + args,
> > +                            stdout=subprocess.PIPE,
> > +                            stderr=subprocess.PIPE).communicate()
> > +    lines = proc[0].split('\n')
> > +    return lines
> > +
> > +def download_with_progress(url, path):
> > +    try:
> > +        request = urllib2.urlopen(url)
> > +        f = open(path, 'wb')
> 
> Using with open() as f: saves you the close and closes on errors.
> 
> 
> > +        metadata = request.info()
> > +        size = int(metadata.getheaders("Content-Length")[0])
> > +        print("Downloading: {0} Bytes: {1}".format(url, size))
> > +        download_size = 0
> > +        block_size = 8192
> 
> 8K is way too small a buffer. Really, using python to read and write
> like this is really inefficient -- I'd just shell out to wget or curl
> for the download, they can do progress reporting and are much more
> efficient.
I think I'll just replace it with urlgrabber, which should be even
preinstalled on most machines due to Yum.

> 
> > +def check_for_new_packages(tag, arch):
> > +    """Download any new packages added to Requires and Defines
> > +    since the given tag, return list of RPM paths"""
> 
> Multiline docstrings should end with """ on a line by themselves.
> 
> > +        # leave only results that are ither noarch or are built
> 
> type: either
> 
> 
> > +        # for the current architecture
> > +        allowed = ("noarch.rpm", "%s.rpm" % arch)
> > +        results = [x for x in results if x['name'].endswith(allowed)]
> > +        if results:  # any packages left ?
> > +            rpm_name = results[0]['name']
> > +            print("RPM found: %s" % rpm_name)
> > +            rpm_id = results[0]['id']
> > +            # get info about the RPM to
> > +            # get the arch and build_id
> > +            result = kojiclient.getRPM(rpm_id)
> > +            arch = result['arch']
> > +            release = result['release']
> > +            build_id = result['build_id']
> > +            # so we can get the toplevel package name and version
> > +            result = kojiclient.getBuild(build_id)
> > +            toplevel_name = result['package_name']
> > +            toplevel_version = result['version']
> > +            # and use the information to build the URL
> > +            url = KOJI_BASE_URL % (toplevel_name, toplevel_version,
> > +                                   release, arch, rpm_name)
> 
> Does result have name in it as well? You could make KOJI_BASE_URL a
> .format() style string and just pass the result dict to it.
Good point with format(), that should look a lot cleaner.
But I think I need to do all those requests as all the needed
information is scattered across all of them - so I'll just build a dict
& pass it to format().


> 
> _______________________________________________
> anaconda-patches mailing list
> anaconda-patches at lists.fedorahosted.org
> https://lists.fedorahosted.org/mailman/listinfo/anaconda-patches




More information about the anaconda-patches mailing list