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
|
import sys
import os
import errno
from glob import glob
class Patch:
def __init__(self, fh, level=1):
self.p = fh.readlines()
self.lvl = level
def __str__(self):
return "".join(self.p)
def lines(self):
return len(self.p)
def diffstat(self):
i,o = os.popen2("diffstat")
i.write(str(self))
i.close()
return o.read()
# XXX this entire __init__ stuff is way to ugly
class PatchSeries (list):
def __init__(self, dir):
fd = None
self.blank()
self.style = "simple"
try:
fd = file(os.sep.join([dir, "00list"]))
self.style = "dpatch"
except IOError, e:
if e.errno != errno.ENOENT:
print "ERROR: unable to open dpatch list..."
self.blank()
return
try:
fd = file(os.sep.join([dir, "series"]))
self.style = "quilt"
except IOError, e:
if e.errno != errno.ENOENT:
print "ERROR: series file is a directory..."
self.blank()
return
if fd:
# remove blank lines
for line in filter(None, [n.strip() for n in fd.readlines()]):
stuff = line.split(' ')
# skip comments
if stuff[0][0] == "#":
continue
# here's the name
name = stuff[0]
#print "\t\t\t%s: %s"%(self.style,name)
self.names.append(name)
# anything else are either patch args or comments
self.patchargs[name] = []
for rest in filter(None, stuff[1:]):
if rest[0][0] == "#":
break
else:
self.patchargs[name].append(rest)
else:
self.names = os.listdir(dir)
self.names.sort()
for n in self.names:
self.patchargs[n] = []
# XXX this code is too ugly
removelater=[]
for p in self.names:
try:
self.patches[p] = Patch(file(os.sep.join([dir, p])))
except IOError, e:
if e.errno == errno.ENOENT and self.style == "dpatch":
try:
self.patches[p] = Patch(file(os.sep.join([dir, p+".dpatch"])))
except:
print "ERROR: could not find patch",p
self.blank()
return
elif e.errno == errno.EISDIR:
print "WARNING: directory %s in patch dir, patch list incomplete"%(p)
removelater.append(p)
else:
print "ERROR: could not find patch",p
self.blank()
return
for p in removelater:
self.names.remove(p)
def blank(self):
self.names = []
self.style = "unknown"
self.patches = {}
self.patchargs = {}
def iterpatches(self):
for p in self.names:
yield (p, self.patches[p])
def __getitem__(self, y):
return self.patches[self.names[y]]
def __len__(self):
return len(self.names)
def fetch(self, name):
return self.patches[name]
def __str__(self):
return "\n".join(self.names)
if __name__ == "__main__":
print "Patch.py testing"
try:
p = Patch(file(sys.argv[1]))
print "patch contents:"
print p
except IndexError:
print "usage: %s <patch>"
|