~ubuntu-branches/debian/wheezy/dpkg/wheezy

« back to all changes in this revision

Viewing changes to dselect/pkglist.cc

  • Committer: Bazaar Package Importer
  • Author(s): Guillem Jover, Guillem Jover, Raphaël Hertzog, Jonathan Nieder, Steve Langasek, Mark Hymers, Updated programs translations, Updated man page translations, Updated scripts translations, Updated dselect translations
  • Date: 2011-04-01 23:56:54 UTC
  • Revision ID: james.westby@ubuntu.com-20110401235654-8y800dtb75skfrh7
Tags: 1.16.0
[ Guillem Jover ]
* Use DPKG_MAINTSCRIPT_PACKAGE environment variable as package name on
  dpkg-divert when no --package or --local options have been specified.
* Do not allow versions starting with non-digit when doing strict parsing,
  warn otherwise.
* Update dpkg(1) to note that --status-fd output does not contain newlines
  in error messages anymore (this was fixed in 1.15.0).
* Add a new --status-logger option to dpkg, similar to --status-fd but
  instead invoke the command ourselves and feed the status information
  to its standard input. Suggested by Raphaël Hertzog.
* Add missing space in update-alternative --set-selections output.
* Add missing options to update-alternative --help output.
* Count “conffile name is duplicated” for dpkg-deb warning count summary.
* Improve and clarify strings for translation. Closes: #604914
* Prefix all fatal error messages with “error: ”.
* Do not check presence of update-rc.d in the PATH in dpkg, as it's not
  a program needed for dpkg correct operation.
* Fix dpkg -GEO options on multiple versions of the same packages.
  Closes: #31141
* Propagate --admindir to programs run from maintainer scritpts.
  Closes: #97076
* Do not fail when trying to remove the root directory. This will only
  happen either on distributions where dpkg is a foreign package manager,
  or on artificial dpkg databases.
* Always warn when parsing any package control data which does not have
  an Architecture field except for status and status log files when
  packages are not-installed or half-installed.
* By default reject installing packages w/o an Architecture field. They
  now need --force-architecture, dpkg will still warn about them though.
* Fix build failure when passing --disable-nls to configure.
* Do not segfault on “dpkg -i --no-act”.
* Add missing semicolon to the vsnprintf() compat declaration.
  Thanks to Robert Millan. Closes: #612203
* On install for Ubuntu adjust the i386 GNU cpu name in cputable.
  Thanks to Colin Watson <cjwatson@ubuntu.com>. Closes: #611741
* Sync the info database directory on unpack instead of the temporary
  control information directory, and print the correct pathname on error
  instead of the last file acted on that directory.
* Document in dpkg-query --help output and man page that --list and --show
  arguments are optional.
* Do not read and write the available file unnecessarily.
  Thanks to Michel Lespinasse <walken@zoy.org>. Closes: #397121
* Fix typo in «dpkg-name --overwrite» argument parsing so that it actually
  works at all. Thanks to Ivan Gagis <igagis@gmail.com>. LP: #728708
* Add armhf support to ostable and triplettable. Closes: #594179
* Set the modification time for unpacked symlinks on supported systems.
* Fix undefined value useage in dpkg-genchanges when adding files w/o a
  matching architecture, because they are not present in debian/control,
  this is most commonly the case due to dpkg-distaddfile.
* Terminate immediately on dpkg-divert rename errors instead of propagating
  up the error codes, this improves error reporting and avoids triggering
  leak detectors. Closes: #620380
* When moving a diverted file across filesystems in dpkg-divert, remove
  the source file.

[ Raphaël Hertzog ]
* Fail properly when debian/source/format is empty. Closes: #600854
* Add new deb-src-control(5) manual page documenting the debian/control
  file contained in source packages.
  - it documents the X[SBC]- prefix. Closes: #476335
  - it documents the VCS-* fields too. Closes: #483119
  Thanks to Oxan van Leeuwen <oxan@oxanvanleeuwen.nl> who wrote it
  as part of the Google Code In program.
* Enhance dpkg-shlibdeps to not fail immediatly when a library is not found.
  Instead continue and fail after all problems have been reported. Thanks
  to Chris Baines <cbaines8@gmail.com> for the patch. Closes: #596841
* Fix dpkg-source to not list Debian packaging files as modified
  upstream files in Format "1.0" when unpacking to a non-standard
  directory.
* Apply patch from Colin Watson to let dpkg-buildflags return -O3
  instead of -O2 when building ppc64 packages on Ubuntu. Closes: #612472
* Add new function get_control_path() to Dpkg::Path, it wraps dpkg-query
  --control-path.
* Update dpkg-shlibdeps to be multiarch-ready:
  - use get_control_path() to find symbols/shlibs files
  - parse correctly the output of dpkg --search
* Small fix to support files >2GB in .deb on 64-bit systems. Closes: #616502
  Thanks to Martin Dorey <mdorey@bluearc.com> for the patch.
* dpkg-source now keeps the file ordering in the autogenerated patch when
  regenerating it. Closes: #606080
  Thanks to Colin Watson for the patch.
* dpkg-source now uses a timestamp retrieved from the filesystem when
  resetting the timestamp of patched files so that a time skew when using
  NFS doesn't introduce any inconsistency. Closes: #613023
  Thanks to Jonathan Nieder <jrnieder@gmail.com> for the patch and the
  diagnosis.
* dpkg-source will now remove quilt's .pc directory when --unapply-patches
  is in use. Closes: #591858
* dpkg-source is now a bit less strict when parsing patches:
  - it accepts seeing the same file twice; Closes: #608829
  - it doesn't match on the English text "No newline at end of file" as it
    might be translated in some cases. Closes: #612465
* Improve parser in Dpkg::Control::Hash to not require an empty line
  before the PGP signature. Closes: #617923
  Thanks to Roger Leigh for the initial patch.
* Fix a regression in dpkg-divert where using --rename led to a failure when
  the rename implies crossing file systems. Thanks to Durk Strooisma for
  spotting it.
* Use the correct mtime when installing a file with statoverrides.
  Regression introduced in 1.16.0. LP: #739179
* Remove duplicate word in german translation of dpkg(1). Closes: #616096
* Strip repeated non-significant spaces before and after newlines
  in Uploaders. Closes: #598922
* Ignore whitespaces after options in headers of changelog entries.
  Closes: #605719
* Fix dpkg-source's regression with empty patches (introduced while fixing
  #613023). Closes: #619541

[ Jonathan Nieder ]
* Remove support for use of synchronous sync(2), due to its pernicious
  side-effects and to ease maintenance.
* Clarify that an up-to-date dpkg only needs to be unpacked for
  dpkg-maintscript-helper to work.

[ Steve Langasek ]
* Add new variables to dpkg-architecture, DEB_HOST_MULTIARCH and
  DEB_BUILD_MULTIARCH, that return the "ideal" GNU triplet for each
  architecture which should be used as the path component for library
  installation.

[ Mark Hymers ]
* Add support for Built-Using field. Closes: #619311

[ Updated programs translations ]
* German (Sven Joachim).
* Portuguese (Miguel Figueiredo).
* Spanish (Javier Fernandez-Sanguino).
* Swedish (Peter Krefting).

[ Updated man page translations ]
* German (Helge Kreutzmann).
* Swedish (Peter Krefting).

[ Updated scripts translations ]
* German (Helge Kreutzmann).
* Swedish (Peter Krefting).

[ Updated dselect translations ]
* Spanish (Javier Fernandez-Sanguino).

Show diffs side-by-side

added added

removed removed

Lines of Context:
117
117
    delete[] table;
118
118
    table= newtable;
119
119
  }
120
 
  
121
 
  if (debug) fprintf(debug,"packagelist[%p]::addheading(%d,%d,%d,%s,%s)\n",
122
 
                     this,ssavail,ssstate,priority,
123
 
                     otherpriority ? otherpriority : "<null>",
124
 
                     section ? section : "<null>");
 
120
 
 
121
  debug(dbg_general, "packagelist[%p]::addheading(%d,%d,%d,%s,%s)",
 
122
        this, ssavail, ssstate, priority,
 
123
        otherpriority ? otherpriority : "<null>",
 
124
        section ? section : "<null>");
125
125
 
126
126
  struct pkginfo *newhead= new pkginfo;
127
127
  newhead->name= 0;
136
136
  newstate->ssavail= ssavail;
137
137
  newstate->ssstate= ssstate;
138
138
  newhead->clientdata= newstate;
139
 
 
 
139
 
140
140
  table[nitems++]= newstate;
141
141
}
142
142
 
150
150
void packagelist::sortinplace() {
151
151
  sortpackagelist= this;
152
152
 
153
 
  if (debug) fprintf(debug,"packagelist[%p]::sortinplace()\n",this);
154
 
  qsort(table,nitems,sizeof(struct pkginfoperfile*),qsort_compareentries);
 
153
  debug(dbg_general, "packagelist[%p]::sortinplace()", this);
 
154
  qsort(table, nitems, sizeof(struct pkgbin *), qsort_compareentries);
155
155
}
156
156
 
157
157
void packagelist::ensurestatsortinfo() {
159
159
  const struct versionrevision *vera;
160
160
  struct pkginfo *pkg;
161
161
  int index;
162
 
  
163
 
  if (debug) fprintf(debug,"packagelist[%p]::ensurestatsortinfos() "
164
 
                     "sortorder=%d nitems=%d\n",this,statsortorder,nitems);
165
 
  
 
162
 
 
163
  debug(dbg_general,
 
164
        "packagelist[%p]::ensurestatsortinfos() sortorder=%d nitems=%d",
 
165
        this, statsortorder, nitems);
 
166
 
166
167
  switch (statsortorder) {
167
168
  case sso_unsorted:
168
 
    if (debug) fprintf(debug,"packagelist[%p]::ensurestatsortinfos() unsorted\n",this);
 
169
    debug(dbg_general, "packagelist[%p]::ensurestatsortinfos() unsorted", this);
169
170
    return;
170
171
  case sso_avail:
171
 
    if (debug) fprintf(debug,"packagelist[%p]::ensurestatsortinfos() calcssadone=%d\n",
172
 
                       this,calcssadone);
 
172
    debug(dbg_general, "packagelist[%p]::ensurestatsortinfos() calcssadone=%d",
 
173
          this, calcssadone);
173
174
    if (calcssadone) return;
174
175
    for (index=0; index < nitems; index++) {
175
 
      if (debug)
176
 
        fprintf(debug,"packagelist[%p]::ensurestatsortinfos() i=%d pkg=%s\n",
177
 
                this,index,table[index]->pkg->name);
 
176
      debug(dbg_general, "packagelist[%p]::ensurestatsortinfos() i=%d pkg=%s",
 
177
            this, index, table[index]->pkg->name);
178
178
      pkg= table[index]->pkg;
179
179
      switch (pkg->status) {
180
180
      case pkginfo::stat_unpacked:
212
212
      default:
213
213
        internerr("unknown stat in ensurestatsortinfo sso_avail");
214
214
      }
215
 
      if (debug)
216
 
        fprintf(debug,"packagelist[%p]::ensurestatsortinfos() i=%d ssavail=%d\n",
217
 
                this,index,table[index]->ssavail);
218
 
  
 
215
      debug(dbg_general,
 
216
            "packagelist[%p]::ensurestatsortinfos() i=%d ssavail=%d",
 
217
            this, index, table[index]->ssavail);
219
218
    }
220
219
    calcssadone= 1;
221
220
    break;
222
221
  case sso_state:
223
 
    if (debug) fprintf(debug,"packagelist[%p]::ensurestatsortinfos() calcsssdone=%d\n",
224
 
                       this,calcsssdone);
 
222
    debug(dbg_general, "packagelist[%p]::ensurestatsortinfos() calcsssdone=%d",
 
223
          this, calcsssdone);
225
224
    if (calcsssdone) return;
226
225
    for (index=0; index < nitems; index++) {
227
 
      if (debug)
228
 
        fprintf(debug,"packagelist[%p]::ensurestatsortinfos() i=%d pkg=%s\n",
229
 
                this,index,table[index]->pkg->name);
 
226
      debug(dbg_general, "packagelist[%p]::ensurestatsortinfos() i=%d pkg=%s",
 
227
            this, index, table[index]->pkg->name);
230
228
      switch (table[index]->pkg->status) {
231
229
      case pkginfo::stat_unpacked:
232
230
      case pkginfo::stat_halfconfigured:
247
245
      default:
248
246
        internerr("unknown stat in ensurestatsortinfo sso_state");
249
247
      }
250
 
      if (debug)
251
 
        fprintf(debug,"packagelist[%p]::ensurestatsortinfos() i=%d ssstate=%d\n",
252
 
                this,index,table[index]->ssstate);
253
 
  
 
248
      debug(dbg_general,
 
249
            "packagelist[%p]::ensurestatsortinfos() i=%d ssstate=%d",
 
250
            this, index, table[index]->ssstate);
254
251
    }
255
252
    calcsssdone= 1;
256
253
    break;
265
262
  sortinplace();
266
263
  assert(nitems);
267
264
 
268
 
  if (debug) fprintf(debug,"packagelist[%p]::sortmakeheads() "
269
 
                     "sortorder=%d statsortorder=%d\n",this,sortorder,statsortorder);
270
 
  
 
265
  debug(dbg_general,
 
266
        "packagelist[%p]::sortmakeheads() sortorder=%d statsortorder=%d",
 
267
        this, sortorder, statsortorder);
 
268
 
271
269
  int nrealitems= nitems;
272
270
  addheading(ssa_none,sss_none,pkginfo::pri_unset,0,0);
273
271
 
276
274
 
277
275
  // Important: do not save pointers into table in this function, because
278
276
  // addheading may need to reallocate table to make it larger !
279
 
  
 
277
 
280
278
  struct pkginfo *lastpkg;
281
279
  struct pkginfo *thispkg;
282
280
  lastpkg= 0;
301
299
    default:
302
300
      internerr("unknown statsortorder in sortmakeheads");
303
301
    }
304
 
    
 
302
 
305
303
    int prioritydiff= (!lastpkg ||
306
304
                       thispkg->priority != lastpkg->priority ||
307
305
                       (thispkg->priority == pkginfo::pri_other &&
310
308
                      strcasecmp(thispkg->section ? thispkg->section : "",
311
309
                                 lastpkg->section ? lastpkg->section : ""));
312
310
 
313
 
    if (debug) fprintf(debug,"packagelist[%p]::sortmakeheads()"
314
 
                       " pkg=%s  state=%d avail=%d %s  priority=%d"
315
 
                       " otherpriority=%s %s  section=%s %s\n",
316
 
                       this, thispkg->name,
317
 
                       thispkg->clientdata->ssavail,
318
 
                       thispkg->clientdata->ssstate,
319
 
                       ssdiff ? "*diff" : "same",
320
 
                       thispkg->priority,
321
 
                       thispkg->priority != pkginfo::pri_other ? "<none>"
322
 
                       : thispkg->otherpriority ? thispkg->otherpriority
323
 
                       : "<null>",
324
 
                       prioritydiff ? "*diff*" : "same",
325
 
                       thispkg->section ? thispkg->section : "<null>",
326
 
                       sectiondiff ? "*diff*" : "same");
 
311
    debug(dbg_general,
 
312
          "packagelist[%p]::sortmakeheads() pkg=%s  state=%d avail=%d %s  "
 
313
          "priority=%d otherpriority=%s %s  section=%s %s",
 
314
          this, thispkg->name,
 
315
          thispkg->clientdata->ssavail, thispkg->clientdata->ssstate,
 
316
          ssdiff ? "*diff" : "same",
 
317
          thispkg->priority,
 
318
          thispkg->priority != pkginfo::pri_other ? "<none>" :
 
319
          thispkg->otherpriority ? thispkg->otherpriority : "<null>",
 
320
          prioritydiff ? "*diff*" : "same",
 
321
          thispkg->section ? thispkg->section : "<null>",
 
322
          sectiondiff ? "*diff*" : "same");
327
323
 
328
324
    if (ssdiff)
329
325
      addheading(ssavail,ssstate,
330
326
                 pkginfo::pri_unset,0, 0);
331
 
    
 
327
 
332
328
    if (sortorder == so_section && sectiondiff)
333
329
      addheading(ssavail,ssstate,
334
330
                 pkginfo::pri_unset,0, thispkg->section ? thispkg->section : "");
335
 
    
 
331
 
336
332
    if (sortorder == so_priority && prioritydiff)
337
333
      addheading(ssavail,ssstate,
338
334
                 thispkg->priority,thispkg->otherpriority, 0);
339
 
    
 
335
 
340
336
    if (sortorder != so_alpha && (prioritydiff || sectiondiff))
341
337
      addheading(ssavail,ssstate,
342
338
                 thispkg->priority,thispkg->otherpriority,
343
339
                 thispkg->section ? thispkg->section : "");
344
 
    
 
340
 
345
341
    lastpkg= thispkg;
346
342
  }
347
343
 
348
344
  if (listpad) {
349
345
    werase(listpad);
350
346
  }
351
 
  
 
347
 
352
348
  sortinplace();
353
349
}
354
350
 
355
351
void packagelist::initialsetup() {
356
 
  if (debug)
357
 
    fprintf(debug,"packagelist[%p]::initialsetup()\n",this);
 
352
  debug(dbg_general, "packagelist[%p]::initialsetup()", this);
358
353
 
359
 
  int allpackages= countpackages();
 
354
  int allpackages = pkg_db_count();
360
355
  datatable= new struct perpackagestate[allpackages];
361
356
 
362
357
  nallocated= allpackages+150; // will realloc if necessary, so 150 not critical
374
369
void packagelist::finalsetup() {
375
370
  setcursor(0);
376
371
 
377
 
  if (debug)
378
 
    fprintf(debug,"packagelist[%p]::finalsetup done; recursive=%d nitems=%d\n",
379
 
            this, recursive, nitems);
 
372
  debug(dbg_general, "packagelist[%p]::finalsetup done; recursive=%d nitems=%d",
 
373
        this, recursive, nitems);
380
374
}
381
375
 
382
376
packagelist::packagelist(keybindings *kb) : baselist(kb) {
384
378
  initialsetup();
385
379
  struct pkgiterator *iter;
386
380
  struct pkginfo *pkg;
387
 
  
 
381
 
388
382
  nitems = 0;
389
 
  iter = iterpkgstart();
390
 
  while ((pkg = iterpkgnext(iter))) {
 
383
 
 
384
  iter = pkg_db_iter_new();
 
385
  while ((pkg = pkg_db_iter_next(iter))) {
391
386
    struct perpackagestate *state= &datatable[nitems];
392
387
    state->pkg= pkg;
393
388
    if (pkg->status == pkginfo::stat_notinstalled &&
415
410
    table[nitems]= state;
416
411
    nitems++;
417
412
  }
418
 
  iterpkgend(iter);
 
413
  pkg_db_iter_free(iter);
419
414
 
420
415
  if (!nitems)
421
416
    ohshit(_("There are no packages."));
430
425
packagelist::packagelist(keybindings *kb, pkginfo **pkgltab) : baselist(kb) {
431
426
  // takes over responsibility for pkgltab (recursive)
432
427
  initialsetup();
433
 
  
 
428
 
434
429
  recursive= 1;
435
430
  nitems= 0;
436
431
  if (pkgltab) {
437
432
    add(pkgltab);
438
433
    delete[] pkgltab;
439
434
  }
440
 
    
 
435
 
441
436
  sortorder= so_unsorted;
442
437
  statsortorder= sso_unsorted;
443
438
  versiondisplayopt= vdo_none;
465
460
}
466
461
 
467
462
packagelist::~packagelist() {
468
 
  if (debug) fprintf(debug,"packagelist[%p]::~packagelist()\n",this);
 
463
  debug(dbg_general, "packagelist[%p]::~packagelist()", this);
469
464
 
470
465
  if (searchstring[0])
471
466
    regfree(&searchfsm);
472
467
 
473
468
  discardheadings();
474
 
  
 
469
 
475
470
  int index;
476
471
  for (index=0; index<nitems; index++) table[index]->free(recursive);
477
472
  delete[] table;
478
473
  delete[] datatable;
479
 
  if (debug) fprintf(debug,"packagelist[%p]::~packagelist() tables freed\n",this);
480
 
  
 
474
  debug(dbg_general, "packagelist[%p]::~packagelist() tables freed", this);
 
475
 
481
476
  doneent *search, *next;
482
477
  for (search=depsdone; search; search=next) {
483
478
    next= search->next;
484
479
    delete search;
485
480
  }
486
 
  
487
 
  if (debug) fprintf(debug,"packagelist[%p]::~packagelist() done\n",this);
 
481
 
 
482
  debug(dbg_general, "packagelist[%p]::~packagelist() done", this);
488
483
}
489
484
 
490
485
bool
526
521
    displayerror(_("error in regular expression"));
527
522
    return false;
528
523
  }
529
 
  
 
524
 
530
525
  return true;
531
526
}
532
527
 
562
557
  const keybindings::interpretation *interp;
563
558
  pkginfo **retl;
564
559
 
565
 
  if (debug) fprintf(debug,"packagelist[%p]::display()\n",this);
 
560
  debug(dbg_general, "packagelist[%p]::display()", this);
566
561
 
567
562
  setupsigwinch();
568
563
  startdisplay();
570
565
  if (!expertmode)
571
566
  displayhelp(helpmenulist(),'i');
572
567
 
573
 
  if (debug) fprintf(debug,"packagelist[%p]::display() entering loop\n",this);
 
568
  debug(dbg_general, "packagelist[%p]::display() entering loop", this);
574
569
  for (;;) {
575
570
    if (whatinfo_height) wcursyncup(whatinfowin);
576
571
    if (doupdate() == ERR)
586
581
    if (response == ERR)
587
582
      ohshite(_("getch failed"));
588
583
    interp= (*bindings)(response);
589
 
    if (debug)
590
 
      fprintf(debug,"packagelist[%p]::display() response=%d interp=%s\n",
591
 
              this,response, interp ? interp->action : "[none]");
 
584
    debug(dbg_general, "packagelist[%p]::display() response=%d interp=%s",
 
585
          this, response, interp ? interp->action : "[none]");
592
586
    if (!interp) { beep(); continue; }
593
587
    (this->*(interp->pfn))();
594
588
    if (interp->qa != qa_noquit) break;
595
589
  }
596
590
  pop_cleanup(ehflag_normaltidy); // unset the SIGWINCH handler
597
591
  enddisplay();
598
 
  
 
592
 
599
593
  if (interp->qa == qa_quitnochecksave || !readwrite) {
600
 
    if (debug) fprintf(debug,"packagelist[%p]::display() done - quitNOcheck\n",this);
 
594
    debug(dbg_general, "packagelist[%p]::display() done - quitNOcheck", this);
601
595
    return 0;
602
596
  }
603
 
  
 
597
 
604
598
  if (recursive) {
605
599
    retl= new pkginfo*[nitems+1];
606
600
    for (index=0; index<nitems; index++) retl[index]= table[index]->pkg;
607
601
    retl[nitems]= 0;
608
 
    if (debug) fprintf(debug,"packagelist[%p]::display() done, retl=%p\n",this,retl);
 
602
    debug(dbg_general, "packagelist[%p]::display() done, retl=%p", this, retl);
609
603
    return retl;
610
604
  } else {
611
605
    packagelist *sub= new packagelist(bindings,0);
613
607
      if (table[index]->pkg->name)
614
608
        sub->add(table[index]->pkg);
615
609
    repeatedlydisplay(sub,dp_must);
616
 
    if (debug)
617
 
      fprintf(debug,"packagelist[%p]::display() done, not recursive no retl\n",this);
 
610
    debug(dbg_general,
 
611
          "packagelist[%p]::display() done, not recursive no retl", this);
618
612
    return 0;
619
613
  }
620
614
}