Overview
Maintaining an inventory of repository files provides a convenient reference for reviewing file locations, types, sizes, and modification dates. This entry explains how to configure an ETL workflow in Repertoire 202x to export a structured inventory of repository files to CSV.
The workflow scans a physical repository directory, including its subfolders. It captures file metadata, derives relative folder paths, standardises file extensions, then formats modification timestamps. The records are sorted by folder and filename before export.
The resulting CSV includes the folder location, filename, extension, file size, modification timestamp, and full path. The workflow uses built-in ETL steps without requiring a datasource or custom script. Source files remain unchanged.
The CSV contains the following columns:
| Column | Description |
|---|---|
FolderPath |
Complete folder path relative to the repository root. |
FileName |
Original filename, including its extension. |
Extension |
Lowercase final extension, without the dot. |
SizeBytes |
File size in bytes. |
LastModified |
Modification timestamp with timezone offset. |
FullPath |
Absolute filesystem path of the file. |
Note: This guide applies to a local repository.
Prerequisites
Before configuring the ETL, permit the repository directory and CSV export destination in etc/application.conf, located under the Repertoire Server installation directory.
A) Configure File Reading
Locate the elixir.data.file block. Include "./repository" in the readable list:
elixir.data.file {
# Only files within these directories (and sub directories) are readable and writable by the File Steps.
# You could use "/" or "C:/" or equivalent to allow access to all files and folders, but restricting the
# scope to certain folders is preferred. Relative paths are relative to the installation root folder
readable: ["./data/in", "./data/out", "./repository"]
writable: ["./data/out"]
}
readable permits Directory Reader to access the repository directory, including its subfolders.
Relative paths resolve from the installation root. For example, "./repository" refers to C:/Elixir/Repertoire-202x/repository for an installation at C:/Elixir/Repertoire-202x.
Note: The directory must exist. If the repository is stored elsewhere, add its absolute path to the
readablelist instead.
B) Configure CSV Writing
Locate the elixir.data.csv block. Ensure that writable includes the CSV export directory:
elixir.data.csv {
readable: ["./data/in", "./data/out"]
writable: ["./data/out"]
}
CSV File Writer uses elixir.data.csv.writable. The writable setting under elixir.data.file does not control CSV export.
C) Apply the Configuration
Preserve existing permitted locations required by other workflows. Restrict access to the necessary directories rather than allowing an entire drive.
Save etc/application.conf. Restart Repertoire Server to load the changes before running the ETL.
Step 1: Create the ETL Chain
In ETL Management, create a chainset named Repository Files to CSV. Navigate to ETL Designer. Create or select the Main chain.
Configuration:
- Chainset Name:
Export Repository Files to CSV - Chain Name:
Main
Step 2: JSON Record
Add a JSON Record step. Name the step Set Repository Root.
Configuration:
- Merge Order: Keep only this
- JSON:
{
"RepositoryRoot": "C:/Elixir/Repertoire-202x/repository"
}
Explanation:
Keep only this: Outputs the configured JSON record rather than merging it with incoming fields.
RepositoryRoot contains the directory path. This step supplies the configuration record. It does not list the files yet.
Note: Use an absolute path with forward slashes and no trailing slash. Replace the example with your actual repository directory.
Step 3: Directory Reader
Add a Directory Reader step. Name the step List Repository Files Recursively.
Configuration:
- Directory Field:
RepositoryRoot - Recursive: Enabled
Explanation:
Directory Field identifies the incoming field containing the source path. Enter RepositoryRoot, not the directory path itself.
Recursive includes files in nested folders. The reader produces one record per file, with metadata such as:
file
fileName
folderName
fileLength
fileLastModified
The native folderName contains only the immediate parent folder name. The workflow derives a complete relative folder path to distinguish locations such as /Administration/Reports from /Finance/Reports.
Note: Inspect the records in the Results panel before continuing. If no records appear, check the source directory, permitted readable locations, and execution messages.
Step 4: Restructure
Add a Restructure step. Name the step Create Readable Inventory Columns.
Configuration:
- Specification:
{
"RelativePath": "$file",
"FullPath": "$file",
"FileName": "$fileName",
"Extension": "$fileName",
"SizeBytes": "$fileLength",
"LastModified": "$fileLastModified"
}
Explanation:
Each property defines an output field. Values beginning with $ reference fields in the incoming record.
For example, "FileName": "$fileName" copies the reader’s filename into FileName.
The fields serve these purposes:
RelativePath: Working copy of the full path used to derive the folder location.FullPath: Original absolute path retained for reference.FileName: Original filename retained unchanged.Extension: Working copy of the filename used to extract its extension.SizeBytes: File size copied fromfileLength.LastModified: Timestamp copied fromfileLastModified.
Note: At this stage,
RelativePathis still absolute.Extensionstill contains the complete filename.
Step 5: Remove Prefix
Add a Remove Prefix step. Name the step Remove Repository Prefix.
Configuration:
- Field:
RelativePath - Value / Prefix:
C:/Elixir/Repertoire-202x/repository
Explanation:
The configured prefix is removed from the beginning of RelativePath. The remaining value identifies the file location relative to the repository root.
Example:
Before: C:/Elixir/Repertoire-202x/repository/Administration/Reports/Monthly.rml
After: /Administration/Reports/Monthly.rml
FullPath remains unchanged.
Note: Match the prefix exactly, including its case and slash style. Omit the trailing slash. Update this value whenever
RepositoryRootchanges.
Step 6: Add Fields
Add an Add Fields step. Name the step Create Relative Folder Path.
Configuration:
- Specification:
{
"FolderPath": "$RelativePath"
}
Explanation:
This copies RelativePath into FolderPath.
Example:
RelativePath: /Administration/Reports/Monthly.rml
FolderPath: /Administration/Reports/Monthly.rml
A separate working field allows the folder value to be transformed without changing the original file paths.
Step 7: Replace RegExp
Add a Replace RegExp step. Name the step Remove Filename from Folder Path.
Configuration:
- Field:
FolderPath - Regex:
/[^/]+$ - Value / Replacement: Leave empty
Explanation:
The expression matches the final slash followed by the filename. Replacing the match with an empty value leaves the parent-folder hierarchy.
/ = A path separator
[^/]+ = One or more characters that are not a path separator
$ = The end of the value
Example:
Before: /Administration/Reports/Monthly.rml
After: /Administration/Reports
Note: Leave the replacement field genuinely empty. Do not enter a space or quotation marks.
Step 8: Replace RegExp
Add a Replace RegExp step. Name the step Label Repository Root Folder.
Configuration:
- Field:
FolderPath - Regex:
^$ - Value / Replacement:
/
Explanation:
A root-level file such as /Readme.txt has an empty FolderPath after filename removal.
^$ matches this empty value. The replacement / identifies the repository root.
Example:
Root-level file: FolderPath = /
Nested file: FolderPath = /Administration/Reports
Nested folder paths remain unchanged.
Step 9: Replace RegExp
Add a Replace RegExp step. Name the step Extract File Extension.
Configuration:
- Field:
Extension - Value / Replacement:
$1 - Regex:
^(?:.+\.([^.]+)|.*)$
Explanation:
The expression captures the text after the final dot. $1 returns the captured extension without its dot.
The alternative .* also matches filenames without an extension. Their extension capture is empty, so the replacement produces a blank value.
Examples:
| Filename | Extracted extension |
|---|---|
Monthly.rml |
rml |
DATA.DS |
DS |
archive.tar.gz |
gz |
README |
Blank |
.hidden |
Blank |
Note: Enter a single backslash before the dot in the Regex field. The exported chainset JSON represents that backslash as
\\.
Step 10: Lower
Add a Lower step. Name the step Normalize Extension Case.
Configuration:
- Field:
Extension
Explanation:
The step converts extension values to lowercase for consistent filtering.
Examples:
DS -> ds
RML -> rml
CSV -> csv
Only Extension changes. FileName retains the original filename, including its capitalisation.
Step 11: Timestamp - Local Format
Add a Local Format step from the Timestamp category. Name the step Format Last Modified Timestamp.
Configuration:
- Step Type:
timestamp.LocalFormat - Source Field:
LastModified - Format:
uuuu-MM-dd HH:mm:ss XXX - Locale:
en - Destination Field:
LastModified
Explanation:
This converts the modification timestamp into a readable value using the server’s configured clock timezone.
uuuu-MM-dd = Date in year-month-day order
HH:mm:ss = Time using the 24-hour clock
XXX = UTC offset, such as +08:00
Example:
2026-10-02 08:30:00 +08:00
Using LastModified as both fields replaces the raw timestamp in the output record. The source file’s modification date is not changed.
Step 12: Small Sort
Add a Small Sort step. Name the step Sort by File Name.
Configuration:
- Field:
FileName - Descending: Disabled
Explanation:
The step establishes ascending filename order. This order is retained within each folder group when the folder-path sort is applied.
Note: Apply the filename sort before the folder-path sort.
Step 13: Small Sort
Add a Small Sort step. Name the step Group Files by Folder Path.
Configuration:
- Field:
FolderPath - Descending: Disabled
Explanation:
The step groups records by FolderPath while retaining the established filename order. The final inventory is ordered by folder, then by filename within each folder.
Example:
| FolderPath | FileName |
|---|---|
| /Finance | Budget.rml |
| /Finance | Summary.rml |
| /Administration | PieChart.rml |
| /Administration | PieChartData.ds |
Note: Sorting is case-sensitive. Small Sort buffers records in memory. Ensure that available server memory is sufficient for the expected inventory size.
Step 14: CSV File Writer
Add a CSV File Writer step. Name the step Export Structured Inventory CSV.
Configuration:
- Write Header: Enabled
- Separator:
, - Qualifier:
" - Newline: CR/LF
- Add BOM: Enabled
- Filename:
data/out/repository_files_structured.csv - Columns: Enter the following field names, one per line.
FolderPath
FileName
Extension
SizeBytes
LastModified
FullPath
Explanation:
Columns: Specifies the exported fields in their required order. The internal RelativePath field is omitted.
Write Header: Adds the column names as the first CSV row.
Qualifier: Preserves values containing commas within a single field.
Newline: Uses Windows-style CR/LF line endings.
Add BOM: Helps applications recognise the UTF-8 encoding.
The CSV is written to the Repertoire Server filesystem. It is not automatically downloaded to the browser.
For the example installation, the intended destination is:
C:/Elixir/Repertoire-202x/data/out/repository_files_structured.csv
Use an absolute filename if an unambiguous output location is required. The destination directory must be permitted by elixir.data.csv.writable.
Note: Each run overwrites the selected CSV. Use a different filename to retain earlier exports. Keep the destination outside the scanned repository. Avoid concurrent runs writing to the same file.
Workflow Summary
Define the repository directory
|
v
Read file metadata recursively
|
v
Create inventory fields
|
v
Derive relative folder paths
|
v
Extract and standardise file extensions
|
v
Format modification timestamps
|
v
Sort by filename, then group by folder
|
v
Export the selected columns to CSV
The export contains FolderPath, FileName, Extension, SizeBytes, LastModified, and FullPath. Source files remain unchanged.
Troubleshooting
A) Directory Access Is Rejected
For an error such as:
Can't access directory ... - check folder restrictions
Verify that:
- The directory exists on the Repertoire Server machine.
RepositoryRootcontains the intended absolute path.elixir.data.file.readablepermits the directory.- The edited
etc/application.confbelongs to the running server installation. - Repertoire Server was restarted after the configuration change.
Note:
./repositoryresolves under the server installation. It does not automatically refer to a separate Repertoire Designer installation.
B) Records Are Missing or the Output Is Empty
- Set Directory Field to
RepositoryRoot, not a literal path. - Enable Recursive to include nested folders.
- Confirm that the selected directory contains files.
- Review execution messages for inaccessible locations.
Separate folder records, including empty folders, are not included in this workflow.
C) Folder Paths Remain Absolute
Check the value in Remove Repository Prefix. It must match the beginning of the generated file path, including case and slash style. Omit the trailing slash.
Update the prefix whenever RepositoryRoot changes.
D) CSV Export Fails
- Confirm that CSV File Writer is enabled.
- Check the destination against
elixir.data.csv.writable. - Verify the actual output location on the server.
- Check whether another application has locked the CSV.
Note:
elixir.data.file.writabledoes not control CSV File Writer. Avoid concurrent runs writing to the same file.
E) Long Values Appear Cut Off in Excel
CSV files do not retain column widths or text wrapping. Long paths may appear partially hidden even though the complete value was exported.
Use AutoFit Column Width or Wrap Text in Excel. Automatic export-time column sizing requires a spreadsheet writer with formatting support.
What This Guide Achieves
- Creates a structured inventory of files in a physical repository directory.
- Preserves folder locations and original filenames for easy identification.
- Presents file metadata in a consistent, readable format.
- Organises the inventory for filtering, review, and comparison.
- Exports reusable CSV data without modifying the source files.














