upload tizen1.0 source
[kernel/linux-2.6.36.git] / debian / bin / genorig.py
1 #!/usr/bin/env python
2
3 import sys
4 sys.path.append("debian/lib/python")
5
6 import os
7 import os.path
8 import re
9 import shutil
10 import subprocess
11
12 from debian_linux.debian import Changelog, VersionLinux
13 from debian_linux.patches import PatchSeries
14
15 class Main(object):
16     def __init__(self, input_files, override_version):
17         self.log = sys.stdout.write
18
19         self.input_files = input_files
20
21         changelog = Changelog(version = VersionLinux)[0]
22         source = changelog.source
23         version = changelog.version
24
25         if override_version:
26             version = VersionLinux('%s-undef' % override_version)
27
28         self.version_dfsg = version.linux_dfsg
29         if self.version_dfsg is None:
30             self.version_dfsg = '0'
31
32         self.log('Using source name %s, version %s, dfsg %s\n' % (source, version.upstream, self.version_dfsg))
33
34         self.orig = '%s-%s' % (source, version.upstream)
35         self.orig_tar = '%s_%s.orig.tar.gz' % (source, version.upstream)
36         self.tag = 'v' + version.upstream.replace('~', '-')
37
38     def __call__(self):
39         import tempfile
40         self.dir = tempfile.mkdtemp(prefix = 'genorig', dir = 'debian')
41         try:
42             if os.path.isdir(self.input_files[0]):
43                 self.upstream_export(self.input_files[0])
44             else:
45                 self.upstream_extract(self.input_files[0])
46             if len(self.input_files) > 1:
47                 self.upstream_patch(self.input_files[1])
48             self.debian_patch()
49             self.tar()
50         finally:
51             shutil.rmtree(self.dir)
52
53     def upstream_export(self, input_repo):
54         self.log("Exporting %s from %s\n" % (self.tag, input_repo))
55
56         archive_proc = subprocess.Popen(['git', 'archive', '--format=tar',
57                                          '--prefix=%s/' % self.orig, self.tag],
58                                         cwd=input_repo,
59                                         stdout=subprocess.PIPE)
60         extract_proc = subprocess.Popen(['tar', '-xf', '-'], cwd=self.dir,
61                                         stdin=archive_proc.stdout)
62
63         if extract_proc.wait():
64             raise RuntimeError("Can't extract tarball")
65
66     def upstream_extract(self, input_tar):
67         self.log("Extracting tarball %s\n" % input_tar)
68         match = re.match(r'(^|.*/)(?P<dir>linux-\d+\.\d+\.\d+(-\S+)?)\.tar(\.(?P<extension>(bz2|gz)))?$', input_tar)
69         if not match:
70             raise RuntimeError("Can't identify name of tarball")
71
72         cmdline = ['tar', '-xf', input_tar, '-C', self.dir]
73         if match.group('extension') == 'bz2':
74             cmdline.append('-j')
75         elif match.group('extension') == 'gz':
76             cmdline.append('-z')
77
78         if subprocess.Popen(cmdline).wait():
79             raise RuntimeError("Can't extract tarball")
80
81         os.rename(os.path.join(self.dir, match.group('dir')), os.path.join(self.dir, self.orig))
82
83     def upstream_patch(self, input_patch):
84         self.log("Patching source with %s\n" % input_patch)
85         match = re.match(r'(^|.*/)patch-\d+\.\d+\.\d+(-\S+?)?(\.(?P<extension>(bz2|gz)))?$', input_patch)
86         if not match:
87             raise RuntimeError("Can't identify name of patch")
88         cmdline = []
89         if match.group('extension') == 'bz2':
90             cmdline.append('bzcat')
91         elif match.group('extension') == 'gz':
92             cmdline.append('zcat')
93         else:
94             cmdline.append('cat')
95         cmdline.append(input_patch)
96         cmdline.append('| (cd %s; patch -p1 -f -s -t --no-backup-if-mismatch)' % os.path.join(self.dir, self.orig))
97         if os.spawnv(os.P_WAIT, '/bin/sh', ['sh', '-c', ' '.join(cmdline)]):
98             raise RuntimeError("Can't patch source")
99
100     def debian_patch(self):
101         name = "orig-" + self.version_dfsg
102         self.log("Patching source with debian patch (series %s)\n" % name)
103         fp = file("debian/patches/series/" + name)
104         series = PatchSeries(name, "debian/patches", fp)
105         series(dir = os.path.join(self.dir, self.orig))
106
107     def tar(self):
108         out = os.path.join("../orig", self.orig_tar)
109         try:
110             os.mkdir("../orig")
111         except OSError: pass
112         try:
113             os.stat(out)
114             raise RuntimeError("Destination already exists")
115         except OSError: pass
116         self.log("Generate tarball %s\n" % out)
117         cmdline = ['tar -czf', out, '-C', self.dir, self.orig]
118         try:
119             if os.spawnv(os.P_WAIT, '/bin/sh', ['sh', '-c', ' '.join(cmdline)]):
120                 raise RuntimeError("Can't patch source")
121             os.chmod(out, 0644)
122         except:
123             try:
124                 os.unlink(out)
125             except OSError:
126                 pass
127             raise
128
129 if __name__ == '__main__':
130     from optparse import OptionParser
131     parser = OptionParser(usage = "%prog [OPTION]... {TAR [PATCH] | REPO}")
132     parser.add_option("-V", "--override-version", dest = "override_version", help = "Override version", metavar = "VERSION")
133     options, args = parser.parse_args()
134
135     assert 1 <= len(args) <= 2
136     Main(args, options.override_version)()