Class: Origen::RemoteManager

Inherits:
Object
  • Object
show all
Defined in:
lib/origen/remote_manager.rb

Overview

Responsible for ensuring that all dependencies defined in config.remotes are available.

Workspaces will automatically be created and updated to the correct version as required.

An instance of this class is hooked up to:

Origen.remote_manager

Instance Method Summary collapse

Constructor Details

#initializeRemoteManager

Returns a new instance of RemoteManager.



11
12
13
# File 'lib/origen/remote_manager.rb', line 11

def initialize
  @required = false
end

Instance Method Details

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Handles all symlink creation since Ruby/Windows is ropey. On windows it will create an additional flag file to easily tell us a symlink is active later.



90
91
92
93
94
95
96
97
# File 'lib/origen/remote_manager.rb', line 90

def create_symlink(from, to)
  if Origen.running_on_windows?
    system("call mklink /D #{to.to_s.gsub('/', '\\')} #{from.to_s.gsub('/', '\\')}")
    File.new("#{to}_is_a_symlink", 'w') {}
  else
    FileUtils.symlink from, to
  end
end

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Manually handle symlink deletion to support windows



101
102
103
104
105
106
107
108
109
# File 'lib/origen/remote_manager.rb', line 101

def delete_symlink(path)
  if Origen.running_on_windows?
    # Don't use regular rm on windows symlink, will delete into the remote dir!
    system("call cmd /c rmdir #{path.to_s.gsub('/', '\\')}")
    FileUtils.rm_f("#{path}_is_a_symlink")
  else
    FileUtils.rm_f(path)
  end
end

#imports_required?Boolean

Returns true if the imports have already been required and added to the load path of the current thread

Returns:

  • (Boolean)


50
51
52
# File 'lib/origen/remote_manager.rb', line 50

def imports_required?
  true # Guaranteed by the boot process
end

#named_remotesObject

Returns a hash containing all remotes



78
79
80
# File 'lib/origen/remote_manager.rb', line 78

def named_remotes
  remotes
end

#namesObject

Returns an array of symbols that represent the names of all remotes



73
74
75
# File 'lib/origen/remote_manager.rb', line 73

def names
  named_remotes.keys
end

#origen_root(name) ⇒ Object

Returns the path to origen root for the given import name



83
84
85
# File 'lib/origen/remote_manager.rb', line 83

def origen_root(name)
  origen_root_for(named_remotes[name])
end

#require!Object

This will fetch all remotes (if required) It does not add the libs to the load path, and require the environments

since remotes are not assumed to be Ruby.


18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/origen/remote_manager.rb', line 18

def require!
  unless required?
    while updates_required?
      Origen.log.info '*******************************************************************************'
      Origen.log.info 'The following remotes need to be updated, this will now happen automatically:'
      dirty_remotes.each do |name, remote|
        if remote[:path]
          Origen.log.info "  #{name} - #{remote[:path]} (included by #{remote[:importer].name})".green
        else
          Origen.log.info "  #{name} - #{remote[:version]} (included by #{remote[:importer].name})".green
        end
      end
      Origen.log.info ''

      update!

      Origen.log.info ''
      Origen.log.info 'Finished updating remotes.'
      Origen.log.info '*******************************************************************************'
    end
    @required = true
  end
end

#required?Boolean

Returns true if the imports have already been required and added to the load path of the current thread

Returns:

  • (Boolean)


44
45
46
# File 'lib/origen/remote_manager.rb', line 44

def required?
  @required
end

#resolve_remotes!Object

Fetches any defined remotes, regardless of whether they are dirty or not



124
125
126
127
# File 'lib/origen/remote_manager.rb', line 124

def resolve_remotes!
  resolve_remotes
  process_remotes
end

#symlink?(path) ⇒ Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns true if the given path is a symlink. Since Rubies handling of symlinks is ropey we will manually maintain a flag (an empty file that means true when present) to indicate when an import is currently setup as a symlink to a path.

Returns:

  • (Boolean)


115
116
117
118
119
120
121
# File 'lib/origen/remote_manager.rb', line 115

def symlink?(path)
  if Origen.running_on_windows?
    File.exist?("#{path}_is_a_symlink")
  else
    File.symlink?(path)
  end
end

#validate_production_status(force = false) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/origen/remote_manager.rb', line 54

def validate_production_status(force = false)
  if Origen.mode.production? || force
    remotes.each do |_name, remote|
      if remote[:path]
        fail "The following remote is defined as a path, but that is not allowed in production: #{remote}"
      end

      version = Origen::VersionString.new(remote[:version])
      unless version.valid?
        fail "The following remote version is not in a valid format: #{remote}"
      end
      if version.latest?
        fail "Latest is not allowed as a remote version in production: #{remote}"
      end
    end
  end
end