如何检查 darcs 中补丁的显式依赖关系?

How to inspect the explicit dependencies of a patch in darcs?

众所周知,darcs record --ask-deps 可以记录显式的补丁依赖关系。 (我看到的一个用途是防止出现“It's easy to move a patch that uses a feature to a point before the feature is introduced.”的情况。)

所以,有了一个我应该做这样的 deps 的回购协议,我想检查一下它是否属实。如何检查所选补丁程序记录的显式依赖项?

Google 可以在 Darcs/UI/Commands/Rebase.hs 中找到一些代码,如果补丁有这样的 deps,它会打印警告,但我还不知道是否有一个独立的命令可以提供此信息(不与操作耦合):

where doAdd :: (RepoPatch p, ApplyState p ~ Tree)
            => Repository (Rebasing p) wR wU wT
            -> FL (WDDNamed p) wT wT2
            -> HijackT IO (Repository (Rebasing p) wR wU wT2, FL (RebaseName p) wT2 wT2)
      doAdd repo NilFL = return (repo, NilFL)
      doAdd repo ((p :: WDDNamed p wT wU) :>:ps) = do
          case wddDependedOn p of
              [] -> return ()
              deps -> liftIO $ do
                  -- It might make sense to only print out this message once, but we might find
                  -- that the dropped dependencies are interspersed with other output,
                  -- e.g. if running with --ask-deps
                  putStr $ "Warning: dropping the following explicit "
                             ++ englishNum (length deps) (Noun "dependency") ":\n\n"
                  let printIndented n =
                          mapM_ (putStrLn . (replicate n ' '++)) . lines .
                          renderString Encode . showPatchInfo
                  putStrLn . renderString Encode . showPatchInfo .
                          patch2patchinfo $ wddPatch p
                  putStr " depended on:\n"
                  mapM_ (printIndented 2) deps
                  putStr "\n"
...

或许,输出 .dpatch 的命令会将此信息包含在 dpatch 中。我现在应该检查一下。

根据我的实验,darcs log -v (http://bugs.darcs.net/issue959) 和 darcs diff 都没有输出此信息。

一种方法是用 darcs send 输出 .dpatch,然后查看它。

这不是一个很方便的方法,因为

  1. darcs send 需要一个目标仓库(即使 -o FILE.dpatch);
  2. 捆绑包中有多个补丁,而不是我们要检查的单个补丁...

这是一个示例(我还检查过 darcs log -v 没有提供有关显式依赖项的信息):

准备:

$ mkdir test-darcs-deps
$ cd test-darcs-deps/
$ darcs init
$ echo a > a
$ darcs add a
$ darcs rec -m A
$ echo b > b
$ darcs add b
$ darcs rec -m B

记录显式依赖:

$ echo b2 > b
$ darcs rec --ask-deps
hunk ./b 1
-b
+b2
Shall I record this change? (1/1)  [ynW...], or ? for more options: y
Do you want to record these changes? [Yglqk...], or ? for more options: y
patch 1f59d082f61f1fb8d57f5f5199869d1fc21b2435
Author: Ivan Zakharyaschev <imz@altlinux.org>
Date:   Sat Jan  9 01:28:07 MSK 2016
  * A
Shall I depend on this patch? (1/1)  [ynW...], or ? for more options: y
Do you want to depend on these patches? [Yglqk...], or ? for more options: y
Finished recording patch 'B2'

检查部门(我不得不参考 non-related darcs 回购 为了 darcs send 工作!):

$ darcs send -o ../test-darcs-deps.dpatch
Missing argument:  [REPOSITORY]
Usage: darcs send [OPTION]... [REPOSITORY]
Prepare a bundle of patches to be applied to some target repository.

See darcs help send for details.

$ darcs send -o ../test-darcs-deps.dpatch ../test-darcs
HINT: if you want to change the default remote repository to
      /home/imz/tests/test-darcs,
      quit now and issue the same command with the --set-default flag.
patch 1f59d082f61f1fb8d57f5f5199869d1fc21b2435
Author: Ivan Zakharyaschev <imz@altlinux.org>
Date:   Sat Jan  9 01:28:07 MSK 2016
  * A

    A ./a
Shall I send this patch? (1/3)  [ynW...], or ? for more options: w
patch 151c8321b2bc36df7ba09dcab0d17c853ed31577
Author: Ivan Zakharyaschev <imz@altlinux.org>
Date:   Sat Jan  9 01:28:32 MSK 2016
  * B

    A ./b
Shall I send this patch? (2/3)  [ynW...], or ? for more options: w
patch f697ac56e8241f5a906c010650b683638944ebf2
Author: Ivan Zakharyaschev <imz@altlinux.org>
Date:   Sat Jan  9 01:28:50 MSK 2016
  * B2

    M ./b -1 +1
Shall I send this patch? (3/3)  [ynW...], or ? for more options: y
Do you want to send these patches? [Yglqk...], or ? for more options: l
---- Already selected patches ----
patch 151c8321b2bc36df7ba09dcab0d17c853ed31577
Author: Ivan Zakharyaschev <imz@altlinux.org>
Date:   Sat Jan  9 01:28:32 MSK 2016
  * B

    A ./b
patch 1f59d082f61f1fb8d57f5f5199869d1fc21b2435
Author: Ivan Zakharyaschev <imz@altlinux.org>
Date:   Sat Jan  9 01:28:07 MSK 2016
  * A

    A ./a
patch f697ac56e8241f5a906c010650b683638944ebf2
Author: Ivan Zakharyaschev <imz@altlinux.org>
Date:   Sat Jan  9 01:28:50 MSK 2016
  * B2

    M ./b -1 +1
---- end of already selected patches ----
Do you want to send these patches? [Yglqk...], or ? for more options: y
Minimizing context, to send with full context hit ctrl-C...
File content did not change. Continue anyway? [yn]y

可以在输出的尖括号中看到依赖关系:

[B2
Ivan Zakharyaschev <imz@altlinux.org>**20160108222850
 Ignore-this: e8693b796cd3cac50bb19f4458ddb323
] 
<
[A
Ivan Zakharyaschev <imz@altlinux.org>**20160108222807
 Ignore-this: 613cadd9266dac24e2bcd2dde97d969a
] 
> hunk ./b 1
-b
+b2

这是完整的输出:

3 patches for repository /home/imz/tests/test-darcs:

patch 151c8321b2bc36df7ba09dcab0d17c853ed31577
Author: Ivan Zakharyaschev <imz@altlinux.org>
Date:   Sat Jan  9 01:28:32 MSK 2016
  * B

patch 1f59d082f61f1fb8d57f5f5199869d1fc21b2435
Author: Ivan Zakharyaschev <imz@altlinux.org>
Date:   Sat Jan  9 01:28:07 MSK 2016
  * A

patch f697ac56e8241f5a906c010650b683638944ebf2
Author: Ivan Zakharyaschev <imz@altlinux.org>
Date:   Sat Jan  9 01:28:50 MSK 2016
  * B2

New patches:

[B
Ivan Zakharyaschev <imz@altlinux.org>**20160108222832
 Ignore-this: 9558077a30e30ba3c99003a4418991d
] addfile ./b
hunk ./b 1
+b

[A
Ivan Zakharyaschev <imz@altlinux.org>**20160108222807
 Ignore-this: 613cadd9266dac24e2bcd2dde97d969a
] addfile ./a
hunk ./a 1
+a

[B2
Ivan Zakharyaschev <imz@altlinux.org>**20160108222850
 Ignore-this: e8693b796cd3cac50bb19f4458ddb323
] 
<
[A
Ivan Zakharyaschev <imz@altlinux.org>**20160108222807
 Ignore-this: 613cadd9266dac24e2bcd2dde97d969a
] 
> hunk ./b 1
-b
+b2

Context:

Patch bundle hash:
f7ff61d69da702263b2ac613d3ca979ecab5b07b

不太方便。