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 @@
+
+
+
+
+
+