Bug 13877

Summary: apt-shell crashes if one answers "no" to commit
Product: Sisyphus Reporter: Ivan Zakharyaschev <imz>
Component: aptAssignee: placeholder <placeholder>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: normal    
Priority: P2 CC: boyarsh, glebfm, imz, lav, ldv, placeholder, shakirov
Version: unstable   
Hardware: all   
OS: Linux   

Description Ivan Zakharyaschev 2008-01-05 08:20:11 MSK
apt-0.5.15lorg2-alt18

Looks like https://bugzilla.altlinux.org/show_bug.cgi?id=4707#c1 .
Steps to Reproduce:
Valid for any package:

# ftp_proxy= http_proxy= apt-shell 
Reading Package Lists... Done
Building Dependency Tree... Done
Welcome to the APT shell. Type "help" for more information.
apt> install libnotify-devel 
apt> commit 
The following NEW packages will be installed:
  libnotify-devel
0 upgraded, 1 newly installed, 0 removed and 1234 not upgraded.
Need to get 5710B of archives.
After unpacking 8343B of additional disk space will be used.
Do you want to continue? [Y/n] n
Abort.
#
Comment 1 Lenar Shakirov 2010-11-06 13:50:00 MSK
Воспроизводится:

# rpm -q apt rpm
apt-0.5.15lorg2-alt33
rpm-4.0.4-alt100.1
Comment 2 Ivan Zakharyaschev 2011-08-08 22:32:59 MSK
Reproduced with:

apt-0.5.15lorg2-alt38
rpm-4.0.4-alt100.24
Comment 3 Vitaly Lipatov 2012-05-23 19:18:40 MSK
Это ужасно неприятная бага, мешающая методом подбора подобрать хорошее решение.
Там специально написан такой код, который вызывает завершение просто при ответе "нет".

Предлагаю внести следующее исправление (на себе проверил):

diff --git a/apt/cmdline/apt-shell.cc b/apt/cmdline/apt-shell.cc
index 1dcfc06..c26885f 100644
--- a/apt/cmdline/apt-shell.cc
+++ b/apt/cmdline/apt-shell.cc
@@ -1101,8 +1101,7 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true,
       c2out << flush;
       if (AnalPrompt(Prompt) == false)
       {
-        c2out << _("Abort.") << endl;
-        exit(1);
+        return true;
       }     
    }
    else
@@ -1120,8 +1119,7 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true,
         
            if (YnPrompt() == false)
            {
-              c2out << _("Abort.") << endl;
-              exit(1);
+              return true;
            }     
         }
Comment 4 Dmitry V. Levin 2012-05-23 19:22:49 MSK
Может быть, любое другое продолжение работы apt-shell после отказа от коммита переводит apt-shell в неконсистентное состояние?
Comment 5 Vitaly Lipatov 2012-05-23 20:25:01 MSK
(В ответ на комментарий №4)
> Может быть, любое другое продолжение работы apt-shell после отказа от коммита
> переводит apt-shell в неконсистентное состояние?

Из функции InstallPackage много раз выходят с помощью return. К тому же на этом этапе ничего ещё дельного не произошло.

Так что я считаю, что никакого неконсистентного состояния там не возникает. На себе проверил.
Comment 6 Repository Robot 2012-05-24 22:11:47 MSK
apt-0.5.15lorg2-alt41 -> sisyphus:

* Thu May 24 2012 Dmitry V. Levin <ldv@altlinux> 0.5.15lorg2-alt41
- apt-get, apt-shell: when a package could not be found, print the
  unmangled package request string (by Igor Vlasenko; closes: #27364).
- apt-shell: do not abort when commit is cancelled (closes: #13877);
  Unlike one may suppose, this change will not cause the cache of
  accumulated changes to be cleared by cancelled "commit" operation, but
  this is exactly what Vitaly Lipatov has proposed in his comments to #13877.
Comment 7 Vitaly Lipatov 2012-05-26 15:16:13 MSK
Спасибо!
Comment 8 Ivan Zakharyaschev 2014-01-09 22:44:57 MSK
Спасибо!