diff --git a/ddsc/core/localstore.py b/ddsc/core/localstore.py
index d8d38ec..27e0866 100644
--- a/ddsc/core/localstore.py
+++ b/ddsc/core/localstore.py
@@ -2,6 +2,7 @@ import hashlib
 import math
 import mimetypes
 import os
+from os.path import isfile, isdir
 from ddsc.core.ignorefile import FileFilter, IgnoreFilePatterns
 from ddsc.core.util import KindType, ProjectWalker, plural_fmt, join_with_commas_and_and
 
@@ -30,7 +31,9 @@ class LocalProject(object):
         :param path: str path to add
         """
         abspath = os.path.abspath(path)
-        self.children.append(_build_project_tree(abspath, self.followsymlinks, self.file_filter))
+        child = _build_project_tree(abspath, self.followsymlinks, self.file_filter)
+        if child:
+            self.children.append(child)
 
     def add_paths(self, path_list):
         """
@@ -205,13 +208,19 @@ def _build_project_tree(path, followsymlinks, file_filter):
     :return: the top node of the tree LocalFile or LocalFolder
     """
     result = None
-    if os.path.isfile(path):
+    if isfile(path):
         result = LocalFile(path)
-    else:
+    elif isdir(path):
         result = _build_folder_tree(os.path.abspath(path), followsymlinks, file_filter)
+    else:
+        _on_non_regular_file(path)
     return result
 
 
+def _on_non_regular_file(path):
+    print("Warning: Skipping {}. This is an unsupported type of file.".format(path))
+
+
 def _build_folder_tree(top_abspath, followsymlinks, file_filter):
     """
     Build a tree of LocalFolder with children based on a path.
@@ -244,8 +253,11 @@ def _build_folder_tree(top_abspath, followsymlinks, file_filter):
             child_dirs.remove(remove_child_dir)
         for child_filename in child_files:
             abs_child_filename = os.path.join(dir_name, child_filename)
-            if ignore_file_patterns.include(abs_child_filename, is_file=True):
-                folder.add_child(LocalFile(abs_child_filename))
+            if isfile(abs_child_filename):
+                if ignore_file_patterns.include(abs_child_filename, is_file=True):
+                    folder.add_child(LocalFile(abs_child_filename))
+            else:
+                _on_non_regular_file(abs_child_filename)
     return path_to_content.get(top_abspath)
 
 

ddsclient upload stuck
A user reported an upload that appeared to be stuck.
I was able to look at the process in linux.
Using `lsof -u <user>` I saw that there were several TCP connections back to DukeDS API (heroku) that were stuck in CLOSE_WAIT.

diff --git a/ddsc/core/tests/test_localstore.py b/ddsc/core/tests/test_localstore.py
index ba0172f..e6de966 100644
--- a/ddsc/core/tests/test_localstore.py
+++ b/ddsc/core/tests/test_localstore.py
@@ -106,6 +106,16 @@ class TestProjectContent(TestCase):
             '/note.txt'
         ])
 
+    @patch('ddsc.core.localstore.isfile')
+    @patch('ddsc.core.localstore.print')
+    def test_top_level_non_regular_file(self, mock_print, mock_isfile):
+        mock_isfile.return_value = False
+        content = LocalProject(False, file_exclude_regex=INCLUDE_ALL)
+        content.add_path('/tmp/DukeDsClientTestFolder/note.txt')
+        self.assertEqual(get_file_or_folder_paths(content), [])
+        mock_print.assert_called_with('Warning: Skipping /tmp/DukeDsClientTestFolder/note.txt. '
+                                      'This is an unsupported type of file.')
+
     def test_empty_folder_str(self):
         content = LocalProject(False, file_exclude_regex=INCLUDE_ALL)
         content.add_path('/tmp/DukeDsClientTestFolder/emptyfolder')
@@ -130,6 +140,18 @@ class TestProjectContent(TestCase):
             '/scripts/makemoney.sh',
         ])
 
+    @patch('ddsc.core.localstore.isfile')
+    @patch('ddsc.core.localstore.print')
+    def test_one_folder_containing_non_regular_file(self, mock_print, mock_isfile):
+        mock_isfile.return_value = False
+        content = LocalProject(False, file_exclude_regex=INCLUDE_ALL)
+        content.add_path('/tmp/DukeDsClientTestFolder/scripts')
+        self.assertEqual(get_file_or_folder_paths(content), [
+            '/scripts'
+        ])
+        mock_print.assert_called_with('Warning: Skipping /tmp/DukeDsClientTestFolder/scripts/makemoney.sh. '
+                                      'This is an unsupported type of file.')
+
     def test_nested_folder_str(self):
         content = LocalProject(False, file_exclude_regex=INCLUDE_ALL)
         content.add_path('/tmp/DukeDsClientTestFolder/results')

pip install -e .[dev]
parse_log_pytest
requirements.txt
nose mock pytest
3.9
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
certifi==2025.1.31
charset-normalizer==3.4.1
-e git+https://github.com/Duke-GCB/DukeDSClient.git@bd6172fde42acdea23b89491579d127f5af6b281#egg=DukeDSClient
exceptiongroup==1.2.2
future==0.16.0
idna==3.10
iniconfig==2.1.0
mock==5.2.0
nose==1.3.7
packaging==24.2
pluggy==1.5.0
pytest==8.3.5
pytz==2025.2
PyYAML==5.1
requests==2.32.3
six==1.10.0
tenacity==5.0.4
tomli==2.2.1
urllib3==2.3.0

name: DukeDSClient
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - certifi==2025.1.31
      - charset-normalizer==3.4.1
      - exceptiongroup==1.2.2
      - future==0.16.0
      - idna==3.10
      - iniconfig==2.1.0
      - mock==5.2.0
      - nose==1.3.7
      - packaging==24.2
      - pluggy==1.5.0
      - pytest==8.3.5
      - pytz==2025.2
      - pyyaml==5.1
      - requests==2.32.3
      - six==1.10.0
      - tenacity==5.0.4
      - tomli==2.2.1
      - urllib3==2.3.0
prefix: /opt/conda/envs/DukeDSClient

ddsc/core/tests/test_localstore.py::TestProjectContent::test_one_folder_containing_non_regular_file ddsc/core/tests/test_localstore.py::TestProjectContent::test_top_level_non_regular_file
ddsc/core/tests/test_localstore.py::TestProjectFolderFile::test_empty_folder_str ddsc/core/tests/test_localstore.py::TestProjectFolderFile::test_file_str ddsc/core/tests/test_localstore.py::TestProjectFolderFile::test_folder_one_child_str ddsc/core/tests/test_localstore.py::TestProjectFolderFile::test_folder_two_children_str ddsc/core/tests/test_localstore.py::TestProjectFolderFile::test_nested_folder_str ddsc/core/tests/test_localstore.py::TestProjectContent::test_big_folder_str ddsc/core/tests/test_localstore.py::TestProjectContent::test_empty_folder_and_file_str ddsc/core/tests/test_localstore.py::TestProjectContent::test_empty_folder_str ddsc/core/tests/test_localstore.py::TestProjectContent::test_empty_str ddsc/core/tests/test_localstore.py::TestProjectContent::test_exclude_dot_files ddsc/core/tests/test_localstore.py::TestProjectContent::test_folder_dot_name ddsc/core/tests/test_localstore.py::TestProjectContent::test_folder_name_no_slash ddsc/core/tests/test_localstore.py::TestProjectContent::test_folder_name_removes_slash ddsc/core/tests/test_localstore.py::TestProjectContent::test_folder_up_and_back ddsc/core/tests/test_localstore.py::TestProjectContent::test_ignore_one_dir ddsc/core/tests/test_localstore.py::TestProjectContent::test_include_dot_files ddsc/core/tests/test_localstore.py::TestProjectContent::test_nested_folder_str ddsc/core/tests/test_localstore.py::TestProjectContent::test_one_folder_str ddsc/core/tests/test_localstore.py::TestProjectContent::test_top_level_file_str ddsc/core/tests/test_localstore.py::TestLocalFile::test_count_chunks_values ddsc/core/tests/test_localstore.py::TestLocalFile::test_set_remote_values_after_send ddsc/core/tests/test_localstore.py::TestLocalItemsCounter::test_to_str ddsc/core/tests/test_localstore.py::TestItemsToSendCounter::test_to_str
ddsc/core/localstore.py
ddsc/core/localstore.py