src/Pure/General/mailman.scala
author wenzelm
Sat, 07 Nov 2020 20:46:24 +0100
changeset 72559 274c9986e55b
parent 72558 38ebf696fd0c
child 72563 feb80142e572
permissions -rw-r--r--
maintain Isabelle mailing list archives;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
72558
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/General/mailman.scala
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
     3
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
     4
Support for Mailman list servers.
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
     5
*/
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
     6
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
     7
package isabelle
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
     8
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
     9
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    10
import java.net.URL
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    11
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    12
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    13
object Mailman
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    14
{
72559
274c9986e55b maintain Isabelle mailing list archives;
wenzelm
parents: 72558
diff changeset
    15
  /* mailing list archives */
274c9986e55b maintain Isabelle mailing list archives;
wenzelm
parents: 72558
diff changeset
    16
72558
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    17
  def archive(url: URL, name: String = ""): Archive =
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    18
  {
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    19
    val text = Url.read(url)
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    20
    val hrefs = """href="([^"]+\.txt(?:\.gz)?)"""".r.findAllMatchIn(text).map(_.group(1)).toList
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    21
    val title =
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    22
      """<title>The ([^</>]*) Archives</title>""".r.findFirstMatchIn(text).map(_.group(1))
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    23
    val list_name =
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    24
      (proper_string(name) orElse title).getOrElse(error("Failed to determine mailing list name"))
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    25
    new Archive(Url.trim_index(url), list_name, hrefs)
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    26
  }
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    27
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    28
  class Archive private[Mailman](val list_url: URL, val list_name: String, hrefs: List[String])
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    29
  {
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    30
    override def toString: String = list_name
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    31
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    32
    def download(
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    33
      target_dir: Path = Path.current,
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    34
      progress: Progress = new Progress): List[Path] =
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    35
    {
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    36
      val dir = target_dir + Path.basic(list_name)
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    37
      Isabelle_System.make_directory(dir)
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    38
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    39
      hrefs.flatMap(name =>
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    40
        {
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    41
          val path = dir + Path.basic(name)
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    42
          val url = new URL(list_url, name)
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    43
          val connection = url.openConnection
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    44
          try {
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    45
            val length = connection.getContentLengthLong
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    46
            val timestamp = connection.getLastModified
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    47
            val file = path.file
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    48
            if (file.isFile && file.length == length && file.lastModified == timestamp) None
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    49
            else {
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    50
              progress.echo("Getting " + url)
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    51
              val bytes =
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    52
                using(connection.getInputStream)(Bytes.read_stream(_, hint = length.toInt max 1024))
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    53
              Bytes.write(file, bytes)
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    54
              file.setLastModified(timestamp)
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    55
              Some(path)
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    56
            }
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    57
          }
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    58
          finally { connection.getInputStream.close }
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    59
        })
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    60
    }
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    61
  }
72559
274c9986e55b maintain Isabelle mailing list archives;
wenzelm
parents: 72558
diff changeset
    62
274c9986e55b maintain Isabelle mailing list archives;
wenzelm
parents: 72558
diff changeset
    63
274c9986e55b maintain Isabelle mailing list archives;
wenzelm
parents: 72558
diff changeset
    64
  /* Isabelle mailing lists */
274c9986e55b maintain Isabelle mailing list archives;
wenzelm
parents: 72558
diff changeset
    65
274c9986e55b maintain Isabelle mailing list archives;
wenzelm
parents: 72558
diff changeset
    66
  def isabelle_users: Archive =
274c9986e55b maintain Isabelle mailing list archives;
wenzelm
parents: 72558
diff changeset
    67
    archive(Url("https://lists.cam.ac.uk/pipermail/cl-isabelle-users"), name = "isabelle-users")
274c9986e55b maintain Isabelle mailing list archives;
wenzelm
parents: 72558
diff changeset
    68
274c9986e55b maintain Isabelle mailing list archives;
wenzelm
parents: 72558
diff changeset
    69
  def isabelle_dev: Archive =
274c9986e55b maintain Isabelle mailing list archives;
wenzelm
parents: 72558
diff changeset
    70
    archive(Url("https://mailmanbroy.informatik.tu-muenchen.de/pipermail/isabelle-dev"))
72558
38ebf696fd0c support for Mailman list servers;
wenzelm
parents:
diff changeset
    71
}