テクニカルノート026  


PERFORCEに使用されるフォームをカスタマイズする

問題

PERFORCEに使用されるフォームをカスタマイズするにはどうすればよいでしょうか。

解決策

注意:
 
リリース2004.2のPERFORCEサーバでは、もうこの対処法を使用する必要はありません。 その代わり、in トリガおよび out トリガを使用して、編集/表示の前に仕様の内容を変更することができます。 トリガに関して詳しくは、『PERFORCEシステム管理者ガイド』をご覧ください。

ユーザ入力を必要とするあらゆるPERFORCEコマンドによって、PERFORCEコマンドライン・クライアントは P4EDITOR環境変数、またはそれが定義されていない場合にはEDITOR環境変数で指定されたコマンドを実行します。 P4EDITORにより指定されたプログラムが、以下のことを実行するスクリプトであってはいけない理由は全くありません。

(任意) フォームの内容を調べ、さらに/またはフォームを変更します。
EDITOR環境変数で指定されたコマンドを実行します。
(任意) フォームの内容を調べ、さらに/またはフォームを変更します。


P4EDITORを使用すると(P4EDITORを各ユーザのログイン・スクリプトに設定する)、個人のエディタの プリファレンス設定に妨げられることがなく、ある程度強制力があります。しかし、P4Winはフォームの 更新のためにエディタを起動しないため、この仕組みはP4Winのユーザには効果がないことに注意してください。

最後の手順において、フォームを無効にするような変更が行われると、PERFORCEコマンドは成功しません。 この場合、PERFORCEクライアントではそのファイルに対してエディタを再度起動することになり、スクリプトが 再度実行されます。したがって、フォームの復元が容易であるようにフォームを変更することが重要です。 例えば、スクリプトが変更のコメントの入力内容を検証して、そのコメントが不適切であると判断した場合、 失敗/再編集を引き起こす良い方法は、有用なエラー・メッセージを出力した後に、"Description:" の行を "*Description: # fix this then delete the *" という行に変更することです。 そしてユーザがエラー・メッセージを確認した後、エディタに戻ると、問題がどこにあるかを示すコメントが示されます。

以下に示すサンプル・スクリプトはPerlで記述されており、この技法を使用して変更のコメントの標準的な様式を 強制する方法を示しています。(リリース99.1の時点で、サブミット済チェンジリストの検証はpre-submitトリガを 使ってより効果的に行えるようになったため、この例があまり重要ではなくなったことに注意してください。)


 
#!/usr/local/bin/perl -w
#
# This is a sample script to demonstrate a method to customize and/or validate
# forms with Perforce 97.3 and later.  This script examines a form after it
# is edited and forces re-entry if it is a change form with a change
# description which does not start with "Simon Says".
#
# As I said, it's a demo.
#
# Set P4EDITOR to the name of this script to have it run every time a user
# edits a form.  This is best done by setting the environment variable in
# everyone's login script.
#
# Note: this mechanism can be defeated by resetting P4EDITOR
# or by using the P4Win.


use Carp;
use strict;


# launch the editor
my $formfile = shift;


system("$ENV{EDITOR} $formfile");


# read the form
my %value=read_form("$formfile");


# verify the change description (if it's a change form)
if( defined($value{Change}) &&  # only a change form has a Change: entry
        defined($value{Description}) &&
$value{Description} !~ /^simon says/i ) {


print "You must start your change description with 'Simon Says' - try again.\n";


# change the form so that the p4 change or p4 submit will fail
  # but in such a way that the user can easily fix it


open(F,"$formfile");
my @form = ;


@form = map( (/^Description:/
                    ? "*Description: # fix the description then delete the *\n"
                     : $_) , @form);


open(F,">$formfile"); # now overwrite the form
  print F @form;
  close(F);
}




sub read_form # read a Perforce style form and return it as a hash
{
my $file = shift;
my (%hash,$current_keyword);


open(F,"<$file") or croak("can't open $file: $!");


while(<F>) {


  s/\s*#.*$//;  # kill comments and any whitespace preceding the comment


 if(/^$/) {    # empty line or line with just a comment


    undef($current_keyword);


     } elsif(substr($_,0,1) eq "\t") {


         croak("unrecognized line") if(!defined($current_keyword));
      s/^\t//;
        $hash{$current_keyword} .= $_;


       } elsif(/(.*?):\s*(.*)/) { # keyword is everything up to the *first* colon


      $hash{$current_keyword=$1} = $2;


      }
      
  }
close(F);
return %hash;
}
              


 
カスタム・フォームを表示したり、任意のフォーム上(p4 user、p4 clientなど)で有効なフィールドを 強制したりするために、このスクリプトをどのように変更できるかは容易にお分かりになるでしょう。 read_form サブルーチンは一般的に有用であることに注意してください。




 
戻る