Cm find の例


「cm find」

どのようなバージョン管理システムでも、使用状況に関する情報や変更されているファイルについての情報を取得したり、特定の変更や特定のブランチを単純に検索したりする必要が頻繁に生じます。

そのための最良の方法は、クエリを使用することです。そこで、Plastic SCM を作成するときに cm find と呼ばれる非常に強力なクエリシステムを追加しました。このコマンドを使用して、変更セット、ブランチ、ラベル、マージ、およびコードレビューに関する詳細な情報を取得できます。

find コマンドは GUI 内のビューのカスタマイズにも使用できます。

この記事では、cm find コマンドで対処できるいくつかのシナリオについて例を交えて説明します。それらは Plastic SCM でできることのごく一部です。それぞれの例には質問、解決の手順と予期される出力が含まれており、どのような種類の情報が返されるかを理解するのに役立ちます。

オブジェクトを検索する際には、単数形と複数形の両方を使用できます。たとえば、cm find branchcm find branches の両方を使用できます。

すべての cm find クエリで、大文字と小文字が区別されます。

コマンドラインから比較演算子(>、<、>=、<=)を使用してクエリを実行するときは、シェルがこれらの演算子を IO リダイレクトと見なすことを忘れないでください。
そのため、クエリを引用符で囲む必要があります。

cm find branches "where owner='pablo' and changesets >= '2013/03/01'"

Powershell に関する注意点

Powershell コンソールでは、「二重」引用符がデフォルトでエスケープされます(ただし「一重」引用符はエスケープされません)。そのため、もう 1 組の引用符を追加して、コマンド内で引用符が必要であることを示す必要があります。

cm find replicationlog where branch = "'/semanticmain'" --format="{date}" --nototal | select -Last 1

または、すべてのクエリを囲むこともできます。

cm find replicationlog "where branch = '/semanticmain'" --format="{date}" --nototal | select -Last 1

ブランチ

特定の日付よりも前にテストに合格したすべてのブランチを検索することはできますか?

特定の期間にユーザーによって作成されたブランチを取得してから、特定の属性でフィルタリングします。


すべてのブランチを検索する

使用可能なすべてのブランチの取得を開始します。

cm find branches 301186 09/01/2013 8:18:51 /main/Fix-4.1/SCM12154 borja codice T 378467 12/02/2013 12:43:24 /main/scm12336 violeta codice T 379892 12/02/2013 17:52:14 /main/scm12336/scm12013 pablo codice T 407817 22/04/2013 16:32:31 /main/scm12636/scm12666 pablo codice T 426648 29/05/2013 17:36:04 /main/scm12313 pablo codice T Total: 5

自分たちのブランチを検索する

必要なのは自分のブランチだけなので、ユーザーでフィルタリングします。

cm find branches "where owner='pablo'" 379892 12/02/2013 17:52:14 /main/scm12336/scm12013 pablo codice T 407817 22/04/2013 16:32:31 /main/scm12636/scm12666 pablo codice T 426648 29/05/2013 17:36:04 /main/scm12313 pablo codice T Total: 3

ブランチを日付で絞り込んで検索する

ユーザー別にフィルタリングした後は、このスプリントに関連するブランチのみが必要であるため、次のように特定の日付以降に作成されたブランチを探します。

cm find branches "where owner='pablo' and date >= '2013/03/01'" 407817 22/04/2013 16:32:31 /main/scm12636/scm12666 pablo codice T 426648 29/05/2013 17:36:04 /main/scm12313 pablo codice T Total: 2

次のように、形式化された出力を使用できます。

cm find branches "where owner='pablo' and date >= '2013/03/01'" --format="{name,-30} {date}" /main/scm12636/scm12666 22/04/2013 16:32:31 /main/scm12313 29/05/2013 17:36:04 Total: 2

ブランチを属性値で検索する

いよいよ、特定の属性を探します。内部の機能ライフサイクルに応じて、各ブランチがメインブランチに統合されるには事前にテストに合格する必要があります。

ブランチがテストに合格すると、"test" 属性が "passed" に設定されます。このため、属性名と属性値を使用してフィルタリングします。

cm find branches "where owner='pablo' and date >= '2012/01/01' and attribute ='test' and attrvalue = 'passed'" 426648 29/05/2013 17:36:04 /main/scm12313 pablo codice T Total: 1

フィルタリングと出力のオプション

次の表に、現在 cm find branch コマンドで使用できるさまざまなフィルタリングオプションを示します。

フィルタリングオプション(where...
attribute attrvalue changesets comment date guid
id item name owner parent repllogid
replsrcdate replsrcid replsrcrepository replsrcserver

* 条件 date は、ブランチビューの「作成日」列に対応しています。



定数を使用して日付でフィルタリングする方法を確認してください。



また、次の表に、現在 cm find branch コマンドで使用できるさまざまな出力オプションを示します。

出力オプション(--format...
comment date id name owner parent

変更セット


変更セットのコメント

チェックインで自分が記述したコメントを探すことができますか?このブランチのどこかにあることと、「solution」に関連していることは確かです。

変更セットについてたくさんの情報を見つけることができます。コメントはその中の 1 つにすぎません。すぐに情報を得るには、cm log を使用して独自のフィルタリング(シェルコマンドの使用)を実行するか、cm find を使用して操作を行うことができます。

このサンプルでは、あるブランチに属しているすべての変更セットについて日付とコメントを取得します。

cm find changeset "where branch = 'main/scm12800'" --format="{date} - {comment}" 27/05/2013 13:25:53 - Updated output. 27/05/2013 13:26:45 - Changed SccPlugin with the new change. 27/05/2013 13:35:15 - Added solution. Total: 3

ここにすべての変更セットが表示されており、「solution」という単語を探します。ここでは簡単に見つかりますが、数百の変更セットがある場合には時間がかかる面倒な作業です。特定の単語によるフィルタリングには、SQL 構文 LIKE および % を使用して近似値検索を行います。コメント全文を探しているわけではないためです。

cm find changeset "where branch = 'main/scm12800' and comment like '%solution%'" --format="{date} - {comment}" 27/05/2013 13:35:15 - Added solution. Total: 1

レプリケートされた変更セットを検索する

特定の日にレプリケートした変更セットを検索することはできますか?

次のコマンドを使用して、変更セットをレプリケーション日ごとに照会することもできます(最終レプリケーション日を取得する方法については、後ほど紹介します)。

cm find changeset "where branch='semanticmain' and replsrcdate > '2013/06/17'" --nototal 427425 16794 /semanticmain 07/06/2013 11:06:38 violeta codice IntegrateMiryamtask 12838 427435 16804 /semanticmain 07/06/2013 19:25:31 violeta codice Changeassemblyversion (0.9.28.0). 427436 16805 /semanticmain 07/06/2013 19:54:35 lrodriguez codice Updatemapall

「returnparent」フィールド

returnparent フィールドは何のために使用するのですか?

returnparent を使用すると、特定の変更セットやリビジョンの親を取得することができます。これで、その変更セットより前に何が起こったかを知りたい場合は、次のように照会することができます。

cm find changeset "where changesetid = 16583 and returnparent = 'true'" --nototal 423630 16582 /main/scm12800 27/05/2013 13:25:53 roberto codice Updated output.

フィルタリングと出力のオプション

次の表に、現在 cm find changeset コマンドで使用できるさまざまなフィルタリングオプションを示します。

フィルタリングオプション(where...
attribute attrvalue branch changesetid comment date
guid id owner parent repllogid replsrcdate
replsrcid replsrcrepository replsrcserver returnparent

* 条件 changesetiddateowner はそれぞれ、変更セットビューの「名前」、「作成日」、「作成者」列に対応しています。



定数を使用して日付でフィルタリングする方法を確認してください。



また、次の表に、現在 cm find changeset コマンドで使用できるさまざまな出力オプションを示します。

出力オプション(--format...
branch changesetid comment date guid id
owner parent

レプリケーションログ

特定のブランチの最後のレプリケーションがいつ行われたかを調べることはできますか?

ブランチを指定すると、期間の開始点以降のすべてのレプリケーション操作を時系列で取得できます。

cm find replicationlog "where branch = '/semanticmain'" --nototal 424089 03/06/2013 12:16:42 codice@diana:9095 F pablo 426718 17/06/2013 18:46:38 codice@diana:9095 F pablo 427606 17/06/2013 18:50:47 codice@diana:9095 F pablo

最後の日付のみが必要な場合は、Powershell または Bash を使用して検索結果を日付でフィルタリングし、最後の行を選択します。

Powershell:

cm find replicationlog "where branch = '/semanticmain'" --format="{date}" --nototal | select -Last 1

Bash:

cm find replicationlog "where branch = '/semanticmain'" --format="{date}" --nototal | tail -n 1

結果:

17/06/2013 18:50:47

フィルタリングと出力のオプション

次の表に、現在 cm find replicationlog コマンドで使用できるさまざまなフィルタリングオプションを示します。

フィルタリングオプション(where...
branch date id owner package repositoryname
server


定数を使用して日付でフィルタリングする方法を確認してください。



また、次の表に、現在 cm find replicationlog コマンドで使用できるさまざまな出力オプションを示します。

出力オプション(--format...
date id owner package server

ラベル


特定のブランチ内のラベルを検索する

特定のブランチ内のすべてのラベルを検索することはできますか?

すべてのラベルを取得するには、次のコマンドを使用できます。

cm find label --format="{name} {owner} {branch} {branchid}" --nototal on repository 'codice' BL234 lrodriguez /main 3 BL235 lrodriguez /main 3 BL236 lrodriguez /main/task001 4 BL237 lrodriguez /main 3 BL238 lrodriguez /main/task002 5 BL239 lrodriguez /main 3

また、特定のブランチで作成されたすべてのラベルを取得するには、次のコマンドを使用できます。

cm find label "where branch = '/main'" --format="{name} {owner}" --nototal on repository 'codice' BL234 lrodriguez BL235 lrodriguez BL237 lrodriguez BL239 lrodriguez

特定のラベルが付いたブランチを検索する

特定のラベルを含んだブランチを検索することはできますか?

codice で開発用のメインブランチを保持し、「Fix」ブランチで現在のバージョンと旧バージョンをサポートしている場合、特定のリリースを含んだブランチを検索するには、次のようにします。

cm find label "where name = 'BL237' on repository 'codice'" --nototal 191871 17/11/2011 16:38:06 BL237 10503 /main lrodriguez codice

ご覧のように、ラベル BL237main ブランチから取得されました。


2 つのラベル間の変更セットを検索する

2 つのラベルのうちどちらの変更セットが作成されたかわかるでしょうか?

ラベルの日付を取得して、後から、そのブランチでその期間に作成された変更セットを確認します。2 つ(以上)のラベルの情報を取得するのは簡単です。

cm find label "where name = 'BL237' or name='BL235' on repository 'codice'" --nototal 191869 11/11/2011 14:20:02 BL235 1750 /main lrodriguez codice 191871 17/11/2011 16:38:06 BL237 10503 /main lrodriguez codice

フィルタリングと出力のオプション

次の表に、現在 cm find label コマンドで使用できるさまざまなフィルタリングオプションを示します。

フィルタリングオプション(where...
attribute attrvalue branch branchid changeset comment
date guid id name owner repllogid
replsrcdate replsrcid replsrcrepository replsrcserver

* 条件 date は、ラベルビューの「作成日」列に対応しています。



定数を使用して日付でフィルタリングする方法を確認してください。



また、次の表に、現在 cm find label コマンドで使用できるさまざまな出力オプションを示します。

出力オプション(--format...
branch branchid changeset comment date id
name owner

属性


すべての属性を取得する

このブランチのすべての属性を取得できますか?

属性は、区別なく、ブランチ、変更セット、ラベルに対して適用できます。まず必要になるのはオブジェクト ID です。これは、ブランチに対してクエリを実行するときに ID を指定して取得できます。

cm find branch "where name = 'main'" --format="{id}" --nototal 3

取得したら、次のコマンドを使用して属性リストを取得できます。

cm find attributes "where srcobj = 3" --nototal objid:3@repid:2@repserver:localhost:8087 -- status --> PASSED

このケースでは、属性名は "status"、属性値は "Passed" です。

これら 2 つのコマンドを Powershell スクリプトを使用して結合できます。

cm find branch "where name = 'main'" --format="{id}" --nototal |Foreach-Object { cm find attributes where srcobj= $_ --nototal}

または、bash スクリプトを使用します。

for branch_id in 'cm find branch "where name = 'main'" --format="{id}" --nototal' ;do cm find attributes "where srcobj=$branch_id" --nototal; done

出力は前と同じです。

objid:3@repid:2@repserver:localhost:8087 -- status --> PASSED

次のクエリを実行しても、同じ出力が得られます。

cm find attributes "where srcobj='br:/main'" --nototal

特定の属性を持つすべてのオブジェクトを取得する

先月に属性が foo 、値が bar で適用されていた全オブジェクトを、すべて取得することは可能ですか?

いくつかのオブジェクトに特定の属性を設定したと仮定してみましょう(このケースではテストの "status")。含んでいるオブジェクトに関係なく、それらの属性に対してクエリを実行できます。

cm find attributes "where type = 'status' and value='PASSED' and date > 'this month'" objid:253012@repid:2@repserver:localhost:8087 -- status --> PASSED objid:253013@repid:2@repserver:localhost:8087 -- status --> PASSED objid:253014@repid:2@repserver:localhost:8087 -- status --> PASSED objid:268518@repid:2@repserver:localhost:8087 -- status --> PASSED

フィルタリングと出力のオプション

次の表に、現在 cm find attributes コマンドで使用できるさまざまなフィルタリングオプションを示します。

フィルタリングオプション(where...
comment date guid id owner srcobj
type value

* 条件 datetype はそれぞれ、属性ビューの「作成日」列と「名前」列に対応しています。



定数を使用して日付でフィルタリングする方法を確認してください。



また、次の表に、現在 cm find attributes コマンドで使用できるさまざまな出力オプションを示します。

出力オプション(--format...
comment date id owner type value

リビジョン


変更セット内の変更済みファイル

ある変更セットでどのファイルに変更が加えられているかを確認できますか?

前の例では特定の変更セットを取得しました。次は、その中で変更が加えられたファイルについて詳細を確認する必要がある場合があります。find revision はその目的で使用できます。

必要なのはファイルとフォルダーのパスのみであるため、カスタム形式を指定します。

cm find revisions "where changeset=16716" --format="{path}" d:\linked_replicated\ d:\linked_replicated\01nerva d:\linked_replicated\01nerva\src d:\linked_replicated\01nerva\src\client d:\linked_replicated\01nerva\src\client\plastic d:\linked_replicated\01nerva\src\client\plastic\libplasticTranslations.es.resx d:\linked_replicated\01nerva\src\client\plastic\libplasticTranslations.resx d:\linked_replicated\01nerva\src\client\plastic\ActionMenuManager.cs Total: 8

また、一部のコマンドラインヘルプ(Linux の場合は grep、Windows Powershell の場合は where)を使用して、フォルダー別にフィルター処理することもできます。

Powershell:

cm find revisions "where changeset=16716" --format="{path}" --nototal | where {$_ -match "client\\"}

Bash:

bcm find revisions "where changeset=15430" --format="{path}" --nototal | grep client\/

すると、出力は次のようになります。

d:\linked_replicated\01nerva\src\client\plastic d:\linked_replicated\01nerva\src\client\plastic\libplasticTranslations.es.resx d:\linked_replicated\01nerva\src\client\plastic\libplasticTranslations.resx d:\linked_replicated\01nerva\src\client\plastic\ActionMenuManager.cs

ブランチ内の変更済みフォルダー

あるブランチの内部で特定の期間中にフォルダー foo に変更が加えられているかどうかを確認することはできますか?

ブランチのリビジョン情報は、そのブランチの変更セットすべてを検索することでも取得できます。まず、次のようにあるブランチの特定の期間に変更が加えられたすべての項目を取得します。

cm find revisions "where branch = 'main/Fix-4.1/scm12814' and date<='2013/05/30' and date > '2013/05/28'" --format="{date} - {path}"

後でお気に入りのシェルツール(ここでは PowerShell)を使用して、その情報をフィルタリングできます。

cm find revisions "where branch = 'main/Fix-4.1/scm12814' and date<='2013/05/30' and date > '2013/05/28'" --format="{date} - {path}" | where {$_ -match "view\\"}

bash を使用する場合、行はこのようになります。

cm find revisions "where branch = 'main/Fix-4.1/scm12814' and date<='2013/05/30' and date > '2013/05/28'" --format="{date} - {path}" | grep view\/

予期される出力はこのようになります。

28/05/2013 12:35:18 - d:\linked_replicated\01nerva\src\client\plastic\view\releasediagram 28/05/2013 12:35:18 - d:\linked_replicated\01nerva\src\client\plastic\view\releasediagram\drawingStyles 28/05/2013 12:35:18 - d:\linked_replicated\01nerva\src\client\plastic\view\releasediagram\drawingStyles\BaseDrawingStyle.cs

フィルタリングと出力のオプション

次の表に、現在 cm find revisions コマンドで使用できるさまざまなフィルタリングオプションを示します。

フィルタリングオプション(where...
archived attribute attrvalue branch changeset date
guid id item itemid label marker
owner parent repllogid replsrcdate replsrcid replsrcrepository
replsrcserver returnparent size type workspacecheckoutid


定数を使用して日付でフィルタリングする方法を確認してください。



また、次の表に、現在 cm find revisions コマンドで使用できるさまざまな出力オプションを示します。

出力オプション(--format...
branch changeset date id item itemid
owner parent size type

マージ


ブランチが統合された場所

このブランチが統合された場所を取得することはできますか?

マージの場合はどうでしょう?特定のブランチや変更セットとの間で実行されたマージを追跡することは可能です。

ブランチがどこで統合されたかを知りたい場合は、次のコマンドを入力することができます。

cm find merge "where srcbranch ='main/Fix-4.1/SCM11769'" br:/main/Fix-4.1/SCM11769@55613 -->br:/main/Fix-4.1/Release-4.1.10.447@55808 Total: 1

特定のリリースで統合されたブランチ

リリース 4.1.10.447 で統合されたブランチを検索することはできますか?

特定のブランチに統合されるブランチを確認するためのコマンドを次に示します。

$ cm find merge "where dstbranch ='main/Fix-4.1/Release-4.1.10.447'" br:/main/Fix-4.1/SCM12835@55568 -->br:/main/Fix-4.1/Release-4.1.10.447@55801 br:/main/Fix-4.1/scm11898@55647 -->br:/main/Fix-4.1/Release-4.1.10.447@55802 br:/main/Fix-4.1/scm12839@55678 -->br:/main/Fix-4.1/Release-4.1.10.447@55803 br:/main/Fix-4.1/SCM11769@55613 -->br:/main/Fix-4.1/Release-4.1.10.447@55808 br:/main/Fix-4.1/SCM12860@55735 -->br:/main/Fix-4.1/Release-4.1.10.447@55809 Total: 5

上記のコマンドでは、format フラグを使用してブランチ名だけを返すことで、出力をカスタマイズすることもできます。たとえば、2 つ目のコマンドは次のようになります。

$ cm find merge "where dstbranch ='main/Fix-4.1/Release-4.1.10.447'" --format="{srcbranch}" --nototal br:/main/Fix-4.1/SCM12835 br:/main/Fix-4.1/scm11898 br:/main/Fix-4.1/scm12839 br:/main/scm12419 br:/main/SCM4052 br:/main/Fix-4.1/SCM11769 br:/main/Fix-4.1/SCM12860

または:

cm find merges "where dstbranch='br:/main/ReleaseBL274'" --format="{srcbranch}@{srcchangeset} --> {dstbranch}@{dstchangeset}({type})" --nototal br:/main/scm11148@43953 --> br:/main/ReleaseBL274@44094 (merge) br:/main/scm11181@43969 --> br:/main/ReleaseBL274@44096 (merge) br:/main/Fix-4.0/SCM11101@44010 --> br:/main/ReleaseBL274@44030 (merge) br:/main/scm11135@43980 --> br:/main/ReleaseBL274@44031 (merge) br:/main/ReleaseBL272@43914 --> br:/main/ReleaseBL274@44032 (cherrypick) br:/main/ReleaseBL268@43663 --> br:/main/ReleaseBL274@44033 (cherrypick) br:/main/scm10957@43952 --> br:/main/ReleaseBL274@44093 (merge) br:/main/SCM11195@43981 --> br:/main/ReleaseBL274@44095 (merge) br:/main/SCM10924@43942 --> br:/main/ReleaseBL274@44033 (merge)

find merge はすべての種類のマージ(通常のマージ、チェリーピックマージ、減法マージ)を返すことを忘れないでください。

そのため、特定のブランチへの間隔マージを取得できます。

cm find merges "where dstbranch='br:/main/Fix-4.1/ReleaseBL285' and type='intervalcherrypick'" --format="({basebranch}@{basechangeset}, {srcbranch}@{srcchangeset}] --> {dstbranch}@{dstchangeset}" --nototal (br:/main@44448, br:/main/scm11318@44461] --> br:/main/Fix-4.1/ReleaseBL285@44463

統合されていないブランチ

このスプリントで作成された、統合されていないブランチを調べることはできますか?

この質問には、2 つのクエリ(ブランチの検索、マージの検索)といくつかの Powershell ハッキングを使用して答えることができます。次のコードを PS1 ファイルに配置して、Powershell コンソールから実行します。

$allBranches = cm find branches "where date >= '2013/06/20'" --format="{name}" --nototal; $allMerged = cm find merge "where date >= '2013/06/20'" --format="{srcbranch}" --nototal; for($i = 0; $i -le $allBranches.length -1; $i++) {$allBranches[$i] = 'br:' + $allBranches[$i]} $allBranches| ?{$allMerged -notcontains $_}

サンプル出力は次のようになります。

br:/main/scm12619 br:/main/Fix-4.1/scm12916 br:/main/Fix-4.1/scm12899/scm12947 br:/main/Fix-4.1/scm11180 br:/main/Fix-4.1/scm8782 br:/main/Fix-4.1/scm12944 br:/semanticmain/SCM12759/scm12948

このコードは次のアクションを実行します。

  1. このスプリントからのすべてのブランチを検索します。
  2. このスプリントからのすべてのマージを検索し、ソースブランチのみを返します。
  3. $allbranches の出力の形式を変更して、両方のリストが同じ形式になるようにします。
  4. 「マージ」のリストに allBranches リストのブランチが含まれているかどうかを調べます。含まれていないブランチは、統合されていません。

これと同等の Bash のコードは次のようになります。

$ allBranches='cm find branches "where date >= '2013/06/20'" --format="{name}" --nototal' $ allMerged='cm find merge "where date >= '2013/06/20'" --format="{srcbranch}" --nototal' $ for branch in $allBranches; do [ ! 'echo $allMerged | grep 'br:$branch'' ] && print "br:$branch"; done

このコードは、次のことを実行します。

  1. このスプリントに属するすべてのブランチを検索します。
  2. このスプリントに属するすべてのマージを検索し、そのソースブランチのみを返します。
  3. このスプリントからの、マージ済みブランチのリストに存在しないすべてのブランチを出力します。

完全には統合されていないブランチ

完全に統合されていないブランチについて調べることは可能ですか?

次はこのシナリオについて確認します。

シナリオ

別のブランチへ統合されてしまっているもの(そのため、そのブランチへのマージは破棄する必要がある)の中で、統合保留中の変更セット(図中オレンジで示された変更セット)を保持しているブランチについて検索します。実はこれは、1 つのクエリと、後処理をちょっと Powershell コードを使うことで、できてしまいます。

$allMergedNonFiltered = cm find merge "where date >= '2013/06/01'" --format="{srcbranch} {dstbranch} {srcchangeset}" --nototal; $allMerged = $allMergedNonFiltered | ForEach-Object {$res = $_.Split(" "); if($res[0] -ne $res[1]) {$res[0] + " " + $res[2]} }; $semiMerged = $allMerged | ForEach-Object {$_.Split(" ")[0] }; $allBranches = cm find branches where "date >= '2013/06/01'" --format="{name} {changeset}" --nototal; for($i = 0; $i -le $allBranches.length -1; $i++) {$allBranches[$i] = 'br:' + $allBranches[$i]} $allBranches| ?{$allMerged -notcontains $_ -and $semiMerged -contains $_.Split(" ")[0]}

サンプル出力は次のようになります。

br:/main/Fix-4.1/scm12861 56049 br:/main/Fix-4.1/SCM12817 56300 br:/main/Fix-4.1/scm12899 56270

このコードは次のアクションを実行します。

  1. 特定の日付より後に実行されたすべてのマージとソース変更セットを取得します。
  2. 同じマージ元とマージ先を持つマージをフィルタリングします。
  3. すでにマージされているものを破棄するために、そのマージのみを含むリストを取得します。
  4. find branches の出力の形式を変更して、find merge と同じ形式にします。
  5. 比較して、その期間にマージされているものの、マージが保留中の変更セットを含んでいるブランチをフィルタリングします。

Bash を使用している場合は、次のコードを代わりに使用します。

$ cm find merge "where date >= '2013/06/01'" --format="{srcbranch}#{dstbranch}#{srcchangeset}" --nototal |awk -F "#" '{if($1 != $2) print $1 "#" $3}' | tee allMerges | cut -d'#' -f1 | sort -u > mergedBranches $ for branch in 'cm find branches where "date >= '2013/06/01'" --format="br:{name}#{changeset}" --nototal;'; do [ ! "'grep $branch allMerges'" ] && [ "'echo $branch | grep -f mergedBranches'" ] && echo $branch; done $ rm allMerges mergedBranches

ここで行っていることを整理してみましょう。

  1. 特定の日付より後に実行された全マージを、ソース変更セットを示した上でファイルに書き込みます。同時に、すべてのマージ元ブランチを別のファイルに書き込みます。
  2. 既存のすべてのブランチをブランチ名と変更セットで反復処理して、1 番目のファイル(マージ元のブランチと変更セット)に含まれていないが 2 番目のファイルには含まれているブランチ(つまり、マージ保留中の変更セットがあるブランチ)のみを出力します。
  3. 最後に、一時ファイルを削除します。

このリリースで統合されたブランチ

このリリースで(直接または間接的に)統合されたブランチを調べることはできますか?

次はこのシナリオについて確認します。

シナリオ

バージョン 1.0 に(直接または間接的に)統合されたブランチを調べる必要があります。前述のとおり、必要なのはサーバーに対する 1 つのクエリと、データをフィルター処理するための PowerShell のみです。この例では、/main に統合されたすべてのブランチを取得します。

function ListAll($list, $visited, $targetBranch, $depth) { $visited += $targetBranch; $list | ForEach-Object { $res = $_.Split(" "); if(($res[1] -eq $targetBranch) -and ($visited -notcontains $res[0])) { Write-Host $depth $res[0]; $visited += $res[0]; $temp_visited = ListAll $list $visited $res[0] ($depth + "-"); $temp_visited | ForEach-Object{ if($visited -notcontains $_) { $visited += $_; } } } } return $visited; } $targetBranch = "br:/main"; $allMergedNonFiltered = cm find merge "where date >= '2013/01/01'" --format="{srcbranch} {dstbranch}" --nototal; $allMerged = $allMergedNonFiltered | ForEach-Object {$res =$_.Split(" "); if($res[0] -ne $res[1]) {$res[0] + " " + $res[1]} } $visited = @(); $targetBranch ListAll $allMerged $visited $targetBranch "-" | Out-Null;

サンプル出力は次のようになります。ブランチ 12299 がリリース 4.3.39.406 に間接的に統合されたことがわかります。

br:/main br:/main/Release-4.2.29.406 br:/main/SCM12356 br:/main/scm12238 br:/main/Release-4.2.28.387/SCM12169/scm12230 br:/main/SCM12243/scm12280/scm12277/scm12293 br:/main/scm12238/scm12299

このスクリプトの簡単な説明を次に示します。

  1. 前述の手順と同様に、リストを取得して重複を削除します。
  2. ターゲットブランチ(空の visited リスト)と深度を表示するためのマーカーを指定して ListAll 関数を呼び出します。この関数の出力は null に送られます(この値をコードで使用しないため)。それ以外の場合は、出力が表示されます。
  3. ListAll 関数の内部で、ターゲットの期間に一致するマージの検索を試行します。
  4. 一致する場合、その項目を visited リストに追加し、日時とマージ元を指定して ListAll を再帰的に呼び出します。
  5. 再帰関数が戻ったら、関数の戻り値に基づいて visited リストを更新します。

次のスクリプトを使用すると、これと同等の処理を Bash で行うことができます。

cm find merge "where date >= '2013/01/01'" --format="{srcbranch}#{dstbranch}" --nototal | awk -F "#" '{if($1 != $2) print $1 "#" $2}' > list touch old_targets touch next_targets echo "br:/main" | tee targets depth=">" while [ -s targets ]; do for merge in 'grep -f targets list'; do src_branch=${merge%#*} was_already_target="'grep ${src_branch} old_targets 2>/dev/null'" already_on_next_targets="'grep ${src_branch} next_targets 2>/dev/null'" if [ ! "$was_already_target" ] && [ ! "$already_on_next_targets" ]; then echo ${src_branch} >> next_targets echo ${depth}${src_branch} fi done depth="-${depth}" cat targets >> old_targets [ -s next_targets ] && mv next_targets targets || rm -f targets done rm -f list old_targets

このスクリプトの簡単な説明を次に示します。

  1. マージのリストを取得し、重複エントリを削除して、ファイルに保存します。
  2. 次に示す 2 つの補助ファイルを準備します。
    1. old_targets:検索するターゲットブランチをすべて保存します。
    2. targets:ソースを検索するターゲットブランチが格納されます。
  3. 次に、ターゲットブランチがリストファイルに同期先として存在するかどうかを確認します。存在する場合は、次回の処理用にマージ元のブランチを格納します(以前に影響がなかった場合)。また、結果を画面に出力します。
  4. 深度レベルを増やし、ターゲットリストを切り替えます。新しいターゲットリストが現在のターゲットリストになり、現在のリストが「使用済み」リストに追加されます。
  5. 最後に、クリーンアップ操作を実行します。環境は元の状態のまま維持されます。

フィルタリングと出力のオプション

次の表に、現在 cm find merge コマンドで使用できるさまざまなフィルタリングオプションを示します。

フィルタリングオプション(where...
date dstbranch dstchangeset guid id owner
srcbranch srcchangeset type


定数を使用して日付でフィルタリングする方法を確認してください。



また、次の表に、現在 cm find merge コマンドで使用できるさまざまな出力オプションを示します。

出力オプション(--format...
date dstbranch dstchangeset id owner srcbranch
srcchangeset type

コードレビュー

自分に割り当てられた、終了していないレビューを取得することはできますか?

統合されたコードレビュー機能を使用すると、レビューのステータスに関する情報を取得できます。このサンプルではまず、自分のレビュー(文字どおり 'me' に割り当てられたレビュー。'me' は現在のユーザー)を取得します。前に行ったようにユーザーの名前を入力することもできます。

cm find reviews "where assignee = 'me'" 399982 08/03/2013 10:43:30 danipen Status1 pablo "scm12563" Branch id:399570 419067 20/05/2013 9:59:49 asalim Status0 pablo "scm12411" Branch id:416824 8424078 29/05/2013 14:50:35 borja Status1 pablo "Review scm12816" Branch id:424073 425830 05/06/2013 17:04:37 jesusmg Status0 pablo "Review scm11179" Branch id:413120 426717 14/06/2013 14:01:14 roberto Status1 pablo "Code review 1" Branch id:426648 Total: 5

その後、特定のステータス(1 = 承認済み)を持つレビューに結果を絞り込むことができます。

cm find reviews "where assignee = 'me' and status = 1" 399982 08/03/2013 10:43:30 danipen Status1 pablo "scm12563" Branch id:399570 8424078 29/05/2013 14:50:35 borja Status1 pablo "Review scm12816" Branch id:424073 426717 14/06/2013 14:01:14 roberto Status1 pablo "Code review 1" Branch id:426648 Total: 3

最後に、特定の期間内に行われたレビューを取得します。

cm find "review where assignee = 'me' and date > '2013/05/01' and date < '2013/06/29'" 419067 20/05/2013 9:59:49 asalim Status0 pablo "scm12411" Branch id:416824 8424078 29/05/2013 14:50:35 borja Status1 pablo "Review scm12816" Branch id:424073 425830 05/06/2013 17:04:37 jesusmg Status0 pablo "Review scm11179" Branch id:413120 426717 14/06/2013 14:01:14 roberto Status1 pablo "Code review 1" Branch id:426648 Total: 4

それを、この特定の期間とこの特定の条件を指定した結果と比較してみましょう。

cm find "review where assignee = 'me' and date > '2013/06/14' and date < '2013/06/15' and status = 1" 8424078 29/05/2013 14:50:35 borja Status1 pablo "Review scm12816" Branch id:424073 426717 14/06/2013 14:01:14 roberto Status1 pablo "Code review 1" Branch id: 426648 Total: 2
注:これまでの章で見てきたように、各コマンドの末尾にある Total 値は --nototal オプションを使用すると省略できます。

これらの 2 つのクエリにより、このスプリント上のすべてのレビューに対する承認済みレビューの割合を調べることができます。

上の例では日付を特定の値に設定しましたが、"yesterday" や "3 months ago" を使用することもできます。これは、現在の日付を基準とした期間を調べたい場合に非常に便利です。

cm find "review where assignee = 'me' and date >= '4 days ago' and status = 1" 8424078 29/05/2013 14:50:35 borja Status1 pablo "Review scm12816" Branch id:424073 Total: 1

フィルタリングと出力のオプション

次の表に、現在 cm find review コマンドで使用できるさまざまなフィルタリングオプションを示します。

フィルタリングオプション(where...
assignee comment date guid id owner
status targetid

* 条件 datetargetid はそれぞれ、「コードレビュー」ビューの「作成日」列と「レビュー済みオブジェクト」列に対応しています。



定数を使用して日付でフィルタリングする方法を確認してください。



また、次の表に、現在 cm find review コマンドで使用できるさまざまな出力オプションを示します。

出力オプション(--format...
assignee date id owner status target
targettype title

シェルブ

自分以外の作業者によって作成されたシェルブを検索することはできますか?

昨年中に自分のチームメンバーによって作成されたシェルブを取得するには、次のコマンドを使用できます。

cm find shelve "where owner != 'me' and date >= '1 years ago'" 3848 2 04/10/2018 5:58:22 PM pablo doom3code Shelve - temporary compilation.txt file 3860 3 06/23/2018 11:08:06 PM pablo doom3code Shelve - test with a new configuration Total: 2

フィルタリングと出力のオプション

次の表に、現在 cm find shelve コマンドで使用できるさまざまなフィルタリングオプションを示します。

フィルタリングオプション(where...
owner date attribute attrvalue comment guid
parent shelveid id


定数を使用して日付でフィルタリングする方法を確認してください。



また、次の表に、現在 cm find shelve コマンドで使用できるさまざまな出力オプションを示します。

出力オプション(--format...
id shelveid date owner repository comment

出力と後処理のオプション

この記事では出力をカスタマイズする方法を見てきましたが、出力を XML として設定し、後で分析するためにファイルに保存することもできます。そのためには、次のコマンドを実行します。

cm find revisions "where changeset=16716" --xml --file=output.xml

これにより、次の XML コンテンツが生成されます。

<?xml version="1.0" encoding="utf-8" ?>
<PLASTICQUERY>
  <REVISION>
    <ID>426098</ID>
    <COMMENT></COMMENT>
    <DATE>07/06/2013 16:00:09</DATE>
    <OWNER>roberto</OWNER>
    <TYPE>dir</TYPE>
    <SIZE>0</SIZE>
    <CHANGESET>16716</CHANGESET>
    <PARENT>426069</PARENT>
    <ITEM>d:\linked_replicated\</ITEM>
    <ITEMID>2</ITEMID>
    <BRANCH>br:/main/Fix-4.1/scm12863</BRANCH>
    <PATH>d:\linked_replicated\</PATH>
    <REPOSITORY>codice</REPOSITORY>
    <REPNAME>codice</REPNAME>
    <REPSERVER>localhost:8087</REPSERVER>
    <HASH>kWJO1fm+7RCiZZcgSjM4/Q==</HASH>
  </REVISION>
  <REVISION>
    <ID>426092</ID>
    <COMMENT></COMMENT>
    <DATE>07/06/2013 16:00:09</DATE>
    <OWNER>roberto</OWNER>
    <TYPE>txt</TYPE>
    <SIZE>78238</SIZE>
    <CHANGESET>16716</CHANGESET>
    <PARENT>426056</PARENT>
    <ITEM>d:\linked_replicated\01nerva\src\client\plastic\ActionMenuManager.cs</ITEM>
    <ITEMID>37736</ITEMID>
    <BRANCH>br:/main/Fix-4.1/scm12863</BRANCH>
    <PATH>d:\linked_replicated\01nerva\src\client\plastic\ActionMenuManager.cs</PATH>
    <REPOSITORY>codice</REPOSITORY>
    <REPNAME>codice</REPNAME>
    <REPSERVER>localhost:8087</REPSERVER>
    <HASH>FXmLNV7B9Et1wTGqULWpgQ==</HASH>
  </REVISION>
</PLASTICQUERY>
  

このコンテンツを後で Excel などのツールにインポートして、そこから美しい方法で統計を表示できます。


統計

リポジトリ内のすべての変更セットに関する情報を取得する必要があるとします。その場合は次のコマンドを実行します。

cm find changeset --xml --file=output.xml

その後、出力を Excel にロードします。結果は次のようになります。

出力

Excel にはピボットテーブルと呼ばれる非常に便利なユーティリティが含まれており、これを使用してより詳細な統計情報を取得できます。

ピボットテーブル

Excel で提供されているフィルタリング機能と並べ替え機能を使用して変更セットをユーザーでグループ化し、それらの統計情報をグラフに変換することができます。

グラフ

ブランチでグループ化することも可能です。ブランチでグループ化して、共同作成を行ったユーザーの数と、各ユーザーによって作成された変更セットの数をブランチごとに表示することができます。

グループ


構文規則

find コマンドでは各オブジェクトに対してデフォルトの出力がありますが、これまで見てきたように、カスタムの出力オプションを定義し、--xml 属性を使用して結果を XML 形式で取得したうえで、--file 属性を使用して結果を後で分析するためにファイルに保存することができます。

一般的な構文を以下に示します。

cm find object "[where conditions] [on repositories]" [options]

ここで:

  • object には、ブランチ、属性、変更セット、ラベル、マージ、レビュー、リビジョン、ユーザーなど、システム内のほぼすべてのオブジェクトを指定できます。
  • conditions はオブジェクトによって異なります。コマンド cm showfindobjects を入力すると、条件(および使用可能なすべてのオブジェクト)を取得できます。
  • on repositories 引数は、1 つ以上のリポジトリから、現在のワークスペースに一致するかまたは一致しない情報を取得するために使用できます。任意のフォルダー(ワークスペース内、別のワークスペース内、またはワークスペースを含まないフォルダー内)に移動して、次のように入力できます。 cm find revisions "where branch = 'main/scm12800' on repositories 'codice@localhost:8087'" --nototal 423620 27/05/2013 13:25:53 dirRoberto d:\linked_replicated\#br:/main/scm12800#16582 423621 27/05/2013 13:25:53 dirRoberto d:\linked_replicated\01nerva#br:/main/scm12800#16582 423622 27/05/2013 13:25:53 dirRoberto d:\linked_replicated\01nerva\src#br:/main/scm12800#16582

    これは、ユーザーにそのリポジトリをクエリするための権限があれば機能します。

    さまざまなリポジトリだけでなく、さまざまなサーバーからもまとめてクエリできます。次に例を示します。

    cm find "changesets where date >= '2017/11/17' on repositories 'documentation/plasticdocu@localhost:8087','codice@codice@cloud'" --nototal 68621 1451 /main/scm21135 11/20/2017 3:32:31 PM maria documentation/plasticdocu Added documentation about the EOL conversion mechanism. 4821759 132324 /main/SCM21120 11/20/2017 1:41:45 PM pablo codice Added missing config file 4821840 132326 /main/scm21149/scm21150 11/20/2017 1:54:35 PM vsanchezm@codicesoftware.com codice Fix HAL FAILED - Conflicts and user intervention required. Rebase from main. 4821941 132333 /main 11/20/2017 2:38:28 PM hal codice HAL: merged /main/scm21076/scm21084/scm21093 : GTK Gluon: add pending changes view
  • options では、前に説明した出力オプション(--format--xml、または --file)を指定できます。

日付定数

日付でフィルタリングするときは、お使いのマシンのローカライズ設定に従った日付形式を使用できます。たとえば、お使いのコンピューターで日付が「yyyy-MM-dd」の形式で表示される場合、クエリで「2019-12-31」のような日付を使用できます。

クエリを簡単にするために、次の定数を使用することもできます。

  • 'today':今日の日付。
  • yesterday':昨日の日付。
  • this week':今週の月曜日の日付。
  • this month':今月の 1 日の日付。
  • this year':今年の 1 月 1 日の日付。
  • one day ago':現在の日付の 1 日前。
  • one week ago':現在の日付の 7 日前。
  • one month ago':現在の日付の 1 か月前。
  • n days ago':現在の日付の「n」日前。
  • n months ago':現在の日付の「n」か月前。
  • n years ago':現在の日付の「n」年前。

次の「where」句は、タイプ「date」のフィールドで有効です。

  • (...) where date > 'today' (...)
  • (...) where date < 'yesterday' (...)
  • (...) where date > 'this week' (...)
  • (...) where date > 'this month' (...)
  • (...) where date < 'one day ago' and date > '3 days ago' (...)
  • (...) where date < 'one week ago' and date > '3 weeks ago' (...)
  • (...) where date < 'one month ago' and date > '3 months ago' (...)
  • (...) where date > '1 year ago' (...)

最終更新

2019 年 12 月 10 日
  • cm find の一部の例を、不足している二重引用符を追加して修正しました。
  • 2018 年 12 月 7 日
  • いくつかの新しい例を追加しました。
  • シェルブを検索する方法をご確認ください。
  • 日付でフィルタリングするときに日付定数を使用できます。
  • 2017 年 11 月 20 日
  • on repositories 引数を使用して 1 つ以上のリポジトリからクエリする方法をご確認ください。
  • 2014 年 7 月 1 日
  • 公開日。