ページ

2015年11月21日土曜日

Elixir/Phoenixで遊ぶ 15 - ElixirでGitHubリポジトリ同期ツールの作成 その4-


今回でリポジトリと同期する処理を実装し、とりあえず完成させる

   モジュールの分離


前回までリポジトリ一覧の処理をSynchubモジュール内に書いていましたが、 一覧表示の所を別モジュールに切り出したいと思います。

新規にlib/synchub/listrepos.exを以下内容で作成
defmodule Synchub.Listrepos do

@moduledoc """
The module of list github repos.
"""

@doc "put repos name."
def put_repo_name([info|tail]) do
  IO.puts info["name"]
  put_repo_name(tail)
end

def put_repo_name(info) do
end

end

lib/mix/tasks/list.github.repos.exを以下に編集
※少し名前を変更してます。(長かったので・・・)
defmodule Mix.Tasks.List.Github do
  use Mix.Task

  @shortdoc "Show github repos list"

  def run(args) do
    url = "users/" <> Application.get_env(:synchub, :userid) <> "/repos"
    Synchub.start
    repos = Synchub.get(url)
    Synchub.Listrepos.put_repo_name(repos)
  end
end
Synchub.get内で一覧表示させていた部分をSynchub.Listrepos.put_repo_name(repos)で実行しています。
$ mix list.githubで一覧表示されればOK


   リポジトリ同期モジュールの作成


上でモジュールを分離させたのは、リポジトリ同期モジュールの為になります。
Synchub.get(url)で取得したリポジトリ一覧に対して処理を行うモジュールを作成します。

lib/synchub/syncrepos.exを以下内容で作成
defmodule Synchub.Syncrepos do

@moduledoc """
The module of sync github repos.
"""

@rootdir "syncrepos"

@doc "check install git client"
def install_git?() do
  ret = System.find_executable("git") # [1]
  ret != nil
end

@doc "sync github repos."
def sync([info|tail]) do
  # create sync repos dir
  unless File.exists?(@rootdir) do
    IO.puts "create dir ==> " <> @rootdir
    File.mkdir(@rootdir)
  end
  File.cd(@rootdir)

  if File.exists?(info["name"]) do # [2]
    # git command
    File.cd(info["name"])
    IO.puts "exists repo dir " <> info["name"]
    case System.cmd("git", Application.get_env(:synchub, :exists_cmd)) do # [3]
      {err, code} -> IO.puts(err)
    end
    File.cd("../")
  else
    # clone repo
    clone_url = info["clone_url"]
    if clone_url do
      IO.puts "clone " <> clone_url
      case System.cmd("git", ["clone", clone_url]) do # [4]
        {err, code} -> IO.puts(err)
      end
    end
  end
  File.cd("../")
  sync(tail)
end

def sync([]), do: nil

end
やってる事のポイントとしては、
  • [1] gitインストールの確認
  • [2] 既にクローン済みか判定
  • [3] config.exsで設定されたgitコマンドを実行
  • [4] gitクローンを実行
になります。

   リポジトリ同期用のタスクを作成


一覧表示の時と同じようにカスタムのタスクを作成したいと思います。

最終的に
$ mix sync.github
としたら同期してくれるようにしたいと思います。

lib/mix/tasks/sync.github.exを以下内容で作成
defmodule Mix.Tasks.Sync.Github do
  use Mix.Task

  @shortdoc "Sync github repos"

  alias Synchub.Syncrepos

  def run(args) do
    IO.puts "start sync github repos..."
    unless Syncrepos.install_git? do # [1]
      IO.puts "not found git. please install"
    else
      url = "users/" <> Application.get_env(:synchub, :userid) <> "/repos"
      Synchub.start
      repos = Synchub.get(url)
      Syncrepos.sync(repos.body)
      IO.puts "success sync github repos"
    end
  end
end
[1] でgitがインストールされているか確認し、インストールされている場合のみ
同期を行うようにしています。

ここまで作成したらmix compileでコンパイルし、mix sync.githubで同期できれば成功です。

   まとめ


荒削りですが、とりあえず作成完了ということにします(笑)

プロジェクト自体はここに上げています。気ままに更新していこうかなと思ってるので良かったら使ってみてください。

0 件のコメント:

コメントを投稿