なか日記

一度きりの人生、楽しく生きよう。

サーバにあるファイルをコピーしてSubversionにコミットするスクリプト

だめ出しされるのを期待して(?)公開します。

目的

ファイルサーバを使って、原始的な方法*1で管理されてるファイルをこっそりSubversion(以降SVN)に取り込みたい。
将来的に、SVNに移行できたらいいなという思いがあるので。

前提

  • SVNへのインポートは事前に行っている
  • チェックアウトも事前にローカルHDDに行っている

仕様

  • ファイルサーバからローカルのワークディレクトリへ同期を行う
    • ディレクトリが存在しない場合は作成
    • ファイルが存在しない場合はコピー
    • ファイルサーバの方が日付が新しい場合は上書きコピー
    • .svnファイルはもちろん削除対象外とする
    • 同期しないファイル、ディレクトリを指定できるようにする
  • ローカルにのみ存在するファイル・ディレクトリを削除
    • .svnファイルはもちろん削除対象外とする
  • SVNへの追加、削除
    • 新しいファイルをsvn add
    • 削除されたファイルをsvn delete
  • SVNへコミット

ソース

こんな感じ。エラー処理は無しですが…

$from = 'X:\Work\test\From'
$to = 'D:\Work\test\To'
$excludeFrom = 'old','temp'
$excludeTo = '.svn'
$changed = $false

Write-Host 
Write-Host "SVNリポジトリから最新の状態に更新します"
Push-Location $to
svn update
Pop-Location

Write-Host 
Write-Host "ファイルの同期を開始します"
Get-ChildItem $from -Recurse -Exclude $excludeFrom | %{
    $file =  $_.FullName.Replace($from, "")
    $copyto = $to + $file

    if ($_.Attributes -eq 'Directory') {
        if (-not(Test-Path -literalpath $copyto)) {
            Write-Host "C : " $_.FullName.Replace($from, "")
            New-Item $copyto -itemType Directory -Force | Out-Null
            $changed = $true
        }
    }else{
        if (-not(Test-Path -literalpath $copyto)) {
            Write-Host "A : " $file
            Copy-Item $_ $copyto
            $changed = $true
        }else{
            if ($_.LastWriteTime -gt $(Get-Item -literalpath $copyto).LastWriteTime) {
                Write-Host "M : " $file ":" $(Get-Item -literalpath $copyto).LastWriteTime " ⇒ " $_.LastWriteTime 
                Copy-Item $_ $copyto
                $changed = $true
            }
        }
    }
}

Get-ChildItem $to -Recurse -Exclude $excludeTo | %{
    $file =  $_.FullName.Replace($to, "")
    $originalfile = $from + $file

    if (-not(Test-Path -literalpath $originalfile )) {
         Write-Host "D : " $file
         Remove-Item $_ -Recurse -Force
         $changed = $true
    }
}

if ($changed) {
    Write-Host 
    Write-Host "変更があったでSVNへのコミットを行います"
    Push-Location $to
    svn status | Select-String -pattern "^\?" | %{$_ -replace "^\? +",""} | %{svn add $_}
    svn status | Select-String -pattern "^!"  | %{$_ -replace "^! +",""}  | %{svn delete $_}
    svn commit -m"ファイルサーバと同期"
    Pop-Location
}else{
    Write-Host 
    Write-Host "変更がなかったのでSVNへのコミットは行いません"
}

*1:旧バージョンのファイルはファイル名に日付を付けて、oldディレクトリに放り込みましょう