mirror of
https://git.rtems.org/rtems-source-builder
synced 2024-10-09 07:15:10 +08:00
Add a CVS module to manage CVS.
This commit is contained in:
parent
f8bdb41bef
commit
200f0a33b6
@ -112,6 +112,8 @@ __chmod: exe, required, '/bin/chmod'
|
||||
__chown: exe, required, '/usr/sbin/chown'
|
||||
__cp: exe, required, '/bin/cp'
|
||||
__cpp: exe, none, '%{__cc} -E'
|
||||
__cvs: exe, optional, '/usr/bin/cvs'
|
||||
__cvs_z: none, none, '%{__cvs} -z 9'
|
||||
__cxx: exe, required, '/usr/bin/g++'
|
||||
__flex: exe, required, '/usr/bin/flex'
|
||||
__git: exe, required, '/usr/bin/git'
|
||||
@ -136,6 +138,7 @@ __patch_bin: exe, required, '/usr/bin/patch'
|
||||
__patch_opts: none, none, '%{nil}'
|
||||
__patch: exe, none, '%{__patch_bin} %{__patch_opts}'
|
||||
__perl: exe, optional, 'perl'
|
||||
__svn: exe, optional, '/usr/bin/svn'
|
||||
__ranlib: exe, required, 'ranlib'
|
||||
__rm: exe, required, '/bin/rm'
|
||||
__rmfile: exe, none, '%{__rm} -f'
|
||||
|
145
source-builder/sb/cvs.py
Normal file
145
source-builder/sb/cvs.py
Normal file
@ -0,0 +1,145 @@
|
||||
#
|
||||
# RTEMS Tools Project (http://www.rtems.org/)
|
||||
# Copyright 2010-2013 Chris Johns (chrisj@rtems.org)
|
||||
# All rights reserved.
|
||||
#
|
||||
# This file is part of the RTEMS Tools package in 'rtems-tools'.
|
||||
#
|
||||
# Permission to use, copy, modify, and/or distribute this software for any
|
||||
# purpose with or without fee is hereby granted, provided that the above
|
||||
# copyright notice and this permission notice appear in all copies.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
#
|
||||
# Provide some basic access to the cvs command.
|
||||
#
|
||||
|
||||
import os
|
||||
|
||||
import error
|
||||
import execute
|
||||
import options
|
||||
import path
|
||||
|
||||
class repo:
|
||||
"""An object to manage a cvs repo."""
|
||||
|
||||
def _cvs_exit_code(self, ec, output):
|
||||
if ec:
|
||||
print output
|
||||
raise error.general('cvs command failed (%s): %d' % (self.cvs, ec))
|
||||
|
||||
def _parse_args(self, url):
|
||||
if not url.startswith('cvs://'):
|
||||
raise error.general('invalid cvs url: %s' % (url))
|
||||
opts = { 'cvsroot': ':%s' % (us[0][6:]),
|
||||
'module': '' }
|
||||
for o in us:
|
||||
os = o.split('=')
|
||||
if len(os) == 1:
|
||||
opts[os[0]] = True
|
||||
else:
|
||||
opts[os[0]] = os[1:]
|
||||
return opts
|
||||
|
||||
def _run(self, args, check = False):
|
||||
e = execute.capture_execution()
|
||||
if path.exists(self.path):
|
||||
cwd = self.path
|
||||
else:
|
||||
cwd = None
|
||||
exit_code, proc, output = e.spawn([self.cvs, '-q'] + args, cwd = cwd)
|
||||
if check:
|
||||
self._cvs_exit_code(exit_code, output)
|
||||
return exit_code, output
|
||||
|
||||
def __init__(self, _path, opts, macros = None):
|
||||
self.path = _path
|
||||
self.opts = opts
|
||||
if macros is None:
|
||||
self.macros = opts.defaults
|
||||
else:
|
||||
self.macros = macros
|
||||
self.cvs = self.macros.expand('%{__cvs}')
|
||||
|
||||
def cvs_version(self):
|
||||
ec, output = self._run(['--version'], True)
|
||||
lines = output.split('\n')
|
||||
if len(lines) < 12:
|
||||
raise error.general('invalid version string from cvs: %s' % (output))
|
||||
cvs = lines[0].split(' ')
|
||||
if len(cvs) != 6:
|
||||
raise error.general('invalid version number from cvs: %s' % (lines[0]))
|
||||
vs = cvs[4].split('.')
|
||||
if len(vs) < 3:
|
||||
raise error.general('invalid version number from cvs: %s' % (cvs[4]))
|
||||
return (int(vs[0]), int(vs[1]), int(vs[2]))
|
||||
|
||||
def checkout(self, root, path, module = ''):
|
||||
ec, output = self._run(['-d', root, 'co', '-N', '-d', path, module], check = True)
|
||||
|
||||
def update(self):
|
||||
ec, output = self._run(['up'])
|
||||
|
||||
def reset(self):
|
||||
ec, output = self._run(['up', '-C'], check = True)
|
||||
|
||||
def branch(self):
|
||||
ec, output = self._run(['branch'])
|
||||
if ec == 0:
|
||||
for b in output.split('\n'):
|
||||
if b[0] == '*':
|
||||
return b[2:]
|
||||
return None
|
||||
|
||||
def status(self):
|
||||
keys = { 'U': 'modified',
|
||||
'P': 'modified',
|
||||
'M': 'modified',
|
||||
'R': 'removed',
|
||||
'C': 'conflict',
|
||||
'A': 'added',
|
||||
'?': 'untracked' }
|
||||
_status = {}
|
||||
if path.exists(self.path):
|
||||
ec, output = self._run(['-n', 'up'])
|
||||
if ec == 0:
|
||||
state = 'none'
|
||||
for l in output.split('\n'):
|
||||
if len(l) > 2 and l[0] in keys:
|
||||
if keys[l[0]] not in _status:
|
||||
_status[keys[l[0]]] = []
|
||||
_status[keys[l[0]]] += [l[2:]]
|
||||
return _status
|
||||
|
||||
def clean(self):
|
||||
_status = self.status()
|
||||
return len(_status) == 0
|
||||
|
||||
def valid(self):
|
||||
if path.exists(self.path):
|
||||
ec, output = self._run(['-n', 'up', '-l'])
|
||||
if ec == 0:
|
||||
if not output.startswith('cvs status: No CVSROOT specified'):
|
||||
return True
|
||||
return False
|
||||
|
||||
if __name__ == '__main__':
|
||||
import sys
|
||||
opts = options.load(sys.argv, defaults = 'defaults.mc')
|
||||
ldir = 'cvs-test-rm-me'
|
||||
c = repo(ldir, opts)
|
||||
if not path.exists(ldir):
|
||||
c.checkout(':pserver:anoncvs@sourceware.org:/cvs/src', ldir, 'newlib')
|
||||
print c.cvs_version()
|
||||
print c.valid()
|
||||
print c.status()
|
||||
c.reset()
|
||||
print c.clean()
|
Loading…
x
Reference in New Issue
Block a user