1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
#!/usr/bin/env python2
# vim: set sw=4 sts=4 et :
# Author(s): Nirbheek Chauhan <nirbheek@gentoo.org>
#
# This script does the following:
#
# * For each package in gnome overlay
# * Parse gentoo-bumpchecker output to get current/latest versions
# - Skip if not in gentoo-bumpchecker output
# * Check if current version is in the overlay
# - Check if latest version != current version
# * If it is, bump to latest version, manifest, extract old/new tarballs
# * If not, skip
#
# Created to automate the menial tasks associated with bumping
#
# BUGS:
# * Has problems with masked packages in overlay (due to gentoo-bumpchecker)
# TODO:
# * Ignores all packages without an existing version in gnome overlay
import os, subprocess, shutil
import portage
from portage.output import *
# gentoo-bumpchecker output file
BCO = "SET THIS TO YOUR gentoo-bumpchecker output file path"
PORTDB = portage.db['/']['porttree'].dbapi
GNOME_OVERLAY = PORTDB.getRepositoryPath('gnome')
DISTDIR = portage.settings['DISTDIR']
PORTDIR = portage.settings['PORTDIR']
os.chdir(GNOME_OVERLAY)
def versions(pkg):
"""Return current version, official version, latest version of given pkg"""
process = subprocess.Popen("grep -A 3 -we %s %s" % (pkg, BCO), shell=True,
stdout=subprocess.PIPE)
process.wait()
output = process.stdout.read()
return output.replace('<td>', '').replace('</td>', '')
# NOTE: Not compatible with EAPI=2 distfile renaming
def fetch_distfile(cpv):
"""Manually fetch the distfile for an ebuild cpv"""
distfile = gnome_distfile(cpv, fulluri=True)
distfile = distfile.replace("mirror://", "http://ftp.gnome.org/pub/")
subprocess.check_call("wget '%s' -P '%s'" % (distfile, DISTDIR), shell=True)
# NOTE: Not compatible with EAPI=2 distfile renaming
def gnome_distfile(cpv, fulluri=False):
"""Return gnome tarball name from ebuild cpv"""
distfiles = portage.portdb.aux_get(cpv, ['SRC_URI'])[0].split()
for distfile in distfiles:
if distfile.find('mirror://gnome') != -1:
if fulluri:
return distfile
else:
return os.path.basename(distfile)
def match_cpv_to_ebuild(categ, pkg, ver):
"""Matches cpv to an ebuild, and returns a correspondinglyadjusted version.
Returns (None, None) if no matching ebuild found"""
pv = "%s-%s" % (pkg, ver)
overlay_path = "%s/%s/%s" % (GNOME_OVERLAY, categ, pkg)
overlay_ebuilds = [i for i in os.listdir(overlay_path) if i.endswith('.ebuild')]
for ebuild in overlay_ebuilds:
if ebuild.find(pv) != -1:
ebuild_path = "%s/%s" % (overlay_path, ebuild)
parts = portage.catpkgsplit(ebuild.split('.ebuild')[0])[-2:]
version = "%s-%s" % (parts[-2], parts[-1])
return (ebuild_path, version.replace('-r0', ''))
return (None, None)
# Portage section, disabled for now.
# portdir_path = "%s/%s/%s" % (PORTDIR, categ, pkg)
# portdir_ebuilds = os.listdir(portdir_path)
# for ebuild in portdir_ebuilds:
# if ebuild.find(pv) != -1:
# return "%s/%s" % (portdir_path, ebuild)
dirs = os.listdir('.')
categs = []
for i in dirs:
if os.path.isdir(i) and i.find('-') != -1:
categs.append(i)
for categ in categs:
for pkg in os.listdir(categ):
# Get versions from bumpchecker output
vers = versions(pkg).split()
if not vers:
continue
cv = vers[1] # Current Version
lv = vers[3] # Latest Version
if cv >= lv:
continue
(ce, cv) = match_cpv_to_ebuild(categ, pkg, cv)
le = "%s/%s/%s-%s.ebuild" % (categ, pkg, pkg, lv)
if not ce:
# No matching ebuild found in overlay
continue
### Start Work ###
# Distfile for current ebuild
cd = gnome_distfile('%s/%s-%s' % (categ, pkg, cv))
# If distfile for current ebuild does not exist
if not os.path.exists("%s/%s" % (DISTDIR, cd)):
print yellow("%s/%s not found, forcing re-fetch.." % (DISTDIR, cd))
# Manually fetch it
fetch_distfile('%s/%s-%s' % (categ, pkg, cv))
print green("Move ") + "%s -> %s" % (ce, le)
shutil.move(ce, le)
print green("Manifest ") + le
try:
subprocess.check_call("ebuild %s manifest" % le, shell=True)
except subprocess.CalledProcessError:
print red("%s failed to Manifest! Skipping..." % le)
continue
# Distfile for latest ebuild
ld = gnome_distfile('%s/%s-%s' % (categ, pkg, lv))
print green("Extract ") + "%s/%s" % (DISTDIR, cd)
# Extract old tarball
subprocess.check_call("tar xf %s/%s -C %s/%s" % (DISTDIR, cd, categ, pkg),
shell=True)
print green("Extract ") + "%s/%s" % (DISTDIR, ld)
# Extract new tarball
subprocess.check_call("tar xf %s/%s -C %s/%s" % (DISTDIR, ld, categ, pkg),
shell=True)
|