diff --git a/osc/core.py b/osc/core.py index f02eaaa0..d2c721c8 100644 --- a/osc/core.py +++ b/osc/core.py @@ -228,11 +228,12 @@ def os_path_samefile(path1, path2): class File: """represent a file, including its metadata""" - def __init__(self, name, md5, size, mtime): + def __init__(self, name, md5, size, mtime, skipped=False): self.name = name self.md5 = md5 self.size = size self.mtime = mtime + self.skipped = skipped def __repr__(self): return self.name def __str__(self): @@ -1135,6 +1136,7 @@ class Package: int(node.get('mtime'))) if node.get('skipped'): self.skipped.append(f.name) + f.skipped = True except: # okay, a very old version of _files, which didn't contain any metadata yet... f = File(node.get('name'), '', 0, 0) @@ -1448,8 +1450,9 @@ rev: %s f = [] fmeta = ET.fromstring(filesmeta) for i in fmeta.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')))) + int(i.get('size')), int(i.get('mtime')), skipped)) return f def __get_rev_changes(self, revfiles): @@ -1459,7 +1462,14 @@ rev: %s revfilenames = [] for f in revfiles: revfilenames.append(f.name) - if f.name in self.filenamelist: + # treat skipped like deleted files + if f.skipped: + deleted.append(f) + continue + # treat skipped like added files + # problem: this overwrites existing files during the update + # (because skipped files aren't in self.filenamelist_unvers) + if f.name in self.filenamelist and not f.name in self.skipped: kept.append(f) else: added.append(f) @@ -1522,20 +1532,20 @@ rev: %s # this can't happen elif f in deleted: deleted.remove(f) - self.__update(kept, added, deleted, fm, root.get('rev'), service_files, limit_size) + self.__update(kept, added, deleted, fm, 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) + fm = show_files_meta(self.apiurl, self.prjname, self.name, revision=rev, limit_size=limit_size) rfiles = self.__get_files(fm) 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, limit_size) + self.__update(kept, added, deleted, fm, 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, limit_size = None): + def __update(self, kept, added, deleted, fm, rev = None, service_files = False): pathn = getTransActPath(self.dir) # check for conflicts with existing files for f in added: @@ -5132,8 +5142,8 @@ def getStatus(pacs, prj_obj=None, verbose=False, quiet=False, excluded=False): continue if filename in p.excluded and not excluded: continue - if filename in p.skipped: - continue +# if filename in p.skipped: +# continue s = p.status(filename) if s == 'F': lines.append(statfrmt('!', pathjoin(p.dir, filename))) diff --git a/tests/test_update.py b/tests/test_update.py index 90d6b6bf..01fd63b0 100644 --- a/tests/test_update.py +++ b/tests/test_update.py @@ -200,6 +200,49 @@ class TestUpdate(unittest.TestCase): self.assertEqual(sys.stdout.getvalue(), exp) self.__check_digests('testUpdateRestore_files') + @GET('http://localhost/source/osctest/limitsize?rev=latest', file='testUpdateLimitSizeNoChange_filesremote') + @GET('http://localhost/source/osctest/limitsize/_meta', file='meta.xml') + def testUpdateLimitSizeNoChange(self): + """ + a new file was added to the remote package but isn't checked out because + of the size constraint + """ + self.__change_to_pkg('limitsize') + osc.core.Package('.').update(limit_size=50) + self.assertTrue(len(EXPECTED_REQUESTS) == 0) + exp = 'D bigfile\nAt revision 2.\n' + self.assertEqual(sys.stdout.getvalue(), exp) + self.assertFalse(os.path.exists(os.path.join('.osc', 'bigfile'))) + self.assertFalse(os.path.exists('bigfile')) + 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/_meta', file='meta.xml') + def testUpdateLimitSizeAddDelete(self): + """ + a new file (exists) was added to the remote package with + size < limit_size and one file (nochange) was deleted from the + remote package (local file 'nochange' is modified). Additionally + files which didn't change are removed the local wc due to the + size constraint. + """ + self.__change_to_pkg('limitsize') + osc.core.Package('.').update(limit_size=10) + self.assertTrue(len(EXPECTED_REQUESTS) == 0) + exp = 'A exists\nD bigfile\nD foo\nD merge\nD nochange\nAt revision 2.\n' + self.assertEqual(sys.stdout.getvalue(), exp) + self.assertFalse(os.path.exists(os.path.join('.osc', 'bigfile'))) + self.assertFalse(os.path.exists('bigfile')) + self.assertFalse(os.path.exists(os.path.join('.osc', 'foo'))) + self.assertFalse(os.path.exists('foo')) + self.assertFalse(os.path.exists(os.path.join('.osc', 'merge'))) + self.assertFalse(os.path.exists('merge')) + # exists because local version is modified + self.assertTrue(os.path.exists('nochange')) + + self.__check_digests('testUpdateLimitSizeAddDelete_files', 'bigfile', 'foo', 'merge', 'nochange') + # tests to recover from an aborted/broken update @GET('http://localhost/source/osctest/simple/foo?rev=2', file='testUpdateResume_foo') @@ -244,11 +287,13 @@ class TestUpdate(unittest.TestCase): def __change_to_pkg(self, name): os.chdir(os.path.join(self.tmpdir, 'osctest', name)) - def __check_digests(self, fname): + def __check_digests(self, fname, *skipfiles): fname = os.path.join(FIXTURES_DIR, fname) self.assertEqual(open(os.path.join('.osc', '_files'), 'r').read(), open(fname, 'r').read()) root = ET.parse(fname).getroot() for i in root.findall('entry'): + if i.get('name') in skipfiles: + continue self.assertTrue(os.path.exists(os.path.join('.osc', i.get('name')))) self.assertEqual(osc.core.dgst(os.path.join('.osc', i.get('name'))), i.get('md5')) diff --git a/tests/update_fixtures/osctest/limitsize/.osc/_apiurl b/tests/update_fixtures/osctest/limitsize/.osc/_apiurl new file mode 100644 index 00000000..0afeace7 --- /dev/null +++ b/tests/update_fixtures/osctest/limitsize/.osc/_apiurl @@ -0,0 +1 @@ +http://localhost diff --git a/tests/update_fixtures/osctest/limitsize/.osc/_files b/tests/update_fixtures/osctest/limitsize/.osc/_files new file mode 100644 index 00000000..77d67af6 --- /dev/null +++ b/tests/update_fixtures/osctest/limitsize/.osc/_files @@ -0,0 +1,5 @@ + + + + + diff --git a/tests/update_fixtures/osctest/limitsize/.osc/_osclib_version b/tests/update_fixtures/osctest/limitsize/.osc/_osclib_version new file mode 100644 index 00000000..d3827e75 --- /dev/null +++ b/tests/update_fixtures/osctest/limitsize/.osc/_osclib_version @@ -0,0 +1 @@ +1.0 diff --git a/tests/update_fixtures/osctest/limitsize/.osc/_package b/tests/update_fixtures/osctest/limitsize/.osc/_package new file mode 100644 index 00000000..edc7cc15 --- /dev/null +++ b/tests/update_fixtures/osctest/limitsize/.osc/_package @@ -0,0 +1 @@ +limitsize diff --git a/tests/update_fixtures/osctest/limitsize/.osc/_project b/tests/update_fixtures/osctest/limitsize/.osc/_project new file mode 100644 index 00000000..cea3bc84 --- /dev/null +++ b/tests/update_fixtures/osctest/limitsize/.osc/_project @@ -0,0 +1 @@ +osctest \ No newline at end of file diff --git a/tests/update_fixtures/osctest/limitsize/.osc/foo b/tests/update_fixtures/osctest/limitsize/.osc/foo new file mode 100644 index 00000000..3bb34cf8 --- /dev/null +++ b/tests/update_fixtures/osctest/limitsize/.osc/foo @@ -0,0 +1 @@ +This is a simple test. diff --git a/tests/update_fixtures/osctest/limitsize/.osc/merge b/tests/update_fixtures/osctest/limitsize/.osc/merge new file mode 100644 index 00000000..0b4685d5 --- /dev/null +++ b/tests/update_fixtures/osctest/limitsize/.osc/merge @@ -0,0 +1,4 @@ +Is it +possible to +merge this file? +I hope so... diff --git a/tests/update_fixtures/osctest/limitsize/.osc/nochange b/tests/update_fixtures/osctest/limitsize/.osc/nochange new file mode 100644 index 00000000..0569b03f --- /dev/null +++ b/tests/update_fixtures/osctest/limitsize/.osc/nochange @@ -0,0 +1 @@ +This file didn't change. diff --git a/tests/update_fixtures/osctest/limitsize/foo b/tests/update_fixtures/osctest/limitsize/foo new file mode 100644 index 00000000..3bb34cf8 --- /dev/null +++ b/tests/update_fixtures/osctest/limitsize/foo @@ -0,0 +1 @@ +This is a simple test. diff --git a/tests/update_fixtures/osctest/limitsize/merge b/tests/update_fixtures/osctest/limitsize/merge new file mode 100644 index 00000000..0b4685d5 --- /dev/null +++ b/tests/update_fixtures/osctest/limitsize/merge @@ -0,0 +1,4 @@ +Is it +possible to +merge this file? +I hope so... diff --git a/tests/update_fixtures/osctest/limitsize/nochange b/tests/update_fixtures/osctest/limitsize/nochange new file mode 100644 index 00000000..3a48a293 --- /dev/null +++ b/tests/update_fixtures/osctest/limitsize/nochange @@ -0,0 +1,2 @@ +This file didn't change but +is modified. diff --git a/tests/update_fixtures/testUpdateLimitSizeAddDelete_exists b/tests/update_fixtures/testUpdateLimitSizeAddDelete_exists new file mode 100644 index 00000000..ac790413 --- /dev/null +++ b/tests/update_fixtures/testUpdateLimitSizeAddDelete_exists @@ -0,0 +1 @@ +small diff --git a/tests/update_fixtures/testUpdateLimitSizeAddDelete_files b/tests/update_fixtures/testUpdateLimitSizeAddDelete_files new file mode 100644 index 00000000..3a5fd9a6 --- /dev/null +++ b/tests/update_fixtures/testUpdateLimitSizeAddDelete_files @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/tests/update_fixtures/testUpdateLimitSizeAddDelete_filesremote b/tests/update_fixtures/testUpdateLimitSizeAddDelete_filesremote new file mode 100644 index 00000000..329f100a --- /dev/null +++ b/tests/update_fixtures/testUpdateLimitSizeAddDelete_filesremote @@ -0,0 +1,6 @@ + + + + + + diff --git a/tests/update_fixtures/testUpdateLimitSizeNoChange_files b/tests/update_fixtures/testUpdateLimitSizeNoChange_files new file mode 100644 index 00000000..773ca39d --- /dev/null +++ b/tests/update_fixtures/testUpdateLimitSizeNoChange_files @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/tests/update_fixtures/testUpdateLimitSizeNoChange_filesremote b/tests/update_fixtures/testUpdateLimitSizeNoChange_filesremote new file mode 100644 index 00000000..6a3ced81 --- /dev/null +++ b/tests/update_fixtures/testUpdateLimitSizeNoChange_filesremote @@ -0,0 +1,6 @@ + + + + + +