src/Pure/Admin/sync_repos.scala
author wenzelm
Mon, 30 May 2022 10:15:27 +0200
changeset 75486 ba4ed9a50be3
parent 75485 d8ee3e4d74ef
child 75487 167660a8f99e
permissions -rw-r--r--
more documentation;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
75481
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/Admin/sync_repos.scala
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
     3
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
     4
Synchronize Isabelle + AFP repositories.
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
     5
*/
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
     6
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
     7
package isabelle
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
     8
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
     9
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    10
object Sync_Repos {
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    11
  def sync_repos(target: String,
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    12
    progress: Progress = new Progress,
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    13
    verbose: Boolean = false,
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    14
    dry_run: Boolean = false,
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    15
    clean: Boolean = false,
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    16
    rev: String = "",
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    17
    afp_root: Option[Path] = None,
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    18
    afp_rev: String = ""
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    19
  ): Unit = {
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    20
    val target_dir = if (target.endsWith(":") || target.endsWith("/")) target else target + "/"
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    21
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    22
    val isabelle_hg = Mercurial.repository(Path.ISABELLE_HOME)
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    23
    val afp_hg = afp_root.map(Mercurial.repository(_))
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    24
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    25
    def sync(hg: Mercurial.Repository, dest: String, r: String, filter: List[String] = Nil): Unit =
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    26
      hg.sync(dest, progress = progress, verbose = verbose, dry_run = dry_run, clean = clean,
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    27
        rev = r, filter = filter)
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    28
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    29
    progress.echo("\n* Isabelle repository:")
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    30
    sync(isabelle_hg, target, rev, filter = List("protect /AFP", "protect etc/ISABELLE_ID"))
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    31
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    32
    if (!dry_run) {
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    33
      Isabelle_System.with_tmp_dir("sync_repos") { tmp_dir =>
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    34
        val id_path = tmp_dir + Path.explode("ISABELLE_ID")
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    35
        File.write(id_path, isabelle_hg.id(rev = rev))
75485
d8ee3e4d74ef clarified signature;
wenzelm
parents: 75484
diff changeset
    36
        Isabelle_System.rsync(args = List(File.standard_path(id_path), target_dir + "etc/"))
75481
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    37
      }
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    38
    }
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    39
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    40
    for (hg <- afp_hg) {
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    41
      progress.echo("\n* AFP repository:")
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    42
      sync(hg, target_dir + "AFP", afp_rev)
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    43
    }
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    44
  }
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    45
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    46
  val isabelle_tool =
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    47
    Isabelle_Tool("sync_repos", "synchronize Isabelle + AFP repositories",
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    48
      Scala_Project.here, { args =>
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    49
        var afp_root: Option[Path] = None
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    50
        var clean = false
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    51
        var afp_rev = ""
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    52
        var dry_run = false
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    53
        var rev = ""
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    54
        var verbose = false
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    55
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    56
        val getopts = Getopts("""
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    57
Usage: isabelle sync_repos [OPTIONS] TARGET
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    58
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    59
  Options are:
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    60
    -A ROOT      include AFP with given root directory
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    61
    -C           clean all unknown/ignored files on target
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    62
                 (implies -n for testing; use option -f to confirm)
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    63
    -a REV       explicit AFP revision (default: state of working directory)
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    64
    -f           force changes: no dry-run
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    65
    -n           no changes: dry-run
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    66
    -r REV       explicit revision (default: state of working directory)
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    67
    -v           verbose
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    68
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    69
  Synchronize Isabelle + AFP repositories; see also "isabelle hg_sync".
75486
ba4ed9a50be3 more documentation;
wenzelm
parents: 75485
diff changeset
    70
ba4ed9a50be3 more documentation;
wenzelm
parents: 75485
diff changeset
    71
  Example (without -f as "dry-run"):
ba4ed9a50be3 more documentation;
wenzelm
parents: 75485
diff changeset
    72
ba4ed9a50be3 more documentation;
wenzelm
parents: 75485
diff changeset
    73
    isabelle sync_repos -A '$AFP_BASE' -C testmachine:test/isabelle_afp
75481
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    74
""",
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    75
          "A:" -> (arg => afp_root = Some(Path.explode(arg))),
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    76
          "C" -> { _ => clean = true; dry_run = true },
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    77
          "a:" -> (arg => afp_rev = arg),
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    78
          "f" -> (_ => dry_run = false),
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    79
          "n" -> (_ => dry_run = true),
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    80
          "r:" -> (arg => rev = arg),
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    81
          "v" -> (_ => verbose = true))
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    82
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    83
        val more_args = getopts(args)
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    84
        val target =
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    85
          more_args match {
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    86
            case List(target) => target
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    87
            case _ => getopts.usage()
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    88
          }
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    89
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    90
        val progress = new Console_Progress
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    91
        sync_repos(target, progress = progress, verbose = verbose, dry_run = dry_run, clean = clean,
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    92
          rev = rev, afp_root = afp_root, afp_rev = afp_rev)
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    93
      }
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    94
    )
029cd4e1a2c7 support to synchronize Isabelle + AFP repositories;
wenzelm
parents:
diff changeset
    95
}