Current section
Files
Jump to
Current section
Files
lib/mix/get_docs.ex
defmodule Mix.Tasks.Plumbapius.GetDocs do
@moduledoc """
Clones and updates git repo with apib docs
#Usage
```
mix plumbapius.get_docs -c ssh://git@git.funbox.ru/gc/ghetto-auth-apib.git -d ./path/to/put/repo -b branch-name
```
"""
@shortdoc "Clones and updates git repo with apib docs"
use Mix.Task
require Logger
@default_apib_workdir ".apib"
@default_branch "master"
@impl Mix.Task
def run(argv, update_repo \\ &update_repo/3, update_gitignore \\ &update_gitignore/1, halt \\ &System.halt/1) do
case params() |> Optimus.parse!(argv, halt) do
%{options: options} ->
update_repo.(options.git_clone_uri, options.local_stock_folder, options.branch)
update_gitignore.(options.local_stock_folder)
error ->
error
end
end
defp update_repo(uri, local_folder, branch) do
unless File.exists?(local_folder) do
clone_repo(uri, local_folder, branch)
else
update_repo(local_folder, branch)
end
end
defp update_repo(local_git_folder, branch) do
Logger.info("Updating #{local_git_folder} repository with branch #{branch}")
with {_, 0} <- System.cmd("git", ["-C", local_git_folder, "fetch", "origin", branch]),
{_, 0} <-
System.cmd("git", ["-C", local_git_folder, "reset", "--hard", "origin/#{branch}"]),
{_, 0} <- System.cmd("git", ["-C", local_git_folder, "clean", "-ffdx"]) do
Logger.info("Repository has been updated successfully")
else
error ->
raise RuntimeError, inspect(error)
end
end
defp clone_repo(git_uri, local_folder, branch) do
Logger.info("Cloning #{git_uri} repository into #{local_folder} with branch #{branch}")
with {_, 0} <- System.cmd("git", ["clone", git_uri, local_folder]),
{_, 0} <- System.cmd("git", ["-C", local_folder, "checkout", branch]) do
Logger.info("Repository has been cloned successfully")
else
error ->
raise RuntimeError, inspect(error)
end
end
defp update_gitignore(local_stock_folder) do
unless File.stream!(".gitignore")
|> Enum.any?(&String.starts_with?(&1, local_stock_folder)) do
Logger.info("Updating .gitignore file")
{:ok, file} = File.open(".gitignore", [:append])
IO.binwrite(file, local_stock_folder <> "\n")
File.close(file)
Logger.info(".gitignore file has been updated successfully")
end
end
defp params do
Optimus.new!(
name: "get_docs",
description: "Git repositories assistant",
version: "0.1.0",
author: "Funbox",
about: "Utility for downloading and updating apib repository",
allow_unknown_args: false,
parse_double_dash: true,
options: [
git_clone_uri: [
value_name: "GIT_CLONE_URI",
short: "-c",
long: "--clone",
help: "Clone URI of apib repository",
required: true
],
local_stock_folder: [
value_name: "LOCAL_STOCK_DIRECTORY",
short: "-d",
long: "--directory",
help: "Local directory to stock apib repository",
required: false,
default: @default_apib_workdir
],
branch: [
value_name: "BRANCH",
short: "-b",
long: "--branch",
help: "Required branch in apib repository",
required: false,
default: @default_branch
]
]
)
end
end