どのようなバージョン管理システムでも、使用状況に関する情報や変更されているファイルについての情報を取得したり、特定の変更や特定のブランチを単純に検索したりする必要が頻繁に生じます。
そのための最良の方法は、クエリを使用することです。そこで、Plastic SCM を作成するときに cm find と呼ばれる非常に強力なクエリシステムを追加しました。このコマンドを使用して、変更セット、ブランチ、ラベル、マージ、およびコードレビューに関する詳細な情報を取得できます。
find コマンドは GUI 内のビューのカスタマイズにも使用できます。
この記事では、cm find コマンドで対処できるいくつかのシナリオについて例を交えて説明します。それらは Plastic SCM でできることのごく一部です。それぞれの例には質問、解決の手順と予期される出力が含まれており、どのような種類の情報が返されるかを理解するのに役立ちます。
注
オブジェクトを検索する際には、単数形と複数形の両方を使用できます。たとえば、cm find branch と cm find branches の両方を使用できます。
注
すべての cm find クエリで、大文字と小文字が区別されます。
注
コマンドラインから比較演算子(>、<、>=、<=)を使用してクエリを実行するときは、シェルがこれらの演算子を IO リダイレクトと見なすことを忘れないでください。
そのため、クエリを引用符で囲む必要があります。
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 |
変更セットについてたくさんの情報を見つけることができます。コメントはその中の 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 Updatemapallreturnparent を使用すると、特定の変更セットやリビジョンの親を取得することができます。これで、その変更セットより前に何が起こったかを知りたい場合は、次のように照会することができます。
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 |
* 条件 changesetid、date、owner はそれぞれ、変更セットビューの「名前」、「作成日」、「作成者」列に対応しています。
定数を使用して日付でフィルタリングする方法を確認してください。
また、次の表に、現在 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 1Bash:
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 lrodriguezcodice で開発用のメインブランチを保持し、「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 つ(以上)のラベルの情報を取得するのは簡単です。
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いくつかのオブジェクトに特定の属性を設定したと仮定してみましょう(このケースではテストの "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 |
* 条件 date と type はそれぞれ、属性ビューの「作成日」列と「名前」列に対応しています。
定数を使用して日付でフィルタリングする方法を確認してください。
また、次の表に、現在 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ブランチのリビジョン情報は、そのブランチの変更セットすべてを検索することでも取得できます。まず、次のようにあるブランチの特定の期間に変更が加えられたすべての項目を取得します。
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特定のブランチに統合されるブランチを確認するためのコマンドを次に示します。
$ 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このコードは次のアクションを実行します。
これと同等の 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このコードは次のアクションを実行します。
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.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このスクリプトの簡単な説明を次に示します。
次のスクリプトを使用すると、これと同等の処理を 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このスクリプトの簡単な説明を次に示します。
次の表に、現在 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これらの 2 つのクエリにより、このスプリント上のすべてのレビューに対する承認済みレビューの割合を調べることができます。
次の表に、現在 cm find review コマンドで使用できるさまざまなフィルタリングオプションを示します。
フィルタリングオプション(where...) | |||||
---|---|---|---|---|---|
assignee | comment | date | guid | id | owner |
status | targetid |
* 条件 date と 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]ここで:
これは、ユーザーにそのリポジトリをクエリするための権限があれば機能します。
さまざまなリポジトリだけでなく、さまざまなサーバーからもまとめてクエリできます。次に例を示します。
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日付でフィルタリングするときは、お使いのマシンのローカライズ設定に従った日付形式を使用できます。たとえば、お使いのコンピューターで日付が「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」のフィールドで有効です。