{
  "_class" : "hudson.model.FreeStyleBuild",
  "actions" : [
    {
      "_class" : "hudson.model.CauseAction",
      "causes" : [
        {
          "_class" : "hudson.triggers.TimerTrigger$TimerTriggerCause",
          "shortDescription" : "Started by timer"
        }
      ]
    },
    {
      "_class" : "hudson.model.ParametersAction",
      "parameters" : [
        {
          "_class" : "hudson.model.StringParameterValue",
          "name" : "BRANCH",
          "value" : "master"
        },
        {
          "_class" : "hudson.model.StringParameterValue",
          "name" : "EMAIL_NOTIFICATIONS",
          "value" : "jenkins-notifications@lists.osmocom.org"
        }
      ]
    },
    {
      "_class" : "jenkins.metrics.impl.TimeInQueueAction",
      "blockedDurationMillis" : 0,
      "blockedTimeMillis" : 0,
      "buildableDurationMillis" : 30,
      "buildableTimeMillis" : 30,
      "buildingDurationMillis" : 472185,
      "executingTimeMillis" : 472185,
      "executorUtilization" : 1.0,
      "subTaskCount" : 0,
      "waitingDurationMillis" : 1,
      "waitingTimeMillis" : 1
    },
    {
      "_class" : "hudson.plugins.git.util.BuildData",
      "buildsByBranchName" : {
        "origin/master" : {
          "_class" : "hudson.plugins.git.util.Build",
          "buildNumber" : 558,
          "buildResult" : null,
          "marked" : {
            "SHA1" : "f2567de387c71cf637a4cb1365089ba7173870b0",
            "branch" : [
              {
                "SHA1" : "f2567de387c71cf637a4cb1365089ba7173870b0",
                "name" : "origin/master"
              }
            ]
          },
          "revision" : {
            "SHA1" : "f2567de387c71cf637a4cb1365089ba7173870b0",
            "branch" : [
              {
                "SHA1" : "f2567de387c71cf637a4cb1365089ba7173870b0",
                "name" : "origin/master"
              }
            ]
          }
        },
        "refs/remotes/origin/osmith/wip" : {
          "_class" : "hudson.plugins.git.util.Build",
          "buildNumber" : 5,
          "buildResult" : null,
          "marked" : {
            "SHA1" : "b52b9704ed57386959a73c98e946c756e0188e6c",
            "branch" : [
              {
                "SHA1" : "b52b9704ed57386959a73c98e946c756e0188e6c",
                "name" : "refs/remotes/origin/osmith/wip"
              }
            ]
          },
          "revision" : {
            "SHA1" : "b52b9704ed57386959a73c98e946c756e0188e6c",
            "branch" : [
              {
                "SHA1" : "b52b9704ed57386959a73c98e946c756e0188e6c",
                "name" : "refs/remotes/origin/osmith/wip"
              }
            ]
          }
        },
        "refs/remotes/origin/master" : {
          "_class" : "hudson.plugins.git.util.Build",
          "buildNumber" : 253,
          "buildResult" : null,
          "marked" : {
            "SHA1" : "c7c48718ba3637e29fc6a7af4e2e39ba0679bb8d",
            "branch" : [
              {
                "SHA1" : "c7c48718ba3637e29fc6a7af4e2e39ba0679bb8d",
                "name" : "refs/remotes/origin/master"
              }
            ]
          },
          "revision" : {
            "SHA1" : "c7c48718ba3637e29fc6a7af4e2e39ba0679bb8d",
            "branch" : [
              {
                "SHA1" : "c7c48718ba3637e29fc6a7af4e2e39ba0679bb8d",
                "name" : "refs/remotes/origin/master"
              }
            ]
          }
        }
      },
      "lastBuiltRevision" : {
        "SHA1" : "f2567de387c71cf637a4cb1365089ba7173870b0",
        "branch" : [
          {
            "SHA1" : "f2567de387c71cf637a4cb1365089ba7173870b0",
            "name" : "origin/master"
          }
        ]
      },
      "remoteUrls" : [
        "https://gerrit.osmocom.org/pysim"
      ],
      "scmName" : ""
    },
    {
      
    },
    {
      
    },
    {
      "_class" : "org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction"
    }
  ],
  "artifacts" : [
    
  ],
  "building" : false,
  "description" : null,
  "displayName" : "#558",
  "duration" : 472185,
  "estimatedDuration" : 473668,
  "executor" : null,
  "fullDisplayName" : "simtester-sanitize #558",
  "id" : "558",
  "inProgress" : false,
  "keepLog" : false,
  "number" : 558,
  "queueId" : 83246,
  "result" : "SUCCESS",
  "timestamp" : 1775608980752,
  "url" : "https://jenkins.osmocom.org/jenkins/job/simtester-sanitize/558/",
  "builtOn" : "simtester",
  "changeSet" : {
    "_class" : "hudson.plugins.git.GitChangeSetList",
    "items" : [
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/transport/pcsc.py"
        ],
        "commitId" : "d5aa963caa89ea804aa86a098c6ccc41d30e2840",
        "timestamp" : 1775127210000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
          "fullName" : "pmaier@sysmocom.de"
        },
        "authorEmail" : "pmaier@sysmocom.de",
        "comment" : "pysim/pcsc: do not use getProtocol for protocol selection\u000a\u000aThe documentation of the getProtocol provided by pyscard says:\u000a\u000a\"Return bit mask for the protocol of connection, or None if no\u000aprotocol set. The return value is a bit mask of\u000aCardConnection.T0_protocol, CardConnection.T1_protocol,\u000aCardConnection.RAW_protocol, CardConnection.T15_protocol\"\u000a\u000aThis suggests that the purpose of getProtocol is not to determine\u000awhich protocols are supported. Its purpose is to determine which\u000aprotocol is currently selected (either through auto selection or\u000athrough the explicit selection made by the API user). This means\u000awe are using getProtocol wrong.\u000a\u000aSo far this was no problem, since the auto-selected protocol\u000ashould be a supported protocol anyway. However, the automatic\u000aprotocol selection may not always return a correct result (see\u000abug report from THD-siegfried [1]).\u000a\u000aLet's not trust the automatic protocol selection. Instead let's\u000aparse the ATR and make the decision based on the TD1/TD2 bytes).\u000a\u000a[1] https://osmocom.org/issues/6952\u000a\u000aRelated: OS#6952\u000aChange-Id: Ib119948aa68c430e42ac84daec8b9bd542db7963\u000a",
        "date" : "2026-04-02 12:53:30 +0200",
        "id" : "d5aa963caa89ea804aa86a098c6ccc41d30e2840",
        "msg" : "pysim/pcsc: do not use getProtocol for protocol selection",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/transport/pcsc.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "docs/index.rst",
          ".gitignore",
          "docs/pysim_fs_sphinx.py",
          "docs/conf.py",
          "tests/unittests/test_fs_coverage.py"
        ],
        "commitId" : "fc932a2ee9a4dbecb4eec9fcdb97d95cae78708b",
        "timestamp" : 1775575933000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "docs: auto-generate Card Filesystem Reference\u000a\u000aAdd a Sphinx extension (docs/pysim_fs_sphinx.py) that hooks into the\u000abuilder-inited event and generates docs/filesystem.rst before Sphinx\u000areads any source files.\u000a\u000aThe generated page contains a hierarchical listing of all implemented\u000aEFs and DFs, organised by application/specification (UICC/TS 102 221,\u000aADF.USIM/TS 31.102, ADF.ISIM/TS 31.103, SIM/TS 51.011).  For each file,\u000athe class docstring and any _test_de_encode / _test_decode vectors\u000aare included as an encoding/decoding example table.\u000a\u000adocs/filesystem.rst is fully generated at build time and is therefore\u000aadded to .gitignore.\u000a\u000aAdd tests/unittests/test_fs_coverage.py that walks all pySim.* modules\u000aand verifies that every CardProfile, CardApplication, and standalone\u000aCardDF subclass with EF/DF children is either listed in the SECTIONS\u000a(and will appear in the docs) or explicitly EXCLUDED.\u000a\u000aChange-Id: I06ddeefc6c11e04d7c24e116f3f39c8a6635856f\u000aRelated: OS#6316\u000a",
        "date" : "2026-04-07 15:32:13 +0000",
        "id" : "fc932a2ee9a4dbecb4eec9fcdb97d95cae78708b",
        "msg" : "docs: auto-generate Card Filesystem Reference",
        "paths" : [
          {
            "editType" : "add",
            "file" : "tests/unittests/test_fs_coverage.py"
          },
          {
            "editType" : "edit",
            "file" : "docs/index.rst"
          },
          {
            "editType" : "edit",
            "file" : "docs/conf.py"
          },
          {
            "editType" : "add",
            "file" : "docs/pysim_fs_sphinx.py"
          },
          {
            "editType" : "edit",
            "file" : ".gitignore"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/filesystem.py"
        ],
        "commitId" : "5e2fd148f89457e9fa83061aeb45cd59959c7735",
        "timestamp" : 1775575933000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
          "fullName" : "laforge"
        },
        "authorEmail" : "laforge@osmocom.org",
        "comment" : "filesystem: edit_{binary,record}_decoded: add encode/decode examples\u000a\u000aWhen invoking `edit_binary_decoded` or `edit_record_decoded`, the\u000atemp file opened in the editor now contains the EF's encode/decode\u000atest vectors as //-comment lines below the JSON content, similar to\u000ahow 'git commit' appends comments to the commit message template.\u000aThe comment block is stripped before JSON parsing on save,\u000aso it has no effect on the written data.\u000a\u000aThe feature is implemented via a new module-level JsonEditor context\u000amanager class that encapsulates the full edit cycle:\u000a\u000a* write JSON + examples to a TemporaryDirectory\u000a* invoke the editor\u000a* read back, strip //-comments, parse and return the result\u000a\u000aChange-Id: I5a046a9c7ba7e08a98cf643d5a26bc669539b38f\u000aRelated: OS#6900\u000a",
        "date" : "2026-04-07 15:32:13 +0000",
        "id" : "5e2fd148f89457e9fa83061aeb45cd59959c7735",
        "msg" : "filesystem: edit_{binary,record}_decoded: add encode/decode examples",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/filesystem.py"
        ],
        "commitId" : "5828c92c6693414301639ab5b84dc75529fe27ab",
        "timestamp" : 1775576842000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/fixeria",
          "fullName" : "Vadim Yanitskiy"
        },
        "authorEmail" : "vyanitskiy@sysmocom.de",
        "comment" : "filesystem: JsonEditor: use NamedTemporaryFile\u000a\u000aA plain NamedTemporaryFile is sufficient here: we only need a single\u000afile, not a directory to hold it.  Using NamedTemporaryFile is simpler\u000a(no subdirectory to manage) and gives us a .json suffix for free,\u000awhich editors use for syntax highlighting.\u000a\u000aChange-Id: If3b0bd0fcc90732407dbd03b9cc883f7abeb948e\u000a",
        "date" : "2026-04-07 22:47:22 +0700",
        "id" : "5828c92c6693414301639ab5b84dc75529fe27ab",
        "msg" : "filesystem: JsonEditor: use NamedTemporaryFile",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/filesystem.py"
        ],
        "commitId" : "45220e00d567533cea4165d8e04994d8ef2ce365",
        "timestamp" : 1775576842000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/fixeria",
          "fullName" : "Vadim Yanitskiy"
        },
        "authorEmail" : "vyanitskiy@sysmocom.de",
        "comment" : "filesystem: JsonEditor: offer interactive retry on error\u000a\u000aWhen json.loads() fails (e.g. the user made a syntax mistake), prompt\u000athe user with \"Re-open file for editing? [y]es/[n]o:\" and loop back to\u000athe editor if they answer 'y' or 'yes'.  If the user declines, return\u000athe original unmodified value so no write is attempted; the temp file\u000ais still cleaned up by __exit__() in that case.\u000a\u000aChange-Id: I9161b7becea0d8dfd3f5f740fbb253da2f061a1d\u000aRelated: OS#6899\u000a",
        "date" : "2026-04-07 22:47:22 +0700",
        "id" : "45220e00d567533cea4165d8e04994d8ef2ce365",
        "msg" : "filesystem: JsonEditor: offer interactive retry on error",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/filesystem.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_51_011.py",
          "tests/unittests/test_files.py"
        ],
        "commitId" : "6b5fa38f147c41673bc89456984d0fe28c4c963b",
        "timestamp" : 1775576842000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/fixeria",
          "fullName" : "Vadim Yanitskiy"
        },
        "authorEmail" : "vyanitskiy@sysmocom.de",
        "comment" : "tests: fix TransRecEF _test_de_encode to operate at file level\u000a\u000aPreviously, _test_de_encode vectors for TransRecEF subclasses were tested\u000avia decode_record_hex()/encode_record_hex(), i.e. one record at a time,\u000awith the decoded value being a scalar.\u000a\u000aSwitch test_de_encode_record() in TransRecEF_Test to use decode_hex() /\u000aencode_hex() instead, so that vectors represent whole-file content\u000a(decoded value is a list of records) -- consistent with how LinFixedEF\u000ahandles _test_de_encode.  Update all existing vectors accordingly.\u000a\u000aChange-Id: I4a9610f9ee39833cd0c90f64f89f5fbdd6f0846d\u000a",
        "date" : "2026-04-07 22:47:22 +0700",
        "id" : "6b5fa38f147c41673bc89456984d0fe28c4c963b",
        "msg" : "tests: fix TransRecEF _test_de_encode to operate at file level",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          },
          {
            "editType" : "edit",
            "file" : "tests/unittests/test_files.py"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "pySim/ts_51_011.py"
        ],
        "commitId" : "f2567de387c71cf637a4cb1365089ba7173870b0",
        "timestamp" : 1775576842000,
        "author" : {
          "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/fixeria",
          "fullName" : "Vadim Yanitskiy"
        },
        "authorEmail" : "vyanitskiy@sysmocom.de",
        "comment" : "pySim/ts_51_011.py: add multi-record test vector for EF_PL\u000a\u000aChange-Id: I9f7a444b18056b1683cbd52a25af950125531746\u000a",
        "date" : "2026-04-07 22:47:22 +0700",
        "id" : "f2567de387c71cf637a4cb1365089ba7173870b0",
        "msg" : "pySim/ts_51_011.py: add multi-record test vector for EF_PL",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "pySim/ts_51_011.py"
          }
        ]
      }
    ],
    "kind" : "git"
  },
  "culprits" : [
    {
      "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/fixeria",
      "fullName" : "Vadim Yanitskiy"
    },
    {
      "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/laforge",
      "fullName" : "laforge"
    },
    {
      "absoluteUrl" : "https://jenkins.osmocom.org/jenkins/user/pmaier",
      "fullName" : "pmaier@sysmocom.de"
    }
  ]
}