# changelog

author: Todd Allen <todd.allen@etallen.com> 1.8.3
changelog:
  - yum 3.2.21 and later are handling Obsoletes: at least well enough to make 
    addObsoletes unnecessary any more.  Further, it is incompatible with 
    addObsoleted circa 3.2.29 or so.  Disable it for those versions >= 3.2.21.
  - The QThreads need to block until the eventLoop.exec's are started so that they 
    don't exit the eventLoop before it's even execed. Use the blocker consistently 
    in all *Real routines, and move the blocker.release into a singleShot action 
    so that it happens after the eventLoop is execed.  (It's weird that this 
    failure hasn't been seen before.)


author: Todd Allen <todd.allen@etallen.com> 1.8.4
changelog:
  - Fixed SIGSEGV caused by PasswdTextEdit::textChanged replacing the real 
    QTextEdit's cursor.  That was a problem if the textChanged was triggered by a 
    Backspace KeyPress event, because QTextEdit's handling for that event tried to 
    use the old (deleted) cursor after it sent the textChanged signal.
  - Improved handling of python exception data for error reporting by making 
    pyStringX deal with more built-in data types, and by making pythonExceptionV 
    use pyStringXDec.


author: Todd Allen <todd.allen@etallen.com> 1.9
changelog:
  - Override urlgrabber.grabber to make it convert unicode strings into ascii 
    strings before they get passed into pycurl's setopt, which may refuse them.
  - Clean up logging.handlers.SysLogHandler to remove redundant copying of methods 
    from the superclass.
  - Clean up YumCliRpmCallback overridings of _maktfmt and scriptout which are 
    redundant for all versions of yum, and wrong for newer versions of yum.
  - Added support for operations on non-default architecture packages when 
    multiple architectures are present (e.g. i386 packages on x86_64 systems).  
    They appear side-by-side and can be operated on independently.  Transaction 
    numbers are computed as best as possible within the limitations of information 
    available from yum.
  - Added support for detecting and filtering duplicate packages (e.g. name.i386 
    and name.x86_64).  If there are two or more such packages, the best one is 
    determined based on rpm's architecture scores.  Any others are considered 
    duplicates and can be filtered out with a checkbox.
  - Turn on DEBUG in the verbose_logger so that TSINFO lines come through into 
    YumIO::log and YumIO::dsTsInfo.
  - Deal with full nevra information in dsTsNewPkg for yum 2.9.2 and later.
  - Workaround bug in some versions of rsyslog where they misinterpret all UTF-8 
    encoded messages as high priority emergency messages.  Do this by overriding 
    logging.handlers.SysLogHandler to format all messages as simple ASCII.


author: Todd Allen <todd.allen@etallen.com> 1.9.1
changelog:
  - Remove -L option to the location of libpython.a so that libpython.so will be 
    used instead.  This avoids problems when python is later upgraded and some 
    interfaces become built-in (e.g. os.urandom on RHEL5).  The -L option is 
    retained for python 2.2 builds, because it has only the static library.


author: Todd Allen <todd.allen@etallen.com> 1.9.2
changelog:
  - While in the middle of a clearEntries* operation, make the access functions 
    return values as if the YumIO contained no packages. This avoids a race 
    condition where count() returned non-zero, but moments later operator[] 
    returned garbage.


author: Todd Allen <todd.allen@etallen.com> 1.9.3
changelog:
  - Reenable addObsoletes for yum 3.2.21 - 3.2.28.  The built-in functionality in 
    yum isn't fully formed until 3.2.29, so it still is needed until then.  (Fixes 
    regression in 1.8.3 for yum versions 3.2.21 - 3.2.28.)
  - Use distutils.version.StrictVersion for yumVersion so that a version like 
    '3.2.8' will cause a test like yumVersion() < '3.2.21' to yield True.  (Fixes 
    regression in 1.8.3 for yum versions 3.2.3 - 3.2.9.)
  - Rearranged test & debug sudo commands to set NUUSHARE=. environment variable 
    even if the sudo configuration resets the environment.


author: Todd Allen <todd.allen@etallen.com> 1.9.4
changelog:
  - Fixed dsTsFindPkg() to parse [epoch:]name-version-release.arch instead of 
    name-[epoch:]version-release.arch.  Change the version in which this became 
    necessary from 2.9.2 to 3.2.9.


author: Todd Allen <todd.allen@etallen.com> 1.9.5
changelog:
  - New script to convert ChangeLog into a format acceptable to rpm's %changelog 
    section.
  - Convert and add the ChangeLog to the rpms' %changelog sections.
  - Deal with missing QItemSelectionModel::hasSelection() before Qt 4.2.
  - Add missing dataChanged() signal to setAction(). It matters more with Qt 4.1.
  - Deal with missing QAbstractItemModel::modelAboutToBeReset() before Qt 4.2 by 
    calling clear() on the packageTableSortedModel manually all over the place.
  - Made sortedModel visible to the RepoEditor::Dialog, instead of hiding it 
    within the View.
  - Implement cleverer sorting for repos with version numbers, so that "Repo 2.10" 
    > "Repo 2.9".
  - Set Apply button enabled state correctly in response to action column context 
    menu.
  - disable Apply button after applying previous transaction.
  - Make context menu action-related changes apply to a whole selection, if one 
    exists.
  - Made PackageTable::SortFilterProxyModel visible to the MainWindow, instead of 
    hiding it within the View.  Removed passthrough interfaces from the View.
  - add clear() slot, and connected modelReset() to it.  Made it clear the in[] 
    array.
  - Treat CentOS as identical to RHEL.


author: Todd Allen <todd.allen@etallen.com> 1.10
changelog:
  - Claim support for rpm-python 4.11.
  - Clean up distro name to eliminate sub-minor numbers (e.g. 7.0.1406 -> 7.0).  
    Clean up distro name for rhel7 to exclude minor numbers (rhel7.0 -> rhel7).
  - Override brp-python-bytecompile by specifying __python as /bin/true.  (The 
    build scheme already builds YumIO.pyc.)
  - Claim support for python 2.7 and yum 3.4.
  - Changed clear() into clearCache(), for use when connected to 
    modelAboutToBeReset(), and made clear() also call 
    HSortFilterProxyModel::clear().  This fixes a regression in 1.9.5 where 
    changing the non-text filter widgets didn't update the package list 
    immediately.
  - Reorganize the types into a new Progress namespace to clean the code up.
  - Remove explicit keyword from ThreadsState copy constructor to mollify 
    gcc-3.4.4.
  - Fixed problems with strange font choices in Qt 4.8 on CentOS 7.0.  To get a 
    monospaced font, it's necessary to know the name of a monospace font.  
    "Courier" doesn't exist on CentOS 7.0.  So, now try a list of known monospaced 
    fonts until one actually is found. As a final fallback, use "Monospace".
  - Fixed uninitialized ts.parallel.begun (affects older versions of yum).
  - Fixed build problems with Qt 4.1 by disabling the tooltip support.  But it 
    shouldn't be needed on anything that old.
  - Fixed progress back-up in collectFailure.
  - For "parallel" activities that have only one thread, change the activity name 
    to the single activity once it's known.
  - Avoid cascade exceptions caused by corrupted metadata in getFiles() and 
    getChangeLog().
  - Handle exceptions caused by corrupted metadata in setupRepos, apply, 
    collectFileLists and collectOther.
  - Added support for parallel download failures and retries.
  - Added support for showing progress with parallel downloads during the collect 
    and apply/run phases.  Some information about the individual downloads is 
    provided in a tooltip.  (Sadly, not their progress, because yum fails to pass 
    that information in the callbacks.)
  - Added distro_error_2 rule to check for DISTRO variables with spaces, which 
    implies the sed rules need an update.
  - Updated DISTRO sed rules with CentOS 7.0 wording.
  - Allow python 2.7.
  - Reorder #include's to ensure that <Python.h> ultimately is parsed first.  
    Arguably, this rule is insane (see http://bugs.python.org/issue1045893), but 
    nonetheless it must be dealt with.
  - In the constructor, initialize entry with NULL instead of a reference to 
    itself.
  - #ifdef the definition and setting of "found" in cases where it never is used.  
    Done to appease gcc 4.8.2.


author: Todd Allen <todd.allen@etallen.com> 1.10.1
changelog:
  - in setVisible(), call currentChanged(-1, -1) to disable all the buttons that 
    require a valid current row.  On the first show() of the dialog, 
    currentChanged automatically is called and set to a valid row, so this is 
    overridden immediately.  But on all other calls of show(), the current index 
    is left in an invalid state, and the buttons must reflect that.  (At least, 
    this is the behavior of Qt 4.8.5; older versions of Qt didn't always behave 
    this way.)
  - Do sanity checks on the value of currentRow(), and bail out if it's -1.  This 
    is done in: browse(), edit(), copy(), and reset().
  - Deal with subscription-manager's use of true threading:
  - Hold PyGILState during YumIO::initialize().
  - In Python::initialize(), no longer call PyEval_ReleaseLock.  Instead, in 
    YumIO::execWorkThread, use the PyThreadStateWrapper to temporarily release the 
    GIL to work threads using PyEval_SaveThread/PyEval_RestoreThread.
  - These approaches do not work with python2.2, so they're ifdef'ed.


author: Todd Allen <todd.allen@etallen.com> 1.11
changelog:
  - Change ok, warning, and error labels to use black text on a colored background 
    within a frame.  The frame is visible only if there is text to be displayed.  
    This should make these labels stand out better.
  - Changed "Set Update of All Out-of-Date" button to "Set Update of Listed".  If 
    the Mode, Filter, Search, State, Duplicates, and Group settings are default, 
    then this works exactly the same as before.  But if they are set to anything 
    more restrictive, the button only will set Update on packages actually listed 
    given the current settings.  This was because of overwhelming user request for 
    this behavior instead of the previous behavior.
  - Added warning label when unlisted actions are present.  That is, when actions 
    have been specified for some packages, but because of changes to any of the 
    filter settings, they no longer are listed.
  - Added sqlite3.OperationalError handler to several functions. This catches when 
    some other tool locks a repo's sqlite database while NUU is running.  
    (PackageKit has a tendency to do this.)
  - Added addition yum.Errors.RepoError handlers for different ways that sqlite 
    database locking can be reported.
  - Moved common exception handlers for many yum calls into commExceptSetup() and 
    commExceptRaised(), to cut down on code replication.  To accomodate this, 
    lookup all the exceptions that might use either of these two in initialize().  
    This is because one must not do a pyLookup() inside commExceptRaised().
  - Added exception handlers for KeyboardInterrupt, which can be raised in yum's 
    output.py and grabber.py.  Although NUU goes to some effort to disable the 
    python SIGINT handler in its own threads, this doesn't happen in the Python 
    threads created by subscription-manager. And grabber.py can manually generate 
    a KeyboardInterrupt if a system call was aborted (IOError) with e.errno = 
    EINTR.


author: Todd Allen <todd.allen@etallen.com> 1.11.1
changelog:
  - Added handler for NoMoreMirrorsRepoError, so it isn't reported as an internal 
    error.
  - Added YumIOCapturersUser objects to collectFileListsReal and 
    collectOtherDataReal too, so that walkbacks generated for unexpected 
    exceptions will be captured in the Log window.  Also to the parts of 
    collectReal that call python collectUpdates and collectAll.
  - Fixed pyExceptValue and pyExceptValuef to retain the exception information.  
    This is so YumIO::commExceptRaised can check the value and possibly call 
    exceptionError().
  - Added and called applyFailCleanup if an apply call fails for any reason.  One 
    possible reason is a user pressing Ctrl-C to send SIGINT to NUU.  If that 
    happened, during a later transaction, rpmdb would remember it and call 
    exit(1).  To prevent that, applyFailCleanup calls closeRpmDB, which indirectly 
    makes rpmdb forget about the previously caught signals.
  - Add exception handler for AssertionError.
  - In setupTip, place a cap on the number of Done items so we don't end up with 
    tooltips much larger than the height of the screen during multi-hundred 
    package transactions.
  - Made the fixed size of the Unlisted Actions warning frame be based on its 
    initial sizeHint instead of its initial size (which appears to be just the 
    arbitrary value 100).
  - Added a comment to the internal python exception error saying to get the 
    walkback from the Log window.  (Because it usually is impossible to figure 
    them out without the walkback.)
  - in commExceptRaised, improve error message for IOError to include information 
    from errno/strerror, instead of just assuming a broken pipe.  Also, provide a 
    walkback.
  - in commExceptRaised, improve error message for KeyboardInterrupt to indicate 
    that it actually was KeyboardInterrupt, but with a caveat about urlgrabber's 
    crazy usages.  Also, provide a walkback.
  - Added sigchld{Disable,Restore} functions and use them around the call to 
    apply().  This disables the Qt SIGCHLD signal handler while doing the apply(). 
     That handler was problematic during apply because an exit of applydeltarpm at 
    an inopportune moment could cause urlgrabber's call to epoll_wait to return 
    early with EINTR.  And urlgrabber copes with that very poorly by raising 
    KeyboardInterrupt. The handler must be restored before any chance of a QThread 
    exiting.


author: Todd Allen <todd.allen@etallen.com> 1.11.2
changelog:
  - Fix a bug that prevented cache files from being updated automatically with yum 
    3.4.3, by changing command from 'info' to 'makecache fast'.  When in read-only 
    mode, the cache file update mechanisms were disabled.


author: Todd Allen <todd.allen@etallen.com> 1.11.3
changelog:
  - Add LIB test for aarch64.
  - In apply() after doTransaction, call history.close(), if it exists.  This is 
    to release any sqlite lock.  This should correct many false "a repository's 
    sqlite database was locked unexpectedly" errors during second transactions in 
    versions of yum 3.2.25 or later, assuming neither yum nor PackageKit really is 
    responsible for them.


author: Todd Allen <todd.allen@etallen.com> 1.11.4
changelog:
  - Changed solution for readStdout/ReadStderr race condition to use invokeMethod 
    instead of singleShot so that it doesn't violate singleShot thread rules.  
    Also, change QMutex to QSemaphore so it doesn't produce bogus "Deadlock 
    detected" warnings.
  - Add YumIOApplyGrabMeter.failure method and supporting functions.  
    YumIO::applyGrabMeterFailure handles it as a retry just like what happens for 
    failures during collect.
  - Resolve a race condition where readStdout() or readStderr() could be called 
    simultaneously by the main thread (either because of normal I/O or because 
    ~YumIOCapturers called minion->deleteLater), and by a work thread via 
    deactivate(). deactivate() now uses a single shot timer to cause the main 
    thread to perform the actions and uses a QMutex to wait for that to complete. 
    This restores the original intent that readStdout() and readStderr() would 
    only ever be called by the main thread.  It fixes an occasional SIGSEGV caused 
    by double-free of the YumIO::wr.stdoutBuffer or YumIO::wr.stderrBuffer.
  - Eliminate the unused deactivated member, and used initialized instead.


author: Todd Allen <todd.allen@etallen.com> 1.11.5
changelog:
  - Corrected code in noteTransactionPkgs to mark only the individual packages 
    based on the verrel information in the txmbr.
  - Fixed problems in Progress rate-limit code that didn't just prevent 
    too-frequent updates of the GUI, but also prevented the math to calculate the 
    progress.  This particularly broke parallel download progress.
  - for yum versions without hasTransTest(), add a missing endItemActs() call to 
    terminate the PG_R_GRAB_RPMS.
  - clear ts.act count in userconfirm to reset it between Depsolve (PG_D_*) and 
    Run Transaction (PG_R_*) progress meters.
  - properly attribute PG_R_TEST_TRANS_ESTIMATE progress with newer yum versions 
    which have no specific callback for that.
  - Changed debug dumps.
  - Remove dsTsLog, which was neither defined nor called.
  - Handle multiple VERREL's of the same package installed simultaneously for both 
    UPDATE and REMOVE actions.
  - For VERREL tooltips, report on multiple versions even if the package is not 
    OUT_OF_DATE.
  - Remove trailing newline from VERREL tooltip.


author: Todd Allen <todd.allen@etallen.com> 1.11.5
changelog:
  - Renamed findPackageAction to findPackage and changed its 2nd argument into a 
    query member function pointer.  Added two queries: hasNotStartedUpdate and 
    hasNotStartedRemove.  They check not only the action, but also find a version 
    of the package that still has entries not yet marked with apply.started.  This 
    solves a bug that arose with the reimplemtation of UNINST handling for 
    multiple VERREL removals in 1.11.5, where it would malfunction when updating 
    or removing multiple copies of the same package which differed in their 
    architecture.


author: Todd Allen <todd.allen@etallen.com> 1.11.7
changelog:
  - For oddball architectures, make getBiArch() return the input string, instead 
    of throwing an exception.
  - Make pyString() handle a NULL.  This avoids a cascade SIGSEGV if an earlier 
    unhandled exception produced a NULL for the input object.


author: Todd Allen <todd.allen@etallen.com> 1.11.8
changelog:
  - Added generalized confirm queries.
  - Expect confirmation requests for installation of GPG keys, and convey them to 
    the user correctly.
  - Change company name to Concurrent Real-Time
  - Change ccur.com to concurrent-rt.com
  - Change ccur.com to concurrent-rt.com & change company name to Concurrent 
    Real-Time
  - Change ccur.com to concurrent-rt.com


author: Todd Allen <todd.allen@etallen.com> 1.8.1
changelog:
  - Shortened rhel5.x and rhel6.x release names to just rhel5 and rhel6, since the 
    minor numbers for them don't seem to affect compatibility.
  - Workaround bug in yum 2.2.2 where closeRpmDB doesn't clear the localdbimported 
    flag, causing any new rpmdb not to be populated correctly.  collectDone and 
    unlock each clear this flag manually after calling closeRpmDB.
  - In exception cases, PyErr_Clear and also pg->reset() if appropriate.  This 
    clears out any innocuous exceptions (e.g. NoMoreMirrorsRepoError) left over 
    from one operation so that they don't pollute subsequent operations.
  - Remove Py_DECREF in exception cases because the result is NULL.


author: Todd Allen <todd.allen@etallen.com> 1.8.2
changelog:
  - Added  --mode, --regexp, --state, and --groups options (and shorter forms).
  - Added --mode, --regexp, --state, and --groups options (and shorter forms).


