<freeStyleBuild _class='hudson.model.FreeStyleBuild'><action _class='hudson.model.CauseAction'><cause _class='hudson.triggers.TimerTrigger$TimerTriggerCause'><shortDescription>Started by timer</shortDescription></cause></action><action _class='hudson.model.ParametersAction'><parameter _class='hudson.model.StringParameterValue'><name>BRANCH</name><value>master</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>EMAIL_NOTIFICATIONS</name><value>jenkins-notifications@lists.osmocom.org</value></parameter></action><action _class='jenkins.metrics.impl.TimeInQueueAction'><blockedDurationMillis>0</blockedDurationMillis><blockedTimeMillis>0</blockedTimeMillis><buildableDurationMillis>30</buildableDurationMillis><buildableTimeMillis>30</buildableTimeMillis><buildingDurationMillis>472185</buildingDurationMillis><executingTimeMillis>472185</executingTimeMillis><executorUtilization>1.0</executorUtilization><queuingDurationMillis>348</queuingDurationMillis><queuingTimeMillis>348</queuingTimeMillis><subTaskCount>0</subTaskCount><totalDurationMillis>472533</totalDurationMillis><waitingDurationMillis>1</waitingDurationMillis><waitingTimeMillis>1</waitingTimeMillis></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><originmaster _class='hudson.plugins.git.util.Build'><buildNumber>558</buildNumber><marked><SHA1>f2567de387c71cf637a4cb1365089ba7173870b0</SHA1><branch><SHA1>f2567de387c71cf637a4cb1365089ba7173870b0</SHA1><name>origin/master</name></branch></marked><revision><SHA1>f2567de387c71cf637a4cb1365089ba7173870b0</SHA1><branch><SHA1>f2567de387c71cf637a4cb1365089ba7173870b0</SHA1><name>origin/master</name></branch></revision></originmaster><refsremotesoriginosmithwip _class='hudson.plugins.git.util.Build'><buildNumber>5</buildNumber><marked><SHA1>b52b9704ed57386959a73c98e946c756e0188e6c</SHA1><branch><SHA1>b52b9704ed57386959a73c98e946c756e0188e6c</SHA1><name>refs/remotes/origin/osmith/wip</name></branch></marked><revision><SHA1>b52b9704ed57386959a73c98e946c756e0188e6c</SHA1><branch><SHA1>b52b9704ed57386959a73c98e946c756e0188e6c</SHA1><name>refs/remotes/origin/osmith/wip</name></branch></revision></refsremotesoriginosmithwip><refsremotesoriginmaster _class='hudson.plugins.git.util.Build'><buildNumber>253</buildNumber><marked><SHA1>c7c48718ba3637e29fc6a7af4e2e39ba0679bb8d</SHA1><branch><SHA1>c7c48718ba3637e29fc6a7af4e2e39ba0679bb8d</SHA1><name>refs/remotes/origin/master</name></branch></marked><revision><SHA1>c7c48718ba3637e29fc6a7af4e2e39ba0679bb8d</SHA1><branch><SHA1>c7c48718ba3637e29fc6a7af4e2e39ba0679bb8d</SHA1><name>refs/remotes/origin/master</name></branch></revision></refsremotesoriginmaster></buildsByBranchName><lastBuiltRevision><SHA1>f2567de387c71cf637a4cb1365089ba7173870b0</SHA1><branch><SHA1>f2567de387c71cf637a4cb1365089ba7173870b0</SHA1><name>origin/master</name></branch></lastBuiltRevision><remoteUrl>https://gerrit.osmocom.org/pysim</remoteUrl><scmName></scmName></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'><artifactsUrl>https://jenkins.osmocom.org/jenkins/job/simtester-sanitize/558/artifact</artifactsUrl><changesUrl>https://jenkins.osmocom.org/jenkins/job/simtester-sanitize/changes</changesUrl><displayUrl>https://jenkins.osmocom.org/jenkins/job/simtester-sanitize/558/</displayUrl><testsUrl>https://jenkins.osmocom.org/jenkins/job/simtester-sanitize/558/testReport</testsUrl></action><building>false</building><displayName>#558</displayName><duration>472185</duration><estimatedDuration>473668</estimatedDuration><fullDisplayName>simtester-sanitize #558</fullDisplayName><id>558</id><inProgress>false</inProgress><keepLog>false</keepLog><number>558</number><queueId>83246</queueId><result>SUCCESS</result><timestamp>1775608980752</timestamp><url>https://jenkins.osmocom.org/jenkins/job/simtester-sanitize/558/</url><builtOn>simtester</builtOn><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>pySim/transport/pcsc.py</affectedPath><commitId>d5aa963caa89ea804aa86a098c6ccc41d30e2840</commitId><timestamp>1775127210000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/pmaier</absoluteUrl><fullName>pmaier@sysmocom.de</fullName></author><authorEmail>pmaier@sysmocom.de</authorEmail><comment>pysim/pcsc: do not use getProtocol for protocol selection

The documentation of the getProtocol provided by pyscard says:

"Return bit mask for the protocol of connection, or None if no
protocol set. The return value is a bit mask of
CardConnection.T0_protocol, CardConnection.T1_protocol,
CardConnection.RAW_protocol, CardConnection.T15_protocol"

This suggests that the purpose of getProtocol is not to determine
which protocols are supported. Its purpose is to determine which
protocol is currently selected (either through auto selection or
through the explicit selection made by the API user). This means
we are using getProtocol wrong.

So far this was no problem, since the auto-selected protocol
should be a supported protocol anyway. However, the automatic
protocol selection may not always return a correct result (see
bug report from THD-siegfried [1]).

Let's not trust the automatic protocol selection. Instead let's
parse the ATR and make the decision based on the TD1/TD2 bytes).

[1] https://osmocom.org/issues/6952

Related: OS#6952
Change-Id: Ib119948aa68c430e42ac84daec8b9bd542db7963
</comment><date>2026-04-02 12:53:30 +0200</date><id>d5aa963caa89ea804aa86a098c6ccc41d30e2840</id><msg>pysim/pcsc: do not use getProtocol for protocol selection</msg><path><editType>edit</editType><file>pySim/transport/pcsc.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>docs/index.rst</affectedPath><affectedPath>.gitignore</affectedPath><affectedPath>docs/pysim_fs_sphinx.py</affectedPath><affectedPath>docs/conf.py</affectedPath><affectedPath>tests/unittests/test_fs_coverage.py</affectedPath><commitId>fc932a2ee9a4dbecb4eec9fcdb97d95cae78708b</commitId><timestamp>1775575933000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/laforge</absoluteUrl><fullName>laforge</fullName></author><authorEmail>laforge@osmocom.org</authorEmail><comment>docs: auto-generate Card Filesystem Reference

Add a Sphinx extension (docs/pysim_fs_sphinx.py) that hooks into the
builder-inited event and generates docs/filesystem.rst before Sphinx
reads any source files.

The generated page contains a hierarchical listing of all implemented
EFs and DFs, organised by application/specification (UICC/TS 102 221,
ADF.USIM/TS 31.102, ADF.ISIM/TS 31.103, SIM/TS 51.011).  For each file,
the class docstring and any _test_de_encode / _test_decode vectors
are included as an encoding/decoding example table.

docs/filesystem.rst is fully generated at build time and is therefore
added to .gitignore.

Add tests/unittests/test_fs_coverage.py that walks all pySim.* modules
and verifies that every CardProfile, CardApplication, and standalone
CardDF subclass with EF/DF children is either listed in the SECTIONS
(and will appear in the docs) or explicitly EXCLUDED.

Change-Id: I06ddeefc6c11e04d7c24e116f3f39c8a6635856f
Related: OS#6316
</comment><date>2026-04-07 15:32:13 +0000</date><id>fc932a2ee9a4dbecb4eec9fcdb97d95cae78708b</id><msg>docs: auto-generate Card Filesystem Reference</msg><path><editType>edit</editType><file>docs/conf.py</file></path><path><editType>add</editType><file>docs/pysim_fs_sphinx.py</file></path><path><editType>add</editType><file>tests/unittests/test_fs_coverage.py</file></path><path><editType>edit</editType><file>.gitignore</file></path><path><editType>edit</editType><file>docs/index.rst</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>pySim/filesystem.py</affectedPath><commitId>5e2fd148f89457e9fa83061aeb45cd59959c7735</commitId><timestamp>1775575933000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/laforge</absoluteUrl><fullName>laforge</fullName></author><authorEmail>laforge@osmocom.org</authorEmail><comment>filesystem: edit_{binary,record}_decoded: add encode/decode examples

When invoking `edit_binary_decoded` or `edit_record_decoded`, the
temp file opened in the editor now contains the EF's encode/decode
test vectors as //-comment lines below the JSON content, similar to
how 'git commit' appends comments to the commit message template.
The comment block is stripped before JSON parsing on save,
so it has no effect on the written data.

The feature is implemented via a new module-level JsonEditor context
manager class that encapsulates the full edit cycle:

* write JSON + examples to a TemporaryDirectory
* invoke the editor
* read back, strip //-comments, parse and return the result

Change-Id: I5a046a9c7ba7e08a98cf643d5a26bc669539b38f
Related: OS#6900
</comment><date>2026-04-07 15:32:13 +0000</date><id>5e2fd148f89457e9fa83061aeb45cd59959c7735</id><msg>filesystem: edit_{binary,record}_decoded: add encode/decode examples</msg><path><editType>edit</editType><file>pySim/filesystem.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>pySim/filesystem.py</affectedPath><commitId>5828c92c6693414301639ab5b84dc75529fe27ab</commitId><timestamp>1775576842000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>filesystem: JsonEditor: use NamedTemporaryFile

A plain NamedTemporaryFile is sufficient here: we only need a single
file, not a directory to hold it.  Using NamedTemporaryFile is simpler
(no subdirectory to manage) and gives us a .json suffix for free,
which editors use for syntax highlighting.

Change-Id: If3b0bd0fcc90732407dbd03b9cc883f7abeb948e
</comment><date>2026-04-07 22:47:22 +0700</date><id>5828c92c6693414301639ab5b84dc75529fe27ab</id><msg>filesystem: JsonEditor: use NamedTemporaryFile</msg><path><editType>edit</editType><file>pySim/filesystem.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>pySim/filesystem.py</affectedPath><commitId>45220e00d567533cea4165d8e04994d8ef2ce365</commitId><timestamp>1775576842000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>filesystem: JsonEditor: offer interactive retry on error

When json.loads() fails (e.g. the user made a syntax mistake), prompt
the user with "Re-open file for editing? [y]es/[n]o:" and loop back to
the editor if they answer 'y' or 'yes'.  If the user declines, return
the original unmodified value so no write is attempted; the temp file
is still cleaned up by __exit__() in that case.

Change-Id: I9161b7becea0d8dfd3f5f740fbb253da2f061a1d
Related: OS#6899
</comment><date>2026-04-07 22:47:22 +0700</date><id>45220e00d567533cea4165d8e04994d8ef2ce365</id><msg>filesystem: JsonEditor: offer interactive retry on error</msg><path><editType>edit</editType><file>pySim/filesystem.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tests/unittests/test_files.py</affectedPath><affectedPath>pySim/ts_51_011.py</affectedPath><commitId>6b5fa38f147c41673bc89456984d0fe28c4c963b</commitId><timestamp>1775576842000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>tests: fix TransRecEF _test_de_encode to operate at file level

Previously, _test_de_encode vectors for TransRecEF subclasses were tested
via decode_record_hex()/encode_record_hex(), i.e. one record at a time,
with the decoded value being a scalar.

Switch test_de_encode_record() in TransRecEF_Test to use decode_hex() /
encode_hex() instead, so that vectors represent whole-file content
(decoded value is a list of records) -- consistent with how LinFixedEF
handles _test_de_encode.  Update all existing vectors accordingly.

Change-Id: I4a9610f9ee39833cd0c90f64f89f5fbdd6f0846d
</comment><date>2026-04-07 22:47:22 +0700</date><id>6b5fa38f147c41673bc89456984d0fe28c4c963b</id><msg>tests: fix TransRecEF _test_de_encode to operate at file level</msg><path><editType>edit</editType><file>tests/unittests/test_files.py</file></path><path><editType>edit</editType><file>pySim/ts_51_011.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>pySim/ts_51_011.py</affectedPath><commitId>f2567de387c71cf637a4cb1365089ba7173870b0</commitId><timestamp>1775576842000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><fullName>Vadim Yanitskiy</fullName></author><authorEmail>vyanitskiy@sysmocom.de</authorEmail><comment>pySim/ts_51_011.py: add multi-record test vector for EF_PL

Change-Id: I9f7a444b18056b1683cbd52a25af950125531746
</comment><date>2026-04-07 22:47:22 +0700</date><id>f2567de387c71cf637a4cb1365089ba7173870b0</id><msg>pySim/ts_51_011.py: add multi-record test vector for EF_PL</msg><path><editType>edit</editType><file>pySim/ts_51_011.py</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/fixeria</absoluteUrl><description></description><fullName>Vadim Yanitskiy</fullName><id>fixeria</id></culprit><culprit><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/laforge</absoluteUrl><description></description><fullName>laforge</fullName><id>laforge</id></culprit><culprit><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/pmaier</absoluteUrl><description></description><fullName>pmaier@sysmocom.de</fullName><id>pmaier</id></culprit></freeStyleBuild>