We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
"Files not present in docs directory" message shown for external links
Hi!

### STR
1. `mkvirtualenv mkdocs -p python 3.6`
2. `pip install mkdocs==1.0b1`
3. Update [an existing project's mkdocs.yml](https://github.com/mozilla-neutrino/neutrino-dev/blob/cab8e9e0f50c83fbb5ae0f6fb0e98b286beef049/mkdocs.yml) to use `nav` and take advantage of external link support. eg:

```yaml
docs_dir: 'docs'
site_dir: 'build'
strict: true
theme:
  name: 'material'
# ...

nav:
  - Introduction: './index.md'
  # <snip>
  - v8 Documentation: 'https://neutrinojs.org/'
  - v7 Documentation: 'https://release-v7.neutrinojs.org/'
  - v6 Documentation: 'https://github.com/mozilla-neutrino/neutrino-dev/tree/release/v6/docs'
  - v5 Documentation: 'https://github.com/mozilla-neutrino/neutrino-dev/tree/release/v5/docs'
  - v4 Documentation: 'https://github.com/mozilla-neutrino/neutrino-dev/tree/release/v4/docs'
```

4. `mkdocs serve`

### Expected

Console output doesn't output warnings that give the impression something is broken.

### Actual

```
(mkdocs) neutrino-dev $ mkdocs serve
INFO    -  Building documentation...
INFO    -  Cleaning site directory
INFO    -  The following paths are included in the "nav" configuration, but do not exist in the docs directory:
  - https://neutrinojs.org/
  - https://release-v7.neutrinojs.org/
  - https://github.com/mozilla-neutrino/neutrino-dev/tree/release/v6/docs
  - https://github.com/mozilla-neutrino/neutrino-dev/tree/release/v5/docs
  - https://github.com/mozilla-neutrino/neutrino-dev/tree/release/v4/docs
[I 180723 17:15:03 server:292] Serving on http://127.0.0.1:8000
...
```

For links that are clearly external links (ie contain a full URL), it would be good to not output this message (even at log level INFO), since it's likely to be confusing for end users working on our documentation. (Perhaps log level DEBUG is the most appropriate?)

Many thanks :-)

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `mkdocs/structure/nav.py`
Content:
```
1 # coding: utf-8
2 
3 from __future__ import unicode_literals
4 import logging
5 
6 from mkdocs.structure.pages import Page
7 from mkdocs.utils import string_types, nest_paths
8 
9 log = logging.getLogger(__name__)
10 
11 
12 class Navigation(object):
13     def __init__(self, items, pages):
14         self.items = items  # Nested List with full navigation of Sections, Pages, and Links.
15         self.pages = pages  # Flat List of subset of Pages in nav, in order.
16 
17         self.homepage = None
18         for page in pages:
19             if page.is_homepage:
20                 self.homepage = page
21                 break
22 
23     def __repr__(self):
24         return '\n'.join([item._indent_print() for item in self])
25 
26     def __iter__(self):
27         return iter(self.items)
28 
29     def __len__(self):
30         return len(self.items)
31 
32 
33 class Section(object):
34     def __init__(self, title, children):
35         self.title = title
36         self.children = children
37 
38         self.parent = None
39         self.active = False
40 
41         self.is_section = True
42         self.is_page = False
43         self.is_link = False
44 
45     def __repr__(self):
46         return "Section(title='{0}')".format(self.title)
47 
48     def _get_active(self):
49         """ Return active status of section. """
50         return self.__active
51 
52     def _set_active(self, value):
53         """ Set active status of section and ancestors. """
54         self.__active = bool(value)
55         if self.parent is not None:
56             self.parent.active = bool(value)
57 
58     active = property(_get_active, _set_active)
59 
60     @property
61     def ancestors(self):
62         if self.parent is None:
63             return []
64         return [self.parent] + self.parent.ancestors
65 
66     def _indent_print(self, depth=0):
67         ret = ['{}{}'.format('    ' * depth, repr(self))]
68         for item in self.children:
69             ret.append(item._indent_print(depth + 1))
70         return '\n'.join(ret)
71 
72 
73 class Link(object):
74     def __init__(self, title, url):
75         self.title = title
76         self.url = url
77         self.parent = None
78 
79         # These should never change but are included for consistency with sections and pages.
80         self.children = None
81         self.active = False
82         self.is_section = False
83         self.is_page = False
84         self.is_link = True
85 
86     def __repr__(self):
87         title = "'{}'".format(self.title) if (self.title is not None) else '[blank]'
88         return "Link(title={}, url='{}')".format(title, self.url)
89 
90     @property
91     def ancestors(self):
92         if self.parent is None:
93             return []
94         return [self.parent] + self.parent.ancestors
95 
96     def _indent_print(self, depth=0):
97         return '{}{}'.format('    ' * depth, repr(self))
98 
99 
100 def get_navigation(files, config):
101     """ Build site navigation from config and files."""
102     nav_config = config['nav'] or nest_paths(f.src_path for f in files.documentation_pages())
103     items = _data_to_navigation(nav_config, files, config)
104     if not isinstance(items, list):
105         items = [items]
106 
107     # Get only the pages from the navigation, ignoring any sections and links.
108     pages = _get_by_type(items, Page)
109 
110     # Include next, previous and parent links.
111     _add_previous_and_next_links(pages)
112     _add_parent_links(items)
113 
114     missing_from_config = [file for file in files.documentation_pages() if file.page is None]
115     if missing_from_config:
116         log.info(
117             'The following pages exist in the docs directory, but are not '
118             'included in the "nav" configuration:\n  - {}'.format(
119                 '\n  - '.join([file.src_path for file in missing_from_config]))
120         )
121         # Any documentation files not found in the nav should still have an associated page.
122         # However, these page objects are only accessable from File instances as `file.page`.
123         for file in missing_from_config:
124             Page(None, file, config)
125 
126     links = _get_by_type(items, Link)
127     if links:
128         # Assume all links are external.
129         # TODO: warn or error on internal links?
130         log.info(
131             'The following paths are included in the "nav" configuration, '
132             'but do not exist in the docs directory:\n  - {}'.format(
133                 '\n  - '.join([link.url for link in links]))
134         )
135     return Navigation(items, pages)
136 
137 
138 def _data_to_navigation(data, files, config):
139     if isinstance(data, dict):
140         return [
141             _data_to_navigation((key, value), files, config)
142             if isinstance(value, string_types) else
143             Section(title=key, children=_data_to_navigation(value, files, config))
144             for key, value in data.items()
145         ]
146     elif isinstance(data, list):
147         return [
148             _data_to_navigation(item, files, config)[0]
149             if isinstance(item, dict) and len(item) == 1 else
150             _data_to_navigation(item, files, config)
151             for item in data
152         ]
153     title, path = data if isinstance(data, tuple) else (None, data)
154     file = files.get_file_from_path(path)
155     if file:
156         return Page(title, file, config)
157     return Link(title, path)
158 
159 
160 def _get_by_type(nav, T):
161     ret = []
162     for item in nav:
163         if isinstance(item, T):
164             ret.append(item)
165         elif item.children:
166             ret.extend(_get_by_type(item.children, T))
167     return ret
168 
169 
170 def _add_parent_links(nav):
171     for item in nav:
172         if item.is_section:
173             for child in item.children:
174                 child.parent = item
175             _add_parent_links(item.children)
176 
177 
178 def _add_previous_and_next_links(pages):
179     bookended = [None] + pages + [None]
180     zipped = zip(bookended[:-2], bookended[1:-1], bookended[2:])
181     for page0, page1, page2 in zipped:
182         page1.previous_page, page1.next_page = page0, page2
183
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/mkdocs/structure/nav.py b/mkdocs/structure/nav.py
--- a/mkdocs/structure/nav.py
+++ b/mkdocs/structure/nav.py
@@ -126,8 +126,7 @@
     links = _get_by_type(items, Link)
     if links:
         # Assume all links are external.
-        # TODO: warn or error on internal links?
-        log.info(
+        log.debug(
             'The following paths are included in the "nav" configuration, '
             'but do not exist in the docs directory:\n  - {}'.format(
                 '\n  - '.join([link.url for link in links]))

{"golden_diff": "diff --git a/mkdocs/structure/nav.py b/mkdocs/structure/nav.py\n--- a/mkdocs/structure/nav.py\n+++ b/mkdocs/structure/nav.py\n@@ -126,8 +126,7 @@\n     links = _get_by_type(items, Link)\n     if links:\n         # Assume all links are external.\n-        # TODO: warn or error on internal links?\n-        log.info(\n+        log.debug(\n             'The following paths are included in the \"nav\" configuration, '\n             'but do not exist in the docs directory:\\n  - {}'.format(\n                 '\\n  - '.join([link.url for link in links]))\n", "issue": "\"Files not present in docs directory\" message shown for external links\nHi!\r\n\r\n### STR\r\n1. `mkvirtualenv mkdocs -p python 3.6`\r\n2. `pip install mkdocs==1.0b1`\r\n3. Update [an existing project's mkdocs.yml](https://github.com/mozilla-neutrino/neutrino-dev/blob/cab8e9e0f50c83fbb5ae0f6fb0e98b286beef049/mkdocs.yml) to use `nav` and take advantage of external link support. eg:\r\n\r\n```yaml\r\ndocs_dir: 'docs'\r\nsite_dir: 'build'\r\nstrict: true\r\ntheme:\r\n  name: 'material'\r\n# ...\r\n\r\nnav:\r\n  - Introduction: './index.md'\r\n  # <snip>\r\n  - v8 Documentation: 'https://neutrinojs.org/'\r\n  - v7 Documentation: 'https://release-v7.neutrinojs.org/'\r\n  - v6 Documentation: 'https://github.com/mozilla-neutrino/neutrino-dev/tree/release/v6/docs'\r\n  - v5 Documentation: 'https://github.com/mozilla-neutrino/neutrino-dev/tree/release/v5/docs'\r\n  - v4 Documentation: 'https://github.com/mozilla-neutrino/neutrino-dev/tree/release/v4/docs'\r\n```\r\n\r\n4. `mkdocs serve`\r\n\r\n### Expected\r\n\r\nConsole output doesn't output warnings that give the impression something is broken.\r\n\r\n### Actual\r\n\r\n```\r\n(mkdocs) neutrino-dev $ mkdocs serve\r\nINFO    -  Building documentation...\r\nINFO    -  Cleaning site directory\r\nINFO    -  The following paths are included in the \"nav\" configuration, but do not exist in the docs directory:\r\n  - https://neutrinojs.org/\r\n  - https://release-v7.neutrinojs.org/\r\n  - https://github.com/mozilla-neutrino/neutrino-dev/tree/release/v6/docs\r\n  - https://github.com/mozilla-neutrino/neutrino-dev/tree/release/v5/docs\r\n  - https://github.com/mozilla-neutrino/neutrino-dev/tree/release/v4/docs\r\n[I 180723 17:15:03 server:292] Serving on http://127.0.0.1:8000\r\n...\r\n```\r\n\r\nFor links that are clearly external links (ie contain a full URL), it would be good to not output this message (even at log level INFO), since it's likely to be confusing for end users working on our documentation. (Perhaps log level DEBUG is the most appropriate?)\r\n\r\nMany thanks :-)\n", "before_files": [{"content": "# coding: utf-8\n\nfrom __future__ import unicode_literals\nimport logging\n\nfrom mkdocs.structure.pages import Page\nfrom mkdocs.utils import string_types, nest_paths\n\nlog = logging.getLogger(__name__)\n\n\nclass Navigation(object):\n    def __init__(self, items, pages):\n        self.items = items  # Nested List with full navigation of Sections, Pages, and Links.\n        self.pages = pages  # Flat List of subset of Pages in nav, in order.\n\n        self.homepage = None\n        for page in pages:\n            if page.is_homepage:\n                self.homepage = page\n                break\n\n    def __repr__(self):\n        return '\\n'.join([item._indent_print() for item in self])\n\n    def __iter__(self):\n        return iter(self.items)\n\n    def __len__(self):\n        return len(self.items)\n\n\nclass Section(object):\n    def __init__(self, title, children):\n        self.title = title\n        self.children = children\n\n        self.parent = None\n        self.active = False\n\n        self.is_section = True\n        self.is_page = False\n        self.is_link = False\n\n    def __repr__(self):\n        return \"Section(title='{0}')\".format(self.title)\n\n    def _get_active(self):\n        \"\"\" Return active status of section. \"\"\"\n        return self.__active\n\n    def _set_active(self, value):\n        \"\"\" Set active status of section and ancestors. \"\"\"\n        self.__active = bool(value)\n        if self.parent is not None:\n            self.parent.active = bool(value)\n\n    active = property(_get_active, _set_active)\n\n    @property\n    def ancestors(self):\n        if self.parent is None:\n            return []\n        return [self.parent] + self.parent.ancestors\n\n    def _indent_print(self, depth=0):\n        ret = ['{}{}'.format('    ' * depth, repr(self))]\n        for item in self.children:\n            ret.append(item._indent_print(depth + 1))\n        return '\\n'.join(ret)\n\n\nclass Link(object):\n    def __init__(self, title, url):\n        self.title = title\n        self.url = url\n        self.parent = None\n\n        # These should never change but are included for consistency with sections and pages.\n        self.children = None\n        self.active = False\n        self.is_section = False\n        self.is_page = False\n        self.is_link = True\n\n    def __repr__(self):\n        title = \"'{}'\".format(self.title) if (self.title is not None) else '[blank]'\n        return \"Link(title={}, url='{}')\".format(title, self.url)\n\n    @property\n    def ancestors(self):\n        if self.parent is None:\n            return []\n        return [self.parent] + self.parent.ancestors\n\n    def _indent_print(self, depth=0):\n        return '{}{}'.format('    ' * depth, repr(self))\n\n\ndef get_navigation(files, config):\n    \"\"\" Build site navigation from config and files.\"\"\"\n    nav_config = config['nav'] or nest_paths(f.src_path for f in files.documentation_pages())\n    items = _data_to_navigation(nav_config, files, config)\n    if not isinstance(items, list):\n        items = [items]\n\n    # Get only the pages from the navigation, ignoring any sections and links.\n    pages = _get_by_type(items, Page)\n\n    # Include next, previous and parent links.\n    _add_previous_and_next_links(pages)\n    _add_parent_links(items)\n\n    missing_from_config = [file for file in files.documentation_pages() if file.page is None]\n    if missing_from_config:\n        log.info(\n            'The following pages exist in the docs directory, but are not '\n            'included in the \"nav\" configuration:\\n  - {}'.format(\n                '\\n  - '.join([file.src_path for file in missing_from_config]))\n        )\n        # Any documentation files not found in the nav should still have an associated page.\n        # However, these page objects are only accessable from File instances as `file.page`.\n        for file in missing_from_config:\n            Page(None, file, config)\n\n    links = _get_by_type(items, Link)\n    if links:\n        # Assume all links are external.\n        # TODO: warn or error on internal links?\n        log.info(\n            'The following paths are included in the \"nav\" configuration, '\n            'but do not exist in the docs directory:\\n  - {}'.format(\n                '\\n  - '.join([link.url for link in links]))\n        )\n    return Navigation(items, pages)\n\n\ndef _data_to_navigation(data, files, config):\n    if isinstance(data, dict):\n        return [\n            _data_to_navigation((key, value), files, config)\n            if isinstance(value, string_types) else\n            Section(title=key, children=_data_to_navigation(value, files, config))\n            for key, value in data.items()\n        ]\n    elif isinstance(data, list):\n        return [\n            _data_to_navigation(item, files, config)[0]\n            if isinstance(item, dict) and len(item) == 1 else\n            _data_to_navigation(item, files, config)\n            for item in data\n        ]\n    title, path = data if isinstance(data, tuple) else (None, data)\n    file = files.get_file_from_path(path)\n    if file:\n        return Page(title, file, config)\n    return Link(title, path)\n\n\ndef _get_by_type(nav, T):\n    ret = []\n    for item in nav:\n        if isinstance(item, T):\n            ret.append(item)\n        elif item.children:\n            ret.extend(_get_by_type(item.children, T))\n    return ret\n\n\ndef _add_parent_links(nav):\n    for item in nav:\n        if item.is_section:\n            for child in item.children:\n                child.parent = item\n            _add_parent_links(item.children)\n\n\ndef _add_previous_and_next_links(pages):\n    bookended = [None] + pages + [None]\n    zipped = zip(bookended[:-2], bookended[1:-1], bookended[2:])\n    for page0, page1, page2 in zipped:\n        page1.previous_page, page1.next_page = page0, page2\n", "path": "mkdocs/structure/nav.py"}], "after_files": [{"content": "# coding: utf-8\n\nfrom __future__ import unicode_literals\nimport logging\n\nfrom mkdocs.structure.pages import Page\nfrom mkdocs.utils import string_types, nest_paths\n\nlog = logging.getLogger(__name__)\n\n\nclass Navigation(object):\n    def __init__(self, items, pages):\n        self.items = items  # Nested List with full navigation of Sections, Pages, and Links.\n        self.pages = pages  # Flat List of subset of Pages in nav, in order.\n\n        self.homepage = None\n        for page in pages:\n            if page.is_homepage:\n                self.homepage = page\n                break\n\n    def __repr__(self):\n        return '\\n'.join([item._indent_print() for item in self])\n\n    def __iter__(self):\n        return iter(self.items)\n\n    def __len__(self):\n        return len(self.items)\n\n\nclass Section(object):\n    def __init__(self, title, children):\n        self.title = title\n        self.children = children\n\n        self.parent = None\n        self.active = False\n\n        self.is_section = True\n        self.is_page = False\n        self.is_link = False\n\n    def __repr__(self):\n        return \"Section(title='{0}')\".format(self.title)\n\n    def _get_active(self):\n        \"\"\" Return active status of section. \"\"\"\n        return self.__active\n\n    def _set_active(self, value):\n        \"\"\" Set active status of section and ancestors. \"\"\"\n        self.__active = bool(value)\n        if self.parent is not None:\n            self.parent.active = bool(value)\n\n    active = property(_get_active, _set_active)\n\n    @property\n    def ancestors(self):\n        if self.parent is None:\n            return []\n        return [self.parent] + self.parent.ancestors\n\n    def _indent_print(self, depth=0):\n        ret = ['{}{}'.format('    ' * depth, repr(self))]\n        for item in self.children:\n            ret.append(item._indent_print(depth + 1))\n        return '\\n'.join(ret)\n\n\nclass Link(object):\n    def __init__(self, title, url):\n        self.title = title\n        self.url = url\n        self.parent = None\n\n        # These should never change but are included for consistency with sections and pages.\n        self.children = None\n        self.active = False\n        self.is_section = False\n        self.is_page = False\n        self.is_link = True\n\n    def __repr__(self):\n        title = \"'{}'\".format(self.title) if (self.title is not None) else '[blank]'\n        return \"Link(title={}, url='{}')\".format(title, self.url)\n\n    @property\n    def ancestors(self):\n        if self.parent is None:\n            return []\n        return [self.parent] + self.parent.ancestors\n\n    def _indent_print(self, depth=0):\n        return '{}{}'.format('    ' * depth, repr(self))\n\n\ndef get_navigation(files, config):\n    \"\"\" Build site navigation from config and files.\"\"\"\n    nav_config = config['nav'] or nest_paths(f.src_path for f in files.documentation_pages())\n    items = _data_to_navigation(nav_config, files, config)\n    if not isinstance(items, list):\n        items = [items]\n\n    # Get only the pages from the navigation, ignoring any sections and links.\n    pages = _get_by_type(items, Page)\n\n    # Include next, previous and parent links.\n    _add_previous_and_next_links(pages)\n    _add_parent_links(items)\n\n    missing_from_config = [file for file in files.documentation_pages() if file.page is None]\n    if missing_from_config:\n        log.info(\n            'The following pages exist in the docs directory, but are not '\n            'included in the \"nav\" configuration:\\n  - {}'.format(\n                '\\n  - '.join([file.src_path for file in missing_from_config]))\n        )\n        # Any documentation files not found in the nav should still have an associated page.\n        # However, these page objects are only accessable from File instances as `file.page`.\n        for file in missing_from_config:\n            Page(None, file, config)\n\n    links = _get_by_type(items, Link)\n    if links:\n        # Assume all links are external.\n        log.debug(\n            'The following paths are included in the \"nav\" configuration, '\n            'but do not exist in the docs directory:\\n  - {}'.format(\n                '\\n  - '.join([link.url for link in links]))\n        )\n    return Navigation(items, pages)\n\n\ndef _data_to_navigation(data, files, config):\n    if isinstance(data, dict):\n        return [\n            _data_to_navigation((key, value), files, config)\n            if isinstance(value, string_types) else\n            Section(title=key, children=_data_to_navigation(value, files, config))\n            for key, value in data.items()\n        ]\n    elif isinstance(data, list):\n        return [\n            _data_to_navigation(item, files, config)[0]\n            if isinstance(item, dict) and len(item) == 1 else\n            _data_to_navigation(item, files, config)\n            for item in data\n        ]\n    title, path = data if isinstance(data, tuple) else (None, data)\n    file = files.get_file_from_path(path)\n    if file:\n        return Page(title, file, config)\n    return Link(title, path)\n\n\ndef _get_by_type(nav, T):\n    ret = []\n    for item in nav:\n        if isinstance(item, T):\n            ret.append(item)\n        elif item.children:\n            ret.extend(_get_by_type(item.children, T))\n    return ret\n\n\ndef _add_parent_links(nav):\n    for item in nav:\n        if item.is_section:\n            for child in item.children:\n                child.parent = item\n            _add_parent_links(item.children)\n\n\ndef _add_previous_and_next_links(pages):\n    bookended = [None] + pages + [None]\n    zipped = zip(bookended[:-2], bookended[1:-1], bookended[2:])\n    for page0, page1, page2 in zipped:\n        page1.previous_page, page1.next_page = page0, page2\n", "path": "mkdocs/structure/nav.py"}]}