[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