ゲームエフェクトデザイナーのブログ (新)

レポート記事とかUE4のマテリアルとか。C#とかも触ったり。

Helix Core(Perforce)の .NET向けAPIの導入方法 ③

前回に引き続き「Helix Core(旧称 Perforce)」を使ったファイルのバージョン管理の操作を、.NET/C# で制作するWindows Forms Application上で行います。

本記事で解説する内容はこちら。


今回もまたp4miscさんに随所で助けていただきました(ありがとうございます!)

ちなみにワークスペース名の取得に関してはこちらの記事をご覧ください。


ワークスペースの切断

切断はこちらでいけました。

con.Disconnect();

 

ファイルがワークスペースルートに存在するか判定

強引かもですが、指定ファイルのフルパスとワークスペースルートを前方一致で比較して判定しています。また、大文字と小文字の区別をしないようにする必要があります。

string filePath = "ファイルのフルパス"
string rootPath = con.Client.Root.ToString();

if (filePath.StartsWith(rootPath, true, CultureInfo.CurrentCulture))
{
    Console.WriteLine("The file exists on the workspace!");
}

 

ファイルがバージョン管理されているか判定

バージョン管理されているかは、ディポリポジトリ)にそのファイルが存在するかを調べれば良いようです。なるほど!公式ドキュメントはこちら

FileSpec editFile = new FileSpec(new LocalPath(filePath));
IList<FileSpec> depotFiles = p4.GetDepotFiles(new FileSpec[] { editFile }, new Options());

if (depotFiles != null)
{
    Console.WriteLine("The file is in version control!");
}

 

ファイルがチェックアウト状態か判定

リポジトリオブジェクトの「GetOpenedFiles」メソッドでファイルがチェックアウトしているか判定すると良いようです。公式ドキュメントはこちら

FileSpec editFile = new FileSpec(new LocalPath(filePath));
IList<FileSpec> depotFiles = p4.GetDepotFiles(new FileSpec[] { editFile }, new Options());

if (depotFiles != null)
{
    List<FileSpec> lfs = new List<FileSpec>();
    lfs.Add(depotFiles[0].DepotPath);

    GetOpenedFilesOptions opts = new GetOpenedFilesOptions(
        GetOpenedFilesCmdFlags.AllClients, null, null, null, 10);
    IList<Perforce.P4.File> openedFiles = p4.GetOpenedFiles(lfs, opts);

    if (openedFiles != null)
    {
        Console.WriteLine("The file has already been checkout!");
    }
}


1つ注意点があって「IList<File>」が「System.IO.File」とバッティングしてビルドエラーになるので「IList<Perforce.P4.File>」と明示する必要がありました。

実装方法の調べ方

やりたい実装はまずP4コマンドの公式リファレンスでどのコマンドが該当するか調べ、その情報を元にP4API公式ドキュメントで検索をかけて当たりを付ける感じになります。

その他の注意点

指定したファイルがすでにチェックアウトされている場合、そのファイルが含まれているチェンジリストを取得して処理するか、新規チェンジリストを作成して移動するかする必要があるかと思います。

P4 Mini Tool」ではそこまで面倒は見ないと決めて、すでにチェックアウトされているファイルは読み込めないようにして対処しちゃいました。

それから、ファイルに何も変更が無い場合にサブミットしない設定になっている場合、ただサブミットするだけだと例外が発生するので注意が必要です。