diff --git a/conans/client/graph/graph.py b/conans/client/graph/graph.py
index a406e6e6f..2fb467e2d 100644
--- a/conans/client/graph/graph.py
+++ b/conans/client/graph/graph.py
@@ -141,6 +141,20 @@ class DepsGraph(object):
         open_nodes = nodes_by_level[1]
         return open_nodes
 
+    def full_closure(self, node):
+        closure = OrderedDict()
+        current = node.neighbors()
+        while current:
+            new_current = []
+            for n in current:
+                closure[n] = n
+            for n in current:
+                for neigh in n.public_neighbors():
+                    if neigh not in new_current and neigh not in closure:
+                        new_current.append(neigh)
+            current = new_current
+        return closure
+
     def closure(self, node):
         closure = OrderedDict()
         current = node.neighbors()
diff --git a/conans/client/installer.py b/conans/client/installer.py
index 12860cdf6..054a42858 100644
--- a/conans/client/installer.py
+++ b/conans/client/installer.py
@@ -414,12 +414,13 @@ class ConanInstaller(object):
     @staticmethod
     def _propagate_info(node, levels, deps_graph):
         # Get deps_cpp_info from upstream nodes
-        closure = deps_graph.closure(node)
+        closure = deps_graph.full_closure(node)
         node_order = []
         for level in levels:
-            for n in closure.values():
+            for n in closure:
                 if n in level:
                     node_order.append(n)
+
         conan_file = node.conanfile
         for n in node_order:
             conan_file.deps_cpp_info.update(n.conanfile.cpp_info, n.conan_ref.name)
diff --git a/conans/client/source.py b/conans/client/source.py
index 8559983cf..7fdd38099 100644
--- a/conans/client/source.py
+++ b/conans/client/source.py
@@ -14,8 +14,11 @@ from conans.util.files import rmdir, set_dirty, is_dirty, clean_dirty, mkdir
 
 def get_scm(conanfile, src_folder):
     data = getattr(conanfile, "scm", None)
-    if data is not None:
+    if data is not None and isinstance(data, dict):
         return SCM(data, src_folder)
+    else:
+        # not an instance of dict or None, skip SCM feature.
+        pass
 
 
 def complete_recipe_sources(remote_manager, client_cache, registry, conanfile, conan_reference):

conan 1.4.x fails when "scm" attribute in recipe is not a dict
Hi @lasote and @memsharded ,

at first of all thanks for implementing the first version of scm feature. Sadly I was unable to review it completely before the 1.4.0 release.

The current implementation fails (without changing our recipes) because we also have an "scm" attribute but which is an instance of our "private" SCM implementation.

The traceback is:

```
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/conan-1.4.2-py2.7.egg/conans/client/command.py", line 1182, in run
    method(args[0][1:])
  File "/usr/local/lib/python2.7/dist-packages/conan-1.4.2-py2.7.egg/conans/client/command.py", line 246, in create
    test_build_folder=args.test_build_folder)
  File "/usr/local/lib/python2.7/dist-packages/conan-1.4.2-py2.7.egg/conans/client/conan_api.py", line 77, in wrapper
    return f(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/conan-1.4.2-py2.7.egg/conans/client/conan_api.py", line 310, in create
    self._user_io.out, self._client_cache)
  File "/usr/local/lib/python2.7/dist-packages/conan-1.4.2-py2.7.egg/conans/client/cmd/export.py", line 61, in cmd_export
    _export_conanfile(conanfile_path, output, client_cache, conanfile, conan_ref, keep_source)
  File "/usr/local/lib/python2.7/dist-packages/conan-1.4.2-py2.7.egg/conans/client/cmd/export.py", line 136, in _export_conanfile
    output, paths, conan_ref)
  File "/usr/local/lib/python2.7/dist-packages/conan-1.4.2-py2.7.egg/conans/client/cmd/export.py", line 107, in _capture_export_scm_data
    scm = get_scm(conanfile, src_path)
  File "/usr/local/lib/python2.7/dist-packages/conan-1.4.2-py2.7.egg/conans/client/source.py", line 18, in get_scm
    return SCM(data, src_folder)
  File "/usr/local/lib/python2.7/dist-packages/conan-1.4.2-py2.7.egg/conans/model/scm.py", line 13, in __init__
    self.type = data.get("type")
AttributeError: 'property' object has no attribute 'get'
```

The reason is that there is no dict instance check implemented in `get_scm()` but IMHO it has to. Something like the following should be enough:

```
def get_scm(conanfile, src_folder):
    data = getattr(conanfile, "scm", None)
    if data is not None and isinstance(data, dict):
        return SCM(data, src_folder)
    else:
        # not an instance of dict or None, skip SCM feature.
        pass
```

Would be nice if you can fix this as soon as possible.

Thanks in advance.
Best Aalmann


---
To help us debug your issue please explain:

- [x ] I've read the [CONTRIBUTING guide](https://raw.githubusercontent.com/conan-io/conan/develop/.github/CONTRIBUTING.md).
- [ x] I've specified the Conan version, operating system version and any tool that can be relevant.
- [ x] I've explained the steps to reproduce the error or the motivation/use case of the question/suggestion.

diff --git a/conans/test/functional/scm_test.py b/conans/test/functional/scm_test.py
index 0fc72c328..2420e5b44 100644
--- a/conans/test/functional/scm_test.py
+++ b/conans/test/functional/scm_test.py
@@ -40,6 +40,20 @@ class SCMTest(unittest.TestCase):
         self.client.runner("git add .", cwd=self.client.current_folder)
         self.client.runner('git commit -m  "commiting"', cwd=self.client.current_folder)
 
+    def test_scm_other_type_ignored(self):
+        conanfile = '''
+from conans import ConanFile, tools
+
+class ConanLib(ConanFile):
+    name = "lib"
+    version = "0.1"
+    scm = ["Other stuff"]
+
+'''
+        self.client.save({"conanfile.py": conanfile})
+        # nothing breaks
+        self.client.run("export . user/channel")
+
     def test_repeat_clone_changing_subfolder(self):
         tmp = '''
 from conans import ConanFile, tools
diff --git a/conans/test/integration/order_libs_test.py b/conans/test/integration/order_libs_test.py
index a2f0ec268..7f9d37845 100644
--- a/conans/test/integration/order_libs_test.py
+++ b/conans/test/integration/order_libs_test.py
@@ -10,6 +10,62 @@ class OrderLibsTest(unittest.TestCase):
     def setUp(self):
         self.client = TestClient()
 
+    def private_order_test(self):
+        # https://github.com/conan-io/conan/issues/3006
+        client = TestClient()
+        conanfile = """from conans import ConanFile
+class LibBConan(ConanFile):
+    def package_info(self):
+        self.cpp_info.libs = ["LibC"]
+"""
+        client.save({"conanfile.py": conanfile})
+        client.run("create . LibC/0.1@user/channel")
+
+        conanfile = """from conans import ConanFile
+class LibCConan(ConanFile):
+    requires = "LibC/0.1@user/channel"
+    def package_info(self):
+        self.cpp_info.libs = ["LibB"]
+"""
+        client.save({"conanfile.py": conanfile})
+        client.run("create . LibB/0.1@user/channel")
+
+        conanfile = """from conans import ConanFile
+class LibCConan(ConanFile):
+    requires = ("LibB/0.1@user/channel", "private"), "LibC/0.1@user/channel"
+"""
+        client.save({"conanfile.py": conanfile})
+        client.run("install . -g cmake")
+        conanbuildinfo = load(os.path.join(client.current_folder, "conanbuildinfo.cmake"))
+        self.assertIn("set(CONAN_LIBS LibB LibC ${CONAN_LIBS})", conanbuildinfo)
+        # Change private
+        conanfile = """from conans import ConanFile
+class LibCConan(ConanFile):
+    requires = "LibB/0.1@user/channel", ("LibC/0.1@user/channel", "private")
+"""
+        client.save({"conanfile.py": conanfile})
+        client.run("install . -g cmake")
+        conanbuildinfo = load(os.path.join(client.current_folder, "conanbuildinfo.cmake"))
+        self.assertIn("set(CONAN_LIBS LibB LibC ${CONAN_LIBS})", conanbuildinfo)
+        # Change order
+        conanfile = """from conans import ConanFile
+class LibCConan(ConanFile):
+    requires = ("LibC/0.1@user/channel", "private"), "LibB/0.1@user/channel"
+"""
+        client.save({"conanfile.py": conanfile})
+        client.run("install . -g cmake")
+        conanbuildinfo = load(os.path.join(client.current_folder, "conanbuildinfo.cmake"))
+        self.assertIn("set(CONAN_LIBS LibB LibC ${CONAN_LIBS})", conanbuildinfo)
+        # Change order
+        conanfile = """from conans import ConanFile
+class LibCConan(ConanFile):
+    requires = "LibC/0.1@user/channel", ("LibB/0.1@user/channel", "private")
+"""
+        client.save({"conanfile.py": conanfile})
+        client.run("install . -g cmake")
+        conanbuildinfo = load(os.path.join(client.current_folder, "conanbuildinfo.cmake"))
+        self.assertIn("set(CONAN_LIBS LibB LibC ${CONAN_LIBS})", conanbuildinfo)
+
     def _export(self, name, deps=None, export=True):
         def _libs():
             if name == "LibPNG":

pip install -e .[dev]
parse_log_pytest
requirements.txt
nose pytest
apt-get update apt-get install -y gcc
3.6
conans/requirements.txt conans/requirements_osx.txt conans/requirements_server.txt conans/requirements_dev.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
asn1crypto==1.5.1
astroid==1.6.6
attrs==22.2.0
beautifulsoup4==4.12.3
bottle==0.12.25
certifi==2021.5.30
cffi==1.15.1
charset-normalizer==2.0.12
codecov==2.1.13
colorama==0.3.9
-e git+https://github.com/conan-io/conan.git@d9f36e5d34f22a7cdba5aba9f0ad90c86f71d760#egg=conan
coverage==4.2
cryptography==2.1.4
deprecation==2.0.7
distro==1.1.0
fasteners==0.19
future==0.16.0
idna==3.10
importlib-metadata==4.8.3
iniconfig==1.1.1
isort==5.10.1
lazy-object-proxy==1.7.1
mccabe==0.7.0
mock==1.3.0
ndg-httpsclient==0.4.4
node-semver==0.2.0
nose==1.3.7
packaging==21.3
parameterized==0.8.1
patch==1.16
pbr==6.1.1
pluggy==1.0.0
pluginbase==0.7
py==1.11.0
pyasn==1.5.0b7
pyasn1==0.5.1
pycparser==2.21
Pygments==2.14.0
PyJWT==1.7.1
pylint==1.8.4
pyOpenSSL==17.5.0
pyparsing==3.1.4
pytest==7.0.1
PyYAML==3.12
requests==2.27.1
six==1.17.0
soupsieve==2.3.2.post1
tomli==1.2.3
typing_extensions==4.1.1
urllib3==1.26.20
waitress==2.0.0
WebOb==1.8.9
WebTest==2.0.35
wrapt==1.16.0
zipp==3.6.0

name: conan
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
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - 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=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - asn1crypto==1.5.1
      - astroid==1.6.6
      - attrs==22.2.0
      - beautifulsoup4==4.12.3
      - bottle==0.12.25
      - cffi==1.15.1
      - charset-normalizer==2.0.12
      - codecov==2.1.13
      - colorama==0.3.9
      - coverage==4.2
      - cryptography==2.1.4
      - deprecation==2.0.7
      - distro==1.1.0
      - fasteners==0.19
      - future==0.16.0
      - idna==3.10
      - importlib-metadata==4.8.3
      - iniconfig==1.1.1
      - isort==5.10.1
      - lazy-object-proxy==1.7.1
      - mccabe==0.7.0
      - mock==1.3.0
      - ndg-httpsclient==0.4.4
      - node-semver==0.2.0
      - nose==1.3.7
      - packaging==21.3
      - parameterized==0.8.1
      - patch==1.16
      - pbr==6.1.1
      - pluggy==1.0.0
      - pluginbase==0.7
      - py==1.11.0
      - pyasn==1.5.0b7
      - pyasn1==0.5.1
      - pycparser==2.21
      - pygments==2.14.0
      - pyjwt==1.7.1
      - pylint==1.8.4
      - pyopenssl==17.5.0
      - pyparsing==3.1.4
      - pytest==7.0.1
      - pyyaml==3.12
      - requests==2.27.1
      - six==1.17.0
      - soupsieve==2.3.2.post1
      - tomli==1.2.3
      - typing-extensions==4.1.1
      - urllib3==1.26.20
      - waitress==2.0.0
      - webob==1.8.9
      - webtest==2.0.35
      - wrapt==1.16.0
      - zipp==3.6.0
prefix: /opt/conda/envs/conan

conans/test/functional/scm_test.py::SCMTest::test_scm_other_type_ignored
conans/test/functional/scm_test.py::SCMTest::test_auto_git conans/test/functional/scm_test.py::SCMTest::test_deleted_source_folder conans/test/functional/scm_test.py::SCMTest::test_install_checked_out conans/test/functional/scm_test.py::SCMTest::test_local_source conans/test/functional/scm_test.py::SCMTest::test_repeat_clone_changing_subfolder conans/test/functional/scm_test.py::SCMTest::test_source_method_export_sources_and_scm_mixed
conans/client/graph/graph.py conans/client/installer.py conans/client/source.py
conans/client/graph/graph.py conans/client/installer.py conans/client/source.py