#!/usr/bin/python
#sys.path.append(os.path.expanduser('~/.osc-plugins'))
import sys
import os
import osc
import osc.core
import osc.conf
import xml.etree.ElementTree as ET
import re
os.environ['OSC_CONFIG'] = os.path.expanduser('~/.oscrc-syncer')
#initialize osc config
osc.conf.get_config()
osc.conf.config['debug'] = True
srcmd5s = dict()
revs = dict()
def parse_prj(prj):
url = osc.core.makeurl(osc.conf.config['apiurl'], ['source', prj], { 'view': 'info', 'nofilename': 1 } )
f = osc.core.http_GET(url)
root = ET.parse(f)
ret = dict()
for si in root.findall('./sourceinfo'):
if si.attrib.has_key('lsrcmd5'):
continue # ignore links
package = si.attrib['package']
md5 = si.attrib['verifymd5']
srcmd5s[md5] = si.attrib['srcmd5']
revs[md5] = si.attrib['rev']
if re.match('_product.*', package):
continue
ret[package] = md5
return ret
# POSIX system. Create and return a getch that manipulates the tty.
import termios, sys, tty
def _getch():
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(fd)
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
def get_devel_project(package):
url = osc.core.makeurl(osc.conf.config['apiurl'], ['source', 'openSUSE:Factory', package, '_meta'])
f = osc.core.http_GET(url)
root = ET.parse(f)
for dp in root.findall('./devel'):
return dp.attrib['project']
raise 'NOW WHAT?'
def create_submit(project=None, package=None, rev=None, md5=None):
text = "\n"
text += " \n"
text += " \n"
text += " \n"
text += " \n"
text += " Submit revision " + rev + " of openSUSE:Factory/" + package + "\n"
text += ""
url = osc.core.makeurl(osc.conf.config['apiurl'], [ 'request' ], { 'cmd': 'create' })
#print text
print osc.core.http_POST(url, data=text).read()
def create_delete(package):
text = "\n"
text += " \n"
text += " \n"
text += " \n"
text += " Gone from Factory\n"
text += ""
url = osc.core.makeurl(osc.conf.config['apiurl'], [ 'request' ], { 'cmd': 'create' })
#print text
print osc.core.http_POST(url, data=text).read()
def load_nos():
ret = set()
with open('nos') as f:
for line in f.readlines():
ret.add(line.strip())
return ret
def save_nos(nos):
with open('nos', 'w') as f:
for key in nos:
f.write(key + "\n")
def find_request_md5s(package):
url = osc.core.makeurl(osc.conf.config['apiurl'],
['search', 'request'],
{ 'match': "action/target/@project='openSUSE:13.2' and action/target/@package='{}'".format(package) })
f = osc.core.http_GET(url)
root = ET.parse(f).getroot()
md5s = set()
for rq in root.findall('request'):
for source in rq.findall('.//source'):
md5s.add(source.attrib['rev'])
return md5s
factory = parse_prj('openSUSE:Factory')
d132 = parse_prj('openSUSE:13.2')
NOS = load_nos()
for package in sorted(set(factory) | set(d132)):
prompt = None
if factory.has_key(package):
pmd5 = "%s-%s" % ( package, factory[package] )
if pmd5 in NOS:
continue
if not d132.has_key(package):
if srcmd5s[factory[package]] in find_request_md5s(package):
continue
elif factory[package] == d132[package]:
continue
elif srcmd5s[factory[package]] in find_request_md5s(package):
print "%s already requested" % pmd5
continue
else:
url = osc.core.makeurl(osc.conf.config['apiurl'], ['source', 'openSUSE:Factory', package],
{ 'unified': 1, 'opackage': package, 'oproject': 'openSUSE:13.2', 'cmd': 'diff', 'expand': 1 } )
difflines = osc.core.http_POST(url).readlines()
inchanges = False
for line in difflines:
if re.match(r'^Index:.*\.changes', line):
inchanges = True
elif re.match(r'^Index:', line):
inchanges = False
if inchanges:
print line,
prompt = "copy diffing package %s ?" % pmd5
md5 = srcmd5s[factory[package]]
rev = revs[factory[package]]
devprj = get_devel_project(package)
if devprj == 'openSUSE:Factory':
continue
print prompt
d = _getch()
if d == 'y':
create_submit(project=devprj, package=package, rev=rev, md5=md5)
elif d == 'n':
NOS.add(pmd5)
save_nos(NOS)
else: # the 13.2 must have it
print "delete package 13.2/%s-%s" % ( package, d132[package] )
create_delete(package)