OpenSDE Framework (without history before r20070)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

205 lines
5.1 KiB

import urllib2, re, os,sys,optparse
from BeautifulSoup import BeautifulSoup
from HTMLParser import HTMLParser
from info import *
class cParseHTML(HTMLParser):
val=None
def handle_starttag(self, tag, attrs):
self.val=re.sub(self.get_starttag_text()+"|\n|\r",
" ",self.val)
def parse(self,string):
self.val=string
self.feed(self.val)
return self.val
cParse=cParseHTML()
parse=cParse.parse
repo=None
pkg=None
bdescd=False
parser = optparse.OptionParser(usage)
parser.add_option("-b", "--base", dest="base",
help="""Change base i.e from
http://packages.debian.org to http://packages.ubuntu.com""")
parser.add_option("-d", "--distro",dest="distro",
help="""chose distro i.e stable (default) testing,unstable
oldstable experimental etc. """)
parser.add_option("-f", "--force",
action="store_true", dest="force",
help="""Toggle force values on/off. Default can be set in
lib/sde-download/info.py.""")
parser.add_option("-g", "--guess",
action="store_true", dest="guess",
help="""Toggle guess values on/off. Default can be set in
lib/sde-download/info.py.""")
parser.add_option("-o", "--outpkg",dest="outpkg",
help="""Write desc to package.""")
(options, args) = parser.parse_args()
argn=0
if len(args) != 1:
parser.error("incorrect number of arguments")
if options.base:
base=options.base
if options.distro:
distro=options.distro
if options.force:
if force:
force=False
else: force=True
if options.guess:
if guess:
guess=False
else: force=True
nargs=len(sys.argv)-1
if sys.argv[nargs].startswith("-") or sys.argv[nargs].startswith("--"):
parse.error("Invalid options")
opts=sys.argv[nargs].split("/")
if len(opts) == 1:
pkg=sys.argv[nargs]
for cat in categories:
url=base + "/" + distro + "/" + cat + "/" + pkg
try:
urllib2.urlopen(url)
repo=cat
except:pass
elif len(opts)==2:
repo=opts[0]
pkg=opts[1]
else:
parse.error("Invalid options.")
if not repo:parser.error("Package doesn't exist.")
if not pkg:parse.error("Invalid options.")
url=base + "/" + distro + "/" + repo + "/" + pkg
try:
page=urllib2.urlopen(url).read()
except:
print "Error: package '%s' does not exist." % sys.argv[nargs]
sys.exit()
soup = BeautifulSoup(page)
copy=copynote(pkg)
for link in soup("a"):
link=str(link)
if re.search("tar\.gz",link):
buf=re.sub("^.|.$","",
re.search('("|\').*("|\')',link).group())
descd+=" " + buf.split("/").pop()
descd+=" " + re.sub(buf.split("/").pop()+"$","",buf)
bdescd=True
try:
descv="[V] " + re.sub("^.|.$","",re.search("\(.*\)",
str(soup("h1"))).group())
except: pass
try:
desci="[I] " + parse("".join(soup("h2")[0])).capitalize()+"."
except: pass
try:
desct=parse(str(soup("p")[1]))
except: pass
lcat=soup("span")
if len(lcat) > 0:
lcat=re.sub("^.|.$","",str(lcat))
if force:
descu="[U] " + url
desca="[A] Unknown"
descl="[L] Unknown"
descs="[S] Stable"
if guess:
try:
stat=status[distro]
descs="[S] " + stat
except: pass
try:
cat=categories[repo]
descc="[C] " + cat
except: pass
try:
license=licenses[lcat]
descl="[L] " + license
except:pass
sdesct=""
cnt=0
cnt2=0
desct=re.sub("^\s*","",desct)
for word in desct.split(" "):
cnt+=len(word)+1
if cnt < 76:
if cnt2 == 0:
sdesct+="[T] %s" % word
cnt2=1
else:sdesct+=" %s" % word
else:
sdesct+="\n[T] %s" % word
cnt=1
formatteddesc="""%(copy)s
%(i)s
%(t)s
%(u)s
%(a)s
%(m)s
%(c)s
%(l)s
%(s)s
%(v)s
%(p)s
%(d)s
"""%{ "copy": copy,"i": desci,"t":sdesct,"u":descu,"a":desca,
"m":descm,"c":descc,"l":descl,"s":descs,"v":descv,"p":descp,
"d":descd}
if options.outpkg:
output=options.outpkg.split("/")
optcnt=len(output) - output.count("")
out=""
if optcnt == 1:
os.system("echo -e \"\033[33;1m=>\033[0m assuming reqested repository as 'wip.'\"")
out="package/wip/" +output[0]+"/"+output[0]+".desc"
dir="package/wip/" +output[0]
if os.path.isdir(dir):
if os.path.isfile(out):
print """failed
package %s belongs to wip!""" % output[0]
sys.exit(1)
else:
os.mkdir(dir)
elif optcnt==2:
repository="package/" + output[0]
if not os.path.isdir(repository):
print "Error:invalid repository '%s'!" % dir
sys.exit(1)
dir=repository + "/" + output[1]
if os.path.isdir(dir):
out=dir+"/"+output[1]+".desc"
if os.path.isfile(out):
print "failed\n package %(p)s belongs to %(c)s!" %{"p":output[1],
"c":output[0]}
sys.exit(1)
else:
os.mkdir(dir)
else:parser.error("Inavlid Option for --outpkg (-o)")
try:
os.system("echo -n 'Writing desc to file...'")
outf=open(out,"w")
outf.write(formatteddesc)
outf.close()
os.system("echo 'ok'")
except:
print"Error writing to file " + out
if bdescd:
os.system("echo -n 'Patching cksum...'")
if os.popen("sde pkg up " + output[len(output)-1]+"&>/dev/null"):
os.system("echo 'ok'")
else:os.system("echo 'failed'")
todo=""
for line in formatteddesc.split("\n"):
if re.search("^\[.\] TODO:",line):todo+="\n" + line
if not todo == "":
print "The following needs completing:"
print todo
else:
print formatteddesc