changeset 12952:7fd105bfe992 v8.0.1352

patch 8.0.1352: dead URLs in the help go unnoticed commit https://github.com/vim/vim/commit/f38c86eb6b665d9fcd3d232820a48198eccac376 Author: Bram Moolenaar <Bram@vim.org> Date: Tue Nov 28 14:19:07 2017 +0100 patch 8.0.1352: dead URLs in the help go unnoticed Problem: Dead URLs in the help go unnoticed. Solution: Add a script to check URLs in the help files. (Christian Brabandt)
author Christian Brabandt <cb@256bit.org>
date Tue, 28 Nov 2017 14:30:05 +0100
parents 749acedeee6e
children f80cd88a645d
files Filelist runtime/doc/test_urls.vim src/version.c
diffstat 3 files changed, 71 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/Filelist
+++ b/Filelist
@@ -584,6 +584,7 @@ RT_ALL =	\
 		runtime/doc/*.txt \
 		runtime/doc/Makefile \
 		runtime/doc/doctags.c \
+		runtime/doc/test_urls.vim \
 		runtime/doc/vim.1 \
 		runtime/doc/evim.1 \
 		runtime/doc/vimdiff.1 \
new file mode 100644
--- /dev/null
+++ b/runtime/doc/test_urls.vim
@@ -0,0 +1,68 @@
+" Test for URLs in help documents.
+"
+" Opens a new window with all found URLS followed by return code from curl
+" (anything other than 0 means unreachable)
+"
+" Written by Christian Brabandt.
+
+func Test_check_URLs()
+  if has("win32")
+    echoerr "Doesn't work on MS-Windows"
+    return
+  endif
+  if executable('curl')
+    " Note: does not follow redirects!
+    let s:command = 'curl --silent --fail --output /dev/null --head '
+  elseif executable('wget')
+    " Note: only allow a couple of redirects
+    let s:command = 'wget --quiet -S --spider --max-redirect=2 --timeout=5 --tries=2 -O /dev/null '
+  else
+    echoerr 'Only works when "curl" or "wget" is available'
+    return
+  endif
+
+  let pat='\(https\?\|ftp\)://[^\t* ]\+'
+  exe 'helpgrep' pat
+  helpclose
+
+  let urls = map(getqflist(), 'v:val.text')
+  " do not use submatch(1)!
+  let urls = map(urls, {key, val -> matchstr(val, pat)})
+  " remove examples like user@host (invalid urls)
+  let urls = filter(urls, 'v:val !~ "@"')
+  " Remove example URLs which are invalid
+  let urls = filter(urls, {key, val -> val !~ '\<\(\(my\|some\)\?host\|machine\|hostname\|file\)\>'})
+  new
+  put =urls
+  " remove some more invalid items
+  " empty lines
+  v/./d
+  " remove # anchors
+  %s/#.*$//e
+  " remove trailing stuff (parenthesis, dot, comma, quotes), but only for HTTP
+  " links
+  g/^h/s#[.,)'"/>][:.]\?$##
+  g#^[hf]t\?tp:/\(/\?\.*\)$#d
+  silent! g/ftp://,$/d
+  silent! g/=$/d
+  let a = getline(1,'$')
+  let a = uniq(sort(a))
+  %d
+  call setline(1, a)
+
+  " Do the testing.
+  set nomore
+  %s/.*/\=TestURL(submatch(0))/
+
+  " highlight the failures
+  /.* \([0-9]*[1-9]\|[0-9]\{2,}\)$
+endfunc
+
+func TestURL(url)
+  " Relies on the return code to determine whether a page is valid
+  echom printf("Testing URL: %d/%d %s", line('.'), line('$'), a:url)
+  call system(s:command . shellescape(a:url))
+  return printf("%s %d", a:url, v:shell_error)
+endfunc
+
+call Test_check_URLs()
--- a/src/version.c
+++ b/src/version.c
@@ -772,6 +772,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1352,
+/**/
     1351,
 /**/
     1350,