base.hs
同じプログラム ( foo.hs
、bar.hs
、 ) の異なる拡張バージョンを作成するために使用する基本ソースファイルがありbaz.hs
ます。ここで、変更されたすべてのバージョンのパッチ ファイルを作成したいと考えていますが、すべての拡張機能を含むプログラムを取得するには、パッチを蓄積する必要があります。
base.hs
-- @@BEGIN_IMPORTS@@
-- @@END_IMPORTS@@
main = do
-- @@BEGIN_EXTENSIONS@@
-- @@END_EXTENSIONS@@
putStrLn "Hello World"
foo.hs (基本的に同じファイルであることに注意してください)
-- @@BEGIN_IMPORTS@@
import Foo
-- @@END_IMPORTS@@
main = do
-- @@BEGIN_EXTENSIONS@@
putStrLn foo
-- @@END_EXTENSIONS@@
putStrLn "Hello World"
bar.hs
-- @@BEGIN_IMPORTS@@
import Bar
-- @@END_IMPORTS@@
main = do
-- @@BEGIN_EXTENSIONS@@
putStrLn bar
-- @@END_EXTENSIONS@@
putStrLn "Hello World"
baz.hs
-- @@BEGIN_IMPORTS@@
import Baz
-- @@END_IMPORTS@@
main = do
-- @@BEGIN_EXTENSIONS@@
putStrLn baz
-- @@END_EXTENSIONS@@
putStrLn "Hello World"
=>
拡張された.hs
-- @@BEGIN_IMPORTS@@
import Foo
import Bar
import Baz
-- @@END_IMPORTS@@
main = do
-- @@BEGIN_EXTENSIONS@@
putStrLn foo
putStrLn bar
putStrLn baz
-- @@END_EXTENSIONS@@
putStrLn "Hello World"
差分 + パッチ?
diff
およびユーティリティについては認識していpatch
ますが、問題は、複数のパッチを適用すると、それらが互いに打ち消し合うことです (したがって、 が得られますbaz.hs
)。
機能しない
diff -c base.hs foo.hs > foo.hs.c3
diff -c base.hs bar.hs > bar.hs.c3
diff -c base.hs baz.hs > baz.hs.c3
patch -o base_foo.hs base.hs foo.hs.c3
patch -o base_foo_bar.hs base_foo.hs bar.hs.c3
patch -o base_foo_bar_baz.hs base_foo_bar.hs baz.hs.c3
コンビディフ?
私も知ってcombinediff
いますが、これはパッチが順番に適用された場合にのみ機能するため、base_foo.hs
.
diff3?
差分 + パッチ - 置換の代わりに合計diff3
がユーティリティ (パッケージ)を参照していますpatchutils
が、必要な動作が機能していないように見えます。さらに、これが複数のパッチでどのように役立つかわかりません。
機能しない
touch null
diff3 foo.hs.c3 null bar.hs.c3 > foo_bar.hs.c3
patch -o base_foo_bar.hs base.hs foo_bar.hs.c3
(ここでのアイデアは、空のファイルからの差分を結合することです)
機能しない
diff3 -m foo.hs.c3 base.hs bar.hs.c3 > base_foo_bar.hs
(明らかに、3つのバージョンすべてを含む大きな競合ファイルが生成されます)
その他?
git のような SCM のマージ ツールを使用するというアイデアもありましたが、それらはコミットでのみ使用できるようですが、私のファイルはバージョン管理されていません。
私の現在の解決策は、コードスニペットを介して挿入することですperl -pi -e
が、かなり面倒でエラーが発生しやすいです。