def test_snapcraft_yaml_modification_ignored(self, tmp_work_path, snapcraft_file): source = "source" destination = "destination" snapcraft_source_path = os.path.join(source, snapcraft_file) snapcraft_destination_path = os.path.join(destination, snapcraft_file) os.makedirs(os.path.dirname(snapcraft_source_path)) os.mkdir(destination) with open(snapcraft_source_path, "w") as f: f.write("1") # Now make a reference file with a timestamp later than the file was # created. We'll ensure this by setting it ourselves shutil.copy2(snapcraft_source_path, "reference") access_time = os.stat("reference").st_atime modify_time = os.stat("reference").st_mtime os.utime("reference", (access_time, modify_time + 1)) local = sources.Local(source, destination) local.pull() assert not local.check("reference") assert os.path.exists(snapcraft_destination_path) # Now add a new file to the directory, and make sure it has a timestamp # later than our reference (this whole test happens too fast) with open(snapcraft_source_path, "w") as f: f.write("2") access_time = os.stat("reference").st_atime modify_time = os.stat("reference").st_mtime os.utime(snapcraft_source_path, (access_time, modify_time + 1)) assert not local.check("reference")
def test_pull_with_existing_source_link_creates_symlink(self): os.symlink('dummy', 'source_dir') local = sources.Local('.', 'source_dir') local.pull() self.assertTrue(os.path.islink('source_dir')) self.assertEqual(os.path.realpath('source_dir'), self.path)
def test_pull_with_existing_source_file_fails(self): open('source_dir', 'w').close() local = sources.Local('.', 'source_dir') with self.assertRaises(EnvironmentError) as raised: local.pull() self.assertEqual("Cannot pull to target 'source_dir'", str(raised.exception))
def test_pull_with_existing_source_link_error(self): os.makedirs(os.path.join("src", "dir")) open(os.path.join("src", "dir", "file"), "w").close() # Note that this is a symlink now instead of a directory os.symlink("dummy", "destination") local = sources.Local("src", "destination") self.assertRaises(NotADirectoryError, local.pull)
def test_pull_with_existing_source_file_error(self): os.makedirs(os.path.join("src", "dir")) open(os.path.join("src", "dir", "file"), "w").close() # Note that this is a file now instead of a directory open("destination", "w").close() local = sources.Local("src", "destination") self.assertRaises(errors.SnapcraftEnvironmentError, local.pull)
def test_pull_with_existing_source_file_error(self): os.makedirs(os.path.join('src', 'dir')) open(os.path.join('src', 'dir', 'file'), 'w').close() # Note that this is a file now instead of a directory open('destination', 'w').close() local = sources.Local('src', 'destination') self.assertRaises(NotADirectoryError, local.pull)
def test_pull_with_source_dir_with_content_fails(self): os.mkdir('source_dir') open(os.path.join('source_dir', 'file'), 'w').close() local = sources.Local('.', 'source_dir') with self.assertRaises(EnvironmentError) as raised: local.pull() self.assertEqual("Cannot pull to target 'source_dir'", str(raised.exception))
def test_pull_does_not_change_snapcraft_files_list(self, mock_glob): # Regression test for https://bugs.launchpad.net/snapcraft/+bug/1614913 # Verify that SNAPCRAFT_FILES was not modified by the pull when there # are files to ignore. snapcraft_files_before_pull = copy.copy(common.SNAPCRAFT_FILES) mock_glob.return_value = ["a.snap", "b.snap", "c.snap"] local = sources.Local(".", "destination") local.pull() self.assertThat(snapcraft_files_before_pull, Equals(common.SNAPCRAFT_FILES))
def test_pull_with_source_a_parent_of_current_dir(self): # Verify that the snapcraft root dir does not get copied into itself. os.makedirs('subdir') cwd = os.getcwd() os.chdir('subdir') local = sources.Local('..', 'foo') local.pull() os.chdir(cwd) self.assertTrue( 'subdir' not in os.listdir(os.path.join('subdir', 'foo')))
def test_pull_with_existing_source_link_creates_symlink(self): os.makedirs(os.path.join('src', 'dir')) open(os.path.join('src', 'dir', 'file'), 'w').close() # Note that this is a symlink now instead of a directory os.symlink('dummy', 'destination') local = sources.Local('src', 'destination') local.pull() self.assertFalse(os.path.islink('destination')) self.assertFalse(os.path.islink(os.path.join('destination', 'dir'))) self.assertGreater( os.stat(os.path.join('destination', 'dir', 'file')).st_nlink, 1)
def test_pull_with_source_the_parent_of_current_dir( self, tmp_work_path, snapcraft_dir): os.makedirs("subdir") cwd = tmp_work_path.as_posix() os.chdir("subdir") source_dir = os.path.join(snapcraft_dir, "foo_src") local = sources.Local("..", source_dir) local.pull() os.chdir(cwd) assert not os.path.exists( os.path.join("subdir", source_dir, "subdir", snapcraft_dir)) assert "subdir" in os.listdir(os.path.join("subdir", source_dir))
def test_pull_with_source_the_parent_of_current_dir(self): os.makedirs('subdir') cwd = os.getcwd() os.chdir('subdir') source_dir = os.path.join(self.snapcraft_dir, 'foo_src') local = sources.Local('..', source_dir) local.pull() os.chdir(cwd) self.assertFalse( os.path.exists(os.path.join( 'subdir', source_dir, 'subdir', self.snapcraft_dir))) self.assertTrue( 'subdir' in os.listdir(os.path.join('subdir', source_dir)))
def test_pull_with_existing_empty_source_dir_creates_hardlinks(self): os.makedirs(os.path.join('src', 'dir')) open(os.path.join('src', 'dir', 'file'), 'w').close() os.mkdir('destination') local = sources.Local('src', 'destination') local.pull() # Verify that the directories are not symlinks, but the file is a # hardlink. self.assertFalse(os.path.islink('destination')) self.assertFalse(os.path.islink(os.path.join('destination', 'dir'))) self.assertGreater( os.stat(os.path.join('destination', 'dir', 'file')).st_nlink, 1)
def test_pull_with_source_the_parent_of_current_dir(self): os.makedirs("subdir") cwd = os.getcwd() os.chdir("subdir") source_dir = os.path.join(self.snapcraft_dir, "foo_src") local = sources.Local("..", source_dir) local.pull() os.chdir(cwd) self.assertFalse( os.path.exists( os.path.join("subdir", source_dir, "subdir", self.snapcraft_dir))) self.assertTrue( "subdir" in os.listdir(os.path.join("subdir", source_dir)))
def test_pull_with_existing_empty_source_dir_creates_hardlinks(self): os.makedirs(os.path.join("src", "dir")) open(os.path.join("src", "dir", "file"), "w").close() os.mkdir("destination") local = sources.Local("src", "destination") local.pull() # Verify that the directories are not symlinks, but the file is a # hardlink. self.assertFalse(os.path.islink("destination")) self.assertFalse(os.path.islink(os.path.join("destination", "dir"))) self.assertGreater( os.stat(os.path.join("destination", "dir", "file")).st_nlink, 1)
def test_pull_with_source_a_parent_of_current_dir(self, tmp_work_path, snapcraft_dir): subdir = os.path.join("subdir", "subsubdir", "subsubsubdir") os.makedirs(subdir) cwd = tmp_work_path.as_posix() os.chdir(subdir) source = "../" * (subdir.count(os.sep) + 1) source_dir = os.path.join(snapcraft_dir, "foo_src") local = sources.Local(source, source_dir) local.pull() os.chdir(cwd) assert not os.path.exists( os.path.join(subdir, source_dir, subdir, snapcraft_dir)) assert os.path.basename(subdir) in os.listdir( os.path.join(subdir, source_dir, os.path.dirname(subdir)))
def test_pull_with_source_a_parent_of_current_dir(self): subdir = os.path.join('subdir', 'subsubdir', 'subsubsubdir') os.makedirs(subdir) cwd = os.getcwd() os.chdir(subdir) source = '../' * (subdir.count(os.sep)+1) source_dir = os.path.join(self.snapcraft_dir, 'foo_src') local = sources.Local(source, source_dir) local.pull() os.chdir(cwd) self.assertFalse( os.path.exists(os.path.join( subdir, source_dir, subdir, self.snapcraft_dir))) self.assertTrue( os.path.basename(subdir) in os.listdir( os.path.join(subdir, source_dir, os.path.dirname(subdir))))
def update_build(self): if not self.plugin.out_of_source_build: # Use the local source to update. It's important to use # file_utils.copy instead of link_or_copy, as the build process # may modify these files source = sources.Local( self.plugin.sourcedir, self.plugin.build_basedir, copy_function=file_utils.copy, ) if not source.check( states.get_step_state_file(self.plugin.statedir, steps.BUILD) ): return source.update() self._do_build(update=True)
def test_pull_keeps_symlinks(self): # Create a source containing a directory, a file and symlinks to both. os.makedirs(os.path.join("src", "dir")) open(os.path.join("src", "dir", "file"), "w").close() os.symlink("dir", os.path.join("src", "dir_symlink")) os.symlink("file", os.path.join("src", "dir", "file_symlink")) local = sources.Local("src", "destination") local.pull() # Verify that both the file and the directory symlinks were kept. self.expectThat(os.path.join("destination", "dir"), DirExists()) self.expectThat(os.path.join("destination", "dir_symlink"), unit.LinkExists("dir")) self.expectThat(os.path.join("destination", "dir", "file"), FileExists()) self.expectThat(os.path.join("destination", "dir", "file_symlink"), unit.LinkExists("file"))
def test_pull_keeps_symlinks(self): # Create a source containing a directory, a file and symlinks to both. os.makedirs(os.path.join('src', 'dir')) open(os.path.join('src', 'dir', 'file'), 'w').close() os.symlink('dir', os.path.join('src', 'dir_symlink')) os.symlink('file', os.path.join('src', 'dir', 'file_symlink')) local = sources.Local('src', 'destination') local.pull() # Verify that both the file and the directory symlinks were kept. self.expectThat(os.path.join('destination', 'dir'), DirExists()) self.expectThat(os.path.join('destination', 'dir_symlink'), tests.LinkExists('dir')) self.expectThat(os.path.join('destination', 'dir', 'file'), FileExists()) self.expectThat(os.path.join('destination', 'dir', 'file_symlink'), tests.LinkExists('file'))
def test_pull_ignores_snapcraft_specific_data(self): # Make the snapcraft-specific directories os.makedirs(os.path.join("src", "parts")) os.makedirs(os.path.join("src", "stage")) os.makedirs(os.path.join("src", "prime")) os.makedirs(os.path.join("src", ".snapcraft")) os.makedirs(os.path.join("src", "snap")) # Make the snapcraft.yaml (and hidden one) and a built snap open(os.path.join("src", "snapcraft.yaml"), "w").close() open(os.path.join("src", ".snapcraft.yaml"), "w").close() open(os.path.join("src", "foo.snap"), "w").close() # Make the global state cache open(os.path.join("src", ".snapcraft", "state"), "w").close() # Now make some real files os.makedirs(os.path.join("src", "dir")) open(os.path.join("src", "dir", "file"), "w").close() os.mkdir("destination") local = sources.Local("src", "destination") local.pull() # Verify that the snapcraft-specific stuff got filtered out self.assertThat(os.path.join("destination", "parts"), Not(DirExists())) self.assertThat(os.path.join("destination", "stage"), Not(DirExists())) self.assertThat(os.path.join("destination", "prime"), Not(DirExists())) self.assertThat(os.path.join("destination", "snap"), DirExists()) self.assertThat(os.path.join("destination", ".snapcraft.yaml"), FileExists()) self.assertThat(os.path.join("destination", "snapcraft.yaml"), FileExists()) self.assertThat(os.path.join("destination", "foo.snap"), Not(FileExists())) # Verify that the real stuff made it in. self.assertFalse(os.path.islink("destination")) self.assertFalse(os.path.islink(os.path.join("destination", "dir"))) self.assertGreater( os.stat(os.path.join("destination", "dir", "file")).st_nlink, 1)
def test_pull_with_source_a_parent_of_current_dir(self): snapcraft_files_before_pull = copy.copy(common.SNAPCRAFT_FILES) # Verify that the snapcraft root dir does not get copied into itself. os.makedirs('subdir') cwd = os.getcwd() os.chdir('subdir') local = sources.Local('..', 'foo') local.pull() os.chdir(cwd) self.assertTrue( 'subdir' not in os.listdir(os.path.join('subdir', 'foo'))) # Regression test for https://bugs.launchpad.net/snapcraft/+bug/1614913 # Verify that SNAPCRAFT_FILES was not modified by the pull when there # are files to ignore. self.assertEqual(snapcraft_files_before_pull, common.SNAPCRAFT_FILES)
def test_directory_modified(self): source = "source" source_dir = os.path.join(source, "dir") destination = "destination" os.makedirs(source_dir) os.mkdir(destination) with open(os.path.join(source_dir, "file1"), "w") as f: f.write("1") # Now make a reference file with a timestamp later than the file was # created. We'll ensure this by setting it ourselves shutil.copy2(os.path.join(source_dir, "file1"), "reference") access_time = os.stat("reference").st_atime modify_time = os.stat("reference").st_mtime os.utime("reference", (access_time, modify_time + 1)) local = sources.Local(source, destination) local.pull() self.assertFalse(local.check("reference"), "Expected no updates to be available") self.assertThat(os.path.join(destination, "dir", "file1"), FileExists()) # Now add a new file to the directory, and make sure it has a timestamp # later than our reference (this whole test happens too fast) with open(os.path.join(source_dir, "file2"), "w") as f: f.write("2") access_time = os.stat("reference").st_atime modify_time = os.stat("reference").st_mtime os.utime(os.path.join(source_dir, "file2"), (access_time, modify_time + 1)) self.assertTrue(local.check("reference"), "Expected update to be available") local.update() self.assertThat(os.path.join(destination, "dir", "file2"), FileExists())
def test_pull_ignores_snapcraft_specific_data(self): # Make the snapcraft-specific directories os.makedirs(os.path.join('src', 'parts')) os.makedirs(os.path.join('src', 'stage')) os.makedirs(os.path.join('src', 'prime')) # Make the snapcraft.yaml (and hidden one) and a built snap open(os.path.join('src', 'snapcraft.yaml'), 'w').close() open(os.path.join('src', '.snapcraft.yaml'), 'w').close() open(os.path.join('src', 'foo.snap'), 'w').close() # Now make some real files os.makedirs(os.path.join('src', 'dir')) open(os.path.join('src', 'dir', 'file'), 'w').close() os.mkdir('destination') local = sources.Local('src', 'destination') local.pull() # Verify that the snapcraft-specific stuff got filtered out self.assertFalse(os.path.exists(os.path.join('destination', 'parts'))) self.assertFalse(os.path.exists(os.path.join('destination', 'stage'))) self.assertFalse(os.path.exists(os.path.join('destination', 'prime'))) self.assertFalse( os.path.exists(os.path.join('destination', 'snapcraft.yaml'))) self.assertFalse( os.path.exists(os.path.join('destination', '.snapcraft.yaml'))) self.assertFalse( os.path.exists(os.path.join('destination', 'foo.snap'))) # Verify that the real stuff made it in. self.assertFalse(os.path.islink('destination')) self.assertFalse(os.path.islink(os.path.join('destination', 'dir'))) self.assertGreater( os.stat(os.path.join('destination', 'dir', 'file')).st_nlink, 1)