lean4-htt/Leanpkg2/Git.lean
2021-06-02 18:19:31 -04:00

54 lines
1.9 KiB
Text

/-
Copyright (c) 2017 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Gabriel Ebner, Sebastian Ullrich, Mac Malone
-/
import Leanpkg2.Proc
import Leanpkg2.LeanVersion
open System
namespace Leanpkg2.Git
def upstreamBranch :=
"master"
def defaultRevision : Option String → String
| none => upstreamBranch
| some branch => branch
def clone (url : String) (dir : FilePath) :=
execCmd {cmd := "git", args := #["clone", url, dir.toString]}
def quietInit (repo : Option FilePath := none) :=
execCmd {cmd := "git", args := #["init", "-q"]}
def fetch (repo : Option FilePath := none) :=
execCmd {cmd := "git", args := #["fetch"], cwd := repo}
def checkoutBranch (branch : String) (repo : Option FilePath := none) :=
execCmd {cmd := "git", args := #["checkout", "-B", branch]}
def checkoutDetach (hash : String) (repo : Option FilePath := none) :=
execCmd {cmd := "git", args := #["checkout", "--detach", hash], cwd := repo}
def parseRevision (rev : String) (repo : Option FilePath := none) : IO String := do
let rev ← IO.Process.run {cmd := "git", args := #["rev-parse", "-q", "--verify", rev], cwd := repo}
rev.trim -- remove newline at end
def headRevision (repo : Option FilePath := none) : IO String :=
parseRevision "HEAD" repo
def parseOriginRevision (rev : String) (repo : Option FilePath := none) : IO String :=
(parseRevision ("origin/" ++ rev) repo) <|> parseRevision rev repo
<|> throw (IO.userError s!"cannot find revision {rev} in repository {repo}")
def latestOriginRevision (branch : Option String) (repo : Option FilePath := none) : IO String := do
discard <| IO.Process.run {cmd := "git", args := #["fetch"], cwd := repo}
parseOriginRevision (defaultRevision branch) repo
def revisionExists (rev : String) (repo : Option FilePath := none) : IO Bool := do
try
discard <| parseRevision (rev ++ "^{commit}") repo
true
catch _ => false