diff --git a/swift/utils/hub_utils.py b/swift/utils/hub_utils.py index 6cd612f7da..663a0f9d55 100644 --- a/swift/utils/hub_utils.py +++ b/swift/utils/hub_utils.py @@ -81,7 +81,7 @@ def safe_snapshot_download(model_id_or_path: str, '*.ot', '*.h5' ] if not download_model: - ignore_patterns += ['*.bin', '*.safetensors'] + ignore_patterns = [*ignore_patterns, '*.bin', '*.safetensors'] hub = get_hub(use_hf) if model_id_or_path.startswith('~'): model_id_or_path = os.path.abspath(os.path.expanduser(model_id_or_path)) diff --git a/tests/utils/test_hub_utils.py b/tests/utils/test_hub_utils.py index 32866e0fa1..e90ab6dc79 100644 --- a/tests/utils/test_hub_utils.py +++ b/tests/utils/test_hub_utils.py @@ -1,9 +1,10 @@ import os import tempfile import unittest +from contextlib import nullcontext from unittest.mock import MagicMock, patch -from swift.utils.hub_utils import download_file, download_ms_file +from swift.utils.hub_utils import download_file, download_ms_file, safe_snapshot_download class TestHubUtils(unittest.TestCase): @@ -86,6 +87,23 @@ def test_download_file_uses_a_distinct_cache_path_for_each_url(self, mock_cache_ self.assertEqual(f.read(), b'second') self.assertEqual(mock_get.call_count, 2) + @patch('swift.utils.hub_utils.safe_ddp_context', side_effect=lambda **kwargs: nullcontext()) + @patch('swift.hub.get_hub') + def test_metadata_download_does_not_mutate_caller_ignore_patterns(self, mock_get_hub, _mock_safe_ddp_context): + hub = MagicMock() + hub.download_model.return_value = self.tmp_dir + mock_get_hub.return_value = hub + ignore_patterns = ['custom/*'] + + safe_snapshot_download('org/model', download_model=False, ignore_patterns=ignore_patterns) + + self.assertEqual(ignore_patterns, ['custom/*']) + self.assertEqual(hub.download_model.call_args_list[0].args[2], ['custom/*', '*.bin', '*.safetensors']) + + safe_snapshot_download('org/model', download_model=True, ignore_patterns=ignore_patterns) + + self.assertEqual(hub.download_model.call_args_list[1].args[2], ['custom/*']) + if __name__ == '__main__': unittest.main()