【问题标题】:How to automate the update of dozens of mercurial repositories with ant?如何使用 ant 自动更新数十个 mercurial 存储库?
【发布时间】:2012-08-07 19:03:22
【问题描述】:

我有一个遗留产品,分布在数十个存储库中。我目前正在尝试重构(并理解......)给定的构建过程。第一步是从旧的版本控制系统迁移到 mercurial,这是令人鼓舞且容易的。

构建过程主要使用 ant 构建脚本(好消息),但必须“在”存储库文件结构上运行(坏消息...),因为 ant 脚本从所有存储库中获取文件并将工件留在......让我们说,几个地方...但这不是一个障碍。

在触发构建之前(现在使用 hudson CI),我必须确保所有存储库都更新为提示或选定的标签。我可以(再次)编写脚本/批处理或编写自定义 ant 任务,但是,我不想(再次)忽略现有功能:

是否可以通过使用现有的 ant 任务或 mercurial 功能来更新一组 mercurial 存储库?所有存储库都位于一个文件夹中(如 /repo)并具有共同的前缀(如 SYSTEMNAME_module),因此很容易找到它们/创建文件集。

【问题讨论】:

    标签: java ant mercurial


    【解决方案1】:

    今天最简单的解决方案是从 Ant 启动 hg 可执行文件(使用 exec task。注意:MacroDef 是你的朋友)。只需在其中一个项目中创建一个“主”构建文件,切换到父目录(您可以在其中访问所有本地副本),然后更新每个。

    【讨论】:

    • 谢谢 Aaron - 不知道 MacroDef,但它看起来像是解决方案的一部分 - 但我仍然需要了解如何使用存储库名称提供“hg-update-macro”跨度>
    • 您需要为其提供一个存储库名称作为参数。请参阅示例。如果需要循环,请检查 ANT Contrib 任务。
    【解决方案2】:

    我发现了一个不同的基于 ant 的解决方案,基于“应用”任务:

    <apply executable="hg">
      <arg value="update" />
      <arg value="--verbose" />
      <arg value="--revision" />
      <dirset dir="/repos" include="REPO_SUFFIX*" />
    </apply>
    

    感谢 Aaron,他非常有帮助的回答为我指明了正确的方向。

    【讨论】:

      【解决方案3】:

      我认为这将是更新 mercurial depo 的一种更灵活的方式。它从一组目录中选择哪些是软件仓库并更新它们。请注意,您也可以使用 ant contrib 的 foreach 标签执行此操作,但“for”似乎消耗的内存要少得多。

      <!-- See if the directory looks like a mercurial depo, if so update it -->
          <target name="-mercurial-update">
               <dirset dir="${dir.deps}" id="lib.dirs">
                   <exclude name="build"/>
                   <present targetdir="${dir.deps}">
                         <mapper type="glob" from="*" to="*/.hg" />
                   </present>
                 </dirset>
      
               <for param="file">
                   <path>
                      <dirset refid="lib.dirs"/>
                   </path>
                   <sequential>
                       <echo>Trying to update mercuriali depo @{file}</echo>
                       <exec executable="hg" dir="@{file}">
                           <arg line="pull" />
                       </exec>
                       <exec executable="hg" dir="@{file}">
                           <arg line="up" />
                       </exec>
                  </sequential>
               </for>
           </target>
      

      【讨论】:

      • 你是对的。但是对于我的问题,查看文件夹名称并访问具有预期名称前缀的文件夹就足够了。
      猜你喜欢
      • 2020-09-23
      • 1970-01-01
      • 2021-04-21
      • 2021-09-11
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多