説明

パッチ管理装置、パッチ管理方法及びパッチ管理プログラム

【課題】ネットワークを介して互いに通信可能な複数のクライアントの間で、パッチ間の競合及び個々のクライアントにおけるパッチのマージ作業を回避しつつ、パッチを当てることのできるパッチ管理方法を提供すること。
【解決手段】パッチ管理装置30は、ネットワークを介して互いに通信可能な複数のクライアント60p〜60tのそれぞれのリポジトリ40に対するパッチを管理する。パッチ管理装置30は、共通パッチ生成部13及びパッチ演算部14を備える。共通パッチ生成部13は、クライアント60p〜60tそれぞれのリポジトリ40のいずれにおいてもマージすることのできるパッチを共通パッチとして抽出する。パッチ演算部14は、共通パッチをリポジトリ40に格納されたデータにマージする。

【発明の詳細な説明】
【技術分野】
【0001】
本発明はパッチ管理装置、パッチ管理方法及びパッチ管理プログラムに関し、特にネットワーク間で分散管理されたファイル集合について、競合を起こすことなくパッチをファイル集合へ反映させることを可能にするパッチ管理装置、パッチ管理方法及びパッチ管理プログラムに関する。
【背景技術】
【0002】
従来から、プログラムを共同開発する際に、ソースコードのコピーを開発者全員がリポジトリに設けた記憶装置に保持し、ファイルに対して行われた変更点のみを開発者間でやりとりしつつ開発を進める方法が利用されている。共同開発へ参加する開発者は、始めにソースコードのコピーを手元のリポジトリへコピーしておいて、変更を行った際にはパッチと呼ばれる変更点のみを他の開発者へ配布することで、ネットワークを介した分散環境においても、一つのプログラムを効率良く共同開発することができる。
【0003】
特許文献1に開示されたパッチ管理装置においては、パッチをファイルシステムへの変更点として抽出し、パッチ適用対象のファイルシステムへ上書きしていた。具体的には、ファイルシステムの変更前と変更後それぞれの状態を持つ仮想マシン(バーチャルマシン)を作成し、仮想マシン中のファイルそれぞれについて、ファイルの追加や削除、ファイルのタイムスタンプ、サイズ及びハッシュ値の変化を検査することによって変更されたファイル集合を抽出し、このファイル集合をパッチとしてパッチ適用対象のファイルシステムへ上書きしていた。
【0004】
特許文献2に開示されたパッチ管理装置においては、ソースコードを管理する中央リポジトリ(ソースコード管理サーバ)によって、クライアントから受信したソースコードの変更点をソースコードの構文解析結果である構文ツリーへのパッチとして管理し、クライアントは必要に応じてソースコード管理サーバ上の更新されたパッチを手元のリポジトリへ適用することでソースコード管理を行っていた。
【0005】
【特許文献1】特開2003−296132号公報
【特許文献2】特開2005−346660号公報
【発明の開示】
【発明が解決しようとする課題】
【0006】
以下の分析は、本発明者によってなされたものである。従来のパッチ管理装置では、パッチを他の全てのリポジトリへ反映するために、特許文献1のように変更されたファイル集合をパッチとして上書きする方法や、特許文献2のようにパッチを一元的に管理する中央リポジトリを経由する方法があった。
【0007】
特許文献1の方法によれば、パッチを他のリポジトリへ反映する際には、パッチであるファイル集合がパッチ適用対象のリポジトリへ上書きされる。すなわち、リポジトリごとの変更点はパッチの上書きにより失われる可能性がある。したがって、リポジトリごとの変更点を残しつつ、マージ可能なパッチのみを適用することを目的としたパッチ管理には向いていない。
【0008】
特許文献2の方法によれば、ローカルに作成したパッチを他の全リポジトリへ反映するためには、いったん中央リポジトリへすべてのパッチをコミットと呼ばれる操作で登録しておき、他の全てのリポジトリ上でこのパッチを反映させる操作を実行する必要があった。
【0009】
このため、第1の問題点として、パッチを作成したユーザが一元的に反映操作を実行できず、他のリポジトリを備えたマシンへリモートログインするなどして反映しなければならないという問題があった。また、パッチを反映させる際には、ローカルで独自に作成したパッチと中央リポジトリから取得したパッチとが競合を起こす可能性がある。このため、第2の問題点として、各リポジトリ上でマージと呼ばれる修正処理を行う必要があった。
【0010】
そこで、ネットワークを介して互いに通信可能な複数のクライアントの間で、パッチ間の競合及び個々のクライアントにおけるパッチのマージ作業を回避しつつ、パッチを当てることのできるパッチ管理方法を提供することが課題となる。
【課題を解決するための手段】
【0011】
本発明の第1の視点に係るパッチ管理装置は、
ネットワークを介して互いに通信可能な複数のクライアントのそれぞれのリポジトリに対するパッチを管理するパッチ管理装置であって、
前記リポジトリのいずれにおいてもマージすることのできるパッチを共通パッチとして抽出するように構成された共通パッチ生成部と、
前記共通パッチを前記リポジトリに格納されたデータにマージするように構成されたパッチ演算部と、を備えることを特徴とする。
【0012】
第1の展開形態のパッチ管理装置は、
前記リポジトリのそれぞれにおいてマージすることのできるパッチをマージ可能パッチとして抽出するように構成されたパッチ抽出部を備え、
前記共通パッチ生成部は、前記マージ可能パッチを参照し、その共通部分を共通パッチとして抽出するように構成されることが好ましい。
【0013】
第2の展開形態のパッチ管理装置は、
パッチをより基本的なパッチの積に分解するように構成されたパッチ正規化部を備え、
前記パッチ抽出部は、前記パッチ正規化部によって分解されたパッチの積を参照し、前記マージ可能パッチを抽出するように構成されることが好ましい。
【0014】
第3の展開形態のパッチ管理装置は、
前記リポジトリのすべてに対する操作をロックするとともに、操作のロックを解除するように構成された分散ロック部を備えることが好ましい。
【0015】
本発明の第2の視点に係るパッチ管理方法は、
ネットワークを介して互いに通信可能な複数のクライアントのそれぞれのリポジトリに対するパッチを管理するパッチ管理方法であって、
(a)前記リポジトリのいずれにおいてもマージすることのできるパッチを共通パッチとして抽出する共通パッチ生成工程と、
(b)前記共通パッチを前記リポジトリに格納されたデータにマージするパッチ演算工程と、を含むことを特徴とする。
【0016】
第4の展開形態のパッチ管理方法は、
(c)前記リポジトリのそれぞれにおいてマージすることのできるパッチをマージ可能パッチとして抽出するパッチ抽出工程を含み、
前記共通パッチ生成工程(a)において、前記マージ可能パッチの共通部分を共通パッチとして抽出することが好ましい。
【0017】
第5の展開形態のパッチ管理方法は、
(d)パッチをより基本的なパッチの積に分解するように構成されたパッチ正規化工程を含み、
前記パッチ抽出工程(c)において、前記パッチ正規化工程(d)において分解されたパッチの積に基づいて前記マージ可能パッチを抽出することが好ましい。
【0018】
第6の展開形態のパッチ管理方法は、
前記リポジトリのすべてに対する操作をロックする工程と、
そのロックを解除する工程と、をそれぞれ最初と最後に含むことが好ましい。
【0019】
本発明の第3の視点に係るパッチ管理プログラムは、
ネットワークを介して互いに通信可能な複数のクライアントのそれぞれのリポジトリに対するパッチを管理する処理をコンピュータに実行させるパッチ管理プログラムであって、
(a)前記リポジトリのいずれにおいてもマージすることのできるパッチを共通パッチとして抽出する共通パッチ生成処理と、
(b)前記共通パッチを前記リポジトリに格納されたデータにマージするパッチ演算処理と、をコンピュータに実行させることを特徴とする。
【0020】
第7の展開形態のパッチ管理プログラムは、
(c)前記リポジトリのそれぞれにおいてマージすることのできるパッチをマージ可能パッチとして抽出するパッチ抽出処理をコンピュータに実行させ、
前記共通パッチ生成処理(a)において、前記マージ可能パッチの共通部分を共通パッチとして抽出する処理をコンピュータに実行させることが好ましい。
【0021】
第8の展開形態のパッチ管理プログラムは、
(d)パッチをより基本的なパッチの積に分解するように構成されたパッチ正規化処理をコンピュータに実行させ、
前記パッチ抽出処理(c)において、前記パッチ正規化処理(d)において分解されたパッチの積に基づいて前記マージ可能パッチを抽出する処理をコンピュータに実行させることが好ましい。
【0022】
第9の展開形態のパッチ管理プログラムは、
前記リポジトリのすべてに対する操作をロックする処理と、
そのロックを解除する処理と、をそれぞれ最初と最後にコンピュータに実行させることが好ましい。
【発明の効果】
【0023】
本発明により、ネットワークを介して互いに通信可能な複数のクライアントの間で、パッチ間の競合及び個々のクライアントにおけるパッチのマージ作業を回避しつつ、パッチを当てることのできるパッチ管理方法が提供される。すなわち、作成したパッチを他の全てのリポジトリへ反映させたい場合、他のリポジトリへパッチ反映やマージを依頼することなく、全リポジトリへマージ可能なパッチをパッチ演算に基づいて判定し、マージすることができる。
【0024】
本発明により、例えば、異なる管理者によって個別に管理されるマシン間において設定ファイルを共有する場合において、重要な設定変更を他のマシンへ反映させる必要が生じた際に、他のマシンの管理者に手間をかけることなく、重要な設定の変更点のみを複数マシンに対して競合を起こすことなく反映させることができる。
【発明を実施するための最良の形態】
【0025】
本発明の実施形態について図面を参照して詳細に説明する。図1は、本発明の第1の実施の形態に係るパッチ管理装置30を備えたクライアント60の構成を示すブロック図である。クライアント60は、パッチ管理装置30、リポジトリ40、ユーザインタフェース50を備える。
【0026】
パッチ管理装置30はパッチの管理を行う。リポジトリ40はコミットされたパッチを保持する。ユーザインタフェース50は、パッチのコミットや全リポジトリへのパッチのマージを指示し、またマージ結果をユーザへ表示する。
【0027】
図2は、ネットワークを介して互いに通信可能な複数のクライアントの間におけるパッチ管理を説明するための図である。図2において、クライアント60pは、ネットワーク70を通じて他のクライアント60q〜60tと通信可能である。すべてのクライアント60p〜60tは、初期状態として、共通した同一のパッチ集合を自身のリポジトリ40に保持する。ある1つのクライアント60pが新たなパッチを作成し、他のクライアント60q〜60t上のリポジトリ40へ反映させたい場合には、パッチ管理装置30を通じて他のすべてのクライアント60q〜60t上のリポジトリ40に対するマージ処理を行う。
【0028】
パッチ管理装置30は、パッチ再構成部10と分散ロック部20を備える。パッチ再構成部10は、パッチ集合を入力とし、他の全てのリポジトリでパッチが競合を起こさないための再構成を行う。分散ロック部20は、他の全てのリポジトリ40のロックを行う。
【0029】
ユーザインタフェース50は、ユーザが作成したパッチを同じクライアント60上のリポジトリ40、もしくはネットワーク70を通じて接続された他のクライアント60上のリポジトリ40へマージするためのインタフェースである。例えば、ユーザインタフェース50を通じてコミットを指示すると、ユーザが作成したパッチをリポジトリ40へコミットする。また、マージを指示すると、ネットワーク70を通じて接続された他の全てのクライアント60q〜60tのリポジトリ40へユーザが作成したパッチをマージする。また、マージの後、マージの成功や失敗、マージ時にどのパッチが実際にマージできたか等の実行結果をユーザへ表示する。
【0030】
リポジトリ40は、パッチ記憶装置41とリポジトリ操作部42を備える。パッチ記憶装置41は、コミットされたパッチ集合を保持するための記憶手段である。リポジトリ操作部42はパッチ集合を入力とし、パッチ記憶装置41へパッチを登録し、パッチ演算部14からの要求に応じて、コミットされたパッチ集合を取り出す。
【0031】
リポジトリ40に対して変更を加えるパッチの種類は、「ファイルの追加(new)」、「ファイルの削除(delete)」、「ファイル内容の編集(edit)」の3通りである。「ファイルの追加」パッチは、新たなファイルaをリポジトリ40に追加する。
以下ではこれを「new(a)」パッチと呼ぶ。「ファイルの削除」パッチはリポジトリ40中のファイルaを削除する。以下ではこれを「del(a)」パッチと呼ぶ。「ファイル内容の編集」パッチはリポジトリ40中のファイルaの指定された部分へ行を追加または削除する。以下ではこれを「edit(a)」パッチと呼ぶ。
【0032】
図3にedit()パッチによって行が追加または削除される例を示す。図3(a)によると、このedit()パッチはファイルの指定された部分へ行を追加するパッチである。ファイルにedit()パッチを適用することで、ファイルのα行目からβ行目の部分に行が追加される。図3(b)によると、このedit()パッチはファイルの指定された部分から行を削除するパッチである。ファイルにedit()パッチを適用することで、ファイルのα行目からβ行目の部分が削除される。以下では、この追加または削除されるα行目からβ行目までの範囲をhunk(α、β)と呼ぶ。
【0033】
パッチ集合とは、リポジトリ40に変更を加えるパッチの順序付き集合である。図4にパッチ集合の構成を示す。図4に示されるように、パッチは属性として適用順序を持ち、パッチ集合を適用する際にはこの適用順序の順番にパッチが適用される。パッチを適用する順番は厳密に守られる必要がある。これは、パッチ集合内のパッチの順序を入れ替えた場合には、パッチの適用に失敗したり、パッチ集合がリポジトリ40に行う変更内容が変わったりするためである。すなわち、あるファイルに2つのパッチA、Bを順に適用する操作をAとBの積ABで表すものとすると、パッチの積の間には、交換則が成り立たない場合がある(すなわち、AB≠BA)。
【0034】
パッチ順序の入れ替えによって、パッチの適用が失敗する例として、パッチAが「add(a)」パッチで、パッチBが「edit(a)」パッチである場合が挙げられる。この場合、A、Bの順にパッチを適用することはできるが、B、Aの順にパッチを適用することはできない。ファイルaがパッチAにより追加される前に、ファイルaへ行を追加することはできないからである。
【0035】
一方、パッチ順序の入れ替えにより変更内容が変わってしまう例として、パッチCが「hunk(20、21)を追加するedit(b)」パッチで、パッチDが「hunk(10、11)を追加するedit(b)」パッチである場合が挙げられる。C、D、の順にパッチを適用した結果と、D、Cの順にパッチを適用した結果は異なる。これは、以下の理由による。すなわち、C、Dの順にパッチを適用した場合、パッチ適用前のファイルbの10行目、20行目に新たな行が挿入される。一方、D、Cの順にパッチを適用した場合、Dを適用した段階で元々のファイルbの11行目以降の行は1行ずつずれるため、Cで追加される行はもともとのファイルbの18行目と19行目の間に挿入される。
【0036】
パッチ再構成部10は、パッチ正規化部11と、パッチ同報部12と、共通パッチ生成部13と、パッチ演算部14を備える。パッチ正規化部11は、ユーザインタフェース50から渡されたパッチ集合を変形し、new()、del()、および1つのhunkを編集するeditパッチの積に分解する。また、パッチ集合の中から不要なパッチを削除する。これらを正規化処理と呼ぶ。
【0037】
図5に正規化処理の一例を説明する。図5によると、正規化前のパッチAはhunk(α、β)、およびhunk(γ、δ)を編集するeditパッチである。これらのパッチを正規化すると、hunk(α、β)を編集するeditパッチA1と、hunk(γ、δ)を編集するeditパッチA2の積に分解される。以下では、このようなパッチの積をA1*A2と表わす。
【0038】
図6に正規化処理の一例を説明する。図6によると、正規化前のパッチ集合は、ファイルaを追加するパッチBとファイルaを削除するパッチGとの間に挟まれたパッチC、D、E、Fから成るパッチ積を部分集合として含む。ここで、パッチBとパッチGの間に挟まれたパッチのうち、ファイルaに作用するパッチD、E、Fの効果は、ファイルaを削除するパッチGを適用することによって無効となる。よって、パッチB、D、E、F、Gは除去することができる。つまり、一般にadd(a)とdel(a)およびその区間のedit(a)パッチは除去することができる。
【0039】
パッチ同報部12は、パッチ集合をパッチ正規化部11から受け取り、他の全てのクライアント60q〜60t上のパッチ再構成部10へ同報通信する。他の全てのクライアント60q〜60t上のパッチ再構成部10におけるパッチ演算部14は、同報通信により送信されたパッチ集合を受け取り、リポジトリ40へコミットされたパッチとマージが可能なパッチ集合を求める。
【0040】
共通パッチ生成部13は、他の全てのクライアント60q〜60t上のパッチ再構成部10で求められたマージ可能なパッチの集合(「マージ可能パッチ」という。)を収集し、全てのクライアント60p〜60t上のリポジトリ40に共通してマージ可能なパッチの集合(「共通パッチ」という。)を生成する。例えば、作成したパッチ集合が[A、B、C、D、E]であり、これを他のクライアント60q、60rへマージしようとしている場合を考える。それぞれのクライアント60q、60rにおけるマージ可能パッチが、クライアント60qにおいて[A、B、C、D]、クライアント60rにおいて[C、D、E]であったとすると、共通パッチは[C、D]となる。
【0041】
パッチ演算部14は、入力としてパッチ集合を受け取り、パッチの差分情報にもとづいて、リポジトリ40中のパッチとの競合判定や依存判定、およびリポジトリ40へのマージ処理を行う。
【0042】
2つのパッチが競合するのは、2つのパッチが同じファイルaを操作しようとしている場合において、一方のパッチ管理によって他方のパッチが適用できなくなるときと、一方のパッチの効果が他方のパッチで無効になってしまうときである。このような競合を起こすパッチの組み合わせは「edit(a)*edit(a)」、「edit(a)*del(a)」、「new(a)*del(a)」、「del(a)*edit(a)」、「del(a)*new(a)」の5通りである。
【0043】
図7に「edit(a)*edit(a)」パッチ積がマージ可能な場合と競合を起こす場合の例を示す。パッチP1、P2はそれぞれedit(a)パッチであり、それぞれhunk(α、β)、hunk(γ、δ)を編集するものとする。ここで図7(a)によると、hunk(α、β)とhunk(γ、δ)が重ならない場合、すなわち、β<γ又はδ<αの場合、それぞれのパッチが編集する領域は重ならないので、マージ可能である。逆に図7(b)によると、これが成りたたない場合(すなわち、γ≦βかつα≦δである場合)、それぞれのパッチが編集する領域が重なるので競合を起こす。
【0044】
その他に競合を起こす例として、「edit(a)*del(a)」、「new(a)*del(a)」、「del(a)*edit(a)」、「del(a)*new(a)」の4通りがある。「edit(a)*del(a)」では、edit(a)パッチによる編集がdel(a)パッチによって無効になるので、競合となる。「new(a)*del(a)」では、new(a)によって作成したファイルaがdel(a)によって削除されてしまうため、競合となる。「del(a)*edit(a)」では、del(a)で削除したファイルaをedit(a)で編集することはできないので、競合となる。「del(a)*new(a)」では、del(a)で削除したファイルaをnew(a)で作成し直すことになり、競合を引き起こす。
【0045】
2つのパッチ間に依存関係が発生するのは、new(a)とそれに続くedit(a)の組み合わせである。図8に依存関係の例を示す。edit(a)パッチを適用するためには、これに先立ってnew(a)パッチが適用され、ファイルaが作成されていなければならない。このため、edit(a)パッチであるパッチB及びパッチEはnew(a)パッチであるパッチAに依存する。
【0046】
マージ処理は、あるファイルへ適用するパッチを同じファイルで別のパッチが適用された後に適用するために変形する処理である。図9は、パッチのマージ処理の例を示す。図9によると、パッチA、Bはそれぞれ同じファイルaに適用されるパッチである。ここで、パッチAをパッチBが当たった後に適用する(すなわち、マージする)ためには、パッチAを変形しなければならない。なぜなら、ファイルaの中身はパッチBの適用によって変化しているため、事前に変化分のオフセット変換を行わなければならないからである。以後の説明では、ファイルaへパッチBが当たった後のファイルの状態をコンテキストと呼び、パッチBが当たる前の状態と区別する。
【0047】
図10に、パッチAをコンテキストに適用する場合の具体的なマージ処理を示す。パッチBではhunk(γ、δ)を編集しているので、パッチBの適用後、ファイルaはhunk(γ、δ)の範囲分、すなわち、(δ−γ+1)行分前又は後ろにずれる。つまり、パッチBがhunk(γ、δ)を挿入するパッチであった場合、ファイルaのγ行目以降は後ろにずれる。逆に、パッチBがhunk(γ、δ)を削除するパッチであった場合、ファイルaのδ+1行目以降は前にずれる。このずれをoffset(hunk(γ、δ))で表す。offsetを使うと、パッチAをマージのために変形したパッチA’は、hunk(α+offset(hunk(γ、δ))、β+offset(hunk(γ、δ)))を編集することになる。マージ処理はこのオフセット変換を行う処理である。
【0048】
分散ロック部20は、全てのクライアント60p〜60tへのマージ処理を排他的に行うために、マージ処理中のパッチのコミットおよびチェックアウト処理を全てのクライアント60p〜60t上のリポジトリ40で禁止するための手段である。
【0049】
なお、パッチ管理装置30は、ユーザインタフェース50を実現する装置と同一又は別のコンピュータを基本ハードウェアとして用いることもできる。そして、パッチ再構成部10及びリポジトリ40は、上記のコンピュータに搭載されたプロセッサにプログラムを実行させることにより実現することもできる。
【0050】
パッチ管理装置30は、上記のプログラムをコンピュータに予めインストールすることで実現されても良いし、磁気ディスク(フレキシブルディスク、ハードディスクなど)、光ディスク(CD−ROM、DVDなど)、光磁気ディスク(MOなど)、半導体メモリなどのリムーバブルな記憶媒体に記録し、あるいはLANやインターネット等のネットワークを介して上記のプログラムを配布し、このプログラムをコンピュータに適宜インストールすることによって実現してもよい。
【0051】
パッチ記憶装置41は、上記のコンピュータに内蔵されたメモリやハードディスク装置等の記憶デバイス、上記のコンピュータに外付けされたメモリやハードディスク装置などの記憶デバイス、さらにはフレキシブルディスク等のリムーバブルな記憶媒体などを適宜利用して実現することができる。
【0052】
また、記憶媒体からコンピュータにインストールされたプログラムの指示に基づきコンピュータ上で稼動しているOS(オペレーティングシステム)や、データベース管理ソフト、ネットワークソフト等のMW(ミドルウェア)等が本実施の形態を実現するための各処理の一部を実行するようにしても良い。記憶媒体は1つに限らず、複数の媒体から本実施の形態における処理が実行される場合も本発明における記憶媒体に含まれ、媒体構成は何れの構成であっても良い。
【0053】
上記のコンピュータは、記憶媒体に記憶されたプログラムに基づき、第1の実施の形態における各処理を実行するものであって、パーソナル・コンピュータ等の1つからなる装置、複数の装置がネットワーク接続されたコンピュータ等の何れの構成であっても良い。上記のコンピュータは、パーソナル・コンピュータに限らず、情報処理機器に含まれる演算処理装置、マイクロコンピュータ等も含み、プログラムによって本発明の機能を実現することが可能な機器、装置を総称している。
【0054】
次に、図11のシーケンス図を参照して、本実施形態に係るパッチ管理装置の動作について詳細に説明する。ここでは、ネットワーク70を介して互いに通信可能なクライアント60p〜60tのうち、一例として、クライアント60pにおいて生成(又はクライアント60pに対して入力)されたパッチを、他のクライアント60q〜60tのリポジトリ40に反映させる場合を想定する。クライアント60pに備えたパッチ管理装置30は、バッチジョブとして一定の周期で、又は、ユーザインタフェース50からの指示に応じて、図11に示す処理を起動する。
【0055】
ユーザインタフェース50は、ネットワーク70に接続された全てのクライアント60p〜60tのリポジトリ40に対する変更点となるパッチ集合を作成し、パッチ管理装置30へ全体マージ処理を要求する。パッチ集合は、パッチ正規化部11への入力として渡され、例えば、図5及び図6において示した正規化が施される(ステップS11)。
【0056】
パッチ管理装置30は、全体マージ処理全体を安全に行うために、分散ロック部20を通じて、全てのクライアント60p〜60tのリポジトリ40をロックする(ステップS12、S21)。ロック中は、リポジトリ40からのチェックアウトおよびコミット処理は禁止される。
【0057】
パッチ管理装置30は、正規化済みパッチ集合を他の全クライアント60q〜60tへ同報通信する(ステップS13)。同報通信先の各クライアント60q〜60tでは、同報通信されたパッチ集合を受信する(ステップS22)。
【0058】
同報通信先の各クライアント60q〜60tのパッチ演算部14は、ステップS22において受信したパッチ集合のうちリポジトリ40へとマージ可能なパッチ集合(マージ可能パッチ)を算出する(ステップS23)。各クライアント60q〜60tは、ステップS23において求めたマージ可能パッチを同報通信元のクライアント60pの共通パッチ生成部13へと返信する(ステップS24)。クライアント60pのパッチ管理装置30に備えた共通パッチ生成部13は、他のクライアント60q〜60tから送信されたマージ可能パッチを収集する(ステップS14)。
【0059】
パッチ管理装置30では、マージ可能パッチを収集した後、共通パッチ生成部13が全てのクライアント60に共通してマージ可能なパッチの集合(「共通パッチ」)を求める(ステップS15)。パッチ管理装置30は、ステップS15において求められた共通パッチをパッチ同報部12を通じて他の全てのクライアント60q〜60tへ同報通信を行う(ステップS16)。同報通信先の各クライアント60q〜60tでは、同報通信された共通パッチを受信する(ステップS25)。
【0060】
全てのクライアント60p〜60t上のパッチ管理装置30では、ステップS15において求められた共通パッチをリポジトリ40へマージするために、パッチ演算部14を通じてマージ処理を行う(ステップS17、S26)。また、全てのクライアント60p〜60t上のパッチ管理装置30は、リポジトリ操作部42を介して、ステップS17およびS26において変換された共通パッチをリポジトリ40へコミットする(ステップS18、S27)。
【0061】
パッチ管理装置30では、分散ロック部20を通じて分散ロックを解除する(ステップS19、S28)。コミットが完了した後、全てのクライアント60p〜60tは図11に示す処理を終了する。
【実施例1】
【0062】
次に、本発明の第1の実施例を、図面を参照して説明する。本実施例は、入力装置としてキーボードを、データ処理装置としてパーソナル・コンピュータを、データ記憶装置として磁気ディスク装置を、出力装置としてディスプレイを備えている。
【0063】
パーソナル・コンピュータは、リポジトリ操作部42、分散ロック部20、パッチ正規化部11、パッチ同報部12、共通パッチ生成部13、パッチ演算部14、ユーザインタフェース50として機能する中央演算処理装置を有している。また、パッチ記憶装置41として機能する磁気ディスク装置を備えている。
【0064】
ここで、ユーザインタフェース50から図12に示されるAからHまでのパッチ集合がパッチ再構成部10へ渡され、全体マージ要求が出されたとする。以後、この全体マージ要求を出したクライアント(一例として、60p)をマスターサイトと呼ぶ。また、全体マージに参加する他のクライアント(一例として、60q、60r)をサイトX、サイトYと呼ぶ。全体マージ実行前の時点で、各サイトのリポジトリ40にコミットされたパッチの状態を図13とする。パッチ集合はユーザインタフェース50からパッチ正規化部11へと渡される。
【0065】
パッチ正規化部11は、与えられたパッチを正規化する。ここでは、図12に示されるパッチのうちEが「new(d)」、Hが「del(d)」となっており、これらのパッチとその間に挟まれるパッチF「edit(d)」を削除してもパッチ全体としての作用は変わらない。よって、パッチ正規化部11はこれらのパッチを入力のパッチ集合から除去する。正規化されたパッチ集合は図14に示されるようになる。
【0066】
パッチ正規化部11は、分散ロック部20を通じて全体マージに参加する全サイトのリポジトリ40をロックする。ロックが完了すると、正規化済みパッチ集合をパッチ同報部12を通じてサイトX、Yへと同報通信する。
【0067】
サイトX、Yは、パッチ演算部14を介して、同報通信された正規化済みパッチ集合を取得し、ローカルのパッチと競合を起こすファイルをパッチ演算で求める。サイトXにおけるパッチ演算を図15に示す。まず、全体マージされたパッチ集合内での依存関係を求める。パッチCは「new(c)」であり、ファイルcを新たに生成するパッチである。パッチDは「edit(c)」であり、ファイルcを編集するパッチである。このとき、依存関係の定義よると、パッチDはパッチCに依存する。
【0068】
次に、サイトXのパッチ集合との競合関係を求める。競合関係の定義より、競合するパッチはファイルcを削除するパッチXEと、ファイルcを生成するパッチCである。ここで、パッチDはパッチCに依存するので、さらにパッチDもパッチXEと競合する。また、同じ「edit(a)」であるパッチXDとパッチB、Gは競合する可能性があるが、ここでは、図7に示される競合判定によって競合しないものと判定されたとする。以上のパッチ演算より、サイトXのパッチ集合と競合しないパッチ集合は[A、B、G]となる。
【0069】
サイトYにおけるパッチ演算を図16に示す。競合する可能性のあるパッチの組合せとして、同じ「edit(b)」であるパッチYCとパッチAがある。ここで、図7に示される競合判定によりこれらが競合すると判定されたとする。この場合、サイトYのパッチ集合と競合しないパッチ集合(すなわち、マージ可能パッチ)は[B、C、D、G]となる。
【0070】
サイトXおよびサイトYは競合を起こさないパッチ集合をパッチ演算後、パッチ演算部14を通じてマスターサイトへ返信する。
【0071】
マスターサイトは、競合を起こさないパッチ集合をサイトXおよびサイトYから共通パッチ生成部13を通じて収集する。収集が完了後、共通パッチ生成部13はそれぞれのパッチ集合の積集合(「共通パッチ」)を求める。例えば、この例ではサイトXにおいて競合を起こさないパッチ集合は[A、B、G]であり、サイトYにおいて競合を起こさないパッチ集合は[B、C、D、G]であるから、共通パッチは[B、G]となる。
【0072】
求められた共通パッチはパッチ同報部12を通じてサイトX、Yへ同報通信される。送付先のサイトX、Yではそれぞれ、マージ処理が行われる。例として、図17にサイトXでのマージ処理を示す。共通パッチ[B、G]をサイトXのコンテキストにマージするために、図10に示されるパッチの変形処理を行う。
【0073】
変形された共通パッチは、サイトXのリポジトリ操作部42を通じてサイトXのリポジトリ40にコミットされ、マージが完了する。
【0074】
図18に示すように、サイトX、Yでのマージ処理と同様に、共通パッチはマスターサイトのパッチ演算部14へと渡され、リポジトリ40中のパッチ集合とマージのためのパッチ演算による変換が行われる。その後、リポジトリ操作部42を通じてパッチ記憶装置41へコミットされる。
【0075】
コミット完了後、パッチ演算部14は分散ロックを解除し、パッチ集合の全体へのマージが完了する。
【0076】
以上、第1の実施形態及び第1の実施例では、ファイルへパッチを適用する前後の差分をhunkと呼ばれる行単位の差分で示したが、XMLや構文木など適切に差分の定義が可能な構造化されたデータ形式によっても、パッチ演算処理を定義し全体へマージすることができる。
【0077】
また、リポジトリ40は、コミットされたパッチを保持するためのパッチ記憶装置41と、パッチ記憶装置41へパッチをコミットまたはチェックアウトするためのリポジトリ操作部42から構成されていたが、リポジトリ操作部42はリポジトリ40の外にあっても良い。
【0078】
また、ユーザインタフェース50がコミットするパッチ集合がすでに正規化されており、パッチ演算部14が直接処理可能な場合には、パッチ正規化部11は正規化処理を行わず、パッチ集合を直接パッチ同報部12への入力として渡しても良い。
【実施例2】
【0079】
本発明の第2の実施例について図面を参照して説明する。図19は本発明の第2の実施例に係るパッチ管理装置を備えたクライアントの構成を示すブロック図である。
【0080】
パッチ管理装置30は、ネットワークを介して互いに通信可能な複数のクライアント60p〜60tのそれぞれのリポジトリ40に対するパッチを管理する。パッチ管理装置30は、共通パッチ生成部13及びパッチ演算部14を備える。共通パッチ生成部13は、クライアント60p〜60tそれぞれのリポジトリ40のいずれにおいてもマージすることのできるパッチを共通パッチとして抽出する。パッチ演算部14は、共通パッチをリポジトリ40に格納されたデータにマージする。
【0081】
本実施例に係るパッチ管理装置によって、ネットワークを介して互いに通信可能な複数のクライアントの間で、パッチ間の競合及び個々のクライアントにおけるパッチのマージ作業を回避しつつ、パッチを当てることができる。
【0082】
以上の記載は実施例に基づいて行ったが、本発明は、上記実施例に限定されるものではない。
【産業上の利用可能性】
【0083】
本発明のパッチ管理装置は、ファイルの編集を複数人数で並行に行うバージョン管理システムに対して適用することができる。
【図面の簡単な説明】
【0084】
【図1】本発明の実施形態に係るパッチ管理装置を備えたクライアントの構成を示すブロック図である。
【図2】ネットワークを介して互いに通信可能な複数のクライアントの間におけるパッチ管理を説明するための図である。
【図3】ファイルを編集するパッチedit()の概念図である。
【図4】パッチ集合の構成を示す図である。
【図5】パッチの正規化処理を説明するための図である。
【図6】パッチの正規化処理の説明するための図である。
【図7】パッチの競合判定処理の説明をするための図である。
【図8】パッチの依存関係を示す図である。
【図9】パッチのマージ処理の例を示す図である。
【図10】パッチのマージ処理のための変形処理を示す図である。
【図11】本発明の実施形態の全体の動作を示すシーケンス図である。
【図12】全体へマージするパッチ集合の一例を示す図である。
【図13】リポジトリにコミットされたパッチ集合の一例を示す図である。
【図14】正規化処理を行ったパッチ集合の一例を示す図である。
【図15】パッチの競合判定の一例を示す図である。
【図16】パッチの競合判定の一例を示す図である。
【図17】パッチのマージ処理の一例を示す図である。
【図18】パッチのマージ処理の一例を示す図である。
【図19】本発明の第2の実施例に係るパッチ管理装置を備えたクライアントの構成を示すブロック図である。
【符号の説明】
【0085】
10 パッチ再構成部
11 パッチ正規化部
12 パッチ同報部
13 共通パッチ生成部
14 パッチ演算部
20 分散ロック部
30 パッチ管理装置
40 リポジトリ
41 パッチ記憶装置
42 リポジトリ操作部
50 ユーザインタフェース
60、60p〜60t クライアント
70 ネットワーク

【特許請求の範囲】
【請求項1】
ネットワークを介して互いに通信可能な複数のクライアントのそれぞれのリポジトリに対するパッチを管理するパッチ管理装置であって、
前記リポジトリのいずれにおいてもマージすることのできるパッチを共通パッチとして抽出するように構成された共通パッチ生成部と、
前記共通パッチを前記リポジトリに格納されたデータにマージするように構成されたパッチ演算部と、を備えることを特徴とするパッチ管理装置。
【請求項2】
前記リポジトリのそれぞれにおいてマージすることのできるパッチをマージ可能パッチとして抽出するように構成されたパッチ抽出部を備え、
前記共通パッチ生成部は、前記マージ可能パッチを参照し、その共通部分を共通パッチとして抽出するように構成されたことを特徴とする、請求項1に記載のパッチ管理装置。
【請求項3】
パッチをより基本的なパッチの積に分解するように構成されたパッチ正規化部を備え、
前記パッチ抽出部は、前記パッチ正規化部によって分解されたパッチの積を参照し、前記マージ可能パッチを抽出するように構成されたことを特徴とする、請求項2に記載のパッチ管理装置。
【請求項4】
前記リポジトリのすべてに対する操作をロックするとともに、操作のロックを解除するように構成された分散ロック部を備えることを特徴とする、請求項1ないし3のいずれか一に記載のパッチ管理装置。
【請求項5】
ネットワークを介して互いに通信可能な複数のクライアントのそれぞれのリポジトリに対するパッチを管理するパッチ管理方法であって、
(a)前記リポジトリのいずれにおいてもマージすることのできるパッチを共通パッチとして抽出する共通パッチ生成工程と、
(b)前記共通パッチを前記リポジトリに格納されたデータにマージするパッチ演算工程と、を含むことを特徴とするパッチ管理方法。
【請求項6】
(c)前記リポジトリのそれぞれにおいてマージすることのできるパッチをマージ可能パッチとして抽出するパッチ抽出工程を含み、
前記共通パッチ生成工程(a)において、前記マージ可能パッチの共通部分を共通パッチとして抽出することを特徴とする、請求項5に記載のパッチ管理方法。
【請求項7】
(d)パッチをより基本的なパッチの積に分解するように構成されたパッチ正規化工程を含み、
前記パッチ抽出工程(c)において、前記パッチ正規化工程(d)において分解されたパッチの積に基づいて前記マージ可能パッチを抽出することを特徴とする、請求項6に記載のパッチ管理方法。
【請求項8】
前記リポジトリのすべてに対する操作をロックする工程と、
そのロックを解除する工程と、をそれぞれ最初と最後に含む、請求項5ないし7のいずれか一に記載のパッチ管理方法。
【請求項9】
ネットワークを介して互いに通信可能な複数のクライアントのそれぞれのリポジトリに対するパッチを管理する処理をコンピュータに実行させるパッチ管理プログラムであって、
(a)前記リポジトリのいずれにおいてもマージすることのできるパッチを共通パッチとして抽出する共通パッチ生成処理と、
(b)前記共通パッチを前記リポジトリに格納されたデータにマージするパッチ演算処理と、をコンピュータに実行させることを特徴とするパッチ管理プログラム。
【請求項10】
(c)前記リポジトリのそれぞれにおいてマージすることのできるパッチをマージ可能パッチとして抽出するパッチ抽出処理をコンピュータに実行させ、
前記共通パッチ生成処理(a)において、前記マージ可能パッチの共通部分を共通パッチとして抽出する処理をコンピュータに実行させることを特徴とする、請求項9に記載のパッチ管理プログラム。
【請求項11】
(d)パッチをより基本的なパッチの積に分解するように構成されたパッチ正規化処理をコンピュータに実行させ、
前記パッチ抽出処理(c)において、前記パッチ正規化処理(d)において分解されたパッチの積に基づいて前記マージ可能パッチを抽出する処理をコンピュータに実行させることを特徴とする、請求項10に記載のパッチ管理プログラム。
【請求項12】
前記リポジトリのすべてに対する操作をロックする処理と、
そのロックを解除する処理と、をそれぞれ最初と最後にコンピュータに実行させることを特徴とする、請求項9ないし11のいずれか一に記載のパッチ管理プログラム。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate

【図10】
image rotate

【図11】
image rotate

【図12】
image rotate

【図13】
image rotate

【図14】
image rotate

【図15】
image rotate

【図16】
image rotate

【図17】
image rotate

【図18】
image rotate

【図19】
image rotate


【公開番号】特開2009−146200(P2009−146200A)
【公開日】平成21年7月2日(2009.7.2)
【国際特許分類】
【出願番号】特願2007−323523(P2007−323523)
【出願日】平成19年12月14日(2007.12.14)
【出願人】(000004237)日本電気株式会社 (19,353)
【Fターム(参考)】