diff --git a/osc/core.py b/osc/core.py index d2c721c8..5eebb7ed 100644 --- a/osc/core.py +++ b/osc/core.py @@ -1446,10 +1446,11 @@ rev: %s upstream_rev = show_upstream_rev(self.apiurl, self.prjname, self.name, meta=self.meta) return upstream_rev - def __get_files(self, filesmeta): + def __get_files(self, fmeta_root): f = [] - fmeta = ET.fromstring(filesmeta) - for i in fmeta.findall('entry'): + if fmeta_root.get('rev') is None: + raise oscerr.APIError('missing rev attribute in _files:\n%s' % ''.join(ET.tostring(fmeta_root))) + for i in fmeta_root.findall('entry'): skipped = i.get('skipped') is not None f.append(File(i.get('name'), i.get('md5'), int(i.get('size')), int(i.get('mtime')), skipped)) @@ -1485,8 +1486,7 @@ rev: %s if os.path.isfile(os.path.join(self.storedir, '_in_update', '_files')): print 'resuming broken update...' root = ET.parse(os.path.join(self.storedir, '_in_update', '_files')).getroot() - fm = ET.tostring(root) - rfiles = self.__get_files(fm) + rfiles = self.__get_files(root) kept, added, deleted = self.__get_rev_changes(rfiles) # check if we aborted in the middle of a file update broken_file = os.listdir(os.path.join(self.storedir, '_in_update')) @@ -1532,20 +1532,21 @@ rev: %s # this can't happen elif f in deleted: deleted.remove(f) - self.__update(kept, added, deleted, fm, root.get('rev'), service_files) + self.__update(kept, added, deleted, ET.tostring(root), root.get('rev'), service_files) os.unlink(os.path.join(self.storedir, '_in_update', '_files')) os.rmdir(os.path.join(self.storedir, '_in_update')) # ok everything is ok (hopefully)... fm = show_files_meta(self.apiurl, self.prjname, self.name, revision=rev, limit_size=limit_size) - rfiles = self.__get_files(fm) + root = ET.fromstring(fm) + rfiles = self.__get_files(root) store_write_string(self.absdir, '_files', fm, subdir='_in_update') kept, added, deleted = self.__get_rev_changes(rfiles) - self.__update(kept, added, deleted, fm, rev, service_files) + self.__update(kept, added, deleted, fm, root.get('rev'), service_files) os.unlink(os.path.join(self.storedir, '_in_update', '_files')) if os.path.isdir(os.path.join(self.storedir, '_in_update')): os.rmdir(os.path.join(self.storedir, '_in_update')) - def __update(self, kept, added, deleted, fm, rev = None, service_files = False): + def __update(self, kept, added, deleted, fm, rev, service_files = False): pathn = getTransActPath(self.dir) # check for conflicts with existing files for f in added: diff --git a/tests/test_update.py b/tests/test_update.py index 01fd63b0..6bba7dd3 100644 --- a/tests/test_update.py +++ b/tests/test_update.py @@ -189,7 +189,7 @@ class TestUpdate(unittest.TestCase): self.__check_digests('testUpdateLocalDeletions_files') @GET('http://localhost/source/osctest/restore?rev=latest', file='testUpdateRestore_files') - @GET('http://localhost/source/osctest/restore/foo', file='testUpdateRestore_foo') + @GET('http://localhost/source/osctest/restore/foo?rev=1', file='testUpdateRestore_foo') @GET('http://localhost/source/osctest/restore/_meta', file='meta.xml') def testUpdateRestore(self): """local file 'foo' was deleted with a non osc command and will be restored""" @@ -217,7 +217,7 @@ class TestUpdate(unittest.TestCase): self.__check_digests('testUpdateLimitSizeNoChange_files', 'bigfile') @GET('http://localhost/source/osctest/limitsize?rev=latest', file='testUpdateLimitSizeAddDelete_filesremote') - @GET('http://localhost/source/osctest/limitsize/exists', file='testUpdateLimitSizeAddDelete_exists') + @GET('http://localhost/source/osctest/limitsize/exists?rev=2', file='testUpdateLimitSizeAddDelete_exists') @GET('http://localhost/source/osctest/limitsize/_meta', file='meta.xml') def testUpdateLimitSizeAddDelete(self): """