From c1fb07f6b780cf1cc80ff9be8232eb085a25668d Mon Sep 17 00:00:00 2001 From: calvin Date: Fri, 11 Mar 2005 16:27:38 +0000 Subject: [PATCH] moved git-svn-id: https://linkchecker.svn.sourceforge.net/svnroot/linkchecker/trunk/linkchecker@2403 e7d03fd6-7b0d-0410-9947-9c21f3af8025 --- doc/en/documentation.html | 303 ++++++++++++++++++++++++++++++++++ doc/en/documentation.nav | 5 + doc/en/documentation.txt | 336 ++++++++++++++++++++++++++++++++++++++ doc/en/index.html | 150 +++++++++++++++++ doc/en/index.nav | 5 + doc/en/index.txt | 128 +++++++++++++++ doc/en/install.html | 207 +++++++++++++++++++++++ doc/en/install.nav | 5 + doc/en/install.txt | 194 ++++++++++++++++++++++ doc/en/lc.css | 263 +++++++++++++++++++++++++++++ doc/en/navigation.css | 40 +++++ doc/en/other.html | 56 +++++++ doc/en/other.nav | 5 + doc/en/other.txt | 58 +++++++ doc/en/shot1.png | Bin 0 -> 12091 bytes doc/en/shot1_thumb.jpg | Bin 0 -> 3890 bytes doc/en/shot2.png | Bin 0 -> 42377 bytes doc/en/shot2_thumb.jpg | Bin 0 -> 2540 bytes doc/en/upgrading.html | 83 ++++++++++ doc/en/upgrading.nav | 5 + doc/en/upgrading.txt | 62 +++++++ 21 files changed, 1905 insertions(+) create mode 100644 doc/en/documentation.html create mode 100644 doc/en/documentation.nav create mode 100644 doc/en/documentation.txt create mode 100644 doc/en/index.html create mode 100644 doc/en/index.nav create mode 100644 doc/en/index.txt create mode 100644 doc/en/install.html create mode 100644 doc/en/install.nav create mode 100644 doc/en/install.txt create mode 100644 doc/en/lc.css create mode 100644 doc/en/navigation.css create mode 100644 doc/en/other.html create mode 100644 doc/en/other.nav create mode 100644 doc/en/other.txt create mode 100644 doc/en/shot1.png create mode 100644 doc/en/shot1_thumb.jpg create mode 100644 doc/en/shot2.png create mode 100644 doc/en/shot2_thumb.jpg create mode 100644 doc/en/upgrading.html create mode 100644 doc/en/upgrading.nav create mode 100644 doc/en/upgrading.txt diff --git a/doc/en/documentation.html b/doc/en/documentation.html new file mode 100644 index 00000000..3c10f0e3 --- /dev/null +++ b/doc/en/documentation.html @@ -0,0 +1,303 @@ + + + + + + +Documentation + + + + + + + + + + + + + +
+

Documentation

+ +
+

Basic usage

+

To check an URL like http://www.myhomepage.org/ it is enough to +execute linkchecker http://www.myhomepage.org/. This will check the +complete domain of www.myhomepage.org recursively. All links pointing +outside of the domain are also checked for validity.

+

For more options, read the man page linkchecker(1) or execute +linkchecker -h.

+
+
+

Performed checks

+

All URLs have to pass a preliminary syntax test. Minor quoting +mistakes will issue a warning, all other invalid syntax issues +are errors. +After the syntax check passes, the URL is queued for connection +checking. All connection check types are described below.

+
    +
  • HTTP links (http:, https:)

    +

    After connecting to the given HTTP server the given path +or query is requested. All redirections are followed, and +if user/password is given it will be used as authorization +when necessary. +Permanently moved pages issue a warning. +All final HTTP status codes other than 2xx are errors.

    +
  • +
  • Local files (file:)

    +

    A regular, readable file that can be opened is valid. A readable +directory is also valid. All other files, for example device files, +unreadable or non-existing files are errors.

    +

    File contents are checked for recursion.

    +
  • +
  • Mail links (mailto:)

    +

    A mailto: link eventually resolves to a list of email addresses. +If one address fails, the whole list will fail. +For each mail address we check the following things:

    +
      +
    1. Look up the MX DNS records. If we found no MX record, +print an error.
    2. +
    3. Check if one of the mail hosts accept an SMTP connection. +Check hosts with higher priority first. +If no host accepts SMTP, we print a warning.
    4. +
    5. Try to verify the address with the VRFY command. If we got +an answer, print the verified address as an info.
    6. +
    +
  • +
  • FTP links (ftp:)

    +

    For FTP links we do:

    +
      +
    1. connect to the specified host
    2. +
    3. try to login with the given user and password. The default +user is anonymous, the default password is anonymous@.
    4. +
    5. try to change to the given directory
    6. +
    7. list the file with the NLST command
    8. +
    +
  • +
  • Gopher links (gopher:)

    +

    We try to send the given selector (or query) to the gopher server.

    +
  • +
  • Telnet links (telnet:)

    +

    We try to connect and if user/password are given, login to the +given telnet server.

    +
  • +
  • NNTP links (news:, snews:, nntp)

    +

    We try to connect to the given NNTP server. If a news group or +article is specified, try to request it from the server.

    +
  • +
  • Ignored links (javascript:, etc.)

    +

    An ignored link will only print a warning. No further checking +will be made.

    +

    Here is a complete list of recognized, but ignored links. The most +prominent of them should be JavaScript links.

    +
      +
    • acap: (application configuration access protocol)
    • +
    • afs: (Andrew File System global file names)
    • +
    • chrome: (Mozilla specific)
    • +
    • cid: (content identifier)
    • +
    • clsid: (Microsoft specific)
    • +
    • data: (data)
    • +
    • dav: (dav)
    • +
    • fax: (fax)
    • +
    • find: (Mozilla specific)
    • +
    • imap: (internet message access protocol)
    • +
    • isbn: (ISBN (int. book numbers))
    • +
    • javascript: (JavaScript)
    • +
    • ldap: (Lightweight Directory Access Protocol)
    • +
    • mailserver: (Access to data available from mail servers)
    • +
    • mid: (message identifier)
    • +
    • mms: (multimedia stream)
    • +
    • modem: (modem)
    • +
    • nfs: (network file system protocol)
    • +
    • opaquelocktoken: (opaquelocktoken)
    • +
    • pop: (Post Office Protocol v3)
    • +
    • prospero: (Prospero Directory Service)
    • +
    • rsync: (rsync protocol)
    • +
    • rtsp: (real time streaming protocol)
    • +
    • service: (service location)
    • +
    • shttp: (secure HTTP)
    • +
    • sip: (session initiation protocol)
    • +
    • tel: (telephone)
    • +
    • tip: (Transaction Internet Protocol)
    • +
    • tn3270: (Interactive 3270 emulation sessions)
    • +
    • vemmi: (versatile multimedia interface)
    • +
    • wais: (Wide Area Information Servers)
    • +
    • z39.50r: (Z39.50 Retrieval)
    • +
    • z39.50s: (Z39.50 Session)
    • +
    +
  • +
+
+
+

Recursion

+

Recursion occurs on HTML files, Opera bookmark files and directories. +Note that the directory recursion reads all files in that +directory, not just a subset like index.htm*.

+
+
+

Frequently asked questions

+

Q: LinkChecker produced an error, but my web page is ok with +Netscape/IE/Opera/... +Is this a bug in LinkChecker?

+

A: Please check your web pages first. Are they really ok? Use +a syntax highlighting editor. Use HTML Tidy. +Check if you are using a proxy which produces the error.

+

Q: I still get an error, but the page is definitely ok.

+

A: Some servers deny access of automated tools (also called robots) +like LinkChecker. This is not a bug in LinkChecker but rather a +policy by the webmaster running the website you are checking. +It might even be possible for a website to send robots different +web pages than normal browsers.

+

Q: How can I tell LinkChecker which proxy to use?

+

A: LinkChecker works transparently with proxies. In a Unix or Windows +environment, set the http_proxy, https_proxy, ftp_proxy or gopher_proxy +environment variables to a URL that identifies the proxy server before +starting LinkChecker. For example

+
+$ http_proxy="http://www.someproxy.com:3128"
+$ export http_proxy
+
+

In a Macintosh environment, LinkChecker will retrieve proxy information +from Internet Config.

+

Q: The link "mailto:john@company.com?subject=Hello John" is reported +as an error.

+

A: You have to quote special characters (e.g. spaces) in the subject field. +The correct link should be "mailto:...?subject=Hello%20John" +Unfortunately browsers like IE and Netscape do not enforce this.

+

Q: Has LinkChecker JavaScript support?

+

A: No, it never will. If your page is not working without JS then your +web design is broken. +Use PHP or Zope or ASP for dynamic content, and use JavaScript just as +an addon for your web pages.

+

Q: I don't get this --extern/--intern stuff.

+

A: When it comes to checking there are three types of URLs. Note +that local files are also represented als URLs (ie file://). So +local files can be external URLs.

+
    +
  1. strict external URLs: +We do only syntax checking. Internal URLs are never strict.
  2. +
  3. external URLs: +Like 1), but we additionally check if they are valid by connect()ing +to them
  4. +
  5. internal URLs: +Like 2), but we additionally check if they are HTML pages and if so, +we descend recursively into this link and check all the links in the +HTML content. +The --recursion-level option restricts the number of such recursive +descends.
  6. +
+

LinkChecker provides four options which affect URLs to fall in one +of those three categories: --intern, --extern, --extern-strict-all and +--denyallow. +By default all URLs are internal. With --extern you specify what URLs +are external. With --intern you specify what URLs are internal. +Now imagine you have both --extern and --intern. What happens +when an URL matches both patterns? Or when it matches none? In this +situation the --denyallow option specifies the order in which we match +the URL. By default it is internal/external, with --denyallow the order is +external/internal. Either way, the first match counts, and if none matches, +the last checked category is the category for the URL. +Finally, with --extern-strict-all all external URLs are strict.

+

Oh, and just to boggle your mind: you can have more than one external +regular expression in a config file and for each of those expressions +you can specify if those matched external URLs should be strict or not.

+

An example. We don't want to check mailto urls. Then its +-i'!^mailto:'. The '!' negates an expression. With --extern-strictall, +we don't even connect to any mail hosts.

+

Another example. We check our site www.mycompany.com, don't recurse +into external links point outside from our site and want to ignore links +to hollowood.com and hullabulla.com completely. +This can only be done with a configuration entry like

+
+[filtering]
+extern1=hollowood.com 1
+extern2=hullabulla.com 1
+# the 1 means strict external ie don't even connect
+
+

and the command +linkchecker --intern=www.mycompany.com www.mycompany.com

+

Q: Is LinkCheckers cookie feature insecure?

+

A: Cookies can not store more information as is in the HTTP request itself, +so you are not giving away any more system information. +After storing however, the cookies are sent out to the server on request. +Not to every server, but only to the one who the cookie originated from! +This could be used to "track" subsequent requests to this server, +and this is what some people annoys (including me). +Cookies are only stored in memory. After LinkChecker finishes, they +are lost. So the tracking is restricted to the checking time. +The cookie feature is disabled as default.

+

Q: I want to have my own logging class. How can I use it in LinkChecker?

+

A: Currently, only a Python API lets you define new logging classes. +Define your own logging class as a subclass of StandardLogger or any other +logging class in the log module. +Then call the addLogger function in Config.Configuration to register +your new Logger. +After this append a new Logging instance to the fileoutput.

+
+import linkcheck, MyLogger
+log_format = 'mylog'
+log_args = {'fileoutput': log_format, 'filename': 'foo.txt'}
+cfg = linkcheck.configuration.Configuration()
+cfg.logger_add(log_format, MyLogger.MyLogger)
+cfg['fileoutput'].append(cfg.logger_new(log_format, log_args)) 
+
+

Q: LinkChecker does not ignore anchor references on caching.

+

Q: Some links with anchors are getting checked twice.

+

A: This is not a bug. +It is common practice to believe that if an URL ABC#anchor1 works then +ABC#anchor2 works too. That is not specified anywhere and I have seen +server-side scripts that fail on some anchors and not on others. +This is the reason for always checking URLs with different anchors. +If you really want to disable this, use the --no-anchor-caching +option.

+

Q: I see LinkChecker gets a /robots.txt file for every site it +checks. What is that about?

+

A: LinkChecker follows the robots.txt exclusion standard. To avoid +misuse of LinkChecker, you cannot turn this feature off. +See the Web Robot pages and the Spidering report for more info.

+

Q: Ctrl-C does not stop LinkChecker immediately. Why is that so?

+

A: The Python interpreter has to wait for all threads to finish, and +this means waiting for all open sockets to close. The default timeout +for sockets is 30 seconds, hence the delay. +You can change the default socket timeout with the --timeout option.

+

Q: How do I print unreachable/dead documents of my website with +LinkChecker?

+

A: No can do. This would require file system access to your web +repository and access to your web server configuration.

+

You can instead store the linkchecker results in a database +and look for missing files.

+

Q: How do I check HTML/XML syntax with LinkChecker?

+

A: No can do. Use the HTML Tidy program.

+
+
+ + + + diff --git a/doc/en/documentation.nav b/doc/en/documentation.nav new file mode 100644 index 00000000..2999cda6 --- /dev/null +++ b/doc/en/documentation.nav @@ -0,0 +1,5 @@ +# generated by htmlnav.py, do not edit +name = u'Documentation' +level = 0 +visible = True +order = 3 diff --git a/doc/en/documentation.txt b/doc/en/documentation.txt new file mode 100644 index 00000000..6cd9c12b --- /dev/null +++ b/doc/en/documentation.txt @@ -0,0 +1,336 @@ +.. meta:: + :navigation.order: 3 + :navigation.name: Documentation + +Documentation +============= + +.. contents:: + +Basic usage +----------- + +To check an URL like ``http://www.myhomepage.org/`` it is enough to +execute ``linkchecker http://www.myhomepage.org/``. This will check the +complete domain of www.myhomepage.org recursively. All links pointing +outside of the domain are also checked for validity. + +For more options, read the man page ``linkchecker(1)`` or execute +``linkchecker -h``. + + +Performed checks +---------------- + +All URLs have to pass a preliminary syntax test. Minor quoting +mistakes will issue a warning, all other invalid syntax issues +are errors. +After the syntax check passes, the URL is queued for connection +checking. All connection check types are described below. + +- HTTP links (``http:``, ``https:``) + + After connecting to the given HTTP server the given path + or query is requested. All redirections are followed, and + if user/password is given it will be used as authorization + when necessary. + Permanently moved pages issue a warning. + All final HTTP status codes other than 2xx are errors. + +- Local files (``file:``) + + A regular, readable file that can be opened is valid. A readable + directory is also valid. All other files, for example device files, + unreadable or non-existing files are errors. + + File contents are checked for recursion. + +- Mail links (``mailto:``) + + A mailto: link eventually resolves to a list of email addresses. + If one address fails, the whole list will fail. + For each mail address we check the following things: + + 1) Look up the MX DNS records. If we found no MX record, + print an error. + 2) Check if one of the mail hosts accept an SMTP connection. + Check hosts with higher priority first. + If no host accepts SMTP, we print a warning. + 3) Try to verify the address with the VRFY command. If we got + an answer, print the verified address as an info. + +- FTP links (``ftp:``) + + For FTP links we do: + + 1) connect to the specified host + 2) try to login with the given user and password. The default + user is ``anonymous``, the default password is ``anonymous@``. + 3) try to change to the given directory + 4) list the file with the NLST command + +- Gopher links (``gopher:``) + + We try to send the given selector (or query) to the gopher server. + +- Telnet links (``telnet:``) + + We try to connect and if user/password are given, login to the + given telnet server. + +- NNTP links (``news:``, ``snews:``, ``nntp``) + + We try to connect to the given NNTP server. If a news group or + article is specified, try to request it from the server. + +- Ignored links (``javascript:``, etc.) + + An ignored link will only print a warning. No further checking + will be made. + + Here is a complete list of recognized, but ignored links. The most + prominent of them should be JavaScript links. + + - ``acap:`` (application configuration access protocol) + - ``afs:`` (Andrew File System global file names) + - ``chrome:`` (Mozilla specific) + - ``cid:`` (content identifier) + - ``clsid:`` (Microsoft specific) + - ``data:`` (data) + - ``dav:`` (dav) + - ``fax:`` (fax) + - ``find:`` (Mozilla specific) + - ``imap:`` (internet message access protocol) + - ``isbn:`` (ISBN (int. book numbers)) + - ``javascript:`` (JavaScript) + - ``ldap:`` (Lightweight Directory Access Protocol) + - ``mailserver:`` (Access to data available from mail servers) + - ``mid:`` (message identifier) + - ``mms:`` (multimedia stream) + - ``modem:`` (modem) + - ``nfs:`` (network file system protocol) + - ``opaquelocktoken:`` (opaquelocktoken) + - ``pop:`` (Post Office Protocol v3) + - ``prospero:`` (Prospero Directory Service) + - ``rsync:`` (rsync protocol) + - ``rtsp:`` (real time streaming protocol) + - ``service:`` (service location) + - ``shttp:`` (secure HTTP) + - ``sip:`` (session initiation protocol) + - ``tel:`` (telephone) + - ``tip:`` (Transaction Internet Protocol) + - ``tn3270:`` (Interactive 3270 emulation sessions) + - ``vemmi:`` (versatile multimedia interface) + - ``wais:`` (Wide Area Information Servers) + - ``z39.50r:`` (Z39.50 Retrieval) + - ``z39.50s:`` (Z39.50 Session) + + +Recursion +--------- + +Recursion occurs on HTML files, Opera bookmark files and directories. +Note that the directory recursion reads all files in that +directory, not just a subset like ``index.htm*``. + +.. meta:: + :navigation.order: 4 + :navigation.name: FAQ + + +Frequently asked questions +-------------------------- + +**Q: LinkChecker produced an error, but my web page is ok with +Netscape/IE/Opera/... +Is this a bug in LinkChecker?** + +A: Please check your web pages first. Are they really ok? Use +a `syntax highlighting editor`_. Use `HTML Tidy`_. +Check if you are using a proxy which produces the error. + +.. _`syntax highlighting editor`: + http://fte.sourceforge.net/ +.. _`HTML Tidy`: + http://tidy.sourceforge.net/ + + +**Q: I still get an error, but the page is definitely ok.** + +A: Some servers deny access of automated tools (also called robots) +like LinkChecker. This is not a bug in LinkChecker but rather a +policy by the webmaster running the website you are checking. +It might even be possible for a website to send robots different +web pages than normal browsers. + + +**Q: How can I tell LinkChecker which proxy to use?** + +A: LinkChecker works transparently with proxies. In a Unix or Windows +environment, set the http_proxy, https_proxy, ftp_proxy or gopher_proxy +environment variables to a URL that identifies the proxy server before +starting LinkChecker. For example + +:: + + $ http_proxy="http://www.someproxy.com:3128" + $ export http_proxy + +In a Macintosh environment, LinkChecker will retrieve proxy information +from Internet Config. + + +**Q: The link "mailto:john@company.com?subject=Hello John" is reported +as an error.** + +A: You have to quote special characters (e.g. spaces) in the subject field. +The correct link should be "mailto:...?subject=Hello%20John" +Unfortunately browsers like IE and Netscape do not enforce this. + + +**Q: Has LinkChecker JavaScript support?** + +A: No, it never will. If your page is not working without JS then your +web design is broken. +Use PHP or Zope or ASP for dynamic content, and use JavaScript just as +an addon for your web pages. + + +**Q: I don't get this --extern/--intern stuff.** + +A: When it comes to checking there are three types of URLs. Note +that local files are also represented als URLs (ie file://). So +local files can be external URLs. + +1) strict external URLs: + We do only syntax checking. Internal URLs are never strict. +2) external URLs: + Like 1), but we additionally check if they are valid by connect()ing + to them +3) internal URLs: + Like 2), but we additionally check if they are HTML pages and if so, + we descend recursively into this link and check all the links in the + HTML content. + The --recursion-level option restricts the number of such recursive + descends. + +LinkChecker provides four options which affect URLs to fall in one +of those three categories: --intern, --extern, --extern-strict-all and +--denyallow. +By default all URLs are internal. With --extern you specify what URLs +are external. With --intern you specify what URLs are internal. +Now imagine you have both --extern and --intern. What happens +when an URL matches both patterns? Or when it matches none? In this +situation the --denyallow option specifies the order in which we match +the URL. By default it is internal/external, with --denyallow the order is +external/internal. Either way, the first match counts, and if none matches, +the last checked category is the category for the URL. +Finally, with --extern-strict-all all external URLs are strict. + +Oh, and just to boggle your mind: you can have more than one external +regular expression in a config file and for each of those expressions +you can specify if those matched external URLs should be strict or not. + +An example. We don't want to check mailto urls. Then its +-i'!^mailto:'. The '!' negates an expression. With --extern-strictall, +we don't even connect to any mail hosts. + +Another example. We check our site www.mycompany.com, don't recurse +into external links point outside from our site and want to ignore links +to hollowood.com and hullabulla.com completely. +This can only be done with a configuration entry like + +:: + + [filtering] + extern1=hollowood.com 1 + extern2=hullabulla.com 1 + # the 1 means strict external ie don't even connect + +and the command +``linkchecker --intern=www.mycompany.com www.mycompany.com`` + + +**Q: Is LinkCheckers cookie feature insecure?** + +A: Cookies can not store more information as is in the HTTP request itself, +so you are not giving away any more system information. +After storing however, the cookies are sent out to the server on request. +Not to every server, but only to the one who the cookie originated from! +This could be used to "track" subsequent requests to this server, +and this is what some people annoys (including me). +Cookies are only stored in memory. After LinkChecker finishes, they +are lost. So the tracking is restricted to the checking time. +The cookie feature is disabled as default. + + +**Q: I want to have my own logging class. How can I use it in LinkChecker?** + +A: Currently, only a Python API lets you define new logging classes. +Define your own logging class as a subclass of StandardLogger or any other +logging class in the log module. +Then call the addLogger function in Config.Configuration to register +your new Logger. +After this append a new Logging instance to the fileoutput. + +:: + + import linkcheck, MyLogger + log_format = 'mylog' + log_args = {'fileoutput': log_format, 'filename': 'foo.txt'} + cfg = linkcheck.configuration.Configuration() + cfg.logger_add(log_format, MyLogger.MyLogger) + cfg['fileoutput'].append(cfg.logger_new(log_format, log_args)) + + +**Q: LinkChecker does not ignore anchor references on caching.** + +**Q: Some links with anchors are getting checked twice.** + +A: This is not a bug. +It is common practice to believe that if an URL ``ABC#anchor1`` works then +``ABC#anchor2`` works too. That is not specified anywhere and I have seen +server-side scripts that fail on some anchors and not on others. +This is the reason for always checking URLs with different anchors. +If you really want to disable this, use the ``--no-anchor-caching`` +option. + + +**Q: I see LinkChecker gets a /robots.txt file for every site it +checks. What is that about?** + +A: LinkChecker follows the robots.txt exclusion standard. To avoid +misuse of LinkChecker, you cannot turn this feature off. +See the `Web Robot pages`_ and the `Spidering report`_ for more info. + +.. _`Web Robot pages`: + http://www.robotstxt.org/wc/robots.html +.. _`Spidering report`: + http://www.w3.org/Search/9605-Indexing-Workshop/ReportOutcomes/Spidering.txt + + +**Q: Ctrl-C does not stop LinkChecker immediately. Why is that so?** + +A: The Python interpreter has to wait for all threads to finish, and +this means waiting for all open sockets to close. The default timeout +for sockets is 30 seconds, hence the delay. +You can change the default socket timeout with the --timeout option. + + +**Q: How do I print unreachable/dead documents of my website with +LinkChecker?** + +A: No can do. This would require file system access to your web +repository and access to your web server configuration. + +You can instead store the linkchecker results in a database +and look for missing files. + + +**Q: How do I check HTML/XML syntax with LinkChecker?** + +A: No can do. Use the `HTML Tidy`_ program. + +.. _`HTML Tidy`: + http://tidy.sourceforge.net/ + diff --git a/doc/en/index.html b/doc/en/index.html new file mode 100644 index 00000000..4e50c4b5 --- /dev/null +++ b/doc/en/index.html @@ -0,0 +1,150 @@ + + + + + + +LinkChecker - check HTML documents for broken links + + + + + + + + + + + + + + + + diff --git a/doc/en/index.nav b/doc/en/index.nav new file mode 100644 index 00000000..cd3266ad --- /dev/null +++ b/doc/en/index.nav @@ -0,0 +1,5 @@ +# generated by htmlnav.py, do not edit +name = u'LinkChecker' +level = 0 +visible = True +order = 0 diff --git a/doc/en/index.txt b/doc/en/index.txt new file mode 100644 index 00000000..09bbfcd2 --- /dev/null +++ b/doc/en/index.txt @@ -0,0 +1,128 @@ +.. meta:: + :navigation.order: 0 + :navigation.name: LinkChecker + +=================================================== +LinkChecker - check HTML documents for broken links +=================================================== + +.. contents:: + +Features +======== + +- recursive checking +- multithreading +- output in colored or normal text, HTML, SQL, CSV or a sitemap + graph in GML or XML. +- HTTP/1.1, HTTPS, FTP, mailto:, news:, nntp:, Gopher, Telnet and local + file links support +- restriction of link checking with regular expression filters for URLs +- proxy support +- username/password authorization for HTTP and FTP +- robots.txt exclusion protocol support +- i18n support +- a command line interface +- a (Fast)CGI web interface (requires HTTP server) + + +Download +======== + +Download the latest packages from `LinkChecker download section`_. +There are also `Md5sum checksums`_ from above files. + +.. _LinkChecker download section: + http://sourceforge.net/project/showfiles.php?group_id=1913 +.. _Md5sum checksums: + linkchecker-md5sums.txt + +Requirements and installation instructions are located at the +`install documentation`_. To see what has changed between releases +look at the ChangeLog_. + +.. _install documentation: + install.html +.. _ChangeLog: + http://cvs.sourceforge.net/viewcvs.py/linkchecker/linkchecker/ChangeLog?view=markup + + +Screenshots +=========== + + +----------------------------+----------------------------+ + | .. image:: shot1_thumb.jpg | .. image:: shot2_thumb.jpg | + | :align: middle | :align: middle | + | :target: shot1.png | :target: shot2.png | + +----------------------------+----------------------------+ + | Commandline interface | Web interface | + +----------------------------+----------------------------+ + + +Running +======= + +Running under Unix or Mac OS X platforms +---------------------------------------- + +The local configuration file is $HOME/.linkcheckerrc +Type "linkchecker" followed by your URLs you want to check. +Type "linkchecker -h" for help. + +Running under Windows platforms +------------------------------- + +Start "Check URL" in your LinkChecker program group. +URL input is interactive. +Another way is executing "python.exe linkchecker" in the Python +Scripts directory. + +Running under Mac OS 9.x platforms +---------------------------------- + +Read the MacOS Python documentation to find out about passing +commandline options to Python scripts. + + +Internationalization +-------------------- +For german output execute "export LC_MESSAGES=de" in bash or +"setenv LC_MESSAGES de" in tcsh. +Under Windows, execute "set LC_MESSAGES=de". +Other supported languages are 'nl' (Nederlands) and 'fr' (français). + +You can help to translate LinkChecker by copying the included +``linkchecker.pot`` file to ``language.po``, translate it and +send it to me. + + +Bug reporting +============= + +The `SourceForge Bug interface`_ allows submitting of bugs, patches +and requests. + +.. _SourceForge Bug interface: + http://sourceforge.net/tracker/?func=add&group_id=1913&atid=101913 + + +CVS access +========== + +The `SourceForge CVS page`_ has all the information on how to +obtain the development version of LinkChecker. Development of +LinkChecker requires some more software to be available, which +is documented on the `installation page`. + +.. _SourceForge CVS page: + http://sourceforge.net/cvs/?group_id=1913 +.. _installation page: + install.html + + +.. image:: http://sourceforge.net/sflogo.php?group_id=1913&type=1 + :align: right + :target: http://sourceforge.net/ + :alt: SourceForge Logo + :width: 88 + :height: 31 diff --git a/doc/en/install.html b/doc/en/install.html new file mode 100644 index 00000000..cc934162 --- /dev/null +++ b/doc/en/install.html @@ -0,0 +1,207 @@ + + + + + + +Installation + + + + + + + + + + + +
+

Installation

+

If you are upgrading from older versions of LinkChecker you should +also read the upgrading documentation.

+
+

Requirements for Unix/Linux or Mac OS X

+
    +
  1. You need a standard GNU development environment with

    +
      +
    • C compiler (for example the GNU C Compiler gcc)

      +

      Depending on your distribution, several development packages +might be needed to provide a fully functional C development +environment.

      +
    • +
    +

    Note for developers: if you want to regenerate the po/linkchecker.pot +template from the source files, you will need xgettext with Python +support. This is available in gettext >= 0.12.

    +
  2. +
  3. Python >= 2.4 from http://www.python.org/ with zlib support

    +

    Be sure to also have installed the included distutils module. +On most distributions, the distutils module is included in +an extra "python-dev" package.

    +
  4. +
  5. Optional, for bash-completion: +optcomplete Python module from http://furius.ca/optcomplete/

    +
  6. +
  7. Optional (speedup for i386 compatible PCs) +Psyco from http://psyco.sourceforge.net/ +[http://osdn.dl.sourceforge.net/sourceforge/psyco/psyco-1.4-src.tar.gz]

    +
  8. +
+
+
+

Requirements for Windows

+
    +
  1. Install Python >= 2.4 from http://www.python.org/ +[http://www.python.org/ftp/python/2.4/python-2.4.msi]
  2. +
  3. Only needed if you compile from source: +install the MinGW suite from http://mingw.sourceforge.net/ +Be sure to install in the given order:
      +
    1. MingGW +[http://osdn.dl.sourceforge.net/sourceforge/mingw/MinGW-3.1.0-1.exe]
    2. +
    3. MSYS +[http://osdn.dl.sourceforge.net/sourceforge/mingw/MSYS-1.0.10.exe]
    4. +
    +
  4. +
  5. Optional (speedup for i386 compatible PCs) +Psyco from http://psyco.sourceforge.net/ +[http://osdn.dl.sourceforge.net/sourceforge/psyco/psyco-1.4.win32-py2.4.exe]
  6. +
+
+
+

Setup for Unix/Linux or Mac OS X

+
    +
  1. Install check

    +

    Be sure to have installed all required Unix/Linux software listed above.

    +
  2. +
  3. Compile Python modules

    +

    Run python setup.py build to compile the Python files. +For help about the setup.py script options, run +python setup.py --help. +The CC environment variable is checked before compilation, so you can +change the default C compiler with export CC=myccompiler.

    +
  4. +
  5. +
      +
    1. Installation as root

      +

      Run su -c 'python setup.py install' to install LinkChecker.

      +
    2. +
    3. Installation as a normal user

      +

      Run python setup.py install --home $HOME. Note that you have +to adjust your PATH and PYTHONPATH environment variables, eg. by +adding the commands export PYTHONPATH=$HOME/lib/python and +export PATH=$PATH:$HOME/bin to your shell configuration +file.

      +

      For more information look at the Modifying Python's search path +documentation.

      +
    4. +
    +

    If you downloaded Psyco please read the psyco installation docs.

    +
    +
  6. +
+
+
+

Setup for Windows - the binary .exe installer:

+
    +
  1. Install check

    +

    Be sure to have installed all required windows software listed above.

    +
  2. +
  3. Execute the linkchecker-x.xx.win32-py2.4.exe file and follow +the instructions.

    +
  4. +
+
+
+

Setup for Windows - compiling from source:

+
    +
  1. Install check

    +

    Be sure to have installed all required Unix/Linux software listed above.

    +
  2. +
  3. Preparing Python for the MinGW compiler

    +

    Search the file python24.dll in your windows folder. +After you found it, launch MSYS. Change into the windows folder, +for example cd c:\winnt\system32. Then execute +pexports python24.dll > python24.def. +Then use the dlltool with +dlltool --dllname python24.dll --def python24.def --output-lib +libpython24.a. +The resulting library has to be placed in the same directory as +python24.lib. (Should be the libs directory under your Python installation +directory, for example c:\Python24\Libs\.)

    +
  4. +
  5. Generate and execute the LinkChecker installer

    +

    Close the MSYS application (by typing exit) and open a DOS command +prompt. +Change to the linkchecker-X.X.X directory and run +python setup.py build -c mingw32 bdist_wininst.

    +

    This generates a binary installer +dist\linkchecker-X.X.X.win32-py2.4.exe which you just have to +execute.

    +

    If you downloaded Psyco please read the psyco installation docs.

    +
  6. +
+
+
+

After installation

+

LinkChecker is now installed. Have fun! +See the main page on how to configure and start LinkChecker.

+
+
+

Installation for other platforms

+

If you happen to install LinkChecker on other platforms (for example +Mac OS 9.x) then drop me a note.

+
+
+

(Fast)CGI web interface

+

The included CGI scripts can run LinkChecker with a nice graphical web +interface. +You can use and adjust the example HTML files in the lconline directory +to run the script.

+
    +
  1. Choose a CGI script. The simplest is lc.cgi and you need a web server +with CGI support. +The script lc.fcgi (I tested this a while ago) needs a web server +with FastCGI support.
  2. +
  3. Copy the script of your choice in the CGI directory. +Note that only the local host (ie. 127.0.0.1) can access this +script. If you want to enable access from other hosts you have +to adjust the ALLOWED_HOSTS and ALLOWED_SERVERS variables in +the lc.cgi (or lc.fcgi) script.
  4. +
  5. Adjust the "action=..." parameter in lconline/lc_cgi.html +to point to your CGI script.
  6. +
  7. load the lconline/index.html file, enter an URL and klick on the +check button
  8. +
  9. If something goes wrong, check the following:
      +
    1. look in the error log of your web server
    2. +
    3. be sure that you have enabled CGI support in your web server +do this by running other CGI scripts which you know are +working
    4. +
    5. try to run the lc.cgi script by hand
    6. +
    7. try the testit() function in the lc.cgi script
    8. +
    +
  10. +
+
+
+ + + + diff --git a/doc/en/install.nav b/doc/en/install.nav new file mode 100644 index 00000000..f5725612 --- /dev/null +++ b/doc/en/install.nav @@ -0,0 +1,5 @@ +# generated by htmlnav.py, do not edit +name = u'Installation' +level = 0 +visible = True +order = 1 diff --git a/doc/en/install.txt b/doc/en/install.txt new file mode 100644 index 00000000..2baa53cf --- /dev/null +++ b/doc/en/install.txt @@ -0,0 +1,194 @@ +.. meta:: + :navigation.order: 1 + :navigation.name: Installation + +Installation +============ + +If you are upgrading from older versions of LinkChecker you should +also read the `upgrading documentation`_. + +.. _upgrading documentation: + upgrading.html + + +Requirements for Unix/Linux or Mac OS X +--------------------------------------- + +1. You need a standard GNU development environment with + + - C compiler (for example the GNU C Compiler gcc) + + Depending on your distribution, several development packages + might be needed to provide a fully functional C development + environment. + + Note for developers: if you want to regenerate the po/linkchecker.pot + template from the source files, you will need xgettext with Python + support. This is available in gettext >= 0.12. + +2. Python >= 2.4 from http://www.python.org/ with zlib support + + Be sure to also have installed the included distutils module. + On most distributions, the distutils module is included in + an extra "python-dev" package. + +3. *Optional, for bash-completion:* + optcomplete Python module from http://furius.ca/optcomplete/ + +4. *Optional (speedup for i386 compatible PCs)* + Psyco from http://psyco.sourceforge.net/ + [http://osdn.dl.sourceforge.net/sourceforge/psyco/psyco-1.4-src.tar.gz] + +Requirements for Windows +------------------------ + +1. Install Python >= 2.4 from http://www.python.org/ + [http://www.python.org/ftp/python/2.4/python-2.4.msi] + +2. *Only needed if you compile from source:* + install the MinGW suite from http://mingw.sourceforge.net/ + Be sure to install in the given order: + + a) MingGW + [http://osdn.dl.sourceforge.net/sourceforge/mingw/MinGW-3.1.0-1.exe] + b) MSYS + [http://osdn.dl.sourceforge.net/sourceforge/mingw/MSYS-1.0.10.exe] + +3. *Optional (speedup for i386 compatible PCs)* + Psyco from http://psyco.sourceforge.net/ + [http://osdn.dl.sourceforge.net/sourceforge/psyco/psyco-1.4.win32-py2.4.exe] + +Setup for Unix/Linux or Mac OS X +-------------------------------- + +1. Install check + + Be sure to have installed all required Unix/Linux software listed above. + +2. Compile Python modules + + Run ``python setup.py build`` to compile the Python files. + For help about the setup.py script options, run + ``python setup.py --help``. + The CC environment variable is checked before compilation, so you can + change the default C compiler with ``export CC=myccompiler``. + +3. + a) Installation as root + + Run ``su -c 'python setup.py install'`` to install LinkChecker. + + b) Installation as a normal user + + Run ``python setup.py install --home $HOME``. Note that you have + to adjust your PATH and PYTHONPATH environment variables, eg. by + adding the commands ``export PYTHONPATH=$HOME/lib/python`` and + ``export PATH=$PATH:$HOME/bin`` to your shell configuration + file. + + For more information look at the `Modifying Python's search path`_ + documentation. + + .. _Modifying Python's search path: + http://docs.python.org/inst/search-path.html#SECTION000410000000000000000 + + If you downloaded Psyco please read the `psyco installation docs`_. + + .. _psyco installation docs: + http://psyco.sourceforge.net/psycoguide/node2.html + +Setup for Windows - the binary .exe installer: +---------------------------------------------- + +1. Install check + + Be sure to have installed all required windows software listed above. + +2. Execute the ``linkchecker-x.xx.win32-py2.4.exe`` file and follow + the instructions. + +Setup for Windows - compiling from source: +------------------------------------------ + +1. Install check + + Be sure to have installed all required Unix/Linux software listed above. + +2. Preparing Python for the MinGW compiler + + Search the file python24.dll in your windows folder. + After you found it, launch MSYS. Change into the windows folder, + for example ``cd c:\winnt\system32``. Then execute + ``pexports python24.dll > python24.def``. + Then use the dlltool with + ``dlltool --dllname python24.dll --def python24.def --output-lib + libpython24.a``. + The resulting library has to be placed in the same directory as + python24.lib. (Should be the libs directory under your Python installation + directory, for example ``c:\Python24\Libs\``.) + +3. Generate and execute the LinkChecker installer + + Close the MSYS application (by typing ``exit``) and open a DOS command + prompt. + Change to the ``linkchecker-X.X.X`` directory and run + ``python setup.py build -c mingw32 bdist_wininst``. + + This generates a binary installer + ``dist\linkchecker-X.X.X.win32-py2.4.exe`` which you just have to + execute. + + If you downloaded Psyco please read the `psyco installation docs`_. + + .. _psyco installation docs: + http://psyco.sourceforge.net/psycoguide/node2.html + +After installation +------------------ + +LinkChecker is now installed. Have fun! +See the `main page`_ on how to configure and start LinkChecker. + +.. _main page: index.html + +Installation for other platforms +-------------------------------- + +If you happen to install LinkChecker on other platforms (for example +Mac OS 9.x) then drop me a note. + +(Fast)CGI web interface +----------------------- + +The included CGI scripts can run LinkChecker with a nice graphical web +interface. +You can use and adjust the example HTML files in the lconline directory +to run the script. + +1. Choose a CGI script. The simplest is lc.cgi and you need a web server + with CGI support. + The script lc.fcgi (I tested this a while ago) needs a web server + with FastCGI support. + +2. Copy the script of your choice in the CGI directory. + Note that only the local host (ie. 127.0.0.1) can access this + script. If you want to enable access from other hosts you have + to adjust the ALLOWED_HOSTS and ALLOWED_SERVERS variables in + the lc.cgi (or lc.fcgi) script. + +3. Adjust the "action=..." parameter in lconline/lc_cgi.html + to point to your CGI script. + +4. load the lconline/index.html file, enter an URL and klick on the + check button + +5. If something goes wrong, check the following: + + a) look in the error log of your web server + b) be sure that you have enabled CGI support in your web server + do this by running other CGI scripts which you know are + working + c) try to run the lc.cgi script by hand + d) try the testit() function in the lc.cgi script + diff --git a/doc/en/lc.css b/doc/en/lc.css new file mode 100644 index 00000000..b28833c4 --- /dev/null +++ b/doc/en/lc.css @@ -0,0 +1,263 @@ +/* +:Author: David Goodger +:Contact: goodger@users.sourceforge.net +:date: $Date$ +:version: $Revision$ +:copyright: This stylesheet has been placed in the public domain. + +Default cascading style sheet for the HTML output of Docutils. +*/ + + +body { + font-family: Verdana, Helvetica, Arial, sans-serif; + background: #fff7ee;/*#f7ebd3;*//*fdf9f4*/ + margin: 0; + padding: 0; +} + +img { + border: 0; +} + +.first { + margin-top: 0 } + +.last { + margin-bottom: 0 } + +a { + color: #222222; +} + +a:hover { + color: black; +} + +a.toc-backref { + text-decoration: none ; + color: black; +} + +div.document { + margin-left: 2em; + width:680px; + overflow: visible; +} + +blockquote.epigraph { + margin: 2em 5em ; } + +dd { + margin-bottom: 0.5em } + +div.abstract { + margin: 2em 5em; +} + +div.abstract p.topic-title { + font-weight: bold ; + text-align: center } + +div.attention, div.caution, div.danger, div.error, div.hint, +div.important, div.note, div.tip, div.warning, div.admonition { + margin: 2em ; + border: medium outset ; + padding: 1em } + +div.attention p.admonition-title, div.caution p.admonition-title, +div.danger p.admonition-title, div.error p.admonition-title, +div.warning p.admonition-title { + color: red ; + font-weight: bold ; + font-family: sans-serif } + +div.hint p.admonition-title, div.important p.admonition-title, +div.note p.admonition-title, div.tip p.admonition-title, +div.admonition p.admonition-title { + font-weight: bold ; + font-family: sans-serif } + +div.dedication { + margin: 2em 5em ; + text-align: center ; + font-style: italic } + +div.dedication p.topic-title { + font-weight: bold ; + font-style: normal } + +div.figure { + margin-left: 2em } + +div.footer, div.header { + font-size: smaller; + margin-left: 2em; + margin-bottom: 1em; +} + +hr.footer { + width: 680px; + margin-left: 2em; +} + +div.sidebar { + margin-left: 1em ; + border: medium outset ; + padding: 0em 1em ; + background-color: #ffffee ; + width: 40% ; + float: right ; + clear: right } + +div.sidebar p.rubric { + font-family: sans-serif ; + font-size: medium } + +div.system-messages { + margin: 5em } + +div.system-messages h1 { + color: red } + +div.system-message { + border: medium outset ; + padding: 1em } + +div.system-message p.system-message-title { + color: red ; + font-weight: bold } + +div.topic { + margin: 2em } + +h1.title { + text-align: center } + +h2.subtitle { + text-align: center } + +hr { + width: 75% } + +ol.simple, ul.simple { + margin-bottom: 1em } + +ol.arabic { + list-style: decimal } + +ol.loweralpha { + list-style: lower-alpha } + +ol.upperalpha { + list-style: upper-alpha } + +ol.lowerroman { + list-style: lower-roman } + +ol.upperroman { + list-style: upper-roman } + +p.attribution { + text-align: right ; + margin-left: 50% } + +p.caption { + font-style: italic } + +p.credits { + font-style: italic ; + font-size: smaller } + +p.label { + white-space: nowrap } + +p.rubric { + font-weight: bold ; + font-size: larger ; + color: maroon ; + text-align: center } + +p.sidebar-title { + font-family: sans-serif ; + font-weight: bold ; + font-size: larger } + +p.sidebar-subtitle { + font-family: sans-serif ; + font-weight: bold } + +p.topic-title { + font-weight: bold } + +pre.address { + margin-bottom: 0 ; + margin-top: 0 ; + font-family: serif ; + font-size: 100% } + +pre.line-block { + font-family: serif ; + font-size: 100% } + +pre.literal-block, pre.doctest-block { + margin-left: 2em ; + margin-right: 2em ; + background-color: #eeeeee } + +span.classifier { + font-family: sans-serif ; + font-style: oblique } + +span.classifier-delimiter { + font-family: sans-serif ; + font-weight: bold } + +span.interpreted { + font-family: sans-serif } + +span.option { + white-space: nowrap } + +span.option-argument { + font-style: italic } + +span.pre { + white-space: pre } + +span.problematic { + color: red } + +table { + margin-top: 0.5em ; + margin-bottom: 0.5em } + +table.citation { + border-left: solid thin gray ; + padding-left: 0.5ex } + +table.docinfo { + margin: 2em 4em } + +table.footnote { + border-left: solid thin black ; + padding-left: 0.5ex } + +td, th { + padding-left: 0.5em ; + padding-right: 0.5em ; + vertical-align: top } + +th.docinfo-name, th.field-name { + font-weight: bold ; + text-align: left ; + white-space: nowrap } + +h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt { + font-size: 100% } + +tt { + background-color: #eeeeee } + +ul.auto-toc { + list-style-type: none } diff --git a/doc/en/navigation.css b/doc/en/navigation.css new file mode 100644 index 00000000..4b97f3b8 --- /dev/null +++ b/doc/en/navigation.css @@ -0,0 +1,40 @@ +.navigation { + background: transparent; +} + +.navrow { + border-collapse: collapse; + border-bottom-width: 1px; + border-bottom-style: dotted; + border-bottom-color: #f86821; + white-space: nowrap; +} + +.navrow a { + color: #222222; + background: transparent; + border-left-width: 10px; + border-left-style: solid; + border-left-color: #f86821; + font-weight: normal; + margin-right: 1em; + padding: 0em 0.5em; + text-decoration: none; +} + +.navrow a:hover { + color: black; + background: #f8c218; + border-color: #f85b0d; +} + +.navrow span { + color: #222222; + background: #f8c218; + border-left-width: 10px; + border-left-style: solid; + border-left-color: #f85b0d; + font-weight: normal; + margin-right: 1em; + padding: 0em 0.5em; +} diff --git a/doc/en/other.html b/doc/en/other.html new file mode 100644 index 00000000..002b5584 --- /dev/null +++ b/doc/en/other.html @@ -0,0 +1,56 @@ + + + + + + +Other link checkers + + + + + + + + + + + + + + + + diff --git a/doc/en/other.nav b/doc/en/other.nav new file mode 100644 index 00000000..32a5bd75 --- /dev/null +++ b/doc/en/other.nav @@ -0,0 +1,5 @@ +# generated by htmlnav.py, do not edit +name = u'Other' +level = 0 +visible = True +order = 5 diff --git a/doc/en/other.txt b/doc/en/other.txt new file mode 100644 index 00000000..4aedd69a --- /dev/null +++ b/doc/en/other.txt @@ -0,0 +1,58 @@ +.. meta:: + :navigation.order: 5 + :navigation.name: Other + +Other link checkers +=================== + +If LinkChecker does not fit your requirements, you can check out the +competition. All of these programs have also an `Open Source license`_ +like LinkChecker. + +.. _`Open Source license`: + http://www.opensource.org/licenses/ + +- `checkbot`_ written in Perl + + .. _checkbot: + http://degraaff.org/checkbot/ + +- `Checklinks`_ written in Perl + + .. _Checklinks: + http://www.jmarshall.com/tools/cl/ + +- `Dead link check`_ written in Perl + + .. _Dead link check: + http://dlc.sourceforge.net/ + +- `gURLChecker`_ written in C + + .. _gURLChecker: + http://labs.libre-entreprise.org/projects/gurlchecker/ + +- `jchecklinks`_ written in Java + + .. _jchecklinks: + http://web.purplefrog.com/~thoth/jchecklinks/ + +- `link-checker`_ written in C + + .. _link-checker: + http://ymettier.free.fr/link-checker/link-checker.html + +- `linklint`_ written in Perl + + .. _linklint: + http://www.linklint.org/ + +- `webcheck`_ written in Python + + .. _webcheck: + http://www.mired.org/webcheck/ + +- `webgrep`_ written in Perl + + .. _webgrep: + http://cgi.linuxfocus.org/~guido/index.html#webgrep diff --git a/doc/en/shot1.png b/doc/en/shot1.png new file mode 100644 index 0000000000000000000000000000000000000000..f18dd35f666afeb9a633c0c5b5dc04b5c899daed GIT binary patch literal 12091 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 literal 0 HcmV?d00001 diff --git a/doc/en/shot1_thumb.jpg b/doc/en/shot1_thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..92798392ff8bd272d2db9db29aa07bc09386c63d GIT binary patch literal 3890 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 literal 0 HcmV?d00001 diff --git a/doc/en/shot2.png b/doc/en/shot2.png new file mode 100644 index 0000000000000000000000000000000000000000..28559794d062e3cbdef0646bed10ee43130dc348 GIT binary patch literal 42377 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 O-)<{ + + + + + +Upgrading + + + + + + + + + + + +
+

Upgrading

+
+

Migrating from 2.2 to 2.3

+

The per-user config file is now ~/.linkchecker/linkcheckerrc +(previous location was ~/.linkcheckerrc ).

+

The default blacklist output file is now ~/.linkchecker/blacklist +(previous location was ~/.blacklist).

+

Python >= 2.4 is now required.

+
+
+

Migrating from 1.x to 2.0

+

The --output and --file-output parameters can specify the encoding +now. You should check your scripts if they support the new option +syntax.

+

Some added checks might trigger new warnings, so automated scripts +or alarms can have more output than with 1.x releases.

+

All output (file and console) is now encoded according to a given +character set encoding which defaults to ISO-8859-15. If you +relied that output was in a specific encoding, you might want to +use the output encoding option.

+
+
+

Migrating from 1.12.x to 1.13.0

+

Since lots of filenames have changed you should check that any +manually installed versions prior to 1.13.0 are removed. Otherwise +you will have startup problems.

+

The default output logger text has now colored output if the +output terminal supports it. The old colored output logger has +been removed.

+

The -F option no longer suppresses normal output. The old behaviour +can be restored by giving the option -onone.

+

The --status option is now the default and has been deprecated. The +old behaviour can be restored by giving the option --no-status.

+

The default recursion depth is now infinite. The old behaviour +can be restored by giving the option --recursion-level=1.

+

The option --strict has been renamed to --extern-strict-all.

+

The commandline program linkchecker returns now non-zero exit value +when errors were encountered. Previous versions always return a zero +exit value. +For scripts to ignore exit values and therefore restore the old behaviour +you can append a || true at the end of the command.

+
+
+ + + + diff --git a/doc/en/upgrading.nav b/doc/en/upgrading.nav new file mode 100644 index 00000000..5e8ad8fd --- /dev/null +++ b/doc/en/upgrading.nav @@ -0,0 +1,5 @@ +# generated by htmlnav.py, do not edit +name = u'Upgrading' +level = 0 +visible = True +order = 2 diff --git a/doc/en/upgrading.txt b/doc/en/upgrading.txt new file mode 100644 index 00000000..68d79b7b --- /dev/null +++ b/doc/en/upgrading.txt @@ -0,0 +1,62 @@ +.. meta:: + :navigation.order: 2 + :navigation.name: Upgrading + +Upgrading +========= + +Migrating from 2.2 to 2.3 +------------------------- + +The per-user config file is now ``~/.linkchecker/linkcheckerrc`` +(previous location was ``~/.linkcheckerrc`` ). + +The default blacklist output file is now ``~/.linkchecker/blacklist`` +(previous location was ``~/.blacklist``). + +Python >= 2.4 is now required. + + +Migrating from 1.x to 2.0 +------------------------- + +The --output and --file-output parameters can specify the encoding +now. You should check your scripts if they support the new option +syntax. + +Some added checks might trigger new warnings, so automated scripts +or alarms can have more output than with 1.x releases. + +All output (file and console) is now encoded according to a given +character set encoding which defaults to ISO-8859-15. If you +relied that output was in a specific encoding, you might want to +use the output encoding option. + + +Migrating from 1.12.x to 1.13.0 +------------------------------- + +Since lots of filenames have changed you should check that any +manually installed versions prior to 1.13.0 are removed. Otherwise +you will have startup problems. + +The default output logger ``text`` has now colored output if the +output terminal supports it. The old ``colored`` output logger has +been removed. + +The ``-F`` option no longer suppresses normal output. The old behaviour +can be restored by giving the option ``-onone``. + +The --status option is now the default and has been deprecated. The +old behaviour can be restored by giving the option ``--no-status``. + +The default recursion depth is now infinite. The old behaviour +can be restored by giving the option ``--recursion-level=1``. + +The option ``--strict`` has been renamed to ``--extern-strict-all``. + +The commandline program ``linkchecker`` returns now non-zero exit value +when errors were encountered. Previous versions always return a zero +exit value. +For scripts to ignore exit values and therefore restore the old behaviour +you can append a ``|| true`` at the end of the command.