VirtualBox

Changeset 94129 in vbox


Ignore:
Timestamp:
Mar 8, 2022 2:57:25 PM (3 years ago)
Author:
vboxsync
Message:

testmanager: pylint 2.9.6 adjustments (mostly about using sub-optimal looping and 'with' statements).

Location:
trunk/src/VBox/ValidationKit/testmanager
Files:
23 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/ValidationKit/testmanager/batch/filearchiver.py

    r93115 r94129  
    123123
    124124                    utils.noxcptDeleteFile(sZipFileNm + '.tmp');
    125                     oZipFile = zipfile.ZipFile(sZipFileNm + '.tmp', 'w', zipfile.ZIP_DEFLATED, allowZip64 = True);
    126 
    127                     for sFile in asFiles:
    128                         sSuff = os.path.splitext(sFile)[1];
    129                         if sSuff in [ '.png', '.webm', '.gz', '.bz2', '.zip', '.mov', '.avi', '.mpg', '.gif', '.jpg' ]:
    130                             ## @todo Consider storing these files outside the zip if they are a little largish.
    131                             self.dprint('TestSet %d: Storing   %s...' % (idTestSet, sFile));
    132                             oZipFile.write(sSrcFileBase + sFile, sFile, zipfile.ZIP_STORED);
    133                         else:
    134                             self.dprint('TestSet %d: Deflating %s...' % (idTestSet, sFile));
    135                             oZipFile.write(sSrcFileBase + sFile, sFile, zipfile.ZIP_DEFLATED);
    136 
    137                     oZipFile.close();
     125                    with zipfile.ZipFile(sZipFileNm + '.tmp', 'w', zipfile.ZIP_DEFLATED, allowZip64 = True) as oZipFile:
     126                        for sFile in asFiles:
     127                            sSuff = os.path.splitext(sFile)[1];
     128                            if sSuff in [ '.png', '.webm', '.gz', '.bz2', '.zip', '.mov', '.avi', '.mpg', '.gif', '.jpg' ]:
     129                                ## @todo Consider storing these files outside the zip if they are a little largish.
     130                                self.dprint('TestSet %d: Storing   %s...' % (idTestSet, sFile));
     131                                oZipFile.write(sSrcFileBase + sFile, sFile, zipfile.ZIP_STORED);
     132                            else:
     133                                self.dprint('TestSet %d: Deflating %s...' % (idTestSet, sFile));
     134                                oZipFile.write(sSrcFileBase + sFile, sFile, zipfile.ZIP_DEFLATED);
    138135
    139136                    #
     
    216213        #
    217214        fRc = True;
    218         for idTestSet in dTestSets:
     215        for idTestSet, oTestSet in dTestSets.items():
    219216            try:
    220                 if self._processTestSet(idTestSet, dTestSets[idTestSet], sCurDir) is not True:
     217                if self._processTestSet(idTestSet, oTestSet, sCurDir) is not True:
    221218                    fRc = False;
    222219            except:
  • trunk/src/VBox/ValidationKit/testmanager/batch/vcs_import.py

    r93115 r94129  
    4343
    4444# Test Manager imports
    45 from testmanager.config                 import g_kaBugTrackers;
     45from testmanager.config                 import g_kdBugTrackers;
    4646from testmanager.core.db                import TMDatabaseConnection;
    4747from testmanager.core.vcsrevisions      import VcsRevisionData, VcsRevisionLogic;
     
    158158
    159159            # Analyze the raw message looking for bug tracker references.
    160             for sBugTrackerKey in g_kaBugTrackers:
    161                 oBugTracker = g_kaBugTrackers[sBugTrackerKey];
     160            for oBugTracker in g_kdBugTrackers.values():
    162161                for sTag in oBugTracker.asCommitTags:
    163162                    off = sRawMsg.find(sTag);
  • trunk/src/VBox/ValidationKit/testmanager/batch/virtual_test_sheriff.py

    r93874 r94129  
    340340
    341341        if self.oConfig.sLogFile:
    342             self.oLogFile = open(self.oConfig.sLogFile, "a");
     342            self.oLogFile = open(self.oConfig.sLogFile, "a");   # pylint: disable=consider-using-with
    343343            self.oLogFile.write('VirtualTestSheriff: $Revision$ \n');
    344344
     
    518518                        ## @todo maybe check the elapsed time here, it could still be a bad run?
    519519                        cOkay += 1;
    520                         if iFirstOkay > iSet:
    521                             iFirstOkay = iSet;
     520                        iFirstOkay = min(iFirstOkay, iSet);
    522521                if iSet > 10:
    523522                    break;
     
    10301029            #
    10311030            cHits = 0;
    1032             for iCpu in dStacks:
    1033                 asBacktrace = dStacks[iCpu];
     1031            for asBacktrace in dStacks.values():
    10341032                for iFrame in xrange(min(3, len(asBacktrace))):
    10351033                    if asBacktrace[iFrame].find('kvm_lock_spinning') >= 0:
  • trunk/src/VBox/ValidationKit/testmanager/cgi/logout2.py

    r93115 r94129  
    5252    oSrvGlue.setHeaderField('Status', '401 Unauthorized to access the document');
    5353    oSrvGlue.setHeaderField('WWW-authenticate', 'Basic realm="Test Manager"');
    54     if  (sUserAgent.startswith('Mozilla/') and sUserAgent.find('AppleWebKit/') > 0) \
    55      or False:
     54    if sUserAgent.startswith('Mozilla/') and sUserAgent.find('AppleWebKit/') > 0:
    5655        oSrvGlue.write('<p>Attempting to log out an Apple browser...</p>');
    5756    else:
  • trunk/src/VBox/ValidationKit/testmanager/config.py

    r93115 r94129  
    160160
    161161## The key is the database table
    162 g_kaBugTrackers = {
     162g_kdBugTrackers = {
    163163    'xtrk': BugTrackerConfig('xtrk', 'xTracker',        'https://linserv.de.oracle.com/vbox/xTracker/index.php?bug=',
    164164                             ['bugref:',    '@bugref{',    'bugef:', 'bugrf:', ], ),
  • trunk/src/VBox/ValidationKit/testmanager/core/build.py

    r93115 r94129  
    739739        asOsAgnosticArch = [];
    740740        asOsNoArch       = [];
    741         for i in range(len(oBuildEx.oCat.asOsArches)):
    742             asParts = oBuildEx.oCat.asOsArches[i].split('.');
     741        for sOsArch in oBuildEx.oCat.asOsArches:
     742            asParts = sOsArch.split('.');
    743743            if len(asParts) != 2 or not asParts[0] or not asParts[1]:
    744744                raise self._oDb.integrityException('Bad build asOsArches value: %s (idBuild=%s idBuildCategory=%s)'
    745                                                    % (oBuildEx.asOsArches[i], oBuildEx.idBuild, oBuildEx.idBuildCategory));
     745                                                   % (sOsArch, oBuildEx.idBuild, oBuildEx.idBuildCategory));
    746746            asOsNoArch.append(asParts[0] + '.noarch');
    747747            asOsNoArch.append('os-agnostic.' + asParts[1]);
  • trunk/src/VBox/ValidationKit/testmanager/core/report.py

    r93115 r94129  
    12221222            #
    12231223            for oSeries in oCollection.aoSeries:
    1224                 for i in range(len(oSeries.aiRevisions)):
    1225                     oSeries.aoRevInfo.append(self.oCache.getVcsRevInfo(sCurRepository, oSeries.aiRevisions[i]));
     1224                for iRevision in oSeries.aiRevisions:
     1225                    oSeries.aoRevInfo.append(self.oCache.getVcsRevInfo(sCurRepository, iRevision));
    12261226            aoRet.append(oCollection);
    12271227
  • trunk/src/VBox/ValidationKit/testmanager/core/restdispatcher.py

    r93115 r94129  
    220220        if not os.path.exists(os.path.dirname(sFile)):
    221221            os.makedirs(os.path.dirname(sFile), 0o755);
    222         oFile = open(sFile, 'ab');
    223 
    224         # Check the size.
    225         fSizeOk = True;
    226         if not fIgnoreSizeCheck:
    227             oStat = os.fstat(oFile.fileno());
    228             fSizeOk = oStat.st_size / (1024 * 1024) < config.g_kcMbMaxMainLog;
    229 
    230         # Write the text.
    231         if fSizeOk:
    232             if sys.version_info[0] >= 3:
    233                 oFile.write(bytes(sText, 'utf-8'));
    234             else:
    235                 oFile.write(sText);
    236 
    237         # Done
    238         oFile.close();
     222
     223        with open(sFile, 'ab') as oFile:
     224            # Check the size.
     225            fSizeOk = True;
     226            if not fIgnoreSizeCheck:
     227                oStat = os.fstat(oFile.fileno());
     228                fSizeOk = oStat.st_size / (1024 * 1024) < config.g_kcMbMaxMainLog;
     229
     230            # Write the text.
     231            if fSizeOk:
     232                if sys.version_info[0] >= 3:
     233                    oFile.write(bytes(sText, 'utf-8'));
     234                else:
     235                    oFile.write(sText);
     236
    239237        return fSizeOk;
    240238
  • trunk/src/VBox/ValidationKit/testmanager/core/schedulerbeci.py

    r93115 r94129  
    7575        #
    7676        cMaxItems = len(oData.aoArgsVariations) * 64;
    77         if cMaxItems > 1048576:
    78             cMaxItems = 1048576;
     77        cMaxItems = min(cMaxItems, 1048576);
    7978
    8079        aoItems   = list();
  • trunk/src/VBox/ValidationKit/testmanager/core/testboxcontroller.py

    r93115 r94129  
    327327        if not os.path.exists(os.path.dirname(sFile)):
    328328            os.makedirs(os.path.dirname(sFile), 0o755);
    329         oFile = open(sFile, 'ab');
    330 
    331         # Check the size.
    332         fSizeOk = True;
    333         if not fIgnoreSizeCheck:
    334             oStat = os.fstat(oFile.fileno());
    335             fSizeOk = oStat.st_size / (1024 * 1024) < config.g_kcMbMaxMainLog;
    336 
    337         # Write the text.
    338         if fSizeOk:
    339             if sys.version_info[0] >= 3:
    340                 oFile.write(bytes(sText, 'utf-8'));
    341             else:
    342                 oFile.write(sText);
    343 
    344         # Done
    345         oFile.close();
     329
     330        with open(sFile, 'ab') as oFile:
     331            # Check the size.
     332            fSizeOk = True;
     333            if not fIgnoreSizeCheck:
     334                oStat = os.fstat(oFile.fileno());
     335                fSizeOk = oStat.st_size / (1024 * 1024) < config.g_kcMbMaxMainLog;
     336
     337            # Write the text.
     338            if fSizeOk:
     339                if sys.version_info[0] >= 3:
     340                    oFile.write(bytes(sText, 'utf-8'));
     341                else:
     342                    oFile.write(sText);
     343
    346344        return fSizeOk;
    347345
  • trunk/src/VBox/ValidationKit/testmanager/core/testcase.py

    r93115 r94129  
    902902            dErrors = {};
    903903
    904             for iVar in range(len(self.aoTestCaseArgs)):
    905                 oVar = copy.copy(self.aoTestCaseArgs[iVar]);
     904            for iVar, oVar in enumerate(self.aoTestCaseArgs):
     905                oVar = copy.copy(oVar);
    906906                oVar.idTestCase = self.idTestCase;
    907907                dCurErrors = oVar.validateAndConvert(oDb, ModelDataBase.ksValidateFor_Other);
     
    915915                aoNewValues.append(oVar);
    916916
    917             for iVar in range(len(self.aoTestCaseArgs)):
    918                 sArgs = self.aoTestCaseArgs[iVar].sArgs;
     917            for iVar, oVar in enumerate(self.aoTestCaseArgs):
     918                sArgs = oVar.sArgs;
    919919                for iVar2 in range(iVar + 1, len(self.aoTestCaseArgs)):
    920920                    if self.aoTestCaseArgs[iVar2].sArgs == sArgs:
  • trunk/src/VBox/ValidationKit/testmanager/core/testset.py

    r93115 r94129  
    194194        sFile1 = os.path.join(config.g_ksFileAreaRootDir, self.sBaseFilename + '-' + sFilename);
    195195        try:
    196             oFile = open(sFile1, sMode);
     196            oFile = open(sFile1, sMode);                        # pylint: disable=consider-using-with
    197197            return (oFile, os.fstat(oFile.fileno()).st_size, False);
    198198        except Exception as oXcpt1:
     
    200200            sFile2 = os.path.join(config.g_ksZipFileAreaRootDir, self.sBaseFilename + '.zip');
    201201            try:
    202                 oZipFile    = zipfile.ZipFile(sFile2, 'r');
    203                 oFile       = oZipFile.open(sFilename, sMode if sMode != 'rb' else 'r');
     202                oZipFile    = zipfile.ZipFile(sFile2, 'r');                              # pylint: disable=consider-using-with
     203                oFile       = oZipFile.open(sFilename, sMode if sMode != 'rb' else 'r'); # pylint: disable=consider-using-with
    204204                cbFile      = oZipFile.getinfo(sFilename).file_size;
    205205                return (oFile, cbFile, True);
     
    230230            if not os.path.exists(os.path.dirname(sFile1)):
    231231                os.makedirs(os.path.dirname(sFile1), 0o755);
    232             oFile = open(sFile1, sMode);
     232            oFile = open(sFile1, sMode);                        # pylint: disable=consider-using-with
    233233        except Exception as oXcpt1:
    234234            return str(oXcpt1);
  • trunk/src/VBox/ValidationKit/testmanager/core/webservergluebase.py

    r93115 r94129  
    138138        self._oDbgFile         = sys.stderr;
    139139        if config.g_ksSrvGlueDebugLogDst is not None and config.g_kfSrvGlueDebug is True:
    140             self._oDbgFile = open(config.g_ksSrvGlueDebugLogDst, 'a');
     140            self._oDbgFile = open(config.g_ksSrvGlueDebugLogDst, 'a');  # pylint: disable=consider-using-with
    141141            if config.g_kfSrvGlueCgiDumpArgs:
    142142                self._oDbgFile.write('Arguments: %s\nEnvironment:\n' % (sys.argv,));
     
    303303        """
    304304        if self._fHeaderWrittenOut is False:
    305             for sKey in self._dHeaderFields:
    306                 self._writeHeader('%s: %s\n' % (sKey, self._dHeaderFields[sKey]));
     305            for sKey, sValue in self._dHeaderFields.items():
     306                self._writeHeader('%s: %s\n' % (sKey, sValue,));
    307307            self._fHeaderWrittenOut = True;
    308308            self._writeHeader('\n'); # End of header indicator.
     
    462462
    463463        try:
    464             oFile = open(sLogFile, 'w');
    465             oFile.write(sError + '\n\n');
    466             if aXcptInfo[0] is not None:
    467                 oFile.write(' B a c k t r a c e\n');
    468                 oFile.write('===================\n');
    469                 oFile.write(cgitb.text(aXcptInfo, 5));
    470                 oFile.write('\n\n');
    471 
    472             oFile.write(' D e b u g   I n f o\n');
    473             oFile.write('=====================\n\n');
    474             self._fHtmlDebugOutput = False;
    475             self.debugDumpStuff(oFile.write);
    476 
    477             oFile.close();
     464            with open(sLogFile, 'w') as oFile:
     465                oFile.write(sError + '\n\n');
     466                if aXcptInfo[0] is not None:
     467                    oFile.write(' B a c k t r a c e\n');
     468                    oFile.write('===================\n');
     469                    oFile.write(cgitb.text(aXcptInfo, 5));
     470                    oFile.write('\n\n');
     471
     472                oFile.write(' D e b u g   I n f o\n');
     473                oFile.write('=====================\n\n');
     474                self._fHtmlDebugOutput = False;
     475                self.debugDumpStuff(oFile.write);
    478476        except:
    479477            fRc = False;
  • trunk/src/VBox/ValidationKit/testmanager/db/TestManagerDatabaseInit.pgsql

    r93115 r94129  
    13301330    --- The version control tree revision number.
    13311331    iRevision           INTEGER     NOT NULL,
    1332     --- The bug tracker identifier - see g_kaBugTrackers in config.py.
     1332    --- The bug tracker identifier - see g_kdBugTrackers in config.py.
    13331333    sBugTracker         CHAR(4)     NOT NULL,
    13341334    --- The bug number in the bug tracker.
  • trunk/src/VBox/ValidationKit/testmanager/db/tmdb-r24-vcsbugreferences-1.pgsql

    r93115 r94129  
    3737    --- The version control tree revision number.
    3838    iRevision           INTEGER     NOT NULL,
    39     --- The bug tracker identifier - see g_kaBugTrackers in config.py.
     39    --- The bug tracker identifier - see g_kdBugTrackers in config.py.
    4040    sBugTracker         CHAR(4)     NOT NULL,
    4141    --- The bug number in the bug tracker.
  • trunk/src/VBox/ValidationKit/testmanager/webui/wuiadmin.py

    r93115 r94129  
    498498            # Open and send the dump.
    499499            #
    500             oFile = open(sOutFile, 'rb');
     500            oFile = open(sOutFile, 'rb');                       # pylint: disable=consider-using-with
    501501            cbFile = os.fstat(oFile.fileno()).st_size;
    502502
  • trunk/src/VBox/ValidationKit/testmanager/webui/wuibase.py

    r93115 r94129  
    238238        # Provide basic auth log out for browsers that supports it.
    239239        sUserAgent = self._oSrvGlue.getUserAgent();
    240         if   (sUserAgent.startswith('Mozilla/') and sUserAgent.find('Firefox') > 0) \
    241           or False:
     240        if sUserAgent.startswith('Mozilla/') and sUserAgent.find('Firefox') > 0:
    242241            # Log in as the logout user in the same realm, the browser forgets
    243242            # the old login and the job is done. (see apache sample conf)
    244243            sLogOut = ' (<a href="%s://logout:logout@%s%slogout.py">logout</a>)' \
    245244                % (self._oSrvGlue.getUrlScheme(), self._oSrvGlue.getUrlNetLoc(), self._oSrvGlue.getUrlBasePath());
    246         elif (sUserAgent.startswith('Mozilla/') and sUserAgent.find('Safari') > 0) \
    247           or False:
     245        elif sUserAgent.startswith('Mozilla/') and sUserAgent.find('Safari') > 0:
    248246            # For a 401, causing the browser to forget the old login. Works
    249247            # with safari as well as the two above. Since safari consider the
     
    254252            sLogOut = ' (<a href="logout2.py">logout</a>)'
    255253        elif (sUserAgent.startswith('Mozilla/') and sUserAgent.find('MSIE') > 0) \
    256           or (sUserAgent.startswith('Mozilla/') and sUserAgent.find('Chrome') > 0) \
    257           or False:
     254          or (sUserAgent.startswith('Mozilla/') and sUserAgent.find('Chrome') > 0):
    258255            ## There doesn't seem to be any way to make IE really log out
    259256            # without using a cookie and systematically 401 accesses based on
     
    315312        # Load the template.
    316313        #
    317         oFile = open(os.path.join(self._oSrvGlue.pathTmWebUI(), self._sTemplate));
    318         sTmpl = oFile.read();
    319         oFile.close();
     314        with open(os.path.join(self._oSrvGlue.pathTmWebUI(), self._sTemplate)) as oFile:
     315            sTmpl = oFile.read();
    320316
    321317        #
     
    12361232    def dprint(self, sText):
    12371233        """ Debug printing. """
    1238         if config.g_kfWebUiDebug and True:
     1234        if config.g_kfWebUiDebug:
    12391235            self._oSrvGlue.dprint(sText);
  • trunk/src/VBox/ValidationKit/testmanager/webui/wuicontentbase.py

    r93115 r94129  
    11151115        if len(aiColumns) <= len(self._aiSelectedSortColumns):
    11161116            aiColumns    = list(aiColumns);
    1117             aiNegColumns = list([-i for i in aiColumns]);
     1117            aiNegColumns = list([-i for i in aiColumns]);   # pylint: disable=consider-using-generator
    11181118            i = 0;
    11191119            while i + len(aiColumns) <= len(self._aiSelectedSortColumns):
  • trunk/src/VBox/ValidationKit/testmanager/webui/wuigraphwiz.py

    r93115 r94129  
    238238        cMaxPerGraph = self._dParams[WuiMain.ksParamGraphWizMaxPerGraph];
    239239        aaoRet = [];
    240         for iUnit in dUnitSeries:
    241             aoUnitSeries = dUnitSeries[iUnit];
     240        for aoUnitSeries in dUnitSeries.values():
    242241            while len(aoUnitSeries) > cMaxPerGraph:
    243242                aaoRet.append(aoUnitSeries[:cMaxPerGraph]);
     
    562561                        if len(oSeries.aoRevInfo) == len(oSeries.aiRevisions):
    563562                            asHtmlTooltips = [];
    564                             for i in range(len(oSeries.aoRevInfo)):
     563                            for i, oRevInfo in enumerate(oSeries.aoRevInfo):
    565564                                sPlusMinus = '';
    566565                                if oSeries.acSamples[i] > 1:
     
    576575                                             oSeries.aiRevisions[i],
    577576                                             );
    578                                 oRevInfo = oSeries.aoRevInfo[i];
    579577                                if oRevInfo.sAuthor is not None:
    580578                                    sMsg = oRevInfo.sMessage[:80].strip();
     
    630628                                       sUnit );
    631629
    632                             for i in range(len(oSeries.aiRevisions)):
     630                            for i, iRevision in enumerate(oSeries.aiRevisions):
    633631                                sHtml += '     <tr class="%s"><td>r%s</td><td>%s</td><td>+%s</td><td>-%s</td><td>%s</td></tr>\n' \
    634632                                       % ( 'tmodd' if i & 1 else 'tmeven',
    635                                            oSeries.aiRevisions[i], oSeries.aiValues[i],
     633                                           iRevision, oSeries.aiValues[i],
    636634                                           oSeries.aiErrorBarAbove[i], oSeries.aiErrorBarBelow[i],
    637635                                           oSeries.acSamples[i]);
  • trunk/src/VBox/ValidationKit/testmanager/webui/wuihlpform.py

    r93115 r94129  
    737737            # Argument variations.
    738738            aidTestCaseArgs = [] if oMember is None or oMember.aidTestCaseArgs is None else oMember.aidTestCaseArgs;
    739             for iVar in range(len(oTestCase.aoTestCaseArgs)):
    740                 oVar = oTestCase.aoTestCaseArgs[iVar];
     739            for iVar, oVar in enumerate(oTestCase.aoTestCaseArgs):
    741740                if iVar > 0:
    742741                    self._add('  <tr class="%s">\n' % ('tmodd' if iTestCase & 1 else 'tmeven',));
  • trunk/src/VBox/ValidationKit/testmanager/webui/wuihlpgraphmatplotlib.py

    r93115 r94129  
    129129        for i in range(1, len(aoTable)):
    130130            asNames.append(aoTable[i].sName);
    131             for j in range(len(aoTable[i].aoValues)):
    132                 fpValue = float(aoTable[i].aoValues[j]);
     131            for j, oValue in enumerate(aoTable[i].aoValues):
     132                fpValue = float(oValue);
    133133                aoSeries[j].append(fpValue);
    134134                if fpValue < fpMin:
  • trunk/src/VBox/ValidationKit/testmanager/webui/wuihlpgraphsimple.py

    r93115 r94129  
    8383                                    'border="0" cellspacing="0" cellpadding="0">\n' \
    8484                     % (escapeElem(oRow.sName), escapeAttr(str(self.cxMaxBar + 2)));
    85             for j in range(len(oRow.aoValues)):
    86                 oValue = oRow.aoValues[j];
     85            for j, oValue in enumerate(oRow.aoValues):
    8786                cPct   = int(float(oValue) * 100 / fpMax);
    8887                cxBar  = int(float(oValue) * self.cxMaxBar / fpMax);
     
    125124        sReport += '<div class="tmgraphlegend">\n' \
    126125                   '  <p>Legend:\n';
    127         for j in range(len(aoTable[0].asValues)):
     126        for j, sValue in enumerate(aoTable[0].asValues):
    128127            sColor = self.kasColors[j % len(self.kasColors)];
    129             sReport += '    <font color="%s">&#x25A0; %s</font>\n' \
    130                      % (sColor, escapeElem(aoTable[0].asValues[j]));
     128            sReport += '    <font color="%s">&#x25A0; %s</font>\n' % (sColor, escapeElem(sValue),);
    131129        sReport += '  </p>\n' \
    132130                   '</div>\n';
  • trunk/src/VBox/ValidationKit/testmanager/webui/wuilogviewer.py

    r93115 r94129  
    150150        # Figure the end offset.
    151151        offEnd = offFile + self._cbChunk;
    152         if offEnd > cbFile:
    153             offEnd = cbFile;
     152        offEnd = min(offEnd, cbFile);
    154153
    155154        #
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette