可以使用回调来配置遥控器吗?

时间:2018-02-19 14:57:21

标签: origen-sdk

我正在阅读Origen documentation on remotes并提出了一个问题。什么时候相对于Origen callbacks检索远程文件?我问的原因是我们要检索的文件将用于构建我们的DUT模型,并且存在一些顺序依赖性。

我尝试配置遥控器时尝试了所有现有的回调,但没有成功。

def pre_initialize
  Origen.app.config.remotes = [
    {
      dir: 'product',
      vault: 'ssh://git@stash.com/myproduct/origen.git',
      version: '0.1.0'
    }
  ]
end

如果我将遥控器配置添加到应用程序文件中,它可以工作:

config.remotes = [
    {
      dir: 'product',
      vault: 'ssh://git@stash.com/myproduct/origen.git',
      version: '0.1.0'
    }
  ]

使用config / application.rb文件的问题是我们无法在应用程序空间的任何位置保留产品特定信息。我们使用符号链接映射到存储在测试程序存储库中的源文件。我想我们可能需要一个新的回调,请指教。

THX

**编辑**

所以我在另一个文件中定义了遥控器,并调用该方法在boot.rb文件中实际执行此操作。然后我将远程管理器require方法放在on_create回调中,但没有获取任何遥控器。

    284: def on_create
    285:   binding.pry
 => 286:   Origen.remote_manager.require!
    287: end

[1] pry(#<PPEKit::Product>)> Origen.config.remotes
=> [{:dir=>"remote_checkout", :rc_url=>"ssh://git@stash.us.com:7999/osdk/us-calendar.git", :version=>"v0.1.0"}]
[2] pry(#<PPEKit::Product>)>
origen(main):001:0>

好像是Origen.remote_manager.require!不管用。所以我检查了remotes manager file,但没看到要求如何!方法可以使用回调,因为它似乎是检查遥控器是脏的,这对于加载application.rb文件后设置的远程定义永远不会发生。所以我创建了一个resolve_remotes!似乎有用的方法:

def resolve_remotes!
  resolve_remotes
  remotes.each do |_name, remote|
    dir = workspace_of(remote)
    rc_url = remote[:rc_url] || remote[:vault]
    tag = Origen::VersionString.new(remote[:version])
    version_file = dir.to_s + '/.current_version'
    begin
      if File.exist?("#{dir}/.initial_populate_successful")
        FileUtils.rm_f(version_file) if File.exist?(version_file)
        rc = RevisionControl.new remote: rc_url, local: dir
        rc.checkout version: prefix_tag(tag), force: true
        File.open(version_file, 'w') do |f|
          f.write tag
        end
      else
        rc = RevisionControl.new remote: rc_url, local: dir
        rc.checkout version: prefix_tag(tag), force: true
        FileUtils.touch "#{dir}/.initial_populate_successful"
        File.open(version_file, 'w') do |f|
          f.write tag
        end
      end
    rescue Origen::GitError, Origen::DesignSyncError => e
      # If Git failed in the remote, its usually easy to see what the problem is, but now *where* it is.
      # This will prepend the failing remote along with the error from the revision control system,
      # then rethrow the error
      e.message.prepend "When updating remotes for #{remote[:importer].name}: "
      raise e
    end
  end
end

resolve_remotes!方法只强制获取所有已知的遥控器。公关会被接受这个解决方案吗?

THX

1 个答案:

答案 0 :(得分:1)

目前在应用程序加载时需要遥控器,这意味着它发生在任何应用程序回调点之前。

config.remotes的内容仍然可以通过在块中分配来实现动态:

config.remotes do
  r = [{
    dir: 'product',
    vault: 'ssh://git@stash.com/myproduct/origen.git',
    version: '0.1.0'
  }]

  if some_condition
    r << { dir: ... }
  end

  r      
end

在加载目标之前,将评估config.remotes属性,因此您无法引用dut,例如,这可能已经足够了。

或者,您可以非常轻松地在应用程序中实现遥控器的后期目标要求。

如果dut还不可用,则使遥控器返回空数组,这将使其在应用程序加载期间被Origen调用时正常工作:

config.remotes do
  if dut
    # As above example
  else
    []
  end
end

然后在您选择的回调处理程序中:

Origen.remote_manager.require!

这应该会导致它重新评估config.remotes并获取任何丢失的遥控器。