TortoiseSVNのよく使う機能をまとめたツールをHTAで作った個人用メモ

#概要
TortoiseSVNで作業フォルダに潜って、右クリックして、ログを表示したり、リポジトリブラウザを表示したり・・・を毎回するのが面倒だけどデスクトップにショートカット溢れさせたくない・・・
そんな理由で、自分がよく使う機能をまとめたHTA(HTML Application)を作ったので記事として残しておけば誰かの参考程度には役に立つかも？という個人用メモです。

#環境
- Windows7
- TortoiseSVN
- サクラエディタ

`TortoiseSVN`で書いていますが、`TortoiseGit`のコマンドに置き換えれば同じようにできると思います。

#参考URL
- [JScript ランゲージ リファレンス](https://msdn.microsoft.com/ja-jp/library/cc409859.aspx)
- [JavaScriptでかんたんHTAアプリに挑戦](http://tech.nitoyon.com/ja/blog/2009/01/19/hta/)<br>
- [TortoiseSVNのコマンド](https://tortoisesvn.net/docs/release/TortoiseSVN_ja/tsvn-automation.html)
- [TortoiseGit Manual](https://tortoisegit.org/docs/tortoisegit/tgit-automation.html)<br>
TortoiseGitの方は日本語ページが見つからなかった・・・許して・・・

#コード

```html:TortoiseSVN操作ツール.hta
<html>
<head>
  <title>TortoiseSVN操作ツール</title>
  <meta http-equiv="X-UA-Compatible" content="IE=11">
  
  <script language="JScript">
  // リポジトリ情報(XXX.XXX.XXX.XXXの部分はIPアドレスなので一応ぼかしている)
  var repoList = [
    {
      name: "リポジトリ1",
      path: "svn://XXX.XXX.XXX.XXX/repos/repository1",
      dir: "C:\\work\\作業コピー\\リポジトリ1"
    },
    {
      name: "リポジトリ2",
      path: "svn://XXX.XXX.XXX.XXX/repos/repository2",
      dir: "C:\\work\\作業コピー\\リポジトリ2"
    }
  ];
  
  // 起動時にウィンドウサイズを設定
  window.onload = function() {
    window.resizeTo(300,400);
    // リポジトリ情報をセレクトボックスに設定する
    CreateRepositoryList("repo-list");
    GetElement("repo-list").selectedIndex = 1;
  };
  
  // Escキー押下で終了
  document.onkeydown = function(evt) {
    evt = evt || window.event;
    if (evt.keyCode == 27) {
      window.close();
    }
  };
  
  // 指定したIDの要素を取得する
  function GetElement(eleId) {
    var ret = document.getElementById(eleId);
    
    if (ret == undefined) {
      alert("要素が見つかりません\nid:" + eleId);
    }
    
    return ret;
  };
  
  // セレクトボックスにリポジトリ名リストを設定する
  function CreateRepositoryList(ele) {
    for (var i = 0; i < repoList.length; i++) {
      var op = document.createElement("option");
      op.value = i;
      op.text = repoList[i].name;
      GetElement(ele).add(op);
    }
  };
  
  // 選択しているセレクトボックスに応じたリポジトリのパスを取得する
  function GetSelectRepoPath(ele) {
    var ret;
    // 選択しているセレクトボックスの値
    var selVal = GetElement(ele).value;
    
    // 選択したリポジトリパスを格納
    ret = repoList[selVal].path;
    
    return ret;
  };
  
  // 選択しているラジオボタンに応じた作業コピーのパスを取得する
  function GetSelectWorkPath(ele) {
    var ret;
    // ラジオボタンの要素
    var rdbEle = document.getElementsByName(ele);
    // ラジオボタンの値
    var choiced;
    
    // ラジオボタンの値を取得
    for (var i = 0; i < rdbEle.length; i++) {
      if (rdbEle[i].checked) {
        choiced = rdbEle[i].value;
      }
    }
    
    // 選択した作業コピーパスを格納
    ret = repoList[choiced].dir;
    
    return ret;
  };
  
  // リポジトリの情報を表示する
  function ShowRepoInfo(ele, caller) {
    var objShell = new ActiveXObject("WScript.Shell");
    // 実行するコマンドの連想配列
    var cmdMap = {
      brows: "cmd /c TortoiseProc /command:repobrowser /path:",
      log: "cmd /c TortoiseProc /command:log /path:"
    };
    // 選択したリポジトリパス
    var repoPath = GetSelectRepoPath(ele);
    
    // 呼び出し元に応じた操作を実行する
    objShell.run(cmdMap[caller] + repoPath, 0);
  };
  
  // 作業コピーを操作する
  function OperationWorkCopy(ele, caller) {
    var objShell = new ActiveXObject("WScript.Shell");
    // 実行するコマンドの連想配列
    var cmdMap = {
      update: "cmd /c TortoiseProc /command:update /path:",
      open: "cmd /c explorer "
    };
    // 選択した作業コピーのパス
    var workPath = GetSelectWorkPath(ele);
    
    // 呼び出し元に応じた操作を実行する
    objShell.run(cmdMap[caller] + workPath, 0);
  };
  </script>
  <style type="text/css">
    .border-solid-1 {
      border: solid 1px;
    }
    .contents {
      width: 100%;
    }
    .content-title {
      background: #afefff;
      display: inline-block;
      *display: inline;
    }
    .content-body {
      padding: 5px;
    }
    .margin-bottom-5 {
      margin-bottom: 5px;
    }
    .margin-bottom-10 {
      margin-bottom: 10px;
    }
  </style>
</head>

<body>
<form name="form1">
  <div class="contents">
    <div class="content-title">リポジトリ情報を表示</div>
    <div class="content-body border-solid-1 margin-bottom-10">
      <div class="inner-title margin-bottom-5">リポジトリ名を選択</div>
      <div class="inner-body">
        <select class="margin-bottom-5" id="repo-list""></select><br>
        <input class="margin-bottom-5" type="button" value="リポジトリブラウザ起動" onClick="ShowRepoInfo('repo-list', 'brows')"><br>
        <input class="margin-bottom-5" type="button" value="ログを表示" onClick="ShowRepoInfo('repo-list', 'log')">
      </div>
    </div>
    <div class="content-title">作業コピーの更新</div>
    <div class="content-body border-solid-1">
      <div class="inner-title margin-bottom-5">更新したい作業コピーを選択</div>
      <div class="inner-body margin-bottom-5">
        <label><input type="radio" name="update-rdb" value="0">010-Release<br></label>
        <label><input type="radio" name="update-rdb" value="1" checked>020-Develop<br></label>
      </div>
      <input class="margin-bottom-5" type="button" value="作業コピー更新" onClick="OperationWorkCopy('update-rdb', 'update')"><br>
      <input class="margin-bottom-5" type="button" value="作業コピーを開く" onClick="OperationWorkCopy('update-rdb', 'open')">
    </div>
  </div>
</form>
</body>
</html>
```

- コードに関して細かい解説はしないので、コメントを見ながら適宜自分の環境に合わせて書き換えてください。
- リポジトリとか作業コピーのパスはサンプル用に書き換えてます。
- TortoiseSvnの`TortoiseProc.exe`にパスが通っている前提なので、パスを通してない場合はパスを通すか、TortoiseProc.exeをのフルパス指定に置き換えてください。<br>
例）`TortoiseProc` ⇒ `C:\\Program Files\\TortoiseSVN\\bin\\TortoiseProc.exe`

#その他
HTAファイル一つで片付くようにHTML、CSS、Scriptは全部入り。
HTML Applicationという名の通り、基本的にはHTMLの書き方なのでJQueryとかも使えるので、自分の使いやすいように改造してみてもいいかも？(ただし内部的にはIEなのでIEで非対応なものは動かない)
今更HTAておま・・・とはいえWindowsでちょっとしたGUIツールをサクッと作るには結構便利なのよね(´・ω・`)