Subversionのstatusコマンドの頭文字によって一括処理を行う

今回は Subversion で特定のステータスのファイルを一括で add したり delete する方法を紹介します。

?ステータス(リポジトリ未登録状態)を一括でAステータス(リポジトリ追加予約状態)にしたり、
!ステータス(ファイル行方不明状態)を一括でDステータス(リポジトリ削除予約状態)にしたりするとき、
楽にできないかなあって思ったので調べてみました。

一括で追加するのは簡単!

?ステータスのファイルを一括で再帰的に追加するのは add コマンドのオプションで簡単に出来ます。

$ svn add * --force

force オプションがポイントです。

一回のコマンドで複数のファイルを処理したい場合

svn コマンドは基本的にスペース区切りで対象のファイルを網羅することでできます。

例えばまとめて2つのファイルを削除したい場合は以下の様に行えます。

$ svn delete lib/model/doctrine/Example.class.php\
lib/model/doctrine/ExampleTable.class.php

同じように commit, add, revert などのコマンドでもスペース区切りで一度に複数のファイルを指定することが出来ます。

更に楽して一括削除する方法

ファイル数が多くなってくると、上に書いた方法も厳しくなってきますよね。コマンドが長くなりミスする原因にもなります。

そこで svn status コマンドと grep コマンドを組み合わせて一発で処理してみます。

まず、処理対象のファイルを確認します。ステータス表示の出力のうち「!」から始まる行を抽出しています。

$ svn status | grep '^!'
! lib/model/doctrine/Example.class.php
! lib/model/doctrine/ExampleTable.class.php

次に、以下のコマンドで!ステータスのファイルを全て削除予約します。先ほどの grep の抽出結果に対して、更にパイプで削除コマンドを適用しています。

$ svn status | grep '^!' | awk '{print $2}' | xargs svn delete
$ svn status
D lib/model/doctrine/Example.class.php
D lib/model/doctrine/ExampleTable.class.php

この状態でコミットすると削除が反映されます。

grep の組み合わせでここまでできるんですね。

便利便利。もうバージョン管理ツール無しじゃ生きていけなくなってきています。

編集履歴

  • 2012/03/10: 遠まわしなやり方でサンプルコマンドを書いていた箇所があったため、内容を一部修正しました。
  • 2013/10/02: コメントで全ての変更を取り消すより簡単な方法について情報を頂いたので記事を修正しました。ありがとうございますm(_ _)m
  • 2016/04/28: 内容を全体的に修正しました。

Symfonyで2つのフォーム値が同じかどうかを比較するバリデート

フォームで2つの入力値が同じ入力値か判定したい場面って結構あると思います。例えば確認用パスワードでの再入力や、メールアドレスの再入力など。

せっかくフレームワークを使っているので、SymfonyのsfFormで利用できるバリデート機能でチェックしたほうが良いと思います。

sfValidatorSchemaCompareクラスの利用

今回はsfValidatorSchemaCompareというクラスを用います。こちらのバリデーションクラスでは2つのフィールドにまたがって値の比較を柔軟に行えます。例えば入力項目Aより入力項目Bの値のほうが小さいかなどというチェックもできます。

サンプルコードと解説

class RegisterForm extends sfForm
{
    public function configure()
    {
        $this->setWidgets(
            array(
                'password' => new sfWidgetFormInputPassword(
                    array('label' => 'パスワード')
                ),
                'again_password' => new sfWidgetFormInputPassword(
                    array('label' => '確認用パスワード')
                )
            )
        );

        $this->setValidators(
            array(
                'password' => new sfValidatorString(
                    array('required' => true)
                ),
                'again_password' => new sfValidatorString(
                    array('required' => true)
                )
            )
        );
 
        $this->validatorSchema->setPostValidator(
            new sfValidatorSchemaCompare(
                'again_password',
                '==',
                'password',
                array('throw_global_error'=> false),
                array('invalid'=> '確認用パスワードが一致していません')
            )
        );
    }
}

passwordフィールドとagain_passwordフィールドが同一かどうかをチェックしています。
比較したい二つのフィールド名の引数の間に比較演算子となっており、普段の式のように直感的に書ける引数構成だと思います。

again_password == password

sfValidatorSchemaCompareコンストラクタの引数の仕様

symfony Forms in Action | 付録 B – バリデータ | symfony | Web PHP Framework

sfValidatorSchemaCompare($left_field, $operator, $right_field, $throw_global_error)

第二引数$operatorについての詳細について以下引用です。

利用可能な演算子の一覧は次のとおりです。

  • sfValidatorSchemaCompare::EQUAL もしくは ==
  • sfValidatorSchemaCompare::IDENTICAL もしくは ===
  • sfValidatorSchemaCompare::NOT_EQUAL もしくは !=
  • sfValidatorSchemaCompare::NOT_IDENTICAL もしくは !==
  • sfValidatorSchemaCompare::LESS_THAN もしくは <
  • sfValidatorSchemaCompare::LESS_THAN_EQUAL もしくは <=
  • sfValidatorSchemaCompare::GREATER_THAN もしくは >
  • sfValidatorSchemaCompare::GREATER_THAN_EQUAL もしくは >=

throw_global_error引数をtrueとするとGlobal errorとして投げられます。
falseとするとnamed errorが左側のフィールドにNamed errorが投げられます(デフォルトの挙動)

  • Named error – 単一フィールドに対するエラー
  • Global error – 複数フィールドにまたがる、フォーム共通のエラー

しばらくはSymfonyの開発実践をしながら勉強の日々が続きそうです。
さーがんばろう。

テーブルタグのborder罫線がいつの間に消えた!?

HTML+CSSの見た目の調整をしていたら、
テーブルタグの罫線が出てこなくなって困りました。

あれ、前は見えていたのに…。

CSSのborder-width周りをいじってみたり、
paddingをいじってみたりしても、出たり出て来なかったり。

んで、しばらく苦戦して解決。

原因はブラウザのページ拡大/縮小でした。
原寸の100%ズームに戻したところ、しっかり罫線が出てきました。

Firefoxのズーム機能で罫線が消えたように見えていただけみたいです。
脱力orz

なんかの拍子でページサイズが縮小されていたみたいですね。

初歩的な所でハマってしまいました。
自分みたいなドジっ子は他にいないかもしれないですがお気をつけを。