/[soft]/mga-gnome/trunk/mga-gnome
ViewVC logotype

Diff of /mga-gnome/trunk/mga-gnome

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2944 by ovitters, Tue Feb 14 10:38:56 2012 UTC revision 3034 by ovitters, Wed Feb 22 20:47:36 2012 UTC
# Line 17  MEDIA="Core Release Source" Line 17  MEDIA="Core Release Source"
17  URL="http://download.gnome.org/sources/"  URL="http://download.gnome.org/sources/"
18  PKGROOT='~/pkgs'  PKGROOT='~/pkgs'
19    
20    re_version = re.compile(r'([-.]|\d+|[^-.\d]+)')
21    
22    def version_cmp(a, b):
23        """Compares two versions
24    
25        Returns
26          -1 if a < b
27          0  if a == b
28          1  if a > b
29    
30        Logic from Bugzilla::Install::Util::vers_cmp"""
31        A = re_version.findall(a.lstrip('0'))
32        B = re_version.findall(b.lstrip('0'))
33    
34        while A and B:
35            a = A.pop(0)
36            b = B.pop(0)
37    
38            if a == b:
39                continue
40            elif a == '-':
41                return -1
42            elif b == '-':
43                return 1
44            elif a == '.':
45                return -1
46            elif b == '.':
47                return 1
48            elif a.isdigit() and b.isdigit():
49                c = cmp(a, b) if (a.startswith('0') or b.startswith('0')) else cmp(int(a, 10), int(b, 10))
50                if c:
51                    return c
52            else:
53                c = cmp(a.upper(), b.upper())
54                if c:
55                    return c
56    
57        return cmp(len(A), len(B))
58    
59    def get_latest_version(versions, max_version=None):
60        """Gets the latest version number
61    
62        if max_version is specified, gets the latest version number before
63        max_version"""
64        latest = None
65        for version in versions:
66            if ( latest is None or version_cmp(version, latest) > 0 ) \
67               and ( max_version is None or version_cmp(version, max_version) < 0 ):
68                latest = version
69        return latest
70    
71  def line_input (file):  def line_input (file):
72      for line in file:      for line in file:
73          if line[-1] == '\n':          if line[-1] == '\n':
# Line 24  def line_input (file): Line 75  def line_input (file):
75          else:          else:
76              yield line              yield line
77    
78    def call_editor(filename):
79        """Return a sequence of possible editor binaries for the current platform"""
80    
81        editors = []
82    
83        for varname in 'VISUAL', 'EDITOR':
84            if varname in os.environ:
85                editors.append(os.environ[varname])
86    
87        editors.extend(('/usr/bin/editor', 'vi', 'pico', 'nano', 'joe'))
88    
89        for editor in editors:
90            try:
91                ret = subprocess.call([editor, filename])
92            except OSError, e:
93                if e.errno == 2:
94                    continue
95                raise
96    
97            if ret == 127:
98                continue
99    
100            return True
101    
102  class urllister(SGMLParser):  class urllister(SGMLParser):
103      def reset(self):      def reset(self):
104          SGMLParser.reset(self)          SGMLParser.reset(self)
# Line 34  class urllister(SGMLParser): Line 109  class urllister(SGMLParser):
109          if href:          if href:
110              self.urls.extend(href)              self.urls.extend(href)
111    
112    class SpecFile(object):
113        re_update_version = re.compile(r'^(?P<pre>Version:\s*)(?P<version>.+)(?P<post>\s*)$', re.MULTILINE + re.IGNORECASE)
114        re_update_release = re.compile(r'^(?P<pre>Release:\s*)(?P<release>%mkrel \d+)(?P<post>\s*)$', re.MULTILINE + re.IGNORECASE)
115    
116        def __init__(self, path):
117            self.path = path
118            self.cwd = os.path.dirname(path)
119    
120        @property
121        def version(self):
122            return subprocess.check_output(["rpm", "--specfile", self.path, "--queryformat", "%{VERSION}\n"]).splitlines()[0]
123        def update(self, version):
124            """Update specfile (increase version)"""
125            cur_version = self.version
126    
127            if version_cmp(version, cur_version) != 1:
128                print >>sys.stderr, "ERROR: Version %s is older than current version %s!" % (version, cur_version)
129                return False
130    
131            with open(self.path, "rw") as f:
132                data = f.read()
133    
134                if data.count("%mkrel") != 1:
135                    print "WARNING: Multiple %mkrel found; don't know what to do!"
136                    return False
137    
138                data, nr = self.re_update_version.subn(r'\g<pre>%s\g<post>' % version, data, 1)
139                if nr != 1:
140                    print "WARNING: Could not increase version!"
141                    return False
142    
143                data, nr = self.re_update_release.subn(r'\g<pre>%mkrel 1\g<post>', data, 1)
144                if nr != 1:
145                    print "WARNING: Could not reset release!"
146                    return False
147    
148                # Overwrite file with new version number
149                write_file(self.path, data)
150    
151    
152            # Check RPM also agrees that version number has increased
153            if self.version != version:
154                print "ERROR: Increased version to %s, but RPM doesn't agree!?!" % version
155                return False
156    
157            try:
158                # Download new tarball
159                subprocess.check_call(['mgarepo', 'sync', '-d'], cwd=self.cwd)
160                # Check patches still apply
161                subprocess.check_call(['bm', '-p', '--nodeps'], cwd=self.cwd)
162            except subprocess.CalledProcessError:
163                return False
164    
165            return True
166    
167  class Patch(object):  class Patch(object):
168      """Do things with patches"""      """Do things with patches"""
169    
# Line 49  class Patch(object): Line 179  class Patch(object):
179          return self.path if self.show_path else os.path.basename(self.path)          return self.path if self.show_path else os.path.basename(self.path)
180    
181      def add_dep3(self):      def add_dep3(self):
182            """Add DEP-3 headers to a patch file"""
183          if self.dep3['valid']:          if self.dep3['valid']:
184              return False              return False
185    
# Line 74  class Patch(object): Line 205  class Patch(object):
205    
206                      # XXX - wrap this at 80 chars                      # XXX - wrap this at 80 chars
207                      add_line = True                      add_line = True
208                      print >>fdst, "%s: %s" % (header, data)                      print >>fdst, "%s: %s" % (header, "" if data is None else data)
209    
210                  if add_line: print >>fdst, ""                  if add_line: print >>fdst, ""
211                  # Now copy any other data and the patch                  # Now copy any other data and the patch
# Line 83  class Patch(object): Line 214  class Patch(object):
214              fdst.flush()              fdst.flush()
215              os.rename(fdst.name, self.path)              os.rename(fdst.name, self.path)
216    
217            call_editor(self.path)
218    
219      #Author: fwang      #Author: fwang
220      #Subject: Build fix: Fix glib header inclusion      #Subject: Build fix: Fix glib header inclusion
221      #Applied-Upstream: commit:30602      #Applied-Upstream: commit:30602
# Line 90  class Patch(object): Line 223  class Patch(object):
223      #Bug: http://bugzilla.abisource.com/show_bug.cgi?id=13247      #Bug: http://bugzilla.abisource.com/show_bug.cgi?id=13247
224    
225      def _read_dep3(self):      def _read_dep3(self):
226          """This will also parse git headers"""          """Read DEP-3 headers from an existing patch file
227    
228            This will also parse git headers"""
229          dep3 = {}          dep3 = {}
230          headers = {}          headers = {}
231    
# Line 108  class Patch(object): Line 243  class Patch(object):
243                      r = self.re_dep3.match(line)                      r = self.re_dep3.match(line)
244                      if r:                      if r:
245                          info = r.groupdict()                          info = r.groupdict()
246    
247                            # Avoid matching URLS
248                            if info['data'].startswith('//') and info['header'].lower () == info['header']:
249                                continue
250    
251                          headers[info['header']] = info['data']                          headers[info['header']] = info['data']
252                          last_header = info['header']                          last_header = info['header']
253                          last_nr = nr                          last_nr = nr
# Line 158  class Patch(object): Line 298  class Patch(object):
298                      if len(fields) >= 3:                      if len(fields) >= 3:
299                          self._svn_author = fields[1]                          self._svn_author = fields[1]
300    
301            if not hasattr(self, '_svn_author'):
302                return None
303    
304          return self._svn_author          return self._svn_author
305    
306  def get_upstream_names():  def get_upstream_names():
# Line 212  def get_downstream_names(): Line 355  def get_downstream_names():
355    
356      return TARBALLS, FILES      return TARBALLS, FILES
357    
358    
359    def write_file(path, data):
360        with tempfile.NamedTemporaryFile(dir=os.path.dirname(path), delete=False) as fdst:
361            fdst.write(data)
362            fdst.flush()
363            os.rename(fdst.name, path)
364    
365  def cmd_co(options, parser):  def cmd_co(options, parser):
366      upstream = get_upstream_names()      upstream = get_upstream_names()
367      downstream, downstream_files = get_downstream_names()      downstream, downstream_files = get_downstream_names()
# Line 245  def cmd_patches(options, parser): Line 395  def cmd_patches(options, parser):
395          for srpm in downstream[module]:          for srpm in downstream[module]:
396              for filename in downstream_files[srpm]:              for filename in downstream_files[srpm]:
397                  if '.patch' in filename or '.diff' in filename:                  if '.patch' in filename or '.diff' in filename:
398    
399                      p = Patch(os.path.join(path, srpm, "SOURCES", filename), show_path=options.path)                      p = Patch(os.path.join(path, srpm, "SOURCES", filename), show_path=options.path)
400                      print "\t".join((module, srpm, str(p)))                      valid = ""
401                        forwarded = ""
402                      if p.dep3['headers']:                      if p.dep3['headers']:
403                          pprint.pprint(p.dep3['headers'])                          forwarded = p.dep3['headers'].get('Forwarded', "no")
404                          if p.dep3['valid']:                          if p.dep3['valid']:
405                              print "VALID"                              valid="VALID"
406                        print "\t".join((module, srpm, str(p), forwarded, valid))
407    
408  def cmd_dep3(options, parser):  def cmd_dep3(options, parser):
409      p = Patch(options.patch)      p = Patch(options.patch)
410      p.add_dep3()      p.add_dep3()
411    
412    def cmd_package_new_version(options, parser):
413        cwd = os.path.expanduser(PKGROOT)
414        package = options.package
415    
416        subprocess.call(['mgarepo', 'co', package], cwd=cwd)
417        s = SpecFile(os.path.join(cwd, package, "SPECS", "%s.spec" % package))
418        print s.version
419        if not s.update(options.version):
420            sys.exit(1)
421    
422    
423  def main():  def main():
424      description = """Mageia GNOME commands."""      description = """Mageia GNOME commands."""
425      epilog="""Report bugs to Olav Vitters"""      epilog="""Report bugs to Olav Vitters"""
# Line 287  def main(): Line 451  def main():
451          func=cmd_dep3, path=False          func=cmd_dep3, path=False
452      )      )
453    
454        subparser = subparsers.add_parser('increase', help='Increase version number')
455        subparser.add_argument("package", help="Package name")
456        subparser.add_argument("version", help="Version number")
457        subparser.set_defaults(
458            func=cmd_package_new_version, path=False
459        )
460    
461      if len(sys.argv) == 1:      if len(sys.argv) == 1:
462          parser.print_help()          parser.print_help()
463          sys.exit(2)          sys.exit(2)

Legend:
Removed from v.2944  
changed lines
  Added in v.3034

  ViewVC Help
Powered by ViewVC 1.1.30