I’ve been having a few chats with customers who are curious about exporting files from a Translator instance to various places like another fossil repository or another third party source code control system.
We have plans to support some of that built into Iguana but we’d also like to provide the ability for customers to extend the Iguana GUI itself using Lua.
So as a quick proof of concept I wrote a module which checks out the Fossil repository and returns a table object containing all the data for a Translator instance’s files. It’s quite easy to do since the Translator is built on open standard based code.
This shows it’s usage pulling code a From Translator instance that has some code pulling a RSS feed from CNN:

Here is the code to copy:
-- NOTE: this code requires <your channel> to use a "From Translator" Source
-- if you use repo.TO <your channel> must use a "To Translator" Destination
local repo = require 'repo'
function main(Data)
local A = repo.ExtractChannel(
'<your channel name>', 'c:temp', repo.FROM)
trace(A.main)
trace(A.shared.node)
local R = 'Shared modules:'
for Shared in pairs(A.shared) do
R = R..', '..Shared
end
trace(R)
end
It shows that with a little bit of creativity what is possible to do with the Translator using it to process Iguana’s own configuration files. This code could be used as the basis of exporting the Translator code into another source code control system.
The third argument is the type of Translator instance:
| Script Type | Description |
|---|---|
| repo.FROM | From Translator instance |
| repo.TO | To Translator instance |
| repo.FILTER | Filter Translator instance |
| repo.ACK | Translator instance for handling ACKnowledgments in an LLP listener component |
See documentation on the layout of the repository.
local repo = {}
local function Exec(Command)
local F = io.popen(Command)
local R = F:read('*a')
F:close()
return R
end
local function ReadFile(FileName)
local F = io.open(FileName)
local X = F:read("*all")
F:close()
return X
end
local function WriteFile(FileName, Content)
local F = io.open(FileName, "w")
F:write(Content)
F:close()
end
local function GetSharedFile(FileName)
return ReadFile('edit/admin/shared/'..FileName..'.lua')
end
local function GetOtherFile(FileName)
return ReadFile('edit/admin/other/'..FileName)
end
function node.getChannel(C, Name)
for i=1,#C.iguana_config.channel_config do
local Chan = C.iguana_config.channel_config[i]
if Chan.name:nodeValue() == Name then
return Chan
end
end
return nil
end
function ExportFossil(TempDir, ExportDir)
os.execute('cd "'..TempDir..'" & mkdir "'..ExportDir..'"')
local A = Exec('cd')
A = A:gsub('\n', '')
A = A:gsub('/', '\\')
os.execute('cd "'..TempDir..ExportDir..'\\" & "'..A..'\\fossil" open "'..A..'\\vcs_repo.sqlite"')
end
local function CleanFossil(TempDir, ExportDir)
os.execute('rmdir /s /q '.. TempDir..ExportDir)
end
repo.FROM = 1
repo.TO = 2
repo.FILTER = 3
repo.ACK = 4
function ScriptGuid(ScriptType, ChannelName, Config)
if ScriptType == repo.TO then return Config:getChannel(ChannelName).to_mapper.guid:nodeValue() end
if ScriptType == repo.FROM then return Config:getChannel(ChannelName).from_mapper.guid:nodeValue() end
if ScriptType == repo.FILTER then return Config:getChannel(ChannelName).message_filter.translator_guid:nodeValue() end
if ScriptType == repo.ACK then return Config:getChannel(ChannelName).llp_listener.ack_script:nodeValue() end
end
function repo.ExtractChannel(ChannelName, TempDir, ScriptType)
if not ScriptType then ScriptType = repo.TO end
local EDir = 'export'
CleanFossil(TempDir, EDir)
ExportFossil(TempDir, EDir)
local Root = TempDir .. EDir..'\\'
local X = ReadFile('IguanaConfiguration.xml')
X = xml.parse{data=X}
local Guid = ScriptGuid(ScriptType, ChannelName, X)
local Result={shared={}, other={}}
Result.main = ReadFile(Root..Guid..'\\main.lua')
local Project = ReadFile(Root..Guid..'/project.prj')
print(Project)
Project=json.parse{data=Project}
Result.project = Project
print(Result.project.Name)
for i=1,#Project.LuaDependencies do
print(Project.LuaDependencies[i])
local Code = GetSharedFile(Project.LuaDependencies[i])
Result.shared[Project.LuaDependencies[i]] = Code
end
for i=1,#Project.OtherDependencies do
print(Project.OtherDependencies[i])
local Code = GetOtherFile(Project.OtherDependencies[i])
Result.other[Project.OtherDependencies[i]] = Code
end
CleanFossil(TempDir, EDir)
return Result
end
return repo