Jim MacArthur pushed to branch jmac/vdir_import_test at BuildStream / buildstream
Commits:
-
7e984dff
by Jim MacArthur at 2018-10-04T16:52:15Z
-
c15e3931
by Jim MacArthur at 2018-10-05T12:40:57Z
-
99f6e97c
by Jim MacArthur at 2018-10-05T12:43:49Z
-
7cf28a8d
by Jim MacArthur at 2018-10-05T12:59:34Z
2 changed files:
Changes:
| ... | ... | @@ -280,7 +280,9 @@ class CasBasedDirectory(Directory): |
| 280 | 280 |
directory = root
|
| 281 | 281 |
components = symlink.target.split(CasBasedDirectory._pb2_path_sep)
|
| 282 | 282 |
for c in components:
|
| 283 |
- if c == "..":
|
|
| 283 |
+ if c == ".":
|
|
| 284 |
+ pass
|
|
| 285 |
+ elif c == "..":
|
|
| 284 | 286 |
directory = directory.parent
|
| 285 | 287 |
else:
|
| 286 | 288 |
directory = directory.descend(c, create=True)
|
| ... | ... | @@ -321,7 +323,9 @@ class CasBasedDirectory(Directory): |
| 321 | 323 |
# We ran out of path elements and ended up in a directory
|
| 322 | 324 |
return directory
|
| 323 | 325 |
c = components.pop(0)
|
| 324 |
- if c == "..":
|
|
| 326 |
+ if c == ".":
|
|
| 327 |
+ pass
|
|
| 328 |
+ elif c == "..":
|
|
| 325 | 329 |
print(" resolving {}: up-dir".format(c))
|
| 326 | 330 |
# If directory.parent *is* None, this is an attempt to access
|
| 327 | 331 |
# '..' from the root, which is valid under POSIX; it just
|
| ... | ... | @@ -610,16 +614,18 @@ class CasBasedDirectory(Directory): |
| 610 | 614 |
symlink_list = list(filter(lambda i: isinstance(i[1].pb_object, remote_execution_pb2.SymlinkNode), self.index.items()))
|
| 611 | 615 |
file_list = list(filter(lambda i: isinstance(i[1].pb_object, remote_execution_pb2.FileNode), self.index.items()))
|
| 612 | 616 |
directory_list = list(filter(lambda i: isinstance(i[1].buildstream_object, CasBasedDirectory), self.index.items()))
|
| 617 |
+ symlinks_to_directories_list = []
|
|
| 613 | 618 |
print("Running list_relative_paths on relpath {}. files={}, symlinks={}".format(relpath, [f[0] for f in file_list], [s[0] for s in symlink_list]))
|
| 614 | 619 |
|
| 615 | 620 |
for (k, v) in sorted(symlink_list):
|
| 616 | 621 |
target = self._resolve(k, absolute_symlinks_resolve=True)
|
| 617 | 622 |
if isinstance(target, CasBasedDirectory):
|
| 618 |
- print("Adding the resolved symlink {} which resolves to {} to our directory list".format(k, target))
|
|
| 619 |
- directory_list.append((k,IndexEntry(k, buildstream_object=target)))
|
|
| 623 |
+ symlinks_to_directories_list.append(k)
|
|
| 620 | 624 |
else:
|
| 621 | 625 |
# Broken symlinks are also considered files!
|
| 622 | 626 |
file_list.append((k,v))
|
| 627 |
+ for d in sorted(symlinks_to_directories_list):
|
|
| 628 |
+ yield os.path.join(relpath, d)
|
|
| 623 | 629 |
if file_list == [] and relpath != "":
|
| 624 | 630 |
print("Yielding empty directory name {}".format(relpath))
|
| 625 | 631 |
yield relpath
|
| 1 | 1 |
import os
|
| 2 | 2 |
import pytest
|
| 3 |
+import random
|
|
| 3 | 4 |
from tests.testutils import cli
|
| 4 | 5 |
|
| 5 | 6 |
from buildstream.storage import CasBasedDirectory
|
| ... | ... | @@ -27,6 +28,7 @@ root_filesets = [ |
| 27 | 28 |
]
|
| 28 | 29 |
|
| 29 | 30 |
empty_hash_ref = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
| 31 |
+RANDOM_SEED = 69105
|
|
| 30 | 32 |
|
| 31 | 33 |
|
| 32 | 34 |
def generate_import_roots(directory):
|
| ... | ... | @@ -48,6 +50,33 @@ def generate_import_roots(directory): |
| 48 | 50 |
os.symlink(content, os.path.join(rootdir, path))
|
| 49 | 51 |
|
| 50 | 52 |
|
| 53 |
+def generate_random_root(directory):
|
|
| 54 |
+ random.seed(RANDOM_SEED)
|
|
| 55 |
+ rootname = "root6"
|
|
| 56 |
+ rootdir = os.path.join(directory, "content", rootname)
|
|
| 57 |
+ things = []
|
|
| 58 |
+ locations = ['.']
|
|
| 59 |
+ for i in range(0, 100):
|
|
| 60 |
+ location = random.choice(locations)
|
|
| 61 |
+ thingname = "node{}".format(i)
|
|
| 62 |
+ thing = random.choice(['dir', 'link', 'file'])
|
|
| 63 |
+ target = os.path.join(rootdir, location, thingname)
|
|
| 64 |
+ if thing == 'dir':
|
|
| 65 |
+ os.makedirs(target)
|
|
| 66 |
+ locations.append(os.path.join(location, thingname))
|
|
| 67 |
+ elif thing == 'file':
|
|
| 68 |
+ with open(target, "wt") as f:
|
|
| 69 |
+ f.write("This is node {}\n".format(i))
|
|
| 70 |
+ elif thing == 'link':
|
|
| 71 |
+ # TODO: Make some relative symlinks
|
|
| 72 |
+ if random.randint(1, 3) == 1 or len(things) == 0:
|
|
| 73 |
+ os.symlink("/broken", target)
|
|
| 74 |
+ else:
|
|
| 75 |
+ os.symlink(random.choice(things), target)
|
|
| 76 |
+ things.append(os.path.join(location, thingname))
|
|
| 77 |
+ print("Generated {}/{} ".format(rootdir, things[-1]))
|
|
| 78 |
+ |
|
| 79 |
+ |
|
| 51 | 80 |
def file_contents(path):
|
| 52 | 81 |
with open(path, "r") as f:
|
| 53 | 82 |
result = f.read()
|
| ... | ... | @@ -64,6 +93,7 @@ def create_new_casdir(root_number, fake_context, tmpdir): |
| 64 | 93 |
assert d.ref.hash != empty_hash_ref
|
| 65 | 94 |
return d
|
| 66 | 95 |
|
| 96 |
+ |
|
| 67 | 97 |
def create_new_filedir(root_number, tmpdir):
|
| 68 | 98 |
root = os.path.join(tmpdir, "vdir")
|
| 69 | 99 |
os.makedirs(root)
|
| ... | ... | @@ -117,7 +147,7 @@ def test_cas_import(cli, tmpdir, original, overlay): |
| 117 | 147 |
fake_context.artifactdir = tmpdir
|
| 118 | 148 |
# Create some fake content
|
| 119 | 149 |
generate_import_roots(tmpdir)
|
| 120 |
- |
|
| 150 |
+ generate_random_root(tmpdir)
|
|
| 121 | 151 |
d = create_new_casdir(original, fake_context, tmpdir)
|
| 122 | 152 |
d2 = create_new_casdir(overlay, fake_context, tmpdir)
|
| 123 | 153 |
d.import_files(d2)
|
| ... | ... | @@ -144,13 +174,20 @@ def test_cas_import(cli, tmpdir, original, overlay): |
| 144 | 174 |
# Note that isdir accepts symlinks to dirs, so a symlink to a dir is acceptable.
|
| 145 | 175 |
assert os.path.isdir(realpath)
|
| 146 | 176 |
|
| 177 |
+ # Now do the same thing with filebaseddirectories and check the contents match
|
|
| 178 |
+ d3 = create_new_casdir(original, fake_context, tmpdir)
|
|
| 179 |
+ d4 = create_new_filedir(overlay, tmpdir)
|
|
| 180 |
+ d3.import_files(d2)
|
|
| 181 |
+ assert d.ref.hash == d3.ref.hash
|
|
| 182 |
+ |
|
| 147 | 183 |
|
| 148 |
-@pytest.mark.parametrize("root", [1, 2, 3, 4, 5])
|
|
| 184 |
+@pytest.mark.parametrize("root", [1, 2, 3, 4, 5, 6])
|
|
| 149 | 185 |
def test_directory_listing(cli, tmpdir, root):
|
| 150 | 186 |
fake_context = FakeContext()
|
| 151 | 187 |
fake_context.artifactdir = tmpdir
|
| 152 | 188 |
# Create some fake content
|
| 153 | 189 |
generate_import_roots(tmpdir)
|
| 190 |
+ generate_random_root(tmpdir)
|
|
| 154 | 191 |
|
| 155 | 192 |
d = create_new_filedir(root, tmpdir)
|
| 156 | 193 |
filelist = list(d.list_relative_paths())
|
| ... | ... | @@ -162,4 +199,4 @@ def test_directory_listing(cli, tmpdir, root): |
| 162 | 199 |
print("{}".format(filelist))
|
| 163 | 200 |
print("filelist for root {} via CasBasedDirectory:".format(root))
|
| 164 | 201 |
print("{}".format(filelist2))
|
| 165 |
- assert(filelist==filelist2)
|
|
| 202 |
+ assert filelist == filelist2
|
