Cm find の例
「cm find」
どのようなバージョン管理システムでも、使用状況に関する情報や変更されているファイルについての情報を取得したり、特定の変更や特定のブランチを単純に検索したりする必要が頻繁に生じます。
そのための最良の方法は、クエリを使用することです。そこで、Plastic SCM を作成するときに cm find と呼ばれる非常に強力なクエリシステムを追加しました。このコマンドを使用して、変更セット、ブランチ、ラベル、マージ、およびコードレビューに関する詳細な情報を取得できます。
find コマンドは GUI 内のビューのカスタマイズにも使用できます。
この記事では、cm find コマンドで対処できるいくつかのシナリオについて例を交えて説明します。それらは Plastic SCM でできることのごく一部です。それぞれの例には質問、解決の手順と予期される出力が含まれており、どのような種類の情報が返されるかを理解するのに役立ちます。
注
オブジェクトを検索する際には、単数形と複数形の両方を使用できます。たとえば、cm find branch と cm 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 |
定数を使用して日付でフィルタリングする方法を確認してください。
また、次の表に、現在 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 |
定数を使用して日付でフィルタリングする方法を確認してください。
また、次の表に、現在 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
ご覧のように、ラベル BL237 は main ブランチから取得されました。
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 |
定数を使用して日付でフィルタリングする方法を確認してください。
また、次の表に、現在 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 |
定数を使用して日付でフィルタリングする方法を確認してください。
また、次の表に、現在 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
このコードは次のアクションを実行します。
- このスプリントからのすべてのブランチを検索します。
- このスプリントからのすべてのマージを検索し、ソースブランチのみを返します。
- $allbranches の出力の形式を変更して、両方のリストが同じ形式になるようにします。
- 「マージ」のリストに 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 つのクエリと、後処理をちょっと 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
このコードは次のアクションを実行します。
- 特定の日付より後に実行されたすべてのマージとソース変更セットを取得します。
- 同じマージ元とマージ先を持つマージをフィルタリングします。
- すでにマージされているものを破棄するために、そのマージのみを含むリストを取得します。
- find branches の出力の形式を変更して、find merge と同じ形式にします。
- 比較して、その期間にマージされているものの、マージが保留中の変更セットを含んでいるブランチをフィルタリングします。
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.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
このスクリプトの簡単な説明を次に示します。
- 前述の手順と同様に、リストを取得して重複を削除します。
- ターゲットブランチ(空の visited リスト)と深度を表示するためのマーカーを指定して ListAll 関数を呼び出します。この関数の出力は null に送られます(この値をコードで使用しないため)。それ以外の場合は、出力が表示されます。
- ListAll 関数の内部で、ターゲットの期間に一致するマージの検索を試行します。
- 一致する場合、その項目を visited リストに追加し、日時とマージ元を指定して ListAll を再帰的に呼び出します。
- 再帰関数が戻ったら、関数の戻り値に基づいて 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
このスクリプトの簡単な説明を次に示します。
- マージのリストを取得し、重複エントリを削除して、ファイルに保存します。
- 次に示す 2 つの補助ファイルを準備します。
- old_targets:検索するターゲットブランチをすべて保存します。
- targets:ソースを検索するターゲットブランチが格納されます。
- 次に、ターゲットブランチがリストファイルに同期先として存在するかどうかを確認します。存在する場合は、次回の処理用にマージ元のブランチを格納します(以前に影響がなかった場合)。また、結果を画面に出力します。
- 深度レベルを増やし、ターゲットリストを切り替えます。新しいターゲットリストが現在のターゲットリストになり、現在のリストが「使用済み」リストに追加されます。
- 最後に、クリーンアップ操作を実行します。環境は元の状態のまま維持されます。
フィルタリングと出力のオプション
次の表に、現在 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 |
定数を使用して日付でフィルタリングする方法を確認してください。
また、次の表に、現在 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]
ここで:
日付定数
日付でフィルタリングするときは、お使いのマシンのローカライズ設定に従った日付形式を使用できます。たとえば、お使いのコンピューターで日付が「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 日
公開日。