2

base.hs同じプログラム ( foo.hsbar.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が、かなり面倒でエラーが発生しやすいです。

4

1 に答える 1

0
# diffs can be created beforehand

diff base.hs foo.hs > foo.hs.diff
diff base.hs bar.hs > bar.hs.diff
diff base.hs baz.hs > baz.hs.diff

# *creating a mybase.hs here which is slightly different (like "Hello Mars")*

# the follow steps need to be done for every run

patch -o myfoo.hs mybase.hs foo.hs.diff
patch -o mybar.hs mybase.hs bar.hs.diff 
patch -o mybaz.hs mybase.hs baz.hs.diff

# we create a temp file here because it seems that merge-file and the stream operator '>'
# operate on the same file immediately
cp mybase.hs mybase_union.hs
git merge-file -p --union myfoo.hs mybase.hs mybase_union.hs         > mybase_union_foo.hs
git merge-file -p --union mybar.hs mybase.hs mybase_union_foo.hs     > mybase_union_foo_bar.hs
git merge-file -p --union mybaz.hs mybase.hs mybase_union_foo_bar.hs > mybase_union_foo_bar_baz.hs
cp mybase_union_foo_bar_baz.hs mybase_extended.hs

Thxアーメル!

于 2013-09-19T13:31:27.230 に答える