1
0
mirror of https://github.com/openSUSE/osc.git synced 2024-11-10 06:46:15 +01:00

- repairwc: repair a project wc (only missing '_apiurl' file so far)

This commit is contained in:
Marcus Huewe 2010-10-10 21:40:31 +02:00
parent 48eaacef18
commit 4229eb6197
2 changed files with 69 additions and 22 deletions

View File

@ -6041,11 +6041,34 @@ Please submit there instead, or use --nodevelproject to force direct submission.
${cmd_usage} ${cmd_usage}
${cmd_option_list} ${cmd_option_list}
""" """
def get_apiurl(apiurls):
print 'No apiurl is defined for this working copy.\n' \
'Please choose one from the following list (enter the number):'
for i in range(len(apiurls)):
print ' %d) %s' % (i, apiurls[i])
num = raw_input('> ')
try:
num = int(num)
except ValueError:
raise oscerr.WrongArgs('\'%s\' is not a number. Aborting' % num)
if num < 0 or num >= len(apiurls):
raise oscerr.WrongArgs('number \'%s\' out of range. Aborting' % num)
return apiurls[num]
args = parseargs(args) args = parseargs(args)
pacs = [] pacs = []
cp = conf.get_configParser(conf.config['conffile'])
apiurls = [i.rstrip('/') for i in cp.sections() if i != 'general']
for i in args: for i in args:
if is_project_dir(i): if is_project_dir(i):
try:
prj = Project(i, getPackageList=False) prj = Project(i, getPackageList=False)
except oscerr.WorkingCopyInconsistent, e:
apiurl = None
if '_apiurl' in e.dirty_files:
apiurl = get_apiurl(apiurls)
prj = Project(i, getPackageList=False, wc_check=False)
prj.wc_repair(apiurl)
for p in prj.pacs_have: for p in prj.pacs_have:
if p in prj.pacs_broken: if p in prj.pacs_broken:
continue continue
@ -6058,26 +6081,13 @@ Please submit there instead, or use --nodevelproject to force direct submission.
else: else:
print >>sys.stderr, '\'%s\' is neither a project working copy ' \ print >>sys.stderr, '\'%s\' is neither a project working copy ' \
'nor a package working copy' % i 'nor a package working copy' % i
cp = conf.get_configParser(conf.config['conffile'])
apiurls = [i.rstrip('/') for i in cp.sections() if i != 'general']
for pdir in pacs: for pdir in pacs:
try: try:
p = Package(pdir) p = Package(pdir)
except oscerr.WorkingCopyInconsistent, e: except oscerr.WorkingCopyInconsistent, e:
apiurl = None apiurl = None
if '_apiurl' in e.dirty_files: if '_apiurl' in e.dirty_files:
print 'No apiurl is defined for this package.\n' \ apiurl = get_apiurl(apiurls)
'Please choose one from the following list (enter the number):'
for i in range(len(apiurls)):
print ' %d) %s' % (i, apiurls[i])
num = raw_input('> ')
try:
num = int(num)
except ValueError:
raise oscerr.WrongArgs('\'%s\' is not a number. Aborting' % num)
if num < 0 or num >= len(apiurls):
raise oscerr.WrongArgs('number \'%s\' out of range. Aborting' % num)
apiurl = apiurls[num]
p = Package(pdir, wc_check=False) p = Package(pdir, wc_check=False)
p.wc_repair(apiurl) p.wc_repair(apiurl)
print 'done. Please check the state of the wc (via \'osc status %s\').' % i print 'done. Please check the state of the wc (via \'osc status %s\').' % i

View File

@ -414,14 +414,26 @@ def xmlindent(elem, level=0):
class Project: class Project:
"""represent a project directory, holding packages""" """represent a project directory, holding packages"""
def __init__(self, dir, getPackageList=True, progress_obj=None): REQ_STOREFILES = ('_project', '_apiurl')
if conf.config['do_package_tracking']:
REQ_STOREFILES += ('_packages',)
def __init__(self, dir, getPackageList=True, progress_obj=None, wc_check=True):
import fnmatch import fnmatch
self.dir = dir self.dir = dir
self.absdir = os.path.abspath(dir) self.absdir = os.path.abspath(dir)
self.progress_obj = progress_obj self.progress_obj = progress_obj
self.name = store_read_project(self.dir) self.name = store_read_project(self.dir)
self.apiurl = store_read_apiurl(self.dir, defaulturl=False) self.apiurl = store_read_apiurl(self.dir, defaulturl=not wc_check)
dirty_files = []
if wc_check:
dirty_files = self.wc_check()
if dirty_files:
msg = 'Your working copy \'%s\' is in an inconsistent state.\n' \
'Please run \'osc repairwc %s\' and check the state\n' \
'of the working copy afterwards (via \'osc status %s\')' % (self.dir, self.dir, self.dir)
raise oscerr.WorkingCopyInconsistent(self.prjname, self.name, dirty_files, msg)
if getPackageList: if getPackageList:
self.pacs_available = meta_get_packagelist(self.apiurl, self.name) self.pacs_available = meta_get_packagelist(self.apiurl, self.name)
@ -448,6 +460,25 @@ class Project:
self.pacs_missing = [ i for i in self.pacs_available if i not in self.pacs_have ] self.pacs_missing = [ i for i in self.pacs_available if i not in self.pacs_have ]
def wc_check(self):
global store
dirty_files = []
for fname in Project.REQ_STOREFILES:
if not os.path.exists(os.path.join(self.absdir, store, fname)):
dirty_files.append(fname)
return dirty_files
def wc_repair(self, apiurl=None):
global store
if not os.path.exists(os.path.join(self.dir, store, '_apiurl')):
if apiurl is None:
msg = 'cannot repair wc: the \'_apiurl\' file is missing but ' \
'no \'apiurl\' was passed to wc_repair'
# hmm should we raise oscerr.WrongArgs?
raise oscerr.WorkingCopyInconsistent(self.prjname, self.name, [], msg)
store_write_apiurl(self.dir, apiurl)
self.apiurl = store_read_apiurl(self.dir, defaulturl=False)
def checkout_missing_pacs(self, expand_link=False): def checkout_missing_pacs(self, expand_link=False):
for pac in self.pacs_missing: for pac in self.pacs_missing:
@ -4701,15 +4732,21 @@ def store_read_apiurl(dir, defaulturl=True):
# (former osc versions may stored an apiurl with a trailing slash etc.) # (former osc versions may stored an apiurl with a trailing slash etc.)
apiurl = conf.urljoin(*conf.parse_apisrv_url(None, url)) apiurl = conf.urljoin(*conf.parse_apisrv_url(None, url))
except: except:
if not defaulturl and is_package_dir(dir): if not defaulturl:
if is_project_dir(dir):
project = store_read_project(dir)
package = None
elif is_package_dir(dir):
project = store_read_project(dir)
package = None
else:
msg = 'Error: \'%s\' is not an osc package working copy' % os.path.abspath(dir)
raise oscerr.NoWorkingCopy(msg)
msg = 'Your working copy \'%s\' is in an inconsistent state.\n' \ msg = 'Your working copy \'%s\' is in an inconsistent state.\n' \
'Please run \'osc repairwc %s\' (Note this might _remove_\n' \ 'Please run \'osc repairwc %s\' (Note this might _remove_\n' \
'files from the .osc/ dir). Please check the state\n' \ 'files from the .osc/ dir). Please check the state\n' \
'of the working copy afterwards (via \'osc status %s\')' % (dir, dir, dir) 'of the working copy afterwards (via \'osc status %s\')' % (dir, dir, dir)
raise oscerr.WorkingCopyInconsistent(store_read_project(dir), store_read_package(dir), ['_apiurl'], msg) raise oscerr.WorkingCopyInconsistent(project, package, ['_apiurl'], msg)
elif not defaulturl:
msg = 'Error: \'%s\' is not an osc package working copy' % os.path.abspath(dir)
raise oscerr.NoWorkingCopy(msg)
apiurl = conf.config['apiurl'] apiurl = conf.config['apiurl']
return apiurl return apiurl