diff --git a/src/github.com/smira/aptly/.travis.yml b/src/github.com/smira/aptly/.travis.yml
index bf949649..26b65e68 100644
--- a/src/github.com/smira/aptly/.travis.yml
+++ b/src/github.com/smira/aptly/.travis.yml
@@ -2,13 +2,16 @@ language: go
go:
- 1.2.1
- - 1.3
+ - 1.3.1
- tip
env:
global:
- secure: "YSwtFrMqh4oUvdSQTXBXMHHLWeQgyNEL23ChIZwU0nuDGIcQZ65kipu0PzefedtUbK4ieC065YCUi4UDDh6gPotB/Wu1pnYg3dyQ7rFvhaVYAAUEpajAdXZhlx+7+J8a4FZMeC/kqiahxoRgLbthF9019ouIqhGB9zHKI6/yZwc="
-
+ - secure: "V7OjWrfQ8UbktgT036jYQPb/7GJT3Ol9LObDr8FYlzsQ+F1uj2wLac6ePuxcOS4FwWOJinWGM1h+JiFkbxbyFqfRNJ0jj0O2p93QyDojxFVOn1mXqqvV66KFqAWR2Vzkny/gDvj8LTvdB1cgAIm2FNOkQc6E1BFnyWS2sN9ea5E="
+before_install:
+ - sudo apt-get update -qq
+ - sudo apt-get install -y python-boto
install:
- make prepare
diff --git a/src/github.com/smira/aptly/AUTHORS b/src/github.com/smira/aptly/AUTHORS
index d8e8ad09..17fdfe01 100644
--- a/src/github.com/smira/aptly/AUTHORS
+++ b/src/github.com/smira/aptly/AUTHORS
@@ -3,4 +3,5 @@ List of contributors, in chronological order:
* Andrey Smirnov (https://github.com/smira)
* Sebastien Binet (https://github.com/sbinet)
* Ryan Uber (https://github.com/ryanuber)
-* Simon Aquino (https://github.com/simonaquino)
\ No newline at end of file
+* Simon Aquino (https://github.com/simonaquino)
+* Vincent Batoufflet (https://github.com/vbatoufflet)
\ No newline at end of file
diff --git a/src/github.com/smira/aptly/Gomfile b/src/github.com/smira/aptly/Gomfile
index 25920026..910bce2b 100644
--- a/src/github.com/smira/aptly/Gomfile
+++ b/src/github.com/smira/aptly/Gomfile
@@ -4,11 +4,14 @@ gom 'code.google.com/p/gographviz', :commit => '454bc64fdfa2'
gom 'code.google.com/p/mxk/go1/flowcontrol', :commit => '5ff2502e2556'
gom 'code.google.com/p/snappy-go/snappy', :commit => '12e4b4183793'
gom 'github.com/cheggaaa/pb', :commit => '74be7a1388046f374ac36e93d46f5d56e856f827'
-gom 'github.com/mitchellh/goamz/s3', :commit => '55f224c07975fddef9d2116600c664e30df3d594'
+gom 'github.com/vaughan0/go-ini', :commit => 'a98ad7ee00ec53921f08832bc06ecf7fd600e6a1'
+gom 'github.com/mattn/go-shellwords', :commit => 'c7ca6f94add751566a61cf2199e1de78d4c3eee4'
+gom 'github.com/mitchellh/goamz/s3', :commit => 'e7664b32019f31fd1bdf33f9e85f28722f700405'
gom 'github.com/mkrautz/goar', :commit => '36eb5f3452b1283a211fa35bc00c646fd0db5c4b'
gom 'github.com/smira/commander', :commit => 'f408b00e68d5d6e21b9f18bd310978dafc604e47'
-gom 'github.com/smira/flag', :commit => '0d0aac2addb39050f45e92c5a6252926096dc841'
-gom 'github.com/syndtr/goleveldb/leveldb', :commit => '9888007'
+gom 'github.com/smira/flag', :commit => '357ed3e599ffcbd4aeaa828e1d10da2df3ea5107'
+gom 'github.com/smira/go-ftp-protocol/protocol', :commit => '066b75c2b70dca7ae10b1b88b47534a3c31ccfaa'
+gom 'github.com/syndtr/goleveldb/leveldb', :commit => 'e2fa4e6ac1cc41a73bc9fd467878ecbf65df5cc3'
gom 'github.com/ugorji/go/codec', :commit => '71c2886f5a673a35f909803f38ece5810165097b'
gom 'github.com/wsxiaoys/terminal/color', :commit => '5668e431776a7957528361f90ce828266c69ed08'
diff --git a/src/github.com/smira/aptly/Makefile b/src/github.com/smira/aptly/Makefile
index afd1c520..1eccbc3c 100644
--- a/src/github.com/smira/aptly/Makefile
+++ b/src/github.com/smira/aptly/Makefile
@@ -79,5 +79,6 @@ src-package:
rm -rf aptly-$(VERSION)/src/github.com/smira/aptly/_vendor/{pkg,bin}
tar cyf aptly-$(VERSION)-src.tar.bz2 aptly-$(VERSION)
rm -rf aptly-$(VERSION)
+ curl -T aptly-$(VERSION)-src.tar.bz2 -usmira:$(BINTRAY_KEY) https://api.bintray.com/content/smira/aptly/aptly/$(VERSION)/$(VERSION)/aptly-$(VERSION)-src.tar.bz2
.PHONY: coverage.out
diff --git a/src/github.com/smira/aptly/README.rst b/src/github.com/smira/aptly/README.rst
index e68f8277..be90bb6c 100644
--- a/src/github.com/smira/aptly/README.rst
+++ b/src/github.com/smira/aptly/README.rst
@@ -11,9 +11,11 @@ aptly
.. image:: http://gobuild.io/badge/github.com/smira/aptly/download.png
:target: http://gobuild.io/github.com/smira/aptly
-
Aptly is a swiss army knife for Debian repository management.
+.. image:: http://www.aptly.info/img/aptly_logo.png
+ :target: http://www.aptly.info/
+
Documentation is available at `http://www.aptly.info/ `_. For support use
mailing list `aptly-discuss `_.
@@ -24,14 +26,14 @@ Aptly features: ("+" means planned features)
* publish snapshot as Debian repository, ready to be consumed by apt
* controlled update of one or more packages in snapshot from upstream mirror, tracking dependencies
* merge two or more snapshots into one
-* filter repository by search query, pulling dependencies when required (+)
-* publish self-made packages as Debian repositories (+)
+* filter repository by search query, pulling dependencies when required
+* publish self-made packages as Debian repositories
* mirror repositories "as-is" (without resigning with user's key) (+)
* support for yum repositories (+)
Current limitations:
-* debian-installer and translations not supported yet
+* translations are not supported yet
Download
--------
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/jlaffaye/ftp/LICENSE b/src/github.com/smira/aptly/_vendor/src/github.com/jlaffaye/ftp/LICENSE
new file mode 100644
index 00000000..9ab085c5
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/jlaffaye/ftp/LICENSE
@@ -0,0 +1,13 @@
+Copyright (c) 2011-2013, Julien Laffaye
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/jlaffaye/ftp/README.md b/src/github.com/smira/aptly/_vendor/src/github.com/jlaffaye/ftp/README.md
new file mode 100644
index 00000000..8cfe8dc6
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/jlaffaye/ftp/README.md
@@ -0,0 +1,7 @@
+# goftp #
+
+A FTP client package for Go
+
+## Documentation ##
+
+http://godoc.org/github.com/jlaffaye/ftp
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/jlaffaye/ftp/client_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/jlaffaye/ftp/client_test.go
new file mode 100644
index 00000000..d93d310d
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/jlaffaye/ftp/client_test.go
@@ -0,0 +1,132 @@
+package ftp
+
+import (
+ "bytes"
+ "io/ioutil"
+ "testing"
+)
+
+const (
+ testData = "Just some text"
+ testDir = "mydir"
+)
+
+func TestConn(t *testing.T) {
+ c, err := Connect("localhost:21")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ err = c.Login("anonymous", "anonymous")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ err = c.NoOp()
+ if err != nil {
+ t.Error(err)
+ }
+
+ data := bytes.NewBufferString(testData)
+ err = c.Stor("test", data)
+ if err != nil {
+ t.Error(err)
+ }
+
+ _, err = c.List(".")
+ if err != nil {
+ t.Error(err)
+ }
+
+ err = c.Rename("test", "tset")
+ if err != nil {
+ t.Error(err)
+ }
+
+ r, err := c.Retr("tset")
+ if err != nil {
+ t.Error(err)
+ } else {
+ buf, err := ioutil.ReadAll(r)
+ if err != nil {
+ t.Error(err)
+ }
+ if string(buf) != testData {
+ t.Errorf("'%s'", buf)
+ }
+ r.Close()
+ }
+
+ r, err = c.Retr("tset")
+ if err != nil {
+ t.Error(err)
+ } else {
+ r.Close()
+ }
+
+ err = c.Delete("tset")
+ if err != nil {
+ t.Error(err)
+ }
+
+ err = c.MakeDir(testDir)
+ if err != nil {
+ t.Error(err)
+ }
+
+ err = c.ChangeDir(testDir)
+ if err != nil {
+ t.Error(err)
+ }
+
+ dir, err := c.CurrentDir()
+ if err != nil {
+ t.Error(err)
+ } else {
+ if dir != "/"+testDir {
+ t.Error("Wrong dir: " + dir)
+ }
+ }
+
+ err = c.ChangeDirToParent()
+ if err != nil {
+ t.Error(err)
+ }
+
+ err = c.RemoveDir(testDir)
+ if err != nil {
+ t.Error(err)
+ }
+
+ err = c.Logout()
+ if err != nil {
+ t.Error(err)
+ }
+
+ c.Quit()
+
+ err = c.NoOp()
+ if err == nil {
+ t.Error("Expected error")
+ }
+}
+
+// ftp.mozilla.org uses multiline 220 response
+func TestConn2(t *testing.T) {
+ c, err := Connect("ftp.mozilla.org:21")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ err = c.Login("anonymous", "anonymous")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ _, err = c.List(".")
+ if err != nil {
+ t.Error(err)
+ }
+
+ c.Quit()
+}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/jlaffaye/ftp/ftp.go b/src/github.com/smira/aptly/_vendor/src/github.com/jlaffaye/ftp/ftp.go
new file mode 100644
index 00000000..24e04500
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/jlaffaye/ftp/ftp.go
@@ -0,0 +1,491 @@
+// Package ftp implements a FTP client as described in RFC 959.
+package ftp
+
+import (
+ "bufio"
+ "errors"
+ "fmt"
+ "io"
+ "net"
+ "net/textproto"
+ "strconv"
+ "strings"
+ "time"
+)
+
+// EntryType describes the different types of an Entry.
+type EntryType int
+
+const (
+ EntryTypeFile EntryType = iota
+ EntryTypeFolder
+ EntryTypeLink
+)
+
+// ServerConn represents the connection to a remote FTP server.
+type ServerConn struct {
+ conn *textproto.Conn
+ host string
+ features map[string]string
+}
+
+// Entry describes a file and is returned by List().
+type Entry struct {
+ Name string
+ Type EntryType
+ Size uint64
+ Time time.Time
+}
+
+// response represent a data-connection
+type response struct {
+ conn net.Conn
+ c *ServerConn
+}
+
+// Connect initializes the connection to the specified ftp server address.
+//
+// It is generally followed by a call to Login() as most FTP commands require
+// an authenticated user.
+func Connect(addr string) (*ServerConn, error) {
+ conn, err := textproto.Dial("tcp", addr)
+ if err != nil {
+ return nil, err
+ }
+
+ a := strings.SplitN(addr, ":", 2)
+ c := &ServerConn{
+ conn: conn,
+ host: a[0],
+ features: make(map[string]string),
+ }
+
+ _, _, err = c.conn.ReadResponse(StatusReady)
+ if err != nil {
+ c.Quit()
+ return nil, err
+ }
+
+ err = c.feat()
+ if err != nil {
+ c.Quit()
+ return nil, err
+ }
+
+ return c, nil
+}
+
+// Login authenticates the client with specified user and password.
+//
+// "anonymous"/"anonymous" is a common user/password scheme for FTP servers
+// that allows anonymous read-only accounts.
+func (c *ServerConn) Login(user, password string) error {
+ code, message, err := c.cmd(-1, "USER %s", user)
+ if err != nil {
+ return err
+ }
+
+ switch code {
+ case StatusLoggedIn:
+ case StatusUserOK:
+ _, _, err = c.cmd(StatusLoggedIn, "PASS %s", password)
+ if err != nil {
+ return err
+ }
+ default:
+ return errors.New(message)
+ }
+
+ // Switch to binary mode
+ _, _, err = c.cmd(StatusCommandOK, "TYPE I")
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
+
+// feat issues a FEAT FTP command to list the additional commands supported by
+// the remote FTP server.
+// FEAT is described in RFC 2389
+func (c *ServerConn) feat() error {
+ code, message, err := c.cmd(-1, "FEAT")
+ if err != nil {
+ return err
+ }
+
+ if code != StatusSystem {
+ // The server does not support the FEAT command. This is not an
+ // error: we consider that there is no additional feature.
+ return nil
+ }
+
+ lines := strings.Split(message, "\n")
+ for _, line := range lines {
+ if !strings.HasPrefix(line, " ") {
+ continue
+ }
+
+ line = strings.TrimSpace(line)
+ featureElements := strings.SplitN(line, " ", 2)
+
+ command := featureElements[0]
+
+ var commandDesc string
+ if len(featureElements) == 2 {
+ commandDesc = featureElements[1]
+ }
+
+ c.features[command] = commandDesc
+ }
+
+ return nil
+}
+
+// epsv issues an "EPSV" command to get a port number for a data connection.
+func (c *ServerConn) epsv() (port int, err error) {
+ _, line, err := c.cmd(StatusExtendedPassiveMode, "EPSV")
+ if err != nil {
+ return
+ }
+
+ start := strings.Index(line, "|||")
+ end := strings.LastIndex(line, "|")
+ if start == -1 || end == -1 {
+ err = errors.New("Invalid EPSV response format")
+ return
+ }
+ port, err = strconv.Atoi(line[start+3 : end])
+ return
+}
+
+// pasv issues a "PASV" command to get a port number for a data connection.
+func (c *ServerConn) pasv() (port int, err error) {
+ _, line, err := c.cmd(StatusPassiveMode, "PASV")
+ if err != nil {
+ return
+ }
+
+ // PASV response format : 227 Entering Passive Mode (h1,h2,h3,h4,p1,p2).
+ start := strings.Index(line, "(")
+ end := strings.LastIndex(line, ")")
+ if start == -1 || end == -1 {
+ err = errors.New("Invalid EPSV response format")
+ return
+ }
+
+ // We have to split the response string
+ pasvData := strings.Split(line[start+1:end], ",")
+ // Let's compute the port number
+ portPart1, err1 := strconv.Atoi(pasvData[4])
+ if err1 != nil {
+ err = err1
+ return
+ }
+
+ portPart2, err2 := strconv.Atoi(pasvData[5])
+ if err2 != nil {
+ err = err2
+ return
+ }
+
+ // Recompose port
+ port = portPart1*256 + portPart2
+ return
+}
+
+// openDataConn creates a new FTP data connection.
+func (c *ServerConn) openDataConn() (net.Conn, error) {
+ var port int
+ var err error
+
+ // If features contains nat6 or EPSV => EPSV
+ // else -> PASV
+ _, nat6Supported := c.features["nat6"]
+ _, epsvSupported := c.features["EPSV"]
+ if nat6Supported || epsvSupported {
+ port, err = c.epsv()
+ if err != nil {
+ return nil, err
+ }
+ } else {
+ port, err = c.pasv()
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ // Build the new net address string
+ addr := fmt.Sprintf("%s:%d", c.host, port)
+
+ conn, err := net.Dial("tcp", addr)
+ if err != nil {
+ return nil, err
+ }
+
+ return conn, nil
+}
+
+// cmd is a helper function to execute a command and check for the expected FTP
+// return code
+func (c *ServerConn) cmd(expected int, format string, args ...interface{}) (int, string, error) {
+ _, err := c.conn.Cmd(format, args...)
+ if err != nil {
+ return 0, "", err
+ }
+
+ code, line, err := c.conn.ReadResponse(expected)
+ return code, line, err
+}
+
+// cmdDataConn executes a command which require a FTP data connection.
+func (c *ServerConn) cmdDataConn(format string, args ...interface{}) (net.Conn, error) {
+ conn, err := c.openDataConn()
+ if err != nil {
+ return nil, err
+ }
+
+ _, err = c.conn.Cmd(format, args...)
+ if err != nil {
+ conn.Close()
+ return nil, err
+ }
+
+ code, msg, err := c.conn.ReadCodeLine(-1)
+ if err != nil {
+ conn.Close()
+ return nil, err
+ }
+ if code != StatusAlreadyOpen && code != StatusAboutToSend {
+ conn.Close()
+ return nil, &textproto.Error{code, msg}
+ }
+
+ return conn, nil
+}
+
+// parseListLine parses the various non-standard format returned by the LIST
+// FTP command.
+func parseListLine(line string) (*Entry, error) {
+ fields := strings.Fields(line)
+ if len(fields) < 9 {
+ return nil, errors.New("Unsupported LIST line")
+ }
+
+ e := &Entry{}
+ switch fields[0][0] {
+ case '-':
+ e.Type = EntryTypeFile
+ case 'd':
+ e.Type = EntryTypeFolder
+ case 'l':
+ e.Type = EntryTypeLink
+ default:
+ return nil, errors.New("Unknown entry type")
+ }
+
+ if e.Type == EntryTypeFile {
+ size, err := strconv.ParseUint(fields[4], 10, 0)
+ if err != nil {
+ return nil, err
+ }
+ e.Size = size
+ }
+ var timeStr string
+ if strings.Contains(fields[7], ":") { // this year
+ thisYear, _, _ := time.Now().Date()
+ timeStr = fields[6] + " " + fields[5] + " " + strconv.Itoa(thisYear)[2:4] + " " + fields[7] + " GMT"
+ } else { // not this year
+ timeStr = fields[6] + " " + fields[5] + " " + fields[7][2:4] + " " + "00:00" + " GMT"
+ }
+ t, err := time.Parse("_2 Jan 06 15:04 MST", timeStr)
+ if err != nil {
+ return nil, err
+ }
+ e.Time = t
+
+ e.Name = strings.Join(fields[8:], " ")
+ return e, nil
+}
+
+// NameList issues an NLST FTP command.
+func (c *ServerConn) NameList(path string) (entries []string, err error) {
+ conn, err := c.cmdDataConn("NLST %s", path)
+ if err != nil {
+ return
+ }
+
+ r := &response{conn, c}
+ defer r.Close()
+
+ scanner := bufio.NewScanner(r)
+ for scanner.Scan() {
+ entries = append(entries, scanner.Text())
+ }
+ if err = scanner.Err(); err != nil {
+ return entries, err
+ }
+ return
+}
+
+// List issues a LIST FTP command.
+func (c *ServerConn) List(path string) (entries []*Entry, err error) {
+ conn, err := c.cmdDataConn("LIST %s", path)
+ if err != nil {
+ return
+ }
+
+ r := &response{conn, c}
+ defer r.Close()
+
+ bio := bufio.NewReader(r)
+ for {
+ line, e := bio.ReadString('\n')
+ if e == io.EOF {
+ break
+ } else if e != nil {
+ return nil, e
+ }
+ entry, err := parseListLine(line)
+ if err == nil {
+ entries = append(entries, entry)
+ }
+ }
+ return
+}
+
+// ChangeDir issues a CWD FTP command, which changes the current directory to
+// the specified path.
+func (c *ServerConn) ChangeDir(path string) error {
+ _, _, err := c.cmd(StatusRequestedFileActionOK, "CWD %s", path)
+ return err
+}
+
+// ChangeDirToParent issues a CDUP FTP command, which changes the current
+// directory to the parent directory. This is similar to a call to ChangeDir
+// with a path set to "..".
+func (c *ServerConn) ChangeDirToParent() error {
+ _, _, err := c.cmd(StatusRequestedFileActionOK, "CDUP")
+ return err
+}
+
+// CurrentDir issues a PWD FTP command, which Returns the path of the current
+// directory.
+func (c *ServerConn) CurrentDir() (string, error) {
+ _, msg, err := c.cmd(StatusPathCreated, "PWD")
+ if err != nil {
+ return "", err
+ }
+
+ start := strings.Index(msg, "\"")
+ end := strings.LastIndex(msg, "\"")
+
+ if start == -1 || end == -1 {
+ return "", errors.New("Unsuported PWD response format")
+ }
+
+ return msg[start+1 : end], nil
+}
+
+// Retr issues a RETR FTP command to fetch the specified file from the remote
+// FTP server.
+//
+// The returned ReadCloser must be closed to cleanup the FTP data connection.
+func (c *ServerConn) Retr(path string) (io.ReadCloser, error) {
+ conn, err := c.cmdDataConn("RETR %s", path)
+ if err != nil {
+ return nil, err
+ }
+
+ r := &response{conn, c}
+ return r, nil
+}
+
+// Stor issues a STOR FTP command to store a file to the remote FTP server.
+// Stor creates the specified file with the content of the io.Reader.
+//
+// Hint: io.Pipe() can be used if an io.Writer is required.
+func (c *ServerConn) Stor(path string, r io.Reader) error {
+ conn, err := c.cmdDataConn("STOR %s", path)
+ if err != nil {
+ return err
+ }
+
+ _, err = io.Copy(conn, r)
+ conn.Close()
+ if err != nil {
+ return err
+ }
+
+ _, _, err = c.conn.ReadResponse(StatusClosingDataConnection)
+ return err
+}
+
+// Rename renames a file on the remote FTP server.
+func (c *ServerConn) Rename(from, to string) error {
+ _, _, err := c.cmd(StatusRequestFilePending, "RNFR %s", from)
+ if err != nil {
+ return err
+ }
+
+ _, _, err = c.cmd(StatusRequestedFileActionOK, "RNTO %s", to)
+ return err
+}
+
+// Delete issues a DELE FTP command to delete the specified file from the
+// remote FTP server.
+func (c *ServerConn) Delete(path string) error {
+ _, _, err := c.cmd(StatusRequestedFileActionOK, "DELE %s", path)
+ return err
+}
+
+// MakeDir issues a MKD FTP command to create the specified directory on the
+// remote FTP server.
+func (c *ServerConn) MakeDir(path string) error {
+ _, _, err := c.cmd(StatusPathCreated, "MKD %s", path)
+ return err
+}
+
+// RemoveDir issues a RMD FTP command to remove the specified directory from
+// the remote FTP server.
+func (c *ServerConn) RemoveDir(path string) error {
+ _, _, err := c.cmd(StatusRequestedFileActionOK, "RMD %s", path)
+ return err
+}
+
+// NoOp issues a NOOP FTP command.
+// NOOP has no effects and is usually used to prevent the remote FTP server to
+// close the otherwise idle connection.
+func (c *ServerConn) NoOp() error {
+ _, _, err := c.cmd(StatusCommandOK, "NOOP")
+ return err
+}
+
+// Logout issues a REIN FTP command to logout the current user.
+func (c *ServerConn) Logout() error {
+ _, _, err := c.cmd(StatusLoggedIn, "REIN")
+ return err
+}
+
+// Quit issues a QUIT FTP command to properly close the connection from the
+// remote FTP server.
+func (c *ServerConn) Quit() error {
+ c.conn.Cmd("QUIT")
+ return c.conn.Close()
+}
+
+// Read implements the io.Reader interface on a FTP data connection.
+func (r *response) Read(buf []byte) (int, error) {
+ n, err := r.conn.Read(buf)
+ return n, err
+}
+
+// Close implements the io.Closer interface on a FTP data connection.
+func (r *response) Close() error {
+ err := r.conn.Close()
+ _, _, err2 := r.c.conn.ReadResponse(StatusClosingDataConnection)
+ if err2 != nil {
+ err = err2
+ }
+ return err
+}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/jlaffaye/ftp/parse_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/jlaffaye/ftp/parse_test.go
new file mode 100644
index 00000000..c76561b7
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/jlaffaye/ftp/parse_test.go
@@ -0,0 +1,63 @@
+package ftp
+
+import (
+ "testing"
+ "time"
+)
+
+var thisYear, _, _ = time.Now().Date()
+
+type line struct {
+ line string
+ name string
+ size uint64
+ entryType EntryType
+ time time.Time
+}
+
+var listTests = []line{
+ // UNIX ls -l style
+ line{"drwxr-xr-x 3 110 1002 3 Dec 02 2009 pub", "pub", 0, EntryTypeFolder, time.Date(2009, time.December, 2, 0, 0, 0, 0, time.UTC)},
+ line{"drwxr-xr-x 3 110 1002 3 Dec 02 2009 p u b", "p u b", 0, EntryTypeFolder, time.Date(2009, time.December, 2, 0, 0, 0, 0, time.UTC)},
+ line{"-rwxr-xr-x 3 110 1002 1234567 Dec 02 2009 fileName", "fileName", 1234567, EntryTypeFile, time.Date(2009, time.December, 2, 0, 0, 0, 0, time.UTC)},
+ line{"lrwxrwxrwx 1 root other 7 Jan 25 00:17 bin -> usr/bin", "bin -> usr/bin", 0, EntryTypeLink, time.Date(thisYear, time.January, 25, 0, 17, 0, 0, time.UTC)},
+ // Microsoft's FTP servers for Windows
+ line{"---------- 1 owner group 1803128 Jul 10 10:18 ls-lR.Z", "ls-lR.Z", 1803128, EntryTypeFile, time.Date(thisYear, time.July, 10, 10, 18, 0, 0, time.UTC)},
+ line{"d--------- 1 owner group 0 May 9 19:45 Softlib", "Softlib", 0, EntryTypeFolder, time.Date(thisYear, time.May, 9, 19, 45, 0, 0, time.UTC)},
+ // WFTPD for MSDOS
+ line{"-rwxrwxrwx 1 noone nogroup 322 Aug 19 1996 message.ftp", "message.ftp", 322, EntryTypeFile, time.Date(1996, time.August, 19, 0, 0, 0, 0, time.UTC)},
+}
+
+// Not supported, at least we should properly return failure
+var listTestsFail = []line{
+ line{"d [R----F--] supervisor 512 Jan 16 18:53 login", "login", 0, EntryTypeFolder, time.Date(thisYear, time.January, 16, 18, 53, 0, 0, time.UTC)},
+ line{"- [R----F--] rhesus 214059 Oct 20 15:27 cx.exe", "cx.exe", 0, EntryTypeFile, time.Date(thisYear, time.October, 20, 15, 27, 0, 0, time.UTC)},
+}
+
+func TestParseListLine(t *testing.T) {
+ for _, lt := range listTests {
+ entry, err := parseListLine(lt.line)
+ if err != nil {
+ t.Errorf("parseListLine(%v) returned err = %v", lt.line, err)
+ continue
+ }
+ if entry.Name != lt.name {
+ t.Errorf("parseListLine(%v).Name = '%v', want '%v'", lt.line, entry.Name, lt.name)
+ }
+ if entry.Type != lt.entryType {
+ t.Errorf("parseListLine(%v).EntryType = %v, want %v", lt.line, entry.Type, lt.entryType)
+ }
+ if entry.Size != lt.size {
+ t.Errorf("parseListLine(%v).Size = %v, want %v", lt.line, entry.Size, lt.size)
+ }
+ if entry.Time.Unix() != lt.time.Unix() {
+ t.Errorf("parseListLine(%v).Time = %v, want %v", lt.line, entry.Time, lt.time)
+ }
+ }
+ for _, lt := range listTestsFail {
+ _, err := parseListLine(lt.line)
+ if err == nil {
+ t.Errorf("parseListLine(%v) expected to fail", lt.line)
+ }
+ }
+}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/jlaffaye/ftp/status.go b/src/github.com/smira/aptly/_vendor/src/github.com/jlaffaye/ftp/status.go
new file mode 100644
index 00000000..50ee3765
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/jlaffaye/ftp/status.go
@@ -0,0 +1,110 @@
+package ftp
+
+const (
+ // Positive Preliminary reply
+ StatusInitiating = 100
+ StatusRestartMarker = 110
+ StatusReadyMinute = 120
+ StatusAlreadyOpen = 125
+ StatusAboutToSend = 150
+
+ // Positive Completion reply
+ StatusCommandOK = 200
+ StatusCommandNotImplemented = 202
+ StatusSystem = 211
+ StatusDirectory = 212
+ StatusFile = 213
+ StatusHelp = 214
+ StatusName = 215
+ StatusReady = 220
+ StatusClosing = 221
+ StatusDataConnectionOpen = 225
+ StatusClosingDataConnection = 226
+ StatusPassiveMode = 227
+ StatusLongPassiveMode = 228
+ StatusExtendedPassiveMode = 229
+ StatusLoggedIn = 230
+ StatusLoggedOut = 231
+ StatusLogoutAck = 232
+ StatusRequestedFileActionOK = 250
+ StatusPathCreated = 257
+
+ // Positive Intermediate reply
+ StatusUserOK = 331
+ StatusLoginNeedAccount = 332
+ StatusRequestFilePending = 350
+
+ // Transient Negative Completion reply
+ StatusNotAvailable = 421
+ StatusCanNotOpenDataConnection = 425
+ StatusTransfertAborted = 426
+ StatusInvalidCredentials = 430
+ StatusHostUnavailable = 434
+ StatusFileActionIgnored = 450
+ StatusActionAborted = 451
+ Status452 = 452
+
+ // Permanent Negative Completion reply
+ StatusBadCommand = 500
+ StatusBadArguments = 501
+ StatusNotImplemented = 502
+ StatusBadSequence = 503
+ StatusNotImplementedParameter = 504
+ StatusNotLoggedIn = 530
+ StatusStorNeedAccount = 532
+ StatusFileUnavailable = 550
+ StatusPageTypeUnknown = 551
+ StatusExceededStorage = 552
+ StatusBadFileName = 553
+)
+
+var statusText = map[int]string{
+ // 200
+ StatusCommandOK: "Command okay.",
+ StatusCommandNotImplemented: "Command not implemented, superfluous at this site.",
+ StatusSystem: "System status, or system help reply.",
+ StatusDirectory: "Directory status.",
+ StatusFile: "File status.",
+ StatusHelp: "Help message.",
+ StatusName: "",
+ StatusReady: "Service ready for new user.",
+ StatusClosing: "Service closing control connection.",
+ StatusDataConnectionOpen: "Data connection open; no transfer in progress.",
+ StatusClosingDataConnection: "Closing data connection. Requested file action successful.",
+ StatusPassiveMode: "Entering Passive Mode.",
+ StatusLongPassiveMode: "Entering Long Passive Mode.",
+ StatusExtendedPassiveMode: "Entering Extended Passive Mode.",
+ StatusLoggedIn: "User logged in, proceed.",
+ StatusLoggedOut: "User logged out; service terminated.",
+ StatusLogoutAck: "Logout command noted, will complete when transfer done.",
+ StatusRequestedFileActionOK: "Requested file action okay, completed.",
+ StatusPathCreated: "Path created.",
+
+ // 300
+ StatusUserOK: "User name okay, need password.",
+ StatusLoginNeedAccount: "Need account for login.",
+ StatusRequestFilePending: "Requested file action pending further information.",
+
+ // 400
+ StatusNotAvailable: "Service not available, closing control connection.",
+ StatusCanNotOpenDataConnection: "Can't open data connection.",
+ StatusTransfertAborted: "Connection closed; transfer aborted.",
+ StatusInvalidCredentials: "Invalid username or password.",
+ StatusHostUnavailable: "Requested host unavailable.",
+ StatusFileActionIgnored: "Requested file action not taken.",
+ StatusActionAborted: "Requested action aborted. Local error in processing.",
+ Status452: "Insufficient storage space in system.",
+
+ // 500
+ StatusBadCommand: "Command unrecognized.",
+ StatusBadArguments: "Syntax error in parameters or arguments.",
+ StatusNotImplemented: "Command not implemented.",
+ StatusBadSequence: "Bad sequence of commands.",
+ StatusNotImplementedParameter: "Command not implemented for that parameter.",
+ StatusNotLoggedIn: "Not logged in.",
+ StatusStorNeedAccount: "Need account for storing files.",
+ StatusFileUnavailable: "File unavailable.",
+ StatusPageTypeUnknown: "Page type unknown.",
+ StatusExceededStorage: "Exceeded storage allocation.",
+ StatusBadFileName: "File name not allowed.",
+}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mattn/go-shellwords/.travis.yml b/src/github.com/smira/aptly/_vendor/src/github.com/mattn/go-shellwords/.travis.yml
new file mode 100644
index 00000000..580d9b1f
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mattn/go-shellwords/.travis.yml
@@ -0,0 +1,9 @@
+language: go
+go:
+ - tip
+before_install:
+ - go get github.com/axw/gocov/gocov
+ - go get github.com/mattn/goveralls
+ - go get code.google.com/p/go.tools/cmd/cover
+script:
+ - $HOME/gopath/bin/goveralls -repotoken 2FMhp57u8LcstKL9B190fLTcEnBtAAiEL
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mattn/go-shellwords/README.md b/src/github.com/smira/aptly/_vendor/src/github.com/mattn/go-shellwords/README.md
new file mode 100644
index 00000000..ab65d7dd
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mattn/go-shellwords/README.md
@@ -0,0 +1,40 @@
+# go-shellwords
+
+[](https://coveralls.io/r/mattn/go-shellwords?branch=master)
+[](https://travis-ci.org/mattn/go-shellwords)
+
+Parse line as shell words.
+
+## Usage
+
+```go
+args, err := shellwords.Parse("./foo --bar=baz")
+// args should be ["./foo", "--bar=baz"]
+```
+
+```go
+os.Setenv("FOO", "bar")
+p := shellwords.NewParser()
+p.ParseEnv = true
+args, err := p.Parse("./foo $FOO")
+// args should be ["./foo", "bar"]
+```
+
+```go
+p := shellwords.NewParser()
+p.ParseBacktick = true
+args, err := p.Parse("./foo `echo $SHELL`")
+// args should be ["./foo", "/bin/bash"]
+```
+
+# Thanks
+
+This is based on cpan module [Parse::CommandLine](https://metacpan.org/pod/Parse::CommandLine).
+
+# License
+
+under the MIT License: http://mattn.mit-license.org/2014
+
+# Author
+
+Yasuhiro Matsumoto (a.k.a mattn)
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mattn/go-shellwords/shellwords.go b/src/github.com/smira/aptly/_vendor/src/github.com/mattn/go-shellwords/shellwords.go
new file mode 100644
index 00000000..11ff3426
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mattn/go-shellwords/shellwords.go
@@ -0,0 +1,129 @@
+package shellwords
+
+import (
+ "errors"
+ "os"
+ "regexp"
+ "strings"
+)
+
+var envRe = regexp.MustCompile(`\$({[a-zA-Z0-9_]+}|[a-zA-Z0-9_]+)`)
+
+func isSpace(r rune) bool {
+ switch r {
+ case ' ', '\t', '\r', '\n':
+ return true
+ }
+ return false
+}
+
+func replaceEnv(s string) string {
+ return envRe.ReplaceAllStringFunc(s, func(s string) string {
+ s = s[1:]
+ if s[0] == '{' {
+ s = s[1 : len(s)-1]
+ }
+ return os.Getenv(s)
+ })
+}
+
+type Parser struct {
+ ParseEnv bool
+ ParseBacktick bool
+}
+
+func NewParser() *Parser {
+ return new(Parser)
+}
+
+func (p *Parser) Parse(line string) ([]string, error) {
+ line = strings.TrimSpace(line)
+
+ args := []string{}
+ buf := ""
+ var escaped, doubleQuoted, singleQuoted, backQuote bool
+ backtick := ""
+
+ for _, r := range line {
+ if escaped {
+ buf += string(r)
+ escaped = false
+ continue
+ }
+
+ if r == '\\' {
+ if singleQuoted {
+ buf += string(r)
+ } else {
+ escaped = true
+ }
+ continue
+ }
+
+ if isSpace(r) {
+ if singleQuoted || doubleQuoted || backQuote {
+ buf += string(r)
+ backtick += string(r)
+ } else if buf != "" {
+ if p.ParseEnv {
+ buf = replaceEnv(buf)
+ }
+ args = append(args, buf)
+ buf = ""
+ }
+ continue
+ }
+
+ switch r {
+ case '`':
+ if !singleQuoted && !doubleQuoted {
+ if p.ParseBacktick {
+ if backQuote {
+ out, err := shellRun(backtick)
+ if err != nil {
+ return nil, err
+ }
+ buf = out
+ }
+ backtick = ""
+ backQuote = !backQuote
+ continue
+ }
+ backtick = ""
+ backQuote = !backQuote
+ }
+ case '"':
+ if !singleQuoted {
+ doubleQuoted = !doubleQuoted
+ continue
+ }
+ case '\'':
+ if !doubleQuoted {
+ singleQuoted = !singleQuoted
+ continue
+ }
+ }
+
+ buf += string(r)
+ if backQuote {
+ backtick += string(r)
+ }
+ }
+
+ if buf != "" {
+ if p.ParseEnv {
+ buf = replaceEnv(buf)
+ }
+ args = append(args, buf)
+ }
+
+ if escaped || singleQuoted || doubleQuoted || backQuote {
+ return nil, errors.New("invalid command line string")
+ }
+
+ return args, nil
+}
+
+func Parse(line string) ([]string, error) {
+ return NewParser().Parse(line)
+}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mattn/go-shellwords/shellwords_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/mattn/go-shellwords/shellwords_test.go
new file mode 100644
index 00000000..fb96d33d
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mattn/go-shellwords/shellwords_test.go
@@ -0,0 +1,132 @@
+package shellwords
+
+import (
+ "os"
+ "reflect"
+ "testing"
+)
+
+var testcases = []struct {
+ line string
+ expected []string
+}{
+ {`var --bar=baz`, []string{`var`, `--bar=baz`}},
+ {`var --bar="baz"`, []string{`var`, `--bar=baz`}},
+ {`var "--bar=baz"`, []string{`var`, `--bar=baz`}},
+ {`var "--bar='baz'"`, []string{`var`, `--bar='baz'`}},
+ {"var --bar=`baz`", []string{`var`, "--bar=`baz`"}},
+ {`var "--bar=\"baz'"`, []string{`var`, `--bar="baz'`}},
+ {`var "--bar=\'baz\'"`, []string{`var`, `--bar='baz'`}},
+ {`var --bar='\'`, []string{`var`, `--bar=\`}},
+ {`var "--bar baz"`, []string{`var`, `--bar baz`}},
+ {`var --"bar baz"`, []string{`var`, `--bar baz`}},
+ {`var --"bar baz"`, []string{`var`, `--bar baz`}},
+}
+
+func TestSimple(t *testing.T) {
+ for _, testcase := range testcases {
+ args, err := Parse(testcase.line)
+ if err != nil {
+ t.Fatalf(err.Error())
+ }
+ if !reflect.DeepEqual(args, testcase.expected) {
+ t.Fatalf("Expected %v, but %v:", testcase.expected, args)
+ }
+ }
+}
+
+func TestError(t *testing.T) {
+ _, err := Parse("foo '")
+ if err == nil {
+ t.Fatalf("Should be an error")
+ }
+ _, err = Parse(`foo "`)
+ if err == nil {
+ t.Fatalf("Should be an error")
+ }
+
+ _, err = Parse("foo `")
+ if err == nil {
+ t.Fatalf("Should be an error")
+ }
+}
+
+func TestBacktick(t *testing.T) {
+ goversion, err := shellRun("go version")
+ if err != nil {
+ t.Fatalf(err.Error())
+ }
+
+ parser := NewParser()
+ parser.ParseBacktick = true
+ args, err := parser.Parse("echo `go version`")
+ if err != nil {
+ t.Fatalf(err.Error())
+ }
+ expected := []string{"echo", goversion}
+ if !reflect.DeepEqual(args, expected) {
+ t.Fatalf("Expected %v, but %v:", expected, args)
+ }
+}
+
+func TestBacktickError(t *testing.T) {
+ parser := NewParser()
+ parser.ParseBacktick = true
+ _, err := parser.Parse("echo `go Version`")
+ if err == nil {
+ t.Fatalf("Should be an error")
+ }
+}
+
+func TestEnv(t *testing.T) {
+ os.Setenv("FOO", "bar")
+
+ parser := NewParser()
+ parser.ParseEnv = true
+ args, err := parser.Parse("echo $FOO")
+ if err != nil {
+ t.Fatalf(err.Error())
+ }
+ expected := []string{"echo", "bar"}
+ if !reflect.DeepEqual(args, expected) {
+ t.Fatalf("Expected %v, but %v:", expected, args)
+ }
+}
+
+func TestNoEnv(t *testing.T) {
+ parser := NewParser()
+ parser.ParseEnv = true
+ args, err := parser.Parse("echo $BAR")
+ if err != nil {
+ t.Fatalf(err.Error())
+ }
+ expected := []string{"echo", ""}
+ if !reflect.DeepEqual(args, expected) {
+ t.Fatalf("Expected %v, but %v:", expected, args)
+ }
+}
+
+func TestDupEnv(t *testing.T) {
+ os.Setenv("FOO", "bar")
+ os.Setenv("FOO_BAR", "baz")
+
+ parser := NewParser()
+ parser.ParseEnv = true
+ args, err := parser.Parse("echo $$FOO$")
+ if err != nil {
+ t.Fatalf(err.Error())
+ }
+ expected := []string{"echo", "$bar$"}
+ if !reflect.DeepEqual(args, expected) {
+ t.Fatalf("Expected %v, but %v:", expected, args)
+ }
+
+ args, err = parser.Parse("echo $${FOO_BAR}$")
+ if err != nil {
+ t.Fatalf(err.Error())
+ }
+ expected = []string{"echo", "$baz$"}
+ if !reflect.DeepEqual(args, expected) {
+ t.Fatalf("Expected %v, but %v:", expected, args)
+ }
+}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mattn/go-shellwords/util_posix.go b/src/github.com/smira/aptly/_vendor/src/github.com/mattn/go-shellwords/util_posix.go
new file mode 100644
index 00000000..4f8ac55e
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mattn/go-shellwords/util_posix.go
@@ -0,0 +1,19 @@
+// +build !windows
+
+package shellwords
+
+import (
+ "errors"
+ "os"
+ "os/exec"
+ "strings"
+)
+
+func shellRun(line string) (string, error) {
+ shell := os.Getenv("SHELL")
+ b, err := exec.Command(shell, "-c", line).Output()
+ if err != nil {
+ return "", errors.New(err.Error() + ":" + string(b))
+ }
+ return strings.TrimSpace(string(b)), nil
+}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mattn/go-shellwords/util_windows.go b/src/github.com/smira/aptly/_vendor/src/github.com/mattn/go-shellwords/util_windows.go
new file mode 100644
index 00000000..7cad4cf0
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mattn/go-shellwords/util_windows.go
@@ -0,0 +1,17 @@
+package shellwords
+
+import (
+ "errors"
+ "os"
+ "os/exec"
+ "strings"
+)
+
+func shellRun(line string) (string, error) {
+ shell := os.Getenv("COMSPEC")
+ b, err := exec.Command(shell, "/c", line).Output()
+ if err != nil {
+ return "", errors.New(err.Error() + ":" + string(b))
+ }
+ return strings.TrimSpace(string(b)), nil
+}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/README.md b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/README.md
index 70e7f03f..c2ac2d42 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/README.md
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/README.md
@@ -1,4 +1,41 @@
-# goamz - An Amazon Library for Go
+# goamz - An Amazon Library for Go
+
+Current API documentation: [](https://godoc.org/github.com/mitchellh/goamz)
This is a fork of [https://launchpad.net/goamz](https://launchpad.net/goamz)
that adds some missing API calls to certain packages.
+
+This library is *incomplete*, but implements a large amount of the AWS API.
+It is heavily used in projects such as
+[Terraform](https://github.com/hashicorp/terraform) and
+[Packer](https://github.com/mitchellh/packer).
+If you find anything missing from this library,
+please [file an issue](https://github.com/mitchellh/goamz).
+
+## Example Usage
+
+```go
+package main
+
+import (
+ "github.com/mitchellh/goamz/aws"
+ "github.com/mitchellh/goamz/s3"
+ "log"
+ "fmt"
+)
+
+func main() {
+ auth, err := aws.EnvAuth()
+ if err != nil {
+ log.Fatal(err)
+ }
+ client := s3.New(auth, aws.USEast)
+ resp, err := client.ListBuckets()
+
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ log.Print(fmt.Sprintf("%T %+v", resp.Buckets[0], resp.Buckets[0]))
+}
+```
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/autoscaling/autoscaling.go b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/autoscaling/autoscaling.go
index 5c581c3d..e2cef98e 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/autoscaling/autoscaling.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/autoscaling/autoscaling.go
@@ -4,12 +4,13 @@ package autoscaling
import (
"encoding/xml"
- "github.com/mitchellh/goamz/aws"
"net/http"
"net/url"
"strconv"
"strings"
"time"
+
+ "github.com/mitchellh/goamz/aws"
)
// The AutoScaling type encapsulates operations operations with the autoscaling endpoint.
@@ -109,11 +110,13 @@ type LoadBalancerName struct {
}
type LaunchConfiguration struct {
- ImageId string `xml:"member>ImageId"`
- InstanceType string `xml:"member>InstanceType"`
- KeyName string `xml:"member>KeyName"`
- Name string `xml:"member>LaunchConfigurationName"`
- SecurityGroups []SecurityGroup `xml:"member>SecurityGroups"`
+ IamInstanceProfile string `xml:"member>IamInstanceProfile"`
+ ImageId string `xml:"member>ImageId"`
+ InstanceType string `xml:"member>InstanceType"`
+ KeyName string `xml:"member>KeyName"`
+ Name string `xml:"member>LaunchConfigurationName"`
+ SecurityGroups []SecurityGroup `xml:"member>SecurityGroups"`
+ UserData []byte `xml:"member>UserData"`
}
type AutoScalingGroup struct {
@@ -147,6 +150,7 @@ type CreateAutoScalingGroup struct {
MaxSize int
MinSize int
PlacementGroup string
+ TerminationPolicies []string
Name string
Tags []Tag
VPCZoneIdentifier []string
@@ -212,6 +216,10 @@ func (autoscaling *AutoScaling) CreateAutoScalingGroup(options *CreateAutoScalin
params["Tag.member."+strconv.Itoa(j+1)+".Value"] = tag.Value
}
+ for i, v := range options.TerminationPolicies {
+ params["TerminationPolicies.member."+strconv.Itoa(i+1)] = v
+ }
+
if options.VPCZoneIdentifier != nil {
params["VPCZoneIdentifier"] = strings.Join(options.VPCZoneIdentifier, ",")
}
@@ -235,6 +243,7 @@ type CreateLaunchConfiguration struct {
KeyName string
Name string
SecurityGroups []string
+ UserData string
}
func (autoscaling *AutoScaling) CreateLaunchConfiguration(options *CreateLaunchConfiguration) (resp *SimpleResp, err error) {
@@ -260,6 +269,12 @@ func (autoscaling *AutoScaling) CreateLaunchConfiguration(options *CreateLaunchC
params["SecurityGroups.member."+strconv.Itoa(i+1)] = v
}
+ if options.UserData != "" {
+ userData := make([]byte, b64.EncodedLen(len(options.UserData)))
+ b64.Encode(userData, []byte(options.UserData))
+ params["UserData"] = string(userData)
+ }
+
resp = &SimpleResp{}
err = autoscaling.query(params, resp)
@@ -389,6 +404,7 @@ type UpdateAutoScalingGroup struct {
MaxSize int
MinSize int
PlacementGroup string
+ TerminationPolicies []string
Name string
VPCZoneIdentifier []string
@@ -441,6 +457,9 @@ func (autoscaling *AutoScaling) UpdateAutoScalingGroup(options *UpdateAutoScalin
if options.PlacementGroup != "" {
params["PlacementGroup"] = options.PlacementGroup
}
+ for i, v := range options.TerminationPolicies {
+ params["TerminationPolicies.member."+strconv.Itoa(i+1)] = v
+ }
if options.VPCZoneIdentifier != nil {
params["VPCZoneIdentifier"] = strings.Join(options.VPCZoneIdentifier, ",")
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/autoscaling/autoscaling_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/autoscaling/autoscaling_test.go
index 74619701..8cccdc2b 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/autoscaling/autoscaling_test.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/autoscaling/autoscaling_test.go
@@ -1,11 +1,12 @@
package autoscaling_test
import (
+ "testing"
+
"github.com/mitchellh/goamz/autoscaling"
"github.com/mitchellh/goamz/aws"
"github.com/mitchellh/goamz/testutil"
. "github.com/motain/gocheck"
- "testing"
)
func Test(t *testing.T) {
@@ -44,6 +45,7 @@ func (s *S) Test_CreateAutoScalingGroup(c *C) {
MinSize: 2,
MaxSize: 2,
PlacementGroup: "foobar",
+ TerminationPolicies: []string{"ClosestToNextInstanceHour", "OldestInstance"},
Name: "foobar",
Tags: []autoscaling.Tag{
autoscaling.Tag{
@@ -60,6 +62,8 @@ func (s *S) Test_CreateAutoScalingGroup(c *C) {
c.Assert(req.Form["Action"], DeepEquals, []string{"CreateAutoScalingGroup"})
c.Assert(req.Form["InstanceId"], DeepEquals, []string{"i-foo"})
c.Assert(req.Form["VPCZoneIdentifier"], DeepEquals, []string{"foo,bar"})
+ c.Assert(req.Form["TerminationPolicies.member.1"], DeepEquals, []string{"ClosestToNextInstanceHour"})
+ c.Assert(req.Form["TerminationPolicies.member.2"], DeepEquals, []string{"OldestInstance"})
c.Assert(err, IsNil)
c.Assert(resp.RequestId, Equals, "8d798a29-f083-11e1-bdfb-cb223EXAMPLE")
}
@@ -74,6 +78,7 @@ func (s *S) Test_CreateLaunchConfiguration(c *C) {
InstanceType: "m1.small",
KeyName: "foobar",
Name: "i-141421",
+ UserData: "#!/bin/bash\necho Hello\n",
}
resp, err := s.autoscaling.CreateLaunchConfiguration(&options)
@@ -82,6 +87,7 @@ func (s *S) Test_CreateLaunchConfiguration(c *C) {
c.Assert(req.Form["Action"], DeepEquals, []string{"CreateLaunchConfiguration"})
c.Assert(req.Form["InstanceType"], DeepEquals, []string{"m1.small"})
c.Assert(req.Form["SecurityGroups.member.1"], DeepEquals, []string{"sg-1111"})
+ c.Assert(req.Form["UserData"], DeepEquals, []string{"IyEvYmluL2Jhc2gKZWNobyBIZWxsbwo="})
c.Assert(err, IsNil)
c.Assert(resp.RequestId, Equals, "7c6e177f-f082-11e1-ac58-3714bEXAMPLE")
}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/aws/aws.go b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/aws/aws.go
index 7ef367bd..85e395e6 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/aws/aws.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/aws/aws.go
@@ -15,6 +15,8 @@ import (
"fmt"
"io/ioutil"
"os"
+
+ "github.com/vaughan0/go-ini"
)
// Region defines the URLs where AWS services may be accessed.
@@ -190,6 +192,23 @@ var SAEast = Region{
"https://route53.amazonaws.com",
}
+var CNNorth = Region{
+ "cn-north-1",
+ "https://ec2.cn-north-1.amazonaws.com.cn",
+ "https://s3.cn-north-1.amazonaws.com.cn",
+ "",
+ true,
+ true,
+ "",
+ "https://sns.cn-north-1.amazonaws.com.cn",
+ "https://sqs.cn-north-1.amazonaws.com.cn",
+ "https://iam.cn-north-1.amazonaws.com.cn",
+ "https://elasticloadbalancing.cn-north-1.amazonaws.com.cn",
+ "https://autoscaling.cn-north-1.amazonaws.com.cn",
+ "https://rds.cn-north-1.amazonaws.com.cn",
+ "https://route53.amazonaws.com",
+}
+
var Regions = map[string]Region{
APNortheast.Name: APNortheast,
APSoutheast.Name: APSoutheast,
@@ -200,6 +219,7 @@ var Regions = map[string]Region{
USWest2.Name: USWest2,
SAEast.Name: SAEast,
USGovWest.Name: USGovWest,
+ CNNorth.Name: CNNorth,
}
type Auth struct {
@@ -278,6 +298,13 @@ func GetAuth(accessKey string, secretKey string) (auth Auth, err error) {
return Auth{accessKey, secretKey, ""}, nil
}
+ // Next try to get auth from the environment
+ auth, err = SharedAuth()
+ if err == nil {
+ // Found auth, return
+ return
+ }
+
// Next try to get auth from the environment
auth, err = EnvAuth()
if err == nil {
@@ -298,8 +325,53 @@ func GetAuth(accessKey string, secretKey string) (auth Auth, err error) {
return
}
+// SharedAuth creates an Auth based on shared credentials stored in
+// $HOME/.aws/credentials. The AWS_PROFILE environment variables is used to
+// select the profile.
+func SharedAuth() (auth Auth, err error) {
+ var profileName = os.Getenv("AWS_PROFILE")
+
+ if profileName == "" {
+ profileName = "default"
+ }
+
+ var credentialsFile = os.Getenv("AWS_CREDENTIAL_FILE")
+ if credentialsFile == "" {
+ var homeDir = os.Getenv("HOME")
+ if homeDir == "" {
+ err = errors.New("Could not get HOME")
+ return
+ }
+ credentialsFile = homeDir + "/.aws/credentials"
+ }
+
+ file, err := ini.LoadFile(credentialsFile)
+ if err != nil {
+ err = errors.New("Couldn't parse AWS credentials file")
+ return
+ }
+
+ var profile = file[profileName]
+ if profile == nil {
+ err = errors.New("Couldn't find profile in AWS credentials file")
+ return
+ }
+
+ auth.AccessKey = profile["aws_access_key_id"]
+ auth.SecretKey = profile["aws_secret_access_key"]
+
+ if auth.AccessKey == "" {
+ err = errors.New("AWS_ACCESS_KEY_ID not found in environment in credentials file")
+ }
+ if auth.SecretKey == "" {
+ err = errors.New("AWS_SECRET_ACCESS_KEY not found in credentials file")
+ }
+ return
+}
+
// EnvAuth creates an Auth based on environment information.
// The AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment
+// For accounts that require a security token, it is read from AWS_SECURITY_TOKEN
// variables are used.
func EnvAuth() (auth Auth, err error) {
auth.AccessKey = os.Getenv("AWS_ACCESS_KEY_ID")
@@ -311,6 +383,9 @@ func EnvAuth() (auth Auth, err error) {
if auth.SecretKey == "" {
auth.SecretKey = os.Getenv("AWS_SECRET_KEY")
}
+
+ auth.Token = os.Getenv("AWS_SECURITY_TOKEN")
+
if auth.AccessKey == "" {
err = errors.New("AWS_ACCESS_KEY_ID or AWS_ACCESS_KEY not found in environment")
}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/aws/aws_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/aws/aws_test.go
index 54ef62ac..78cbbaf0 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/aws/aws_test.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/aws/aws_test.go
@@ -3,6 +3,7 @@ package aws_test
import (
"github.com/mitchellh/goamz/aws"
. "github.com/motain/gocheck"
+ "io/ioutil"
"os"
"strings"
"testing"
@@ -30,6 +31,110 @@ func (s *S) TearDownTest(c *C) {
}
}
+func (s *S) TestSharedAuthNoHome(c *C) {
+ os.Clearenv()
+ os.Setenv("AWS_PROFILE", "foo")
+ _, err := aws.SharedAuth()
+ c.Assert(err, ErrorMatches, "Could not get HOME")
+}
+
+func (s *S) TestSharedAuthNoCredentialsFile(c *C) {
+ os.Clearenv()
+ os.Setenv("AWS_PROFILE", "foo")
+ os.Setenv("HOME", "/tmp")
+ _, err := aws.SharedAuth()
+ c.Assert(err, ErrorMatches, "Couldn't parse AWS credentials file")
+}
+
+func (s *S) TestSharedAuthNoProfileInFile(c *C) {
+ os.Clearenv()
+ os.Setenv("AWS_PROFILE", "foo")
+
+ d, err := ioutil.TempDir("", "")
+ if err != nil {
+ panic(err)
+ }
+ defer os.RemoveAll(d)
+
+ err = os.Mkdir(d+"/.aws", 0755)
+ if err != nil {
+ panic(err)
+ }
+
+ ioutil.WriteFile(d+"/.aws/credentials", []byte("[bar]\n"), 0644)
+ os.Setenv("HOME", d)
+
+ _, err = aws.SharedAuth()
+ c.Assert(err, ErrorMatches, "Couldn't find profile in AWS credentials file")
+}
+
+func (s *S) TestSharedAuthNoKeysInProfile(c *C) {
+ os.Clearenv()
+ os.Setenv("AWS_PROFILE", "bar")
+
+ d, err := ioutil.TempDir("", "")
+ if err != nil {
+ panic(err)
+ }
+ defer os.RemoveAll(d)
+
+ err = os.Mkdir(d+"/.aws", 0755)
+ if err != nil {
+ panic(err)
+ }
+
+ ioutil.WriteFile(d+"/.aws/credentials", []byte("[bar]\nawsaccesskeyid = AK.."), 0644)
+ os.Setenv("HOME", d)
+
+ _, err = aws.SharedAuth()
+ c.Assert(err, ErrorMatches, "AWS_SECRET_ACCESS_KEY not found in credentials file")
+}
+
+func (s *S) TestSharedAuthDefaultCredentials(c *C) {
+ os.Clearenv()
+
+ d, err := ioutil.TempDir("", "")
+ if err != nil {
+ panic(err)
+ }
+ defer os.RemoveAll(d)
+
+ err = os.Mkdir(d+"/.aws", 0755)
+ if err != nil {
+ panic(err)
+ }
+
+ ioutil.WriteFile(d+"/.aws/credentials", []byte("[default]\naws_access_key_id = access\naws_secret_access_key = secret\n"), 0644)
+ os.Setenv("HOME", d)
+
+ auth, err := aws.SharedAuth()
+ c.Assert(err, IsNil)
+ c.Assert(auth, Equals, aws.Auth{SecretKey: "secret", AccessKey: "access"})
+}
+
+func (s *S) TestSharedAuth(c *C) {
+ os.Clearenv()
+ os.Setenv("AWS_PROFILE", "bar")
+
+ d, err := ioutil.TempDir("", "")
+ if err != nil {
+ panic(err)
+ }
+ defer os.RemoveAll(d)
+
+ err = os.Mkdir(d+"/.aws", 0755)
+ if err != nil {
+ panic(err)
+ }
+
+ ioutil.WriteFile(d+"/.aws/credentials", []byte("[bar]\naws_access_key_id = access\naws_secret_access_key = secret\n"), 0644)
+ os.Setenv("HOME", d)
+
+ auth, err := aws.SharedAuth()
+ c.Assert(err, IsNil)
+ c.Assert(auth, Equals, aws.Auth{SecretKey: "secret", AccessKey: "access"})
+}
+
func (s *S) TestEnvAuthNoSecret(c *C) {
os.Clearenv()
_, err := aws.EnvAuth()
@@ -52,6 +157,16 @@ func (s *S) TestEnvAuth(c *C) {
c.Assert(auth, Equals, aws.Auth{SecretKey: "secret", AccessKey: "access"})
}
+func (s *S) TestEnvAuthWithToken(c *C) {
+ os.Clearenv()
+ os.Setenv("AWS_SECRET_ACCESS_KEY", "secret")
+ os.Setenv("AWS_ACCESS_KEY_ID", "access")
+ os.Setenv("AWS_SECURITY_TOKEN", "token")
+ auth, err := aws.EnvAuth()
+ c.Assert(err, IsNil)
+ c.Assert(auth, Equals, aws.Auth{SecretKey: "secret", AccessKey: "access", Token: "token"})
+}
+
func (s *S) TestEnvAuthAlt(c *C) {
os.Clearenv()
os.Setenv("AWS_SECRET_KEY", "secret")
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/ec2/ec2.go b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/ec2/ec2.go
index 6042aa61..0d9b09be 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/ec2/ec2.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/ec2/ec2.go
@@ -178,7 +178,7 @@ func buildError(r *http.Response) error {
err.RequestId = errors.RequestId
err.StatusCode = r.StatusCode
if err.Message == "" {
- err.Message = r.Status
+ err.Message = err.Code
}
return &err
}
@@ -220,6 +220,8 @@ func addBlockDeviceParams(prename string, params map[string]string, blockdevices
}
if k.DeleteOnTermination {
params[prefix+"Ebs.DeleteOnTermination"] = "true"
+ } else {
+ params[prefix+"Ebs.DeleteOnTermination"] = "false"
}
if k.Encrypted {
params[prefix+"Ebs.Encrypted"] = "true"
@@ -253,6 +255,7 @@ type RunInstances struct {
SubnetId string
AssociatePublicIpAddress bool
DisableAPITermination bool
+ EbsOptimized bool
ShutdownBehavior string
PrivateIPAddress string
BlockDevices []BlockDeviceMapping
@@ -269,6 +272,15 @@ type RunInstancesResp struct {
Instances []Instance `xml:"instancesSet>item"`
}
+// BlockDevice represents the association of a block device with an instance.
+type BlockDevice struct {
+ DeviceName string `xml:"deviceName"`
+ VolumeId string `xml:"ebs>volumeId"`
+ Status string `xml:"ebs>status"`
+ AttachTime string `xml:"ebs>attachTime"`
+ DeleteOnTermination bool `xml:"ebs>deleteOnTermination"`
+}
+
// Instance encapsulates a running instance in EC2.
//
// See http://goo.gl/OCH8a for more details.
@@ -296,6 +308,8 @@ type Instance struct {
LaunchTime time.Time `xml:"launchTime"`
SourceDestCheck bool `xml:"sourceDestCheck"`
SecurityGroups []SecurityGroup `xml:"groupSet>item"`
+ EbsOptimized string `xml:"ebsOptimized"`
+ BlockDevices []BlockDevice `xml:"blockDeviceMapping>item"`
}
// RunInstances starts new instances in EC2.
@@ -392,6 +406,9 @@ func (ec2 *EC2) RunInstances(options *RunInstances) (resp *RunInstancesResp, err
if options.DisableAPITermination {
params["DisableApiTermination"] = "true"
}
+ if options.EbsOptimized {
+ params["EbsOptimized"] = "true"
+ }
if options.ShutdownBehavior != "" {
params["InstanceInitiatedShutdownBehavior"] = options.ShutdownBehavior
}
@@ -419,6 +436,78 @@ func clientToken() (string, error) {
return hex.EncodeToString(buf), nil
}
+// ----------------------------------------------------------------------------
+// Instance events and status functions and types.
+
+// The DescribeInstanceStatus type encapsulates options for the respective request in EC2.
+//
+// See http://goo.gl/DFySJY for more details.
+type EventsSet struct {
+ Code string `xml:"code"`
+ Description string `xml:"description"`
+ NotBefore string `xml:"notBefore"`
+ NotAfter string `xml:"notAfter"`
+}
+
+type StatusDetails struct {
+ Name string `xml:"name"`
+ Status string `xml:"status"`
+ ImpairedSince string `xml:"impairedSince"`
+}
+
+type Status struct {
+ Status string `xml:"status"`
+ Details []StatusDetails `xml:"details>item"`
+}
+
+type InstanceStatusSet struct {
+ InstanceId string `xml:"instanceId"`
+ AvailabilityZone string `xml:"availabilityZone"`
+ InstanceState InstanceState `xml:"instanceState"`
+ SystemStatus Status `xml:"systemStatus"`
+ InstanceStatus Status `xml:"instanceStatus"`
+ Events []EventsSet `xml:"eventsSet>item"`
+}
+
+type DescribeInstanceStatusResp struct {
+ RequestId string `xml:"requestId"`
+ InstanceStatus []InstanceStatusSet `xml:"instanceStatusSet>item"`
+}
+
+type DescribeInstanceStatus struct {
+ InstanceIds []string
+ IncludeAllInstances bool
+ MaxResults int64
+ NextToken string
+}
+
+func (ec2 *EC2) DescribeInstanceStatus(options *DescribeInstanceStatus, filter *Filter) (resp *DescribeInstanceStatusResp, err error) {
+ params := makeParams("DescribeInstanceStatus")
+ if options.IncludeAllInstances {
+ params["IncludeAllInstances"] = "true"
+ }
+ if len(options.InstanceIds) > 0 {
+ addParamsList(params, "InstanceIds", options.InstanceIds)
+ }
+ if options.MaxResults > 0 {
+ params["MaxResults"] = strconv.FormatInt(options.MaxResults, 10)
+ }
+ if options.NextToken != "" {
+ params["NextToken"] = options.NextToken
+ }
+ if filter != nil {
+ filter.addParams(params)
+ }
+
+ resp = &DescribeInstanceStatusResp{}
+ err = ec2.query(params, resp)
+ if err != nil {
+ return nil, err
+ }
+
+ return
+}
+
// ----------------------------------------------------------------------------
// Spot Instance management functions and types.
@@ -478,6 +567,12 @@ type SpotLaunchSpec struct {
BlockDevices []BlockDeviceMapping `xml:"blockDeviceMapping>item"`
}
+type SpotStatus struct {
+ Code string `xml:"code"`
+ UpdateTime string `xml:"updateTime"`
+ Message string `xml:"message"`
+}
+
type SpotRequestResult struct {
SpotRequestId string `xml:"spotInstanceRequestId"`
SpotPrice string `xml:"spotPrice"`
@@ -485,6 +580,7 @@ type SpotRequestResult struct {
AvailZone string `xml:"launchedAvailabilityZone"`
InstanceId string `xml:"instanceId"`
State string `xml:"state"`
+ Status SpotStatus `xml:"status"`
SpotLaunchSpec SpotLaunchSpec `xml:"launchSpecification"`
CreateTime string `xml:"createTime"`
Tags []Tag `xml:"tagSet>item"`
@@ -636,6 +732,61 @@ func (ec2 *EC2) CancelSpotRequests(spotrequestIds []string) (resp *CancelSpotReq
return
}
+type DescribeSpotPriceHistory struct {
+ InstanceType []string
+ ProductDescription []string
+ AvailabilityZone string
+ StartTime, EndTime time.Time
+}
+
+// Response to a DescribeSpotPriceHisotyr request.
+//
+// See http://goo.gl/3BKHj for more details.
+type DescribeSpotPriceHistoryResp struct {
+ RequestId string `xml:"requestId"`
+ History []SpotPriceHistory `xml:"spotPriceHistorySet>item"`
+}
+
+type SpotPriceHistory struct {
+ InstanceType string `xml:"instanceType"`
+ ProductDescription string `xml:"productDescription"`
+ SpotPrice string `xml:"spotPrice"`
+ Timestamp time.Time `xml:"timestamp"`
+ AvailabilityZone string `xml:"availabilityZone"`
+}
+
+// DescribeSpotPriceHistory gets the spot pricing history.
+//
+// See http://goo.gl/3BKHj for more details.
+func (ec2 *EC2) DescribeSpotPriceHistory(o *DescribeSpotPriceHistory) (resp *DescribeSpotPriceHistoryResp, err error) {
+ params := makeParams("DescribeSpotPriceHistory")
+ if o.AvailabilityZone != "" {
+ params["AvailabilityZone"] = o.AvailabilityZone
+ }
+
+ if !o.StartTime.IsZero() {
+ params["StartTime"] = o.StartTime.In(time.UTC).Format(time.RFC3339)
+ }
+ if !o.EndTime.IsZero() {
+ params["EndTime"] = o.EndTime.In(time.UTC).Format(time.RFC3339)
+ }
+
+ if len(o.InstanceType) > 0 {
+ addParamsList(params, "InstanceType", o.InstanceType)
+ }
+ if len(o.ProductDescription) > 0 {
+ addParamsList(params, "ProductDescription", o.ProductDescription)
+ }
+
+ resp = &DescribeSpotPriceHistoryResp{}
+ err = ec2.query(params, resp)
+ if err != nil {
+ return nil, err
+ }
+
+ return
+}
+
// Response to a TerminateInstances request.
//
// See http://goo.gl/3BKHj for more details.
@@ -1834,6 +1985,29 @@ func (ec2 *EC2) CreateTags(resourceIds []string, tags []Tag) (resp *SimpleResp,
return resp, nil
}
+type TagsResp struct {
+ RequestId string `xml:"requestId"`
+ Tags []ResourceTag `xml:"tagSet>item"`
+}
+
+type ResourceTag struct {
+ Tag
+ ResourceId string `xml:"resourceId"`
+ ResourceType string `xml:"resourceType"`
+}
+
+func (ec2 *EC2) Tags(filter *Filter) (*TagsResp, error) {
+ params := makeParams("DescribeTags")
+ filter.addParams(params)
+
+ resp := &TagsResp{}
+ if err := ec2.query(params, resp); err != nil {
+ return nil, err
+ }
+
+ return resp, nil
+}
+
// Response to a StartInstances request.
//
// See http://goo.gl/awKeF for more details.
@@ -2006,6 +2180,27 @@ type CreateVpcResp struct {
VPC VPC `xml:"vpc"`
}
+// The ModifyVpcAttribute request parameters.
+//
+// See http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-DescribeVpcAttribute.html for more details.
+type ModifyVpcAttribute struct {
+ EnableDnsSupport bool
+ EnableDnsHostnames bool
+
+ SetEnableDnsSupport bool
+ SetEnableDnsHostnames bool
+}
+
+// Response to a DescribeVpcAttribute request.
+//
+// See http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-DescribeVpcAttribute.html for more details.
+type VpcAttributeResp struct {
+ RequestId string `xml:"requestId"`
+ VpcId string `xml:"vpcId"`
+ EnableDnsSupport bool `xml:"enableDnsSupport>value"`
+ EnableDnsHostnames bool `xml:"enableDnsHostnames>value"`
+}
+
// CreateInternetGateway request parameters.
//
// http://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-CreateInternetGateway.html
@@ -2074,6 +2269,19 @@ type CreateSubnetResp struct {
Subnet Subnet `xml:"subnet"`
}
+// The ModifySubnetAttribute request parameters
+//
+// http://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-ModifySubnetAttribute.html
+type ModifySubnetAttribute struct {
+ SubnetId string
+ MapPublicIpOnLaunch bool
+}
+
+type ModifySubnetAttributeResp struct {
+ RequestId string `xml:"requestId"`
+ Return bool `xml:"return"`
+}
+
// Response to a DescribeInternetGateways request.
type InternetGatewaysResp struct {
RequestId string `xml:"requestId"`
@@ -2208,6 +2416,49 @@ func (ec2 *EC2) DescribeVpcs(ids []string, filter *Filter) (resp *VpcsResp, err
return
}
+// VpcAttribute describes an attribute of a VPC.
+// You can specify only one attribute at a time.
+// Valid attributes are:
+// enableDnsSupport | enableDnsHostnames
+//
+// See http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-DescribeVpcAttribute.html for more details.
+func (ec2 *EC2) VpcAttribute(vpcId, attribute string) (resp *VpcAttributeResp, err error) {
+ params := makeParams("DescribeVpcAttribute")
+ params["VpcId"] = vpcId
+ params["Attribute"] = attribute
+
+ resp = &VpcAttributeResp{}
+ err = ec2.query(params, resp)
+ if err != nil {
+ return nil, err
+ }
+ return
+}
+
+// ModifyVpcAttribute modifies the specified attribute of the specified VPC.
+//
+// See http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-ModifyVpcAttribute.html for more details.
+func (ec2 *EC2) ModifyVpcAttribute(vpcId string, options *ModifyVpcAttribute) (*SimpleResp, error) {
+ params := makeParams("ModifyVpcAttribute")
+
+ params["VpcId"] = vpcId
+
+ if options.SetEnableDnsSupport {
+ params["EnableDnsSupport.Value"] = strconv.FormatBool(options.EnableDnsSupport)
+ }
+
+ if options.SetEnableDnsHostnames {
+ params["EnableDnsHostnames.Value"] = strconv.FormatBool(options.EnableDnsHostnames)
+ }
+
+ resp := &SimpleResp{}
+ if err := ec2.query(params, resp); err != nil {
+ return nil, err
+ }
+
+ return resp, nil
+}
+
// Create a new subnet.
func (ec2 *EC2) CreateSubnet(options *CreateSubnet) (resp *CreateSubnetResp, err error) {
params := makeParams("CreateSubnet")
@@ -2237,6 +2488,26 @@ func (ec2 *EC2) DeleteSubnet(id string) (resp *SimpleResp, err error) {
return
}
+// ModifySubnetAttribute
+//
+// http://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-ModifySubnetAttribute.html
+func (ec2 *EC2) ModifySubnetAttribute(options *ModifySubnetAttribute) (resp *ModifySubnetAttributeResp, err error) {
+ params := makeParams("ModifySubnetAttribute")
+ params["SubnetId"] = options.SubnetId
+ if options.MapPublicIpOnLaunch {
+ params["MapPublicIpOnLaunch.Value"] = "true"
+ } else {
+ params["MapPublicIpOnLaunch.Value"] = "false"
+ }
+
+ resp = &ModifySubnetAttributeResp{}
+ err = ec2.query(params, resp)
+ if err != nil {
+ return nil, err
+ }
+ return
+}
+
// DescribeSubnets
//
// http://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeSubnets.html
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/ec2/ec2_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/ec2/ec2_test.go
index 4d0c08a3..93f2eaf3 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/ec2/ec2_test.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/ec2/ec2_test.go
@@ -95,13 +95,13 @@ func (s *S) TestRunInstancesErrorWithoutXML(c *C) {
testServer.WaitRequest()
c.Assert(resp, IsNil)
- c.Assert(err, ErrorMatches, "500 Internal Server Error")
+ c.Assert(err, ErrorMatches, "")
ec2err, ok := err.(*ec2.Error)
c.Assert(ok, Equals, true)
c.Assert(ec2err.StatusCode, Equals, 500)
c.Assert(ec2err.Code, Equals, "")
- c.Assert(ec2err.Message, Equals, "500 Internal Server Error")
+ c.Assert(ec2err.Message, Equals, "")
c.Assert(ec2err.RequestId, Equals, "")
}
@@ -114,13 +114,13 @@ func (s *S) TestRequestSpotInstancesErrorWithoutXML(c *C) {
testServer.WaitRequest()
c.Assert(resp, IsNil)
- c.Assert(err, ErrorMatches, "500 Internal Server Error")
+ c.Assert(err, ErrorMatches, "")
ec2err, ok := err.(*ec2.Error)
c.Assert(ok, Equals, true)
c.Assert(ec2err.StatusCode, Equals, 500)
c.Assert(ec2err.Code, Equals, "")
- c.Assert(ec2err.Message, Equals, "500 Internal Server Error")
+ c.Assert(ec2err.Message, Equals, "")
c.Assert(ec2err.RequestId, Equals, "")
}
@@ -140,6 +140,7 @@ func (s *S) TestRunInstancesExample(c *C) {
Monitoring: true,
SubnetId: "subnet-id",
DisableAPITermination: true,
+ EbsOptimized: true,
ShutdownBehavior: "terminate",
PrivateIPAddress: "10.0.0.25",
BlockDevices: []ec2.BlockDeviceMapping{
@@ -168,6 +169,7 @@ func (s *S) TestRunInstancesExample(c *C) {
c.Assert(req.Form["Monitoring.Enabled"], DeepEquals, []string{"true"})
c.Assert(req.Form["SubnetId"], DeepEquals, []string{"subnet-id"})
c.Assert(req.Form["DisableApiTermination"], DeepEquals, []string{"true"})
+ c.Assert(req.Form["EbsOptimized"], DeepEquals, []string{"true"})
c.Assert(req.Form["InstanceInitiatedShutdownBehavior"], DeepEquals, []string{"terminate"})
c.Assert(req.Form["PrivateIpAddress"], DeepEquals, []string{"10.0.0.25"})
c.Assert(req.Form["BlockDeviceMapping.1.DeviceName"], DeepEquals, []string{"/dev/sdb"})
@@ -266,6 +268,9 @@ func (s *S) TestRequestSpotInstancesExample(c *C) {
c.Assert(resp.SpotRequestResults[0].SpotPrice, Equals, "0.5")
c.Assert(resp.SpotRequestResults[0].State, Equals, "open")
c.Assert(resp.SpotRequestResults[0].SpotLaunchSpec.ImageId, Equals, "ami-1a2b3c4d")
+ c.Assert(resp.SpotRequestResults[0].Status.Code, Equals, "pending-evaluation")
+ c.Assert(resp.SpotRequestResults[0].Status.UpdateTime, Equals, "2008-05-07T12:51:50.000Z")
+ c.Assert(resp.SpotRequestResults[0].Status.Message, Equals, "Your Spot request has been submitted for review, and is pending evaluation.")
}
func (s *S) TestCancelSpotRequestsExample(c *C) {
@@ -301,6 +306,7 @@ func (s *S) TestTerminateInstancesExample(c *C) {
c.Assert(req.Form["Monitoring.Enabled"], IsNil)
c.Assert(req.Form["SubnetId"], IsNil)
c.Assert(req.Form["DisableApiTermination"], IsNil)
+ c.Assert(req.Form["EbsOptimized"], IsNil)
c.Assert(req.Form["InstanceInitiatedShutdownBehavior"], IsNil)
c.Assert(req.Form["PrivateIpAddress"], IsNil)
@@ -334,6 +340,9 @@ func (s *S) TestDescribeSpotRequestsExample(c *C) {
c.Assert(resp.SpotRequestResults[0].State, Equals, "active")
c.Assert(resp.SpotRequestResults[0].SpotPrice, Equals, "0.5")
c.Assert(resp.SpotRequestResults[0].SpotLaunchSpec.ImageId, Equals, "ami-1a2b3c4d")
+ c.Assert(resp.SpotRequestResults[0].Status.Code, Equals, "fulfilled")
+ c.Assert(resp.SpotRequestResults[0].Status.UpdateTime, Equals, "2008-05-07T12:51:50.000Z")
+ c.Assert(resp.SpotRequestResults[0].Status.Message, Equals, "Your Spot request is fulfilled.")
}
func (s *S) TestDescribeInstancesExample1(c *C) {
@@ -366,6 +375,13 @@ func (s *S) TestDescribeInstancesExample1(c *C) {
c.Assert(r0i.PrivateDNSName, Equals, "domU-12-31-39-10-56-34.compute-1.internal")
c.Assert(r0i.DNSName, Equals, "ec2-174-129-165-232.compute-1.amazonaws.com")
c.Assert(r0i.AvailZone, Equals, "us-east-1b")
+
+ b0 := r0i.BlockDevices[0]
+ c.Assert(b0.DeviceName, Equals, "/dev/sda1")
+ c.Assert(b0.VolumeId, Equals, "vol-a082c1c9")
+ c.Assert(b0.Status, Equals, "attached")
+ c.Assert(b0.AttachTime, Equals, "2010-08-17T01:15:21.000Z")
+ c.Assert(b0.DeleteOnTermination, Equals, false)
}
func (s *S) TestDescribeInstancesExample2(c *C) {
@@ -1041,6 +1057,31 @@ func (s *S) TestSignatureWithEndpointPath(c *C) {
c.Assert(req.Form["Signature"], DeepEquals, []string{"QmvgkYGn19WirCuCz/jRp3RmRgFwWR5WRkKZ5AZnyXQ="})
}
+func (s *S) TestDescribeInstanceStatusExample(c *C) {
+ testServer.Response(200, nil, DescribeInstanceStatusExample)
+ options := &ec2.DescribeInstanceStatus{}
+ resp, err := s.ec2.DescribeInstanceStatus(options, nil)
+
+ req := testServer.WaitRequest()
+ c.Assert(req.Form["Action"], DeepEquals, []string{"DescribeInstanceStatus"})
+
+ c.Assert(err, IsNil)
+ c.Assert(resp.RequestId, Equals, "3be1508e-c444-4fef-89cc-0b1223c4f02fEXAMPLE")
+ c.Assert(resp.InstanceStatus[0].InstanceId, Equals, "i-1a2b3c4d")
+ c.Assert(resp.InstanceStatus[0].InstanceState.Code, Equals, 16)
+ c.Assert(resp.InstanceStatus[0].SystemStatus.Status, Equals, "impaired")
+ c.Assert(resp.InstanceStatus[0].SystemStatus.Details[0].Name, Equals, "reachability")
+ c.Assert(resp.InstanceStatus[0].SystemStatus.Details[0].Status, Equals, "failed")
+ c.Assert(resp.InstanceStatus[0].SystemStatus.Details[0].ImpairedSince, Equals, "YYYY-MM-DDTHH:MM:SS.000Z")
+ c.Assert(resp.InstanceStatus[0].InstanceStatus.Details[0].Name, Equals, "reachability")
+ c.Assert(resp.InstanceStatus[0].InstanceStatus.Details[0].Status, Equals, "failed")
+ c.Assert(resp.InstanceStatus[0].InstanceStatus.Details[0].ImpairedSince, Equals, "YYYY-MM-DDTHH:MM:SS.000Z")
+ c.Assert(resp.InstanceStatus[0].Events[0].Code, Equals, "instance-retirement")
+ c.Assert(resp.InstanceStatus[0].Events[0].Description, Equals, "The instance is running on degraded hardware")
+ c.Assert(resp.InstanceStatus[0].Events[0].NotBefore, Equals, "YYYY-MM-DDTHH:MM:SS+0000")
+ c.Assert(resp.InstanceStatus[0].Events[0].NotAfter, Equals, "YYYY-MM-DDTHH:MM:SS+0000")
+}
+
func (s *S) TestAllocateAddressExample(c *C) {
testServer.Response(200, nil, AllocateAddressExample)
@@ -1223,6 +1264,24 @@ func (s *S) TestCreateSubnet(c *C) {
c.Assert(resp.Subnet.AvailableIpAddressCount, Equals, 251)
}
+func (s *S) TestModifySubnetAttribute(c *C) {
+ testServer.Response(200, nil, ModifySubnetAttributeExample)
+
+ options := &ec2.ModifySubnetAttribute{
+ SubnetId: "foo",
+ MapPublicIpOnLaunch: true,
+ }
+
+ resp, err := s.ec2.ModifySubnetAttribute(options)
+
+ req := testServer.WaitRequest()
+ c.Assert(req.Form["SubnetId"], DeepEquals, []string{"foo"})
+ c.Assert(req.Form["MapPublicIpOnLaunch.Value"], DeepEquals, []string{"true"})
+
+ c.Assert(err, IsNil)
+ c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
+}
+
func (s *S) TestResetImageAttribute(c *C) {
testServer.Response(200, nil, ResetImageAttributeExample)
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/ec2/responses_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/ec2/responses_test.go
index 61f7a419..3666f70d 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/ec2/responses_test.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/ec2/responses_test.go
@@ -108,7 +108,7 @@ var RequestSpotInstancesExample = `
open
pending-evaluation
- YYYY-MM-DDTHH:MM:SS.000Z
+ 2008-05-07T12:51:50.000Z
Your Spot request has been submitted for review, and is pending evaluation.
MyAzGroup
@@ -147,7 +147,7 @@ var DescribeSpotRequestsExample = `
active
fulfilled
- YYYY-MM-DDTHH:MM:SS.000Z
+ 2008-05-07T12:51:50.000Z
Your Spot request is fulfilled.
@@ -766,6 +766,137 @@ var AllocateAddressExample = `
`
+// http://goo.gl/DFySJY
+var DescribeInstanceStatusExample = `
+
+ 3be1508e-c444-4fef-89cc-0b1223c4f02fEXAMPLE
+
+ -
+ i-1a2b3c4d
+ us-east-1d
+
+
16
+ running
+
+
+ impaired
+
+ -
+ reachability
+ failed
+ YYYY-MM-DDTHH:MM:SS.000Z
+
+
+
+
+ impaired
+
+ -
+ reachability
+ failed
+ YYYY-MM-DDTHH:MM:SS.000Z
+
+
+
+
+ -
+
instance-retirement
+ The instance is running on degraded hardware
+ YYYY-MM-DDTHH:MM:SS+0000
+ YYYY-MM-DDTHH:MM:SS+0000
+
+
+
+ -
+ i-2a2b3c4d
+ us-east-1d
+
+
16
+ running
+
+
+ ok
+
+ -
+ reachability
+ passed
+
+
+
+
+ ok
+
+ -
+ reachability
+ passed
+
+
+
+
+ -
+
instance-reboot
+ The instance is scheduled for a reboot
+ YYYY-MM-DDTHH:MM:SS+0000
+ YYYY-MM-DDTHH:MM:SS+0000
+
+
+
+ -
+ i-3a2b3c4d
+ us-east-1c
+
+
16
+ running
+
+
+ ok
+
+ -
+ reachability
+ passed
+
+
+
+
+ ok
+
+ -
+ reachability
+ passed
+
+
+
+
+ -
+ i-4a2b3c4d
+ us-east-1c
+
+
16
+ running
+
+
+ ok
+
+ -
+ reachability
+ passed
+
+
+
+
+ insufficient-data
+
+ -
+ reachability
+ insufficient-data
+
+
+
+
+
+
+`
+
// http://goo.gl/3Q0oCc
var ReleaseAddressExample = `
@@ -845,6 +976,14 @@ var CreateSubnetExample = `
`
+// http://goo.gl/tu2Kxm
+var ModifySubnetAttributeExample = `
+
+ 59dbff89-35bd-4eac-99ed-be587EXAMPLE
+ true
+
+`
+
// http://goo.gl/r6ZCPm
var ResetImageAttributeExample = `
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/elb/elb.go b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/elb/elb.go
index 61a515d9..5d66f4a3 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/elb/elb.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/elb/elb.go
@@ -93,21 +93,28 @@ func makeParams(action string) map[string]string {
type Listener struct {
InstancePort int64 `xml:"member>Listener>InstancePort"`
InstanceProtocol string `xml:"member>Listener>InstanceProtocol"`
+ SSLCertificateId string `xml:"member>Listener>SSLCertificateId"`
LoadBalancerPort int64 `xml:"member>Listener>LoadBalancerPort"`
Protocol string `xml:"member>Listener>Protocol"`
}
// An Instance attaches to an elb
type Instance struct {
- InstanceId string `xml:"member>InstanceId"`
+ InstanceId string `xml:"InstanceId"`
+}
+
+// A tag attached to an elb
+type Tag struct {
+ Key string `xml:"Key"`
+ Value string `xml:"Value"`
}
// An InstanceState from an elb health query
type InstanceState struct {
- InstanceId string `xml:"member>InstanceId"`
- Description string `xml:"member>Description"`
- State string `xml:"member>State"`
- ReasonCode string `xml:"member>ReasonCode"`
+ InstanceId string `xml:"InstanceId"`
+ Description string `xml:"Description"`
+ State string `xml:"State"`
+ ReasonCode string `xml:"ReasonCode"`
}
// An Instance attaches to an elb
@@ -115,6 +122,67 @@ type AvailabilityZone struct {
AvailabilityZone string `xml:"member"`
}
+// ----------------------------------------------------------------------------
+// AddTags
+
+type AddTags struct {
+ LoadBalancerNames []string
+ Tags []Tag
+}
+
+type AddTagsResp struct {
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+func (elb *ELB) AddTags(options *AddTags) (resp *AddTagsResp, err error) {
+ params := makeParams("AddTags")
+
+ for i, v := range options.LoadBalancerNames {
+ params["LoadBalancerNames.member."+strconv.Itoa(i+1)] = v
+ }
+
+ for i, v := range options.Tags {
+ params["Tags.member."+strconv.Itoa(i+1)+".Key"] = v.Key
+ params["Tags.member."+strconv.Itoa(i+1)+".Value"] = v.Value
+ }
+
+ resp = &AddTagsResp{}
+
+ err = elb.query(params, resp)
+
+ return resp, err
+}
+
+// ----------------------------------------------------------------------------
+// RemoveTags
+
+type RemoveTags struct {
+ LoadBalancerNames []string
+ TagKeys []string
+}
+
+type RemoveTagsResp struct {
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+func (elb *ELB) RemoveTags(options *RemoveTags) (resp *RemoveTagsResp, err error) {
+ params := makeParams("RemoveTags")
+
+ for i, v := range options.LoadBalancerNames {
+ params["LoadBalancerNames.member."+strconv.Itoa(i+1)] = v
+ }
+
+ for i, v := range options.TagKeys {
+ params["Tags.member."+strconv.Itoa(i+1)+".Key"] = v
+ }
+
+ resp = &RemoveTagsResp{}
+
+ err = elb.query(params, resp)
+
+ return resp, err
+}
+
// ----------------------------------------------------------------------------
// Create
@@ -126,6 +194,7 @@ type CreateLoadBalancer struct {
Internal bool // true for vpc elbs
SecurityGroups []string
Subnets []string
+ Tags []Tag
}
type CreateLoadBalancerResp struct {
@@ -155,6 +224,12 @@ func (elb *ELB) CreateLoadBalancer(options *CreateLoadBalancer) (resp *CreateLoa
params["Listeners.member."+strconv.Itoa(i+1)+".InstancePort"] = strconv.FormatInt(v.InstancePort, 10)
params["Listeners.member."+strconv.Itoa(i+1)+".Protocol"] = v.Protocol
params["Listeners.member."+strconv.Itoa(i+1)+".InstanceProtocol"] = v.InstanceProtocol
+ params["Listeners.member."+strconv.Itoa(i+1)+".SSLCertificateId"] = v.SSLCertificateId
+ }
+
+ for i, v := range options.Tags {
+ params["Tags.member."+strconv.Itoa(i+1)+".Key"] = v.Key
+ params["Tags.member."+strconv.Itoa(i+1)+".Value"] = v.Value
}
if options.Internal {
@@ -203,10 +278,13 @@ func (elb *ELB) DeleteLoadBalancer(options *DeleteLoadBalancer) (resp *SimpleRes
type LoadBalancer struct {
LoadBalancerName string `xml:"member>LoadBalancerName"`
Listeners []Listener `xml:"member>ListenerDescriptions"`
- Instances []Instance `xml:"member>Instances"`
+ Instances []Instance `xml:"member>Instances>member"`
+ HealthCheck HealthCheck `xml:"member>HealthCheck"`
AvailabilityZones []AvailabilityZone `xml:"member>AvailabilityZones"`
- Scheme string `xml:"member>Scheme"`
DNSName string `xml:"member>DNSName"`
+ SecurityGroups []string `xml:"member>SecurityGroups>member"`
+ Scheme string `xml:"member>Scheme"`
+ Subnets []string `xml:"member>Subnets>member"`
}
// DescribeLoadBalancer request params
@@ -302,6 +380,84 @@ func (elb *ELB) DeregisterInstancesFromLoadBalancer(options *DeregisterInstances
return
}
+// ----------------------------------------------------------------------------
+// DescribeTags
+
+type DescribeTags struct {
+ LoadBalancerNames []string
+}
+
+type LoadBalancerTag struct {
+ Tags []Tag `xml:"Tags>member"`
+ LoadBalancerName string `xml:"LoadBalancerName"`
+}
+
+type DescribeTagsResp struct {
+ LoadBalancerTags []LoadBalancerTag `xml:"DescribeTagsResult>TagDescriptions>member"`
+ NextToken string `xml:"DescribeTagsResult>NextToken"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+func (elb *ELB) DescribeTags(options *DescribeTags) (resp *DescribeTagsResp, err error) {
+ params := makeParams("DescribeTags")
+
+ for i, v := range options.LoadBalancerNames {
+ params["LoadBalancerNames.member."+strconv.Itoa(i+1)] = v
+ }
+
+ resp = &DescribeTagsResp{}
+
+ err = elb.query(params, resp)
+
+ if err != nil {
+ resp = nil
+ }
+
+ return
+}
+
+// ----------------------------------------------------------------------------
+// Health Checks
+
+type HealthCheck struct {
+ HealthyThreshold int64 `xml:"HealthyThreshold"`
+ UnhealthyThreshold int64 `xml:"UnhealthyThreshold"`
+ Interval int64 `xml:"Interval"`
+ Target string `xml:"Target"`
+ Timeout int64 `xml:"Timeout"`
+}
+
+type ConfigureHealthCheck struct {
+ LoadBalancerName string
+ Check HealthCheck
+}
+
+type ConfigureHealthCheckResp struct {
+ Check HealthCheck `xml:"ConfigureHealthCheckResult>HealthCheck"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+func (elb *ELB) ConfigureHealthCheck(options *ConfigureHealthCheck) (resp *ConfigureHealthCheckResp, err error) {
+ params := makeParams("ConfigureHealthCheck")
+
+ params["LoadBalancerName"] = options.LoadBalancerName
+ params["HealthCheck.HealthyThreshold"] = strconv.Itoa(int(options.Check.HealthyThreshold))
+ params["HealthCheck.UnhealthyThreshold"] = strconv.Itoa(int(options.Check.UnhealthyThreshold))
+ params["HealthCheck.Interval"] = strconv.Itoa(int(options.Check.Interval))
+ params["HealthCheck.Target"] = options.Check.Target
+ params["HealthCheck.Timeout"] = strconv.Itoa(int(options.Check.Timeout))
+
+ resp = &ConfigureHealthCheckResp{}
+
+ err = elb.query(params, resp)
+
+ if err != nil {
+ resp = nil
+ }
+
+ return
+}
+
// ----------------------------------------------------------------------------
// Instance Health
@@ -311,7 +467,7 @@ type DescribeInstanceHealth struct {
}
type DescribeInstanceHealthResp struct {
- InstanceStates []InstanceState `xml:"DescribeInstanceHealthResult>InstanceStates"`
+ InstanceStates []InstanceState `xml:"DescribeInstanceHealthResult>InstanceStates>member"`
RequestId string `xml:"ResponseMetadata>RequestId"`
}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/elb/elb_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/elb/elb_test.go
index 3043e720..d0a5caab 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/elb/elb_test.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/elb/elb_test.go
@@ -30,6 +30,48 @@ func (s *S) TearDownTest(c *C) {
testServer.Flush()
}
+func (s *S) TestAddTags(c *C) {
+ testServer.Response(200, nil, AddTagsExample)
+
+ options := elb.AddTags{
+ LoadBalancerNames: []string{"foobar"},
+ Tags: []elb.Tag{
+ {
+ Key: "hello",
+ Value: "world",
+ },
+ },
+ }
+
+ resp, err := s.elb.AddTags(&options)
+ req := testServer.WaitRequest()
+
+ c.Assert(req.Form["Action"], DeepEquals, []string{"AddTags"})
+ c.Assert(req.Form["LoadBalancerNames.member.1"], DeepEquals, []string{"foobar"})
+ c.Assert(req.Form["Tags.member.1.Key"], DeepEquals, []string{"hello"})
+ c.Assert(req.Form["Tags.member.1.Value"], DeepEquals, []string{"world"})
+ c.Assert(err, IsNil)
+ c.Assert(resp.RequestId, Equals, "360e81f7-1100-11e4-b6ed-0f30EXAMPLE")
+}
+
+func (s *S) TestRemoveTags(c *C) {
+ testServer.Response(200, nil, RemoveTagsExample)
+
+ options := elb.RemoveTags{
+ LoadBalancerNames: []string{"foobar"},
+ TagKeys: []string{"hello"},
+ }
+
+ resp, err := s.elb.RemoveTags(&options)
+ req := testServer.WaitRequest()
+
+ c.Assert(req.Form["Action"], DeepEquals, []string{"RemoveTags"})
+ c.Assert(req.Form["LoadBalancerNames.member.1"], DeepEquals, []string{"foobar"})
+ c.Assert(req.Form["Tags.member.1.Key"], DeepEquals, []string{"hello"})
+ c.Assert(err, IsNil)
+ c.Assert(resp.RequestId, Equals, "83c88b9d-12b7-11e3-8b82-87b12EXAMPLE")
+}
+
func (s *S) TestCreateLoadBalancer(c *C) {
testServer.Response(200, nil, CreateLoadBalancerExample)
@@ -38,6 +80,7 @@ func (s *S) TestCreateLoadBalancer(c *C) {
Listeners: []elb.Listener{elb.Listener{
InstancePort: 80,
InstanceProtocol: "http",
+ SSLCertificateId: "needToAddASSLCertToYourAWSAccount",
LoadBalancerPort: 80,
Protocol: "http",
},
@@ -92,6 +135,11 @@ func (s *S) TestDescribeLoadBalancers(c *C) {
c.Assert(resp.LoadBalancers[0].AvailabilityZones[0].AvailabilityZone, Equals, "us-east-1a")
c.Assert(resp.LoadBalancers[0].Scheme, Equals, "internet-facing")
c.Assert(resp.LoadBalancers[0].DNSName, Equals, "MyLoadBalancer-123456789.us-east-1.elb.amazonaws.com")
+ c.Assert(resp.LoadBalancers[0].HealthCheck.HealthyThreshold, Equals, int64(2))
+ c.Assert(resp.LoadBalancers[0].HealthCheck.UnhealthyThreshold, Equals, int64(10))
+ c.Assert(resp.LoadBalancers[0].HealthCheck.Interval, Equals, int64(90))
+ c.Assert(resp.LoadBalancers[0].HealthCheck.Target, Equals, "HTTP:80/")
+ c.Assert(resp.LoadBalancers[0].HealthCheck.Timeout, Equals, int64(60))
}
func (s *S) TestRegisterInstancesWithLoadBalancer(c *C) {
@@ -136,6 +184,35 @@ func (s *S) TestDeregisterInstancesFromLoadBalancer(c *C) {
c.Assert(resp.RequestId, Equals, "83c88b9d-12b7-11e3-8b82-87b12EXAMPLE")
}
+func (s *S) TestConfigureHealthCheck(c *C) {
+ testServer.Response(200, nil, ConfigureHealthCheckExample)
+
+ options := elb.ConfigureHealthCheck{
+ LoadBalancerName: "foobar",
+ Check: elb.HealthCheck{
+ HealthyThreshold: 2,
+ UnhealthyThreshold: 2,
+ Interval: 30,
+ Target: "HTTP:80/ping",
+ Timeout: 3,
+ },
+ }
+
+ resp, err := s.elb.ConfigureHealthCheck(&options)
+ req := testServer.WaitRequest()
+
+ c.Assert(req.Form["Action"], DeepEquals, []string{"ConfigureHealthCheck"})
+ c.Assert(req.Form["LoadBalancerName"], DeepEquals, []string{"foobar"})
+ c.Assert(err, IsNil)
+
+ c.Assert(resp.Check.HealthyThreshold, Equals, int64(2))
+ c.Assert(resp.Check.UnhealthyThreshold, Equals, int64(2))
+ c.Assert(resp.Check.Interval, Equals, int64(30))
+ c.Assert(resp.Check.Target, Equals, "HTTP:80/ping")
+ c.Assert(resp.Check.Timeout, Equals, int64(3))
+ c.Assert(resp.RequestId, Equals, "83c88b9d-12b7-11e3-8b82-87b12EXAMPLE")
+}
+
func (s *S) TestDescribeInstanceHealth(c *C) {
testServer.Response(200, nil, DescribeInstanceHealthExample)
@@ -152,5 +229,7 @@ func (s *S) TestDescribeInstanceHealth(c *C) {
c.Assert(resp.InstanceStates[0].InstanceId, Equals, "i-90d8c2a5")
c.Assert(resp.InstanceStates[0].State, Equals, "InService")
+ c.Assert(resp.InstanceStates[1].InstanceId, Equals, "i-06ea3e60")
+ c.Assert(resp.InstanceStates[1].State, Equals, "OutOfService")
c.Assert(resp.RequestId, Equals, "1549581b-12b7-11e3-895e-1334aEXAMPLE")
}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/elb/responses_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/elb/responses_test.go
index 6b8578dc..77ae390c 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/elb/responses_test.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/elb/responses_test.go
@@ -7,6 +7,26 @@ var ErrorDump = `
0503f4e9-bbd6-483c-b54f-c4ae9f3b30f4
`
+// http://goo.gl/OkMdtJ
+var AddTagsExample = `
+
+
+
+ 360e81f7-1100-11e4-b6ed-0f30EXAMPLE
+
+
+`
+
+// http://goo.gl/nT2E89
+var RemoveTagsExample = `
+
+
+
+ 83c88b9d-12b7-11e3-8b82-87b12EXAMPLE
+
+
+`
+
// http://goo.gl/gQRD2H
var CreateLoadBalancerExample = `
@@ -51,6 +71,7 @@ var DescribeLoadBalancersExample = `
HTTP
80
HTTP
+ needToAddASSLCertToYourAWSAccount
80
@@ -119,6 +140,23 @@ var DeregisterInstancesFromLoadBalancerExample = `
`
+// http://docs.aws.amazon.com/ElasticLoadBalancing/latest/APIReference/API_ConfigureHealthCheck.html
+var ConfigureHealthCheckExample = `
+
+
+
+ 30
+ HTTP:80/ping
+ 2
+ 3
+ 2
+
+
+
+ 83c88b9d-12b7-11e3-8b82-87b12EXAMPLE
+
+`
+
// http://goo.gl/cGNxfj
var DescribeInstanceHealthExample = `
@@ -130,6 +168,12 @@ var DescribeInstanceHealthExample = `
InService
N/A
+
+ N/A
+ i-06ea3e60
+ OutOfService
+ N/A
+
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/exp/sdb/sign.go b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/exp/sdb/sign.go
index 0f9c2348..cfb6706f 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/exp/sdb/sign.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/exp/sdb/sign.go
@@ -4,11 +4,12 @@ import (
"crypto/hmac"
"crypto/sha256"
"encoding/base64"
- "github.com/mitchellh/goamz/aws"
"net/http"
"net/url"
"sort"
"strings"
+
+ "github.com/mitchellh/goamz/aws"
)
var b64 = base64.StdEncoding
@@ -31,7 +32,7 @@ func sign(auth aws.Auth, method, path string, params url.Values, headers http.He
params["SignatureVersion"] = []string{"2"}
params["SignatureMethod"] = []string{"HmacSHA256"}
if auth.Token != "" {
- params["SecurityToken"] = auth.Token
+ params["SecurityToken"] = []string{auth.Token}
}
// join up all the incoming params
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/exp/sns/permissions.go b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/exp/sns/permissions.go
new file mode 100644
index 00000000..e7c73629
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/exp/sns/permissions.go
@@ -0,0 +1,51 @@
+package sns
+
+import (
+ "strconv"
+)
+
+type Permission struct {
+ ActionName string
+ AccountId string
+}
+
+type AddPermissionResponse struct {
+ ResponseMetadata
+}
+
+// AddPermission
+//
+// See http://goo.gl/mbY4a for more details.
+func (sns *SNS) AddPermission(permissions []Permission, Label, TopicArn string) (resp *AddPermissionResponse, err error) {
+ resp = &AddPermissionResponse{}
+ params := makeParams("AddPermission")
+
+ for i, p := range permissions {
+ params["AWSAccountId.member."+strconv.Itoa(i+1)] = p.AccountId
+ params["ActionName.member."+strconv.Itoa(i+1)] = p.ActionName
+ }
+
+ params["Label"] = Label
+ params["TopicArn"] = TopicArn
+
+ err = sns.query(params, resp)
+ return
+}
+
+type RemovePermissionResponse struct {
+ ResponseMetadata
+}
+
+// RemovePermission
+//
+// See http://goo.gl/wGl5j for more details.
+func (sns *SNS) RemovePermission(Label, TopicArn string) (resp *RemovePermissionResponse, err error) {
+ resp = &RemovePermissionResponse{}
+ params := makeParams("RemovePermission")
+
+ params["Label"] = Label
+ params["TopicArn"] = TopicArn
+
+ err = sns.query(params, resp)
+ return
+}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/exp/sns/sns.go b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/exp/sns/sns.go
index 89e7b2f0..c1c08720 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/exp/sns/sns.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/exp/sns/sns.go
@@ -13,24 +13,16 @@
// first-class package in goamz.
package sns
-// BUG(niemeyer): Package needs significant clean up.
-
// BUG(niemeyer): Topic values in responses are not being initialized
// properly, since they're supposed to reference *SNS.
// BUG(niemeyer): Package needs documentation.
-// BUG(niemeyer): Message.Message should be "Payload []byte"
-
-// BUG(niemeyer): Message.SNS must be dropped.
-
import (
"encoding/xml"
- "errors"
"github.com/mitchellh/goamz/aws"
"net/http"
"net/url"
- "strconv"
"time"
)
@@ -41,32 +33,9 @@ type SNS struct {
private byte // Reserve the right of using private data.
}
-type Topic struct {
- SNS *SNS
- TopicArn string
-}
-
-func New(auth aws.Auth, region aws.Region) *SNS {
- return &SNS{auth, region, 0}
-}
-
-type Message struct {
- SNS *SNS
- Topic *Topic
- Message [8192]byte
- Subject string
-}
-
-type Subscription struct {
- Endpoint string
- Owner string
- Protocol string
- SubscriptionArn string
- TopicArn string
-}
-
-func (topic *Topic) Message(message [8192]byte, subject string) *Message {
- return &Message{topic.SNS, topic, message, subject}
+type AttributeEntry struct {
+ Key string `xml:"key"`
+ Value string `xml:"value"`
}
type ResponseMetadata struct {
@@ -74,35 +43,8 @@ type ResponseMetadata struct {
BoxUsage float64 `xml:"ResponseMetadata>BoxUsage"`
}
-type ListTopicsResp struct {
- Topics []Topic `xml:"ListTopicsResult>Topics>member"`
- NextToken string
- ResponseMetadata
-}
-
-type CreateTopicResp struct {
- Topic Topic `xml:"CreateTopicResult"`
- ResponseMetadata
-}
-
-type DeleteTopicResp struct {
- ResponseMetadata
-}
-
-type ListSubscriptionsResp struct {
- Subscriptions []Subscription `xml:"ListSubscriptionsResult>Subscriptions>member"`
- NextToken string
- ResponseMetadata
-}
-
-type AttributeEntry struct {
- Key string `xml:"key"`
- Value string `xml:"value"`
-}
-
-type GetTopicAttributesResp struct {
- Attributes []AttributeEntry `xml:"GetTopicAttributesResult>Attributes>entry"`
- ResponseMetadata
+func New(auth aws.Auth, region aws.Region) *SNS {
+ return &SNS{auth, region, 0}
}
func makeParams(action string) map[string]string {
@@ -111,273 +53,6 @@ func makeParams(action string) map[string]string {
return params
}
-// ListTopics
-//
-// See http://goo.gl/lfrMK for more details.
-func (sns *SNS) ListTopics(NextToken *string) (resp *ListTopicsResp, err error) {
- resp = &ListTopicsResp{}
- params := makeParams("ListTopics")
- if NextToken != nil {
- params["NextToken"] = *NextToken
- }
- err = sns.query(nil, nil, params, resp)
- return
-}
-
-// CreateTopic
-//
-// See http://goo.gl/m9aAt for more details.
-func (sns *SNS) CreateTopic(Name string) (resp *CreateTopicResp, err error) {
- resp = &CreateTopicResp{}
- params := makeParams("CreateTopic")
- params["Name"] = Name
- err = sns.query(nil, nil, params, resp)
- return
-}
-
-// DeleteTopic
-//
-// See http://goo.gl/OXNcY for more details.
-func (sns *SNS) DeleteTopic(topic Topic) (resp *DeleteTopicResp, err error) {
- resp = &DeleteTopicResp{}
- params := makeParams("DeleteTopic")
- params["TopicArn"] = topic.TopicArn
- err = sns.query(nil, nil, params, resp)
- return
-}
-
-// Delete
-//
-// Helper function for deleting a topic
-func (topic *Topic) Delete() (resp *DeleteTopicResp, err error) {
- return topic.SNS.DeleteTopic(*topic)
-}
-
-// ListSubscriptions
-//
-// See http://goo.gl/k3aGn for more details.
-func (sns *SNS) ListSubscriptions(NextToken *string) (resp *ListSubscriptionsResp, err error) {
- resp = &ListSubscriptionsResp{}
- params := makeParams("ListSubscriptions")
- if NextToken != nil {
- params["NextToken"] = *NextToken
- }
- err = sns.query(nil, nil, params, resp)
- return
-}
-
-// GetTopicAttributes
-//
-// See http://goo.gl/WXRoX for more details.
-func (sns *SNS) GetTopicAttributes(TopicArn string) (resp *GetTopicAttributesResp, err error) {
- resp = &GetTopicAttributesResp{}
- params := makeParams("GetTopicAttributes")
- params["TopicArn"] = TopicArn
- err = sns.query(nil, nil, params, resp)
- return
-}
-
-type PublishOpt struct {
- Message string
- MessageStructure string
- Subject string
- TopicArn string
-}
-
-type PublishResp struct {
- MessageId string `xml:"PublishResult>MessageId"`
- ResponseMetadata
-}
-
-// Publish
-//
-// See http://goo.gl/AY2D8 for more details.
-func (sns *SNS) Publish(options *PublishOpt) (resp *PublishResp, err error) {
- resp = &PublishResp{}
- params := makeParams("Publish")
-
- if options.Subject != "" {
- params["Subject"] = options.Subject
- }
-
- if options.MessageStructure != "" {
- params["MessageStructure"] = options.MessageStructure
- }
-
- if options.Message != "" {
- params["Message"] = options.Message
- }
-
- if options.TopicArn != "" {
- params["TopicArn"] = options.TopicArn
- }
-
- err = sns.query(nil, nil, params, resp)
- return
-}
-
-type SetTopicAttributesResponse struct {
- ResponseMetadata
-}
-
-// SetTopicAttributes
-//
-// See http://goo.gl/oVYW7 for more details.
-func (sns *SNS) SetTopicAttributes(AttributeName, AttributeValue, TopicArn string) (resp *SetTopicAttributesResponse, err error) {
- resp = &SetTopicAttributesResponse{}
- params := makeParams("SetTopicAttributes")
-
- if AttributeName == "" || TopicArn == "" {
- return nil, errors.New("Invalid Attribute Name or TopicArn")
- }
-
- params["AttributeName"] = AttributeName
- params["AttributeValue"] = AttributeValue
- params["TopicArn"] = TopicArn
-
- err = sns.query(nil, nil, params, resp)
- return
-}
-
-type SubscribeResponse struct {
- SubscriptionArn string `xml:"SubscribeResult>SubscriptionArn"`
- ResponseMetadata
-}
-
-// Subscribe
-//
-// See http://goo.gl/c3iGS for more details.
-func (sns *SNS) Subscribe(Endpoint, Protocol, TopicArn string) (resp *SubscribeResponse, err error) {
- resp = &SubscribeResponse{}
- params := makeParams("Subscribe")
-
- params["Endpoint"] = Endpoint
- params["Protocol"] = Protocol
- params["TopicArn"] = TopicArn
-
- err = sns.query(nil, nil, params, resp)
- return
-}
-
-type UnsubscribeResponse struct {
- ResponseMetadata
-}
-
-// Unsubscribe
-//
-// See http://goo.gl/4l5Ge for more details.
-func (sns *SNS) Unsubscribe(SubscriptionArn string) (resp *UnsubscribeResponse, err error) {
- resp = &UnsubscribeResponse{}
- params := makeParams("Unsubscribe")
-
- params["SubscriptionArn"] = SubscriptionArn
-
- err = sns.query(nil, nil, params, resp)
- return
-}
-
-type ConfirmSubscriptionResponse struct {
- SubscriptionArn string `xml:"ConfirmSubscriptionResult>SubscriptionArn"`
- ResponseMetadata
-}
-
-type ConfirmSubscriptionOpt struct {
- AuthenticateOnUnsubscribe string
- Token string
- TopicArn string
-}
-
-// ConfirmSubscription
-//
-// See http://goo.gl/3hXzH for more details.
-func (sns *SNS) ConfirmSubscription(options *ConfirmSubscriptionOpt) (resp *ConfirmSubscriptionResponse, err error) {
- resp = &ConfirmSubscriptionResponse{}
- params := makeParams("ConfirmSubscription")
-
- if options.AuthenticateOnUnsubscribe != "" {
- params["AuthenticateOnUnsubscribe"] = options.AuthenticateOnUnsubscribe
- }
-
- params["Token"] = options.Token
- params["TopicArn"] = options.TopicArn
-
- err = sns.query(nil, nil, params, resp)
- return
-}
-
-type Permission struct {
- ActionName string
- AccountId string
-}
-
-type AddPermissionResponse struct {
- ResponseMetadata
-}
-
-// AddPermission
-//
-// See http://goo.gl/mbY4a for more details.
-func (sns *SNS) AddPermission(permissions []Permission, Label, TopicArn string) (resp *AddPermissionResponse, err error) {
- resp = &AddPermissionResponse{}
- params := makeParams("AddPermission")
-
- for i, p := range permissions {
- params["AWSAccountId.member."+strconv.Itoa(i+1)] = p.AccountId
- params["ActionName.member."+strconv.Itoa(i+1)] = p.ActionName
- }
-
- params["Label"] = Label
- params["TopicArn"] = TopicArn
-
- err = sns.query(nil, nil, params, resp)
- return
-}
-
-type RemovePermissionResponse struct {
- ResponseMetadata
-}
-
-// RemovePermission
-//
-// See http://goo.gl/wGl5j for more details.
-func (sns *SNS) RemovePermission(Label, TopicArn string) (resp *RemovePermissionResponse, err error) {
- resp = &RemovePermissionResponse{}
- params := makeParams("RemovePermission")
-
- params["Label"] = Label
- params["TopicArn"] = TopicArn
-
- err = sns.query(nil, nil, params, resp)
- return
-}
-
-type ListSubscriptionByTopicResponse struct {
- Subscriptions []Subscription `xml:"ListSubscriptionsByTopicResult>Subscriptions>member"`
- ResponseMetadata
-}
-
-type ListSubscriptionByTopicOpt struct {
- NextToken string
- TopicArn string
-}
-
-// ListSubscriptionByTopic
-//
-// See http://goo.gl/LaVcC for more details.
-func (sns *SNS) ListSubscriptionByTopic(options *ListSubscriptionByTopicOpt) (resp *ListSubscriptionByTopicResponse, err error) {
- resp = &ListSubscriptionByTopicResponse{}
- params := makeParams("ListSbubscriptionByTopic")
-
- if options.NextToken != "" {
- params["NextToken"] = options.NextToken
- }
-
- params["TopicArn"] = options.TopicArn
-
- err = sns.query(nil, nil, params, resp)
- return
-}
-
type Error struct {
StatusCode int
Code string
@@ -394,7 +69,7 @@ type xmlErrors struct {
Errors []Error `xml:"Errors>Error"`
}
-func (sns *SNS) query(topic *Topic, message *Message, params map[string]string, resp interface{}) error {
+func (sns *SNS) query(params map[string]string, resp interface{}) error {
params["Timestamp"] = time.Now().UTC().Format(time.RFC3339)
u, err := url.Parse(sns.Region.SNSEndpoint)
if err != nil {
@@ -409,10 +84,6 @@ func (sns *SNS) query(topic *Topic, message *Message, params map[string]string,
}
defer r.Body.Close()
- //dump, _ := http.DumpResponse(r, true)
- //println("DUMP:\n", string(dump))
- //return nil
-
if r.StatusCode != 200 {
return buildError(r)
}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/exp/sns/sns_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/exp/sns/sns_test.go
index a8ff979c..3eb97f4a 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/exp/sns/sns_test.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/exp/sns/sns_test.go
@@ -40,6 +40,7 @@ func (s *S) TestListTopicsOK(c *C) {
c.Assert(req.URL.Path, Equals, "/")
c.Assert(req.Header["Date"], Not(Equals), "")
+ c.Assert(resp.Topics[0].SNS, Equals, s.sns)
c.Assert(resp.ResponseMetadata.RequestId, Equals, "bd10b26c-e30e-11e0-ba29-93c3aca2f103")
c.Assert(err, IsNil)
}
@@ -54,6 +55,7 @@ func (s *S) TestCreateTopic(c *C) {
c.Assert(req.URL.Path, Equals, "/")
c.Assert(req.Header["Date"], Not(Equals), "")
+ c.Assert(resp.Topic.SNS, Equals, s.sns)
c.Assert(resp.Topic.TopicArn, Equals, "arn:aws:sns:us-east-1:123456789012:My-Topic")
c.Assert(resp.ResponseMetadata.RequestId, Equals, "a8dec8b3-33a4-11df-8963-01868b7c937a")
c.Assert(err, IsNil)
@@ -62,8 +64,8 @@ func (s *S) TestCreateTopic(c *C) {
func (s *S) TestDeleteTopic(c *C) {
testServer.Response(200, nil, TestDeleteTopicXmlOK)
- t := sns.Topic{nil, "arn:aws:sns:us-east-1:123456789012:My-Topic"}
- resp, err := s.sns.DeleteTopic(t)
+ t := sns.Topic{s.sns, "arn:aws:sns:us-east-1:123456789012:My-Topic"}
+ resp, err := t.Delete()
req := testServer.WaitRequest()
c.Assert(req.Method, Equals, "GET")
@@ -115,7 +117,14 @@ func (s *S) TestGetTopicAttributes(c *C) {
func (s *S) TestPublish(c *C) {
testServer.Response(200, nil, TestPublishXmlOK)
- pubOpt := &sns.PublishOpt{"foobar", "", "subject", "arn:aws:sns:us-east-1:123456789012:My-Topic"}
+ pubOpt := &sns.PublishOpt{
+ Message: "foobar",
+ MessageStructure: "",
+ Subject: "subject",
+ TopicArn: "arn:aws:sns:us-east-1:123456789012:My-Topic",
+ TargetArn: "arn:aws:sns:us-east-1:123456789012:My-Other-Topic",
+ }
+
resp, err := s.sns.Publish(pubOpt)
req := testServer.WaitRequest()
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/exp/sns/subscription.go b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/exp/sns/subscription.go
new file mode 100644
index 00000000..6110bb85
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/exp/sns/subscription.go
@@ -0,0 +1,161 @@
+package sns
+
+type Subscription struct {
+ Endpoint string
+ Owner string
+ Protocol string
+ SubscriptionArn string
+ TopicArn string
+}
+
+type ListSubscriptionsResp struct {
+ Subscriptions []Subscription `xml:"ListSubscriptionsResult>Subscriptions>member"`
+ NextToken string
+ ResponseMetadata
+}
+
+type PublishOpt struct {
+ Message string
+ MessageStructure string
+ Subject string
+ TopicArn string
+ TargetArn string
+}
+
+type PublishResp struct {
+ MessageId string `xml:"PublishResult>MessageId"`
+ ResponseMetadata
+}
+
+type SubscribeResponse struct {
+ SubscriptionArn string `xml:"SubscribeResult>SubscriptionArn"`
+ ResponseMetadata
+}
+
+type UnsubscribeResponse struct {
+ ResponseMetadata
+}
+
+type ConfirmSubscriptionResponse struct {
+ SubscriptionArn string `xml:"ConfirmSubscriptionResult>SubscriptionArn"`
+ ResponseMetadata
+}
+
+type ConfirmSubscriptionOpt struct {
+ AuthenticateOnUnsubscribe string
+ Token string
+ TopicArn string
+}
+
+type ListSubscriptionByTopicResponse struct {
+ Subscriptions []Subscription `xml:"ListSubscriptionsByTopicResult>Subscriptions>member"`
+ ResponseMetadata
+}
+
+type ListSubscriptionByTopicOpt struct {
+ NextToken string
+ TopicArn string
+}
+
+// Publish
+//
+// See http://goo.gl/AY2D8 for more details.
+func (sns *SNS) Publish(options *PublishOpt) (resp *PublishResp, err error) {
+ resp = &PublishResp{}
+ params := makeParams("Publish")
+
+ if options.Subject != "" {
+ params["Subject"] = options.Subject
+ }
+
+ if options.MessageStructure != "" {
+ params["MessageStructure"] = options.MessageStructure
+ }
+
+ if options.Message != "" {
+ params["Message"] = options.Message
+ }
+
+ if options.TopicArn != "" {
+ params["TopicArn"] = options.TopicArn
+ }
+
+ err = sns.query(params, resp)
+ return
+}
+
+// Subscribe
+//
+// See http://goo.gl/c3iGS for more details.
+func (sns *SNS) Subscribe(Endpoint, Protocol, TopicArn string) (resp *SubscribeResponse, err error) {
+ resp = &SubscribeResponse{}
+ params := makeParams("Subscribe")
+
+ params["Endpoint"] = Endpoint
+ params["Protocol"] = Protocol
+ params["TopicArn"] = TopicArn
+
+ err = sns.query(params, resp)
+ return
+}
+
+// Unsubscribe
+//
+// See http://goo.gl/4l5Ge for more details.
+func (sns *SNS) Unsubscribe(SubscriptionArn string) (resp *UnsubscribeResponse, err error) {
+ resp = &UnsubscribeResponse{}
+ params := makeParams("Unsubscribe")
+
+ params["SubscriptionArn"] = SubscriptionArn
+
+ err = sns.query(params, resp)
+ return
+}
+
+// ConfirmSubscription
+//
+// See http://goo.gl/3hXzH for more details.
+func (sns *SNS) ConfirmSubscription(options *ConfirmSubscriptionOpt) (resp *ConfirmSubscriptionResponse, err error) {
+ resp = &ConfirmSubscriptionResponse{}
+ params := makeParams("ConfirmSubscription")
+
+ if options.AuthenticateOnUnsubscribe != "" {
+ params["AuthenticateOnUnsubscribe"] = options.AuthenticateOnUnsubscribe
+ }
+
+ params["Token"] = options.Token
+ params["TopicArn"] = options.TopicArn
+
+ err = sns.query(params, resp)
+ return
+}
+
+// ListSubscriptions
+//
+// See http://goo.gl/k3aGn for more details.
+func (sns *SNS) ListSubscriptions(NextToken *string) (resp *ListSubscriptionsResp, err error) {
+ resp = &ListSubscriptionsResp{}
+ params := makeParams("ListSubscriptions")
+ if NextToken != nil {
+ params["NextToken"] = *NextToken
+ }
+ err = sns.query(params, resp)
+ return
+}
+
+// ListSubscriptionByTopic
+//
+// See http://goo.gl/LaVcC for more details.
+func (sns *SNS) ListSubscriptionByTopic(options *ListSubscriptionByTopicOpt) (resp *ListSubscriptionByTopicResponse, err error) {
+ resp = &ListSubscriptionByTopicResponse{}
+ params := makeParams("ListSbubscriptionByTopic")
+
+ if options.NextToken != "" {
+ params["NextToken"] = options.NextToken
+ }
+
+ params["TopicArn"] = options.TopicArn
+
+ err = sns.query(params, resp)
+ return
+}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/exp/sns/topic.go b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/exp/sns/topic.go
new file mode 100644
index 00000000..4d82cbfb
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/exp/sns/topic.go
@@ -0,0 +1,103 @@
+package sns
+
+import (
+ "errors"
+)
+
+type Topic struct {
+ SNS *SNS
+ TopicArn string
+}
+
+type ListTopicsResp struct {
+ Topics []Topic `xml:"ListTopicsResult>Topics>member"`
+ NextToken string
+ ResponseMetadata
+}
+
+type CreateTopicResp struct {
+ Topic Topic `xml:"CreateTopicResult"`
+ ResponseMetadata
+}
+
+type DeleteTopicResp struct {
+ ResponseMetadata
+}
+
+type GetTopicAttributesResp struct {
+ Attributes []AttributeEntry `xml:"GetTopicAttributesResult>Attributes>entry"`
+ ResponseMetadata
+}
+
+type SetTopicAttributesResponse struct {
+ ResponseMetadata
+}
+
+// ListTopics
+//
+// See http://goo.gl/lfrMK for more details.
+func (sns *SNS) ListTopics(NextToken *string) (resp *ListTopicsResp, err error) {
+ resp = &ListTopicsResp{}
+ params := makeParams("ListTopics")
+ if NextToken != nil {
+ params["NextToken"] = *NextToken
+ }
+ err = sns.query(params, resp)
+ for i, _ := range resp.Topics {
+ resp.Topics[i].SNS = sns
+ }
+ return
+}
+
+// CreateTopic
+//
+// See http://goo.gl/m9aAt for more details.
+func (sns *SNS) CreateTopic(Name string) (resp *CreateTopicResp, err error) {
+ resp = &CreateTopicResp{}
+ params := makeParams("CreateTopic")
+ params["Name"] = Name
+ err = sns.query(params, resp)
+ resp.Topic.SNS = sns
+ return
+}
+
+// Delete
+//
+// Helper function for deleting a topic
+func (topic *Topic) Delete() (resp *DeleteTopicResp, err error) {
+ resp = &DeleteTopicResp{}
+ params := makeParams("DeleteTopic")
+ params["TopicArn"] = topic.TopicArn
+ err = topic.SNS.query(params, resp)
+ return
+}
+
+// GetTopicAttributes
+//
+// See http://goo.gl/WXRoX for more details.
+func (sns *SNS) GetTopicAttributes(TopicArn string) (resp *GetTopicAttributesResp, err error) {
+ resp = &GetTopicAttributesResp{}
+ params := makeParams("GetTopicAttributes")
+ params["TopicArn"] = TopicArn
+ err = sns.query(params, resp)
+ return
+}
+
+// SetTopicAttributes
+//
+// See http://goo.gl/oVYW7 for more details.
+func (sns *SNS) SetTopicAttributes(AttributeName, AttributeValue, TopicArn string) (resp *SetTopicAttributesResponse, err error) {
+ resp = &SetTopicAttributesResponse{}
+ params := makeParams("SetTopicAttributes")
+
+ if AttributeName == "" || TopicArn == "" {
+ return nil, errors.New("Invalid Attribute Name or TopicArn")
+ }
+
+ params["AttributeName"] = AttributeName
+ params["AttributeValue"] = AttributeValue
+ params["TopicArn"] = TopicArn
+
+ err = sns.query(params, resp)
+ return
+}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/rds/rds.go b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/rds/rds.go
index 05933227..e2dbb72b 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/rds/rds.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/rds/rds.go
@@ -90,23 +90,24 @@ func makeParams(action string) map[string]string {
// Rds objects
type DBInstance struct {
- Address string `xml:"Endpoint>Address"`
- AllocatedStorage int `xml:"AllocatedStorage"`
- AvailabilityZone string `xml:"AvailabilityZone"`
- BackupRetentionPeriod int `xml:"BackupRetentionPeriod"`
- DBInstanceClass string `xml:"DBInstanceClass"`
- DBInstanceIdentifier string `xml:"DBInstanceIdentifier"`
- DBInstanceStatus string `xml:"DBInstanceStatus"`
- DBName string `xml:"DBName"`
- Engine string `xml:"Engine"`
- EngineVersion string `xml:"EngineVersion"`
- MasterUsername string `xml:"MasterUsername"`
- MultiAZ bool `xml:"MultiAZ"`
- Port int `xml:"Endpoint>Port"`
- PreferredBackupWindow string `xml:"PreferredBackupWindow"`
- PreferredMaintenanceWindow string `xml:"PreferredMaintenanceWindow"`
- VpcSecurityGroupIds []string `xml:"VpcSecurityGroups"`
- DBSecurityGroupNames []string `xml:"DBSecurityGroups>DBSecurityGroup>DBSecurityGroupName"`
+ Address string `xml:"Endpoint>Address"`
+ AllocatedStorage int `xml:"AllocatedStorage"`
+ AvailabilityZone string `xml:"AvailabilityZone"`
+ BackupRetentionPeriod int `xml:"BackupRetentionPeriod"`
+ DBInstanceClass string `xml:"DBInstanceClass"`
+ DBInstanceIdentifier string `xml:"DBInstanceIdentifier"`
+ DBInstanceStatus string `xml:"DBInstanceStatus"`
+ DBName string `xml:"DBName"`
+ Engine string `xml:"Engine"`
+ EngineVersion string `xml:"EngineVersion"`
+ MasterUsername string `xml:"MasterUsername"`
+ MultiAZ bool `xml:"MultiAZ"`
+ Port int `xml:"Endpoint>Port"`
+ PreferredBackupWindow string `xml:"PreferredBackupWindow"`
+ PreferredMaintenanceWindow string `xml:"PreferredMaintenanceWindow"`
+ VpcSecurityGroupIds []string `xml:"VpcSecurityGroups"`
+ DBSecurityGroupNames []string `xml:"DBSecurityGroups>DBSecurityGroup>DBSecurityGroupName"`
+ DBSubnetGroup DBSubnetGroup `xml:"DBSubnetGroup"`
}
type DBSecurityGroup struct {
@@ -119,6 +120,35 @@ type DBSecurityGroup struct {
CidrStatuses []string `xml:"IPRanges>IPRange>Status"`
}
+type DBSubnetGroup struct {
+ Description string `xml:"DBSubnetGroupDescription"`
+ Name string `xml:"DBSubnetGroupName"`
+ Status string `xml:"SubnetGroupStatus"`
+ SubnetIds []string `xml:"Subnets>Subnet>SubnetIdentifier"`
+ VpcId string `xml:"VpcId"`
+}
+
+type DBSnapshot struct {
+ AllocatedStorage int `xml:"AllocatedStorage"`
+ AvailabilityZone string `xml:"AvailabilityZone"`
+ DBInstanceIdentifier string `xml:"DBInstanceIdentifier"`
+ DBSnapshotIdentifier string `xml:"DBSnapshotIdentifier"`
+ Engine string `xml:"Engine"`
+ EngineVersion string `xml:"EngineVersion"`
+ InstanceCreateTime string `xml:"InstanceCreateTime"`
+ Iops int `xml:"Iops"`
+ LicenseModel string `xml:"LicenseModel"`
+ MasterUsername string `xml:"MasterUsername"`
+ OptionGroupName string `xml:"OptionGroupName"`
+ PercentProgress int `xml:"PercentProgress"`
+ Port int `xml:"Port"`
+ SnapshotCreateTime string `xml:"SnapshotCreateTime"`
+ SnapshotType string `xml:"SnapshotType"`
+ SourceRegion string `xml:"SourceRegion"`
+ Status string `xml:"Status"`
+ VpcId string `xml:"VpcId"`
+}
+
// ----------------------------------------------------------------------------
// Create
@@ -194,7 +224,7 @@ func (rds *Rds) CreateDBInstance(options *CreateDBInstance) (resp *SimpleResp, e
}
if options.EngineVersion != "" {
- params["Engine"] = options.EngineVersion
+ params["EngineVersion"] = options.EngineVersion
}
if options.MasterUsername != "" {
@@ -263,6 +293,34 @@ func (rds *Rds) CreateDBSecurityGroup(options *CreateDBSecurityGroup) (resp *Sim
return
}
+// The CreateDBSubnetGroup request parameters
+type CreateDBSubnetGroup struct {
+ DBSubnetGroupName string
+ DBSubnetGroupDescription string
+ SubnetIds []string
+}
+
+func (rds *Rds) CreateDBSubnetGroup(options *CreateDBSubnetGroup) (resp *SimpleResp, err error) {
+ params := makeParams("CreateDBSubnetGroup")
+
+ params["DBSubnetGroupName"] = options.DBSubnetGroupName
+ params["DBSubnetGroupDescription"] = options.DBSubnetGroupDescription
+
+ for j, group := range options.SubnetIds {
+ params["SubnetIds.member."+strconv.Itoa(j+1)] = group
+ }
+
+ resp = &SimpleResp{}
+
+ err = rds.query(params, resp)
+
+ if err != nil {
+ resp = nil
+ }
+
+ return
+}
+
// The CreateDBSecurityGroup request parameters
type AuthorizeDBSecurityGroupIngress struct {
Cidr string
@@ -358,10 +416,75 @@ func (rds *Rds) DescribeDBSecurityGroups(options *DescribeDBSecurityGroups) (res
return
}
+// DescribeDBSubnetGroups request params
+type DescribeDBSubnetGroups struct {
+ DBSubnetGroupName string
+}
+
+type DescribeDBSubnetGroupsResp struct {
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+ DBSubnetGroups []DBSubnetGroup `xml:"DescribeDBSubnetGroupsResult>DBSubnetGroups>DBSubnetGroup"`
+}
+
+func (rds *Rds) DescribeDBSubnetGroups(options *DescribeDBSubnetGroups) (resp *DescribeDBSubnetGroupsResp, err error) {
+ params := makeParams("DescribeDBSubnetGroups")
+
+ params["DBSubnetGroupName"] = options.DBSubnetGroupName
+
+ resp = &DescribeDBSubnetGroupsResp{}
+
+ err = rds.query(params, resp)
+
+ if err != nil {
+ resp = nil
+ }
+
+ return
+}
+
+// DescribeDBSnapshots request params
+type DescribeDBSnapshots struct {
+ DBInstanceIdentifier string
+ DBSnapshotIdentifier string
+ SnapshotType string
+}
+
+type DescribeDBSnapshotsResp struct {
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+ DBSnapshots []DBSnapshot `xml:"DescribeDBSnapshotsResult>DBSnapshots>DBSnapshot"`
+}
+
+func (rds *Rds) DescribeDBSnapshots(options *DescribeDBSnapshots) (resp *DescribeDBSnapshotsResp, err error) {
+ params := makeParams("DescribeDBSnapshots")
+
+ if options.DBInstanceIdentifier != "" {
+ params["DBInstanceIdentifier"] = options.DBInstanceIdentifier
+ }
+
+ if options.DBSnapshotIdentifier != "" {
+ params["DBSnapshotIdentifier"] = options.DBSnapshotIdentifier
+ }
+
+ if options.SnapshotType != "" {
+ params["SnapshotType"] = options.SnapshotType
+ }
+
+ resp = &DescribeDBSnapshotsResp{}
+
+ err = rds.query(params, resp)
+
+ if err != nil {
+ resp = nil
+ }
+
+ return
+}
+
// DeleteDBInstance request params
type DeleteDBInstance struct {
- DBInstanceIdentifier string
- SkipFinalSnapshot bool
+ FinalDBSnapshotIdentifier string
+ DBInstanceIdentifier string
+ SkipFinalSnapshot bool
}
func (rds *Rds) DeleteDBInstance(options *DeleteDBInstance) (resp *SimpleResp, err error) {
@@ -369,8 +492,12 @@ func (rds *Rds) DeleteDBInstance(options *DeleteDBInstance) (resp *SimpleResp, e
params["DBInstanceIdentifier"] = options.DBInstanceIdentifier
+ // If we don't skip the final snapshot, we need to specify a final
+ // snapshot identifier
if options.SkipFinalSnapshot {
params["SkipFinalSnapshot"] = "true"
+ } else {
+ params["FinalDBSnapshotIdentifier"] = options.FinalDBSnapshotIdentifier
}
resp = &SimpleResp{}
@@ -405,6 +532,112 @@ func (rds *Rds) DeleteDBSecurityGroup(options *DeleteDBSecurityGroup) (resp *Sim
return
}
+// DeleteDBSubnetGroup request params
+type DeleteDBSubnetGroup struct {
+ DBSubnetGroupName string
+}
+
+func (rds *Rds) DeleteDBSubnetGroup(options *DeleteDBSubnetGroup) (resp *SimpleResp, err error) {
+ params := makeParams("DeleteDBSubnetGroup")
+
+ params["DBSubnetGroupName"] = options.DBSubnetGroupName
+
+ resp = &SimpleResp{}
+
+ err = rds.query(params, resp)
+
+ if err != nil {
+ resp = nil
+ }
+
+ return
+}
+
+type RestoreDBInstanceFromDBSnapshot struct {
+ DBInstanceIdentifier string
+ DBSnapshotIdentifier string
+ AutoMinorVersionUpgrade bool
+ AvailabilityZone string
+ DBInstanceClass string
+ DBName string
+ DBSubnetGroupName string
+ Engine string
+ Iops int
+ LicenseModel string
+ MultiAZ bool
+ OptionGroupName string
+ Port int
+ PubliclyAccessible bool
+
+ SetIops bool
+ SetPort bool
+}
+
+func (rds *Rds) RestoreDBInstanceFromDBSnapshot(options *RestoreDBInstanceFromDBSnapshot) (resp *SimpleResp, err error) {
+ params := makeParams("RestoreDBInstanceFromDBSnapshot")
+
+ params["DBInstanceIdentifier"] = options.DBInstanceIdentifier
+ params["DBSnapshotIdentifier"] = options.DBSnapshotIdentifier
+
+ if options.AutoMinorVersionUpgrade {
+ params["AutoMinorVersionUpgrade"] = "true"
+ }
+
+ if options.AvailabilityZone != "" {
+ params["AvailabilityZone"] = options.AvailabilityZone
+ }
+
+ if options.DBInstanceClass != "" {
+ params["DBInstanceClass"] = options.DBInstanceClass
+ }
+
+ if options.DBName != "" {
+ params["DBName"] = options.DBName
+ }
+
+ if options.DBSubnetGroupName != "" {
+ params["DBSubnetGroupName"] = options.DBSubnetGroupName
+ }
+
+ if options.Engine != "" {
+ params["Engine"] = options.Engine
+ }
+
+ if options.SetIops {
+ params["Iops"] = strconv.Itoa(options.Iops)
+ }
+
+ if options.LicenseModel != "" {
+ params["LicenseModel"] = options.LicenseModel
+ }
+
+ if options.MultiAZ {
+ params["MultiAZ"] = "true"
+ }
+
+ if options.OptionGroupName != "" {
+ params["OptionGroupName"] = options.OptionGroupName
+ }
+
+ if options.SetPort {
+ params["Port"] = strconv.Itoa(options.Port)
+ }
+
+ if options.PubliclyAccessible {
+ params["PubliclyAccessible"] = "true"
+ }
+
+ resp = &SimpleResp{}
+
+ err = rds.query(params, resp)
+
+ if err != nil {
+ resp = nil
+ }
+
+ return
+}
+
// Responses
type SimpleResp struct {
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/rds/rds_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/rds/rds_test.go
index 2ea4e06c..0ccadb7c 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/rds/rds_test.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/rds/rds_test.go
@@ -80,6 +80,27 @@ func (s *S) Test_CreateDBSecurityGroup(c *C) {
c.Assert(resp.RequestId, Equals, "e68ef6fa-afc1-11c3-845a-476777009d19")
}
+func (s *S) Test_CreateDBSubnetGroup(c *C) {
+ testServer.Response(200, nil, CreateDBSubnetGroupExample)
+
+ options := rds.CreateDBSubnetGroup{
+ DBSubnetGroupName: "foobarbaz",
+ DBSubnetGroupDescription: "test description",
+ SubnetIds: []string{"subnet-e4d398a1", "subnet-c2bdb6ba"},
+ }
+
+ resp, err := s.rds.CreateDBSubnetGroup(&options)
+ req := testServer.WaitRequest()
+
+ c.Assert(req.Form["Action"], DeepEquals, []string{"CreateDBSubnetGroup"})
+ c.Assert(req.Form["DBSubnetGroupName"], DeepEquals, []string{"foobarbaz"})
+ c.Assert(req.Form["DBSubnetGroupDescription"], DeepEquals, []string{"test description"})
+ c.Assert(req.Form["SubnetIds.member.1"], DeepEquals, []string{"subnet-e4d398a1"})
+ c.Assert(req.Form["SubnetIds.member.2"], DeepEquals, []string{"subnet-c2bdb6ba"})
+ c.Assert(err, IsNil)
+ c.Assert(resp.RequestId, Equals, "3a401b3f-bb9e-11d3-f4c6-37db295f7674")
+}
+
func (s *S) Test_DescribeDBInstances(c *C) {
testServer.Response(200, nil, DescribeDBInstancesExample)
@@ -119,6 +140,25 @@ func (s *S) Test_DescribeDBSecurityGroups(c *C) {
c.Assert(resp.DBSecurityGroups[0].CidrStatuses, DeepEquals, []string{"authorized", "authorized", "authorized", "authorized"})
}
+func (s *S) Test_DescribeDBSubnetGroups(c *C) {
+ testServer.Response(200, nil, DescribeDBSubnetGroupsExample)
+
+ options := rds.DescribeDBSubnetGroups{
+ DBSubnetGroupName: "foobarbaz",
+ }
+
+ resp, err := s.rds.DescribeDBSubnetGroups(&options)
+ req := testServer.WaitRequest()
+
+ c.Assert(req.Form["Action"], DeepEquals, []string{"DescribeDBSubnetGroups"})
+ c.Assert(req.Form["DBSubnetGroupName"], DeepEquals, []string{"foobarbaz"})
+ c.Assert(err, IsNil)
+ c.Assert(resp.RequestId, Equals, "b783db3b-b98c-11d3-fbc7-5c0aad74da7c")
+ c.Assert(resp.DBSubnetGroups[0].Status, DeepEquals, "Complete")
+ c.Assert(resp.DBSubnetGroups[0].SubnetIds, DeepEquals, []string{"subnet-e8b3e5b1", "subnet-44b2f22e"})
+ c.Assert(resp.DBSubnetGroups[0].VpcId, DeepEquals, "vpc-e7abbdce")
+}
+
func (s *S) Test_DeleteDBInstance(c *C) {
testServer.Response(200, nil, DeleteDBInstanceExample)
@@ -137,6 +177,26 @@ func (s *S) Test_DeleteDBInstance(c *C) {
c.Assert(resp.RequestId, Equals, "7369556f-b70d-11c3-faca-6ba18376ea1b")
}
+func (s *S) Test_DeleteDBInstance_SnapshotIdentifier(c *C) {
+ testServer.Response(200, nil, DeleteDBInstanceExample)
+
+ options := rds.DeleteDBInstance{
+ DBInstanceIdentifier: "foobarbaz",
+ SkipFinalSnapshot: false,
+ FinalDBSnapshotIdentifier: "bar",
+ }
+
+ resp, err := s.rds.DeleteDBInstance(&options)
+ req := testServer.WaitRequest()
+
+ c.Assert(req.Form["Action"], DeepEquals, []string{"DeleteDBInstance"})
+ c.Assert(req.Form["DBInstanceIdentifier"], DeepEquals, []string{"foobarbaz"})
+ c.Assert(req.Form["FinalDBSnapshotIdentifier"], DeepEquals, []string{"bar"})
+ c.Assert(req.Form["SkipFinalSnapshot"], IsNil)
+ c.Assert(err, IsNil)
+ c.Assert(resp.RequestId, Equals, "7369556f-b70d-11c3-faca-6ba18376ea1b")
+}
+
func (s *S) Test_DeleteDBSecurityGroup(c *C) {
testServer.Response(200, nil, DeleteDBSecurityGroupExample)
@@ -153,6 +213,22 @@ func (s *S) Test_DeleteDBSecurityGroup(c *C) {
c.Assert(resp.RequestId, Equals, "7aec7454-ba25-11d3-855b-576787000e19")
}
+func (s *S) Test_DeleteDBSubnetGroup(c *C) {
+ testServer.Response(200, nil, DeleteDBSubnetGroupExample)
+
+ options := rds.DeleteDBSubnetGroup{
+ DBSubnetGroupName: "foobarbaz",
+ }
+
+ resp, err := s.rds.DeleteDBSubnetGroup(&options)
+ req := testServer.WaitRequest()
+
+ c.Assert(req.Form["Action"], DeepEquals, []string{"DeleteDBSubnetGroup"})
+ c.Assert(req.Form["DBSubnetGroupName"], DeepEquals, []string{"foobarbaz"})
+ c.Assert(err, IsNil)
+ c.Assert(resp.RequestId, Equals, "6295e5ab-bbf3-11d3-f4c6-37db295f7674")
+}
+
func (s *S) Test_AuthorizeDBSecurityGroupIngress(c *C) {
testServer.Response(200, nil, AuthorizeDBSecurityGroupIngressExample)
@@ -170,3 +246,44 @@ func (s *S) Test_AuthorizeDBSecurityGroupIngress(c *C) {
c.Assert(err, IsNil)
c.Assert(resp.RequestId, Equals, "6176b5f8-bfed-11d3-f92b-31fa5e8dbc99")
}
+
+func (s *S) Test_DescribeDBSnapshots(c *C) {
+ testServer.Response(200, nil, DescribeDBSnapshotsExample)
+
+ options := rds.DescribeDBSnapshots{
+ DBInstanceIdentifier: "foobar",
+ DBSnapshotIdentifier: "baz",
+ SnapshotType: "manual",
+ }
+
+ resp, err := s.rds.DescribeDBSnapshots(&options)
+ req := testServer.WaitRequest()
+
+ c.Assert(req.Form["Action"], DeepEquals, []string{"DescribeDBSnapshots"})
+ c.Assert(req.Form["DBInstanceIdentifier"], DeepEquals, []string{"foobar"})
+ c.Assert(req.Form["DBSnapshotIdentifier"], DeepEquals, []string{"baz"})
+ c.Assert(req.Form["SnapshotType"], DeepEquals, []string{"manual"})
+ c.Assert(err, IsNil)
+ c.Assert(resp.RequestId, Equals, "b7769930-b98c-11d3-f272-7cd6cce12cc5")
+ c.Assert(resp.DBSnapshots[0].OptionGroupName, Equals, "default:mysql-5-6")
+ c.Assert(resp.DBSnapshots[0].Engine, Equals, "mysql")
+ c.Assert(resp.DBSnapshots[0].SnapshotType, Equals, "manual")
+}
+
+func (s *S) Test_RestoreDBInstanceFromDBSnapshot(c *C) {
+ testServer.Response(200, nil, RestoreDBInstanceFromDBSnapshotExample)
+
+ options := rds.RestoreDBInstanceFromDBSnapshot{
+ DBInstanceIdentifier: "foo",
+ DBSnapshotIdentifier: "bar",
+ }
+
+ resp, err := s.rds.RestoreDBInstanceFromDBSnapshot(&options)
+ req := testServer.WaitRequest()
+
+ c.Assert(req.Form["Action"], DeepEquals, []string{"RestoreDBInstanceFromDBSnapshot"})
+ c.Assert(req.Form["DBInstanceIdentifier"], DeepEquals, []string{"foo"})
+ c.Assert(req.Form["DBSnapshotIdentifier"], DeepEquals, []string{"bar"})
+ c.Assert(err, IsNil)
+ c.Assert(resp.RequestId, Equals, "863fd73e-be2b-11d3-855b-576787000e19")
+}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/rds/responses_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/rds/responses_test.go
index 418fc6c2..39a1e771 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/rds/responses_test.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/rds/responses_test.go
@@ -327,3 +327,224 @@ var AuthorizeDBSecurityGroupIngressExample = `
`
+
+var DescribeDBSubnetGroupsExample = `
+
+
+
+
+ vpc-e7abbdce
+ Complete
+ DB subnet group 1
+ mydbsubnetgroup1
+
+
+ Active
+ subnet-e8b3e5b1
+
+ us-west-2a
+ false
+
+
+
+ Active
+ subnet-44b2f22e
+
+ us-west-2b
+ false
+
+
+
+
+
+ vpc-c1e17bb8
+ Complete
+ My DB Subnet Group 2
+ sub-grp-2
+
+
+ Active
+ subnet-d281ef8a
+
+ us-west-2a
+ false
+
+
+
+ Active
+ subnet-b381ef9f
+
+ us-west-2c
+ false
+
+
+
+ Active
+ subnet-e1e17ebd
+
+ us-west-2b
+ false
+
+
+
+
+
+
+
+ b783db3b-b98c-11d3-fbc7-5c0aad74da7c
+
+
+`
+
+var DeleteDBSubnetGroupExample = `
+
+
+ 6295e5ab-bbf3-11d3-f4c6-37db295f7674
+
+
+`
+
+var CreateDBSubnetGroupExample = `
+
+
+
+ vpc-33dc97ea
+ Complete
+ My new DB Subnet Group
+ myawsuser-dbsubnetgroup
+
+
+ Active
+ subnet-e4d398a1
+
+ us-east-1b
+ false
+
+
+
+ Active
+ subnet-c2bdb6ba
+
+ us-east-1c
+ false
+
+
+
+
+
+
+ 3a401b3f-bb9e-11d3-f4c6-37db295f7674
+
+
+`
+
+var DescribeDBSnapshotsExample = `
+
+
+
+
+ 3306
+ default:mysql-5-6
+ mysql
+ available
+ manual
+ general-public-license
+ 5.6.13
+ my-mysqlexampledb
+ my-test-restore-snapshot
+ 2014-03-28T19:57:16.707Z
+ us-west-2b
+ 2014-01-29T22:58:24.231Z
+ 100
+ 5
+ awsmyuser
+
+
+ 3306
+ default:mysql-5-6
+ mysql
+ available
+ automated
+ general-public-license
+ 5.6.13
+ my-mysqlexampledb
+ rds:my-mysqlexampledb-2014-04-19-10-08
+ 2014-04-19T10:09:09.790Z
+ us-west-2b
+ 2014-01-29T22:58:24.231Z
+ 100
+ 5
+ awsmyuser
+
+
+ 3306
+ default:mysql-5-6
+ mysql
+ available
+ automated
+ general-public-license
+ 5.6.13
+ my-mysqlexampledb
+ rds:my-mysqlexampledb-2014-04-20-10-09
+ 2014-04-20T10:09:15.446Z
+ us-west-2b
+ 2014-01-29T22:58:24.231Z
+ 100
+ 5
+ awsmyuser
+
+
+
+
+ b7769930-b98c-11d3-f272-7cd6cce12cc5
+
+
+`
+
+var RestoreDBInstanceFromDBSnapshotExample = `
+
+
+
+ 2
+ false
+ creating
+
+ mysqldb-restored
+ 08:14-08:44
+ fri:04:50-fri:05:20
+
+ mysql
+
+ general-public-license
+ 5.6.13
+
+
+ in-sync
+ default.mysql5.6
+
+
+
+
+ default:mysql-5-6
+ pending-apply
+
+
+ true
+
+
+ active
+ default
+
+
+ mysqldb
+ true
+ 100
+ myawsuser
+ db.m1.medium
+
+
+
+ 863fd73e-be2b-11d3-855b-576787000e19
+
+
+`
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/route53/responses_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/route53/responses_test.go
index e14c6f0a..0844b462 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/route53/responses_test.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/route53/responses_test.go
@@ -94,3 +94,29 @@ var ListResourceRecordSetsExample = `
testdoc2.example.com
NS
`
+
+var ListHostedZonesExample = `
+
+
+
+ /hostedzone/Z2K123214213123
+ example.com.
+ D2224C5B-684A-DB4A-BB9A-E09E3BAFEA7A
+
+ Test comment
+
+ 10
+
+
+ /hostedzone/ZLT12321321124
+ sub.example.com.
+ A970F076-FCB1-D959-B395-96474CC84EB8
+
+ Test comment for subdomain host
+
+ 4
+
+
+ false
+ 100
+`
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/route53/route53.go b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/route53/route53.go
index 3300c249..a18788a9 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/route53/route53.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/route53/route53.go
@@ -95,6 +95,16 @@ func (r *Route53) query(method, path string, req, resp interface{}) error {
if err := enc.EncodeElement(req, start); err != nil {
return err
}
+
+ // This is really a sadness, but can't think of a better way to
+ // do this for now in Go's constructs.
+ replace := ""
+ if strings.Contains(bodyBuf.String(), replace) {
+ var newBuf bytes.Buffer
+ newBuf.WriteString(strings.Replace(bodyBuf.String(), replace, "", -1))
+ bodyBuf = &newBuf
+ }
+
body = bodyBuf
}
@@ -196,6 +206,33 @@ func (r *Route53) GetHostedZone(ID string) (*GetHostedZoneResponse, error) {
return out, err
}
+type ListHostedZonesResponse struct {
+ HostedZones []HostedZone `xml:"HostedZones>HostedZone"`
+ Marker string `xml:"Marker"`
+ IsTruncated bool `xml:"IsTruncated"`
+ NextMarker string `xml:"NextMarker"`
+ MaxItems int `xml:"MaxItems"`
+}
+
+func (r *Route53) ListHostedZones(marker string, maxItems int) (*ListHostedZonesResponse, error) {
+ values := url.Values{}
+
+ if marker != "" {
+ values.Add("marker", marker)
+ }
+
+ if maxItems != 0 {
+ values.Add("maxItems", strconv.Itoa(maxItems))
+ }
+
+ out := &ListHostedZonesResponse{}
+ err := r.query("GET", fmt.Sprintf("/%s/hostedzone/", APIVersion), values, out)
+ if err != nil {
+ return nil, err
+ }
+ return out, err
+}
+
type GetChangeResponse struct {
ChangeInfo ChangeInfo `xml:"ChangeInfo"`
}
@@ -232,10 +269,29 @@ type ChangeResourceRecordSetsResponse struct {
func (r *Route53) ChangeResourceRecordSets(zone string,
req *ChangeResourceRecordSetsRequest) (*ChangeResourceRecordSetsResponse, error) {
+ // This is really sad, but we have to format this differently
+ // for Route53 to make them happy.
+ reqCopy := *req
+ for i, change := range reqCopy.Changes {
+ if len(change.Record.Records) > 1 {
+ var buf bytes.Buffer
+ for _, r := range change.Record.Records {
+ buf.WriteString(fmt.Sprintf(
+ "%s",
+ r))
+ }
+
+ change.Record.Records = nil
+ change.Record.RecordsXML = fmt.Sprintf(
+ "%s", buf.String())
+ reqCopy.Changes[i] = change
+ }
+ }
+
zone = CleanZoneID(zone)
out := &ChangeResourceRecordSetsResponse{}
if err := r.query("POST", fmt.Sprintf("/%s/hostedzone/%s/rrset", APIVersion,
- zone), req, out); err != nil {
+ zone), reqCopy, out); err != nil {
return nil, err
}
return out, nil
@@ -261,13 +317,15 @@ type ResourceRecordSet struct {
Name string `xml:"Name"`
Type string `xml:"Type"`
TTL int `xml:"TTL"`
- Records []string `xml:"ResourceRecords>ResourceRecord>Value"`
+ Records []string `xml:"ResourceRecords>ResourceRecord>Value,omitempty"`
SetIdentifier string `xml:"SetIdentifier,omitempty"`
Weight int `xml:"Weight,omitempty"`
HealthCheckId string `xml:"HealthCheckId,omitempty"`
Region string `xml:"Region,omitempty"`
Failover string `xml:"Failover,omitempty"`
AliasTarget *AliasTarget `xml:"AliasTarget,omitempty"`
+
+ RecordsXML string `xml:",innerxml"`
}
func (r *Route53) ListResourceRecordSets(zone string, lopts *ListOpts) (*ListResourceRecordSetsResponse, error) {
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/route53/route53_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/route53/route53_test.go
index 90316903..092c8174 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/route53/route53_test.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/route53/route53_test.go
@@ -157,6 +157,25 @@ func TestListResourceRecordSets(t *testing.T) {
}
}
+func TestListHostedZones(t *testing.T) {
+ testServer := makeTestServer()
+ client := makeClient(testServer)
+ testServer.Response(200, nil, ListHostedZonesExample)
+
+ resp, err := client.ListHostedZones("", 0)
+ if err != nil {
+ t.Fatalf("err: %v", err)
+ }
+
+ if resp.HostedZones[0].Name != "example.com." {
+ t.Fatalf("bad: %v", resp)
+ }
+
+ if resp.HostedZones[1].Name != "sub.example.com." {
+ t.Fatalf("bad: %v", resp)
+ }
+}
+
func decode(t *testing.T, r io.Reader, out interface{}) {
var buf1 bytes.Buffer
var buf2 bytes.Buffer
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/s3/s3.go b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/s3/s3.go
index 989d6783..d05731be 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/s3/s3.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/s3/s3.go
@@ -619,7 +619,7 @@ type request struct {
// amazonShouldEscape returns true if byte should be escaped
func amazonShouldEscape(c byte) bool {
return !((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') ||
- (c >= '0' && c <= '9') || c == '_' || c == '-' || c == '~' || c == '.' || c == '/')
+ (c >= '0' && c <= '9') || c == '_' || c == '-' || c == '~' || c == '.' || c == '/' || c == ':')
}
// amazonEscape does uri escaping exactly as Amazon does
@@ -706,22 +706,6 @@ func (s3 *S3) prepare(req *request) error {
req.path = "/" + req.path
}
req.signpath = req.path
- // signpath includes subresource, if present: "?acl", "?delete", "?location", "?logging", or "?torrent"
- if req.params["acl"] != nil {
- req.signpath += "?acl"
- }
- if req.params["delete"] != nil {
- req.signpath += "?delete"
- }
- if req.params["location"] != nil {
- req.signpath += "?location"
- }
- if req.params["logging"] != nil {
- req.signpath += "?logging"
- }
- if req.params["torrent"] != nil {
- req.signpath += "?torrent"
- }
if req.bucket != "" {
req.baseurl = s3.Region.S3BucketEndpoint
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/s3/s3_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/s3/s3_test.go
index 12286a03..376c9470 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/s3/s3_test.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/s3/s3_test.go
@@ -427,3 +427,9 @@ func (s *S) TestGetKey(c *C) {
c.Assert(key.Size, Equals, int64(434234))
c.Assert(key.ETag, Equals, GetKeyHeaderDump["ETag"])
}
+
+func (s *S) TestUnescapedColon(c *C) {
+ b := s.s3.Bucket("bucket")
+ u := b.URL("foo:bar")
+ c.Assert(u, Equals, "http://localhost:4444/bucket/foo:bar")
+}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/s3/sign.go b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/s3/sign.go
index 8d2d7985..262503dc 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/s3/sign.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/s3/sign.go
@@ -4,10 +4,11 @@ import (
"crypto/hmac"
"crypto/sha1"
"encoding/base64"
- "github.com/mitchellh/goamz/aws"
"log"
"sort"
"strings"
+
+ "github.com/mitchellh/goamz/aws"
)
var b64 = base64.StdEncoding
@@ -17,6 +18,7 @@ var b64 = base64.StdEncoding
var s3ParamsToSign = map[string]bool{
"acl": true,
+ "delete": true,
"location": true,
"logging": true,
"notification": true,
@@ -47,6 +49,11 @@ func sign(auth aws.Auth, method, canonicalPath string, params, headers map[strin
headers["x-amz-security-token"] = []string{auth.Token}
}
+ if auth.SecretKey == "" {
+ // no auth secret; skip signing, e.g. for public read-only buckets.
+ return
+ }
+
for k, v := range headers {
k = strings.ToLower(k)
switch k {
@@ -111,6 +118,7 @@ func sign(auth aws.Auth, method, canonicalPath string, params, headers map[strin
} else {
headers["Authorization"] = []string{"AWS " + auth.AccessKey + ":" + string(signature)}
}
+
if debug {
log.Printf("Signature payload: %q", payload)
log.Printf("Signature: %q", signature)
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/s3/sign_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/s3/sign_test.go
index 9c19970d..9d9fe8d2 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/s3/sign_test.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/mitchellh/goamz/s3/sign_test.go
@@ -9,6 +9,7 @@ import (
// S3 ReST authentication docs: http://goo.gl/G1LrK
var testAuth = aws.Auth{"0PN5J17HBGZHT7JJ3X82", "uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o", ""}
+var emptyAuth = aws.Auth{"", "", ""}
func (s *S) TestSignExampleObjectGet(c *C) {
method := "GET"
@@ -22,6 +23,17 @@ func (s *S) TestSignExampleObjectGet(c *C) {
c.Assert(headers["Authorization"], DeepEquals, []string{expected})
}
+func (s *S) TestSignExampleObjectGetNoAuth(c *C) {
+ method := "GET"
+ path := "/johnsmith/photos/puppy.jpg"
+ headers := map[string][]string{
+ "Host": {"johnsmith.s3.amazonaws.com"},
+ "Date": {"Tue, 27 Mar 2007 19:36:42 +0000"},
+ }
+ s3.Sign(emptyAuth, method, path, nil, headers)
+ c.Assert(headers["Authorization"], IsNil)
+}
+
func (s *S) TestSignExampleObjectPut(c *C) {
method := "PUT"
path := "/johnsmith/photos/puppy.jpg"
@@ -54,6 +66,23 @@ func (s *S) TestSignExampleList(c *C) {
c.Assert(headers["Authorization"], DeepEquals, []string{expected})
}
+func (s *S) TestSignExampleListNoAuth(c *C) {
+ method := "GET"
+ path := "/johnsmith/"
+ params := map[string][]string{
+ "prefix": {"photos"},
+ "max-keys": {"50"},
+ "marker": {"puppy"},
+ }
+ headers := map[string][]string{
+ "Host": {"johnsmith.s3.amazonaws.com"},
+ "Date": {"Tue, 27 Mar 2007 19:42:41 +0000"},
+ "User-Agent": {"Mozilla/5.0"},
+ }
+ s3.Sign(emptyAuth, method, path, params, headers)
+ c.Assert(headers["Authorization"], IsNil)
+}
+
func (s *S) TestSignExampleFetch(c *C) {
method := "GET"
path := "/johnsmith/"
@@ -69,6 +98,20 @@ func (s *S) TestSignExampleFetch(c *C) {
c.Assert(headers["Authorization"], DeepEquals, []string{expected})
}
+func (s *S) TestSignExampleFetchNoAuth(c *C) {
+ method := "GET"
+ path := "/johnsmith/"
+ params := map[string][]string{
+ "acl": {""},
+ }
+ headers := map[string][]string{
+ "Host": {"johnsmith.s3.amazonaws.com"},
+ "Date": {"Tue, 27 Mar 2007 19:44:46 +0000"},
+ }
+ s3.Sign(emptyAuth, method, path, params, headers)
+ c.Assert(headers["Authorization"], IsNil)
+}
+
func (s *S) TestSignExampleDelete(c *C) {
method := "DELETE"
path := "/johnsmith/photos/puppy.jpg"
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/smira/flag/flag.go b/src/github.com/smira/aptly/_vendor/src/github.com/smira/flag/flag.go
index 92f4fa2d..04ec27e0 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/smira/flag/flag.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/smira/flag/flag.go
@@ -329,6 +329,17 @@ func Lookup(name string) *Flag {
return commandLine.formal[name]
}
+// IsSet checks whether flag has been actually set
+func (f *FlagSet) IsSet(name string) bool {
+ _, exists := f.actual[name]
+ return exists
+}
+
+// IsSet checks whether flag has been actually set on the command-lien
+func IsSet(name string) bool {
+ return commandLine.IsSet(name)
+}
+
// Set sets the value of the named flag.
func (f *FlagSet) Set(name, value string) error {
flag, ok := f.formal[name]
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/smira/go-ftp-protocol/.gitignore b/src/github.com/smira/aptly/_vendor/src/github.com/smira/go-ftp-protocol/.gitignore
new file mode 100644
index 00000000..83656241
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/smira/go-ftp-protocol/.gitignore
@@ -0,0 +1,23 @@
+# Compiled Object files, Static and Dynamic libs (Shared Objects)
+*.o
+*.a
+*.so
+
+# Folders
+_obj
+_test
+
+# Architecture specific extensions/prefixes
+*.[568vq]
+[568vq].out
+
+*.cgo1.go
+*.cgo2.c
+_cgo_defun.c
+_cgo_gotypes.go
+_cgo_export.*
+
+_testmain.go
+
+*.exe
+*.test
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/smira/go-ftp-protocol/LICENSE b/src/github.com/smira/aptly/_vendor/src/github.com/smira/go-ftp-protocol/LICENSE
new file mode 100644
index 00000000..1924f791
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/smira/go-ftp-protocol/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Andrey Smirnov
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/smira/go-ftp-protocol/README.md b/src/github.com/smira/aptly/_vendor/src/github.com/smira/go-ftp-protocol/README.md
new file mode 100644
index 00000000..4faafae8
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/smira/go-ftp-protocol/README.md
@@ -0,0 +1,23 @@
+go-ftp-protocol
+===============
+
+Plugin for http.Transport with support for ftp:// protocol in Go.
+
+Limitations: only anonymous FTP servers, only file retrieval operations.
+
+Internally connections to FTP servers are cached and re-used when possible.
+
+Example usage:
+
+ import "github.com/smira/go-ftp-protocol/protocol"
+
+ transport := &http.Transport{}
+ transport.RegisterProtocol("ftp", &protocol.FTPRoundTripper{})
+
+ client := &http.Client{Transport: transport}
+
+ resp, err := client.Get("ftp://ftp.ru.debian.org/debian/README")
+
+License: MIT
+
+Base on FTP client library: http://github.com/jlaffaye/ftp/
\ No newline at end of file
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/smira/go-ftp-protocol/protocol/protocol.go b/src/github.com/smira/aptly/_vendor/src/github.com/smira/go-ftp-protocol/protocol/protocol.go
new file mode 100644
index 00000000..e8721eed
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/smira/go-ftp-protocol/protocol/protocol.go
@@ -0,0 +1,152 @@
+// Package protocol implements ftp:// scheme plugin for http.Transport
+//
+// github.com/jlaffaye/ftp library is used internally as FTP client implementation.
+//
+// Limitations: only anonymous FTP servers, only file retrieval operations.
+//
+// Internally connections to FTP servers are cached and re-used when possible.
+//
+// Example:
+//
+// transport := &http.Transport{}
+// transport.RegisterProtocol("ftp", &FTPRoundTripper{})
+// client := &http.Client{Transport: transport}
+// resp, err := client.Get("ftp://ftp.ru.debian.org/debian/README")
+package protocol
+
+import (
+ "fmt"
+ "github.com/jlaffaye/ftp"
+ "io"
+ "net/http"
+ "net/textproto"
+ "strings"
+ "sync"
+)
+
+// FTPRoundTripper is an implementation of net/http.RoundTripper on top of FTP client
+type FTPRoundTripper struct {
+ lock sync.Mutex
+ idleConnections map[string][]*ftp.ServerConn
+}
+
+// verify interface
+var (
+ _ http.RoundTripper = &FTPRoundTripper{}
+)
+
+type readCloserWrapper struct {
+ body io.ReadCloser
+ rt *FTPRoundTripper
+ hostport string
+ conn *ftp.ServerConn
+}
+
+func (w *readCloserWrapper) Read(p []byte) (n int, err error) {
+ return w.body.Read(p)
+}
+
+func (w *readCloserWrapper) Close() error {
+ err := w.body.Close()
+ if err == nil {
+ w.rt.putConnection(w.hostport, w.conn)
+ }
+
+ return err
+}
+
+func (rt *FTPRoundTripper) getConnection(hostport string) (conn *ftp.ServerConn, err error) {
+ rt.lock.Lock()
+ conns, ok := rt.idleConnections[hostport]
+ if ok && len(conns) > 0 {
+ conn = conns[0]
+ rt.idleConnections[hostport] = conns[1:]
+ rt.lock.Unlock()
+ return
+ }
+ rt.lock.Unlock()
+
+ conn, err = ftp.Connect(hostport)
+ if err != nil {
+ return nil, err
+ }
+
+ err = conn.Login("anonymous", "anonymous")
+ if err != nil {
+ conn.Quit()
+ return nil, err
+ }
+
+ return conn, nil
+}
+
+func (rt *FTPRoundTripper) putConnection(hostport string, conn *ftp.ServerConn) {
+ rt.lock.Lock()
+ defer rt.lock.Unlock()
+
+ if rt.idleConnections == nil {
+ rt.idleConnections = make(map[string][]*ftp.ServerConn)
+ }
+
+ rt.idleConnections[hostport] = append(rt.idleConnections[hostport], conn)
+}
+
+// RoundTrip parses incoming GET "HTTP" request and transforms it into
+// commands to ftp client
+func (rt *FTPRoundTripper) RoundTrip(request *http.Request) (*http.Response, error) {
+ if request.URL.Scheme != "ftp" {
+ return nil, fmt.Errorf("only ftp protocol is supported, got %s", request.Proto)
+ }
+
+ if request.Method != "GET" {
+ return nil, fmt.Errorf("only GET method is supported, got %s", request.Method)
+ }
+
+ hostport := request.URL.Host
+ if strings.Index(hostport, ":") == -1 {
+ hostport = hostport + ":21"
+ }
+
+ connection, err := rt.getConnection(hostport)
+ if err != nil {
+ return nil, err
+ }
+
+ var body io.ReadCloser
+ body, err = connection.Retr(request.URL.Path)
+
+ if err != nil {
+ if te, ok := err.(*textproto.Error); ok {
+ rt.putConnection(hostport, connection)
+
+ if te.Code == ftp.StatusFileUnavailable {
+ return &http.Response{
+ Status: "404 Not Found",
+ StatusCode: 404,
+ Proto: "FTP/1.0",
+ ProtoMajor: 1,
+ ProtoMinor: 0,
+ Request: request,
+ }, nil
+ }
+ }
+
+ return nil, err
+ }
+
+ return &http.Response{
+ Status: "200 OK",
+ StatusCode: 200,
+ Proto: "FTP/1.0",
+ ProtoMajor: 1,
+ ProtoMinor: 0,
+ Body: &readCloserWrapper{
+ body: body,
+ rt: rt,
+ hostport: hostport,
+ conn: connection,
+ },
+ ContentLength: -1,
+ Request: request,
+ }, nil
+}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/smira/go-ftp-protocol/protocol/protocol_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/smira/go-ftp-protocol/protocol/protocol_test.go
new file mode 100644
index 00000000..573dada2
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/smira/go-ftp-protocol/protocol/protocol_test.go
@@ -0,0 +1,94 @@
+package protocol
+
+import (
+ "io/ioutil"
+ "net/http"
+ "strings"
+ "testing"
+)
+
+func TestProtocol(t *testing.T) {
+ transport := &http.Transport{}
+ transport.RegisterProtocol("ftp", &FTPRoundTripper{})
+
+ client := &http.Client{Transport: transport}
+
+ resp, err := client.Get("ftp://ftp.ru.debian.org/debian/README")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if resp.StatusCode != 200 {
+ t.Fatalf("resp.StatusCode 200 != %d", resp.StatusCode)
+ }
+
+ content, err := ioutil.ReadAll(resp.Body)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ err = resp.Body.Close()
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if !strings.HasPrefix(string(content), "See http://www.debian.org/ for information about Debian GNU/Linux.") {
+ t.Fatalf("unexpected content: %s", content)
+ }
+
+ resp, err = client.Get("ftp://ftp.ru.debian.org/debian/missing")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if resp.StatusCode != 404 {
+ t.Fatalf("resp.StatusCode 404 != %d", resp.StatusCode)
+ }
+}
+
+func TestConcurrent(t *testing.T) {
+ transport := &http.Transport{}
+ transport.RegisterProtocol("ftp", &FTPRoundTripper{})
+
+ client := &http.Client{Transport: transport}
+
+ const concurrency = 4
+ const count = 10
+
+ done := make(chan struct{}, concurrency)
+
+ for i := 0; i < concurrency; i++ {
+ go func() {
+ defer func() { done <- struct{}{} }()
+
+ for j := 0; j < 10; j++ {
+ resp, err := client.Get("ftp://ftp.ru.debian.org/debian/README")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if resp.StatusCode != 200 {
+ t.Fatalf("resp.StatusCode 200 != %d", resp.StatusCode)
+ }
+
+ content, err := ioutil.ReadAll(resp.Body)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ err = resp.Body.Close()
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if !strings.HasPrefix(string(content), "See http://www.debian.org/ for information about Debian GNU/Linux.") {
+ t.Fatalf("unexpected content: %s", content)
+ }
+ }
+ }()
+ }
+
+ for i := 0; i < concurrency; i++ {
+ <-done
+ }
+}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/.travis.yml b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/.travis.yml
new file mode 100644
index 00000000..65d13059
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/.travis.yml
@@ -0,0 +1,8 @@
+language: go
+
+go:
+ - 1.2
+ - 1.3
+ - tip
+
+script: go test ./...
\ No newline at end of file
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/README.md b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/README.md
index 3776aad7..f8706652 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/README.md
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/README.md
@@ -1,5 +1,7 @@
This is an implementation of the [LevelDB key/value database](http:code.google.com/p/leveldb) in the [Go programming language](http:golang.org).
+[](https://travis-ci.org/syndtr/goleveldb)
+
Installation
-----------
@@ -8,7 +10,7 @@ Installation
Requirements
-----------
-* Need at least `go1.1` or newer.
+* Need at least `go1.2` or newer.
Usage
-----------
@@ -66,6 +68,17 @@ Iterate over subset of database content:
err = iter.Error()
...
+Iterate over subset of database content with a particular prefix:
+
+ iter := db.NewIterator(util.BytesPrefix([]byte("foo-")), nil)
+ for iter.Next() {
+ // Use key/value.
+ ...
+ }
+ iter.Release()
+ err = iter.Error()
+ ...
+
Batch writes:
batch := new(leveldb.Batch)
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/bench_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/bench_test.go
index ea6801a8..91b42670 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/bench_test.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/bench_test.go
@@ -170,7 +170,7 @@ func (p *dbBench) writes(perBatch int) {
b.SetBytes(116)
}
-func (p *dbBench) drop() {
+func (p *dbBench) gc() {
p.keys, p.values = nil, nil
runtime.GC()
}
@@ -249,6 +249,9 @@ func (p *dbBench) newIter() iterator.Iterator {
}
func (p *dbBench) close() {
+ if bp, err := p.db.GetProperty("leveldb.blockpool"); err == nil {
+ p.b.Log("Block pool stats: ", bp)
+ }
p.db.Close()
p.stor.Close()
os.RemoveAll(benchDB)
@@ -331,7 +334,7 @@ func BenchmarkDBRead(b *testing.B) {
p := openDBBench(b, false)
p.populate(b.N)
p.fill()
- p.drop()
+ p.gc()
iter := p.newIter()
b.ResetTimer()
@@ -362,7 +365,7 @@ func BenchmarkDBReadUncompressed(b *testing.B) {
p := openDBBench(b, true)
p.populate(b.N)
p.fill()
- p.drop()
+ p.gc()
iter := p.newIter()
b.ResetTimer()
@@ -379,7 +382,7 @@ func BenchmarkDBReadTable(b *testing.B) {
p.populate(b.N)
p.fill()
p.reopen()
- p.drop()
+ p.gc()
iter := p.newIter()
b.ResetTimer()
@@ -395,7 +398,7 @@ func BenchmarkDBReadReverse(b *testing.B) {
p := openDBBench(b, false)
p.populate(b.N)
p.fill()
- p.drop()
+ p.gc()
iter := p.newIter()
b.ResetTimer()
@@ -413,7 +416,7 @@ func BenchmarkDBReadReverseTable(b *testing.B) {
p.populate(b.N)
p.fill()
p.reopen()
- p.drop()
+ p.gc()
iter := p.newIter()
b.ResetTimer()
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/cache/cache.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/cache/cache.go
index 9b6a7497..baced771 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/cache/cache.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/cache/cache.go
@@ -11,115 +11,149 @@ import (
"sync/atomic"
)
-// SetFunc used by Namespace.Get method to create a cache object. SetFunc
-// may return ok false, in that case the cache object will not be created.
-type SetFunc func() (ok bool, value interface{}, charge int, fin SetFin)
+// SetFunc is the function that will be called by Namespace.Get to create
+// a cache object, if charge is less than one than the cache object will
+// not be registered to cache tree, if value is nil then the cache object
+// will not be created.
+type SetFunc func() (charge int, value interface{})
-// SetFin will be called when corresponding cache object are released.
-type SetFin func()
+// DelFin is the function that will be called as the result of a delete operation.
+// Exist == true is indication that the object is exist, and pending == true is
+// indication of deletion already happen but haven't done yet (wait for all handles
+// to be released). And exist == false means the object doesn't exist.
+type DelFin func(exist, pending bool)
-// DelFin will be called when corresponding cache object are released.
-// DelFin will be called after SetFin. The exist is true if the corresponding
-// cache object is actually exist in the cache tree.
-type DelFin func(exist bool)
+// PurgeFin is the function that will be called as the result of a purge operation.
+type PurgeFin func(ns, key uint64)
-// PurgeFin will be called when corresponding cache object are released.
-// PurgeFin will be called after SetFin. If PurgeFin present DelFin will
-// not be executed but passed to the PurgeFin, it is up to the caller
-// to call it or not.
-type PurgeFin func(ns, key uint64, delfin DelFin)
-
-// Cache is a cache tree.
+// Cache is a cache tree. A cache instance must be goroutine-safe.
type Cache interface {
- // SetCapacity sets cache capacity.
+ // SetCapacity sets cache tree capacity.
SetCapacity(capacity int)
- // GetNamespace gets or creates a cache namespace for the given id.
+ // Capacity returns cache tree capacity.
+ Capacity() int
+
+ // Used returns used cache tree capacity.
+ Used() int
+
+ // Size returns entire alive cache objects size.
+ Size() int
+
+ // NumObjects returns number of alive objects.
+ NumObjects() int
+
+ // GetNamespace gets cache namespace with the given id.
+ // GetNamespace is never return nil.
GetNamespace(id uint64) Namespace
- // Purge purges all cache namespaces, read Namespace.Purge method documentation.
+ // PurgeNamespace purges cache namespace with the given id from this cache tree.
+ // Also read Namespace.Purge.
+ PurgeNamespace(id uint64, fin PurgeFin)
+
+ // ZapNamespace detaches cache namespace with the given id from this cache tree.
+ // Also read Namespace.Zap.
+ ZapNamespace(id uint64)
+
+ // Purge purges all cache namespace from this cache tree.
+ // This is behave the same as calling Namespace.Purge method on all cache namespace.
Purge(fin PurgeFin)
- // Zap zaps all cache namespaces, read Namespace.Zap method documentation.
- Zap(closed bool)
+ // Zap detaches all cache namespace from this cache tree.
+ // This is behave the same as calling Namespace.Zap method on all cache namespace.
+ Zap()
}
-// Namespace is a cache namespace.
+// Namespace is a cache namespace. A namespace instance must be goroutine-safe.
type Namespace interface {
- // Get gets cache object for the given key. The given SetFunc (if not nil) will
- // be called if the given key does not exist.
- // If the given key does not exist, SetFunc is nil or SetFunc return ok false, Get
- // will return ok false.
- Get(key uint64, setf SetFunc) (obj Object, ok bool)
-
- // Get deletes cache object for the given key. If exist the cache object will
- // be deleted later when all of its handles have been released (i.e. no one use
- // it anymore) and the given DelFin (if not nil) will finally be executed. If
- // such cache object does not exist the given DelFin will be executed anyway.
+ // Get gets cache object with the given key.
+ // If cache object is not found and setf is not nil, Get will atomically creates
+ // the cache object by calling setf. Otherwise Get will returns nil.
//
- // Delete returns true if such cache object exist.
+ // The returned cache handle should be released after use by calling Release
+ // method.
+ Get(key uint64, setf SetFunc) Handle
+
+ // Delete removes cache object with the given key from cache tree.
+ // A deleted cache object will be released as soon as all of its handles have
+ // been released.
+ // Delete only happen once, subsequent delete will consider cache object doesn't
+ // exist, even if the cache object ins't released yet.
+ //
+ // If not nil, fin will be called if the cache object doesn't exist or when
+ // finally be released.
+ //
+ // Delete returns true if such cache object exist and never been deleted.
Delete(key uint64, fin DelFin) bool
- // Purge deletes all cache objects, read Delete method documentation.
+ // Purge removes all cache objects within this namespace from cache tree.
+ // This is the same as doing delete on all cache objects.
+ //
+ // If not nil, fin will be called on all cache objects when its finally be
+ // released.
Purge(fin PurgeFin)
- // Zap detaches the namespace from the cache tree and delete all its cache
- // objects. The cache objects deletion and finalizers execution are happen
- // immediately, even if its existing handles haven't yet been released.
- // A zapped namespace can't never be filled again.
- // If closed is false then the Get function will always call the given SetFunc
- // if it is not nil, but resultant of the SetFunc will not be cached.
- Zap(closed bool)
+ // Zap detaches namespace from cache tree and release all its cache objects.
+ // A zapped namespace can never be filled again.
+ // Calling Get on zapped namespace will always return nil.
+ Zap()
}
-// Object is a cache object.
-type Object interface {
- // Release releases the cache object. Other methods should not be called
- // after the cache object has been released.
+// Handle is a cache handle.
+type Handle interface {
+ // Release releases this cache handle. This method can be safely called mutiple
+ // times.
Release()
- // Value returns value of the cache object.
+ // Value returns value of this cache handle.
+ // Value will returns nil after this cache handle have be released.
Value() interface{}
}
+const (
+ DelNotExist = iota
+ DelExist
+ DelPendig
+)
+
// Namespace state.
type nsState int
const (
nsEffective nsState = iota
nsZapped
- nsClosed
)
// Node state.
type nodeState int
const (
- nodeEffective nodeState = iota
+ nodeZero nodeState = iota
+ nodeEffective
nodeEvicted
- nodeRemoved
+ nodeDeleted
)
-// Fake object.
-type fakeObject struct {
+// Fake handle.
+type fakeHandle struct {
value interface{}
fin func()
once uint32
}
-func (o *fakeObject) Value() interface{} {
- if atomic.LoadUint32(&o.once) == 0 {
- return o.value
+func (h *fakeHandle) Value() interface{} {
+ if atomic.LoadUint32(&h.once) == 0 {
+ return h.value
}
return nil
}
-func (o *fakeObject) Release() {
- if !atomic.CompareAndSwapUint32(&o.once, 0, 1) {
+func (h *fakeHandle) Release() {
+ if !atomic.CompareAndSwapUint32(&h.once, 0, 1) {
return
}
- if o.fin != nil {
- o.fin()
- o.fin = nil
+ if h.fin != nil {
+ h.fin()
+ h.fin = nil
}
}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/cache/cache_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/cache/cache_test.go
index 07a9939b..6207e681 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/cache/cache_test.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/cache/cache_test.go
@@ -8,14 +8,32 @@ package cache
import (
"math/rand"
+ "runtime"
+ "sync"
+ "sync/atomic"
"testing"
+ "time"
)
-func set(ns Namespace, key uint64, value interface{}, charge int, fin func()) Object {
- obj, _ := ns.Get(key, func() (bool, interface{}, int, SetFin) {
- return true, value, charge, fin
+type releaserFunc struct {
+ fn func()
+ value interface{}
+}
+
+func (r releaserFunc) Release() {
+ if r.fn != nil {
+ r.fn()
+ }
+}
+
+func set(ns Namespace, key uint64, value interface{}, charge int, relf func()) Handle {
+ return ns.Get(key, func() (int, interface{}) {
+ if relf != nil {
+ return charge, releaserFunc{relf, value}
+ } else {
+ return charge, value
+ }
})
- return obj
}
func TestCache_HitMiss(t *testing.T) {
@@ -43,29 +61,31 @@ func TestCache_HitMiss(t *testing.T) {
setfin++
}).Release()
for j, y := range cases {
- r, ok := ns.Get(y.key, nil)
+ h := ns.Get(y.key, nil)
if j <= i {
// should hit
- if !ok {
+ if h == nil {
t.Errorf("case '%d' iteration '%d' is miss", i, j)
- } else if r.Value().(string) != y.value {
- t.Errorf("case '%d' iteration '%d' has invalid value got '%s', want '%s'", i, j, r.Value().(string), y.value)
+ } else {
+ if x := h.Value().(releaserFunc).value.(string); x != y.value {
+ t.Errorf("case '%d' iteration '%d' has invalid value got '%s', want '%s'", i, j, x, y.value)
+ }
}
} else {
// should miss
- if ok {
- t.Errorf("case '%d' iteration '%d' is hit , value '%s'", i, j, r.Value().(string))
+ if h != nil {
+ t.Errorf("case '%d' iteration '%d' is hit , value '%s'", i, j, h.Value().(releaserFunc).value.(string))
}
}
- if ok {
- r.Release()
+ if h != nil {
+ h.Release()
}
}
}
for i, x := range cases {
finalizerOk := false
- ns.Delete(x.key, func(exist bool) {
+ ns.Delete(x.key, func(exist, pending bool) {
finalizerOk = true
})
@@ -74,22 +94,24 @@ func TestCache_HitMiss(t *testing.T) {
}
for j, y := range cases {
- r, ok := ns.Get(y.key, nil)
+ h := ns.Get(y.key, nil)
if j > i {
// should hit
- if !ok {
+ if h == nil {
t.Errorf("case '%d' iteration '%d' is miss", i, j)
- } else if r.Value().(string) != y.value {
- t.Errorf("case '%d' iteration '%d' has invalid value got '%s', want '%s'", i, j, r.Value().(string), y.value)
+ } else {
+ if x := h.Value().(releaserFunc).value.(string); x != y.value {
+ t.Errorf("case '%d' iteration '%d' has invalid value got '%s', want '%s'", i, j, x, y.value)
+ }
}
} else {
// should miss
- if ok {
- t.Errorf("case '%d' iteration '%d' is hit, value '%s'", i, j, r.Value().(string))
+ if h != nil {
+ t.Errorf("case '%d' iteration '%d' is hit, value '%s'", i, j, h.Value().(releaserFunc).value.(string))
}
}
- if ok {
- r.Release()
+ if h != nil {
+ h.Release()
}
}
}
@@ -107,42 +129,42 @@ func TestLRUCache_Eviction(t *testing.T) {
set(ns, 3, 3, 1, nil).Release()
set(ns, 4, 4, 1, nil).Release()
set(ns, 5, 5, 1, nil).Release()
- if r, ok := ns.Get(2, nil); ok { // 1,3,4,5,2
- r.Release()
+ if h := ns.Get(2, nil); h != nil { // 1,3,4,5,2
+ h.Release()
}
set(ns, 9, 9, 10, nil).Release() // 5,2,9
- for _, x := range []uint64{9, 2, 5, 1} {
- r, ok := ns.Get(x, nil)
- if !ok {
- t.Errorf("miss for key '%d'", x)
+ for _, key := range []uint64{9, 2, 5, 1} {
+ h := ns.Get(key, nil)
+ if h == nil {
+ t.Errorf("miss for key '%d'", key)
} else {
- if r.Value().(int) != int(x) {
- t.Errorf("invalid value for key '%d' want '%d', got '%d'", x, x, r.Value().(int))
+ if x := h.Value().(int); x != int(key) {
+ t.Errorf("invalid value for key '%d' want '%d', got '%d'", key, key, x)
}
- r.Release()
+ h.Release()
}
}
o1.Release()
- for _, x := range []uint64{1, 2, 5} {
- r, ok := ns.Get(x, nil)
- if !ok {
- t.Errorf("miss for key '%d'", x)
+ for _, key := range []uint64{1, 2, 5} {
+ h := ns.Get(key, nil)
+ if h == nil {
+ t.Errorf("miss for key '%d'", key)
} else {
- if r.Value().(int) != int(x) {
- t.Errorf("invalid value for key '%d' want '%d', got '%d'", x, x, r.Value().(int))
+ if x := h.Value().(int); x != int(key) {
+ t.Errorf("invalid value for key '%d' want '%d', got '%d'", key, key, x)
}
- r.Release()
+ h.Release()
}
}
- for _, x := range []uint64{3, 4, 9} {
- r, ok := ns.Get(x, nil)
- if ok {
- t.Errorf("hit for key '%d'", x)
- if r.Value().(int) != int(x) {
- t.Errorf("invalid value for key '%d' want '%d', got '%d'", x, x, r.Value().(int))
+ for _, key := range []uint64{3, 4, 9} {
+ h := ns.Get(key, nil)
+ if h != nil {
+ t.Errorf("hit for key '%d'", key)
+ if x := h.Value().(int); x != int(key) {
+ t.Errorf("invalid value for key '%d' want '%d', got '%d'", key, key, x)
}
- r.Release()
+ h.Release()
}
}
}
@@ -153,16 +175,15 @@ func TestLRUCache_SetGet(t *testing.T) {
for i := 0; i < 200; i++ {
n := uint64(rand.Intn(99999) % 20)
set(ns, n, n, 1, nil).Release()
- if p, ok := ns.Get(n, nil); ok {
- if p.Value() == nil {
+ if h := ns.Get(n, nil); h != nil {
+ if h.Value() == nil {
t.Errorf("key '%d' contains nil value", n)
} else {
- got := p.Value().(uint64)
- if got != n {
- t.Errorf("invalid value for key '%d' want '%d', got '%d'", n, n, got)
+ if x := h.Value().(uint64); x != n {
+ t.Errorf("invalid value for key '%d' want '%d', got '%d'", n, n, x)
}
}
- p.Release()
+ h.Release()
} else {
t.Errorf("key '%d' doesn't exist", n)
}
@@ -176,31 +197,429 @@ func TestLRUCache_Purge(t *testing.T) {
o2 := set(ns1, 2, 2, 1, nil)
ns1.Purge(nil)
set(ns1, 3, 3, 1, nil).Release()
- for _, x := range []uint64{1, 2, 3} {
- r, ok := ns1.Get(x, nil)
- if !ok {
- t.Errorf("miss for key '%d'", x)
+ for _, key := range []uint64{1, 2, 3} {
+ h := ns1.Get(key, nil)
+ if h == nil {
+ t.Errorf("miss for key '%d'", key)
} else {
- if r.Value().(int) != int(x) {
- t.Errorf("invalid value for key '%d' want '%d', got '%d'", x, x, r.Value().(int))
+ if x := h.Value().(int); x != int(key) {
+ t.Errorf("invalid value for key '%d' want '%d', got '%d'", key, key, x)
}
- r.Release()
+ h.Release()
}
}
o1.Release()
o2.Release()
- for _, x := range []uint64{1, 2} {
- r, ok := ns1.Get(x, nil)
- if ok {
- t.Errorf("hit for key '%d'", x)
- if r.Value().(int) != int(x) {
- t.Errorf("invalid value for key '%d' want '%d', got '%d'", x, x, r.Value().(int))
+ for _, key := range []uint64{1, 2} {
+ h := ns1.Get(key, nil)
+ if h != nil {
+ t.Errorf("hit for key '%d'", key)
+ if x := h.Value().(int); x != int(key) {
+ t.Errorf("invalid value for key '%d' want '%d', got '%d'", key, key, x)
}
- r.Release()
+ h.Release()
}
}
}
+type testingCacheObjectCounter struct {
+ created uint
+ released uint
+}
+
+func (c *testingCacheObjectCounter) createOne() {
+ c.created++
+}
+
+func (c *testingCacheObjectCounter) releaseOne() {
+ c.released++
+}
+
+type testingCacheObject struct {
+ t *testing.T
+ cnt *testingCacheObjectCounter
+
+ ns, key uint64
+
+ releaseCalled bool
+}
+
+func (x *testingCacheObject) Release() {
+ if !x.releaseCalled {
+ x.releaseCalled = true
+ x.cnt.releaseOne()
+ } else {
+ x.t.Errorf("duplicate setfin NS#%d KEY#%s", x.ns, x.key)
+ }
+}
+
+func TestLRUCache_ConcurrentSetGet(t *testing.T) {
+ runtime.GOMAXPROCS(runtime.NumCPU())
+
+ seed := time.Now().UnixNano()
+ t.Logf("seed=%d", seed)
+
+ const (
+ N = 2000000
+ M = 4000
+ C = 3
+ )
+
+ var set, get uint32
+
+ wg := &sync.WaitGroup{}
+ c := NewLRUCache(M / 4)
+ for ni := uint64(0); ni < C; ni++ {
+ r0 := rand.New(rand.NewSource(seed + int64(ni)))
+ r1 := rand.New(rand.NewSource(seed + int64(ni) + 1))
+ ns := c.GetNamespace(ni)
+
+ wg.Add(2)
+ go func(ns Namespace, r *rand.Rand) {
+ for i := 0; i < N; i++ {
+ x := uint64(r.Int63n(M))
+ o := ns.Get(x, func() (int, interface{}) {
+ atomic.AddUint32(&set, 1)
+ return 1, x
+ })
+ if v := o.Value().(uint64); v != x {
+ t.Errorf("#%d invalid value, got=%d", x, v)
+ }
+ o.Release()
+ }
+ wg.Done()
+ }(ns, r0)
+ go func(ns Namespace, r *rand.Rand) {
+ for i := 0; i < N; i++ {
+ x := uint64(r.Int63n(M))
+ o := ns.Get(x, nil)
+ if o != nil {
+ atomic.AddUint32(&get, 1)
+ if v := o.Value().(uint64); v != x {
+ t.Errorf("#%d invalid value, got=%d", x, v)
+ }
+ o.Release()
+ }
+ }
+ wg.Done()
+ }(ns, r1)
+ }
+
+ wg.Wait()
+
+ t.Logf("set=%d get=%d", set, get)
+}
+
+func TestLRUCache_Finalizer(t *testing.T) {
+ const (
+ capacity = 100
+ goroutines = 100
+ iterations = 10000
+ keymax = 8000
+ )
+
+ cnt := &testingCacheObjectCounter{}
+
+ c := NewLRUCache(capacity)
+
+ type instance struct {
+ seed int64
+ rnd *rand.Rand
+ nsid uint64
+ ns Namespace
+ effective int
+ handles []Handle
+ handlesMap map[uint64]int
+
+ delete bool
+ purge bool
+ zap bool
+ wantDel int
+ delfinCalled int
+ delfinCalledAll int
+ delfinCalledEff int
+ purgefinCalled int
+ }
+
+ instanceGet := func(p *instance, key uint64) {
+ h := p.ns.Get(key, func() (charge int, value interface{}) {
+ to := &testingCacheObject{
+ t: t, cnt: cnt,
+ ns: p.nsid,
+ key: key,
+ }
+ p.effective++
+ cnt.createOne()
+ return 1, releaserFunc{func() {
+ to.Release()
+ p.effective--
+ }, to}
+ })
+ p.handles = append(p.handles, h)
+ p.handlesMap[key] = p.handlesMap[key] + 1
+ }
+ instanceRelease := func(p *instance, i int) {
+ h := p.handles[i]
+ key := h.Value().(releaserFunc).value.(*testingCacheObject).key
+ if n := p.handlesMap[key]; n == 0 {
+ t.Fatal("key ref == 0")
+ } else if n > 1 {
+ p.handlesMap[key] = n - 1
+ } else {
+ delete(p.handlesMap, key)
+ }
+ h.Release()
+ p.handles = append(p.handles[:i], p.handles[i+1:]...)
+ p.handles[len(p.handles) : len(p.handles)+1][0] = nil
+ }
+
+ seed := time.Now().UnixNano()
+ t.Logf("seed=%d", seed)
+
+ instances := make([]*instance, goroutines)
+ for i := range instances {
+ p := &instance{}
+ p.handlesMap = make(map[uint64]int)
+ p.seed = seed + int64(i)
+ p.rnd = rand.New(rand.NewSource(p.seed))
+ p.nsid = uint64(i)
+ p.ns = c.GetNamespace(p.nsid)
+ p.delete = i%6 == 0
+ p.purge = i%8 == 0
+ p.zap = i%12 == 0 || i%3 == 0
+ instances[i] = p
+ }
+
+ runr := rand.New(rand.NewSource(seed - 1))
+ run := func(rnd *rand.Rand, x []*instance, init func(p *instance) bool, fn func(p *instance, i int) bool) {
+ var (
+ rx []*instance
+ rn []int
+ )
+ if init == nil {
+ rx = append([]*instance{}, x...)
+ rn = make([]int, len(x))
+ } else {
+ for _, p := range x {
+ if init(p) {
+ rx = append(rx, p)
+ rn = append(rn, 0)
+ }
+ }
+ }
+ for len(rx) > 0 {
+ i := rand.Intn(len(rx))
+ if fn(rx[i], rn[i]) {
+ rn[i]++
+ } else {
+ rx = append(rx[:i], rx[i+1:]...)
+ rn = append(rn[:i], rn[i+1:]...)
+ }
+ }
+ }
+
+ // Get and release.
+ run(runr, instances, nil, func(p *instance, i int) bool {
+ if i < iterations {
+ if len(p.handles) == 0 || p.rnd.Int()%2 == 0 {
+ instanceGet(p, uint64(p.rnd.Intn(keymax)))
+ } else {
+ instanceRelease(p, p.rnd.Intn(len(p.handles)))
+ }
+ return true
+ } else {
+ return false
+ }
+ })
+
+ if used, cap := c.Used(), c.Capacity(); used > cap {
+ t.Errorf("Used > capacity, used=%d cap=%d", used, cap)
+ }
+
+ // Check effective objects.
+ for i, p := range instances {
+ if int(p.effective) < len(p.handlesMap) {
+ t.Errorf("#%d effective objects < acquired handle, eo=%d ah=%d", i, p.effective, len(p.handlesMap))
+ }
+ }
+
+ if want := int(cnt.created - cnt.released); c.Size() != want {
+ t.Errorf("Invalid cache size, want=%d got=%d", want, c.Size())
+ }
+
+ // First delete.
+ run(runr, instances, func(p *instance) bool {
+ p.wantDel = p.effective
+ return p.delete
+ }, func(p *instance, i int) bool {
+ key := uint64(i)
+ if key < keymax {
+ _, wantExist := p.handlesMap[key]
+ gotExist := p.ns.Delete(key, func(exist, pending bool) {
+ p.delfinCalledAll++
+ if exist {
+ p.delfinCalledEff++
+ }
+ })
+ if !gotExist && wantExist {
+ t.Errorf("delete on NS#%d KEY#%d not found", p.nsid, key)
+ }
+ return true
+ } else {
+ return false
+ }
+ })
+
+ // Second delete.
+ run(runr, instances, func(p *instance) bool {
+ p.delfinCalled = 0
+ return p.delete
+ }, func(p *instance, i int) bool {
+ key := uint64(i)
+ if key < keymax {
+ gotExist := p.ns.Delete(key, func(exist, pending bool) {
+ if exist && !pending {
+ t.Errorf("delete fin on NS#%d KEY#%d exist and not pending for deletion", p.nsid, key)
+ }
+ p.delfinCalled++
+ })
+ if gotExist {
+ t.Errorf("delete on NS#%d KEY#%d found", p.nsid, key)
+ }
+ return true
+ } else {
+ if p.delfinCalled != keymax {
+ t.Errorf("(2) #%d not all delete fin called, diff=%d", p.ns, keymax-p.delfinCalled)
+ }
+ return false
+ }
+ })
+
+ // Purge.
+ run(runr, instances, func(p *instance) bool {
+ return p.purge
+ }, func(p *instance, i int) bool {
+ p.ns.Purge(func(ns, key uint64) {
+ p.purgefinCalled++
+ })
+ return false
+ })
+
+ if want := int(cnt.created - cnt.released); c.Size() != want {
+ t.Errorf("Invalid cache size, want=%d got=%d", want, c.Size())
+ }
+
+ // Release.
+ run(runr, instances, func(p *instance) bool {
+ return !p.zap
+ }, func(p *instance, i int) bool {
+ if len(p.handles) > 0 {
+ instanceRelease(p, len(p.handles)-1)
+ return true
+ } else {
+ return false
+ }
+ })
+
+ if want := int(cnt.created - cnt.released); c.Size() != want {
+ t.Errorf("Invalid cache size, want=%d got=%d", want, c.Size())
+ }
+
+ // Zap.
+ run(runr, instances, func(p *instance) bool {
+ return p.zap
+ }, func(p *instance, i int) bool {
+ p.ns.Zap()
+ p.handles = nil
+ p.handlesMap = nil
+ return false
+ })
+
+ if want := int(cnt.created - cnt.released); c.Size() != want {
+ t.Errorf("Invalid cache size, want=%d got=%d", want, c.Size())
+ }
+
+ if notrel, used := int(cnt.created-cnt.released), c.Used(); notrel != used {
+ t.Errorf("Invalid used value, want=%d got=%d", notrel, used)
+ }
+
+ c.Purge(nil)
+
+ for _, p := range instances {
+ if p.delete {
+ if p.delfinCalledAll != keymax {
+ t.Errorf("#%d not all delete fin called, purge=%v zap=%v diff=%d", p.nsid, p.purge, p.zap, keymax-p.delfinCalledAll)
+ }
+ if p.delfinCalledEff != p.wantDel {
+ t.Errorf("#%d not all effective delete fin called, diff=%d", p.nsid, p.wantDel-p.delfinCalledEff)
+ }
+ if p.purge && p.purgefinCalled > 0 {
+ t.Errorf("#%d some purge fin called, delete=%v zap=%v n=%d", p.nsid, p.delete, p.zap, p.purgefinCalled)
+ }
+ } else {
+ if p.purge {
+ if p.purgefinCalled != p.wantDel {
+ t.Errorf("#%d not all purge fin called, delete=%v zap=%v diff=%d", p.nsid, p.delete, p.zap, p.wantDel-p.purgefinCalled)
+ }
+ }
+ }
+ }
+
+ if cnt.created != cnt.released {
+ t.Errorf("Some cache object weren't released, created=%d released=%d", cnt.created, cnt.released)
+ }
+}
+
+func BenchmarkLRUCache_Set(b *testing.B) {
+ c := NewLRUCache(0)
+ ns := c.GetNamespace(0)
+ b.ResetTimer()
+ for i := uint64(0); i < uint64(b.N); i++ {
+ set(ns, i, "", 1, nil)
+ }
+}
+
+func BenchmarkLRUCache_Get(b *testing.B) {
+ c := NewLRUCache(0)
+ ns := c.GetNamespace(0)
+ b.ResetTimer()
+ for i := uint64(0); i < uint64(b.N); i++ {
+ set(ns, i, "", 1, nil)
+ }
+ b.ResetTimer()
+ for i := uint64(0); i < uint64(b.N); i++ {
+ ns.Get(i, nil)
+ }
+}
+
+func BenchmarkLRUCache_Get2(b *testing.B) {
+ c := NewLRUCache(0)
+ ns := c.GetNamespace(0)
+ b.ResetTimer()
+ for i := uint64(0); i < uint64(b.N); i++ {
+ set(ns, i, "", 1, nil)
+ }
+ b.ResetTimer()
+ for i := uint64(0); i < uint64(b.N); i++ {
+ ns.Get(i, func() (charge int, value interface{}) {
+ return 0, nil
+ })
+ }
+}
+
+func BenchmarkLRUCache_Release(b *testing.B) {
+ c := NewLRUCache(0)
+ ns := c.GetNamespace(0)
+ handles := make([]Handle, b.N)
+ for i := uint64(0); i < uint64(b.N); i++ {
+ handles[i] = set(ns, i, "", 1, nil)
+ }
+ b.ResetTimer()
+ for _, h := range handles {
+ h.Release()
+ }
+}
+
func BenchmarkLRUCache_SetRelease(b *testing.B) {
capacity := b.N / 100
if capacity <= 0 {
@@ -210,7 +629,7 @@ func BenchmarkLRUCache_SetRelease(b *testing.B) {
ns := c.GetNamespace(0)
b.ResetTimer()
for i := uint64(0); i < uint64(b.N); i++ {
- set(ns, i, nil, 1, nil).Release()
+ set(ns, i, "", 1, nil).Release()
}
}
@@ -227,10 +646,10 @@ func BenchmarkLRUCache_SetReleaseTwice(b *testing.B) {
nb := b.N - na
for i := uint64(0); i < uint64(na); i++ {
- set(ns, i, nil, 1, nil).Release()
+ set(ns, i, "", 1, nil).Release()
}
for i := uint64(0); i < uint64(nb); i++ {
- set(ns, i, nil, 1, nil).Release()
+ set(ns, i, "", 1, nil).Release()
}
}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/cache/empty_cache.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/cache/empty_cache.go
deleted file mode 100644
index 1fbf8145..00000000
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/cache/empty_cache.go
+++ /dev/null
@@ -1,246 +0,0 @@
-// Copyright (c) 2013, Suryandaru Triandana
-// All rights reserved.
-//
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package cache
-
-import (
- "sync"
- "sync/atomic"
-)
-
-type emptyCache struct {
- sync.Mutex
- table map[uint64]*emptyNS
-}
-
-// NewEmptyCache creates a new initialized empty cache.
-func NewEmptyCache() Cache {
- return &emptyCache{
- table: make(map[uint64]*emptyNS),
- }
-}
-
-func (c *emptyCache) GetNamespace(id uint64) Namespace {
- c.Lock()
- defer c.Unlock()
-
- if ns, ok := c.table[id]; ok {
- return ns
- }
-
- ns := &emptyNS{
- cache: c,
- id: id,
- table: make(map[uint64]*emptyNode),
- }
- c.table[id] = ns
- return ns
-}
-
-func (c *emptyCache) Purge(fin PurgeFin) {
- c.Lock()
- for _, ns := range c.table {
- ns.purgeNB(fin)
- }
- c.Unlock()
-}
-
-func (c *emptyCache) Zap(closed bool) {
- c.Lock()
- for _, ns := range c.table {
- ns.zapNB(closed)
- }
- c.table = make(map[uint64]*emptyNS)
- c.Unlock()
-}
-
-func (*emptyCache) SetCapacity(capacity int) {}
-
-type emptyNS struct {
- cache *emptyCache
- id uint64
- table map[uint64]*emptyNode
- state nsState
-}
-
-func (ns *emptyNS) Get(key uint64, setf SetFunc) (o Object, ok bool) {
- ns.cache.Lock()
-
- switch ns.state {
- case nsZapped:
- ns.cache.Unlock()
- if setf == nil {
- return
- }
-
- var value interface{}
- var fin func()
- ok, value, _, fin = setf()
- if ok {
- o = &fakeObject{
- value: value,
- fin: fin,
- }
- }
- return
- case nsClosed:
- ns.cache.Unlock()
- return
- }
-
- n, ok := ns.table[key]
- if ok {
- n.ref++
- } else {
- if setf == nil {
- ns.cache.Unlock()
- return
- }
-
- var value interface{}
- var fin func()
- ok, value, _, fin = setf()
- if !ok {
- ns.cache.Unlock()
- return
- }
-
- n = &emptyNode{
- ns: ns,
- key: key,
- value: value,
- setfin: fin,
- ref: 1,
- }
- ns.table[key] = n
- }
-
- ns.cache.Unlock()
- o = &emptyObject{node: n}
- return
-}
-
-func (ns *emptyNS) Delete(key uint64, fin DelFin) bool {
- ns.cache.Lock()
-
- if ns.state != nsEffective {
- ns.cache.Unlock()
- if fin != nil {
- fin(false)
- }
- return false
- }
-
- n, ok := ns.table[key]
- if !ok {
- ns.cache.Unlock()
- if fin != nil {
- fin(false)
- }
- return false
- }
- n.delfin = fin
- ns.cache.Unlock()
- return true
-}
-
-func (ns *emptyNS) purgeNB(fin PurgeFin) {
- if ns.state != nsEffective {
- return
- }
- for _, n := range ns.table {
- n.purgefin = fin
- }
-}
-
-func (ns *emptyNS) Purge(fin PurgeFin) {
- ns.cache.Lock()
- ns.purgeNB(fin)
- ns.cache.Unlock()
-}
-
-func (ns *emptyNS) zapNB(closed bool) {
- if ns.state != nsEffective {
- return
- }
- for _, n := range ns.table {
- n.execFin()
- }
- if closed {
- ns.state = nsClosed
- } else {
- ns.state = nsZapped
- }
- ns.table = nil
-}
-
-func (ns *emptyNS) Zap(closed bool) {
- ns.cache.Lock()
- ns.zapNB(closed)
- delete(ns.cache.table, ns.id)
- ns.cache.Unlock()
-}
-
-type emptyNode struct {
- ns *emptyNS
- key uint64
- value interface{}
- ref int
- setfin SetFin
- delfin DelFin
- purgefin PurgeFin
-}
-
-func (n *emptyNode) execFin() {
- if n.setfin != nil {
- n.setfin()
- n.setfin = nil
- }
- if n.purgefin != nil {
- n.purgefin(n.ns.id, n.key, n.delfin)
- n.delfin = nil
- n.purgefin = nil
- } else if n.delfin != nil {
- n.delfin(true)
- n.delfin = nil
- }
-}
-
-func (n *emptyNode) evict() {
- n.ns.cache.Lock()
- n.ref--
- if n.ref == 0 {
- if n.ns.state == nsEffective {
- // Remove elem.
- delete(n.ns.table, n.key)
- // Execute finalizer.
- n.execFin()
- }
- } else if n.ref < 0 {
- panic("leveldb/cache: emptyNode: negative node reference")
- }
- n.ns.cache.Unlock()
-}
-
-type emptyObject struct {
- node *emptyNode
- once uint32
-}
-
-func (o *emptyObject) Value() interface{} {
- if atomic.LoadUint32(&o.once) == 0 {
- return o.node.value
- }
- return nil
-}
-
-func (o *emptyObject) Release() {
- if !atomic.CompareAndSwapUint32(&o.once, 0, 1) {
- return
- }
- o.node.evict()
- o.node = nil
-}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/cache/lru_cache.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/cache/lru_cache.go
index 3c98e076..d56c6eac 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/cache/lru_cache.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/cache/lru_cache.go
@@ -9,16 +9,24 @@ package cache
import (
"sync"
"sync/atomic"
+
+ "github.com/syndtr/goleveldb/leveldb/util"
)
+// The LLRB implementation were taken from https://github.com/petar/GoLLRB.
+// Which contains the following header:
+//
+// Copyright 2010 Petar Maymounkov. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
// lruCache represent a LRU cache state.
type lruCache struct {
- sync.Mutex
-
- recent lruNode
- table map[uint64]*lruNs
- capacity int
- size int
+ mu sync.Mutex
+ recent lruNode
+ table map[uint64]*lruNs
+ capacity int
+ used, size, alive int
}
// NewLRUCache creates a new initialized LRU cache with the given capacity.
@@ -32,245 +40,415 @@ func NewLRUCache(capacity int) Cache {
return c
}
+func (c *lruCache) Capacity() int {
+ c.mu.Lock()
+ defer c.mu.Unlock()
+ return c.capacity
+}
+
+func (c *lruCache) Used() int {
+ c.mu.Lock()
+ defer c.mu.Unlock()
+ return c.used
+}
+
+func (c *lruCache) Size() int {
+ c.mu.Lock()
+ defer c.mu.Unlock()
+ return c.size
+}
+
+func (c *lruCache) NumObjects() int {
+ c.mu.Lock()
+ defer c.mu.Unlock()
+ return c.alive
+}
+
// SetCapacity set cache capacity.
func (c *lruCache) SetCapacity(capacity int) {
- c.Lock()
+ c.mu.Lock()
c.capacity = capacity
c.evict()
- c.Unlock()
+ c.mu.Unlock()
}
// GetNamespace return namespace object for given id.
func (c *lruCache) GetNamespace(id uint64) Namespace {
- c.Lock()
- defer c.Unlock()
+ c.mu.Lock()
+ defer c.mu.Unlock()
- if p, ok := c.table[id]; ok {
- return p
+ if ns, ok := c.table[id]; ok {
+ return ns
}
- p := &lruNs{
- lru: c,
- id: id,
- table: make(map[uint64]*lruNode),
+ ns := &lruNs{lru: c, id: id}
+ c.table[id] = ns
+ return ns
+}
+
+func (c *lruCache) ZapNamespace(id uint64) {
+ c.mu.Lock()
+ if ns, exist := c.table[id]; exist {
+ ns.zapNB()
+ delete(c.table, id)
}
- c.table[id] = p
- return p
+ c.mu.Unlock()
+}
+
+func (c *lruCache) PurgeNamespace(id uint64, fin PurgeFin) {
+ c.mu.Lock()
+ if ns, exist := c.table[id]; exist {
+ ns.purgeNB(fin)
+ }
+ c.mu.Unlock()
}
// Purge purge entire cache.
func (c *lruCache) Purge(fin PurgeFin) {
- c.Lock()
+ c.mu.Lock()
for _, ns := range c.table {
ns.purgeNB(fin)
}
- c.Unlock()
+ c.mu.Unlock()
}
-func (c *lruCache) Zap(closed bool) {
- c.Lock()
+func (c *lruCache) Zap() {
+ c.mu.Lock()
for _, ns := range c.table {
- ns.zapNB(closed)
+ ns.zapNB()
}
c.table = make(map[uint64]*lruNs)
- c.Unlock()
+ c.mu.Unlock()
}
func (c *lruCache) evict() {
top := &c.recent
- for n := c.recent.rPrev; c.size > c.capacity && n != top; {
+ for n := c.recent.rPrev; c.used > c.capacity && n != top; {
+ if n.state != nodeEffective {
+ panic("evicting non effective node")
+ }
n.state = nodeEvicted
n.rRemove()
- n.evictNB()
- c.size -= n.charge
+ n.derefNB()
+ c.used -= n.charge
n = c.recent.rPrev
}
}
type lruNs struct {
- lru *lruCache
- id uint64
- table map[uint64]*lruNode
- state nsState
+ lru *lruCache
+ id uint64
+ rbRoot *lruNode
+ state nsState
}
-func (ns *lruNs) Get(key uint64, setf SetFunc) (o Object, ok bool) {
- lru := ns.lru
- lru.Lock()
-
- switch ns.state {
- case nsZapped:
- lru.Unlock()
- if setf == nil {
- return
- }
-
- var value interface{}
- var fin func()
- ok, value, _, fin = setf()
- if ok {
- o = &fakeObject{
- value: value,
- fin: fin,
- }
- }
- return
- case nsClosed:
- lru.Unlock()
- return
+func (ns *lruNs) rbGetOrCreateNode(h *lruNode, key uint64) (hn, n *lruNode) {
+ if h == nil {
+ n = &lruNode{ns: ns, key: key}
+ return n, n
}
- n, ok := ns.table[key]
- if ok {
- switch n.state {
- case nodeEvicted:
- // Insert to recent list.
- n.state = nodeEffective
- n.ref++
- lru.size += n.charge
- lru.evict()
- fallthrough
- case nodeEffective:
- // Bump to front
- n.rRemove()
- n.rInsert(&lru.recent)
+ if key < h.key {
+ hn, n = ns.rbGetOrCreateNode(h.rbLeft, key)
+ if hn != nil {
+ h.rbLeft = hn
+ } else {
+ return nil, n
+ }
+ } else if key > h.key {
+ hn, n = ns.rbGetOrCreateNode(h.rbRight, key)
+ if hn != nil {
+ h.rbRight = hn
+ } else {
+ return nil, n
}
- n.ref++
} else {
- if setf == nil {
- lru.Unlock()
- return
- }
-
- var value interface{}
- var charge int
- var fin func()
- ok, value, charge, fin = setf()
- if !ok {
- lru.Unlock()
- return
- }
-
- n = &lruNode{
- ns: ns,
- key: key,
- value: value,
- charge: charge,
- setfin: fin,
- ref: 2,
- }
- ns.table[key] = n
- n.rInsert(&lru.recent)
-
- lru.size += charge
- lru.evict()
+ return nil, h
}
- lru.Unlock()
- o = &lruObject{node: n}
- return
+ if rbIsRed(h.rbRight) && !rbIsRed(h.rbLeft) {
+ h = rbRotLeft(h)
+ }
+ if rbIsRed(h.rbLeft) && rbIsRed(h.rbLeft.rbLeft) {
+ h = rbRotRight(h)
+ }
+ if rbIsRed(h.rbLeft) && rbIsRed(h.rbRight) {
+ rbFlip(h)
+ }
+ return h, n
+}
+
+func (ns *lruNs) getOrCreateNode(key uint64) *lruNode {
+ hn, n := ns.rbGetOrCreateNode(ns.rbRoot, key)
+ if hn != nil {
+ ns.rbRoot = hn
+ ns.rbRoot.rbBlack = true
+ }
+ return n
+}
+
+func (ns *lruNs) rbGetNode(key uint64) *lruNode {
+ h := ns.rbRoot
+ for h != nil {
+ switch {
+ case key < h.key:
+ h = h.rbLeft
+ case key > h.key:
+ h = h.rbRight
+ default:
+ return h
+ }
+ }
+ return nil
+}
+
+func (ns *lruNs) getNode(key uint64) *lruNode {
+ return ns.rbGetNode(key)
+}
+
+func (ns *lruNs) rbDeleteNode(h *lruNode, key uint64) *lruNode {
+ if h == nil {
+ return nil
+ }
+
+ if key < h.key {
+ if h.rbLeft == nil { // key not present. Nothing to delete
+ return h
+ }
+ if !rbIsRed(h.rbLeft) && !rbIsRed(h.rbLeft.rbLeft) {
+ h = rbMoveLeft(h)
+ }
+ h.rbLeft = ns.rbDeleteNode(h.rbLeft, key)
+ } else {
+ if rbIsRed(h.rbLeft) {
+ h = rbRotRight(h)
+ }
+ // If @key equals @h.key and no right children at @h
+ if h.key == key && h.rbRight == nil {
+ return nil
+ }
+ if h.rbRight != nil && !rbIsRed(h.rbRight) && !rbIsRed(h.rbRight.rbLeft) {
+ h = rbMoveRight(h)
+ }
+ // If @key equals @h.key, and (from above) 'h.Right != nil'
+ if h.key == key {
+ var x *lruNode
+ h.rbRight, x = rbDeleteMin(h.rbRight)
+ if x == nil {
+ panic("logic")
+ }
+ x.rbLeft, h.rbLeft = h.rbLeft, nil
+ x.rbRight, h.rbRight = h.rbRight, nil
+ x.rbBlack = h.rbBlack
+ h = x
+ } else { // Else, @key is bigger than @h.key
+ h.rbRight = ns.rbDeleteNode(h.rbRight, key)
+ }
+ }
+
+ return rbFixup(h)
+}
+
+func (ns *lruNs) deleteNode(key uint64) {
+ ns.rbRoot = ns.rbDeleteNode(ns.rbRoot, key)
+ if ns.rbRoot != nil {
+ ns.rbRoot.rbBlack = true
+ }
+}
+
+func (ns *lruNs) rbIterateNodes(h *lruNode, pivot uint64, iter func(n *lruNode) bool) bool {
+ if h == nil {
+ return true
+ }
+ if h.key >= pivot {
+ if !ns.rbIterateNodes(h.rbLeft, pivot, iter) {
+ return false
+ }
+ if !iter(h) {
+ return false
+ }
+ }
+ return ns.rbIterateNodes(h.rbRight, pivot, iter)
+}
+
+func (ns *lruNs) iterateNodes(iter func(n *lruNode) bool) {
+ ns.rbIterateNodes(ns.rbRoot, 0, iter)
+}
+
+func (ns *lruNs) Get(key uint64, setf SetFunc) Handle {
+ ns.lru.mu.Lock()
+ defer ns.lru.mu.Unlock()
+
+ if ns.state != nsEffective {
+ return nil
+ }
+
+ var n *lruNode
+ if setf == nil {
+ n = ns.getNode(key)
+ if n == nil {
+ return nil
+ }
+ } else {
+ n = ns.getOrCreateNode(key)
+ }
+ switch n.state {
+ case nodeZero:
+ charge, value := setf()
+ if value == nil {
+ ns.deleteNode(key)
+ return nil
+ }
+ if charge < 0 {
+ charge = 0
+ }
+
+ n.value = value
+ n.charge = charge
+ n.state = nodeEvicted
+
+ ns.lru.size += charge
+ ns.lru.alive++
+
+ fallthrough
+ case nodeEvicted:
+ if n.charge == 0 {
+ break
+ }
+
+ // Insert to recent list.
+ n.state = nodeEffective
+ n.ref++
+ ns.lru.used += n.charge
+ ns.lru.evict()
+
+ fallthrough
+ case nodeEffective:
+ // Bump to front.
+ n.rRemove()
+ n.rInsert(&ns.lru.recent)
+ case nodeDeleted:
+ // Do nothing.
+ default:
+ panic("invalid state")
+ }
+ n.ref++
+
+ return &lruHandle{node: n}
}
func (ns *lruNs) Delete(key uint64, fin DelFin) bool {
- lru := ns.lru
- lru.Lock()
+ ns.lru.mu.Lock()
+ defer ns.lru.mu.Unlock()
if ns.state != nsEffective {
- lru.Unlock()
if fin != nil {
- fin(false)
+ fin(false, false)
}
return false
}
- n, ok := ns.table[key]
- if !ok {
- lru.Unlock()
+ n := ns.getNode(key)
+ if n == nil {
if fin != nil {
- fin(false)
+ fin(false, false)
}
return false
+
}
- n.delfin = fin
switch n.state {
- case nodeRemoved:
- lru.Unlock()
- return false
case nodeEffective:
- lru.size -= n.charge
+ ns.lru.used -= n.charge
+ n.state = nodeDeleted
+ n.delfin = fin
n.rRemove()
- n.evictNB()
+ n.derefNB()
+ case nodeEvicted:
+ n.state = nodeDeleted
+ n.delfin = fin
+ case nodeDeleted:
+ if fin != nil {
+ fin(true, true)
+ }
+ return false
+ default:
+ panic("invalid state")
}
- n.state = nodeRemoved
- lru.Unlock()
return true
}
func (ns *lruNs) purgeNB(fin PurgeFin) {
- lru := ns.lru
- if ns.state != nsEffective {
- return
- }
-
- for _, n := range ns.table {
- n.purgefin = fin
- if n.state == nodeEffective {
- lru.size -= n.charge
- n.rRemove()
- n.evictNB()
+ if ns.state == nsEffective {
+ var nodes []*lruNode
+ ns.iterateNodes(func(n *lruNode) bool {
+ nodes = append(nodes, n)
+ return true
+ })
+ for _, n := range nodes {
+ switch n.state {
+ case nodeEffective:
+ ns.lru.used -= n.charge
+ n.state = nodeDeleted
+ n.purgefin = fin
+ n.rRemove()
+ n.derefNB()
+ case nodeEvicted:
+ n.state = nodeDeleted
+ n.purgefin = fin
+ case nodeDeleted:
+ default:
+ panic("invalid state")
+ }
}
- n.state = nodeRemoved
}
}
func (ns *lruNs) Purge(fin PurgeFin) {
- ns.lru.Lock()
+ ns.lru.mu.Lock()
ns.purgeNB(fin)
- ns.lru.Unlock()
+ ns.lru.mu.Unlock()
}
-func (ns *lruNs) zapNB(closed bool) {
- lru := ns.lru
- if ns.state != nsEffective {
- return
- }
-
- if closed {
- ns.state = nsClosed
- } else {
+func (ns *lruNs) zapNB() {
+ if ns.state == nsEffective {
ns.state = nsZapped
+
+ ns.iterateNodes(func(n *lruNode) bool {
+ if n.state == nodeEffective {
+ ns.lru.used -= n.charge
+ n.rRemove()
+ }
+ ns.lru.size -= n.charge
+ n.state = nodeDeleted
+ n.fin()
+
+ return true
+ })
+ ns.rbRoot = nil
}
- for _, n := range ns.table {
- if n.state == nodeEffective {
- lru.size -= n.charge
- n.rRemove()
- }
- n.state = nodeRemoved
- n.execFin()
- }
- ns.table = nil
}
-func (ns *lruNs) Zap(closed bool) {
- ns.lru.Lock()
- ns.zapNB(closed)
+func (ns *lruNs) Zap() {
+ ns.lru.mu.Lock()
+ ns.zapNB()
delete(ns.lru.table, ns.id)
- ns.lru.Unlock()
+ ns.lru.mu.Unlock()
}
type lruNode struct {
ns *lruNs
- rNext, rPrev *lruNode
+ rNext, rPrev *lruNode
+ rbLeft, rbRight *lruNode
+ rbBlack bool
key uint64
value interface{}
charge int
ref int
state nodeState
- setfin SetFin
delfin DelFin
purgefin PurgeFin
}
@@ -284,7 +462,6 @@ func (n *lruNode) rInsert(at *lruNode) {
}
func (n *lruNode) rRemove() bool {
- // only remove if not already removed
if n.rPrev == nil {
return false
}
@@ -297,58 +474,149 @@ func (n *lruNode) rRemove() bool {
return true
}
-func (n *lruNode) execFin() {
- if n.setfin != nil {
- n.setfin()
- n.setfin = nil
+func (n *lruNode) fin() {
+ if r, ok := n.value.(util.Releaser); ok {
+ r.Release()
}
if n.purgefin != nil {
- n.purgefin(n.ns.id, n.key, n.delfin)
- n.delfin = nil
+ if n.delfin != nil {
+ panic("conflicting delete and purge fin")
+ }
+ n.purgefin(n.ns.id, n.key)
n.purgefin = nil
} else if n.delfin != nil {
- n.delfin(true)
+ n.delfin(true, false)
n.delfin = nil
}
}
-func (n *lruNode) evictNB() {
+func (n *lruNode) derefNB() {
n.ref--
if n.ref == 0 {
if n.ns.state == nsEffective {
- // remove elem
- delete(n.ns.table, n.key)
- // execute finalizer
- n.execFin()
+ // Remove elemement.
+ n.ns.deleteNode(n.key)
+ n.ns.lru.size -= n.charge
+ n.ns.lru.alive--
+ n.fin()
}
+ n.value = nil
} else if n.ref < 0 {
panic("leveldb/cache: lruCache: negative node reference")
}
}
-func (n *lruNode) evict() {
- n.ns.lru.Lock()
- n.evictNB()
- n.ns.lru.Unlock()
+func (n *lruNode) deref() {
+ n.ns.lru.mu.Lock()
+ n.derefNB()
+ n.ns.lru.mu.Unlock()
}
-type lruObject struct {
+type lruHandle struct {
node *lruNode
once uint32
}
-func (o *lruObject) Value() interface{} {
- if atomic.LoadUint32(&o.once) == 0 {
- return o.node.value
+func (h *lruHandle) Value() interface{} {
+ if atomic.LoadUint32(&h.once) == 0 {
+ return h.node.value
}
return nil
}
-func (o *lruObject) Release() {
- if !atomic.CompareAndSwapUint32(&o.once, 0, 1) {
+func (h *lruHandle) Release() {
+ if !atomic.CompareAndSwapUint32(&h.once, 0, 1) {
return
}
-
- o.node.evict()
- o.node = nil
+ h.node.deref()
+ h.node = nil
+}
+
+func rbIsRed(h *lruNode) bool {
+ if h == nil {
+ return false
+ }
+ return !h.rbBlack
+}
+
+func rbRotLeft(h *lruNode) *lruNode {
+ x := h.rbRight
+ if x.rbBlack {
+ panic("rotating a black link")
+ }
+ h.rbRight = x.rbLeft
+ x.rbLeft = h
+ x.rbBlack = h.rbBlack
+ h.rbBlack = false
+ return x
+}
+
+func rbRotRight(h *lruNode) *lruNode {
+ x := h.rbLeft
+ if x.rbBlack {
+ panic("rotating a black link")
+ }
+ h.rbLeft = x.rbRight
+ x.rbRight = h
+ x.rbBlack = h.rbBlack
+ h.rbBlack = false
+ return x
+}
+
+func rbFlip(h *lruNode) {
+ h.rbBlack = !h.rbBlack
+ h.rbLeft.rbBlack = !h.rbLeft.rbBlack
+ h.rbRight.rbBlack = !h.rbRight.rbBlack
+}
+
+func rbMoveLeft(h *lruNode) *lruNode {
+ rbFlip(h)
+ if rbIsRed(h.rbRight.rbLeft) {
+ h.rbRight = rbRotRight(h.rbRight)
+ h = rbRotLeft(h)
+ rbFlip(h)
+ }
+ return h
+}
+
+func rbMoveRight(h *lruNode) *lruNode {
+ rbFlip(h)
+ if rbIsRed(h.rbLeft.rbLeft) {
+ h = rbRotRight(h)
+ rbFlip(h)
+ }
+ return h
+}
+
+func rbFixup(h *lruNode) *lruNode {
+ if rbIsRed(h.rbRight) {
+ h = rbRotLeft(h)
+ }
+
+ if rbIsRed(h.rbLeft) && rbIsRed(h.rbLeft.rbLeft) {
+ h = rbRotRight(h)
+ }
+
+ if rbIsRed(h.rbLeft) && rbIsRed(h.rbRight) {
+ rbFlip(h)
+ }
+
+ return h
+}
+
+func rbDeleteMin(h *lruNode) (hn, n *lruNode) {
+ if h == nil {
+ return nil, nil
+ }
+ if h.rbLeft == nil {
+ return nil, h
+ }
+
+ if !rbIsRed(h.rbLeft) && !rbIsRed(h.rbLeft.rbLeft) {
+ h = rbMoveLeft(h)
+ }
+
+ h.rbLeft, n = rbDeleteMin(h.rbLeft)
+
+ return rbFixup(h), n
}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/comparer.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/comparer.go
index aed84e00..d33d5e9c 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/comparer.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/comparer.go
@@ -9,34 +9,48 @@ package leveldb
import "github.com/syndtr/goleveldb/leveldb/comparer"
type iComparer struct {
- cmp comparer.Comparer
+ ucmp comparer.Comparer
}
-func (p *iComparer) Name() string {
- return p.cmp.Name()
+func (icmp *iComparer) uName() string {
+ return icmp.ucmp.Name()
}
-func (p *iComparer) Compare(a, b []byte) int {
- ia, ib := iKey(a), iKey(b)
- r := p.cmp.Compare(ia.ukey(), ib.ukey())
- if r == 0 {
- an, bn := ia.num(), ib.num()
- if an > bn {
- r = -1
- } else if an < bn {
- r = 1
+func (icmp *iComparer) uCompare(a, b []byte) int {
+ return icmp.ucmp.Compare(a, b)
+}
+
+func (icmp *iComparer) uSeparator(dst, a, b []byte) []byte {
+ return icmp.ucmp.Separator(dst, a, b)
+}
+
+func (icmp *iComparer) uSuccessor(dst, b []byte) []byte {
+ return icmp.ucmp.Successor(dst, b)
+}
+
+func (icmp *iComparer) Name() string {
+ return icmp.uName()
+}
+
+func (icmp *iComparer) Compare(a, b []byte) int {
+ x := icmp.ucmp.Compare(iKey(a).ukey(), iKey(b).ukey())
+ if x == 0 {
+ if m, n := iKey(a).num(), iKey(b).num(); m > n {
+ x = -1
+ } else if m < n {
+ x = 1
}
}
- return r
+ return x
}
-func (p *iComparer) Separator(dst, a, b []byte) []byte {
+func (icmp *iComparer) Separator(dst, a, b []byte) []byte {
ua, ub := iKey(a).ukey(), iKey(b).ukey()
- dst = p.cmp.Separator(dst, ua, ub)
+ dst = icmp.ucmp.Separator(dst, ua, ub)
if dst == nil {
return nil
}
- if len(dst) < len(ua) && p.cmp.Compare(ua, dst) < 0 {
+ if len(dst) < len(ua) && icmp.uCompare(ua, dst) < 0 {
dst = append(dst, kMaxNumBytes...)
} else {
// Did not close possibilities that n maybe longer than len(ub).
@@ -45,13 +59,13 @@ func (p *iComparer) Separator(dst, a, b []byte) []byte {
return dst
}
-func (p *iComparer) Successor(dst, b []byte) []byte {
+func (icmp *iComparer) Successor(dst, b []byte) []byte {
ub := iKey(b).ukey()
- dst = p.cmp.Successor(dst, ub)
+ dst = icmp.ucmp.Successor(dst, ub)
if dst == nil {
return nil
}
- if len(dst) < len(ub) && p.cmp.Compare(ub, dst) < 0 {
+ if len(dst) < len(ub) && icmp.uCompare(ub, dst) < 0 {
dst = append(dst, kMaxNumBytes...)
} else {
// Did not close possibilities that n maybe longer than len(ub).
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/corrupt_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/corrupt_test.go
index 3910c593..a036e089 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/corrupt_test.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/corrupt_test.go
@@ -176,6 +176,18 @@ func (h *dbCorruptHarness) removeAll(ft storage.FileType) {
}
}
+func (h *dbCorruptHarness) removeOne(ft storage.FileType) {
+ ff, err := h.stor.GetFiles(ft)
+ if err != nil {
+ h.t.Fatal("get files: ", err)
+ }
+ f := ff[rand.Intn(len(ff))]
+ h.t.Logf("removing file @%d", f.Num())
+ if err := f.Remove(); err != nil {
+ h.t.Error("remove file: ", err)
+ }
+}
+
func (h *dbCorruptHarness) check(min, max int) {
p := &h.dbHarness
t := p.t
@@ -386,6 +398,33 @@ func TestCorruptDB_UnrelatedKeys(t *testing.T) {
h.close()
}
+func TestCorruptDB_Level0NewerFileHasOlderSeqnum(t *testing.T) {
+ h := newDbCorruptHarness(t)
+
+ h.put("a", "v1")
+ h.put("b", "v1")
+ h.compactMem()
+ h.put("a", "v2")
+ h.put("b", "v2")
+ h.compactMem()
+ h.put("a", "v3")
+ h.put("b", "v3")
+ h.compactMem()
+ h.put("c", "v0")
+ h.put("d", "v0")
+ h.compactMem()
+ h.compactRangeAt(1, "", "")
+ h.closeDB()
+
+ h.recover()
+ h.getVal("a", "v3")
+ h.getVal("b", "v3")
+ h.getVal("c", "v0")
+ h.getVal("d", "v0")
+
+ h.close()
+}
+
func TestCorruptDB_RecoverInvalidSeq_Issue53(t *testing.T) {
h := newDbCorruptHarness(t)
@@ -412,3 +451,22 @@ func TestCorruptDB_RecoverInvalidSeq_Issue53(t *testing.T) {
h.close()
}
+
+func TestCorruptDB_MissingTableFiles(t *testing.T) {
+ h := newDbCorruptHarness(t)
+
+ h.put("a", "v1")
+ h.put("b", "v1")
+ h.compactMem()
+ h.put("c", "v2")
+ h.put("d", "v2")
+ h.compactMem()
+ h.put("e", "v3")
+ h.put("f", "v3")
+ h.closeDB()
+
+ h.removeOne(storage.TypeTable)
+ h.openAssert(false)
+
+ h.close()
+}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db.go
index fe0de77d..979d0ac4 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db.go
@@ -14,6 +14,7 @@ import (
"runtime"
"strings"
"sync"
+ "sync/atomic"
"time"
"github.com/syndtr/goleveldb/leveldb/iterator"
@@ -25,56 +26,54 @@ import (
"github.com/syndtr/goleveldb/leveldb/util"
)
-var (
- ErrNotFound = util.ErrNotFound
- ErrSnapshotReleased = errors.New("leveldb: snapshot released")
- ErrIterReleased = errors.New("leveldb: iterator released")
- ErrClosed = errors.New("leveldb: closed")
-)
-
// DB is a LevelDB database.
type DB struct {
// Need 64-bit alignment.
seq uint64
+ // Session.
s *session
- // MemDB
+ // MemDB.
memMu sync.RWMutex
- mem *memdb.DB
- frozenMem *memdb.DB
+ memPool chan *memdb.DB
+ mem, frozenMem *memDB
journal *journal.Writer
journalWriter storage.Writer
journalFile storage.File
frozenJournalFile storage.File
frozenSeq uint64
- // Snapshot
+ // Snapshot.
snapsMu sync.Mutex
snapsRoot snapshotElement
- // Write
- writeCh chan *Batch
- writeMergedCh chan bool
- writeLockCh chan struct{}
- writeAckCh chan error
- journalCh chan *Batch
- journalAckCh chan error
+ // Stats.
+ aliveSnaps, aliveIters int32
- // Compaction
- compCh chan chan<- struct{}
- compMemCh chan chan<- struct{}
- compMemAckCh chan struct{}
- compReqCh chan *cReq
- compErrCh chan error
- compErrSetCh chan error
- compStats [kNumLevels]cStats
+ // Write.
+ writeC chan *Batch
+ writeMergedC chan bool
+ writeLockC chan struct{}
+ writeAckC chan error
+ journalC chan *Batch
+ journalAckC chan error
- // Close
- closeWg sync.WaitGroup
- closeCh chan struct{}
- closed uint32
- closer io.Closer
+ // Compaction.
+ tcompCmdC chan cCmd
+ tcompPauseC chan chan<- struct{}
+ tcompTriggerC chan struct{}
+ mcompCmdC chan cCmd
+ mcompTriggerC chan struct{}
+ compErrC chan error
+ compErrSetC chan error
+ compStats [kNumLevels]cStats
+
+ // Close.
+ closeW sync.WaitGroup
+ closeC chan struct{}
+ closed uint32
+ closer io.Closer
}
func openDB(s *session) (*DB, error) {
@@ -84,42 +83,50 @@ func openDB(s *session) (*DB, error) {
s: s,
// Initial sequence
seq: s.stSeq,
+ // MemDB
+ memPool: make(chan *memdb.DB, 1),
// Write
- writeCh: make(chan *Batch),
- writeMergedCh: make(chan bool),
- writeLockCh: make(chan struct{}, 1),
- writeAckCh: make(chan error),
- journalCh: make(chan *Batch),
- journalAckCh: make(chan error),
+ writeC: make(chan *Batch),
+ writeMergedC: make(chan bool),
+ writeLockC: make(chan struct{}, 1),
+ writeAckC: make(chan error),
+ journalC: make(chan *Batch),
+ journalAckC: make(chan error),
// Compaction
- compCh: make(chan chan<- struct{}, 1),
- compMemCh: make(chan chan<- struct{}, 1),
- compMemAckCh: make(chan struct{}, 1),
- compReqCh: make(chan *cReq),
- compErrCh: make(chan error),
- compErrSetCh: make(chan error),
+ tcompCmdC: make(chan cCmd),
+ tcompPauseC: make(chan chan<- struct{}),
+ tcompTriggerC: make(chan struct{}, 1),
+ mcompCmdC: make(chan cCmd),
+ mcompTriggerC: make(chan struct{}, 1),
+ compErrC: make(chan error),
+ compErrSetC: make(chan error),
// Close
- closeCh: make(chan struct{}),
+ closeC: make(chan struct{}),
}
db.initSnapshot()
- db.compMemAckCh <- struct{}{}
if err := db.recoverJournal(); err != nil {
return nil, err
}
// Remove any obsolete files.
- if err := db.cleanFiles(); err != nil {
+ if err := db.checkAndCleanFiles(); err != nil {
+ // Close journal.
+ if db.journal != nil {
+ db.journal.Close()
+ db.journalWriter.Close()
+ }
return nil, err
}
// Don't include compaction error goroutine into wait group.
go db.compactionError()
- db.closeWg.Add(2)
- go db.compaction()
- go db.writeJournal()
- db.wakeCompaction(0)
+ db.closeW.Add(3)
+ go db.tCompaction()
+ go db.mCompaction()
+ go db.jWriter()
+ go db.mpoolDrain()
s.logf("db@open done T·%v", time.Since(start))
@@ -132,13 +139,14 @@ func openDB(s *session) (*DB, error) {
// Also, if ErrorIfExist is true and the DB exist Open will returns
// os.ErrExist error.
//
-// Open will return an error with type of ErrManifest if manifest file
-// is missing or corrupted. Missing or corrupted manifest file can be
-// recovered with Recover function.
+// Open will return an error with type of ErrCorrupted if corruption
+// detected in the DB. Corrupted DB can be recovered with Recover
+// function.
//
+// The returned DB instance is goroutine-safe.
// The DB must be closed after use, by calling Close method.
-func Open(p storage.Storage, o *opt.Options) (db *DB, err error) {
- s, err := newSession(p, o)
+func Open(stor storage.Storage, o *opt.Options) (db *DB, err error) {
+ s, err := newSession(stor, o)
if err != nil {
return
}
@@ -174,10 +182,11 @@ func Open(p storage.Storage, o *opt.Options) (db *DB, err error) {
// OpenFile uses standard file-system backed storage implementation as
// desribed in the leveldb/storage package.
//
-// OpenFile will return an error with type of ErrManifest if manifest file
-// is missing or corrupted. Missing or corrupted manifest file can be
-// recovered with Recover function.
+// OpenFile will return an error with type of ErrCorrupted if corruption
+// detected in the DB. Corrupted DB can be recovered with Recover
+// function.
//
+// The returned DB instance is goroutine-safe.
// The DB must be closed after use, by calling Close method.
func OpenFile(path string, o *opt.Options) (db *DB, err error) {
stor, err := storage.OpenFile(path)
@@ -198,9 +207,10 @@ func OpenFile(path string, o *opt.Options) (db *DB, err error) {
// The DB must already exist or it will returns an error.
// Also, Recover will ignore ErrorIfMissing and ErrorIfExist options.
//
+// The returned DB instance is goroutine-safe.
// The DB must be closed after use, by calling Close method.
-func Recover(p storage.Storage, o *opt.Options) (db *DB, err error) {
- s, err := newSession(p, o)
+func Recover(stor storage.Storage, o *opt.Options) (db *DB, err error) {
+ s, err := newSession(stor, o)
if err != nil {
return
}
@@ -226,6 +236,7 @@ func Recover(p storage.Storage, o *opt.Options) (db *DB, err error) {
// RecoverFile uses standard file-system backed storage implementation as desribed
// in the leveldb/storage package.
//
+// The returned DB instance is goroutine-safe.
// The DB must be closed after use, by calling Close method.
func RecoverFile(path string, o *opt.Options) (db *DB, err error) {
stor, err := storage.OpenFile(path)
@@ -242,16 +253,18 @@ func RecoverFile(path string, o *opt.Options) (db *DB, err error) {
}
func recoverTable(s *session, o *opt.Options) error {
- ff0, err := s.getFiles(storage.TypeTable)
+ // Get all tables and sort it by file number.
+ tableFiles_, err := s.getFiles(storage.TypeTable)
if err != nil {
return err
}
- ff1 := files(ff0)
- ff1.sort()
+ tableFiles := files(tableFiles_)
+ tableFiles.sort()
var mSeq uint64
var good, corrupted int
rec := new(sessionRecord)
+ bpool := util.NewBufferPool(o.GetBlockSize() + 5)
buildTable := func(iter iterator.Iterator) (tmp storage.File, size int64, err error) {
tmp = s.newTemp()
writer, err := tmp.Create()
@@ -265,8 +278,9 @@ func recoverTable(s *session, o *opt.Options) error {
tmp = nil
}
}()
+
+ // Copy entries.
tw := table.NewWriter(writer, o)
- // Copy records.
for iter.Next() {
key := iter.Key()
if validIkey(key) {
@@ -298,20 +312,23 @@ func recoverTable(s *session, o *opt.Options) error {
return err
}
defer reader.Close()
+
// Get file size.
size, err := reader.Seek(0, 2)
if err != nil {
return err
}
+
var tSeq uint64
var tgood, tcorrupted, blockerr int
- var min, max []byte
- tr := table.NewReader(reader, size, nil, o)
+ var imin, imax []byte
+ tr := table.NewReader(reader, size, nil, bpool, o)
iter := tr.NewIterator(nil, nil)
iter.(iterator.ErrorCallbackSetter).SetErrorCallback(func(err error) {
s.logf("table@recovery found error @%d %q", file.Num(), err)
blockerr++
})
+
// Scan the table.
for iter.Next() {
key := iter.Key()
@@ -324,16 +341,17 @@ func recoverTable(s *session, o *opt.Options) error {
if seq > tSeq {
tSeq = seq
}
- if min == nil {
- min = append([]byte{}, key...)
+ if imin == nil {
+ imin = append([]byte{}, key...)
}
- max = append(max[:0], key...)
+ imax = append(imax[:0], key...)
}
if err := iter.Error(); err != nil {
iter.Release()
return err
}
iter.Release()
+
if tgood > 0 {
if tcorrupted > 0 || blockerr > 0 {
// Rebuild the table.
@@ -354,7 +372,7 @@ func recoverTable(s *session, o *opt.Options) error {
mSeq = tSeq
}
// Add table to level 0.
- rec.addTable(0, file.Num(), uint64(size), min, max)
+ rec.addTable(0, file.Num(), uint64(size), imin, imax)
s.logf("table@recovery recovered @%d N·%d C·%d B·%d S·%d Q·%d", file.Num(), tgood, tcorrupted, blockerr, size, tSeq)
} else {
s.logf("table@recovery unrecoverable @%d C·%d B·%d S·%d", file.Num(), tcorrupted, blockerr, size)
@@ -365,42 +383,56 @@ func recoverTable(s *session, o *opt.Options) error {
return nil
}
+
// Recover all tables.
- if len(ff1) > 0 {
- s.logf("table@recovery F·%d", len(ff1))
- s.markFileNum(ff1[len(ff1)-1].Num())
- for _, file := range ff1 {
+ if len(tableFiles) > 0 {
+ s.logf("table@recovery F·%d", len(tableFiles))
+
+ // Mark file number as used.
+ s.markFileNum(tableFiles[len(tableFiles)-1].Num())
+
+ for _, file := range tableFiles {
if err := recoverTable(file); err != nil {
return err
}
}
- s.logf("table@recovery recovered F·%d N·%d C·%d Q·%d", len(ff1), good, corrupted, mSeq)
+
+ s.logf("table@recovery recovered F·%d N·%d C·%d Q·%d", len(tableFiles), good, corrupted, mSeq)
}
+
// Set sequence number.
rec.setSeq(mSeq + 1)
+
// Create new manifest.
if err := s.create(); err != nil {
return err
}
+
// Commit.
return s.commit(rec)
}
-func (d *DB) recoverJournal() error {
- s := d.s
- icmp := s.cmp
-
- ff0, err := s.getFiles(storage.TypeJournal)
+func (db *DB) recoverJournal() error {
+ // Get all tables and sort it by file number.
+ journalFiles_, err := db.s.getFiles(storage.TypeJournal)
if err != nil {
return err
}
- ff1 := files(ff0)
- ff1.sort()
- ff2 := make([]storage.File, 0, len(ff1))
- for _, file := range ff1 {
- if file.Num() >= s.stJournalNum || file.Num() == s.stPrevJournalNum {
- s.markFileNum(file.Num())
- ff2 = append(ff2, file)
+ journalFiles := files(journalFiles_)
+ journalFiles.sort()
+
+ // Discard older journal.
+ prev := -1
+ for i, file := range journalFiles {
+ if file.Num() >= db.s.stJournalNum {
+ if prev >= 0 {
+ i--
+ journalFiles[i] = journalFiles[prev]
+ }
+ journalFiles = journalFiles[i:]
+ break
+ } else if file.Num() == db.s.stPrevJournalNum {
+ prev = i
}
}
@@ -408,38 +440,43 @@ func (d *DB) recoverJournal() error {
var of storage.File
var mem *memdb.DB
batch := new(Batch)
- cm := newCMem(s)
+ cm := newCMem(db.s)
buf := new(util.Buffer)
// Options.
- strict := s.o.GetStrict(opt.StrictJournal)
- checksum := s.o.GetStrict(opt.StrictJournalChecksum)
- writeBuffer := s.o.GetWriteBuffer()
+ strict := db.s.o.GetStrict(opt.StrictJournal)
+ checksum := db.s.o.GetStrict(opt.StrictJournalChecksum)
+ writeBuffer := db.s.o.GetWriteBuffer()
recoverJournal := func(file storage.File) error {
- s.logf("journal@recovery recovering @%d", file.Num())
+ db.logf("journal@recovery recovering @%d", file.Num())
reader, err := file.Open()
if err != nil {
return err
}
defer reader.Close()
+
+ // Create/reset journal reader instance.
if jr == nil {
- jr = journal.NewReader(reader, dropper{s, file}, strict, checksum)
+ jr = journal.NewReader(reader, dropper{db.s, file}, strict, checksum)
} else {
- jr.Reset(reader, dropper{s, file}, strict, checksum)
+ jr.Reset(reader, dropper{db.s, file}, strict, checksum)
}
+
+ // Flush memdb and remove obsolete journal file.
if of != nil {
if mem.Len() > 0 {
if err := cm.flush(mem, 0); err != nil {
return err
}
}
- if err := cm.commit(file.Num(), d.seq); err != nil {
+ if err := cm.commit(file.Num(), db.seq); err != nil {
return err
}
cm.reset()
of.Remove()
of = nil
}
- // Reset memdb.
+
+ // Replay journal to memdb.
mem.Reset()
for {
r, err := jr.Next()
@@ -449,12 +486,14 @@ func (d *DB) recoverJournal() error {
}
return err
}
+
buf.Reset()
if _, err := buf.ReadFrom(r); err != nil {
- if strict {
+ if err == io.ErrUnexpectedEOF {
+ continue
+ } else {
return err
}
- continue
}
if err := batch.decode(buf.Bytes()); err != nil {
return err
@@ -462,28 +501,37 @@ func (d *DB) recoverJournal() error {
if err := batch.memReplay(mem); err != nil {
return err
}
- d.seq = batch.seq + uint64(batch.len())
+
+ // Save sequence number.
+ db.seq = batch.seq + uint64(batch.len())
+
+ // Flush it if large enough.
if mem.Size() >= writeBuffer {
- // Large enough, flush it.
if err := cm.flush(mem, 0); err != nil {
return err
}
- // Reset memdb.
mem.Reset()
}
}
+
of = file
return nil
}
+
// Recover all journals.
- if len(ff2) > 0 {
- s.logf("journal@recovery F·%d", len(ff2))
- mem = memdb.New(icmp, writeBuffer)
- for _, file := range ff2 {
+ if len(journalFiles) > 0 {
+ db.logf("journal@recovery F·%d", len(journalFiles))
+
+ // Mark file number as used.
+ db.s.markFileNum(journalFiles[len(journalFiles)-1].Num())
+
+ mem = memdb.New(db.s.icmp, writeBuffer)
+ for _, file := range journalFiles {
if err := recoverJournal(file); err != nil {
return err
}
}
+
// Flush the last journal.
if mem.Len() > 0 {
if err := cm.flush(mem, 0); err != nil {
@@ -491,52 +539,60 @@ func (d *DB) recoverJournal() error {
}
}
}
+
// Create a new journal.
- if _, err := d.newMem(0); err != nil {
+ if _, err := db.newMem(0); err != nil {
return err
}
+
// Commit.
- if err := cm.commit(d.journalFile.Num(), d.seq); err != nil {
+ if err := cm.commit(db.journalFile.Num(), db.seq); err != nil {
+ // Close journal.
+ if db.journal != nil {
+ db.journal.Close()
+ db.journalWriter.Close()
+ }
return err
}
- // Remove the last journal.
+
+ // Remove the last obsolete journal file.
if of != nil {
of.Remove()
}
+
return nil
}
-func (d *DB) get(key []byte, seq uint64, ro *opt.ReadOptions) (value []byte, err error) {
- s := d.s
-
- ucmp := s.cmp.cmp
+func (db *DB) get(key []byte, seq uint64, ro *opt.ReadOptions) (value []byte, err error) {
ikey := newIKey(key, seq, tSeek)
- em, fm := d.getMems()
- for _, m := range [...]*memdb.DB{em, fm} {
+ em, fm := db.getMems()
+ for _, m := range [...]*memDB{em, fm} {
if m == nil {
continue
}
- mk, mv, me := m.Find(ikey)
+ defer m.decref()
+
+ mk, mv, me := m.mdb.Find(ikey)
if me == nil {
ukey, _, t, ok := parseIkey(mk)
- if ok && ucmp.Compare(ukey, key) == 0 {
+ if ok && db.s.icmp.uCompare(ukey, key) == 0 {
if t == tDel {
return nil, ErrNotFound
}
- return mv, nil
+ return append([]byte{}, mv...), nil
}
} else if me != ErrNotFound {
return nil, me
}
}
- v := s.version()
+ v := db.s.version()
value, cSched, err := v.get(ikey, ro)
v.release()
if cSched {
- // Wake compaction.
- d.wakeCompaction(0)
+ // Trigger table compaction.
+ db.compTrigger(db.tcompTriggerC)
}
return
}
@@ -544,15 +600,16 @@ func (d *DB) get(key []byte, seq uint64, ro *opt.ReadOptions) (value []byte, err
// Get gets the value for the given key. It returns ErrNotFound if the
// DB does not contain the key.
//
-// The caller should not modify the contents of the returned slice, but
-// it is safe to modify the contents of the argument after Get returns.
-func (d *DB) Get(key []byte, ro *opt.ReadOptions) (value []byte, err error) {
- err = d.ok()
+// The returned slice is its own copy, it is safe to modify the contents
+// of the returned slice.
+// It is safe to modify the contents of the argument after Get returns.
+func (db *DB) Get(key []byte, ro *opt.ReadOptions) (value []byte, err error) {
+ err = db.ok()
if err != nil {
return
}
- return d.get(key, d.getSeq(), ro)
+ return db.get(key, db.getSeq(), ro)
}
// NewIterator returns an iterator for the latest snapshot of the
@@ -571,14 +628,14 @@ func (d *DB) Get(key []byte, ro *opt.ReadOptions) (value []byte, err error) {
// The iterator must be released after use, by calling Release method.
//
// Also read Iterator documentation of the leveldb/iterator package.
-func (d *DB) NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator {
- if err := d.ok(); err != nil {
+func (db *DB) NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator {
+ if err := db.ok(); err != nil {
return iterator.NewEmptyIterator(err)
}
- p := d.newSnapshot()
- defer p.Release()
- return p.NewIterator(slice, ro)
+ snap := db.newSnapshot()
+ defer snap.Release()
+ return snap.NewIterator(slice, ro)
}
// GetSnapshot returns a latest snapshot of the underlying DB. A snapshot
@@ -586,12 +643,12 @@ func (d *DB) NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterat
// content of snapshot are guaranteed to be consistent.
//
// The snapshot must be released after use, by calling Release method.
-func (d *DB) GetSnapshot() (*Snapshot, error) {
- if err := d.ok(); err != nil {
+func (db *DB) GetSnapshot() (*Snapshot, error) {
+ if err := db.ok(); err != nil {
return nil, err
}
- return d.newSnapshot(), nil
+ return db.newSnapshot(), nil
}
// GetProperty returns value of the given property name.
@@ -603,8 +660,18 @@ func (d *DB) GetSnapshot() (*Snapshot, error) {
// Returns statistics of the underlying DB.
// leveldb.sstables
// Returns sstables list for each level.
-func (d *DB) GetProperty(name string) (value string, err error) {
- err = d.ok()
+// leveldb.blockpool
+// Returns block pool stats.
+// leveldb.cachedblock
+// Returns size of cached block.
+// leveldb.openedtables
+// Returns number of opened tables.
+// leveldb.alivesnaps
+// Returns number of alive snapshots.
+// leveldb.aliveiters
+// Returns number of alive iterators.
+func (db *DB) GetProperty(name string) (value string, err error) {
+ err = db.ok()
if err != nil {
return
}
@@ -613,11 +680,9 @@ func (d *DB) GetProperty(name string) (value string, err error) {
if !strings.HasPrefix(name, prefix) {
return "", errors.New("leveldb: GetProperty: unknown property: " + name)
}
-
p := name[len(prefix):]
- s := d.s
- v := s.version()
+ v := db.s.version()
defer v.release()
switch {
@@ -634,22 +699,36 @@ func (d *DB) GetProperty(name string) (value string, err error) {
value = "Compactions\n" +
" Level | Tables | Size(MB) | Time(sec) | Read(MB) | Write(MB)\n" +
"-------+------------+---------------+---------------+---------------+---------------\n"
- for level, tt := range v.tables {
- duration, read, write := d.compStats[level].get()
- if len(tt) == 0 && duration == 0 {
+ for level, tables := range v.tables {
+ duration, read, write := db.compStats[level].get()
+ if len(tables) == 0 && duration == 0 {
continue
}
value += fmt.Sprintf(" %3d | %10d | %13.5f | %13.5f | %13.5f | %13.5f\n",
- level, len(tt), float64(tt.size())/1048576.0, duration.Seconds(),
+ level, len(tables), float64(tables.size())/1048576.0, duration.Seconds(),
float64(read)/1048576.0, float64(write)/1048576.0)
}
case p == "sstables":
- for level, tt := range v.tables {
+ for level, tables := range v.tables {
value += fmt.Sprintf("--- level %d ---\n", level)
- for _, t := range tt {
- value += fmt.Sprintf("%d:%d[%q .. %q]\n", t.file.Num(), t.size, t.min, t.max)
+ for _, t := range tables {
+ value += fmt.Sprintf("%d:%d[%q .. %q]\n", t.file.Num(), t.size, t.imin, t.imax)
}
}
+ case p == "blockpool":
+ value = fmt.Sprintf("%v", db.s.tops.bpool)
+ case p == "cachedblock":
+ if bc := db.s.o.GetBlockCache(); bc != nil {
+ value = fmt.Sprintf("%d", bc.Size())
+ } else {
+ value = ""
+ }
+ case p == "openedtables":
+ value = fmt.Sprintf("%d", db.s.tops.cache.Size())
+ case p == "alivesnaps":
+ value = fmt.Sprintf("%d", atomic.LoadInt32(&db.aliveSnaps))
+ case p == "aliveiters":
+ value = fmt.Sprintf("%d", atomic.LoadInt32(&db.aliveIters))
default:
err = errors.New("leveldb: GetProperty: unknown property: " + name)
}
@@ -657,29 +736,29 @@ func (d *DB) GetProperty(name string) (value string, err error) {
return
}
-// GetApproximateSizes calculates approximate sizes of the given key ranges.
+// SizeOf calculates approximate sizes of the given key ranges.
// The length of the returned sizes are equal with the length of the given
// ranges. The returned sizes measure storage space usage, so if the user
// data compresses by a factor of ten, the returned sizes will be one-tenth
// the size of the corresponding user data size.
// The results may not include the sizes of recently written data.
-func (d *DB) GetApproximateSizes(ranges []util.Range) (Sizes, error) {
- if err := d.ok(); err != nil {
+func (db *DB) SizeOf(ranges []util.Range) (Sizes, error) {
+ if err := db.ok(); err != nil {
return nil, err
}
- v := d.s.version()
+ v := db.s.version()
defer v.release()
sizes := make(Sizes, 0, len(ranges))
for _, r := range ranges {
- min := newIKey(r.Start, kMaxSeq, tSeek)
- max := newIKey(r.Limit, kMaxSeq, tSeek)
- start, err := v.getApproximateOffset(min)
+ imin := newIKey(r.Start, kMaxSeq, tSeek)
+ imax := newIKey(r.Limit, kMaxSeq, tSeek)
+ start, err := v.offsetOf(imin)
if err != nil {
return nil, err
}
- limit, err := v.getApproximateOffset(max)
+ limit, err := v.offsetOf(imax)
if err != nil {
return nil, err
}
@@ -693,105 +772,63 @@ func (d *DB) GetApproximateSizes(ranges []util.Range) (Sizes, error) {
return sizes, nil
}
-// CompactRange compacts the underlying DB for the given key range.
-// In particular, deleted and overwritten versions are discarded,
-// and the data is rearranged to reduce the cost of operations
-// needed to access the data. This operation should typically only
-// be invoked by users who understand the underlying implementation.
-//
-// A nil Range.Start is treated as a key before all keys in the DB.
-// And a nil Range.Limit is treated as a key after all keys in the DB.
-// Therefore if both is nil then it will compact entire DB.
-func (d *DB) CompactRange(r util.Range) error {
- err := d.ok()
- if err != nil {
- return err
- }
-
- cch := make(chan struct{})
- req := &cReq{
- level: -1,
- min: r.Start,
- max: r.Limit,
- cch: cch,
- }
-
- // Push manual compaction request.
- select {
- case _, _ = <-d.closeCh:
- return ErrClosed
- case err := <-d.compErrCh:
- return err
- case d.compReqCh <- req:
- }
- // Wait for compaction
- select {
- case _, _ = <-d.closeCh:
- return ErrClosed
- case <-cch:
- }
- return nil
-}
-
-// Close closes the DB. This will also releases any outstanding snapshot.
+// Close closes the DB. This will also releases any outstanding snapshot and
+// abort any in-flight compaction.
//
// It is not safe to close a DB until all outstanding iterators are released.
// It is valid to call Close multiple times. Other methods should not be
// called after the DB has been closed.
-func (d *DB) Close() error {
- if !d.setClosed() {
+func (db *DB) Close() error {
+ if !db.setClosed() {
return ErrClosed
}
- s := d.s
start := time.Now()
- s.log("db@close closing")
+ db.log("db@close closing")
// Clear the finalizer.
- runtime.SetFinalizer(d, nil)
+ runtime.SetFinalizer(db, nil)
// Get compaction error.
var err error
select {
- case err = <-d.compErrCh:
+ case err = <-db.compErrC:
default:
}
- close(d.closeCh)
+ close(db.closeC)
- // wait for the WaitGroup
- d.closeWg.Wait()
+ // Wait for the close WaitGroup.
+ db.closeW.Wait()
- // close journal
- if d.journal != nil {
- d.journal.Close()
- d.journalWriter.Close()
+ // Close journal.
+ db.writeLockC <- struct{}{}
+ if db.journal != nil {
+ db.journal.Close()
+ db.journalWriter.Close()
}
- // close session
- s.close()
- s.logf("db@close done T·%v", time.Since(start))
- s.release()
+ // Close session.
+ db.s.close()
+ db.logf("db@close done T·%v", time.Since(start))
+ db.s.release()
- if d.closer != nil {
- if err1 := d.closer.Close(); err == nil {
+ if db.closer != nil {
+ if err1 := db.closer.Close(); err == nil {
err = err1
}
}
- d.s = nil
- d.mem = nil
- d.frozenMem = nil
- d.journal = nil
- d.journalWriter = nil
- d.journalFile = nil
- d.frozenJournalFile = nil
- d.snapsRoot = snapshotElement{}
- d.closer = nil
-
- close(d.writeCh)
- close(d.journalCh)
- close(d.compReqCh)
+ // NIL'ing pointers.
+ db.s = nil
+ db.mem = nil
+ db.frozenMem = nil
+ db.journal = nil
+ db.journalWriter = nil
+ db.journalFile = nil
+ db.frozenJournalFile = nil
+ db.snapsRoot = snapshotElement{}
+ db.closer = nil
return err
}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db_compaction.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db_compaction.go
index 9e7055ae..4c903208 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db_compaction.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db_compaction.go
@@ -15,7 +15,7 @@ import (
)
var (
- errTransactExiting = errors.New("leveldb: transact exiting")
+ errCompactionTransactExiting = errors.New("leveldb: compaction transact exiting")
)
type cStats struct {
@@ -61,12 +61,6 @@ func (p *cStatsStaging) stopTimer() {
}
}
-type cReq struct {
- level int
- min, max iKey
- cch chan<- struct{}
-}
-
type cMem struct {
s *session
level int
@@ -80,7 +74,7 @@ func newCMem(s *session) *cMem {
func (c *cMem) flush(mem *memdb.DB, level int) error {
s := c.s
- // Write memdb to table
+ // Write memdb to table.
iter := mem.NewIterator(nil)
defer iter.Release()
t, n, err := s.tops.createFrom(iter)
@@ -88,12 +82,13 @@ func (c *cMem) flush(mem *memdb.DB, level int) error {
return err
}
+ // Pick level.
if level < 0 {
- level = s.version_NB().pickLevel(t.min.ukey(), t.max.ukey())
+ level = s.version_NB().pickLevel(t.imin.ukey(), t.imax.ukey())
}
c.rec.addTableFile(level, t)
- s.logf("mem@flush created L%d@%d N·%d S·%s %q:%q", level, t.file.Num(), n, shortenb(int(t.size)), t.min, t.max)
+ s.logf("mem@flush created L%d@%d N·%d S·%s %q:%q", level, t.file.Num(), n, shortenb(int(t.size)), t.imin, t.imax)
c.level = level
return nil
@@ -106,95 +101,152 @@ func (c *cMem) reset() {
func (c *cMem) commit(journal, seq uint64) error {
c.rec.setJournalNum(journal)
c.rec.setSeq(seq)
- // Commit changes
+
+ // Commit changes.
return c.s.commit(c.rec)
}
-func (d *DB) compactionError() {
+func (db *DB) compactionError() {
var err error
noerr:
for {
select {
- case _, _ = <-d.closeCh:
- return
- case err = <-d.compErrSetCh:
+ case err = <-db.compErrSetC:
if err != nil {
goto haserr
}
+ case _, _ = <-db.closeC:
+ return
}
}
haserr:
for {
select {
- case _, _ = <-d.closeCh:
- return
- case err = <-d.compErrSetCh:
+ case db.compErrC <- err:
+ case err = <-db.compErrSetC:
if err == nil {
goto noerr
}
- case d.compErrCh <- err:
+ case _, _ = <-db.closeC:
+ return
}
}
}
-func (d *DB) transact(name string, exec, rollback func() error) {
- s := d.s
+type compactionTransactCounter int
+
+func (cnt *compactionTransactCounter) incr() {
+ *cnt++
+}
+
+func (db *DB) compactionTransact(name string, exec func(cnt *compactionTransactCounter) error, rollback func() error) {
defer func() {
if x := recover(); x != nil {
- if x == errTransactExiting && rollback != nil {
+ if x == errCompactionTransactExiting && rollback != nil {
if err := rollback(); err != nil {
- s.logf("%s rollback error %q", name, err)
+ db.logf("%s rollback error %q", name, err)
}
}
panic(x)
}
}()
+
+ const (
+ backoffMin = 1 * time.Second
+ backoffMax = 8 * time.Second
+ backoffMul = 2 * time.Second
+ )
+ backoff := backoffMin
+ backoffT := time.NewTimer(backoff)
+ lastCnt := compactionTransactCounter(0)
for n := 0; ; n++ {
- if d.isClosed() {
- s.logf("%s exiting", name)
- panic(errTransactExiting)
+ // Check wether the DB is closed.
+ if db.isClosed() {
+ db.logf("%s exiting", name)
+ db.compactionExitTransact()
} else if n > 0 {
- s.logf("%s retrying N·%d", name, n)
+ db.logf("%s retrying N·%d", name, n)
}
- err := exec()
+
+ // Execute.
+ cnt := compactionTransactCounter(0)
+ err := exec(&cnt)
+
+ // Set compaction error status.
select {
- case _, _ = <-d.closeCh:
- s.logf("%s exiting", name)
- panic(errTransactExiting)
- case d.compErrSetCh <- err:
+ case db.compErrSetC <- err:
+ case _, _ = <-db.closeC:
+ db.logf("%s exiting", name)
+ db.compactionExitTransact()
}
if err == nil {
return
}
- s.logf("%s error %q", name, err)
- time.Sleep(time.Second)
+ db.logf("%s error I·%d %q", name, cnt, err)
+
+ // Reset backoff duration if counter is advancing.
+ if cnt > lastCnt {
+ backoff = backoffMin
+ lastCnt = cnt
+ }
+
+ // Backoff.
+ backoffT.Reset(backoff)
+ if backoff < backoffMax {
+ backoff *= backoffMul
+ if backoff > backoffMax {
+ backoff = backoffMax
+ }
+ }
+ select {
+ case <-backoffT.C:
+ case _, _ = <-db.closeC:
+ db.logf("%s exiting", name)
+ db.compactionExitTransact()
+ }
}
}
-func (d *DB) memCompaction() {
- s := d.s
- c := newCMem(s)
- stats := new(cStatsStaging)
- mem := d.getFrozenMem()
+func (db *DB) compactionExitTransact() {
+ panic(errCompactionTransactExiting)
+}
- s.logf("mem@flush N·%d S·%s", mem.Len(), shortenb(mem.Size()))
+func (db *DB) memCompaction() {
+ mem := db.getFrozenMem()
+ if mem == nil {
+ return
+ }
+ defer mem.decref()
+
+ c := newCMem(db.s)
+ stats := new(cStatsStaging)
+
+ db.logf("mem@flush N·%d S·%s", mem.mdb.Len(), shortenb(mem.mdb.Size()))
// Don't compact empty memdb.
- if mem.Len() == 0 {
- s.logf("mem@flush skipping")
+ if mem.mdb.Len() == 0 {
+ db.logf("mem@flush skipping")
// drop frozen mem
- d.dropFrozenMem()
+ db.dropFrozenMem()
return
}
- d.transact("mem@flush", func() (err error) {
+ // Pause table compaction.
+ ch := make(chan struct{})
+ select {
+ case db.tcompPauseC <- (chan<- struct{})(ch):
+ case _, _ = <-db.closeC:
+ return
+ }
+
+ db.compactionTransact("mem@flush", func(cnt *compactionTransactCounter) (err error) {
stats.startTimer()
defer stats.stopTimer()
- return c.flush(mem, -1)
+ return c.flush(mem.mdb, -1)
}, func() error {
for _, r := range c.rec.addedTables {
- s.logf("mem@flush rollback @%d", r.num)
- f := s.getTableFile(r.num)
+ db.logf("mem@flush rollback @%d", r.num)
+ f := db.s.getTableFile(r.num)
if err := f.Remove(); err != nil {
return err
}
@@ -202,54 +254,59 @@ func (d *DB) memCompaction() {
return nil
})
- d.transact("mem@commit", func() (err error) {
+ db.compactionTransact("mem@commit", func(cnt *compactionTransactCounter) (err error) {
stats.startTimer()
defer stats.stopTimer()
- return c.commit(d.journalFile.Num(), d.frozenSeq)
+ return c.commit(db.journalFile.Num(), db.frozenSeq)
}, nil)
- s.logf("mem@flush commited F·%d T·%v", len(c.rec.addedTables), stats.duration)
+ db.logf("mem@flush committed F·%d T·%v", len(c.rec.addedTables), stats.duration)
for _, r := range c.rec.addedTables {
stats.write += r.size
}
- d.compStats[c.level].add(stats)
+ db.compStats[c.level].add(stats)
- // drop frozen mem
- d.dropFrozenMem()
+ // Drop frozen mem.
+ db.dropFrozenMem()
- c = nil
+ // Resume table compaction.
+ select {
+ case <-ch:
+ case _, _ = <-db.closeC:
+ return
+ }
+
+ // Trigger table compaction.
+ db.compTrigger(db.mcompTriggerC)
}
-func (d *DB) doCompaction(c *compaction, noTrivial bool) {
- s := d.s
- ucmp := s.cmp.cmp
-
+func (db *DB) tableCompaction(c *compaction, noTrivial bool) {
rec := new(sessionRecord)
- rec.addCompactionPointer(c.level, c.max)
+ rec.addCompactionPointer(c.level, c.imax)
if !noTrivial && c.trivial() {
t := c.tables[0][0]
- s.logf("table@move L%d@%d -> L%d", c.level, t.file.Num(), c.level+1)
+ db.logf("table@move L%d@%d -> L%d", c.level, t.file.Num(), c.level+1)
rec.deleteTable(c.level, t.file.Num())
rec.addTableFile(c.level+1, t)
- d.transact("table@move", func() (err error) {
- return s.commit(rec)
+ db.compactionTransact("table@move", func(cnt *compactionTransactCounter) (err error) {
+ return db.s.commit(rec)
}, nil)
return
}
var stats [2]cStatsStaging
- for i, tt := range c.tables {
- for _, t := range tt {
+ for i, tables := range c.tables {
+ for _, t := range tables {
stats[i].read += t.size
// Insert deleted tables into record
rec.deleteTable(c.level+i, t.file.Num())
}
}
sourceSize := int(stats[0].read + stats[1].read)
- minSeq := d.minSeq()
- s.logf("table@compaction L%d·%d -> L%d·%d S·%s Q·%d", c.level, len(c.tables[0]), c.level+1, len(c.tables[1]), shortenb(sourceSize), minSeq)
+ minSeq := db.minSeq()
+ db.logf("table@compaction L%d·%d -> L%d·%d S·%s Q·%d", c.level, len(c.tables[0]), c.level+1, len(c.tables[1]), shortenb(sourceSize), minSeq)
var snapUkey []byte
var snapHasUkey bool
@@ -257,7 +314,7 @@ func (d *DB) doCompaction(c *compaction, noTrivial bool) {
var snapIter int
var snapDropCnt int
var dropCnt int
- d.transact("table@build", func() (err error) {
+ db.compactionTransact("table@build", func(cnt *compactionTransactCounter) (err error) {
ukey := append([]byte{}, snapUkey...)
hasUkey := snapHasUkey
lseq := snapSeq
@@ -272,7 +329,7 @@ func (d *DB) doCompaction(c *compaction, noTrivial bool) {
}
rec.addTableFile(c.level+1, t)
stats[1].write += t.size
- s.logf("table@build created L%d@%d N·%d S·%s %q:%q", c.level+1, t.file.Num(), tw.tw.EntriesLen(), shortenb(int(t.size)), t.min, t.max)
+ db.logf("table@build created L%d@%d N·%d S·%s %q:%q", c.level+1, t.file.Num(), tw.tw.EntriesLen(), shortenb(int(t.size)), t.imin, t.imax)
return nil
}
@@ -288,30 +345,17 @@ func (d *DB) doCompaction(c *compaction, noTrivial bool) {
iter := c.newIterator()
defer iter.Release()
for i := 0; iter.Next(); i++ {
+ // Incr transact counter.
+ cnt.incr()
+
// Skip until last state.
if i < snapIter {
continue
}
- // Prioritize memdb compaction.
- select {
- case _, _ = <-d.closeCh:
- err = ErrClosed
- return
- case cch := <-d.compMemCh:
- stats[1].stopTimer()
- d.memCompaction()
- d.compMemAckCh <- struct{}{}
- if cch != nil {
- cch <- struct{}{}
- }
- stats[1].startTimer()
- default:
- }
+ ikey := iKey(iter.Key())
- key := iKey(iter.Key())
-
- if c.shouldStopBefore(key) && tw != nil {
+ if c.shouldStopBefore(ikey) && tw != nil {
err = finish()
if err != nil {
return
@@ -331,15 +375,15 @@ func (d *DB) doCompaction(c *compaction, noTrivial bool) {
snapSched = false
}
- if seq, t, ok := key.parseNum(); !ok {
+ if seq, vt, ok := ikey.parseNum(); !ok {
// Don't drop error keys
ukey = ukey[:0]
hasUkey = false
lseq = kMaxSeq
} else {
- if !hasUkey || ucmp.Compare(key.ukey(), ukey) != 0 {
+ if !hasUkey || db.s.icmp.uCompare(ikey.ukey(), ukey) != 0 {
// First occurrence of this user key
- ukey = append(ukey[:0], key.ukey()...)
+ ukey = append(ukey[:0], ikey.ukey()...)
hasUkey = true
lseq = kMaxSeq
}
@@ -348,7 +392,7 @@ func (d *DB) doCompaction(c *compaction, noTrivial bool) {
if lseq <= minSeq {
// Dropped because newer entry for same user key exist
drop = true // (A)
- } else if t == tDel && seq <= minSeq && c.isBaseLevelForKey(ukey) {
+ } else if vt == tDel && seq <= minSeq && c.baseLevelForKey(ukey) {
// For this user key:
// (1) there is no data in higher levels
// (2) data in lower levels will have larger seq numbers
@@ -368,14 +412,24 @@ func (d *DB) doCompaction(c *compaction, noTrivial bool) {
// Create new table if not already
if tw == nil {
- tw, err = s.tops.create()
+ // Check for pause event.
+ select {
+ case ch := <-db.tcompPauseC:
+ db.pauseCompaction(ch)
+ case _, _ = <-db.closeC:
+ db.compactionExitTransact()
+ default:
+ }
+
+ // Create new table.
+ tw, err = db.s.tops.create()
if err != nil {
return
}
}
// Write key/value into table
- err = tw.add(key, iter.Value())
+ err = tw.append(ikey, iter.Value())
if err != nil {
return
}
@@ -407,8 +461,8 @@ func (d *DB) doCompaction(c *compaction, noTrivial bool) {
return
}, func() error {
for _, r := range rec.addedTables {
- s.logf("table@build rollback @%d", r.num)
- f := s.getTableFile(r.num)
+ db.logf("table@build rollback @%d", r.num)
+ f := db.s.getTableFile(r.num)
if err := f.Remove(); err != nil {
return err
}
@@ -417,117 +471,219 @@ func (d *DB) doCompaction(c *compaction, noTrivial bool) {
})
// Commit changes
- d.transact("table@commit", func() (err error) {
+ db.compactionTransact("table@commit", func(cnt *compactionTransactCounter) (err error) {
stats[1].startTimer()
defer stats[1].stopTimer()
- return s.commit(rec)
+ return db.s.commit(rec)
}, nil)
- resultSize := int(int(stats[1].write))
- s.logf("table@compaction commited F%s S%s D·%d T·%v", sint(len(rec.addedTables)-len(rec.deletedTables)), sshortenb(resultSize-sourceSize), dropCnt, stats[1].duration)
+ resultSize := int(stats[1].write)
+ db.logf("table@compaction committed F%s S%s D·%d T·%v", sint(len(rec.addedTables)-len(rec.deletedTables)), sshortenb(resultSize-sourceSize), dropCnt, stats[1].duration)
// Save compaction stats
for i := range stats {
- d.compStats[c.level+1].add(&stats[i])
+ db.compStats[c.level+1].add(&stats[i])
}
}
-func (d *DB) compaction() {
- s := d.s
+func (db *DB) tableRangeCompaction(level int, umin, umax []byte) {
+ db.logf("table@compaction range L%d %q:%q", level, umin, umax)
+
+ if level >= 0 {
+ if c := db.s.getCompactionRange(level, umin, umax); c != nil {
+ db.tableCompaction(c, true)
+ }
+ } else {
+ v := db.s.version_NB()
+
+ m := 1
+ for i, t := range v.tables[1:] {
+ if t.overlaps(db.s.icmp, umin, umax, false) {
+ m = i + 1
+ }
+ }
+
+ for level := 0; level < m; level++ {
+ if c := db.s.getCompactionRange(level, umin, umax); c != nil {
+ db.tableCompaction(c, true)
+ }
+ }
+ }
+}
+
+func (db *DB) tableAutoCompaction() {
+ if c := db.s.pickCompaction(); c != nil {
+ db.tableCompaction(c, false)
+ }
+}
+
+func (db *DB) tableNeedCompaction() bool {
+ return db.s.version_NB().needCompaction()
+}
+
+func (db *DB) pauseCompaction(ch chan<- struct{}) {
+ select {
+ case ch <- struct{}{}:
+ case _, _ = <-db.closeC:
+ db.compactionExitTransact()
+ }
+}
+
+type cCmd interface {
+ ack(err error)
+}
+
+type cIdle struct {
+ ackC chan<- error
+}
+
+func (r cIdle) ack(err error) {
+ r.ackC <- err
+}
+
+type cRange struct {
+ level int
+ min, max []byte
+ ackC chan<- error
+}
+
+func (r cRange) ack(err error) {
+ defer func() {
+ recover()
+ }()
+ if r.ackC != nil {
+ r.ackC <- err
+ }
+}
+
+func (db *DB) compSendIdle(compC chan<- cCmd) error {
+ ch := make(chan error)
+ defer close(ch)
+ // Send cmd.
+ select {
+ case compC <- cIdle{ch}:
+ case err := <-db.compErrC:
+ return err
+ case _, _ = <-db.closeC:
+ return ErrClosed
+ }
+ // Wait cmd.
+ return <-ch
+}
+
+func (db *DB) compSendRange(compC chan<- cCmd, level int, min, max []byte) (err error) {
+ ch := make(chan error)
+ defer close(ch)
+ // Send cmd.
+ select {
+ case compC <- cRange{level, min, max, ch}:
+ case err := <-db.compErrC:
+ return err
+ case _, _ = <-db.closeC:
+ return ErrClosed
+ }
+ // Wait cmd.
+ select {
+ case err = <-db.compErrC:
+ case err = <-ch:
+ }
+ return err
+}
+
+func (db *DB) compTrigger(compTriggerC chan struct{}) {
+ select {
+ case compTriggerC <- struct{}{}:
+ default:
+ }
+}
+
+func (db *DB) mCompaction() {
+ var x cCmd
+
defer func() {
if x := recover(); x != nil {
- if x != errTransactExiting {
+ if x != errCompactionTransactExiting {
panic(x)
}
}
- d.closeWg.Done()
+ if x != nil {
+ x.ack(ErrClosed)
+ }
+ db.closeW.Done()
}()
+
for {
- var cch chan<- struct{}
select {
- case _, _ = <-d.closeCh:
+ case x = <-db.mcompCmdC:
+ db.memCompaction()
+ x.ack(nil)
+ x = nil
+ case <-db.mcompTriggerC:
+ db.memCompaction()
+ case _, _ = <-db.closeC:
return
- case cch = <-d.compMemCh:
- d.memCompaction()
- d.compMemAckCh <- struct{}{}
- case cch = <-d.compCh:
- case creq := <-d.compReqCh:
- if creq == nil {
- continue
- }
- s.logf("range compaction L%d %v:%v", creq.level, creq.min, creq.max)
- if creq.level >= 0 {
- c := s.getCompactionRange(creq.level, creq.min, creq.max)
- if c != nil {
- d.doCompaction(c, true)
- }
- } else {
- v := s.version_NB()
- maxLevel := 1
- for i, tt := range v.tables[1:] {
- if tt.isOverlaps(creq.min, creq.max, true, s.cmp) {
- maxLevel = i + 1
- }
- }
- for i := 0; i < maxLevel; i++ {
- c := s.getCompactionRange(i, creq.min, creq.max)
- if c != nil {
- d.doCompaction(c, true)
- }
- }
- }
- cch = creq.cch
- }
- if s.version_NB().needCompaction() {
- d.doCompaction(s.pickCompaction(), false)
- select {
- case d.compCh <- nil:
- default:
- }
- }
- if cch != nil {
- func() {
- defer func() {
- recover()
- }()
- cch <- struct{}{}
- }()
}
}
}
-func (d *DB) wakeCompaction(wait int) error {
- switch wait {
- case 0:
- select {
- case d.compCh <- nil:
- default:
+func (db *DB) tCompaction() {
+ var x cCmd
+ var ackQ []cCmd
+
+ defer func() {
+ if x := recover(); x != nil {
+ if x != errCompactionTransactExiting {
+ panic(x)
+ }
}
- case 1:
- select {
- case _, _ = <-d.closeCh:
- return ErrClosed
- case err := <-d.compErrCh:
- return err
- case d.compCh <- nil:
+ for i := range ackQ {
+ ackQ[i].ack(ErrClosed)
+ ackQ[i] = nil
}
- case 2:
- cch := make(chan struct{})
- defer close(cch)
- select {
- case _, _ = <-d.closeCh:
- return ErrClosed
- case err := <-d.compErrCh:
- return err
- case d.compCh <- (chan<- struct{})(cch):
+ if x != nil {
+ x.ack(ErrClosed)
}
- select {
- case _, _ = <-d.closeCh:
- return ErrClosed
- case err := <-d.compErrCh:
- return err
- case <-cch:
+ db.closeW.Done()
+ }()
+
+ for {
+ if db.tableNeedCompaction() {
+ select {
+ case x = <-db.tcompCmdC:
+ case <-db.tcompTriggerC:
+ case ch := <-db.tcompPauseC:
+ db.pauseCompaction(ch)
+ continue
+ case _, _ = <-db.closeC:
+ return
+ default:
+ }
+ } else {
+ for i := range ackQ {
+ ackQ[i].ack(nil)
+ ackQ[i] = nil
+ }
+ ackQ = ackQ[:0]
+ select {
+ case x = <-db.tcompCmdC:
+ case <-db.tcompTriggerC:
+ case ch := <-db.tcompPauseC:
+ db.pauseCompaction(ch)
+ continue
+ case _, _ = <-db.closeC:
+ return
+ }
}
+ if x != nil {
+ switch cmd := x.(type) {
+ case cIdle:
+ ackQ = append(ackQ, x)
+ case cRange:
+ db.tableRangeCompaction(cmd.level, cmd.min, cmd.max)
+ x.ack(nil)
+ }
+ x = nil
+ }
+ db.tableAutoCompaction()
}
- return nil
}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db_iter.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db_iter.go
index 6467291d..49c44059 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db_iter.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db_iter.go
@@ -9,8 +9,9 @@ package leveldb
import (
"errors"
"runtime"
+ "sync"
+ "sync/atomic"
- "github.com/syndtr/goleveldb/leveldb/comparer"
"github.com/syndtr/goleveldb/leveldb/iterator"
"github.com/syndtr/goleveldb/leveldb/opt"
"github.com/syndtr/goleveldb/leveldb/util"
@@ -20,46 +21,61 @@ var (
errInvalidIkey = errors.New("leveldb: Iterator: invalid internal key")
)
-func (db *DB) newRawIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator {
- s := db.s
+type memdbReleaser struct {
+ once sync.Once
+ m *memDB
+}
+func (mr *memdbReleaser) Release() {
+ mr.once.Do(func() {
+ mr.m.decref()
+ })
+}
+
+func (db *DB) newRawIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator {
em, fm := db.getMems()
- v := s.version()
+ v := db.s.version()
ti := v.getIterators(slice, ro)
n := len(ti) + 2
i := make([]iterator.Iterator, 0, n)
- i = append(i, em.NewIterator(slice))
+ emi := em.mdb.NewIterator(slice)
+ emi.SetReleaser(&memdbReleaser{m: em})
+ i = append(i, emi)
if fm != nil {
- i = append(i, fm.NewIterator(slice))
+ fmi := fm.mdb.NewIterator(slice)
+ fmi.SetReleaser(&memdbReleaser{m: fm})
+ i = append(i, fmi)
}
i = append(i, ti...)
- strict := s.o.GetStrict(opt.StrictIterator) || ro.GetStrict(opt.StrictIterator)
- mi := iterator.NewMergedIterator(i, s.cmp, strict)
+ strict := db.s.o.GetStrict(opt.StrictIterator) || ro.GetStrict(opt.StrictIterator)
+ mi := iterator.NewMergedIterator(i, db.s.icmp, strict)
mi.SetReleaser(&versionReleaser{v: v})
return mi
}
func (db *DB) newIterator(seq uint64, slice *util.Range, ro *opt.ReadOptions) *dbIter {
- var slice_ *util.Range
+ var islice *util.Range
if slice != nil {
- slice_ = &util.Range{}
+ islice = &util.Range{}
if slice.Start != nil {
- slice_.Start = newIKey(slice.Start, kMaxSeq, tSeek)
+ islice.Start = newIKey(slice.Start, kMaxSeq, tSeek)
}
if slice.Limit != nil {
- slice_.Limit = newIKey(slice.Limit, kMaxSeq, tSeek)
+ islice.Limit = newIKey(slice.Limit, kMaxSeq, tSeek)
}
}
- rawIter := db.newRawIterator(slice_, ro)
+ rawIter := db.newRawIterator(islice, ro)
iter := &dbIter{
- cmp: db.s.cmp.cmp,
+ db: db,
+ icmp: db.s.icmp,
iter: rawIter,
seq: seq,
strict: db.s.o.GetStrict(opt.StrictIterator) || ro.GetStrict(opt.StrictIterator),
key: make([]byte, 0),
value: make([]byte, 0),
}
+ atomic.AddInt32(&db.aliveIters, 1)
runtime.SetFinalizer(iter, (*dbIter).Release)
return iter
}
@@ -76,7 +92,8 @@ const (
// dbIter represent an interator states over a database session.
type dbIter struct {
- cmp comparer.BasicComparer
+ db *DB
+ icmp *iComparer
iter iterator.Iterator
seq uint64
strict bool
@@ -166,7 +183,7 @@ func (i *dbIter) next() bool {
i.key = append(i.key[:0], ukey...)
i.dir = dirForward
case tVal:
- if i.dir == dirSOI || i.cmp.Compare(ukey, i.key) > 0 {
+ if i.dir == dirSOI || i.icmp.uCompare(ukey, i.key) > 0 {
i.key = append(i.key[:0], ukey...)
i.value = append(i.value[:0], i.iter.Value()...)
i.dir = dirForward
@@ -211,7 +228,7 @@ func (i *dbIter) prev() bool {
ukey, seq, t, ok := parseIkey(i.iter.Key())
if ok {
if seq <= i.seq {
- if !del && i.cmp.Compare(ukey, i.key) < 0 {
+ if !del && i.icmp.uCompare(ukey, i.key) < 0 {
return true
}
del = (t == tDel)
@@ -252,7 +269,7 @@ func (i *dbIter) Prev() bool {
for i.iter.Prev() {
ukey, _, _, ok := parseIkey(i.iter.Key())
if ok {
- if i.cmp.Compare(ukey, i.key) < 0 {
+ if i.icmp.uCompare(ukey, i.key) < 0 {
goto cont
}
} else if i.strict {
@@ -290,6 +307,7 @@ func (i *dbIter) Release() {
if i.releaser != nil {
i.releaser.Release()
+ i.releaser = nil
}
i.dir = dirReleased
@@ -297,13 +315,19 @@ func (i *dbIter) Release() {
i.value = nil
i.iter.Release()
i.iter = nil
+ atomic.AddInt32(&i.db.aliveIters, -1)
+ i.db = nil
}
}
func (i *dbIter) SetReleaser(releaser util.Releaser) {
- if i.dir != dirReleased {
- i.releaser = releaser
+ if i.dir == dirReleased {
+ panic(util.ErrReleased)
}
+ if i.releaser != nil && releaser != nil {
+ panic(util.ErrHasReleaser)
+ }
+ i.releaser = releaser
}
func (i *dbIter) Error() error {
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db_snapshot.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db_snapshot.go
index 225b7cd5..fb1ce85b 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db_snapshot.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db_snapshot.go
@@ -9,6 +9,7 @@ package leveldb
import (
"runtime"
"sync"
+ "sync/atomic"
"github.com/syndtr/goleveldb/leveldb/iterator"
"github.com/syndtr/goleveldb/leveldb/opt"
@@ -81,18 +82,19 @@ func (db *DB) minSeq() uint64 {
type Snapshot struct {
db *DB
elem *snapshotElement
- mu sync.Mutex
+ mu sync.RWMutex
released bool
}
// Creates new snapshot object.
func (db *DB) newSnapshot() *Snapshot {
- p := &Snapshot{
+ snap := &Snapshot{
db: db,
elem: db.acquireSnapshot(),
}
- runtime.SetFinalizer(p, (*Snapshot).Release)
- return p
+ atomic.AddInt32(&db.aliveSnaps, 1)
+ runtime.SetFinalizer(snap, (*Snapshot).Release)
+ return snap
}
// Get gets the value for the given key. It returns ErrNotFound if
@@ -100,19 +102,18 @@ func (db *DB) newSnapshot() *Snapshot {
//
// The caller should not modify the contents of the returned slice, but
// it is safe to modify the contents of the argument after Get returns.
-func (p *Snapshot) Get(key []byte, ro *opt.ReadOptions) (value []byte, err error) {
- db := p.db
- err = db.ok()
+func (snap *Snapshot) Get(key []byte, ro *opt.ReadOptions) (value []byte, err error) {
+ err = snap.db.ok()
if err != nil {
return
}
- p.mu.Lock()
- defer p.mu.Unlock()
- if p.released {
+ snap.mu.RLock()
+ defer snap.mu.RUnlock()
+ if snap.released {
err = ErrSnapshotReleased
return
}
- return db.get(key, p.elem.seq, ro)
+ return snap.db.get(key, snap.elem.seq, ro)
}
// NewIterator returns an iterator for the snapshot of the uderlying DB.
@@ -132,17 +133,18 @@ func (p *Snapshot) Get(key []byte, ro *opt.ReadOptions) (value []byte, err error
// iterator would be still valid until released.
//
// Also read Iterator documentation of the leveldb/iterator package.
-func (p *Snapshot) NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator {
- db := p.db
- if err := db.ok(); err != nil {
+func (snap *Snapshot) NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator {
+ if err := snap.db.ok(); err != nil {
return iterator.NewEmptyIterator(err)
}
- p.mu.Lock()
- defer p.mu.Unlock()
- if p.released {
+ snap.mu.Lock()
+ defer snap.mu.Unlock()
+ if snap.released {
return iterator.NewEmptyIterator(ErrSnapshotReleased)
}
- return db.newIterator(p.elem.seq, slice, ro)
+ // Since iterator already hold version ref, it doesn't need to
+ // hold snapshot ref.
+ return snap.db.newIterator(snap.elem.seq, slice, ro)
}
// Release releases the snapshot. This will not release any returned
@@ -150,16 +152,18 @@ func (p *Snapshot) NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.
// underlying DB is closed.
//
// Other methods should not be called after the snapshot has been released.
-func (p *Snapshot) Release() {
- p.mu.Lock()
- if !p.released {
- // Clear the finalizer.
- runtime.SetFinalizer(p, nil)
+func (snap *Snapshot) Release() {
+ snap.mu.Lock()
+ defer snap.mu.Unlock()
- p.released = true
- p.db.releaseSnapshot(p.elem)
- p.db = nil
- p.elem = nil
+ if !snap.released {
+ // Clear the finalizer.
+ runtime.SetFinalizer(snap, nil)
+
+ snap.released = true
+ snap.db.releaseSnapshot(snap.elem)
+ atomic.AddInt32(&snap.db.aliveSnaps, -1)
+ snap.db = nil
+ snap.elem = nil
}
- p.mu.Unlock()
}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db_state.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db_state.go
index d662056f..24ecab50 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db_state.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db_state.go
@@ -8,106 +8,194 @@ package leveldb
import (
"sync/atomic"
+ "time"
"github.com/syndtr/goleveldb/leveldb/journal"
"github.com/syndtr/goleveldb/leveldb/memdb"
)
+type memDB struct {
+ db *DB
+ mdb *memdb.DB
+ ref int32
+}
+
+func (m *memDB) incref() {
+ atomic.AddInt32(&m.ref, 1)
+}
+
+func (m *memDB) decref() {
+ if ref := atomic.AddInt32(&m.ref, -1); ref == 0 {
+ // Only put back memdb with std capacity.
+ if m.mdb.Capacity() == m.db.s.o.GetWriteBuffer() {
+ m.mdb.Reset()
+ m.db.mpoolPut(m.mdb)
+ }
+ m.db = nil
+ m.mdb = nil
+ } else if ref < 0 {
+ panic("negative memdb ref")
+ }
+}
+
// Get latest sequence number.
-func (d *DB) getSeq() uint64 {
- return atomic.LoadUint64(&d.seq)
+func (db *DB) getSeq() uint64 {
+ return atomic.LoadUint64(&db.seq)
}
// Atomically adds delta to seq.
-func (d *DB) addSeq(delta uint64) {
- atomic.AddUint64(&d.seq, delta)
+func (db *DB) addSeq(delta uint64) {
+ atomic.AddUint64(&db.seq, delta)
+}
+
+func (db *DB) mpoolPut(mem *memdb.DB) {
+ defer func() {
+ recover()
+ }()
+ select {
+ case db.memPool <- mem:
+ default:
+ }
+}
+
+func (db *DB) mpoolGet() *memdb.DB {
+ select {
+ case mem := <-db.memPool:
+ return mem
+ default:
+ return nil
+ }
+}
+
+func (db *DB) mpoolDrain() {
+ ticker := time.NewTicker(30 * time.Second)
+ for {
+ select {
+ case <-ticker.C:
+ select {
+ case <-db.memPool:
+ default:
+ }
+ case _, _ = <-db.closeC:
+ close(db.memPool)
+ return
+ }
+ }
}
// Create new memdb and froze the old one; need external synchronization.
// newMem only called synchronously by the writer.
-func (d *DB) newMem(n int) (mem *memdb.DB, err error) {
- s := d.s
-
- num := s.allocFileNum()
- file := s.getJournalFile(num)
+func (db *DB) newMem(n int) (mem *memDB, err error) {
+ num := db.s.allocFileNum()
+ file := db.s.getJournalFile(num)
w, err := file.Create()
if err != nil {
- s.reuseFileNum(num)
+ db.s.reuseFileNum(num)
return
}
- d.memMu.Lock()
- if d.journal == nil {
- d.journal = journal.NewWriter(w)
- } else {
- d.journal.Reset(w)
- d.journalWriter.Close()
- d.frozenJournalFile = d.journalFile
+
+ db.memMu.Lock()
+ defer db.memMu.Unlock()
+
+ if db.frozenMem != nil {
+ panic("still has frozen mem")
}
- d.journalWriter = w
- d.journalFile = file
- d.frozenMem = d.mem
- d.mem = memdb.New(s.cmp, maxInt(d.s.o.GetWriteBuffer(), n))
- mem = d.mem
- // The seq only incremented by the writer.
- d.frozenSeq = d.seq
- d.memMu.Unlock()
+
+ if db.journal == nil {
+ db.journal = journal.NewWriter(w)
+ } else {
+ db.journal.Reset(w)
+ db.journalWriter.Close()
+ db.frozenJournalFile = db.journalFile
+ }
+ db.journalWriter = w
+ db.journalFile = file
+ db.frozenMem = db.mem
+ mdb := db.mpoolGet()
+ if mdb == nil || mdb.Capacity() < n {
+ mdb = memdb.New(db.s.icmp, maxInt(db.s.o.GetWriteBuffer(), n))
+ }
+ mem = &memDB{
+ db: db,
+ mdb: mdb,
+ ref: 2,
+ }
+ db.mem = mem
+ // The seq only incremented by the writer. And whoever called newMem
+ // should hold write lock, so no need additional synchronization here.
+ db.frozenSeq = db.seq
return
}
// Get all memdbs.
-func (d *DB) getMems() (e *memdb.DB, f *memdb.DB) {
- d.memMu.RLock()
- defer d.memMu.RUnlock()
- return d.mem, d.frozenMem
+func (db *DB) getMems() (e, f *memDB) {
+ db.memMu.RLock()
+ defer db.memMu.RUnlock()
+ if db.mem == nil {
+ panic("nil effective mem")
+ }
+ db.mem.incref()
+ if db.frozenMem != nil {
+ db.frozenMem.incref()
+ }
+ return db.mem, db.frozenMem
}
// Get frozen memdb.
-func (d *DB) getEffectiveMem() *memdb.DB {
- d.memMu.RLock()
- defer d.memMu.RUnlock()
- return d.mem
+func (db *DB) getEffectiveMem() *memDB {
+ db.memMu.RLock()
+ defer db.memMu.RUnlock()
+ if db.mem == nil {
+ panic("nil effective mem")
+ }
+ db.mem.incref()
+ return db.mem
}
// Check whether we has frozen memdb.
-func (d *DB) hasFrozenMem() bool {
- d.memMu.RLock()
- defer d.memMu.RUnlock()
- return d.frozenMem != nil
+func (db *DB) hasFrozenMem() bool {
+ db.memMu.RLock()
+ defer db.memMu.RUnlock()
+ return db.frozenMem != nil
}
// Get frozen memdb.
-func (d *DB) getFrozenMem() *memdb.DB {
- d.memMu.RLock()
- defer d.memMu.RUnlock()
- return d.frozenMem
+func (db *DB) getFrozenMem() *memDB {
+ db.memMu.RLock()
+ defer db.memMu.RUnlock()
+ if db.frozenMem != nil {
+ db.frozenMem.incref()
+ }
+ return db.frozenMem
}
// Drop frozen memdb; assume that frozen memdb isn't nil.
-func (d *DB) dropFrozenMem() {
- d.memMu.Lock()
- if err := d.frozenJournalFile.Remove(); err != nil {
- d.s.logf("journal@remove removing @%d %q", d.frozenJournalFile.Num(), err)
+func (db *DB) dropFrozenMem() {
+ db.memMu.Lock()
+ if err := db.frozenJournalFile.Remove(); err != nil {
+ db.logf("journal@remove removing @%d %q", db.frozenJournalFile.Num(), err)
} else {
- d.s.logf("journal@remove removed @%d", d.frozenJournalFile.Num())
+ db.logf("journal@remove removed @%d", db.frozenJournalFile.Num())
}
- d.frozenJournalFile = nil
- d.frozenMem = nil
- d.memMu.Unlock()
+ db.frozenJournalFile = nil
+ db.frozenMem.decref()
+ db.frozenMem = nil
+ db.memMu.Unlock()
}
// Set closed flag; return true if not already closed.
-func (d *DB) setClosed() bool {
- return atomic.CompareAndSwapUint32(&d.closed, 0, 1)
+func (db *DB) setClosed() bool {
+ return atomic.CompareAndSwapUint32(&db.closed, 0, 1)
}
// Check whether DB was closed.
-func (d *DB) isClosed() bool {
- return atomic.LoadUint32(&d.closed) != 0
+func (db *DB) isClosed() bool {
+ return atomic.LoadUint32(&db.closed) != 0
}
// Check read ok status.
-func (d *DB) ok() error {
- if d.isClosed() {
+func (db *DB) ok() error {
+ if db.isClosed() {
return ErrClosed
}
return nil
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db_test.go
index 58d1415b..b7190681 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db_test.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db_test.go
@@ -124,13 +124,15 @@ func (h *dbHarness) openAssert(want bool) {
}
}
-func (h *dbHarness) put(key, value string) {
- t := h.t
- db := h.db
+func (h *dbHarness) write(batch *Batch) {
+ if err := h.db.Write(batch, h.wo); err != nil {
+ h.t.Error("Write: got error: ", err)
+ }
+}
- err := db.Put([]byte(key), []byte(value), h.wo)
- if err != nil {
- t.Error("Put: got error: ", err)
+func (h *dbHarness) put(key, value string) {
+ if err := h.db.Put([]byte(key), []byte(value), h.wo); err != nil {
+ h.t.Error("Put: got error: ", err)
}
}
@@ -147,15 +149,12 @@ func (h *dbHarness) maxNextLevelOverlappingBytes(want uint64) {
db := h.db
var res uint64
- ucmp := db.s.cmp.cmp
v := db.s.version()
for i, tt := range v.tables[1 : len(v.tables)-1] {
level := i + 1
next := v.tables[level+1]
for _, t := range tt {
- var r tFiles
- min, max := t.min.ukey(), t.max.ukey()
- next.getOverlaps(min, max, &r, true, ucmp)
+ r := next.getOverlaps(nil, db.s.icmp, t.imin.ukey(), t.imax.ukey(), false)
sum := r.size()
if sum > res {
res = sum
@@ -179,6 +178,21 @@ func (h *dbHarness) delete(key string) {
}
}
+func (h *dbHarness) assertNumKeys(want int) {
+ iter := h.db.NewIterator(nil, h.ro)
+ defer iter.Release()
+ got := 0
+ for iter.Next() {
+ got++
+ }
+ if err := iter.Error(); err != nil {
+ h.t.Error("assertNumKeys: ", err)
+ }
+ if want != got {
+ h.t.Errorf("assertNumKeys: want=%d got=%d", want, got)
+ }
+}
+
func (h *dbHarness) getr(db Reader, key string, expectFound bool) (found bool, v []byte) {
t := h.t
v, err := db.Get([]byte(key), h.ro)
@@ -221,7 +235,7 @@ func (h *dbHarness) getVal(key, value string) {
func (h *dbHarness) allEntriesFor(key, want string) {
t := h.t
db := h.db
- ucmp := db.s.cmp.cmp
+ s := db.s
ikey := newIKey([]byte(key), kMaxSeq, tVal)
iter := db.newRawIterator(nil, nil)
@@ -234,7 +248,7 @@ func (h *dbHarness) allEntriesFor(key, want string) {
for iter.Valid() {
rkey := iKey(iter.Key())
if _, t, ok := rkey.parseNum(); ok {
- if ucmp.Compare(ikey.ukey(), rkey.ukey()) != 0 {
+ if s.icmp.uCompare(ikey.ukey(), rkey.ukey()) != 0 {
break
}
if !first {
@@ -291,7 +305,16 @@ func (h *dbHarness) getKeyVal(want string) {
func (h *dbHarness) waitCompaction() {
t := h.t
db := h.db
- if err := db.wakeCompaction(2); err != nil {
+ if err := db.compSendIdle(db.tcompCmdC); err != nil {
+ t.Error("compaction error: ", err)
+ }
+}
+
+func (h *dbHarness) waitMemCompaction() {
+ t := h.t
+ db := h.db
+
+ if err := db.compSendIdle(db.mcompCmdC); err != nil {
t.Error("compaction error: ", err)
}
}
@@ -300,41 +323,15 @@ func (h *dbHarness) compactMem() {
t := h.t
db := h.db
- if err := db.wakeCompaction(1); err != nil {
+ db.writeLockC <- struct{}{}
+ defer func() {
+ <-db.writeLockC
+ }()
+
+ if _, err := db.rotateMem(0); err != nil {
t.Error("compaction error: ", err)
- return
}
-
- if mem := db.getEffectiveMem(); mem.Len() == 0 {
- return
- }
-
- select {
- case <-db.compMemAckCh:
- case err := <-db.compErrCh:
- t.Error("compaction error: ", err)
- return
- }
-
- // create new memdb and journal
- _, err := db.newMem(0)
- if err != nil {
- t.Error("newMem: got error: ", err)
- return
- }
-
- cch := make(chan struct{})
- // Schedule mem compaction.
- select {
- case db.compMemCh <- (chan<- struct{})(cch):
- case err := <-db.compErrCh:
- t.Error("compaction error: ", err)
- return
- }
- // Wait.
- select {
- case <-cch:
- case err := <-db.compErrCh:
+ if err := db.compSendIdle(db.mcompCmdC); err != nil {
t.Error("compaction error: ", err)
}
@@ -347,35 +344,22 @@ func (h *dbHarness) compactRangeAtErr(level int, min, max string, wanterr bool)
t := h.t
db := h.db
- cch := make(chan struct{})
- req := &cReq{level: level, cch: cch}
+ var _min, _max []byte
if min != "" {
- req.min = []byte(min)
+ _min = []byte(min)
}
if max != "" {
- req.max = []byte(max)
+ _max = []byte(max)
}
- // Push manual compaction request.
- select {
- case err := <-db.compErrCh:
- t.Error("CompactRangeAt: compaction error: ", err)
- return
- case db.compReqCh <- req:
- }
-
- // Wait for compaction
- select {
- case err := <-db.compErrCh:
+ if err := db.compSendRange(db.tcompCmdC, level, _min, _max); err != nil {
if wanterr {
t.Log("CompactRangeAt: got error (expected): ", err)
} else {
t.Error("CompactRangeAt: got error: ", err)
}
- case <-cch:
- if wanterr {
- t.Error("CompactRangeAt: expect error")
- }
+ } else if wanterr {
+ t.Error("CompactRangeAt: expect error")
}
}
@@ -394,8 +378,7 @@ func (h *dbHarness) compactRange(min, max string) {
if max != "" {
r.Limit = []byte(max)
}
- err := db.CompactRange(r)
- if err != nil {
+ if err := db.CompactRange(r); err != nil {
t.Error("CompactRange: got error: ", err)
}
}
@@ -404,11 +387,11 @@ func (h *dbHarness) sizeAssert(start, limit string, low, hi uint64) {
t := h.t
db := h.db
- s, err := db.GetApproximateSizes([]util.Range{
+ s, err := db.SizeOf([]util.Range{
{[]byte(start), []byte(limit)},
})
if err != nil {
- t.Error("GetApproximateSizes: got error: ", err)
+ t.Error("SizeOf: got error: ", err)
}
if s.Sum() < low || s.Sum() > hi {
t.Errorf("sizeof %q to %q not in range, want %d - %d, got %d",
@@ -1008,6 +991,7 @@ func TestDb_SparseMerge(t *testing.T) {
h.put("C", "vc")
h.compactMem()
h.compactRangeAt(0, "", "")
+ h.waitCompaction()
// Make sparse update
h.put("A", "va2")
@@ -1017,12 +1001,14 @@ func TestDb_SparseMerge(t *testing.T) {
h.maxNextLevelOverlappingBytes(20 * 1048576)
h.compactRangeAt(0, "", "")
+ h.waitCompaction()
h.maxNextLevelOverlappingBytes(20 * 1048576)
h.compactRangeAt(1, "", "")
+ h.waitCompaction()
h.maxNextLevelOverlappingBytes(20 * 1048576)
}
-func TestDb_ApproximateSizes(t *testing.T) {
+func TestDb_SizeOf(t *testing.T) {
h := newDbHarnessWopt(t, &opt.Options{
Compression: opt.NoCompression,
WriteBuffer: 10000000,
@@ -1042,7 +1028,7 @@ func TestDb_ApproximateSizes(t *testing.T) {
h.put(numKey(i), strings.Repeat(fmt.Sprintf("v%09d", i), s1/10))
}
- // 0 because GetApproximateSizes() does not account for memtable space
+ // 0 because SizeOf() does not account for memtable space
h.sizeAssert("", numKey(50), 0, 0)
for r := 0; r < 3; r++ {
@@ -1072,7 +1058,7 @@ func TestDb_ApproximateSizes(t *testing.T) {
}
}
-func TestDb_ApproximateSizes_MixOfSmallAndLarge(t *testing.T) {
+func TestDb_SizeOf_MixOfSmallAndLarge(t *testing.T) {
h := newDbHarnessWopt(t, &opt.Options{Compression: opt.NoCompression})
defer h.close()
@@ -1224,7 +1210,7 @@ func TestDb_DeletionMarkers2(t *testing.T) {
}
func TestDb_CompactionTableOpenError(t *testing.T) {
- h := newDbHarnessWopt(t, &opt.Options{MaxOpenFiles: 0})
+ h := newDbHarnessWopt(t, &opt.Options{CachedOpenFiles: -1})
defer h.close()
im := 10
@@ -1244,7 +1230,7 @@ func TestDb_CompactionTableOpenError(t *testing.T) {
h.stor.SetOpenErr(storage.TypeTable)
go h.db.CompactRange(util.Range{})
- if err := h.db.wakeCompaction(2); err != nil {
+ if err := h.db.compSendIdle(h.db.tcompCmdC); err != nil {
t.Log("compaction error: ", err)
}
h.closeDB0()
@@ -1486,7 +1472,7 @@ func TestDb_ClosedIsClosed(t *testing.T) {
_, err = db.GetProperty("leveldb.stats")
assertErr(t, err, true)
- _, err = db.GetApproximateSizes([]util.Range{{[]byte("a"), []byte("z")}})
+ _, err = db.SizeOf([]util.Range{{[]byte("a"), []byte("z")}})
assertErr(t, err, true)
assertErr(t, db.CompactRange(util.Range{}), true)
@@ -1591,7 +1577,7 @@ func TestDb_BloomFilter(t *testing.T) {
return fmt.Sprintf("key%06d", i)
}
- n := 10000
+ const n = 10000
// Populate multiple layers
for i := 0; i < n; i++ {
@@ -1828,3 +1814,73 @@ func TestDb_DeletionMarkersOnMemdb(t *testing.T) {
h.get("foo", false)
h.getKeyVal("")
}
+
+func TestDb_LeveldbIssue178(t *testing.T) {
+ nKeys := (kMaxTableSize / 30) * 5
+ key1 := func(i int) string {
+ return fmt.Sprintf("my_key_%d", i)
+ }
+ key2 := func(i int) string {
+ return fmt.Sprintf("my_key_%d_xxx", i)
+ }
+
+ // Disable compression since it affects the creation of layers and the
+ // code below is trying to test against a very specific scenario.
+ h := newDbHarnessWopt(t, &opt.Options{Compression: opt.NoCompression})
+ defer h.close()
+
+ // Create first key range.
+ batch := new(Batch)
+ for i := 0; i < nKeys; i++ {
+ batch.Put([]byte(key1(i)), []byte("value for range 1 key"))
+ }
+ h.write(batch)
+
+ // Create second key range.
+ batch.Reset()
+ for i := 0; i < nKeys; i++ {
+ batch.Put([]byte(key2(i)), []byte("value for range 2 key"))
+ }
+ h.write(batch)
+
+ // Delete second key range.
+ batch.Reset()
+ for i := 0; i < nKeys; i++ {
+ batch.Delete([]byte(key2(i)))
+ }
+ h.write(batch)
+ h.waitMemCompaction()
+
+ // Run manual compaction.
+ h.compactRange(key1(0), key1(nKeys-1))
+
+ // Checking the keys.
+ h.assertNumKeys(nKeys)
+}
+
+func TestDb_LeveldbIssue200(t *testing.T) {
+ h := newDbHarness(t)
+ defer h.close()
+
+ h.put("1", "b")
+ h.put("2", "c")
+ h.put("3", "d")
+ h.put("4", "e")
+ h.put("5", "f")
+
+ iter := h.db.NewIterator(nil, h.ro)
+
+ // Add an element that should not be reflected in the iterator.
+ h.put("25", "cd")
+
+ iter.Seek([]byte("5"))
+ assertBytes(t, []byte("5"), iter.Key())
+ iter.Prev()
+ assertBytes(t, []byte("4"), iter.Key())
+ iter.Prev()
+ assertBytes(t, []byte("3"), iter.Key())
+ iter.Next()
+ assertBytes(t, []byte("4"), iter.Key())
+ iter.Next()
+ assertBytes(t, []byte("5"), iter.Key())
+}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db_util.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db_util.go
index 0fbd66df..4f6b792d 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db_util.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db_util.go
@@ -7,6 +7,8 @@
package leveldb
import (
+ "errors"
+
"github.com/syndtr/goleveldb/leveldb/iterator"
"github.com/syndtr/goleveldb/leveldb/opt"
"github.com/syndtr/goleveldb/leveldb/storage"
@@ -30,45 +32,63 @@ func (p Sizes) Sum() (n uint64) {
return n
}
-// Remove unused files.
-func (d *DB) cleanFiles() error {
- s := d.s
+// Logging.
+func (db *DB) log(v ...interface{}) { db.s.log(v...) }
+func (db *DB) logf(format string, v ...interface{}) { db.s.logf(format, v...) }
- v := s.version_NB()
- tables := make(map[uint64]struct{})
- for _, tt := range v.tables {
- for _, t := range tt {
- tables[t.file.Num()] = struct{}{}
+// Check and clean files.
+func (db *DB) checkAndCleanFiles() error {
+ v := db.s.version_NB()
+ tablesMap := make(map[uint64]bool)
+ for _, tables := range v.tables {
+ for _, t := range tables {
+ tablesMap[t.file.Num()] = false
}
}
- ff, err := s.getFiles(storage.TypeAll)
+ files, err := db.s.getFiles(storage.TypeAll)
if err != nil {
return err
}
+
+ var nTables int
var rem []storage.File
- for _, f := range ff {
+ for _, f := range files {
keep := true
switch f.Type() {
case storage.TypeManifest:
- keep = f.Num() >= s.manifestFile.Num()
+ keep = f.Num() >= db.s.manifestFile.Num()
case storage.TypeJournal:
- if d.frozenJournalFile != nil {
- keep = f.Num() >= d.frozenJournalFile.Num()
+ if db.frozenJournalFile != nil {
+ keep = f.Num() >= db.frozenJournalFile.Num()
} else {
- keep = f.Num() >= d.journalFile.Num()
+ keep = f.Num() >= db.journalFile.Num()
}
case storage.TypeTable:
- _, keep = tables[f.Num()]
+ _, keep = tablesMap[f.Num()]
+ if keep {
+ tablesMap[f.Num()] = true
+ nTables++
+ }
}
if !keep {
rem = append(rem, f)
}
}
- s.logf("db@janitor F·%d G·%d", len(ff), len(rem))
+
+ if nTables != len(tablesMap) {
+ for num, present := range tablesMap {
+ if !present {
+ db.logf("db@janitor table missing @%d", num)
+ }
+ }
+ return ErrCorrupted{Type: MissingFiles, Err: errors.New("leveldb: table files missing")}
+ }
+
+ db.logf("db@janitor F·%d G·%d", len(files), len(rem))
for _, f := range rem {
- s.logf("db@janitor removing %s-%d", f.Type(), f.Num())
+ db.logf("db@janitor removing %s-%d", f.Type(), f.Num())
if err := f.Remove(); err != nil {
return err
}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db_write.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db_write.go
index 5cd13f43..82725a9e 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db_write.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/db_write.go
@@ -11,48 +11,71 @@ import (
"github.com/syndtr/goleveldb/leveldb/memdb"
"github.com/syndtr/goleveldb/leveldb/opt"
+ "github.com/syndtr/goleveldb/leveldb/util"
)
-func (d *DB) doWriteJournal(b *Batch) error {
- w, err := d.journal.Next()
+func (db *DB) writeJournal(b *Batch) error {
+ w, err := db.journal.Next()
if err != nil {
return err
}
if _, err := w.Write(b.encode()); err != nil {
return err
}
- if err := d.journal.Flush(); err != nil {
+ if err := db.journal.Flush(); err != nil {
return err
}
if b.sync {
- return d.journalWriter.Sync()
+ return db.journalWriter.Sync()
}
return nil
}
-func (d *DB) writeJournal() {
- defer d.closeWg.Done()
+func (db *DB) jWriter() {
+ defer db.closeW.Done()
for {
select {
- case _, _ = <-d.closeCh:
- return
- case b := <-d.journalCh:
+ case b := <-db.journalC:
if b != nil {
- d.journalAckCh <- d.doWriteJournal(b)
+ db.journalAckC <- db.writeJournal(b)
}
+ case _, _ = <-db.closeC:
+ return
}
}
}
-func (d *DB) flush(n int) (mem *memdb.DB, nn int, err error) {
- s := d.s
+func (db *DB) rotateMem(n int) (mem *memDB, err error) {
+ // Wait for pending memdb compaction.
+ err = db.compSendIdle(db.mcompCmdC)
+ if err != nil {
+ return
+ }
+ // Create new memdb and journal.
+ mem, err = db.newMem(n)
+ if err != nil {
+ return
+ }
+
+ // Schedule memdb compaction.
+ db.compTrigger(db.mcompTriggerC)
+ return
+}
+
+func (db *DB) flush(n int) (mem *memDB, nn int, err error) {
delayed := false
- flush := func() bool {
- v := s.version()
+ flush := func() (retry bool) {
+ v := db.s.version()
defer v.release()
- mem = d.getEffectiveMem()
- nn = mem.Free()
+ mem = db.getEffectiveMem()
+ defer func() {
+ if retry {
+ mem.decref()
+ mem = nil
+ }
+ }()
+ nn = mem.mdb.Free()
switch {
case v.tLen(0) >= kL0_SlowdownWritesTrigger && !delayed:
delayed = true
@@ -61,33 +84,23 @@ func (d *DB) flush(n int) (mem *memdb.DB, nn int, err error) {
return false
case v.tLen(0) >= kL0_StopWritesTrigger:
delayed = true
- err = d.wakeCompaction(2)
+ err = db.compSendIdle(db.tcompCmdC)
if err != nil {
return false
}
default:
// Allow memdb to grow if it has no entry.
- if mem.Len() == 0 {
+ if mem.mdb.Len() == 0 {
nn = n
- return false
+ } else {
+ mem.decref()
+ mem, err = db.rotateMem(n)
+ if err == nil {
+ nn = mem.mdb.Free()
+ } else {
+ nn = 0
+ }
}
- // Wait for pending memdb compaction.
- select {
- case _, _ = <-d.closeCh:
- err = ErrClosed
- return false
- case <-d.compMemAckCh:
- case err = <-d.compErrCh:
- return false
- }
- // Create new memdb and journal.
- mem, err = d.newMem(n)
- if err != nil {
- return false
- }
-
- // Schedule memdb compaction.
- d.compMemCh <- nil
return false
}
return true
@@ -96,7 +109,7 @@ func (d *DB) flush(n int) (mem *memdb.DB, nn int, err error) {
for flush() {
}
if delayed {
- s.logf("db@write delayed T·%v", time.Since(start))
+ db.logf("db@write delayed T·%v", time.Since(start))
}
return
}
@@ -105,8 +118,8 @@ func (d *DB) flush(n int) (mem *memdb.DB, nn int, err error) {
// sequentially.
//
// It is safe to modify the contents of the arguments after Write returns.
-func (d *DB) Write(b *Batch, wo *opt.WriteOptions) (err error) {
- err = d.ok()
+func (db *DB) Write(b *Batch, wo *opt.WriteOptions) (err error) {
+ err = db.ok()
if err != nil || b == nil || b.len() == 0 {
return
}
@@ -116,28 +129,29 @@ func (d *DB) Write(b *Batch, wo *opt.WriteOptions) (err error) {
// The write happen synchronously.
retry:
select {
- case _, _ = <-d.closeCh:
- return ErrClosed
- case d.writeCh <- b:
- if <-d.writeMergedCh {
- return <-d.writeAckCh
+ case db.writeC <- b:
+ if <-db.writeMergedC {
+ return <-db.writeAckC
}
goto retry
- case d.writeLockCh <- struct{}{}:
+ case db.writeLockC <- struct{}{}:
+ case _, _ = <-db.closeC:
+ return ErrClosed
}
merged := 0
defer func() {
- <-d.writeLockCh
+ <-db.writeLockC
for i := 0; i < merged; i++ {
- d.writeAckCh <- err
+ db.writeAckC <- err
}
}()
- mem, memFree, err := d.flush(b.size())
+ mem, memFree, err := db.flush(b.size())
if err != nil {
return
}
+ defer mem.decref()
// Calculate maximum size of the batch.
m := 1 << 20
@@ -150,13 +164,13 @@ retry:
drain:
for b.size() < m && !b.sync {
select {
- case nb := <-d.writeCh:
+ case nb := <-db.writeC:
if b.size()+nb.size() <= m {
b.append(nb)
- d.writeMergedCh <- true
+ db.writeMergedC <- true
merged++
} else {
- d.writeMergedCh <- false
+ db.writeMergedC <- false
break drain
}
default:
@@ -165,41 +179,45 @@ drain:
}
// Set batch first seq number relative from last seq.
- b.seq = d.seq + 1
+ b.seq = db.seq + 1
// Write journal concurrently if it is large enough.
if b.size() >= (128 << 10) {
// Push the write batch to the journal writer
select {
- case _, _ = <-d.closeCh:
+ case _, _ = <-db.closeC:
err = ErrClosed
return
- case d.journalCh <- b:
+ case db.journalC <- b:
// Write into memdb
- b.memReplay(mem)
+ b.memReplay(mem.mdb)
}
// Wait for journal writer
select {
- case _, _ = <-d.closeCh:
+ case _, _ = <-db.closeC:
err = ErrClosed
return
- case err = <-d.journalAckCh:
+ case err = <-db.journalAckC:
if err != nil {
// Revert memdb if error detected
- b.revertMemReplay(mem)
+ b.revertMemReplay(mem.mdb)
return
}
}
} else {
- err = d.doWriteJournal(b)
+ err = db.writeJournal(b)
if err != nil {
return
}
- b.memReplay(mem)
+ b.memReplay(mem.mdb)
}
// Set last seq number.
- d.addSeq(uint64(b.len()))
+ db.addSeq(uint64(b.len()))
+
+ if b.size() >= memFree {
+ db.rotateMem(0)
+ }
return
}
@@ -207,18 +225,66 @@ drain:
// for that key; a DB is not a multi-map.
//
// It is safe to modify the contents of the arguments after Put returns.
-func (d *DB) Put(key, value []byte, wo *opt.WriteOptions) error {
+func (db *DB) Put(key, value []byte, wo *opt.WriteOptions) error {
b := new(Batch)
b.Put(key, value)
- return d.Write(b, wo)
+ return db.Write(b, wo)
}
// Delete deletes the value for the given key. It returns ErrNotFound if
// the DB does not contain the key.
//
// It is safe to modify the contents of the arguments after Delete returns.
-func (d *DB) Delete(key []byte, wo *opt.WriteOptions) error {
+func (db *DB) Delete(key []byte, wo *opt.WriteOptions) error {
b := new(Batch)
b.Delete(key)
- return d.Write(b, wo)
+ return db.Write(b, wo)
+}
+
+func isMemOverlaps(icmp *iComparer, mem *memdb.DB, min, max []byte) bool {
+ iter := mem.NewIterator(nil)
+ defer iter.Release()
+ return (max == nil || (iter.First() && icmp.uCompare(max, iKey(iter.Key()).ukey()) >= 0)) &&
+ (min == nil || (iter.Last() && icmp.uCompare(min, iKey(iter.Key()).ukey()) <= 0))
+}
+
+// CompactRange compacts the underlying DB for the given key range.
+// In particular, deleted and overwritten versions are discarded,
+// and the data is rearranged to reduce the cost of operations
+// needed to access the data. This operation should typically only
+// be invoked by users who understand the underlying implementation.
+//
+// A nil Range.Start is treated as a key before all keys in the DB.
+// And a nil Range.Limit is treated as a key after all keys in the DB.
+// Therefore if both is nil then it will compact entire DB.
+func (db *DB) CompactRange(r util.Range) error {
+ if err := db.ok(); err != nil {
+ return err
+ }
+
+ select {
+ case db.writeLockC <- struct{}{}:
+ case _, _ = <-db.closeC:
+ return ErrClosed
+ }
+
+ // Check for overlaps in memdb.
+ mem := db.getEffectiveMem()
+ defer mem.decref()
+ if isMemOverlaps(db.s.icmp, mem.mdb, r.Start, r.Limit) {
+ // Memdb compaction.
+ if _, err := db.rotateMem(0); err != nil {
+ <-db.writeLockC
+ return err
+ }
+ <-db.writeLockC
+ if err := db.compSendIdle(db.mcompCmdC); err != nil {
+ return err
+ }
+ } else {
+ <-db.writeLockC
+ }
+
+ // Table compaction.
+ return db.compSendRange(db.tcompCmdC, -1, r.Start, r.Limit)
}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/doc.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/doc.go
index ac9ea3d0..53f13bb2 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/doc.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/doc.go
@@ -37,6 +37,16 @@
// err = iter.Error()
// ...
//
+// Iterate over subset of database content with a particular prefix:
+// iter := db.NewIterator(util.BytesPrefix([]byte("foo-")), nil)
+// for iter.Next() {
+// // Use key/value.
+// ...
+// }
+// iter.Release()
+// err = iter.Error()
+// ...
+//
// Seek-then-Iterate:
//
// iter := db.NewIterator(nil, nil)
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/error.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/error.go
new file mode 100644
index 00000000..8066bd9a
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/error.go
@@ -0,0 +1,38 @@
+// Copyright (c) 2014, Suryandaru Triandana
+// All rights reserved.
+//
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package leveldb
+
+import (
+ "errors"
+
+ "github.com/syndtr/goleveldb/leveldb/util"
+)
+
+var (
+ ErrNotFound = util.ErrNotFound
+ ErrSnapshotReleased = errors.New("leveldb: snapshot released")
+ ErrIterReleased = errors.New("leveldb: iterator released")
+ ErrClosed = errors.New("leveldb: closed")
+)
+
+type CorruptionType int
+
+const (
+ CorruptedManifest CorruptionType = iota
+ MissingFiles
+)
+
+// ErrCorrupted is the type that wraps errors that indicate corruption in
+// the database.
+type ErrCorrupted struct {
+ Type CorruptionType
+ Err error
+}
+
+func (e ErrCorrupted) Error() string {
+ return e.Err.Error()
+}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/external_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/external_test.go
index d7dff04b..cedee793 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/external_test.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/external_test.go
@@ -21,7 +21,7 @@ var _ = testutil.Defer(func() {
BlockRestartInterval: 5,
BlockSize: 50,
Compression: opt.NoCompression,
- MaxOpenFiles: 0,
+ CachedOpenFiles: -1,
Strict: opt.StrictAll,
WriteBuffer: 1000,
}
@@ -36,22 +36,21 @@ var _ = testutil.Defer(func() {
testutil.DoDBTesting(&t)
db.TestClose()
done <- true
- }, 9.0)
+ }, 20.0)
})
Describe("read test", func() {
- testutil.AllKeyValueTesting(nil, func(kv testutil.KeyValue) testutil.DB {
+ testutil.AllKeyValueTesting(nil, nil, func(kv testutil.KeyValue) testutil.DB {
// Building the DB.
db := newTestingDB(o, nil, nil)
kv.IterateShuffled(nil, func(i int, key, value []byte) {
err := db.TestPut(key, value)
Expect(err).NotTo(HaveOccurred())
})
- testutil.Defer("teardown", func() {
- db.TestClose()
- })
return db
+ }, func(db testutil.DB) {
+ db.(*testingDB).TestClose()
})
})
})
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/go13_bench_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/go13_bench_test.go
new file mode 100644
index 00000000..e76657e5
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/go13_bench_test.go
@@ -0,0 +1,58 @@
+// Copyright (c) 2012, Suryandaru Triandana
+// All rights reserved.
+//
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// +build go1.3
+
+package leveldb
+
+import (
+ "sync/atomic"
+ "testing"
+)
+
+func BenchmarkDBReadConcurrent(b *testing.B) {
+ p := openDBBench(b, false)
+ p.populate(b.N)
+ p.fill()
+ p.gc()
+ defer p.close()
+
+ b.ResetTimer()
+ b.SetBytes(116)
+
+ b.RunParallel(func(pb *testing.PB) {
+ iter := p.newIter()
+ defer iter.Release()
+ for pb.Next() && iter.Next() {
+ }
+ })
+}
+
+func BenchmarkDBReadConcurrent2(b *testing.B) {
+ p := openDBBench(b, false)
+ p.populate(b.N)
+ p.fill()
+ p.gc()
+ defer p.close()
+
+ b.ResetTimer()
+ b.SetBytes(116)
+
+ var dir uint32
+ b.RunParallel(func(pb *testing.PB) {
+ iter := p.newIter()
+ defer iter.Release()
+ if atomic.AddUint32(&dir, 1)%2 == 0 {
+ for pb.Next() && iter.Next() {
+ }
+ } else {
+ if pb.Next() && iter.Last() {
+ for pb.Next() && iter.Prev() {
+ }
+ }
+ }
+ })
+}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/iterator/array_iter.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/iterator/array_iter.go
index 9b4b7274..a23ab05f 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/iterator/array_iter.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/iterator/array_iter.go
@@ -40,13 +40,19 @@ type basicArrayIterator struct {
util.BasicReleaser
array BasicArray
pos int
+ err error
}
func (i *basicArrayIterator) Valid() bool {
- return i.pos >= 0 && i.pos < i.array.Len()
+ return i.pos >= 0 && i.pos < i.array.Len() && !i.Released()
}
func (i *basicArrayIterator) First() bool {
+ if i.Released() {
+ i.err = ErrIterReleased
+ return false
+ }
+
if i.array.Len() == 0 {
i.pos = -1
return false
@@ -56,6 +62,11 @@ func (i *basicArrayIterator) First() bool {
}
func (i *basicArrayIterator) Last() bool {
+ if i.Released() {
+ i.err = ErrIterReleased
+ return false
+ }
+
n := i.array.Len()
if n == 0 {
i.pos = 0
@@ -66,6 +77,11 @@ func (i *basicArrayIterator) Last() bool {
}
func (i *basicArrayIterator) Seek(key []byte) bool {
+ if i.Released() {
+ i.err = ErrIterReleased
+ return false
+ }
+
n := i.array.Len()
if n == 0 {
i.pos = 0
@@ -79,6 +95,11 @@ func (i *basicArrayIterator) Seek(key []byte) bool {
}
func (i *basicArrayIterator) Next() bool {
+ if i.Released() {
+ i.err = ErrIterReleased
+ return false
+ }
+
i.pos++
if n := i.array.Len(); i.pos >= n {
i.pos = n
@@ -88,6 +109,11 @@ func (i *basicArrayIterator) Next() bool {
}
func (i *basicArrayIterator) Prev() bool {
+ if i.Released() {
+ i.err = ErrIterReleased
+ return false
+ }
+
i.pos--
if i.pos < 0 {
i.pos = -1
@@ -96,7 +122,7 @@ func (i *basicArrayIterator) Prev() bool {
return true
}
-func (i *basicArrayIterator) Error() error { return nil }
+func (i *basicArrayIterator) Error() error { return i.err }
type arrayIterator struct {
basicArrayIterator
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/iterator/indexed_iter.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/iterator/indexed_iter.go
index 1e99a2bf..8353b357 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/iterator/indexed_iter.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/iterator/indexed_iter.go
@@ -26,9 +26,10 @@ type indexedIterator struct {
strict bool
strictGet bool
- data Iterator
- err error
- errf func(err error)
+ data Iterator
+ err error
+ errf func(err error)
+ closed bool
}
func (i *indexedIterator) setData() {
@@ -50,6 +51,15 @@ func (i *indexedIterator) clearData() {
i.data = nil
}
+func (i *indexedIterator) indexErr() {
+ if err := i.index.Error(); err != nil {
+ if i.errf != nil {
+ i.errf(err)
+ }
+ i.err = err
+ }
+}
+
func (i *indexedIterator) dataErr() bool {
if i.errf != nil {
if err := i.data.Error(); err != nil {
@@ -72,9 +82,13 @@ func (i *indexedIterator) Valid() bool {
func (i *indexedIterator) First() bool {
if i.err != nil {
return false
+ } else if i.Released() {
+ i.err = ErrIterReleased
+ return false
}
if !i.index.First() {
+ i.indexErr()
i.clearData()
return false
}
@@ -85,9 +99,13 @@ func (i *indexedIterator) First() bool {
func (i *indexedIterator) Last() bool {
if i.err != nil {
return false
+ } else if i.Released() {
+ i.err = ErrIterReleased
+ return false
}
if !i.index.Last() {
+ i.indexErr()
i.clearData()
return false
}
@@ -105,9 +123,13 @@ func (i *indexedIterator) Last() bool {
func (i *indexedIterator) Seek(key []byte) bool {
if i.err != nil {
return false
+ } else if i.Released() {
+ i.err = ErrIterReleased
+ return false
}
if !i.index.Seek(key) {
+ i.indexErr()
i.clearData()
return false
}
@@ -125,6 +147,9 @@ func (i *indexedIterator) Seek(key []byte) bool {
func (i *indexedIterator) Next() bool {
if i.err != nil {
return false
+ } else if i.Released() {
+ i.err = ErrIterReleased
+ return false
}
switch {
@@ -136,6 +161,7 @@ func (i *indexedIterator) Next() bool {
fallthrough
case i.data == nil:
if !i.index.Next() {
+ i.indexErr()
return false
}
i.setData()
@@ -147,6 +173,9 @@ func (i *indexedIterator) Next() bool {
func (i *indexedIterator) Prev() bool {
if i.err != nil {
return false
+ } else if i.Released() {
+ i.err = ErrIterReleased
+ return false
}
switch {
@@ -158,6 +187,7 @@ func (i *indexedIterator) Prev() bool {
fallthrough
case i.data == nil:
if !i.index.Prev() {
+ i.indexErr()
return false
}
i.setData()
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/iterator/iter.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/iterator/iter.go
index 1b80184e..c2522860 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/iterator/iter.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/iterator/iter.go
@@ -14,6 +14,10 @@ import (
"github.com/syndtr/goleveldb/leveldb/util"
)
+var (
+ ErrIterReleased = errors.New("leveldb/iterator: iterator released")
+)
+
// IteratorSeeker is the interface that wraps the 'seeks method'.
type IteratorSeeker interface {
// First moves the iterator to the first key/value pair. If the iterator
@@ -100,28 +104,13 @@ type ErrorCallbackSetter interface {
}
type emptyIterator struct {
- releaser util.Releaser
- released bool
- err error
+ util.BasicReleaser
+ err error
}
func (i *emptyIterator) rErr() {
- if i.err == nil && i.released {
- i.err = errors.New("leveldb/iterator: iterator released")
- }
-}
-
-func (i *emptyIterator) Release() {
- if i.releaser != nil {
- i.releaser.Release()
- i.releaser = nil
- }
- i.released = true
-}
-
-func (i *emptyIterator) SetReleaser(releaser util.Releaser) {
- if !i.released {
- i.releaser = releaser
+ if i.err == nil && i.Released() {
+ i.err = ErrIterReleased
}
}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/iterator/merged_iter.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/iterator/merged_iter.go
index c8314c4e..8370e25e 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/iterator/merged_iter.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/iterator/merged_iter.go
@@ -7,16 +7,10 @@
package iterator
import (
- "errors"
-
"github.com/syndtr/goleveldb/leveldb/comparer"
"github.com/syndtr/goleveldb/leveldb/util"
)
-var (
- ErrIterReleased = errors.New("leveldb/iterator: iterator released")
-)
-
type dir int
const (
@@ -274,9 +268,13 @@ func (i *mergedIterator) Release() {
}
func (i *mergedIterator) SetReleaser(releaser util.Releaser) {
- if i.dir != dirReleased {
- i.releaser = releaser
+ if i.dir == dirReleased {
+ panic(util.ErrReleased)
}
+ if i.releaser != nil && releaser != nil {
+ panic(util.ErrHasReleaser)
+ }
+ i.releaser = releaser
}
func (i *mergedIterator) Error() error {
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/journal/journal.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/journal/journal.go
index b522c76e..e9a19ebc 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/journal/journal.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/journal/journal.go
@@ -103,18 +103,18 @@ type flusher interface {
Flush() error
}
-// DroppedError is the error type that passed to Dropper.Drop method.
-type DroppedError struct {
+// ErrCorrupted is the error type that generated by corrupted block or chunk.
+type ErrCorrupted struct {
Size int
Reason string
}
-func (e DroppedError) Error() string {
- return fmt.Sprintf("leveldb/journal: dropped %d bytes: %s", e.Size, e.Reason)
+func (e ErrCorrupted) Error() string {
+ return fmt.Sprintf("leveldb/journal: block/chunk corrupted: %s (%d bytes)", e.Reason, e.Size)
}
// Dropper is the interface that wrap simple Drop method. The Drop
-// method will be called when the journal reader dropping a chunk.
+// method will be called when the journal reader dropping a block or chunk.
type Dropper interface {
Drop(err error)
}
@@ -158,76 +158,78 @@ func NewReader(r io.Reader, dropper Dropper, strict, checksum bool) *Reader {
}
}
+var errSkip = errors.New("leveldb/journal: skipped")
+
+func (r *Reader) corrupt(n int, reason string, skip bool) error {
+ if r.dropper != nil {
+ r.dropper.Drop(ErrCorrupted{n, reason})
+ }
+ if r.strict && !skip {
+ r.err = ErrCorrupted{n, reason}
+ return r.err
+ }
+ return errSkip
+}
+
// nextChunk sets r.buf[r.i:r.j] to hold the next chunk's payload, reading the
// next block into the buffer if necessary.
-func (r *Reader) nextChunk(wantFirst, skip bool) error {
+func (r *Reader) nextChunk(first bool) error {
for {
if r.j+headerSize <= r.n {
checksum := binary.LittleEndian.Uint32(r.buf[r.j+0 : r.j+4])
length := binary.LittleEndian.Uint16(r.buf[r.j+4 : r.j+6])
chunkType := r.buf[r.j+6]
- var err error
if checksum == 0 && length == 0 && chunkType == 0 {
// Drop entire block.
- err = DroppedError{r.n - r.j, "zero header"}
+ m := r.n - r.j
r.i = r.n
r.j = r.n
+ return r.corrupt(m, "zero header", false)
} else {
m := r.n - r.j
r.i = r.j + headerSize
r.j = r.j + headerSize + int(length)
if r.j > r.n {
// Drop entire block.
- err = DroppedError{m, "chunk length overflows block"}
r.i = r.n
r.j = r.n
+ return r.corrupt(m, "chunk length overflows block", false)
} else if r.checksum && checksum != util.NewCRC(r.buf[r.i-1:r.j]).Value() {
// Drop entire block.
- err = DroppedError{m, "checksum mismatch"}
r.i = r.n
r.j = r.n
+ return r.corrupt(m, "checksum mismatch", false)
}
}
- if wantFirst && err == nil && chunkType != fullChunkType && chunkType != firstChunkType {
- if skip {
- // The chunk are intentionally skipped.
- if chunkType == lastChunkType {
- skip = false
- }
- continue
- } else {
- // Drop the chunk.
- err = DroppedError{r.j - r.i + headerSize, "orphan chunk"}
- }
+ if first && chunkType != fullChunkType && chunkType != firstChunkType {
+ m := r.j - r.i
+ r.i = r.j
+ // Report the error, but skip it.
+ return r.corrupt(m+headerSize, "orphan chunk", true)
}
- if err == nil {
- r.last = chunkType == fullChunkType || chunkType == lastChunkType
- } else {
- if r.dropper != nil {
- r.dropper.Drop(err)
- }
- if r.strict {
- r.err = err
- }
+ r.last = chunkType == fullChunkType || chunkType == lastChunkType
+ return nil
+ }
+
+ // The last block.
+ if r.n < blockSize && r.n > 0 {
+ if !first {
+ return r.corrupt(0, "missing chunk part", false)
}
+ r.err = io.EOF
+ return r.err
+ }
+
+ // Read block.
+ n, err := io.ReadFull(r.r, r.buf[:])
+ if err != nil && err != io.EOF && err != io.ErrUnexpectedEOF {
return err
}
- if r.n < blockSize && r.n > 0 {
- // This is the last block.
- if r.j != r.n {
- r.err = io.ErrUnexpectedEOF
- } else {
- r.err = io.EOF
- }
- return r.err
- }
- n, err := io.ReadFull(r.r, r.buf[:])
- if err != nil && err != io.ErrUnexpectedEOF {
- r.err = err
- return r.err
- }
if n == 0 {
+ if !first {
+ return r.corrupt(0, "missing chunk part", false)
+ }
r.err = io.EOF
return r.err
}
@@ -237,29 +239,26 @@ func (r *Reader) nextChunk(wantFirst, skip bool) error {
// Next returns a reader for the next journal. It returns io.EOF if there are no
// more journals. The reader returned becomes stale after the next Next call,
-// and should no longer be used.
+// and should no longer be used. If strict is false, the reader will returns
+// io.ErrUnexpectedEOF error when found corrupted journal.
func (r *Reader) Next() (io.Reader, error) {
r.seq++
if r.err != nil {
return nil, r.err
}
- skip := !r.last
+ r.i = r.j
for {
- r.i = r.j
- if r.nextChunk(true, skip) != nil {
- // So that 'orphan chunk' drop will be reported.
- skip = false
- } else {
+ if err := r.nextChunk(true); err == nil {
break
- }
- if r.err != nil {
- return nil, r.err
+ } else if err != errSkip {
+ return nil, err
}
}
return &singleReader{r, r.seq, nil}, nil
}
-// Reset resets the journal reader, allows reuse of the journal reader.
+// Reset resets the journal reader, allows reuse of the journal reader. Reset returns
+// last accumulated error.
func (r *Reader) Reset(reader io.Reader, dropper Dropper, strict, checksum bool) error {
r.seq++
err := r.err
@@ -296,7 +295,11 @@ func (x *singleReader) Read(p []byte) (int, error) {
if r.last {
return 0, io.EOF
}
- if x.err = r.nextChunk(false, false); x.err != nil {
+ x.err = r.nextChunk(false)
+ if x.err != nil {
+ if x.err == errSkip {
+ x.err = io.ErrUnexpectedEOF
+ }
return 0, x.err
}
}
@@ -320,7 +323,11 @@ func (x *singleReader) ReadByte() (byte, error) {
if r.last {
return 0, io.EOF
}
- if x.err = r.nextChunk(false, false); x.err != nil {
+ x.err = r.nextChunk(false)
+ if x.err != nil {
+ if x.err == errSkip {
+ x.err = io.ErrUnexpectedEOF
+ }
return 0, x.err
}
}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/journal/journal_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/journal/journal_test.go
index 5e1193ae..0fcf2259 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/journal/journal_test.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/journal/journal_test.go
@@ -12,6 +12,7 @@ package journal
import (
"bytes"
+ "encoding/binary"
"fmt"
"io"
"io/ioutil"
@@ -326,3 +327,492 @@ func TestStaleWriter(t *testing.T) {
t.Fatalf("stale write #1: unexpected error: %v", err)
}
}
+
+func TestCorrupt_MissingLastBlock(t *testing.T) {
+ buf := new(bytes.Buffer)
+
+ w := NewWriter(buf)
+
+ // First record.
+ ww, err := w.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if _, err := ww.Write(bytes.Repeat([]byte("0"), blockSize-1024)); err != nil {
+ t.Fatalf("write #0: unexpected error: %v", err)
+ }
+
+ // Second record.
+ ww, err = w.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if _, err := ww.Write(bytes.Repeat([]byte("0"), blockSize-headerSize)); err != nil {
+ t.Fatalf("write #1: unexpected error: %v", err)
+ }
+
+ if err := w.Close(); err != nil {
+ t.Fatal(err)
+ }
+
+ // Cut the last block.
+ b := buf.Bytes()[:blockSize]
+ r := NewReader(bytes.NewReader(b), dropper{t}, false, true)
+
+ // First read.
+ rr, err := r.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ n, err := io.Copy(ioutil.Discard, rr)
+ if err != nil {
+ t.Fatalf("read #0: %v", err)
+ }
+ if n != blockSize-1024 {
+ t.Fatalf("read #0: got %d bytes want %d", n, blockSize-1024)
+ }
+
+ // Second read.
+ rr, err = r.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ n, err = io.Copy(ioutil.Discard, rr)
+ if err != io.ErrUnexpectedEOF {
+ t.Fatalf("read #1: unexpected error: %v", err)
+ }
+
+ if _, err := r.Next(); err != io.EOF {
+ t.Fatalf("last next: unexpected error: %v", err)
+ }
+}
+
+func TestCorrupt_CorruptedFirstBlock(t *testing.T) {
+ buf := new(bytes.Buffer)
+
+ w := NewWriter(buf)
+
+ // First record.
+ ww, err := w.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if _, err := ww.Write(bytes.Repeat([]byte("0"), blockSize/2)); err != nil {
+ t.Fatalf("write #0: unexpected error: %v", err)
+ }
+
+ // Second record.
+ ww, err = w.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if _, err := ww.Write(bytes.Repeat([]byte("0"), blockSize-headerSize)); err != nil {
+ t.Fatalf("write #1: unexpected error: %v", err)
+ }
+
+ // Third record.
+ ww, err = w.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if _, err := ww.Write(bytes.Repeat([]byte("0"), (blockSize-headerSize)+1)); err != nil {
+ t.Fatalf("write #2: unexpected error: %v", err)
+ }
+
+ // Fourth record.
+ ww, err = w.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if _, err := ww.Write(bytes.Repeat([]byte("0"), (blockSize-headerSize)+2)); err != nil {
+ t.Fatalf("write #3: unexpected error: %v", err)
+ }
+
+ if err := w.Close(); err != nil {
+ t.Fatal(err)
+ }
+
+ b := buf.Bytes()
+ // Corrupting block #0.
+ for i := 0; i < 1024; i++ {
+ b[i] = '1'
+ }
+
+ r := NewReader(bytes.NewReader(b), dropper{t}, false, true)
+
+ // First read (third record).
+ rr, err := r.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ n, err := io.Copy(ioutil.Discard, rr)
+ if err != nil {
+ t.Fatalf("read #0: %v", err)
+ }
+ if want := int64(blockSize-headerSize) + 1; n != want {
+ t.Fatalf("read #0: got %d bytes want %d", n, want)
+ }
+
+ // Second read (fourth record).
+ rr, err = r.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ n, err = io.Copy(ioutil.Discard, rr)
+ if err != nil {
+ t.Fatalf("read #1: %v", err)
+ }
+ if want := int64(blockSize-headerSize) + 2; n != want {
+ t.Fatalf("read #1: got %d bytes want %d", n, want)
+ }
+
+ if _, err := r.Next(); err != io.EOF {
+ t.Fatalf("last next: unexpected error: %v", err)
+ }
+}
+
+func TestCorrupt_CorruptedMiddleBlock(t *testing.T) {
+ buf := new(bytes.Buffer)
+
+ w := NewWriter(buf)
+
+ // First record.
+ ww, err := w.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if _, err := ww.Write(bytes.Repeat([]byte("0"), blockSize/2)); err != nil {
+ t.Fatalf("write #0: unexpected error: %v", err)
+ }
+
+ // Second record.
+ ww, err = w.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if _, err := ww.Write(bytes.Repeat([]byte("0"), blockSize-headerSize)); err != nil {
+ t.Fatalf("write #1: unexpected error: %v", err)
+ }
+
+ // Third record.
+ ww, err = w.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if _, err := ww.Write(bytes.Repeat([]byte("0"), (blockSize-headerSize)+1)); err != nil {
+ t.Fatalf("write #2: unexpected error: %v", err)
+ }
+
+ // Fourth record.
+ ww, err = w.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if _, err := ww.Write(bytes.Repeat([]byte("0"), (blockSize-headerSize)+2)); err != nil {
+ t.Fatalf("write #3: unexpected error: %v", err)
+ }
+
+ if err := w.Close(); err != nil {
+ t.Fatal(err)
+ }
+
+ b := buf.Bytes()
+ // Corrupting block #1.
+ for i := 0; i < 1024; i++ {
+ b[blockSize+i] = '1'
+ }
+
+ r := NewReader(bytes.NewReader(b), dropper{t}, false, true)
+
+ // First read (first record).
+ rr, err := r.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ n, err := io.Copy(ioutil.Discard, rr)
+ if err != nil {
+ t.Fatalf("read #0: %v", err)
+ }
+ if want := int64(blockSize / 2); n != want {
+ t.Fatalf("read #0: got %d bytes want %d", n, want)
+ }
+
+ // Second read (second record).
+ rr, err = r.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ n, err = io.Copy(ioutil.Discard, rr)
+ if err != io.ErrUnexpectedEOF {
+ t.Fatalf("read #1: unexpected error: %v", err)
+ }
+
+ // Third read (fourth record).
+ rr, err = r.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ n, err = io.Copy(ioutil.Discard, rr)
+ if err != nil {
+ t.Fatalf("read #2: %v", err)
+ }
+ if want := int64(blockSize-headerSize) + 2; n != want {
+ t.Fatalf("read #2: got %d bytes want %d", n, want)
+ }
+
+ if _, err := r.Next(); err != io.EOF {
+ t.Fatalf("last next: unexpected error: %v", err)
+ }
+}
+
+func TestCorrupt_CorruptedLastBlock(t *testing.T) {
+ buf := new(bytes.Buffer)
+
+ w := NewWriter(buf)
+
+ // First record.
+ ww, err := w.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if _, err := ww.Write(bytes.Repeat([]byte("0"), blockSize/2)); err != nil {
+ t.Fatalf("write #0: unexpected error: %v", err)
+ }
+
+ // Second record.
+ ww, err = w.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if _, err := ww.Write(bytes.Repeat([]byte("0"), blockSize-headerSize)); err != nil {
+ t.Fatalf("write #1: unexpected error: %v", err)
+ }
+
+ // Third record.
+ ww, err = w.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if _, err := ww.Write(bytes.Repeat([]byte("0"), (blockSize-headerSize)+1)); err != nil {
+ t.Fatalf("write #2: unexpected error: %v", err)
+ }
+
+ // Fourth record.
+ ww, err = w.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if _, err := ww.Write(bytes.Repeat([]byte("0"), (blockSize-headerSize)+2)); err != nil {
+ t.Fatalf("write #3: unexpected error: %v", err)
+ }
+
+ if err := w.Close(); err != nil {
+ t.Fatal(err)
+ }
+
+ b := buf.Bytes()
+ // Corrupting block #3.
+ for i := len(b) - 1; i > len(b)-1024; i-- {
+ b[i] = '1'
+ }
+
+ r := NewReader(bytes.NewReader(b), dropper{t}, false, true)
+
+ // First read (first record).
+ rr, err := r.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ n, err := io.Copy(ioutil.Discard, rr)
+ if err != nil {
+ t.Fatalf("read #0: %v", err)
+ }
+ if want := int64(blockSize / 2); n != want {
+ t.Fatalf("read #0: got %d bytes want %d", n, want)
+ }
+
+ // Second read (second record).
+ rr, err = r.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ n, err = io.Copy(ioutil.Discard, rr)
+ if err != nil {
+ t.Fatalf("read #1: %v", err)
+ }
+ if want := int64(blockSize - headerSize); n != want {
+ t.Fatalf("read #1: got %d bytes want %d", n, want)
+ }
+
+ // Third read (third record).
+ rr, err = r.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ n, err = io.Copy(ioutil.Discard, rr)
+ if err != nil {
+ t.Fatalf("read #2: %v", err)
+ }
+ if want := int64(blockSize-headerSize) + 1; n != want {
+ t.Fatalf("read #2: got %d bytes want %d", n, want)
+ }
+
+ // Fourth read (fourth record).
+ rr, err = r.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ n, err = io.Copy(ioutil.Discard, rr)
+ if err != io.ErrUnexpectedEOF {
+ t.Fatalf("read #3: unexpected error: %v", err)
+ }
+
+ if _, err := r.Next(); err != io.EOF {
+ t.Fatalf("last next: unexpected error: %v", err)
+ }
+}
+
+func TestCorrupt_FirstChuckLengthOverflow(t *testing.T) {
+ buf := new(bytes.Buffer)
+
+ w := NewWriter(buf)
+
+ // First record.
+ ww, err := w.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if _, err := ww.Write(bytes.Repeat([]byte("0"), blockSize/2)); err != nil {
+ t.Fatalf("write #0: unexpected error: %v", err)
+ }
+
+ // Second record.
+ ww, err = w.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if _, err := ww.Write(bytes.Repeat([]byte("0"), blockSize-headerSize)); err != nil {
+ t.Fatalf("write #1: unexpected error: %v", err)
+ }
+
+ // Third record.
+ ww, err = w.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if _, err := ww.Write(bytes.Repeat([]byte("0"), (blockSize-headerSize)+1)); err != nil {
+ t.Fatalf("write #2: unexpected error: %v", err)
+ }
+
+ if err := w.Close(); err != nil {
+ t.Fatal(err)
+ }
+
+ b := buf.Bytes()
+ // Corrupting record #1.
+ x := blockSize
+ binary.LittleEndian.PutUint16(b[x+4:], 0xffff)
+
+ r := NewReader(bytes.NewReader(b), dropper{t}, false, true)
+
+ // First read (first record).
+ rr, err := r.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ n, err := io.Copy(ioutil.Discard, rr)
+ if err != nil {
+ t.Fatalf("read #0: %v", err)
+ }
+ if want := int64(blockSize / 2); n != want {
+ t.Fatalf("read #0: got %d bytes want %d", n, want)
+ }
+
+ // Second read (second record).
+ rr, err = r.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ n, err = io.Copy(ioutil.Discard, rr)
+ if err != io.ErrUnexpectedEOF {
+ t.Fatalf("read #1: unexpected error: %v", err)
+ }
+
+ if _, err := r.Next(); err != io.EOF {
+ t.Fatalf("last next: unexpected error: %v", err)
+ }
+}
+
+func TestCorrupt_MiddleChuckLengthOverflow(t *testing.T) {
+ buf := new(bytes.Buffer)
+
+ w := NewWriter(buf)
+
+ // First record.
+ ww, err := w.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if _, err := ww.Write(bytes.Repeat([]byte("0"), blockSize/2)); err != nil {
+ t.Fatalf("write #0: unexpected error: %v", err)
+ }
+
+ // Second record.
+ ww, err = w.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if _, err := ww.Write(bytes.Repeat([]byte("0"), blockSize-headerSize)); err != nil {
+ t.Fatalf("write #1: unexpected error: %v", err)
+ }
+
+ // Third record.
+ ww, err = w.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ if _, err := ww.Write(bytes.Repeat([]byte("0"), (blockSize-headerSize)+1)); err != nil {
+ t.Fatalf("write #2: unexpected error: %v", err)
+ }
+
+ if err := w.Close(); err != nil {
+ t.Fatal(err)
+ }
+
+ b := buf.Bytes()
+ // Corrupting record #1.
+ x := blockSize/2 + headerSize
+ binary.LittleEndian.PutUint16(b[x+4:], 0xffff)
+
+ r := NewReader(bytes.NewReader(b), dropper{t}, false, true)
+
+ // First read (first record).
+ rr, err := r.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ n, err := io.Copy(ioutil.Discard, rr)
+ if err != nil {
+ t.Fatalf("read #0: %v", err)
+ }
+ if want := int64(blockSize / 2); n != want {
+ t.Fatalf("read #0: got %d bytes want %d", n, want)
+ }
+
+ // Second read (third record).
+ rr, err = r.Next()
+ if err != nil {
+ t.Fatal(err)
+ }
+ n, err = io.Copy(ioutil.Discard, rr)
+ if err != nil {
+ t.Fatalf("read #1: %v", err)
+ }
+ if want := int64(blockSize-headerSize) + 1; n != want {
+ t.Fatalf("read #1: got %d bytes want %d", n, want)
+ }
+
+ if _, err := r.Next(); err != io.EOF {
+ t.Fatalf("last next: unexpected error: %v", err)
+ }
+}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/key_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/key_test.go
index b65664ae..e307cfc1 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/key_test.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/key_test.go
@@ -13,7 +13,7 @@ import (
"github.com/syndtr/goleveldb/leveldb/comparer"
)
-var icmp = &iComparer{comparer.DefaultComparer}
+var defaultIComparer = &iComparer{comparer.DefaultComparer}
func ikey(key string, seq uint64, t vType) iKey {
return newIKey([]byte(key), uint64(seq), t)
@@ -21,7 +21,7 @@ func ikey(key string, seq uint64, t vType) iKey {
func shortSep(a, b []byte) []byte {
dst := make([]byte, len(a))
- dst = icmp.Separator(dst[:0], a, b)
+ dst = defaultIComparer.Separator(dst[:0], a, b)
if dst == nil {
return a
}
@@ -30,7 +30,7 @@ func shortSep(a, b []byte) []byte {
func shortSuccessor(b []byte) []byte {
dst := make([]byte, len(b))
- dst = icmp.Successor(dst[:0], b)
+ dst = defaultIComparer.Successor(dst[:0], b)
if dst == nil {
return b
}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/memdb/memdb.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/memdb/memdb.go
index 7bcae992..83ff7bc6 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/memdb/memdb.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/memdb/memdb.go
@@ -8,6 +8,7 @@
package memdb
import (
+ "errors"
"math/rand"
"sync"
@@ -17,7 +18,8 @@ import (
)
var (
- ErrNotFound = util.ErrNotFound
+ ErrNotFound = util.ErrNotFound
+ ErrIterReleased = errors.New("leveldb/memdb: iterator released")
)
const tMaxHeight = 12
@@ -29,6 +31,7 @@ type dbIter struct {
node int
forward bool
key, value []byte
+ err error
}
func (i *dbIter) fill(checkStart, checkLimit bool) bool {
@@ -59,6 +62,11 @@ func (i *dbIter) Valid() bool {
}
func (i *dbIter) First() bool {
+ if i.Released() {
+ i.err = ErrIterReleased
+ return false
+ }
+
i.forward = true
i.p.mu.RLock()
defer i.p.mu.RUnlock()
@@ -71,9 +79,11 @@ func (i *dbIter) First() bool {
}
func (i *dbIter) Last() bool {
- if i.p == nil {
+ if i.Released() {
+ i.err = ErrIterReleased
return false
}
+
i.forward = false
i.p.mu.RLock()
defer i.p.mu.RUnlock()
@@ -86,9 +96,11 @@ func (i *dbIter) Last() bool {
}
func (i *dbIter) Seek(key []byte) bool {
- if i.p == nil {
+ if i.Released() {
+ i.err = ErrIterReleased
return false
}
+
i.forward = true
i.p.mu.RLock()
defer i.p.mu.RUnlock()
@@ -100,9 +112,11 @@ func (i *dbIter) Seek(key []byte) bool {
}
func (i *dbIter) Next() bool {
- if i.p == nil {
+ if i.Released() {
+ i.err = ErrIterReleased
return false
}
+
if i.node == 0 {
if !i.forward {
return i.First()
@@ -117,9 +131,11 @@ func (i *dbIter) Next() bool {
}
func (i *dbIter) Prev() bool {
- if i.p == nil {
+ if i.Released() {
+ i.err = ErrIterReleased
return false
}
+
if i.node == 0 {
if i.forward {
return i.Last()
@@ -141,10 +157,10 @@ func (i *dbIter) Value() []byte {
return i.value
}
-func (i *dbIter) Error() error { return nil }
+func (i *dbIter) Error() error { return i.err }
func (i *dbIter) Release() {
- if i.p != nil {
+ if !i.Released() {
i.p = nil
i.node = 0
i.key = nil
@@ -437,6 +453,8 @@ func (p *DB) Reset() {
// New creates a new initalized in-memory key/value DB. The capacity
// is the initial key/value buffer capacity. The capacity is advisory,
// not enforced.
+//
+// The returned DB instance is goroutine-safe.
func New(cmp comparer.BasicComparer, capacity int) *DB {
p := &DB{
cmp: cmp,
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/memdb/memdb_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/memdb/memdb_test.go
index f96a9d1e..5dd6dbc7 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/memdb/memdb_test.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/memdb/memdb_test.go
@@ -129,7 +129,7 @@ var _ = testutil.Defer(func() {
}
return db
- })
+ }, nil, nil)
})
})
})
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/opt/options.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/opt/options.go
index b940ce42..2a375ba6 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/opt/options.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/opt/options.go
@@ -24,16 +24,22 @@ const (
DefaultBlockRestartInterval = 16
DefaultBlockSize = 4 * KiB
DefaultCompressionType = SnappyCompression
- DefaultMaxOpenFiles = 1000
+ DefaultCachedOpenFiles = 500
DefaultWriteBuffer = 4 * MiB
)
type noCache struct{}
-func (noCache) SetCapacity(capacity int) {}
-func (noCache) GetNamespace(id uint64) cache.Namespace { return nil }
-func (noCache) Purge(fin cache.PurgeFin) {}
-func (noCache) Zap(closed bool) {}
+func (noCache) SetCapacity(capacity int) {}
+func (noCache) Capacity() int { return 0 }
+func (noCache) Used() int { return 0 }
+func (noCache) Size() int { return 0 }
+func (noCache) NumObjects() int { return 0 }
+func (noCache) GetNamespace(id uint64) cache.Namespace { return nil }
+func (noCache) PurgeNamespace(id uint64, fin cache.PurgeFin) {}
+func (noCache) ZapNamespace(id uint64) {}
+func (noCache) Purge(fin cache.PurgeFin) {}
+func (noCache) Zap() {}
var NoCache cache.Cache = noCache{}
@@ -119,6 +125,13 @@ type Options struct {
// The default value is 4KiB.
BlockSize int
+ // CachedOpenFiles defines number of open files to kept around when not
+ // in-use, the counting includes still in-use files.
+ // Set this to negative value to disable caching.
+ //
+ // The default value is 500.
+ CachedOpenFiles int
+
// Comparer defines a total ordering over the space of []byte keys: a 'less
// than' relationship. The same comparison algorithm must be used for reads
// and writes over the lifetime of the DB.
@@ -159,13 +172,6 @@ type Options struct {
// The default value is nil.
Filter filter.Filter
- // MaxOpenFiles defines maximum number of open files to kept around
- // (cached). This is not an hard limit, actual open files may exceed
- // the defined value.
- //
- // The default value is 1000.
- MaxOpenFiles int
-
// Strict defines the DB strict level.
Strict Strict
@@ -207,6 +213,15 @@ func (o *Options) GetBlockSize() int {
return o.BlockSize
}
+func (o *Options) GetCachedOpenFiles() int {
+ if o == nil || o.CachedOpenFiles == 0 {
+ return DefaultCachedOpenFiles
+ } else if o.CachedOpenFiles < 0 {
+ return 0
+ }
+ return o.CachedOpenFiles
+}
+
func (o *Options) GetComparer() comparer.Comparer {
if o == nil || o.Comparer == nil {
return comparer.DefaultComparer
@@ -242,13 +257,6 @@ func (o *Options) GetFilter() filter.Filter {
return o.Filter
}
-func (o *Options) GetMaxOpenFiles() int {
- if o == nil || o.MaxOpenFiles <= 0 {
- return DefaultMaxOpenFiles
- }
- return o.MaxOpenFiles
-}
-
func (o *Options) GetStrict(strict Strict) bool {
if o == nil || o.Strict == 0 {
return DefaultStrict&strict != 0
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/options.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/options.go
index 480c2d0a..fc6a9696 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/options.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/options.go
@@ -32,8 +32,8 @@ func (s *session) setOptions(o *opt.Options) {
s.o.BlockCache = nil
}
// Comparer.
- s.cmp = &iComparer{o.GetComparer()}
- s.o.Comparer = s.cmp
+ s.icmp = &iComparer{o.GetComparer()}
+ s.o.Comparer = s.icmp
// Filter.
if filter := o.GetFilter(); filter != nil {
s.o.Filter = &iFilter{filter}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/session.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/session.go
index e940915a..7fc08e7d 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/session.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/session.go
@@ -20,16 +20,6 @@ import (
"github.com/syndtr/goleveldb/leveldb/util"
)
-// ErrManifest is the type that wraps errors produced by missing
-// or corrupted manifest file.
-type ErrManifest struct {
- Err error
-}
-
-func (e ErrManifest) Error() string {
- return e.Err.Error()
-}
-
// session represent a persistent database session.
type session struct {
// Need 64-bit alignment.
@@ -42,18 +32,19 @@ type session struct {
stor storage.Storage
storLock util.Releaser
o *opt.Options
- cmp *iComparer
+ icmp *iComparer
tops *tOps
manifest *journal.Writer
manifestWriter storage.Writer
manifestFile storage.File
- stCPtrs [kNumLevels]iKey // compact pointers; need external synchronization
+ stCptrs [kNumLevels]iKey // compact pointers; need external synchronization
stVersion *version // current version
vmu sync.Mutex
}
+// Creates new initialized session instance.
func newSession(stor storage.Storage, o *opt.Options) (s *session, err error) {
if stor == nil {
return nil, os.ErrInvalid
@@ -67,7 +58,7 @@ func newSession(stor storage.Storage, o *opt.Options) (s *session, err error) {
storLock: storLock,
}
s.setOptions(o)
- s.tops = newTableOps(s, s.o.GetMaxOpenFiles())
+ s.tops = newTableOps(s, s.o.GetCachedOpenFiles())
s.setVersion(&version{s: s})
s.log("log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock D·DeletedEntry L·Level Q·SeqNum T·TimeElapsed")
return
@@ -91,6 +82,7 @@ func (s *session) close() {
s.stVersion = nil
}
+// Release session lock.
func (s *session) release() {
s.storLock.Release()
}
@@ -108,7 +100,7 @@ func (s *session) recover() (err error) {
// Don't return os.ErrNotExist if the underlying storage contains
// other files that belong to LevelDB. So the DB won't get trashed.
if files, _ := s.stor.GetFiles(storage.TypeAll); len(files) > 0 {
- err = ErrManifest{Err: errors.New("leveldb: manifest file missing")}
+ err = ErrCorrupted{Type: CorruptedManifest, Err: errors.New("leveldb: manifest file missing")}
}
}
}()
@@ -142,13 +134,13 @@ func (s *session) recover() (err error) {
err = rec.decode(r)
if err == nil {
// save compact pointers
- for _, rp := range rec.compactionPointers {
- s.stCPtrs[rp.level] = iKey(rp.key)
+ for _, r := range rec.compactionPointers {
+ s.stCptrs[r.level] = iKey(r.ikey)
}
// commit record to version staging
staging.commit(rec)
} else if strict {
- return ErrManifest{Err: err}
+ return ErrCorrupted{Type: CorruptedManifest, Err: err}
} else {
s.logf("manifest error: %v (skipped)", err)
}
@@ -159,15 +151,15 @@ func (s *session) recover() (err error) {
switch {
case !rec.has(recComparer):
- return ErrManifest{Err: errors.New("leveldb: manifest missing comparer name")}
- case rec.comparer != s.cmp.cmp.Name():
- return ErrManifest{Err: errors.New("leveldb: comparer mismatch, " + "want '" + s.cmp.cmp.Name() + "', " + "got '" + rec.comparer + "'")}
+ return ErrCorrupted{Type: CorruptedManifest, Err: errors.New("leveldb: manifest missing comparer name")}
+ case rec.comparer != s.icmp.uName():
+ return ErrCorrupted{Type: CorruptedManifest, Err: errors.New("leveldb: comparer mismatch, " + "want '" + s.icmp.uName() + "', " + "got '" + rec.comparer + "'")}
case !rec.has(recNextNum):
- return ErrManifest{Err: errors.New("leveldb: manifest missing next file number")}
+ return ErrCorrupted{Type: CorruptedManifest, Err: errors.New("leveldb: manifest missing next file number")}
case !rec.has(recJournalNum):
- return ErrManifest{Err: errors.New("leveldb: manifest missing journal file number")}
+ return ErrCorrupted{Type: CorruptedManifest, Err: errors.New("leveldb: manifest missing journal file number")}
case !rec.has(recSeq):
- return ErrManifest{Err: errors.New("leveldb: manifest missing seq number")}
+ return ErrCorrupted{Type: CorruptedManifest, Err: errors.New("leveldb: manifest missing seq number")}
}
s.manifestFile = file
@@ -199,25 +191,22 @@ func (s *session) commit(r *sessionRecord) (err error) {
// Pick a compaction based on current state; need external synchronization.
func (s *session) pickCompaction() *compaction {
- icmp := s.cmp
- ucmp := icmp.cmp
-
v := s.version_NB()
var level int
var t0 tFiles
if v.cScore >= 1 {
level = v.cLevel
- cp := s.stCPtrs[level]
- tt := v.tables[level]
- for _, t := range tt {
- if cp == nil || icmp.Compare(t.max, cp) > 0 {
+ cptr := s.stCptrs[level]
+ tables := v.tables[level]
+ for _, t := range tables {
+ if cptr == nil || s.icmp.Compare(t.imax, cptr) > 0 {
t0 = append(t0, t)
break
}
}
if len(t0) == 0 {
- t0 = append(t0, tt[0])
+ t0 = append(t0, tables[0])
}
} else {
if p := atomic.LoadPointer(&v.cSeek); p != nil {
@@ -229,11 +218,10 @@ func (s *session) pickCompaction() *compaction {
}
}
- c := &compaction{s: s, version: v, level: level}
+ c := &compaction{s: s, v: v, level: level}
if level == 0 {
- min, max := t0.getRange(icmp)
- t0 = nil
- v.tables[0].getOverlaps(min.ukey(), max.ukey(), &t0, false, ucmp)
+ imin, imax := t0.getRange(s.icmp)
+ t0 = v.tables[0].getOverlaps(t0[:0], s.icmp, imin.ukey(), imax.ukey(), true)
}
c.tables[0] = t0
@@ -242,25 +230,41 @@ func (s *session) pickCompaction() *compaction {
}
// Create compaction from given level and range; need external synchronization.
-func (s *session) getCompactionRange(level int, min, max []byte) *compaction {
+func (s *session) getCompactionRange(level int, umin, umax []byte) *compaction {
v := s.version_NB()
- var t0 tFiles
- v.tables[level].getOverlaps(min, max, &t0, level != 0, s.cmp.cmp)
+ t0 := v.tables[level].getOverlaps(nil, s.icmp, umin, umax, level == 0)
if len(t0) == 0 {
return nil
}
- c := &compaction{s: s, version: v, level: level}
+ // Avoid compacting too much in one shot in case the range is large.
+ // But we cannot do this for level-0 since level-0 files can overlap
+ // and we must not pick one file and drop another older file if the
+ // two files overlap.
+ if level > 0 {
+ limit := uint64(kMaxTableSize)
+ total := uint64(0)
+ for i, t := range t0 {
+ total += t.size
+ if total >= limit {
+ s.logf("table@compaction limiting F·%d -> F·%d", len(t0), i+1)
+ t0 = t0[:i+1]
+ break
+ }
+ }
+ }
+
+ c := &compaction{s: s, v: v, level: level}
c.tables[0] = t0
c.expand()
return c
}
-// compaction represent a compaction state
+// compaction represent a compaction state.
type compaction struct {
- s *session
- version *version
+ s *session
+ v *version
level int
tables [2]tFiles
@@ -269,44 +273,36 @@ type compaction struct {
gpidx int
seenKey bool
overlappedBytes uint64
- min, max iKey
+ imin, imax iKey
tPtrs [kNumLevels]int
}
// Expand compacted tables; need external synchronization.
func (c *compaction) expand() {
- s := c.s
- v := c.version
- icmp := s.cmp
- ucmp := icmp.cmp
-
level := c.level
- vt0, vt1 := v.tables[level], v.tables[level+1]
+ vt0, vt1 := c.v.tables[level], c.v.tables[level+1]
t0, t1 := c.tables[0], c.tables[1]
- min, max := t0.getRange(icmp)
- vt1.getOverlaps(min.ukey(), max.ukey(), &t1, true, ucmp)
-
- // Get entire range covered by compaction
- amin, amax := append(t0, t1...).getRange(icmp)
+ imin, imax := t0.getRange(c.s.icmp)
+ t1 = vt1.getOverlaps(t1, c.s.icmp, imin.ukey(), imax.ukey(), false)
+ // Get entire range covered by compaction.
+ amin, amax := append(t0, t1...).getRange(c.s.icmp)
// See if we can grow the number of inputs in "level" without
// changing the number of "level+1" files we pick up.
if len(t1) > 0 {
- var exp0 tFiles
- vt0.getOverlaps(amin.ukey(), amax.ukey(), &exp0, level != 0, ucmp)
+ exp0 := vt0.getOverlaps(nil, c.s.icmp, amin.ukey(), amax.ukey(), level == 0)
if len(exp0) > len(t0) && t1.size()+exp0.size() < kExpCompactionMaxBytes {
- var exp1 tFiles
- xmin, xmax := exp0.getRange(icmp)
- vt1.getOverlaps(xmin.ukey(), xmax.ukey(), &exp1, true, ucmp)
+ xmin, xmax := exp0.getRange(c.s.icmp)
+ exp1 := vt1.getOverlaps(nil, c.s.icmp, xmin.ukey(), xmax.ukey(), false)
if len(exp1) == len(t1) {
- s.logf("table@compaction expanding L%d+L%d (F·%d S·%s)+(F·%d S·%s) -> (F·%d S·%s)+(F·%d S·%s)",
+ c.s.logf("table@compaction expanding L%d+L%d (F·%d S·%s)+(F·%d S·%s) -> (F·%d S·%s)+(F·%d S·%s)",
level, level+1, len(t0), shortenb(int(t0.size())), len(t1), shortenb(int(t1.size())),
len(exp0), shortenb(int(exp0.size())), len(exp1), shortenb(int(exp1.size())))
- min, max = xmin, xmax
+ imin, imax = xmin, xmax
t0, t1 = exp0, exp1
- amin, amax = append(t0, t1...).getRange(icmp)
+ amin, amax = append(t0, t1...).getRange(c.s.icmp)
}
}
}
@@ -314,11 +310,11 @@ func (c *compaction) expand() {
// Compute the set of grandparent files that overlap this compaction
// (parent == level+1; grandparent == level+2)
if level+2 < kNumLevels {
- v.tables[level+2].getOverlaps(amin.ukey(), amax.ukey(), &c.gp, true, ucmp)
+ c.gp = c.v.tables[level+2].getOverlaps(c.gp, c.s.icmp, amin.ukey(), amax.ukey(), false)
}
c.tables[0], c.tables[1] = t0, t1
- c.min, c.max = min, max
+ c.imin, c.imax = imin, imax
}
// Check whether compaction is trivial.
@@ -326,17 +322,14 @@ func (c *compaction) trivial() bool {
return len(c.tables[0]) == 1 && len(c.tables[1]) == 0 && c.gp.size() <= kMaxGrandParentOverlapBytes
}
-func (c *compaction) isBaseLevelForKey(key []byte) bool {
- s := c.s
- v := c.version
- ucmp := s.cmp.cmp
- for level, tt := range v.tables[c.level+2:] {
- for c.tPtrs[level] < len(tt) {
- t := tt[c.tPtrs[level]]
- if ucmp.Compare(key, t.max.ukey()) <= 0 {
- // We've advanced far enough
- if ucmp.Compare(key, t.min.ukey()) >= 0 {
- // Key falls in this file's range, so definitely not base level
+func (c *compaction) baseLevelForKey(ukey []byte) bool {
+ for level, tables := range c.v.tables[c.level+2:] {
+ for c.tPtrs[level] < len(tables) {
+ t := tables[c.tPtrs[level]]
+ if c.s.icmp.uCompare(ukey, t.imax.ukey()) <= 0 {
+ // We've advanced far enough.
+ if c.s.icmp.uCompare(ukey, t.imin.ukey()) >= 0 {
+ // Key falls in this file's range, so definitely not base level.
return false
}
break
@@ -347,11 +340,10 @@ func (c *compaction) isBaseLevelForKey(key []byte) bool {
return true
}
-func (c *compaction) shouldStopBefore(key iKey) bool {
- icmp := c.s.cmp
+func (c *compaction) shouldStopBefore(ikey iKey) bool {
for ; c.gpidx < len(c.gp); c.gpidx++ {
gp := c.gp[c.gpidx]
- if icmp.Compare(key, gp.max) <= 0 {
+ if c.s.icmp.Compare(ikey, gp.imax) <= 0 {
break
}
if c.seenKey {
@@ -361,43 +353,44 @@ func (c *compaction) shouldStopBefore(key iKey) bool {
c.seenKey = true
if c.overlappedBytes > kMaxGrandParentOverlapBytes {
- // Too much overlap for current output; start new output
+ // Too much overlap for current output; start new output.
c.overlappedBytes = 0
return true
}
return false
}
+// Creates an iterator.
func (c *compaction) newIterator() iterator.Iterator {
- s := c.s
- icmp := s.cmp
-
- level := c.level
- icap := 2
+ // Creates iterator slice.
+ icap := len(c.tables)
if c.level == 0 {
+ // Special case for level-0
icap = len(c.tables[0]) + 1
}
its := make([]iterator.Iterator, 0, icap)
+ // Options.
ro := &opt.ReadOptions{
DontFillCache: true,
}
- strict := s.o.GetStrict(opt.StrictIterator)
+ strict := c.s.o.GetStrict(opt.StrictIterator)
- for i, tt := range c.tables {
- if len(tt) == 0 {
+ for i, tables := range c.tables {
+ if len(tables) == 0 {
continue
}
- if level+i == 0 {
- for _, t := range tt {
- its = append(its, s.tops.newIterator(t, nil, ro))
+ // Level-0 is not sorted and may overlaps each other.
+ if c.level+i == 0 {
+ for _, t := range tables {
+ its = append(its, c.s.tops.newIterator(t, nil, ro))
}
} else {
- it := iterator.NewIndexedIterator(tt.newIndexIterator(s.tops, icmp, nil, ro), strict, true)
+ it := iterator.NewIndexedIterator(tables.newIndexIterator(c.s.tops, c.s.icmp, nil, ro), strict, true)
its = append(its, it)
}
}
- return iterator.NewMergedIterator(its, icmp, true)
+ return iterator.NewMergedIterator(its, c.s.icmp, true)
}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/session_record.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/session_record.go
index c50fda73..27212958 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/session_record.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/session_record.go
@@ -35,19 +35,19 @@ const (
type cpRecord struct {
level int
- key iKey
+ ikey iKey
}
type ntRecord struct {
level int
num uint64
size uint64
- min iKey
- max iKey
+ imin iKey
+ imax iKey
}
func (r ntRecord) makeFile(s *session) *tFile {
- return newTFile(s.getTableFile(r.num), r.size, r.min, r.max)
+ return newTableFile(s.getTableFile(r.num), r.size, r.imin, r.imax)
}
type dtRecord struct {
@@ -98,9 +98,9 @@ func (p *sessionRecord) setSeq(seq uint64) {
p.seq = seq
}
-func (p *sessionRecord) addCompactionPointer(level int, key iKey) {
+func (p *sessionRecord) addCompactionPointer(level int, ikey iKey) {
p.hasRec |= 1 << recCompactionPointer
- p.compactionPointers = append(p.compactionPointers, cpRecord{level, key})
+ p.compactionPointers = append(p.compactionPointers, cpRecord{level, ikey})
}
func (p *sessionRecord) resetCompactionPointers() {
@@ -108,13 +108,13 @@ func (p *sessionRecord) resetCompactionPointers() {
p.compactionPointers = p.compactionPointers[:0]
}
-func (p *sessionRecord) addTable(level int, num, size uint64, min, max iKey) {
+func (p *sessionRecord) addTable(level int, num, size uint64, imin, imax iKey) {
p.hasRec |= 1 << recNewTable
- p.addedTables = append(p.addedTables, ntRecord{level, num, size, min, max})
+ p.addedTables = append(p.addedTables, ntRecord{level, num, size, imin, imax})
}
func (p *sessionRecord) addTableFile(level int, t *tFile) {
- p.addTable(level, t.file.Num(), t.size, t.min, t.max)
+ p.addTable(level, t.file.Num(), t.size, t.imin, t.imax)
}
func (p *sessionRecord) resetAddedTables() {
@@ -169,23 +169,23 @@ func (p *sessionRecord) encode(w io.Writer) error {
p.putUvarint(w, recSeq)
p.putUvarint(w, p.seq)
}
- for _, cp := range p.compactionPointers {
+ for _, r := range p.compactionPointers {
p.putUvarint(w, recCompactionPointer)
- p.putUvarint(w, uint64(cp.level))
- p.putBytes(w, cp.key)
+ p.putUvarint(w, uint64(r.level))
+ p.putBytes(w, r.ikey)
}
- for _, t := range p.deletedTables {
+ for _, r := range p.deletedTables {
p.putUvarint(w, recDeletedTable)
- p.putUvarint(w, uint64(t.level))
- p.putUvarint(w, t.num)
+ p.putUvarint(w, uint64(r.level))
+ p.putUvarint(w, r.num)
}
- for _, t := range p.addedTables {
+ for _, r := range p.addedTables {
p.putUvarint(w, recNewTable)
- p.putUvarint(w, uint64(t.level))
- p.putUvarint(w, t.num)
- p.putUvarint(w, t.size)
- p.putBytes(w, t.min)
- p.putBytes(w, t.max)
+ p.putUvarint(w, uint64(r.level))
+ p.putUvarint(w, r.num)
+ p.putUvarint(w, r.size)
+ p.putBytes(w, r.imin)
+ p.putBytes(w, r.imax)
}
return p.err
}
@@ -282,18 +282,18 @@ func (p *sessionRecord) decode(r io.Reader) error {
}
case recCompactionPointer:
level := p.readLevel(br)
- key := p.readBytes(br)
+ ikey := p.readBytes(br)
if p.err == nil {
- p.addCompactionPointer(level, iKey(key))
+ p.addCompactionPointer(level, iKey(ikey))
}
case recNewTable:
level := p.readLevel(br)
num := p.readUvarint(br)
size := p.readUvarint(br)
- min := p.readBytes(br)
- max := p.readBytes(br)
+ imin := p.readBytes(br)
+ imax := p.readBytes(br)
if p.err == nil {
- p.addTable(level, num, size, min, max)
+ p.addTable(level, num, size, imin, imax)
}
case recDeletedTable:
level := p.readLevel(br)
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/session_util.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/session_util.go
index 863603d0..715c9f5b 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/session_util.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/session_util.go
@@ -14,7 +14,7 @@ import (
"github.com/syndtr/goleveldb/leveldb/storage"
)
-// logging
+// Logging.
type dropper struct {
s *session
@@ -22,22 +22,17 @@ type dropper struct {
}
func (d dropper) Drop(err error) {
- if e, ok := err.(journal.DroppedError); ok {
+ if e, ok := err.(journal.ErrCorrupted); ok {
d.s.logf("journal@drop %s-%d S·%s %q", d.file.Type(), d.file.Num(), shortenb(e.Size), e.Reason)
} else {
d.s.logf("journal@drop %s-%d %q", d.file.Type(), d.file.Num(), err)
}
}
-func (s *session) log(v ...interface{}) {
- s.stor.Log(fmt.Sprint(v...))
-}
+func (s *session) log(v ...interface{}) { s.stor.Log(fmt.Sprint(v...)) }
+func (s *session) logf(format string, v ...interface{}) { s.stor.Log(fmt.Sprintf(format, v...)) }
-func (s *session) logf(format string, v ...interface{}) {
- s.stor.Log(fmt.Sprintf(format, v...))
-}
-
-// file utils
+// File utils.
func (s *session) getJournalFile(num uint64) storage.File {
return s.stor.GetFile(num, storage.TypeJournal)
@@ -56,7 +51,7 @@ func (s *session) newTemp() storage.File {
return s.stor.GetFile(num, storage.TypeTemp)
}
-// session state
+// Session state.
// Get current version.
func (s *session) version() *version {
@@ -126,7 +121,7 @@ func (s *session) reuseFileNum(num uint64) {
}
}
-// manifest related utils
+// Manifest related utils.
// Fill given session record obj with current states; need external
// synchronization.
@@ -142,17 +137,17 @@ func (s *session) fillRecord(r *sessionRecord, snapshot bool) {
r.setSeq(s.stSeq)
}
- for level, ik := range s.stCPtrs {
+ for level, ik := range s.stCptrs {
if ik != nil {
r.addCompactionPointer(level, ik)
}
}
- r.setComparer(s.cmp.cmp.Name())
+ r.setComparer(s.icmp.uName())
}
}
-// Mark if record has been commited, this will update session state;
+// Mark if record has been committed, this will update session state;
// need external synchronization.
func (s *session) recordCommited(r *sessionRecord) {
if r.has(recJournalNum) {
@@ -168,7 +163,7 @@ func (s *session) recordCommited(r *sessionRecord) {
}
for _, p := range r.compactionPointers {
- s.stCPtrs[p.level] = iKey(p.key)
+ s.stCptrs[p.level] = iKey(p.ikey)
}
}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/storage/file_storage.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/storage/file_storage.go
index aef620db..75439f6d 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/storage/file_storage.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/storage/file_storage.go
@@ -343,6 +343,20 @@ type fileWrap struct {
f *file
}
+func (fw fileWrap) Sync() error {
+ if err := fw.File.Sync(); err != nil {
+ return err
+ }
+ if fw.f.Type() == TypeManifest {
+ // Also sync parent directory if file type is manifest.
+ // See: https://code.google.com/p/leveldb/issues/detail?id=190.
+ if err := syncDir(fw.f.fs.path); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
func (fw fileWrap) Close() error {
f := fw.f
f.fs.mu.Lock()
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/storage/file_storage_plan9.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/storage/file_storage_plan9.go
index 9e3f19b2..42940d76 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/storage/file_storage_plan9.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/storage/file_storage_plan9.go
@@ -38,3 +38,15 @@ func rename(oldpath, newpath string) error {
_, fname := filepath.Split(newpath)
return os.Rename(oldpath, fname)
}
+
+func syncDir(name string) error {
+ f, err := os.Open(name)
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+ if err := f.Sync(); err != nil {
+ return err
+ }
+ return nil
+}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/storage/file_storage_solaris.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/storage/file_storage_solaris.go
new file mode 100644
index 00000000..102031bf
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/storage/file_storage_solaris.go
@@ -0,0 +1,68 @@
+// Copyright (c) 2012, Suryandaru Triandana
+// All rights reserved.
+//
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// +build solaris
+
+package storage
+
+import (
+ "os"
+ "syscall"
+)
+
+type unixFileLock struct {
+ f *os.File
+}
+
+func (fl *unixFileLock) release() error {
+ if err := setFileLock(fl.f, false); err != nil {
+ return err
+ }
+ return fl.f.Close()
+}
+
+func newFileLock(path string) (fl fileLock, err error) {
+ f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0644)
+ if err != nil {
+ return
+ }
+ err = setFileLock(f, true)
+ if err != nil {
+ f.Close()
+ return
+ }
+ fl = &unixFileLock{f: f}
+ return
+}
+
+func setFileLock(f *os.File, lock bool) error {
+ flock := syscall.Flock_t{
+ Type: syscall.F_UNLCK,
+ Start: 0,
+ Len: 0,
+ Whence: 1,
+ }
+ if lock {
+ flock.Type = syscall.F_WRLCK
+ }
+ return syscall.FcntlFlock(f.Fd(), syscall.F_SETLK, &flock)
+}
+
+func rename(oldpath, newpath string) error {
+ return os.Rename(oldpath, newpath)
+}
+
+func syncDir(name string) error {
+ f, err := os.Open(name)
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+ if err := f.Sync(); err != nil {
+ return err
+ }
+ return nil
+}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/storage/file_storage_unix.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/storage/file_storage_unix.go
index 395db2d2..d0a604b7 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/storage/file_storage_unix.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/storage/file_storage_unix.go
@@ -4,7 +4,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// +build darwin freebsd linux netbsd openbsd
+// +build darwin dragonfly freebsd linux netbsd openbsd
package storage
@@ -49,3 +49,15 @@ func setFileLock(f *os.File, lock bool) error {
func rename(oldpath, newpath string) error {
return os.Rename(oldpath, newpath)
}
+
+func syncDir(name string) error {
+ f, err := os.Open(name)
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+ if err := f.Sync(); err != nil {
+ return err
+ }
+ return nil
+}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/storage/file_storage_windows.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/storage/file_storage_windows.go
index b834b18f..50c3c454 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/storage/file_storage_windows.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/storage/file_storage_windows.go
@@ -65,3 +65,5 @@ func rename(oldpath, newpath string) error {
}
return moveFileEx(from, to, _MOVEFILE_REPLACE_EXISTING)
}
+
+func syncDir(name string) error { return nil }
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/storage/storage.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/storage/storage.go
index d951d975..5a1885e6 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/storage/storage.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/storage/storage.go
@@ -9,6 +9,7 @@ package storage
import (
"errors"
+ "fmt"
"io"
"github.com/syndtr/goleveldb/leveldb/util"
@@ -36,7 +37,7 @@ func (t FileType) String() string {
case TypeTemp:
return "temp"
}
- return ""
+ return fmt.Sprintf("", t)
}
var (
@@ -66,7 +67,7 @@ type Writer interface {
Syncer
}
-// File is the file.
+// File is the file. A file instance must be goroutine-safe.
type File interface {
// Open opens the file for read. Returns os.ErrNotExist error
// if the file does not exist.
@@ -93,7 +94,7 @@ type File interface {
Remove() error
}
-// Storage is the storage.
+// Storage is the storage. A storage instance must be goroutine-safe.
type Storage interface {
// Lock locks the storage. Any subsequent attempt to call Lock will fail
// until the last lock released.
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/storage_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/storage_test.go
index 909423e1..27e76d70 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/storage_test.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/storage_test.go
@@ -20,7 +20,7 @@ import (
"github.com/syndtr/goleveldb/leveldb/util"
)
-const typeShift = 3
+const typeShift = 4
var (
tsErrInvalidFile = errors.New("leveldb.testStorage: invalid file for argument")
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/table.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/table.go
index bc20c2f7..87c4e155 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/table.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/table.go
@@ -7,11 +7,12 @@
package leveldb
import (
+ "fmt"
"sort"
+ "sync"
"sync/atomic"
"github.com/syndtr/goleveldb/leveldb/cache"
- "github.com/syndtr/goleveldb/leveldb/comparer"
"github.com/syndtr/goleveldb/leveldb/iterator"
"github.com/syndtr/goleveldb/leveldb/opt"
"github.com/syndtr/goleveldb/leveldb/storage"
@@ -19,34 +20,41 @@ import (
"github.com/syndtr/goleveldb/leveldb/util"
)
-// table file
+// tFile holds basic information about a table.
type tFile struct {
- file storage.File
- seekLeft int32
- size uint64
- min, max iKey
+ file storage.File
+ seekLeft int32
+ size uint64
+ imin, imax iKey
}
-// test if key is after t
-func (t *tFile) isAfter(key []byte, ucmp comparer.BasicComparer) bool {
- return key != nil && ucmp.Compare(key, t.max.ukey()) > 0
+// Returns true if given key is after largest key of this table.
+func (t *tFile) after(icmp *iComparer, ukey []byte) bool {
+ return ukey != nil && icmp.uCompare(ukey, t.imax.ukey()) > 0
}
-// test if key is before t
-func (t *tFile) isBefore(key []byte, ucmp comparer.BasicComparer) bool {
- return key != nil && ucmp.Compare(key, t.min.ukey()) < 0
+// Returns true if given key is before smallest key of this table.
+func (t *tFile) before(icmp *iComparer, ukey []byte) bool {
+ return ukey != nil && icmp.uCompare(ukey, t.imin.ukey()) < 0
}
-func (t *tFile) incrSeek() int32 {
+// Returns true if given key range overlaps with this table key range.
+func (t *tFile) overlaps(icmp *iComparer, umin, umax []byte) bool {
+ return !t.after(icmp, umin) && !t.before(icmp, umax)
+}
+
+// Cosumes one seek and return current seeks left.
+func (t *tFile) consumeSeek() int32 {
return atomic.AddInt32(&t.seekLeft, -1)
}
-func newTFile(file storage.File, size uint64, min, max iKey) *tFile {
+// Creates new tFile.
+func newTableFile(file storage.File, size uint64, imin, imax iKey) *tFile {
f := &tFile{
file: file,
size: size,
- min: min,
- max: max,
+ imin: imin,
+ imax: imax,
}
// We arrange to automatically compact this file after
@@ -70,33 +78,40 @@ func newTFile(file storage.File, size uint64, min, max iKey) *tFile {
return f
}
-// table files
+// tFiles hold multiple tFile.
type tFiles []*tFile
func (tf tFiles) Len() int { return len(tf) }
func (tf tFiles) Swap(i, j int) { tf[i], tf[j] = tf[j], tf[i] }
+// Returns true if i smallest key is less than j.
+// This used for sort by key in ascending order.
func (tf tFiles) lessByKey(icmp *iComparer, i, j int) bool {
a, b := tf[i], tf[j]
- n := icmp.Compare(a.min, b.min)
+ n := icmp.Compare(a.imin, b.imin)
if n == 0 {
return a.file.Num() < b.file.Num()
}
return n < 0
}
+// Returns true if i file number is greater than j.
+// This used for sort by file number in descending order.
func (tf tFiles) lessByNum(i, j int) bool {
return tf[i].file.Num() > tf[j].file.Num()
}
+// Sorts tables by key in ascending order.
func (tf tFiles) sortByKey(icmp *iComparer) {
sort.Sort(&tFilesSortByKey{tFiles: tf, icmp: icmp})
}
+// Sorts tables by file number in descending order.
func (tf tFiles) sortByNum() {
sort.Sort(&tFilesSortByNum{tFiles: tf})
}
+// Returns sum of all tables size.
func (tf tFiles) size() (sum uint64) {
for _, t := range tf {
sum += t.size
@@ -104,96 +119,106 @@ func (tf tFiles) size() (sum uint64) {
return sum
}
-func (tf tFiles) searchMin(key iKey, icmp *iComparer) int {
+// Searches smallest index of tables whose its smallest
+// key is after or equal with given key.
+func (tf tFiles) searchMin(icmp *iComparer, ikey iKey) int {
return sort.Search(len(tf), func(i int) bool {
- return icmp.Compare(tf[i].min, key) >= 0
+ return icmp.Compare(tf[i].imin, ikey) >= 0
})
}
-func (tf tFiles) searchMax(key iKey, icmp *iComparer) int {
+// Searches smallest index of tables whose its largest
+// key is after or equal with given key.
+func (tf tFiles) searchMax(icmp *iComparer, ikey iKey) int {
return sort.Search(len(tf), func(i int) bool {
- return icmp.Compare(tf[i].max, key) >= 0
+ return icmp.Compare(tf[i].imax, ikey) >= 0
})
}
-func (tf tFiles) isOverlaps(min, max []byte, disjSorted bool, icmp *iComparer) bool {
- ucmp := icmp.cmp
-
- if !disjSorted {
- // Need to check against all files
+// Returns true if given key range overlaps with one or more
+// tables key range. If unsorted is true then binary search will not be used.
+func (tf tFiles) overlaps(icmp *iComparer, umin, umax []byte, unsorted bool) bool {
+ if unsorted {
+ // Check against all files.
for _, t := range tf {
- if !t.isAfter(min, ucmp) && !t.isBefore(max, ucmp) {
+ if t.overlaps(icmp, umin, umax) {
return true
}
}
return false
}
- var idx int
- if len(min) > 0 {
- // Find the earliest possible internal key for min
- idx = tf.searchMax(newIKey(min, kMaxSeq, tSeek), icmp)
+ i := 0
+ if len(umin) > 0 {
+ // Find the earliest possible internal key for min.
+ i = tf.searchMax(icmp, newIKey(umin, kMaxSeq, tSeek))
}
-
- if idx >= len(tf) {
- // beginning of range is after all files, so no overlap
+ if i >= len(tf) {
+ // Beginning of range is after all files, so no overlap.
return false
}
- return !tf[idx].isBefore(max, ucmp)
+ return !tf[i].before(icmp, umax)
}
-func (tf tFiles) getOverlaps(min, max []byte, r *tFiles, disjSorted bool, ucmp comparer.BasicComparer) {
+// Returns tables whose its key range overlaps with given key range.
+// If overlapped is true then the search will be expanded to tables that
+// overlaps with each other.
+func (tf tFiles) getOverlaps(dst tFiles, icmp *iComparer, umin, umax []byte, overlapped bool) tFiles {
+ x := len(dst)
for i := 0; i < len(tf); {
t := tf[i]
- i++
- if t.isAfter(min, ucmp) || t.isBefore(max, ucmp) {
- continue
- }
-
- *r = append(*r, t)
- if !disjSorted {
- // Level-0 files may overlap each other. So check if the newly
- // added file has expanded the range. If so, restart search.
- if min != nil && ucmp.Compare(t.min.ukey(), min) < 0 {
- min = t.min.ukey()
- *r = nil
- i = 0
- } else if max != nil && ucmp.Compare(t.max.ukey(), max) > 0 {
- max = t.max.ukey()
- *r = nil
- i = 0
+ if t.overlaps(icmp, umin, umax) {
+ if overlapped {
+ // For overlapped files, check if the newly added file has
+ // expanded the range. If so, restart search.
+ if umin != nil && icmp.uCompare(t.imin.ukey(), umin) < 0 {
+ umin = t.imin.ukey()
+ dst = dst[:x]
+ i = 0
+ continue
+ } else if umax != nil && icmp.uCompare(t.imax.ukey(), umax) > 0 {
+ umax = t.imax.ukey()
+ dst = dst[:x]
+ i = 0
+ continue
+ }
}
+
+ dst = append(dst, t)
}
+ i++
}
- return
+ return dst
}
-func (tf tFiles) getRange(icmp *iComparer) (min, max iKey) {
+// Returns tables key range.
+func (tf tFiles) getRange(icmp *iComparer) (imin, imax iKey) {
for i, t := range tf {
if i == 0 {
- min, max = t.min, t.max
+ imin, imax = t.imin, t.imax
continue
}
- if icmp.Compare(t.min, min) < 0 {
- min = t.min
+ if icmp.Compare(t.imin, imin) < 0 {
+ imin = t.imin
}
- if icmp.Compare(t.max, max) > 0 {
- max = t.max
+ if icmp.Compare(t.imax, imax) > 0 {
+ imax = t.imax
}
}
return
}
+// Creates iterator index from tables.
func (tf tFiles) newIndexIterator(tops *tOps, icmp *iComparer, slice *util.Range, ro *opt.ReadOptions) iterator.IteratorIndexer {
if slice != nil {
var start, limit int
if slice.Start != nil {
- start = tf.searchMax(iKey(slice.Start), icmp)
+ start = tf.searchMax(icmp, iKey(slice.Start))
}
if slice.Limit != nil {
- limit = tf.searchMin(iKey(slice.Limit), icmp)
+ limit = tf.searchMin(icmp, iKey(slice.Limit))
} else {
limit = tf.Len()
}
@@ -208,6 +233,7 @@ func (tf tFiles) newIndexIterator(tops *tOps, icmp *iComparer, slice *util.Range
})
}
+// Tables iterator index.
type tFilesArrayIndexer struct {
tFiles
tops *tOps
@@ -217,7 +243,7 @@ type tFilesArrayIndexer struct {
}
func (a *tFilesArrayIndexer) Search(key []byte) int {
- return a.searchMax(iKey(key), a.icmp)
+ return a.searchMax(a.icmp, iKey(key))
}
func (a *tFilesArrayIndexer) Get(i int) iterator.Iterator {
@@ -227,6 +253,7 @@ func (a *tFilesArrayIndexer) Get(i int) iterator.Iterator {
return a.tops.newIterator(a.tFiles[i], nil, a.ro)
}
+// Helper type for sortByKey.
type tFilesSortByKey struct {
tFiles
icmp *iComparer
@@ -236,6 +263,7 @@ func (x *tFilesSortByKey) Less(i, j int) bool {
return x.lessByKey(x.icmp, i, j)
}
+// Helper type for sortByNum.
type tFilesSortByNum struct {
tFiles
}
@@ -244,19 +272,17 @@ func (x *tFilesSortByNum) Less(i, j int) bool {
return x.lessByNum(i, j)
}
-// table operations
+// Table operations.
type tOps struct {
s *session
cache cache.Cache
cacheNS cache.Namespace
+ bpool *util.BufferPool
+ mu sync.Mutex
+ closed bool
}
-func newTableOps(s *session, cacheCap int) *tOps {
- c := cache.NewLRUCache(cacheCap)
- ns := c.GetNamespace(0)
- return &tOps{s, c, ns}
-}
-
+// Creates an empty table and returns table writer.
func (t *tOps) create() (*tWriter, error) {
file := t.s.getTableFile(t.s.allocFileNum())
fw, err := file.Create()
@@ -271,10 +297,11 @@ func (t *tOps) create() (*tWriter, error) {
}, nil
}
+// Builds table from src iterator.
func (t *tOps) createFrom(src iterator.Iterator) (f *tFile, n int, err error) {
w, err := t.create()
if err != nil {
- return f, n, err
+ return
}
defer func() {
@@ -284,7 +311,7 @@ func (t *tOps) createFrom(src iterator.Iterator) (f *tFile, n int, err error) {
}()
for src.Next() {
- err = w.add(src.Key(), src.Value())
+ err = w.append(src.Key(), src.Value())
if err != nil {
return
}
@@ -299,84 +326,142 @@ func (t *tOps) createFrom(src iterator.Iterator) (f *tFile, n int, err error) {
return
}
-func (t *tOps) lookup(f *tFile) (c cache.Object, err error) {
+type trWrapper struct {
+ *table.Reader
+ t *tOps
+ ref int
+}
+
+func (w *trWrapper) Release() {
+ if w.ref != 0 && !w.t.closed {
+ panic(fmt.Sprintf("BUG: invalid ref %d, refer to issue #72", w.ref))
+ }
+ w.Reader.Release()
+}
+
+type trCacheHandleWrapper struct {
+ cache.Handle
+ t *tOps
+ released bool
+}
+
+func (w *trCacheHandleWrapper) Release() {
+ w.t.mu.Lock()
+ defer w.t.mu.Unlock()
+
+ if !w.released {
+ w.released = true
+ w.Value().(*trWrapper).ref--
+ }
+ w.Handle.Release()
+}
+
+// Opens table. It returns a cache handle, which should
+// be released after use.
+func (t *tOps) open(f *tFile) (ch cache.Handle, err error) {
+ t.mu.Lock()
+ defer t.mu.Unlock()
+
num := f.file.Num()
- c, ok := t.cacheNS.Get(num, func() (ok bool, value interface{}, charge int, fin cache.SetFin) {
+ ch = t.cacheNS.Get(num, func() (charge int, value interface{}) {
var r storage.Reader
r, err = f.file.Open()
if err != nil {
- return
+ return 0, nil
}
- o := t.s.o
-
- var cacheNS cache.Namespace
- if bc := o.GetBlockCache(); bc != nil {
- cacheNS = bc.GetNamespace(num)
+ var bcacheNS cache.Namespace
+ if bc := t.s.o.GetBlockCache(); bc != nil {
+ bcacheNS = bc.GetNamespace(num)
}
-
- ok = true
- value = table.NewReader(r, int64(f.size), cacheNS, o)
- charge = 1
- fin = func() {
- r.Close()
- }
- return
+ return 1, &trWrapper{table.NewReader(r, int64(f.size), bcacheNS, t.bpool, t.s.o), t, 0}
})
- if !ok && err == nil {
+ if ch == nil && err == nil {
err = ErrClosed
}
+ ch.Value().(*trWrapper).ref++
+ ch = &trCacheHandleWrapper{ch, t, false}
return
}
-func (t *tOps) get(f *tFile, key []byte, ro *opt.ReadOptions) (rkey, rvalue []byte, err error) {
- c, err := t.lookup(f)
+// Finds key/value pair whose key is greater than or equal to the
+// given key.
+func (t *tOps) find(f *tFile, key []byte, ro *opt.ReadOptions) (rkey, rvalue []byte, err error) {
+ ch, err := t.open(f)
if err != nil {
return nil, nil, err
}
- defer c.Release()
- return c.Value().(*table.Reader).Find(key, ro)
+ defer ch.Release()
+ return ch.Value().(*trWrapper).Find(key, ro)
}
-func (t *tOps) getApproximateOffset(f *tFile, key []byte) (offset uint64, err error) {
- c, err := t.lookup(f)
+// Returns approximate offset of the given key.
+func (t *tOps) offsetOf(f *tFile, key []byte) (offset uint64, err error) {
+ ch, err := t.open(f)
if err != nil {
return
}
- _offset, err := c.Value().(*table.Reader).GetApproximateOffset(key)
- offset = uint64(_offset)
- c.Release()
- return
+ defer ch.Release()
+ offset_, err := ch.Value().(*trWrapper).OffsetOf(key)
+ return uint64(offset_), err
}
+// Creates an iterator from the given table.
func (t *tOps) newIterator(f *tFile, slice *util.Range, ro *opt.ReadOptions) iterator.Iterator {
- c, err := t.lookup(f)
+ ch, err := t.open(f)
if err != nil {
return iterator.NewEmptyIterator(err)
}
- iter := c.Value().(*table.Reader).NewIterator(slice, ro)
- iter.SetReleaser(c)
+ iter := ch.Value().(*trWrapper).NewIterator(slice, ro)
+ iter.SetReleaser(ch)
return iter
}
+// Removes table from persistent storage. It waits until
+// no one use the the table.
func (t *tOps) remove(f *tFile) {
+ t.mu.Lock()
+ defer t.mu.Unlock()
+
num := f.file.Num()
- t.cacheNS.Delete(num, func(exist bool) {
- if err := f.file.Remove(); err != nil {
- t.s.logf("table@remove removing @%d %q", num, err)
- } else {
- t.s.logf("table@remove removed @%d", num)
- }
- if bc := t.s.o.GetBlockCache(); bc != nil {
- bc.GetNamespace(num).Zap(false)
+ t.cacheNS.Delete(num, func(exist, pending bool) {
+ if !pending {
+ if err := f.file.Remove(); err != nil {
+ t.s.logf("table@remove removing @%d %q", num, err)
+ } else {
+ t.s.logf("table@remove removed @%d", num)
+ }
+ if bc := t.s.o.GetBlockCache(); bc != nil {
+ bc.ZapNamespace(num)
+ }
}
})
}
+// Closes the table ops instance. It will close all tables,
+// regadless still used or not.
func (t *tOps) close() {
- t.cache.Zap(true)
+ t.mu.Lock()
+ defer t.mu.Unlock()
+
+ t.closed = true
+ t.cache.Zap()
+ t.bpool.Close()
}
+// Creates new initialized table ops instance.
+func newTableOps(s *session, cacheCap int) *tOps {
+ c := cache.NewLRUCache(cacheCap)
+ return &tOps{
+ s: s,
+ cache: c,
+ cacheNS: c.GetNamespace(0),
+ bpool: util.NewBufferPool(s.o.GetBlockSize() + 5),
+ }
+}
+
+// tWriter wraps the table writer. It keep track of file descriptor
+// and added key range.
type tWriter struct {
t *tOps
@@ -387,7 +472,8 @@ type tWriter struct {
first, last []byte
}
-func (w *tWriter) add(key, value []byte) error {
+// Append key/value pair to the table.
+func (w *tWriter) append(key, value []byte) error {
if w.first == nil {
w.first = append([]byte{}, key...)
}
@@ -395,10 +481,12 @@ func (w *tWriter) add(key, value []byte) error {
return w.tw.Append(key, value)
}
+// Returns true if the table is empty.
func (w *tWriter) empty() bool {
return w.first == nil
}
+// Finalizes the table and returns table file.
func (w *tWriter) finish() (f *tFile, err error) {
err = w.tw.Close()
if err != nil {
@@ -410,10 +498,11 @@ func (w *tWriter) finish() (f *tFile, err error) {
return
}
w.w.Close()
- f = newTFile(w.file, uint64(w.tw.BytesLen()), iKey(w.first), iKey(w.last))
+ f = newTableFile(w.file, uint64(w.tw.BytesLen()), iKey(w.first), iKey(w.last))
return
}
+// Drops the table.
func (w *tWriter) drop() {
w.w.Close()
w.file.Remove()
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/table/block_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/table/block_test.go
index ca598f4f..f3b53c09 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/table/block_test.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/table/block_test.go
@@ -40,7 +40,7 @@ var _ = testutil.Defer(func() {
data := bw.buf.Bytes()
restartsLen := int(binary.LittleEndian.Uint32(data[len(data)-4:]))
return &block{
- cmp: comparer.DefaultComparer,
+ tr: &Reader{cmp: comparer.DefaultComparer},
data: data,
restartsLen: restartsLen,
restartsOffset: len(data) - (restartsLen+1)*4,
@@ -59,7 +59,7 @@ var _ = testutil.Defer(func() {
// Make block.
br := Build(kv, restartInterval)
// Do testing.
- testutil.KeyValueTesting(nil, br, kv.Clone())
+ testutil.KeyValueTesting(nil, kv.Clone(), br, nil, nil)
}
Describe(Text(), Test)
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/table/reader.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/table/reader.go
index a6200884..ab62c44e 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/table/reader.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/table/reader.go
@@ -13,6 +13,7 @@ import (
"io"
"sort"
"strings"
+ "sync"
"code.google.com/p/snappy-go/snappy"
@@ -25,8 +26,9 @@ import (
)
var (
- ErrNotFound = util.ErrNotFound
- ErrIterReleased = errors.New("leveldb/table: iterator released")
+ ErrNotFound = util.ErrNotFound
+ ErrReaderReleased = errors.New("leveldb/table: reader released")
+ ErrIterReleased = errors.New("leveldb/table: iterator released")
)
func max(x, y int) int {
@@ -37,7 +39,7 @@ func max(x, y int) int {
}
type block struct {
- cmp comparer.BasicComparer
+ tr *Reader
data []byte
restartsLen int
restartsOffset int
@@ -46,31 +48,25 @@ type block struct {
}
func (b *block) seek(rstart, rlimit int, key []byte) (index, offset int, err error) {
- n := b.restartsOffset
- data := b.data
- cmp := b.cmp
-
index = sort.Search(b.restartsLen-rstart-(b.restartsLen-rlimit), func(i int) bool {
- offset := int(binary.LittleEndian.Uint32(data[n+4*(rstart+i):]))
- offset += 1 // shared always zero, since this is a restart point
- v1, n1 := binary.Uvarint(data[offset:]) // key length
- _, n2 := binary.Uvarint(data[offset+n1:]) // value length
+ offset := int(binary.LittleEndian.Uint32(b.data[b.restartsOffset+4*(rstart+i):]))
+ offset += 1 // shared always zero, since this is a restart point
+ v1, n1 := binary.Uvarint(b.data[offset:]) // key length
+ _, n2 := binary.Uvarint(b.data[offset+n1:]) // value length
m := offset + n1 + n2
- return cmp.Compare(data[m:m+int(v1)], key) > 0
+ return b.tr.cmp.Compare(b.data[m:m+int(v1)], key) > 0
}) + rstart - 1
if index < rstart {
// The smallest key is greater-than key sought.
index = rstart
}
- offset = int(binary.LittleEndian.Uint32(data[n+4*index:]))
+ offset = int(binary.LittleEndian.Uint32(b.data[b.restartsOffset+4*index:]))
return
}
func (b *block) restartIndex(rstart, rlimit, offset int) int {
- n := b.restartsOffset
- data := b.data
return sort.Search(b.restartsLen-rstart-(b.restartsLen-rlimit), func(i int) bool {
- return int(binary.LittleEndian.Uint32(data[n+4*(rstart+i):])) > offset
+ return int(binary.LittleEndian.Uint32(b.data[b.restartsOffset+4*(rstart+i):])) > offset
}) + rstart - 1
}
@@ -139,6 +135,12 @@ func (b *block) newIterator(slice *util.Range, inclLimit bool, cache util.Releas
return bi
}
+func (b *block) Release() {
+ b.tr.bpool.Put(b.data)
+ b.tr = nil
+ b.data = nil
+}
+
type dir int
const (
@@ -261,7 +263,7 @@ func (i *blockIter) Seek(key []byte) bool {
i.dir = dirForward
}
for i.Next() {
- if i.block.cmp.Compare(i.key, key) >= 0 {
+ if i.block.tr.cmp.Compare(i.key, key) >= 0 {
return true
}
}
@@ -437,25 +439,32 @@ func (i *blockIter) Value() []byte {
}
func (i *blockIter) Release() {
- i.prevNode = nil
- i.prevKeys = nil
- i.key = nil
- i.value = nil
- i.dir = dirReleased
- if i.cache != nil {
- i.cache.Release()
- i.cache = nil
- }
- if i.releaser != nil {
- i.releaser.Release()
- i.releaser = nil
+ if i.dir != dirReleased {
+ i.block = nil
+ i.prevNode = nil
+ i.prevKeys = nil
+ i.key = nil
+ i.value = nil
+ i.dir = dirReleased
+ if i.cache != nil {
+ i.cache.Release()
+ i.cache = nil
+ }
+ if i.releaser != nil {
+ i.releaser.Release()
+ i.releaser = nil
+ }
}
}
func (i *blockIter) SetReleaser(releaser util.Releaser) {
- if i.dir > dirReleased {
- i.releaser = releaser
+ if i.dir == dirReleased {
+ panic(util.ErrReleased)
}
+ if i.releaser != nil && releaser != nil {
+ panic(util.ErrHasReleaser)
+ }
+ i.releaser = releaser
}
func (i *blockIter) Valid() bool {
@@ -467,7 +476,7 @@ func (i *blockIter) Error() error {
}
type filterBlock struct {
- filter filter.Filter
+ tr *Reader
data []byte
oOffset int
baseLg uint
@@ -481,7 +490,7 @@ func (b *filterBlock) contains(offset uint64, key []byte) bool {
n := int(binary.LittleEndian.Uint32(o))
m := int(binary.LittleEndian.Uint32(o[4:]))
if n < m && m <= b.oOffset {
- return b.filter.Contains(b.data[n:m], key)
+ return b.tr.filter.Contains(b.data[n:m], key)
} else if n == m {
return false
}
@@ -489,10 +498,15 @@ func (b *filterBlock) contains(offset uint64, key []byte) bool {
return true
}
+func (b *filterBlock) Release() {
+ b.tr.bpool.Put(b.data)
+ b.tr = nil
+ b.data = nil
+}
+
type indexIter struct {
- blockIter
- tableReader *Reader
- slice *util.Range
+ *blockIter
+ slice *util.Range
// Options
checksum bool
fillCache bool
@@ -507,27 +521,31 @@ func (i *indexIter) Get() iterator.Iterator {
if n == 0 {
return iterator.NewEmptyIterator(errors.New("leveldb/table: Reader: invalid table (bad data block handle)"))
}
+
var slice *util.Range
if i.slice != nil && (i.blockIter.isFirst() || i.blockIter.isLast()) {
slice = i.slice
}
- return i.tableReader.getDataIter(dataBH, slice, i.checksum, i.fillCache)
+ return i.blockIter.block.tr.getDataIterErr(dataBH, slice, i.checksum, i.fillCache)
}
// Reader is a table reader.
type Reader struct {
+ mu sync.RWMutex
reader io.ReaderAt
cache cache.Namespace
err error
+ bpool *util.BufferPool
// Options
cmp comparer.Comparer
filter filter.Filter
checksum bool
strictIter bool
- dataEnd int64
- indexBlock *block
- filterBlock *filterBlock
+ dataEnd int64
+ indexBH, filterBH blockHandle
+ indexBlock *block
+ filterBlock *filterBlock
}
func verifyChecksum(data []byte) bool {
@@ -538,12 +556,13 @@ func verifyChecksum(data []byte) bool {
}
func (r *Reader) readRawBlock(bh blockHandle, checksum bool) ([]byte, error) {
- data := make([]byte, bh.length+blockTrailerLen)
+ data := r.bpool.Get(int(bh.length + blockTrailerLen))
if _, err := r.reader.ReadAt(data, int64(bh.offset)); err != nil && err != io.EOF {
return nil, err
}
if checksum || r.checksum {
if !verifyChecksum(data) {
+ r.bpool.Put(data)
return nil, errors.New("leveldb/table: Reader: invalid block (checksum mismatch)")
}
}
@@ -551,12 +570,18 @@ func (r *Reader) readRawBlock(bh blockHandle, checksum bool) ([]byte, error) {
case blockTypeNoCompression:
data = data[:bh.length]
case blockTypeSnappyCompression:
- var err error
- data, err = snappy.Decode(nil, data[:bh.length])
+ decLen, err := snappy.DecodedLen(data[:bh.length])
+ if err != nil {
+ return nil, err
+ }
+ tmp := data
+ data, err = snappy.Decode(r.bpool.Get(decLen), tmp[:bh.length])
+ r.bpool.Put(tmp)
if err != nil {
return nil, err
}
default:
+ r.bpool.Put(data)
return nil, fmt.Errorf("leveldb/table: Reader: unknown block compression type: %d", data[bh.length])
}
return data, nil
@@ -569,7 +594,7 @@ func (r *Reader) readBlock(bh blockHandle, checksum bool) (*block, error) {
}
restartsLen := int(binary.LittleEndian.Uint32(data[len(data)-4:]))
b := &block{
- cmp: r.cmp,
+ tr: r,
data: data,
restartsLen: restartsLen,
restartsOffset: len(data) - (restartsLen+1)*4,
@@ -578,7 +603,44 @@ func (r *Reader) readBlock(bh blockHandle, checksum bool) (*block, error) {
return b, nil
}
-func (r *Reader) readFilterBlock(bh blockHandle, filter filter.Filter) (*filterBlock, error) {
+func (r *Reader) readBlockCached(bh blockHandle, checksum, fillCache bool) (*block, util.Releaser, error) {
+ if r.cache != nil {
+ var err error
+ ch := r.cache.Get(bh.offset, func() (charge int, value interface{}) {
+ if !fillCache {
+ return 0, nil
+ }
+ var b *block
+ b, err = r.readBlock(bh, checksum)
+ if err != nil {
+ return 0, nil
+ }
+ return cap(b.data), b
+ })
+ if ch != nil {
+ b, ok := ch.Value().(*block)
+ if !ok {
+ ch.Release()
+ return nil, nil, errors.New("leveldb/table: Reader: inconsistent block type")
+ }
+ if !b.checksum && (r.checksum || checksum) {
+ if !verifyChecksum(b.data) {
+ ch.Release()
+ return nil, nil, errors.New("leveldb/table: Reader: invalid block (checksum mismatch)")
+ }
+ b.checksum = true
+ }
+ return b, ch, err
+ } else if err != nil {
+ return nil, nil, err
+ }
+ }
+
+ b, err := r.readBlock(bh, checksum)
+ return b, b, err
+}
+
+func (r *Reader) readFilterBlock(bh blockHandle) (*filterBlock, error) {
data, err := r.readRawBlock(bh, true)
if err != nil {
return nil, err
@@ -593,7 +655,7 @@ func (r *Reader) readFilterBlock(bh blockHandle, filter filter.Filter) (*filterB
return nil, errors.New("leveldb/table: Reader: invalid filter block (invalid offset)")
}
b := &filterBlock{
- filter: filter,
+ tr: r,
data: data,
oOffset: oOffset,
baseLg: uint(data[n-1]),
@@ -602,44 +664,67 @@ func (r *Reader) readFilterBlock(bh blockHandle, filter filter.Filter) (*filterB
return b, nil
}
-func (r *Reader) getDataIter(dataBH blockHandle, slice *util.Range, checksum, fillCache bool) iterator.Iterator {
+func (r *Reader) readFilterBlockCached(bh blockHandle, fillCache bool) (*filterBlock, util.Releaser, error) {
if r.cache != nil {
- // Get/set block cache.
var err error
- cache, ok := r.cache.Get(dataBH.offset, func() (ok bool, value interface{}, charge int, fin cache.SetFin) {
+ ch := r.cache.Get(bh.offset, func() (charge int, value interface{}) {
if !fillCache {
- return
+ return 0, nil
}
- var dataBlock *block
- dataBlock, err = r.readBlock(dataBH, checksum)
- if err == nil {
- ok = true
- value = dataBlock
- charge = int(dataBH.length)
+ var b *filterBlock
+ b, err = r.readFilterBlock(bh)
+ if err != nil {
+ return 0, nil
}
- return
+ return cap(b.data), b
})
- if err != nil {
- return iterator.NewEmptyIterator(err)
- }
- if ok {
- dataBlock := cache.Value().(*block)
- if !dataBlock.checksum && (r.checksum || checksum) {
- if !verifyChecksum(dataBlock.data) {
- return iterator.NewEmptyIterator(errors.New("leveldb/table: Reader: invalid block (checksum mismatch)"))
- }
- dataBlock.checksum = true
+ if ch != nil {
+ b, ok := ch.Value().(*filterBlock)
+ if !ok {
+ ch.Release()
+ return nil, nil, errors.New("leveldb/table: Reader: inconsistent block type")
}
- iter := dataBlock.newIterator(slice, false, cache)
- return iter
+ return b, ch, err
+ } else if err != nil {
+ return nil, nil, err
}
}
- dataBlock, err := r.readBlock(dataBH, checksum)
+
+ b, err := r.readFilterBlock(bh)
+ return b, b, err
+}
+
+func (r *Reader) getIndexBlock(fillCache bool) (b *block, rel util.Releaser, err error) {
+ if r.indexBlock == nil {
+ return r.readBlockCached(r.indexBH, true, fillCache)
+ }
+ return r.indexBlock, util.NoopReleaser{}, nil
+}
+
+func (r *Reader) getFilterBlock(fillCache bool) (*filterBlock, util.Releaser, error) {
+ if r.filterBlock == nil {
+ return r.readFilterBlockCached(r.filterBH, fillCache)
+ }
+ return r.filterBlock, util.NoopReleaser{}, nil
+}
+
+func (r *Reader) getDataIter(dataBH blockHandle, slice *util.Range, checksum, fillCache bool) iterator.Iterator {
+ b, rel, err := r.readBlockCached(dataBH, checksum, fillCache)
if err != nil {
return iterator.NewEmptyIterator(err)
}
- iter := dataBlock.newIterator(slice, false, nil)
- return iter
+ return b.newIterator(slice, false, rel)
+}
+
+func (r *Reader) getDataIterErr(dataBH blockHandle, slice *util.Range, checksum, fillCache bool) iterator.Iterator {
+ r.mu.RLock()
+ defer r.mu.RUnlock()
+
+ if r.err != nil {
+ return iterator.NewEmptyIterator(r.err)
+ }
+
+ return r.getDataIter(dataBH, slice, checksum, fillCache)
}
// NewIterator creates an iterator from the table.
@@ -653,20 +738,26 @@ func (r *Reader) getDataIter(dataBH blockHandle, slice *util.Range, checksum, fi
// when not used.
//
// Also read Iterator documentation of the leveldb/iterator package.
-
func (r *Reader) NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator {
+ r.mu.RLock()
+ defer r.mu.RUnlock()
+
if r.err != nil {
return iterator.NewEmptyIterator(r.err)
}
- index := &indexIter{
- blockIter: *r.indexBlock.newIterator(slice, true, nil),
- tableReader: r,
- slice: slice,
- checksum: ro.GetStrict(opt.StrictBlockChecksum),
- fillCache: !ro.GetDontFillCache(),
+ fillCache := !ro.GetDontFillCache()
+ indexBlock, rel, err := r.getIndexBlock(fillCache)
+ if err != nil {
+ return iterator.NewEmptyIterator(err)
}
- return iterator.NewIndexedIterator(index, r.strictIter || ro.GetStrict(opt.StrictIterator), false)
+ index := &indexIter{
+ blockIter: indexBlock.newIterator(slice, true, rel),
+ slice: slice,
+ checksum: ro.GetStrict(opt.StrictBlockChecksum),
+ fillCache: !ro.GetDontFillCache(),
+ }
+ return iterator.NewIndexedIterator(index, r.strictIter || ro.GetStrict(opt.StrictIterator), true)
}
// Find finds key/value pair whose key is greater than or equal to the
@@ -676,12 +767,21 @@ func (r *Reader) NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.It
// The caller should not modify the contents of the returned slice, but
// it is safe to modify the contents of the argument after Find returns.
func (r *Reader) Find(key []byte, ro *opt.ReadOptions) (rkey, value []byte, err error) {
+ r.mu.RLock()
+ defer r.mu.RUnlock()
+
if r.err != nil {
err = r.err
return
}
- index := r.indexBlock.newIterator(nil, true, nil)
+ indexBlock, rel, err := r.getIndexBlock(true)
+ if err != nil {
+ return
+ }
+ defer rel.Release()
+
+ index := indexBlock.newIterator(nil, true, nil)
defer index.Release()
if !index.Seek(key) {
err = index.Error()
@@ -695,9 +795,15 @@ func (r *Reader) Find(key []byte, ro *opt.ReadOptions) (rkey, value []byte, err
err = errors.New("leveldb/table: Reader: invalid table (bad data block handle)")
return
}
- if r.filterBlock != nil && !r.filterBlock.contains(dataBH.offset, key) {
- err = ErrNotFound
- return
+ if r.filter != nil {
+ filterBlock, rel, ferr := r.getFilterBlock(true)
+ if ferr == nil {
+ if !filterBlock.contains(dataBH.offset, key) {
+ rel.Release()
+ return nil, nil, ErrNotFound
+ }
+ rel.Release()
+ }
}
data := r.getDataIter(dataBH, nil, ro.GetStrict(opt.StrictBlockChecksum), !ro.GetDontFillCache())
defer data.Release()
@@ -708,8 +814,15 @@ func (r *Reader) Find(key []byte, ro *opt.ReadOptions) (rkey, value []byte, err
}
return
}
+ // Don't use block buffer, no need to copy the buffer.
rkey = data.Key()
- value = data.Value()
+ if r.bpool == nil {
+ value = data.Value()
+ } else {
+ // Use block buffer, and since the buffer will be recycled, the buffer
+ // need to be copied.
+ value = append([]byte{}, data.Value()...)
+ }
return
}
@@ -719,6 +832,9 @@ func (r *Reader) Find(key []byte, ro *opt.ReadOptions) (rkey, value []byte, err
// The caller should not modify the contents of the returned slice, but
// it is safe to modify the contents of the argument after Get returns.
func (r *Reader) Get(key []byte, ro *opt.ReadOptions) (value []byte, err error) {
+ r.mu.RLock()
+ defer r.mu.RUnlock()
+
if r.err != nil {
err = r.err
return
@@ -732,16 +848,25 @@ func (r *Reader) Get(key []byte, ro *opt.ReadOptions) (value []byte, err error)
return
}
-// GetApproximateOffset returns approximate offset for the given key.
+// OffsetOf returns approximate offset for the given key.
//
// It is safe to modify the contents of the argument after Get returns.
-func (r *Reader) GetApproximateOffset(key []byte) (offset int64, err error) {
+func (r *Reader) OffsetOf(key []byte) (offset int64, err error) {
+ r.mu.RLock()
+ defer r.mu.RUnlock()
+
if r.err != nil {
err = r.err
return
}
- index := r.indexBlock.newIterator(nil, true, nil)
+ indexBlock, rel, err := r.readBlockCached(r.indexBH, true, true)
+ if err != nil {
+ return
+ }
+ defer rel.Release()
+
+ index := indexBlock.newIterator(nil, true, nil)
defer index.Release()
if index.Seek(key) {
dataBH, n := decodeBlockHandle(index.Value())
@@ -759,12 +884,38 @@ func (r *Reader) GetApproximateOffset(key []byte) (offset int64, err error) {
return
}
+// Release implements util.Releaser.
+// It also close the file if it is an io.Closer.
+func (r *Reader) Release() {
+ r.mu.Lock()
+ defer r.mu.Unlock()
+
+ if closer, ok := r.reader.(io.Closer); ok {
+ closer.Close()
+ }
+ if r.indexBlock != nil {
+ r.indexBlock.Release()
+ r.indexBlock = nil
+ }
+ if r.filterBlock != nil {
+ r.filterBlock.Release()
+ r.filterBlock = nil
+ }
+ r.reader = nil
+ r.cache = nil
+ r.bpool = nil
+ r.err = ErrReaderReleased
+}
+
// NewReader creates a new initialized table reader for the file.
-// The cache is optional and can be nil.
-func NewReader(f io.ReaderAt, size int64, cache cache.Namespace, o *opt.Options) *Reader {
+// The cache and bpool is optional and can be nil.
+//
+// The returned table reader instance is goroutine-safe.
+func NewReader(f io.ReaderAt, size int64, cache cache.Namespace, bpool *util.BufferPool, o *opt.Options) *Reader {
r := &Reader{
reader: f,
cache: cache,
+ bpool: bpool,
cmp: o.GetComparer(),
checksum: o.GetStrict(opt.StrictBlockChecksum),
strictIter: o.GetStrict(opt.StrictIterator),
@@ -792,16 +943,11 @@ func NewReader(f io.ReaderAt, size int64, cache cache.Namespace, o *opt.Options)
return r
}
// Decode the index block handle.
- indexBH, n := decodeBlockHandle(footer[n:])
+ r.indexBH, n = decodeBlockHandle(footer[n:])
if n == 0 {
r.err = errors.New("leveldb/table: Reader: invalid table (bad index block handle)")
return r
}
- // Read index block.
- r.indexBlock, r.err = r.readBlock(indexBH, true)
- if r.err != nil {
- return r
- }
// Read metaindex block.
metaBlock, err := r.readBlock(metaBH, true)
if err != nil {
@@ -817,32 +963,45 @@ func NewReader(f io.ReaderAt, size int64, cache cache.Namespace, o *opt.Options)
continue
}
fn := key[7:]
- var filter filter.Filter
if f0 := o.GetFilter(); f0 != nil && f0.Name() == fn {
- filter = f0
+ r.filter = f0
} else {
for _, f0 := range o.GetAltFilters() {
if f0.Name() == fn {
- filter = f0
+ r.filter = f0
break
}
}
}
- if filter != nil {
+ if r.filter != nil {
filterBH, n := decodeBlockHandle(metaIter.Value())
if n == 0 {
continue
}
+ r.filterBH = filterBH
// Update data end.
r.dataEnd = int64(filterBH.offset)
- filterBlock, err := r.readFilterBlock(filterBH, filter)
- if err != nil {
- continue
- }
- r.filterBlock = filterBlock
break
}
}
metaIter.Release()
+ metaBlock.Release()
+
+ // Cache index and filter block locally, since we don't have global cache.
+ if cache == nil {
+ r.indexBlock, r.err = r.readBlock(r.indexBH, true)
+ if r.err != nil {
+ return r
+ }
+ if r.filter != nil {
+ r.filterBlock, err = r.readFilterBlock(r.filterBH)
+ if err != nil {
+ // Don't use filter then.
+ r.filter = nil
+ r.filterBH = blockHandle{}
+ }
+ }
+ }
+
return r
}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/table/table_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/table/table_test.go
index c682f55f..3e6e8583 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/table/table_test.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/table/table_test.go
@@ -59,9 +59,9 @@ var _ = testutil.Defer(func() {
It("Should be able to approximate offset of a key correctly", func() {
Expect(err).ShouldNot(HaveOccurred())
- tr := NewReader(bytes.NewReader(buf.Bytes()), int64(buf.Len()), nil, o)
+ tr := NewReader(bytes.NewReader(buf.Bytes()), int64(buf.Len()), nil, nil, o)
CheckOffset := func(key string, expect, threshold int) {
- offset, err := tr.GetApproximateOffset([]byte(key))
+ offset, err := tr.OffsetOf([]byte(key))
Expect(err).ShouldNot(HaveOccurred())
Expect(offset).Should(BeNumerically("~", expect, threshold), "Offset of key %q", key)
}
@@ -95,7 +95,7 @@ var _ = testutil.Defer(func() {
tw.Close()
// Opening the table.
- tr := NewReader(bytes.NewReader(buf.Bytes()), int64(buf.Len()), nil, o)
+ tr := NewReader(bytes.NewReader(buf.Bytes()), int64(buf.Len()), nil, nil, o)
return tableWrapper{tr}
}
Test := func(kv *testutil.KeyValue, body func(r *Reader)) func() {
@@ -104,14 +104,16 @@ var _ = testutil.Defer(func() {
if body != nil {
body(db.(tableWrapper).Reader)
}
- testutil.KeyValueTesting(nil, db, *kv)
+ testutil.KeyValueTesting(nil, *kv, db, nil, nil)
}
}
- testutil.AllKeyValueTesting(nil, Build)
+ testutil.AllKeyValueTesting(nil, Build, nil, nil)
Describe("with one key per block", Test(testutil.KeyValue_Generate(nil, 9, 1, 10, 512, 512), func(r *Reader) {
It("should have correct blocks number", func() {
- Expect(r.indexBlock.restartsLen).Should(Equal(9))
+ indexBlock, err := r.readBlock(r.indexBH, true)
+ Expect(err).To(BeNil())
+ Expect(indexBlock.restartsLen).Should(Equal(9))
})
}))
})
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/testutil/kvtest.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/testutil/kvtest.go
index 4fc75b6f..0cead03b 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/testutil/kvtest.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/testutil/kvtest.go
@@ -16,13 +16,22 @@ import (
"github.com/syndtr/goleveldb/leveldb/util"
)
-func KeyValueTesting(rnd *rand.Rand, p DB, kv KeyValue) {
+func KeyValueTesting(rnd *rand.Rand, kv KeyValue, p DB, setup func(KeyValue) DB, teardown func(DB)) {
if rnd == nil {
rnd = NewRand()
}
- if db, ok := p.(Find); ok {
- It("Should find all keys with Find", func() {
+ if p == nil {
+ BeforeEach(func() {
+ p = setup(kv)
+ })
+ AfterEach(func() {
+ teardown(p)
+ })
+ }
+
+ It("Should find all keys with Find", func() {
+ if db, ok := p.(Find); ok {
ShuffledIndex(nil, kv.Len(), 1, func(i int) {
key_, key, value := kv.IndexInexact(i)
@@ -38,9 +47,11 @@ func KeyValueTesting(rnd *rand.Rand, p DB, kv KeyValue) {
Expect(rkey).Should(Equal(key))
Expect(rvalue).Should(Equal(value), "Value for key %q (%q)", key_, key)
})
- })
+ }
+ })
- It("Should return error if the key is not present", func() {
+ It("Should return error if the key is not present", func() {
+ if db, ok := p.(Find); ok {
var key []byte
if kv.Len() > 0 {
key_, _ := kv.Index(kv.Len() - 1)
@@ -49,11 +60,11 @@ func KeyValueTesting(rnd *rand.Rand, p DB, kv KeyValue) {
rkey, _, err := db.TestFind(key)
Expect(err).Should(HaveOccurred(), "Find for key %q yield key %q", key, rkey)
Expect(err).Should(Equal(util.ErrNotFound))
- })
- }
+ }
+ })
- if db, ok := p.(Get); ok {
- It("Should only find exact key with Get", func() {
+ It("Should only find exact key with Get", func() {
+ if db, ok := p.(Get); ok {
ShuffledIndex(nil, kv.Len(), 1, func(i int) {
key_, key, value := kv.IndexInexact(i)
@@ -69,11 +80,11 @@ func KeyValueTesting(rnd *rand.Rand, p DB, kv KeyValue) {
Expect(err).Should(Equal(util.ErrNotFound))
}
})
- })
- }
+ }
+ })
- if db, ok := p.(NewIterator); ok {
- TestIter := func(r *util.Range, _kv KeyValue) {
+ TestIter := func(r *util.Range, _kv KeyValue) {
+ if db, ok := p.(NewIterator); ok {
iter := db.TestNewIterator(r)
Expect(iter.Error()).ShouldNot(HaveOccurred())
@@ -84,45 +95,48 @@ func KeyValueTesting(rnd *rand.Rand, p DB, kv KeyValue) {
DoIteratorTesting(&t)
}
+ }
- It("Should iterates and seeks correctly", func(done Done) {
- TestIter(nil, kv.Clone())
- done <- true
- }, 3.0)
+ It("Should iterates and seeks correctly", func(done Done) {
+ TestIter(nil, kv.Clone())
+ done <- true
+ }, 3.0)
- RandomIndex(rnd, kv.Len(), kv.Len(), func(i int) {
- type slice struct {
- r *util.Range
- start, limit int
- }
+ RandomIndex(rnd, kv.Len(), kv.Len(), func(i int) {
+ type slice struct {
+ r *util.Range
+ start, limit int
+ }
- key_, _, _ := kv.IndexInexact(i)
- for _, x := range []slice{
- {&util.Range{Start: key_, Limit: nil}, i, kv.Len()},
- {&util.Range{Start: nil, Limit: key_}, 0, i},
- } {
- It(fmt.Sprintf("Should iterates and seeks correctly of a slice %d .. %d", x.start, x.limit), func(done Done) {
- TestIter(x.r, kv.Slice(x.start, x.limit))
- done <- true
- }, 3.0)
- }
- })
-
- RandomRange(rnd, kv.Len(), kv.Len(), func(start, limit int) {
- It(fmt.Sprintf("Should iterates and seeks correctly of a slice %d .. %d", start, limit), func(done Done) {
- r := kv.Range(start, limit)
- TestIter(&r, kv.Slice(start, limit))
+ key_, _, _ := kv.IndexInexact(i)
+ for _, x := range []slice{
+ {&util.Range{Start: key_, Limit: nil}, i, kv.Len()},
+ {&util.Range{Start: nil, Limit: key_}, 0, i},
+ } {
+ It(fmt.Sprintf("Should iterates and seeks correctly of a slice %d .. %d", x.start, x.limit), func(done Done) {
+ TestIter(x.r, kv.Slice(x.start, x.limit))
done <- true
}, 3.0)
- })
- }
+ }
+ })
+
+ RandomRange(rnd, kv.Len(), kv.Len(), func(start, limit int) {
+ It(fmt.Sprintf("Should iterates and seeks correctly of a slice %d .. %d", start, limit), func(done Done) {
+ r := kv.Range(start, limit)
+ TestIter(&r, kv.Slice(start, limit))
+ done <- true
+ }, 3.0)
+ })
}
-func AllKeyValueTesting(rnd *rand.Rand, body func(kv KeyValue) DB) {
+func AllKeyValueTesting(rnd *rand.Rand, body, setup func(KeyValue) DB, teardown func(DB)) {
Test := func(kv *KeyValue) func() {
return func() {
- db := body(*kv)
- KeyValueTesting(rnd, db, *kv)
+ var p DB
+ if body != nil {
+ p = body(*kv)
+ }
+ KeyValueTesting(rnd, *kv, p, setup, teardown)
}
}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/testutil/storage.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/testutil/storage.go
index bd5fc12e..0f8d77a7 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/testutil/storage.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/testutil/storage.go
@@ -57,6 +57,7 @@ const (
typeManifest = iota
typeJournal
typeTable
+ typeTemp
typeCount
)
@@ -91,6 +92,8 @@ func flattenType(m StorageMode, t storage.FileType) int {
return x + typeJournal
case storage.TypeTable:
return x + typeTable
+ case storage.TypeTemp:
+ return x + typeTemp
default:
panic("invalid file type")
}
@@ -107,6 +110,8 @@ func listFlattenType(m StorageMode, t storage.FileType) []int {
ret = append(ret, x+typeJournal)
case t&storage.TypeTable != 0:
ret = append(ret, x+typeTable)
+ case t&storage.TypeTemp != 0:
+ ret = append(ret, x+typeTemp)
}
}
switch {
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/testutil_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/testutil_test.go
index c1402fda..111f8730 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/testutil_test.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/testutil_test.go
@@ -48,6 +48,7 @@ func (t *testingDB) TestClose() {
func newTestingDB(o *opt.Options, ro *opt.ReadOptions, wo *opt.WriteOptions) *testingDB {
stor := testutil.NewStorage()
db, err := Open(stor, o)
+ // FIXME: This may be called from outside It, which may cause panic.
Expect(err).NotTo(HaveOccurred())
return &testingDB{
DB: db,
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/util/buffer_pool.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/util/buffer_pool.go
new file mode 100644
index 00000000..aea39dca
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/util/buffer_pool.go
@@ -0,0 +1,221 @@
+// Copyright (c) 2014, Suryandaru Triandana
+// All rights reserved.
+//
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package util
+
+import (
+ "fmt"
+ "sync/atomic"
+ "time"
+)
+
+type buffer struct {
+ b []byte
+ miss int
+}
+
+// BufferPool is a 'buffer pool'.
+type BufferPool struct {
+ pool [6]chan []byte
+ size [5]uint32
+ sizeMiss [5]uint32
+ sizeHalf [5]uint32
+ baseline [4]int
+ baselinex0 int
+ baselinex1 int
+ baseline0 int
+ baseline1 int
+ baseline2 int
+ close chan struct{}
+
+ get uint32
+ put uint32
+ half uint32
+ less uint32
+ equal uint32
+ greater uint32
+ miss uint32
+}
+
+func (p *BufferPool) poolNum(n int) int {
+ if n <= p.baseline0 && n > p.baseline0/2 {
+ return 0
+ }
+ for i, x := range p.baseline {
+ if n <= x {
+ return i + 1
+ }
+ }
+ return len(p.baseline) + 1
+}
+
+// Get returns buffer with length of n.
+func (p *BufferPool) Get(n int) []byte {
+ if p == nil {
+ return make([]byte, n)
+ }
+
+ atomic.AddUint32(&p.get, 1)
+
+ poolNum := p.poolNum(n)
+ pool := p.pool[poolNum]
+ if poolNum == 0 {
+ // Fast path.
+ select {
+ case b := <-pool:
+ switch {
+ case cap(b) > n:
+ if cap(b)-n >= n {
+ atomic.AddUint32(&p.half, 1)
+ select {
+ case pool <- b:
+ default:
+ }
+ return make([]byte, n)
+ } else {
+ atomic.AddUint32(&p.less, 1)
+ return b[:n]
+ }
+ case cap(b) == n:
+ atomic.AddUint32(&p.equal, 1)
+ return b[:n]
+ default:
+ atomic.AddUint32(&p.greater, 1)
+ }
+ default:
+ atomic.AddUint32(&p.miss, 1)
+ }
+
+ return make([]byte, n, p.baseline0)
+ } else {
+ sizePtr := &p.size[poolNum-1]
+
+ select {
+ case b := <-pool:
+ switch {
+ case cap(b) > n:
+ if cap(b)-n >= n {
+ atomic.AddUint32(&p.half, 1)
+ sizeHalfPtr := &p.sizeHalf[poolNum-1]
+ if atomic.AddUint32(sizeHalfPtr, 1) == 20 {
+ atomic.StoreUint32(sizePtr, uint32(cap(b)/2))
+ atomic.StoreUint32(sizeHalfPtr, 0)
+ } else {
+ select {
+ case pool <- b:
+ default:
+ }
+ }
+ return make([]byte, n)
+ } else {
+ atomic.AddUint32(&p.less, 1)
+ return b[:n]
+ }
+ case cap(b) == n:
+ atomic.AddUint32(&p.equal, 1)
+ return b[:n]
+ default:
+ atomic.AddUint32(&p.greater, 1)
+ if uint32(cap(b)) >= atomic.LoadUint32(sizePtr) {
+ select {
+ case pool <- b:
+ default:
+ }
+ }
+ }
+ default:
+ atomic.AddUint32(&p.miss, 1)
+ }
+
+ if size := atomic.LoadUint32(sizePtr); uint32(n) > size {
+ if size == 0 {
+ atomic.CompareAndSwapUint32(sizePtr, 0, uint32(n))
+ } else {
+ sizeMissPtr := &p.sizeMiss[poolNum-1]
+ if atomic.AddUint32(sizeMissPtr, 1) == 20 {
+ atomic.StoreUint32(sizePtr, uint32(n))
+ atomic.StoreUint32(sizeMissPtr, 0)
+ }
+ }
+ return make([]byte, n)
+ } else {
+ return make([]byte, n, size)
+ }
+ }
+}
+
+// Put adds given buffer to the pool.
+func (p *BufferPool) Put(b []byte) {
+ if p == nil {
+ return
+ }
+
+ atomic.AddUint32(&p.put, 1)
+
+ pool := p.pool[p.poolNum(cap(b))]
+ select {
+ case pool <- b:
+ default:
+ }
+
+}
+
+func (p *BufferPool) Close() {
+ if p == nil {
+ return
+ }
+
+ select {
+ case p.close <- struct{}{}:
+ default:
+ }
+}
+
+func (p *BufferPool) String() string {
+ if p == nil {
+ return ""
+ }
+
+ return fmt.Sprintf("BufferPool{B·%d Z·%v Zm·%v Zh·%v G·%d P·%d H·%d <·%d =·%d >·%d M·%d}",
+ p.baseline0, p.size, p.sizeMiss, p.sizeHalf, p.get, p.put, p.half, p.less, p.equal, p.greater, p.miss)
+}
+
+func (p *BufferPool) drain() {
+ ticker := time.NewTicker(2 * time.Second)
+ for {
+ select {
+ case <-ticker.C:
+ for _, ch := range p.pool {
+ select {
+ case <-ch:
+ default:
+ }
+ }
+ case <-p.close:
+ for _, ch := range p.pool {
+ close(ch)
+ }
+ return
+ }
+ }
+}
+
+// NewBufferPool creates a new initialized 'buffer pool'.
+func NewBufferPool(baseline int) *BufferPool {
+ if baseline <= 0 {
+ panic("baseline can't be <= 0")
+ }
+ p := &BufferPool{
+ baseline0: baseline,
+ baseline: [...]int{baseline / 4, baseline / 2, baseline * 2, baseline * 4},
+ close: make(chan struct{}, 1),
+ }
+ for i, cap := range []int{2, 2, 4, 4, 2, 1} {
+ p.pool[i] = make(chan []byte, cap)
+ }
+ go p.drain()
+ return p
+}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/util/pool.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/util/pool.go
new file mode 100644
index 00000000..1f7fdd41
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/util/pool.go
@@ -0,0 +1,21 @@
+// Copyright (c) 2014, Suryandaru Triandana
+// All rights reserved.
+//
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// +build go1.3
+
+package util
+
+import (
+ "sync"
+)
+
+type Pool struct {
+ sync.Pool
+}
+
+func NewPool(cap int) *Pool {
+ return &Pool{}
+}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/util/pool_legacy.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/util/pool_legacy.go
new file mode 100644
index 00000000..27b8d03b
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/util/pool_legacy.go
@@ -0,0 +1,33 @@
+// Copyright (c) 2014, Suryandaru Triandana
+// All rights reserved.
+//
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// +build !go1.3
+
+package util
+
+type Pool struct {
+ pool chan interface{}
+}
+
+func (p *Pool) Get() interface{} {
+ select {
+ case x := <-p.pool:
+ return x
+ default:
+ return nil
+ }
+}
+
+func (p *Pool) Put(x interface{}) {
+ select {
+ case p.pool <- x:
+ default:
+ }
+}
+
+func NewPool(cap int) *Pool {
+ return &Pool{pool: make(chan interface{}, cap)}
+}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/util/range.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/util/range.go
index da058312..85159583 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/util/range.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/util/range.go
@@ -14,3 +14,19 @@ type Range struct {
// Limit of the key range, not include in the range.
Limit []byte
}
+
+// BytesPrefix returns key range that satisfy the given prefix.
+// This only applicable for the standard 'bytes comparer'.
+func BytesPrefix(prefix []byte) *Range {
+ var limit []byte
+ for i := len(prefix) - 1; i >= 0; i-- {
+ c := prefix[i]
+ if c < 0xff {
+ limit = make([]byte, i+1)
+ copy(limit, prefix)
+ limit[i] = c + 1
+ break
+ }
+ }
+ return &Range{prefix, limit}
+}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/util/util.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/util/util.go
index 229c7d41..f690e484 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/util/util.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/util/util.go
@@ -12,7 +12,9 @@ import (
)
var (
- ErrNotFound = errors.New("leveldb: not found")
+ ErrNotFound = errors.New("leveldb: not found")
+ ErrReleased = errors.New("leveldb: resource already relesed")
+ ErrHasReleaser = errors.New("leveldb: releaser already defined")
)
// Releaser is the interface that wraps the basic Release method.
@@ -27,23 +29,46 @@ type ReleaseSetter interface {
// SetReleaser associates the given releaser to the resources. The
// releaser will be called once coresponding resources released.
// Calling SetReleaser with nil will clear the releaser.
+ //
+ // This will panic if a releaser already present or coresponding
+ // resource is already released. Releaser should be cleared first
+ // before assigned a new one.
SetReleaser(releaser Releaser)
}
// BasicReleaser provides basic implementation of Releaser and ReleaseSetter.
type BasicReleaser struct {
releaser Releaser
+ released bool
+}
+
+// Released returns whether Release method already called.
+func (r *BasicReleaser) Released() bool {
+ return r.released
}
// Release implements Releaser.Release.
func (r *BasicReleaser) Release() {
- if r.releaser != nil {
- r.releaser.Release()
- r.releaser = nil
+ if !r.released {
+ if r.releaser != nil {
+ r.releaser.Release()
+ r.releaser = nil
+ }
+ r.released = true
}
}
// SetReleaser implements ReleaseSetter.SetReleaser.
func (r *BasicReleaser) SetReleaser(releaser Releaser) {
+ if r.released {
+ panic(ErrReleased)
+ }
+ if r.releaser != nil && releaser != nil {
+ panic(ErrHasReleaser)
+ }
r.releaser = releaser
}
+
+type NoopReleaser struct{}
+
+func (NoopReleaser) Release() {}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/version.go b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/version.go
index 52ba2907..81fd9ee0 100644
--- a/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/version.go
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/syndtr/goleveldb/leveldb/version.go
@@ -40,8 +40,8 @@ type version struct {
tables [kNumLevels]tFiles
// Level that should be compacted next and its compaction score.
- // Score < 1 means compaction is not strictly needed. These fields
- // are initialized by ComputeCompaction()
+ // Score < 1 means compaction is not strictly needed. These fields
+ // are initialized by computeCompaction()
cLevel int
cScore float64
@@ -60,8 +60,6 @@ func (v *version) release_NB() {
panic("negative version ref")
}
- s := v.s
-
tables := make(map[uint64]bool)
for _, tt := range v.next.tables {
for _, t := range tt {
@@ -74,7 +72,7 @@ func (v *version) release_NB() {
for _, t := range tt {
num := t.file.Num()
if _, ok := tables[num]; !ok {
- s.tops.remove(t)
+ v.s.tops.remove(t)
}
}
}
@@ -89,109 +87,142 @@ func (v *version) release() {
v.s.vmu.Unlock()
}
-func (v *version) get(key iKey, ro *opt.ReadOptions) (value []byte, cstate bool, err error) {
- s := v.s
- icmp := s.cmp
- ucmp := icmp.cmp
+func (v *version) walkOverlapping(ikey iKey, f func(level int, t *tFile) bool, lf func(level int) bool) {
+ ukey := ikey.ukey()
- ukey := key.ukey()
-
- var tset *tSet
- tseek := true
-
- // We can search level-by-level since entries never hop across
- // levels. Therefore we are guaranteed that if we find data
- // in an smaller level, later levels are irrelevant.
- for level, ts := range v.tables {
- if len(ts) == 0 {
+ // Walk tables level-by-level.
+ for level, tables := range v.tables {
+ if len(tables) == 0 {
continue
}
if level == 0 {
// Level-0 files may overlap each other. Find all files that
- // overlap user_key and process them in order from newest to
- var tmp tFiles
- for _, t := range ts {
- if ucmp.Compare(ukey, t.min.ukey()) >= 0 &&
- ucmp.Compare(ukey, t.max.ukey()) <= 0 {
- tmp = append(tmp, t)
+ // overlap ukey.
+ for _, t := range tables {
+ if t.overlaps(v.s.icmp, ukey, ukey) {
+ if !f(level, t) {
+ return
+ }
}
}
-
- if len(tmp) == 0 {
- continue
- }
-
- tmp.sortByNum()
- ts = tmp
} else {
- i := ts.searchMax(key, icmp)
- if i >= len(ts) || ucmp.Compare(ukey, ts[i].min.ukey()) < 0 {
- continue
+ if i := tables.searchMax(v.s.icmp, ikey); i < len(tables) {
+ t := tables[i]
+ if v.s.icmp.uCompare(ukey, t.imin.ukey()) >= 0 {
+ if !f(level, t) {
+ return
+ }
+ }
}
-
- ts = ts[i : i+1]
}
- for _, t := range ts {
- if tseek {
- if tset == nil {
- tset = &tSet{level, t}
- } else if tset.table.incrSeek() <= 0 {
- cstate = atomic.CompareAndSwapPointer(&v.cSeek, nil, unsafe.Pointer(tset))
- tseek = false
- }
- }
-
- var _rkey, rval []byte
- _rkey, rval, err = s.tops.get(t, key, ro)
- if err == ErrNotFound {
- continue
- } else if err != nil {
- return
- }
-
- rkey := iKey(_rkey)
- if _, t, ok := rkey.parseNum(); ok {
- if ucmp.Compare(ukey, rkey.ukey()) == 0 {
- switch t {
- case tVal:
- value = rval
- case tDel:
- err = ErrNotFound
- default:
- panic("not reached")
- }
- return value, cstate, err
- }
- } else {
- err = errors.New("leveldb: internal key corrupted")
- return
- }
+ if lf != nil && !lf(level) {
+ return
}
}
+}
+
+func (v *version) get(ikey iKey, ro *opt.ReadOptions) (value []byte, tcomp bool, err error) {
+ ukey := ikey.ukey()
+
+ var (
+ tset *tSet
+ tseek bool
+
+ l0found bool
+ l0seq uint64
+ l0vt vType
+ l0val []byte
+ )
err = ErrNotFound
+
+ // Since entries never hope across level, finding key/value
+ // in smaller level make later levels irrelevant.
+ v.walkOverlapping(ikey, func(level int, t *tFile) bool {
+ if !tseek {
+ if tset == nil {
+ tset = &tSet{level, t}
+ } else if tset.table.consumeSeek() <= 0 {
+ tseek = true
+ tcomp = atomic.CompareAndSwapPointer(&v.cSeek, nil, unsafe.Pointer(tset))
+ }
+ }
+
+ ikey__, val_, err_ := v.s.tops.find(t, ikey, ro)
+ switch err_ {
+ case nil:
+ case ErrNotFound:
+ return true
+ default:
+ err = err_
+ return false
+ }
+
+ ikey_ := iKey(ikey__)
+ if seq, vt, ok := ikey_.parseNum(); ok {
+ if v.s.icmp.uCompare(ukey, ikey_.ukey()) != 0 {
+ return true
+ }
+
+ if level == 0 {
+ if seq >= l0seq {
+ l0found = true
+ l0seq = seq
+ l0vt = vt
+ l0val = val_
+ }
+ } else {
+ switch vt {
+ case tVal:
+ value = val_
+ err = nil
+ case tDel:
+ default:
+ panic("leveldb: invalid internal key type")
+ }
+ return false
+ }
+ } else {
+ err = errors.New("leveldb: internal key corrupted")
+ return false
+ }
+
+ return true
+ }, func(level int) bool {
+ if l0found {
+ switch l0vt {
+ case tVal:
+ value = l0val
+ err = nil
+ case tDel:
+ default:
+ panic("leveldb: invalid internal key type")
+ }
+ return false
+ }
+
+ return true
+ })
+
return
}
func (v *version) getIterators(slice *util.Range, ro *opt.ReadOptions) (its []iterator.Iterator) {
- s := v.s
- icmp := s.cmp
-
// Merge all level zero files together since they may overlap
for _, t := range v.tables[0] {
- it := s.tops.newIterator(t, slice, ro)
+ it := v.s.tops.newIterator(t, slice, ro)
its = append(its, it)
}
- strict := s.o.GetStrict(opt.StrictIterator) || ro.GetStrict(opt.StrictIterator)
- for _, tt := range v.tables[1:] {
- if len(tt) == 0 {
+ strict := v.s.o.GetStrict(opt.StrictIterator) || ro.GetStrict(opt.StrictIterator)
+ for _, tables := range v.tables[1:] {
+ if len(tables) == 0 {
continue
}
- it := iterator.NewIndexedIterator(tt.newIndexIterator(s.tops, icmp, slice, ro), strict, true)
+ it := iterator.NewIndexedIterator(tables.newIndexIterator(v.s.tops, v.s.icmp, slice, ro), strict, true)
its = append(its, it)
}
@@ -221,28 +252,25 @@ func (v *version) tLen(level int) int {
return len(v.tables[level])
}
-func (v *version) getApproximateOffset(key iKey) (n uint64, err error) {
- icmp := v.s.cmp
- tops := v.s.tops
-
- for level, tt := range v.tables {
- for _, t := range tt {
- if icmp.Compare(t.max, key) <= 0 {
- // Entire file is before "key", so just add the file size
+func (v *version) offsetOf(ikey iKey) (n uint64, err error) {
+ for level, tables := range v.tables {
+ for _, t := range tables {
+ if v.s.icmp.Compare(t.imax, ikey) <= 0 {
+ // Entire file is before "ikey", so just add the file size
n += t.size
- } else if icmp.Compare(t.min, key) > 0 {
- // Entire file is after "key", so ignore
+ } else if v.s.icmp.Compare(t.imin, ikey) > 0 {
+ // Entire file is after "ikey", so ignore
if level > 0 {
// Files other than level 0 are sorted by meta->min, so
// no further files in this level will contain data for
- // "key".
+ // "ikey".
break
}
} else {
- // "key" falls in the range for this table. Add the
- // approximate offset of "key" within the table.
+ // "ikey" falls in the range for this table. Add the
+ // approximate offset of "ikey" within the table.
var nn uint64
- nn, err = tops.getApproximateOffset(t, key)
+ nn, err = v.s.tops.offsetOf(t, ikey)
if err != nil {
return 0, err
}
@@ -254,18 +282,15 @@ func (v *version) getApproximateOffset(key iKey) (n uint64, err error) {
return
}
-func (v *version) pickLevel(min, max []byte) (level int) {
- icmp := v.s.cmp
- ucmp := icmp.cmp
-
- if !v.tables[0].isOverlaps(min, max, false, icmp) {
- var r tFiles
+func (v *version) pickLevel(umin, umax []byte) (level int) {
+ if !v.tables[0].overlaps(v.s.icmp, umin, umax, true) {
+ var overlaps tFiles
for ; level < kMaxMemCompactLevel; level++ {
- if v.tables[level+1].isOverlaps(min, max, true, icmp) {
+ if v.tables[level+1].overlaps(v.s.icmp, umin, umax, false) {
break
}
- v.tables[level+2].getOverlaps(min, max, &r, true, ucmp)
- if r.size() > kMaxGrandParentOverlapBytes {
+ overlaps = v.tables[level+2].getOverlaps(overlaps, v.s.icmp, umin, umax, false)
+ if overlaps.size() > kMaxGrandParentOverlapBytes {
break
}
}
@@ -279,7 +304,7 @@ func (v *version) computeCompaction() {
var bestLevel int = -1
var bestScore float64 = -1
- for level, ff := range v.tables {
+ for level, tables := range v.tables {
var score float64
if level == 0 {
// We treat level-0 specially by bounding the number of files
@@ -293,9 +318,9 @@ func (v *version) computeCompaction() {
// file size is small (perhaps because of a small write-buffer
// setting, or very high compression ratios, or lots of
// overwrites/deletions).
- score = float64(len(ff)) / kL0_CompactionTrigger
+ score = float64(len(tables)) / kL0_CompactionTrigger
} else {
- score = float64(ff.size()) / levelMaxSize[level]
+ score = float64(tables.size()) / levelMaxSize[level]
}
if score > bestScore {
@@ -321,57 +346,51 @@ type versionStaging struct {
}
func (p *versionStaging) commit(r *sessionRecord) {
- btt := p.base.tables
+ // Deleted tables.
+ for _, r := range r.deletedTables {
+ tm := &(p.tables[r.level])
- // deleted tables
- for _, tr := range r.deletedTables {
- tm := &(p.tables[tr.level])
-
- bt := btt[tr.level]
- if len(bt) > 0 {
+ if len(p.base.tables[r.level]) > 0 {
if tm.deleted == nil {
tm.deleted = make(map[uint64]struct{})
}
- tm.deleted[tr.num] = struct{}{}
+ tm.deleted[r.num] = struct{}{}
}
if tm.added != nil {
- delete(tm.added, tr.num)
+ delete(tm.added, r.num)
}
}
- // new tables
- for _, tr := range r.addedTables {
- tm := &(p.tables[tr.level])
+ // New tables.
+ for _, r := range r.addedTables {
+ tm := &(p.tables[r.level])
if tm.added == nil {
tm.added = make(map[uint64]ntRecord)
}
- tm.added[tr.num] = tr
+ tm.added[r.num] = r
if tm.deleted != nil {
- delete(tm.deleted, tr.num)
+ delete(tm.deleted, r.num)
}
}
}
func (p *versionStaging) finish() *version {
- s := p.base.s
- btt := p.base.tables
-
- // build new version
- nv := &version{s: s}
+ // Build new version.
+ nv := &version{s: p.base.s}
for level, tm := range p.tables {
- bt := btt[level]
+ btables := p.base.tables[level]
- n := len(bt) + len(tm.added) - len(tm.deleted)
+ n := len(btables) + len(tm.added) - len(tm.deleted)
if n < 0 {
n = 0
}
nt := make(tFiles, 0, n)
- // base tables
- for _, t := range bt {
+ // Base tables.
+ for _, t := range btables {
if _, ok := tm.deleted[t.file.Num()]; ok {
continue
}
@@ -381,17 +400,21 @@ func (p *versionStaging) finish() *version {
nt = append(nt, t)
}
- // new tables
- for _, tr := range tm.added {
- nt = append(nt, tr.makeFile(s))
+ // New tables.
+ for _, r := range tm.added {
+ nt = append(nt, r.makeFile(p.base.s))
}
- // sort tables
- nt.sortByKey(s.cmp)
+ // Sort tables.
+ if level == 0 {
+ nt.sortByNum()
+ } else {
+ nt.sortByKey(p.base.s.icmp)
+ }
nv.tables[level] = nt
}
- // compute compaction score for new version
+ // Compute compaction score for new version.
nv.computeCompaction()
return nv
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/vaughan0/go-ini/LICENSE b/src/github.com/smira/aptly/_vendor/src/github.com/vaughan0/go-ini/LICENSE
new file mode 100644
index 00000000..968b4538
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/vaughan0/go-ini/LICENSE
@@ -0,0 +1,14 @@
+Copyright (c) 2013 Vaughan Newton
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
+persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
+Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/vaughan0/go-ini/README.md b/src/github.com/smira/aptly/_vendor/src/github.com/vaughan0/go-ini/README.md
new file mode 100644
index 00000000..d5cd4e74
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/vaughan0/go-ini/README.md
@@ -0,0 +1,70 @@
+go-ini
+======
+
+INI parsing library for Go (golang).
+
+View the API documentation [here](http://godoc.org/github.com/vaughan0/go-ini).
+
+Usage
+-----
+
+Parse an INI file:
+
+```go
+import "github.com/vaughan0/go-ini"
+
+file, err := ini.LoadFile("myfile.ini")
+```
+
+Get data from the parsed file:
+
+```go
+name, ok := file.Get("person", "name")
+if !ok {
+ panic("'name' variable missing from 'person' section")
+}
+```
+
+Iterate through values in a section:
+
+```go
+for key, value := range file["mysection"] {
+ fmt.Printf("%s => %s\n", key, value)
+}
+```
+
+Iterate through sections in a file:
+
+```go
+for name, section := range file {
+ fmt.Printf("Section name: %s\n", name)
+}
+```
+
+File Format
+-----------
+
+INI files are parsed by go-ini line-by-line. Each line may be one of the following:
+
+ * A section definition: [section-name]
+ * A property: key = value
+ * A comment: #blahblah _or_ ;blahblah
+ * Blank. The line will be ignored.
+
+Properties defined before any section headers are placed in the default section, which has
+the empty string as it's key.
+
+Example:
+
+```ini
+# I am a comment
+; So am I!
+
+[apples]
+colour = red or green
+shape = applish
+
+[oranges]
+shape = square
+colour = blue
+```
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/vaughan0/go-ini/ini.go b/src/github.com/smira/aptly/_vendor/src/github.com/vaughan0/go-ini/ini.go
new file mode 100644
index 00000000..81aeb32f
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/vaughan0/go-ini/ini.go
@@ -0,0 +1,123 @@
+// Package ini provides functions for parsing INI configuration files.
+package ini
+
+import (
+ "bufio"
+ "fmt"
+ "io"
+ "os"
+ "regexp"
+ "strings"
+)
+
+var (
+ sectionRegex = regexp.MustCompile(`^\[(.*)\]$`)
+ assignRegex = regexp.MustCompile(`^([^=]+)=(.*)$`)
+)
+
+// ErrSyntax is returned when there is a syntax error in an INI file.
+type ErrSyntax struct {
+ Line int
+ Source string // The contents of the erroneous line, without leading or trailing whitespace
+}
+
+func (e ErrSyntax) Error() string {
+ return fmt.Sprintf("invalid INI syntax on line %d: %s", e.Line, e.Source)
+}
+
+// A File represents a parsed INI file.
+type File map[string]Section
+
+// A Section represents a single section of an INI file.
+type Section map[string]string
+
+// Returns a named Section. A Section will be created if one does not already exist for the given name.
+func (f File) Section(name string) Section {
+ section := f[name]
+ if section == nil {
+ section = make(Section)
+ f[name] = section
+ }
+ return section
+}
+
+// Looks up a value for a key in a section and returns that value, along with a boolean result similar to a map lookup.
+func (f File) Get(section, key string) (value string, ok bool) {
+ if s := f[section]; s != nil {
+ value, ok = s[key]
+ }
+ return
+}
+
+// Loads INI data from a reader and stores the data in the File.
+func (f File) Load(in io.Reader) (err error) {
+ bufin, ok := in.(*bufio.Reader)
+ if !ok {
+ bufin = bufio.NewReader(in)
+ }
+ return parseFile(bufin, f)
+}
+
+// Loads INI data from a named file and stores the data in the File.
+func (f File) LoadFile(file string) (err error) {
+ in, err := os.Open(file)
+ if err != nil {
+ return
+ }
+ defer in.Close()
+ return f.Load(in)
+}
+
+func parseFile(in *bufio.Reader, file File) (err error) {
+ section := ""
+ lineNum := 0
+ for done := false; !done; {
+ var line string
+ if line, err = in.ReadString('\n'); err != nil {
+ if err == io.EOF {
+ done = true
+ } else {
+ return
+ }
+ }
+ lineNum++
+ line = strings.TrimSpace(line)
+ if len(line) == 0 {
+ // Skip blank lines
+ continue
+ }
+ if line[0] == ';' || line[0] == '#' {
+ // Skip comments
+ continue
+ }
+
+ if groups := assignRegex.FindStringSubmatch(line); groups != nil {
+ key, val := groups[1], groups[2]
+ key, val = strings.TrimSpace(key), strings.TrimSpace(val)
+ file.Section(section)[key] = val
+ } else if groups := sectionRegex.FindStringSubmatch(line); groups != nil {
+ name := strings.TrimSpace(groups[1])
+ section = name
+ // Create the section if it does not exist
+ file.Section(section)
+ } else {
+ return ErrSyntax{lineNum, line}
+ }
+
+ }
+ return nil
+}
+
+// Loads and returns a File from a reader.
+func Load(in io.Reader) (File, error) {
+ file := make(File)
+ err := file.Load(in)
+ return file, err
+}
+
+// Loads and returns an INI File from a file on disk.
+func LoadFile(filename string) (File, error) {
+ file := make(File)
+ err := file.LoadFile(filename)
+ return file, err
+}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/vaughan0/go-ini/ini_linux_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/vaughan0/go-ini/ini_linux_test.go
new file mode 100644
index 00000000..38a6f000
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/vaughan0/go-ini/ini_linux_test.go
@@ -0,0 +1,43 @@
+package ini
+
+import (
+ "reflect"
+ "syscall"
+ "testing"
+)
+
+func TestLoadFile(t *testing.T) {
+ originalOpenFiles := numFilesOpen(t)
+
+ file, err := LoadFile("test.ini")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if originalOpenFiles != numFilesOpen(t) {
+ t.Error("test.ini not closed")
+ }
+
+ if !reflect.DeepEqual(file, File{"default": {"stuff": "things"}}) {
+ t.Error("file not read correctly")
+ }
+}
+
+func numFilesOpen(t *testing.T) (num uint64) {
+ var rlimit syscall.Rlimit
+ err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rlimit)
+ if err != nil {
+ t.Fatal(err)
+ }
+ maxFds := int(rlimit.Cur)
+
+ var stat syscall.Stat_t
+ for i := 0; i < maxFds; i++ {
+ if syscall.Fstat(i, &stat) == nil {
+ num++
+ } else {
+ return
+ }
+ }
+ return
+}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/vaughan0/go-ini/ini_test.go b/src/github.com/smira/aptly/_vendor/src/github.com/vaughan0/go-ini/ini_test.go
new file mode 100644
index 00000000..06a4d05e
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/vaughan0/go-ini/ini_test.go
@@ -0,0 +1,89 @@
+package ini
+
+import (
+ "reflect"
+ "strings"
+ "testing"
+)
+
+func TestLoad(t *testing.T) {
+ src := `
+ # Comments are ignored
+
+ herp = derp
+
+ [foo]
+ hello=world
+ whitespace should = not matter
+ ; sneaky semicolon-style comment
+ multiple = equals = signs
+
+ [bar]
+ this = that`
+
+ file, err := Load(strings.NewReader(src))
+ if err != nil {
+ t.Fatal(err)
+ }
+ check := func(section, key, expect string) {
+ if value, _ := file.Get(section, key); value != expect {
+ t.Errorf("Get(%q, %q): expected %q, got %q", section, key, expect, value)
+ }
+ }
+
+ check("", "herp", "derp")
+ check("foo", "hello", "world")
+ check("foo", "whitespace should", "not matter")
+ check("foo", "multiple", "equals = signs")
+ check("bar", "this", "that")
+}
+
+func TestSyntaxError(t *testing.T) {
+ src := `
+ # Line 2
+ [foo]
+ bar = baz
+ # Here's an error on line 6:
+ wut?
+ herp = derp`
+ _, err := Load(strings.NewReader(src))
+ t.Logf("%T: %v", err, err)
+ if err == nil {
+ t.Fatal("expected an error, got nil")
+ }
+ syntaxErr, ok := err.(ErrSyntax)
+ if !ok {
+ t.Fatal("expected an error of type ErrSyntax")
+ }
+ if syntaxErr.Line != 6 {
+ t.Fatal("incorrect line number")
+ }
+ if syntaxErr.Source != "wut?" {
+ t.Fatal("incorrect source")
+ }
+}
+
+func TestDefinedSectionBehaviour(t *testing.T) {
+ check := func(src string, expect File) {
+ file, err := Load(strings.NewReader(src))
+ if err != nil {
+ t.Fatal(err)
+ }
+ if !reflect.DeepEqual(file, expect) {
+ t.Errorf("expected %v, got %v", expect, file)
+ }
+ }
+ // No sections for an empty file
+ check("", File{})
+ // Default section only if there are actually values for it
+ check("foo=bar", File{"": {"foo": "bar"}})
+ // User-defined sections should always be present, even if empty
+ check("[a]\n[b]\nfoo=bar", File{
+ "a": {},
+ "b": {"foo": "bar"},
+ })
+ check("foo=bar\n[a]\nthis=that", File{
+ "": {"foo": "bar"},
+ "a": {"this": "that"},
+ })
+}
diff --git a/src/github.com/smira/aptly/_vendor/src/github.com/vaughan0/go-ini/test.ini b/src/github.com/smira/aptly/_vendor/src/github.com/vaughan0/go-ini/test.ini
new file mode 100644
index 00000000..d13c999e
--- /dev/null
+++ b/src/github.com/smira/aptly/_vendor/src/github.com/vaughan0/go-ini/test.ini
@@ -0,0 +1,2 @@
+[default]
+stuff = things
diff --git a/src/github.com/smira/aptly/aptly/interfaces.go b/src/github.com/smira/aptly/aptly/interfaces.go
index c79b6e15..b6375784 100644
--- a/src/github.com/smira/aptly/aptly/interfaces.go
+++ b/src/github.com/smira/aptly/aptly/interfaces.go
@@ -90,6 +90,8 @@ type Downloader interface {
// Shutdown stops downloader after current tasks are finished,
// but doesn't process rest of queue
Shutdown()
+ // Abort stops downloader without waiting for shutdown
+ Abort()
// GetProgress returns Progress object
GetProgress() Progress
}
diff --git a/src/github.com/smira/aptly/aptly/version.go b/src/github.com/smira/aptly/aptly/version.go
index a8eb503d..f28e1044 100644
--- a/src/github.com/smira/aptly/aptly/version.go
+++ b/src/github.com/smira/aptly/aptly/version.go
@@ -1,7 +1,7 @@
package aptly
// Version of aptly
-const Version = "0.7.1"
+const Version = "0.8"
// Enable debugging features?
const EnableDebug = false
diff --git a/src/github.com/smira/aptly/cmd/cmd.go b/src/github.com/smira/aptly/cmd/cmd.go
index 0246d493..0b635297 100644
--- a/src/github.com/smira/aptly/cmd/cmd.go
+++ b/src/github.com/smira/aptly/cmd/cmd.go
@@ -34,6 +34,18 @@ func ListPackagesRefList(reflist *deb.PackageRefList) (err error) {
return
}
+// LookupOption checks boolean flag with default (usually config) and command-line
+// setting
+func LookupOption(defaultValue bool, flags *flag.FlagSet, name string) (result bool) {
+ result = defaultValue
+
+ if flags.IsSet(name) {
+ result = flags.Lookup(name).Value.Get().(bool)
+ }
+
+ return
+}
+
// RootCommand creates root command in command tree
func RootCommand() *commander.Command {
cmd := &commander.Command{
@@ -46,9 +58,9 @@ upgrade individual packages, take snapshots and publish them
back as Debian repositories.
aptly's goal is to establish repeatability and controlled changes
-in a package-centric environment. aptly allows to fix a set of packages
+in a package-centric environment. aptly allows one to fix a set of packages
in a repository, so that package installation and upgrade becomes
-deterministic. At the same time aptly allows to perform controlled,
+deterministic. At the same time aptly allows one to perform controlled,
fine-grained changes in repository contents to transition your
package environment to new version.`,
Flag: *flag.NewFlagSet("aptly", flag.ExitOnError),
@@ -59,8 +71,11 @@ package environment to new version.`,
makeCmdRepo(),
makeCmdServe(),
makeCmdSnapshot(),
+ // Disabled on no docs
+ //makeCmdTask(),
makeCmdPublish(),
makeCmdVersion(),
+ makeCmdPackage(),
},
}
diff --git a/src/github.com/smira/aptly/cmd/context.go b/src/github.com/smira/aptly/cmd/context.go
index 58d322af..f8472f4f 100644
--- a/src/github.com/smira/aptly/cmd/context.go
+++ b/src/github.com/smira/aptly/cmd/context.go
@@ -22,8 +22,8 @@ import (
// AptlyContext is a common context shared by all commands
type AptlyContext struct {
- flags *flag.FlagSet
- configLoaded bool
+ flags, globalFlags *flag.FlagSet
+ configLoaded bool
progress aptly.Progress
downloader aptly.Downloader
@@ -65,7 +65,7 @@ func (context *AptlyContext) Config() *utils.ConfigStructure {
if !context.configLoaded {
var err error
- configLocation := context.flags.Lookup("config").Value.String()
+ configLocation := context.globalFlags.Lookup("config").Value.String()
if configLocation != "" {
err = utils.LoadConfig(configLocation, &utils.Config)
@@ -104,16 +104,16 @@ func (context *AptlyContext) Config() *utils.ConfigStructure {
func (context *AptlyContext) DependencyOptions() int {
if context.dependencyOptions == -1 {
context.dependencyOptions = 0
- if context.Config().DepFollowSuggests || context.flags.Lookup("dep-follow-suggests").Value.Get().(bool) {
+ if LookupOption(context.Config().DepFollowSuggests, context.globalFlags, "dep-follow-suggests") {
context.dependencyOptions |= deb.DepFollowSuggests
}
- if context.Config().DepFollowRecommends || context.flags.Lookup("dep-follow-recommends").Value.Get().(bool) {
+ if LookupOption(context.Config().DepFollowRecommends, context.globalFlags, "dep-follow-recommends") {
context.dependencyOptions |= deb.DepFollowRecommends
}
- if context.Config().DepFollowAllVariants || context.flags.Lookup("dep-follow-all-variants").Value.Get().(bool) {
+ if LookupOption(context.Config().DepFollowAllVariants, context.globalFlags, "dep-follow-all-variants") {
context.dependencyOptions |= deb.DepFollowAllVariants
}
- if context.Config().DepFollowSource || context.flags.Lookup("dep-follow-source").Value.Get().(bool) {
+ if LookupOption(context.Config().DepFollowSource, context.globalFlags, "dep-follow-source") {
context.dependencyOptions |= deb.DepFollowSource
}
}
@@ -125,7 +125,7 @@ func (context *AptlyContext) DependencyOptions() int {
func (context *AptlyContext) ArchitecturesList() []string {
if context.architecturesList == nil {
context.architecturesList = context.Config().Architectures
- optionArchitectures := context.flags.Lookup("architectures").Value.String()
+ optionArchitectures := context.globalFlags.Lookup("architectures").Value.String()
if optionArchitectures != "" {
context.architecturesList = strings.Split(optionArchitectures, ",")
}
@@ -181,6 +181,36 @@ func (context *AptlyContext) Database() (database.Storage, error) {
return context.database, nil
}
+// CloseDatabase closes the db temporarily
+func (context *AptlyContext) CloseDatabase() error {
+ if context.database == nil {
+ return nil
+ }
+
+ return context.database.Close()
+}
+
+// ReOpenDatabase reopens the db after close
+func (context *AptlyContext) ReOpenDatabase() error {
+ if context.database == nil {
+ return nil
+ }
+
+ const MaxTries = 10
+ const Delay = 10 * time.Second
+
+ for try := 0; try < MaxTries; try++ {
+ err := context.database.ReOpen()
+ if err == nil || strings.Index(err.Error(), "resource temporarily unavailable") == -1 {
+ return err
+ }
+ context.Progress().Printf("Unable to reopen database, sleeping %s\n", Delay)
+ <-time.After(Delay)
+ }
+
+ return fmt.Errorf("unable to reopen the DB, maximum number of retries reached")
+}
+
// CollectionFactory builds factory producing all kinds of collections
func (context *AptlyContext) CollectionFactory() *deb.CollectionFactory {
if context.collectionFactory == nil {
@@ -203,7 +233,7 @@ func (context *AptlyContext) PackagePool() aptly.PackagePool {
return context.packagePool
}
-// PublishedStorage returns instance of PublishedStorage
+// GetPublishedStorage returns instance of PublishedStorage
func (context *AptlyContext) GetPublishedStorage(name string) aptly.PublishedStorage {
publishedStorage, ok := context.publishedStorages[name]
if !ok {
@@ -217,7 +247,8 @@ func (context *AptlyContext) GetPublishedStorage(name string) aptly.PublishedSto
var err error
publishedStorage, err = s3.NewPublishedStorage(params.AccessKeyID, params.SecretAccessKey,
- params.Region, params.Bucket, params.ACL, params.Prefix)
+ params.Region, params.Bucket, params.ACL, params.Prefix, params.StorageClass,
+ params.EncryptionMethod, params.PlusWorkaround)
if err != nil {
Fatal(err)
}
@@ -230,6 +261,11 @@ func (context *AptlyContext) GetPublishedStorage(name string) aptly.PublishedSto
return publishedStorage
}
+// UpdateFlags sets internal copy of flags in the context
+func (context *AptlyContext) UpdateFlags(flags *flag.FlagSet) {
+ context.flags = flags
+}
+
// ShutdownContext shuts context down
func ShutdownContext() {
if aptly.EnableDebug {
@@ -250,12 +286,27 @@ func ShutdownContext() {
}
if context.database != nil {
context.database.Close()
+ context.database = nil
}
if context.downloader != nil {
- context.downloader.Shutdown()
+ context.downloader.Abort()
+ context.downloader = nil
}
if context.progress != nil {
context.progress.Shutdown()
+ context.progress = nil
+ }
+}
+
+// CleanupContext does partial shutdown of context
+func CleanupContext() {
+ if context.downloader != nil {
+ context.downloader.Shutdown()
+ context.downloader = nil
+ }
+ if context.progress != nil {
+ context.progress.Shutdown()
+ context.progress = nil
}
}
@@ -263,8 +314,13 @@ func ShutdownContext() {
func InitContext(flags *flag.FlagSet) error {
var err error
+ if context != nil {
+ panic("context already initialized")
+ }
+
context = &AptlyContext{
flags: flags,
+ globalFlags: flags,
dependencyOptions: -1,
publishedStorages: map[string]aptly.PublishedStorage{},
}
diff --git a/src/github.com/smira/aptly/cmd/mirror.go b/src/github.com/smira/aptly/cmd/mirror.go
index 500ba189..e4ce494a 100644
--- a/src/github.com/smira/aptly/cmd/mirror.go
+++ b/src/github.com/smira/aptly/cmd/mirror.go
@@ -8,7 +8,7 @@ import (
)
func getVerifier(flags *flag.FlagSet) (utils.Verifier, error) {
- if context.Config().GpgDisableVerify || flags.Lookup("ignore-signatures").Value.Get().(bool) {
+ if LookupOption(context.Config().GpgDisableVerify, flags, "ignore-signatures") {
return nil, nil
}
@@ -56,6 +56,7 @@ func makeCmdMirror() *commander.Command {
makeCmdMirrorUpdate(),
makeCmdMirrorRename(),
makeCmdMirrorEdit(),
+ makeCmdMirrorSearch(),
},
}
}
diff --git a/src/github.com/smira/aptly/cmd/mirror_create.go b/src/github.com/smira/aptly/cmd/mirror_create.go
index b902b26c..27a7dcc0 100644
--- a/src/github.com/smira/aptly/cmd/mirror_create.go
+++ b/src/github.com/smira/aptly/cmd/mirror_create.go
@@ -16,7 +16,8 @@ func aptlyMirrorCreate(cmd *commander.Command, args []string) error {
return commander.ErrCommandError
}
- downloadSources := context.Config().DownloadSourcePackages || context.flags.Lookup("with-sources").Value.Get().(bool)
+ downloadSources := LookupOption(context.Config().DownloadSourcePackages, context.flags, "with-sources")
+ downloadUdebs := context.flags.Lookup("with-udebs").Value.Get().(bool)
var (
mirrorName, archiveURL, distribution string
@@ -33,7 +34,8 @@ func aptlyMirrorCreate(cmd *commander.Command, args []string) error {
archiveURL, distribution, components = args[1], args[2], args[3:]
}
- repo, err := deb.NewRemoteRepo(mirrorName, archiveURL, distribution, components, context.ArchitecturesList(), downloadSources)
+ repo, err := deb.NewRemoteRepo(mirrorName, archiveURL, distribution, components, context.ArchitecturesList(),
+ downloadSources, downloadUdebs)
if err != nil {
return fmt.Errorf("unable to create mirror: %s", err)
}
@@ -74,7 +76,7 @@ func makeCmdMirrorCreate() *commander.Command {
Short: "create new mirror",
Long: `
Creates mirror of remote repository, aptly supports both regular and flat Debian repositories exported
-via HTTP. aptly would try download Release file from remote repository and verify its' signature. Command
+via HTTP and FTP. aptly would try download Release file from remote repository and verify its' signature. Command
line format resembles apt utlitily sources.list(5).
PPA urls could specified in short format:
@@ -90,6 +92,7 @@ Example:
cmd.Flag.Bool("ignore-signatures", false, "disable verification of Release file signatures")
cmd.Flag.Bool("with-sources", false, "download source packages in addition to binary packages")
+ cmd.Flag.Bool("with-udebs", false, "download .udeb packages (Debian installer support)")
cmd.Flag.String("filter", "", "filter packages in mirror")
cmd.Flag.Bool("filter-with-deps", false, "when filtering, include dependencies of matching packages as well")
cmd.Flag.Var(&keyRingsFlag{}, "keyring", "gpg keyring to use when verifying Release file (could be specified multiple times)")
diff --git a/src/github.com/smira/aptly/cmd/mirror_drop.go b/src/github.com/smira/aptly/cmd/mirror_drop.go
index 97c62e40..ba9e8281 100644
--- a/src/github.com/smira/aptly/cmd/mirror_drop.go
+++ b/src/github.com/smira/aptly/cmd/mirror_drop.go
@@ -20,6 +20,11 @@ func aptlyMirrorDrop(cmd *commander.Command, args []string) error {
return fmt.Errorf("unable to drop: %s", err)
}
+ err = repo.CheckLock()
+ if err != nil {
+ return fmt.Errorf("unable to drop: %s", err)
+ }
+
force := context.flags.Lookup("force").Value.Get().(bool)
if !force {
snapshots := context.CollectionFactory().SnapshotCollection().ByRemoteRepoSource(repo)
diff --git a/src/github.com/smira/aptly/cmd/mirror_edit.go b/src/github.com/smira/aptly/cmd/mirror_edit.go
index 15f41f64..0cea1034 100644
--- a/src/github.com/smira/aptly/cmd/mirror_edit.go
+++ b/src/github.com/smira/aptly/cmd/mirror_edit.go
@@ -19,15 +19,28 @@ func aptlyMirrorEdit(cmd *commander.Command, args []string) error {
return fmt.Errorf("unable to edit: %s", err)
}
+ err = repo.CheckLock()
+ if err != nil {
+ return fmt.Errorf("unable to edit: %s", err)
+ }
+
context.flags.Visit(func(flag *flag.Flag) {
switch flag.Name {
case "filter":
repo.Filter = flag.Value.String()
case "filter-with-deps":
repo.FilterWithDeps = flag.Value.Get().(bool)
+ case "with-sources":
+ repo.DownloadSources = flag.Value.Get().(bool)
+ case "with-udebs":
+ repo.DownloadUdebs = flag.Value.Get().(bool)
}
})
+ if repo.IsFlat() && repo.DownloadUdebs {
+ return fmt.Errorf("unable to edit: flat mirrors don't support udebs")
+ }
+
if repo.Filter != "" {
_, err = query.Parse(repo.Filter)
if err != nil {
@@ -35,6 +48,15 @@ func aptlyMirrorEdit(cmd *commander.Command, args []string) error {
}
}
+ if context.globalFlags.Lookup("architectures").Value.String() != "" {
+ repo.Architectures = context.ArchitecturesList()
+
+ err = repo.Fetch(context.Downloader(), nil)
+ if err != nil {
+ return fmt.Errorf("unable to edit: %s", err)
+ }
+ }
+
err = context.CollectionFactory().RemoteRepoCollection().Update(repo)
if err != nil {
return fmt.Errorf("unable to edit: %s", err)
@@ -48,10 +70,10 @@ func makeCmdMirrorEdit() *commander.Command {
cmd := &commander.Command{
Run: aptlyMirrorEdit,
UsageLine: "edit ",
- Short: "edit properties of mirorr",
+ Short: "edit mirror settings",
Long: `
-Command edit allows to change settings of mirror:
-filters.
+Command edit allows one to change settings of mirror:
+filters, list of architectures.
Example:
@@ -62,6 +84,8 @@ Example:
cmd.Flag.String("filter", "", "filter packages in mirror")
cmd.Flag.Bool("filter-with-deps", false, "when filtering, include dependencies of matching packages as well")
+ cmd.Flag.Bool("with-sources", false, "download source packages in addition to binary packages")
+ cmd.Flag.Bool("with-udebs", false, "download .udeb packages (Debian installer support)")
return cmd
}
diff --git a/src/github.com/smira/aptly/cmd/mirror_rename.go b/src/github.com/smira/aptly/cmd/mirror_rename.go
index 5cbfebe5..68d2f8e3 100644
--- a/src/github.com/smira/aptly/cmd/mirror_rename.go
+++ b/src/github.com/smira/aptly/cmd/mirror_rename.go
@@ -24,6 +24,11 @@ func aptlyMirrorRename(cmd *commander.Command, args []string) error {
return fmt.Errorf("unable to rename: %s", err)
}
+ err = repo.CheckLock()
+ if err != nil {
+ return fmt.Errorf("unable to rename: %s", err)
+ }
+
_, err = context.CollectionFactory().RemoteRepoCollection().ByName(newName)
if err == nil {
return fmt.Errorf("unable to rename: mirror %s already exists", newName)
diff --git a/src/github.com/smira/aptly/cmd/mirror_search.go b/src/github.com/smira/aptly/cmd/mirror_search.go
new file mode 100644
index 00000000..23205a33
--- /dev/null
+++ b/src/github.com/smira/aptly/cmd/mirror_search.go
@@ -0,0 +1,26 @@
+package cmd
+
+import (
+ "github.com/smira/commander"
+ "github.com/smira/flag"
+)
+
+func makeCmdMirrorSearch() *commander.Command {
+ cmd := &commander.Command{
+ Run: aptlySnapshotMirrorRepoSearch,
+ UsageLine: "search ",
+ Short: "search mirror for packages matching query",
+ Long: `
+Command search displays list of packages in mirror that match package query
+
+Example:
+
+ $ aptly mirror search wheezy-main '$Architecture (i386), Name (% *-dev)'
+`,
+ Flag: *flag.NewFlagSet("aptly-mirror-show", flag.ExitOnError),
+ }
+
+ cmd.Flag.Bool("with-deps", false, "include dependencies into search results")
+
+ return cmd
+}
diff --git a/src/github.com/smira/aptly/cmd/mirror_show.go b/src/github.com/smira/aptly/cmd/mirror_show.go
index 53296cdb..d2fea81f 100644
--- a/src/github.com/smira/aptly/cmd/mirror_show.go
+++ b/src/github.com/smira/aptly/cmd/mirror_show.go
@@ -2,6 +2,7 @@ package cmd
import (
"fmt"
+ "github.com/smira/aptly/deb"
"github.com/smira/aptly/utils"
"github.com/smira/commander"
"github.com/smira/flag"
@@ -28,6 +29,9 @@ func aptlyMirrorShow(cmd *commander.Command, args []string) error {
}
fmt.Printf("Name: %s\n", repo.Name)
+ if repo.Status == deb.MirrorUpdating {
+ fmt.Printf("Status: In Update (PID %d)\n", repo.WorkerPID)
+ }
fmt.Printf("Archive Root URL: %s\n", repo.ArchiveRoot)
fmt.Printf("Distribution: %s\n", repo.Distribution)
fmt.Printf("Components: %s\n", strings.Join(repo.Components, ", "))
@@ -37,6 +41,11 @@ func aptlyMirrorShow(cmd *commander.Command, args []string) error {
downloadSources = "yes"
}
fmt.Printf("Download Sources: %s\n", downloadSources)
+ downloadUdebs := "no"
+ if repo.DownloadUdebs {
+ downloadUdebs = "yes"
+ }
+ fmt.Printf("Download .udebs: %s\n", downloadUdebs)
if repo.Filter != "" {
fmt.Printf("Filter: %s\n", repo.Filter)
filterWithDeps := "no"
diff --git a/src/github.com/smira/aptly/cmd/mirror_update.go b/src/github.com/smira/aptly/cmd/mirror_update.go
index 7caf564d..5b5cc285 100644
--- a/src/github.com/smira/aptly/cmd/mirror_update.go
+++ b/src/github.com/smira/aptly/cmd/mirror_update.go
@@ -4,8 +4,12 @@ import (
"fmt"
"github.com/smira/aptly/deb"
"github.com/smira/aptly/query"
+ "github.com/smira/aptly/utils"
"github.com/smira/commander"
"github.com/smira/flag"
+ "os"
+ "os/signal"
+ "strings"
)
func aptlyMirrorUpdate(cmd *commander.Command, args []string) error {
@@ -27,6 +31,14 @@ func aptlyMirrorUpdate(cmd *commander.Command, args []string) error {
return fmt.Errorf("unable to update: %s", err)
}
+ force := context.flags.Lookup("force").Value.Get().(bool)
+ if !force {
+ err = repo.CheckLock()
+ if err != nil {
+ return fmt.Errorf("unable to update: %s", err)
+ }
+ }
+
ignoreMismatch := context.flags.Lookup("ignore-checksums").Value.Get().(bool)
verifier, err := getVerifier(context.flags)
@@ -39,21 +51,112 @@ func aptlyMirrorUpdate(cmd *commander.Command, args []string) error {
return fmt.Errorf("unable to update: %s", err)
}
- var filterQuery deb.PackageQuery
-
- if repo.Filter != "" {
- filterQuery, err = query.Parse(repo.Filter)
- if err != nil {
- return fmt.Errorf("unable to update: %s", err)
- }
- }
-
- err = repo.Download(context.Progress(), context.Downloader(), context.CollectionFactory(), context.PackagePool(), ignoreMismatch,
- context.DependencyOptions(), filterQuery)
+ context.Progress().Printf("Downloading & parsing package files...\n")
+ err = repo.DownloadPackageIndexes(context.Progress(), context.Downloader(), context.CollectionFactory(), ignoreMismatch)
if err != nil {
return fmt.Errorf("unable to update: %s", err)
}
+ if repo.Filter != "" {
+ context.Progress().Printf("Applying filter...\n")
+ var filterQuery deb.PackageQuery
+
+ filterQuery, err = query.Parse(repo.Filter)
+ if err != nil {
+ return fmt.Errorf("unable to update: %s", err)
+ }
+
+ var oldLen, newLen int
+ oldLen, newLen, err = repo.ApplyFilter(context.DependencyOptions(), filterQuery)
+ if err != nil {
+ return fmt.Errorf("unable to update: %s", err)
+ }
+ context.Progress().Printf("Packages filtered: %d -> %d.\n", oldLen, newLen)
+ }
+
+ var (
+ downloadSize int64
+ queue []deb.PackageDownloadTask
+ )
+
+ context.Progress().Printf("Building download queue...\n")
+ queue, downloadSize, err = repo.BuildDownloadQueue(context.PackagePool())
+ if err != nil {
+ return fmt.Errorf("unable to update: %s", err)
+ }
+
+ defer func() {
+ // on any interruption, unlock the mirror
+ err := context.ReOpenDatabase()
+ if err == nil {
+ repo.MarkAsIdle()
+ context.CollectionFactory().RemoteRepoCollection().Update(repo)
+ }
+ }()
+
+ repo.MarkAsUpdating()
+ err = context.CollectionFactory().RemoteRepoCollection().Update(repo)
+ if err != nil {
+ return fmt.Errorf("unable to update: %s", err)
+ }
+
+ err = context.CloseDatabase()
+ if err != nil {
+ return fmt.Errorf("unable to update: %s", err)
+ }
+
+ // Catch ^C
+ sigch := make(chan os.Signal)
+ signal.Notify(sigch, os.Interrupt)
+
+ count := len(queue)
+ context.Progress().Printf("Download queue: %d items (%s)\n", count, utils.HumanBytes(downloadSize))
+
+ // Download from the queue
+ context.Progress().InitBar(downloadSize, true)
+
+ // Download all package files
+ ch := make(chan error, count)
+
+ // In separate goroutine (to avoid blocking main), push queue to downloader
+ go func() {
+ for _, task := range queue {
+ context.Downloader().DownloadWithChecksum(repo.PackageURL(task.RepoURI).String(), task.DestinationPath, ch, task.Checksums, ignoreMismatch)
+ }
+
+ // We don't need queue after this point
+ queue = nil
+ }()
+
+ // Wait for all downloads to finish
+ errors := make([]string, 0)
+
+ for count > 0 {
+ select {
+ case <-sigch:
+ signal.Stop(sigch)
+ return fmt.Errorf("unable to update: interrupted")
+ case err = <-ch:
+ if err != nil {
+ errors = append(errors, err.Error())
+ }
+ count--
+ }
+ }
+
+ context.Progress().ShutdownBar()
+ signal.Stop(sigch)
+
+ if len(errors) > 0 {
+ return fmt.Errorf("unable to update: download errors:\n %s\n", strings.Join(errors, "\n "))
+ }
+
+ err = context.ReOpenDatabase()
+ if err != nil {
+ return fmt.Errorf("unable to update: %s", err)
+ }
+
+ repo.FinalizeDownload()
err = context.CollectionFactory().RemoteRepoCollection().Update(repo)
if err != nil {
return fmt.Errorf("unable to update: %s", err)
@@ -80,6 +183,7 @@ Example:
Flag: *flag.NewFlagSet("aptly-mirror-update", flag.ExitOnError),
}
+ cmd.Flag.Bool("force", false, "force update mirror even if it is locked by another process")
cmd.Flag.Bool("ignore-checksums", false, "ignore checksum mismatches while downloading package files and metadata")
cmd.Flag.Bool("ignore-signatures", false, "disable verification of Release file signatures")
cmd.Flag.Int64("download-limit", 0, "limit download speed (kbytes/sec)")
diff --git a/src/github.com/smira/aptly/cmd/package.go b/src/github.com/smira/aptly/cmd/package.go
new file mode 100644
index 00000000..3c9d428c
--- /dev/null
+++ b/src/github.com/smira/aptly/cmd/package.go
@@ -0,0 +1,16 @@
+package cmd
+
+import (
+ "github.com/smira/commander"
+)
+
+func makeCmdPackage() *commander.Command {
+ return &commander.Command{
+ UsageLine: "package",
+ Short: "operations on packages",
+ Subcommands: []*commander.Command{
+ makeCmdPackageSearch(),
+ makeCmdPackageShow(),
+ },
+ }
+}
diff --git a/src/github.com/smira/aptly/cmd/package_search.go b/src/github.com/smira/aptly/cmd/package_search.go
new file mode 100644
index 00000000..8c910548
--- /dev/null
+++ b/src/github.com/smira/aptly/cmd/package_search.go
@@ -0,0 +1,48 @@
+package cmd
+
+import (
+ "fmt"
+ "github.com/smira/aptly/deb"
+ "github.com/smira/aptly/query"
+ "github.com/smira/commander"
+ "github.com/smira/flag"
+)
+
+func aptlyPackageSearch(cmd *commander.Command, args []string) error {
+ var err error
+ if len(args) != 1 {
+ cmd.Usage()
+ return commander.ErrCommandError
+ }
+
+ q, err := query.Parse(args[0])
+ if err != nil {
+ return fmt.Errorf("unable to search: %s", err)
+ }
+
+ result := q.Query(context.CollectionFactory().PackageCollection())
+ result.ForEach(func(p *deb.Package) error {
+ context.Progress().Printf("%s\n", p)
+ return nil
+ })
+
+ return err
+}
+
+func makeCmdPackageSearch() *commander.Command {
+ cmd := &commander.Command{
+ Run: aptlyPackageSearch,
+ UsageLine: "search ",
+ Short: "search for packages matching query",
+ Long: `
+Command search displays list of packages in whole DB that match package query
+
+Example:
+
+ $ aptly package search '$Architecture (i386), Name (% *-dev)'
+`,
+ Flag: *flag.NewFlagSet("aptly-package-search", flag.ExitOnError),
+ }
+
+ return cmd
+}
diff --git a/src/github.com/smira/aptly/cmd/package_show.go b/src/github.com/smira/aptly/cmd/package_show.go
new file mode 100644
index 00000000..d544f0a8
--- /dev/null
+++ b/src/github.com/smira/aptly/cmd/package_show.go
@@ -0,0 +1,137 @@
+package cmd
+
+import (
+ "bufio"
+ "fmt"
+ "github.com/smira/aptly/deb"
+ "github.com/smira/aptly/query"
+ "github.com/smira/commander"
+ "github.com/smira/flag"
+ "os"
+)
+
+func printReferencesTo(p *deb.Package) (err error) {
+ err = context.CollectionFactory().RemoteRepoCollection().ForEach(func(repo *deb.RemoteRepo) error {
+ err := context.CollectionFactory().RemoteRepoCollection().LoadComplete(repo)
+ if err != nil {
+ return err
+ }
+ if repo.RefList() != nil {
+ if repo.RefList().Has(p) {
+ fmt.Printf(" mirror %s\n", repo)
+ }
+ }
+ return nil
+ })
+ if err != nil {
+ return err
+ }
+
+ err = context.CollectionFactory().LocalRepoCollection().ForEach(func(repo *deb.LocalRepo) error {
+ err := context.CollectionFactory().LocalRepoCollection().LoadComplete(repo)
+ if err != nil {
+ return err
+ }
+ if repo.RefList() != nil {
+ if repo.RefList().Has(p) {
+ fmt.Printf(" local repo %s\n", repo)
+ }
+ }
+ return nil
+ })
+ if err != nil {
+ return err
+ }
+
+ err = context.CollectionFactory().SnapshotCollection().ForEach(func(snapshot *deb.Snapshot) error {
+ err := context.CollectionFactory().SnapshotCollection().LoadComplete(snapshot)
+ if err != nil {
+ return err
+ }
+ if snapshot.RefList().Has(p) {
+ fmt.Printf(" snapshot %s\n", snapshot)
+ }
+ return nil
+ })
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func aptlyPackageShow(cmd *commander.Command, args []string) error {
+ var err error
+ if len(args) != 1 {
+ cmd.Usage()
+ return commander.ErrCommandError
+ }
+
+ q, err := query.Parse(args[0])
+ if err != nil {
+ return fmt.Errorf("unable to show: %s", err)
+ }
+
+ withFiles := context.flags.Lookup("with-files").Value.Get().(bool)
+ withReferences := context.flags.Lookup("with-references").Value.Get().(bool)
+
+ w := bufio.NewWriter(os.Stdout)
+
+ result := q.Query(context.CollectionFactory().PackageCollection())
+
+ err = result.ForEach(func(p *deb.Package) error {
+ p.Stanza().WriteTo(w)
+ w.Flush()
+ fmt.Printf("\n")
+
+ if withFiles {
+ fmt.Printf("Files in the pool:\n")
+ for _, f := range p.Files() {
+ path, err := context.PackagePool().Path(f.Filename, f.Checksums.MD5)
+ if err != nil {
+ return err
+ }
+ fmt.Printf(" %s\n", path)
+ }
+ fmt.Printf("\n")
+ }
+
+ if withReferences {
+ fmt.Printf("References to package:\n")
+ printReferencesTo(p)
+ fmt.Printf("\n")
+ }
+
+ return nil
+ })
+
+ if err != nil {
+ return fmt.Errorf("unable to show: %s", err)
+ }
+
+ return err
+}
+
+func makeCmdPackageShow() *commander.Command {
+ cmd := &commander.Command{
+ Run: aptlyPackageShow,
+ UsageLine: "show ",
+ Short: "show details about packages matcing query",
+ Long: `
+Command shows displays detailed meta-information about packages
+matching query. Information from Debian control file is displayed.
+Optionally information about package files and
+inclusion into mirrors/snapshots/local repos is shown.
+
+Example:
+
+ $ aptly package show nginx-light_1.2.1-2.2+wheezy2_i386'
+`,
+ Flag: *flag.NewFlagSet("aptly-package-show", flag.ExitOnError),
+ }
+
+ cmd.Flag.Bool("with-files", false, "display information about files from package pool")
+ cmd.Flag.Bool("with-references", false, "display information about mirrors, snapshots and local repos referencing this package")
+
+ return cmd
+}
diff --git a/src/github.com/smira/aptly/cmd/publish.go b/src/github.com/smira/aptly/cmd/publish.go
index b6cb2066..1ad8b163 100644
--- a/src/github.com/smira/aptly/cmd/publish.go
+++ b/src/github.com/smira/aptly/cmd/publish.go
@@ -8,13 +8,14 @@ import (
)
func getSigner(flags *flag.FlagSet) (utils.Signer, error) {
- if flags.Lookup("skip-signing").Value.Get().(bool) || context.Config().GpgDisableSign {
+ if LookupOption(context.Config().GpgDisableSign, flags, "skip-signing") {
return nil, nil
}
signer := &utils.GpgSigner{}
signer.SetKey(flags.Lookup("gpg-key").Value.String())
signer.SetKeyRing(flags.Lookup("keyring").Value.String(), flags.Lookup("secret-keyring").Value.String())
+ signer.SetPassphrase(flags.Lookup("passphrase").Value.String(), flags.Lookup("passphrase-file").Value.String())
err := signer.Init()
if err != nil {
diff --git a/src/github.com/smira/aptly/cmd/publish_list.go b/src/github.com/smira/aptly/cmd/publish_list.go
index c352abda..20d89bcc 100644
--- a/src/github.com/smira/aptly/cmd/publish_list.go
+++ b/src/github.com/smira/aptly/cmd/publish_list.go
@@ -25,7 +25,7 @@ func aptlyPublishList(cmd *commander.Command, args []string) error {
}
if raw {
- published = append(published, fmt.Sprintf("%s %s", repo.Prefix, repo.Distribution))
+ published = append(published, fmt.Sprintf("%s %s", repo.StoragePrefix(), repo.Distribution))
} else {
published = append(published, repo.String())
}
diff --git a/src/github.com/smira/aptly/cmd/publish_repo.go b/src/github.com/smira/aptly/cmd/publish_repo.go
index 2545d4e0..405c5970 100644
--- a/src/github.com/smira/aptly/cmd/publish_repo.go
+++ b/src/github.com/smira/aptly/cmd/publish_repo.go
@@ -37,6 +37,8 @@ Example:
cmd.Flag.String("gpg-key", "", "GPG key ID to use when signing the release")
cmd.Flag.Var(&keyRingsFlag{}, "keyring", "GPG keyring to use (instead of default)")
cmd.Flag.String("secret-keyring", "", "GPG secret keyring to use (instead of default)")
+ cmd.Flag.String("passphrase", "", "GPG passhprase for the key (warning: could be insecure)")
+ cmd.Flag.String("passphrase-file", "", "GPG passhprase-file for the key (warning: could be insecure)")
cmd.Flag.Bool("skip-signing", false, "don't sign Release files with GPG")
cmd.Flag.String("origin", "", "origin name to publish")
cmd.Flag.String("label", "", "label to publish")
diff --git a/src/github.com/smira/aptly/cmd/publish_snapshot.go b/src/github.com/smira/aptly/cmd/publish_snapshot.go
index f02f96aa..92877522 100644
--- a/src/github.com/smira/aptly/cmd/publish_snapshot.go
+++ b/src/github.com/smira/aptly/cmd/publish_snapshot.go
@@ -199,6 +199,8 @@ Example:
cmd.Flag.String("gpg-key", "", "GPG key ID to use when signing the release")
cmd.Flag.Var(&keyRingsFlag{}, "keyring", "GPG keyring to use (instead of default)")
cmd.Flag.String("secret-keyring", "", "GPG secret keyring to use (instead of default)")
+ cmd.Flag.String("passphrase", "", "GPG passhprase for the key (warning: could be insecure)")
+ cmd.Flag.String("passphrase-file", "", "GPG passhprase-file for the key (warning: could be insecure)")
cmd.Flag.Bool("skip-signing", false, "don't sign Release files with GPG")
cmd.Flag.String("origin", "", "origin name to publish")
cmd.Flag.String("label", "", "label to publish")
diff --git a/src/github.com/smira/aptly/cmd/publish_switch.go b/src/github.com/smira/aptly/cmd/publish_switch.go
index ed4dddcb..21b97eca 100644
--- a/src/github.com/smira/aptly/cmd/publish_switch.go
+++ b/src/github.com/smira/aptly/cmd/publish_switch.go
@@ -131,6 +131,8 @@ Example:
cmd.Flag.String("gpg-key", "", "GPG key ID to use when signing the release")
cmd.Flag.Var(&keyRingsFlag{}, "keyring", "GPG keyring to use (instead of default)")
cmd.Flag.String("secret-keyring", "", "GPG secret keyring to use (instead of default)")
+ cmd.Flag.String("passphrase", "", "GPG passhprase for the key (warning: could be insecure)")
+ cmd.Flag.String("passphrase-file", "", "GPG passhprase-file for the key (warning: could be insecure)")
cmd.Flag.Bool("skip-signing", false, "don't sign Release files with GPG")
cmd.Flag.String("component", "", "component names to update (for multi-component publishing, separate components with commas)")
cmd.Flag.Bool("force-overwrite", false, "overwrite files in package pool in case of mismatch")
diff --git a/src/github.com/smira/aptly/cmd/publish_update.go b/src/github.com/smira/aptly/cmd/publish_update.go
index 0833d136..0629acdc 100644
--- a/src/github.com/smira/aptly/cmd/publish_update.go
+++ b/src/github.com/smira/aptly/cmd/publish_update.go
@@ -98,6 +98,8 @@ Example:
cmd.Flag.String("gpg-key", "", "GPG key ID to use when signing the release")
cmd.Flag.Var(&keyRingsFlag{}, "keyring", "GPG keyring to use (instead of default)")
cmd.Flag.String("secret-keyring", "", "GPG secret keyring to use (instead of default)")
+ cmd.Flag.String("passphrase", "", "GPG passhprase for the key (warning: could be insecure)")
+ cmd.Flag.String("passphrase-file", "", "GPG passhprase-file for the key (warning: could be insecure)")
cmd.Flag.Bool("skip-signing", false, "don't sign Release files with GPG")
cmd.Flag.Bool("force-overwrite", false, "overwrite files in package pool in case of mismatch")
diff --git a/src/github.com/smira/aptly/cmd/repo.go b/src/github.com/smira/aptly/cmd/repo.go
index 94ae0b2e..2823a149 100644
--- a/src/github.com/smira/aptly/cmd/repo.go
+++ b/src/github.com/smira/aptly/cmd/repo.go
@@ -20,6 +20,7 @@ func makeCmdRepo() *commander.Command {
makeCmdRepoRemove(),
makeCmdRepoShow(),
makeCmdRepoRename(),
+ makeCmdRepoSearch(),
},
}
}
diff --git a/src/github.com/smira/aptly/cmd/repo_add.go b/src/github.com/smira/aptly/cmd/repo_add.go
index e003bed4..7626efc0 100644
--- a/src/github.com/smira/aptly/cmd/repo_add.go
+++ b/src/github.com/smira/aptly/cmd/repo_add.go
@@ -40,6 +40,8 @@ func aptlyRepoAdd(cmd *commander.Command, args []string) error {
return fmt.Errorf("unable to load packages: %s", err)
}
+ forceReplace := context.flags.Lookup("force-replace").Value.Get().(bool)
+
packageFiles := []string{}
failedFiles := []string{}
@@ -59,14 +61,16 @@ func aptlyRepoAdd(cmd *commander.Command, args []string) error {
return nil
}
- if strings.HasSuffix(info.Name(), ".deb") || strings.HasSuffix(info.Name(), ".dsc") {
+ if strings.HasSuffix(info.Name(), ".deb") || strings.HasSuffix(info.Name(), ".udeb") ||
+ strings.HasSuffix(info.Name(), ".dsc") {
packageFiles = append(packageFiles, path)
}
return nil
})
} else {
- if strings.HasSuffix(info.Name(), ".deb") || strings.HasSuffix(info.Name(), ".dsc") {
+ if strings.HasSuffix(info.Name(), ".deb") || strings.HasSuffix(info.Name(), ".udeb") ||
+ strings.HasSuffix(info.Name(), ".dsc") {
packageFiles = append(packageFiles, location)
} else {
context.Progress().ColoredPrintf("@y[!]@| @!Unknwon file extenstion: %s@|", location)
@@ -79,6 +83,10 @@ func aptlyRepoAdd(cmd *commander.Command, args []string) error {
processedFiles := []string{}
sort.Strings(packageFiles)
+ if forceReplace {
+ list.PrepareIndex()
+ }
+
for _, file := range packageFiles {
var (
stanza deb.Stanza
@@ -87,6 +95,7 @@ func aptlyRepoAdd(cmd *commander.Command, args []string) error {
candidateProcessedFiles := []string{}
isSourcePackage := strings.HasSuffix(file, ".dsc")
+ isUdebPackage := strings.HasSuffix(file, ".udeb")
if isSourcePackage {
stanza, err = deb.GetControlFileFromDsc(file, verifier)
@@ -99,7 +108,11 @@ func aptlyRepoAdd(cmd *commander.Command, args []string) error {
}
} else {
stanza, err = deb.GetControlFileFromDeb(file)
- p = deb.NewPackageFromControlFile(stanza)
+ if isUdebPackage {
+ p = deb.NewUdebPackageFromControlFile(stanza)
+ } else {
+ p = deb.NewPackageFromControlFile(stanza)
+ }
}
if err != nil {
context.Progress().ColoredPrintf("@y[!]@| @!Unable to read file %s: %s@|", file, err)
@@ -155,6 +168,14 @@ func aptlyRepoAdd(cmd *commander.Command, args []string) error {
continue
}
+ if forceReplace {
+ conflictingPackages := list.Search(deb.Dependency{Pkg: p.Name, Version: p.Version, Architecture: p.Architecture}, true)
+ for _, cp := range conflictingPackages {
+ context.Progress().ColoredPrintf("@r[-]@| %s removed due to conflict with package being added", cp)
+ list.Remove(cp)
+ }
+ }
+
err = list.Add(p)
if err != nil {
context.Progress().ColoredPrintf("@y[!]@| @!Unable to add package to repo %s: %s@|", p, err)
@@ -202,8 +223,8 @@ func makeCmdRepoAdd() *commander.Command {
UsageLine: "add | ...",
Short: "add packages to local repository",
Long: `
-Command adds packages to local repository from .deb (binary packages) and .dsc (source packages) files.
-When importing from directory aptly would do recursive scan looking for all files matching *.deb or *.dsc
+Command adds packages to local repository from .deb, .udeb (binary packages) and .dsc (source packages) files.
+When importing from directory aptly would do recursive scan looking for all files matching *.[u]deb or *.dsc
patterns. Every file discovered would be analyzed to extract metadata, package would then be created and added
to the database. Files would be imported to internal package pool. For source packages, all required files are
added automatically as well. Extra files for source package should be in the same directory as *.dsc file.
@@ -216,6 +237,7 @@ Example:
}
cmd.Flag.Bool("remove-files", false, "remove files that have been imported successfully into repository")
+ cmd.Flag.Bool("force-replace", false, "when adding package that conflicts with existing package, remove existing package")
return cmd
}
diff --git a/src/github.com/smira/aptly/cmd/repo_edit.go b/src/github.com/smira/aptly/cmd/repo_edit.go
index dce6b2bc..6177be43 100644
--- a/src/github.com/smira/aptly/cmd/repo_edit.go
+++ b/src/github.com/smira/aptly/cmd/repo_edit.go
@@ -50,7 +50,7 @@ func makeCmdRepoEdit() *commander.Command {
UsageLine: "edit ",
Short: "edit properties of local repository",
Long: `
-Command edit allows to change metadata of local repository:
+Command edit allows one to change metadata of local repository:
comment, default distribution and component.
Example:
diff --git a/src/github.com/smira/aptly/cmd/repo_search.go b/src/github.com/smira/aptly/cmd/repo_search.go
new file mode 100644
index 00000000..e681a339
--- /dev/null
+++ b/src/github.com/smira/aptly/cmd/repo_search.go
@@ -0,0 +1,26 @@
+package cmd
+
+import (
+ "github.com/smira/commander"
+ "github.com/smira/flag"
+)
+
+func makeCmdRepoSearch() *commander.Command {
+ cmd := &commander.Command{
+ Run: aptlySnapshotMirrorRepoSearch,
+ UsageLine: "search ",
+ Short: "search repo for packages matching query",
+ Long: `
+Command search displays list of packages in local repository that match package query
+
+Example:
+
+ $ aptly repo search my-software '$Architecture (i386), Name (% *-dev)'
+`,
+ Flag: *flag.NewFlagSet("aptly-repo-show", flag.ExitOnError),
+ }
+
+ cmd.Flag.Bool("with-deps", false, "include dependencies into search results")
+
+ return cmd
+}
diff --git a/src/github.com/smira/aptly/cmd/run.go b/src/github.com/smira/aptly/cmd/run.go
new file mode 100644
index 00000000..6ac45138
--- /dev/null
+++ b/src/github.com/smira/aptly/cmd/run.go
@@ -0,0 +1,44 @@
+package cmd
+
+import (
+ "fmt"
+ "github.com/smira/commander"
+)
+
+// Run runs single command starting from root cmd with args, optionally initializing context
+func Run(cmd *commander.Command, cmdArgs []string, initContext bool) (returnCode int) {
+ defer func() {
+ if r := recover(); r != nil {
+ fatal, ok := r.(*FatalError)
+ if !ok {
+ panic(r)
+ }
+ fmt.Println("ERROR:", fatal.Message)
+ returnCode = fatal.ReturnCode
+ }
+ }()
+
+ returnCode = 0
+
+ flags, args, err := cmd.ParseFlags(cmdArgs)
+ if err != nil {
+ Fatal(err)
+ }
+
+ if initContext {
+ err = InitContext(flags)
+ if err != nil {
+ Fatal(err)
+ }
+ defer ShutdownContext()
+ }
+
+ context.UpdateFlags(flags)
+
+ err = cmd.Dispatch(args)
+ if err != nil {
+ Fatal(err)
+ }
+
+ return
+}
diff --git a/src/github.com/smira/aptly/cmd/snapshot.go b/src/github.com/smira/aptly/cmd/snapshot.go
index 47207921..d0cf2aea 100644
--- a/src/github.com/smira/aptly/cmd/snapshot.go
+++ b/src/github.com/smira/aptly/cmd/snapshot.go
@@ -18,6 +18,8 @@ func makeCmdSnapshot() *commander.Command {
makeCmdSnapshotMerge(),
makeCmdSnapshotDrop(),
makeCmdSnapshotRename(),
+ makeCmdSnapshotSearch(),
+ makeCmdSnapshotFilter(),
},
}
}
diff --git a/src/github.com/smira/aptly/cmd/snapshot_create.go b/src/github.com/smira/aptly/cmd/snapshot_create.go
index c4e34be9..aa9078fc 100644
--- a/src/github.com/smira/aptly/cmd/snapshot_create.go
+++ b/src/github.com/smira/aptly/cmd/snapshot_create.go
@@ -23,6 +23,11 @@ func aptlySnapshotCreate(cmd *commander.Command, args []string) error {
return fmt.Errorf("unable to create snapshot: %s", err)
}
+ err = repo.CheckLock()
+ if err != nil {
+ return fmt.Errorf("unable to create snapshot: %s", err)
+ }
+
err = context.CollectionFactory().RemoteRepoCollection().LoadComplete(repo)
if err != nil {
return fmt.Errorf("unable to create snapshot: %s", err)
diff --git a/src/github.com/smira/aptly/cmd/snapshot_filter.go b/src/github.com/smira/aptly/cmd/snapshot_filter.go
new file mode 100644
index 00000000..ce91fdc6
--- /dev/null
+++ b/src/github.com/smira/aptly/cmd/snapshot_filter.go
@@ -0,0 +1,107 @@
+package cmd
+
+import (
+ "fmt"
+ "github.com/smira/aptly/deb"
+ "github.com/smira/aptly/query"
+ "github.com/smira/commander"
+ "github.com/smira/flag"
+ "sort"
+ "strings"
+)
+
+func aptlySnapshotFilter(cmd *commander.Command, args []string) error {
+ var err error
+ if len(args) < 3 {
+ cmd.Usage()
+ return commander.ErrCommandError
+ }
+
+ withDeps := context.flags.Lookup("with-deps").Value.Get().(bool)
+
+ // Load snapshot
+ source, err := context.CollectionFactory().SnapshotCollection().ByName(args[0])
+ if err != nil {
+ return fmt.Errorf("unable to filter: %s", err)
+ }
+
+ err = context.CollectionFactory().SnapshotCollection().LoadComplete(source)
+ if err != nil {
+ return fmt.Errorf("unable to filter: %s", err)
+ }
+
+ // Convert snapshot to package list
+ context.Progress().Printf("Loading packages (%d)...\n", source.RefList().Len())
+ packageList, err := deb.NewPackageListFromRefList(source.RefList(), context.CollectionFactory().PackageCollection(), context.Progress())
+ if err != nil {
+ return fmt.Errorf("unable to load packages: %s", err)
+ }
+
+ context.Progress().Printf("Building indexes...\n")
+ packageList.PrepareIndex()
+
+ // Calculate architectures
+ var architecturesList []string
+
+ if len(context.ArchitecturesList()) > 0 {
+ architecturesList = context.ArchitecturesList()
+ } else {
+ architecturesList = packageList.Architectures(false)
+ }
+
+ sort.Strings(architecturesList)
+
+ if len(architecturesList) == 0 && withDeps {
+ return fmt.Errorf("unable to determine list of architectures, please specify explicitly")
+ }
+
+ // Initial queries out of arguments
+ queries := make([]deb.PackageQuery, len(args)-2)
+ for i, arg := range args[2:] {
+ queries[i], err = query.Parse(arg)
+ if err != nil {
+ return fmt.Errorf("unable to parse query: %s", err)
+ }
+ }
+
+ // Filter with dependencies as requested
+ result, err := packageList.Filter(queries, withDeps, nil, context.DependencyOptions(), architecturesList)
+ if err != nil {
+ return fmt.Errorf("unable to filter: %s", err)
+ }
+
+ // Create snapshot
+ destination := deb.NewSnapshotFromPackageList(args[1], []*deb.Snapshot{source}, result,
+ fmt.Sprintf("Filtered '%s', query was: '%s'", source.Name, strings.Join(args[2:], " ")))
+
+ err = context.CollectionFactory().SnapshotCollection().Add(destination)
+ if err != nil {
+ return fmt.Errorf("unable to create snapshot: %s", err)
+ }
+
+ context.Progress().Printf("\nSnapshot %s successfully filtered.\nYou can run 'aptly publish snapshot %s' to publish snapshot as Debian repository.\n", destination.Name, destination.Name)
+
+ return err
+}
+
+func makeCmdSnapshotFilter() *commander.Command {
+ cmd := &commander.Command{
+ Run: aptlySnapshotFilter,
+ UsageLine: "filter ...",
+ Short: "filter packages in snapshot producing another snapshot",
+ Long: `
+Command filter does filtering in snapshot , producing another
+snapshot . Packages could be specified simply
+as 'package-name' or as package queries.
+
+Example:
+
+ $ aptly snapshot filter wheezy-main wheezy-required 'Priorioty (required)'
+`,
+ Flag: *flag.NewFlagSet("aptly-snapshot-filter", flag.ExitOnError),
+ }
+
+ cmd.Flag.Bool("with-deps", false, "include dependent packages as well")
+
+ return cmd
+}
diff --git a/src/github.com/smira/aptly/cmd/snapshot_search.go b/src/github.com/smira/aptly/cmd/snapshot_search.go
new file mode 100644
index 00000000..5768d65e
--- /dev/null
+++ b/src/github.com/smira/aptly/cmd/snapshot_search.go
@@ -0,0 +1,125 @@
+package cmd
+
+import (
+ "fmt"
+ "github.com/smira/aptly/deb"
+ "github.com/smira/aptly/query"
+ "github.com/smira/commander"
+ "github.com/smira/flag"
+ "sort"
+)
+
+func aptlySnapshotMirrorRepoSearch(cmd *commander.Command, args []string) error {
+ var err error
+ if len(args) != 2 {
+ cmd.Usage()
+ return commander.ErrCommandError
+ }
+
+ name := args[0]
+ command := cmd.Parent.Name()
+
+ var reflist *deb.PackageRefList
+
+ if command == "snapshot" {
+ snapshot, err := context.CollectionFactory().SnapshotCollection().ByName(name)
+ if err != nil {
+ return fmt.Errorf("unable to search: %s", err)
+ }
+
+ err = context.CollectionFactory().SnapshotCollection().LoadComplete(snapshot)
+ if err != nil {
+ return fmt.Errorf("unable to search: %s", err)
+ }
+
+ reflist = snapshot.RefList()
+ } else if command == "mirror" {
+ repo, err := context.CollectionFactory().RemoteRepoCollection().ByName(name)
+ if err != nil {
+ return fmt.Errorf("unable to search: %s", err)
+ }
+
+ err = context.CollectionFactory().RemoteRepoCollection().LoadComplete(repo)
+ if err != nil {
+ return fmt.Errorf("unable to search: %s", err)
+ }
+
+ reflist = repo.RefList()
+ } else if command == "repo" {
+ repo, err := context.CollectionFactory().LocalRepoCollection().ByName(name)
+ if err != nil {
+ return fmt.Errorf("unable to search: %s", err)
+ }
+
+ err = context.CollectionFactory().LocalRepoCollection().LoadComplete(repo)
+ if err != nil {
+ return fmt.Errorf("unable to search: %s", err)
+ }
+
+ reflist = repo.RefList()
+ } else {
+ panic("unknown command")
+ }
+
+ list, err := deb.NewPackageListFromRefList(reflist, context.CollectionFactory().PackageCollection(), context.Progress())
+ if err != nil {
+ return fmt.Errorf("unable to search: %s", err)
+ }
+
+ list.PrepareIndex()
+
+ q, err := query.Parse(args[1])
+ if err != nil {
+ return fmt.Errorf("unable to search: %s", err)
+ }
+
+ withDeps := context.flags.Lookup("with-deps").Value.Get().(bool)
+ architecturesList := []string{}
+
+ if withDeps {
+ if len(context.ArchitecturesList()) > 0 {
+ architecturesList = context.ArchitecturesList()
+ } else {
+ architecturesList = list.Architectures(false)
+ }
+
+ sort.Strings(architecturesList)
+
+ if len(architecturesList) == 0 {
+ return fmt.Errorf("unable to determine list of architectures, please specify explicitly")
+ }
+ }
+
+ result, err := list.Filter([]deb.PackageQuery{q}, withDeps,
+ nil, context.DependencyOptions(), architecturesList)
+ if err != nil {
+ return fmt.Errorf("unable to search: %s", err)
+ }
+
+ result.ForEach(func(p *deb.Package) error {
+ context.Progress().Printf("%s\n", p)
+ return nil
+ })
+
+ return err
+}
+
+func makeCmdSnapshotSearch() *commander.Command {
+ cmd := &commander.Command{
+ Run: aptlySnapshotMirrorRepoSearch,
+ UsageLine: "search ",
+ Short: "search snapshot for packages matching query",
+ Long: `
+Command search displays list of packages in snapshot that match package query
+
+Example:
+
+ $ aptly snapshot search wheezy-main '$Architecture (i386), Name (% *-dev)'
+`,
+ Flag: *flag.NewFlagSet("aptly-snapshot-search", flag.ExitOnError),
+ }
+
+ cmd.Flag.Bool("with-deps", false, "include dependencies into search results")
+
+ return cmd
+}
diff --git a/src/github.com/smira/aptly/cmd/task.go b/src/github.com/smira/aptly/cmd/task.go
new file mode 100644
index 00000000..07d79de5
--- /dev/null
+++ b/src/github.com/smira/aptly/cmd/task.go
@@ -0,0 +1,15 @@
+package cmd
+
+import (
+ "github.com/smira/commander"
+)
+
+func makeCmdTask() *commander.Command {
+ return &commander.Command{
+ UsageLine: "task",
+ Short: "manage aptly tasks",
+ Subcommands: []*commander.Command{
+ makeCmdTaskRun(),
+ },
+ }
+}
diff --git a/src/github.com/smira/aptly/cmd/task_run.go b/src/github.com/smira/aptly/cmd/task_run.go
new file mode 100644
index 00000000..0a51c347
--- /dev/null
+++ b/src/github.com/smira/aptly/cmd/task_run.go
@@ -0,0 +1,148 @@
+package cmd
+
+import (
+ "bufio"
+ "fmt"
+ "os"
+ "strings"
+
+ "github.com/mattn/go-shellwords"
+ "github.com/smira/commander"
+)
+
+func aptlyTaskRun(cmd *commander.Command, args []string) error {
+ var err error
+ var cmdList [][]string
+
+ if filename := cmd.Flag.Lookup("filename").Value.Get().(string); filename != "" {
+ var text string
+ cmdArgs := []string{}
+
+ if finfo, err := os.Stat(filename); os.IsNotExist(err) || finfo.IsDir() {
+ return fmt.Errorf("no such file, %s\n", filename)
+ }
+
+ fmt.Println("Reading file...\n")
+
+ file, err := os.Open(filename)
+
+ if err != nil {
+ return err
+ }
+ defer file.Close()
+
+ scanner := bufio.NewScanner(file)
+
+ for scanner.Scan() {
+ text = strings.TrimSpace(scanner.Text()) + ","
+ parsedArgs, _ := shellwords.Parse(text)
+ cmdArgs = append(cmdArgs, parsedArgs...)
+ }
+
+ if err = scanner.Err(); err != nil {
+ return err
+ }
+
+ if len(cmdArgs) == 0 {
+ return fmt.Errorf("the file is empty")
+ }
+
+ cmdList = formatCommands(cmdArgs)
+ } else if len(args) == 0 {
+ var text string
+ cmdArgs := []string{}
+
+ fmt.Println("Please enter one command per line and leave one blank when finished.")
+
+ reader := bufio.NewReader(os.Stdin)
+ for {
+ fmt.Printf("> ")
+ text, _ = reader.ReadString('\n')
+ if text == "\n" {
+ break
+ } else {
+ text = strings.TrimSpace(text) + ","
+ parsedArgs, _ := shellwords.Parse(text)
+ cmdArgs = append(cmdArgs, parsedArgs...)
+ }
+ }
+
+ if len(cmdArgs) == 0 {
+ return fmt.Errorf("nothing entered")
+ }
+
+ cmdList = formatCommands(cmdArgs)
+ } else {
+ cmdList = formatCommands(args)
+ }
+
+ commandErrored := false
+
+ for i, command := range cmdList {
+ if !commandErrored {
+ context.Progress().ColoredPrintf("@g%d) [Running]: %s@!", (i + 1), strings.Join(command, " "))
+ context.Progress().ColoredPrintf("\n@yBegin command output: ----------------------------@!")
+ context.Progress().Flush()
+
+ returnCode := Run(RootCommand(), command, false)
+ if returnCode != 0 {
+ commandErrored = true
+ }
+ context.Progress().ColoredPrintf("\n@yEnd command output: ------------------------------@!")
+ CleanupContext()
+ } else {
+ context.Progress().ColoredPrintf("@r%d) [Skipping]: %s@!", (i + 1), strings.Join(command, " "))
+ }
+ }
+
+ if commandErrored {
+ err = fmt.Errorf("at least one command has reported an error")
+ }
+
+ return err
+}
+
+func formatCommands(args []string) [][]string {
+ var cmd []string
+ var cmdArray [][]string
+
+ for _, s := range args {
+ if sTrimmed := strings.TrimRight(s, ","); sTrimmed != s {
+ cmd = append(cmd, sTrimmed)
+ cmdArray = append(cmdArray, cmd)
+ cmd = []string{}
+ } else {
+ cmd = append(cmd, s)
+ }
+ }
+
+ if len(cmd) > 0 {
+ cmdArray = append(cmdArray, cmd)
+ }
+
+ return cmdArray
+}
+
+func makeCmdTaskRun() *commander.Command {
+ cmd := &commander.Command{
+ Run: aptlyTaskRun,
+ UsageLine: "run -filename= | , , ...",
+ Short: "run aptly tasks",
+ Long: `
+Command helps origanise multiple aptly commands in one single aptly task, running as single thread.
+
+Example:
+
+ $ aptly task run
+ > repo create local
+ > repo add local pkg1
+ > publish repo local
+ > serve
+ >
+
+`,
+ }
+
+ cmd.Flag.String("filename", "", "specifies the filename that contains the commands to run")
+ return cmd
+}
diff --git a/src/github.com/smira/aptly/database/leveldb.go b/src/github.com/smira/aptly/database/leveldb.go
index abb4fd5f..7876b38e 100644
--- a/src/github.com/smira/aptly/database/leveldb.go
+++ b/src/github.com/smira/aptly/database/leveldb.go
@@ -24,12 +24,14 @@ type Storage interface {
KeysByPrefix(prefix []byte) [][]byte
FetchByPrefix(prefix []byte) [][]byte
Close() error
+ ReOpen() error
StartBatch()
FinishBatch() error
CompactDB() error
}
type levelDB struct {
+ path string
db *leveldb.DB
batch *leveldb.Batch
}
@@ -39,17 +41,21 @@ var (
_ Storage = &levelDB{}
)
-// OpenDB opens (creates) LevelDB database
-func OpenDB(path string) (Storage, error) {
+func internalOpen(path string) (*leveldb.DB, error) {
o := &opt.Options{
Filter: filter.NewBloomFilter(10),
}
- db, err := leveldb.OpenFile(path, o)
+ return leveldb.OpenFile(path, o)
+}
+
+// OpenDB opens (creates) LevelDB database
+func OpenDB(path string) (Storage, error) {
+ db, err := internalOpen(path)
if err != nil {
return nil, err
}
- return &levelDB{db: db}, nil
+ return &levelDB{db: db, path: path}, nil
}
// RecoverDB recovers LevelDB database from corruption
@@ -147,7 +153,23 @@ func (l *levelDB) FetchByPrefix(prefix []byte) [][]byte {
// Close finishes DB work
func (l *levelDB) Close() error {
- return l.db.Close()
+ if l.db == nil {
+ return nil
+ }
+ err := l.db.Close()
+ l.db = nil
+ return err
+}
+
+// Reopen tries to re-open the database
+func (l *levelDB) ReOpen() error {
+ if l.db != nil {
+ return nil
+ }
+
+ var err error
+ l.db, err = internalOpen(l.path)
+ return err
}
// StartBatch starts batch processing of keys
diff --git a/src/github.com/smira/aptly/database/leveldb_test.go b/src/github.com/smira/aptly/database/leveldb_test.go
index 90be5901..e2624723 100644
--- a/src/github.com/smira/aptly/database/leveldb_test.go
+++ b/src/github.com/smira/aptly/database/leveldb_test.go
@@ -155,3 +155,23 @@ func (s *LevelDBSuite) TestCompactDB(c *C) {
c.Check(s.db.CompactDB(), IsNil)
}
+
+func (s *LevelDBSuite) TestReOpen(c *C) {
+ var (
+ key = []byte("key")
+ value = []byte("value")
+ )
+
+ err := s.db.Put(key, value)
+ c.Assert(err, IsNil)
+
+ err = s.db.Close()
+ c.Assert(err, IsNil)
+
+ err = s.db.ReOpen()
+ c.Assert(err, IsNil)
+
+ result, err := s.db.Get(key)
+ c.Assert(err, IsNil)
+ c.Assert(result, DeepEquals, value)
+}
diff --git a/src/github.com/smira/aptly/deb/index_files.go b/src/github.com/smira/aptly/deb/index_files.go
new file mode 100644
index 00000000..a1eb0015
--- /dev/null
+++ b/src/github.com/smira/aptly/deb/index_files.go
@@ -0,0 +1,254 @@
+package deb
+
+import (
+ "bufio"
+ "fmt"
+ "github.com/smira/aptly/aptly"
+ "github.com/smira/aptly/utils"
+ "os"
+ "path/filepath"
+ "strings"
+)
+
+type indexFiles struct {
+ publishedStorage aptly.PublishedStorage
+ basePath string
+ renameMap map[string]string
+ generatedFiles map[string]utils.ChecksumInfo
+ tempDir string
+ suffix string
+ indexes map[string]*indexFile
+}
+
+type indexFile struct {
+ parent *indexFiles
+ discardable bool
+ compressable bool
+ signable bool
+ relativePath string
+ tempFilename string
+ tempFile *os.File
+ w *bufio.Writer
+}
+
+func (file *indexFile) BufWriter() (*bufio.Writer, error) {
+ if file.w == nil {
+ var err error
+ file.tempFilename = filepath.Join(file.parent.tempDir, strings.Replace(file.relativePath, "/", "_", -1))
+ file.tempFile, err = os.Create(file.tempFilename)
+ if err != nil {
+ return nil, fmt.Errorf("unable to create temporary index file: %s", err)
+ }
+
+ file.w = bufio.NewWriter(file.tempFile)
+ }
+
+ return file.w, nil
+}
+
+func (file *indexFile) Finalize(signer utils.Signer) error {
+ if file.w == nil {
+ if file.discardable {
+ return nil
+ }
+ file.BufWriter()
+ }
+
+ err := file.w.Flush()
+ if err != nil {
+ file.tempFile.Close()
+ return fmt.Errorf("unable to write to index file: %s", err)
+ }
+
+ if file.compressable {
+ err = utils.CompressFile(file.tempFile)
+ if err != nil {
+ file.tempFile.Close()
+ return fmt.Errorf("unable to compress index file: %s", err)
+ }
+ }
+
+ file.tempFile.Close()
+
+ exts := []string{""}
+ if file.compressable {
+ exts = append(exts, ".gz", ".bz2")
+ }
+
+ for _, ext := range exts {
+ var checksumInfo utils.ChecksumInfo
+
+ checksumInfo, err = utils.ChecksumsForFile(file.tempFilename + ext)
+ if err != nil {
+ return fmt.Errorf("unable to collect checksums: %s", err)
+ }
+ file.parent.generatedFiles[file.relativePath+ext] = checksumInfo
+ }
+
+ err = file.parent.publishedStorage.MkDir(filepath.Dir(filepath.Join(file.parent.basePath, file.relativePath)))
+ if err != nil {
+ return fmt.Errorf("unable to create dir: %s", err)
+ }
+
+ for _, ext := range exts {
+ err = file.parent.publishedStorage.PutFile(filepath.Join(file.parent.basePath, file.relativePath+file.parent.suffix+ext),
+ file.tempFilename+ext)
+ if err != nil {
+ return fmt.Errorf("unable to publish file: %s", err)
+ }
+
+ if file.parent.suffix != "" {
+ file.parent.renameMap[filepath.Join(file.parent.basePath, file.relativePath+file.parent.suffix+ext)] =
+ filepath.Join(file.parent.basePath, file.relativePath+ext)
+ }
+ }
+
+ if file.signable && signer != nil {
+ err = signer.DetachedSign(file.tempFilename, file.tempFilename+".gpg")
+ if err != nil {
+ return fmt.Errorf("unable to detached sign file: %s", err)
+ }
+
+ err = signer.ClearSign(file.tempFilename, filepath.Join(filepath.Dir(file.tempFilename), "In"+filepath.Base(file.tempFilename)))
+ if err != nil {
+ return fmt.Errorf("unable to clearsign file: %s", err)
+ }
+
+ if file.parent.suffix != "" {
+ file.parent.renameMap[filepath.Join(file.parent.basePath, file.relativePath+file.parent.suffix+".gpg")] =
+ filepath.Join(file.parent.basePath, file.relativePath+".gpg")
+ file.parent.renameMap[filepath.Join(file.parent.basePath, "In"+file.relativePath+file.parent.suffix)] =
+ filepath.Join(file.parent.basePath, "In"+file.relativePath)
+ }
+
+ err = file.parent.publishedStorage.PutFile(filepath.Join(file.parent.basePath, file.relativePath+file.parent.suffix+".gpg"),
+ file.tempFilename+".gpg")
+ if err != nil {
+ return fmt.Errorf("unable to publish file: %s", err)
+ }
+
+ err = file.parent.publishedStorage.PutFile(filepath.Join(file.parent.basePath, "In"+file.relativePath+file.parent.suffix),
+ filepath.Join(filepath.Dir(file.tempFilename), "In"+filepath.Base(file.tempFilename)))
+ if err != nil {
+ return fmt.Errorf("unable to publish file: %s", err)
+ }
+ }
+
+ return nil
+}
+
+func newIndexFiles(publishedStorage aptly.PublishedStorage, basePath, tempDir, suffix string) *indexFiles {
+ return &indexFiles{
+ publishedStorage: publishedStorage,
+ basePath: basePath,
+ renameMap: make(map[string]string),
+ generatedFiles: make(map[string]utils.ChecksumInfo),
+ tempDir: tempDir,
+ suffix: suffix,
+ indexes: make(map[string]*indexFile),
+ }
+}
+
+func (files *indexFiles) PackageIndex(component, arch string, udeb bool) *indexFile {
+ key := fmt.Sprintf("pi-%s-%s-%s", component, arch, udeb)
+ file, ok := files.indexes[key]
+ if !ok {
+ var relativePath string
+
+ if arch == "source" {
+ relativePath = filepath.Join(component, "source", "Sources")
+ } else {
+ if udeb {
+ relativePath = filepath.Join(component, "debian-installer", fmt.Sprintf("binary-%s", arch), "Packages")
+ } else {
+ relativePath = filepath.Join(component, fmt.Sprintf("binary-%s", arch), "Packages")
+ }
+ }
+
+ file = &indexFile{
+ parent: files,
+ discardable: false,
+ compressable: true,
+ signable: false,
+ relativePath: relativePath,
+ }
+
+ files.indexes[key] = file
+ }
+
+ return file
+}
+
+func (files *indexFiles) ReleaseIndex(component, arch string, udeb bool) *indexFile {
+ key := fmt.Sprintf("ri-%s-%s-%s", component, arch, udeb)
+ file, ok := files.indexes[key]
+ if !ok {
+ var relativePath string
+
+ if arch == "source" {
+ relativePath = filepath.Join(component, "source", "Release")
+ } else {
+ if udeb {
+ relativePath = filepath.Join(component, "debian-installer", fmt.Sprintf("binary-%s", arch), "Release")
+ } else {
+ relativePath = filepath.Join(component, fmt.Sprintf("binary-%s", arch), "Release")
+ }
+ }
+
+ file = &indexFile{
+ parent: files,
+ discardable: udeb,
+ compressable: false,
+ signable: false,
+ relativePath: relativePath,
+ }
+
+ files.indexes[key] = file
+ }
+
+ return file
+}
+
+func (files *indexFiles) ReleaseFile() *indexFile {
+ return &indexFile{
+ parent: files,
+ discardable: false,
+ compressable: false,
+ signable: true,
+ relativePath: "Release",
+ }
+}
+
+func (files *indexFiles) FinalizeAll(progress aptly.Progress) (err error) {
+ if progress != nil {
+ progress.InitBar(int64(len(files.indexes)), false)
+ defer progress.ShutdownBar()
+ }
+
+ for _, file := range files.indexes {
+ err = file.Finalize(nil)
+ if err != nil {
+ return
+ }
+ if progress != nil {
+ progress.AddBar(1)
+ }
+ }
+
+ files.indexes = make(map[string]*indexFile)
+
+ return
+}
+
+func (files *indexFiles) RenameFiles() error {
+ var err error
+
+ for oldName, newName := range files.renameMap {
+ err = files.publishedStorage.RenameFile(oldName, newName)
+ if err != nil {
+ return fmt.Errorf("unable to rename: %s", err)
+ }
+ }
+
+ return nil
+}
diff --git a/src/github.com/smira/aptly/deb/list.go b/src/github.com/smira/aptly/deb/list.go
index 8825b768..3e78234b 100644
--- a/src/github.com/smira/aptly/deb/list.go
+++ b/src/github.com/smira/aptly/deb/list.go
@@ -41,6 +41,7 @@ type PackageList struct {
// Verify interface
var (
_ sort.Interface = &PackageList{}
+ _ PackageCatalog = &PackageList{}
)
// NewPackageList creates empty package list
@@ -235,6 +236,7 @@ func depSliceDeduplicate(s []Dependency) []Dependency {
//
// Analysis would be peformed for each architecture, in specified sources
func (l *PackageList) VerifyDependencies(options int, architectures []string, sources *PackageList, progress aptly.Progress) ([]Dependency, error) {
+ l.PrepareIndex()
missing := make([]Dependency, 0, 128)
if progress != nil {
@@ -244,7 +246,7 @@ func (l *PackageList) VerifyDependencies(options int, architectures []string, so
for _, arch := range architectures {
cache := make(map[string]bool, 2048)
- for _, p := range l.packages {
+ for _, p := range l.packagesIndex {
if progress != nil {
progress.AddBar(1)
}
@@ -262,7 +264,6 @@ func (l *PackageList) VerifyDependencies(options int, architectures []string, so
variants = depSliceDeduplicate(variants)
variantsMissing := make([]Dependency, 0, len(variants))
- missingCount := 0
for _, dep := range variants {
if dep.Architecture == "" {
@@ -270,35 +271,23 @@ func (l *PackageList) VerifyDependencies(options int, architectures []string, so
}
hash := dep.Hash()
- r, ok := cache[hash]
- if ok {
- if !r {
- missingCount++
- }
- continue
+ satisfied, ok := cache[hash]
+ if !ok {
+ satisfied = sources.Search(dep, false) != nil
+ cache[hash] = satisfied
}
- if sources.Search(dep, false) == nil {
+ if !satisfied && !ok {
variantsMissing = append(variantsMissing, dep)
- missingCount++
- } else {
- cache[hash] = true
+ }
+
+ if satisfied && options&DepFollowAllVariants == 0 {
+ variantsMissing = nil
+ break
}
}
- if options&DepFollowAllVariants == DepFollowAllVariants {
- missing = append(missing, variantsMissing...)
- for _, dep := range variantsMissing {
- cache[dep.Hash()] = false
- }
- } else {
- if missingCount == len(variants) {
- missing = append(missing, variantsMissing...)
- for _, dep := range variantsMissing {
- cache[dep.Hash()] = false
- }
- }
- }
+ missing = append(missing, variantsMissing...)
}
}
}
@@ -334,6 +323,10 @@ func (l *PackageList) Less(i, j int) bool {
// PrepareIndex prepares list for indexing
func (l *PackageList) PrepareIndex() {
+ if l.indexed {
+ return
+ }
+
l.packagesIndex = make([]*Package, l.Len())
l.providesIndex = make(map[string][]*Package, 128)
@@ -364,6 +357,23 @@ func (l *PackageList) Scan(q PackageQuery) (result *PackageList) {
return
}
+// SearchSupported returns true for PackageList
+func (l *PackageList) SearchSupported() bool {
+ return true
+}
+
+// SearchByKey looks up package by exact key reference
+func (l *PackageList) SearchByKey(arch, name, version string) (result *PackageList) {
+ result = NewPackageList()
+
+ pkg := l.packages["P"+arch+" "+name+" "+version]
+ if pkg != nil {
+ result.Add(pkg)
+ }
+
+ return
+}
+
// Search searches package index for specified package(s) using optimized queries
func (l *PackageList) Search(dep Dependency, allMatches bool) (searchResults []*Package) {
if !l.indexed {
@@ -414,6 +424,7 @@ func (l *PackageList) Filter(queries []PackageQuery, withDependencies bool, sour
if withDependencies {
added := result.Len()
+ result.PrepareIndex()
dependencySource := NewPackageList()
if source != nil {
@@ -434,12 +445,21 @@ func (l *PackageList) Filter(queries []PackageQuery, withDependencies bool, sour
// try to satisfy dependencies
for _, dep := range missing {
+ // dependency might have already been satisfied
+ // with packages already been added
+ if result.Search(dep, false) != nil {
+ continue
+ }
+
searchResults := l.Search(dep, false)
if searchResults != nil {
for _, p := range searchResults {
result.Add(p)
dependencySource.Add(p)
added++
+ if dependencyOptions&DepFollowAllVariants == 0 {
+ break
+ }
}
}
}
diff --git a/src/github.com/smira/aptly/deb/package.go b/src/github.com/smira/aptly/deb/package.go
index 976b8a2e..be734ed5 100644
--- a/src/github.com/smira/aptly/deb/package.go
+++ b/src/github.com/smira/aptly/deb/package.go
@@ -24,6 +24,8 @@ type Package struct {
Provides []string
// Is this source package
IsSource bool
+ // Is this udeb package
+ IsUdeb bool
// Hash of files section
FilesHash uint64
// Is this >= 0.6 package?
@@ -169,6 +171,14 @@ func NewSourcePackageFromControlFile(input Stanza) (*Package, error) {
return result, nil
}
+// NewUdebPackageFromControlFile creates .udeb Package from parsed Debian control file
+func NewUdebPackageFromControlFile(input Stanza) *Package {
+ p := NewPackageFromControlFile(input)
+ p.IsUdeb = true
+
+ return p
+}
+
// Key returns unique key identifying package
func (p *Package) Key(prefix string) []byte {
if p.V06Plus {
@@ -220,6 +230,9 @@ func (p *Package) GetField(name string) string {
if p.IsSource {
return "source"
}
+ if p.IsUdeb {
+ return "udeb"
+ }
return "deb"
case "Name":
return p.Name
diff --git a/src/github.com/smira/aptly/deb/package_collection.go b/src/github.com/smira/aptly/deb/package_collection.go
index 54887279..10050788 100644
--- a/src/github.com/smira/aptly/deb/package_collection.go
+++ b/src/github.com/smira/aptly/deb/package_collection.go
@@ -15,6 +15,11 @@ type PackageCollection struct {
codecHandle *codec.MsgpackHandle
}
+// Verify interface
+var (
+ _ PackageCatalog = &PackageCollection{}
+)
+
// NewPackageCollection creates new PackageCollection and binds it to database
func NewPackageCollection(db database.Storage) *PackageCollection {
return &PackageCollection{
@@ -237,3 +242,49 @@ func (collection *PackageCollection) DeleteByKey(key []byte) error {
}
return nil
}
+
+// Scan does full scan on all the packages
+func (collection *PackageCollection) Scan(q PackageQuery) (result *PackageList) {
+ result = NewPackageList()
+
+ for _, key := range collection.db.KeysByPrefix([]byte("P")) {
+ pkg, err := collection.ByKey(key)
+ if err != nil {
+ panic(fmt.Sprintf("unable to load package: %s", err))
+ }
+
+ if q.Matches(pkg) {
+ result.Add(pkg)
+ }
+ }
+
+ return
+}
+
+// Search is not implemented
+func (collection *PackageCollection) Search(dep Dependency, allMatches bool) (searchResults []*Package) {
+ panic("Not implemented")
+}
+
+// SearchSupported returns false
+func (collection *PackageCollection) SearchSupported() bool {
+ return false
+}
+
+// SearchByKey finds package by exact key
+func (collection *PackageCollection) SearchByKey(arch, name, version string) (result *PackageList) {
+ result = NewPackageList()
+
+ for _, key := range collection.db.KeysByPrefix([]byte(fmt.Sprintf("P%s %s %s", arch, name, version))) {
+ pkg, err := collection.ByKey(key)
+ if err != nil {
+ panic(fmt.Sprintf("unable to load package: %s", err))
+ }
+
+ if pkg.Architecture == arch && pkg.Name == name && pkg.Version == version {
+ result.Add(pkg)
+ }
+ }
+
+ return
+}
diff --git a/src/github.com/smira/aptly/deb/package_test.go b/src/github.com/smira/aptly/deb/package_test.go
index efab20db..ddcf754e 100644
--- a/src/github.com/smira/aptly/deb/package_test.go
+++ b/src/github.com/smira/aptly/deb/package_test.go
@@ -28,6 +28,7 @@ func (s *PackageSuite) TestNewFromPara(c *C) {
p := NewPackageFromControlFile(s.stanza)
c.Check(p.IsSource, Equals, false)
+ c.Check(p.IsUdeb, Equals, false)
c.Check(p.Name, Equals, "alien-arena-common")
c.Check(p.Version, Equals, "7.40-2")
c.Check(p.Architecture, Equals, "i386")
@@ -40,11 +41,27 @@ func (s *PackageSuite) TestNewFromPara(c *C) {
c.Check(p.deps.Depends, DeepEquals, []string{"libc6 (>= 2.7)", "alien-arena-data (>= 7.40)"})
}
+func (s *PackageSuite) TestNewUdebFromPara(c *C) {
+ stanza, _ := NewControlFileReader(bytes.NewBufferString(udebPackageMeta)).ReadStanza()
+ p := NewUdebPackageFromControlFile(stanza)
+
+ c.Check(p.IsSource, Equals, false)
+ c.Check(p.IsUdeb, Equals, true)
+ c.Check(p.Name, Equals, "dmidecode-udeb")
+ c.Check(p.Version, Equals, "2.11-9")
+ c.Check(p.Architecture, Equals, "amd64")
+ c.Check(p.Provides, DeepEquals, []string(nil))
+ c.Check(p.Files(), HasLen, 1)
+ c.Check(p.Files()[0].Filename, Equals, "dmidecode-udeb_2.11-9_amd64.udeb")
+ c.Check(p.deps.Depends, DeepEquals, []string{"libc6-udeb (>= 2.13)"})
+}
+
func (s *PackageSuite) TestNewSourceFromPara(c *C) {
p, err := NewSourcePackageFromControlFile(s.sourceStanza)
c.Check(err, IsNil)
c.Check(p.IsSource, Equals, true)
+ c.Check(p.IsUdeb, Equals, false)
c.Check(p.Name, Equals, "access-modifier-checker")
c.Check(p.Version, Equals, "1.0-4")
c.Check(p.Architecture, Equals, "source")
@@ -134,21 +151,28 @@ func (s *PackageSuite) TestGetField(c *C) {
p4, _ := NewSourcePackageFromControlFile(s.sourceStanza.Copy())
+ stanza5, _ := NewControlFileReader(bytes.NewBufferString(udebPackageMeta)).ReadStanza()
+ p5 := NewUdebPackageFromControlFile(stanza5)
+
c.Check(p.GetField("$Source"), Equals, "alien-arena")
c.Check(p2.GetField("$Source"), Equals, "alien-arena-common")
c.Check(p3.GetField("$Source"), Equals, "alien-arena")
c.Check(p4.GetField("$Source"), Equals, "")
+ c.Check(p5.GetField("$Source"), Equals, "dmidecode")
c.Check(p.GetField("$SourceVersion"), Equals, "7.40-2")
c.Check(p2.GetField("$SourceVersion"), Equals, "7.40-2")
c.Check(p3.GetField("$SourceVersion"), Equals, "3.5")
c.Check(p4.GetField("$SourceVersion"), Equals, "")
+ c.Check(p5.GetField("$SourceVersion"), Equals, "2.11-9")
c.Check(p.GetField("$Architecture"), Equals, "i386")
c.Check(p4.GetField("$Architecture"), Equals, "source")
+ c.Check(p5.GetField("$Architecture"), Equals, "amd64")
c.Check(p.GetField("$PackageType"), Equals, "deb")
c.Check(p4.GetField("$PackageType"), Equals, "source")
+ c.Check(p5.GetField("$PackageType"), Equals, "udeb")
c.Check(p.GetField("Name"), Equals, "alien-arena-common")
c.Check(p4.GetField("Name"), Equals, "access-modifier-checker")
@@ -455,3 +479,20 @@ Directory: pool/main/a/access-modifier-checker
Priority: source
Section: java
`
+
+const udebPackageMeta = `Package: dmidecode-udeb
+Source: dmidecode
+Version: 2.11-9
+Installed-Size: 115
+Maintainer: Daniel Baumann
+Architecture: amd64
+Depends: libc6-udeb (>= 2.13)
+Description: SMBIOS/DMI table decoder (udeb)
+Description-md5: bdfb786c6a57097be8c8600b800e749f
+Section: debian-installer
+Priority: optional
+Filename: pool/main/d/dmidecode/dmidecode-udeb_2.11-9_amd64.udeb
+Size: 29188
+MD5sum: ae70341c4d96dcded89fa670bcfea31e
+SHA1: 9532ae4226a85805189a671ee0283f719d48a5ba
+SHA256: bbb3a2cb07f741c3995b6d4bb08d772d83582b93a0236d4ea7736bc0370fc320`
diff --git a/src/github.com/smira/aptly/deb/publish.go b/src/github.com/smira/aptly/deb/publish.go
index efb9969a..7e1c5f9f 100644
--- a/src/github.com/smira/aptly/deb/publish.go
+++ b/src/github.com/smira/aptly/deb/publish.go
@@ -1,7 +1,6 @@
package deb
import (
- "bufio"
"bytes"
"code.google.com/p/go-uuid/uuid"
"fmt"
@@ -169,6 +168,9 @@ func NewPublishedRepo(storage, prefix, distribution string, architectures []stri
if distribution == "" || component == "" {
rootDistributions, rootComponents := walkUpTree(source, collectionFactory)
if distribution == "" {
+ for i := range rootDistributions {
+ rootDistributions[i] = strings.Replace(rootDistributions[i], "/", "-", -1)
+ }
discoveredDistributions = append(discoveredDistributions, rootDistributions...)
}
if component == "" {
@@ -228,6 +230,10 @@ func NewPublishedRepo(storage, prefix, distribution string, architectures []stri
}
}
+ if strings.Index(distribution, "/") != -1 {
+ return nil, fmt.Errorf("invalid distribution %s, '/' is not allowed", distribution)
+ }
+
result.Distribution = distribution
return result, nil
@@ -440,9 +446,6 @@ func (p *PublishedRepo) Publish(packagePool aptly.PackagePool, publishedStorageP
suffix = ".tmp"
}
- generatedFiles := map[string]utils.ChecksumInfo{}
- renameMap := map[string]string{}
-
if progress != nil {
progress.Printf("Generating metadata files and linking package files...\n")
}
@@ -454,41 +457,44 @@ func (p *PublishedRepo) Publish(packagePool aptly.PackagePool, publishedStorageP
}
defer os.RemoveAll(tempDir)
+ indexes := newIndexFiles(publishedStorage, basePath, tempDir, suffix)
+
for component, list := range lists {
- var relativePath string
+ hadUdebs := false
- // For all architectures, generate packages/sources files
+ // For all architectures, pregenerate packages/sources files
for _, arch := range p.Architectures {
+ indexes.PackageIndex(component, arch, false)
+ }
+
+ if progress != nil {
+ progress.InitBar(int64(list.Len()), false)
+ }
+
+ err = list.ForEach(func(pkg *Package) error {
if progress != nil {
- progress.InitBar(int64(list.Len()), false)
+ progress.AddBar(1)
}
- if arch == "source" {
- relativePath = filepath.Join(component, "source", "Sources")
- } else {
- relativePath = filepath.Join(component, fmt.Sprintf("binary-%s", arch), "Packages")
- }
- err = publishedStorage.MkDir(filepath.Dir(filepath.Join(basePath, relativePath)))
- if err != nil {
- return err
- }
-
- var packagesFile *os.File
-
- packagesFileName := filepath.Join(tempDir, fmt.Sprintf("pkgs_%s_%s", component, arch))
- packagesFile, err = os.Create(packagesFileName)
- if err != nil {
- return fmt.Errorf("unable to create temporary Packages file: %s", err)
- }
-
- bufWriter := bufio.NewWriter(packagesFile)
-
- err = list.ForEach(func(pkg *Package) error {
- if progress != nil {
- progress.AddBar(1)
- }
+ matches := false
+ for _, arch := range p.Architectures {
if pkg.MatchesArchitecture(arch) {
- err = pkg.LinkFromPool(publishedStorage, packagePool, p.Prefix, component, forceOverwrite)
+ matches = true
+ break
+ }
+ }
+
+ if matches {
+ hadUdebs = hadUdebs || pkg.IsUdeb
+ err = pkg.LinkFromPool(publishedStorage, packagePool, p.Prefix, component, forceOverwrite)
+ if err != nil {
+ return err
+ }
+ }
+
+ for _, arch := range p.Architectures {
+ if pkg.MatchesArchitecture(arch) {
+ bufWriter, err := indexes.PackageIndex(component, arch, pkg.IsUdeb).BufWriter()
if err != nil {
return err
}
@@ -501,113 +507,63 @@ func (p *PublishedRepo) Publish(packagePool aptly.PackagePool, publishedStorageP
if err != nil {
return err
}
-
- pkg.files = nil
- pkg.deps = nil
- pkg.extra = nil
-
- }
-
- return nil
- })
-
- if err != nil {
- return fmt.Errorf("unable to process packages: %s", err)
- }
-
- err = bufWriter.Flush()
- if err != nil {
- return fmt.Errorf("unable to write Packages file: %s", err)
- }
-
- err = utils.CompressFile(packagesFile)
- if err != nil {
- return fmt.Errorf("unable to compress Packages files: %s", err)
- }
-
- packagesFile.Close()
-
- for _, ext := range []string{"", ".gz", ".bz2"} {
- var checksumInfo utils.ChecksumInfo
-
- checksumInfo, err = utils.ChecksumsForFile(packagesFileName + ext)
- if err != nil {
- return fmt.Errorf("unable to collect checksums: %s", err)
- }
- generatedFiles[relativePath+ext] = checksumInfo
-
- err = publishedStorage.PutFile(filepath.Join(basePath, relativePath+suffix+ext), packagesFileName+ext)
- if err != nil {
- return fmt.Errorf("unable to publish file: %s", err)
- }
-
- if suffix != "" {
- renameMap[filepath.Join(basePath, relativePath+suffix+ext)] = filepath.Join(basePath, relativePath+ext)
}
}
- if progress != nil {
- progress.ShutdownBar()
+ pkg.files = nil
+ pkg.deps = nil
+ pkg.extra = nil
+
+ return nil
+ })
+
+ if err != nil {
+ return fmt.Errorf("unable to process packages: %s", err)
+ }
+
+ if progress != nil {
+ progress.ShutdownBar()
+ }
+
+ udebs := []bool{false}
+ if hadUdebs {
+ udebs = append(udebs, true)
+
+ // For all architectures, pregenerate .udeb indexes
+ for _, arch := range p.Architectures {
+ indexes.PackageIndex(component, arch, true)
}
}
// For all architectures, generate Release files
for _, arch := range p.Architectures {
- release := make(Stanza)
- release["Archive"] = p.Distribution
- release["Architecture"] = arch
- release["Component"] = component
- release["Origin"] = p.GetOrigin()
- release["Label"] = p.GetLabel()
+ for _, udeb := range udebs {
+ release := make(Stanza)
+ release["Archive"] = p.Distribution
+ release["Architecture"] = arch
+ release["Component"] = component
+ release["Origin"] = p.GetOrigin()
+ release["Label"] = p.GetLabel()
- if arch == "source" {
- relativePath = filepath.Join(component, "source", "Release")
- } else {
- relativePath = filepath.Join(component, fmt.Sprintf("binary-%s", arch), "Release")
+ bufWriter, err := indexes.ReleaseIndex(component, arch, udeb).BufWriter()
+
+ err = release.WriteTo(bufWriter)
+ if err != nil {
+ return fmt.Errorf("unable to create Release file: %s", err)
+ }
}
-
- var file *os.File
-
- fileName := filepath.Join(tempDir, fmt.Sprintf("release_%s_%s", component, arch))
- file, err = os.Create(fileName)
- if err != nil {
- return fmt.Errorf("unable to create temporary Release file: %s", err)
- }
-
- bufWriter := bufio.NewWriter(file)
-
- err = release.WriteTo(bufWriter)
- if err != nil {
- return fmt.Errorf("unable to create Release file: %s", err)
- }
-
- err = bufWriter.Flush()
- if err != nil {
- return fmt.Errorf("unable to create Release file: %s", err)
- }
-
- file.Close()
-
- var checksumInfo utils.ChecksumInfo
- checksumInfo, err = utils.ChecksumsForFile(fileName)
- if err != nil {
- return fmt.Errorf("unable to collect checksums: %s", err)
- }
- generatedFiles[relativePath] = checksumInfo
-
- err = publishedStorage.PutFile(filepath.Join(basePath, relativePath+suffix), fileName)
- if err != nil {
- file.Close()
- return fmt.Errorf("unable to publish file: %s", err)
- }
-
- if suffix != "" {
- renameMap[filepath.Join(basePath, relativePath+suffix)] = filepath.Join(basePath, relativePath)
- }
-
}
}
+ if progress != nil {
+ progress.Printf("Finalizing metadata files...\n")
+ }
+
+ err = indexes.FinalizeAll(progress)
+ if err != nil {
+ return err
+ }
+
release := make(Stanza)
release["Origin"] = p.GetOrigin()
release["Label"] = p.GetLabel()
@@ -621,80 +577,36 @@ func (p *PublishedRepo) Publish(packagePool aptly.PackagePool, publishedStorageP
release["Components"] = strings.Join(p.Components(), " ")
- for path, info := range generatedFiles {
+ for path, info := range indexes.generatedFiles {
release["MD5Sum"] += fmt.Sprintf(" %s %8d %s\n", info.MD5, info.Size, path)
release["SHA1"] += fmt.Sprintf(" %s %8d %s\n", info.SHA1, info.Size, path)
release["SHA256"] += fmt.Sprintf(" %s %8d %s\n", info.SHA256, info.Size, path)
}
- var releaseFile *os.File
- releaseFilename := filepath.Join(tempDir, "Release")
- releaseFile, err = os.Create(releaseFilename)
+ releaseFile := indexes.ReleaseFile()
+ bufWriter, err := releaseFile.BufWriter()
if err != nil {
- return fmt.Errorf("unable to create temporary Release file: %s", err)
+ return err
}
- bufWriter := bufio.NewWriter(releaseFile)
-
err = release.WriteTo(bufWriter)
if err != nil {
return fmt.Errorf("unable to create Release file: %s", err)
}
- err = bufWriter.Flush()
- if err != nil {
- return fmt.Errorf("unable to create Release file: %s", err)
- }
-
- releaseFile.Close()
-
- if suffix != "" {
- renameMap[filepath.Join(basePath, "Release"+suffix)] = filepath.Join(basePath, "Release")
- }
-
- err = publishedStorage.PutFile(filepath.Join(basePath, "Release"+suffix), releaseFilename)
- if err != nil {
- return fmt.Errorf("unable to publish file: %s", err)
- }
-
// Signing files might output to console, so flush progress writer first
if progress != nil {
progress.Flush()
}
- if signer != nil {
- err = signer.DetachedSign(releaseFilename, releaseFilename+".gpg")
- if err != nil {
- return fmt.Errorf("unable to sign Release file: %s", err)
- }
-
- err = signer.ClearSign(releaseFilename, filepath.Join(filepath.Dir(releaseFilename), "InRelease"+suffix))
- if err != nil {
- return fmt.Errorf("unable to sign Release file: %s", err)
- }
-
- if suffix != "" {
- renameMap[filepath.Join(basePath, "Release"+suffix+".gpg")] = filepath.Join(basePath, "Release.gpg")
- renameMap[filepath.Join(basePath, "InRelease"+suffix)] = filepath.Join(basePath, "InRelease")
- }
-
- err = publishedStorage.PutFile(filepath.Join(basePath, "Release"+suffix+".gpg"), releaseFilename+".gpg")
- if err != nil {
- return fmt.Errorf("unable to publish file: %s", err)
- }
-
- err = publishedStorage.PutFile(filepath.Join(basePath, "InRelease"+suffix),
- filepath.Join(filepath.Dir(releaseFilename), "InRelease"+suffix))
- if err != nil {
- return fmt.Errorf("unable to publish file: %s", err)
- }
+ err = releaseFile.Finalize(signer)
+ if err != nil {
+ return err
}
- for oldName, newName := range renameMap {
- err = publishedStorage.RenameFile(oldName, newName)
- if err != nil {
- return fmt.Errorf("unable to rename: %s", err)
- }
+ err = indexes.RenameFiles()
+ if err != nil {
+ return err
}
return nil
diff --git a/src/github.com/smira/aptly/deb/publish_test.go b/src/github.com/smira/aptly/deb/publish_test.go
index f8a66672..60e3a226 100644
--- a/src/github.com/smira/aptly/deb/publish_test.go
+++ b/src/github.com/smira/aptly/deb/publish_test.go
@@ -39,6 +39,9 @@ func (n *NullSigner) SetKey(keyRef string) {
func (n *NullSigner) SetKeyRing(keyring, secretKeyring string) {
}
+func (n *NullSigner) SetPassphrase(passphrase, passphraseFile string) {
+}
+
func (n *NullSigner) DetachedSign(source string, destination string) error {
return ioutil.WriteFile(destination, []byte{}, 0644)
}
@@ -90,7 +93,7 @@ func (s *PublishedRepoSuite) SetUpTest(c *C) {
"files:other": s.publishedStorage2}}
s.packagePool = files.NewPackagePool(s.root)
- repo, _ := NewRemoteRepo("yandex", "http://mirror.yandex.ru/debian/", "squeeze", []string{"main"}, []string{}, false)
+ repo, _ := NewRemoteRepo("yandex", "http://mirror.yandex.ru/debian/", "squeeze", []string{"main"}, []string{}, false, false)
repo.packageRefs = s.reflist
s.factory.RemoteRepoCollection().Add(repo)
@@ -164,6 +167,9 @@ func (s *PublishedRepoSuite) TestNewPublishedRepo(c *C) {
_, err := NewPublishedRepo("", ".", "a", nil, []string{"main", "main"}, []interface{}{s.snapshot, s.snapshot2}, s.factory)
c.Check(err, ErrorMatches, "duplicate component name: main")
+
+ _, err = NewPublishedRepo("", ".", "wheezy/updates", nil, []string{"main"}, []interface{}{s.snapshot}, s.factory)
+ c.Check(err, ErrorMatches, "invalid distribution wheezy/updates, '/' is not allowed")
}
func (s *PublishedRepoSuite) TestPrefixNormalization(c *C) {
@@ -264,6 +270,13 @@ func (s *PublishedRepoSuite) TestDistributionComponentGuessing(c *C) {
c.Check(repo.Distribution, Equals, "precise")
c.Check(repo.Components(), DeepEquals, []string{"contrib"})
+ s.localRepo.DefaultDistribution = "precise/updates"
+
+ repo, err = NewPublishedRepo("", "ppa", "", nil, []string{""}, []interface{}{s.localRepo}, s.factory)
+ c.Check(err, IsNil)
+ c.Check(repo.Distribution, Equals, "precise-updates")
+ c.Check(repo.Components(), DeepEquals, []string{"contrib"})
+
repo, err = NewPublishedRepo("", "ppa", "", nil, []string{"", "contrib"}, []interface{}{s.snapshot, s.snapshot2}, s.factory)
c.Check(err, IsNil)
c.Check(repo.Distribution, Equals, "squeeze")
diff --git a/src/github.com/smira/aptly/deb/query.go b/src/github.com/smira/aptly/deb/query.go
index 6f279fe5..4dac528c 100644
--- a/src/github.com/smira/aptly/deb/query.go
+++ b/src/github.com/smira/aptly/deb/query.go
@@ -7,14 +7,22 @@ import (
"strings"
)
+// PackageCatalog is abstraction on top of PackageCollection and PackageList
+type PackageCatalog interface {
+ Scan(q PackageQuery) (result *PackageList)
+ Search(dep Dependency, allMatches bool) (searchResults []*Package)
+ SearchSupported() bool
+ SearchByKey(arch, name, version string) (result *PackageList)
+}
+
// PackageQuery is interface of predicate on Package
type PackageQuery interface {
// Matches calculates match of condition against package
Matches(pkg *Package) bool
// Fast returns if search strategy is possible for this query
- Fast() bool
+ Fast(list PackageCatalog) bool
// Query performs search on package list
- Query(list *PackageList) *PackageList
+ Query(list PackageCatalog) *PackageList
// String interface
String() string
}
@@ -60,13 +68,13 @@ func (q *OrQuery) Matches(pkg *Package) bool {
}
// Fast is true only if both parts are fast
-func (q *OrQuery) Fast() bool {
- return q.L.Fast() && q.R.Fast()
+func (q *OrQuery) Fast(list PackageCatalog) bool {
+ return q.L.Fast(list) && q.R.Fast(list)
}
// Query strategy depends on nodes
-func (q *OrQuery) Query(list *PackageList) (result *PackageList) {
- if q.Fast() {
+func (q *OrQuery) Query(list PackageCatalog) (result *PackageList) {
+ if q.Fast(list) {
result = q.L.Query(list)
result.Append(q.R.Query(list))
} else {
@@ -86,16 +94,16 @@ func (q *AndQuery) Matches(pkg *Package) bool {
}
// Fast is true if any of the parts are fast
-func (q *AndQuery) Fast() bool {
- return q.L.Fast() || q.R.Fast()
+func (q *AndQuery) Fast(list PackageCatalog) bool {
+ return q.L.Fast(list) || q.R.Fast(list)
}
// Query strategy depends on nodes
-func (q *AndQuery) Query(list *PackageList) (result *PackageList) {
- if !q.Fast() {
+func (q *AndQuery) Query(list PackageCatalog) (result *PackageList) {
+ if !q.Fast(list) {
result = list.Scan(q)
} else {
- if q.L.Fast() {
+ if q.L.Fast(list) {
result = q.L.Query(list)
result = result.Scan(q.R)
} else {
@@ -117,12 +125,12 @@ func (q *NotQuery) Matches(pkg *Package) bool {
}
// Fast is false
-func (q *NotQuery) Fast() bool {
+func (q *NotQuery) Fast(list PackageCatalog) bool {
return false
}
// Query strategy is scan always
-func (q *NotQuery) Query(list *PackageList) (result *PackageList) {
+func (q *NotQuery) Query(list PackageCatalog) (result *PackageList) {
result = list.Scan(q)
return
}
@@ -170,13 +178,13 @@ func (q *FieldQuery) Matches(pkg *Package) bool {
}
// Query runs iteration through list
-func (q *FieldQuery) Query(list *PackageList) (result *PackageList) {
+func (q *FieldQuery) Query(list PackageCatalog) (result *PackageList) {
result = list.Scan(q)
return
}
// Fast depends on the query
-func (q *FieldQuery) Fast() bool {
+func (q *FieldQuery) Fast(list PackageCatalog) bool {
return false
}
@@ -215,15 +223,19 @@ func (q *DependencyQuery) Matches(pkg *Package) bool {
}
// Fast is always true for dependency query
-func (q *DependencyQuery) Fast() bool {
- return true
+func (q *DependencyQuery) Fast(list PackageCatalog) bool {
+ return list.SearchSupported()
}
// Query runs PackageList.Search
-func (q *DependencyQuery) Query(list *PackageList) (result *PackageList) {
- result = NewPackageList()
- for _, pkg := range list.Search(q.Dep, true) {
- result.Add(pkg)
+func (q *DependencyQuery) Query(list PackageCatalog) (result *PackageList) {
+ if q.Fast(list) {
+ result = NewPackageList()
+ for _, pkg := range list.Search(q.Dep, true) {
+ result.Add(pkg)
+ }
+ } else {
+ result = list.Scan(q)
}
return
@@ -240,20 +252,13 @@ func (q *PkgQuery) Matches(pkg *Package) bool {
}
// Fast is always true for package query
-func (q *PkgQuery) Fast() bool {
+func (q *PkgQuery) Fast(list PackageCatalog) bool {
return true
}
// Query looks up specific package
-func (q *PkgQuery) Query(list *PackageList) (result *PackageList) {
- result = NewPackageList()
-
- pkg := list.packages["P"+q.Arch+" "+q.Pkg+" "+q.Version]
- if pkg != nil {
- result.Add(pkg)
- }
-
- return
+func (q *PkgQuery) Query(list PackageCatalog) (result *PackageList) {
+ return list.SearchByKey(q.Arch, q.Pkg, q.Version)
}
// String interface
diff --git a/src/github.com/smira/aptly/deb/reflist.go b/src/github.com/smira/aptly/deb/reflist.go
index 008316ea..7da58773 100644
--- a/src/github.com/smira/aptly/deb/reflist.go
+++ b/src/github.com/smira/aptly/deb/reflist.go
@@ -84,6 +84,14 @@ func (l *PackageRefList) ForEach(handler func([]byte) error) error {
return err
}
+// Has checks whether package is part of reflist
+func (l *PackageRefList) Has(p *Package) bool {
+ key := p.Key("")
+
+ i := sort.Search(len(l.Refs), func(j int) bool { return bytes.Compare(l.Refs[j], key) >= 0 })
+ return i < len(l.Refs) && bytes.Compare(l.Refs[i], key) == 0
+}
+
// Substract returns all packages in l that are not in r
func (l *PackageRefList) Substract(r *PackageRefList) *PackageRefList {
result := &PackageRefList{Refs: make([][]byte, 0, 128)}
diff --git a/src/github.com/smira/aptly/deb/reflist_test.go b/src/github.com/smira/aptly/deb/reflist_test.go
index 4a0dabb9..c1fdb4ec 100644
--- a/src/github.com/smira/aptly/deb/reflist_test.go
+++ b/src/github.com/smira/aptly/deb/reflist_test.go
@@ -128,6 +128,19 @@ func (s *PackageRefListSuite) TestPackageRefListForeach(c *C) {
c.Check(err, Equals, e)
}
+func (s *PackageRefListSuite) TestHas(c *C) {
+ s.list.Add(s.p1)
+ s.list.Add(s.p3)
+ s.list.Add(s.p5)
+ reflist := NewPackageRefListFromPackageList(s.list)
+
+ c.Check(reflist.Has(s.p1), Equals, true)
+ c.Check(reflist.Has(s.p3), Equals, true)
+ c.Check(reflist.Has(s.p5), Equals, true)
+ c.Check(reflist.Has(s.p2), Equals, true)
+ c.Check(reflist.Has(s.p6), Equals, false)
+}
+
func (s *PackageRefListSuite) TestSubstract(c *C) {
r1 := []byte("r1")
r2 := []byte("r2")
diff --git a/src/github.com/smira/aptly/deb/remote.go b/src/github.com/smira/aptly/deb/remote.go
index 1d439d44..c109a535 100644
--- a/src/github.com/smira/aptly/deb/remote.go
+++ b/src/github.com/smira/aptly/deb/remote.go
@@ -16,9 +16,16 @@ import (
"path/filepath"
"strconv"
"strings"
+ "syscall"
"time"
)
+// RemoteRepo statuses
+const (
+ MirrorIdle = iota
+ MirrorUpdating
+)
+
// RemoteRepo represents remote (fetchable) Debian repository.
//
// Repostitory could be filtered when fetching by components, architectures
@@ -37,6 +44,8 @@ type RemoteRepo struct {
Architectures []string
// Should we download sources?
DownloadSources bool
+ // Should we download .udebs?
+ DownloadUdebs bool
// Meta-information about repository
Meta Stanza
// Last update date
@@ -47,15 +56,23 @@ type RemoteRepo struct {
Filter string
// FilterWithDeps to include dependencies from filter query
FilterWithDeps bool
+ // Status marks state of repository (being updated, no action)
+ Status int
+ // WorkerPID is PID of the process modifying the mirror (if any)
+ WorkerPID int
// "Snapshot" of current list of packages
packageRefs *PackageRefList
+ // Temporary list of package refs
+ tempPackageRefs *PackageRefList
// Parsed archived root
archiveRootURL *url.URL
+ // Current list of packages (filled while updating mirror)
+ packageList *PackageList
}
// NewRemoteRepo creates new instance of Debian remote repository with specified params
func NewRemoteRepo(name string, archiveRoot string, distribution string, components []string,
- architectures []string, downloadSources bool) (*RemoteRepo, error) {
+ architectures []string, downloadSources bool, downloadUdebs bool) (*RemoteRepo, error) {
result := &RemoteRepo{
UUID: uuid.New(),
Name: name,
@@ -64,6 +81,7 @@ func NewRemoteRepo(name string, archiveRoot string, distribution string, compone
Components: components,
Architectures: architectures,
DownloadSources: downloadSources,
+ DownloadUdebs: downloadUdebs,
}
err := result.prepare()
@@ -80,6 +98,9 @@ func NewRemoteRepo(name string, archiveRoot string, distribution string, compone
if len(result.Components) > 0 {
return nil, fmt.Errorf("components aren't supported for flat repos")
}
+ if result.DownloadUdebs {
+ return nil, fmt.Errorf("debian-installer udebs aren't supported for flat repos")
+ }
result.Components = nil
}
@@ -102,7 +123,10 @@ func (repo *RemoteRepo) prepare() error {
func (repo *RemoteRepo) String() string {
srcFlag := ""
if repo.DownloadSources {
- srcFlag = " [src]"
+ srcFlag += " [src]"
+ }
+ if repo.DownloadUdebs {
+ srcFlag += " [udeb]"
}
distribution := repo.Distribution
if distribution == "" {
@@ -131,6 +155,37 @@ func (repo *RemoteRepo) RefList() *PackageRefList {
return repo.packageRefs
}
+// MarkAsUpdating puts current PID and sets status to updating
+func (repo *RemoteRepo) MarkAsUpdating() {
+ repo.Status = MirrorUpdating
+ repo.WorkerPID = os.Getpid()
+}
+
+// MarkAsIdle clears updating flag
+func (repo *RemoteRepo) MarkAsIdle() {
+ repo.Status = MirrorIdle
+ repo.WorkerPID = 0
+}
+
+// CheckLock returns error if mirror is being updated by another process
+func (repo *RemoteRepo) CheckLock() error {
+ if repo.Status == MirrorIdle || repo.WorkerPID == 0 {
+ return nil
+ }
+
+ p, err := os.FindProcess(repo.WorkerPID)
+ if err != nil {
+ return nil
+ }
+
+ err = p.Signal(syscall.Signal(0))
+ if err == nil {
+ return fmt.Errorf("mirror is locked by update operation, PID %d", repo.WorkerPID)
+ }
+
+ return nil
+}
+
// ReleaseURL returns URL to Release* files in repo root
func (repo *RemoteRepo) ReleaseURL(name string) *url.URL {
var path *url.URL
@@ -169,6 +224,13 @@ func (repo *RemoteRepo) SourcesURL(component string) *url.URL {
return repo.archiveRootURL.ResolveReference(path)
}
+// UdebURL returns URL of Packages files for given component and
+// architecture
+func (repo *RemoteRepo) UdebURL(component string, architecture string) *url.URL {
+ path := &url.URL{Path: fmt.Sprintf("dists/%s/%s/debian-installer/binary-%s/Packages", repo.Distribution, component, architecture)}
+ return repo.archiveRootURL.ResolveReference(path)
+}
+
// PackageURL returns URL of package file relative to repository root
// architecture
func (repo *RemoteRepo) PackageURL(filename string) *url.URL {
@@ -323,12 +385,13 @@ ok:
return nil
}
-// Download downloads all repo files
-func (repo *RemoteRepo) Download(progress aptly.Progress, d aptly.Downloader, collectionFactory *CollectionFactory,
- packagePool aptly.PackagePool, ignoreMismatch bool, dependencyOptions int, filterQuery PackageQuery) error {
- list := NewPackageList()
-
- progress.Printf("Downloading & parsing package files...\n")
+// DownloadPackageIndexes downloads & parses package index files
+func (repo *RemoteRepo) DownloadPackageIndexes(progress aptly.Progress, d aptly.Downloader, collectionFactory *CollectionFactory,
+ ignoreMismatch bool) error {
+ if repo.packageList != nil {
+ panic("packageList != nil")
+ }
+ repo.packageList = NewPackageList()
// Download and parse all Packages & Source files
packagesURLs := [][]string{}
@@ -342,6 +405,9 @@ func (repo *RemoteRepo) Download(progress aptly.Progress, d aptly.Downloader, co
for _, component := range repo.Components {
for _, architecture := range repo.Architectures {
packagesURLs = append(packagesURLs, []string{repo.BinaryURL(component, architecture).String(), "binary"})
+ if repo.DownloadUdebs {
+ packagesURLs = append(packagesURLs, []string{repo.UdebURL(component, architecture).String(), "udeb"})
+ }
}
if repo.DownloadSources {
packagesURLs = append(packagesURLs, []string{repo.SourcesURL(component).String(), "source"})
@@ -378,13 +444,15 @@ func (repo *RemoteRepo) Download(progress aptly.Progress, d aptly.Downloader, co
if kind == "binary" {
p = NewPackageFromControlFile(stanza)
+ } else if kind == "udeb" {
+ p = NewUdebPackageFromControlFile(stanza)
} else if kind == "source" {
p, err = NewSourcePackageFromControlFile(stanza)
if err != nil {
return err
}
}
- err = list.Add(p)
+ err = repo.packageList.Add(p)
if err != nil {
return err
}
@@ -398,33 +466,30 @@ func (repo *RemoteRepo) Download(progress aptly.Progress, d aptly.Downloader, co
progress.ShutdownBar()
}
- var err error
+ return nil
+}
- if repo.Filter != "" {
- progress.Printf("Applying filter...\n")
+// ApplyFilter applies filtering to already built PackageList
+func (repo *RemoteRepo) ApplyFilter(dependencyOptions int, filterQuery PackageQuery) (oldLen, newLen int, err error) {
+ repo.packageList.PrepareIndex()
- list.PrepareIndex()
+ emptyList := NewPackageList()
+ emptyList.PrepareIndex()
- emptyList := NewPackageList()
- emptyList.PrepareIndex()
-
- origPackages := list.Len()
- list, err = list.Filter([]PackageQuery{filterQuery}, repo.FilterWithDeps, emptyList, dependencyOptions, repo.Architectures)
- if err != nil {
- return err
- }
-
- progress.Printf("Packages filtered: %d -> %d.\n", origPackages, list.Len())
+ oldLen = repo.packageList.Len()
+ repo.packageList, err = repo.packageList.Filter([]PackageQuery{filterQuery}, repo.FilterWithDeps, emptyList, dependencyOptions, repo.Architectures)
+ if repo.packageList != nil {
+ newLen = repo.packageList.Len()
}
+ return
+}
- progress.Printf("Building download queue...\n")
+// BuildDownloadQueue builds queue, discards current PackageList
+func (repo *RemoteRepo) BuildDownloadQueue(packagePool aptly.PackagePool) (queue []PackageDownloadTask, downloadSize int64, err error) {
+ queue = make([]PackageDownloadTask, 0, repo.packageList.Len())
+ seen := make(map[string]struct{}, repo.packageList.Len())
- // Build download queue
- queued := make(map[string]PackageDownloadTask, list.Len())
- count := 0
- downloadSize := int64(0)
-
- err = list.ForEach(func(p *Package) error {
+ err = repo.packageList.ForEach(func(p *Package) error {
list, err2 := p.DownloadList(packagePool)
if err2 != nil {
return err2
@@ -433,58 +498,31 @@ func (repo *RemoteRepo) Download(progress aptly.Progress, d aptly.Downloader, co
for _, task := range list {
key := task.RepoURI + "-" + task.DestinationPath
- _, found := queued[key]
+ _, found := seen[key]
if !found {
- count++
+ queue = append(queue, task)
downloadSize += task.Checksums.Size
- queued[key] = task
+ seen[key] = struct{}{}
}
}
return nil
})
if err != nil {
- return fmt.Errorf("unable to build download queue: %s", err)
+ return
}
- repo.packageRefs = NewPackageRefListFromPackageList(list)
+ repo.tempPackageRefs = NewPackageRefListFromPackageList(repo.packageList)
// free up package list, we don't need it after this point
- list = nil
+ repo.packageList = nil
- progress.Printf("Download queue: %d items (%s)\n", count, utils.HumanBytes(downloadSize))
-
- progress.InitBar(downloadSize, true)
-
- // Download all package files
- ch := make(chan error, len(queued))
-
- for _, task := range queued {
- d.DownloadWithChecksum(repo.PackageURL(task.RepoURI).String(), task.DestinationPath, ch, task.Checksums, ignoreMismatch)
- }
-
- // We don't need queued after this point
- queued = nil
-
- // Wait for all downloads to finish
- errors := make([]string, 0)
-
- for count > 0 {
- err = <-ch
- if err != nil {
- errors = append(errors, err.Error())
- }
- count--
- }
-
- progress.ShutdownBar()
-
- if len(errors) > 0 {
- return fmt.Errorf("download errors:\n %s\n", strings.Join(errors, "\n "))
- }
+ return
+}
+// FinalizeDownload swaps for final value of package refs
+func (repo *RemoteRepo) FinalizeDownload() {
repo.LastDownloadDate = time.Now()
-
- return nil
+ repo.packageRefs = repo.tempPackageRefs
}
// Encode does msgpack encoding of RemoteRepo
diff --git a/src/github.com/smira/aptly/deb/remote_test.go b/src/github.com/smira/aptly/deb/remote_test.go
index 206101dc..01ab3d42 100644
--- a/src/github.com/smira/aptly/deb/remote_test.go
+++ b/src/github.com/smira/aptly/deb/remote_test.go
@@ -12,6 +12,7 @@ import (
"io/ioutil"
. "launchpad.net/gocheck"
"os"
+ "sort"
)
type NullVerifier struct {
@@ -79,8 +80,8 @@ type RemoteRepoSuite struct {
var _ = Suite(&RemoteRepoSuite{})
func (s *RemoteRepoSuite) SetUpTest(c *C) {
- s.repo, _ = NewRemoteRepo("yandex", "http://mirror.yandex.ru/debian", "squeeze", []string{"main"}, []string{}, false)
- s.flat, _ = NewRemoteRepo("exp42", "http://repos.express42.com/virool/precise/", "./", []string{}, []string{}, false)
+ s.repo, _ = NewRemoteRepo("yandex", "http://mirror.yandex.ru/debian", "squeeze", []string{"main"}, []string{}, false, false)
+ s.flat, _ = NewRemoteRepo("exp42", "http://repos.express42.com/virool/precise/", "./", []string{}, []string{}, false, false)
s.downloader = http.NewFakeDownloader().ExpectResponse("http://mirror.yandex.ru/debian/dists/squeeze/Release", exampleReleaseFile)
s.progress = console.NewProgress()
s.db, _ = database.OpenDB(c.MkDir())
@@ -96,7 +97,7 @@ func (s *RemoteRepoSuite) TearDownTest(c *C) {
}
func (s *RemoteRepoSuite) TestInvalidURL(c *C) {
- _, err := NewRemoteRepo("s", "http://lolo%2", "squeeze", []string{"main"}, []string{}, false)
+ _, err := NewRemoteRepo("s", "http://lolo%2", "squeeze", []string{"main"}, []string{}, false, false)
c.Assert(err, ErrorMatches, ".*hexadecimal escape in host.*")
}
@@ -106,11 +107,11 @@ func (s *RemoteRepoSuite) TestFlatCreation(c *C) {
c.Check(s.flat.Architectures, IsNil)
c.Check(s.flat.Components, IsNil)
- flat2, _ := NewRemoteRepo("flat2", "http://pkg.jenkins-ci.org/debian-stable", "binary/", []string{}, []string{}, false)
+ flat2, _ := NewRemoteRepo("flat2", "http://pkg.jenkins-ci.org/debian-stable", "binary/", []string{}, []string{}, false, false)
c.Check(flat2.IsFlat(), Equals, true)
c.Check(flat2.Distribution, Equals, "./binary/")
- _, err := NewRemoteRepo("fl", "http://some.repo/", "./", []string{"main"}, []string{}, false)
+ _, err := NewRemoteRepo("fl", "http://some.repo/", "./", []string{"main"}, []string{}, false, false)
c.Check(err, ErrorMatches, "components aren't supported for flat repos")
}
@@ -119,8 +120,9 @@ func (s *RemoteRepoSuite) TestString(c *C) {
c.Check(s.flat.String(), Equals, "[exp42]: http://repos.express42.com/virool/precise/ ./")
s.repo.DownloadSources = true
+ s.repo.DownloadUdebs = true
s.flat.DownloadSources = true
- c.Check(s.repo.String(), Equals, "[yandex]: http://mirror.yandex.ru/debian/ squeeze [src]")
+ c.Check(s.repo.String(), Equals, "[yandex]: http://mirror.yandex.ru/debian/ squeeze [src] [udeb]")
c.Check(s.flat.String(), Equals, "[exp42]: http://repos.express42.com/virool/precise/ ./ [src]")
}
@@ -151,6 +153,10 @@ func (s *RemoteRepoSuite) TestBinaryURL(c *C) {
c.Assert(s.repo.BinaryURL("main", "amd64").String(), Equals, "http://mirror.yandex.ru/debian/dists/squeeze/main/binary-amd64/Packages")
}
+func (s *RemoteRepoSuite) TestUdebURL(c *C) {
+ c.Assert(s.repo.UdebURL("main", "amd64").String(), Equals, "http://mirror.yandex.ru/debian/dists/squeeze/main/debian-installer/binary-amd64/Packages")
+}
+
func (s *RemoteRepoSuite) TestSourcesURL(c *C) {
c.Assert(s.repo.SourcesURL("main").String(), Equals, "http://mirror.yandex.ru/debian/dists/squeeze/main/source/Sources")
}
@@ -209,13 +215,13 @@ func (s *RemoteRepoSuite) TestFetchNullVerifier2(c *C) {
}
func (s *RemoteRepoSuite) TestFetchWrongArchitecture(c *C) {
- s.repo, _ = NewRemoteRepo("s", "http://mirror.yandex.ru/debian/", "squeeze", []string{"main"}, []string{"xyz"}, false)
+ s.repo, _ = NewRemoteRepo("s", "http://mirror.yandex.ru/debian/", "squeeze", []string{"main"}, []string{"xyz"}, false, false)
err := s.repo.Fetch(s.downloader, nil)
c.Assert(err, ErrorMatches, "architecture xyz not available in repo.*")
}
func (s *RemoteRepoSuite) TestFetchWrongComponent(c *C) {
- s.repo, _ = NewRemoteRepo("s", "http://mirror.yandex.ru/debian/", "squeeze", []string{"xyz"}, []string{"i386"}, false)
+ s.repo, _ = NewRemoteRepo("s", "http://mirror.yandex.ru/debian/", "squeeze", []string{"xyz"}, []string{"i386"}, false, false)
err := s.repo.Fetch(s.downloader, nil)
c.Assert(err, ErrorMatches, "component xyz not available in repo.*")
}
@@ -249,20 +255,22 @@ func (s *RemoteRepoSuite) TestDownload(c *C) {
s.downloader.ExpectError("http://mirror.yandex.ru/debian/dists/squeeze/main/binary-i386/Packages.bz2", errors.New("HTTP 404"))
s.downloader.ExpectError("http://mirror.yandex.ru/debian/dists/squeeze/main/binary-i386/Packages.gz", errors.New("HTTP 404"))
s.downloader.ExpectResponse("http://mirror.yandex.ru/debian/dists/squeeze/main/binary-i386/Packages", examplePackagesFile)
- s.downloader.ExpectResponse("http://mirror.yandex.ru/debian/pool/main/a/amanda/amanda-client_3.3.1-3~bpo60+1_amd64.deb", "xyz")
- err = s.repo.Download(s.progress, s.downloader, s.collectionFactory, s.packagePool, false, 0, nil)
+ err = s.repo.DownloadPackageIndexes(s.progress, s.downloader, s.collectionFactory, false)
c.Assert(err, IsNil)
c.Assert(s.downloader.Empty(), Equals, true)
+
+ queue, size, err := s.repo.BuildDownloadQueue(s.packagePool)
+ c.Check(size, Equals, int64(3))
+ c.Check(queue, HasLen, 1)
+ c.Check(queue[0].RepoURI, Equals, "pool/main/a/amanda/amanda-client_3.3.1-3~bpo60+1_amd64.deb")
+
+ s.repo.FinalizeDownload()
c.Assert(s.repo.packageRefs, NotNil)
pkg, err := s.collectionFactory.PackageCollection().ByKey(s.repo.packageRefs.Refs[0])
c.Assert(err, IsNil)
- result, err := pkg.VerifyFiles(s.packagePool)
- c.Check(result, Equals, true)
- c.Check(err, IsNil)
-
c.Check(pkg.Name, Equals, "amanda-client")
}
@@ -279,32 +287,35 @@ func (s *RemoteRepoSuite) TestDownloadWithSources(c *C) {
s.downloader.ExpectError("http://mirror.yandex.ru/debian/dists/squeeze/main/source/Sources.bz2", errors.New("HTTP 404"))
s.downloader.ExpectError("http://mirror.yandex.ru/debian/dists/squeeze/main/source/Sources.gz", errors.New("HTTP 404"))
s.downloader.ExpectResponse("http://mirror.yandex.ru/debian/dists/squeeze/main/source/Sources", exampleSourcesFile)
- s.downloader.AnyExpectResponse("http://mirror.yandex.ru/debian/pool/main/a/amanda/amanda-client_3.3.1-3~bpo60+1_amd64.deb", "xyz")
- s.downloader.AnyExpectResponse("http://mirror.yandex.ru/debian/pool/main/a/access-modifier-checker/access-modifier-checker_1.0-4.dsc", "abc")
- s.downloader.AnyExpectResponse("http://mirror.yandex.ru/debian/pool/main/a/access-modifier-checker/access-modifier-checker_1.0.orig.tar.gz", "abcd")
- s.downloader.AnyExpectResponse("http://mirror.yandex.ru/debian/pool/main/a/access-modifier-checker/access-modifier-checker_1.0-4.debian.tar.gz", "abcde")
- err = s.repo.Download(s.progress, s.downloader, s.collectionFactory, s.packagePool, false, 0, nil)
+ err = s.repo.DownloadPackageIndexes(s.progress, s.downloader, s.collectionFactory, false)
c.Assert(err, IsNil)
c.Assert(s.downloader.Empty(), Equals, true)
+
+ queue, size, err := s.repo.BuildDownloadQueue(s.packagePool)
+ c.Check(size, Equals, int64(15))
+ c.Check(queue, HasLen, 4)
+
+ q := make([]string, 4)
+ for i := range q {
+ q[i] = queue[i].RepoURI
+ }
+ sort.Strings(q)
+ c.Check(q[3], Equals, "pool/main/a/amanda/amanda-client_3.3.1-3~bpo60+1_amd64.deb")
+ c.Check(q[1], Equals, "pool/main/a/access-modifier-checker/access-modifier-checker_1.0-4.dsc")
+ c.Check(q[2], Equals, "pool/main/a/access-modifier-checker/access-modifier-checker_1.0.orig.tar.gz")
+ c.Check(q[0], Equals, "pool/main/a/access-modifier-checker/access-modifier-checker_1.0-4.debian.tar.gz")
+
+ s.repo.FinalizeDownload()
c.Assert(s.repo.packageRefs, NotNil)
pkg, err := s.collectionFactory.PackageCollection().ByKey(s.repo.packageRefs.Refs[0])
c.Assert(err, IsNil)
- result, err := pkg.VerifyFiles(s.packagePool)
- c.Check(result, Equals, true)
- c.Check(err, IsNil)
-
c.Check(pkg.Name, Equals, "amanda-client")
pkg, err = s.collectionFactory.PackageCollection().ByKey(s.repo.packageRefs.Refs[1])
c.Assert(err, IsNil)
-
- result, err = pkg.VerifyFiles(s.packagePool)
- c.Check(result, Equals, true)
- c.Check(err, IsNil)
-
c.Check(pkg.Name, Equals, "access-modifier-checker")
}
@@ -314,23 +325,25 @@ func (s *RemoteRepoSuite) TestDownloadFlat(c *C) {
downloader.ExpectError("http://repos.express42.com/virool/precise/Packages.bz2", errors.New("HTTP 404"))
downloader.ExpectError("http://repos.express42.com/virool/precise/Packages.gz", errors.New("HTTP 404"))
downloader.ExpectResponse("http://repos.express42.com/virool/precise/Packages", examplePackagesFile)
- downloader.ExpectResponse("http://repos.express42.com/virool/precise/pool/main/a/amanda/amanda-client_3.3.1-3~bpo60+1_amd64.deb", "xyz")
err := s.flat.Fetch(downloader, nil)
c.Assert(err, IsNil)
- err = s.flat.Download(s.progress, downloader, s.collectionFactory, s.packagePool, false, 0, nil)
+ err = s.flat.DownloadPackageIndexes(s.progress, downloader, s.collectionFactory, false)
c.Assert(err, IsNil)
c.Assert(downloader.Empty(), Equals, true)
+
+ queue, size, err := s.flat.BuildDownloadQueue(s.packagePool)
+ c.Check(size, Equals, int64(3))
+ c.Check(queue, HasLen, 1)
+ c.Check(queue[0].RepoURI, Equals, "pool/main/a/amanda/amanda-client_3.3.1-3~bpo60+1_amd64.deb")
+
+ s.flat.FinalizeDownload()
c.Assert(s.flat.packageRefs, NotNil)
pkg, err := s.collectionFactory.PackageCollection().ByKey(s.flat.packageRefs.Refs[0])
c.Assert(err, IsNil)
- result, err := pkg.VerifyFiles(s.packagePool)
- c.Check(result, Equals, true)
- c.Check(err, IsNil)
-
c.Check(pkg.Name, Equals, "amanda-client")
}
@@ -345,35 +358,39 @@ func (s *RemoteRepoSuite) TestDownloadWithSourcesFlat(c *C) {
downloader.ExpectError("http://repos.express42.com/virool/precise/Sources.bz2", errors.New("HTTP 404"))
downloader.ExpectError("http://repos.express42.com/virool/precise/Sources.gz", errors.New("HTTP 404"))
downloader.ExpectResponse("http://repos.express42.com/virool/precise/Sources", exampleSourcesFile)
- downloader.AnyExpectResponse("http://repos.express42.com/virool/precise/pool/main/a/amanda/amanda-client_3.3.1-3~bpo60+1_amd64.deb", "xyz")
- downloader.AnyExpectResponse("http://repos.express42.com/virool/precise/pool/main/a/access-modifier-checker/access-modifier-checker_1.0-4.dsc", "abc")
- downloader.AnyExpectResponse("http://repos.express42.com/virool/precise/pool/main/a/access-modifier-checker/access-modifier-checker_1.0.orig.tar.gz", "abcd")
- downloader.AnyExpectResponse("http://repos.express42.com/virool/precise/pool/main/a/access-modifier-checker/access-modifier-checker_1.0-4.debian.tar.gz", "abcde")
err := s.flat.Fetch(downloader, nil)
c.Assert(err, IsNil)
- err = s.flat.Download(s.progress, downloader, s.collectionFactory, s.packagePool, false, 0, nil)
+ err = s.flat.DownloadPackageIndexes(s.progress, downloader, s.collectionFactory, false)
c.Assert(err, IsNil)
c.Assert(downloader.Empty(), Equals, true)
+
+ queue, size, err := s.flat.BuildDownloadQueue(s.packagePool)
+ c.Check(size, Equals, int64(15))
+ c.Check(queue, HasLen, 4)
+
+ q := make([]string, 4)
+ for i := range q {
+ q[i] = queue[i].RepoURI
+ }
+ sort.Strings(q)
+ c.Check(q[3], Equals, "pool/main/a/amanda/amanda-client_3.3.1-3~bpo60+1_amd64.deb")
+ c.Check(q[1], Equals, "pool/main/a/access-modifier-checker/access-modifier-checker_1.0-4.dsc")
+ c.Check(q[2], Equals, "pool/main/a/access-modifier-checker/access-modifier-checker_1.0.orig.tar.gz")
+ c.Check(q[0], Equals, "pool/main/a/access-modifier-checker/access-modifier-checker_1.0-4.debian.tar.gz")
+
+ s.flat.FinalizeDownload()
c.Assert(s.flat.packageRefs, NotNil)
pkg, err := s.collectionFactory.PackageCollection().ByKey(s.flat.packageRefs.Refs[0])
c.Assert(err, IsNil)
- result, err := pkg.VerifyFiles(s.packagePool)
- c.Check(result, Equals, true)
- c.Check(err, IsNil)
-
c.Check(pkg.Name, Equals, "amanda-client")
pkg, err = s.collectionFactory.PackageCollection().ByKey(s.flat.packageRefs.Refs[1])
c.Assert(err, IsNil)
- result, err = pkg.VerifyFiles(s.packagePool)
- c.Check(result, Equals, true)
- c.Check(err, IsNil)
-
c.Check(pkg.Name, Equals, "access-modifier-checker")
}
@@ -399,7 +416,7 @@ func (s *RemoteRepoCollectionSuite) TestAddByName(c *C) {
r, err := s.collection.ByName("yandex")
c.Assert(err, ErrorMatches, "*.not found")
- repo, _ := NewRemoteRepo("yandex", "http://mirror.yandex.ru/debian/", "squeeze", []string{"main"}, []string{}, false)
+ repo, _ := NewRemoteRepo("yandex", "http://mirror.yandex.ru/debian/", "squeeze", []string{"main"}, []string{}, false, false)
c.Assert(s.collection.Add(repo), IsNil)
c.Assert(s.collection.Add(repo), ErrorMatches, ".*already exists")
@@ -417,7 +434,7 @@ func (s *RemoteRepoCollectionSuite) TestByUUID(c *C) {
r, err := s.collection.ByUUID("some-uuid")
c.Assert(err, ErrorMatches, "*.not found")
- repo, _ := NewRemoteRepo("yandex", "http://mirror.yandex.ru/debian/", "squeeze", []string{"main"}, []string{}, false)
+ repo, _ := NewRemoteRepo("yandex", "http://mirror.yandex.ru/debian/", "squeeze", []string{"main"}, []string{}, false, false)
c.Assert(s.collection.Add(repo), IsNil)
r, err = s.collection.ByUUID(repo.UUID)
@@ -426,7 +443,7 @@ func (s *RemoteRepoCollectionSuite) TestByUUID(c *C) {
}
func (s *RemoteRepoCollectionSuite) TestUpdateLoadComplete(c *C) {
- repo, _ := NewRemoteRepo("yandex", "http://mirror.yandex.ru/debian/", "squeeze", []string{"main"}, []string{}, false)
+ repo, _ := NewRemoteRepo("yandex", "http://mirror.yandex.ru/debian/", "squeeze", []string{"main"}, []string{}, false, false)
c.Assert(s.collection.Update(repo), IsNil)
collection := NewRemoteRepoCollection(s.db)
@@ -447,7 +464,7 @@ func (s *RemoteRepoCollectionSuite) TestUpdateLoadComplete(c *C) {
}
func (s *RemoteRepoCollectionSuite) TestForEachAndLen(c *C) {
- repo, _ := NewRemoteRepo("yandex", "http://mirror.yandex.ru/debian/", "squeeze", []string{"main"}, []string{}, false)
+ repo, _ := NewRemoteRepo("yandex", "http://mirror.yandex.ru/debian/", "squeeze", []string{"main"}, []string{}, false, false)
s.collection.Add(repo)
count := 0
@@ -469,10 +486,10 @@ func (s *RemoteRepoCollectionSuite) TestForEachAndLen(c *C) {
}
func (s *RemoteRepoCollectionSuite) TestDrop(c *C) {
- repo1, _ := NewRemoteRepo("yandex", "http://mirror.yandex.ru/debian/", "squeeze", []string{"main"}, []string{}, false)
+ repo1, _ := NewRemoteRepo("yandex", "http://mirror.yandex.ru/debian/", "squeeze", []string{"main"}, []string{}, false, false)
s.collection.Add(repo1)
- repo2, _ := NewRemoteRepo("tyndex", "http://mirror.yandex.ru/debian/", "wheezy", []string{"main"}, []string{}, false)
+ repo2, _ := NewRemoteRepo("tyndex", "http://mirror.yandex.ru/debian/", "wheezy", []string{"main"}, []string{}, false, false)
s.collection.Add(repo2)
r1, _ := s.collection.ByUUID(repo1.UUID)
diff --git a/src/github.com/smira/aptly/deb/snapshot_test.go b/src/github.com/smira/aptly/deb/snapshot_test.go
index 9d52d713..83db0853 100644
--- a/src/github.com/smira/aptly/deb/snapshot_test.go
+++ b/src/github.com/smira/aptly/deb/snapshot_test.go
@@ -15,7 +15,7 @@ var _ = Suite(&SnapshotSuite{})
func (s *SnapshotSuite) SetUpTest(c *C) {
s.SetUpPackages()
- s.repo, _ = NewRemoteRepo("yandex", "http://mirror.yandex.ru/debian/", "squeeze", []string{"main"}, []string{}, false)
+ s.repo, _ = NewRemoteRepo("yandex", "http://mirror.yandex.ru/debian/", "squeeze", []string{"main"}, []string{}, false, false)
s.repo.packageRefs = s.reflist
}
@@ -108,11 +108,11 @@ func (s *SnapshotCollectionSuite) SetUpTest(c *C) {
s.collection = NewSnapshotCollection(s.db)
s.SetUpPackages()
- s.repo1, _ = NewRemoteRepo("yandex", "http://mirror.yandex.ru/debian/", "squeeze", []string{"main"}, []string{}, false)
+ s.repo1, _ = NewRemoteRepo("yandex", "http://mirror.yandex.ru/debian/", "squeeze", []string{"main"}, []string{}, false, false)
s.repo1.packageRefs = s.reflist
s.snapshot1, _ = NewSnapshotFromRepository("snap1", s.repo1)
- s.repo2, _ = NewRemoteRepo("android", "http://mirror.yandex.ru/debian/", "lenny", []string{"main"}, []string{}, false)
+ s.repo2, _ = NewRemoteRepo("android", "http://mirror.yandex.ru/debian/", "lenny", []string{"main"}, []string{}, false, false)
s.repo2.packageRefs = s.reflist
s.snapshot2, _ = NewSnapshotFromRepository("snap2", s.repo2)
@@ -192,7 +192,7 @@ func (s *SnapshotCollectionSuite) TestFindByRemoteRepoSource(c *C) {
c.Check(s.collection.ByRemoteRepoSource(s.repo1), DeepEquals, []*Snapshot{s.snapshot1})
c.Check(s.collection.ByRemoteRepoSource(s.repo2), DeepEquals, []*Snapshot{s.snapshot2})
- repo3, _ := NewRemoteRepo("other", "http://mirror.yandex.ru/debian/", "lenny", []string{"main"}, []string{}, false)
+ repo3, _ := NewRemoteRepo("other", "http://mirror.yandex.ru/debian/", "lenny", []string{"main"}, []string{}, false, false)
c.Check(s.collection.ByRemoteRepoSource(repo3), DeepEquals, []*Snapshot{})
}
diff --git a/src/github.com/smira/aptly/http/download.go b/src/github.com/smira/aptly/http/download.go
index c0ae4e16..adf3c914 100644
--- a/src/github.com/smira/aptly/http/download.go
+++ b/src/github.com/smira/aptly/http/download.go
@@ -7,6 +7,7 @@ import (
"fmt"
"github.com/smira/aptly/aptly"
"github.com/smira/aptly/utils"
+ "github.com/smira/go-ftp-protocol/protocol"
"io"
"io/ioutil"
"net/http"
@@ -47,11 +48,12 @@ type downloadTask struct {
func NewDownloader(threads int, downLimit int64, progress aptly.Progress) aptly.Downloader {
transport := *http.DefaultTransport.(*http.Transport)
transport.DisableCompression = true
+ transport.RegisterProtocol("ftp", &protocol.FTPRoundTripper{})
downloader := &downloaderImpl{
queue: make(chan *downloadTask, 1000),
- stop: make(chan struct{}),
- stopped: make(chan struct{}),
+ stop: make(chan struct{}, threads),
+ stopped: make(chan struct{}, threads),
pause: make(chan struct{}),
unpause: make(chan struct{}),
threads: threads,
@@ -86,6 +88,13 @@ func (downloader *downloaderImpl) Shutdown() {
}
}
+// Abort stops downloader but doesn't wait for downloader to stop
+func (downloader *downloaderImpl) Abort() {
+ for i := 0; i < downloader.threads; i++ {
+ downloader.stop <- struct{}{}
+ }
+}
+
// Pause pauses task processing
func (downloader *downloaderImpl) Pause() {
for i := 0; i < downloader.threads; i++ {
@@ -122,10 +131,12 @@ func (downloader *downloaderImpl) handleTask(task *downloadTask) {
resp, err := downloader.client.Get(task.url)
if err != nil {
- task.result <- err
+ task.result <- fmt.Errorf("%s: %s", task.url, err)
return
}
- defer resp.Body.Close()
+ if resp.Body != nil {
+ defer resp.Body.Close()
+ }
if resp.StatusCode < 200 || resp.StatusCode > 299 {
task.result <- fmt.Errorf("HTTP code %d while fetching %s", resp.StatusCode, task.url)
@@ -134,7 +145,7 @@ func (downloader *downloaderImpl) handleTask(task *downloadTask) {
err = os.MkdirAll(filepath.Dir(task.destination), 0755)
if err != nil {
- task.result <- err
+ task.result <- fmt.Errorf("%s: %s", task.url, err)
return
}
@@ -142,7 +153,7 @@ func (downloader *downloaderImpl) handleTask(task *downloadTask) {
outfile, err := os.Create(temppath)
if err != nil {
- task.result <- err
+ task.result <- fmt.Errorf("%s: %s", task.url, err)
return
}
defer outfile.Close()
@@ -159,7 +170,7 @@ func (downloader *downloaderImpl) handleTask(task *downloadTask) {
_, err = io.Copy(w, resp.Body)
if err != nil {
os.Remove(temppath)
- task.result <- err
+ task.result <- fmt.Errorf("%s: %s", task.url, err)
return
}
@@ -190,7 +201,7 @@ func (downloader *downloaderImpl) handleTask(task *downloadTask) {
err = os.Rename(temppath, task.destination)
if err != nil {
os.Remove(temppath)
- task.result <- err
+ task.result <- fmt.Errorf("%s: %s", task.url, err)
return
}
diff --git a/src/github.com/smira/aptly/http/fake.go b/src/github.com/smira/aptly/http/fake.go
index 4d256a3f..c2eda915 100644
--- a/src/github.com/smira/aptly/http/fake.go
+++ b/src/github.com/smira/aptly/http/fake.go
@@ -123,6 +123,10 @@ func (f *FakeDownloader) Download(url string, filename string, result chan<- err
func (f *FakeDownloader) Shutdown() {
}
+// Abort does nothing
+func (f *FakeDownloader) Abort() {
+}
+
// Pause does nothing
func (f *FakeDownloader) Pause() {
}
diff --git a/src/github.com/smira/aptly/http/http.go b/src/github.com/smira/aptly/http/http.go
index f6fb5be4..84b2cec2 100644
--- a/src/github.com/smira/aptly/http/http.go
+++ b/src/github.com/smira/aptly/http/http.go
@@ -1,2 +1,2 @@
-// Package http provides all HTTP-related operations
+// Package http provides all HTTP (and FTP)-related operations
package http
diff --git a/src/github.com/smira/aptly/main.go b/src/github.com/smira/aptly/main.go
index 8bb4bc91..47d3b690 100644
--- a/src/github.com/smira/aptly/main.go
+++ b/src/github.com/smira/aptly/main.go
@@ -1,38 +1,10 @@
package main
import (
- "fmt"
"github.com/smira/aptly/cmd"
"os"
)
func main() {
- defer func() {
- if r := recover(); r != nil {
- fatal, ok := r.(*cmd.FatalError)
- if !ok {
- panic(r)
- }
- fmt.Println("ERROR:", fatal.Message)
- os.Exit(fatal.ReturnCode)
- }
- }()
-
- command := cmd.RootCommand()
-
- flags, args, err := command.ParseFlags(os.Args[1:])
- if err != nil {
- cmd.Fatal(err)
- }
-
- err = cmd.InitContext(flags)
- if err != nil {
- cmd.Fatal(err)
- }
- defer cmd.ShutdownContext()
-
- err = command.Dispatch(args)
- if err != nil {
- cmd.Fatal(err)
- }
+ os.Exit(cmd.Run(cmd.RootCommand(), os.Args[1:], true))
}
diff --git a/src/github.com/smira/aptly/man/aptly.1 b/src/github.com/smira/aptly/man/aptly.1
index c64d5566..642ade7f 100644
--- a/src/github.com/smira/aptly/man/aptly.1
+++ b/src/github.com/smira/aptly/man/aptly.1
@@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
-.TH "APTLY" "1" "August 2014" "" ""
+.TH "APTLY" "1" "October 2014" "" ""
.
.SH "NAME"
\fBaptly\fR \- Debian repository management tool
@@ -22,10 +22,10 @@ aptly has integrated help that matches contents of this manual page, to get help
aptly is a tool to create partial and full mirrors of remote repositories, manage local repositories, filter them, merge, upgrade individual packages, take snapshots and publish them back as Debian repositories\.
.
.P
-aptly\(cqs goal is to establish repeatability and controlled changes in a package\-centric environment\. aptly allows to fix a set of packages in a repository, so that package installation and upgrade becomes deterministic\. At the same time aptly allows to perform controlled, fine\-grained changes in repository contents to transition your package environment to new version\.
+aptly\(cqs goal is to establish repeatability and controlled changes in a package\-centric environment\. aptly allows one to fix a set of packages in a repository, so that package installation and upgrade becomes deterministic\. At the same time aptly allows one to perform controlled, fine\-grained changes in repository contents to transition your package environment to new version\.
.
.SH "CONFIGURATION"
-aptly looks for configuration file in \fB/etc/aptly\.conf\fR and \fB~/\.aptly\.conf\fR, if no config file found, new one is created\. If \fB\-config=\fR flag is specified, aptly would use config file at specified location\. Also aptly needs root directory for database, package and published repository storage\. If not specified, directory defaults to \fB~/\.aptly\fR, it will be created if missing\.
+aptly looks for configuration file first in \fB~/\.aptly\.conf\fR then in \fB/etc/aptly\.conf\fR and, if no config file found, new one is created in home directory\. If \fB\-config=\fR flag is specified, aptly would use config file at specified location\. Also aptly needs root directory for database, package and published repository storage\. If not specified, directory defaults to \fB~/\.aptly\fR, it will be created if missing\.
.
.P
Configuration file is stored in JSON format (default values shown below):
@@ -55,7 +55,10 @@ Configuration file is stored in JSON format (default values shown below):
"awsAccessKeyID": ""
"awsSecretAccessKey": "",
"prefix": "",
- "acl": "public\-read"
+ "acl": "public\-read",
+ "storageClass": "",
+ "encryptionMethod": "",
+ "plusWorkaround": false
}
}
.
@@ -115,7 +118,7 @@ if enabled, all mirrors created would have flag set to download source packages;
specifies paramaters for short PPA url expansion, if left blank they default to output of \fBlsb_release\fR command
.
.TP
-\fBS3PublisEndpoints\fR
+\fBS3PublishEndpoints\fR
configuration of Amazon S3 publishing endpoints (see below)
.
.SH "S3 PUBLISHING ENDPOINTS"
@@ -141,6 +144,18 @@ bucket name
\fBawsAccessKeyID\fR, \fBawsSecretAccessKey\fR
(optional) Amazon credentials to access S3 bucket\. If not supplied, environment variables \fBAWS_ACCESS_KEY_ID\fR and \fBAWS_SECRET_ACCESS_KEY\fR are used\.
.
+.TP
+\fBstorageClass\fR
+(optional) Amazon S3 storage class, defaults to \fBSTANDARD\fR\. Other values available: \fBREDUCED_REDUNDANCY\fR (lower price, lower redundancy)
+.
+.TP
+\fBencryptionMethod\fR
+(optional) server\-side encryption method, defaults to none\. Currently the only available encryption method is \fBAES256\fR
+.
+.TP
+\fBplusWorkaround\fR
+(optional) workaround misbehavior in apt and Amazon S3 for files with \fB+\fR in filename by creating two copies of package files with \fB+\fR in filename: one original and another one with spaces instead of plus signs With \fBplusWorkaround\fR enabled, package files with plus sign would be stored twice\. aptly might not cleanup files with spaces when published repository is dropped or updated (switched) to new version of repository (snapshot)\.
+.
.P
In order to publish to S3, specify endpoint as \fBs3:endpoint\-name:\fR before publishing prefix on the command line, e\.g\.:
.
@@ -274,7 +289,7 @@ when processing dependencies, follow Suggests
\fBaptly\fR \fBmirror\fR \fBcreate\fR \fIname\fR \fIarchive url\fR \fIdistribution\fR [\fIcomponent1\fR \|\.\|\.\|\.]
.
.P
-Creates mirror \fIname\fR of remote repository, aptly supports both regular and flat Debian repositories exported via HTTP\. aptly would try download Release file from remote repository and verify its\(cq signature\. Command line format resembles apt utlitily sources\.list(5)\.
+Creates mirror \fIname\fR of remote repository, aptly supports both regular and flat Debian repositories exported via HTTP and FTP\. aptly would try download Release file from remote repository and verify its\(cq signature\. Command line format resembles apt utlitily sources\.list(5)\.
.
.P
PPA urls could specified in short format:
@@ -311,6 +326,10 @@ gpg keyring to use when verifying Release file (could be specified multiple time
\-\fBwith\-sources\fR=false
download source packages in addition to binary packages
.
+.TP
+\-\fBwith\-udebs\fR=false
+download \.udeb packages (Debian installer support)
+.
.SH "LIST MIRRORS"
\fBaptly\fR \fBmirror\fR \fBlist\fR
.
@@ -388,6 +407,10 @@ Options:
limit download speed (kbytes/sec)
.
.TP
+\-\fBforce\fR=false
+force update mirror even if it is locked by another process
+.
+.TP
\-\fBignore\-checksums\fR=false
ignore checksum mismatches while downloading package files and metadata
.
@@ -411,11 +434,11 @@ Example:
.P
$ aptly mirror rename wheezy\-min wheezy\-main
.
-.SH "EDIT PROPERTIES OF MIRORR"
+.SH "EDIT MIRROR SETTINGS"
\fBaptly\fR \fBmirror\fR \fBedit\fR \fIname\fR
.
.P
-Command edit allows to change settings of mirror: filters\.
+Command edit allows one to change settings of mirror: filters, list of architectures\.
.
.P
Example:
@@ -434,11 +457,45 @@ filter packages in mirror
\-\fBfilter\-with\-deps\fR=false
when filtering, include dependencies of matching packages as well
.
+.TP
+\-\fBwith\-sources\fR=false
+download source packages in addition to binary packages
+.
+.TP
+\-\fBwith\-udebs\fR=false
+download \.udeb packages (Debian installer support)
+.
+.SH "SEARCH MIRROR FOR PACKAGES MATCHING QUERY"
+\fBaptly\fR \fBmirror\fR \fBsearch\fR \fIname\fR \fIpackage\-query\fR
+.
+.P
+Command search displays list of packages in mirror that match package query
+.
+.P
+Example:
+.
+.IP "" 4
+.
+.nf
+
+$ aptly mirror search wheezy\-main \(cq$Architecture (i386), Name (% *\-dev)\(cq
+.
+.fi
+.
+.IP "" 0
+.
+.P
+Options:
+.
+.TP
+\-\fBwith\-deps\fR=false
+include dependencies into search results
+.
.SH "ADD PACKAGES TO LOCAL REPOSITORY"
\fBaptly\fR \fBrepo\fR \fBadd\fR \fIname\fR
.
.P
-Command adds packages to local repository from \.deb (binary packages) and \.dsc (source packages) files\. When importing from directory aptly would do recursive scan looking for all files matching \fI\.deb or\fR\.dsc patterns\. Every file discovered would be analyzed to extract metadata, package would then be created and added to the database\. Files would be imported to internal package pool\. For source packages, all required files are added automatically as well\. Extra files for source package should be in the same directory as *\.dsc file\.
+Command adds packages to local repository from \.deb, \.udeb (binary packages) and \.dsc (source packages) files\. When importing from directory aptly would do recursive scan looking for all files matching \fI\.[u]deb or\fR\.dsc patterns\. Every file discovered would be analyzed to extract metadata, package would then be created and added to the database\. Files would be imported to internal package pool\. For source packages, all required files are added automatically as well\. Extra files for source package should be in the same directory as *\.dsc file\.
.
.P
Example:
@@ -450,6 +507,10 @@ $ aptly repo add testing myapp\-0\.1\.2\.deb incoming/
Options:
.
.TP
+\-\fBforce\-replace\fR=false
+when adding package that conflicts with existing package, remove existing package
+.
+.TP
\-\fBremove\-files\fR=false
remove files that have been imported successfully into repository
.
@@ -526,7 +587,7 @@ force local repo deletion even if used by snapshots
\fBaptly\fR \fBrepo\fR \fBedit\fR \fIname\fR
.
.P
-Command edit allows to change metadata of local repository: comment, default distribution and component\.
+Command edit allows one to change metadata of local repository: comment, default distribution and component\.
.
.P
Example:
@@ -661,6 +722,32 @@ Example:
.P
$ aptly repo rename wheezy\-min wheezy\-main
.
+.SH "SEARCH REPO FOR PACKAGES MATCHING QUERY"
+\fBaptly\fR \fBrepo\fR \fBsearch\fR \fIname\fR \fIpackage\-query\fR
+.
+.P
+Command search displays list of packages in local repository that match package query
+.
+.P
+Example:
+.
+.IP "" 4
+.
+.nf
+
+$ aptly repo search my\-software \(cq$Architecture (i386), Name (% *\-dev)\(cq
+.
+.fi
+.
+.IP "" 0
+.
+.P
+Options:
+.
+.TP
+\-\fBwith\-deps\fR=false
+include dependencies into search results
+.
.SH "CREATES SNAPSHOT OF MIRROR (LOCAL REPOSITORY) CONTENTS"
\fBaptly\fR \fBsnapshot\fR \fBcreate\fR \fIname\fR \fBfrom\fR \fBmirror\fR \fImirror\-name\fR \fB|\fR \fBfrom\fR \fBrepo\fR \fIrepo\-name\fR \fB|\fR \fBempty\fR
.
@@ -879,6 +966,58 @@ Example:
.P
$ aptly snapshot rename wheezy\-min wheezy\-main
.
+.SH "SEARCH SNAPSHOT FOR PACKAGES MATCHING QUERY"
+\fBaptly\fR \fBsnapshot\fR \fBsearch\fR \fIname\fR \fIpackage\-query\fR
+.
+.P
+Command search displays list of packages in snapshot that match package query
+.
+.P
+Example:
+.
+.IP "" 4
+.
+.nf
+
+$ aptly snapshot search wheezy\-main \(cq$Architecture (i386), Name (% *\-dev)\(cq
+.
+.fi
+.
+.IP "" 0
+.
+.P
+Options:
+.
+.TP
+\-\fBwith\-deps\fR=false
+include dependencies into search results
+.
+.SH "FILTER PACKAGES IN SNAPSHOT PRODUCING ANOTHER SNAPSHOT"
+\fBaptly\fR \fBsnapshot\fR \fBfilter\fR \fIsource\fR \fIdestination\fR \fIpackage\-query\fR \fB\|\.\|\.\|\.\fR
+.
+.P
+Command filter does filtering in snapshot \fIsource\fR, producing another snapshot \fIdestination\fR\. Packages could be specified simply as \(cqpackage\-name\(cq or as package queries\.
+.
+.P
+Example:
+.
+.IP "" 4
+.
+.nf
+
+$ aptly snapshot filter wheezy\-main wheezy\-required \(cqPriorioty (required)\(cq
+.
+.fi
+.
+.IP "" 0
+.
+.P
+Options:
+.
+.TP
+\-\fBwith\-deps\fR=false
+include dependent packages as well
+.
.SH "REMOVE PUBLISHED REPOSITORY"
\fBaptly\fR \fBpublish\fR \fBdrop\fR \fIdistribution\fR [[\fIendpoint\fR:]\fIprefix\fR]
.
@@ -991,6 +1130,14 @@ label to publish
origin name to publish
.
.TP
+\-\fBpassphrase\fR=
+GPG passhprase for the key (warning: could be insecure)
+.
+.TP
+\-\fBpassphrase\-file\fR=
+GPG passhprase\-file for the key (warning: could be insecure)
+.
+.TP
\-\fBsecret\-keyring\fR=
GPG secret keyring to use (instead of default)
.
@@ -1062,6 +1209,14 @@ label to publish
origin name to publish
.
.TP
+\-\fBpassphrase\fR=
+GPG passhprase for the key (warning: could be insecure)
+.
+.TP
+\-\fBpassphrase\-file\fR=
+GPG passhprase\-file for the key (warning: could be insecure)
+.
+.TP
\-\fBsecret\-keyring\fR=
GPG secret keyring to use (instead of default)
.
@@ -1121,6 +1276,14 @@ GPG key ID to use when signing the release
GPG keyring to use (instead of default)
.
.TP
+\-\fBpassphrase\fR=
+GPG passhprase for the key (warning: could be insecure)
+.
+.TP
+\-\fBpassphrase\-file\fR=
+GPG passhprase\-file for the key (warning: could be insecure)
+.
+.TP
\-\fBsecret\-keyring\fR=
GPG secret keyring to use (instead of default)
.
@@ -1166,6 +1329,14 @@ GPG key ID to use when signing the release
GPG keyring to use (instead of default)
.
.TP
+\-\fBpassphrase\fR=
+GPG passhprase for the key (warning: could be insecure)
+.
+.TP
+\-\fBpassphrase\-file\fR=
+GPG passhprase\-file for the key (warning: could be insecure)
+.
+.TP
\-\fBsecret\-keyring\fR=
GPG secret keyring to use (instead of default)
.
@@ -1173,6 +1344,55 @@ GPG secret keyring to use (instead of default)
\-\fBskip\-signing\fR=false
don\(cqt sign Release files with GPG
.
+.SH "SEARCH FOR PACKAGES MATCHING QUERY"
+\fBaptly\fR \fBpackage\fR \fBsearch\fR \fIpackage\-query\fR
+.
+.P
+Command search displays list of packages in whole DB that match package query
+.
+.P
+Example:
+.
+.IP "" 4
+.
+.nf
+
+$ aptly package search \(cq$Architecture (i386), Name (% *\-dev)\(cq
+.
+.fi
+.
+.IP "" 0
+.
+.SH "SHOW DETAILS ABOUT PACKAGES MATCING QUERY"
+\fBaptly\fR \fBpackage\fR \fBshow\fR \fIpackage\-query\fR
+.
+.P
+Command shows displays detailed meta\-information about packages matching query\. Information from Debian control file is displayed\. Optionally information about package files and inclusion into mirrors/snapshots/local repos is shown\.
+.
+.P
+Example:
+.
+.IP "" 4
+.
+.nf
+
+$ aptly package show nginx\-light_1\.2\.1\-2\.2+wheezy2_i386\(cq
+.
+.fi
+.
+.IP "" 0
+.
+.P
+Options:
+.
+.TP
+\-\fBwith\-files\fR=false
+display information about files from package pool
+.
+.TP
+\-\fBwith\-references\fR=false
+display information about mirrors, snapshots and local repos referencing this package
+.
.SH "CLEANUP DB AND PACKAGE POOL"
\fBaptly\fR \fBdb\fR \fBcleanup\fR
.
diff --git a/src/github.com/smira/aptly/man/aptly.1.ronn.tmpl b/src/github.com/smira/aptly/man/aptly.1.ronn.tmpl
index db7f17c0..b2674547 100644
--- a/src/github.com/smira/aptly/man/aptly.1.ronn.tmpl
+++ b/src/github.com/smira/aptly/man/aptly.1.ronn.tmpl
@@ -18,8 +18,9 @@ aptly has integrated help that matches contents of this manual page, to get help
## CONFIGURATION
-aptly looks for configuration file in `/etc/aptly.conf` and `~/.aptly.conf`, if no config file
-found, new one is created. If `-config=` flag is specified, aptly would use config file at specified
+aptly looks for configuration file first in `~/.aptly.conf` then
+in `/etc/aptly.conf` and, if no config file found, new one is created in
+home directory. If `-config=` flag is specified, aptly would use config file at specified
location. Also aptly needs root directory for database, package and published repository storage.
If not specified, directory defaults to `~/.aptly`, it will be created if missing.
@@ -46,7 +47,10 @@ Configuration file is stored in JSON format (default values shown below):
"awsAccessKeyID": ""
"awsSecretAccessKey": "",
"prefix": "",
- "acl": "public-read"
+ "acl": "public-read",
+ "storageClass": "",
+ "encryptionMethod": "",
+ "plusWorkaround": false
}
}
@@ -94,7 +98,7 @@ Options:
specifies paramaters for short PPA url expansion, if left blank they default
to output of `lsb_release` command
- * `S3PublisEndpoints`:
+ * `S3PublishEndpoints`:
configuration of Amazon S3 publishing endpoints (see below)
## S3 PUBLISHING ENDPOINTS
@@ -120,6 +124,20 @@ and associated settings:
(optional) Amazon credentials to access S3 bucket. If not supplied,
environment variables `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`
are used.
+ * `storageClass`:
+ (optional) Amazon S3 storage class, defaults to `STANDARD`. Other values
+ available: `REDUCED_REDUNDANCY` (lower price, lower redundancy)
+ * `encryptionMethod`:
+ (optional) server-side encryption method, defaults to none. Currently
+ the only available encryption method is `AES256`
+ * `plusWorkaround`:
+ (optional) workaround misbehavior in apt and Amazon S3
+ for files with `+` in filename by
+ creating two copies of package files with `+` in filename: one original
+ and another one with spaces instead of plus signs
+ With `plusWorkaround` enabled, package files with plus sign
+ would be stored twice. aptly might not cleanup files with spaces when published
+ repository is dropped or updated (switched) to new version of repository (snapshot).
In order to publish to S3, specify endpoint as `s3:endpoint-name:` before
publishing prefix on the command line, e.g.:
@@ -219,6 +237,8 @@ When specified on command line, query may have to be quoted according to shell r
{{template "command" findCommand . "publish"}}
+{{template "command" findCommand . "package"}}
+
{{template "command" findCommand . "db"}}
{{template "command" findCommand . "serve"}}
diff --git a/src/github.com/smira/aptly/s3/public.go b/src/github.com/smira/aptly/s3/public.go
index 08a8cd6e..f0011127 100644
--- a/src/github.com/smira/aptly/s3/public.go
+++ b/src/github.com/smira/aptly/s3/public.go
@@ -13,10 +13,13 @@ import (
// PublishedStorage abstract file system with published files (actually hosted on S3)
type PublishedStorage struct {
- s3 *s3.S3
- bucket *s3.Bucket
- acl s3.ACL
- prefix string
+ s3 *s3.S3
+ bucket *s3.Bucket
+ acl s3.ACL
+ prefix string
+ storageClass string
+ encryptionMethod string
+ plusWorkaround bool
}
// Check interface
@@ -25,12 +28,23 @@ var (
)
// NewPublishedStorageRaw creates published storage from raw aws credentials
-func NewPublishedStorageRaw(auth aws.Auth, region aws.Region, bucket, defaultACL, prefix string) (*PublishedStorage, error) {
+func NewPublishedStorageRaw(auth aws.Auth, region aws.Region, bucket, defaultACL, prefix,
+ storageClass, encryptionMethod string, plusWorkaround bool) (*PublishedStorage, error) {
if defaultACL == "" {
defaultACL = "private"
}
- result := &PublishedStorage{s3: s3.New(auth, region), acl: s3.ACL(defaultACL), prefix: prefix}
+ if storageClass == "STANDARD" {
+ storageClass = ""
+ }
+
+ result := &PublishedStorage{
+ s3: s3.New(auth, region),
+ acl: s3.ACL(defaultACL),
+ prefix: prefix,
+ storageClass: storageClass,
+ encryptionMethod: encryptionMethod,
+ plusWorkaround: plusWorkaround}
result.bucket = result.s3.Bucket(bucket)
return result, nil
@@ -38,7 +52,8 @@ func NewPublishedStorageRaw(auth aws.Auth, region aws.Region, bucket, defaultACL
// NewPublishedStorage creates new instance of PublishedStorage with specified S3 access
// keys, region and bucket name
-func NewPublishedStorage(accessKey, secretKey, region, bucket, defaultACL, prefix string) (*PublishedStorage, error) {
+func NewPublishedStorage(accessKey, secretKey, region, bucket, defaultACL, prefix,
+ storageClass, encryptionMethod string, plusWorkaround bool) (*PublishedStorage, error) {
auth, err := aws.GetAuth(accessKey, secretKey)
if err != nil {
return nil, err
@@ -49,7 +64,7 @@ func NewPublishedStorage(accessKey, secretKey, region, bucket, defaultACL, prefi
return nil, fmt.Errorf("unknown region: %#v", region)
}
- return NewPublishedStorageRaw(auth, awsRegion, bucket, defaultACL, prefix)
+ return NewPublishedStorageRaw(auth, awsRegion, bucket, defaultACL, prefix, storageClass, encryptionMethod, plusWorkaround)
}
// String
@@ -81,10 +96,24 @@ func (storage *PublishedStorage) PutFile(path string, sourceFilename string) err
return err
}
- err = storage.bucket.PutReader(filepath.Join(storage.prefix, path), source, fi.Size(), "binary/octet-stream", storage.acl)
+ headers := map[string][]string{
+ "Content-Type": {"binary/octet-stream"},
+ }
+ if storage.storageClass != "" {
+ headers["x-amz-storage-class"] = []string{storage.storageClass}
+ }
+ if storage.encryptionMethod != "" {
+ headers["x-amz-server-side-encryption"] = []string{storage.encryptionMethod}
+ }
+
+ err = storage.bucket.PutReaderHeader(filepath.Join(storage.prefix, path), source, fi.Size(), headers, storage.acl)
if err != nil {
return fmt.Errorf("error uploading %s to %s: %s", sourceFilename, storage, err)
}
+
+ if storage.plusWorkaround && strings.Index(path, "+") != -1 {
+ return storage.PutFile(strings.Replace(path, "+", " ", -1), sourceFilename)
+ }
return nil
}
diff --git a/src/github.com/smira/aptly/s3/public_test.go b/src/github.com/smira/aptly/s3/public_test.go
index 8d54be3a..d2ab8ee0 100644
--- a/src/github.com/smira/aptly/s3/public_test.go
+++ b/src/github.com/smira/aptly/s3/public_test.go
@@ -24,10 +24,10 @@ func (s *PublishedStorageSuite) SetUpTest(c *C) {
c.Assert(s.srv, NotNil)
auth, _ := aws.GetAuth("aa", "bb")
- s.storage, err = NewPublishedStorageRaw(auth, aws.Region{Name: "test-1", S3Endpoint: s.srv.URL(), S3LocationConstraint: true}, "test", "", "")
+ s.storage, err = NewPublishedStorageRaw(auth, aws.Region{Name: "test-1", S3Endpoint: s.srv.URL(), S3LocationConstraint: true}, "test", "", "", "", "", false)
c.Assert(err, IsNil)
- s.prefixedStorage, err = NewPublishedStorageRaw(auth, aws.Region{Name: "test-1", S3Endpoint: s.srv.URL(), S3LocationConstraint: true}, "test", "", "lala")
+ s.prefixedStorage, err = NewPublishedStorageRaw(auth, aws.Region{Name: "test-1", S3Endpoint: s.srv.URL(), S3LocationConstraint: true}, "test", "", "lala", "", "", false)
c.Assert(err, IsNil)
err = s.storage.s3.Bucket("test").PutBucket("private")
@@ -39,7 +39,7 @@ func (s *PublishedStorageSuite) TearDownTest(c *C) {
}
func (s *PublishedStorageSuite) TestNewPublishedStorage(c *C) {
- stor, err := NewPublishedStorage("aa", "bbb", "", "", "", "")
+ stor, err := NewPublishedStorage("aa", "bbb", "", "", "", "", "", "", false)
c.Check(stor, IsNil)
c.Check(err, ErrorMatches, "unknown region: .*")
}
@@ -64,6 +64,25 @@ func (s *PublishedStorageSuite) TestPutFile(c *C) {
c.Check(data, DeepEquals, []byte("welcome to s3!"))
}
+func (s *PublishedStorageSuite) TestPutFilePlusWorkaround(c *C) {
+ s.storage.plusWorkaround = true
+
+ dir := c.MkDir()
+ err := ioutil.WriteFile(filepath.Join(dir, "a"), []byte("welcome to s3!"), 0644)
+ c.Assert(err, IsNil)
+
+ err = s.storage.PutFile("a/b+c.txt", filepath.Join(dir, "a"))
+ c.Check(err, IsNil)
+
+ data, err := s.storage.bucket.Get("a/b+c.txt")
+ c.Check(err, IsNil)
+ c.Check(data, DeepEquals, []byte("welcome to s3!"))
+
+ data, err = s.storage.bucket.Get("a/b c.txt")
+ c.Check(err, IsNil)
+ c.Check(data, DeepEquals, []byte("welcome to s3!"))
+}
+
func (s *PublishedStorageSuite) TestFilelist(c *C) {
paths := []string{"a", "b", "c", "testa", "test/a", "test/b", "lala/a", "lala/b", "lala/c"}
for _, path := range paths {
diff --git a/src/github.com/smira/aptly/system/files/aptly_passphrase.pub b/src/github.com/smira/aptly/system/files/aptly_passphrase.pub
new file mode 100644
index 00000000..ec24aa32
Binary files /dev/null and b/src/github.com/smira/aptly/system/files/aptly_passphrase.pub differ
diff --git a/src/github.com/smira/aptly/system/files/aptly_passphrase.sec b/src/github.com/smira/aptly/system/files/aptly_passphrase.sec
new file mode 100644
index 00000000..2ffe24ef
Binary files /dev/null and b/src/github.com/smira/aptly/system/files/aptly_passphrase.sec differ
diff --git a/src/github.com/smira/aptly/system/lib.py b/src/github.com/smira/aptly/system/lib.py
index a68d4cc2..e3e84f6a 100644
--- a/src/github.com/smira/aptly/system/lib.py
+++ b/src/github.com/smira/aptly/system/lib.py
@@ -155,6 +155,7 @@ class BaseTest(object):
if not hasattr(command, "__iter__"):
params = {
'files': os.path.join(os.path.dirname(inspect.getsourcefile(BaseTest)), "files"),
+ 'udebs': os.path.join(os.path.dirname(inspect.getsourcefile(BaseTest)), "udebs"),
'testfiles': os.path.join(os.path.dirname(inspect.getsourcefile(self.__class__)), self.__class__.__name__),
}
if self.fixtureWebServer:
@@ -195,17 +196,21 @@ class BaseTest(object):
self.verify_match(self.get_gold(), self.output, match_prepare=self.outputMatchPrepare)
except:
if self.captureResults:
+ if self.outputMatchPrepare is not None:
+ self.output = self.outputMatchPrepare(self.output)
with open(self.get_gold_filename(), "w") as f:
f.write(self.output)
else:
raise
def check_cmd_output(self, command, gold_name, match_prepare=None, expected_code=0):
+ output = self.run_cmd(command, expected_code=expected_code)
try:
- output = self.run_cmd(command, expected_code=expected_code)
self.verify_match(self.get_gold(gold_name), output, match_prepare)
except:
if self.captureResults:
+ if match_prepare is not None:
+ output = match_prepare(output)
with open(self.get_gold_filename(gold_name), "w") as f:
f.write(output)
else:
diff --git a/src/github.com/smira/aptly/system/run.py b/src/github.com/smira/aptly/system/run.py
index e11feea2..8f8819c9 100755
--- a/src/github.com/smira/aptly/system/run.py
+++ b/src/github.com/smira/aptly/system/run.py
@@ -8,6 +8,7 @@ import fnmatch
import sys
from lib import BaseTest
+from s3_lib import S3Test
try:
from termcolor import colored
@@ -32,7 +33,8 @@ def run(include_long_tests=False, capture_results=False, tests=None, filters=Non
for name in dir(testModule):
o = getattr(testModule, name)
- if not (inspect.isclass(o) and issubclass(o, BaseTest) and o is not BaseTest):
+ if not (inspect.isclass(o) and issubclass(o, BaseTest) and o is not BaseTest and
+ o is not S3Test):
continue
if filters:
diff --git a/src/github.com/smira/aptly/system/s3_lib.py b/src/github.com/smira/aptly/system/s3_lib.py
new file mode 100644
index 00000000..82f11be4
--- /dev/null
+++ b/src/github.com/smira/aptly/system/s3_lib.py
@@ -0,0 +1,78 @@
+from lib import BaseTest
+import uuid
+import os
+
+try:
+ import boto
+
+ if 'AWS_SECRET_ACCESS_KEY' in os.environ and 'AWS_ACCESS_KEY_ID' in os.environ:
+ s3_conn = boto.connect_s3()
+ else:
+ s3_conn = None
+except ImportError:
+ s3_conn = None
+
+
+class S3Test(BaseTest):
+ """
+ BaseTest + support for S3
+ """
+
+ def fixture_available(self):
+ return super(S3Test, self).fixture_available() and s3_conn is not None
+
+ def prepare(self):
+ self.bucket_name = "aptly-sys-test-" + str(uuid.uuid4())
+ self.bucket = s3_conn.create_bucket(self.bucket_name)
+ self.configOverride["S3PublishEndpoints"] = {
+ "test1": {
+ "region": "us-east-1",
+ "bucket": self.bucket_name,
+ }
+ }
+
+ super(S3Test, self).prepare()
+
+ def shutdown(self):
+ if hasattr(self, "bucket_name"):
+ if hasattr(self, "bucket"):
+ keys = self.bucket.list()
+ if keys:
+ self.bucket.delete_keys(keys)
+ s3_conn.delete_bucket(self.bucket_name)
+
+ super(S3Test, self).shutdown()
+
+ def check_path(self, path):
+ if not hasattr(self, "bucket_contents"):
+ self.bucket_contents = [key.name for key in self.bucket.list()]
+
+ if path.startswith("public/"):
+ path = path[7:]
+
+ if path in self.bucket_contents:
+ return True
+
+ if not path.endswith("/"):
+ path = path + "/"
+
+ for item in self.bucket_contents:
+ if item.startswith(path):
+ return True
+
+ return False
+
+ def check_exists(self, path):
+ if not self.check_path(path):
+ raise Exception("path %s doesn't exist" % (path, ))
+
+ def check_not_exists(self, path):
+ if self.check_path(path):
+ raise Exception("path %s exists" % (path, ))
+
+ def read_file(self, path):
+ if path.startswith("public/"):
+ path = path[7:]
+
+ key = self.bucket.get_key(path)
+ return key.get_contents_as_string()
diff --git a/src/github.com/smira/aptly/system/t01_version/VersionTest_gold b/src/github.com/smira/aptly/system/t01_version/VersionTest_gold
index 2593b4ad..b2155618 100644
--- a/src/github.com/smira/aptly/system/t01_version/VersionTest_gold
+++ b/src/github.com/smira/aptly/system/t01_version/VersionTest_gold
@@ -1 +1 @@
-aptly version: 0.7.1
+aptly version: 0.8
diff --git a/src/github.com/smira/aptly/system/t03_help/MainHelpTest_gold b/src/github.com/smira/aptly/system/t03_help/MainHelpTest_gold
index 72fa545e..0c42fb04 100644
--- a/src/github.com/smira/aptly/system/t03_help/MainHelpTest_gold
+++ b/src/github.com/smira/aptly/system/t03_help/MainHelpTest_gold
@@ -4,9 +4,9 @@ upgrade individual packages, take snapshots and publish them
back as Debian repositories.
aptly's goal is to establish repeatability and controlled changes
-in a package-centric environment. aptly allows to fix a set of packages
+in a package-centric environment. aptly allows one to fix a set of packages
in a repository, so that package installation and upgrade becomes
-deterministic. At the same time aptly allows to perform controlled,
+deterministic. At the same time aptly allows one to perform controlled,
fine-grained changes in repository contents to transition your
package environment to new version.
diff --git a/src/github.com/smira/aptly/system/t03_help/MainTest_gold b/src/github.com/smira/aptly/system/t03_help/MainTest_gold
index 96676be4..b468f99b 100644
--- a/src/github.com/smira/aptly/system/t03_help/MainTest_gold
+++ b/src/github.com/smira/aptly/system/t03_help/MainTest_gold
@@ -5,6 +5,7 @@ Commands:
db manage aptly's internal database and package pool
graph render graph of relationships
mirror manage mirrors of remote repositories
+ package operations on packages
publish manage published repositories
repo manage local package repositories
serve HTTP serve published repositories
diff --git a/src/github.com/smira/aptly/system/t03_help/MirrorCreateHelpTest_gold b/src/github.com/smira/aptly/system/t03_help/MirrorCreateHelpTest_gold
index efde9452..9a37486e 100644
--- a/src/github.com/smira/aptly/system/t03_help/MirrorCreateHelpTest_gold
+++ b/src/github.com/smira/aptly/system/t03_help/MirrorCreateHelpTest_gold
@@ -1,7 +1,7 @@
Usage: aptly mirror create [ ...]
Creates mirror of remote repository, aptly supports both regular and flat Debian repositories exported
-via HTTP. aptly would try download Release file from remote repository and verify its' signature. Command
+via HTTP and FTP. aptly would try download Release file from remote repository and verify its' signature. Command
line format resembles apt utlitily sources.list(5).
PPA urls could specified in short format:
@@ -24,4 +24,5 @@ Options:
-ignore-signatures=false: disable verification of Release file signatures
-keyring=: gpg keyring to use when verifying Release file (could be specified multiple times)
-with-sources=false: download source packages in addition to binary packages
+ -with-udebs=false: download .udeb packages (Debian installer support)
diff --git a/src/github.com/smira/aptly/system/t03_help/MirrorCreateTest_gold b/src/github.com/smira/aptly/system/t03_help/MirrorCreateTest_gold
index dcb524ce..d696eb5d 100644
--- a/src/github.com/smira/aptly/system/t03_help/MirrorCreateTest_gold
+++ b/src/github.com/smira/aptly/system/t03_help/MirrorCreateTest_gold
@@ -15,4 +15,5 @@ Options:
-ignore-signatures=false: disable verification of Release file signatures
-keyring=: gpg keyring to use when verifying Release file (could be specified multiple times)
-with-sources=false: download source packages in addition to binary packages
+ -with-udebs=false: download .udeb packages (Debian installer support)
ERROR: unable to parse command
diff --git a/src/github.com/smira/aptly/system/t03_help/MirrorHelpTest_gold b/src/github.com/smira/aptly/system/t03_help/MirrorHelpTest_gold
index c84e943d..6cefc10e 100644
--- a/src/github.com/smira/aptly/system/t03_help/MirrorHelpTest_gold
+++ b/src/github.com/smira/aptly/system/t03_help/MirrorHelpTest_gold
@@ -4,9 +4,10 @@ Commands:
create create new mirror
drop delete mirror
- edit edit properties of mirorr
+ edit edit mirror settings
list list mirrors
rename renames mirror
+ search search mirror for packages matching query
show show details about mirror
update update mirror
diff --git a/src/github.com/smira/aptly/system/t03_help/MirrorTest_gold b/src/github.com/smira/aptly/system/t03_help/MirrorTest_gold
index e0adb074..cf149c99 100644
--- a/src/github.com/smira/aptly/system/t03_help/MirrorTest_gold
+++ b/src/github.com/smira/aptly/system/t03_help/MirrorTest_gold
@@ -4,9 +4,10 @@ Commands:
create create new mirror
drop delete mirror
- edit edit properties of mirorr
+ edit edit mirror settings
list list mirrors
rename renames mirror
+ search search mirror for packages matching query
show show details about mirror
update update mirror
diff --git a/src/github.com/smira/aptly/system/t03_help/WrongFlagTest_gold b/src/github.com/smira/aptly/system/t03_help/WrongFlagTest_gold
index 738bf59c..a6df4f0e 100644
--- a/src/github.com/smira/aptly/system/t03_help/WrongFlagTest_gold
+++ b/src/github.com/smira/aptly/system/t03_help/WrongFlagTest_gold
@@ -16,4 +16,5 @@ Options:
-ignore-signatures=false: disable verification of Release file signatures
-keyring=: gpg keyring to use when verifying Release file (could be specified multiple times)
-with-sources=false: download source packages in addition to binary packages
+ -with-udebs=false: download .udeb packages (Debian installer support)
ERROR: unable to parse flags
diff --git a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror11Test_mirror_show b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror11Test_mirror_show
index 22eabff4..522449e3 100644
--- a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror11Test_mirror_show
+++ b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror11Test_mirror_show
@@ -4,6 +4,7 @@ Distribution: squeeze
Components: main, contrib, non-free
Architectures: amd64, armel, i386, ia64, kfreebsd-amd64, kfreebsd-i386, mips, mipsel, powerpc, s390, sparc
Download Sources: no
+Download .udebs: no
Last update: never
Information from release file:
diff --git a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror13Test_mirror_show b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror13Test_mirror_show
index d9eee928..1a012184 100644
--- a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror13Test_mirror_show
+++ b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror13Test_mirror_show
@@ -4,6 +4,7 @@ Distribution: wheezy
Components: main, contrib, non-free
Architectures: amd64, armel, armhf, i386, ia64, kfreebsd-amd64, kfreebsd-i386, mips, mipsel, powerpc, s390, s390x, sparc
Download Sources: no
+Download .udebs: no
Last update: never
Information from release file:
diff --git a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror14Test_mirror_show b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror14Test_mirror_show
index 2789c252..8f479d62 100644
--- a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror14Test_mirror_show
+++ b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror14Test_mirror_show
@@ -4,6 +4,7 @@ Distribution: ./
Components:
Architectures:
Download Sources: no
+Download .udebs: no
Last update: never
Information from release file:
diff --git a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror17Test_mirror_show b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror17Test_mirror_show
index 3e6e75d4..816e61d5 100644
--- a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror17Test_mirror_show
+++ b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror17Test_mirror_show
@@ -4,6 +4,7 @@ Distribution: wheezy
Components: main, contrib, non-free
Architectures: i386
Download Sources: yes
+Download .udebs: no
Last update: never
Information from release file:
diff --git a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror18Test_mirror_show b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror18Test_mirror_show
index abd2a7d1..d2d32be5 100644
--- a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror18Test_mirror_show
+++ b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror18Test_mirror_show
@@ -4,6 +4,7 @@ Distribution: maverick
Components: main
Architectures: amd64, armel, i386, powerpc
Download Sources: no
+Download .udebs: no
Last update: never
Information from release file:
diff --git a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror19Test_mirror_show b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror19Test_mirror_show
index 52bf55df..c4425802 100644
--- a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror19Test_mirror_show
+++ b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror19Test_mirror_show
@@ -4,17 +4,16 @@ Distribution: wheezy/updates
Components: main
Architectures: i386
Download Sources: yes
+Download .udebs: no
Last update: never
Information from release file:
Architectures: amd64 armel armhf i386 ia64 kfreebsd-amd64 kfreebsd-i386 mips mipsel powerpc s390 s390x sparc
Codename: wheezy
Components: updates/main updates/contrib updates/non-free
-Date: Tue, 11 Mar 2014 21:11:28 UTC
Description: Debian 7.0 Security Updates
Label: Debian-Security
Origin: Debian
Suite: stable
-Valid-Until: Fri, 21 Mar 2014 21:11:28 UTC
Version: 7.0
diff --git a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror1Test_mirror_show b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror1Test_mirror_show
index d5542dde..94f4085f 100644
--- a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror1Test_mirror_show
+++ b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror1Test_mirror_show
@@ -4,6 +4,7 @@ Distribution: wheezy
Components: main, contrib, non-free
Architectures: amd64, armel, armhf, i386, ia64, kfreebsd-amd64, kfreebsd-i386, mips, mipsel, powerpc, s390, s390x, sparc
Download Sources: no
+Download .udebs: no
Last update: never
Information from release file:
diff --git a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror20Test_gold b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror20Test_gold
index 906b8422..053cfec4 100644
--- a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror20Test_gold
+++ b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror20Test_gold
@@ -1,3 +1,3 @@
Downloading http://security.debian.org/dists/wheezy/updates/InRelease...
Downloading http://security.debian.org/dists/wheezy/updates/Release...
-ERROR: unable to fetch mirror: Get http://security.debian.org/dists/wheezy/updates/Release: http: error connecting to proxy http://127.0.0.1:3137: dial tcp 127.0.0.1:3137: connection refused
+ERROR: unable to fetch mirror: http://security.debian.org/dists/wheezy/updates/Release: Get http://security.debian.org/dists/wheezy/updates/Release: http: error connecting to proxy http://127.0.0.1:3137: dial tcp 127.0.0.1:3137: connection refused
diff --git a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror21Test_mirror_show b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror21Test_mirror_show
index adfb7ff9..385432d3 100644
--- a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror21Test_mirror_show
+++ b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror21Test_mirror_show
@@ -4,10 +4,11 @@ Distribution: ./binary/
Components:
Architectures:
Download Sources: no
+Download .udebs: no
Last update: never
Information from release file:
Architectures: all
-Date: Wed, 30 Jul 2014 15:23:01 UTC
+Date: Wed, 01 Oct 2014 18:30:34 UTC
Origin: jenkins-ci.org
Suite: binary
diff --git a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror22Test_mirror_show b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror22Test_mirror_show
index add4d654..8b9e103d 100644
--- a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror22Test_mirror_show
+++ b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror22Test_mirror_show
@@ -4,6 +4,7 @@ Distribution: wheezy/updates
Components: main
Architectures: amd64, armel, armhf, i386, ia64, kfreebsd-amd64, kfreebsd-i386, mips, mipsel, powerpc, s390, s390x, sparc
Download Sources: no
+Download .udebs: no
Filter: nginx | Priority (required)
Filter With Deps: no
Last update: never
@@ -12,11 +13,9 @@ Information from release file:
Architectures: amd64 armel armhf i386 ia64 kfreebsd-amd64 kfreebsd-i386 mips mipsel powerpc s390 s390x sparc
Codename: wheezy
Components: updates/main updates/contrib updates/non-free
-Date: Sun, 13 Jul 2014 12:12:08 UTC
Description: Debian 7.0 Security Updates
Label: Debian-Security
Origin: Debian
Suite: stable
-Valid-Until: Wed, 23 Jul 2014 12:12:08 UTC
Version: 7.0
diff --git a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror24Test_gold b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror24Test_gold
new file mode 100644
index 00000000..7fc9d2b4
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror24Test_gold
@@ -0,0 +1,6 @@
+Downloading http://security.debian.org/dists/wheezy/updates/InRelease...
+gpgv: RSA key ID 46925553
+gpgv: Good signature from "Debian Archive Automatic Signing Key (7.0/wheezy) "
+
+Mirror [mirror24]: http://security.debian.org/ wheezy/updates successfully added.
+You can run 'aptly mirror update mirror24' to download repository contents.
diff --git a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror25Test_gold b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror25Test_gold
new file mode 100644
index 00000000..6eab7a88
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror25Test_gold
@@ -0,0 +1,4 @@
+Downloading http://mirror.yandex.ru/debian/dists/wheezy/Release...
+
+Mirror [mirror25]: http://mirror.yandex.ru/debian/ wheezy [udeb] successfully added.
+You can run 'aptly mirror update mirror25' to download repository contents.
diff --git a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror25Test_mirror_show b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror25Test_mirror_show
new file mode 100644
index 00000000..7f5a17eb
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror25Test_mirror_show
@@ -0,0 +1,20 @@
+Name: mirror25
+Archive Root URL: http://mirror.yandex.ru/debian/
+Distribution: wheezy
+Components: main, contrib, non-free
+Architectures: i386
+Download Sources: no
+Download .udebs: yes
+Last update: never
+
+Information from release file:
+Architectures: amd64 armel armhf i386 ia64 kfreebsd-amd64 kfreebsd-i386 mips mipsel powerpc s390 s390x sparc
+Codename: wheezy
+Components: main contrib non-free
+Date: Sat, 12 Jul 2014 10:59:25 UTC
+Description: Debian 7.6 Released 12 July 2014
+
+Label: Debian
+Origin: Debian
+Suite: stable
+Version: 7.6
diff --git a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror26Test_gold b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror26Test_gold
new file mode 100644
index 00000000..97027669
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror26Test_gold
@@ -0,0 +1 @@
+ERROR: unable to create mirror: debian-installer udebs aren't supported for flat repos
diff --git a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror2Test_mirror_show b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror2Test_mirror_show
index 183348a4..60c7d9de 100644
--- a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror2Test_mirror_show
+++ b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror2Test_mirror_show
@@ -4,6 +4,7 @@ Distribution: wheezy
Components: main
Architectures: amd64, armel, armhf, i386, ia64, kfreebsd-amd64, kfreebsd-i386, mips, mipsel, powerpc, s390, s390x, sparc
Download Sources: no
+Download .udebs: no
Last update: never
Information from release file:
diff --git a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror3Test_mirror_show b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror3Test_mirror_show
index 804abb9e..5586b8b2 100644
--- a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror3Test_mirror_show
+++ b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror3Test_mirror_show
@@ -4,6 +4,7 @@ Distribution: wheezy
Components: main, contrib
Architectures: i386, amd64
Download Sources: no
+Download .udebs: no
Last update: never
Information from release file:
diff --git a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror7Test_mirror_show b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror7Test_mirror_show
index c53b3f5c..9f0029af 100644
--- a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror7Test_mirror_show
+++ b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror7Test_mirror_show
@@ -4,6 +4,7 @@ Distribution: wheezy
Components: main, contrib
Architectures: i386, amd64
Download Sources: no
+Download .udebs: no
Last update: never
Information from release file:
diff --git a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror9Test_mirror_show b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror9Test_mirror_show
index e6d63aa5..1243bde1 100644
--- a/src/github.com/smira/aptly/system/t04_mirror/CreateMirror9Test_mirror_show
+++ b/src/github.com/smira/aptly/system/t04_mirror/CreateMirror9Test_mirror_show
@@ -4,6 +4,7 @@ Distribution: squeeze-backports
Components: main, contrib, non-free
Architectures: amd64, armel, i386, ia64, kfreebsd-amd64, kfreebsd-i386, mips, mipsel, powerpc, s390, sparc
Download Sources: no
+Download .udebs: no
Last update: never
Information from release file:
@@ -11,11 +12,9 @@ Architectures: amd64 armel i386 ia64 kfreebsd-amd64 kfreebsd-i386 mips mipsel po
ButAutomaticUpgrades: yes
Codename: squeeze-backports
Components: main contrib non-free
-Date: Fri, 07 Feb 2014 02:56:49 UTC
Description: Backports for the Squeeze Distribution
Label: Debian Backports
NotAutomatic: yes
Origin: Debian Backports
Suite: squeeze-backports
-Valid-Until: Fri, 14 Feb 2014 02:56:49 UTC
diff --git a/src/github.com/smira/aptly/system/t04_mirror/EditMirror1Test_gold b/src/github.com/smira/aptly/system/t04_mirror/EditMirror1Test_gold
index 359dc7ac..7882ef07 100644
--- a/src/github.com/smira/aptly/system/t04_mirror/EditMirror1Test_gold
+++ b/src/github.com/smira/aptly/system/t04_mirror/EditMirror1Test_gold
@@ -1 +1 @@
-Mirror [wheezy-main]: http://mirror.yandex.ru/debian/ wheezy successfully updated.
+Mirror [wheezy-main]: http://mirror.yandex.ru/debian/ wheezy [src] successfully updated.
diff --git a/src/github.com/smira/aptly/system/t04_mirror/EditMirror1Test_mirror_show b/src/github.com/smira/aptly/system/t04_mirror/EditMirror1Test_mirror_show
index 0090012c..f934ffc9 100644
--- a/src/github.com/smira/aptly/system/t04_mirror/EditMirror1Test_mirror_show
+++ b/src/github.com/smira/aptly/system/t04_mirror/EditMirror1Test_mirror_show
@@ -3,10 +3,10 @@ Archive Root URL: http://mirror.yandex.ru/debian/
Distribution: wheezy
Components: main
Architectures: i386, amd64
-Download Sources: no
+Download Sources: yes
+Download .udebs: no
Filter: nginx
Filter With Deps: yes
-Last update: 2014-06-28 01:23:25 MSK
Number of packages: 56121
Information from release file:
diff --git a/src/github.com/smira/aptly/system/t04_mirror/EditMirror3Test_mirror_show b/src/github.com/smira/aptly/system/t04_mirror/EditMirror3Test_mirror_show
index 59b134fc..d3348f0c 100644
--- a/src/github.com/smira/aptly/system/t04_mirror/EditMirror3Test_mirror_show
+++ b/src/github.com/smira/aptly/system/t04_mirror/EditMirror3Test_mirror_show
@@ -4,7 +4,7 @@ Distribution: wheezy
Components: main
Architectures: i386, amd64
Download Sources: no
-Last update: 2014-06-28 01:23:25 MSK
+Download .udebs: no
Number of packages: 56121
Information from release file:
diff --git a/src/github.com/smira/aptly/system/t04_mirror/EditMirror5Test_mirror_show b/src/github.com/smira/aptly/system/t04_mirror/EditMirror5Test_mirror_show
index 535f67b8..8790d809 100644
--- a/src/github.com/smira/aptly/system/t04_mirror/EditMirror5Test_mirror_show
+++ b/src/github.com/smira/aptly/system/t04_mirror/EditMirror5Test_mirror_show
@@ -4,17 +4,16 @@ Distribution: wheezy/updates
Components: main
Architectures: amd64, armel, armhf, i386, ia64, kfreebsd-amd64, kfreebsd-i386, mips, mipsel, powerpc, s390, s390x, sparc
Download Sources: no
+Download .udebs: no
Last update: never
Information from release file:
Architectures: amd64 armel armhf i386 ia64 kfreebsd-amd64 kfreebsd-i386 mips mipsel powerpc s390 s390x sparc
Codename: wheezy
Components: updates/main updates/contrib updates/non-free
-Date: Fri, 25 Jul 2014 03:31:55 UTC
Description: Debian 7.0 Security Updates
Label: Debian-Security
Origin: Debian
Suite: stable
-Valid-Until: Mon, 04 Aug 2014 03:31:55 UTC
Version: 7.0
diff --git a/src/github.com/smira/aptly/system/t04_mirror/EditMirror6Test_gold b/src/github.com/smira/aptly/system/t04_mirror/EditMirror6Test_gold
new file mode 100644
index 00000000..2a8ac06c
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t04_mirror/EditMirror6Test_gold
@@ -0,0 +1,2 @@
+Downloading http://mirror.yandex.ru/debian/dists/wheezy/Release...
+Mirror [wheezy-main]: http://mirror.yandex.ru/debian/ wheezy successfully updated.
diff --git a/src/github.com/smira/aptly/system/t04_mirror/EditMirror6Test_mirror_show b/src/github.com/smira/aptly/system/t04_mirror/EditMirror6Test_mirror_show
new file mode 100644
index 00000000..3f448097
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t04_mirror/EditMirror6Test_mirror_show
@@ -0,0 +1,20 @@
+Name: wheezy-main
+Archive Root URL: http://mirror.yandex.ru/debian/
+Distribution: wheezy
+Components: main
+Architectures: amd64, s390
+Download Sources: no
+Download .udebs: no
+Number of packages: 56121
+
+Information from release file:
+Architectures: amd64 armel armhf i386 ia64 kfreebsd-amd64 kfreebsd-i386 mips mipsel powerpc s390 s390x sparc
+Codename: wheezy
+Components: main contrib non-free
+Date: Sat, 12 Jul 2014 10:59:25 UTC
+Description: Debian 7.6 Released 12 July 2014
+
+Label: Debian
+Origin: Debian
+Suite: stable
+Version: 7.6
diff --git a/src/github.com/smira/aptly/system/t04_mirror/EditMirror7Test_gold b/src/github.com/smira/aptly/system/t04_mirror/EditMirror7Test_gold
new file mode 100644
index 00000000..04552006
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t04_mirror/EditMirror7Test_gold
@@ -0,0 +1,2 @@
+Downloading http://mirror.yandex.ru/debian/dists/wheezy/Release...
+ERROR: unable to edit: architecture x56 not available in repo [wheezy-main]: http://mirror.yandex.ru/debian/ wheezy
diff --git a/src/github.com/smira/aptly/system/t04_mirror/EditMirror8Test_gold b/src/github.com/smira/aptly/system/t04_mirror/EditMirror8Test_gold
new file mode 100644
index 00000000..1291476b
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t04_mirror/EditMirror8Test_gold
@@ -0,0 +1 @@
+Mirror [wheezy-main]: http://mirror.yandex.ru/debian/ wheezy [udeb] successfully updated.
diff --git a/src/github.com/smira/aptly/system/t04_mirror/EditMirror8Test_mirror_show b/src/github.com/smira/aptly/system/t04_mirror/EditMirror8Test_mirror_show
new file mode 100644
index 00000000..3aa03131
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t04_mirror/EditMirror8Test_mirror_show
@@ -0,0 +1,20 @@
+Name: wheezy-main
+Archive Root URL: http://mirror.yandex.ru/debian/
+Distribution: wheezy
+Components: main
+Architectures: i386, amd64
+Download Sources: no
+Download .udebs: yes
+Number of packages: 56121
+
+Information from release file:
+Architectures: amd64 armel armhf i386 ia64 kfreebsd-amd64 kfreebsd-i386 mips mipsel powerpc s390 s390x sparc
+Codename: wheezy
+Components: main contrib non-free
+Date: Sat, 26 Apr 2014 09:27:11 UTC
+Description: Debian 7.5 Released 26 April 2014
+
+Label: Debian
+Origin: Debian
+Suite: stable
+Version: 7.5
diff --git a/src/github.com/smira/aptly/system/t04_mirror/EditMirror9Test_gold b/src/github.com/smira/aptly/system/t04_mirror/EditMirror9Test_gold
new file mode 100644
index 00000000..a2e1e5a4
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t04_mirror/EditMirror9Test_gold
@@ -0,0 +1 @@
+ERROR: unable to edit: flat mirrors don't support udebs
diff --git a/src/github.com/smira/aptly/system/t04_mirror/SearchMirror1Test_gold b/src/github.com/smira/aptly/system/t04_mirror/SearchMirror1Test_gold
new file mode 100644
index 00000000..52405682
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t04_mirror/SearchMirror1Test_gold
@@ -0,0 +1,4043 @@
+
+aolserver4-dev_4.5.1-15.1_i386
+apache2-prefork-dev_2.2.22-13+deb7u1_i386
+apache2-threaded-dev_2.2.22-13+deb7u1_i386
+apcalc-dev_2.12.4.4-3_i386
+aplus-fsf-dev_4.22.1-6_i386
+aroarfw-dev_0.1~beta4-5_all
+asterisk-dev_1:1.8.13.1~dfsg1-3+deb7u3_all
+atfs-dev_1.4pl6-11_i386
+audacious-dev_3.2.4-1_i386
+autotools-dev_20120608.1_all
+binutils-dev_2.22-8_i386
+biosquid-dev_1.9g+cvs20050121-2_i386
+bitlbee-dev_3.0.5-1.2_all
+blacs-pvm-dev_1.1-21_i386
+blends-dev_0.6.16.2_all
+blktap-dev_2.0.90-1_i386
+blt-dev_2.4z-4.2_i386
+boinc-dev_7.0.27+dfsg-5_i386
+boolstuff-dev_0.1.12-3_i386
+cairo-dock-dev_3.0.0-2+deb7u1_i386
+cernlib-base-dev_20061220+dfsg3-2_all
+cernlib-core-dev_20061220+dfsg3-2_all
+chipmunk-dev_5.3.4-1_i386
+cimg-dev_1.4.9-2_all
+clearsilver-dev_0.10.5-1.3_i386
+cli-common-dev_0.8.2_all
+clinica-dev_0.2.1~dfsg-1_i386
+clisp-dev_1:2.49-8.1_i386
+cluster-glue-dev_1.0.9+hg2665-1_i386
+codeblocks-dev_10.05-2.1_i386
+coinor-libcbc-dev_2.5.0-3_i386
+coinor-libcgl-dev_0.55.0-1.1_i386
+coinor-libclp-dev_1.12.0-2.1_i386
+coinor-libcoinutils-dev_2.6.4-3_i386
+coinor-libdylp-dev_1.6.0-1.1_i386
+coinor-libflopc++-dev_1.0.6-3.1_i386
+coinor-libipopt-dev_3.10.2-1.1_i386
+coinor-libosi-dev_0.103.0-1_i386
+coinor-libsymphony-dev_5.2.4-1.2_i386
+coinor-libvol-dev_1.1.7-1_i386
+collectd-dev_5.1.0-3_all
+comerr-dev_2.1-1.42.5-1.1_i386
+condor-dev_7.8.2~dfsg.1-1+deb7u1_i386
+config-package-dev_4.13_all
+connman-dev_1.0-1.1+wheezy1+b1_i386
+console-tools-dev_1:0.2.3dbs-70_i386
+coop-computing-tools-dev_3.5.1-2_i386
+corosync-dev_1.4.2-3_i386
+courier-authlib-dev_0.63.0-6+b1_i386
+crtmpserver-dev_1.0~dfsg-3_i386
+ctapi-dev_1.1_all
+ctn-dev_3.0.6-13+b2_i386
+cyrus-dev_2.4.16-4+deb7u1_all
+dcap-dev_2.47.6-2_i386
+dico-dev_2.1-3+b2_i386
+dictionaries-common-dev_1.12.11_all
+dietlibc-dev_0.33~cvs20120325-4_i386
+dolfin-dev_1.0.0-7_all
+dovecot-dev_1:2.1.7-7_i386
+dpkg-dev_1.16.12_all
+drac-dev_1.12-7.2_i386
+drizzle-plugin-dev_1:7.1.36-stable-1_i386
+dssi-dev_1.1.1~dfsg0-1_all
+e2fslibs-dev_1.42.5-1.1_i386
+emerillon-dev_0.1.90-1_i386
+eog-dev_3.4.2-1+build1_all
+epiphany-browser-dev_3.4.2-2.1_i386
+erlang-dev_1:15.b.1-dfsg-4+deb7u1_i386
+erlang-esdl-dev_1.2-2_all
+etl-dev_0.04.15-1_i386
+evolution-data-server-dev_3.4.4-3_i386
+evolution-dev_3.4.4-3_i386
+exim4-dev_4.80-7_i386
+expect-dev_5.45-2_i386
+expeyes-firmware-dev_2.0.0-3_all
+extremetuxracer-gimp-dev_0.4-5_all
+falconpl-dev_0.9.6.9-git20120606-2_i386
+fatrat-dev_1.1.3-5_all
+fcitx-libs-dev_1:4.2.4.1-7_i386
+fenix-dev_0.92a.dfsg1-9_all
+festival-dev_1:2.1~release-5.1_i386
+fftw-dev_2.1.5-1_i386
+finch-dev_2.10.9-1~deb7u1_all
+firebird-dev_2.5.2.26540.ds4-1~deb7u1_i386
+flite1-dev_1.4-release-6_i386
+flow-tools-dev_1:0.68-12.1+b1_i386
+fosfat-dev_0.4.0-3_i386
+freeglut3-dev_2.6.0-4_i386
+freetds-dev_0.91-2+deb7u1_i386
+frei0r-plugins-dev_1.1.22git20091109-1.2_i386
+ftgl-dev_2.1.3~rc5-4_all
+ftplib-dev_3.1-1-9_i386
+gambas3-dev_3.1.1-2+b1_i386
+gap-dev_4r4p12-2_i386
+gauche-dev_0.9.1-5.1_i386
+gcc-4.6-plugin-dev_4.6.3-14_i386
+gcc-4.7-plugin-dev_4.7.2-5_i386
+gcin-dev_2.7.6.1+dfsg-1_all
+gedit-dev_3.4.2-1_all
+gem-dev_1:0.93.3-5_all
+genius-dev_1.0.14-1_i386
+gfxboot-dev_4.5.0-3_i386
+giblib-dev_1.2.4-8_i386
+glabels-dev_3.0.0-3+b1_i386
+glee-dev_5.4.0-1_i386
+gmpc-dev_11.8.16-6_i386
+gnash-dev_0.8.11~git20120629-1+deb7u1_i386
+gnome-control-center-dev_1:3.4.3.1-2_all
+gnome-settings-daemon-dev_3.4.2+git20121218.7c1322-3+deb7u3_i386
+gnome-video-effects-dev_0.4.0-1_all
+gnumach-dev_2:1.3.99.dfsg.git20120610-1_i386
+gnunet-dev_0.9.3-7_i386
+gnunet-gtk-dev_0.9.3-1_i386
+gnuradio-dev_3.5.3.2-1_i386
+gosa-dev_2.7.4-4.3~deb7u1_all
+gpe-ownerinfo-dev_0.28-3_i386
+gpsim-dev_0.26.1-2.1_i386
+graphviz-dev_2.26.3-14+deb7u1_all
+grass-dev_6.4.2-2_i386
+gridengine-drmaa-dev_6.2u5-7.1_i386
+gromacs-dev_4.5.5-2_i386
+gsettings-desktop-schemas-dev_3.4.2-3_i386
+gthumb-dev_3:3.0.1-2_i386
+guile-1.6-dev_1.6.8-10.3_i386
+guile-1.8-dev_1.8.8+1-8_i386
+guile-2.0-dev_2.0.5+1-3_i386
+guile-cairo-dev_1.4.0-3_i386
+heartbeat-dev_1:3.0.5-3_i386
+heimdal-dev_1.6~git20120403+dfsg1-2_i386
+hime-dev_0.9.9+git20120619+dfsg-1_all
+hybrid-dev_1:7.2.2.dfsg.2-10_all
+icedove-dev_10.0.12-1_i386
+inn2-dev_2.5.3-3_i386
+inventor-dev_2.1.5-10-16_i386
+iproute-dev_20120521-3+b3_i386
+iptables-dev_1.4.14-3.1_i386
+irssi-dev_0.8.15-5_i386
+isc-dhcp-dev_4.2.2.dfsg.1-5+deb70u6_i386
+itcl3-dev_3.4.1-1_i386
+itk3-dev_3.3-4_i386
+ivtools-dev_1.2.10a1-1_i386
+kadu-dev_0.11.2-1_all
+kannel-dev_1.4.3-2+b2_i386
+kde-workspace-dev_4:4.8.4-6_i386
+kdebase-workspace-dev_4:4.8.4-6_all
+kdelibs5-dev_4:4.8.4-4_i386
+kdemultimedia-dev_4:4.8.4-2_i386
+kdepimlibs5-dev_4:4.8.4-2_i386
+kdevelop-dev_4:4.3.1-3+b1_i386
+kdevplatform-dev_1.3.1-2_i386
+kmymoney-dev_4.6.2-3.2_i386
+konwert-dev_1.8-11.2_all
+lam4-dev_7.1.4-3_i386
+lesstif2-dev_1:0.95.2-1.1_i386
+lib3ds-dev_1.3.0-6_i386
+lib4store-dev_1.1.4-2_i386
+lib64bz2-dev_1.0.6-4_i386
+lib64expat1-dev_2.1.0-1+deb7u1_i386
+lib64ffi-dev_3.0.10-3_i386
+lib64ncurses5-dev_5.9-10_i386
+lib64readline-gplv2-dev_5.2+dfsg-2~deb7u1_i386
+lib64readline6-dev_6.2+dfsg-0.1_i386
+lib64z1-dev_1:1.2.7.dfsg-13_i386
+liba52-0.7.4-dev_0.7.4-16_i386
+libaa1-dev_1.4p5-40_i386
+libaac-tactics-ocaml-dev_0.2.pl2-7_i386
+libaacs-dev_0.4.0-1_i386
+libaal-dev_1.0.5-5.1_i386
+libabiword-2.9-dev_2.9.2+svn20120603-8_i386
+libaccountsservice-dev_0.6.21-8_i386
+libace-dev_6.0.3+dfsg-0.1_i386
+libace-flreactor-dev_6.0.3+dfsg-0.1_i386
+libace-foxreactor-dev_6.0.3+dfsg-0.1_i386
+libace-htbp-dev_6.0.3+dfsg-0.1_i386
+libace-inet-dev_6.0.3+dfsg-0.1_i386
+libace-inet-ssl-dev_6.0.3+dfsg-0.1_i386
+libace-qtreactor-dev_6.0.3+dfsg-0.1_i386
+libace-rmcast-dev_6.0.3+dfsg-0.1_i386
+libace-ssl-dev_6.0.3+dfsg-0.1_i386
+libace-tkreactor-dev_6.0.3+dfsg-0.1_i386
+libace-tmcast-dev_6.0.3+dfsg-0.1_i386
+libace-xtreactor-dev_6.0.3+dfsg-0.1_i386
+libacexml-dev_6.0.3+dfsg-0.1_i386
+libacl1-dev_2.2.51-8_i386
+libacpi-dev_0.2-4_i386
+libacr38ucontrol-dev_1.7.11-1_i386
+libadasockets4-dev_1.8.10-2_i386
+libaddresses-dev_0.4.7-1+b5_i386
+libaddressview-dev_0.4.7-1+b5_i386
+libadios-dev_1.3-11_i386
+libadminutil-dev_1.1.15-1_i386
+libadns1-dev_1.4-2_i386
+libadolc-dev_2.3.0-1_i386
+libadplug-dev_2.2.1+dfsg3-0.1_i386
+libafflib-dev_3.6.6-1.1+b1_i386
+libafrodite-0.12-dev_0.12.1-3_i386
+libafterimage-dev_2.2.11-7_i386
+libagg-dev_2.5+dfsg1-8_i386
+libagrep-ocaml-dev_1.0-11+b3_i386
+libahven3-dev_2.1-4_i386
+libaiksaurus-1.2-dev_1.2.1+dev-0.12-6.1_i386
+libaiksaurusgtk-1.2-dev_1.2.1+dev-0.12-6.1_i386
+libaio-dev_0.3.109-3_i386
+libakonadi-dev_1.7.2-3_i386
+libalberta2-dev_2.0.1-5_i386
+libaldmb1-dev_1:0.9.3-5.4_i386
+libalglib-dev_2.6.0-6_i386
+libalkimia-dev_4.3.2-1.1_i386
+liballeggl4-dev_2:4.4.2-2.1_i386
+liballegro4.2-dev_2:4.4.2-2.1_i386
+libalog0.4.1-base-dev_0.4.1-2_i386
+libalog0.4.1-full-dev_0.4.1-2_i386
+libalsa-ocaml-dev_0.2.1-1+b1_i386
+libalsaplayer-dev_0.99.80-5.1_i386
+libalure-dev_1.2-6_i386
+libalut-dev_1.1.0-3_i386
+libampsharp-cil-dev_2.0.4-2_all
+libamu-dev_6.2+rc20110530-3_i386
+libanalitza-dev_4:4.8.4-2_i386
+libanet0.1-dev_0.1-3_i386
+libanjuta-dev_2:3.4.3-1_i386
+libann-dev_1.1.2+doc-3_i386
+libanthy-dev_9100h-16_i386
+libantlr-dev_2.7.7+dfsg-4_i386
+libantlr3c-dev_3.2-2_i386
+libao-dev_1.1.0-2_i386
+libao-ocaml-dev_0.2.0-1+b2_i386
+libaosd-dev_0.2.7-1_i386
+libapache2-mod-perl2-dev_2.0.7-3_all
+libapertium3-3.1-0-dev_3.1.0-2_i386
+libapm-dev_3.2.2-14_i386
+libapol-dev_3.3.7-3_i386
+libapparmor-dev_2.7.103-4_i386
+libappindicator-dev_0.4.92-2_i386
+libappindicator0.1-cil-dev_0.4.92-2_all
+libappindicator3-dev_0.4.92-2_i386
+libapq-postgresql3.2.0-dev_3.2.0-2_i386
+libapq3.2.0-dev_3.2.0-1_i386
+libapr-memcache-dev_0.7.0-1_i386
+libapr1-dev_1.4.6-3+deb7u1_i386
+libapreq2-dev_2.13-1+b2_i386
+libapron-dev_0.9.10-5.2_all
+libapron-ocaml-dev_0.9.10-5.2+b3_i386
+libaprutil1-dev_1.4.1-3_i386
+libapt-pkg-dev_0.9.7.9+deb7u1_i386
+libaqbanking34-dev_5.0.24-3_i386
+libaqsis-dev_1.8.1-3_i386
+libarchive-dev_3.0.4-3+nmu1_i386
+libargtable2-dev_12-1_i386
+libarmadillo-dev_1:3.2.3+dfsg-1_i386
+libarpack++2-dev_2.3-2_i386
+libarpack2-dev_3.1.1-2.1_i386
+libart-2.0-dev_2.3.21-2_i386
+libart2.0-cil-dev_2.24.2-3_all
+libasio-dev_1.4.1-3.2_all
+libasis2010-dev_2010-5_i386
+libasm-dev_0.152-1+wheezy1_i386
+libasound2-dev_1.0.25-4_i386
+libaspell-dev_0.60.7~20110707-1_i386
+libass-dev_0.10.0-3_i386
+libassa3.5-5-dev_3.5.1-2_i386
+libassimp-dev_3.0~dfsg-1_i386
+libassuan-dev_2.0.3-1_i386
+libast2-dev_0.7-6+b1_i386
+libasyncns-dev_0.8-4_i386
+libatasmart-dev_0.19-1_i386
+libatd-ocaml-dev_1.0.1-1+b1_i386
+libatdgen-ocaml-dev_1.2.2-1+b1_i386
+libatk-bridge2.0-dev_2.5.3-2_i386
+libatk1.0-dev_2.4.0-2_i386
+libatkmm-1.6-dev_2.22.6-1_i386
+libatlas-base-dev_3.8.4-9+deb7u1_i386
+libatlas-cpp-0.6-dev_0.6.2-3_i386
+libatlas-dev_3.8.4-9+deb7u1_all
+libatm1-dev_1:2.5.1-1.5_i386
+libatomic-ops-dev_7.2~alpha5+cvs20101124-1+deb7u1_i386
+libatomicparsley-dev_2.1.2-1_i386
+libatspi-dev_1.32.0-2_i386
+libatspi2.0-dev_2.5.3-2_i386
+libattica-dev_0.2.0-1_i386
+libattr1-dev_1:2.4.46-8_i386
+libaubio-dev_0.3.2-4.2+b1_i386
+libaudio-dev_1.9.3-5wheezy1_i386
+libaudiofile-dev_0.3.4-2_i386
+libaudiomask-dev_1.0-2_i386
+libaudit-dev_1:1.7.18-1.1_i386
+libaugeas-dev_0.10.0-1_i386
+libaunit2-dev_1.03-7_i386
+libautotrace-dev_0.31.1-16+b1_i386
+libautounit-dev_0.20.1-4_i386
+libavahi-cil-dev_0.6.19-4.2_all
+libavahi-client-dev_0.6.31-2_i386
+libavahi-common-dev_0.6.31-2_i386
+libavahi-compat-libdnssd-dev_0.6.31-2_i386
+libavahi-core-dev_0.6.31-2_i386
+libavahi-glib-dev_0.6.31-2_i386
+libavahi-gobject-dev_0.6.31-2_i386
+libavahi-qt4-dev_0.6.31-2_i386
+libavahi-ui-cil-dev_0.6.19-4.2_all
+libavahi-ui-dev_0.6.31-2_i386
+libavahi-ui-gtk3-dev_0.6.31-2_i386
+libavbin-dev_7-1.3_i386
+libavc1394-dev_0.5.4-2_i386
+libavcodec-dev_6:0.8.10-1_i386
+libavdevice-dev_6:0.8.10-1_i386
+libavfilter-dev_6:0.8.10-1_i386
+libavformat-dev_6:0.8.10-1_i386
+libavifile-0.7-dev_1:0.7.48~20090503.ds-13_i386
+libavl-dev_0.3.5-3_i386
+libavogadro-dev_1.0.3-5_i386
+libavutil-dev_6:0.8.10-1_i386
+libaws2.10.2-dev_2.10.2-4_i386
+libax25-dev_0.0.12-rc2+cvs20120204-2_i386
+libbabl-dev_0.1.10-1_i386
+libball1.4-dev_1.4.1+20111206-4_i386
+libballview1.4-dev_1.4.1+20111206-4_i386
+libbam-dev_0.1.18-1_i386
+libbamf-dev_0.2.118-1_i386
+libbamf3-dev_0.2.118-1_i386
+libbarry-dev_0.18.3-5_i386
+libbatteries-ocaml-dev_1.4.3-1_i386
+libbdd-dev_2.4-8_i386
+libbeecrypt-dev_4.2.1-4_i386
+libbenchmark-ocaml-dev_0.9-2+b3_i386
+libbfb0-dev_0.23-1.1_i386
+libbg1-dev_1.106-1_i386
+libbibutils-dev_4.12-5_i386
+libbin-prot-camlp4-dev_2.0.7-1_i386
+libbind-dev_1:9.8.4.dfsg.P1-6+nmu2+deb7u1_i386
+libbind4-dev_6.0-1_i386
+libbinio-dev_1.4+dfsg1-1_i386
+libbiniou-ocaml-dev_1.0.0-1+b1_i386
+libbio2jack0-dev_0.9-2.1_i386
+libbiococoa-dev_2.2.2-1+b2_i386
+libbiosig-dev_1.3.0-2_i386
+libbisho-common-dev_0.27.2+git20111122.9e68ef3d-1_i386
+libbison-dev_1:2.5.dfsg-2.1_i386
+libbitmask-dev_2.0-2_i386
+libbitstream-dev_1.0-1_all
+libbitstring-ocaml-dev_2.0.2-3+b1_i386
+libbjack-ocaml-dev_0.1.3-5+b1_i386
+libblacs-mpi-dev_1.1-31_i386
+libblas-dev_1.2.20110419-5_i386
+libbliss-dev_0.72-4_i386
+libblitz0-dev_1:0.9-13_i386
+libblkid-dev_2.20.1-5.3_i386
+libblocksruntime-dev_0.1-1_i386
+libbluedevil-dev_1.9.2-1_i386
+libbluetooth-dev_4.99-2_i386
+libbluray-dev_1:0.2.2-1_i386
+libbml-dev_0.6.1-1_i386
+libbobcat-dev_3.01.00-1+b1_i386
+libbogl-dev_0.1.18-8+b1_i386
+libbognor-regis-dev_0.6.12+git20101007.02c25268-7_i386
+libbonobo2-dev_2.24.3-1_i386
+libbonoboui2-dev_2.24.3-1_i386
+libboo-cil-dev_0.9.5~git20110729.r1.202a430-2_all
+libboost-all-dev_1.49.0.1_i386
+libboost-chrono-dev_1.49.0.1_i386
+libboost-chrono1.49-dev_1.49.0-3.2_i386
+libboost-date-time-dev_1.49.0.1_i386
+libboost-date-time1.49-dev_1.49.0-3.2_i386
+libboost-dev_1.49.0.1_i386
+libboost-filesystem-dev_1.49.0.1_i386
+libboost-filesystem1.49-dev_1.49.0-3.2_i386
+libboost-graph-dev_1.49.0.1_i386
+libboost-graph-parallel-dev_1.49.0.1_i386
+libboost-graph-parallel1.49-dev_1.49.0-3.2_i386
+libboost-graph1.49-dev_1.49.0-3.2_i386
+libboost-iostreams-dev_1.49.0.1_i386
+libboost-iostreams1.49-dev_1.49.0-3.2_i386
+libboost-locale-dev_1.49.0.1_i386
+libboost-locale1.49-dev_1.49.0-3.2_i386
+libboost-math-dev_1.49.0.1_i386
+libboost-math1.49-dev_1.49.0-3.2_i386
+libboost-mpi-dev_1.49.0.1_i386
+libboost-mpi-python-dev_1.49.0.1_i386
+libboost-mpi-python1.49-dev_1.49.0-3.2_i386
+libboost-mpi1.49-dev_1.49.0-3.2_i386
+libboost-program-options-dev_1.49.0.1_i386
+libboost-program-options1.49-dev_1.49.0-3.2_i386
+libboost-python-dev_1.49.0.1_i386
+libboost-python1.49-dev_1.49.0-3.2_i386
+libboost-random-dev_1.49.0.1_i386
+libboost-random1.49-dev_1.49.0-3.2_i386
+libboost-regex-dev_1.49.0.1_i386
+libboost-regex1.49-dev_1.49.0-3.2_i386
+libboost-serialization-dev_1.49.0.1_i386
+libboost-serialization1.49-dev_1.49.0-3.2_i386
+libboost-signals-dev_1.49.0.1_i386
+libboost-signals1.49-dev_1.49.0-3.2_i386
+libboost-system-dev_1.49.0.1_i386
+libboost-system1.49-dev_1.49.0-3.2_i386
+libboost-test-dev_1.49.0.1_i386
+libboost-test1.49-dev_1.49.0-3.2_i386
+libboost-thread-dev_1.49.0.1_i386
+libboost-thread1.49-dev_1.49.0-3.2_i386
+libboost-timer-dev_1.49.0.1_i386
+libboost-timer1.49-dev_1.49.0-3.2_i386
+libboost-wave-dev_1.49.0.1_i386
+libboost-wave1.49-dev_1.49.0-3.2_i386
+libboost1.49-all-dev_1.49.0-3.2_i386
+libboost1.49-dev_1.49.0-3.2_i386
+libbotan1.10-dev_1.10.5-1_i386
+libbox-dev_2.5-2_i386
+libbox2d-dev_2.0.1+dfsg1-1_i386
+libbpp-core-dev_2.0.3-1_i386
+libbpp-phyl-dev_2.0.3-1_i386
+libbpp-popgen-dev_2.0.3-1_i386
+libbpp-qt-dev_2.0.2-1_i386
+libbpp-raa-dev_2.0.3-1_i386
+libbpp-seq-dev_2.0.3-1_i386
+libbrahe-dev_1.3.2-3_i386
+libbrasero-media3-dev_3.4.1-4_i386
+libbrlapi-dev_4.4-10+deb7u1_i386
+libbs2b-dev_3.1.0+dfsg-2_i386
+libbsd-dev_0.4.2-1_i386
+libbse-dev_0.7.4-5_all
+libbt-dev_0.70.1-13_i386
+libbtparse-dev_0.63-1_i386
+libbuffy-dev_1.7-1_i386
+libbulletml-dev_0.0.6-5_i386
+libburn-dev_1.2.2-2_i386
+libbuzztard-dev_0.5.0-4_i386
+libbz2-dev_1.0.6-4_i386
+libbz2-ocaml-dev_0.6.0-6+b2_i386
+libc-ares-dev_1.9.1-3_i386
+libc-client2007e-dev_8:2007f~dfsg-2_i386
+libc6-dev_2.13-38+deb7u1_i386
+libcableswig-dev_0.1.0+cvs20111009-1_i386
+libcaca-dev_0.99.beta18-1_i386
+libcairo-ocaml-dev_1:1.2.0-2+b1_i386
+libcairo2-dev_1.12.2-3_i386
+libcairomm-1.0-dev_1.10.0-1_i386
+libcal3d12-dev_0.11.0-4.1_i386
+libcalendar-ocaml-dev_2.03-1+b2_i386
+libcamel1.2-dev_3.4.4-3_i386
+libcameleon-ocaml-dev_1.9.21-2+b1_i386
+libcaml2html-ocaml-dev_1.4.1-3_i386
+libcamlimages-ocaml-dev_1:4.0.1-4+b2_i386
+libcamljava-ocaml-dev_0.3-1+b3_i386
+libcamltemplate-ocaml-dev_1.0.2-1+b2_i386
+libcamomile-ocaml-dev_0.8.4-2_i386
+libcanberra-dev_0.28-6_i386
+libcanberra-gtk-common-dev_0.28-6_all
+libcanberra-gtk-dev_0.28-6_i386
+libcanberra-gtk3-dev_0.28-6_i386
+libcanlock2-dev_2b-6_i386
+libcanna1g-dev_3.7p3-11_i386
+libcap-dev_1:2.22-1.2_i386
+libcap-ng-dev_0.6.6-2_i386
+libcapi20-dev_1:3.25+dfsg1-3.3~deb7u1_i386
+libcapsinetwork-dev_0.3.0-7_i386
+libcaribou-dev_0.4.4-1_i386
+libcbf-dev_0.7.9.1-3_i386
+libccaudio2-dev_2.0.5-3_i386
+libccfits-dev_2.4-1_i386
+libcconv-dev_0.6.2-1_i386
+libccrtp-dev_2.0.3-4_i386
+libccs-dev_3.0.12-3.2+deb7u2_i386
+libccscript3-dev_1.1.7-2_i386
+libccss-dev_0.5.0-4_i386
+libcdaudio-dev_0.99.12p2-12_i386
+libcdb-dev_0.78_i386
+libcdd-dev_094b.dfsg-4.2_i386
+libcddb2-dev_1.3.2-3_i386
+libcdi-dev_1.5.4+dfsg.1-5_i386
+libcdio-cdda-dev_0.83-4_i386
+libcdio-dev_0.83-4_i386
+libcdio-paranoia-dev_0.83-4_i386
+libcdk5-dev_5.0.20060507-4_i386
+libcdparanoia-dev_3.10.2+debian-10.1_i386
+libcec-dev_1.6.2-1.1_i386
+libcegui-mk2-dev_0.7.6-2+b1_i386
+libcext-dev_6.1.1-2_i386
+libcf-ocaml-dev_0.10-3+b3_i386
+libcfg-dev_1.4.2-3_i386
+libcfitsio3-dev_3.300-2_i386
+libcgal-dev_4.0-5_i386
+libcgic-dev_2.05-3_i386
+libcgicc5-dev_3.2.9-3_i386
+libcgns-dev_3.1.3.4-1+b1_i386
+libcgroup-dev_0.38-1_i386
+libcgsi-gsoap-dev_1.3.5-1_i386
+libchamplain-0.12-dev_0.12.3-1_i386
+libchamplain-gtk-0.12-dev_0.12.3-1_i386
+libcharls-dev_1.0-2_i386
+libchasen-dev_2.4.5-6_i386
+libcheese-dev_3.4.2-2_i386
+libcheese-gtk-dev_3.4.2-2_i386
+libchewing3-dev_0.3.3-4_i386
+libchicken-dev_4.7.0-1_i386
+libchipcard-dev_5.0.3beta-3_i386
+libchise-dev_0.3.0-2+b1_i386
+libchm-dev_2:0.40a-2_i386
+libchromaprint-dev_0.6-2_i386
+libcib1-dev_1.1.7-1_i386
+libcitadel-dev_8.14-1_i386
+libcitygml0-dev_0.14+svn128-1+3p0p1+4_i386
+libck-connector-dev_0.4.5-3.1_i386
+libckyapplet1-dev_1.1.0-12_i386
+libclalsadrv-dev_2.0.0-3_all
+libclam-dev_1.4.0-5.1_i386
+libclam-qtmonitors-dev_1.4.0-3.1_i386
+libclamav-dev_0.98.1+dfsg-1+deb7u3_i386
+libclang-common-dev_1:3.0-6.2_i386
+libclang-dev_1:3.0-6.2_i386
+libclanlib-dev_1.0~svn3827-3_i386
+libclassad-dev_7.8.2~dfsg.1-1+deb7u1_i386
+libclaw-application-dev_1.7.0-3_i386
+libclaw-configuration-file-dev_1.7.0-3_i386
+libclaw-dev_1.7.0-3_i386
+libclaw-dynamic-library-dev_1.7.0-3_i386
+libclaw-graphic-dev_1.7.0-3_i386
+libclaw-logger-dev_1.7.0-3_i386
+libclaw-net-dev_1.7.0-3_i386
+libclaw-tween-dev_1.7.0-3_i386
+libclaws-mail-dev_3.8.1-2_i386
+libclhep-dev_2.1.2.3-1_i386
+libcli-dev_1.9.6-1_i386
+libclippoly-dev_0.11-3_i386
+libclips-dev_6.24-3_i386
+libcliquer-dev_1.21-1_i386
+libcln-dev_1.3.2-1.2_i386
+libcloog-isl-dev_0.17.0-3_i386
+libcloog-ppl-dev_0.15.11-4_i386
+libclthreads-dev_2.4.0-4_i386
+libclucene-dev_0.9.21b-2+b1_i386
+libclustalo-dev_1.1.0-1_i386
+libcluster-glue-dev_1.0.9+hg2665-1_all
+libclutter-1.0-dev_1.10.8-2_i386
+libclutter-cil-dev_1.0.0~alpha3~git20090817.r1.349dba6-8_all
+libclutter-gst-dev_1.5.4-1+build0_i386
+libclutter-gtk-1.0-dev_1.2.0-2_i386
+libclutter-imcontext-0.1-dev_0.1.4-3_i386
+libcluttergesture-dev_0.0.2.1-7_i386
+libclxclient-dev_3.6.1-6_i386
+libcman-dev_3.0.12-3.2+deb7u2_i386
+libcminpack-dev_1.2.2-1_i386
+libcmis-dev_0.1.0-1+b1_i386
+libcmor-dev_2.8.0-2+b1_i386
+libcmph-dev_0.9-1_i386
+libcneartree-dev_3.1.1-1_i386
+libcnf-dev_4.0-2_i386
+libcob1-dev_1.1-1_i386
+libcogl-dev_1.10.2-7_i386
+libcogl-pango-dev_1.10.2-7_i386
+libcoin60-dev_3.1.3-2.2_i386
+libcojets2-dev_20061220+dfsg3-2_i386
+libcollectdclient-dev_5.1.0-3_i386
+libcollection-dev_0.1.3-2_i386
+libcolorblind-dev_0.0.1-1_i386
+libcolord-dev_0.1.21-1_i386
+libcolord-gtk-dev_0.1.21-1_i386
+libcolorhug-dev_0.1.10-1_i386
+libcomedi-dev_0.10.0-3_i386
+libcommoncpp2-dev_1.8.1-5_i386
+libcompfaceg1-dev_1:1.5.2-5_i386
+libconcord-dev_0.24-1.1_i386
+libconfdb-dev_1.4.2-3_i386
+libconfig++-dev_1.4.8-5_i386
+libconfig++8-dev_1.4.8-5_i386
+libconfig-dev_1.4.8-5_i386
+libconfig-file-ocaml-dev_1.1-1_i386
+libconfig8-dev_1.4.8-5_i386
+libconfuse-dev_2.7-4_i386
+libcontactsdb-dev_0.5-8_i386
+libcoq-ocaml-dev_8.3.pl4+dfsg-2_i386
+libcore-ocaml-dev_107.01-5_i386
+libcorelinux-dev_0.4.32-7.3_i386
+libcoroipcc-dev_1.4.2-3_i386
+libcoroipcs-dev_1.4.2-3_i386
+libcorosync-dev_1.4.2-3_all
+libcos4-dev_4.1.6-2_i386
+libcothreads-ocaml-dev_0.10-3+b3_i386
+libcoyotl-dev_3.1.0-5_i386
+libcpg-dev_1.4.2-3_i386
+libcpl-dev_6.1.1-2_i386
+libcppcutter-dev_1.1.7-1.2_i386
+libcppunit-dev_1.12.1-4_i386
+libcppunit-subunit-dev_0.0.8+bzr176-1_i386
+libcpputest-dev_3.1-2_i386
+libcpufreq-dev_008-1_i386
+libcpuset-dev_1.0-3_i386
+libcqrlib2-dev_1.1.2-1_i386
+libcr-dev_0.8.5-2_i386
+libcrack2-dev_2.8.19-3_i386
+libcreal-ocaml-dev_0.7-6+b3_i386
+libcrmcluster1-dev_1.1.7-1_i386
+libcrmcommon2-dev_1.1.7-1_i386
+libcroco3-dev_0.6.6-2_i386
+libcry-ocaml-dev_0.2.2-1+b1_i386
+libcryptgps-ocaml-dev_0.2.1-7+b3_i386
+libcrypto++-dev_5.6.1-6_i386
+libcryptokit-ocaml-dev_1.5-1_i386
+libcryptsetup-dev_2:1.4.3-4_i386
+libcryptui-dev_3.2.2-1_i386
+libcrystalhd-dev_1:0.0~git20110715.fdd2f19-9_i386
+libcsfml-dev_1.6-1_i386
+libcsnd-dev_1:5.17.11~dfsg-3_all
+libcsoap-dev_1.1.0-17.1_i386
+libcsound64-dev_1:5.17.11~dfsg-3_all
+libcsoundac-dev_1:5.17.11~dfsg-3_all
+libcsv-ocaml-dev_1.2.2-1+b1_i386
+libctapimkt0-dev_1.0.1-1.1_i386
+libctdb-dev_1.12+git20120201-4_i386
+libctemplate-dev_2.2-3_i386
+libctl-dev_3.1.0-5_i386
+libctpl-dev_0.3.3.dfsg-2_i386
+libcuba3-dev_3.0+20111124-2_i386
+libcudf-dev_0.6.2-1_i386
+libcudf-ocaml-dev_0.6.2-1_i386
+libcue-dev_1.4.0-1_i386
+libcunit1-dev_2.1-0.dfsg-10_i386
+libcunit1-ncurses-dev_2.1-0.dfsg-10_i386
+libcups2-dev_1.5.3-5+deb7u1_i386
+libcupscgi1-dev_1.5.3-5+deb7u1_i386
+libcupsdriver1-dev_1.5.3-5+deb7u1_i386
+libcupsfilters-dev_1.0.18-2.1+deb7u1_i386
+libcupsimage2-dev_1.5.3-5+deb7u1_i386
+libcupsmime1-dev_1.5.3-5+deb7u1_i386
+libcupsppdc1-dev_1.5.3-5+deb7u1_i386
+libcupt2-dev_2.5.9_i386
+libcurl-ocaml-dev_0.5.3-2+b1_i386
+libcurl4-gnutls-dev_7.26.0-1+wheezy9_i386
+libcurl4-nss-dev_7.26.0-1+wheezy9_i386
+libcurl4-openssl-dev_7.26.0-1+wheezy9_i386
+libcurses-ocaml-dev_1.0.3-2_i386
+libcutter-dev_1.1.7-1.2_i386
+libcv-dev_2.3.1-11_i386
+libcvaux-dev_2.3.1-11_i386
+libcvc3-dev_2.4.1-4_i386
+libcvector2-dev_1.0.3-1_i386
+libcvm1-dev_0.96-1+b1_i386
+libcw3-dev_3.0.2-1_i386
+libcwidget-dev_0.5.16-3.4_i386
+libcwiid-dev_0.6.00+svn201-3+b1_i386
+libcwnn-dev_1.1.1~a021+cvs20100325-6_i386
+libcxgb3-dev_1.3.1-1_i386
+libcxxtools-dev_2.1.1-1_i386
+libdacs-dev_1.4.27b-2_i386
+libdaemon-dev_0.14-2_i386
+libdancer-xml0-dev_0.8.2.1-3_i386
+libdap-dev_3.11.1-11_i386
+libdapl-dev_2.0.19-1.1_i386
+libdaq-dev_0.6.2-2_i386
+libdar-dev_2.4.5.debian.1-1_i386
+libdatrie-dev_0.2.5-3_i386
+libdawgdic-dev_0.4.3-1_all
+libdb++-dev_5.1.6_i386
+libdb-dev_5.1.6_i386
+libdb-java-dev_5.1.6_i386
+libdb-sql-dev_5.1.6_i386
+libdb4o-cil-dev_8.0.184.15484+dfsg-2_all
+libdb5.1++-dev_5.1.29-5_i386
+libdb5.1-dev_5.1.29-5_i386
+libdb5.1-java-dev_5.1.29-5_i386
+libdb5.1-sql-dev_5.1.29-5_i386
+libdb5.1-stl-dev_5.1.29-5_i386
+libdballe-dev_5.18-1_i386
+libdballef-dev_5.18-1_i386
+libdbaudiolib0-dev_0.9.8-6.2_i386
+libdbi-dev_0.8.4-6_i386
+libdbus-1-dev_1.6.8-1+deb7u1_i386
+libdbus-c++-dev_0.9.0-6_i386
+libdbus-glib-1-dev_0.100.2-1_i386
+libdbus-glib1.0-cil-dev_0.5.0-4_all
+libdbus-ocaml-dev_0.29-1+b3_i386
+libdbus1.0-cil-dev_0.7.0-5_all
+libdbusada0.2-dev_0.2-2_i386
+libdbusmenu-glib-dev_0.6.2-1_i386
+libdbusmenu-gtk-dev_0.6.2-1_i386
+libdbusmenu-gtk3-dev_0.6.2-1_i386
+libdbusmenu-jsonloader-dev_0.6.2-1_i386
+libdbusmenu-qt-dev_0.9.0-1_i386
+libdc-dev_0.3.24~svn3121-2_i386
+libdc1394-22-dev_2.2.0-2_i386
+libdca-dev_0.0.5-5_i386
+libdcerpc-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libdcerpc-server-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libdcmtk2-dev_3.6.0-12_i386
+libdconf-dbus-1-dev_0.12.1-3_i386
+libdconf-dev_0.12.1-3_i386
+libddccontrol-dev_0.4.2-10_i386
+libdds-dev_2.1.2+ddd105-1_i386
+libdebconf-kde-dev_0.2-2_i386
+libdebconfclient0-dev_0.182_i386
+libdebian-installer4-dev_0.87_i386
+libdebug0-dev_0.4.4-1.1_i386
+libdecodeqr-dev_0.9.3-6.2_i386
+libdee-dev_1.0.10-3_i386
+libderiving-ocaml-dev_0.1.1a-3+b1_i386
+libderiving-ocsigen-ocaml-dev_0.3c-1_i386
+libdesktop-agnostic-dev_0.3.92+dfsg-1_i386
+libdessert0.87-dev_0.87.2-1_i386
+libdevhelp-dev_3.4.1-1_i386
+libdevil-dev_1.7.8-6.1+b1_i386
+libdevmapper-dev_2:1.02.74-8_i386
+libdhash-dev_0.1.3-2_i386
+libdiagnostics-dev_0.3.3-1.3_i386
+libdianewcanvas2-dev_0.6.10-5.4_i386
+libdieharder-dev_3.31.1-4_i386
+libdiet-admin2.8-dev_2.8.0-1+b1_i386
+libdiet-client2.8-dev_2.8.0-1+b1_i386
+libdiet-dagda2.8-dev_2.8.0-1+b1_i386
+libdiet-sed2.8-dev_2.8.0-1+b1_i386
+libdime-dev_0.20030921-2_all
+libdirac-dev_1.0.2-6_i386
+libdirectfb-dev_1.2.10.0-5_i386
+libdisasm-dev_0.23-5_i386
+libdiscid0-dev_0.2.2-3_i386
+libdiscover-dev_2.1.2-5.2_i386
+libdispatch-dev_0~svn197-3.1_i386
+libdisplaymigration0-dev_0.28-10_i386
+libdistorm64-dev_1.7.30-1_i386
+libdivecomputer-dev_0.1.0-3_i386
+libdjconsole-dev_0.1.3-1_i386
+libdjvulibre-dev_3.5.25.3-1_i386
+libdkim-dev_1:1.0.21-3_i386
+libdlm-dev_3.0.12-3.2+deb7u2_i386
+libdlmcontrol-dev_3.0.12-3.2+deb7u2_i386
+libdlrestrictions-dev_0.15.3_i386
+libdm0-dev_2.2.10-1_i386
+libdmalloc-dev_5.5.2-5_i386
+libdmapsharing-3.0-dev_2.9.15-1_i386
+libdmraid-dev_1.0.0.rc16-4.2_i386
+libdmtcpaware-dev_1.2.5-1_i386
+libdmtx-dev_0.7.2-2+build1_i386
+libdmx-dev_1:1.1.2-1+deb7u1_i386
+libdnet-dev_2.60_i386
+libdockapp-dev_1:0.5.0-3_i386
+libdolfin1.0-dev_1.0.0-7_i386
+libdoodle-dev_0.7.0-5_i386
+libdose2-ocaml-dev_1.4.2-4+b3_i386
+libdose3-ocaml-dev_3.0.2-3_i386
+libdotconf-dev_1.0.13-3_i386
+libdpkg-dev_1.16.12_i386
+libdpm-dev_1.8.2-1+b2_i386
+libdrawtk-dev_2.0-2_i386
+libdrizzle-dev_1:7.1.36-stable-1_all
+libdrizzledmessage-dev_1:7.1.36-stable-1_i386
+libdrm-dev_2.4.40-1~deb7u2_i386
+libdrumstick-dev_0.5.0-3_i386
+libdsdp-dev_5.8-9.1_i386
+libdshconfig1-dev_0.20.13-1_i386
+libdspam7-dev_3.10.1+dfsg-11_i386
+libdssi-ocaml-dev_0.1.0-1+b1_i386
+libdssialsacompat-dev_1.0.8a-1_i386
+libdtools-ocaml-dev_0.3.0-1_i386
+libdts-dev_0.0.5-5_i386
+libdumb1-dev_1:0.9.3-5.4_i386
+libdumbnet-dev_1.12-3.1_i386
+libdune-common-dev_2.2.0-1_i386
+libdune-geometry-dev_2.2.0-1_i386
+libdune-grid-dev_2.2.0-1_i386
+libdune-istl-dev_2.2.0-1_all
+libdune-localfunctions-dev_2.2.0-1_all
+libduo-dev_1.8-1_i386
+libduppy-ocaml-dev_0.4.2-1+b2_i386
+libdv4-dev_1.0.0-6_i386
+libdvb-dev_0.5.5.1-5.1_i386
+libdvbcsa-dev_1.1.0-2_i386
+libdvbpsi-dev_0.2.2-1_i386
+libdvdnav-dev_4.2.0+20120524-2_i386
+libdvdread-dev_4.2.0+20120521-2_i386
+libdw-dev_0.152-1+wheezy1_i386
+libdwarf-dev_20120410-2_i386
+libdx4-dev_1:4.4.4-4+b2_i386
+libdxflib-dev_2.2.0.0-8_i386
+libdynamite-dev_0.1.1-2_i386
+libeasy-format-ocaml-dev_1.0.0-1+b2_i386
+libeb16-dev_4.4.3-6_i386
+libebackend1.2-dev_3.4.4-3_i386
+libebml-dev_1.2.2-2_i386
+libebook1.2-dev_3.4.4-3_i386
+libecal1.2-dev_3.4.4-3_i386
+libecasoundc-dev_2.9.0-1_i386
+libecasoundc2.2-dev_2.9.0-1_all
+libechonest-dev_1.2.1-1_i386
+libecm-dev_6.4.2-1_i386
+libecore-dev_1.2.0-2_i386
+libecpg-dev_9.1.13-0wheezy1_i386
+libecryptfs-dev_99-1_i386
+libedac-dev_0.18-1_i386
+libedata-book1.2-dev_3.4.4-3_i386
+libedata-cal1.2-dev_3.4.4-3_i386
+libedataserver1.2-dev_3.4.4-3_i386
+libedataserverui-3.0-dev_3.4.4-3_i386
+libedbus-dev_1.2.0-1_i386
+libedit-dev_2.11-20080614-5_i386
+libeditline-dev_1.12-6_i386
+libedje-dev_1.2.0-1_i386
+libee-dev_0.4.1-1_i386
+libeegdev-dev_0.2-3_i386
+libeet-dev_1.6.0-1_i386
+libefreet-dev_1.2.0-1_i386
+libegl1-mesa-dev_8.0.5-4+deb7u2_i386
+libeigen2-dev_2.0.17-1_i386
+libeigen3-dev_3.1.0-1_i386
+libeina-dev_1.2.0-2_i386
+libelektra-cpp-dev_0.7.1-1_i386
+libelektra-dev_0.7.1-1_i386
+libelektratools-dev_0.7.1-1_i386
+libelemental-dev_1.2.0-8_i386
+libelementary-dev_0.7.0.55225-1_i386
+libelf-dev_0.152-1+wheezy1_i386
+libelfg0-dev_0.8.13-3_i386
+libeliom-ocaml-dev_2.2.2-1_i386
+libelk0-dev_3.99.8-2_i386
+libelmer-dev_6.1.0.svn.5396.dfsg2-2_i386
+libembryo-dev_1.2.0-1_i386
+libemos-dev_000382+dfsg-2_i386
+libenca-dev_1.13-4_i386
+libenchant-dev_1.6.0-7_i386
+libenet-dev_1.3.3-2_i386
+libepc-dev_0.4.4-1_i386
+libepc-ui-dev_0.4.4-1_i386
+libepr-api2-dev_2.2-2_all
+libepsilon-dev_0.9.1-2_i386
+libept-dev_1.0.9_i386
+libepub-dev_0.2.1-2+b1_i386
+liberis-1.3-dev_1.3.19-5_i386
+liberuby-dev_1.0.5-2.1_i386
+libescpr-dev_1.1.1-2_i386
+libesd0-dev_0.2.41-10+b1_i386
+libesmtp-dev_1.0.6-1+b1_i386
+libespeak-dev_1.46.02-2_i386
+libestools2.1-dev_1:2.1~release-5_i386
+libestr-dev_0.1.1-2_i386
+libethos-dev_0.2.2-3_i386
+libethos-ui-dev_0.2.2-3_i386
+libetpan-dev_1.0-5_i386
+libetsf-io-dev_1.0.3-4+b1_i386
+libeurodec1-dev_20061220+dfsg3-2_i386
+libev-dev_1:4.11-1_i386
+libev-libevent-dev_1:4.11-1_all
+libeval0-dev_0.29.6-2_i386
+libevas-dev_1.2.0-2_i386
+libevd-0.1-dev_0.1.20-2_i386
+libevent-dev_2.0.19-stable-3_i386
+libeventdb-dev_0.90-5_i386
+libevince-dev_3.4.0-3.1_i386
+libevocosm-dev_4.0.2-2.1_i386
+libevs-dev_1.4.2-3_i386
+libevtlog-dev_0.2.12-5_i386
+libewf-dev_20100226-1+b1_i386
+libexchangemapi-1.0-dev_3.4.4-1_i386
+libexempi-dev_2.2.0-1_i386
+libexif-dev_0.6.20-3_i386
+libexif-gtk-dev_0.3.5-5_i386
+libexiv2-dev_0.23-1_i386
+libexo-1-dev_0.6.2-5_i386
+libexodusii-dev_5.14.dfsg.1-2+b1_i386
+libexosip2-dev_3.6.0-4_i386
+libexpat-ocaml-dev_0.9.1+debian1-7+b2_i386
+libexpat1-dev_2.1.0-1+deb7u1_i386
+libexpect-ocaml-dev_0.0.2-1+b6_i386
+libexplain-dev_0.52.D002-1_i386
+libextlib-ocaml-dev_1.5.2-1+b1_i386
+libextractor-dev_1:0.6.3-5_i386
+libextractor-java-dev_0.6.0-6_i386
+libexttextcat-dev_3.2.0-2_i386
+libextunix-ocaml-dev_0.0.5-2_i386
+libeztrace-dev_0.7-2-4_i386
+libf2c2-dev_20090411-2_i386
+libfaad-dev_2.7-8_i386
+libfaad-ocaml-dev_0.3.0-1+b1_i386
+libfacile-ocaml-dev_1.1-8+b1_i386
+libfaifa-dev_0.2~svn82-1_i386
+libfakekey-dev_0.1-7_i386
+libfam-dev_2.7.0-17_i386
+libfann-dev_2.1.0~beta~dfsg-8_i386
+libfarstream-0.1-dev_0.1.2-1_i386
+libfastjet-dev_3.0.2+dfsg-2_i386
+libfastjet-fortran-dev_3.0.2+dfsg-2_i386
+libfastjetplugins-dev_3.0.2+dfsg-2_i386
+libfastjettools-dev_3.0.2+dfsg-2_i386
+libfauhdli-dev_20110812-1_i386
+libfcgi-dev_2.4.0-8.1_i386
+libfdt-dev_1.3.0-4_i386
+libfence-dev_3.0.12-3.2+deb7u2_i386
+libffado-dev_2.0.99+svn2171-2_i386
+libffcall1-dev_1.10+cvs20100619-2_i386
+libffi-dev_3.0.10-3_i386
+libffindex0-dev_0.9.6.1-1_i386
+libffmpegthumbnailer-dev_2.0.7-2_i386
+libffms2-dev_2.17-1_i386
+libfftw3-dev_3.3.2-3.1_i386
+libfftw3-mpi-dev_3.3.2-3.1_i386
+libfields-camlp4-dev_107.01-1+b2_i386
+libfileutils-ocaml-dev_0.4.2-1+b2_i386
+libfindlib-ocaml-dev_1.3.1-1_i386
+libfiredns-dev_0.9.12+dfsg-3_i386
+libfirestring-dev_0.9.12-8_i386
+libfishsound1-dev_1.0.0-1.1_i386
+libfiu-dev_0.90-3_i386
+libfixposix-dev_20110316.git47f17f7-1_i386
+libfko0-dev_2.0.0rc2-2+deb7u2_i386
+libflac++-dev_1.2.1-6_i386
+libflac-dev_1.2.1-6_i386
+libflac-ocaml-dev_0.1.1-1_i386
+libflake-dev_0.11-2_i386
+libflann-dev_1.7.1-4_i386
+libflatzebra-dev_0.1.5-4+b1_i386
+libflickrnet-cil-dev_1:2.2.0-4_all
+libflorist2011-dev_2011-1_i386
+libflowcanvas-dev_0.7.1+dfsg0-0.2_i386
+libfltk1.1-dev_1.1.10-14_i386
+libfltk1.3-dev_1.3.0-8_i386
+libfluidsynth-dev_1.1.5-2_i386
+libfm-dev_0.1.17-2.1_i386
+libfolia1-dev_0.9-2_i386
+libfolks-dev_0.6.9-1+b1_i386
+libfolks-eds-dev_0.6.9-1+b1_i386
+libfolks-telepathy-dev_0.6.9-1+b1_i386
+libfontconfig1-dev_2.9.0-7.1_i386
+libfontenc-dev_1:1.1.1-1_i386
+libfontforge-dev_0.0.20120101+git-2_i386
+libforms-dev_1.0.93sp1-2_i386
+libformsgl-dev_1.0.93sp1-2_i386
+libfox-1.6-dev_1.6.45-1_i386
+libfprint-dev_1:0.4.0-4-gdfff16f-4_i386
+libfreecell-solver-dev_3.12.0-1_i386
+libfreefem++-dev_3.19.1-1_i386
+libfreefem-dev_3.5.8-5_i386
+libfreehdl0-dev_0.0.7-1.1_i386
+libfreeimage-dev_3.15.1-1+b1_i386
+libfreeipmi-dev_1.1.5-3_i386
+libfreenect-dev_1:0.1.2+dfsg-6_i386
+libfreeradius-dev_2.1.12+dfsg-1.2_i386
+libfreerdp-dev_1.0.1-1.1+deb7u3_i386
+libfreetype6-dev_2.4.9-1.1_i386
+libfreexl-dev_1.0.0b-1_i386
+libfribidi-dev_0.19.2-3_i386
+libfs-dev_2:1.0.4-1+deb7u1_i386
+libfso-glib-dev_2012.05.24.1-1.1_i386
+libfsobasics-dev_0.11.0-1.1_i386
+libfsoframework-dev_0.11.0-1.1_i386
+libfsoresource-dev_0.11.0-1.1_i386
+libfsosystem-dev_0.11.0-1_i386
+libfsotransport-dev_0.11.1-2.1_i386
+libfsplib-dev_0.11-2_i386
+libfstrcmp-dev_0.4.D001-1+deb7u1_i386
+libftdi-dev_0.20-1+b1_i386
+libftdipp-dev_0.20-1+b1_i386
+libftgl-dev_2.1.3~rc5-4_i386
+libfuntools-dev_1.4.4-3_i386
+libfuse-dev_2.9.0-2+deb7u1_i386
+libfuzzy-dev_2.7-2_i386
+libfxt-dev_0.2.6-2_i386
+libg15-dev_1.2.7-2_i386
+libg15daemon-client-dev_1.9.5.3-8.2_i386
+libg15render-dev_1.3.0~svn316-2.2_i386
+libg2-dev_0.72-2.1_i386
+libg3d-dev_0.0.8-17_i386
+libga-dev_2.4.7-3_i386
+libgadap-dev_2.0-1_i386
+libgadu-dev_1:1.11.2-1+deb7u1_i386
+libgail-3-dev_3.4.2-7_i386
+libgail-dev_2.24.10-2_i386
+libgalax-ocaml-dev_1.1-10+b3_i386
+libgambc4-dev_4.2.8-1.1_i386
+libgamin-dev_0.1.10-4.1_i386
+libgammu-dev_1.31.90-1+b1_i386
+libganglia1-dev_3.3.8-1+nmu1_i386
+libganv-dev_0~svn4468~dfsg0-1_i386
+libgarcon-1-0-dev_0.1.12-1_i386
+libgarmin-dev_0~svn320-3_i386
+libgatos-dev_0.0.5-19_i386
+libgavl-dev_1.4.0-1_i386
+libgavl-ocaml-dev_0.1.4-1+b1_i386
+libgbm-dev_8.0.5-4+deb7u2_i386
+libgc-dev_1:7.1-9.1_i386
+libgcal-dev_0.9.6-3_i386
+libgccxml-dev_0.9.0+cvs20120420-4_i386
+libgcgi-dev_0.9.5.dfsg-7_i386
+libgcj12-dev_4.6.3-1_i386
+libgcj13-dev_4.7.2-3_i386
+libgck-1-dev_3.4.1-3_i386
+libgconf-bridge-dev_0.1-2.2_i386
+libgconf2-dev_3.2.5-1+build1_i386
+libgconf2.0-cil-dev_2.24.2-3_all
+libgconfmm-2.6-dev_2.28.0-1_i386
+libgcr-3-dev_3.4.1-3_i386
+libgcroots-dev_0.8.5-2.1_i386
+libgcrypt11-dev_1.5.0-5+deb7u1_i386
+libgctp-dev_1.0-1_i386
+libgd-gd2-noxpm-ocaml-dev_1.0~alpha5-5_i386
+libgd2-noxpm-dev_2.0.36~rc1~dfsg-6.1_i386
+libgd2-xpm-dev_2.0.36~rc1~dfsg-6.1_i386
+libgda-5.0-dev_5.0.3-2_i386
+libgdal-dev_1.9.0-3.1_i386
+libgdal1-dev_1.9.0-3.1_all
+libgdata-cil-dev_2.1.0.0-1_all
+libgdata-dev_0.12.0-1_i386
+libgdb-dev_7.4.1+dfsg-0.1_i386
+libgdbm-dev_1.8.3-11_i386
+libgdchart-gd2-noxpm-dev_0.11.5-7+b1_i386
+libgdchart-gd2-xpm-dev_0.11.5-7+b1_i386
+libgdcm2-dev_2.2.0-14.1_i386
+libgdf-dev_0.1.2-2_i386
+libgdict-1.0-dev_3.4.0-2_i386
+libgdk-pixbuf2.0-dev_2.26.1-1_i386
+libgdkcutter-pixbuf-dev_1.1.7-1.2_i386
+libgdl-3-dev_3.4.2-1_i386
+libgdome2-cpp-smart-dev_0.2.6-6+b1_i386
+libgdome2-dev_0.8.1+debian-4.1_i386
+libgdome2-ocaml-dev_0.2.6-6+b1_i386
+libgdu-dev_3.0.2-3_i386
+libgdu-gtk-dev_3.0.2-3_i386
+libgeant321-2-dev_1:3.21.14.dfsg-10_i386
+libgearman-dev_0.33-2_i386
+libgecode-dev_3.7.3-1_i386
+libgeda-dev_1:1.6.2-4.3_i386
+libgee-dev_0.6.4-2_i386
+libgegl-dev_0.2.0-2+nmu1_i386
+libgeier-dev_0.13-1+b1_i386
+libgenders0-dev_1.18-1_i386
+libgenome-1.3-0-dev_1.3.1-3_i386
+libgensec-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libgeoclue-dev_0.12.0-4_i386
+libgeocode-glib-dev_0.99.0-1_i386
+libgeographiclib-dev_1.21-1_i386
+libgeoip-dev_1.4.8+dfsg-3_i386
+libgeomview-dev_1.9.4-3_i386
+libgeos++-dev_3.3.3-1.1_i386
+libgeos-dev_3.3.3-1.1_i386
+libgeotiff-dev_1.3.0+dfsg-3_i386
+libgeotranz3-dev_3.1-2.1_i386
+libges-0.10-dev_0.10.1-2_i386
+libgetdata-dev_0.7.3-6_i386
+libgetfem++-dev_4.1.1+dfsg1-11_i386
+libgetopt++-dev_0.0.2-p22-3_i386
+libgetopt-ocaml-dev_0.0.20040811-10+b3_i386
+libgettext-ocaml-dev_0.3.4-1+b2_i386
+libgexiv2-dev_0.4.1-3_i386
+libgfarm-dev_2.4.1-1.1_i386
+libgflags-dev_2.0-1_i386
+libgfshare-dev_1.0.5-2_i386
+libghc-acid-state-dev_0.6.3-1+b2_i386
+libghc-active-dev_0.1.0.1-2+b2_i386
+libghc-adjunctions-dev_2.4.0.2-1_i386
+libghc-aeson-dev_0.6.0.2-1+b4_i386
+libghc-agda-dev_2.3.0.1-2_i386
+libghc-algebra-dev_2.1.1.2-1_i386
+libghc-alut-dev_2.1.0.2-4+b1_i386
+libghc-ami-dev_0.1-1+b5_i386
+libghc-ansi-terminal-dev_0.5.5-3+b1_i386
+libghc-ansi-wl-pprint-dev_0.6.4-1+b1_i386
+libghc-arrows-dev_0.4.4.0-3+b1_i386
+libghc-asn1-data-dev_0.6.1.3-2+b3_i386
+libghc-attempt-dev_0.4.0-1+b2_i386
+libghc-attoparsec-conduit-dev_0.4.0.1-1_i386
+libghc-attoparsec-dev_0.10.1.1-2+b1_i386
+libghc-attoparsec-enumerator-dev_0.3-3+b3_i386
+libghc-augeas-dev_0.6.1-1_i386
+libghc-authenticate-dev_1.2.1.1-2+b1_i386
+libghc-base-unicode-symbols-dev_0.2.2.3-1+b1_i386
+libghc-base16-bytestring-dev_0.1.1.4-2+b1_i386
+libghc-base64-bytestring-dev_0.1.1.1-2_i386
+libghc-bifunctors-dev_0.1.3.3-1+b1_i386
+libghc-binary-shared-dev_0.8.1-1+b1_i386
+libghc-bindings-dsl-dev_1.0.15-1+b1_i386
+libghc-bindings-gpgme-dev_0.1.4-1_i386
+libghc-bindings-libzip-dev_0.10-2_i386
+libghc-bitarray-dev_0.0.1-2+b1_i386
+libghc-blaze-builder-conduit-dev_0.4.0.2-1_i386
+libghc-blaze-builder-dev_0.3.1.0-1+b2_i386
+libghc-blaze-builder-enumerator-dev_0.2.0.4-1+b1_i386
+libghc-blaze-html-dev_0.4.3.1-3+b2_i386
+libghc-blaze-markup-dev_0.5.1.0-1_i386
+libghc-blaze-textual-dev_0.2.0.6-2+b2_i386
+libghc-bloomfilter-dev_1.2.6.8-1_i386
+libghc-boolean-dev_0.0.1-2+b1_i386
+libghc-boomerang-dev_1.3.1-1_i386
+libghc-brainfuck-dev_0.1-2+b2_i386
+libghc-byteorder-dev_1.0.3-2+b1_i386
+libghc-bytestring-lexing-dev_0.4.0-1+b1_i386
+libghc-bytestring-mmap-dev_0.2.2-2+b1_i386
+libghc-bytestring-nums-dev_0.3.5-2+b1_i386
+libghc-bytestring-show-dev_0.3.5.1-1+b1_i386
+libghc-bzlib-dev_0.5.0.3-2+b1_i386
+libghc-cabal-file-th-dev_0.2.2-1_i386
+libghc-cairo-dev_0.12.3-1+b1_i386
+libghc-case-insensitive-dev_0.4.0.1-2+b2_i386
+libghc-categories-dev_1.0.3-1+b1_i386
+libghc-cautious-file-dev_1.0.1-1_i386
+libghc-cereal-conduit-dev_0.5-1+b1_i386
+libghc-cereal-dev_0.3.5.2-1_i386
+libghc-certificate-dev_1.2.3-2_i386
+libghc-cgi-dev_3001.1.8.2-2+b3_i386
+libghc-chart-dev_0.15-1+b2_i386
+libghc-chell-dev_0.3-1_i386
+libghc-citeproc-hs-dev_0.3.4-1+b4_i386
+libghc-clientsession-dev_0.7.5-3+b1_i386
+libghc-clock-dev_0.2.0.0-2+b1_i386
+libghc-cmdargs-dev_0.9.5-1+b1_i386
+libghc-colour-dev_2.3.3-1+b1_i386
+libghc-comonad-dev_1.1.1.5-1+b1_i386
+libghc-comonad-transformers-dev_2.1.1.1-1+b1_i386
+libghc-comonads-fd-dev_2.1.1.2-1+b1_i386
+libghc-conduit-dev_0.4.2-2_i386
+libghc-configfile-dev_1.0.6-4+b3_i386
+libghc-configurator-dev_0.2.0.0-1+b2_i386
+libghc-contravariant-dev_0.2.0.2-1+b1_i386
+libghc-convertible-dev_1.0.11.0-3+b3_i386
+libghc-cookie-dev_0.4.0-1+b3_i386
+libghc-cpphs-dev_1.13.3-2+b1_i386
+libghc-cprng-aes-dev_0.2.3-3+b4_i386
+libghc-cpu-dev_0.1.1-1_i386
+libghc-criterion-dev_0.6.0.1-3+b4_i386
+libghc-crypto-api-dev_0.10.2-1+b2_i386
+libghc-crypto-conduit-dev_0.3.2-1+b1_i386
+libghc-crypto-dev_4.2.4-1+b1_i386
+libghc-crypto-pubkey-types-dev_0.1.1-1+b3_i386
+libghc-cryptocipher-dev_0.3.5-1+b1_i386
+libghc-cryptohash-dev_0.7.5-1+b2_i386
+libghc-css-text-dev_0.1.1-3+b2_i386
+libghc-csv-conduit-dev_0.2-1_i386
+libghc-csv-dev_0.1.2-2+b3_i386
+libghc-curl-dev_1.3.7-1+b1_i386
+libghc-darcs-dev_2.8.1-1+b1_i386
+libghc-data-accessor-dev_0.2.2.2-1+b1_i386
+libghc-data-accessor-mtl-dev_0.2.0.3-1+b1_i386
+libghc-data-accessor-template-dev_0.2.1.9-1+b2_i386
+libghc-data-binary-ieee754-dev_0.4.2.1-3+b1_i386
+libghc-data-default-dev_0.4.0-1_i386
+libghc-data-inttrie-dev_0.0.7-1+b1_i386
+libghc-data-lens-dev_2.10.0-1+b1_i386
+libghc-data-memocombinators-dev_0.4.3-1+b1_i386
+libghc-dataenc-dev_0.14.0.3-1+b1_i386
+libghc-datetime-dev_0.2.1-3_i386
+libghc-dbus-dev_0.10.3-1_i386
+libghc-debian-dev_3.64-3_i386
+libghc-diagrams-cairo-dev_0.5.0.2-1_i386
+libghc-diagrams-core-dev_0.5.0.1-1+b1_i386
+libghc-diagrams-dev_0.5-2_all
+libghc-diagrams-lib-dev_0.5-2_i386
+libghc-diff-dev_0.1.3-1+b1_i386
+libghc-digest-dev_0.0.1.0-1+b1_i386
+libghc-dimensional-dev_0.10.1.2-2+b1_i386
+libghc-directory-tree-dev_0.10.0-2+b1_i386
+libghc-distributive-dev_0.2.2-1+b1_i386
+libghc-dlist-dev_0.5-3+b1_i386
+libghc-download-curl-dev_0.1.3-3+b3_i386
+libghc-dpkg-dev_0.0.3-1_i386
+libghc-dyre-dev_0.8.7-1_i386
+libghc-edison-api-dev_1.2.1-18+b1_i386
+libghc-edison-core-dev_1.2.1.3-9+b1_i386
+libghc-edit-distance-dev_0.2.1-2_i386
+libghc-editline-dev_0.2.1.0-5+b1_i386
+libghc-ekg-dev_0.3.1.0-1+b2_i386
+libghc-email-validate-dev_0.2.8-1+b3_i386
+libghc-entropy-dev_0.2.1-2+b1_i386
+libghc-enumerator-dev_0.4.19-1+b1_i386
+libghc-erf-dev_2.0.0.0-2+b1_i386
+libghc-event-list-dev_0.1.0.1-1+b1_i386
+libghc-exception-transformers-dev_0.3.0.2-1+b1_i386
+libghc-executable-path-dev_0.0.3-1+b1_i386
+libghc-explicit-exception-dev_0.1.7-1+b1_i386
+libghc-failure-dev_0.2.0.1-1+b1_i386
+libghc-fast-logger-dev_0.0.2-1+b2_i386
+libghc-fastcgi-dev_3001.0.2.3-3+b3_i386
+libghc-fclabels-dev_1.1.3-1+b1_i386
+libghc-feed-dev_0.3.8-3_i386
+libghc-fgl-dev_5.4.2.4-2+b2_i386
+libghc-file-embed-dev_0.0.4.4-1_i386
+libghc-filemanip-dev_0.3.5.2-2+b2_i386
+libghc-filestore-dev_0.5-1_i386
+libghc-filesystem-conduit-dev_0.4.0-1_i386
+libghc-free-dev_2.1.1.1-1+b1_i386
+libghc-ftphs-dev_1.0.8-1+b3_i386
+libghc-gconf-dev_0.12.1-1+b1_i386
+libghc-gd-dev_3000.7.3-1_i386
+libghc-ghc-events-dev_0.4.0.0-2+b1_i386
+libghc-ghc-mtl-dev_1.0.1.1-1+b3_i386
+libghc-ghc-paths-dev_0.1.0.8-2+b1_i386
+libghc-ghc-syb-utils-dev_0.2.1.0-1+b3_i386
+libghc-gio-dev_0.12.3-1+b1_i386
+libghc-github-dev_0.4.0-2_i386
+libghc-gitit-dev_0.10.0.1-1+b1_i386
+libghc-glade-dev_0.12.1-1+b3_i386
+libghc-glfw-dev_0.5.0.1-1+b1_i386
+libghc-glib-dev_0.12.2-1+b1_i386
+libghc-glut-dev_2.1.2.2-1_i386
+libghc-gnuidn-dev_0.2-2+b2_i386
+libghc-gnutls-dev_0.1.2-1+b1_i386
+libghc-gsasl-dev_0.3.4-1+b1_i386
+libghc-gstreamer-dev_0.12.1-1+b2_i386
+libghc-gtk-dev_0.12.3-1+b2_i386
+libghc-gtkglext-dev_0.12.1-1+b3_i386
+libghc-gtksourceview2-dev_0.12.3-1+b3_i386
+libghc-haddock-dev_2.10.0-1+b2_i386
+libghc-hakyll-dev_3.2.7.2-1+b5_i386
+libghc-hamlet-dev_1.0.1.3-1+b1_i386
+libghc-happstack-dev_7.0.0-1+b1_i386
+libghc-happstack-server-dev_7.0.1-1+b1_i386
+libghc-harp-dev_0.4-3+b1_i386
+libghc-hashable-dev_1.1.2.3-1+b2_i386
+libghc-hashed-storage-dev_0.5.9-2+b2_i386
+libghc-hashmap-dev_1.3.0.1-1+b2_i386
+libghc-hashtables-dev_1.0.1.4-1+b1_i386
+libghc-haskeline-dev_0.6.4.7-1+b1_i386
+libghc-haskell-lexer-dev_1.0-3+b1_i386
+libghc-haskell-src-dev_1.0.1.5-1+b2_i386
+libghc-haskelldb-dev_2.1.1-5+b1_i386
+libghc-haskelldb-hdbc-dev_2.1.0-4_i386
+libghc-haskelldb-hdbc-odbc-dev_2.1.0-3_i386
+libghc-haskelldb-hdbc-postgresql-dev_2.1.0-3_i386
+libghc-haskelldb-hdbc-sqlite3-dev_2.1.0-3_i386
+libghc-haskore-dev_0.2.0.3-2_i386
+libghc-hastache-dev_0.3.3-2+b3_i386
+libghc-haxml-dev_1:1.22.5-2+b2_i386
+libghc-haxr-dev_3000.8.5-1+b3_i386
+libghc-hcard-dev_0.0-2+b2_i386
+libghc-hcwiid-dev_0.0.1-3+b1_i386
+libghc-hdbc-dev_2.3.1.1-1+b3_i386
+libghc-hdbc-odbc-dev_2.2.3.0-5+b3_i386
+libghc-hdbc-postgresql-dev_2.3.2.1-1+b3_i386
+libghc-hdbc-sqlite3-dev_2.3.3.0-1+b3_i386
+libghc-hfuse-dev_0.2.4.1-1_i386
+libghc-highlighting-kate-dev_0.5.1-1_i386
+libghc-hinotify-dev_0.3.2-1+b1_i386
+libghc-hint-dev_0.3.3.4-2+b4_i386
+libghc-hipmunk-dev_5.2.0.8-1+b1_i386
+libghc-hjavascript-dev_0.4.7-3+b1_i386
+libghc-hjscript-dev_0.5.0-3+b2_i386
+libghc-hjsmin-dev_0.1.1-1+b2_i386
+libghc-hlint-dev_1.8.28-1+b3_i386
+libghc-hoauth-dev_0.3.4-1+b1_i386
+libghc-hostname-dev_1.0-4+b1_i386
+libghc-hs-bibutils-dev_4.12-5+b2_i386
+libghc-hs3-dev_0.5.6-2+b4_i386
+libghc-hscolour-dev_1.19-3+b1_i386
+libghc-hscurses-dev_1.4.1.0-1+b2_i386
+libghc-hsemail-dev_1.7.1-2+b3_i386
+libghc-hsh-dev_2.0.3-6+b3_i386
+libghc-hslogger-dev_1.1.4+dfsg1-2+b3_i386
+libghc-hsp-dev_0.6.1-2+b3_i386
+libghc-hspec-dev_1.1.0-1+b1_i386
+libghc-hsql-dev_1.8.1-4_i386
+libghc-hsql-mysql-dev_1.8.1-4+b1_i386
+libghc-hsql-odbc-dev_1.8.1.1-2_i386
+libghc-hsql-postgresql-dev_1.8.1-3_i386
+libghc-hsql-sqlite3-dev_1.8.1-2_i386
+libghc-hssyck-dev_0.50-2+b2_i386
+libghc-hstringtemplate-dev_0.6.8-1_i386
+libghc-hsx-dev_0.9.1-3_i386
+libghc-html-conduit-dev_0.0.1-2_i386
+libghc-html-dev_1.0.1.2-5+b1_i386
+libghc-http-conduit-dev_1.4.1.6-3_i386
+libghc-http-date-dev_0.0.2-1+b2_i386
+libghc-http-dev_1:4000.2.3-1+b2_i386
+libghc-http-types-dev_0.6.11-1_i386
+libghc-hunit-dev_1.2.4.2-2+b1_i386
+libghc-hxt-cache-dev_9.0.2-2+b3_i386
+libghc-hxt-charproperties-dev_9.1.1-2+b1_i386
+libghc-hxt-curl-dev_9.1.1-1+b4_i386
+libghc-hxt-dev_9.2.2-2+b3_i386
+libghc-hxt-http-dev_9.1.4-2+b3_i386
+libghc-hxt-regex-xmlschema-dev_9.0.4-2+b3_i386
+libghc-hxt-relaxng-dev_9.1.4-1+b3_i386
+libghc-hxt-tagsoup-dev_9.1.1-1+b4_i386
+libghc-hxt-unicode-dev_9.0.2-2+b1_i386
+libghc-hxt-xpath-dev_9.1.2-1+b4_i386
+libghc-hxt-xslt-dev_9.1.1-1+b3_i386
+libghc-iconv-dev_0.4.1.0-2+b1_i386
+libghc-ieee754-dev_0.7.3-1+b1_i386
+libghc-ifelse-dev_0.85-4+b1_i386
+libghc-io-choice-dev_0.0.1-1+b3_i386
+libghc-io-storage-dev_0.3-2+b1_i386
+libghc-iospec-dev_0.2.5-1+b2_i386
+libghc-irc-dev_0.5.0.0-1+b3_i386
+libghc-iteratee-dev_0.8.8.2-2+b1_i386
+libghc-ixset-dev_1.0.3-2+b1_i386
+libghc-json-dev_0.5-2+b2_i386
+libghc-keys-dev_2.1.3.2-1+b1_i386
+libghc-knob-dev_0.1.1-1_i386
+libghc-lambdabot-utils-dev_4.2.1-3+b3_i386
+libghc-language-c-dev_0.4.2-2+b2_i386
+libghc-language-haskell-extract-dev_0.2.1-4+b1_i386
+libghc-language-javascript-dev_0.5.4-1+b2_i386
+libghc-largeword-dev_1.0.1-2+b1_i386
+libghc-lazysmallcheck-dev_0.6-1+b1_i386
+libghc-ldap-dev_0.6.6-4.1+b1_i386
+libghc-leksah-server-dev_0.12.0.4-3_i386
+libghc-libtagc-dev_0.12.0-2+b1_i386
+libghc-libxml-sax-dev_0.7.2-2+b1_i386
+libghc-libzip-dev_0.10-1+b2_i386
+libghc-lifted-base-dev_0.1.1-1+b1_i386
+libghc-listlike-dev_3.1.4-1+b1_i386
+libghc-llvm-base-dev_3.0.1.0-1_i386
+libghc-llvm-dev_3.0.1.0-1+b1_i386
+libghc-logict-dev_0.5.0.1-1+b1_i386
+libghc-ltk-dev_0.12.0.0-2+b1_i386
+libghc-maccatcher-dev_2.1.5-2+b3_i386
+libghc-magic-dev_1.0.8-8+b1_i386
+libghc-markov-chain-dev_0.0.3.2-1+b1_i386
+libghc-math-functions-dev_0.1.1.0-2+b2_i386
+libghc-maths-dev_0.4.3-1+b1_i386
+libghc-maybet-dev_0.1.2-3+b2_i386
+libghc-mbox-dev_0.1-2+b1_i386
+libghc-memotrie-dev_0.5-1_i386
+libghc-mersenne-random-dev_1.0.0.1-2+b1_i386
+libghc-midi-dev_0.2.0.1-1+b1_i386
+libghc-mime-mail-dev_0.4.1.1-2+b3_i386
+libghc-missingh-dev_1.1.0.3-6+b3_i386
+libghc-mmap-dev_0.5.7-2+b1_i386
+libghc-monad-control-dev_0.3.1.3-1+b1_i386
+libghc-monad-loops-dev_0.3.2.0-1_i386
+libghc-monad-par-dev_0.1.0.3-2+b1_i386
+libghc-monadcatchio-mtl-dev_0.3.0.4-2+b2_i386
+libghc-monadcatchio-transformers-dev_0.3.0.0-2+b1_i386
+libghc-monadcryptorandom-dev_0.4.1-1+b2_i386
+libghc-monadrandom-dev_0.1.6-2+b2_i386
+libghc-monads-tf-dev_0.1.0.0-1+b2_i386
+libghc-monoid-transformer-dev_0.0.2-3+b1_i386
+libghc-mtl-dev_2.1.1-1_i386
+libghc-mtlparse-dev_0.1.2-2+b2_i386
+libghc-murmur-hash-dev_0.1.0.5-2+b1_i386
+libghc-mwc-random-dev_0.11.0.0-4+b1_i386
+libghc-ncurses-dev_0.2.1-1+b1_i386
+libghc-netwire-dev_3.1.0-2+b5_i386
+libghc-network-conduit-dev_0.4.0.1-2_i386
+libghc-network-dev_2.3.0.13-1+b2_i386
+libghc-network-protocol-xmpp-dev_0.4.3-1_i386
+libghc-newtype-dev_0.2-1_i386
+libghc-non-negative-dev_0.1-2+b1_i386
+libghc-numbers-dev_2009.8.9-2+b1_i386
+libghc-numeric-quest-dev_0.2-1+b1_i386
+libghc-numinstances-dev_1.0-2+b1_i386
+libghc-numtype-dev_1.0-2+b1_i386
+libghc-oeis-dev_0.3.1-2+b3_i386
+libghc-openal-dev_1.3.1.3-4+b1_i386
+libghc-opengl-dev_2.2.3.1-1+b1_i386
+libghc-openpgp-asciiarmor-dev_0.1-1+b2_i386
+libghc-options-dev_0.1.1-1_i386
+libghc-pandoc-dev_1.9.4.2-2_i386
+libghc-pandoc-types-dev_1.9.1-1+b2_i386
+libghc-pango-dev_0.12.2-1+b2_i386
+libghc-parallel-dev_3.2.0.2-2+b1_i386
+libghc-parseargs-dev_0.1.3.2-2+b1_i386
+libghc-parsec2-dev_2.1.0.1-6+b1_i386
+libghc-parsec3-dev_3.1.2-1+b3_i386
+libghc-pastis-dev_0.1.2-2+b3_i386
+libghc-path-pieces-dev_0.1.0-1+b2_i386
+libghc-patience-dev_0.1.1-1_i386
+libghc-pcre-light-dev_0.4-3+b1_i386
+libghc-pem-dev_0.1.1-1+b3_i386
+libghc-persistent-dev_0.9.0.4-2_i386
+libghc-persistent-sqlite-dev_0.9.0.2-2_i386
+libghc-persistent-template-dev_0.9.0.2-1_i386
+libghc-polyparse-dev_1.7-1+b2_i386
+libghc-pool-conduit-dev_0.1.0.2-1_i386
+libghc-postgresql-libpq-dev_0.8.2-1_i386
+libghc-postgresql-simple-dev_0.1.4.3-1_i386
+libghc-pretty-show-dev_1.1.1-4+b1_i386
+libghc-primes-dev_0.2.1.0-2+b1_i386
+libghc-primitive-dev_0.4.1-1+b1_i386
+libghc-psqueue-dev_1.1-2+b1_i386
+libghc-puremd5-dev_2.1.0.3-2+b4_i386
+libghc-pwstore-fast-dev_2.2-2+b4_i386
+libghc-quickcheck1-dev_1.2.0.1-2+b1_i386
+libghc-quickcheck2-dev_2.4.2-1+b1_i386
+libghc-random-dev_1.0.1.1-1+b1_i386
+libghc-random-shuffle-dev_0.0.3-2+b2_i386
+libghc-ranged-sets-dev_0.3.0-2+b1_i386
+libghc-ranges-dev_0.2.4-2+b1_i386
+libghc-reactive-banana-dev_0.6.0.0-1+b3_i386
+libghc-readline-dev_1.0.1.0-3+b1_i386
+libghc-recaptcha-dev_0.1-4+b3_i386
+libghc-regex-base-dev_0.93.2-2+b2_i386
+libghc-regex-compat-dev_0.95.1-2+b1_i386
+libghc-regex-pcre-dev_0.94.2-2+b1_i386
+libghc-regex-posix-dev_0.95.1-2+b1_i386
+libghc-regex-tdfa-dev_1.1.8-2+b1_i386
+libghc-regex-tdfa-utf8-dev_1.0-5+b3_i386
+libghc-regexpr-dev_0.5.4-2+b2_i386
+libghc-representable-functors-dev_2.4.0.2-1+b1_i386
+libghc-representable-tries-dev_2.4.0.2-1_i386
+libghc-resource-pool-dev_0.2.1.0-2+b4_i386
+libghc-resourcet-dev_0.3.2.1-1+b1_i386
+libghc-rsa-dev_1.2.1.0-1+b1_i386
+libghc-safe-dev_0.3.3-1+b1_i386
+libghc-safecopy-dev_0.6.1-1+b1_i386
+libghc-sdl-dev_0.6.3-1+b1_i386
+libghc-sdl-gfx-dev_0.6.0-3+b1_i386
+libghc-sdl-image-dev_0.6.1-3+b1_i386
+libghc-sdl-mixer-dev_0.6.1-3+b1_i386
+libghc-sdl-ttf-dev_0.6.1-3+b1_i386
+libghc-semigroupoids-dev_1.3.1.2-1+b1_i386
+libghc-semigroups-dev_0.8.3.2-1_i386
+libghc-sendfile-dev_0.7.6-1+b2_i386
+libghc-sha-dev_1.5.0.1-1_i386
+libghc-shakespeare-css-dev_1.0.1.2-1+b1_i386
+libghc-shakespeare-dev_1.0.0.2-1+b1_i386
+libghc-shakespeare-i18n-dev_1.0.0.2-1+b1_i386
+libghc-shakespeare-js-dev_1.0.0.2-1+b1_i386
+libghc-shakespeare-text-dev_1.0.0.2-1+b1_i386
+libghc-shellac-dev_0.9.5.1-2+b2_i386
+libghc-show-dev_0.4.1.2-1+b2_i386
+libghc-silently-dev_1.1.4-1+b2_i386
+libghc-simple-sendfile-dev_0.2.3-1+b2_i386
+libghc-simpleea-dev_0.1.1-2+b2_i386
+libghc-simpleirc-dev_0.2.1-2+b3_i386
+libghc-skein-dev_0.1.0.7-2+b1_i386
+libghc-smallcheck-dev_0.6-1+b1_i386
+libghc-smtpclient-dev_1.0.4-3+b3_i386
+libghc-snap-core-dev_0.8.1-1+b4_i386
+libghc-snap-server-dev_0.8.1.1-1_i386
+libghc-socks-dev_0.4.1-1+b4_i386
+libghc-split-dev_0.1.4.2-2_i386
+libghc-src-exts-dev_1.11.1-3+b1_i386
+libghc-statevar-dev_1.0.0.0-2+b1_i386
+libghc-static-hash-dev_0.0.1-3+b2_i386
+libghc-statistics-dev_0.10.1.0-2+b1_i386
+libghc-stm-dev_2.3-1_i386
+libghc-stream-dev_0.4.6-1+b1_i386
+libghc-strict-concurrency-dev_0.2.4.1-2+b1_i386
+libghc-strict-dev_0.3.2-2+b1_i386
+libghc-strptime-dev_1.0.6-1_i386
+libghc-svgcairo-dev_0.12.1-1+b2_i386
+libghc-syb-dev_0.3.6.1-1_i386
+libghc-syb-with-class-dev_0.6.1.3-1+b1_i386
+libghc-syb-with-class-instances-text-dev_0.0.1-3+b2_i386
+libghc-system-fileio-dev_0.3.8-1_i386
+libghc-system-filepath-dev_0.4.6-1+b2_i386
+libghc-tagged-dev_0.4.2.1-1_i386
+libghc-tagsoup-dev_0.12.6-1+b3_i386
+libghc-tagstream-conduit-dev_0.3.2-1_i386
+libghc-tar-dev_0.3.2.0-2+b1_i386
+libghc-template-dev_0.2.0.7-1+b1_i386
+libghc-temporary-dev_1.1.2.3-1+b1_i386
+libghc-terminfo-dev_0.3.2.3-1+b1_i386
+libghc-test-framework-dev_0.6-1+b1_i386
+libghc-test-framework-hunit-dev_0.2.7-1+b3_i386
+libghc-test-framework-quickcheck2-dev_0.2.12.1-1+b1_i386
+libghc-test-framework-th-dev_0.2.2-5_i386
+libghc-test-framework-th-prime-dev_0.0.5-1_i386
+libghc-testpack-dev_2.1.1-1+b2_i386
+libghc-texmath-dev_0.6.0.6-1+b2_i386
+libghc-text-dev_0.11.2.0-1_i386
+libghc-text-icu-dev_0.6.3.4-2+b2_i386
+libghc-tinyurl-dev_0.1.0-2+b3_i386
+libghc-tls-dev_0.9.5-1+b4_i386
+libghc-tls-extra-dev_0.4.6.1-2_i386
+libghc-tokyocabinet-dev_0.0.5-5+b3_i386
+libghc-transformers-base-dev_0.4.1-2+b2_i386
+libghc-transformers-dev_0.3.0.0-1_i386
+libghc-type-level-dev_0.2.4-5_i386
+libghc-uniplate-dev_1.6.7-1+b2_i386
+libghc-unix-bytestring-dev_0.3.5-2+b1_i386
+libghc-unix-compat-dev_0.3.0.1-1+b1_i386
+libghc-unixutils-dev_1.50-1+b1_i386
+libghc-unlambda-dev_0.1-2+b2_i386
+libghc-unordered-containers-dev_0.2.1.0-1_i386
+libghc-uri-dev_0.1.6-1+b2_i386
+libghc-url-dev_2.1.2-4+b1_i386
+libghc-utf8-light-dev_0.4.0.1-2+b1_i386
+libghc-utf8-string-dev_0.3.7-1+b1_i386
+libghc-utility-ht-dev_0.0.5.1-3+b1_i386
+libghc-uuagc-cabal-dev_1.0.2.0-1+b1_i386
+libghc-uuid-dev_1.2.3-2+b4_i386
+libghc-uulib-dev_0.9.14-2_i386
+libghc-vault-dev_0.2.0.0-1+b2_i386
+libghc-vector-algorithms-dev_0.5.4-1+b2_i386
+libghc-vector-dev_0.9.1-2+b1_i386
+libghc-vector-space-dev_0.8.1-1_i386
+libghc-vector-space-points-dev_0.1.1.0-1+b1_i386
+libghc-void-dev_0.5.5.1-2+b1_i386
+libghc-vte-dev_0.12.1-1+b3_i386
+libghc-vty-dev_4.7.0.14-1+b1_i386
+libghc-wai-app-file-cgi-dev_0.5.8-1+b4_i386
+libghc-wai-app-static-dev_1.2.0.3-1+b3_i386
+libghc-wai-dev_1.2.0.2-1+b2_i386
+libghc-wai-extra-dev_1.2.0.4-1_i386
+libghc-wai-logger-dev_0.1.4-1+b6_i386
+libghc-wai-logger-prefork-dev_0.1.3-1+b6_i386
+libghc-wai-test-dev_1.2.0.2-1_i386
+libghc-warp-dev_1.2.1.1-1_i386
+libghc-warp-tls-dev_1.2.0.4-1+b4_i386
+libghc-web-routes-dev_0.25.3-2+b3_i386
+libghc-webkit-dev_0.12.3-2+b1_i386
+libghc-weighted-regexp-dev_0.3.1.1-2+b1_i386
+libghc-x11-dev_1.5.0.1-1+b2_i386
+libghc-x11-xft-dev_0.3.1-1+b3_i386
+libghc-xdg-basedir-dev_0.2.1-2+b1_i386
+libghc-xhtml-dev_3000.2.1-1_i386
+libghc-xml-conduit-dev_0.7.0.2-1_i386
+libghc-xml-dev_1.3.12-1+b2_i386
+libghc-xml-types-dev_0.3.1-2+b2_i386
+libghc-xml2html-dev_0.1.2.3-1_i386
+libghc-xmonad-contrib-dev_0.10-4~deb7u1_i386
+libghc-xmonad-dev_0.10-4+b2_i386
+libghc-xss-sanitize-dev_0.3.2-1+b1_i386
+libghc-yaml-dev_0.7.0.2-1+b2_i386
+libghc-yaml-light-dev_0.1.4-2+b2_i386
+libghc-yesod-auth-dev_1.0.2.1-2+b2_i386
+libghc-yesod-core-dev_1.0.1.2-1+b3_i386
+libghc-yesod-default-dev_1.0.1.1-1+b1_i386
+libghc-yesod-dev_1.0.1.6-2+b3_i386
+libghc-yesod-form-dev_1.0.0.4-1+b1_i386
+libghc-yesod-json-dev_1.0.0.1-1+b3_i386
+libghc-yesod-markdown-dev_0.4.0-1+b3_i386
+libghc-yesod-persistent-dev_1.0.0.1-1+b1_i386
+libghc-yesod-routes-dev_1.0.1.2-1_i386
+libghc-yesod-static-dev_1.0.0.2-1+b3_i386
+libghc-yesod-test-dev_0.2.0.6-1_i386
+libghc-zip-archive-dev_0.1.1.7-3+b2_i386
+libghc-zlib-bindings-dev_0.1.0.1-1_i386
+libghc-zlib-conduit-dev_0.4.0.1-1_i386
+libghc-zlib-dev_0.5.3.3-1+b1_i386
+libghc-zlib-enum-dev_0.2.2.1-1+b1_i386
+libghc6-agda-dev_1:8_all
+libghc6-alut-dev_1:8_all
+libghc6-arrows-dev_1:8_all
+libghc6-binary-dev_1:8_all
+libghc6-binary-shared-dev_1:8_all
+libghc6-bzlib-dev_1:8_all
+libghc6-cairo-dev_1:8_all
+libghc6-cautious-file-dev_1:8_all
+libghc6-cgi-dev_1:8_all
+libghc6-colour-dev_1:8_all
+libghc6-configfile-dev_1:8_all
+libghc6-convertible-dev_1:8_all
+libghc6-cpphs-dev_1:8_all
+libghc6-criterion-dev_1:8_all
+libghc6-csv-dev_1:8_all
+libghc6-curl-dev_1:8_all
+libghc6-data-accessor-dev_1:8_all
+libghc6-dataenc-dev_1:8_all
+libghc6-datetime-dev_1:8_all
+libghc6-debian-dev_1:8_all
+libghc6-deepseq-dev_1:8_all
+libghc6-diagrams-dev_1:8_all
+libghc6-diff-dev_1:8_all
+libghc6-digest-dev_1:8_all
+libghc6-edison-api-dev_1:8_all
+libghc6-edison-core-dev_1:8_all
+libghc6-editline-dev_1:8_all
+libghc6-erf-dev_1:8_all
+libghc6-event-list-dev_1:8_all
+libghc6-explicit-exception-dev_1:8_all
+libghc6-fastcgi-dev_1:8_all
+libghc6-feed-dev_1:8_all
+libghc6-fgl-dev_1:8_all
+libghc6-filemanip-dev_1:8_all
+libghc6-filestore-dev_1:8_all
+libghc6-ftphs-dev_1:8_all
+libghc6-gconf-dev_1:8_all
+libghc6-ghc-events-dev_1:8_all
+libghc6-ghc-mtl-dev_1:8_all
+libghc6-ghc-paths-dev_1:8_all
+libghc6-gio-dev_1:8_all
+libghc6-gitit-dev_1:8_all
+libghc6-glade-dev_1:8_all
+libghc6-glfw-dev_1:8_all
+libghc6-glib-dev_1:8_all
+libghc6-glut-dev_1:8_all
+libghc6-gstreamer-dev_1:8_all
+libghc6-gtk-dev_1:8_all
+libghc6-gtkglext-dev_1:8_all
+libghc6-gtksourceview2-dev_1:8_all
+libghc6-haddock-dev_1:8_all
+libghc6-happstack-dev_1:8_all
+libghc6-happstack-server-dev_1:8_all
+libghc6-harp-dev_1:8_all
+libghc6-hashed-storage-dev_1:8_all
+libghc6-haskeline-dev_1:8_all
+libghc6-haskell-lexer-dev_1:8_all
+libghc6-haskell-src-dev_1:8_all
+libghc6-haskelldb-dev_1:8_all
+libghc6-haskelldb-hdbc-dev_1:8_all
+libghc6-haskelldb-hdbc-odbc-dev_1:8_all
+libghc6-haskelldb-hdbc-postgresql-dev_1:8_all
+libghc6-haskelldb-hdbc-sqlite3-dev_1:8_all
+libghc6-haskore-dev_1:8_all
+libghc6-haxml-dev_1:8_all
+libghc6-haxr-dev_1:8_all
+libghc6-hdbc-dev_1:8_all
+libghc6-hdbc-odbc-dev_1:8_all
+libghc6-hdbc-postgresql-dev_1:8_all
+libghc6-hdbc-sqlite3-dev_1:8_all
+libghc6-highlighting-kate-dev_1:8_all
+libghc6-hint-dev_1:8_all
+libghc6-hjavascript-dev_1:8_all
+libghc6-hjscript-dev_1:8_all
+libghc6-hoauth-dev_1:8_all
+libghc6-hscolour-dev_1:8_all
+libghc6-hscurses-dev_1:8_all
+libghc6-hsemail-dev_1:8_all
+libghc6-hsh-dev_1:8_all
+libghc6-hslogger-dev_1:8_all
+libghc6-hsp-dev_1:8_all
+libghc6-hsql-dev_1:8_all
+libghc6-hsql-mysql-dev_1:8_all
+libghc6-hsql-odbc-dev_1:8_all
+libghc6-hsql-postgresql-dev_1:8_all
+libghc6-hsql-sqlite3-dev_1:8_all
+libghc6-hstringtemplate-dev_1:8_all
+libghc6-hsx-dev_1:8_all
+libghc6-html-dev_1:8_all
+libghc6-http-dev_1:8_all
+libghc6-hunit-dev_1:8_all
+libghc6-hxt-dev_1:8_all
+libghc6-ifelse-dev_1:8_all
+libghc6-irc-dev_1:8_all
+libghc6-json-dev_1:8_all
+libghc6-language-c-dev_1:8_all
+libghc6-lazysmallcheck-dev_1:8_all
+libghc6-ldap-dev_1:8_all
+libghc6-leksah-server-dev_1:8_all
+libghc6-llvm-dev_1:8_all
+libghc6-ltk-dev_1:8_all
+libghc6-magic-dev_1:8_all
+libghc6-markov-chain-dev_1:8_all
+libghc6-maybet-dev_1:8_all
+libghc6-midi-dev_1:8_all
+libghc6-missingh-dev_1:8_all
+libghc6-mmap-dev_1:8_all
+libghc6-monadcatchio-mtl-dev_1:8_all
+libghc6-monoid-transformer-dev_1:8_all
+libghc6-mtl-dev_1:8_all
+libghc6-mwc-random-dev_1:8_all
+libghc6-network-dev_1:8_all
+libghc6-non-negative-dev_1:8_all
+libghc6-openal-dev_1:8_all
+libghc6-opengl-dev_1:8_all
+libghc6-pandoc-dev_1:8_all
+libghc6-pango-dev_1:8_all
+libghc6-parallel-dev_1:8_all
+libghc6-parsec2-dev_1:8_all
+libghc6-parsec3-dev_1:8_all
+libghc6-pcre-light-dev_1:8_all
+libghc6-polyparse-dev_1:8_all
+libghc6-pretty-show-dev_1:8_all
+libghc6-primitive-dev_1:8_all
+libghc6-quickcheck1-dev_1:8_all
+libghc6-quickcheck2-dev_1:8_all
+libghc6-recaptcha-dev_1:8_all
+libghc6-regex-base-dev_1:8_all
+libghc6-regex-compat-dev_1:8_all
+libghc6-regex-posix-dev_1:8_all
+libghc6-regex-tdfa-dev_1:8_all
+libghc6-regex-tdfa-utf8-dev_1:8_all
+libghc6-safe-dev_1:8_all
+libghc6-sdl-dev_1:8_all
+libghc6-sdl-gfx-dev_1:8_all
+libghc6-sdl-image-dev_1:8_all
+libghc6-sdl-mixer-dev_1:8_all
+libghc6-sdl-ttf-dev_1:8_all
+libghc6-sendfile-dev_1:8_all
+libghc6-sha-dev_1:8_all
+libghc6-smtpclient-dev_1:8_all
+libghc6-split-dev_1:8_all
+libghc6-src-exts-dev_1:8_all
+libghc6-statistics-dev_1:8_all
+libghc6-stm-dev_1:8_all
+libghc6-stream-dev_1:8_all
+libghc6-strict-concurrency-dev_1:8_all
+libghc6-svgcairo-dev_1:8_all
+libghc6-syb-with-class-dev_1:8_all
+libghc6-syb-with-class-instances-text-dev_1:8_all
+libghc6-tagsoup-dev_1:8_all
+libghc6-tar-dev_1:8_all
+libghc6-terminfo-dev_1:8_all
+libghc6-testpack-dev_1:8_all
+libghc6-texmath-dev_1:8_all
+libghc6-text-dev_1:8_all
+libghc6-tokyocabinet-dev_1:8_all
+libghc6-transformers-dev_1:8_all
+libghc6-type-level-dev_1:8_all
+libghc6-uniplate-dev_1:8_all
+libghc6-unix-compat-dev_1:8_all
+libghc6-unixutils-dev_1:8_all
+libghc6-url-dev_1:8_all
+libghc6-utility-ht-dev_1:8_all
+libghc6-uulib-dev_1:8_all
+libghc6-vector-algorithms-dev_1:8_all
+libghc6-vector-dev_1:8_all
+libghc6-vte-dev_1:8_all
+libghc6-vty-dev_1:8_all
+libghc6-webkit-dev_1:8_all
+libghc6-x11-dev_1:8_all
+libghc6-x11-xft-dev_1:8_all
+libghc6-xhtml-dev_1:8_all
+libghc6-xml-dev_1:8_all
+libghc6-xmonad-contrib-dev_1:8_all
+libghc6-xmonad-dev_1:8_all
+libghc6-zip-archive-dev_1:8_all
+libghc6-zlib-dev_1:8_all
+libghemical-dev_3.0.0-2_i386
+libgif-dev_4.1.6-10_i386
+libgiftiio-dev_1.0.9-1_i386
+libgig-dev_3.3.0-2_i386
+libgii1-dev_1:1.0.2-4.1_i386
+libgimp2.0-dev_2.8.2-2+deb7u1_i386
+libginac-dev_1.6.2-1_i386
+libginspx-dev_20050529-3.1_i386
+libgio2.0-cil-dev_2.22.3-2_all
+libgirara-dev_0.1.2-3_i386
+libgirepository1.0-dev_1.32.1-1_i386
+libgjs-dev_1.32.0-5_i386
+libgkeyfile-cil-dev_0.1-4_all
+libgksu2-dev_2.0.13~pre1-6_i386
+libgl1-mesa-dev_8.0.5-4+deb7u2_i386
+libgl1-mesa-swx11-dev_8.0.5-4+deb7u2_i386
+libgl2ps-dev_1.3.6-1_i386
+libglade2-dev_1:2.6.4-1_i386
+libglade2.0-cil-dev_2.12.10-5_i386
+libglademm-2.4-dev_2.6.7-2_i386
+libgladeui-1-dev_3.6.7-2.1_i386
+libgladeui-dev_3.12.1-1_i386
+libglbsp-dev_2.24-1_i386
+libglc-dev_0.7.2-5+b1_i386
+libgle3-dev_3.1.0-7_i386
+libgles1-mesa-dev_8.0.5-4+deb7u2_i386
+libgles2-mesa-dev_8.0.5-4+deb7u2_i386
+libglew-dev_1.7.0-3_i386
+libglewmx-dev_1.7.0-3_i386
+libglfw-dev_2.7.2-1_i386
+libglib2.0-cil-dev_2.12.10-5_i386
+libglib2.0-dev_2.33.12+really2.32.4-5_i386
+libglibmm-2.4-dev_2.32.1-1_i386
+libglide2-dev_2002.04.10ds1-7_i386
+libglide3-dev_2002.04.10ds1-7_i386
+libglm-dev_0.9.3.3+dfsg-0.1_all
+libglobus-authz-callout-error-dev_2.2-1_i386
+libglobus-authz-dev_2.2-1_i386
+libglobus-callout-dev_2.2-1_i386
+libglobus-common-dev_14.7-2_i386
+libglobus-ftp-client-dev_7.3-1_i386
+libglobus-ftp-control-dev_4.4-1_i386
+libglobus-gass-cache-dev_8.1-2_i386
+libglobus-gass-copy-dev_8.4-1_i386
+libglobus-gass-server-ez-dev_4.3-1_i386
+libglobus-gass-transfer-dev_7.2-1_i386
+libglobus-gfork-dev_3.2-1_i386
+libglobus-gram-client-dev_12.4-1_i386
+libglobus-gram-job-manager-callout-error-dev_2.1-2_i386
+libglobus-gram-protocol-dev_11.3-1_i386
+libglobus-gridftp-server-control-dev_2.5-2_i386
+libglobus-gridftp-server-dev_6.10-2_i386
+libglobus-gridmap-callout-error-dev_1.2-2_i386
+libglobus-gsi-callback-dev_4.2-1_i386
+libglobus-gsi-cert-utils-dev_8.3-1_i386
+libglobus-gsi-credential-dev_5.3-1_i386
+libglobus-gsi-openssl-error-dev_2.1-2_i386
+libglobus-gsi-proxy-core-dev_6.2-1_i386
+libglobus-gsi-proxy-ssl-dev_4.1-2_i386
+libglobus-gsi-sysconfig-dev_5.2-1_i386
+libglobus-gss-assist-dev_8.5-1_i386
+libglobus-gssapi-error-dev_4.1-2_i386
+libglobus-gssapi-gsi-dev_10.6-1_i386
+libglobus-io-dev_9.3-1_i386
+libglobus-openssl-module-dev_3.2-1_i386
+libglobus-rls-client-dev_5.2-8_i386
+libglobus-rsl-dev_9.1-2_i386
+libglobus-scheduler-event-generator-dev_4.6-1_i386
+libglobus-usage-dev_3.1-2_i386
+libglobus-xio-dev_3.3-1_i386
+libglobus-xio-gsi-driver-dev_2.3-1_i386
+libglobus-xio-pipe-driver-dev_2.2-1_i386
+libglobus-xio-popen-driver-dev_2.3-1_i386
+libgloox-dev_1.0-1.1_i386
+libglpk-dev_4.45-1_i386
+libglrr-glib-dev_20050529-3.1_i386
+libglrr-gobject-dev_20050529-3.1_i386
+libglrr-gtk-dev_20050529-3.1_i386
+libglrr-widgets-dev_20050529-3.1_i386
+libglu1-mesa-dev_8.0.5-4+deb7u2_i386
+libglui-dev_2.36-4_i386
+libglw1-mesa-dev_8.0.0-1_i386
+libgme-dev_0.5.5-2_i386
+libgmerlin-avdec-dev_1.2.0~dfsg-1+b1_i386
+libgmerlin-dev_1.2.0~dfsg+1-1_i386
+libgmime-2.6-dev_2.6.10-1_i386
+libgmime2.6-cil-dev_2.6.10-1_all
+libgmlib-dev_1.0.6-1_i386
+libgmm++-dev_4.1.1+dfsg1-11_all
+libgmp-dev_2:5.0.5+dfsg-2_i386
+libgmp-ocaml-dev_20021123-17+b3_i386
+libgmp3-dev_2:5.0.5+dfsg-2_i386
+libgmpada3-dev_0.0.20120331-1_i386
+libgmt-dev_4.5.7-2_i386
+libgmtk-dev_1.0.6-1_i386
+libgnadecommon2-dev_1.6.2-9_i386
+libgnadeodbc2-dev_1.6.2-9_i386
+libgnadesqlite3-2-dev_1.6.2-9_i386
+libgnatprj4.6-dev_4.6.3-8_i386
+libgnatvsn4.6-dev_4.6.3-8_i386
+libgnelib-dev_0.75+svn20091130-1+b1_i386
+libgnet-dev_2.0.8-2.2_i386
+libgnokii-dev_0.6.30+dfsg-1+b1_i386
+libgnome-bluetooth-dev_3.4.2-1_i386
+libgnome-desktop-3-dev_3.4.2-1_i386
+libgnome-desktop-dev_2.32.1-2_i386
+libgnome-keyring-dev_3.4.1-1_i386
+libgnome-keyring1.0-cil-dev_1.0.0-4_i386
+libgnome-mag-dev_1:0.16.3-1_i386
+libgnome-media-profiles-dev_3.0.0-1_i386
+libgnome-menu-3-dev_3.4.2-5_i386
+libgnome-menu-dev_3.0.1-4_i386
+libgnome-speech-dev_1:0.4.25-5_i386
+libgnome-vfs2.0-cil-dev_2.24.2-3_all
+libgnome-vfsmm-2.6-dev_2.26.0-1_i386
+libgnome2-dev_2.32.1-3_i386
+libgnome2.0-cil-dev_2.24.2-3_i386
+libgnomeada2.24.1-dev_2.24.1-7_i386
+libgnomecanvas2-dev_2.30.3-1.2_i386
+libgnomecanvasmm-2.6-dev_2.26.0-1_i386
+libgnomecups1.0-dev_0.2.3-5_i386
+libgnomedesktop2.0-cil-dev_2.26.0-8_all
+libgnomekbd-dev_3.4.0.2-1_i386
+libgnomemm-2.6-dev_2.30.0-1_i386
+libgnomeprint2.2-dev_2.18.8-3_i386
+libgnomeprintui2.2-dev_2.18.6-3_i386
+libgnomeui-dev_2.24.5-2_i386
+libgnomeuimm-2.6-dev_2.28.0-1_i386
+libgnomevfs2-dev_1:2.24.4-2_i386
+libgnuift0-dev_0.1.14-12_i386
+libgnuplot-ocaml-dev_0.8.3-3_i386
+libgnustep-base-dev_1.22.1-4_i386
+libgnustep-dl2-dev_0.12.0-9+nmu1_i386
+libgnustep-gui-dev_0.20.0-3_i386
+libgnutls-dev_2.12.20-8+deb7u1_i386
+libgoa-1.0-dev_3.4.2-2_i386
+libgoffice-0.8-dev_0.8.17-1.2_i386
+libgofigure-dev_0.9.0-1+b2_i386
+libgoocanvas-dev_0.15-1_i386
+libgoocanvasmm-dev_0.15.4-1_i386
+libgoogle-perftools-dev_2.0-2_i386
+libgooglepinyin0-dev_0.1.2-1_i386
+libgpac-dev_0.5.0~dfsg0-1_i386
+libgpds-dev_1.5.1-6_i386
+libgpelaunch-dev_0.14-6_i386
+libgpepimc-dev_0.9-4_i386
+libgpeschedule-dev_0.17-4_i386
+libgpevtype-dev_0.50-6_i386
+libgpewidget-dev_0.117-6_i386
+libgpg-error-dev_1.10-3.1_i386
+libgpgme11-dev_1.2.0-1.4_i386
+libgphoto2-2-dev_2.4.14-2_i386
+libgpiv3-dev_0.6.1-4_i386
+libgpm-dev_1.20.4-6_i386
+libgpod-cil-dev_0.8.2-7_i386
+libgpod-dev_0.8.2-7_i386
+libgpod-nogtk-dev_0.8.2-7_i386
+libgportugol-dev_1.1-2_i386
+libgps-dev_3.6-4+deb7u1_i386
+libgraflib1-dev_20061220+dfsg3-2_i386
+libgrafx11-1-dev_20061220+dfsg3-2_i386
+libgrantlee-dev_0.1.4-1_i386
+libgraphicsmagick++1-dev_1.3.16-1.1_i386
+libgraphicsmagick1-dev_1.3.16-1.1_i386
+libgraphite-dev_1:2.3.1-0.2_i386
+libgraphite2-dev_1.1.3-1_i386
+libgraphviz-dev_2.26.3-14+deb7u1_i386
+libgretl1-dev_1.9.9-1_i386
+libgrib-api-dev_1.9.16-2+b1_i386
+libgrib2c-dev_1.2.2-2+b1_i386
+libgridsite-dev_1.7.16-1_i386
+libgrilo-0.1-dev_0.1.19-1_i386
+libgringotts-dev_1.2.10~pre3-1_i386
+libgrits-dev_0.7-1_i386
+libgrok-dev_1.20110708.1-4_i386
+libgrss-dev_0.5.0-1_i386
+libgs-dev_9.05~dfsg-6.3+deb7u1_i386
+libgsasl7-dev_1.8.0-2_i386
+libgsecuredelete-dev_0.2-1_i386
+libgsf-1-dev_1.14.21-2.1_i386
+libgsf-gnome-1-dev_1.14.21-2.1_i386
+libgsl0-dev_1.15+dfsg.2-2_i386
+libgsm0710-dev_1.2.2-2_i386
+libgsm0710mux-dev_0.11.2-1.1_i386
+libgsm1-dev_1.0.13-4_i386
+libgsmme-dev_1.10-13.2_i386
+libgsnmp0-dev_0.3.0-1.1_i386
+libgsql-dev_0.2.2-1.2+b1_i386
+libgss-dev_1.0.2-1_i386
+libgssdp-1.0-dev_0.12.2.1-2_i386
+libgssglue-dev_0.4-2_i386
+libgst-dev_3.2.4-2_i386
+libgstbuzztard-dev_0.5.0-2+deb7u1_i386
+libgstreamer-ocaml-dev_0.1.0-3+b1_i386
+libgstreamer-plugins-bad0.10-dev_0.10.23-7.1+deb7u1_i386
+libgstreamer-plugins-base0.10-dev_0.10.36-1.1_i386
+libgstreamer0.10-cil-dev_0.9.2-4_all
+libgstreamer0.10-dev_0.10.36-1.2_i386
+libgstrtspserver-0.10-dev_0.10.8-3_i386
+libgtest-dev_1.6.0-2_i386
+libgtextutils-dev_0.6.2-1_i386
+libgtg-dev_0.2+dfsg-1_i386
+libgtk-3-dev_3.4.2-7_i386
+libgtk-sharp-beans2.0-cil-dev_2.14.1-3_all
+libgtk-vnc-1.0-dev_0.5.0-3.1_i386
+libgtk-vnc-2.0-dev_0.5.0-3.1_i386
+libgtk2.0-cil-dev_2.12.10-5_i386
+libgtk2.0-dev_2.24.10-2_i386
+libgtkada2.24.1-dev_2.24.1-7_i386
+libgtkdatabox-0.9.1-1-dev_1:0.9.1.1-4_i386
+libgtkgl2.0-dev_2.0.1-2_i386
+libgtkglada2.24.1-dev_2.24.1-7_i386
+libgtkglarea-cil-dev_0.0.17-6_all
+libgtkglext1-dev_1.2.0-2_i386
+libgtkglextmm-x11-1.2-dev_1.2.0-4.1_i386
+libgtkhex-3-dev_3.4.1-1_i386
+libgtkhotkey-dev_0.2.1-3_i386
+libgtkhtml-4.0-dev_4.4.4-1_i386
+libgtkhtml-editor-3.14-dev_3.32.2-2.1_i386
+libgtkhtml-editor-4.0-dev_4.4.4-1_i386
+libgtkhtml3.14-cil-dev_2.26.0-8_i386
+libgtkhtml3.14-dev_3.32.2-2.1_i386
+libgtkimageview-dev_1.6.4+dfsg-0.1_i386
+libgtkmathview-dev_0.8.0-8_i386
+libgtkmm-2.4-dev_1:2.24.2-1_i386
+libgtkmm-3.0-dev_3.4.2-1_i386
+libgtkpod-dev_2.1.2-1_i386
+libgtksourceview-3.0-dev_3.4.2-1_i386
+libgtksourceview2-cil-dev_2.26.0-8_i386
+libgtksourceview2.0-dev_2.10.4-1_i386
+libgtksourceviewmm-3.0-dev_3.2.0-1_i386
+libgtkspell-3-dev_3.0.0~hg20110814-1_i386
+libgtkspell-dev_2.0.16-1_i386
+libgtop2-dev_2.28.4-3_i386
+libgts-dev_0.7.6+darcs110121-1.1_i386
+libguac-dev_0.6.0-2_i386
+libgucharmap-2-90-dev_1:3.4.1.1-2.1_i386
+libgudev-1.0-dev_175-7.2_i386
+libgudev1.0-cil-dev_0.1-3_all
+libguess-dev_1.1-1_i386
+libguestfs-dev_1:1.18.1-1+deb7u3_i386
+libguestfs-gobject-dev_1:1.18.1-1+deb7u3_i386
+libguestfs-ocaml-dev_1:1.18.1-1+deb7u3_i386
+libguichan-dev_0.8.2-10+b1_i386
+libgupnp-1.0-dev_0.18.4-1_i386
+libgupnp-av-1.0-dev_0.10.3-1_i386
+libgupnp-dlna-1.0-dev_0.6.6-1_i386
+libgupnp-igd-1.0-dev_0.2.1-2_i386
+libgusb-dev_0.1.3-5_i386
+libgutenprint-dev_5.2.9-1_i386
+libgutenprintui2-dev_5.2.9-1_i386
+libguytools2-dev_2.0.1-1.1_i386
+libgvnc-1.0-dev_0.5.0-3.1_i386
+libgweather-3-dev_3.4.1-1+build1_i386
+libgwenhywfar60-dev_4.3.3-1_i386
+libgwrap-runtime-dev_1.9.14-1.1_i386
+libgwyddion20-dev_2.28-2_i386
+libgxps-dev_0.2.2-2_i386
+libgyoto0-dev_0.0.3-5_i386
+libh323plus-dev_1.24.0~dfsg2-1_i386
+libhaildb-dev_2.3.2-1.2_i386
+libhal-dev_0.5.14-8_i386
+libhal-storage-dev_0.5.14-8_i386
+libhamlib++-dev_1.2.15.1-1_i386
+libhamlib-dev_1.2.15.1-1_i386
+libhandoff-dev_0.1-5_i386
+libhangul-dev_0.1.0-2_i386
+libharminv-dev_1.3.1-9_i386
+libhashkit-dev_1.0.8-1_i386
+libhawknl-dev_1.6.8+dfsg2-1_i386
+libhbaapi-dev_2.2.5-1_i386
+libhbalinux-dev_1.0.14-1_i386
+libhd-dev_16.0-2.2_i386
+libhdate-dev_1.6-1_i386
+libhdf4-alt-dev_4.2r4-13_i386
+libhdf4-dev_4.2r4-13_i386
+libhdf4g-dev_4.2r4-13_all
+libhdf5-dev_1.8.8-9_i386
+libhdf5-mpi-dev_1.8.8-9_i386
+libhdf5-mpich2-dev_1.8.8-9_i386
+libhdf5-openmpi-dev_1.8.8-9_i386
+libhdf5-serial-dev_1.8.8-9_i386
+libhdfeos-dev_2.17v1.00.dfsg.1-3_i386
+libhdhomerun-dev_20120405-1_i386
+libhe5-hdfeos-dev_5.1.13.dfsg.1-3_i386
+libheartbeat2-dev_1:3.0.5-3_i386
+libhepmc-dev_2.06.09-1_i386
+libhepmcfio-dev_2.06.09-1_i386
+libhepmcinterface8-dev_8.1.65-1_i386
+libherwig59-2-dev_20061220+dfsg3-2_i386
+libhesiod-dev_3.0.2-21_i386
+libhfsp-dev_1.0.4-12_i386
+libhighgui-dev_2.3.1-11_i386
+libhippocanvas-dev_0.3.1-1.1_i386
+libhiredis-dev_0.10.1-7_i386
+libhivex-dev_1.3.6-2_i386
+libhivex-ocaml-dev_1.3.6-2_i386
+libhkl-dev_4.0.3-4_i386
+libhmsbeagle-dev_1.0-6_i386
+libhocr-dev_0.10.17-1+b2_i386
+libhpdf-dev_2.2.1-1_i386
+libhpmud-dev_3.12.6-3.1+deb7u1_i386
+libhsclient-dev_1.1.0-7-g1044a28-1_i386
+libhtmlcxx-dev_0.85-2_i386
+libhtp-dev_0.2.6-2_i386
+libhtsengine-dev_1.06-1_i386
+libhttp-ocaml-dev_0.1.5-1+b2_i386
+libhttrack-dev_3.46.1-1_i386
+libhunspell-dev_1.3.2-4_i386
+libhwloc-dev_1.4.1-4_i386
+libhx-dev_3.12.1-1_i386
+libhyantes-dev_1.3.0-1_i386
+libhyena-cil-dev_0.5-2_all
+libhyphen-dev_2.8.3-2_i386
+libhypre-dev_2.8.0b-1_all
+libhz-dev_0.3.16-3_i386
+libi2c-dev_3.1.0-2_all
+libibcm-dev_1.0.4-1.1_i386
+libibcommon-dev_1.1.2-20090314-1_i386
+libibdm-dev_1.2-OFED-1.4.2-1.3_i386
+libibmad-dev_1.2.3-20090314-1.1_i386
+libibtk-dev_0.0.14-12_i386
+libibumad-dev_1.2.3-20090314-1.1_i386
+libibus-1.0-dev_1.4.1-9+deb7u1_i386
+libibus-qt-dev_1.3.1-2.1_i386
+libibverbs-dev_1.1.6-1_i386
+libical-dev_0.48-2_i386
+libicapapi-dev_1:0.1.6-1.1_i386
+libicc-dev_2.12+argyll1.4.0-8_i386
+libicc-utils-dev_1.6.4-1+b1_i386
+libice-dev_2:1.0.8-2_i386
+libicee-dev_1.2.0-6.1_i386
+libicns-dev_0.8.1-1_i386
+libiconv-hook-dev_0.0.20021209-10_i386
+libics-dev_1.5.2-3_i386
+libicu-dev_4.8.1.1-12+deb7u1_i386
+libid3-3.8.3-dev_3.8.3-15_i386
+libid3tag0-dev_0.15.1b-10_i386
+libident-dev_0.22-3_i386
+libidl-dev_0.8.14-0.2_i386
+libidn11-dev_1.25-2_i386
+libidn2-0-dev_0.8-2_i386
+libido-0.1-dev_0.3.4-1_i386
+libido3-0.1-dev_0.3.4-1_i386
+libidzebra-2.0-dev_2.0.44-3_i386
+libiec16022-dev_0.2.4-1_i386
+libiec61883-dev_1.2.0-0.1_i386
+libieee1284-3-dev_0.2.11-10_i386
+libifp-dev_1.0.0.2-5_i386
+libifstat-dev_1.1-8_i386
+libigraph0-dev_0.5.4-2_i386
+libigstk4-dev_4.4.0-2+b1_i386
+libijs-dev_0.35-8_i386
+libiksemel-dev_1.2-4_i386
+libilmbase-dev_1.0.1-4_i386
+libimdi-dev_1.4.0-8_i386
+libiml-dev_1.0.3-4.2_i386
+libimlib2-dev_1.4.5-1_i386
+libimobiledevice-dev_1.1.1-4_i386
+libindi-dev_0.9.1-2_i386
+libindicate-dev_0.6.92-1_i386
+libindicate-gtk-dev_0.6.92-1_i386
+libindicate-gtk0.1-cil-dev_0.6.92-1_all
+libindicate-gtk3-dev_0.6.92-1_i386
+libindicate-qt-dev_0.2.5.91-5_i386
+libindicate0.1-cil-dev_0.6.92-1_all
+libindicator-dev_0.5.0-1_i386
+libindicator-messages-status-provider-dev_0.6.0-1_i386
+libindicator3-dev_0.5.0-1_i386
+libindigo-dev_1.0.0-2_i386
+libinfinity-0.5-dev_0.5.2-6.1_i386
+libini-config-dev_0.1.3-2_i386
+libinifiles-ocaml-dev_1.2-2_i386
+libinnodb-dev_1.0.6.6750-1_i386
+libinotify-ocaml-dev_1.0-1+b3_i386
+libinotifytools0-dev_3.14-1_i386
+libinput-pad-dev_1.0.1-2_i386
+libinsighttoolkit3-dev_3.20.1+git20120521-3_i386
+libinstpatch-dev_1.0.0-3_i386
+libint-dev_1.1.4-1_i386
+libiodbc2-dev_3.52.7-2+deb7u1_i386
+libion-dev_3.0.1~dfsg1-1_i386
+libipa-hbac-dev_1.8.4-2_i386
+libipathverbs-dev_1.2-1_i386
+libipe-dev_7.1.2-1_i386
+libipmiconsole-dev_1.1.5-3_i386
+libipmidetect-dev_1.1.5-3_i386
+libipmimonitoring-dev_1.1.5-3_i386
+libipset-dev_6.12.1-1_i386
+libiptcdata0-dev_1.0.4-3_i386
+libircclient-dev_1.3+dfsg1-3_i386
+libirman-dev_0.4.4-2_i386
+libirrlicht-dev_1.7.3+dfsg1-4_i386
+libisajet758-3-dev_20061220+dfsg3-2_i386
+libiscsi-dev_1.4.0-3_i386
+libisl-dev_0.10-3_i386
+libiso9660-dev_0.83-4_i386
+libisoburn-dev_1.2.2-2_i386
+libisofs-dev_1.2.2-1_i386
+libitl-dev_0.7.0-3_i386
+libitl-gobject-dev_0.2-1_i386
+libitpp-dev_4.2-4_i386
+libitsol-dev_1.0.0-2_i386
+libivykis-dev_0.30.1-2_i386
+libiw-dev_30~pre9-8_i386
+libjack-dev_1:0.121.3+20120418git75e3e20b-2.1_i386
+libjack-jackd2-dev_1.9.8~dfsg.4+20120529git007cdc37-5_i386
+libjalali-dev_0.4.0-1.1_i386
+libjama-dev_1.2.4-2_all
+libjana-dev_0.0.0+git20091215.9ec1da8a-2+b4_i386
+libjana-ecal-dev_0.0.0+git20091215.9ec1da8a-2+b4_i386
+libjana-gtk-dev_0.0.0+git20091215.9ec1da8a-2+b4_i386
+libjansson-dev_2.3.1-2_i386
+libjasper-dev_1.900.1-13_i386
+libjaula-dev_1.4.0-3_i386
+libjavascriptcoregtk-1.0-dev_1.8.1-3.4_i386
+libjavascriptcoregtk-3.0-dev_1.8.1-3.4_i386
+libjbig-dev_2.0-2+deb7u1_i386
+libjbig2dec0-dev_0.11+20120125-1_i386
+libjconv-dev_2.8-6+b1_i386
+libjemalloc-dev_3.0.0-3_i386
+libjim-dev_0.73-3_i386
+libjpeg62-dev_6b1-3_i386
+libjpeg8-dev_8d-1_i386
+libjpgalleg4-dev_2:4.4.2-2.1_i386
+libjs-of-ocaml-dev_1.2-2_i386
+libjson-glib-dev_0.14.2-1_i386
+libjson-spirit-dev_4.04-1+b1_i386
+libjson-static-camlp4-dev_0.9.8-1+b5_i386
+libjson-wheel-ocaml-dev_1.0.6-2+b8_i386
+libjson0-dev_0.10-1.2_i386
+libjsoncpp-dev_0.6.0~rc2-3_i386
+libjte-dev_1.19-1_i386
+libjthread-dev_1.3.1-3_i386
+libjudy-dev_1.0.5-1_i386
+libjuman-dev_5.1-2.1_i386
+libk3b-dev_2.0.2-6_i386
+libkactivities-dev_4:4.8.4-1_i386
+libkakasi2-dev_2.3.5~pre1+cvs20071101-1_i386
+libkal-dev_0.9.0-1_i386
+libkarma-cil-dev_0.1.2-2.3_all
+libkarma-dev_0.1.2-2.3_i386
+libkate-dev_0.4.1-1_i386
+libkaya-gd-dev_0.4.4-6_i386
+libkaya-gl-dev_0.4.4-6_i386
+libkaya-mysql-dev_0.4.4-6_i386
+libkaya-ncurses-dev_0.4.4-6_i386
+libkaya-ncursesw-dev_0.4.4-6_i386
+libkaya-pgsql-dev_0.4.4-6_i386
+libkaya-sdl-dev_0.4.4-6_i386
+libkaya-sqlite3-dev_0.4.4-6_i386
+libkcddb-dev_4:4.8.4-2_i386
+libkdcraw-dev_4:4.8.4-1_i386
+libkdeedu-dev_4:4.8.4-1_i386
+libkdegames-dev_4:4.8.4-3_i386
+libkdtree++-dev_0.7.0-2_all
+libkernlib1-dev_20061220+dfsg3-2_i386
+libkexiv2-dev_4:4.8.4-1_i386
+libkeybinder-dev_0.2.2-4_i386
+libkeyutils-dev_1.5.5-3_i386
+libkibi-dev_0.1-1_i386
+libkipi-dev_4:4.8.4-1_i386
+libkiten-dev_4:4.8.4-1_i386
+libklatexformula3-dev_3.2.6-1_i386
+libklibc-dev_2.0.1-3.1_i386
+libkmfl-dev_0.9.8-1_i386
+libkmflcomp-dev_0.9.8-1_i386
+libkml-dev_1.3.0~r863-4.1_i386
+libkmod-dev_9-3_i386
+libkokyu-dev_6.0.3+dfsg-0.1_i386
+libkonq5-dev_4:4.8.4-2_i386
+libkonqsidebarplugin-dev_4:4.8.4-2_i386
+libkopete-dev_4:4.8.4-1+b1_i386
+libkosd2-dev_0.8.1-1_i386
+libkpathsea-dev_2012.20120628-4_i386
+libkqueue-dev_1.0.4-2_i386
+libkrb5-dev_1.10.1+dfsg-5+deb7u1_i386
+libksane-dev_4:4.8.4-1_i386
+libksba-dev_1.2.0-2_i386
+libktoblzcheck1-dev_1.39-1_i386
+libktorrent-dev_1.2.1-1_i386
+libktpcommoninternalsprivate-dev_0.4.0-1_i386
+libkvutils-dev_2.9.0-1_i386
+libkvutils2.2-dev_2.9.0-1_all
+libkwnn-dev_1.1.1~a021+cvs20100325-6_i386
+libkwwidgets1-dev_1.0.0~cvs20100930-8_i386
+libkxl0-dev_1.1.7-16_i386
+liblablgl-ocaml-dev_1.04-5+b3_i386
+liblablgtk-extras-ocaml-dev_1.0-1+b2_i386
+liblablgtk2-gl-ocaml-dev_2.14.2+dfsg-3_i386
+liblablgtk2-gnome-ocaml-dev_2.14.2+dfsg-3_i386
+liblablgtk2-ocaml-dev_2.14.2+dfsg-3_i386
+liblablgtkmathview-ocaml-dev_0.7.8-6+b1_i386
+liblablgtksourceview2-ocaml-dev_2.14.2+dfsg-3_i386
+libladr-dev_0.0.200902a-2.1_i386
+libladspa-ocaml-dev_0.1.4-1+b1_i386
+liblapack-dev_3.4.1+dfsg-1+deb70u1_i386
+liblapacke-dev_3.4.1+dfsg-1+deb70u1_i386
+liblas-dev_1.2.1-5+b1_i386
+liblash-compat-dev_1+dfsg0-3_all
+liblasi-dev_1.1.0-1_i386
+liblasso3-dev_2.3.6-2_i386
+liblastfm-dev_0.4.0~git20090710-2_i386
+liblastfm-ocaml-dev_0.3.0-2+b6_i386
+liblcgdm-dev_1.8.2-1+b2_i386
+liblcms1-dev_1.19.dfsg-1.2_i386
+liblcms2-dev_2.2+git20110628-2.2+deb7u1_i386
+libldap-ocaml-dev_2.1.8-8+b9_i386
+libldap2-dev_2.4.31-1+nmu2_i386
+libldb-dev_1:1.1.6-1_i386
+libldns-dev_1.6.13-1_i386
+libledit-ocaml-dev_2.03-1+b2_i386
+liblensfun-dev_0.2.5-2_i386
+libleptonica-dev_1.69-3.1_i386
+libleveldb-dev_0+20120530.gitdd0d562-1_i386
+liblfc-dev_1.8.2-1+b2_i386
+liblhapdf-dev_5.8.7+repack-1_i386
+liblhasa-dev_0.0.7-2_i386
+liblicense-dev_0.8.1-3_i386
+liblightdm-gobject-dev_1.2.2-4_i386
+liblightdm-qt-dev_1.2.2-4_i386
+liblilv-dev_0.14.2~dfsg0-4_i386
+liblinear-dev_1.8+dfsg-1_i386
+liblinebreak2-dev_2.1-1_i386
+liblink-grammar4-dev_4.7.4-2_i386
+liblinphone-dev_3.5.2-10_i386
+liblip-dev_2.0.0-1.1_i386
+liblircclient-dev_0.9.0~pre1-1_i386
+liblistaller-glib-dev_0.5.5-2_i386
+liblivemedia-dev_2012.05.17-1_i386
+libllvm-2.9-ocaml-dev_2.9+dfsg-7_i386
+libllvm-3.0-ocaml-dev_3.0-10_i386
+libllvm-3.1-ocaml-dev_3.1-1_i386
+libllvm-ocaml-dev_1:3.0-14+nmu2_i386
+liblo-dev_0.26~repack-7_i386
+liblo-ocaml-dev_0.1.0-1+b1_i386
+liblo10k1-dev_1.0.25-2_i386
+libloadpng4-dev_2:4.4.2-2.1_i386
+liblockdev1-dev_1.0.3-1.5_i386
+liblockfile-dev_1.09-5_i386
+liblodo3.0-dev_3.0.2+dfsg-4+b1_i386
+liblog4ada2-dev_1.2-3_i386
+liblog4c-dev_1.2.1-3_i386
+liblog4cplus-dev_1.0.4-1_i386
+liblog4cpp5-dev_1.0-4_i386
+liblog4cxx10-dev_0.10.0-1.2_i386
+liblog4net-cil-dev_1.2.10+dfsg-6_all
+liblog4shib-dev_1.0.4-1_i386
+liblog4tango4-dev_7.2.6+dfsg-14_i386
+liblogforwarderutils2-dev_2.7-1_i386
+liblognorm-dev_0.3.4-1_i386
+liblogservicecomponentbase2-dev_2.7-1_i386
+liblogservicetoolbase2-dev_2.7-1_i386
+liblogsys-dev_1.4.2-3_i386
+liblogthread-dev_3.0.12-3.2+deb7u2_i386
+libloki-dev_0.1.7-3_i386
+libloudmouth1-dev_1.4.3-9_i386
+liblouis-dev_2.4.1-1_i386
+liblouisutdml-dev_2.2.0-1_i386
+liblouisxml-dev_2.4.0-3_i386
+liblowpan-dev_0.2.2-2.1_all
+liblpsolve55-dev_5.5.0.13-7_i386
+liblqr-1-0-dev_0.4.1-2_i386
+liblrdf0-dev_0.4.0-5_i386
+liblrm2-dev_1.0.9+hg2665-1_i386
+liblrs-dev_0.42c-1+b1_i386
+liblscp-dev_0.5.6-6_i386
+libltcsmpte-dev_0.4.4-1_i386
+libltdl-dev_2.4.2-1.1_i386
+liblttctl-dev_0.89-05122011-1_i386
+liblttd-dev_0.89-05122011-1_i386
+liblttng-ust-dev_2.0.4-1_i386
+liblttoolbox3-3.1-0-dev_3.1.0-1.1_i386
+liblttvtraceread-2.6-dev_0.12.38-21032011-1+b1_i386
+liblua5.1-0-dev_5.1.5-4_i386
+liblua5.1-apr-dev_0.23.2-1_all
+liblua5.1-bitop-dev_1.0.2-1_all
+liblua5.1-cgi-dev_5.1.4+dfsg-2_all
+liblua5.1-copas-dev_1.1.6-5_all
+liblua5.1-curl-dev_0.3.0-7_all
+liblua5.1-cyrussasl-dev_1.0.0-4_all
+liblua5.1-event-dev_0.4.1-2_all
+liblua5.1-expat-dev_1.2.0-5+deb7u1_all
+liblua5.1-filesystem-dev_1.5.0+16+g84f1af5-1_all
+liblua5.1-leg-dev_0.1.2-8_all
+liblua5.1-logging-dev_1.2.0-1_all
+liblua5.1-lpeg-dev_0.10.2-5_all
+liblua5.1-md5-dev_1.1.2-6_all
+liblua5.1-oocairo-dev_1.4-1.2_i386
+liblua5.1-oopango-dev_1.1-1_i386
+liblua5.1-orbit-dev_2.2.0+dfsg1-1_all
+liblua5.1-posix-dev_5.1.19-2_all
+liblua5.1-rex-onig-dev_2.6.0-2_all
+liblua5.1-rex-pcre-dev_2.6.0-2_all
+liblua5.1-rex-posix-dev_2.6.0-2_all
+liblua5.1-rings-dev_1.2.3-1_all
+liblua5.1-rrd-dev_1.4.7-2_i386
+liblua5.1-sec-dev_0.4.1-1_all
+liblua5.1-soap-dev_3.0-3_all
+liblua5.1-socket-dev_2.0.2-8_all
+liblua5.1-sql-mysql-dev_2.3.0-1+build0_all
+liblua5.1-sql-postgres-dev_2.3.0-1+build0_all
+liblua5.1-sql-sqlite3-dev_2.3.0-1+build0_all
+liblua5.1-svn-dev_0.4.0-7_all
+liblua5.1-wsapi-fcgi-dev_1.5-3_all
+liblua5.1-xmlrpc-dev_1.2.1-5_all
+liblua5.1-zip-dev_1.2.3-11_all
+liblua5.2-dev_5.2.1-3_i386
+liblua50-dev_5.0.3-6_i386
+libluabind-dev_0.9.1+dfsg-5_i386
+liblualib50-dev_5.0.3-6_i386
+liblunar-1-dev_2.0.1-2.2_i386
+liblunar-date-dev_2.4.0-1_i386
+liblv2dynparam1-dev_2-5_i386
+liblvm2-dev_2.02.95-8_i386
+liblwipv6-dev_1.5a-2_i386
+liblwt-glib-ocaml-dev_2.3.2-1+b3_i386
+liblwt-ocaml-dev_2.3.2-1+b3_i386
+liblwt-ssl-ocaml-dev_2.3.2-1+b3_i386
+liblz-dev_1.3-2_i386
+liblzma-dev_5.1.1alpha+20120614-2_i386
+liblzo2-dev_2.06-1_i386
+libm17n-dev_1.6.3-2_i386
+libm17n-im-config-dev_0.9.0-3_i386
+libm4ri-dev_0.0.20080521-2_i386
+libmaa-dev_1.3.1-1_i386
+libmad-ocaml-dev_0.4.4-1+b1_i386
+libmad0-dev_0.15.1b-7_i386
+libmadlib-dev_1.3.0-2.1_i386
+libmagic-dev_5.11-2+deb7u3_i386
+libmagic-ocaml-dev_0.7.3-5+b3_i386
+libmagick++-dev_8:6.7.7.10-5+deb7u3_i386
+libmagickcore-dev_8:6.7.7.10-5+deb7u3_i386
+libmagickwand-dev_8:6.7.7.10-5+deb7u3_i386
+libmagics++-dev_2.14.11-4_i386
+libmailutils-dev_1:2.99.97-3_i386
+libmalaga-dev_7.12-4_i386
+libmaloc-dev_0.2-2.3_i386
+libmapi-dev_1:1.0-3_i386
+libmapiadmin-dev_1:1.0-3_i386
+libmapipp-dev_1:1.0-3_i386
+libmapiproxy-dev_1:1.0-3_i386
+libmapistore-dev_1:1.0-3_i386
+libmapnik-dev_2.0.0+ds1-3_all
+libmapnik2-dev_2.0.0+ds1-3+b4_i386
+libmarble-dev_4:4.8.4-3_i386
+libmarkdown2-dev_2.1.3-3_i386
+libmatchbox-dev_1.9-osso8-3_i386
+libmath++-dev_0.0.4-4_i386
+libmatheval-dev_1.1.8-1_i386
+libmathlib2-dev_20061220+dfsg3-2_i386
+libmatio-dev_1.3.4-4_i386
+libmatrixssl1.8-dev_1.8.8-1_i386
+libmatroska-dev_1.3.0-2_i386
+libmbt0-dev_3.2.8-1_i386
+libmcpp-dev_2.7.2-1.1_i386
+libmcrypt-dev_2.5.8-3.1_i386
+libmcs-dev_0.7.2-2.1_i386
+libmd3-dev_0.1.92-4_i386
+libmdc2-dev_0.10.7-1+b2_i386
+libmdds-dev_0.5.4-1_all
+libmdsp-dev_0.11-10_i386
+libmeanwhile-dev_1.0.2-4_i386
+libmecab-dev_0.99.3-3_i386
+libmed-dev_3.0.3-3_i386
+libmedc-dev_3.0.3-3_i386
+libmediainfo-dev_0.7.58-1_i386
+libmediastreamer-dev_3.5.2-10_i386
+libmedimport-dev_3.0.3-3_i386
+libmeep-dev_1.1.1-8+deb7u1_i386
+libmeep-lam4-dev_1.1.1-10~deb7u1_i386
+libmeep-mpi-default-dev_1.1.1-10~deb7u1_i386
+libmeep-mpich2-dev_1.1.1-10~deb7u1_i386
+libmeep-openmpi-dev_1.1.1-9~deb7u2_i386
+libmelt-ocaml-dev_1.4.0-1_i386
+libmemcache-dev_1.4.0.rc2-1_i386
+libmemcached-dev_1.0.8-1_i386
+libmemphis-0.2-dev_0.2.3-2_i386
+libmenhir-ocaml-dev_20120123.dfsg-1_i386
+libmenu-cache1-dev_0.3.3-1_i386
+libmercator-0.3-dev_0.3.0-2_i386
+libmeschach-dev_1.2b-13_i386
+libmetacity-dev_1:2.34.3-4_i386
+libmgl-dev_1.11.2-17_i386
+libmhash-dev_0.9.9.9-1.1_i386
+libmicrohttpd-dev_0.9.20-1+deb7u1_i386
+libmigemo-dev_20110227-7_i386
+libmikmatch-ocaml-dev_1.0.4-1+b1_i386
+libmikmod2-dev_3.1.12-5_i386
+libmilter-dev_8.14.4-4_i386
+libmimedir-dev_0.5.1-4_i386
+libmimedir-gnome-dev_0.4.2-5_i386
+libmimelib1-dev_5:1.1.4-2_i386
+libmimetic-dev_0.9.7-3_i386
+libmimic-dev_1.0.4-2.1_i386
+libminc-dev_2.1.10-1+b1_i386
+libming-dev_1:0.4.4-1.1_i386
+libmini18n-dev_0.2.1-1_i386
+libminidjvu-dev_0.8.svn.2010.05.06+dfsg-0.2_i386
+libminiupnpc-dev_1.5-2_i386
+libmission-control-plugins-dev_1:5.12.3-1_i386
+libmkv-dev_0.6.5.1-1_i386
+libmlpcap-ocaml-dev_0.9-16_i386
+libmlpost-ocaml-dev_0.8.1-3_i386
+libmlt++-dev_0.8.0-4_i386
+libmlt-dev_0.8.0-4_i386
+libmlx4-dev_1.0.4-1_i386
+libmm-dev_1.4.2-4_i386
+libmm-ocaml-dev_0.2.0-1+b1_i386
+libmmpong0.9-dev_0.9.1-2.1_i386
+libmms-dev_0.6.2-3_i386
+libmng-dev_1.0.10-3_i386
+libmnl-dev_1.0.3-3_i386
+libmodbus-dev_3.0.3-1_i386
+libmodglue1-dev_1.17-2.1_all
+libmodplug-dev_1:0.8.8.4-3+deb7u1+git20130828_all
+libmoe-dev_1.5.8-1_i386
+libmongo-client-dev_0.1.5-1+deb7u1_i386
+libmono-2.0-dev_2.10.8.1-8_i386
+libmono-addins-cil-dev_0.6.2-2_all
+libmono-addins-gui-cil-dev_0.6.2-2_all
+libmono-addins-msbuild-cil-dev_0.6.2-2_all
+libmono-cecil-cil-dev_0.9.5+dfsg-2_all
+libmono-cecil-flowanalysis-cil-dev_0.1~vcs20110809.r1.b34edf6-2_all
+libmono-cil-dev_2.10.8.1-8_all
+libmono-reflection-cil-dev_1.0+git20110407+d2343843-2_all
+libmono-uia-cil-dev_2.1-4_all
+libmono-upnp-cil-dev_0.1.2-1_all
+libmono-zeroconf-cil-dev_0.9.0-4_all
+libmonogame-cil-dev_2.5.1+dfsg-3_all
+libmopac7-dev_1.15-5_i386
+libmorph-dev_1:20090926_i386
+libmosquitto0-dev_0.15-2_all
+libmosquittopp0-dev_0.15-2_all
+libmount-dev_2.20.1-5.3_i386
+libmowgli-dev_1.0.0-1_i386
+libmozjs-dev_24.4.0esr-1~deb7u2_i386
+libmozjs185-dev_1.8.5-1.0.0+dfsg-4_i386
+libmp3lame-dev_3.99.5+repack1-3_i386
+libmp3lame-ocaml-dev_0.3.1-1+b1_i386
+libmp3splt-dev_0.7.2-2_i386
+libmp4v2-dev_2.0.0~dfsg0-1_i386
+libmpc-dev_0.9-4_i386
+libmpcdec-dev_2:0.1~r459-4_i386
+libmpd-dev_0.20.0-1.1_i386
+libmpdclient-dev_2.3-1_i386
+libmpeg2-4-dev_0.4.1-3_i386
+libmpeg3-dev_1.5.4-5_i386
+libmpfi-dev_1.5.1-1_i386
+libmpfr-dev_3.1.0-5_i386
+libmpg123-dev_1.14.4-1_i386
+libmpich2-dev_1.4.1-4.2_i386
+libmpikmeans-dev_1.5-1+b1_i386
+libmrml1-dev_0.1.14-12_i386
+libmrmpi-dev_1.0~20110620.dfsg-2_i386
+libmrss0-dev_0.19.2-3_i386
+libmsgpack-dev_0.5.7-2_i386
+libmsn-dev_4.2-2_i386
+libmsv-dev_0.0.0-1_i386
+libmtbl-dev_0.2-1_i386
+libmtcp-dev_1.2.5-1_i386
+libmtdev-dev_1.1.2-1_i386
+libmthca-dev_1.0.6-1_i386
+libmtp-dev_1.1.3-35-g0ece104-5_i386
+libmudflap0-4.4-dev_4.4.7-2_i386
+libmudflap0-4.6-dev_4.6.3-14_i386
+libmudflap0-4.7-dev_4.7.2-5_i386
+libmulticobex1-dev_0.23-1.1_i386
+libmumps-dev_4.10.0.dfsg-3_i386
+libmumps-ptscotch-dev_4.10.0.dfsg-3_i386
+libmumps-scotch-dev_4.10.0.dfsg-3_i386
+libmumps-seq-dev_4.10.0.dfsg-3_i386
+libmunge-dev_0.5.10-1_i386
+libmuparser-dev_2.1.0-3_i386
+libmupdf-dev_0.9-2_i386
+libmupen64plus-dev_1.99.5-6_all
+libmuroar-dev_0.1.8-2_i386
+libmusic-dev_1.0.7-1.2_i386
+libmusicbrainz3-dev_3.0.2-2.1_i386
+libmusicbrainz5-dev_5.0.1-2_i386
+libmutter-dev_3.4.1-5_i386
+libmx-dev_1.4.6-1_i386
+libmxml-dev_2.6-2_i386
+libmyproxy-dev_5.6-1_i386
+libmysql++-dev_3.1.0-2+b1_i386
+libmysql-cil-dev_6.4.3-2_all
+libmysql-ocaml-dev_1.1.1-1_i386
+libmysqlclient-dev_5.5.35+dfsg-0+wheezy1_i386
+libmysqlcppconn-dev_1.1.0-4+b1_i386
+libmysqld-dev_5.5.35+dfsg-0+wheezy1_i386
+libmythes-dev_2:1.2.2-1_i386
+libnabrit-dev_0.4.1-1_i386
+libnacl-dev_20110221-4_i386
+libnacore-dev_0.4.0-3_i386
+libnanohttp-dev_1.1.0-17.1_i386
+libnatpmp-dev_20110808-3_i386
+libnautilus-extension-dev_3.4.2-1+build1_i386
+libnbio-dev_0.30-1_i386
+libncap-dev_1.9.2-1+b2_i386
+libncbi6-dev_6.1.20120620-2_i386
+libncp-dev_2.2.6-9_i386
+libncurses5-dev_5.9-10_i386
+libncursesada2-dev_5.9.20110404-7_i386
+libncursesw5-dev_5.9-10_i386
+libndesk-dbus-glib1.0-cil-dev_0.4.1-4_all
+libndesk-dbus1.0-cil-dev_0.6.0-6_all
+libndr-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libndr-standard-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libnecpp-dev_1.5.0+cvs20101003-2.1_i386
+libneon27-dev_0.29.6-3_i386
+libneon27-gnutls-dev_0.29.6-3_i386
+libnes-dev_1.1.3-1_i386
+libnet1-dev_1.1.4-2.1_i386
+libnet6-1.3-dev_1:1.3.14-1_i386
+libnetcdf-dev_1:4.1.3-6+b1_i386
+libnetcf-dev_0.1.9-2_i386
+libnetclasses-dev_1.06.dfsg-5+b3_i386
+libnetfilter-conntrack-dev_1.0.1-1_i386
+libnetfilter-cttimeout-dev_1.0.0-1_i386
+libnetfilter-log-dev_1.0.0-1_i386
+libnetfilter-queue-dev_0.0.17-1_i386
+libnethttpd-ocaml-dev_3.5.1-1_i386
+libnetpbm10-dev_2:10.0-15+b1_i386
+libnetpbm9-dev_2:10.0-15+b1_i386
+libnetsvcs-dev_6.0.3+dfsg-0.1_i386
+libnewlib-dev_1.18.0-6.2_i386
+libnewmat10-dev_1.10.4-5_i386
+libnewt-dev_0.52.14-11.1_i386
+libnewtonsoft-json-cil-dev_4.5r6-1_all
+libnexus0-dev_4.2.1-svn1614-1+b2_i386
+libnfnetlink-dev_1.0.0-1.1_i386
+libnfo-dev_1.0.1-1_i386
+libnfs-dev_1.3.0-2_i386
+libnfsidmap-dev_0.25-4_i386
+libnice-dev_0.1.2-1_i386
+libnids-dev_1.23-2_i386
+libnifti-dev_2.0.0-1_i386
+libnih-dbus-dev_1.0.3-4.1_i386
+libnih-dev_1.0.3-4.1_i386
+libnini-cil-dev_1.1.0+dfsg.2-4_all
+libnjb-dev_2.2.7~dfsg0-3_i386
+libnl-3-dev_3.2.7-4_i386
+libnl-cli-3-dev_3.2.7-4_i386
+libnl-dev_1.1-7_i386
+libnl-genl-3-dev_3.2.7-4_i386
+libnl-nf-3-dev_3.2.7-4_i386
+libnl-route-3-dev_3.2.7-4_i386
+libnm-glib-dev_0.9.4.0-10_i386
+libnm-glib-vpn-dev_0.9.4.0-10_i386
+libnm-gtk-dev_0.9.4.1-5_i386
+libnm-util-dev_0.9.4.0-10_i386
+libnmz7-dev_2.0.21-6_i386
+libnoise-dev_1.0.0+nmu1_i386
+libnotify-cil-dev_0.4.0~r3032-6_all
+libnotify-dev_0.7.5-1_i386
+libnotmuch-dev_0.13.2-1_i386
+libnova-dev_0.14.0-2_i386
+libnpth0-dev_0.90-2_i386
+libnsbmp0-dev_0.0.1-1.1_i386
+libnsgif0-dev_0.0.1-1.1_i386
+libnspr4-dev_2:4.9.2-1+deb7u1_i386
+libnss3-dev_2:3.14.5-1_i386
+libntfs-dev_2.0.0-1+b1_i386
+libntl-dev_5.5.2-2_i386
+libntlm0-dev_1.2-1_i386
+libntrack-dev_016-1.1_i386
+libntrack-glib-dev_016-1.1_i386
+libntrack-gobject-dev_016-1.1_i386
+libntrack-qt4-dev_016-1.1_i386
+libnuclient-dev_2.4.3-2.2_i386
+libnuma-dev_2.0.8~rc4-1_i386
+libnunit-cil-dev_2.6.0.12051+dfsg-2_all
+libnussl-dev_2.4.3-2.2_i386
+libnvtt-dev_2.0.8-1+dfsg-2_i386
+libnxcl-dev_0.9-3.1_i386
+libnxml0-dev_0.18.3-4_i386
+libnzb-dev_0.0.20050629-6.1_i386
+liboasis-ocaml-dev_0.2.0-6_i386
+liboasis3-dev_3.3.beta.dfsg.1-8+b1_i386
+liboath-dev_1.12.4-1_i386
+liboauth-dev_0.9.4-3.1_i386
+libobby-0.4-dev_0.4.8-1_i386
+libobexftp0-dev_0.23-1.1_i386
+libobrowser-ocaml-dev_1.1.1+dfsg-1+b9_i386
+libobus-ocaml-dev_1.1.3-1+b8_i386
+libocamlbricks-ocaml-dev_0.50.1-4+b5_i386
+libocamlgraph-ocaml-dev_1.8.2-2_i386
+libocamlgraph-viewer-ocaml-dev_1.8.2-2_i386
+libocamlgsl-ocaml-dev_0.6.0-7+b2_i386
+libocamlnet-gtk2-ocaml-dev_3.5.1-1_i386
+libocamlnet-ocaml-dev_3.5.1-1_i386
+libocamlnet-ssl-ocaml-dev_3.5.1-1_i386
+libocamlodbc-ocaml-dev_2.15-5+b3_i386
+libocamlviz-ocaml-dev_1.01-2+b2_i386
+libocas-dev_0.93-1_i386
+liboce-foundation-dev_0.9.1-3_i386
+liboce-modeling-dev_0.9.1-3_all
+liboce-ocaf-dev_0.9.1-3_all
+liboce-ocaf-lite-dev_0.9.1-3_all
+liboce-visualization-dev_0.9.1-3_all
+libocpf-dev_1:1.0-3_i386
+libocrad-dev_0.22~rc1-2_i386
+libocsigen-ocaml-dev_1.3.4-2+b12_i386
+libocsigen-xhtml-ocaml-dev_1.3.4-2+b12_i386
+libocsigenserver-ocaml-dev_2.1-1_i386
+liboctave-dev_3.6.2-5+deb7u1_i386
+libode-dev_2:0.11.1-4_i386
+libode-sp-dev_2:0.11.1-4_i386
+libodin-dev_1.8.5-2_i386
+libodn-ocaml-dev_0.0.8-1_i386
+libofa0-dev_0.9.3-5_i386
+libofapi-dev_0git20070620-6_i386
+libofdt-dev_1.3.6-1_i386
+libofetion-dev_2.2.2-1_i386
+libofx-dev_1:0.9.4-2.1_i386
+libogdi3.2-dev_3.2.0~beta2-7_i386
+libogg-dev_1.3.0-4_i386
+libogg-ocaml-dev_0.4.3-1+b1_i386
+liboggkate-dev_0.4.1-1_i386
+liboggplay1-dev_0.2.1~git20091227-1.2_i386
+liboggz2-dev_1.1.1-1_i386
+liboglappth-dev_1.0.0-2_i386
+libogre-1.8-dev_1.8.0+dfsg1-3_i386
+libogre-dev_1.7.4+dfsg1-7_i386
+liboil0.3-dev_0.3.17-2_i386
+libois-dev_1.3.0+dfsg0-5_i386
+libomhacks-dev_0.16-1_i386
+libomnievents-dev_1:2.6.2-2_i386
+libomniorb4-dev_4.1.6-2_i386
+libomnithread3-dev_4.1.6-2_i386
+libomxil-bellagio-dev_0.9.3-1+b1_i386
+libonig-dev_5.9.1-1_i386
+liboobs-1-dev_3.0.0-1_i386
+liboop-dev_1.0-9_i386
+libooptools-dev_2.7-1_i386
+libopal-dev_3.10.4~dfsg-3_i386
+libopenafs-dev_1.6.1-3+deb7u2_i386
+libopenais-dev_1.1.4-4.1_i386
+libopenal-dev_1:1.14-4_i386
+libopenbabel-dev_2.3.1+dfsg-4_i386
+libopenblas-dev_0.1.1-6+deb7u3_i386
+libopencc-dev_0.3.0-3_i386
+libopenconnect-dev_3.20-4_i386
+libopencore-amrnb-dev_0.1.3-2_i386
+libopencore-amrwb-dev_0.1.3-2_i386
+libopencryptoki-dev_2.3.1+dfsg-3_i386
+libopencsg-dev_1.3.2-2_i386
+libopenct1-dev_0.6.20-1.2_i386
+libopencv-calib3d-dev_2.3.1-11_i386
+libopencv-contrib-dev_2.3.1-11_i386
+libopencv-core-dev_2.3.1-11_i386
+libopencv-dev_2.3.1-11_i386
+libopencv-features2d-dev_2.3.1-11_i386
+libopencv-flann-dev_2.3.1-11_i386
+libopencv-gpu-dev_2.3.1-11_i386
+libopencv-highgui-dev_2.3.1-11_i386
+libopencv-imgproc-dev_2.3.1-11_i386
+libopencv-legacy-dev_2.3.1-11_i386
+libopencv-ml-dev_2.3.1-11_i386
+libopencv-objdetect-dev_2.3.1-11_i386
+libopencv-video-dev_2.3.1-11_i386
+libopendkim-dev_2.6.8-4_i386
+libopenexr-dev_1.6.1-6_i386
+libopenhpi-dev_2.14.1-1.2_i386
+libopenigtlink1-dev_1.9.2~svn7468-1_i386
+libopenimageio-dev_1.0.5+dfsg0-1_i386
+libopenipmi-dev_2.0.16-1.3_i386
+libopenjpeg-dev_1.3+dfsg-4.7_i386
+libopenmeeg-dev_2.0.0.dfsg-5_i386
+libopenmpi-dev_1.4.5-1_i386
+libopenobex1-dev_1.5-2_i386
+libopenr2-dev_1.3.2-1.1_i386
+libopenraw-dev_0.0.9-3+b1_i386
+libopenrawgnome-dev_0.0.9-3+b1_i386
+libopenscap-dev_0.8.0-4+b1_i386
+libopenscenegraph-dev_3.0.1-4_i386
+libopenslide-dev_3.2.6-2_i386
+libopensm2-dev_3.2.6-20090317-2.1_i386
+libopenthreads-dev_3.0.1-4_i386
+libopentk-cil-dev_1.0.20101006+dfsg1-1_all
+libopentoken3-dev_4.0b-3_i386
+libopenturns-dev_1.0-4_i386
+libopenusb-dev_1.1.0-2_i386
+libopenvg1-mesa-dev_8.0.5-4+deb7u2_i386
+libopenvrml-dev_0.18.9-5+deb7u1_i386
+libopenwalnut1-dev_1.2.5-1.1+b1_i386
+liboping-dev_1.6.2-1_i386
+libopkele-dev_2.0.4-5.3_i386
+libopts25-dev_1:5.12-0.1_i386
+libopus-dev_0.9.14+20120615-1+nmu1_i386
+liborange-dev_0.4-2_i386
+liborbit2-dev_1:2.14.19-0.1_i386
+liborc-0.4-dev_1:0.4.16-2_i386
+liborigin-dev_20080225-2.1_i386
+liborigin2-dev_2:20110117-1+b2_i386
+libortp-dev_3.5.2-10_i386
+liboscpack-dev_1.0.2-1_i386
+libosgearth-dev_2.0+dfsg-4+b3_i386
+libosinfo-1.0-dev_0.1.1-1_i386
+libosip2-dev_3.6.0-4_i386
+libosl-dev_0.5.0-1_i386
+libosmesa6-dev_8.0.5-4+deb7u2_i386
+libosmgpsmap-dev_0.7.3-3_i386
+libosmium-dev_0.0~20111213-g7f3500a-3+b2_i386
+libosmpbf-dev_1.2.1-3_i386
+libosp-dev_1.5.2-10_i386
+libosptk3-dev_3.4.2-1+b1_i386
+libossim-dev_1.7.21-4_i386
+libossp-sa-dev_1.2.6-1_i386
+libossp-uuid-dev_1.6.2-1.3_i386
+libostyle-dev_1.4devel1-20.1+b1_i386
+libotcl1-dev_1.14+dfsg-2_i386
+libotf-dev_0.9.12-2_i386
+libotf-trace-dev_1.10.2+dfsg-2_i386
+libotpw-dev_1.3-2_i386
+libotr2-dev_3.2.1-1+deb7u1_i386
+libots-dev_0.5.0-2.1_i386
+libounit-ocaml-dev_1.1.1-1_i386
+libow-dev_2.8p15-1_i386
+libowfat-dev_0.28-6_i386
+libowfat-dietlibc-dev_0.28-6_i386
+libownet-dev_2.8p15-1_i386
+libp11-dev_0.2.8-2_i386
+libp11-kit-dev_0.12-3_i386
+libpackagekit-glib2-dev_0.7.6-3_i386
+libpackagekit-qt2-dev_0.7.6-3_i386
+libpacketdump3-dev_3.0.14-1_i386
+libpacklib-lesstif1-dev_20061220+dfsg3-2_i386
+libpacklib1-dev_20061220+dfsg3-2_i386
+libpacparser-dev_1.3.0-2_i386
+libpam-ocaml-dev_1.1-4+b3_i386
+libpam0g-dev_1.1.3-7.1_i386
+libpanel-applet-4-dev_3.4.2.1-4_i386
+libpango1.0-dev_1.30.0-1_i386
+libpangomm-1.4-dev_2.28.4-1_i386
+libpano13-dev_2.9.18+dfsg-5_i386
+libpantomime1.2-dev_1.2.0~pre3+snap20071004+dfsg-4+b1_i386
+libpaper-dev_1.1.24+nmu2_i386
+libpaps-dev_0.6.8-6_i386
+libpaq-dev_1.0.4-3+b1_i386
+libpar2-0-dev_0.2.1-1_i386
+libpari-dev_2.5.1-2_i386
+libparpack2-dev_3.1.1-2.1_i386
+libparrot-dev_4.0.0-3_i386
+libparser++-dev_0.2.3-2_all
+libparted0-dev_2.3-12_i386
+libpasswdqc-dev_1.2.0-1_all
+libpath-utils-dev_0.1.3-2_i386
+libpathfinder-dev_1.1.3-0.4+b1_i386
+libpawlib-lesstif3-dev_1:2.14.04.dfsg.2-8_i386
+libpawlib2-dev_1:2.14.04.dfsg.2-8_i386
+libpcap-dev_1.3.0-1_all
+libpcap0.8-dev_1.3.0-1_i386
+libpcapnav0-dev_0.8-1_i386
+libpci-dev_1:3.1.9-6_i386
+libpciaccess-dev_0.13.1-2_i386
+libpcl1-dev_1.6-1_i386
+libpcre++-dev_0.9.5-5.1_i386
+libpcre-ocaml-dev_6.2.5-1_i386
+libpcre3-dev_1:8.30-5_i386
+libpcscada2-dev_0.7.1-4_i386
+libpcsclite-dev_1.8.4-1+deb7u1_i386
+libpdflib804-2-dev_20061220+dfsg3-2_i386
+libpe-rules2-dev_1.1.7-1_i386
+libpe-status3-dev_1.1.7-1_i386
+libpeas-dev_1.4.0-2_i386
+libpengine3-dev_1.1.7-1_i386
+libperl-dev_5.14.2-21+deb7u1_i386
+libperl4caml-ocaml-dev_0.9.5-4+b4_i386
+libpetsc3.2-dev_3.2.dfsg-6_i386
+libpfqueue-dev_0.5.6-8_i386
+libpfs-dev_1.8.5-1_i386
+libpgm-dev_5.1.118-1~dfsg-0.1_i386
+libpgocaml-ocaml-dev_1.5-2_i386
+libpgpool-dev_3.1.3-5_i386
+libpgtcl-dev_1:1.5-6_i386
+libphash0-dev_0.9.4-1.2_i386
+libphat-dev_0.4.1-5_i386
+libphobos-4.4-dev_1.063-4.4.7-1_i386
+libphobos2-4.6-dev_0.29.1-4.6.3-2_i386
+libphone-ui-dev_1:0.0.1+git20110825-3_i386
+libphone-utils-dev_0.1+git20110523-2.1_i386
+libphonon-dev_4:4.6.0.0-3_i386
+libphononexperimental-dev_4:4.6.0.0-3_i386
+libphotos202-dev_20061220+dfsg3-2_i386
+libphtools2-dev_20061220+dfsg3-2_i386
+libphysfs-dev_2.0.2-6_i386
+libpiano-dev_2012.05.06-2_i386
+libpigment0.3-dev_0.3.17-1_i386
+libpils2-dev_1.0.9+hg2665-1_i386
+libpinyin0-dev_0.6.91-1_i386
+libpion-common-dev_4.0.7+dfsg-3.1_i386
+libpion-net-dev_4.0.7+dfsg-3.1_i386
+libpipeline-dev_1.2.1-1_i386
+libpisock-dev_0.12.5-5_i386
+libpixman-1-dev_0.26.0-4+deb7u1_i386
+libpkcs11-helper1-dev_1.09-1_i386
+libplayer-dev_2.0.1-2.1_i386
+libplayerc++3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayerc3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayercommon3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayercore3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayerdrivers3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayerinterface3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayerjpeg3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayertcp3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayerwkb3.0-dev_3.0.2+dfsg-4+b1_i386
+libplib-dev_1.8.5-6_i386
+libplist++-dev_1.8-1_i386
+libplist-dev_1.8-1_i386
+libpload-dev_1.4.2-3_i386
+libplot-dev_2.6-3_i386
+libploticus0-dev_2.41-5_i386
+libplotmm-dev_0.1.2-2_i386
+libplplot-ada0-dev_5.9.9-5_i386
+libplplot-dev_5.9.9-5_i386
+libplumb2-dev_1.0.9+hg2665-1_i386
+libplumbgpl2-dev_1.0.9+hg2665-1_i386
+libpmap3.0-dev_3.0.2+dfsg-4+b1_i386
+libpmi0-dev_2.3.4-2+b1_i386
+libpmount-dev_0.0.16_i386
+libpng++-dev_0.2.5-1_all
+libpng12-dev_1.2.49-1_i386
+libpnglite-dev_0.1.17-1_i386
+libpoco-dev_1.3.6p1-4_i386
+libpodofo-dev_0.9.0-1.1+b1_i386
+libpoker-eval-dev_138.0-1_i386
+libpolarssl-dev_1.2.9-1~deb7u2_i386
+libpoldiff-dev_3.3.7-3_i386
+libpolkit-agent-1-dev_0.105-3_i386
+libpolkit-backend-1-dev_0.105-3_i386
+libpolkit-gobject-1-dev_0.105-3_i386
+libpolkit-qt-1-dev_0.103.0-1_i386
+libpolybori-dev_0.5~rc1-2.2_i386
+libpolylib64-dev_5.22.5-3+dfsg_i386
+libpolyml-dev_5.2.1-1.1_i386
+libpolyorb2-dev_2.8~20110207-5.1_i386
+libpomp-dev_1.1+dfsg-2_i386
+libpoppler-cil-dev_0.0.3-2_all
+libpoppler-cpp-dev_0.18.4-6_i386
+libpoppler-dev_0.18.4-6_i386
+libpoppler-glib-dev_0.18.4-6_i386
+libpoppler-private-dev_0.18.4-6_i386
+libpoppler-qt4-dev_0.18.4-6_i386
+libpopplerkit-dev_0.0.20051227svn-7+b1_i386
+libpopt-dev_1.16-7_i386
+libportaudio-dev_18.1-7.1_i386
+libportaudio-ocaml-dev_0.2.0-1+b1_i386
+libportmidi-dev_1:184-2.1_i386
+libportsmf-dev_0.1~svn20101010-3_i386
+libpostgresql-ocaml-dev_1.18.0-1_i386
+libpostproc-dev_6:0.8.10-1_i386
+libpotrace-dev_1.10-1_i386
+libpowerman0-dev_2.3.5-1_i386
+libppd-dev_2:0.10-7.1_i386
+libppl0.11-dev_0.11.2-8_i386
+libpq-dev_9.1.13-0wheezy1_i386
+libpqxx3-dev_3.1-1.1_i386
+libprelude-dev_1.0.0-9_i386
+libpreludedb-dev_1.0.0-1.1+b2_i386
+libpresage-dev_0.8.8-1_i386
+libpri-dev_1.4.12-2_i386
+libprinterconf-dev_0.5-12_i386
+libprintsys-dev_0.6-13_i386
+libprison-dev_1.0+dfsg-1_i386
+libprocps0-dev_1:3.3.3-3_i386
+libproj-dev_4.7.0-2_i386
+libprojectm-dev_2.1.0+dfsg-1_i386
+libprojectm-qt-dev_2.1.0+dfsg-1_i386
+libprotobuf-c0-dev_0.14-1+b1_i386
+libprotobuf-dev_2.4.1-3_i386
+libprotoc-dev_2.4.1-3_i386
+libproxy-dev_0.3.1-6_i386
+libproxychains-dev_3.1-3_i386
+libpspell-dev_0.60.7~20110707-1_i386
+libpst-dev_0.6.54-4.1_i386
+libpstoedit-dev_3.60-2+b1_i386
+libpstreams-dev_0.7.0-2_all
+libpt-dev_2.10.4~dfsg-1_i386
+libptexenc-dev_2012.20120628-4_i386
+libpth-dev_2.0.7-16_i386
+libpthread-stubs0-dev_0.3-3_i386
+libpthread-workqueue-dev_0.8.2-1_i386
+libptscotch-dev_5.1.12b.dfsg-1.2_i386
+libpugl-dev_0~svn32+dfsg0-1_i386
+libpulse-dev_2.0-6.1_i386
+libpulse-ocaml-dev_0.1.2-1+b1_i386
+libpuma-dev_1:1.1+svn20120529-2_i386
+libpurelibc-dev_0.4.1-1_i386
+libpurple-dev_2.10.9-1~deb7u1_all
+libpuzzle-dev_0.9-5_i386
+libpwl-dev_0.11.2-8_i386
+libpxp-ocaml-dev_1.2.2-1+b4_i386
+libpycaml-ocaml-dev_0.82-14+b2_i386
+libpyside-dev_1.1.1-3_i386
+libpythia8-dev_8.1.65-1_i386
+libpythonqt2-dev_2.0.1-1.1_i386
+libqalculate-dev_0.9.7-8_i386
+libqapt-dev_1.3.0-2_i386
+libqb-dev_0.11.1-2_i386
+libqca2-dev_2.0.3-4_i386
+libqd-dev_2.3.11.dfsg-2.1_i386
+libqdaccolib-dev_0.8.2-1_i386
+libqdbm++-dev_1.8.78-2_i386
+libqdbm-dev_1.8.78-2_i386
+libqdjango-dev_0.2.5-2_i386
+libqedje-dev_0.4.0+lgpl-3_i386
+libqfits-dev_6.2.0-5_i386
+libqgis-dev_1.7.4+1.7.5~20120320-1.1+b1_i386
+libqglviewer-qt4-dev_2.3.4-4.2_i386
+libqgpsmm-dev_3.6-4+deb7u1_i386
+libqhull-dev_2009.1-3_i386
+libqimageblitz-dev_1:0.0.6-4_i386
+libqjson-dev_0.7.1-7_i386
+libqmf-dev_0.16-6+deb7u1_i386
+libqmf2-dev_0.16-6+deb7u1_i386
+libqmfconsole2-dev_0.16-6+deb7u1_i386
+libqmfengine1-dev_0.16-6+deb7u1_i386
+libqmmp-dev_0.5.5-1+b1_i386
+libqmmpui-dev_0.5.5-1+b1_i386
+libqoauth-dev_1.0.1-1_i386
+libqof-dev_0.8.6-1_i386
+libqofexpensesobjects-dev_0.1.9-2_i386
+libqpdf-dev_2.3.1-4_i386
+libqpidbroker2-dev_0.16-6+deb7u1_i386
+libqpidclient2-dev_0.16-6+deb7u1_i386
+libqpidcommon2-dev_0.16-6+deb7u1_i386
+libqpidmessaging2-dev_0.16-6+deb7u1_i386
+libqpidtypes1-dev_0.16-6+deb7u1_i386
+libqpol-dev_3.3.7-3_i386
+libqpx-dev_0.7.1.002-5_i386
+libqrencode-dev_3.3.0-2_i386
+libqrupdate-dev_1.1.1-1_i386
+libqsastime-dev_5.9.9-5_i386
+libqscintilla2-dev_2.6.2-2_all
+libqt4-dev_4:4.8.2+dfsg-11_i386
+libqt4-opengl-dev_4:4.8.2+dfsg-11_i386
+libqt4-private-dev_4:4.8.2+dfsg-11_i386
+libqt4pas-dev_2.5-6_i386
+libqtassistantclient-dev_4.6.3-4_i386
+libqtexengine-dev_0.3-3_i386
+libqtgstreamer-dev_0.10.2-2_i386
+libqtruby4shared-dev_4:4.8.4-1_i386
+libqtwebkit-dev_2.2.1-5_i386
+libquantlib0-dev_1.2-2+b1_i386
+libquantum-dev_1.1.0-3_i386
+libquicktime-dev_2:1.2.4-3_i386
+libquorum-dev_1.4.2-3_i386
+libquvi-dev_0.4.1-1_i386
+libqwt-dev_6.0.0-1.2_i386
+libqwt5-qt4-dev_5.2.2-3_i386
+libqwtplot3d-qt4-dev_0.2.7+svn191-7_i386
+libqxmlrpc-dev_0.0.svn6-2_i386
+libqxmpp-dev_0.4.92-1_i386
+libqxt-dev_0.6.1-6_i386
+libqzeitgeist-dev_0.7.0-1+b1_i386
+libqzion-dev_0.4.0+lgpl-4_i386
+librabbitmq-dev_0.0.1.hg216-1_i386
+libradare2-dev_0.9-3_i386
+libradius1-dev_0.3.2-14_i386
+libradiusclient-ng-dev_0.5.6-1.1_i386
+libranlip-dev_1.0-4.1_i386
+librapi2-dev_0.15-2.1_i386
+libraptor1-dev_1.4.21-7.1_i386
+libraptor2-dev_2.0.8-2_i386
+librarian-dev_0.8.1-5_i386
+librasqal3-dev_0.9.29-1_i386
+librasterlite-dev_1.1~svn11-2_i386
+libraul-dev_0.8.0+dfsg0-0.1+b1_i386
+libraw-dev_0.14.6-2_i386
+libraw1394-dev_2.0.9-1_i386
+librcc-dev_0.2.9-3_i386
+librcd-dev_0.1.13-3_i386
+librdf0-dev_1.0.15-1+b1_i386
+librdkit-dev_201203-3_i386
+librdmacm-dev_1.0.15-1+deb7u1_i386
+librdmawrap2-dev_0.16-6+deb7u1_i386
+libreact-ocaml-dev_0.9.3-1_i386
+libreadline-dev_6.2+dfsg-0.1_i386
+libreadline-gplv2-dev_5.2+dfsg-2~deb7u1_i386
+libreadline6-dev_6.2+dfsg-0.1_i386
+librec-dev_1.5-1_i386
+librecode-dev_3.6-20_i386
+libref-array-dev_0.1.3-2_i386
+libregina3-dev_3.6-2_i386
+libregistry-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libreins-ocaml-dev_0.1a-4+b1_i386
+libreiser4-dev_1.0.7-6.3_i386
+librelp-dev_1.0.0-1_i386
+libremctl-dev_3.2-4_i386
+librenaissance0-dev_0.9.0-4+b3_i386
+libreoffice-dev_1:3.5.4+dfsg2-0+deb7u2_i386
+librep-dev_0.90.2-1.3_i386
+libreplaygain-dev_1.0~r475-1_i386
+libres-ocaml-dev_3.2.0-2+b3_i386
+libresample1-dev_0.1.3-4_i386
+libresid-builder-dev_2.1.1-14_i386
+libresiprocate-1.8-dev_1.8.5-4_i386
+libresiprocate-turn-client-1.8-dev_1.8.5-4_i386
+librest-dev_0.7.12-3_i386
+librest-extras-dev_0.7.12-3_i386
+librhash-cil-dev_1.2.9-8+deb7u1_all
+librhash-dev_1.2.9-8+deb7u1_i386
+librheolef-dev_6.1-2.1_i386
+librivet-dev_1.8.0-1_i386
+librlog-dev_1.4-2_i386
+libroar-dev_1.0~beta2-3_i386
+libroot-bindings-python-dev_5.34.00-2_i386
+libroot-bindings-ruby-dev_5.34.00-2_i386
+libroot-core-dev_5.34.00-2_i386
+libroot-geom-dev_5.34.00-2_i386
+libroot-graf2d-gpad-dev_5.34.00-2_i386
+libroot-graf2d-graf-dev_5.34.00-2_i386
+libroot-graf2d-postscript-dev_5.34.00-2_i386
+libroot-graf3d-eve-dev_5.34.00-2_i386
+libroot-graf3d-g3d-dev_5.34.00-2_i386
+libroot-graf3d-gl-dev_5.34.00-2_i386
+libroot-gui-dev_5.34.00-2_i386
+libroot-gui-ged-dev_5.34.00-2_i386
+libroot-hist-dev_5.34.00-2_i386
+libroot-hist-spectrum-dev_5.34.00-2_i386
+libroot-html-dev_5.34.00-2_i386
+libroot-io-dev_5.34.00-2_i386
+libroot-io-xmlparser-dev_5.34.00-2_i386
+libroot-math-foam-dev_5.34.00-2_i386
+libroot-math-genvector-dev_5.34.00-2_i386
+libroot-math-mathcore-dev_5.34.00-2_i386
+libroot-math-mathmore-dev_5.34.00-2_i386
+libroot-math-matrix-dev_5.34.00-2_i386
+libroot-math-minuit-dev_5.34.00-2_i386
+libroot-math-mlp-dev_5.34.00-2_i386
+libroot-math-physics-dev_5.34.00-2_i386
+libroot-math-quadp-dev_5.34.00-2_i386
+libroot-math-smatrix-dev_5.34.00-2_i386
+libroot-math-splot-dev_5.34.00-2_i386
+libroot-math-unuran-dev_5.34.00-2_i386
+libroot-misc-memstat-dev_5.34.00-2_i386
+libroot-misc-minicern-dev_5.34.00-2_i386
+libroot-misc-table-dev_5.34.00-2_i386
+libroot-montecarlo-eg-dev_5.34.00-2_i386
+libroot-montecarlo-vmc-dev_5.34.00-2_i386
+libroot-net-auth-dev_5.34.00-2_i386
+libroot-net-bonjour-dev_5.34.00-2_i386
+libroot-net-dev_5.34.00-2_i386
+libroot-net-ldap-dev_5.34.00-2_i386
+libroot-proof-clarens-dev_5.34.00-2_i386
+libroot-proof-dev_5.34.00-2_i386
+libroot-proof-proofplayer-dev_5.34.00-2_i386
+libroot-roofit-dev_5.34.00-2_i386
+libroot-tmva-dev_5.34.00-2_i386
+libroot-tree-dev_5.34.00-2_i386
+libroot-tree-treeplayer-dev_5.34.00-2_i386
+librostlab-blast0-dev_1.0.0-2_i386
+librostlab3-dev_1.0.20-1_i386
+librpcsecgss-dev_0.19-5_i386
+librplay3-dev_3.3.2-14_i386
+librpm-dev_4.10.0-5+deb7u1_i386
+librra-dev_0.14-1.2_i386
+librrd-dev_1.4.7-2_i386
+librsl-dev_1.42-2_i386
+librsskit-dev_0.3-2_i386
+librsvg2-2.0-cil-dev_2.26.0-8_all
+librsvg2-dev_2.36.1-2_i386
+librsync-dev_0.9.7-9_i386
+librtai-dev_3.8.1-4_i386
+librtas-dev_1.3.6-1_i386
+librtasevent-dev_1.3.6-1_i386
+librtaudio-dev_4.0.10~ds0-2_i386
+librtfcomp-dev_1.1-5+b1_i386
+librtfilter-dev_1.1-4_i386
+librtmidi-dev_1.0.15~ds0-2_i386
+librtmp-dev_2.4+20111222.git4e06e21-1_i386
+librubberband-dev_1.3-1.3_i386
+librudecgi-dev_5.0.0-1_i386
+libruli4-dev_0.33-1.1_i386
+librxp-dev_1.5.0-1_i386
+libs3-dev_2.0-1_i386
+libs3d-dev_0.2.2-8_i386
+libs3dw-dev_0.2.2-8_i386
+libsaamf3-dev_1.1.4-4.1_i386
+libsackpt3-dev_1.1.4-4.1_i386
+libsaclm3-dev_1.1.4-4.1_i386
+libsaevt3-dev_1.1.4-4.1_i386
+libsage-dev_0.2.0-4.1_i386
+libsalck3-dev_1.1.4-4.1_i386
+libsam-dev_1.4.2-3_i386
+libsamba-credentials-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libsamba-hostconfig-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libsamba-policy-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libsamba-util-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libsamdb-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libsaml2-dev_2.4.3-4_i386
+libsampleicc-dev_1.6.4-1+b1_i386
+libsamplerate-ocaml-dev_0.1.1-1+b3_i386
+libsamplerate0-dev_0.1.8-5_i386
+libsamsg4-dev_1.1.4-4.1_i386
+libsane-dev_1.0.22-7.4_i386
+libsane-extras-dev_1.0.22.2_i386
+libsanlock-dev_2.2-2_i386
+libsary-dev_1:1.2.0-2.1_i386
+libsasl2-dev_2.1.25.dfsg1-6+deb7u1_i386
+libsatmr3-dev_1.1.4-4.1_i386
+libsbjson-dev_2.3.2-2_i386
+libsbsms-dev_2.0.1-1_i386
+libsbuf-dev_9.0+ds1-4_i386
+libsbuild-dev_1.6.4-4_i386
+libsc-dev_2.3.1-14_i386
+libscalapack-mpi-dev_1.8.0-9_i386
+libscalapack-pvm-dev_1.8.0-9_i386
+libscalc-dev_0.2.4-1_i386
+libscamperfile0-dev_20111202b-1_i386
+libschroedinger-dev_1.0.11-2_i386
+libschroedinger-ocaml-dev_0.1.0-1+b3_i386
+libscim-dev_1.4.13-5_i386
+libscm-dev_5e5-3.2_i386
+libscotch-dev_5.1.12b.dfsg-1.2_i386
+libscotchmetis-dev_5.1.12b.dfsg-1.2_i386
+libscotchparmetis-dev_5.1.12b.dfsg-1.2_i386
+libsctp-dev_1.0.11+dfsg-2_i386
+libscythestat-dev_1.0.2-1_all
+libsdl-console-dev_2.1-3_i386
+libsdl-gfx1.2-dev_2.0.23-3_i386
+libsdl-image1.2-dev_1.2.12-2_i386
+libsdl-mixer1.2-dev_1.2.12-3_i386
+libsdl-net1.2-dev_1.2.8-2_i386
+libsdl-ocaml-dev_0.9.0-1_i386
+libsdl-pango-dev_0.1.2-6_i386
+libsdl-sge-dev_030809dfsg-3_i386
+libsdl-sound1.2-dev_1.0.3-6_i386
+libsdl-stretch-dev_0.3.1-3_i386
+libsdl-ttf2.0-dev_2.0.11-2_i386
+libsdl1.2-dev_1.2.15-5_i386
+libsdpa-dev_7.3.8+dfsg-1_i386
+libsearchclient-dev_0.7.7-3_i386
+libseaudit-dev_3.3.7-3_i386
+libseed-gtk3-dev_3.2.0-2_i386
+libsefs-dev_3.3.7-3_i386
+libselinux1-dev_2.1.9-5_i386
+libsemanage1-dev_2.1.6-6_i386
+libsensors-applet-plugin-dev_3.0.0-0.2_i386
+libsensors4-dev_1:3.3.2-2+deb7u1_i386
+libsepol1-dev_2.1.4-3_i386
+libserd-dev_0.14.0~dfsg0-2_i386
+libserf-dev_1.1.0-2_i386
+libsexplib-camlp4-dev_7.0.4-2_i386
+libsexy-dev_0.1.11-2+b1_i386
+libsfml-dev_1.6+dfsg2-2_i386
+libsfst1-1.2-0-dev_1.2.0-1.2_i386
+libsgutils2-dev_1.33-1_i386
+libsha-ocaml-dev_1.7-2+b2_i386
+libshairport-dev_1.2.1~git20120110.aeb4987-2_i386
+libshevek-dev_1.3-1_i386
+libshhmsg1-dev_1.4.1-4.1_i386
+libshhopt1-dev_1.1.7-2.1_i386
+libshiboken-dev_1.1.1-1_i386
+libshibsp-dev_2.4.3+dfsg-5+b1_i386
+libshisa-dev_1.0.1-2_i386
+libshishi-dev_1.0.1-2_i386
+libshout-ocaml-dev_0.2.7-1+b3_i386
+libshout3-dev_2.2.2-8_i386
+libshp-dev_1.2.10-7_i386
+libshr-glib-dev_2011.03.08.2~git20110930-2_i386
+libsidl-dev_1.4.0.dfsg-8.1_i386
+libsidplay1-dev_1.36.59-5_i386
+libsidplay2-dev_2.1.1-14_i386
+libsidplayfp-dev_0.3.5-1_i386
+libsidutils-dev_2.1.1-14_i386
+libsieve2-dev_2.2.6-1.1_i386
+libsigc++-1.2-dev_1.2.7-2_i386
+libsigc++-2.0-dev_2.2.10-0.2_i386
+libsigc++-dev_1.0.4-9.4_i386
+libsigrok0-dev_0.1.0-2_i386
+libsigrokdecode0-dev_0.1.0-2_i386
+libsigsegv-dev_2.9-4_i386
+libsilly-dev_0.1.0-3_i386
+libsilo-dev_4.8-13_i386
+libsimage-dev_1.7.0-1.1+b1_i386
+libsimplelist0-dev_0.3.4-2_i386
+libsipwitch-dev_1.2.4-1_i386
+libsiscone-dev_2.0.5-1_i386
+libsiscone-spherical-dev_2.0.5-1_i386
+libskk-dev_0.0.12-3_i386
+libskstream-0.3-dev_0.3.8-1_i386
+libslang2-dev_2.2.4-15_i386
+libslepc3.2-dev_3.2-p5-1_i386
+libslp-dev_1.2.1-9_i386
+libslurm-dev_2.3.4-2+b1_i386
+libslurmdb-dev_2.3.4-2+b1_i386
+libslv2-dev_0.6.6+dfsg1-2_i386
+libsm-dev_2:1.2.1-2_i386
+libsmbclient-dev_2:3.6.6-6+deb7u3_i386
+libsmbclient-raw-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libsmbios-dev_2.0.3.dfsg-1.1_i386
+libsmf-dev_1.3-2_i386
+libsmi2-dev_0.4.8+dfsg2-7_i386
+libsmokekde-dev_4:4.8.4-1_i386
+libsmokeqt4-dev_4:4.8.4-1_i386
+libsmpeg-dev_0.4.5+cvs20030824-5_i386
+libsnacc-dev_1.3.1-1_i386
+libsnack2-dev_2.2.10-dfsg1-12.1_i386
+libsnappy-dev_1.0.5-2_i386
+libsndfile1-dev_1.0.25-5_i386
+libsndobj-dev_2.6.6.1-3_i386
+libsnmp-dev_5.4.3~dfsg-2.8_i386
+libsnmpkit-dev_0.9-16_i386
+libsocialweb-client-dev_0.25.20-2.1_i386
+libsocialweb-dev_0.25.20-2.1_i386
+libsocksd0-dev_1.1.19.dfsg-3+b3_i386
+libsofa-c-dev_2012.03.01-1_i386
+libsofa1-dev_1.0~beta4-7_i386
+libsofia-sip-ua-dev_1.12.11+20110422-1_i386
+libsofia-sip-ua-glib-dev_1.12.11+20110422-1_i386
+libsofthsm-dev_1.3.3-2_i386
+libsoil-dev_1.07~20080707.dfsg-2_i386
+libsombok-dev_2.2.1-1_i386
+libsonic-dev_0.1.17-1.1_i386
+libsope-dev_1.3.16-1_i386
+libsoprano-dev_2.7.6+dfsg.1-2wheezy1_i386
+libsoqt4-dev_1.5.0-2_i386
+libsord-dev_0.8.0~dfsg0-1_i386
+libsoundgen-dev_0.6-4_i386
+libsoundtouch-dev_1.6.0-3_i386
+libsoundtouch-ocaml-dev_0.1.7-1+b1_i386
+libsoup-gnome2.4-dev_2.38.1-3_i386
+libsoup2.4-dev_2.38.1-3_i386
+libsoupcutter-dev_1.1.7-1.2_i386
+libsource-highlight-dev_3.1.6-1.1_i386
+libsox-dev_14.4.0-3_i386
+libsp-gxmlcpp-dev_1.0.20040603-5_i386
+libsp1-dev_1.3.4-1.2.1-47.1+b1_i386
+libspandsp-dev_0.0.6~pre20-3.1_i386
+libsparsehash-dev_1.10-1_all
+libsparskit-dev_2.0.0-2_i386
+libspatialindex-dev_1.7.0-1_i386
+libspatialite-dev_3.0.0~beta20110817-3+deb7u1_i386
+libspctag-dev_0.2-1_i386
+libspectre-dev_0.2.7-2_i386
+libspectrum-dev_1.0.0-3_i386
+libspeechd-dev_0.7.1-6.2_i386
+libspeex-dev_1.2~rc1-7_i386
+libspeex-ocaml-dev_0.2.0-1+b3_i386
+libspeexdsp-dev_1.2~rc1-7_i386
+libspf2-dev_1.2.9-7_i386
+libsphere-dev_3.2-4_i386
+libspice-client-glib-2.0-dev_0.12-5_i386
+libspice-client-gtk-2.0-dev_0.12-5_i386
+libspice-client-gtk-3.0-dev_0.12-5_i386
+libspice-protocol-dev_0.10.1-1_all
+libspice-server-dev_0.11.0-1+deb7u1_i386
+libspiro-dev_20071029-2_i386
+libspnav-dev_0.2.2-1_i386
+libspooles-dev_2.2-9_i386
+libsprng2-dev_2.0a-8_i386
+libsqlexpr-ocaml-dev_0.4.1-1+b5_i386
+libsqlheavy-dev_0.1.1-1_i386
+libsqlheavygtk-dev_0.1.1-1_i386
+libsqlite0-dev_2.8.17-7_i386
+libsqlite3-dev_3.7.13-1+deb7u1_i386
+libsqlite3-ocaml-dev_1.6.1-1+b1_i386
+libsquizz-dev_0.99a-2_i386
+libsratom-dev_0.2.0~dfsg0-1_i386
+libsrecord-dev_1.58-1+b1_i386
+libsrf-dev_0.1+dfsg-1_i386
+libsrtp0-dev_1.4.4+20100615~dfsg-2+deb7u1_i386
+libss7-dev_1.0.2-3_i386
+libsscm-dev_0.8.5-2.1_i386
+libssh-dev_0.5.4-1+deb7u1_i386
+libssh2-1-dev_1.4.2-1.1_i386
+libssl-dev_1.0.1e-2+deb7u7_i386
+libssl-ocaml-dev_0.4.6-1_i386
+libsslcommon2-dev_0.16-6+deb7u1_i386
+libssreflect-ocaml-dev_1.3pl4-1_i386
+libsss-sudo-dev_1.8.4-2_i386
+libst-dev_1.9-3_i386
+libstaden-read-dev_1.12.4-1_i386
+libstarlink-ast-dev_7.0.4+dfsg-1_i386
+libstarlink-pal-dev_0.1.0-1_i386
+libstarpu-dev_1.0.1+dfsg-1_i386
+libstartup-notification0-dev_0.12-1_i386
+libstatgrab-dev_0.17-1_i386
+libstdc++6-4.4-dev_4.4.7-2_i386
+libstdc++6-4.6-dev_4.6.3-14_i386
+libstdc++6-4.7-dev_4.7.2-5_i386
+libstemmer-dev_0+svn546-2_i386
+libsteptalk-dev_0.10.0-5+b1_i386
+libstfl-dev_0.22-1+b1_i386
+libstk0-dev_4.4.3-2_i386
+libstlport4.6-dev_4.6.2-7_i386
+libstonith1-dev_1.0.9+hg2665-1_i386
+libstonithd1-dev_1.1.7-1_i386
+libstreamanalyzer-dev_0.7.7-3_i386
+libstreams-dev_0.7.7-3_i386
+libstrigihtmlgui-dev_0.7.7-3_i386
+libstrigiqtdbusclient-dev_0.7.7-3_i386
+libstroke0-dev_0.5.1-6_i386
+libstxxl-dev_1.3.1-4_i386
+libsublime-dev_1.3.1-2_i386
+libsubtitleeditor-dev_0.33.0-1_i386
+libsubunit-dev_0.0.8+bzr176-1_i386
+libsugarext-dev_0.96.1-2_i386
+libsuil-dev_0.6.4~dfsg0-3_i386
+libsuitesparse-dev_1:3.4.0-3_i386
+libsundials-serial-dev_2.5.0-3_i386
+libsunpinyin-dev_2.0.3+git20120607-1_i386
+libsuperlu3-dev_3.0+20070106-3_i386
+libsvga1-dev_1:1.4.3-33_i386
+libsvm-dev_3.12-1_i386
+libsvn-dev_1.6.17dfsg-4+deb7u6_i386
+libsvncpp-dev_0.12.0dfsg-6_i386
+libsvnqt-dev_1.5.5-4.1_i386
+libsvrcore-dev_1:4.0.4-15_i386
+libswami-dev_2.0.0+svn389-2_i386
+libswe-dev_1.77.00.0005-2_i386
+libswiften-dev_2.0~beta1+dev47-1_i386
+libsword-dev_1.6.2+dfsg-5_i386
+libswscale-dev_6:0.8.10-1_i386
+libsx-dev_2.05-3_i386
+libsyfi1.0-dev_1.0.0.dfsg-1_i386
+libsylph-dev_1.1.0-8_i386
+libsymmetrica-dev_2.0-1_i386
+libsynce0-dev_0.15-1.1_i386
+libsyncml-dev_0.5.4-2.1_i386
+libsynfig-dev_0.63.05-1_i386
+libsynopsis0.12-dev_0.12-8_i386
+libsynthesis-dev_3.4.0.16.7-1_i386
+libsysactivity-dev_0.6.4-1_i386
+libsysfs-dev_2.1.0+repack-2_i386
+libsyslog-ng-dev_3.3.5-4_i386
+libsyslog-ocaml-dev_1.4-6+b2_i386
+libsystemd-daemon-dev_44-11+deb7u4_i386
+libsystemd-id128-dev_44-11+deb7u4_i386
+libsystemd-journal-dev_44-11+deb7u4_i386
+libsystemd-login-dev_44-11+deb7u4_i386
+libt1-dev_5.1.2-3.6_i386
+libtacacs+1-dev_4.0.4.19-11_all
+libtachyon-dev_0.99~b2+dfsg-0.4_i386
+libtag-extras-dev_1.0.1-3_i386
+libtag1-dev_1.7.2-1_i386
+libtagc0-dev_1.7.2-1_i386
+libtagcoll2-dev_2.0.13-1.1_i386
+libtaglib-cil-dev_2.0.4.0-1_all
+libtaglib-ocaml-dev_0.2.0-1+b1_i386
+libtaktuk-1-dev_3.7.4-1_i386
+libtalloc-dev_2.0.7+git20120207-1_i386
+libtamuanova-dev_0.2-2_i386
+libtango7-dev_7.2.6+dfsg-14_i386
+libtaningia-dev_0.2.2-1_i386
+libtaoframework-devil-cil-dev_2.1.svn20090801-9_all
+libtaoframework-ffmpeg-cil-dev_2.1.svn20090801-9_all
+libtaoframework-freeglut-cil-dev_2.1.svn20090801-9_all
+libtaoframework-freetype-cil-dev_2.1.svn20090801-9_all
+libtaoframework-ftgl-cil-dev_2.1.svn20090801-9_all
+libtaoframework-lua-cil-dev_2.1.svn20090801-9_all
+libtaoframework-ode-cil-dev_2.1.svn20090801-9_all
+libtaoframework-openal-cil-dev_2.1.svn20090801-9_all
+libtaoframework-opengl-cil-dev_2.1.svn20090801-9_all
+libtaoframework-physfs-cil-dev_2.1.svn20090801-9_all
+libtaoframework-sdl-cil-dev_2.1.svn20090801-9_all
+libtar-dev_1.2.16-1+deb7u2_i386
+libtarantool-dev_1.4.6+20120629+2158-1_i386
+libtasn1-3-dev_2.13-2_i386
+libtbb-dev_4.0+r233-1_i386
+libtcc-dev_0.9.26~git20120612.ad5f375-6_i386
+libtcd-dev_2.2.2-1_i386
+libtclap-dev_1.2.1-1_i386
+libtclcl1-dev_1.20-6_i386
+libtdb-dev_1.2.10-2_i386
+libtecla1-dev_1.6.1-5_i386
+libteem-dev_1.11.0~svn5226-1_i386
+libtelepathy-farstream-dev_0.4.0-3_i386
+libtelepathy-glib-dev_0.18.2-2_i386
+libtelepathy-logger-dev_0.4.0-1_i386
+libtelepathy-logger-qt4-dev_0.4.0-1_i386
+libtelepathy-qt4-dev_0.9.1-4_i386
+libtelnet-dev_0.21-1_i386
+libtemplates-parser11.6-dev_11.6-2_i386
+libterralib-dev_4.0.0-4_i386
+libtesseract-dev_3.02.01-6_i386
+libtevent-dev_0.9.16-1_i386
+libtext-ocaml-dev_0.5-1+b2_i386
+libtextwrap-dev_0.1-13_i386
+libthai-dev_0.1.18-2_i386
+libtheora-dev_1.1.1+dfsg.1-3.1_i386
+libtheora-ocaml-dev_0.3.0-1+b3_i386
+libthepeg-dev_1.8.0-1_i386
+libthrust-dev_1.6.0-1_all
+libthunar-vfs-1-dev_1.2.0-3+b1_i386
+libthunarx-2-dev_1.2.3-4+b1_i386
+libticables-dev_1.2.0-2_i386
+libticalcs-dev_1.1.3+dfsg1-1_i386
+libticonv-dev_1.1.0-1.1_i386
+libtidy-dev_20091223cvs-1.2_i386
+libtiff4-dev_3.9.6-11_i386
+libtiff5-alt-dev_4.0.2-6+deb7u2_i386
+libtiff5-dev_4.0.2-6+deb7u2_i386
+libtifiles-dev_1.1.1-1_i386
+libtimbl3-dev_6.4.2-1_i386
+libtimblserver2-dev_1.4-2_i386
+libtinfo-dev_5.9-10_i386
+libtinyxml-dev_2.6.2-1_i386
+libtinyxml2-dev_0~git20120518.1.a2ae54e-1_i386
+libtirpc-dev_0.2.2-5_i386
+libtk-img-dev_1:1.3-release-12_i386
+libtnt-dev_1.2.6-1_all
+libtntdb-dev_1.2-2+b1_i386
+libtntnet-dev_2.1-2+deb7u1_i386
+libtododb-dev_0.11-3_i386
+libtogl-dev_1.7-12_all
+libtokyocabinet-dev_1.4.47-2_i386
+libtokyotyrant-dev_1.1.40-4.1+b1_i386
+libtolua++5.1-dev_1.0.93-3_i386
+libtolua-dev_5.2.0-1_i386
+libtomcrypt-dev_1.17-3.2_i386
+libtommath-dev_0.42.0-1_i386
+libtomoe-dev_0.6.0-1.3_i386
+libtonezone-dev_1:2.5.0.1-2_i386
+libtophide-ocaml-dev_1.0.0-3_all
+libtorch3-dev_3.1-2.1_i386
+libtorque2-dev_2.4.16+dfsg-1+deb7u2_i386
+libtorrent-dev_0.13.2-1_i386
+libtorrent-rasterbar-dev_0.15.10-1+b1_i386
+libtorture-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libtotem-dev_3.0.1-8_i386
+libtotem-pg-dev_1.4.2-3_i386
+libtotem-plparser-dev_3.4.2-1_i386
+libtowitoko-dev_2.0.7-8.3_i386
+libtpl-dev_1.5-2_all
+libtpm-unseal-dev_1.3.7-1_i386
+libtrace3-dev_3.0.14-1_i386
+libtracker-extract-0.14-dev_0.14.1-3_i386
+libtracker-miner-0.14-dev_0.14.1-3_i386
+libtracker-sparql-0.14-dev_0.14.1-3_i386
+libtransitioner1-dev_1.1.7-1_i386
+libtre-dev_0.8.0-3_i386
+libtreil-dev_1.8-1.1_i386
+libts-dev_1.0-11_i386
+libtse3-dev_0.3.1-4.3_i386
+libtsk-dev_3.2.3-2_i386
+libtspi-dev_0.3.9-3+wheezy1_i386
+libtulip-dev_3.7.0dfsg-4_i386
+libtumbler-1-dev_0.1.25-1+b1_i386
+libtut-dev_0.0.20070706-1_all
+libtuxcap-dev_1.4.0.dfsg2-2.1_i386
+libtwin-dev_12.04.13.17.57-g130ee5f-2_i386
+libtwofish-dev_0.3-3_i386
+libtwolame-dev_0.3.13-1_i386
+libtxc-dxtn-s2tc-dev_0~git20110809-3_i386
+libtype-conv-camlp4-dev_3.0.4-1_i386
+libtyxml-ocaml-dev_2.1-1_i386
+libuchardet-dev_0.0.1-1_i386
+libucimf-dev_2.3.8-4_i386
+libucl-dev_1.03-5_i386
+libuclmmbase1-dev_1.2.16.0-1_i386
+libucommon-dev_5.2.2-4_i386
+libucto1-dev_0.5.2-2_i386
+libudev-dev_175-7.2_i386
+libudf-dev_0.83-4_i386
+libudt-dev_4.10+dfsg-1_i386
+libudunits2-dev_2.1.23-3_i386
+libuhd-dev_3.4.2-1_i386
+libuim-dev_1:1.8.1-4_i386
+libumlib-dev_0.8.2-1_i386
+libunac1-dev_1.8.0-6_i386
+libunbound-dev_1.4.17-3_i386
+libunicap2-dev_0.9.12-2_i386
+libuninameslist-dev_0.0.20091231-1.1_i386
+libuninum-dev_2.7-1.1_i386
+libunique-3.0-dev_3.0.2-1_i386
+libunique-dev_1.1.6-4_i386
+libunistring-dev_0.9.3-5_i386
+libunittest++-dev_1.4.0-3_i386
+libunshield-dev_0.6-3_i386
+libunwind-setjmp0-dev_0.99-0.3_i386
+libunwind7-dev_0.99-0.3_i386
+libupnp-dev_1:1.6.17-1.2_all
+libupnp4-dev_1.8.0~svn20100507-1.2_i386
+libupnp6-dev_1:1.6.17-1.2_i386
+libupower-glib-dev_0.9.17-1_i386
+libupsclient1-dev_2.6.4-2.3+deb7u1_i386
+libupse-dev_1.0.0-1_i386
+libuptimed-dev_1:0.3.17-3.1_i386
+liburcu-dev_0.6.7-2_i386
+liburfkill-glib-dev_0.3.0-1_i386
+liburg0-dev_0.8.12-4_i386
+liburiparser-dev_0.7.5-1_i386
+libusb++-dev_2:0.1.12-20+nmu1_i386
+libusb-1.0-0-dev_2:1.0.11-1_i386
+libusb-dev_2:0.1.12-20+nmu1_i386
+libusb-ocaml-dev_1.2.0-2+b7_i386
+libusbip-dev_1.1.1+3.2.17-1_i386
+libusbmuxd-dev_1.0.7-2_i386
+libusbprog-dev_0.2.0-2_i386
+libusbredirhost-dev_0.4.3-2_i386
+libusbredirparser-dev_0.4.3-2_i386
+libusbtc08-dev_1.7.2-1_i386
+libuser1-dev_1:0.56.9.dfsg.1-1.2_i386
+libust-dev_2.0.4-1_i386
+libustr-dev_1.0.4-3_i386
+libutempter-dev_1.1.5-4_i386
+libuu-dev_0.5.20-3.3_i386
+libuuidm-ocaml-dev_0.9.4-1_i386
+libv4l-dev_0.8.8-3_i386
+libv8-dev_3.8.9.20-2_i386
+libv8-i18n-dev_0~0.svn7-3_i386
+libva-dev_1.0.15-4_i386
+libvala-0.14-dev_0.14.2-2_i386
+libvala-0.16-dev_0.16.1-2_i386
+libvaladoc-dev_0.3.2~git20120227-1_i386
+libvalhalla-dev_2.0.0-4+b1_i386
+libvanessa-adt-dev_0.0.9-1_i386
+libvanessa-logger-dev_0.0.10-1.1_i386
+libvanessa-socket-dev_0.0.12-1_i386
+libvarconf-dev_0.6.7-2_i386
+libvarnishapi-dev_3.0.2-2+deb7u1_i386
+libvbr-dev_2.6.8-4_i386
+libvc-dev_003.dfsg.1-12_i386
+libvcdinfo-dev_0.7.24+dfsg-0.1_i386
+libvde-dev_2.3.2-4_i386
+libvdeplug-dev_2.3.2-4_i386
+libvdk2-dev_2.4.0-5.3_i386
+libvdkbuilder2-dev_2.4.0-4.3_i386
+libvdkxdb2-dev_2.4.0-3.4_i386
+libvdpau-dev_0.4.1-7_i386
+libventrilo-dev_1.2.4-1_i386
+libverbiste-dev_0.1.34-1_i386
+libverto-dev_0.2.2-1_i386
+libvformat-dev_1.13-10_i386
+libvia-dev_2.0.4-2_i386
+libvibrant6-dev_6.1.20120620-2_i386
+libview-dev_0.6.6-2.1_i386
+libvigraimpex-dev_1.7.1+dfsg1-3_i386
+libvips-dev_7.28.5-1+deb7u1_i386
+libvirt-dev_0.9.12.3-1_i386
+libvirt-glib-1.0-dev_0.0.8-1_i386
+libvirt-ocaml-dev_0.6.1.2-1_i386
+libvisca-dev_1.0.1-1_i386
+libvisio-dev_0.0.17-1_i386
+libvisual-0.4-dev_0.4.0-5_i386
+libvlc-dev_2.0.3-5_i386
+libvlccore-dev_2.0.3-5_i386
+libvmmlib-dev_1.0-2_all
+libvncserver-dev_0.9.9+dfsg-1_i386
+libvo-aacenc-dev_0.1.2-1_i386
+libvo-amrwbenc-dev_0.1.2-1_i386
+libvoaacenc-ocaml-dev_0.1.0-1+b1_i386
+libvoikko-dev_3.5-1.1_i386
+libvolpack1-dev_1.0b3-3_i386
+libvorbis-dev_1.3.2-1.3_i386
+libvorbis-ocaml-dev_0.6.1-1+b1_i386
+libvorbisidec-dev_1.0.2+svn18153-0.2_i386
+libvotequorum-dev_1.4.2-3_i386
+libvpb-dev_4.2.55-1_i386
+libvpx-dev_1.1.0-1_i386
+libvrb0-dev_0.5.1-5.1_i386
+libvte-2.90-dev_1:0.32.2-1_i386
+libvte-dev_1:0.28.2-5_i386
+libvte0.16-cil-dev_2.26.0-8_i386
+libvtk5-dev_5.8.0-13+b1_i386
+libvtk5-qt4-dev_5.8.0-13+b1_i386
+libvtkedge-dev_0.2.0~20110819-2_i386
+libvtkgdcm2-dev_2.2.0-14.1_i386
+libvxl1-dev_1.14.0-18_i386
+libwacom-dev_0.6-1_i386
+libwaei-dev_3.4.3-1_i386
+libwaili-dev_19990723-20_i386
+libwavefront-standalone3.0-dev_3.0.2+dfsg-4+b1_i386
+libwavpack-dev_4.60.1-3_i386
+libwayland-dev_0.85.0-2_i386
+libwbclient-dev_2:3.6.6-6+deb7u3_i386
+libwbxml2-dev_0.10.7-1_i386
+libwcstools-dev_3.8.5-1_i386
+libwebauth-dev_4.1.1-2_i386
+libwebcam0-dev_0.2.2-1_i386
+libwebkit-cil-dev_0.3-6_all
+libwebkit-dev_1.8.1-3.4_i386
+libwebkitgtk-3.0-dev_1.8.1-3.4_i386
+libwebkitgtk-dev_1.8.1-3.4_i386
+libwebp-dev_0.1.3-3+nmu1_i386
+libwebrtc-audio-processing-dev_0.1-2_i386
+libweed-dev_1.6.2~ds1-2_i386
+libwfmath-0.3-dev_0.3.12-3_i386
+libwfut-0.2-dev_0.2.1-2_i386
+libwibble-dev_0.1.28-1.1_i386
+libwildmidi-dev_0.2.3.4-2.1_i386
+libwine-dev_1.4.1-4_i386
+libwings-dev_0.95.3-2_i386
+libwireshark-dev_1.8.2-5wheezy10_i386
+libwiretap-dev_1.8.2-5wheezy10_i386
+libwmf-dev_0.2.8.4-10.3_i386
+libwnck-3-dev_3.4.2-1_i386
+libwnck-dev_2.30.7-1_i386
+libwnck1.0-cil-dev_2.26.0-8_i386
+libwnn-dev_1.1.1~a021+cvs20100325-6_i386
+libwnn6-dev_1.0.0-14.2+b1_i386
+libwpd-dev_0.9.4-3_i386
+libwpg-dev_0.2.1-1_i386
+libwps-dev_0.2.7-1_i386
+libwrap0-dev_7.6.q-24_i386
+libwraster3-dev_0.95.3-2_i386
+libwreport-dev_2.4-1_i386
+libwsutil-dev_1.8.2-5wheezy10_i386
+libwt-dev_3.2.1-2_i386
+libwtdbo-dev_3.2.1-2_i386
+libwtdbofirebird-dev_3.2.1-2_i386
+libwtdbopostgres-dev_3.2.1-2_i386
+libwtdbosqlite-dev_3.2.1-2_i386
+libwtext-dev_3.2.1-2_i386
+libwtfcgi-dev_3.2.1-2_i386
+libwthttp-dev_3.2.1-2_i386
+libwttest-dev_3.2.1-2_i386
+libwv-dev_1.2.9-3_i386
+libwv2-dev_0.4.2.dfsg.2-1~deb7u1_i386
+libwvstreams-dev_4.6.1-5_i386
+libwxbase2.8-dev_2.8.12.1-12_i386
+libwxgtk2.8-dev_2.8.12.1-12_i386
+libwxsmithlib-dev_10.05-2.1_i386
+libwxsmithlib0-dev_10.05-2.1_i386
+libwxsqlite3-2.8-dev_3.0.0.1~dfsg0-2_i386
+libwxsvg-dev_2:1.1.8~dfsg0-2_i386
+libx11-dev_2:1.5.0-1+deb7u1_i386
+libx11-xcb-dev_2:1.5.0-1+deb7u1_i386
+libx264-dev_2:0.123.2189+git35cf912-1_i386
+libx52pro-dev_0.1.1-2.1_i386
+libx86-dev_1.1+ds1-10_i386
+libxalan110-dev_1.10-6_i386
+libxapian-dev_1.2.12-2_i386
+libxatracker-dev_8.0.5-4+deb7u2_i386
+libxau-dev_1:1.0.7-1_i386
+libxaw7-dev_2:1.0.10-2_i386
+libxbae-dev_4.60.4-3_i386
+libxbase2.0-dev_2.0.0-8.5_i386
+libxcb-composite0-dev_1.8.1-2+deb7u1_i386
+libxcb-damage0-dev_1.8.1-2+deb7u1_i386
+libxcb-dpms0-dev_1.8.1-2+deb7u1_i386
+libxcb-dri2-0-dev_1.8.1-2+deb7u1_i386
+libxcb-ewmh-dev_0.3.9-2_i386
+libxcb-glx0-dev_1.8.1-2+deb7u1_i386
+libxcb-icccm4-dev_0.3.9-2_i386
+libxcb-image0-dev_0.3.9-1_i386
+libxcb-keysyms1-dev_0.3.9-1_i386
+libxcb-randr0-dev_1.8.1-2+deb7u1_i386
+libxcb-record0-dev_1.8.1-2+deb7u1_i386
+libxcb-render-util0-dev_0.3.8-1.1_i386
+libxcb-render0-dev_1.8.1-2+deb7u1_i386
+libxcb-res0-dev_1.8.1-2+deb7u1_i386
+libxcb-screensaver0-dev_1.8.1-2+deb7u1_i386
+libxcb-shape0-dev_1.8.1-2+deb7u1_i386
+libxcb-shm0-dev_1.8.1-2+deb7u1_i386
+libxcb-sync0-dev_1.8.1-2+deb7u1_i386
+libxcb-util0-dev_0.3.8-2_i386
+libxcb-xevie0-dev_1.8.1-2+deb7u1_i386
+libxcb-xf86dri0-dev_1.8.1-2+deb7u1_i386
+libxcb-xfixes0-dev_1.8.1-2+deb7u1_i386
+libxcb-xinerama0-dev_1.8.1-2+deb7u1_i386
+libxcb-xprint0-dev_1.8.1-2+deb7u1_i386
+libxcb-xtest0-dev_1.8.1-2+deb7u1_i386
+libxcb-xv0-dev_1.8.1-2+deb7u1_i386
+libxcb-xvmc0-dev_1.8.1-2+deb7u1_i386
+libxcb1-dev_1.8.1-2+deb7u1_i386
+libxcomp-dev_3.5.0.12-1+b1_i386
+libxcomposite-dev_1:0.4.3-2_i386
+libxcp-ocaml-dev_0.5.2-3+b1_i386
+libxcrypt-dev_1:2.4-3_i386
+libxcursor-dev_1:1.1.13-1+deb7u1_i386
+libxdamage-dev_1:1.1.3-2_i386
+libxdb-dev_1.2.0-7.2_i386
+libxdelta2-dev_1.1.3-9_i386
+libxdffileio-dev_0.3-1_i386
+libxdg-basedir-dev_1.1.1-2_i386
+libxdmcp-dev_1:1.1.1-1_i386
+libxdmf-dev_2.1.dfsg.1-5_i386
+libxdo-dev_1:2.20100701.2961-3+deb7u3_i386
+libxen-dev_4.1.4-3+deb7u1_i386
+libxen-ocaml-dev_4.1.4-3+deb7u1_i386
+libxenapi-ocaml-dev_1.3.2-15_i386
+libxenomai-dev_2.6.0-2_i386
+libxerces-c-dev_3.1.1-3_i386
+libxerces-c2-dev_2.8.0+deb1-3_i386
+libxext-dev_2:1.3.1-2+deb7u1_i386
+libxfce4menu-0.1-dev_4.6.2-1_i386
+libxfce4ui-1-dev_4.8.1-1_i386
+libxfce4util-dev_4.8.2-1_i386
+libxfcegui4-dev_4.8.1-5_i386
+libxfconf-0-dev_4.8.1-1_i386
+libxfixes-dev_1:5.0-4+deb7u1_i386
+libxfont-dev_1:1.4.5-3_i386
+libxft-dev_2.3.1-1_i386
+libxi-dev_2:1.6.1-1+deb7u1_i386
+libxine-dev_1.1.21-1+deb7u1_i386
+libxine2-dev_1.2.2-5_i386
+libxinerama-dev_2:1.1.2-1+deb7u1_i386
+libxkbfile-dev_1:1.0.8-1_i386
+libxklavier-dev_5.2.1-1_i386
+libxml++2.6-dev_2.34.2-1_i386
+libxml-light-ocaml-dev_2.2-15_i386
+libxml-security-c-dev_1.6.1-5+deb7u2_i386
+libxml2-dev_2.8.0+dfsg1-7+nmu3_i386
+libxmlada4.1-dev_4.1-2_i386
+libxmlezout2-dev_1.06.1-5_i386
+libxmlm-ocaml-dev_1.1.0-1_i386
+libxmlplaylist-ocaml-dev_0.1.3-1+b2_i386
+libxmlrpc-c++4-dev_1.16.33-3.2_i386
+libxmlrpc-c3-dev_1.16.33-3.2_all
+libxmlrpc-core-c3-dev_1.16.33-3.2_i386
+libxmlrpc-epi-dev_0.54.2-1_i386
+libxmlrpc-light-ocaml-dev_0.6.1-3+b5_i386
+libxmlsec1-dev_1.2.18-2_i386
+libxmltok1-dev_1.2-3_i386
+libxmltooling-dev_1.4.2-5_i386
+libxmmsclient++-dev_0.8+dfsg-4_i386
+libxmmsclient++-glib-dev_0.8+dfsg-4_i386
+libxmmsclient-dev_0.8+dfsg-4_i386
+libxmmsclient-glib-dev_0.8+dfsg-4_i386
+libxmpi4-dev_2.2.3b8-13_i386
+libxmu-dev_2:1.1.1-1_i386
+libxmuu-dev_2:1.1.1-1_i386
+libxnee-dev_3.13-1_i386
+libxneur-dev_0.15.0-1.1_i386
+libxosd-dev_2.2.14-2_i386
+libxp-dev_1:1.0.1-2+deb7u1_i386
+libxpa-dev_2.1.14-2_i386
+libxplc0.3.13-dev_0.3.13-3_i386
+libxpm-dev_1:3.5.10-1_i386
+libxqdbm-dev_1.8.78-2_i386
+libxqilla-dev_2.3.0-1_i386
+libxr1-dev_1.0-2.1_i386
+libxrandr-dev_2:1.3.2-2+deb7u1_i386
+libxrender-dev_1:0.9.7-1+deb7u1_i386
+libxres-dev_2:1.0.6-1+deb7u1_i386
+libxsettings-client-dev_0.17-6_i386
+libxsettings-dev_0.11-3_i386
+libxslt1-dev_1.1.26-14.1_i386
+libxss-dev_1:1.2.2-1_i386
+libxstr-ocaml-dev_0.2.1-21+b3_i386
+libxstrp4-camlp4-dev_1.8-3_all
+libxt-dev_1:1.1.3-1+deb7u1_i386
+libxtst-dev_2:1.2.1-1+deb7u1_i386
+libxv-dev_2:1.0.7-1+deb7u1_i386
+libxvidcore-dev_2:1.3.2-9_i386
+libxvmc-dev_2:1.0.7-1+deb7u2_i386
+libxxf86dga-dev_2:1.1.3-2+deb7u1_i386
+libxxf86vm-dev_1:1.1.2-1+deb7u1_i386
+libxy-dev_0.8-1+b1_i386
+libyahoo2-dev_1.0.1-1_i386
+libyajl-dev_2.0.4-2_i386
+libyaml-cpp-dev_0.3.0-1_i386
+libyaml-dev_0.1.4-2+deb7u4_i386
+libyaz4-dev_4.2.30-2_i386
+libyelp-dev_3.4.2-1+b1_i386
+libygl4-dev_4.2e-4_i386
+libykclient-dev_2.6-1_i386
+libykpers-1-dev_1.7.0-1_i386
+libyojson-ocaml-dev_1.0.3-1_i386
+libytnef0-dev_1.5-4_i386
+libyubikey-dev_1.8-1_i386
+libz80ex-dev_1.1.19-3_i386
+libzarith-ocaml-dev_1.1-2_i386
+libzbar-dev_0.10+doc-8_i386
+libzbargtk-dev_0.10+doc-8_i386
+libzbarqt-dev_0.10+doc-8_i386
+libzeep-dev_2.9.0-2_i386
+libzeitgeist-cil-dev_0.8.0.0-4_all
+libzeitgeist-dev_0.3.18-1_i386
+libzen-dev_0.4.27-2_i386
+libzephyr-dev_3.0.2-2_i386
+libzerg0-dev_1.0.7-3_i386
+libzeroc-ice34-dev_3.4.2-8.2_i386
+libzinnia-dev_0.06-1+b1_i386
+libzip-dev_0.10.1-1.1_i386
+libzip-ocaml-dev_1.04-6+b3_i386
+libzipios++-dev_0.1.5.9+cvs.2007.04.28-5.1_i386
+libzita-alsa-pcmi-dev_0.2.0-1_i386
+libzita-convolver-dev_3.1.0-2_i386
+libzita-resampler-dev_1.1.0-3_i386
+libzlcore-dev_0.12.10dfsg-8_i386
+libzltext-dev_0.12.10dfsg-8_i386
+libzmq-dev_2.2.0+dfsg-2_i386
+libzn-poly-dev_0.8-1.1_i386
+libzookeeper-mt-dev_3.3.5+dfsg1-2_i386
+libzookeeper-st-dev_3.3.5+dfsg1-2_i386
+libzorp-dev_3.9.5-4_i386
+libzorpll-dev_3.9.1.3-1_i386
+libzrtpcpp-dev_2.0.0-3_i386
+libzthread-dev_2.3.2-7_i386
+libzvbi-dev_0.2.33-6_i386
+libzzip-dev_0.13.56-1.1_i386
+licq-dev_1.6.1-3_all
+linux-libc-dev_3.2.57-3_i386
+lldpad-dev_0.9.44-1_i386
+llvm-2.9-dev_2.9+dfsg-7_i386
+llvm-3.0-dev_3.0-10_i386
+llvm-3.1-dev_3.1-1_i386
+llvm-dev_1:3.0-14+nmu2_i386
+lttv-dev_0.12.38-21032011-1+b1_i386
+lua-apr-dev_0.23.2-1_i386
+lua-bitop-dev_1.0.2-1_i386
+lua-curl-dev_0.3.0-7_i386
+lua-curses-dev_5.1.19-2_i386
+lua-cyrussasl-dev_1.0.0-4_i386
+lua-dbi-mysql-dev_0.5+svn78-4_i386
+lua-dbi-postgresql-dev_0.5+svn78-4_i386
+lua-dbi-sqlite3-dev_0.5+svn78-4_i386
+lua-event-dev_0.4.1-2_i386
+lua-expat-dev_1.2.0-5+deb7u1_i386
+lua-filesystem-dev_1.5.0+16+g84f1af5-1_i386
+lua-iconv-dev_7-1_i386
+lua-ldap-dev_1.1.0-1-geeac494-3_i386
+lua-leg-dev_0.1.2-8_all
+lua-lgi-dev_0.6.2-1_i386
+lua-lpeg-dev_0.10.2-5_i386
+lua-md5-dev_1.1.2-6_i386
+lua-penlight-dev_1.0.2+htmldoc-2_all
+lua-posix-dev_5.1.19-2_i386
+lua-rex-onig-dev_2.6.0-2_i386
+lua-rex-pcre-dev_2.6.0-2_i386
+lua-rex-posix-dev_2.6.0-2_i386
+lua-rex-tre-dev_2.6.0-2_i386
+lua-rings-dev_1.2.3-1_i386
+lua-sec-dev_0.4.1-1_i386
+lua-socket-dev_2.0.2-8_i386
+lua-sql-mysql-dev_2.3.0-1+build0_i386
+lua-sql-postgres-dev_2.3.0-1+build0_i386
+lua-sql-sqlite3-dev_2.3.0-1+build0_i386
+lua-svn-dev_0.4.0-7_i386
+lua-wsapi-fcgi-dev_1.5-3_i386
+lua-zip-dev_1.2.3-11_i386
+lua-zlib-dev_0.2-1_i386
+lua5.1-policy-dev_33_all
+lv2-dev_1.0.0~dfsg2-2_i386
+lxc-dev_0.8.0~rc1-8+deb7u2_i386
+lzma-dev_9.22-2_all
+manpages-de-dev_1.2-1_all
+manpages-dev_3.44-1_all
+manpages-fr-dev_3.44d1p1-1_all
+manpages-ja-dev_0.5.0.0.20120606-1_all
+manpages-pl-dev_1:0.3-1_all
+manpages-pt-dev_20040726-4_all
+matlab-support-dev_0.0.18_all
+mdbtools-dev_0.7-1+deb7u1_i386
+med-bio-dev_1.13.2_all
+med-imaging-dev_1.13.2_all
+mesa-common-dev_8.0.5-4+deb7u2_i386
+mffm-fftw-dev_1.7-3_i386
+mffm-timecode-dev_1.6-2_all
+mingw-w64-dev_2.0.3-1_all
+mingw-w64-i686-dev_2.0.3-1_all
+mingw-w64-x86-64-dev_2.0.3-1_all
+minpack-dev_19961126+dfsg1-1_i386
+mongodb-dev_1:2.0.6-1.1_i386
+mpi-default-dev_1.0.1_i386
+muroard-dev_0.1.10-2_i386
+neko-dev_1.8.1-6_all
+nettle-dev_2.4-3_i386
+network-manager-dev_0.9.4.0-10_i386
+ntfs-3g-dev_1:2012.1.15AR.5-2.1_i386
+ocfs2-tools-dev_1.6.4-1+deb7u1_i386
+ocl-icd-dev_1.3-3_i386
+ocl-icd-opencl-dev_1.3-3_i386
+ocsigen-dev_1.3.4-2_all
+octave-pkg-dev_1.0.2_all
+ofono-dev_1.6-2_all
+okteta-dev_4:4.8.4+dfsg-1_i386
+okular-dev_4:4.8.4-3_i386
+open-vm-tools-dev_2:8.8.0+2012.05.21-724730-1+nmu2_all
+openais-dev_1.1.4-4.1_i386
+openbox-dev_3.5.0-7_i386
+openchangeserver-dev_1:1.0-3_i386
+oss4-dev_4.2-build2006-2+deb7u1_all
+pacemaker-dev_1.1.7-1_i386
+packaging-dev_0.4_all
+paraview-dev_3.14.1-6_i386
+parole-dev_0.2.0.6-1+b1_i386
+parser3-dev_3.4.2-2_i386
+pbs-drmaa-dev_1.0.10-3_i386
+petsc-dev_3.2.dfsg-6_all
+php5-dev_5.4.4-14+deb7u9_i386
+pidgin-dev_2.10.9-1~deb7u1_all
+pinball-dev_0.3.1-13.1_i386
+planetpenguin-racer-gimp-dev_0.4-5_all
+planner-dev_0.14.6-1_i386
+plplot-tcl-dev_5.9.9-5_i386
+plptools-dev_1.0.9-2.4_i386
+plymouth-dev_0.8.5.1-5_i386
+portaudio19-dev_19+svn20111121-1_i386
+postfix-dev_2.9.6-2_all
+ppl-dev_0.11.2-8_i386
+ppp-dev_2.4.5-5.1_all
+prayer-templates-dev_1.3.4-dfsg1-1_i386
+proftpd-dev_1.3.4a-5+deb7u1_i386
+pslib-dev_0.4.5-3_i386
+publib-dev_0.40-1_i386
+puredata-dev_0.43.2-5_all
+pvm-dev_3.4.5-12.5_i386
+pxlib-dev_0.6.5-1_i386
+python-all-dev_2.7.3-4+deb7u1_all
+python-apt-dev_0.8.8.2_all
+python-cairo-dev_1.8.8-1_all
+python-cxx-dev_6.2.4-3_all
+python-dbus-dev_1.1.1-1_all
+python-dev_2.7.3-4+deb7u1_all
+python-egenix-mx-base-dev_3.2.1-1.1_all
+python-gamera-dev_3.3.3-2_all
+python-gi-dev_3.2.2-2_all
+python-gnome2-desktop-dev_2.32.0+dfsg-2_all
+python-gnome2-dev_2.28.1+dfsg-1_all
+python-gnome2-extras-dev_2.25.3-12_all
+python-gobject-2-dev_2.28.6-10_all
+python-gobject-dev_3.2.2-2_all
+python-greenlet-dev_0.3.1-2.5_i386
+python-gst0.10-dev_0.10.22-3_i386
+python-gtk2-dev_2.24.0-3_all
+python-kde4-dev_4:4.8.4-1_all
+python-ldb-dev_1:1.1.6-1_i386
+python-openturns-dev_1.0-4_i386
+python-pyorbit-dev_2.24.0-6_all
+python-qt4-dev_4.9.3-4_all
+python-sip-dev_4.13.3-2_i386
+python-talloc-dev_2.0.7+git20120207-1_i386
+python-webkit-dev_1.1.8-2_all
+python2.6-dev_2.6.8-1.1_i386
+python2.7-dev_2.7.3-6+deb7u2_i386
+python3-all-dev_3.2.3-6_all
+python3-cairo-dev_1.10.0+dfsg-2_all
+python3-cxx-dev_6.2.4-3_all
+python3-dev_3.2.3-6_all
+python3-sip-dev_4.13.3-2_i386
+python3.2-dev_3.2.3-7_i386
+qmf-dev_1.0.7~2011w23.2-2.1_i386
+qtmobility-dev_1.2.0-3_i386
+r-base-dev_2.15.1-4_all
+regina-normal-dev_4.93-1_i386
+resource-agents-dev_1:3.9.2-5+deb7u2_i386
+rhythmbox-dev_2.97-2.1_i386
+rivet-plugins-dev_1.8.0-1_all
+roarplaylistd-dev_0.1.1-2_all
+robot-player-dev_3.0.2+dfsg-4_all
+ruby-dev_1:1.9.3_all
+ruby-gnome2-dev_1.1.3-2+b1_i386
+ruby1.8-dev_1.8.7.358-7.1+deb7u1_i386
+ruby1.9.1-dev_1.9.3.194-8.1+deb7u2_i386
+rygel-1.0-dev_0.14.3-2+deb7u1_i386
+samba4-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+sbnc-php-dev_1.2-26_all
+science-astronomy-dev_1.0_all
+science-dataacquisition-dev_1.0_all
+science-engineering-dev_1.0_all
+science-highenergy-physics-dev_1.0_all
+science-mathematics-dev_1.0_all
+science-meteorology-dev_1.0_all
+science-nanoscale-physics-dev_1.0_all
+science-physics-dev_1.0_all
+scim-dev_1.4.13-5_all
+sciplot-dev_1.36-15_i386
+selinux-policy-dev_2:2.20110726-12_all
+seqan-dev_1.3.1-1_all
+sfftw-dev_2.1.5-1_i386
+skalibs-dev_0.47-1_i386
+slurm-drmaa-dev_1.0.4-3_i386
+slurm-llnl-basic-plugins-dev_2.3.4-2+b1_i386
+snappea-dev_3.0d3-22_i386
+spl-dev_1.0~pre6-3.1+b1_i386
+sra-toolkit-libs-dev_2.1.7a-1_i386
+ss-dev_2.0-1.42.5-1.1_i386
+stx-btree-dev_0.8.6-1_all
+styx-dev_1.8.0-1.1_i386
+supercollider-dev_1:3.4.5-1wheezy1_i386
+svdrpservice-dev_0.0.4-14_all
+sweep-dev_0.9.3-6_all
+swish-e-dev_2.4.7-3_i386
+syfi-dev_1.0.0.dfsg-1_all
+system-tools-backends-dev_2.10.2-1_all
+systemtap-sdt-dev_1.7-1+deb7u1_i386
+tcl-dev_8.5.0-2.1_all
+tcl-memchan-dev_2.3-2_i386
+tcl-trf-dev_2.1.4-dfsg1-1_i386
+tcl8.4-dev_8.4.19-5_i386
+tcl8.5-dev_8.5.11-2_i386
+tclcl-dev_1.20-6_all
+tclx8.4-dev_8.4.0-3_i386
+tclxml-dev_3.3~svn11-2_i386
+tdom-dev_0.8.3~20080525-3+nmu2_i386
+tesseract-ocr-dev_3.02.01-6_all
+tix-dev_8.4.3-4_i386
+tk-dev_8.5.0-2.1_all
+tk8.4-dev_8.4.19-5_i386
+tk8.5-dev_8.5.11-2_i386
+tqsllib-dev_2.2-5_i386
+trafficserver-dev_3.0.5-1_i386
+tuxpaint-dev_1:0.9.21-1.1_all
+unagi-dev_0.3.3-2_i386
+unixodbc-dev_2.2.14p2-5_i386
+uthash-dev_1.9.5-1_all
+uuid-dev_2.20.1-5.3_i386
+vdr-dev_1.7.28-1_all
+vflib3-dev_3.6.14.dfsg-3+b1_i386
+voms-dev_2.0.8-1_i386
+vstream-client-dev_1.2-6.1_i386
+wcslib-dev_4.13.4-1_i386
+weechat-dev_0.3.8-1+deb7u1_all
+wireshark-dev_1.8.2-5wheezy10_i386
+witty-dev_3.2.1-2_all
+wordnet-dev_1:3.0-29_i386
+wzdftpd-dev_0.8.3-6.2_i386
+x11proto-bigreqs-dev_1:1.1.2-1_all
+x11proto-composite-dev_1:0.4.2-2_all
+x11proto-core-dev_7.0.23-1_all
+x11proto-damage-dev_1:1.2.1-2_all
+x11proto-dmx-dev_1:2.3.1-2_all
+x11proto-dri2-dev_2.6-2_all
+x11proto-fixes-dev_1:5.0-2_all
+x11proto-fonts-dev_2.1.2-1_all
+x11proto-gl-dev_1.4.15-1_all
+x11proto-input-dev_2.2-1_all
+x11proto-kb-dev_1.0.6-2_all
+x11proto-print-dev_1.0.5-2_all
+x11proto-randr-dev_1.3.2-2_all
+x11proto-record-dev_1.14.2-1_all
+x11proto-render-dev_2:0.11.1-2_all
+x11proto-resource-dev_1.2.0-3_all
+x11proto-scrnsaver-dev_1.2.2-1_all
+x11proto-video-dev_2.3.1-2_all
+x11proto-xcmisc-dev_1.2.2-1_all
+x11proto-xext-dev_7.2.1-1_all
+x11proto-xf86bigfont-dev_1.2.0-3_all
+x11proto-xf86dga-dev_2.1-3_all
+x11proto-xf86dri-dev_2.1.1-2_all
+x11proto-xf86vidmode-dev_2.3.1-2_all
+x11proto-xinerama-dev_1.2.1-2_all
+xaw3dg-dev_1.5+E-18.2_i386
+xbmc-eventclients-dev_2:11.0~git20120510.82388d5-1_all
+xfce4-panel-dev_4.8.6-4_i386
+xfslibs-dev_3.1.7+b1_i386
+xmhtml1-dev_1.1.7-18_i386
+xmms2-dev_0.8+dfsg-4_all
+xorg-dev_1:7.7+3~deb7u1_all
+xotcl-dev_1.6.7-2_i386
+xpaint-dev_2.9.1.4-3+b2_i386
+xserver-xorg-dev_2:1.12.4-6+deb7u2_i386
+xserver-xorg-input-evdev-dev_1:2.7.0-1_all
+xserver-xorg-input-joystick-dev_1:1.6.1-1_all
+xserver-xorg-input-synaptics-dev_1.6.2-2_all
+xtrans-dev_1.2.7-1_all
+xulrunner-dev_24.4.0esr-1~deb7u2_i386
+xutils-dev_1:7.7~1_i386
+xviewg-dev_3.2p1.4-28.1_i386
+yate-dev_4.1.0-1~dfsg-3_i386
+yorick-dev_2.2.02+dfsg-6_i386
+zathura-dev_0.1.2-4_all
+zlib1g-dev_1:1.2.7.dfsg-13_i386
+znc-dev_0.206-2_i386
+zsh-dev_4.3.17-1_i386
\ No newline at end of file
diff --git a/src/github.com/smira/aptly/system/t04_mirror/SearchMirror2Test_gold b/src/github.com/smira/aptly/system/t04_mirror/SearchMirror2Test_gold
new file mode 100644
index 00000000..7ad172a5
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t04_mirror/SearchMirror2Test_gold
@@ -0,0 +1 @@
+ERROR: unable to search: mirror with name mirror-xx not found
diff --git a/src/github.com/smira/aptly/system/t04_mirror/SearchMirror3Test_gold b/src/github.com/smira/aptly/system/t04_mirror/SearchMirror3Test_gold
new file mode 100644
index 00000000..58f09611
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t04_mirror/SearchMirror3Test_gold
@@ -0,0 +1 @@
+ERROR: unable to search: parsing failed: unexpected token : expecting ')'
diff --git a/src/github.com/smira/aptly/system/t04_mirror/SearchMirror4Test_gold b/src/github.com/smira/aptly/system/t04_mirror/SearchMirror4Test_gold
new file mode 100644
index 00000000..007f3b4f
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t04_mirror/SearchMirror4Test_gold
@@ -0,0 +1,95 @@
+
+coreutils_8.13-3.5_amd64
+coreutils_8.13-3.5_i386
+debconf_1.5.49_all
+dpkg_1.16.12_amd64
+dpkg_1.16.12_i386
+fontconfig-config_2.9.0-7.1_all
+fonts-freefont-ttf_20120503-1_all
+gcc-4.7-base_4.7.2-5_amd64
+gcc-4.7-base_4.7.2-5_i386
+gsfonts-x11_0.22_all
+gsfonts_1:8.11+urwcyr1.0.7~pre44-4.2_all
+libacl1_2.2.51-8_amd64
+libacl1_2.2.51-8_i386
+libattr1_1:2.4.46-8_amd64
+libattr1_1:2.4.46-8_i386
+libbz2-1.0_1.0.6-4_amd64
+libbz2-1.0_1.0.6-4_i386
+libc-bin_2.13-38+deb7u1_amd64
+libc-bin_2.13-38+deb7u1_i386
+libc6_2.13-38+deb7u1_amd64
+libc6_2.13-38+deb7u1_i386
+libexpat1_2.1.0-1+deb7u1_amd64
+libexpat1_2.1.0-1+deb7u1_i386
+libfontconfig1_2.9.0-7.1_amd64
+libfontconfig1_2.9.0-7.1_i386
+libfontenc1_1:1.1.1-1_amd64
+libfontenc1_1:1.1.1-1_i386
+libfreetype6_2.4.9-1.1_amd64
+libfreetype6_2.4.9-1.1_i386
+libgcc1_1:4.7.2-5_amd64
+libgcc1_1:4.7.2-5_i386
+libgcrypt11_1.5.0-5+deb7u1_amd64
+libgcrypt11_1.5.0-5+deb7u1_i386
+libgd2-noxpm_2.0.36~rc1~dfsg-6.1_amd64
+libgd2-noxpm_2.0.36~rc1~dfsg-6.1_i386
+libgd2-xpm_2.0.36~rc1~dfsg-6.1_amd64
+libgd2-xpm_2.0.36~rc1~dfsg-6.1_i386
+libgeoip1_1.4.8+dfsg-3_amd64
+libgeoip1_1.4.8+dfsg-3_i386
+libgpg-error0_1.10-3.1_amd64
+libgpg-error0_1.10-3.1_i386
+libjpeg8_8d-1_amd64
+libjpeg8_8d-1_i386
+liblzma5_5.1.1alpha+20120614-2_amd64
+liblzma5_5.1.1alpha+20120614-2_i386
+libpam0g_1.1.3-7.1_amd64
+libpam0g_1.1.3-7.1_i386
+libpcre3_1:8.30-5_amd64
+libpcre3_1:8.30-5_i386
+libpng12-0_1.2.49-1_amd64
+libpng12-0_1.2.49-1_i386
+libselinux1_2.1.9-5_amd64
+libselinux1_2.1.9-5_i386
+libssl1.0.0_1.0.1e-2+deb7u7_amd64
+libssl1.0.0_1.0.1e-2+deb7u7_i386
+libx11-6_2:1.5.0-1+deb7u1_amd64
+libx11-6_2:1.5.0-1+deb7u1_i386
+libx11-data_2:1.5.0-1+deb7u1_all
+libxau6_1:1.0.7-1_amd64
+libxau6_1:1.0.7-1_i386
+libxcb1_1.8.1-2+deb7u1_amd64
+libxcb1_1.8.1-2+deb7u1_i386
+libxdmcp6_1:1.1.1-1_amd64
+libxdmcp6_1:1.1.1-1_i386
+libxfont1_1:1.4.5-3_amd64
+libxfont1_1:1.4.5-3_i386
+libxml2_2.8.0+dfsg1-7+nmu3_amd64
+libxml2_2.8.0+dfsg1-7+nmu3_i386
+libxpm4_1:3.5.10-1_amd64
+libxpm4_1:3.5.10-1_i386
+libxslt1.1_1.1.26-14.1_amd64
+libxslt1.1_1.1.26-14.1_i386
+lsb-base_4.1+Debian8+deb7u1_all
+multiarch-support_2.13-38+deb7u1_amd64
+multiarch-support_2.13-38+deb7u1_i386
+nginx-common_1.2.1-2.2+wheezy2_all
+nginx-full_1.2.1-2.2+wheezy2_amd64
+nginx-full_1.2.1-2.2+wheezy2_i386
+nginx-light_1.2.1-2.2+wheezy2_amd64
+nginx-light_1.2.1-2.2+wheezy2_i386
+nginx_1.2.1-2.2+wheezy2_all
+perl-base_5.14.2-21+deb7u1_amd64
+perl-base_5.14.2-21+deb7u1_i386
+tar_1.26+dfsg-0.1_amd64
+tar_1.26+dfsg-0.1_i386
+ttf-bitstream-vera_1.10-8_all
+ttf-dejavu-core_2.33-3_all
+ucf_3.0025+nmu3_all
+x11-common_1:7.7+3~deb7u1_all
+xfonts-encodings_1:1.0.4-1_all
+xfonts-utils_1:7.7~1_amd64
+xfonts-utils_1:7.7~1_i386
+zlib1g_1:1.2.7.dfsg-13_amd64
+zlib1g_1:1.2.7.dfsg-13_i386
\ No newline at end of file
diff --git a/src/github.com/smira/aptly/system/t04_mirror/ShowMirror1Test_gold b/src/github.com/smira/aptly/system/t04_mirror/ShowMirror1Test_gold
index d5542dde..94f4085f 100644
--- a/src/github.com/smira/aptly/system/t04_mirror/ShowMirror1Test_gold
+++ b/src/github.com/smira/aptly/system/t04_mirror/ShowMirror1Test_gold
@@ -4,6 +4,7 @@ Distribution: wheezy
Components: main, contrib, non-free
Architectures: amd64, armel, armhf, i386, ia64, kfreebsd-amd64, kfreebsd-i386, mips, mipsel, powerpc, s390, s390x, sparc
Download Sources: no
+Download .udebs: no
Last update: never
Information from release file:
diff --git a/src/github.com/smira/aptly/system/t04_mirror/ShowMirror3Test_gold b/src/github.com/smira/aptly/system/t04_mirror/ShowMirror3Test_gold
index 94db9a7c..a8315473 100644
--- a/src/github.com/smira/aptly/system/t04_mirror/ShowMirror3Test_gold
+++ b/src/github.com/smira/aptly/system/t04_mirror/ShowMirror3Test_gold
@@ -4,7 +4,7 @@ Distribution: wheezy
Components: contrib
Architectures: i386, amd64
Download Sources: no
-Last update: 2014-02-25 00:21:33 MSK
+Download .udebs: no
Number of packages: 325
Information from release file:
diff --git a/src/github.com/smira/aptly/system/t04_mirror/ShowMirror4Test_gold b/src/github.com/smira/aptly/system/t04_mirror/ShowMirror4Test_gold
index 7a8182b7..1412be26 100644
--- a/src/github.com/smira/aptly/system/t04_mirror/ShowMirror4Test_gold
+++ b/src/github.com/smira/aptly/system/t04_mirror/ShowMirror4Test_gold
@@ -4,6 +4,7 @@ Distribution: wheezy/updates
Components: main
Architectures: amd64, armel, armhf, i386, ia64, kfreebsd-amd64, kfreebsd-i386, mips, mipsel, powerpc, s390, s390x, sparc
Download Sources: no
+Download .udebs: no
Filter: nginx | Priority (required)
Filter With Deps: yes
Last update: never
@@ -12,11 +13,9 @@ Information from release file:
Architectures: amd64 armel armhf i386 ia64 kfreebsd-amd64 kfreebsd-i386 mips mipsel powerpc s390 s390x sparc
Codename: wheezy
Components: updates/main updates/contrib updates/non-free
-Date: Sun, 13 Jul 2014 12:12:08 UTC
Description: Debian 7.0 Security Updates
Label: Debian-Security
Origin: Debian
Suite: stable
-Valid-Until: Wed, 23 Jul 2014 12:12:08 UTC
Version: 7.0
diff --git a/src/github.com/smira/aptly/system/t04_mirror/UpdateMirror11Test_gold b/src/github.com/smira/aptly/system/t04_mirror/UpdateMirror11Test_gold
new file mode 100644
index 00000000..9d4793a6
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t04_mirror/UpdateMirror11Test_gold
@@ -0,0 +1,21 @@
+
+
+Applying filter...
+Building download queue...
+Download queue: 5 items (0.54 MiB)
+Downloading & parsing package files...
+Downloading ftp://ftp.ru.debian.org/debian/dists/wheezy/InRelease...
+Downloading ftp://ftp.ru.debian.org/debian/dists/wheezy/Release...
+Downloading ftp://ftp.ru.debian.org/debian/dists/wheezy/Release.gpg...
+Downloading ftp://ftp.ru.debian.org/debian/dists/wheezy/main/binary-i386/Packages.bz2...
+Downloading ftp://ftp.ru.debian.org/debian/pool/main/s/sed/sed_4.2.1-10_i386.deb...
+Downloading ftp://ftp.ru.debian.org/debian/pool/main/s/sensible-utils/sensible-utils_0.0.7_all.deb...
+Downloading ftp://ftp.ru.debian.org/debian/pool/main/s/sysvinit/sysv-rc_2.88dsf-41+deb7u1_all.deb...
+Downloading ftp://ftp.ru.debian.org/debian/pool/main/s/sysvinit/sysvinit-utils_2.88dsf-41+deb7u1_i386.deb...
+Downloading ftp://ftp.ru.debian.org/debian/pool/main/s/sysvinit/sysvinit_2.88dsf-41+deb7u1_i386.deb...
+Mirror `wheezy-main` has been successfully updated.
+Packages filtered: 36046 -> 5.
+gpgv: Good signature from "Debian Archive Automatic Signing Key (7.0/wheezy) "
+gpgv: Good signature from "Wheezy Stable Release Key "
+gpgv: RSA key ID 46925553
+gpgv: RSA key ID 65FFB764
\ No newline at end of file
diff --git a/src/github.com/smira/aptly/system/t04_mirror/UpdateMirror12Test_gold b/src/github.com/smira/aptly/system/t04_mirror/UpdateMirror12Test_gold
new file mode 100644
index 00000000..1a7390dd
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t04_mirror/UpdateMirror12Test_gold
@@ -0,0 +1,33 @@
+
+
+Applying filter...
+Building download queue...
+Download queue: 10 items (0.76 MiB)
+Downloading & parsing package files...
+Downloading http://mirror.yandex.ru/debian/dists/squeeze/InRelease...
+Downloading http://mirror.yandex.ru/debian/dists/squeeze/Release...
+Downloading http://mirror.yandex.ru/debian/dists/squeeze/Release.gpg...
+Downloading http://mirror.yandex.ru/debian/dists/squeeze/main/binary-amd64/Packages.bz2...
+Downloading http://mirror.yandex.ru/debian/dists/squeeze/main/binary-i386/Packages.bz2...
+Downloading http://mirror.yandex.ru/debian/dists/squeeze/main/debian-installer/binary-amd64/Packages.bz2...
+Downloading http://mirror.yandex.ru/debian/dists/squeeze/main/debian-installer/binary-i386/Packages.bz2...
+Downloading http://mirror.yandex.ru/debian/dists/squeeze/non-free/binary-amd64/Packages.bz2...
+Downloading http://mirror.yandex.ru/debian/dists/squeeze/non-free/binary-i386/Packages.bz2...
+Downloading http://mirror.yandex.ru/debian/dists/squeeze/non-free/debian-installer/binary-amd64/Packages.bz2...
+Downloading http://mirror.yandex.ru/debian/dists/squeeze/non-free/debian-installer/binary-i386/Packages.bz2...
+Downloading http://mirror.yandex.ru/debian/pool/main/d/dmraid/dmraid-udeb_1.0.0.rc16-4.1_amd64.udeb...
+Downloading http://mirror.yandex.ru/debian/pool/main/d/dmraid/dmraid-udeb_1.0.0.rc16-4.1_i386.udeb...
+Downloading http://mirror.yandex.ru/debian/pool/main/d/dmraid/dmraid_1.0.0.rc16-4.1_amd64.deb...
+Downloading http://mirror.yandex.ru/debian/pool/main/d/dmraid/dmraid_1.0.0.rc16-4.1_i386.deb...
+Downloading http://mirror.yandex.ru/debian/pool/main/d/dmraid/libdmraid-dev_1.0.0.rc16-4.1_amd64.deb...
+Downloading http://mirror.yandex.ru/debian/pool/main/d/dmraid/libdmraid-dev_1.0.0.rc16-4.1_i386.deb...
+Downloading http://mirror.yandex.ru/debian/pool/main/d/dmraid/libdmraid1.0.0.rc16-udeb_1.0.0.rc16-4.1_amd64.udeb...
+Downloading http://mirror.yandex.ru/debian/pool/main/d/dmraid/libdmraid1.0.0.rc16-udeb_1.0.0.rc16-4.1_i386.udeb...
+Downloading http://mirror.yandex.ru/debian/pool/main/d/dmraid/libdmraid1.0.0.rc16_1.0.0.rc16-4.1_amd64.deb...
+Downloading http://mirror.yandex.ru/debian/pool/main/d/dmraid/libdmraid1.0.0.rc16_1.0.0.rc16-4.1_i386.deb...
+Mirror `squeeze` has been successfully updated.
+Packages filtered: 45830 -> 10.
+gpgv: Good signature from "Debian Archive Automatic Signing Key (6.0/squeeze) "
+gpgv: Good signature from "Squeeze Stable Release Key "
+gpgv: RSA key ID 473041FA
+gpgv: RSA key ID B98321F9
\ No newline at end of file
diff --git a/src/github.com/smira/aptly/system/t04_mirror/__init__.py b/src/github.com/smira/aptly/system/t04_mirror/__init__.py
index 075e3c8f..1c2c36bf 100644
--- a/src/github.com/smira/aptly/system/t04_mirror/__init__.py
+++ b/src/github.com/smira/aptly/system/t04_mirror/__init__.py
@@ -9,3 +9,4 @@ from .update import *
from .drop import *
from .rename import *
from .edit import *
+from .search import *
diff --git a/src/github.com/smira/aptly/system/t04_mirror/create.py b/src/github.com/smira/aptly/system/t04_mirror/create.py
index 91575aa9..0e469e33 100644
--- a/src/github.com/smira/aptly/system/t04_mirror/create.py
+++ b/src/github.com/smira/aptly/system/t04_mirror/create.py
@@ -273,3 +273,36 @@ class CreateMirror23Test(BaseTest):
"""
runCmd = "aptly mirror create -ignore-signatures -filter='nginx | ' mirror23 http://security.debian.org/ wheezy/updates main"
expectedCode = 1
+
+
+class CreateMirror24Test(BaseTest):
+ """
+ create mirror: disable config value with option
+ """
+ runCmd = "aptly mirror create -ignore-signatures=false -keyring=aptlytest.gpg mirror24 http://security.debian.org/ wheezy/updates main"
+ fixtureGpg = True
+ outputMatchPrepare = lambda _, s: re.sub(r'Signature made .* using', '', s)
+
+ configOverride = {
+ "gpgDisableVerify": True
+ }
+
+
+class CreateMirror25Test(BaseTest):
+ """
+ create mirror: mirror with udebs enabled
+ """
+ runCmd = "aptly -architectures=i386 mirror create -ignore-signatures -with-udebs mirror25 http://mirror.yandex.ru/debian/ wheezy"
+
+ def check(self):
+ self.check_output()
+ self.check_cmd_output("aptly mirror show mirror25", "mirror_show")
+
+
+class CreateMirror26Test(BaseTest):
+ """
+ create mirror: flat mirror with udebs
+ """
+ runCmd = "aptly mirror create -keyring=aptlytest.gpg -with-udebs mirror26 http://pkg.jenkins-ci.org/debian-stable binary/"
+ fixtureGpg = True
+ expectedCode = 1
diff --git a/src/github.com/smira/aptly/system/t04_mirror/edit.py b/src/github.com/smira/aptly/system/t04_mirror/edit.py
index 6453ad11..53b36cbf 100644
--- a/src/github.com/smira/aptly/system/t04_mirror/edit.py
+++ b/src/github.com/smira/aptly/system/t04_mirror/edit.py
@@ -4,10 +4,10 @@ from lib import BaseTest
class EditMirror1Test(BaseTest):
"""
- edit mirror: enable filter
+ edit mirror: enable filter & download sources
"""
fixtureDB = True
- runCmd = "aptly mirror edit -filter=nginx -filter-with-deps wheezy-main"
+ runCmd = "aptly mirror edit -filter=nginx -filter-with-deps -with-sources wheezy-main"
def check(self):
self.check_output()
@@ -58,3 +58,46 @@ class EditMirror5Test(BaseTest):
self.check_output()
self.check_cmd_output("aptly mirror show mirror5", "mirror_show", match_prepare=removeDates)
+
+
+class EditMirror6Test(BaseTest):
+ """
+ edit mirror: change architectures
+ """
+ fixtureDB = True
+ runCmd = "aptly mirror edit -architectures=amd64,s390 wheezy-main"
+
+ def check(self):
+ self.check_output()
+ self.check_cmd_output("aptly mirror show wheezy-main", "mirror_show", match_prepare=lambda s: re.sub(r"Last update: [0-9:+A-Za-z -]+\n", "", s))
+
+
+class EditMirror7Test(BaseTest):
+ """
+ edit mirror: change architectures to missing archs
+ """
+ fixtureDB = True
+ runCmd = "aptly mirror edit -architectures=amd64,x56 wheezy-main"
+ expectedCode = 1
+
+
+class EditMirror8Test(BaseTest):
+ """
+ edit mirror: enable udebs
+ """
+ fixtureDB = True
+ runCmd = "aptly mirror edit -with-udebs wheezy-main"
+
+ def check(self):
+ self.check_output()
+ self.check_cmd_output("aptly mirror show wheezy-main", "mirror_show", match_prepare=lambda s: re.sub(r"Last update: [0-9:+A-Za-z -]+\n", "", s))
+
+
+class EditMirror9Test(BaseTest):
+ """
+ edit mirror: flat mirror with udebs
+ """
+ fixtureCmds = ["aptly mirror create -keyring=aptlytest.gpg mirror9 http://pkg.jenkins-ci.org/debian-stable binary/"]
+ fixtureGpg = True
+ runCmd = "aptly mirror edit -with-udebs mirror9"
+ expectedCode = 1
diff --git a/src/github.com/smira/aptly/system/t04_mirror/search.py b/src/github.com/smira/aptly/system/t04_mirror/search.py
new file mode 100644
index 00000000..a887fe29
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t04_mirror/search.py
@@ -0,0 +1,36 @@
+from lib import BaseTest
+
+
+class SearchMirror1Test(BaseTest):
+ """
+ search mirror: regular search
+ """
+ fixtureDB = True
+ outputMatchPrepare = lambda _, s: "\n".join(sorted(s.split("\n")))
+ runCmd = "aptly mirror search wheezy-main '$$Architecture (i386), Name (% *-dev)'"
+
+
+class SearchMirror2Test(BaseTest):
+ """
+ search mirror: missing mirror
+ """
+ runCmd = "aptly mirror search mirror-xx 'Name'"
+ expectedCode = 1
+
+
+class SearchMirror3Test(BaseTest):
+ """
+ search mirror: wrong expression
+ """
+ fixtureDB = True
+ expectedCode = 1
+ runCmd = "aptly mirror search wheezy-main '$$Architecture (i386'"
+
+
+class SearchMirror4Test(BaseTest):
+ """
+ search mirror: with-deps search
+ """
+ fixtureDB = True
+ outputMatchPrepare = lambda _, s: "\n".join(sorted(s.split("\n")))
+ runCmd = "aptly mirror search -with-deps wheezy-main 'Name (nginx)'"
diff --git a/src/github.com/smira/aptly/system/t04_mirror/update.py b/src/github.com/smira/aptly/system/t04_mirror/update.py
index 430eee53..5a57aded 100644
--- a/src/github.com/smira/aptly/system/t04_mirror/update.py
+++ b/src/github.com/smira/aptly/system/t04_mirror/update.py
@@ -140,3 +140,35 @@ class UpdateMirror10Test(BaseTest):
def output_processor(self, output):
return "\n".join(sorted(output.split("\n")))
+
+
+class UpdateMirror11Test(BaseTest):
+ """
+ update mirrors: update over FTP
+ """
+ longTest = False
+ fixtureGpg = True
+ fixtureCmds = [
+ "aptly mirror create -keyring=aptlytest.gpg -filter='Priority (required), Name (% s*)' -architectures=i386 wheezy-main ftp://ftp.ru.debian.org/debian/ wheezy main",
+ ]
+ outputMatchPrepare = lambda _, s: re.sub(r'Signature made .* using', '', s)
+ runCmd = "aptly mirror update -keyring=aptlytest.gpg wheezy-main"
+
+ def output_processor(self, output):
+ return "\n".join(sorted(output.split("\n")))
+
+
+class UpdateMirror12Test(BaseTest):
+ """
+ update mirrors: update with udebs
+ """
+ longTest = False
+ fixtureGpg = True
+ fixtureCmds = [
+ "aptly -architectures=i386,amd64 mirror create -keyring=aptlytest.gpg -filter='$$Source (dmraid)' -with-udebs squeeze http://mirror.yandex.ru/debian/ squeeze main non-free",
+ ]
+ runCmd = "aptly mirror update -keyring=aptlytest.gpg squeeze"
+ outputMatchPrepare = lambda _, s: re.sub(r'Signature made .* using', '', s)
+
+ def output_processor(self, output):
+ return "\n".join(sorted(output.split("\n")))
diff --git a/src/github.com/smira/aptly/system/t05_snapshot/FilterSnapshot1Test_gold b/src/github.com/smira/aptly/system/t05_snapshot/FilterSnapshot1Test_gold
new file mode 100644
index 00000000..63cad56b
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t05_snapshot/FilterSnapshot1Test_gold
@@ -0,0 +1,5 @@
+Loading packages (661)...
+Building indexes...
+
+Snapshot snap2 successfully filtered.
+You can run 'aptly publish snapshot snap2' to publish snapshot as Debian repository.
diff --git a/src/github.com/smira/aptly/system/t05_snapshot/FilterSnapshot1Test_snapshot_show b/src/github.com/smira/aptly/system/t05_snapshot/FilterSnapshot1Test_snapshot_show
new file mode 100644
index 00000000..bd085c4d
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t05_snapshot/FilterSnapshot1Test_snapshot_show
@@ -0,0 +1,8 @@
+Name: snap2
+Description: Filtered 'snap1', query was: 'mame unrar'
+Number of packages: 4
+Packages:
+ mame_0.146-5_amd64
+ unrar_1:4.1.4-1_amd64
+ mame_0.146-5_i386
+ unrar_1:4.1.4-1_i386
diff --git a/src/github.com/smira/aptly/system/t05_snapshot/FilterSnapshot2Test_gold b/src/github.com/smira/aptly/system/t05_snapshot/FilterSnapshot2Test_gold
new file mode 100644
index 00000000..a2956341
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t05_snapshot/FilterSnapshot2Test_gold
@@ -0,0 +1,5 @@
+Loading packages (4742)...
+Building indexes...
+
+Snapshot snap2 successfully filtered.
+You can run 'aptly publish snapshot snap2' to publish snapshot as Debian repository.
diff --git a/src/github.com/smira/aptly/system/t05_snapshot/FilterSnapshot2Test_snapshot_show b/src/github.com/smira/aptly/system/t05_snapshot/FilterSnapshot2Test_snapshot_show
new file mode 100644
index 00000000..677c33d1
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t05_snapshot/FilterSnapshot2Test_snapshot_show
@@ -0,0 +1,13 @@
+Name: snap2
+Description: Filtered 'snap1', query was: 'rsyslog (>= 7.4.4)'
+Number of packages: 9
+Packages:
+ init-system-helpers_1.18~bpo70+1_all
+ libestr0_0.1.9-1~bpo70+1_amd64
+ libjson-c2_0.11-3~bpo7+1_amd64
+ liblogging-stdlog0_1.0.4-1~bpo70+1_amd64
+ rsyslog_7.6.3-2~bpo70+1_amd64
+ libestr0_0.1.9-1~bpo70+1_i386
+ libjson-c2_0.11-3~bpo7+1_i386
+ liblogging-stdlog0_1.0.4-1~bpo70+1_i386
+ rsyslog_7.6.3-2~bpo70+1_i386
diff --git a/src/github.com/smira/aptly/system/t05_snapshot/FilterSnapshot3Test_gold b/src/github.com/smira/aptly/system/t05_snapshot/FilterSnapshot3Test_gold
new file mode 100644
index 00000000..391ea639
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t05_snapshot/FilterSnapshot3Test_gold
@@ -0,0 +1,5 @@
+Loading packages (56121)...
+Building indexes...
+
+Snapshot snap2 successfully filtered.
+You can run 'aptly publish snapshot snap2' to publish snapshot as Debian repository.
diff --git a/src/github.com/smira/aptly/system/t05_snapshot/FilterSnapshot3Test_snapshot_show b/src/github.com/smira/aptly/system/t05_snapshot/FilterSnapshot3Test_snapshot_show
new file mode 100644
index 00000000..680283f2
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t05_snapshot/FilterSnapshot3Test_snapshot_show
@@ -0,0 +1,127 @@
+Name: snap2
+Description: Filtered 'snap1', query was: 'Priority (required) nginx xyz'
+Number of packages: 123
+Packages:
+ debconf_1.5.49_all
+ debconf-i18n_1.5.49_all
+ libpam-runtime_1.1.3-7.1_all
+ libtext-wrapi18n-perl_0.06-7_all
+ lsb-base_4.1+Debian8+deb7u1_all
+ ncurses-base_5.9-10_all
+ nginx_1.2.1-2.2+wheezy2_all
+ nginx-naxsi-ui_1.2.1-2.2+wheezy2_all
+ sensible-utils_0.0.7_all
+ sysv-rc_2.88dsf-41+deb7u1_all
+ tzdata_2014a-0wheezy1_all
+ base-files_7.1wheezy5_amd64
+ base-passwd_3.5.26_amd64
+ bash_4.2+dfsg-0.1_amd64
+ bsdutils_1:2.20.1-5.3_amd64
+ coreutils_8.13-3.5_amd64
+ dash_0.5.7-3_amd64
+ debianutils_4.3.2_amd64
+ diffutils_1:3.2-6_amd64
+ dpkg_1.16.12_amd64
+ e2fslibs_1.42.5-1.1_amd64
+ e2fsprogs_1.42.5-1.1_amd64
+ findutils_4.4.2-4_amd64
+ gcc-4.7-base_4.7.2-5_amd64
+ grep_2.12-2_amd64
+ gzip_1.5-1.1_amd64
+ hostname_3.11_amd64
+ initscripts_2.88dsf-41+deb7u1_amd64
+ libacl1_2.2.51-8_amd64
+ libattr1_1:2.4.46-8_amd64
+ libblkid1_2.20.1-5.3_amd64
+ libc-bin_2.13-38+deb7u1_amd64
+ libc6_2.13-38+deb7u1_amd64
+ libcomerr2_1.42.5-1.1_amd64
+ libgcc1_1:4.7.2-5_amd64
+ liblocale-gettext-perl_1.05-7+b1_amd64
+ liblzma5_5.1.1alpha+20120614-2_amd64
+ libmount1_2.20.1-5.3_amd64
+ libncurses5_5.9-10_amd64
+ libpam-modules_1.1.3-7.1_amd64
+ libpam-modules-bin_1.1.3-7.1_amd64
+ libpam0g_1.1.3-7.1_amd64
+ libselinux1_2.1.9-5_amd64
+ libsepol1_2.1.4-3_amd64
+ libss2_1.42.5-1.1_amd64
+ libtext-charwidth-perl_0.04-7+b1_amd64
+ libtext-iconv-perl_1.7-5_amd64
+ libtinfo5_5.9-10_amd64
+ libuuid1_2.20.1-5.3_amd64
+ login_1:4.1.5.1-1_amd64
+ mawk_1.3.3-17_amd64
+ mount_2.20.1-5.3_amd64
+ multiarch-support_2.13-38+deb7u1_amd64
+ ncurses-bin_5.9-10_amd64
+ nginx-extras_1.2.1-2.2+wheezy2_amd64
+ nginx-full_1.2.1-2.2+wheezy2_amd64
+ nginx-light_1.2.1-2.2+wheezy2_amd64
+ nginx-naxsi_1.2.1-2.2+wheezy2_amd64
+ passwd_1:4.1.5.1-1_amd64
+ perl-base_5.14.2-21+deb7u1_amd64
+ sed_4.2.1-10_amd64
+ sysvinit_2.88dsf-41+deb7u1_amd64
+ sysvinit-utils_2.88dsf-41+deb7u1_amd64
+ tar_1.26+dfsg-0.1_amd64
+ util-linux_2.20.1-5.3_amd64
+ xz-utils_5.1.1alpha+20120614-2_amd64
+ zlib1g_1:1.2.7.dfsg-13_amd64
+ base-files_7.1wheezy5_i386
+ base-passwd_3.5.26_i386
+ bash_4.2+dfsg-0.1_i386
+ bsdutils_1:2.20.1-5.3_i386
+ coreutils_8.13-3.5_i386
+ dash_0.5.7-3_i386
+ debianutils_4.3.2_i386
+ diffutils_1:3.2-6_i386
+ dpkg_1.16.12_i386
+ e2fslibs_1.42.5-1.1_i386
+ e2fsprogs_1.42.5-1.1_i386
+ findutils_4.4.2-4_i386
+ gcc-4.7-base_4.7.2-5_i386
+ grep_2.12-2_i386
+ gzip_1.5-1.1_i386
+ hostname_3.11_i386
+ initscripts_2.88dsf-41+deb7u1_i386
+ libacl1_2.2.51-8_i386
+ libattr1_1:2.4.46-8_i386
+ libblkid1_2.20.1-5.3_i386
+ libc-bin_2.13-38+deb7u1_i386
+ libc6_2.13-38+deb7u1_i386
+ libcomerr2_1.42.5-1.1_i386
+ libgcc1_1:4.7.2-5_i386
+ liblocale-gettext-perl_1.05-7+b1_i386
+ liblzma5_5.1.1alpha+20120614-2_i386
+ libmount1_2.20.1-5.3_i386
+ libncurses5_5.9-10_i386
+ libpam-modules_1.1.3-7.1_i386
+ libpam-modules-bin_1.1.3-7.1_i386
+ libpam0g_1.1.3-7.1_i386
+ libselinux1_2.1.9-5_i386
+ libsepol1_2.1.4-3_i386
+ libss2_1.42.5-1.1_i386
+ libtext-charwidth-perl_0.04-7+b1_i386
+ libtext-iconv-perl_1.7-5_i386
+ libtinfo5_5.9-10_i386
+ libuuid1_2.20.1-5.3_i386
+ login_1:4.1.5.1-1_i386
+ mawk_1.3.3-17_i386
+ mount_2.20.1-5.3_i386
+ multiarch-support_2.13-38+deb7u1_i386
+ ncurses-bin_5.9-10_i386
+ nginx-extras_1.2.1-2.2+wheezy2_i386
+ nginx-full_1.2.1-2.2+wheezy2_i386
+ nginx-light_1.2.1-2.2+wheezy2_i386
+ nginx-naxsi_1.2.1-2.2+wheezy2_i386
+ passwd_1:4.1.5.1-1_i386
+ perl-base_5.14.2-21+deb7u1_i386
+ sed_4.2.1-10_i386
+ sysvinit_2.88dsf-41+deb7u1_i386
+ sysvinit-utils_2.88dsf-41+deb7u1_i386
+ tar_1.26+dfsg-0.1_i386
+ util-linux_2.20.1-5.3_i386
+ xz-utils_5.1.1alpha+20120614-2_i386
+ zlib1g_1:1.2.7.dfsg-13_i386
diff --git a/src/github.com/smira/aptly/system/t05_snapshot/FilterSnapshot5Test_gold b/src/github.com/smira/aptly/system/t05_snapshot/FilterSnapshot5Test_gold
new file mode 100644
index 00000000..c5297b7d
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t05_snapshot/FilterSnapshot5Test_gold
@@ -0,0 +1 @@
+ERROR: unable to filter: snapshot with name snap1 not found
diff --git a/src/github.com/smira/aptly/system/t05_snapshot/FilterSnapshot6Test_gold b/src/github.com/smira/aptly/system/t05_snapshot/FilterSnapshot6Test_gold
new file mode 100644
index 00000000..dc77e3f2
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t05_snapshot/FilterSnapshot6Test_gold
@@ -0,0 +1,3 @@
+Loading packages (56121)...
+Building indexes...
+ERROR: unable to create snapshot: snapshot with name snap2 already exists
diff --git a/src/github.com/smira/aptly/system/t05_snapshot/FilterSnapshot7Test_gold b/src/github.com/smira/aptly/system/t05_snapshot/FilterSnapshot7Test_gold
new file mode 100644
index 00000000..703595ce
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t05_snapshot/FilterSnapshot7Test_gold
@@ -0,0 +1,5 @@
+Loading packages (5550)...
+Building indexes...
+
+Snapshot snap2 successfully filtered.
+You can run 'aptly publish snapshot snap2' to publish snapshot as Debian repository.
diff --git a/src/github.com/smira/aptly/system/t05_snapshot/FilterSnapshot7Test_snapshot_show b/src/github.com/smira/aptly/system/t05_snapshot/FilterSnapshot7Test_snapshot_show
new file mode 100644
index 00000000..b5e57038
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t05_snapshot/FilterSnapshot7Test_snapshot_show
@@ -0,0 +1,14 @@
+Name: snap2
+Description: Filtered 'snap1', query was: 'rsyslog (>= 7.4.4), $Architecture (i386)'
+Number of packages: 10
+Packages:
+ init-system-helpers_1.18~bpo70+1_all
+ libestr0_0.1.9-1~bpo70+1_i386
+ libjson-c2_0.11-3~bpo7+1_i386
+ liblogging-stdlog0_1.0.4-1~bpo70+1_i386
+ rsyslog_7.6.3-2~bpo70+1_i386
+ init-system-helpers_1.18~bpo70+1_source
+ json-c_0.11-3~bpo7+1_source
+ libestr_0.1.9-1~bpo70+1_source
+ liblogging_1.0.4-1~bpo70+1_source
+ rsyslog_7.6.3-2~bpo70+1_source
diff --git a/src/github.com/smira/aptly/system/t05_snapshot/SearchSnapshot1Test_gold b/src/github.com/smira/aptly/system/t05_snapshot/SearchSnapshot1Test_gold
new file mode 100644
index 00000000..52405682
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t05_snapshot/SearchSnapshot1Test_gold
@@ -0,0 +1,4043 @@
+
+aolserver4-dev_4.5.1-15.1_i386
+apache2-prefork-dev_2.2.22-13+deb7u1_i386
+apache2-threaded-dev_2.2.22-13+deb7u1_i386
+apcalc-dev_2.12.4.4-3_i386
+aplus-fsf-dev_4.22.1-6_i386
+aroarfw-dev_0.1~beta4-5_all
+asterisk-dev_1:1.8.13.1~dfsg1-3+deb7u3_all
+atfs-dev_1.4pl6-11_i386
+audacious-dev_3.2.4-1_i386
+autotools-dev_20120608.1_all
+binutils-dev_2.22-8_i386
+biosquid-dev_1.9g+cvs20050121-2_i386
+bitlbee-dev_3.0.5-1.2_all
+blacs-pvm-dev_1.1-21_i386
+blends-dev_0.6.16.2_all
+blktap-dev_2.0.90-1_i386
+blt-dev_2.4z-4.2_i386
+boinc-dev_7.0.27+dfsg-5_i386
+boolstuff-dev_0.1.12-3_i386
+cairo-dock-dev_3.0.0-2+deb7u1_i386
+cernlib-base-dev_20061220+dfsg3-2_all
+cernlib-core-dev_20061220+dfsg3-2_all
+chipmunk-dev_5.3.4-1_i386
+cimg-dev_1.4.9-2_all
+clearsilver-dev_0.10.5-1.3_i386
+cli-common-dev_0.8.2_all
+clinica-dev_0.2.1~dfsg-1_i386
+clisp-dev_1:2.49-8.1_i386
+cluster-glue-dev_1.0.9+hg2665-1_i386
+codeblocks-dev_10.05-2.1_i386
+coinor-libcbc-dev_2.5.0-3_i386
+coinor-libcgl-dev_0.55.0-1.1_i386
+coinor-libclp-dev_1.12.0-2.1_i386
+coinor-libcoinutils-dev_2.6.4-3_i386
+coinor-libdylp-dev_1.6.0-1.1_i386
+coinor-libflopc++-dev_1.0.6-3.1_i386
+coinor-libipopt-dev_3.10.2-1.1_i386
+coinor-libosi-dev_0.103.0-1_i386
+coinor-libsymphony-dev_5.2.4-1.2_i386
+coinor-libvol-dev_1.1.7-1_i386
+collectd-dev_5.1.0-3_all
+comerr-dev_2.1-1.42.5-1.1_i386
+condor-dev_7.8.2~dfsg.1-1+deb7u1_i386
+config-package-dev_4.13_all
+connman-dev_1.0-1.1+wheezy1+b1_i386
+console-tools-dev_1:0.2.3dbs-70_i386
+coop-computing-tools-dev_3.5.1-2_i386
+corosync-dev_1.4.2-3_i386
+courier-authlib-dev_0.63.0-6+b1_i386
+crtmpserver-dev_1.0~dfsg-3_i386
+ctapi-dev_1.1_all
+ctn-dev_3.0.6-13+b2_i386
+cyrus-dev_2.4.16-4+deb7u1_all
+dcap-dev_2.47.6-2_i386
+dico-dev_2.1-3+b2_i386
+dictionaries-common-dev_1.12.11_all
+dietlibc-dev_0.33~cvs20120325-4_i386
+dolfin-dev_1.0.0-7_all
+dovecot-dev_1:2.1.7-7_i386
+dpkg-dev_1.16.12_all
+drac-dev_1.12-7.2_i386
+drizzle-plugin-dev_1:7.1.36-stable-1_i386
+dssi-dev_1.1.1~dfsg0-1_all
+e2fslibs-dev_1.42.5-1.1_i386
+emerillon-dev_0.1.90-1_i386
+eog-dev_3.4.2-1+build1_all
+epiphany-browser-dev_3.4.2-2.1_i386
+erlang-dev_1:15.b.1-dfsg-4+deb7u1_i386
+erlang-esdl-dev_1.2-2_all
+etl-dev_0.04.15-1_i386
+evolution-data-server-dev_3.4.4-3_i386
+evolution-dev_3.4.4-3_i386
+exim4-dev_4.80-7_i386
+expect-dev_5.45-2_i386
+expeyes-firmware-dev_2.0.0-3_all
+extremetuxracer-gimp-dev_0.4-5_all
+falconpl-dev_0.9.6.9-git20120606-2_i386
+fatrat-dev_1.1.3-5_all
+fcitx-libs-dev_1:4.2.4.1-7_i386
+fenix-dev_0.92a.dfsg1-9_all
+festival-dev_1:2.1~release-5.1_i386
+fftw-dev_2.1.5-1_i386
+finch-dev_2.10.9-1~deb7u1_all
+firebird-dev_2.5.2.26540.ds4-1~deb7u1_i386
+flite1-dev_1.4-release-6_i386
+flow-tools-dev_1:0.68-12.1+b1_i386
+fosfat-dev_0.4.0-3_i386
+freeglut3-dev_2.6.0-4_i386
+freetds-dev_0.91-2+deb7u1_i386
+frei0r-plugins-dev_1.1.22git20091109-1.2_i386
+ftgl-dev_2.1.3~rc5-4_all
+ftplib-dev_3.1-1-9_i386
+gambas3-dev_3.1.1-2+b1_i386
+gap-dev_4r4p12-2_i386
+gauche-dev_0.9.1-5.1_i386
+gcc-4.6-plugin-dev_4.6.3-14_i386
+gcc-4.7-plugin-dev_4.7.2-5_i386
+gcin-dev_2.7.6.1+dfsg-1_all
+gedit-dev_3.4.2-1_all
+gem-dev_1:0.93.3-5_all
+genius-dev_1.0.14-1_i386
+gfxboot-dev_4.5.0-3_i386
+giblib-dev_1.2.4-8_i386
+glabels-dev_3.0.0-3+b1_i386
+glee-dev_5.4.0-1_i386
+gmpc-dev_11.8.16-6_i386
+gnash-dev_0.8.11~git20120629-1+deb7u1_i386
+gnome-control-center-dev_1:3.4.3.1-2_all
+gnome-settings-daemon-dev_3.4.2+git20121218.7c1322-3+deb7u3_i386
+gnome-video-effects-dev_0.4.0-1_all
+gnumach-dev_2:1.3.99.dfsg.git20120610-1_i386
+gnunet-dev_0.9.3-7_i386
+gnunet-gtk-dev_0.9.3-1_i386
+gnuradio-dev_3.5.3.2-1_i386
+gosa-dev_2.7.4-4.3~deb7u1_all
+gpe-ownerinfo-dev_0.28-3_i386
+gpsim-dev_0.26.1-2.1_i386
+graphviz-dev_2.26.3-14+deb7u1_all
+grass-dev_6.4.2-2_i386
+gridengine-drmaa-dev_6.2u5-7.1_i386
+gromacs-dev_4.5.5-2_i386
+gsettings-desktop-schemas-dev_3.4.2-3_i386
+gthumb-dev_3:3.0.1-2_i386
+guile-1.6-dev_1.6.8-10.3_i386
+guile-1.8-dev_1.8.8+1-8_i386
+guile-2.0-dev_2.0.5+1-3_i386
+guile-cairo-dev_1.4.0-3_i386
+heartbeat-dev_1:3.0.5-3_i386
+heimdal-dev_1.6~git20120403+dfsg1-2_i386
+hime-dev_0.9.9+git20120619+dfsg-1_all
+hybrid-dev_1:7.2.2.dfsg.2-10_all
+icedove-dev_10.0.12-1_i386
+inn2-dev_2.5.3-3_i386
+inventor-dev_2.1.5-10-16_i386
+iproute-dev_20120521-3+b3_i386
+iptables-dev_1.4.14-3.1_i386
+irssi-dev_0.8.15-5_i386
+isc-dhcp-dev_4.2.2.dfsg.1-5+deb70u6_i386
+itcl3-dev_3.4.1-1_i386
+itk3-dev_3.3-4_i386
+ivtools-dev_1.2.10a1-1_i386
+kadu-dev_0.11.2-1_all
+kannel-dev_1.4.3-2+b2_i386
+kde-workspace-dev_4:4.8.4-6_i386
+kdebase-workspace-dev_4:4.8.4-6_all
+kdelibs5-dev_4:4.8.4-4_i386
+kdemultimedia-dev_4:4.8.4-2_i386
+kdepimlibs5-dev_4:4.8.4-2_i386
+kdevelop-dev_4:4.3.1-3+b1_i386
+kdevplatform-dev_1.3.1-2_i386
+kmymoney-dev_4.6.2-3.2_i386
+konwert-dev_1.8-11.2_all
+lam4-dev_7.1.4-3_i386
+lesstif2-dev_1:0.95.2-1.1_i386
+lib3ds-dev_1.3.0-6_i386
+lib4store-dev_1.1.4-2_i386
+lib64bz2-dev_1.0.6-4_i386
+lib64expat1-dev_2.1.0-1+deb7u1_i386
+lib64ffi-dev_3.0.10-3_i386
+lib64ncurses5-dev_5.9-10_i386
+lib64readline-gplv2-dev_5.2+dfsg-2~deb7u1_i386
+lib64readline6-dev_6.2+dfsg-0.1_i386
+lib64z1-dev_1:1.2.7.dfsg-13_i386
+liba52-0.7.4-dev_0.7.4-16_i386
+libaa1-dev_1.4p5-40_i386
+libaac-tactics-ocaml-dev_0.2.pl2-7_i386
+libaacs-dev_0.4.0-1_i386
+libaal-dev_1.0.5-5.1_i386
+libabiword-2.9-dev_2.9.2+svn20120603-8_i386
+libaccountsservice-dev_0.6.21-8_i386
+libace-dev_6.0.3+dfsg-0.1_i386
+libace-flreactor-dev_6.0.3+dfsg-0.1_i386
+libace-foxreactor-dev_6.0.3+dfsg-0.1_i386
+libace-htbp-dev_6.0.3+dfsg-0.1_i386
+libace-inet-dev_6.0.3+dfsg-0.1_i386
+libace-inet-ssl-dev_6.0.3+dfsg-0.1_i386
+libace-qtreactor-dev_6.0.3+dfsg-0.1_i386
+libace-rmcast-dev_6.0.3+dfsg-0.1_i386
+libace-ssl-dev_6.0.3+dfsg-0.1_i386
+libace-tkreactor-dev_6.0.3+dfsg-0.1_i386
+libace-tmcast-dev_6.0.3+dfsg-0.1_i386
+libace-xtreactor-dev_6.0.3+dfsg-0.1_i386
+libacexml-dev_6.0.3+dfsg-0.1_i386
+libacl1-dev_2.2.51-8_i386
+libacpi-dev_0.2-4_i386
+libacr38ucontrol-dev_1.7.11-1_i386
+libadasockets4-dev_1.8.10-2_i386
+libaddresses-dev_0.4.7-1+b5_i386
+libaddressview-dev_0.4.7-1+b5_i386
+libadios-dev_1.3-11_i386
+libadminutil-dev_1.1.15-1_i386
+libadns1-dev_1.4-2_i386
+libadolc-dev_2.3.0-1_i386
+libadplug-dev_2.2.1+dfsg3-0.1_i386
+libafflib-dev_3.6.6-1.1+b1_i386
+libafrodite-0.12-dev_0.12.1-3_i386
+libafterimage-dev_2.2.11-7_i386
+libagg-dev_2.5+dfsg1-8_i386
+libagrep-ocaml-dev_1.0-11+b3_i386
+libahven3-dev_2.1-4_i386
+libaiksaurus-1.2-dev_1.2.1+dev-0.12-6.1_i386
+libaiksaurusgtk-1.2-dev_1.2.1+dev-0.12-6.1_i386
+libaio-dev_0.3.109-3_i386
+libakonadi-dev_1.7.2-3_i386
+libalberta2-dev_2.0.1-5_i386
+libaldmb1-dev_1:0.9.3-5.4_i386
+libalglib-dev_2.6.0-6_i386
+libalkimia-dev_4.3.2-1.1_i386
+liballeggl4-dev_2:4.4.2-2.1_i386
+liballegro4.2-dev_2:4.4.2-2.1_i386
+libalog0.4.1-base-dev_0.4.1-2_i386
+libalog0.4.1-full-dev_0.4.1-2_i386
+libalsa-ocaml-dev_0.2.1-1+b1_i386
+libalsaplayer-dev_0.99.80-5.1_i386
+libalure-dev_1.2-6_i386
+libalut-dev_1.1.0-3_i386
+libampsharp-cil-dev_2.0.4-2_all
+libamu-dev_6.2+rc20110530-3_i386
+libanalitza-dev_4:4.8.4-2_i386
+libanet0.1-dev_0.1-3_i386
+libanjuta-dev_2:3.4.3-1_i386
+libann-dev_1.1.2+doc-3_i386
+libanthy-dev_9100h-16_i386
+libantlr-dev_2.7.7+dfsg-4_i386
+libantlr3c-dev_3.2-2_i386
+libao-dev_1.1.0-2_i386
+libao-ocaml-dev_0.2.0-1+b2_i386
+libaosd-dev_0.2.7-1_i386
+libapache2-mod-perl2-dev_2.0.7-3_all
+libapertium3-3.1-0-dev_3.1.0-2_i386
+libapm-dev_3.2.2-14_i386
+libapol-dev_3.3.7-3_i386
+libapparmor-dev_2.7.103-4_i386
+libappindicator-dev_0.4.92-2_i386
+libappindicator0.1-cil-dev_0.4.92-2_all
+libappindicator3-dev_0.4.92-2_i386
+libapq-postgresql3.2.0-dev_3.2.0-2_i386
+libapq3.2.0-dev_3.2.0-1_i386
+libapr-memcache-dev_0.7.0-1_i386
+libapr1-dev_1.4.6-3+deb7u1_i386
+libapreq2-dev_2.13-1+b2_i386
+libapron-dev_0.9.10-5.2_all
+libapron-ocaml-dev_0.9.10-5.2+b3_i386
+libaprutil1-dev_1.4.1-3_i386
+libapt-pkg-dev_0.9.7.9+deb7u1_i386
+libaqbanking34-dev_5.0.24-3_i386
+libaqsis-dev_1.8.1-3_i386
+libarchive-dev_3.0.4-3+nmu1_i386
+libargtable2-dev_12-1_i386
+libarmadillo-dev_1:3.2.3+dfsg-1_i386
+libarpack++2-dev_2.3-2_i386
+libarpack2-dev_3.1.1-2.1_i386
+libart-2.0-dev_2.3.21-2_i386
+libart2.0-cil-dev_2.24.2-3_all
+libasio-dev_1.4.1-3.2_all
+libasis2010-dev_2010-5_i386
+libasm-dev_0.152-1+wheezy1_i386
+libasound2-dev_1.0.25-4_i386
+libaspell-dev_0.60.7~20110707-1_i386
+libass-dev_0.10.0-3_i386
+libassa3.5-5-dev_3.5.1-2_i386
+libassimp-dev_3.0~dfsg-1_i386
+libassuan-dev_2.0.3-1_i386
+libast2-dev_0.7-6+b1_i386
+libasyncns-dev_0.8-4_i386
+libatasmart-dev_0.19-1_i386
+libatd-ocaml-dev_1.0.1-1+b1_i386
+libatdgen-ocaml-dev_1.2.2-1+b1_i386
+libatk-bridge2.0-dev_2.5.3-2_i386
+libatk1.0-dev_2.4.0-2_i386
+libatkmm-1.6-dev_2.22.6-1_i386
+libatlas-base-dev_3.8.4-9+deb7u1_i386
+libatlas-cpp-0.6-dev_0.6.2-3_i386
+libatlas-dev_3.8.4-9+deb7u1_all
+libatm1-dev_1:2.5.1-1.5_i386
+libatomic-ops-dev_7.2~alpha5+cvs20101124-1+deb7u1_i386
+libatomicparsley-dev_2.1.2-1_i386
+libatspi-dev_1.32.0-2_i386
+libatspi2.0-dev_2.5.3-2_i386
+libattica-dev_0.2.0-1_i386
+libattr1-dev_1:2.4.46-8_i386
+libaubio-dev_0.3.2-4.2+b1_i386
+libaudio-dev_1.9.3-5wheezy1_i386
+libaudiofile-dev_0.3.4-2_i386
+libaudiomask-dev_1.0-2_i386
+libaudit-dev_1:1.7.18-1.1_i386
+libaugeas-dev_0.10.0-1_i386
+libaunit2-dev_1.03-7_i386
+libautotrace-dev_0.31.1-16+b1_i386
+libautounit-dev_0.20.1-4_i386
+libavahi-cil-dev_0.6.19-4.2_all
+libavahi-client-dev_0.6.31-2_i386
+libavahi-common-dev_0.6.31-2_i386
+libavahi-compat-libdnssd-dev_0.6.31-2_i386
+libavahi-core-dev_0.6.31-2_i386
+libavahi-glib-dev_0.6.31-2_i386
+libavahi-gobject-dev_0.6.31-2_i386
+libavahi-qt4-dev_0.6.31-2_i386
+libavahi-ui-cil-dev_0.6.19-4.2_all
+libavahi-ui-dev_0.6.31-2_i386
+libavahi-ui-gtk3-dev_0.6.31-2_i386
+libavbin-dev_7-1.3_i386
+libavc1394-dev_0.5.4-2_i386
+libavcodec-dev_6:0.8.10-1_i386
+libavdevice-dev_6:0.8.10-1_i386
+libavfilter-dev_6:0.8.10-1_i386
+libavformat-dev_6:0.8.10-1_i386
+libavifile-0.7-dev_1:0.7.48~20090503.ds-13_i386
+libavl-dev_0.3.5-3_i386
+libavogadro-dev_1.0.3-5_i386
+libavutil-dev_6:0.8.10-1_i386
+libaws2.10.2-dev_2.10.2-4_i386
+libax25-dev_0.0.12-rc2+cvs20120204-2_i386
+libbabl-dev_0.1.10-1_i386
+libball1.4-dev_1.4.1+20111206-4_i386
+libballview1.4-dev_1.4.1+20111206-4_i386
+libbam-dev_0.1.18-1_i386
+libbamf-dev_0.2.118-1_i386
+libbamf3-dev_0.2.118-1_i386
+libbarry-dev_0.18.3-5_i386
+libbatteries-ocaml-dev_1.4.3-1_i386
+libbdd-dev_2.4-8_i386
+libbeecrypt-dev_4.2.1-4_i386
+libbenchmark-ocaml-dev_0.9-2+b3_i386
+libbfb0-dev_0.23-1.1_i386
+libbg1-dev_1.106-1_i386
+libbibutils-dev_4.12-5_i386
+libbin-prot-camlp4-dev_2.0.7-1_i386
+libbind-dev_1:9.8.4.dfsg.P1-6+nmu2+deb7u1_i386
+libbind4-dev_6.0-1_i386
+libbinio-dev_1.4+dfsg1-1_i386
+libbiniou-ocaml-dev_1.0.0-1+b1_i386
+libbio2jack0-dev_0.9-2.1_i386
+libbiococoa-dev_2.2.2-1+b2_i386
+libbiosig-dev_1.3.0-2_i386
+libbisho-common-dev_0.27.2+git20111122.9e68ef3d-1_i386
+libbison-dev_1:2.5.dfsg-2.1_i386
+libbitmask-dev_2.0-2_i386
+libbitstream-dev_1.0-1_all
+libbitstring-ocaml-dev_2.0.2-3+b1_i386
+libbjack-ocaml-dev_0.1.3-5+b1_i386
+libblacs-mpi-dev_1.1-31_i386
+libblas-dev_1.2.20110419-5_i386
+libbliss-dev_0.72-4_i386
+libblitz0-dev_1:0.9-13_i386
+libblkid-dev_2.20.1-5.3_i386
+libblocksruntime-dev_0.1-1_i386
+libbluedevil-dev_1.9.2-1_i386
+libbluetooth-dev_4.99-2_i386
+libbluray-dev_1:0.2.2-1_i386
+libbml-dev_0.6.1-1_i386
+libbobcat-dev_3.01.00-1+b1_i386
+libbogl-dev_0.1.18-8+b1_i386
+libbognor-regis-dev_0.6.12+git20101007.02c25268-7_i386
+libbonobo2-dev_2.24.3-1_i386
+libbonoboui2-dev_2.24.3-1_i386
+libboo-cil-dev_0.9.5~git20110729.r1.202a430-2_all
+libboost-all-dev_1.49.0.1_i386
+libboost-chrono-dev_1.49.0.1_i386
+libboost-chrono1.49-dev_1.49.0-3.2_i386
+libboost-date-time-dev_1.49.0.1_i386
+libboost-date-time1.49-dev_1.49.0-3.2_i386
+libboost-dev_1.49.0.1_i386
+libboost-filesystem-dev_1.49.0.1_i386
+libboost-filesystem1.49-dev_1.49.0-3.2_i386
+libboost-graph-dev_1.49.0.1_i386
+libboost-graph-parallel-dev_1.49.0.1_i386
+libboost-graph-parallel1.49-dev_1.49.0-3.2_i386
+libboost-graph1.49-dev_1.49.0-3.2_i386
+libboost-iostreams-dev_1.49.0.1_i386
+libboost-iostreams1.49-dev_1.49.0-3.2_i386
+libboost-locale-dev_1.49.0.1_i386
+libboost-locale1.49-dev_1.49.0-3.2_i386
+libboost-math-dev_1.49.0.1_i386
+libboost-math1.49-dev_1.49.0-3.2_i386
+libboost-mpi-dev_1.49.0.1_i386
+libboost-mpi-python-dev_1.49.0.1_i386
+libboost-mpi-python1.49-dev_1.49.0-3.2_i386
+libboost-mpi1.49-dev_1.49.0-3.2_i386
+libboost-program-options-dev_1.49.0.1_i386
+libboost-program-options1.49-dev_1.49.0-3.2_i386
+libboost-python-dev_1.49.0.1_i386
+libboost-python1.49-dev_1.49.0-3.2_i386
+libboost-random-dev_1.49.0.1_i386
+libboost-random1.49-dev_1.49.0-3.2_i386
+libboost-regex-dev_1.49.0.1_i386
+libboost-regex1.49-dev_1.49.0-3.2_i386
+libboost-serialization-dev_1.49.0.1_i386
+libboost-serialization1.49-dev_1.49.0-3.2_i386
+libboost-signals-dev_1.49.0.1_i386
+libboost-signals1.49-dev_1.49.0-3.2_i386
+libboost-system-dev_1.49.0.1_i386
+libboost-system1.49-dev_1.49.0-3.2_i386
+libboost-test-dev_1.49.0.1_i386
+libboost-test1.49-dev_1.49.0-3.2_i386
+libboost-thread-dev_1.49.0.1_i386
+libboost-thread1.49-dev_1.49.0-3.2_i386
+libboost-timer-dev_1.49.0.1_i386
+libboost-timer1.49-dev_1.49.0-3.2_i386
+libboost-wave-dev_1.49.0.1_i386
+libboost-wave1.49-dev_1.49.0-3.2_i386
+libboost1.49-all-dev_1.49.0-3.2_i386
+libboost1.49-dev_1.49.0-3.2_i386
+libbotan1.10-dev_1.10.5-1_i386
+libbox-dev_2.5-2_i386
+libbox2d-dev_2.0.1+dfsg1-1_i386
+libbpp-core-dev_2.0.3-1_i386
+libbpp-phyl-dev_2.0.3-1_i386
+libbpp-popgen-dev_2.0.3-1_i386
+libbpp-qt-dev_2.0.2-1_i386
+libbpp-raa-dev_2.0.3-1_i386
+libbpp-seq-dev_2.0.3-1_i386
+libbrahe-dev_1.3.2-3_i386
+libbrasero-media3-dev_3.4.1-4_i386
+libbrlapi-dev_4.4-10+deb7u1_i386
+libbs2b-dev_3.1.0+dfsg-2_i386
+libbsd-dev_0.4.2-1_i386
+libbse-dev_0.7.4-5_all
+libbt-dev_0.70.1-13_i386
+libbtparse-dev_0.63-1_i386
+libbuffy-dev_1.7-1_i386
+libbulletml-dev_0.0.6-5_i386
+libburn-dev_1.2.2-2_i386
+libbuzztard-dev_0.5.0-4_i386
+libbz2-dev_1.0.6-4_i386
+libbz2-ocaml-dev_0.6.0-6+b2_i386
+libc-ares-dev_1.9.1-3_i386
+libc-client2007e-dev_8:2007f~dfsg-2_i386
+libc6-dev_2.13-38+deb7u1_i386
+libcableswig-dev_0.1.0+cvs20111009-1_i386
+libcaca-dev_0.99.beta18-1_i386
+libcairo-ocaml-dev_1:1.2.0-2+b1_i386
+libcairo2-dev_1.12.2-3_i386
+libcairomm-1.0-dev_1.10.0-1_i386
+libcal3d12-dev_0.11.0-4.1_i386
+libcalendar-ocaml-dev_2.03-1+b2_i386
+libcamel1.2-dev_3.4.4-3_i386
+libcameleon-ocaml-dev_1.9.21-2+b1_i386
+libcaml2html-ocaml-dev_1.4.1-3_i386
+libcamlimages-ocaml-dev_1:4.0.1-4+b2_i386
+libcamljava-ocaml-dev_0.3-1+b3_i386
+libcamltemplate-ocaml-dev_1.0.2-1+b2_i386
+libcamomile-ocaml-dev_0.8.4-2_i386
+libcanberra-dev_0.28-6_i386
+libcanberra-gtk-common-dev_0.28-6_all
+libcanberra-gtk-dev_0.28-6_i386
+libcanberra-gtk3-dev_0.28-6_i386
+libcanlock2-dev_2b-6_i386
+libcanna1g-dev_3.7p3-11_i386
+libcap-dev_1:2.22-1.2_i386
+libcap-ng-dev_0.6.6-2_i386
+libcapi20-dev_1:3.25+dfsg1-3.3~deb7u1_i386
+libcapsinetwork-dev_0.3.0-7_i386
+libcaribou-dev_0.4.4-1_i386
+libcbf-dev_0.7.9.1-3_i386
+libccaudio2-dev_2.0.5-3_i386
+libccfits-dev_2.4-1_i386
+libcconv-dev_0.6.2-1_i386
+libccrtp-dev_2.0.3-4_i386
+libccs-dev_3.0.12-3.2+deb7u2_i386
+libccscript3-dev_1.1.7-2_i386
+libccss-dev_0.5.0-4_i386
+libcdaudio-dev_0.99.12p2-12_i386
+libcdb-dev_0.78_i386
+libcdd-dev_094b.dfsg-4.2_i386
+libcddb2-dev_1.3.2-3_i386
+libcdi-dev_1.5.4+dfsg.1-5_i386
+libcdio-cdda-dev_0.83-4_i386
+libcdio-dev_0.83-4_i386
+libcdio-paranoia-dev_0.83-4_i386
+libcdk5-dev_5.0.20060507-4_i386
+libcdparanoia-dev_3.10.2+debian-10.1_i386
+libcec-dev_1.6.2-1.1_i386
+libcegui-mk2-dev_0.7.6-2+b1_i386
+libcext-dev_6.1.1-2_i386
+libcf-ocaml-dev_0.10-3+b3_i386
+libcfg-dev_1.4.2-3_i386
+libcfitsio3-dev_3.300-2_i386
+libcgal-dev_4.0-5_i386
+libcgic-dev_2.05-3_i386
+libcgicc5-dev_3.2.9-3_i386
+libcgns-dev_3.1.3.4-1+b1_i386
+libcgroup-dev_0.38-1_i386
+libcgsi-gsoap-dev_1.3.5-1_i386
+libchamplain-0.12-dev_0.12.3-1_i386
+libchamplain-gtk-0.12-dev_0.12.3-1_i386
+libcharls-dev_1.0-2_i386
+libchasen-dev_2.4.5-6_i386
+libcheese-dev_3.4.2-2_i386
+libcheese-gtk-dev_3.4.2-2_i386
+libchewing3-dev_0.3.3-4_i386
+libchicken-dev_4.7.0-1_i386
+libchipcard-dev_5.0.3beta-3_i386
+libchise-dev_0.3.0-2+b1_i386
+libchm-dev_2:0.40a-2_i386
+libchromaprint-dev_0.6-2_i386
+libcib1-dev_1.1.7-1_i386
+libcitadel-dev_8.14-1_i386
+libcitygml0-dev_0.14+svn128-1+3p0p1+4_i386
+libck-connector-dev_0.4.5-3.1_i386
+libckyapplet1-dev_1.1.0-12_i386
+libclalsadrv-dev_2.0.0-3_all
+libclam-dev_1.4.0-5.1_i386
+libclam-qtmonitors-dev_1.4.0-3.1_i386
+libclamav-dev_0.98.1+dfsg-1+deb7u3_i386
+libclang-common-dev_1:3.0-6.2_i386
+libclang-dev_1:3.0-6.2_i386
+libclanlib-dev_1.0~svn3827-3_i386
+libclassad-dev_7.8.2~dfsg.1-1+deb7u1_i386
+libclaw-application-dev_1.7.0-3_i386
+libclaw-configuration-file-dev_1.7.0-3_i386
+libclaw-dev_1.7.0-3_i386
+libclaw-dynamic-library-dev_1.7.0-3_i386
+libclaw-graphic-dev_1.7.0-3_i386
+libclaw-logger-dev_1.7.0-3_i386
+libclaw-net-dev_1.7.0-3_i386
+libclaw-tween-dev_1.7.0-3_i386
+libclaws-mail-dev_3.8.1-2_i386
+libclhep-dev_2.1.2.3-1_i386
+libcli-dev_1.9.6-1_i386
+libclippoly-dev_0.11-3_i386
+libclips-dev_6.24-3_i386
+libcliquer-dev_1.21-1_i386
+libcln-dev_1.3.2-1.2_i386
+libcloog-isl-dev_0.17.0-3_i386
+libcloog-ppl-dev_0.15.11-4_i386
+libclthreads-dev_2.4.0-4_i386
+libclucene-dev_0.9.21b-2+b1_i386
+libclustalo-dev_1.1.0-1_i386
+libcluster-glue-dev_1.0.9+hg2665-1_all
+libclutter-1.0-dev_1.10.8-2_i386
+libclutter-cil-dev_1.0.0~alpha3~git20090817.r1.349dba6-8_all
+libclutter-gst-dev_1.5.4-1+build0_i386
+libclutter-gtk-1.0-dev_1.2.0-2_i386
+libclutter-imcontext-0.1-dev_0.1.4-3_i386
+libcluttergesture-dev_0.0.2.1-7_i386
+libclxclient-dev_3.6.1-6_i386
+libcman-dev_3.0.12-3.2+deb7u2_i386
+libcminpack-dev_1.2.2-1_i386
+libcmis-dev_0.1.0-1+b1_i386
+libcmor-dev_2.8.0-2+b1_i386
+libcmph-dev_0.9-1_i386
+libcneartree-dev_3.1.1-1_i386
+libcnf-dev_4.0-2_i386
+libcob1-dev_1.1-1_i386
+libcogl-dev_1.10.2-7_i386
+libcogl-pango-dev_1.10.2-7_i386
+libcoin60-dev_3.1.3-2.2_i386
+libcojets2-dev_20061220+dfsg3-2_i386
+libcollectdclient-dev_5.1.0-3_i386
+libcollection-dev_0.1.3-2_i386
+libcolorblind-dev_0.0.1-1_i386
+libcolord-dev_0.1.21-1_i386
+libcolord-gtk-dev_0.1.21-1_i386
+libcolorhug-dev_0.1.10-1_i386
+libcomedi-dev_0.10.0-3_i386
+libcommoncpp2-dev_1.8.1-5_i386
+libcompfaceg1-dev_1:1.5.2-5_i386
+libconcord-dev_0.24-1.1_i386
+libconfdb-dev_1.4.2-3_i386
+libconfig++-dev_1.4.8-5_i386
+libconfig++8-dev_1.4.8-5_i386
+libconfig-dev_1.4.8-5_i386
+libconfig-file-ocaml-dev_1.1-1_i386
+libconfig8-dev_1.4.8-5_i386
+libconfuse-dev_2.7-4_i386
+libcontactsdb-dev_0.5-8_i386
+libcoq-ocaml-dev_8.3.pl4+dfsg-2_i386
+libcore-ocaml-dev_107.01-5_i386
+libcorelinux-dev_0.4.32-7.3_i386
+libcoroipcc-dev_1.4.2-3_i386
+libcoroipcs-dev_1.4.2-3_i386
+libcorosync-dev_1.4.2-3_all
+libcos4-dev_4.1.6-2_i386
+libcothreads-ocaml-dev_0.10-3+b3_i386
+libcoyotl-dev_3.1.0-5_i386
+libcpg-dev_1.4.2-3_i386
+libcpl-dev_6.1.1-2_i386
+libcppcutter-dev_1.1.7-1.2_i386
+libcppunit-dev_1.12.1-4_i386
+libcppunit-subunit-dev_0.0.8+bzr176-1_i386
+libcpputest-dev_3.1-2_i386
+libcpufreq-dev_008-1_i386
+libcpuset-dev_1.0-3_i386
+libcqrlib2-dev_1.1.2-1_i386
+libcr-dev_0.8.5-2_i386
+libcrack2-dev_2.8.19-3_i386
+libcreal-ocaml-dev_0.7-6+b3_i386
+libcrmcluster1-dev_1.1.7-1_i386
+libcrmcommon2-dev_1.1.7-1_i386
+libcroco3-dev_0.6.6-2_i386
+libcry-ocaml-dev_0.2.2-1+b1_i386
+libcryptgps-ocaml-dev_0.2.1-7+b3_i386
+libcrypto++-dev_5.6.1-6_i386
+libcryptokit-ocaml-dev_1.5-1_i386
+libcryptsetup-dev_2:1.4.3-4_i386
+libcryptui-dev_3.2.2-1_i386
+libcrystalhd-dev_1:0.0~git20110715.fdd2f19-9_i386
+libcsfml-dev_1.6-1_i386
+libcsnd-dev_1:5.17.11~dfsg-3_all
+libcsoap-dev_1.1.0-17.1_i386
+libcsound64-dev_1:5.17.11~dfsg-3_all
+libcsoundac-dev_1:5.17.11~dfsg-3_all
+libcsv-ocaml-dev_1.2.2-1+b1_i386
+libctapimkt0-dev_1.0.1-1.1_i386
+libctdb-dev_1.12+git20120201-4_i386
+libctemplate-dev_2.2-3_i386
+libctl-dev_3.1.0-5_i386
+libctpl-dev_0.3.3.dfsg-2_i386
+libcuba3-dev_3.0+20111124-2_i386
+libcudf-dev_0.6.2-1_i386
+libcudf-ocaml-dev_0.6.2-1_i386
+libcue-dev_1.4.0-1_i386
+libcunit1-dev_2.1-0.dfsg-10_i386
+libcunit1-ncurses-dev_2.1-0.dfsg-10_i386
+libcups2-dev_1.5.3-5+deb7u1_i386
+libcupscgi1-dev_1.5.3-5+deb7u1_i386
+libcupsdriver1-dev_1.5.3-5+deb7u1_i386
+libcupsfilters-dev_1.0.18-2.1+deb7u1_i386
+libcupsimage2-dev_1.5.3-5+deb7u1_i386
+libcupsmime1-dev_1.5.3-5+deb7u1_i386
+libcupsppdc1-dev_1.5.3-5+deb7u1_i386
+libcupt2-dev_2.5.9_i386
+libcurl-ocaml-dev_0.5.3-2+b1_i386
+libcurl4-gnutls-dev_7.26.0-1+wheezy9_i386
+libcurl4-nss-dev_7.26.0-1+wheezy9_i386
+libcurl4-openssl-dev_7.26.0-1+wheezy9_i386
+libcurses-ocaml-dev_1.0.3-2_i386
+libcutter-dev_1.1.7-1.2_i386
+libcv-dev_2.3.1-11_i386
+libcvaux-dev_2.3.1-11_i386
+libcvc3-dev_2.4.1-4_i386
+libcvector2-dev_1.0.3-1_i386
+libcvm1-dev_0.96-1+b1_i386
+libcw3-dev_3.0.2-1_i386
+libcwidget-dev_0.5.16-3.4_i386
+libcwiid-dev_0.6.00+svn201-3+b1_i386
+libcwnn-dev_1.1.1~a021+cvs20100325-6_i386
+libcxgb3-dev_1.3.1-1_i386
+libcxxtools-dev_2.1.1-1_i386
+libdacs-dev_1.4.27b-2_i386
+libdaemon-dev_0.14-2_i386
+libdancer-xml0-dev_0.8.2.1-3_i386
+libdap-dev_3.11.1-11_i386
+libdapl-dev_2.0.19-1.1_i386
+libdaq-dev_0.6.2-2_i386
+libdar-dev_2.4.5.debian.1-1_i386
+libdatrie-dev_0.2.5-3_i386
+libdawgdic-dev_0.4.3-1_all
+libdb++-dev_5.1.6_i386
+libdb-dev_5.1.6_i386
+libdb-java-dev_5.1.6_i386
+libdb-sql-dev_5.1.6_i386
+libdb4o-cil-dev_8.0.184.15484+dfsg-2_all
+libdb5.1++-dev_5.1.29-5_i386
+libdb5.1-dev_5.1.29-5_i386
+libdb5.1-java-dev_5.1.29-5_i386
+libdb5.1-sql-dev_5.1.29-5_i386
+libdb5.1-stl-dev_5.1.29-5_i386
+libdballe-dev_5.18-1_i386
+libdballef-dev_5.18-1_i386
+libdbaudiolib0-dev_0.9.8-6.2_i386
+libdbi-dev_0.8.4-6_i386
+libdbus-1-dev_1.6.8-1+deb7u1_i386
+libdbus-c++-dev_0.9.0-6_i386
+libdbus-glib-1-dev_0.100.2-1_i386
+libdbus-glib1.0-cil-dev_0.5.0-4_all
+libdbus-ocaml-dev_0.29-1+b3_i386
+libdbus1.0-cil-dev_0.7.0-5_all
+libdbusada0.2-dev_0.2-2_i386
+libdbusmenu-glib-dev_0.6.2-1_i386
+libdbusmenu-gtk-dev_0.6.2-1_i386
+libdbusmenu-gtk3-dev_0.6.2-1_i386
+libdbusmenu-jsonloader-dev_0.6.2-1_i386
+libdbusmenu-qt-dev_0.9.0-1_i386
+libdc-dev_0.3.24~svn3121-2_i386
+libdc1394-22-dev_2.2.0-2_i386
+libdca-dev_0.0.5-5_i386
+libdcerpc-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libdcerpc-server-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libdcmtk2-dev_3.6.0-12_i386
+libdconf-dbus-1-dev_0.12.1-3_i386
+libdconf-dev_0.12.1-3_i386
+libddccontrol-dev_0.4.2-10_i386
+libdds-dev_2.1.2+ddd105-1_i386
+libdebconf-kde-dev_0.2-2_i386
+libdebconfclient0-dev_0.182_i386
+libdebian-installer4-dev_0.87_i386
+libdebug0-dev_0.4.4-1.1_i386
+libdecodeqr-dev_0.9.3-6.2_i386
+libdee-dev_1.0.10-3_i386
+libderiving-ocaml-dev_0.1.1a-3+b1_i386
+libderiving-ocsigen-ocaml-dev_0.3c-1_i386
+libdesktop-agnostic-dev_0.3.92+dfsg-1_i386
+libdessert0.87-dev_0.87.2-1_i386
+libdevhelp-dev_3.4.1-1_i386
+libdevil-dev_1.7.8-6.1+b1_i386
+libdevmapper-dev_2:1.02.74-8_i386
+libdhash-dev_0.1.3-2_i386
+libdiagnostics-dev_0.3.3-1.3_i386
+libdianewcanvas2-dev_0.6.10-5.4_i386
+libdieharder-dev_3.31.1-4_i386
+libdiet-admin2.8-dev_2.8.0-1+b1_i386
+libdiet-client2.8-dev_2.8.0-1+b1_i386
+libdiet-dagda2.8-dev_2.8.0-1+b1_i386
+libdiet-sed2.8-dev_2.8.0-1+b1_i386
+libdime-dev_0.20030921-2_all
+libdirac-dev_1.0.2-6_i386
+libdirectfb-dev_1.2.10.0-5_i386
+libdisasm-dev_0.23-5_i386
+libdiscid0-dev_0.2.2-3_i386
+libdiscover-dev_2.1.2-5.2_i386
+libdispatch-dev_0~svn197-3.1_i386
+libdisplaymigration0-dev_0.28-10_i386
+libdistorm64-dev_1.7.30-1_i386
+libdivecomputer-dev_0.1.0-3_i386
+libdjconsole-dev_0.1.3-1_i386
+libdjvulibre-dev_3.5.25.3-1_i386
+libdkim-dev_1:1.0.21-3_i386
+libdlm-dev_3.0.12-3.2+deb7u2_i386
+libdlmcontrol-dev_3.0.12-3.2+deb7u2_i386
+libdlrestrictions-dev_0.15.3_i386
+libdm0-dev_2.2.10-1_i386
+libdmalloc-dev_5.5.2-5_i386
+libdmapsharing-3.0-dev_2.9.15-1_i386
+libdmraid-dev_1.0.0.rc16-4.2_i386
+libdmtcpaware-dev_1.2.5-1_i386
+libdmtx-dev_0.7.2-2+build1_i386
+libdmx-dev_1:1.1.2-1+deb7u1_i386
+libdnet-dev_2.60_i386
+libdockapp-dev_1:0.5.0-3_i386
+libdolfin1.0-dev_1.0.0-7_i386
+libdoodle-dev_0.7.0-5_i386
+libdose2-ocaml-dev_1.4.2-4+b3_i386
+libdose3-ocaml-dev_3.0.2-3_i386
+libdotconf-dev_1.0.13-3_i386
+libdpkg-dev_1.16.12_i386
+libdpm-dev_1.8.2-1+b2_i386
+libdrawtk-dev_2.0-2_i386
+libdrizzle-dev_1:7.1.36-stable-1_all
+libdrizzledmessage-dev_1:7.1.36-stable-1_i386
+libdrm-dev_2.4.40-1~deb7u2_i386
+libdrumstick-dev_0.5.0-3_i386
+libdsdp-dev_5.8-9.1_i386
+libdshconfig1-dev_0.20.13-1_i386
+libdspam7-dev_3.10.1+dfsg-11_i386
+libdssi-ocaml-dev_0.1.0-1+b1_i386
+libdssialsacompat-dev_1.0.8a-1_i386
+libdtools-ocaml-dev_0.3.0-1_i386
+libdts-dev_0.0.5-5_i386
+libdumb1-dev_1:0.9.3-5.4_i386
+libdumbnet-dev_1.12-3.1_i386
+libdune-common-dev_2.2.0-1_i386
+libdune-geometry-dev_2.2.0-1_i386
+libdune-grid-dev_2.2.0-1_i386
+libdune-istl-dev_2.2.0-1_all
+libdune-localfunctions-dev_2.2.0-1_all
+libduo-dev_1.8-1_i386
+libduppy-ocaml-dev_0.4.2-1+b2_i386
+libdv4-dev_1.0.0-6_i386
+libdvb-dev_0.5.5.1-5.1_i386
+libdvbcsa-dev_1.1.0-2_i386
+libdvbpsi-dev_0.2.2-1_i386
+libdvdnav-dev_4.2.0+20120524-2_i386
+libdvdread-dev_4.2.0+20120521-2_i386
+libdw-dev_0.152-1+wheezy1_i386
+libdwarf-dev_20120410-2_i386
+libdx4-dev_1:4.4.4-4+b2_i386
+libdxflib-dev_2.2.0.0-8_i386
+libdynamite-dev_0.1.1-2_i386
+libeasy-format-ocaml-dev_1.0.0-1+b2_i386
+libeb16-dev_4.4.3-6_i386
+libebackend1.2-dev_3.4.4-3_i386
+libebml-dev_1.2.2-2_i386
+libebook1.2-dev_3.4.4-3_i386
+libecal1.2-dev_3.4.4-3_i386
+libecasoundc-dev_2.9.0-1_i386
+libecasoundc2.2-dev_2.9.0-1_all
+libechonest-dev_1.2.1-1_i386
+libecm-dev_6.4.2-1_i386
+libecore-dev_1.2.0-2_i386
+libecpg-dev_9.1.13-0wheezy1_i386
+libecryptfs-dev_99-1_i386
+libedac-dev_0.18-1_i386
+libedata-book1.2-dev_3.4.4-3_i386
+libedata-cal1.2-dev_3.4.4-3_i386
+libedataserver1.2-dev_3.4.4-3_i386
+libedataserverui-3.0-dev_3.4.4-3_i386
+libedbus-dev_1.2.0-1_i386
+libedit-dev_2.11-20080614-5_i386
+libeditline-dev_1.12-6_i386
+libedje-dev_1.2.0-1_i386
+libee-dev_0.4.1-1_i386
+libeegdev-dev_0.2-3_i386
+libeet-dev_1.6.0-1_i386
+libefreet-dev_1.2.0-1_i386
+libegl1-mesa-dev_8.0.5-4+deb7u2_i386
+libeigen2-dev_2.0.17-1_i386
+libeigen3-dev_3.1.0-1_i386
+libeina-dev_1.2.0-2_i386
+libelektra-cpp-dev_0.7.1-1_i386
+libelektra-dev_0.7.1-1_i386
+libelektratools-dev_0.7.1-1_i386
+libelemental-dev_1.2.0-8_i386
+libelementary-dev_0.7.0.55225-1_i386
+libelf-dev_0.152-1+wheezy1_i386
+libelfg0-dev_0.8.13-3_i386
+libeliom-ocaml-dev_2.2.2-1_i386
+libelk0-dev_3.99.8-2_i386
+libelmer-dev_6.1.0.svn.5396.dfsg2-2_i386
+libembryo-dev_1.2.0-1_i386
+libemos-dev_000382+dfsg-2_i386
+libenca-dev_1.13-4_i386
+libenchant-dev_1.6.0-7_i386
+libenet-dev_1.3.3-2_i386
+libepc-dev_0.4.4-1_i386
+libepc-ui-dev_0.4.4-1_i386
+libepr-api2-dev_2.2-2_all
+libepsilon-dev_0.9.1-2_i386
+libept-dev_1.0.9_i386
+libepub-dev_0.2.1-2+b1_i386
+liberis-1.3-dev_1.3.19-5_i386
+liberuby-dev_1.0.5-2.1_i386
+libescpr-dev_1.1.1-2_i386
+libesd0-dev_0.2.41-10+b1_i386
+libesmtp-dev_1.0.6-1+b1_i386
+libespeak-dev_1.46.02-2_i386
+libestools2.1-dev_1:2.1~release-5_i386
+libestr-dev_0.1.1-2_i386
+libethos-dev_0.2.2-3_i386
+libethos-ui-dev_0.2.2-3_i386
+libetpan-dev_1.0-5_i386
+libetsf-io-dev_1.0.3-4+b1_i386
+libeurodec1-dev_20061220+dfsg3-2_i386
+libev-dev_1:4.11-1_i386
+libev-libevent-dev_1:4.11-1_all
+libeval0-dev_0.29.6-2_i386
+libevas-dev_1.2.0-2_i386
+libevd-0.1-dev_0.1.20-2_i386
+libevent-dev_2.0.19-stable-3_i386
+libeventdb-dev_0.90-5_i386
+libevince-dev_3.4.0-3.1_i386
+libevocosm-dev_4.0.2-2.1_i386
+libevs-dev_1.4.2-3_i386
+libevtlog-dev_0.2.12-5_i386
+libewf-dev_20100226-1+b1_i386
+libexchangemapi-1.0-dev_3.4.4-1_i386
+libexempi-dev_2.2.0-1_i386
+libexif-dev_0.6.20-3_i386
+libexif-gtk-dev_0.3.5-5_i386
+libexiv2-dev_0.23-1_i386
+libexo-1-dev_0.6.2-5_i386
+libexodusii-dev_5.14.dfsg.1-2+b1_i386
+libexosip2-dev_3.6.0-4_i386
+libexpat-ocaml-dev_0.9.1+debian1-7+b2_i386
+libexpat1-dev_2.1.0-1+deb7u1_i386
+libexpect-ocaml-dev_0.0.2-1+b6_i386
+libexplain-dev_0.52.D002-1_i386
+libextlib-ocaml-dev_1.5.2-1+b1_i386
+libextractor-dev_1:0.6.3-5_i386
+libextractor-java-dev_0.6.0-6_i386
+libexttextcat-dev_3.2.0-2_i386
+libextunix-ocaml-dev_0.0.5-2_i386
+libeztrace-dev_0.7-2-4_i386
+libf2c2-dev_20090411-2_i386
+libfaad-dev_2.7-8_i386
+libfaad-ocaml-dev_0.3.0-1+b1_i386
+libfacile-ocaml-dev_1.1-8+b1_i386
+libfaifa-dev_0.2~svn82-1_i386
+libfakekey-dev_0.1-7_i386
+libfam-dev_2.7.0-17_i386
+libfann-dev_2.1.0~beta~dfsg-8_i386
+libfarstream-0.1-dev_0.1.2-1_i386
+libfastjet-dev_3.0.2+dfsg-2_i386
+libfastjet-fortran-dev_3.0.2+dfsg-2_i386
+libfastjetplugins-dev_3.0.2+dfsg-2_i386
+libfastjettools-dev_3.0.2+dfsg-2_i386
+libfauhdli-dev_20110812-1_i386
+libfcgi-dev_2.4.0-8.1_i386
+libfdt-dev_1.3.0-4_i386
+libfence-dev_3.0.12-3.2+deb7u2_i386
+libffado-dev_2.0.99+svn2171-2_i386
+libffcall1-dev_1.10+cvs20100619-2_i386
+libffi-dev_3.0.10-3_i386
+libffindex0-dev_0.9.6.1-1_i386
+libffmpegthumbnailer-dev_2.0.7-2_i386
+libffms2-dev_2.17-1_i386
+libfftw3-dev_3.3.2-3.1_i386
+libfftw3-mpi-dev_3.3.2-3.1_i386
+libfields-camlp4-dev_107.01-1+b2_i386
+libfileutils-ocaml-dev_0.4.2-1+b2_i386
+libfindlib-ocaml-dev_1.3.1-1_i386
+libfiredns-dev_0.9.12+dfsg-3_i386
+libfirestring-dev_0.9.12-8_i386
+libfishsound1-dev_1.0.0-1.1_i386
+libfiu-dev_0.90-3_i386
+libfixposix-dev_20110316.git47f17f7-1_i386
+libfko0-dev_2.0.0rc2-2+deb7u2_i386
+libflac++-dev_1.2.1-6_i386
+libflac-dev_1.2.1-6_i386
+libflac-ocaml-dev_0.1.1-1_i386
+libflake-dev_0.11-2_i386
+libflann-dev_1.7.1-4_i386
+libflatzebra-dev_0.1.5-4+b1_i386
+libflickrnet-cil-dev_1:2.2.0-4_all
+libflorist2011-dev_2011-1_i386
+libflowcanvas-dev_0.7.1+dfsg0-0.2_i386
+libfltk1.1-dev_1.1.10-14_i386
+libfltk1.3-dev_1.3.0-8_i386
+libfluidsynth-dev_1.1.5-2_i386
+libfm-dev_0.1.17-2.1_i386
+libfolia1-dev_0.9-2_i386
+libfolks-dev_0.6.9-1+b1_i386
+libfolks-eds-dev_0.6.9-1+b1_i386
+libfolks-telepathy-dev_0.6.9-1+b1_i386
+libfontconfig1-dev_2.9.0-7.1_i386
+libfontenc-dev_1:1.1.1-1_i386
+libfontforge-dev_0.0.20120101+git-2_i386
+libforms-dev_1.0.93sp1-2_i386
+libformsgl-dev_1.0.93sp1-2_i386
+libfox-1.6-dev_1.6.45-1_i386
+libfprint-dev_1:0.4.0-4-gdfff16f-4_i386
+libfreecell-solver-dev_3.12.0-1_i386
+libfreefem++-dev_3.19.1-1_i386
+libfreefem-dev_3.5.8-5_i386
+libfreehdl0-dev_0.0.7-1.1_i386
+libfreeimage-dev_3.15.1-1+b1_i386
+libfreeipmi-dev_1.1.5-3_i386
+libfreenect-dev_1:0.1.2+dfsg-6_i386
+libfreeradius-dev_2.1.12+dfsg-1.2_i386
+libfreerdp-dev_1.0.1-1.1+deb7u3_i386
+libfreetype6-dev_2.4.9-1.1_i386
+libfreexl-dev_1.0.0b-1_i386
+libfribidi-dev_0.19.2-3_i386
+libfs-dev_2:1.0.4-1+deb7u1_i386
+libfso-glib-dev_2012.05.24.1-1.1_i386
+libfsobasics-dev_0.11.0-1.1_i386
+libfsoframework-dev_0.11.0-1.1_i386
+libfsoresource-dev_0.11.0-1.1_i386
+libfsosystem-dev_0.11.0-1_i386
+libfsotransport-dev_0.11.1-2.1_i386
+libfsplib-dev_0.11-2_i386
+libfstrcmp-dev_0.4.D001-1+deb7u1_i386
+libftdi-dev_0.20-1+b1_i386
+libftdipp-dev_0.20-1+b1_i386
+libftgl-dev_2.1.3~rc5-4_i386
+libfuntools-dev_1.4.4-3_i386
+libfuse-dev_2.9.0-2+deb7u1_i386
+libfuzzy-dev_2.7-2_i386
+libfxt-dev_0.2.6-2_i386
+libg15-dev_1.2.7-2_i386
+libg15daemon-client-dev_1.9.5.3-8.2_i386
+libg15render-dev_1.3.0~svn316-2.2_i386
+libg2-dev_0.72-2.1_i386
+libg3d-dev_0.0.8-17_i386
+libga-dev_2.4.7-3_i386
+libgadap-dev_2.0-1_i386
+libgadu-dev_1:1.11.2-1+deb7u1_i386
+libgail-3-dev_3.4.2-7_i386
+libgail-dev_2.24.10-2_i386
+libgalax-ocaml-dev_1.1-10+b3_i386
+libgambc4-dev_4.2.8-1.1_i386
+libgamin-dev_0.1.10-4.1_i386
+libgammu-dev_1.31.90-1+b1_i386
+libganglia1-dev_3.3.8-1+nmu1_i386
+libganv-dev_0~svn4468~dfsg0-1_i386
+libgarcon-1-0-dev_0.1.12-1_i386
+libgarmin-dev_0~svn320-3_i386
+libgatos-dev_0.0.5-19_i386
+libgavl-dev_1.4.0-1_i386
+libgavl-ocaml-dev_0.1.4-1+b1_i386
+libgbm-dev_8.0.5-4+deb7u2_i386
+libgc-dev_1:7.1-9.1_i386
+libgcal-dev_0.9.6-3_i386
+libgccxml-dev_0.9.0+cvs20120420-4_i386
+libgcgi-dev_0.9.5.dfsg-7_i386
+libgcj12-dev_4.6.3-1_i386
+libgcj13-dev_4.7.2-3_i386
+libgck-1-dev_3.4.1-3_i386
+libgconf-bridge-dev_0.1-2.2_i386
+libgconf2-dev_3.2.5-1+build1_i386
+libgconf2.0-cil-dev_2.24.2-3_all
+libgconfmm-2.6-dev_2.28.0-1_i386
+libgcr-3-dev_3.4.1-3_i386
+libgcroots-dev_0.8.5-2.1_i386
+libgcrypt11-dev_1.5.0-5+deb7u1_i386
+libgctp-dev_1.0-1_i386
+libgd-gd2-noxpm-ocaml-dev_1.0~alpha5-5_i386
+libgd2-noxpm-dev_2.0.36~rc1~dfsg-6.1_i386
+libgd2-xpm-dev_2.0.36~rc1~dfsg-6.1_i386
+libgda-5.0-dev_5.0.3-2_i386
+libgdal-dev_1.9.0-3.1_i386
+libgdal1-dev_1.9.0-3.1_all
+libgdata-cil-dev_2.1.0.0-1_all
+libgdata-dev_0.12.0-1_i386
+libgdb-dev_7.4.1+dfsg-0.1_i386
+libgdbm-dev_1.8.3-11_i386
+libgdchart-gd2-noxpm-dev_0.11.5-7+b1_i386
+libgdchart-gd2-xpm-dev_0.11.5-7+b1_i386
+libgdcm2-dev_2.2.0-14.1_i386
+libgdf-dev_0.1.2-2_i386
+libgdict-1.0-dev_3.4.0-2_i386
+libgdk-pixbuf2.0-dev_2.26.1-1_i386
+libgdkcutter-pixbuf-dev_1.1.7-1.2_i386
+libgdl-3-dev_3.4.2-1_i386
+libgdome2-cpp-smart-dev_0.2.6-6+b1_i386
+libgdome2-dev_0.8.1+debian-4.1_i386
+libgdome2-ocaml-dev_0.2.6-6+b1_i386
+libgdu-dev_3.0.2-3_i386
+libgdu-gtk-dev_3.0.2-3_i386
+libgeant321-2-dev_1:3.21.14.dfsg-10_i386
+libgearman-dev_0.33-2_i386
+libgecode-dev_3.7.3-1_i386
+libgeda-dev_1:1.6.2-4.3_i386
+libgee-dev_0.6.4-2_i386
+libgegl-dev_0.2.0-2+nmu1_i386
+libgeier-dev_0.13-1+b1_i386
+libgenders0-dev_1.18-1_i386
+libgenome-1.3-0-dev_1.3.1-3_i386
+libgensec-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libgeoclue-dev_0.12.0-4_i386
+libgeocode-glib-dev_0.99.0-1_i386
+libgeographiclib-dev_1.21-1_i386
+libgeoip-dev_1.4.8+dfsg-3_i386
+libgeomview-dev_1.9.4-3_i386
+libgeos++-dev_3.3.3-1.1_i386
+libgeos-dev_3.3.3-1.1_i386
+libgeotiff-dev_1.3.0+dfsg-3_i386
+libgeotranz3-dev_3.1-2.1_i386
+libges-0.10-dev_0.10.1-2_i386
+libgetdata-dev_0.7.3-6_i386
+libgetfem++-dev_4.1.1+dfsg1-11_i386
+libgetopt++-dev_0.0.2-p22-3_i386
+libgetopt-ocaml-dev_0.0.20040811-10+b3_i386
+libgettext-ocaml-dev_0.3.4-1+b2_i386
+libgexiv2-dev_0.4.1-3_i386
+libgfarm-dev_2.4.1-1.1_i386
+libgflags-dev_2.0-1_i386
+libgfshare-dev_1.0.5-2_i386
+libghc-acid-state-dev_0.6.3-1+b2_i386
+libghc-active-dev_0.1.0.1-2+b2_i386
+libghc-adjunctions-dev_2.4.0.2-1_i386
+libghc-aeson-dev_0.6.0.2-1+b4_i386
+libghc-agda-dev_2.3.0.1-2_i386
+libghc-algebra-dev_2.1.1.2-1_i386
+libghc-alut-dev_2.1.0.2-4+b1_i386
+libghc-ami-dev_0.1-1+b5_i386
+libghc-ansi-terminal-dev_0.5.5-3+b1_i386
+libghc-ansi-wl-pprint-dev_0.6.4-1+b1_i386
+libghc-arrows-dev_0.4.4.0-3+b1_i386
+libghc-asn1-data-dev_0.6.1.3-2+b3_i386
+libghc-attempt-dev_0.4.0-1+b2_i386
+libghc-attoparsec-conduit-dev_0.4.0.1-1_i386
+libghc-attoparsec-dev_0.10.1.1-2+b1_i386
+libghc-attoparsec-enumerator-dev_0.3-3+b3_i386
+libghc-augeas-dev_0.6.1-1_i386
+libghc-authenticate-dev_1.2.1.1-2+b1_i386
+libghc-base-unicode-symbols-dev_0.2.2.3-1+b1_i386
+libghc-base16-bytestring-dev_0.1.1.4-2+b1_i386
+libghc-base64-bytestring-dev_0.1.1.1-2_i386
+libghc-bifunctors-dev_0.1.3.3-1+b1_i386
+libghc-binary-shared-dev_0.8.1-1+b1_i386
+libghc-bindings-dsl-dev_1.0.15-1+b1_i386
+libghc-bindings-gpgme-dev_0.1.4-1_i386
+libghc-bindings-libzip-dev_0.10-2_i386
+libghc-bitarray-dev_0.0.1-2+b1_i386
+libghc-blaze-builder-conduit-dev_0.4.0.2-1_i386
+libghc-blaze-builder-dev_0.3.1.0-1+b2_i386
+libghc-blaze-builder-enumerator-dev_0.2.0.4-1+b1_i386
+libghc-blaze-html-dev_0.4.3.1-3+b2_i386
+libghc-blaze-markup-dev_0.5.1.0-1_i386
+libghc-blaze-textual-dev_0.2.0.6-2+b2_i386
+libghc-bloomfilter-dev_1.2.6.8-1_i386
+libghc-boolean-dev_0.0.1-2+b1_i386
+libghc-boomerang-dev_1.3.1-1_i386
+libghc-brainfuck-dev_0.1-2+b2_i386
+libghc-byteorder-dev_1.0.3-2+b1_i386
+libghc-bytestring-lexing-dev_0.4.0-1+b1_i386
+libghc-bytestring-mmap-dev_0.2.2-2+b1_i386
+libghc-bytestring-nums-dev_0.3.5-2+b1_i386
+libghc-bytestring-show-dev_0.3.5.1-1+b1_i386
+libghc-bzlib-dev_0.5.0.3-2+b1_i386
+libghc-cabal-file-th-dev_0.2.2-1_i386
+libghc-cairo-dev_0.12.3-1+b1_i386
+libghc-case-insensitive-dev_0.4.0.1-2+b2_i386
+libghc-categories-dev_1.0.3-1+b1_i386
+libghc-cautious-file-dev_1.0.1-1_i386
+libghc-cereal-conduit-dev_0.5-1+b1_i386
+libghc-cereal-dev_0.3.5.2-1_i386
+libghc-certificate-dev_1.2.3-2_i386
+libghc-cgi-dev_3001.1.8.2-2+b3_i386
+libghc-chart-dev_0.15-1+b2_i386
+libghc-chell-dev_0.3-1_i386
+libghc-citeproc-hs-dev_0.3.4-1+b4_i386
+libghc-clientsession-dev_0.7.5-3+b1_i386
+libghc-clock-dev_0.2.0.0-2+b1_i386
+libghc-cmdargs-dev_0.9.5-1+b1_i386
+libghc-colour-dev_2.3.3-1+b1_i386
+libghc-comonad-dev_1.1.1.5-1+b1_i386
+libghc-comonad-transformers-dev_2.1.1.1-1+b1_i386
+libghc-comonads-fd-dev_2.1.1.2-1+b1_i386
+libghc-conduit-dev_0.4.2-2_i386
+libghc-configfile-dev_1.0.6-4+b3_i386
+libghc-configurator-dev_0.2.0.0-1+b2_i386
+libghc-contravariant-dev_0.2.0.2-1+b1_i386
+libghc-convertible-dev_1.0.11.0-3+b3_i386
+libghc-cookie-dev_0.4.0-1+b3_i386
+libghc-cpphs-dev_1.13.3-2+b1_i386
+libghc-cprng-aes-dev_0.2.3-3+b4_i386
+libghc-cpu-dev_0.1.1-1_i386
+libghc-criterion-dev_0.6.0.1-3+b4_i386
+libghc-crypto-api-dev_0.10.2-1+b2_i386
+libghc-crypto-conduit-dev_0.3.2-1+b1_i386
+libghc-crypto-dev_4.2.4-1+b1_i386
+libghc-crypto-pubkey-types-dev_0.1.1-1+b3_i386
+libghc-cryptocipher-dev_0.3.5-1+b1_i386
+libghc-cryptohash-dev_0.7.5-1+b2_i386
+libghc-css-text-dev_0.1.1-3+b2_i386
+libghc-csv-conduit-dev_0.2-1_i386
+libghc-csv-dev_0.1.2-2+b3_i386
+libghc-curl-dev_1.3.7-1+b1_i386
+libghc-darcs-dev_2.8.1-1+b1_i386
+libghc-data-accessor-dev_0.2.2.2-1+b1_i386
+libghc-data-accessor-mtl-dev_0.2.0.3-1+b1_i386
+libghc-data-accessor-template-dev_0.2.1.9-1+b2_i386
+libghc-data-binary-ieee754-dev_0.4.2.1-3+b1_i386
+libghc-data-default-dev_0.4.0-1_i386
+libghc-data-inttrie-dev_0.0.7-1+b1_i386
+libghc-data-lens-dev_2.10.0-1+b1_i386
+libghc-data-memocombinators-dev_0.4.3-1+b1_i386
+libghc-dataenc-dev_0.14.0.3-1+b1_i386
+libghc-datetime-dev_0.2.1-3_i386
+libghc-dbus-dev_0.10.3-1_i386
+libghc-debian-dev_3.64-3_i386
+libghc-diagrams-cairo-dev_0.5.0.2-1_i386
+libghc-diagrams-core-dev_0.5.0.1-1+b1_i386
+libghc-diagrams-dev_0.5-2_all
+libghc-diagrams-lib-dev_0.5-2_i386
+libghc-diff-dev_0.1.3-1+b1_i386
+libghc-digest-dev_0.0.1.0-1+b1_i386
+libghc-dimensional-dev_0.10.1.2-2+b1_i386
+libghc-directory-tree-dev_0.10.0-2+b1_i386
+libghc-distributive-dev_0.2.2-1+b1_i386
+libghc-dlist-dev_0.5-3+b1_i386
+libghc-download-curl-dev_0.1.3-3+b3_i386
+libghc-dpkg-dev_0.0.3-1_i386
+libghc-dyre-dev_0.8.7-1_i386
+libghc-edison-api-dev_1.2.1-18+b1_i386
+libghc-edison-core-dev_1.2.1.3-9+b1_i386
+libghc-edit-distance-dev_0.2.1-2_i386
+libghc-editline-dev_0.2.1.0-5+b1_i386
+libghc-ekg-dev_0.3.1.0-1+b2_i386
+libghc-email-validate-dev_0.2.8-1+b3_i386
+libghc-entropy-dev_0.2.1-2+b1_i386
+libghc-enumerator-dev_0.4.19-1+b1_i386
+libghc-erf-dev_2.0.0.0-2+b1_i386
+libghc-event-list-dev_0.1.0.1-1+b1_i386
+libghc-exception-transformers-dev_0.3.0.2-1+b1_i386
+libghc-executable-path-dev_0.0.3-1+b1_i386
+libghc-explicit-exception-dev_0.1.7-1+b1_i386
+libghc-failure-dev_0.2.0.1-1+b1_i386
+libghc-fast-logger-dev_0.0.2-1+b2_i386
+libghc-fastcgi-dev_3001.0.2.3-3+b3_i386
+libghc-fclabels-dev_1.1.3-1+b1_i386
+libghc-feed-dev_0.3.8-3_i386
+libghc-fgl-dev_5.4.2.4-2+b2_i386
+libghc-file-embed-dev_0.0.4.4-1_i386
+libghc-filemanip-dev_0.3.5.2-2+b2_i386
+libghc-filestore-dev_0.5-1_i386
+libghc-filesystem-conduit-dev_0.4.0-1_i386
+libghc-free-dev_2.1.1.1-1+b1_i386
+libghc-ftphs-dev_1.0.8-1+b3_i386
+libghc-gconf-dev_0.12.1-1+b1_i386
+libghc-gd-dev_3000.7.3-1_i386
+libghc-ghc-events-dev_0.4.0.0-2+b1_i386
+libghc-ghc-mtl-dev_1.0.1.1-1+b3_i386
+libghc-ghc-paths-dev_0.1.0.8-2+b1_i386
+libghc-ghc-syb-utils-dev_0.2.1.0-1+b3_i386
+libghc-gio-dev_0.12.3-1+b1_i386
+libghc-github-dev_0.4.0-2_i386
+libghc-gitit-dev_0.10.0.1-1+b1_i386
+libghc-glade-dev_0.12.1-1+b3_i386
+libghc-glfw-dev_0.5.0.1-1+b1_i386
+libghc-glib-dev_0.12.2-1+b1_i386
+libghc-glut-dev_2.1.2.2-1_i386
+libghc-gnuidn-dev_0.2-2+b2_i386
+libghc-gnutls-dev_0.1.2-1+b1_i386
+libghc-gsasl-dev_0.3.4-1+b1_i386
+libghc-gstreamer-dev_0.12.1-1+b2_i386
+libghc-gtk-dev_0.12.3-1+b2_i386
+libghc-gtkglext-dev_0.12.1-1+b3_i386
+libghc-gtksourceview2-dev_0.12.3-1+b3_i386
+libghc-haddock-dev_2.10.0-1+b2_i386
+libghc-hakyll-dev_3.2.7.2-1+b5_i386
+libghc-hamlet-dev_1.0.1.3-1+b1_i386
+libghc-happstack-dev_7.0.0-1+b1_i386
+libghc-happstack-server-dev_7.0.1-1+b1_i386
+libghc-harp-dev_0.4-3+b1_i386
+libghc-hashable-dev_1.1.2.3-1+b2_i386
+libghc-hashed-storage-dev_0.5.9-2+b2_i386
+libghc-hashmap-dev_1.3.0.1-1+b2_i386
+libghc-hashtables-dev_1.0.1.4-1+b1_i386
+libghc-haskeline-dev_0.6.4.7-1+b1_i386
+libghc-haskell-lexer-dev_1.0-3+b1_i386
+libghc-haskell-src-dev_1.0.1.5-1+b2_i386
+libghc-haskelldb-dev_2.1.1-5+b1_i386
+libghc-haskelldb-hdbc-dev_2.1.0-4_i386
+libghc-haskelldb-hdbc-odbc-dev_2.1.0-3_i386
+libghc-haskelldb-hdbc-postgresql-dev_2.1.0-3_i386
+libghc-haskelldb-hdbc-sqlite3-dev_2.1.0-3_i386
+libghc-haskore-dev_0.2.0.3-2_i386
+libghc-hastache-dev_0.3.3-2+b3_i386
+libghc-haxml-dev_1:1.22.5-2+b2_i386
+libghc-haxr-dev_3000.8.5-1+b3_i386
+libghc-hcard-dev_0.0-2+b2_i386
+libghc-hcwiid-dev_0.0.1-3+b1_i386
+libghc-hdbc-dev_2.3.1.1-1+b3_i386
+libghc-hdbc-odbc-dev_2.2.3.0-5+b3_i386
+libghc-hdbc-postgresql-dev_2.3.2.1-1+b3_i386
+libghc-hdbc-sqlite3-dev_2.3.3.0-1+b3_i386
+libghc-hfuse-dev_0.2.4.1-1_i386
+libghc-highlighting-kate-dev_0.5.1-1_i386
+libghc-hinotify-dev_0.3.2-1+b1_i386
+libghc-hint-dev_0.3.3.4-2+b4_i386
+libghc-hipmunk-dev_5.2.0.8-1+b1_i386
+libghc-hjavascript-dev_0.4.7-3+b1_i386
+libghc-hjscript-dev_0.5.0-3+b2_i386
+libghc-hjsmin-dev_0.1.1-1+b2_i386
+libghc-hlint-dev_1.8.28-1+b3_i386
+libghc-hoauth-dev_0.3.4-1+b1_i386
+libghc-hostname-dev_1.0-4+b1_i386
+libghc-hs-bibutils-dev_4.12-5+b2_i386
+libghc-hs3-dev_0.5.6-2+b4_i386
+libghc-hscolour-dev_1.19-3+b1_i386
+libghc-hscurses-dev_1.4.1.0-1+b2_i386
+libghc-hsemail-dev_1.7.1-2+b3_i386
+libghc-hsh-dev_2.0.3-6+b3_i386
+libghc-hslogger-dev_1.1.4+dfsg1-2+b3_i386
+libghc-hsp-dev_0.6.1-2+b3_i386
+libghc-hspec-dev_1.1.0-1+b1_i386
+libghc-hsql-dev_1.8.1-4_i386
+libghc-hsql-mysql-dev_1.8.1-4+b1_i386
+libghc-hsql-odbc-dev_1.8.1.1-2_i386
+libghc-hsql-postgresql-dev_1.8.1-3_i386
+libghc-hsql-sqlite3-dev_1.8.1-2_i386
+libghc-hssyck-dev_0.50-2+b2_i386
+libghc-hstringtemplate-dev_0.6.8-1_i386
+libghc-hsx-dev_0.9.1-3_i386
+libghc-html-conduit-dev_0.0.1-2_i386
+libghc-html-dev_1.0.1.2-5+b1_i386
+libghc-http-conduit-dev_1.4.1.6-3_i386
+libghc-http-date-dev_0.0.2-1+b2_i386
+libghc-http-dev_1:4000.2.3-1+b2_i386
+libghc-http-types-dev_0.6.11-1_i386
+libghc-hunit-dev_1.2.4.2-2+b1_i386
+libghc-hxt-cache-dev_9.0.2-2+b3_i386
+libghc-hxt-charproperties-dev_9.1.1-2+b1_i386
+libghc-hxt-curl-dev_9.1.1-1+b4_i386
+libghc-hxt-dev_9.2.2-2+b3_i386
+libghc-hxt-http-dev_9.1.4-2+b3_i386
+libghc-hxt-regex-xmlschema-dev_9.0.4-2+b3_i386
+libghc-hxt-relaxng-dev_9.1.4-1+b3_i386
+libghc-hxt-tagsoup-dev_9.1.1-1+b4_i386
+libghc-hxt-unicode-dev_9.0.2-2+b1_i386
+libghc-hxt-xpath-dev_9.1.2-1+b4_i386
+libghc-hxt-xslt-dev_9.1.1-1+b3_i386
+libghc-iconv-dev_0.4.1.0-2+b1_i386
+libghc-ieee754-dev_0.7.3-1+b1_i386
+libghc-ifelse-dev_0.85-4+b1_i386
+libghc-io-choice-dev_0.0.1-1+b3_i386
+libghc-io-storage-dev_0.3-2+b1_i386
+libghc-iospec-dev_0.2.5-1+b2_i386
+libghc-irc-dev_0.5.0.0-1+b3_i386
+libghc-iteratee-dev_0.8.8.2-2+b1_i386
+libghc-ixset-dev_1.0.3-2+b1_i386
+libghc-json-dev_0.5-2+b2_i386
+libghc-keys-dev_2.1.3.2-1+b1_i386
+libghc-knob-dev_0.1.1-1_i386
+libghc-lambdabot-utils-dev_4.2.1-3+b3_i386
+libghc-language-c-dev_0.4.2-2+b2_i386
+libghc-language-haskell-extract-dev_0.2.1-4+b1_i386
+libghc-language-javascript-dev_0.5.4-1+b2_i386
+libghc-largeword-dev_1.0.1-2+b1_i386
+libghc-lazysmallcheck-dev_0.6-1+b1_i386
+libghc-ldap-dev_0.6.6-4.1+b1_i386
+libghc-leksah-server-dev_0.12.0.4-3_i386
+libghc-libtagc-dev_0.12.0-2+b1_i386
+libghc-libxml-sax-dev_0.7.2-2+b1_i386
+libghc-libzip-dev_0.10-1+b2_i386
+libghc-lifted-base-dev_0.1.1-1+b1_i386
+libghc-listlike-dev_3.1.4-1+b1_i386
+libghc-llvm-base-dev_3.0.1.0-1_i386
+libghc-llvm-dev_3.0.1.0-1+b1_i386
+libghc-logict-dev_0.5.0.1-1+b1_i386
+libghc-ltk-dev_0.12.0.0-2+b1_i386
+libghc-maccatcher-dev_2.1.5-2+b3_i386
+libghc-magic-dev_1.0.8-8+b1_i386
+libghc-markov-chain-dev_0.0.3.2-1+b1_i386
+libghc-math-functions-dev_0.1.1.0-2+b2_i386
+libghc-maths-dev_0.4.3-1+b1_i386
+libghc-maybet-dev_0.1.2-3+b2_i386
+libghc-mbox-dev_0.1-2+b1_i386
+libghc-memotrie-dev_0.5-1_i386
+libghc-mersenne-random-dev_1.0.0.1-2+b1_i386
+libghc-midi-dev_0.2.0.1-1+b1_i386
+libghc-mime-mail-dev_0.4.1.1-2+b3_i386
+libghc-missingh-dev_1.1.0.3-6+b3_i386
+libghc-mmap-dev_0.5.7-2+b1_i386
+libghc-monad-control-dev_0.3.1.3-1+b1_i386
+libghc-monad-loops-dev_0.3.2.0-1_i386
+libghc-monad-par-dev_0.1.0.3-2+b1_i386
+libghc-monadcatchio-mtl-dev_0.3.0.4-2+b2_i386
+libghc-monadcatchio-transformers-dev_0.3.0.0-2+b1_i386
+libghc-monadcryptorandom-dev_0.4.1-1+b2_i386
+libghc-monadrandom-dev_0.1.6-2+b2_i386
+libghc-monads-tf-dev_0.1.0.0-1+b2_i386
+libghc-monoid-transformer-dev_0.0.2-3+b1_i386
+libghc-mtl-dev_2.1.1-1_i386
+libghc-mtlparse-dev_0.1.2-2+b2_i386
+libghc-murmur-hash-dev_0.1.0.5-2+b1_i386
+libghc-mwc-random-dev_0.11.0.0-4+b1_i386
+libghc-ncurses-dev_0.2.1-1+b1_i386
+libghc-netwire-dev_3.1.0-2+b5_i386
+libghc-network-conduit-dev_0.4.0.1-2_i386
+libghc-network-dev_2.3.0.13-1+b2_i386
+libghc-network-protocol-xmpp-dev_0.4.3-1_i386
+libghc-newtype-dev_0.2-1_i386
+libghc-non-negative-dev_0.1-2+b1_i386
+libghc-numbers-dev_2009.8.9-2+b1_i386
+libghc-numeric-quest-dev_0.2-1+b1_i386
+libghc-numinstances-dev_1.0-2+b1_i386
+libghc-numtype-dev_1.0-2+b1_i386
+libghc-oeis-dev_0.3.1-2+b3_i386
+libghc-openal-dev_1.3.1.3-4+b1_i386
+libghc-opengl-dev_2.2.3.1-1+b1_i386
+libghc-openpgp-asciiarmor-dev_0.1-1+b2_i386
+libghc-options-dev_0.1.1-1_i386
+libghc-pandoc-dev_1.9.4.2-2_i386
+libghc-pandoc-types-dev_1.9.1-1+b2_i386
+libghc-pango-dev_0.12.2-1+b2_i386
+libghc-parallel-dev_3.2.0.2-2+b1_i386
+libghc-parseargs-dev_0.1.3.2-2+b1_i386
+libghc-parsec2-dev_2.1.0.1-6+b1_i386
+libghc-parsec3-dev_3.1.2-1+b3_i386
+libghc-pastis-dev_0.1.2-2+b3_i386
+libghc-path-pieces-dev_0.1.0-1+b2_i386
+libghc-patience-dev_0.1.1-1_i386
+libghc-pcre-light-dev_0.4-3+b1_i386
+libghc-pem-dev_0.1.1-1+b3_i386
+libghc-persistent-dev_0.9.0.4-2_i386
+libghc-persistent-sqlite-dev_0.9.0.2-2_i386
+libghc-persistent-template-dev_0.9.0.2-1_i386
+libghc-polyparse-dev_1.7-1+b2_i386
+libghc-pool-conduit-dev_0.1.0.2-1_i386
+libghc-postgresql-libpq-dev_0.8.2-1_i386
+libghc-postgresql-simple-dev_0.1.4.3-1_i386
+libghc-pretty-show-dev_1.1.1-4+b1_i386
+libghc-primes-dev_0.2.1.0-2+b1_i386
+libghc-primitive-dev_0.4.1-1+b1_i386
+libghc-psqueue-dev_1.1-2+b1_i386
+libghc-puremd5-dev_2.1.0.3-2+b4_i386
+libghc-pwstore-fast-dev_2.2-2+b4_i386
+libghc-quickcheck1-dev_1.2.0.1-2+b1_i386
+libghc-quickcheck2-dev_2.4.2-1+b1_i386
+libghc-random-dev_1.0.1.1-1+b1_i386
+libghc-random-shuffle-dev_0.0.3-2+b2_i386
+libghc-ranged-sets-dev_0.3.0-2+b1_i386
+libghc-ranges-dev_0.2.4-2+b1_i386
+libghc-reactive-banana-dev_0.6.0.0-1+b3_i386
+libghc-readline-dev_1.0.1.0-3+b1_i386
+libghc-recaptcha-dev_0.1-4+b3_i386
+libghc-regex-base-dev_0.93.2-2+b2_i386
+libghc-regex-compat-dev_0.95.1-2+b1_i386
+libghc-regex-pcre-dev_0.94.2-2+b1_i386
+libghc-regex-posix-dev_0.95.1-2+b1_i386
+libghc-regex-tdfa-dev_1.1.8-2+b1_i386
+libghc-regex-tdfa-utf8-dev_1.0-5+b3_i386
+libghc-regexpr-dev_0.5.4-2+b2_i386
+libghc-representable-functors-dev_2.4.0.2-1+b1_i386
+libghc-representable-tries-dev_2.4.0.2-1_i386
+libghc-resource-pool-dev_0.2.1.0-2+b4_i386
+libghc-resourcet-dev_0.3.2.1-1+b1_i386
+libghc-rsa-dev_1.2.1.0-1+b1_i386
+libghc-safe-dev_0.3.3-1+b1_i386
+libghc-safecopy-dev_0.6.1-1+b1_i386
+libghc-sdl-dev_0.6.3-1+b1_i386
+libghc-sdl-gfx-dev_0.6.0-3+b1_i386
+libghc-sdl-image-dev_0.6.1-3+b1_i386
+libghc-sdl-mixer-dev_0.6.1-3+b1_i386
+libghc-sdl-ttf-dev_0.6.1-3+b1_i386
+libghc-semigroupoids-dev_1.3.1.2-1+b1_i386
+libghc-semigroups-dev_0.8.3.2-1_i386
+libghc-sendfile-dev_0.7.6-1+b2_i386
+libghc-sha-dev_1.5.0.1-1_i386
+libghc-shakespeare-css-dev_1.0.1.2-1+b1_i386
+libghc-shakespeare-dev_1.0.0.2-1+b1_i386
+libghc-shakespeare-i18n-dev_1.0.0.2-1+b1_i386
+libghc-shakespeare-js-dev_1.0.0.2-1+b1_i386
+libghc-shakespeare-text-dev_1.0.0.2-1+b1_i386
+libghc-shellac-dev_0.9.5.1-2+b2_i386
+libghc-show-dev_0.4.1.2-1+b2_i386
+libghc-silently-dev_1.1.4-1+b2_i386
+libghc-simple-sendfile-dev_0.2.3-1+b2_i386
+libghc-simpleea-dev_0.1.1-2+b2_i386
+libghc-simpleirc-dev_0.2.1-2+b3_i386
+libghc-skein-dev_0.1.0.7-2+b1_i386
+libghc-smallcheck-dev_0.6-1+b1_i386
+libghc-smtpclient-dev_1.0.4-3+b3_i386
+libghc-snap-core-dev_0.8.1-1+b4_i386
+libghc-snap-server-dev_0.8.1.1-1_i386
+libghc-socks-dev_0.4.1-1+b4_i386
+libghc-split-dev_0.1.4.2-2_i386
+libghc-src-exts-dev_1.11.1-3+b1_i386
+libghc-statevar-dev_1.0.0.0-2+b1_i386
+libghc-static-hash-dev_0.0.1-3+b2_i386
+libghc-statistics-dev_0.10.1.0-2+b1_i386
+libghc-stm-dev_2.3-1_i386
+libghc-stream-dev_0.4.6-1+b1_i386
+libghc-strict-concurrency-dev_0.2.4.1-2+b1_i386
+libghc-strict-dev_0.3.2-2+b1_i386
+libghc-strptime-dev_1.0.6-1_i386
+libghc-svgcairo-dev_0.12.1-1+b2_i386
+libghc-syb-dev_0.3.6.1-1_i386
+libghc-syb-with-class-dev_0.6.1.3-1+b1_i386
+libghc-syb-with-class-instances-text-dev_0.0.1-3+b2_i386
+libghc-system-fileio-dev_0.3.8-1_i386
+libghc-system-filepath-dev_0.4.6-1+b2_i386
+libghc-tagged-dev_0.4.2.1-1_i386
+libghc-tagsoup-dev_0.12.6-1+b3_i386
+libghc-tagstream-conduit-dev_0.3.2-1_i386
+libghc-tar-dev_0.3.2.0-2+b1_i386
+libghc-template-dev_0.2.0.7-1+b1_i386
+libghc-temporary-dev_1.1.2.3-1+b1_i386
+libghc-terminfo-dev_0.3.2.3-1+b1_i386
+libghc-test-framework-dev_0.6-1+b1_i386
+libghc-test-framework-hunit-dev_0.2.7-1+b3_i386
+libghc-test-framework-quickcheck2-dev_0.2.12.1-1+b1_i386
+libghc-test-framework-th-dev_0.2.2-5_i386
+libghc-test-framework-th-prime-dev_0.0.5-1_i386
+libghc-testpack-dev_2.1.1-1+b2_i386
+libghc-texmath-dev_0.6.0.6-1+b2_i386
+libghc-text-dev_0.11.2.0-1_i386
+libghc-text-icu-dev_0.6.3.4-2+b2_i386
+libghc-tinyurl-dev_0.1.0-2+b3_i386
+libghc-tls-dev_0.9.5-1+b4_i386
+libghc-tls-extra-dev_0.4.6.1-2_i386
+libghc-tokyocabinet-dev_0.0.5-5+b3_i386
+libghc-transformers-base-dev_0.4.1-2+b2_i386
+libghc-transformers-dev_0.3.0.0-1_i386
+libghc-type-level-dev_0.2.4-5_i386
+libghc-uniplate-dev_1.6.7-1+b2_i386
+libghc-unix-bytestring-dev_0.3.5-2+b1_i386
+libghc-unix-compat-dev_0.3.0.1-1+b1_i386
+libghc-unixutils-dev_1.50-1+b1_i386
+libghc-unlambda-dev_0.1-2+b2_i386
+libghc-unordered-containers-dev_0.2.1.0-1_i386
+libghc-uri-dev_0.1.6-1+b2_i386
+libghc-url-dev_2.1.2-4+b1_i386
+libghc-utf8-light-dev_0.4.0.1-2+b1_i386
+libghc-utf8-string-dev_0.3.7-1+b1_i386
+libghc-utility-ht-dev_0.0.5.1-3+b1_i386
+libghc-uuagc-cabal-dev_1.0.2.0-1+b1_i386
+libghc-uuid-dev_1.2.3-2+b4_i386
+libghc-uulib-dev_0.9.14-2_i386
+libghc-vault-dev_0.2.0.0-1+b2_i386
+libghc-vector-algorithms-dev_0.5.4-1+b2_i386
+libghc-vector-dev_0.9.1-2+b1_i386
+libghc-vector-space-dev_0.8.1-1_i386
+libghc-vector-space-points-dev_0.1.1.0-1+b1_i386
+libghc-void-dev_0.5.5.1-2+b1_i386
+libghc-vte-dev_0.12.1-1+b3_i386
+libghc-vty-dev_4.7.0.14-1+b1_i386
+libghc-wai-app-file-cgi-dev_0.5.8-1+b4_i386
+libghc-wai-app-static-dev_1.2.0.3-1+b3_i386
+libghc-wai-dev_1.2.0.2-1+b2_i386
+libghc-wai-extra-dev_1.2.0.4-1_i386
+libghc-wai-logger-dev_0.1.4-1+b6_i386
+libghc-wai-logger-prefork-dev_0.1.3-1+b6_i386
+libghc-wai-test-dev_1.2.0.2-1_i386
+libghc-warp-dev_1.2.1.1-1_i386
+libghc-warp-tls-dev_1.2.0.4-1+b4_i386
+libghc-web-routes-dev_0.25.3-2+b3_i386
+libghc-webkit-dev_0.12.3-2+b1_i386
+libghc-weighted-regexp-dev_0.3.1.1-2+b1_i386
+libghc-x11-dev_1.5.0.1-1+b2_i386
+libghc-x11-xft-dev_0.3.1-1+b3_i386
+libghc-xdg-basedir-dev_0.2.1-2+b1_i386
+libghc-xhtml-dev_3000.2.1-1_i386
+libghc-xml-conduit-dev_0.7.0.2-1_i386
+libghc-xml-dev_1.3.12-1+b2_i386
+libghc-xml-types-dev_0.3.1-2+b2_i386
+libghc-xml2html-dev_0.1.2.3-1_i386
+libghc-xmonad-contrib-dev_0.10-4~deb7u1_i386
+libghc-xmonad-dev_0.10-4+b2_i386
+libghc-xss-sanitize-dev_0.3.2-1+b1_i386
+libghc-yaml-dev_0.7.0.2-1+b2_i386
+libghc-yaml-light-dev_0.1.4-2+b2_i386
+libghc-yesod-auth-dev_1.0.2.1-2+b2_i386
+libghc-yesod-core-dev_1.0.1.2-1+b3_i386
+libghc-yesod-default-dev_1.0.1.1-1+b1_i386
+libghc-yesod-dev_1.0.1.6-2+b3_i386
+libghc-yesod-form-dev_1.0.0.4-1+b1_i386
+libghc-yesod-json-dev_1.0.0.1-1+b3_i386
+libghc-yesod-markdown-dev_0.4.0-1+b3_i386
+libghc-yesod-persistent-dev_1.0.0.1-1+b1_i386
+libghc-yesod-routes-dev_1.0.1.2-1_i386
+libghc-yesod-static-dev_1.0.0.2-1+b3_i386
+libghc-yesod-test-dev_0.2.0.6-1_i386
+libghc-zip-archive-dev_0.1.1.7-3+b2_i386
+libghc-zlib-bindings-dev_0.1.0.1-1_i386
+libghc-zlib-conduit-dev_0.4.0.1-1_i386
+libghc-zlib-dev_0.5.3.3-1+b1_i386
+libghc-zlib-enum-dev_0.2.2.1-1+b1_i386
+libghc6-agda-dev_1:8_all
+libghc6-alut-dev_1:8_all
+libghc6-arrows-dev_1:8_all
+libghc6-binary-dev_1:8_all
+libghc6-binary-shared-dev_1:8_all
+libghc6-bzlib-dev_1:8_all
+libghc6-cairo-dev_1:8_all
+libghc6-cautious-file-dev_1:8_all
+libghc6-cgi-dev_1:8_all
+libghc6-colour-dev_1:8_all
+libghc6-configfile-dev_1:8_all
+libghc6-convertible-dev_1:8_all
+libghc6-cpphs-dev_1:8_all
+libghc6-criterion-dev_1:8_all
+libghc6-csv-dev_1:8_all
+libghc6-curl-dev_1:8_all
+libghc6-data-accessor-dev_1:8_all
+libghc6-dataenc-dev_1:8_all
+libghc6-datetime-dev_1:8_all
+libghc6-debian-dev_1:8_all
+libghc6-deepseq-dev_1:8_all
+libghc6-diagrams-dev_1:8_all
+libghc6-diff-dev_1:8_all
+libghc6-digest-dev_1:8_all
+libghc6-edison-api-dev_1:8_all
+libghc6-edison-core-dev_1:8_all
+libghc6-editline-dev_1:8_all
+libghc6-erf-dev_1:8_all
+libghc6-event-list-dev_1:8_all
+libghc6-explicit-exception-dev_1:8_all
+libghc6-fastcgi-dev_1:8_all
+libghc6-feed-dev_1:8_all
+libghc6-fgl-dev_1:8_all
+libghc6-filemanip-dev_1:8_all
+libghc6-filestore-dev_1:8_all
+libghc6-ftphs-dev_1:8_all
+libghc6-gconf-dev_1:8_all
+libghc6-ghc-events-dev_1:8_all
+libghc6-ghc-mtl-dev_1:8_all
+libghc6-ghc-paths-dev_1:8_all
+libghc6-gio-dev_1:8_all
+libghc6-gitit-dev_1:8_all
+libghc6-glade-dev_1:8_all
+libghc6-glfw-dev_1:8_all
+libghc6-glib-dev_1:8_all
+libghc6-glut-dev_1:8_all
+libghc6-gstreamer-dev_1:8_all
+libghc6-gtk-dev_1:8_all
+libghc6-gtkglext-dev_1:8_all
+libghc6-gtksourceview2-dev_1:8_all
+libghc6-haddock-dev_1:8_all
+libghc6-happstack-dev_1:8_all
+libghc6-happstack-server-dev_1:8_all
+libghc6-harp-dev_1:8_all
+libghc6-hashed-storage-dev_1:8_all
+libghc6-haskeline-dev_1:8_all
+libghc6-haskell-lexer-dev_1:8_all
+libghc6-haskell-src-dev_1:8_all
+libghc6-haskelldb-dev_1:8_all
+libghc6-haskelldb-hdbc-dev_1:8_all
+libghc6-haskelldb-hdbc-odbc-dev_1:8_all
+libghc6-haskelldb-hdbc-postgresql-dev_1:8_all
+libghc6-haskelldb-hdbc-sqlite3-dev_1:8_all
+libghc6-haskore-dev_1:8_all
+libghc6-haxml-dev_1:8_all
+libghc6-haxr-dev_1:8_all
+libghc6-hdbc-dev_1:8_all
+libghc6-hdbc-odbc-dev_1:8_all
+libghc6-hdbc-postgresql-dev_1:8_all
+libghc6-hdbc-sqlite3-dev_1:8_all
+libghc6-highlighting-kate-dev_1:8_all
+libghc6-hint-dev_1:8_all
+libghc6-hjavascript-dev_1:8_all
+libghc6-hjscript-dev_1:8_all
+libghc6-hoauth-dev_1:8_all
+libghc6-hscolour-dev_1:8_all
+libghc6-hscurses-dev_1:8_all
+libghc6-hsemail-dev_1:8_all
+libghc6-hsh-dev_1:8_all
+libghc6-hslogger-dev_1:8_all
+libghc6-hsp-dev_1:8_all
+libghc6-hsql-dev_1:8_all
+libghc6-hsql-mysql-dev_1:8_all
+libghc6-hsql-odbc-dev_1:8_all
+libghc6-hsql-postgresql-dev_1:8_all
+libghc6-hsql-sqlite3-dev_1:8_all
+libghc6-hstringtemplate-dev_1:8_all
+libghc6-hsx-dev_1:8_all
+libghc6-html-dev_1:8_all
+libghc6-http-dev_1:8_all
+libghc6-hunit-dev_1:8_all
+libghc6-hxt-dev_1:8_all
+libghc6-ifelse-dev_1:8_all
+libghc6-irc-dev_1:8_all
+libghc6-json-dev_1:8_all
+libghc6-language-c-dev_1:8_all
+libghc6-lazysmallcheck-dev_1:8_all
+libghc6-ldap-dev_1:8_all
+libghc6-leksah-server-dev_1:8_all
+libghc6-llvm-dev_1:8_all
+libghc6-ltk-dev_1:8_all
+libghc6-magic-dev_1:8_all
+libghc6-markov-chain-dev_1:8_all
+libghc6-maybet-dev_1:8_all
+libghc6-midi-dev_1:8_all
+libghc6-missingh-dev_1:8_all
+libghc6-mmap-dev_1:8_all
+libghc6-monadcatchio-mtl-dev_1:8_all
+libghc6-monoid-transformer-dev_1:8_all
+libghc6-mtl-dev_1:8_all
+libghc6-mwc-random-dev_1:8_all
+libghc6-network-dev_1:8_all
+libghc6-non-negative-dev_1:8_all
+libghc6-openal-dev_1:8_all
+libghc6-opengl-dev_1:8_all
+libghc6-pandoc-dev_1:8_all
+libghc6-pango-dev_1:8_all
+libghc6-parallel-dev_1:8_all
+libghc6-parsec2-dev_1:8_all
+libghc6-parsec3-dev_1:8_all
+libghc6-pcre-light-dev_1:8_all
+libghc6-polyparse-dev_1:8_all
+libghc6-pretty-show-dev_1:8_all
+libghc6-primitive-dev_1:8_all
+libghc6-quickcheck1-dev_1:8_all
+libghc6-quickcheck2-dev_1:8_all
+libghc6-recaptcha-dev_1:8_all
+libghc6-regex-base-dev_1:8_all
+libghc6-regex-compat-dev_1:8_all
+libghc6-regex-posix-dev_1:8_all
+libghc6-regex-tdfa-dev_1:8_all
+libghc6-regex-tdfa-utf8-dev_1:8_all
+libghc6-safe-dev_1:8_all
+libghc6-sdl-dev_1:8_all
+libghc6-sdl-gfx-dev_1:8_all
+libghc6-sdl-image-dev_1:8_all
+libghc6-sdl-mixer-dev_1:8_all
+libghc6-sdl-ttf-dev_1:8_all
+libghc6-sendfile-dev_1:8_all
+libghc6-sha-dev_1:8_all
+libghc6-smtpclient-dev_1:8_all
+libghc6-split-dev_1:8_all
+libghc6-src-exts-dev_1:8_all
+libghc6-statistics-dev_1:8_all
+libghc6-stm-dev_1:8_all
+libghc6-stream-dev_1:8_all
+libghc6-strict-concurrency-dev_1:8_all
+libghc6-svgcairo-dev_1:8_all
+libghc6-syb-with-class-dev_1:8_all
+libghc6-syb-with-class-instances-text-dev_1:8_all
+libghc6-tagsoup-dev_1:8_all
+libghc6-tar-dev_1:8_all
+libghc6-terminfo-dev_1:8_all
+libghc6-testpack-dev_1:8_all
+libghc6-texmath-dev_1:8_all
+libghc6-text-dev_1:8_all
+libghc6-tokyocabinet-dev_1:8_all
+libghc6-transformers-dev_1:8_all
+libghc6-type-level-dev_1:8_all
+libghc6-uniplate-dev_1:8_all
+libghc6-unix-compat-dev_1:8_all
+libghc6-unixutils-dev_1:8_all
+libghc6-url-dev_1:8_all
+libghc6-utility-ht-dev_1:8_all
+libghc6-uulib-dev_1:8_all
+libghc6-vector-algorithms-dev_1:8_all
+libghc6-vector-dev_1:8_all
+libghc6-vte-dev_1:8_all
+libghc6-vty-dev_1:8_all
+libghc6-webkit-dev_1:8_all
+libghc6-x11-dev_1:8_all
+libghc6-x11-xft-dev_1:8_all
+libghc6-xhtml-dev_1:8_all
+libghc6-xml-dev_1:8_all
+libghc6-xmonad-contrib-dev_1:8_all
+libghc6-xmonad-dev_1:8_all
+libghc6-zip-archive-dev_1:8_all
+libghc6-zlib-dev_1:8_all
+libghemical-dev_3.0.0-2_i386
+libgif-dev_4.1.6-10_i386
+libgiftiio-dev_1.0.9-1_i386
+libgig-dev_3.3.0-2_i386
+libgii1-dev_1:1.0.2-4.1_i386
+libgimp2.0-dev_2.8.2-2+deb7u1_i386
+libginac-dev_1.6.2-1_i386
+libginspx-dev_20050529-3.1_i386
+libgio2.0-cil-dev_2.22.3-2_all
+libgirara-dev_0.1.2-3_i386
+libgirepository1.0-dev_1.32.1-1_i386
+libgjs-dev_1.32.0-5_i386
+libgkeyfile-cil-dev_0.1-4_all
+libgksu2-dev_2.0.13~pre1-6_i386
+libgl1-mesa-dev_8.0.5-4+deb7u2_i386
+libgl1-mesa-swx11-dev_8.0.5-4+deb7u2_i386
+libgl2ps-dev_1.3.6-1_i386
+libglade2-dev_1:2.6.4-1_i386
+libglade2.0-cil-dev_2.12.10-5_i386
+libglademm-2.4-dev_2.6.7-2_i386
+libgladeui-1-dev_3.6.7-2.1_i386
+libgladeui-dev_3.12.1-1_i386
+libglbsp-dev_2.24-1_i386
+libglc-dev_0.7.2-5+b1_i386
+libgle3-dev_3.1.0-7_i386
+libgles1-mesa-dev_8.0.5-4+deb7u2_i386
+libgles2-mesa-dev_8.0.5-4+deb7u2_i386
+libglew-dev_1.7.0-3_i386
+libglewmx-dev_1.7.0-3_i386
+libglfw-dev_2.7.2-1_i386
+libglib2.0-cil-dev_2.12.10-5_i386
+libglib2.0-dev_2.33.12+really2.32.4-5_i386
+libglibmm-2.4-dev_2.32.1-1_i386
+libglide2-dev_2002.04.10ds1-7_i386
+libglide3-dev_2002.04.10ds1-7_i386
+libglm-dev_0.9.3.3+dfsg-0.1_all
+libglobus-authz-callout-error-dev_2.2-1_i386
+libglobus-authz-dev_2.2-1_i386
+libglobus-callout-dev_2.2-1_i386
+libglobus-common-dev_14.7-2_i386
+libglobus-ftp-client-dev_7.3-1_i386
+libglobus-ftp-control-dev_4.4-1_i386
+libglobus-gass-cache-dev_8.1-2_i386
+libglobus-gass-copy-dev_8.4-1_i386
+libglobus-gass-server-ez-dev_4.3-1_i386
+libglobus-gass-transfer-dev_7.2-1_i386
+libglobus-gfork-dev_3.2-1_i386
+libglobus-gram-client-dev_12.4-1_i386
+libglobus-gram-job-manager-callout-error-dev_2.1-2_i386
+libglobus-gram-protocol-dev_11.3-1_i386
+libglobus-gridftp-server-control-dev_2.5-2_i386
+libglobus-gridftp-server-dev_6.10-2_i386
+libglobus-gridmap-callout-error-dev_1.2-2_i386
+libglobus-gsi-callback-dev_4.2-1_i386
+libglobus-gsi-cert-utils-dev_8.3-1_i386
+libglobus-gsi-credential-dev_5.3-1_i386
+libglobus-gsi-openssl-error-dev_2.1-2_i386
+libglobus-gsi-proxy-core-dev_6.2-1_i386
+libglobus-gsi-proxy-ssl-dev_4.1-2_i386
+libglobus-gsi-sysconfig-dev_5.2-1_i386
+libglobus-gss-assist-dev_8.5-1_i386
+libglobus-gssapi-error-dev_4.1-2_i386
+libglobus-gssapi-gsi-dev_10.6-1_i386
+libglobus-io-dev_9.3-1_i386
+libglobus-openssl-module-dev_3.2-1_i386
+libglobus-rls-client-dev_5.2-8_i386
+libglobus-rsl-dev_9.1-2_i386
+libglobus-scheduler-event-generator-dev_4.6-1_i386
+libglobus-usage-dev_3.1-2_i386
+libglobus-xio-dev_3.3-1_i386
+libglobus-xio-gsi-driver-dev_2.3-1_i386
+libglobus-xio-pipe-driver-dev_2.2-1_i386
+libglobus-xio-popen-driver-dev_2.3-1_i386
+libgloox-dev_1.0-1.1_i386
+libglpk-dev_4.45-1_i386
+libglrr-glib-dev_20050529-3.1_i386
+libglrr-gobject-dev_20050529-3.1_i386
+libglrr-gtk-dev_20050529-3.1_i386
+libglrr-widgets-dev_20050529-3.1_i386
+libglu1-mesa-dev_8.0.5-4+deb7u2_i386
+libglui-dev_2.36-4_i386
+libglw1-mesa-dev_8.0.0-1_i386
+libgme-dev_0.5.5-2_i386
+libgmerlin-avdec-dev_1.2.0~dfsg-1+b1_i386
+libgmerlin-dev_1.2.0~dfsg+1-1_i386
+libgmime-2.6-dev_2.6.10-1_i386
+libgmime2.6-cil-dev_2.6.10-1_all
+libgmlib-dev_1.0.6-1_i386
+libgmm++-dev_4.1.1+dfsg1-11_all
+libgmp-dev_2:5.0.5+dfsg-2_i386
+libgmp-ocaml-dev_20021123-17+b3_i386
+libgmp3-dev_2:5.0.5+dfsg-2_i386
+libgmpada3-dev_0.0.20120331-1_i386
+libgmt-dev_4.5.7-2_i386
+libgmtk-dev_1.0.6-1_i386
+libgnadecommon2-dev_1.6.2-9_i386
+libgnadeodbc2-dev_1.6.2-9_i386
+libgnadesqlite3-2-dev_1.6.2-9_i386
+libgnatprj4.6-dev_4.6.3-8_i386
+libgnatvsn4.6-dev_4.6.3-8_i386
+libgnelib-dev_0.75+svn20091130-1+b1_i386
+libgnet-dev_2.0.8-2.2_i386
+libgnokii-dev_0.6.30+dfsg-1+b1_i386
+libgnome-bluetooth-dev_3.4.2-1_i386
+libgnome-desktop-3-dev_3.4.2-1_i386
+libgnome-desktop-dev_2.32.1-2_i386
+libgnome-keyring-dev_3.4.1-1_i386
+libgnome-keyring1.0-cil-dev_1.0.0-4_i386
+libgnome-mag-dev_1:0.16.3-1_i386
+libgnome-media-profiles-dev_3.0.0-1_i386
+libgnome-menu-3-dev_3.4.2-5_i386
+libgnome-menu-dev_3.0.1-4_i386
+libgnome-speech-dev_1:0.4.25-5_i386
+libgnome-vfs2.0-cil-dev_2.24.2-3_all
+libgnome-vfsmm-2.6-dev_2.26.0-1_i386
+libgnome2-dev_2.32.1-3_i386
+libgnome2.0-cil-dev_2.24.2-3_i386
+libgnomeada2.24.1-dev_2.24.1-7_i386
+libgnomecanvas2-dev_2.30.3-1.2_i386
+libgnomecanvasmm-2.6-dev_2.26.0-1_i386
+libgnomecups1.0-dev_0.2.3-5_i386
+libgnomedesktop2.0-cil-dev_2.26.0-8_all
+libgnomekbd-dev_3.4.0.2-1_i386
+libgnomemm-2.6-dev_2.30.0-1_i386
+libgnomeprint2.2-dev_2.18.8-3_i386
+libgnomeprintui2.2-dev_2.18.6-3_i386
+libgnomeui-dev_2.24.5-2_i386
+libgnomeuimm-2.6-dev_2.28.0-1_i386
+libgnomevfs2-dev_1:2.24.4-2_i386
+libgnuift0-dev_0.1.14-12_i386
+libgnuplot-ocaml-dev_0.8.3-3_i386
+libgnustep-base-dev_1.22.1-4_i386
+libgnustep-dl2-dev_0.12.0-9+nmu1_i386
+libgnustep-gui-dev_0.20.0-3_i386
+libgnutls-dev_2.12.20-8+deb7u1_i386
+libgoa-1.0-dev_3.4.2-2_i386
+libgoffice-0.8-dev_0.8.17-1.2_i386
+libgofigure-dev_0.9.0-1+b2_i386
+libgoocanvas-dev_0.15-1_i386
+libgoocanvasmm-dev_0.15.4-1_i386
+libgoogle-perftools-dev_2.0-2_i386
+libgooglepinyin0-dev_0.1.2-1_i386
+libgpac-dev_0.5.0~dfsg0-1_i386
+libgpds-dev_1.5.1-6_i386
+libgpelaunch-dev_0.14-6_i386
+libgpepimc-dev_0.9-4_i386
+libgpeschedule-dev_0.17-4_i386
+libgpevtype-dev_0.50-6_i386
+libgpewidget-dev_0.117-6_i386
+libgpg-error-dev_1.10-3.1_i386
+libgpgme11-dev_1.2.0-1.4_i386
+libgphoto2-2-dev_2.4.14-2_i386
+libgpiv3-dev_0.6.1-4_i386
+libgpm-dev_1.20.4-6_i386
+libgpod-cil-dev_0.8.2-7_i386
+libgpod-dev_0.8.2-7_i386
+libgpod-nogtk-dev_0.8.2-7_i386
+libgportugol-dev_1.1-2_i386
+libgps-dev_3.6-4+deb7u1_i386
+libgraflib1-dev_20061220+dfsg3-2_i386
+libgrafx11-1-dev_20061220+dfsg3-2_i386
+libgrantlee-dev_0.1.4-1_i386
+libgraphicsmagick++1-dev_1.3.16-1.1_i386
+libgraphicsmagick1-dev_1.3.16-1.1_i386
+libgraphite-dev_1:2.3.1-0.2_i386
+libgraphite2-dev_1.1.3-1_i386
+libgraphviz-dev_2.26.3-14+deb7u1_i386
+libgretl1-dev_1.9.9-1_i386
+libgrib-api-dev_1.9.16-2+b1_i386
+libgrib2c-dev_1.2.2-2+b1_i386
+libgridsite-dev_1.7.16-1_i386
+libgrilo-0.1-dev_0.1.19-1_i386
+libgringotts-dev_1.2.10~pre3-1_i386
+libgrits-dev_0.7-1_i386
+libgrok-dev_1.20110708.1-4_i386
+libgrss-dev_0.5.0-1_i386
+libgs-dev_9.05~dfsg-6.3+deb7u1_i386
+libgsasl7-dev_1.8.0-2_i386
+libgsecuredelete-dev_0.2-1_i386
+libgsf-1-dev_1.14.21-2.1_i386
+libgsf-gnome-1-dev_1.14.21-2.1_i386
+libgsl0-dev_1.15+dfsg.2-2_i386
+libgsm0710-dev_1.2.2-2_i386
+libgsm0710mux-dev_0.11.2-1.1_i386
+libgsm1-dev_1.0.13-4_i386
+libgsmme-dev_1.10-13.2_i386
+libgsnmp0-dev_0.3.0-1.1_i386
+libgsql-dev_0.2.2-1.2+b1_i386
+libgss-dev_1.0.2-1_i386
+libgssdp-1.0-dev_0.12.2.1-2_i386
+libgssglue-dev_0.4-2_i386
+libgst-dev_3.2.4-2_i386
+libgstbuzztard-dev_0.5.0-2+deb7u1_i386
+libgstreamer-ocaml-dev_0.1.0-3+b1_i386
+libgstreamer-plugins-bad0.10-dev_0.10.23-7.1+deb7u1_i386
+libgstreamer-plugins-base0.10-dev_0.10.36-1.1_i386
+libgstreamer0.10-cil-dev_0.9.2-4_all
+libgstreamer0.10-dev_0.10.36-1.2_i386
+libgstrtspserver-0.10-dev_0.10.8-3_i386
+libgtest-dev_1.6.0-2_i386
+libgtextutils-dev_0.6.2-1_i386
+libgtg-dev_0.2+dfsg-1_i386
+libgtk-3-dev_3.4.2-7_i386
+libgtk-sharp-beans2.0-cil-dev_2.14.1-3_all
+libgtk-vnc-1.0-dev_0.5.0-3.1_i386
+libgtk-vnc-2.0-dev_0.5.0-3.1_i386
+libgtk2.0-cil-dev_2.12.10-5_i386
+libgtk2.0-dev_2.24.10-2_i386
+libgtkada2.24.1-dev_2.24.1-7_i386
+libgtkdatabox-0.9.1-1-dev_1:0.9.1.1-4_i386
+libgtkgl2.0-dev_2.0.1-2_i386
+libgtkglada2.24.1-dev_2.24.1-7_i386
+libgtkglarea-cil-dev_0.0.17-6_all
+libgtkglext1-dev_1.2.0-2_i386
+libgtkglextmm-x11-1.2-dev_1.2.0-4.1_i386
+libgtkhex-3-dev_3.4.1-1_i386
+libgtkhotkey-dev_0.2.1-3_i386
+libgtkhtml-4.0-dev_4.4.4-1_i386
+libgtkhtml-editor-3.14-dev_3.32.2-2.1_i386
+libgtkhtml-editor-4.0-dev_4.4.4-1_i386
+libgtkhtml3.14-cil-dev_2.26.0-8_i386
+libgtkhtml3.14-dev_3.32.2-2.1_i386
+libgtkimageview-dev_1.6.4+dfsg-0.1_i386
+libgtkmathview-dev_0.8.0-8_i386
+libgtkmm-2.4-dev_1:2.24.2-1_i386
+libgtkmm-3.0-dev_3.4.2-1_i386
+libgtkpod-dev_2.1.2-1_i386
+libgtksourceview-3.0-dev_3.4.2-1_i386
+libgtksourceview2-cil-dev_2.26.0-8_i386
+libgtksourceview2.0-dev_2.10.4-1_i386
+libgtksourceviewmm-3.0-dev_3.2.0-1_i386
+libgtkspell-3-dev_3.0.0~hg20110814-1_i386
+libgtkspell-dev_2.0.16-1_i386
+libgtop2-dev_2.28.4-3_i386
+libgts-dev_0.7.6+darcs110121-1.1_i386
+libguac-dev_0.6.0-2_i386
+libgucharmap-2-90-dev_1:3.4.1.1-2.1_i386
+libgudev-1.0-dev_175-7.2_i386
+libgudev1.0-cil-dev_0.1-3_all
+libguess-dev_1.1-1_i386
+libguestfs-dev_1:1.18.1-1+deb7u3_i386
+libguestfs-gobject-dev_1:1.18.1-1+deb7u3_i386
+libguestfs-ocaml-dev_1:1.18.1-1+deb7u3_i386
+libguichan-dev_0.8.2-10+b1_i386
+libgupnp-1.0-dev_0.18.4-1_i386
+libgupnp-av-1.0-dev_0.10.3-1_i386
+libgupnp-dlna-1.0-dev_0.6.6-1_i386
+libgupnp-igd-1.0-dev_0.2.1-2_i386
+libgusb-dev_0.1.3-5_i386
+libgutenprint-dev_5.2.9-1_i386
+libgutenprintui2-dev_5.2.9-1_i386
+libguytools2-dev_2.0.1-1.1_i386
+libgvnc-1.0-dev_0.5.0-3.1_i386
+libgweather-3-dev_3.4.1-1+build1_i386
+libgwenhywfar60-dev_4.3.3-1_i386
+libgwrap-runtime-dev_1.9.14-1.1_i386
+libgwyddion20-dev_2.28-2_i386
+libgxps-dev_0.2.2-2_i386
+libgyoto0-dev_0.0.3-5_i386
+libh323plus-dev_1.24.0~dfsg2-1_i386
+libhaildb-dev_2.3.2-1.2_i386
+libhal-dev_0.5.14-8_i386
+libhal-storage-dev_0.5.14-8_i386
+libhamlib++-dev_1.2.15.1-1_i386
+libhamlib-dev_1.2.15.1-1_i386
+libhandoff-dev_0.1-5_i386
+libhangul-dev_0.1.0-2_i386
+libharminv-dev_1.3.1-9_i386
+libhashkit-dev_1.0.8-1_i386
+libhawknl-dev_1.6.8+dfsg2-1_i386
+libhbaapi-dev_2.2.5-1_i386
+libhbalinux-dev_1.0.14-1_i386
+libhd-dev_16.0-2.2_i386
+libhdate-dev_1.6-1_i386
+libhdf4-alt-dev_4.2r4-13_i386
+libhdf4-dev_4.2r4-13_i386
+libhdf4g-dev_4.2r4-13_all
+libhdf5-dev_1.8.8-9_i386
+libhdf5-mpi-dev_1.8.8-9_i386
+libhdf5-mpich2-dev_1.8.8-9_i386
+libhdf5-openmpi-dev_1.8.8-9_i386
+libhdf5-serial-dev_1.8.8-9_i386
+libhdfeos-dev_2.17v1.00.dfsg.1-3_i386
+libhdhomerun-dev_20120405-1_i386
+libhe5-hdfeos-dev_5.1.13.dfsg.1-3_i386
+libheartbeat2-dev_1:3.0.5-3_i386
+libhepmc-dev_2.06.09-1_i386
+libhepmcfio-dev_2.06.09-1_i386
+libhepmcinterface8-dev_8.1.65-1_i386
+libherwig59-2-dev_20061220+dfsg3-2_i386
+libhesiod-dev_3.0.2-21_i386
+libhfsp-dev_1.0.4-12_i386
+libhighgui-dev_2.3.1-11_i386
+libhippocanvas-dev_0.3.1-1.1_i386
+libhiredis-dev_0.10.1-7_i386
+libhivex-dev_1.3.6-2_i386
+libhivex-ocaml-dev_1.3.6-2_i386
+libhkl-dev_4.0.3-4_i386
+libhmsbeagle-dev_1.0-6_i386
+libhocr-dev_0.10.17-1+b2_i386
+libhpdf-dev_2.2.1-1_i386
+libhpmud-dev_3.12.6-3.1+deb7u1_i386
+libhsclient-dev_1.1.0-7-g1044a28-1_i386
+libhtmlcxx-dev_0.85-2_i386
+libhtp-dev_0.2.6-2_i386
+libhtsengine-dev_1.06-1_i386
+libhttp-ocaml-dev_0.1.5-1+b2_i386
+libhttrack-dev_3.46.1-1_i386
+libhunspell-dev_1.3.2-4_i386
+libhwloc-dev_1.4.1-4_i386
+libhx-dev_3.12.1-1_i386
+libhyantes-dev_1.3.0-1_i386
+libhyena-cil-dev_0.5-2_all
+libhyphen-dev_2.8.3-2_i386
+libhypre-dev_2.8.0b-1_all
+libhz-dev_0.3.16-3_i386
+libi2c-dev_3.1.0-2_all
+libibcm-dev_1.0.4-1.1_i386
+libibcommon-dev_1.1.2-20090314-1_i386
+libibdm-dev_1.2-OFED-1.4.2-1.3_i386
+libibmad-dev_1.2.3-20090314-1.1_i386
+libibtk-dev_0.0.14-12_i386
+libibumad-dev_1.2.3-20090314-1.1_i386
+libibus-1.0-dev_1.4.1-9+deb7u1_i386
+libibus-qt-dev_1.3.1-2.1_i386
+libibverbs-dev_1.1.6-1_i386
+libical-dev_0.48-2_i386
+libicapapi-dev_1:0.1.6-1.1_i386
+libicc-dev_2.12+argyll1.4.0-8_i386
+libicc-utils-dev_1.6.4-1+b1_i386
+libice-dev_2:1.0.8-2_i386
+libicee-dev_1.2.0-6.1_i386
+libicns-dev_0.8.1-1_i386
+libiconv-hook-dev_0.0.20021209-10_i386
+libics-dev_1.5.2-3_i386
+libicu-dev_4.8.1.1-12+deb7u1_i386
+libid3-3.8.3-dev_3.8.3-15_i386
+libid3tag0-dev_0.15.1b-10_i386
+libident-dev_0.22-3_i386
+libidl-dev_0.8.14-0.2_i386
+libidn11-dev_1.25-2_i386
+libidn2-0-dev_0.8-2_i386
+libido-0.1-dev_0.3.4-1_i386
+libido3-0.1-dev_0.3.4-1_i386
+libidzebra-2.0-dev_2.0.44-3_i386
+libiec16022-dev_0.2.4-1_i386
+libiec61883-dev_1.2.0-0.1_i386
+libieee1284-3-dev_0.2.11-10_i386
+libifp-dev_1.0.0.2-5_i386
+libifstat-dev_1.1-8_i386
+libigraph0-dev_0.5.4-2_i386
+libigstk4-dev_4.4.0-2+b1_i386
+libijs-dev_0.35-8_i386
+libiksemel-dev_1.2-4_i386
+libilmbase-dev_1.0.1-4_i386
+libimdi-dev_1.4.0-8_i386
+libiml-dev_1.0.3-4.2_i386
+libimlib2-dev_1.4.5-1_i386
+libimobiledevice-dev_1.1.1-4_i386
+libindi-dev_0.9.1-2_i386
+libindicate-dev_0.6.92-1_i386
+libindicate-gtk-dev_0.6.92-1_i386
+libindicate-gtk0.1-cil-dev_0.6.92-1_all
+libindicate-gtk3-dev_0.6.92-1_i386
+libindicate-qt-dev_0.2.5.91-5_i386
+libindicate0.1-cil-dev_0.6.92-1_all
+libindicator-dev_0.5.0-1_i386
+libindicator-messages-status-provider-dev_0.6.0-1_i386
+libindicator3-dev_0.5.0-1_i386
+libindigo-dev_1.0.0-2_i386
+libinfinity-0.5-dev_0.5.2-6.1_i386
+libini-config-dev_0.1.3-2_i386
+libinifiles-ocaml-dev_1.2-2_i386
+libinnodb-dev_1.0.6.6750-1_i386
+libinotify-ocaml-dev_1.0-1+b3_i386
+libinotifytools0-dev_3.14-1_i386
+libinput-pad-dev_1.0.1-2_i386
+libinsighttoolkit3-dev_3.20.1+git20120521-3_i386
+libinstpatch-dev_1.0.0-3_i386
+libint-dev_1.1.4-1_i386
+libiodbc2-dev_3.52.7-2+deb7u1_i386
+libion-dev_3.0.1~dfsg1-1_i386
+libipa-hbac-dev_1.8.4-2_i386
+libipathverbs-dev_1.2-1_i386
+libipe-dev_7.1.2-1_i386
+libipmiconsole-dev_1.1.5-3_i386
+libipmidetect-dev_1.1.5-3_i386
+libipmimonitoring-dev_1.1.5-3_i386
+libipset-dev_6.12.1-1_i386
+libiptcdata0-dev_1.0.4-3_i386
+libircclient-dev_1.3+dfsg1-3_i386
+libirman-dev_0.4.4-2_i386
+libirrlicht-dev_1.7.3+dfsg1-4_i386
+libisajet758-3-dev_20061220+dfsg3-2_i386
+libiscsi-dev_1.4.0-3_i386
+libisl-dev_0.10-3_i386
+libiso9660-dev_0.83-4_i386
+libisoburn-dev_1.2.2-2_i386
+libisofs-dev_1.2.2-1_i386
+libitl-dev_0.7.0-3_i386
+libitl-gobject-dev_0.2-1_i386
+libitpp-dev_4.2-4_i386
+libitsol-dev_1.0.0-2_i386
+libivykis-dev_0.30.1-2_i386
+libiw-dev_30~pre9-8_i386
+libjack-dev_1:0.121.3+20120418git75e3e20b-2.1_i386
+libjack-jackd2-dev_1.9.8~dfsg.4+20120529git007cdc37-5_i386
+libjalali-dev_0.4.0-1.1_i386
+libjama-dev_1.2.4-2_all
+libjana-dev_0.0.0+git20091215.9ec1da8a-2+b4_i386
+libjana-ecal-dev_0.0.0+git20091215.9ec1da8a-2+b4_i386
+libjana-gtk-dev_0.0.0+git20091215.9ec1da8a-2+b4_i386
+libjansson-dev_2.3.1-2_i386
+libjasper-dev_1.900.1-13_i386
+libjaula-dev_1.4.0-3_i386
+libjavascriptcoregtk-1.0-dev_1.8.1-3.4_i386
+libjavascriptcoregtk-3.0-dev_1.8.1-3.4_i386
+libjbig-dev_2.0-2+deb7u1_i386
+libjbig2dec0-dev_0.11+20120125-1_i386
+libjconv-dev_2.8-6+b1_i386
+libjemalloc-dev_3.0.0-3_i386
+libjim-dev_0.73-3_i386
+libjpeg62-dev_6b1-3_i386
+libjpeg8-dev_8d-1_i386
+libjpgalleg4-dev_2:4.4.2-2.1_i386
+libjs-of-ocaml-dev_1.2-2_i386
+libjson-glib-dev_0.14.2-1_i386
+libjson-spirit-dev_4.04-1+b1_i386
+libjson-static-camlp4-dev_0.9.8-1+b5_i386
+libjson-wheel-ocaml-dev_1.0.6-2+b8_i386
+libjson0-dev_0.10-1.2_i386
+libjsoncpp-dev_0.6.0~rc2-3_i386
+libjte-dev_1.19-1_i386
+libjthread-dev_1.3.1-3_i386
+libjudy-dev_1.0.5-1_i386
+libjuman-dev_5.1-2.1_i386
+libk3b-dev_2.0.2-6_i386
+libkactivities-dev_4:4.8.4-1_i386
+libkakasi2-dev_2.3.5~pre1+cvs20071101-1_i386
+libkal-dev_0.9.0-1_i386
+libkarma-cil-dev_0.1.2-2.3_all
+libkarma-dev_0.1.2-2.3_i386
+libkate-dev_0.4.1-1_i386
+libkaya-gd-dev_0.4.4-6_i386
+libkaya-gl-dev_0.4.4-6_i386
+libkaya-mysql-dev_0.4.4-6_i386
+libkaya-ncurses-dev_0.4.4-6_i386
+libkaya-ncursesw-dev_0.4.4-6_i386
+libkaya-pgsql-dev_0.4.4-6_i386
+libkaya-sdl-dev_0.4.4-6_i386
+libkaya-sqlite3-dev_0.4.4-6_i386
+libkcddb-dev_4:4.8.4-2_i386
+libkdcraw-dev_4:4.8.4-1_i386
+libkdeedu-dev_4:4.8.4-1_i386
+libkdegames-dev_4:4.8.4-3_i386
+libkdtree++-dev_0.7.0-2_all
+libkernlib1-dev_20061220+dfsg3-2_i386
+libkexiv2-dev_4:4.8.4-1_i386
+libkeybinder-dev_0.2.2-4_i386
+libkeyutils-dev_1.5.5-3_i386
+libkibi-dev_0.1-1_i386
+libkipi-dev_4:4.8.4-1_i386
+libkiten-dev_4:4.8.4-1_i386
+libklatexformula3-dev_3.2.6-1_i386
+libklibc-dev_2.0.1-3.1_i386
+libkmfl-dev_0.9.8-1_i386
+libkmflcomp-dev_0.9.8-1_i386
+libkml-dev_1.3.0~r863-4.1_i386
+libkmod-dev_9-3_i386
+libkokyu-dev_6.0.3+dfsg-0.1_i386
+libkonq5-dev_4:4.8.4-2_i386
+libkonqsidebarplugin-dev_4:4.8.4-2_i386
+libkopete-dev_4:4.8.4-1+b1_i386
+libkosd2-dev_0.8.1-1_i386
+libkpathsea-dev_2012.20120628-4_i386
+libkqueue-dev_1.0.4-2_i386
+libkrb5-dev_1.10.1+dfsg-5+deb7u1_i386
+libksane-dev_4:4.8.4-1_i386
+libksba-dev_1.2.0-2_i386
+libktoblzcheck1-dev_1.39-1_i386
+libktorrent-dev_1.2.1-1_i386
+libktpcommoninternalsprivate-dev_0.4.0-1_i386
+libkvutils-dev_2.9.0-1_i386
+libkvutils2.2-dev_2.9.0-1_all
+libkwnn-dev_1.1.1~a021+cvs20100325-6_i386
+libkwwidgets1-dev_1.0.0~cvs20100930-8_i386
+libkxl0-dev_1.1.7-16_i386
+liblablgl-ocaml-dev_1.04-5+b3_i386
+liblablgtk-extras-ocaml-dev_1.0-1+b2_i386
+liblablgtk2-gl-ocaml-dev_2.14.2+dfsg-3_i386
+liblablgtk2-gnome-ocaml-dev_2.14.2+dfsg-3_i386
+liblablgtk2-ocaml-dev_2.14.2+dfsg-3_i386
+liblablgtkmathview-ocaml-dev_0.7.8-6+b1_i386
+liblablgtksourceview2-ocaml-dev_2.14.2+dfsg-3_i386
+libladr-dev_0.0.200902a-2.1_i386
+libladspa-ocaml-dev_0.1.4-1+b1_i386
+liblapack-dev_3.4.1+dfsg-1+deb70u1_i386
+liblapacke-dev_3.4.1+dfsg-1+deb70u1_i386
+liblas-dev_1.2.1-5+b1_i386
+liblash-compat-dev_1+dfsg0-3_all
+liblasi-dev_1.1.0-1_i386
+liblasso3-dev_2.3.6-2_i386
+liblastfm-dev_0.4.0~git20090710-2_i386
+liblastfm-ocaml-dev_0.3.0-2+b6_i386
+liblcgdm-dev_1.8.2-1+b2_i386
+liblcms1-dev_1.19.dfsg-1.2_i386
+liblcms2-dev_2.2+git20110628-2.2+deb7u1_i386
+libldap-ocaml-dev_2.1.8-8+b9_i386
+libldap2-dev_2.4.31-1+nmu2_i386
+libldb-dev_1:1.1.6-1_i386
+libldns-dev_1.6.13-1_i386
+libledit-ocaml-dev_2.03-1+b2_i386
+liblensfun-dev_0.2.5-2_i386
+libleptonica-dev_1.69-3.1_i386
+libleveldb-dev_0+20120530.gitdd0d562-1_i386
+liblfc-dev_1.8.2-1+b2_i386
+liblhapdf-dev_5.8.7+repack-1_i386
+liblhasa-dev_0.0.7-2_i386
+liblicense-dev_0.8.1-3_i386
+liblightdm-gobject-dev_1.2.2-4_i386
+liblightdm-qt-dev_1.2.2-4_i386
+liblilv-dev_0.14.2~dfsg0-4_i386
+liblinear-dev_1.8+dfsg-1_i386
+liblinebreak2-dev_2.1-1_i386
+liblink-grammar4-dev_4.7.4-2_i386
+liblinphone-dev_3.5.2-10_i386
+liblip-dev_2.0.0-1.1_i386
+liblircclient-dev_0.9.0~pre1-1_i386
+liblistaller-glib-dev_0.5.5-2_i386
+liblivemedia-dev_2012.05.17-1_i386
+libllvm-2.9-ocaml-dev_2.9+dfsg-7_i386
+libllvm-3.0-ocaml-dev_3.0-10_i386
+libllvm-3.1-ocaml-dev_3.1-1_i386
+libllvm-ocaml-dev_1:3.0-14+nmu2_i386
+liblo-dev_0.26~repack-7_i386
+liblo-ocaml-dev_0.1.0-1+b1_i386
+liblo10k1-dev_1.0.25-2_i386
+libloadpng4-dev_2:4.4.2-2.1_i386
+liblockdev1-dev_1.0.3-1.5_i386
+liblockfile-dev_1.09-5_i386
+liblodo3.0-dev_3.0.2+dfsg-4+b1_i386
+liblog4ada2-dev_1.2-3_i386
+liblog4c-dev_1.2.1-3_i386
+liblog4cplus-dev_1.0.4-1_i386
+liblog4cpp5-dev_1.0-4_i386
+liblog4cxx10-dev_0.10.0-1.2_i386
+liblog4net-cil-dev_1.2.10+dfsg-6_all
+liblog4shib-dev_1.0.4-1_i386
+liblog4tango4-dev_7.2.6+dfsg-14_i386
+liblogforwarderutils2-dev_2.7-1_i386
+liblognorm-dev_0.3.4-1_i386
+liblogservicecomponentbase2-dev_2.7-1_i386
+liblogservicetoolbase2-dev_2.7-1_i386
+liblogsys-dev_1.4.2-3_i386
+liblogthread-dev_3.0.12-3.2+deb7u2_i386
+libloki-dev_0.1.7-3_i386
+libloudmouth1-dev_1.4.3-9_i386
+liblouis-dev_2.4.1-1_i386
+liblouisutdml-dev_2.2.0-1_i386
+liblouisxml-dev_2.4.0-3_i386
+liblowpan-dev_0.2.2-2.1_all
+liblpsolve55-dev_5.5.0.13-7_i386
+liblqr-1-0-dev_0.4.1-2_i386
+liblrdf0-dev_0.4.0-5_i386
+liblrm2-dev_1.0.9+hg2665-1_i386
+liblrs-dev_0.42c-1+b1_i386
+liblscp-dev_0.5.6-6_i386
+libltcsmpte-dev_0.4.4-1_i386
+libltdl-dev_2.4.2-1.1_i386
+liblttctl-dev_0.89-05122011-1_i386
+liblttd-dev_0.89-05122011-1_i386
+liblttng-ust-dev_2.0.4-1_i386
+liblttoolbox3-3.1-0-dev_3.1.0-1.1_i386
+liblttvtraceread-2.6-dev_0.12.38-21032011-1+b1_i386
+liblua5.1-0-dev_5.1.5-4_i386
+liblua5.1-apr-dev_0.23.2-1_all
+liblua5.1-bitop-dev_1.0.2-1_all
+liblua5.1-cgi-dev_5.1.4+dfsg-2_all
+liblua5.1-copas-dev_1.1.6-5_all
+liblua5.1-curl-dev_0.3.0-7_all
+liblua5.1-cyrussasl-dev_1.0.0-4_all
+liblua5.1-event-dev_0.4.1-2_all
+liblua5.1-expat-dev_1.2.0-5+deb7u1_all
+liblua5.1-filesystem-dev_1.5.0+16+g84f1af5-1_all
+liblua5.1-leg-dev_0.1.2-8_all
+liblua5.1-logging-dev_1.2.0-1_all
+liblua5.1-lpeg-dev_0.10.2-5_all
+liblua5.1-md5-dev_1.1.2-6_all
+liblua5.1-oocairo-dev_1.4-1.2_i386
+liblua5.1-oopango-dev_1.1-1_i386
+liblua5.1-orbit-dev_2.2.0+dfsg1-1_all
+liblua5.1-posix-dev_5.1.19-2_all
+liblua5.1-rex-onig-dev_2.6.0-2_all
+liblua5.1-rex-pcre-dev_2.6.0-2_all
+liblua5.1-rex-posix-dev_2.6.0-2_all
+liblua5.1-rings-dev_1.2.3-1_all
+liblua5.1-rrd-dev_1.4.7-2_i386
+liblua5.1-sec-dev_0.4.1-1_all
+liblua5.1-soap-dev_3.0-3_all
+liblua5.1-socket-dev_2.0.2-8_all
+liblua5.1-sql-mysql-dev_2.3.0-1+build0_all
+liblua5.1-sql-postgres-dev_2.3.0-1+build0_all
+liblua5.1-sql-sqlite3-dev_2.3.0-1+build0_all
+liblua5.1-svn-dev_0.4.0-7_all
+liblua5.1-wsapi-fcgi-dev_1.5-3_all
+liblua5.1-xmlrpc-dev_1.2.1-5_all
+liblua5.1-zip-dev_1.2.3-11_all
+liblua5.2-dev_5.2.1-3_i386
+liblua50-dev_5.0.3-6_i386
+libluabind-dev_0.9.1+dfsg-5_i386
+liblualib50-dev_5.0.3-6_i386
+liblunar-1-dev_2.0.1-2.2_i386
+liblunar-date-dev_2.4.0-1_i386
+liblv2dynparam1-dev_2-5_i386
+liblvm2-dev_2.02.95-8_i386
+liblwipv6-dev_1.5a-2_i386
+liblwt-glib-ocaml-dev_2.3.2-1+b3_i386
+liblwt-ocaml-dev_2.3.2-1+b3_i386
+liblwt-ssl-ocaml-dev_2.3.2-1+b3_i386
+liblz-dev_1.3-2_i386
+liblzma-dev_5.1.1alpha+20120614-2_i386
+liblzo2-dev_2.06-1_i386
+libm17n-dev_1.6.3-2_i386
+libm17n-im-config-dev_0.9.0-3_i386
+libm4ri-dev_0.0.20080521-2_i386
+libmaa-dev_1.3.1-1_i386
+libmad-ocaml-dev_0.4.4-1+b1_i386
+libmad0-dev_0.15.1b-7_i386
+libmadlib-dev_1.3.0-2.1_i386
+libmagic-dev_5.11-2+deb7u3_i386
+libmagic-ocaml-dev_0.7.3-5+b3_i386
+libmagick++-dev_8:6.7.7.10-5+deb7u3_i386
+libmagickcore-dev_8:6.7.7.10-5+deb7u3_i386
+libmagickwand-dev_8:6.7.7.10-5+deb7u3_i386
+libmagics++-dev_2.14.11-4_i386
+libmailutils-dev_1:2.99.97-3_i386
+libmalaga-dev_7.12-4_i386
+libmaloc-dev_0.2-2.3_i386
+libmapi-dev_1:1.0-3_i386
+libmapiadmin-dev_1:1.0-3_i386
+libmapipp-dev_1:1.0-3_i386
+libmapiproxy-dev_1:1.0-3_i386
+libmapistore-dev_1:1.0-3_i386
+libmapnik-dev_2.0.0+ds1-3_all
+libmapnik2-dev_2.0.0+ds1-3+b4_i386
+libmarble-dev_4:4.8.4-3_i386
+libmarkdown2-dev_2.1.3-3_i386
+libmatchbox-dev_1.9-osso8-3_i386
+libmath++-dev_0.0.4-4_i386
+libmatheval-dev_1.1.8-1_i386
+libmathlib2-dev_20061220+dfsg3-2_i386
+libmatio-dev_1.3.4-4_i386
+libmatrixssl1.8-dev_1.8.8-1_i386
+libmatroska-dev_1.3.0-2_i386
+libmbt0-dev_3.2.8-1_i386
+libmcpp-dev_2.7.2-1.1_i386
+libmcrypt-dev_2.5.8-3.1_i386
+libmcs-dev_0.7.2-2.1_i386
+libmd3-dev_0.1.92-4_i386
+libmdc2-dev_0.10.7-1+b2_i386
+libmdds-dev_0.5.4-1_all
+libmdsp-dev_0.11-10_i386
+libmeanwhile-dev_1.0.2-4_i386
+libmecab-dev_0.99.3-3_i386
+libmed-dev_3.0.3-3_i386
+libmedc-dev_3.0.3-3_i386
+libmediainfo-dev_0.7.58-1_i386
+libmediastreamer-dev_3.5.2-10_i386
+libmedimport-dev_3.0.3-3_i386
+libmeep-dev_1.1.1-8+deb7u1_i386
+libmeep-lam4-dev_1.1.1-10~deb7u1_i386
+libmeep-mpi-default-dev_1.1.1-10~deb7u1_i386
+libmeep-mpich2-dev_1.1.1-10~deb7u1_i386
+libmeep-openmpi-dev_1.1.1-9~deb7u2_i386
+libmelt-ocaml-dev_1.4.0-1_i386
+libmemcache-dev_1.4.0.rc2-1_i386
+libmemcached-dev_1.0.8-1_i386
+libmemphis-0.2-dev_0.2.3-2_i386
+libmenhir-ocaml-dev_20120123.dfsg-1_i386
+libmenu-cache1-dev_0.3.3-1_i386
+libmercator-0.3-dev_0.3.0-2_i386
+libmeschach-dev_1.2b-13_i386
+libmetacity-dev_1:2.34.3-4_i386
+libmgl-dev_1.11.2-17_i386
+libmhash-dev_0.9.9.9-1.1_i386
+libmicrohttpd-dev_0.9.20-1+deb7u1_i386
+libmigemo-dev_20110227-7_i386
+libmikmatch-ocaml-dev_1.0.4-1+b1_i386
+libmikmod2-dev_3.1.12-5_i386
+libmilter-dev_8.14.4-4_i386
+libmimedir-dev_0.5.1-4_i386
+libmimedir-gnome-dev_0.4.2-5_i386
+libmimelib1-dev_5:1.1.4-2_i386
+libmimetic-dev_0.9.7-3_i386
+libmimic-dev_1.0.4-2.1_i386
+libminc-dev_2.1.10-1+b1_i386
+libming-dev_1:0.4.4-1.1_i386
+libmini18n-dev_0.2.1-1_i386
+libminidjvu-dev_0.8.svn.2010.05.06+dfsg-0.2_i386
+libminiupnpc-dev_1.5-2_i386
+libmission-control-plugins-dev_1:5.12.3-1_i386
+libmkv-dev_0.6.5.1-1_i386
+libmlpcap-ocaml-dev_0.9-16_i386
+libmlpost-ocaml-dev_0.8.1-3_i386
+libmlt++-dev_0.8.0-4_i386
+libmlt-dev_0.8.0-4_i386
+libmlx4-dev_1.0.4-1_i386
+libmm-dev_1.4.2-4_i386
+libmm-ocaml-dev_0.2.0-1+b1_i386
+libmmpong0.9-dev_0.9.1-2.1_i386
+libmms-dev_0.6.2-3_i386
+libmng-dev_1.0.10-3_i386
+libmnl-dev_1.0.3-3_i386
+libmodbus-dev_3.0.3-1_i386
+libmodglue1-dev_1.17-2.1_all
+libmodplug-dev_1:0.8.8.4-3+deb7u1+git20130828_all
+libmoe-dev_1.5.8-1_i386
+libmongo-client-dev_0.1.5-1+deb7u1_i386
+libmono-2.0-dev_2.10.8.1-8_i386
+libmono-addins-cil-dev_0.6.2-2_all
+libmono-addins-gui-cil-dev_0.6.2-2_all
+libmono-addins-msbuild-cil-dev_0.6.2-2_all
+libmono-cecil-cil-dev_0.9.5+dfsg-2_all
+libmono-cecil-flowanalysis-cil-dev_0.1~vcs20110809.r1.b34edf6-2_all
+libmono-cil-dev_2.10.8.1-8_all
+libmono-reflection-cil-dev_1.0+git20110407+d2343843-2_all
+libmono-uia-cil-dev_2.1-4_all
+libmono-upnp-cil-dev_0.1.2-1_all
+libmono-zeroconf-cil-dev_0.9.0-4_all
+libmonogame-cil-dev_2.5.1+dfsg-3_all
+libmopac7-dev_1.15-5_i386
+libmorph-dev_1:20090926_i386
+libmosquitto0-dev_0.15-2_all
+libmosquittopp0-dev_0.15-2_all
+libmount-dev_2.20.1-5.3_i386
+libmowgli-dev_1.0.0-1_i386
+libmozjs-dev_24.4.0esr-1~deb7u2_i386
+libmozjs185-dev_1.8.5-1.0.0+dfsg-4_i386
+libmp3lame-dev_3.99.5+repack1-3_i386
+libmp3lame-ocaml-dev_0.3.1-1+b1_i386
+libmp3splt-dev_0.7.2-2_i386
+libmp4v2-dev_2.0.0~dfsg0-1_i386
+libmpc-dev_0.9-4_i386
+libmpcdec-dev_2:0.1~r459-4_i386
+libmpd-dev_0.20.0-1.1_i386
+libmpdclient-dev_2.3-1_i386
+libmpeg2-4-dev_0.4.1-3_i386
+libmpeg3-dev_1.5.4-5_i386
+libmpfi-dev_1.5.1-1_i386
+libmpfr-dev_3.1.0-5_i386
+libmpg123-dev_1.14.4-1_i386
+libmpich2-dev_1.4.1-4.2_i386
+libmpikmeans-dev_1.5-1+b1_i386
+libmrml1-dev_0.1.14-12_i386
+libmrmpi-dev_1.0~20110620.dfsg-2_i386
+libmrss0-dev_0.19.2-3_i386
+libmsgpack-dev_0.5.7-2_i386
+libmsn-dev_4.2-2_i386
+libmsv-dev_0.0.0-1_i386
+libmtbl-dev_0.2-1_i386
+libmtcp-dev_1.2.5-1_i386
+libmtdev-dev_1.1.2-1_i386
+libmthca-dev_1.0.6-1_i386
+libmtp-dev_1.1.3-35-g0ece104-5_i386
+libmudflap0-4.4-dev_4.4.7-2_i386
+libmudflap0-4.6-dev_4.6.3-14_i386
+libmudflap0-4.7-dev_4.7.2-5_i386
+libmulticobex1-dev_0.23-1.1_i386
+libmumps-dev_4.10.0.dfsg-3_i386
+libmumps-ptscotch-dev_4.10.0.dfsg-3_i386
+libmumps-scotch-dev_4.10.0.dfsg-3_i386
+libmumps-seq-dev_4.10.0.dfsg-3_i386
+libmunge-dev_0.5.10-1_i386
+libmuparser-dev_2.1.0-3_i386
+libmupdf-dev_0.9-2_i386
+libmupen64plus-dev_1.99.5-6_all
+libmuroar-dev_0.1.8-2_i386
+libmusic-dev_1.0.7-1.2_i386
+libmusicbrainz3-dev_3.0.2-2.1_i386
+libmusicbrainz5-dev_5.0.1-2_i386
+libmutter-dev_3.4.1-5_i386
+libmx-dev_1.4.6-1_i386
+libmxml-dev_2.6-2_i386
+libmyproxy-dev_5.6-1_i386
+libmysql++-dev_3.1.0-2+b1_i386
+libmysql-cil-dev_6.4.3-2_all
+libmysql-ocaml-dev_1.1.1-1_i386
+libmysqlclient-dev_5.5.35+dfsg-0+wheezy1_i386
+libmysqlcppconn-dev_1.1.0-4+b1_i386
+libmysqld-dev_5.5.35+dfsg-0+wheezy1_i386
+libmythes-dev_2:1.2.2-1_i386
+libnabrit-dev_0.4.1-1_i386
+libnacl-dev_20110221-4_i386
+libnacore-dev_0.4.0-3_i386
+libnanohttp-dev_1.1.0-17.1_i386
+libnatpmp-dev_20110808-3_i386
+libnautilus-extension-dev_3.4.2-1+build1_i386
+libnbio-dev_0.30-1_i386
+libncap-dev_1.9.2-1+b2_i386
+libncbi6-dev_6.1.20120620-2_i386
+libncp-dev_2.2.6-9_i386
+libncurses5-dev_5.9-10_i386
+libncursesada2-dev_5.9.20110404-7_i386
+libncursesw5-dev_5.9-10_i386
+libndesk-dbus-glib1.0-cil-dev_0.4.1-4_all
+libndesk-dbus1.0-cil-dev_0.6.0-6_all
+libndr-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libndr-standard-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libnecpp-dev_1.5.0+cvs20101003-2.1_i386
+libneon27-dev_0.29.6-3_i386
+libneon27-gnutls-dev_0.29.6-3_i386
+libnes-dev_1.1.3-1_i386
+libnet1-dev_1.1.4-2.1_i386
+libnet6-1.3-dev_1:1.3.14-1_i386
+libnetcdf-dev_1:4.1.3-6+b1_i386
+libnetcf-dev_0.1.9-2_i386
+libnetclasses-dev_1.06.dfsg-5+b3_i386
+libnetfilter-conntrack-dev_1.0.1-1_i386
+libnetfilter-cttimeout-dev_1.0.0-1_i386
+libnetfilter-log-dev_1.0.0-1_i386
+libnetfilter-queue-dev_0.0.17-1_i386
+libnethttpd-ocaml-dev_3.5.1-1_i386
+libnetpbm10-dev_2:10.0-15+b1_i386
+libnetpbm9-dev_2:10.0-15+b1_i386
+libnetsvcs-dev_6.0.3+dfsg-0.1_i386
+libnewlib-dev_1.18.0-6.2_i386
+libnewmat10-dev_1.10.4-5_i386
+libnewt-dev_0.52.14-11.1_i386
+libnewtonsoft-json-cil-dev_4.5r6-1_all
+libnexus0-dev_4.2.1-svn1614-1+b2_i386
+libnfnetlink-dev_1.0.0-1.1_i386
+libnfo-dev_1.0.1-1_i386
+libnfs-dev_1.3.0-2_i386
+libnfsidmap-dev_0.25-4_i386
+libnice-dev_0.1.2-1_i386
+libnids-dev_1.23-2_i386
+libnifti-dev_2.0.0-1_i386
+libnih-dbus-dev_1.0.3-4.1_i386
+libnih-dev_1.0.3-4.1_i386
+libnini-cil-dev_1.1.0+dfsg.2-4_all
+libnjb-dev_2.2.7~dfsg0-3_i386
+libnl-3-dev_3.2.7-4_i386
+libnl-cli-3-dev_3.2.7-4_i386
+libnl-dev_1.1-7_i386
+libnl-genl-3-dev_3.2.7-4_i386
+libnl-nf-3-dev_3.2.7-4_i386
+libnl-route-3-dev_3.2.7-4_i386
+libnm-glib-dev_0.9.4.0-10_i386
+libnm-glib-vpn-dev_0.9.4.0-10_i386
+libnm-gtk-dev_0.9.4.1-5_i386
+libnm-util-dev_0.9.4.0-10_i386
+libnmz7-dev_2.0.21-6_i386
+libnoise-dev_1.0.0+nmu1_i386
+libnotify-cil-dev_0.4.0~r3032-6_all
+libnotify-dev_0.7.5-1_i386
+libnotmuch-dev_0.13.2-1_i386
+libnova-dev_0.14.0-2_i386
+libnpth0-dev_0.90-2_i386
+libnsbmp0-dev_0.0.1-1.1_i386
+libnsgif0-dev_0.0.1-1.1_i386
+libnspr4-dev_2:4.9.2-1+deb7u1_i386
+libnss3-dev_2:3.14.5-1_i386
+libntfs-dev_2.0.0-1+b1_i386
+libntl-dev_5.5.2-2_i386
+libntlm0-dev_1.2-1_i386
+libntrack-dev_016-1.1_i386
+libntrack-glib-dev_016-1.1_i386
+libntrack-gobject-dev_016-1.1_i386
+libntrack-qt4-dev_016-1.1_i386
+libnuclient-dev_2.4.3-2.2_i386
+libnuma-dev_2.0.8~rc4-1_i386
+libnunit-cil-dev_2.6.0.12051+dfsg-2_all
+libnussl-dev_2.4.3-2.2_i386
+libnvtt-dev_2.0.8-1+dfsg-2_i386
+libnxcl-dev_0.9-3.1_i386
+libnxml0-dev_0.18.3-4_i386
+libnzb-dev_0.0.20050629-6.1_i386
+liboasis-ocaml-dev_0.2.0-6_i386
+liboasis3-dev_3.3.beta.dfsg.1-8+b1_i386
+liboath-dev_1.12.4-1_i386
+liboauth-dev_0.9.4-3.1_i386
+libobby-0.4-dev_0.4.8-1_i386
+libobexftp0-dev_0.23-1.1_i386
+libobrowser-ocaml-dev_1.1.1+dfsg-1+b9_i386
+libobus-ocaml-dev_1.1.3-1+b8_i386
+libocamlbricks-ocaml-dev_0.50.1-4+b5_i386
+libocamlgraph-ocaml-dev_1.8.2-2_i386
+libocamlgraph-viewer-ocaml-dev_1.8.2-2_i386
+libocamlgsl-ocaml-dev_0.6.0-7+b2_i386
+libocamlnet-gtk2-ocaml-dev_3.5.1-1_i386
+libocamlnet-ocaml-dev_3.5.1-1_i386
+libocamlnet-ssl-ocaml-dev_3.5.1-1_i386
+libocamlodbc-ocaml-dev_2.15-5+b3_i386
+libocamlviz-ocaml-dev_1.01-2+b2_i386
+libocas-dev_0.93-1_i386
+liboce-foundation-dev_0.9.1-3_i386
+liboce-modeling-dev_0.9.1-3_all
+liboce-ocaf-dev_0.9.1-3_all
+liboce-ocaf-lite-dev_0.9.1-3_all
+liboce-visualization-dev_0.9.1-3_all
+libocpf-dev_1:1.0-3_i386
+libocrad-dev_0.22~rc1-2_i386
+libocsigen-ocaml-dev_1.3.4-2+b12_i386
+libocsigen-xhtml-ocaml-dev_1.3.4-2+b12_i386
+libocsigenserver-ocaml-dev_2.1-1_i386
+liboctave-dev_3.6.2-5+deb7u1_i386
+libode-dev_2:0.11.1-4_i386
+libode-sp-dev_2:0.11.1-4_i386
+libodin-dev_1.8.5-2_i386
+libodn-ocaml-dev_0.0.8-1_i386
+libofa0-dev_0.9.3-5_i386
+libofapi-dev_0git20070620-6_i386
+libofdt-dev_1.3.6-1_i386
+libofetion-dev_2.2.2-1_i386
+libofx-dev_1:0.9.4-2.1_i386
+libogdi3.2-dev_3.2.0~beta2-7_i386
+libogg-dev_1.3.0-4_i386
+libogg-ocaml-dev_0.4.3-1+b1_i386
+liboggkate-dev_0.4.1-1_i386
+liboggplay1-dev_0.2.1~git20091227-1.2_i386
+liboggz2-dev_1.1.1-1_i386
+liboglappth-dev_1.0.0-2_i386
+libogre-1.8-dev_1.8.0+dfsg1-3_i386
+libogre-dev_1.7.4+dfsg1-7_i386
+liboil0.3-dev_0.3.17-2_i386
+libois-dev_1.3.0+dfsg0-5_i386
+libomhacks-dev_0.16-1_i386
+libomnievents-dev_1:2.6.2-2_i386
+libomniorb4-dev_4.1.6-2_i386
+libomnithread3-dev_4.1.6-2_i386
+libomxil-bellagio-dev_0.9.3-1+b1_i386
+libonig-dev_5.9.1-1_i386
+liboobs-1-dev_3.0.0-1_i386
+liboop-dev_1.0-9_i386
+libooptools-dev_2.7-1_i386
+libopal-dev_3.10.4~dfsg-3_i386
+libopenafs-dev_1.6.1-3+deb7u2_i386
+libopenais-dev_1.1.4-4.1_i386
+libopenal-dev_1:1.14-4_i386
+libopenbabel-dev_2.3.1+dfsg-4_i386
+libopenblas-dev_0.1.1-6+deb7u3_i386
+libopencc-dev_0.3.0-3_i386
+libopenconnect-dev_3.20-4_i386
+libopencore-amrnb-dev_0.1.3-2_i386
+libopencore-amrwb-dev_0.1.3-2_i386
+libopencryptoki-dev_2.3.1+dfsg-3_i386
+libopencsg-dev_1.3.2-2_i386
+libopenct1-dev_0.6.20-1.2_i386
+libopencv-calib3d-dev_2.3.1-11_i386
+libopencv-contrib-dev_2.3.1-11_i386
+libopencv-core-dev_2.3.1-11_i386
+libopencv-dev_2.3.1-11_i386
+libopencv-features2d-dev_2.3.1-11_i386
+libopencv-flann-dev_2.3.1-11_i386
+libopencv-gpu-dev_2.3.1-11_i386
+libopencv-highgui-dev_2.3.1-11_i386
+libopencv-imgproc-dev_2.3.1-11_i386
+libopencv-legacy-dev_2.3.1-11_i386
+libopencv-ml-dev_2.3.1-11_i386
+libopencv-objdetect-dev_2.3.1-11_i386
+libopencv-video-dev_2.3.1-11_i386
+libopendkim-dev_2.6.8-4_i386
+libopenexr-dev_1.6.1-6_i386
+libopenhpi-dev_2.14.1-1.2_i386
+libopenigtlink1-dev_1.9.2~svn7468-1_i386
+libopenimageio-dev_1.0.5+dfsg0-1_i386
+libopenipmi-dev_2.0.16-1.3_i386
+libopenjpeg-dev_1.3+dfsg-4.7_i386
+libopenmeeg-dev_2.0.0.dfsg-5_i386
+libopenmpi-dev_1.4.5-1_i386
+libopenobex1-dev_1.5-2_i386
+libopenr2-dev_1.3.2-1.1_i386
+libopenraw-dev_0.0.9-3+b1_i386
+libopenrawgnome-dev_0.0.9-3+b1_i386
+libopenscap-dev_0.8.0-4+b1_i386
+libopenscenegraph-dev_3.0.1-4_i386
+libopenslide-dev_3.2.6-2_i386
+libopensm2-dev_3.2.6-20090317-2.1_i386
+libopenthreads-dev_3.0.1-4_i386
+libopentk-cil-dev_1.0.20101006+dfsg1-1_all
+libopentoken3-dev_4.0b-3_i386
+libopenturns-dev_1.0-4_i386
+libopenusb-dev_1.1.0-2_i386
+libopenvg1-mesa-dev_8.0.5-4+deb7u2_i386
+libopenvrml-dev_0.18.9-5+deb7u1_i386
+libopenwalnut1-dev_1.2.5-1.1+b1_i386
+liboping-dev_1.6.2-1_i386
+libopkele-dev_2.0.4-5.3_i386
+libopts25-dev_1:5.12-0.1_i386
+libopus-dev_0.9.14+20120615-1+nmu1_i386
+liborange-dev_0.4-2_i386
+liborbit2-dev_1:2.14.19-0.1_i386
+liborc-0.4-dev_1:0.4.16-2_i386
+liborigin-dev_20080225-2.1_i386
+liborigin2-dev_2:20110117-1+b2_i386
+libortp-dev_3.5.2-10_i386
+liboscpack-dev_1.0.2-1_i386
+libosgearth-dev_2.0+dfsg-4+b3_i386
+libosinfo-1.0-dev_0.1.1-1_i386
+libosip2-dev_3.6.0-4_i386
+libosl-dev_0.5.0-1_i386
+libosmesa6-dev_8.0.5-4+deb7u2_i386
+libosmgpsmap-dev_0.7.3-3_i386
+libosmium-dev_0.0~20111213-g7f3500a-3+b2_i386
+libosmpbf-dev_1.2.1-3_i386
+libosp-dev_1.5.2-10_i386
+libosptk3-dev_3.4.2-1+b1_i386
+libossim-dev_1.7.21-4_i386
+libossp-sa-dev_1.2.6-1_i386
+libossp-uuid-dev_1.6.2-1.3_i386
+libostyle-dev_1.4devel1-20.1+b1_i386
+libotcl1-dev_1.14+dfsg-2_i386
+libotf-dev_0.9.12-2_i386
+libotf-trace-dev_1.10.2+dfsg-2_i386
+libotpw-dev_1.3-2_i386
+libotr2-dev_3.2.1-1+deb7u1_i386
+libots-dev_0.5.0-2.1_i386
+libounit-ocaml-dev_1.1.1-1_i386
+libow-dev_2.8p15-1_i386
+libowfat-dev_0.28-6_i386
+libowfat-dietlibc-dev_0.28-6_i386
+libownet-dev_2.8p15-1_i386
+libp11-dev_0.2.8-2_i386
+libp11-kit-dev_0.12-3_i386
+libpackagekit-glib2-dev_0.7.6-3_i386
+libpackagekit-qt2-dev_0.7.6-3_i386
+libpacketdump3-dev_3.0.14-1_i386
+libpacklib-lesstif1-dev_20061220+dfsg3-2_i386
+libpacklib1-dev_20061220+dfsg3-2_i386
+libpacparser-dev_1.3.0-2_i386
+libpam-ocaml-dev_1.1-4+b3_i386
+libpam0g-dev_1.1.3-7.1_i386
+libpanel-applet-4-dev_3.4.2.1-4_i386
+libpango1.0-dev_1.30.0-1_i386
+libpangomm-1.4-dev_2.28.4-1_i386
+libpano13-dev_2.9.18+dfsg-5_i386
+libpantomime1.2-dev_1.2.0~pre3+snap20071004+dfsg-4+b1_i386
+libpaper-dev_1.1.24+nmu2_i386
+libpaps-dev_0.6.8-6_i386
+libpaq-dev_1.0.4-3+b1_i386
+libpar2-0-dev_0.2.1-1_i386
+libpari-dev_2.5.1-2_i386
+libparpack2-dev_3.1.1-2.1_i386
+libparrot-dev_4.0.0-3_i386
+libparser++-dev_0.2.3-2_all
+libparted0-dev_2.3-12_i386
+libpasswdqc-dev_1.2.0-1_all
+libpath-utils-dev_0.1.3-2_i386
+libpathfinder-dev_1.1.3-0.4+b1_i386
+libpawlib-lesstif3-dev_1:2.14.04.dfsg.2-8_i386
+libpawlib2-dev_1:2.14.04.dfsg.2-8_i386
+libpcap-dev_1.3.0-1_all
+libpcap0.8-dev_1.3.0-1_i386
+libpcapnav0-dev_0.8-1_i386
+libpci-dev_1:3.1.9-6_i386
+libpciaccess-dev_0.13.1-2_i386
+libpcl1-dev_1.6-1_i386
+libpcre++-dev_0.9.5-5.1_i386
+libpcre-ocaml-dev_6.2.5-1_i386
+libpcre3-dev_1:8.30-5_i386
+libpcscada2-dev_0.7.1-4_i386
+libpcsclite-dev_1.8.4-1+deb7u1_i386
+libpdflib804-2-dev_20061220+dfsg3-2_i386
+libpe-rules2-dev_1.1.7-1_i386
+libpe-status3-dev_1.1.7-1_i386
+libpeas-dev_1.4.0-2_i386
+libpengine3-dev_1.1.7-1_i386
+libperl-dev_5.14.2-21+deb7u1_i386
+libperl4caml-ocaml-dev_0.9.5-4+b4_i386
+libpetsc3.2-dev_3.2.dfsg-6_i386
+libpfqueue-dev_0.5.6-8_i386
+libpfs-dev_1.8.5-1_i386
+libpgm-dev_5.1.118-1~dfsg-0.1_i386
+libpgocaml-ocaml-dev_1.5-2_i386
+libpgpool-dev_3.1.3-5_i386
+libpgtcl-dev_1:1.5-6_i386
+libphash0-dev_0.9.4-1.2_i386
+libphat-dev_0.4.1-5_i386
+libphobos-4.4-dev_1.063-4.4.7-1_i386
+libphobos2-4.6-dev_0.29.1-4.6.3-2_i386
+libphone-ui-dev_1:0.0.1+git20110825-3_i386
+libphone-utils-dev_0.1+git20110523-2.1_i386
+libphonon-dev_4:4.6.0.0-3_i386
+libphononexperimental-dev_4:4.6.0.0-3_i386
+libphotos202-dev_20061220+dfsg3-2_i386
+libphtools2-dev_20061220+dfsg3-2_i386
+libphysfs-dev_2.0.2-6_i386
+libpiano-dev_2012.05.06-2_i386
+libpigment0.3-dev_0.3.17-1_i386
+libpils2-dev_1.0.9+hg2665-1_i386
+libpinyin0-dev_0.6.91-1_i386
+libpion-common-dev_4.0.7+dfsg-3.1_i386
+libpion-net-dev_4.0.7+dfsg-3.1_i386
+libpipeline-dev_1.2.1-1_i386
+libpisock-dev_0.12.5-5_i386
+libpixman-1-dev_0.26.0-4+deb7u1_i386
+libpkcs11-helper1-dev_1.09-1_i386
+libplayer-dev_2.0.1-2.1_i386
+libplayerc++3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayerc3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayercommon3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayercore3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayerdrivers3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayerinterface3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayerjpeg3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayertcp3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayerwkb3.0-dev_3.0.2+dfsg-4+b1_i386
+libplib-dev_1.8.5-6_i386
+libplist++-dev_1.8-1_i386
+libplist-dev_1.8-1_i386
+libpload-dev_1.4.2-3_i386
+libplot-dev_2.6-3_i386
+libploticus0-dev_2.41-5_i386
+libplotmm-dev_0.1.2-2_i386
+libplplot-ada0-dev_5.9.9-5_i386
+libplplot-dev_5.9.9-5_i386
+libplumb2-dev_1.0.9+hg2665-1_i386
+libplumbgpl2-dev_1.0.9+hg2665-1_i386
+libpmap3.0-dev_3.0.2+dfsg-4+b1_i386
+libpmi0-dev_2.3.4-2+b1_i386
+libpmount-dev_0.0.16_i386
+libpng++-dev_0.2.5-1_all
+libpng12-dev_1.2.49-1_i386
+libpnglite-dev_0.1.17-1_i386
+libpoco-dev_1.3.6p1-4_i386
+libpodofo-dev_0.9.0-1.1+b1_i386
+libpoker-eval-dev_138.0-1_i386
+libpolarssl-dev_1.2.9-1~deb7u2_i386
+libpoldiff-dev_3.3.7-3_i386
+libpolkit-agent-1-dev_0.105-3_i386
+libpolkit-backend-1-dev_0.105-3_i386
+libpolkit-gobject-1-dev_0.105-3_i386
+libpolkit-qt-1-dev_0.103.0-1_i386
+libpolybori-dev_0.5~rc1-2.2_i386
+libpolylib64-dev_5.22.5-3+dfsg_i386
+libpolyml-dev_5.2.1-1.1_i386
+libpolyorb2-dev_2.8~20110207-5.1_i386
+libpomp-dev_1.1+dfsg-2_i386
+libpoppler-cil-dev_0.0.3-2_all
+libpoppler-cpp-dev_0.18.4-6_i386
+libpoppler-dev_0.18.4-6_i386
+libpoppler-glib-dev_0.18.4-6_i386
+libpoppler-private-dev_0.18.4-6_i386
+libpoppler-qt4-dev_0.18.4-6_i386
+libpopplerkit-dev_0.0.20051227svn-7+b1_i386
+libpopt-dev_1.16-7_i386
+libportaudio-dev_18.1-7.1_i386
+libportaudio-ocaml-dev_0.2.0-1+b1_i386
+libportmidi-dev_1:184-2.1_i386
+libportsmf-dev_0.1~svn20101010-3_i386
+libpostgresql-ocaml-dev_1.18.0-1_i386
+libpostproc-dev_6:0.8.10-1_i386
+libpotrace-dev_1.10-1_i386
+libpowerman0-dev_2.3.5-1_i386
+libppd-dev_2:0.10-7.1_i386
+libppl0.11-dev_0.11.2-8_i386
+libpq-dev_9.1.13-0wheezy1_i386
+libpqxx3-dev_3.1-1.1_i386
+libprelude-dev_1.0.0-9_i386
+libpreludedb-dev_1.0.0-1.1+b2_i386
+libpresage-dev_0.8.8-1_i386
+libpri-dev_1.4.12-2_i386
+libprinterconf-dev_0.5-12_i386
+libprintsys-dev_0.6-13_i386
+libprison-dev_1.0+dfsg-1_i386
+libprocps0-dev_1:3.3.3-3_i386
+libproj-dev_4.7.0-2_i386
+libprojectm-dev_2.1.0+dfsg-1_i386
+libprojectm-qt-dev_2.1.0+dfsg-1_i386
+libprotobuf-c0-dev_0.14-1+b1_i386
+libprotobuf-dev_2.4.1-3_i386
+libprotoc-dev_2.4.1-3_i386
+libproxy-dev_0.3.1-6_i386
+libproxychains-dev_3.1-3_i386
+libpspell-dev_0.60.7~20110707-1_i386
+libpst-dev_0.6.54-4.1_i386
+libpstoedit-dev_3.60-2+b1_i386
+libpstreams-dev_0.7.0-2_all
+libpt-dev_2.10.4~dfsg-1_i386
+libptexenc-dev_2012.20120628-4_i386
+libpth-dev_2.0.7-16_i386
+libpthread-stubs0-dev_0.3-3_i386
+libpthread-workqueue-dev_0.8.2-1_i386
+libptscotch-dev_5.1.12b.dfsg-1.2_i386
+libpugl-dev_0~svn32+dfsg0-1_i386
+libpulse-dev_2.0-6.1_i386
+libpulse-ocaml-dev_0.1.2-1+b1_i386
+libpuma-dev_1:1.1+svn20120529-2_i386
+libpurelibc-dev_0.4.1-1_i386
+libpurple-dev_2.10.9-1~deb7u1_all
+libpuzzle-dev_0.9-5_i386
+libpwl-dev_0.11.2-8_i386
+libpxp-ocaml-dev_1.2.2-1+b4_i386
+libpycaml-ocaml-dev_0.82-14+b2_i386
+libpyside-dev_1.1.1-3_i386
+libpythia8-dev_8.1.65-1_i386
+libpythonqt2-dev_2.0.1-1.1_i386
+libqalculate-dev_0.9.7-8_i386
+libqapt-dev_1.3.0-2_i386
+libqb-dev_0.11.1-2_i386
+libqca2-dev_2.0.3-4_i386
+libqd-dev_2.3.11.dfsg-2.1_i386
+libqdaccolib-dev_0.8.2-1_i386
+libqdbm++-dev_1.8.78-2_i386
+libqdbm-dev_1.8.78-2_i386
+libqdjango-dev_0.2.5-2_i386
+libqedje-dev_0.4.0+lgpl-3_i386
+libqfits-dev_6.2.0-5_i386
+libqgis-dev_1.7.4+1.7.5~20120320-1.1+b1_i386
+libqglviewer-qt4-dev_2.3.4-4.2_i386
+libqgpsmm-dev_3.6-4+deb7u1_i386
+libqhull-dev_2009.1-3_i386
+libqimageblitz-dev_1:0.0.6-4_i386
+libqjson-dev_0.7.1-7_i386
+libqmf-dev_0.16-6+deb7u1_i386
+libqmf2-dev_0.16-6+deb7u1_i386
+libqmfconsole2-dev_0.16-6+deb7u1_i386
+libqmfengine1-dev_0.16-6+deb7u1_i386
+libqmmp-dev_0.5.5-1+b1_i386
+libqmmpui-dev_0.5.5-1+b1_i386
+libqoauth-dev_1.0.1-1_i386
+libqof-dev_0.8.6-1_i386
+libqofexpensesobjects-dev_0.1.9-2_i386
+libqpdf-dev_2.3.1-4_i386
+libqpidbroker2-dev_0.16-6+deb7u1_i386
+libqpidclient2-dev_0.16-6+deb7u1_i386
+libqpidcommon2-dev_0.16-6+deb7u1_i386
+libqpidmessaging2-dev_0.16-6+deb7u1_i386
+libqpidtypes1-dev_0.16-6+deb7u1_i386
+libqpol-dev_3.3.7-3_i386
+libqpx-dev_0.7.1.002-5_i386
+libqrencode-dev_3.3.0-2_i386
+libqrupdate-dev_1.1.1-1_i386
+libqsastime-dev_5.9.9-5_i386
+libqscintilla2-dev_2.6.2-2_all
+libqt4-dev_4:4.8.2+dfsg-11_i386
+libqt4-opengl-dev_4:4.8.2+dfsg-11_i386
+libqt4-private-dev_4:4.8.2+dfsg-11_i386
+libqt4pas-dev_2.5-6_i386
+libqtassistantclient-dev_4.6.3-4_i386
+libqtexengine-dev_0.3-3_i386
+libqtgstreamer-dev_0.10.2-2_i386
+libqtruby4shared-dev_4:4.8.4-1_i386
+libqtwebkit-dev_2.2.1-5_i386
+libquantlib0-dev_1.2-2+b1_i386
+libquantum-dev_1.1.0-3_i386
+libquicktime-dev_2:1.2.4-3_i386
+libquorum-dev_1.4.2-3_i386
+libquvi-dev_0.4.1-1_i386
+libqwt-dev_6.0.0-1.2_i386
+libqwt5-qt4-dev_5.2.2-3_i386
+libqwtplot3d-qt4-dev_0.2.7+svn191-7_i386
+libqxmlrpc-dev_0.0.svn6-2_i386
+libqxmpp-dev_0.4.92-1_i386
+libqxt-dev_0.6.1-6_i386
+libqzeitgeist-dev_0.7.0-1+b1_i386
+libqzion-dev_0.4.0+lgpl-4_i386
+librabbitmq-dev_0.0.1.hg216-1_i386
+libradare2-dev_0.9-3_i386
+libradius1-dev_0.3.2-14_i386
+libradiusclient-ng-dev_0.5.6-1.1_i386
+libranlip-dev_1.0-4.1_i386
+librapi2-dev_0.15-2.1_i386
+libraptor1-dev_1.4.21-7.1_i386
+libraptor2-dev_2.0.8-2_i386
+librarian-dev_0.8.1-5_i386
+librasqal3-dev_0.9.29-1_i386
+librasterlite-dev_1.1~svn11-2_i386
+libraul-dev_0.8.0+dfsg0-0.1+b1_i386
+libraw-dev_0.14.6-2_i386
+libraw1394-dev_2.0.9-1_i386
+librcc-dev_0.2.9-3_i386
+librcd-dev_0.1.13-3_i386
+librdf0-dev_1.0.15-1+b1_i386
+librdkit-dev_201203-3_i386
+librdmacm-dev_1.0.15-1+deb7u1_i386
+librdmawrap2-dev_0.16-6+deb7u1_i386
+libreact-ocaml-dev_0.9.3-1_i386
+libreadline-dev_6.2+dfsg-0.1_i386
+libreadline-gplv2-dev_5.2+dfsg-2~deb7u1_i386
+libreadline6-dev_6.2+dfsg-0.1_i386
+librec-dev_1.5-1_i386
+librecode-dev_3.6-20_i386
+libref-array-dev_0.1.3-2_i386
+libregina3-dev_3.6-2_i386
+libregistry-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libreins-ocaml-dev_0.1a-4+b1_i386
+libreiser4-dev_1.0.7-6.3_i386
+librelp-dev_1.0.0-1_i386
+libremctl-dev_3.2-4_i386
+librenaissance0-dev_0.9.0-4+b3_i386
+libreoffice-dev_1:3.5.4+dfsg2-0+deb7u2_i386
+librep-dev_0.90.2-1.3_i386
+libreplaygain-dev_1.0~r475-1_i386
+libres-ocaml-dev_3.2.0-2+b3_i386
+libresample1-dev_0.1.3-4_i386
+libresid-builder-dev_2.1.1-14_i386
+libresiprocate-1.8-dev_1.8.5-4_i386
+libresiprocate-turn-client-1.8-dev_1.8.5-4_i386
+librest-dev_0.7.12-3_i386
+librest-extras-dev_0.7.12-3_i386
+librhash-cil-dev_1.2.9-8+deb7u1_all
+librhash-dev_1.2.9-8+deb7u1_i386
+librheolef-dev_6.1-2.1_i386
+librivet-dev_1.8.0-1_i386
+librlog-dev_1.4-2_i386
+libroar-dev_1.0~beta2-3_i386
+libroot-bindings-python-dev_5.34.00-2_i386
+libroot-bindings-ruby-dev_5.34.00-2_i386
+libroot-core-dev_5.34.00-2_i386
+libroot-geom-dev_5.34.00-2_i386
+libroot-graf2d-gpad-dev_5.34.00-2_i386
+libroot-graf2d-graf-dev_5.34.00-2_i386
+libroot-graf2d-postscript-dev_5.34.00-2_i386
+libroot-graf3d-eve-dev_5.34.00-2_i386
+libroot-graf3d-g3d-dev_5.34.00-2_i386
+libroot-graf3d-gl-dev_5.34.00-2_i386
+libroot-gui-dev_5.34.00-2_i386
+libroot-gui-ged-dev_5.34.00-2_i386
+libroot-hist-dev_5.34.00-2_i386
+libroot-hist-spectrum-dev_5.34.00-2_i386
+libroot-html-dev_5.34.00-2_i386
+libroot-io-dev_5.34.00-2_i386
+libroot-io-xmlparser-dev_5.34.00-2_i386
+libroot-math-foam-dev_5.34.00-2_i386
+libroot-math-genvector-dev_5.34.00-2_i386
+libroot-math-mathcore-dev_5.34.00-2_i386
+libroot-math-mathmore-dev_5.34.00-2_i386
+libroot-math-matrix-dev_5.34.00-2_i386
+libroot-math-minuit-dev_5.34.00-2_i386
+libroot-math-mlp-dev_5.34.00-2_i386
+libroot-math-physics-dev_5.34.00-2_i386
+libroot-math-quadp-dev_5.34.00-2_i386
+libroot-math-smatrix-dev_5.34.00-2_i386
+libroot-math-splot-dev_5.34.00-2_i386
+libroot-math-unuran-dev_5.34.00-2_i386
+libroot-misc-memstat-dev_5.34.00-2_i386
+libroot-misc-minicern-dev_5.34.00-2_i386
+libroot-misc-table-dev_5.34.00-2_i386
+libroot-montecarlo-eg-dev_5.34.00-2_i386
+libroot-montecarlo-vmc-dev_5.34.00-2_i386
+libroot-net-auth-dev_5.34.00-2_i386
+libroot-net-bonjour-dev_5.34.00-2_i386
+libroot-net-dev_5.34.00-2_i386
+libroot-net-ldap-dev_5.34.00-2_i386
+libroot-proof-clarens-dev_5.34.00-2_i386
+libroot-proof-dev_5.34.00-2_i386
+libroot-proof-proofplayer-dev_5.34.00-2_i386
+libroot-roofit-dev_5.34.00-2_i386
+libroot-tmva-dev_5.34.00-2_i386
+libroot-tree-dev_5.34.00-2_i386
+libroot-tree-treeplayer-dev_5.34.00-2_i386
+librostlab-blast0-dev_1.0.0-2_i386
+librostlab3-dev_1.0.20-1_i386
+librpcsecgss-dev_0.19-5_i386
+librplay3-dev_3.3.2-14_i386
+librpm-dev_4.10.0-5+deb7u1_i386
+librra-dev_0.14-1.2_i386
+librrd-dev_1.4.7-2_i386
+librsl-dev_1.42-2_i386
+librsskit-dev_0.3-2_i386
+librsvg2-2.0-cil-dev_2.26.0-8_all
+librsvg2-dev_2.36.1-2_i386
+librsync-dev_0.9.7-9_i386
+librtai-dev_3.8.1-4_i386
+librtas-dev_1.3.6-1_i386
+librtasevent-dev_1.3.6-1_i386
+librtaudio-dev_4.0.10~ds0-2_i386
+librtfcomp-dev_1.1-5+b1_i386
+librtfilter-dev_1.1-4_i386
+librtmidi-dev_1.0.15~ds0-2_i386
+librtmp-dev_2.4+20111222.git4e06e21-1_i386
+librubberband-dev_1.3-1.3_i386
+librudecgi-dev_5.0.0-1_i386
+libruli4-dev_0.33-1.1_i386
+librxp-dev_1.5.0-1_i386
+libs3-dev_2.0-1_i386
+libs3d-dev_0.2.2-8_i386
+libs3dw-dev_0.2.2-8_i386
+libsaamf3-dev_1.1.4-4.1_i386
+libsackpt3-dev_1.1.4-4.1_i386
+libsaclm3-dev_1.1.4-4.1_i386
+libsaevt3-dev_1.1.4-4.1_i386
+libsage-dev_0.2.0-4.1_i386
+libsalck3-dev_1.1.4-4.1_i386
+libsam-dev_1.4.2-3_i386
+libsamba-credentials-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libsamba-hostconfig-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libsamba-policy-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libsamba-util-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libsamdb-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libsaml2-dev_2.4.3-4_i386
+libsampleicc-dev_1.6.4-1+b1_i386
+libsamplerate-ocaml-dev_0.1.1-1+b3_i386
+libsamplerate0-dev_0.1.8-5_i386
+libsamsg4-dev_1.1.4-4.1_i386
+libsane-dev_1.0.22-7.4_i386
+libsane-extras-dev_1.0.22.2_i386
+libsanlock-dev_2.2-2_i386
+libsary-dev_1:1.2.0-2.1_i386
+libsasl2-dev_2.1.25.dfsg1-6+deb7u1_i386
+libsatmr3-dev_1.1.4-4.1_i386
+libsbjson-dev_2.3.2-2_i386
+libsbsms-dev_2.0.1-1_i386
+libsbuf-dev_9.0+ds1-4_i386
+libsbuild-dev_1.6.4-4_i386
+libsc-dev_2.3.1-14_i386
+libscalapack-mpi-dev_1.8.0-9_i386
+libscalapack-pvm-dev_1.8.0-9_i386
+libscalc-dev_0.2.4-1_i386
+libscamperfile0-dev_20111202b-1_i386
+libschroedinger-dev_1.0.11-2_i386
+libschroedinger-ocaml-dev_0.1.0-1+b3_i386
+libscim-dev_1.4.13-5_i386
+libscm-dev_5e5-3.2_i386
+libscotch-dev_5.1.12b.dfsg-1.2_i386
+libscotchmetis-dev_5.1.12b.dfsg-1.2_i386
+libscotchparmetis-dev_5.1.12b.dfsg-1.2_i386
+libsctp-dev_1.0.11+dfsg-2_i386
+libscythestat-dev_1.0.2-1_all
+libsdl-console-dev_2.1-3_i386
+libsdl-gfx1.2-dev_2.0.23-3_i386
+libsdl-image1.2-dev_1.2.12-2_i386
+libsdl-mixer1.2-dev_1.2.12-3_i386
+libsdl-net1.2-dev_1.2.8-2_i386
+libsdl-ocaml-dev_0.9.0-1_i386
+libsdl-pango-dev_0.1.2-6_i386
+libsdl-sge-dev_030809dfsg-3_i386
+libsdl-sound1.2-dev_1.0.3-6_i386
+libsdl-stretch-dev_0.3.1-3_i386
+libsdl-ttf2.0-dev_2.0.11-2_i386
+libsdl1.2-dev_1.2.15-5_i386
+libsdpa-dev_7.3.8+dfsg-1_i386
+libsearchclient-dev_0.7.7-3_i386
+libseaudit-dev_3.3.7-3_i386
+libseed-gtk3-dev_3.2.0-2_i386
+libsefs-dev_3.3.7-3_i386
+libselinux1-dev_2.1.9-5_i386
+libsemanage1-dev_2.1.6-6_i386
+libsensors-applet-plugin-dev_3.0.0-0.2_i386
+libsensors4-dev_1:3.3.2-2+deb7u1_i386
+libsepol1-dev_2.1.4-3_i386
+libserd-dev_0.14.0~dfsg0-2_i386
+libserf-dev_1.1.0-2_i386
+libsexplib-camlp4-dev_7.0.4-2_i386
+libsexy-dev_0.1.11-2+b1_i386
+libsfml-dev_1.6+dfsg2-2_i386
+libsfst1-1.2-0-dev_1.2.0-1.2_i386
+libsgutils2-dev_1.33-1_i386
+libsha-ocaml-dev_1.7-2+b2_i386
+libshairport-dev_1.2.1~git20120110.aeb4987-2_i386
+libshevek-dev_1.3-1_i386
+libshhmsg1-dev_1.4.1-4.1_i386
+libshhopt1-dev_1.1.7-2.1_i386
+libshiboken-dev_1.1.1-1_i386
+libshibsp-dev_2.4.3+dfsg-5+b1_i386
+libshisa-dev_1.0.1-2_i386
+libshishi-dev_1.0.1-2_i386
+libshout-ocaml-dev_0.2.7-1+b3_i386
+libshout3-dev_2.2.2-8_i386
+libshp-dev_1.2.10-7_i386
+libshr-glib-dev_2011.03.08.2~git20110930-2_i386
+libsidl-dev_1.4.0.dfsg-8.1_i386
+libsidplay1-dev_1.36.59-5_i386
+libsidplay2-dev_2.1.1-14_i386
+libsidplayfp-dev_0.3.5-1_i386
+libsidutils-dev_2.1.1-14_i386
+libsieve2-dev_2.2.6-1.1_i386
+libsigc++-1.2-dev_1.2.7-2_i386
+libsigc++-2.0-dev_2.2.10-0.2_i386
+libsigc++-dev_1.0.4-9.4_i386
+libsigrok0-dev_0.1.0-2_i386
+libsigrokdecode0-dev_0.1.0-2_i386
+libsigsegv-dev_2.9-4_i386
+libsilly-dev_0.1.0-3_i386
+libsilo-dev_4.8-13_i386
+libsimage-dev_1.7.0-1.1+b1_i386
+libsimplelist0-dev_0.3.4-2_i386
+libsipwitch-dev_1.2.4-1_i386
+libsiscone-dev_2.0.5-1_i386
+libsiscone-spherical-dev_2.0.5-1_i386
+libskk-dev_0.0.12-3_i386
+libskstream-0.3-dev_0.3.8-1_i386
+libslang2-dev_2.2.4-15_i386
+libslepc3.2-dev_3.2-p5-1_i386
+libslp-dev_1.2.1-9_i386
+libslurm-dev_2.3.4-2+b1_i386
+libslurmdb-dev_2.3.4-2+b1_i386
+libslv2-dev_0.6.6+dfsg1-2_i386
+libsm-dev_2:1.2.1-2_i386
+libsmbclient-dev_2:3.6.6-6+deb7u3_i386
+libsmbclient-raw-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libsmbios-dev_2.0.3.dfsg-1.1_i386
+libsmf-dev_1.3-2_i386
+libsmi2-dev_0.4.8+dfsg2-7_i386
+libsmokekde-dev_4:4.8.4-1_i386
+libsmokeqt4-dev_4:4.8.4-1_i386
+libsmpeg-dev_0.4.5+cvs20030824-5_i386
+libsnacc-dev_1.3.1-1_i386
+libsnack2-dev_2.2.10-dfsg1-12.1_i386
+libsnappy-dev_1.0.5-2_i386
+libsndfile1-dev_1.0.25-5_i386
+libsndobj-dev_2.6.6.1-3_i386
+libsnmp-dev_5.4.3~dfsg-2.8_i386
+libsnmpkit-dev_0.9-16_i386
+libsocialweb-client-dev_0.25.20-2.1_i386
+libsocialweb-dev_0.25.20-2.1_i386
+libsocksd0-dev_1.1.19.dfsg-3+b3_i386
+libsofa-c-dev_2012.03.01-1_i386
+libsofa1-dev_1.0~beta4-7_i386
+libsofia-sip-ua-dev_1.12.11+20110422-1_i386
+libsofia-sip-ua-glib-dev_1.12.11+20110422-1_i386
+libsofthsm-dev_1.3.3-2_i386
+libsoil-dev_1.07~20080707.dfsg-2_i386
+libsombok-dev_2.2.1-1_i386
+libsonic-dev_0.1.17-1.1_i386
+libsope-dev_1.3.16-1_i386
+libsoprano-dev_2.7.6+dfsg.1-2wheezy1_i386
+libsoqt4-dev_1.5.0-2_i386
+libsord-dev_0.8.0~dfsg0-1_i386
+libsoundgen-dev_0.6-4_i386
+libsoundtouch-dev_1.6.0-3_i386
+libsoundtouch-ocaml-dev_0.1.7-1+b1_i386
+libsoup-gnome2.4-dev_2.38.1-3_i386
+libsoup2.4-dev_2.38.1-3_i386
+libsoupcutter-dev_1.1.7-1.2_i386
+libsource-highlight-dev_3.1.6-1.1_i386
+libsox-dev_14.4.0-3_i386
+libsp-gxmlcpp-dev_1.0.20040603-5_i386
+libsp1-dev_1.3.4-1.2.1-47.1+b1_i386
+libspandsp-dev_0.0.6~pre20-3.1_i386
+libsparsehash-dev_1.10-1_all
+libsparskit-dev_2.0.0-2_i386
+libspatialindex-dev_1.7.0-1_i386
+libspatialite-dev_3.0.0~beta20110817-3+deb7u1_i386
+libspctag-dev_0.2-1_i386
+libspectre-dev_0.2.7-2_i386
+libspectrum-dev_1.0.0-3_i386
+libspeechd-dev_0.7.1-6.2_i386
+libspeex-dev_1.2~rc1-7_i386
+libspeex-ocaml-dev_0.2.0-1+b3_i386
+libspeexdsp-dev_1.2~rc1-7_i386
+libspf2-dev_1.2.9-7_i386
+libsphere-dev_3.2-4_i386
+libspice-client-glib-2.0-dev_0.12-5_i386
+libspice-client-gtk-2.0-dev_0.12-5_i386
+libspice-client-gtk-3.0-dev_0.12-5_i386
+libspice-protocol-dev_0.10.1-1_all
+libspice-server-dev_0.11.0-1+deb7u1_i386
+libspiro-dev_20071029-2_i386
+libspnav-dev_0.2.2-1_i386
+libspooles-dev_2.2-9_i386
+libsprng2-dev_2.0a-8_i386
+libsqlexpr-ocaml-dev_0.4.1-1+b5_i386
+libsqlheavy-dev_0.1.1-1_i386
+libsqlheavygtk-dev_0.1.1-1_i386
+libsqlite0-dev_2.8.17-7_i386
+libsqlite3-dev_3.7.13-1+deb7u1_i386
+libsqlite3-ocaml-dev_1.6.1-1+b1_i386
+libsquizz-dev_0.99a-2_i386
+libsratom-dev_0.2.0~dfsg0-1_i386
+libsrecord-dev_1.58-1+b1_i386
+libsrf-dev_0.1+dfsg-1_i386
+libsrtp0-dev_1.4.4+20100615~dfsg-2+deb7u1_i386
+libss7-dev_1.0.2-3_i386
+libsscm-dev_0.8.5-2.1_i386
+libssh-dev_0.5.4-1+deb7u1_i386
+libssh2-1-dev_1.4.2-1.1_i386
+libssl-dev_1.0.1e-2+deb7u7_i386
+libssl-ocaml-dev_0.4.6-1_i386
+libsslcommon2-dev_0.16-6+deb7u1_i386
+libssreflect-ocaml-dev_1.3pl4-1_i386
+libsss-sudo-dev_1.8.4-2_i386
+libst-dev_1.9-3_i386
+libstaden-read-dev_1.12.4-1_i386
+libstarlink-ast-dev_7.0.4+dfsg-1_i386
+libstarlink-pal-dev_0.1.0-1_i386
+libstarpu-dev_1.0.1+dfsg-1_i386
+libstartup-notification0-dev_0.12-1_i386
+libstatgrab-dev_0.17-1_i386
+libstdc++6-4.4-dev_4.4.7-2_i386
+libstdc++6-4.6-dev_4.6.3-14_i386
+libstdc++6-4.7-dev_4.7.2-5_i386
+libstemmer-dev_0+svn546-2_i386
+libsteptalk-dev_0.10.0-5+b1_i386
+libstfl-dev_0.22-1+b1_i386
+libstk0-dev_4.4.3-2_i386
+libstlport4.6-dev_4.6.2-7_i386
+libstonith1-dev_1.0.9+hg2665-1_i386
+libstonithd1-dev_1.1.7-1_i386
+libstreamanalyzer-dev_0.7.7-3_i386
+libstreams-dev_0.7.7-3_i386
+libstrigihtmlgui-dev_0.7.7-3_i386
+libstrigiqtdbusclient-dev_0.7.7-3_i386
+libstroke0-dev_0.5.1-6_i386
+libstxxl-dev_1.3.1-4_i386
+libsublime-dev_1.3.1-2_i386
+libsubtitleeditor-dev_0.33.0-1_i386
+libsubunit-dev_0.0.8+bzr176-1_i386
+libsugarext-dev_0.96.1-2_i386
+libsuil-dev_0.6.4~dfsg0-3_i386
+libsuitesparse-dev_1:3.4.0-3_i386
+libsundials-serial-dev_2.5.0-3_i386
+libsunpinyin-dev_2.0.3+git20120607-1_i386
+libsuperlu3-dev_3.0+20070106-3_i386
+libsvga1-dev_1:1.4.3-33_i386
+libsvm-dev_3.12-1_i386
+libsvn-dev_1.6.17dfsg-4+deb7u6_i386
+libsvncpp-dev_0.12.0dfsg-6_i386
+libsvnqt-dev_1.5.5-4.1_i386
+libsvrcore-dev_1:4.0.4-15_i386
+libswami-dev_2.0.0+svn389-2_i386
+libswe-dev_1.77.00.0005-2_i386
+libswiften-dev_2.0~beta1+dev47-1_i386
+libsword-dev_1.6.2+dfsg-5_i386
+libswscale-dev_6:0.8.10-1_i386
+libsx-dev_2.05-3_i386
+libsyfi1.0-dev_1.0.0.dfsg-1_i386
+libsylph-dev_1.1.0-8_i386
+libsymmetrica-dev_2.0-1_i386
+libsynce0-dev_0.15-1.1_i386
+libsyncml-dev_0.5.4-2.1_i386
+libsynfig-dev_0.63.05-1_i386
+libsynopsis0.12-dev_0.12-8_i386
+libsynthesis-dev_3.4.0.16.7-1_i386
+libsysactivity-dev_0.6.4-1_i386
+libsysfs-dev_2.1.0+repack-2_i386
+libsyslog-ng-dev_3.3.5-4_i386
+libsyslog-ocaml-dev_1.4-6+b2_i386
+libsystemd-daemon-dev_44-11+deb7u4_i386
+libsystemd-id128-dev_44-11+deb7u4_i386
+libsystemd-journal-dev_44-11+deb7u4_i386
+libsystemd-login-dev_44-11+deb7u4_i386
+libt1-dev_5.1.2-3.6_i386
+libtacacs+1-dev_4.0.4.19-11_all
+libtachyon-dev_0.99~b2+dfsg-0.4_i386
+libtag-extras-dev_1.0.1-3_i386
+libtag1-dev_1.7.2-1_i386
+libtagc0-dev_1.7.2-1_i386
+libtagcoll2-dev_2.0.13-1.1_i386
+libtaglib-cil-dev_2.0.4.0-1_all
+libtaglib-ocaml-dev_0.2.0-1+b1_i386
+libtaktuk-1-dev_3.7.4-1_i386
+libtalloc-dev_2.0.7+git20120207-1_i386
+libtamuanova-dev_0.2-2_i386
+libtango7-dev_7.2.6+dfsg-14_i386
+libtaningia-dev_0.2.2-1_i386
+libtaoframework-devil-cil-dev_2.1.svn20090801-9_all
+libtaoframework-ffmpeg-cil-dev_2.1.svn20090801-9_all
+libtaoframework-freeglut-cil-dev_2.1.svn20090801-9_all
+libtaoframework-freetype-cil-dev_2.1.svn20090801-9_all
+libtaoframework-ftgl-cil-dev_2.1.svn20090801-9_all
+libtaoframework-lua-cil-dev_2.1.svn20090801-9_all
+libtaoframework-ode-cil-dev_2.1.svn20090801-9_all
+libtaoframework-openal-cil-dev_2.1.svn20090801-9_all
+libtaoframework-opengl-cil-dev_2.1.svn20090801-9_all
+libtaoframework-physfs-cil-dev_2.1.svn20090801-9_all
+libtaoframework-sdl-cil-dev_2.1.svn20090801-9_all
+libtar-dev_1.2.16-1+deb7u2_i386
+libtarantool-dev_1.4.6+20120629+2158-1_i386
+libtasn1-3-dev_2.13-2_i386
+libtbb-dev_4.0+r233-1_i386
+libtcc-dev_0.9.26~git20120612.ad5f375-6_i386
+libtcd-dev_2.2.2-1_i386
+libtclap-dev_1.2.1-1_i386
+libtclcl1-dev_1.20-6_i386
+libtdb-dev_1.2.10-2_i386
+libtecla1-dev_1.6.1-5_i386
+libteem-dev_1.11.0~svn5226-1_i386
+libtelepathy-farstream-dev_0.4.0-3_i386
+libtelepathy-glib-dev_0.18.2-2_i386
+libtelepathy-logger-dev_0.4.0-1_i386
+libtelepathy-logger-qt4-dev_0.4.0-1_i386
+libtelepathy-qt4-dev_0.9.1-4_i386
+libtelnet-dev_0.21-1_i386
+libtemplates-parser11.6-dev_11.6-2_i386
+libterralib-dev_4.0.0-4_i386
+libtesseract-dev_3.02.01-6_i386
+libtevent-dev_0.9.16-1_i386
+libtext-ocaml-dev_0.5-1+b2_i386
+libtextwrap-dev_0.1-13_i386
+libthai-dev_0.1.18-2_i386
+libtheora-dev_1.1.1+dfsg.1-3.1_i386
+libtheora-ocaml-dev_0.3.0-1+b3_i386
+libthepeg-dev_1.8.0-1_i386
+libthrust-dev_1.6.0-1_all
+libthunar-vfs-1-dev_1.2.0-3+b1_i386
+libthunarx-2-dev_1.2.3-4+b1_i386
+libticables-dev_1.2.0-2_i386
+libticalcs-dev_1.1.3+dfsg1-1_i386
+libticonv-dev_1.1.0-1.1_i386
+libtidy-dev_20091223cvs-1.2_i386
+libtiff4-dev_3.9.6-11_i386
+libtiff5-alt-dev_4.0.2-6+deb7u2_i386
+libtiff5-dev_4.0.2-6+deb7u2_i386
+libtifiles-dev_1.1.1-1_i386
+libtimbl3-dev_6.4.2-1_i386
+libtimblserver2-dev_1.4-2_i386
+libtinfo-dev_5.9-10_i386
+libtinyxml-dev_2.6.2-1_i386
+libtinyxml2-dev_0~git20120518.1.a2ae54e-1_i386
+libtirpc-dev_0.2.2-5_i386
+libtk-img-dev_1:1.3-release-12_i386
+libtnt-dev_1.2.6-1_all
+libtntdb-dev_1.2-2+b1_i386
+libtntnet-dev_2.1-2+deb7u1_i386
+libtododb-dev_0.11-3_i386
+libtogl-dev_1.7-12_all
+libtokyocabinet-dev_1.4.47-2_i386
+libtokyotyrant-dev_1.1.40-4.1+b1_i386
+libtolua++5.1-dev_1.0.93-3_i386
+libtolua-dev_5.2.0-1_i386
+libtomcrypt-dev_1.17-3.2_i386
+libtommath-dev_0.42.0-1_i386
+libtomoe-dev_0.6.0-1.3_i386
+libtonezone-dev_1:2.5.0.1-2_i386
+libtophide-ocaml-dev_1.0.0-3_all
+libtorch3-dev_3.1-2.1_i386
+libtorque2-dev_2.4.16+dfsg-1+deb7u2_i386
+libtorrent-dev_0.13.2-1_i386
+libtorrent-rasterbar-dev_0.15.10-1+b1_i386
+libtorture-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libtotem-dev_3.0.1-8_i386
+libtotem-pg-dev_1.4.2-3_i386
+libtotem-plparser-dev_3.4.2-1_i386
+libtowitoko-dev_2.0.7-8.3_i386
+libtpl-dev_1.5-2_all
+libtpm-unseal-dev_1.3.7-1_i386
+libtrace3-dev_3.0.14-1_i386
+libtracker-extract-0.14-dev_0.14.1-3_i386
+libtracker-miner-0.14-dev_0.14.1-3_i386
+libtracker-sparql-0.14-dev_0.14.1-3_i386
+libtransitioner1-dev_1.1.7-1_i386
+libtre-dev_0.8.0-3_i386
+libtreil-dev_1.8-1.1_i386
+libts-dev_1.0-11_i386
+libtse3-dev_0.3.1-4.3_i386
+libtsk-dev_3.2.3-2_i386
+libtspi-dev_0.3.9-3+wheezy1_i386
+libtulip-dev_3.7.0dfsg-4_i386
+libtumbler-1-dev_0.1.25-1+b1_i386
+libtut-dev_0.0.20070706-1_all
+libtuxcap-dev_1.4.0.dfsg2-2.1_i386
+libtwin-dev_12.04.13.17.57-g130ee5f-2_i386
+libtwofish-dev_0.3-3_i386
+libtwolame-dev_0.3.13-1_i386
+libtxc-dxtn-s2tc-dev_0~git20110809-3_i386
+libtype-conv-camlp4-dev_3.0.4-1_i386
+libtyxml-ocaml-dev_2.1-1_i386
+libuchardet-dev_0.0.1-1_i386
+libucimf-dev_2.3.8-4_i386
+libucl-dev_1.03-5_i386
+libuclmmbase1-dev_1.2.16.0-1_i386
+libucommon-dev_5.2.2-4_i386
+libucto1-dev_0.5.2-2_i386
+libudev-dev_175-7.2_i386
+libudf-dev_0.83-4_i386
+libudt-dev_4.10+dfsg-1_i386
+libudunits2-dev_2.1.23-3_i386
+libuhd-dev_3.4.2-1_i386
+libuim-dev_1:1.8.1-4_i386
+libumlib-dev_0.8.2-1_i386
+libunac1-dev_1.8.0-6_i386
+libunbound-dev_1.4.17-3_i386
+libunicap2-dev_0.9.12-2_i386
+libuninameslist-dev_0.0.20091231-1.1_i386
+libuninum-dev_2.7-1.1_i386
+libunique-3.0-dev_3.0.2-1_i386
+libunique-dev_1.1.6-4_i386
+libunistring-dev_0.9.3-5_i386
+libunittest++-dev_1.4.0-3_i386
+libunshield-dev_0.6-3_i386
+libunwind-setjmp0-dev_0.99-0.3_i386
+libunwind7-dev_0.99-0.3_i386
+libupnp-dev_1:1.6.17-1.2_all
+libupnp4-dev_1.8.0~svn20100507-1.2_i386
+libupnp6-dev_1:1.6.17-1.2_i386
+libupower-glib-dev_0.9.17-1_i386
+libupsclient1-dev_2.6.4-2.3+deb7u1_i386
+libupse-dev_1.0.0-1_i386
+libuptimed-dev_1:0.3.17-3.1_i386
+liburcu-dev_0.6.7-2_i386
+liburfkill-glib-dev_0.3.0-1_i386
+liburg0-dev_0.8.12-4_i386
+liburiparser-dev_0.7.5-1_i386
+libusb++-dev_2:0.1.12-20+nmu1_i386
+libusb-1.0-0-dev_2:1.0.11-1_i386
+libusb-dev_2:0.1.12-20+nmu1_i386
+libusb-ocaml-dev_1.2.0-2+b7_i386
+libusbip-dev_1.1.1+3.2.17-1_i386
+libusbmuxd-dev_1.0.7-2_i386
+libusbprog-dev_0.2.0-2_i386
+libusbredirhost-dev_0.4.3-2_i386
+libusbredirparser-dev_0.4.3-2_i386
+libusbtc08-dev_1.7.2-1_i386
+libuser1-dev_1:0.56.9.dfsg.1-1.2_i386
+libust-dev_2.0.4-1_i386
+libustr-dev_1.0.4-3_i386
+libutempter-dev_1.1.5-4_i386
+libuu-dev_0.5.20-3.3_i386
+libuuidm-ocaml-dev_0.9.4-1_i386
+libv4l-dev_0.8.8-3_i386
+libv8-dev_3.8.9.20-2_i386
+libv8-i18n-dev_0~0.svn7-3_i386
+libva-dev_1.0.15-4_i386
+libvala-0.14-dev_0.14.2-2_i386
+libvala-0.16-dev_0.16.1-2_i386
+libvaladoc-dev_0.3.2~git20120227-1_i386
+libvalhalla-dev_2.0.0-4+b1_i386
+libvanessa-adt-dev_0.0.9-1_i386
+libvanessa-logger-dev_0.0.10-1.1_i386
+libvanessa-socket-dev_0.0.12-1_i386
+libvarconf-dev_0.6.7-2_i386
+libvarnishapi-dev_3.0.2-2+deb7u1_i386
+libvbr-dev_2.6.8-4_i386
+libvc-dev_003.dfsg.1-12_i386
+libvcdinfo-dev_0.7.24+dfsg-0.1_i386
+libvde-dev_2.3.2-4_i386
+libvdeplug-dev_2.3.2-4_i386
+libvdk2-dev_2.4.0-5.3_i386
+libvdkbuilder2-dev_2.4.0-4.3_i386
+libvdkxdb2-dev_2.4.0-3.4_i386
+libvdpau-dev_0.4.1-7_i386
+libventrilo-dev_1.2.4-1_i386
+libverbiste-dev_0.1.34-1_i386
+libverto-dev_0.2.2-1_i386
+libvformat-dev_1.13-10_i386
+libvia-dev_2.0.4-2_i386
+libvibrant6-dev_6.1.20120620-2_i386
+libview-dev_0.6.6-2.1_i386
+libvigraimpex-dev_1.7.1+dfsg1-3_i386
+libvips-dev_7.28.5-1+deb7u1_i386
+libvirt-dev_0.9.12.3-1_i386
+libvirt-glib-1.0-dev_0.0.8-1_i386
+libvirt-ocaml-dev_0.6.1.2-1_i386
+libvisca-dev_1.0.1-1_i386
+libvisio-dev_0.0.17-1_i386
+libvisual-0.4-dev_0.4.0-5_i386
+libvlc-dev_2.0.3-5_i386
+libvlccore-dev_2.0.3-5_i386
+libvmmlib-dev_1.0-2_all
+libvncserver-dev_0.9.9+dfsg-1_i386
+libvo-aacenc-dev_0.1.2-1_i386
+libvo-amrwbenc-dev_0.1.2-1_i386
+libvoaacenc-ocaml-dev_0.1.0-1+b1_i386
+libvoikko-dev_3.5-1.1_i386
+libvolpack1-dev_1.0b3-3_i386
+libvorbis-dev_1.3.2-1.3_i386
+libvorbis-ocaml-dev_0.6.1-1+b1_i386
+libvorbisidec-dev_1.0.2+svn18153-0.2_i386
+libvotequorum-dev_1.4.2-3_i386
+libvpb-dev_4.2.55-1_i386
+libvpx-dev_1.1.0-1_i386
+libvrb0-dev_0.5.1-5.1_i386
+libvte-2.90-dev_1:0.32.2-1_i386
+libvte-dev_1:0.28.2-5_i386
+libvte0.16-cil-dev_2.26.0-8_i386
+libvtk5-dev_5.8.0-13+b1_i386
+libvtk5-qt4-dev_5.8.0-13+b1_i386
+libvtkedge-dev_0.2.0~20110819-2_i386
+libvtkgdcm2-dev_2.2.0-14.1_i386
+libvxl1-dev_1.14.0-18_i386
+libwacom-dev_0.6-1_i386
+libwaei-dev_3.4.3-1_i386
+libwaili-dev_19990723-20_i386
+libwavefront-standalone3.0-dev_3.0.2+dfsg-4+b1_i386
+libwavpack-dev_4.60.1-3_i386
+libwayland-dev_0.85.0-2_i386
+libwbclient-dev_2:3.6.6-6+deb7u3_i386
+libwbxml2-dev_0.10.7-1_i386
+libwcstools-dev_3.8.5-1_i386
+libwebauth-dev_4.1.1-2_i386
+libwebcam0-dev_0.2.2-1_i386
+libwebkit-cil-dev_0.3-6_all
+libwebkit-dev_1.8.1-3.4_i386
+libwebkitgtk-3.0-dev_1.8.1-3.4_i386
+libwebkitgtk-dev_1.8.1-3.4_i386
+libwebp-dev_0.1.3-3+nmu1_i386
+libwebrtc-audio-processing-dev_0.1-2_i386
+libweed-dev_1.6.2~ds1-2_i386
+libwfmath-0.3-dev_0.3.12-3_i386
+libwfut-0.2-dev_0.2.1-2_i386
+libwibble-dev_0.1.28-1.1_i386
+libwildmidi-dev_0.2.3.4-2.1_i386
+libwine-dev_1.4.1-4_i386
+libwings-dev_0.95.3-2_i386
+libwireshark-dev_1.8.2-5wheezy10_i386
+libwiretap-dev_1.8.2-5wheezy10_i386
+libwmf-dev_0.2.8.4-10.3_i386
+libwnck-3-dev_3.4.2-1_i386
+libwnck-dev_2.30.7-1_i386
+libwnck1.0-cil-dev_2.26.0-8_i386
+libwnn-dev_1.1.1~a021+cvs20100325-6_i386
+libwnn6-dev_1.0.0-14.2+b1_i386
+libwpd-dev_0.9.4-3_i386
+libwpg-dev_0.2.1-1_i386
+libwps-dev_0.2.7-1_i386
+libwrap0-dev_7.6.q-24_i386
+libwraster3-dev_0.95.3-2_i386
+libwreport-dev_2.4-1_i386
+libwsutil-dev_1.8.2-5wheezy10_i386
+libwt-dev_3.2.1-2_i386
+libwtdbo-dev_3.2.1-2_i386
+libwtdbofirebird-dev_3.2.1-2_i386
+libwtdbopostgres-dev_3.2.1-2_i386
+libwtdbosqlite-dev_3.2.1-2_i386
+libwtext-dev_3.2.1-2_i386
+libwtfcgi-dev_3.2.1-2_i386
+libwthttp-dev_3.2.1-2_i386
+libwttest-dev_3.2.1-2_i386
+libwv-dev_1.2.9-3_i386
+libwv2-dev_0.4.2.dfsg.2-1~deb7u1_i386
+libwvstreams-dev_4.6.1-5_i386
+libwxbase2.8-dev_2.8.12.1-12_i386
+libwxgtk2.8-dev_2.8.12.1-12_i386
+libwxsmithlib-dev_10.05-2.1_i386
+libwxsmithlib0-dev_10.05-2.1_i386
+libwxsqlite3-2.8-dev_3.0.0.1~dfsg0-2_i386
+libwxsvg-dev_2:1.1.8~dfsg0-2_i386
+libx11-dev_2:1.5.0-1+deb7u1_i386
+libx11-xcb-dev_2:1.5.0-1+deb7u1_i386
+libx264-dev_2:0.123.2189+git35cf912-1_i386
+libx52pro-dev_0.1.1-2.1_i386
+libx86-dev_1.1+ds1-10_i386
+libxalan110-dev_1.10-6_i386
+libxapian-dev_1.2.12-2_i386
+libxatracker-dev_8.0.5-4+deb7u2_i386
+libxau-dev_1:1.0.7-1_i386
+libxaw7-dev_2:1.0.10-2_i386
+libxbae-dev_4.60.4-3_i386
+libxbase2.0-dev_2.0.0-8.5_i386
+libxcb-composite0-dev_1.8.1-2+deb7u1_i386
+libxcb-damage0-dev_1.8.1-2+deb7u1_i386
+libxcb-dpms0-dev_1.8.1-2+deb7u1_i386
+libxcb-dri2-0-dev_1.8.1-2+deb7u1_i386
+libxcb-ewmh-dev_0.3.9-2_i386
+libxcb-glx0-dev_1.8.1-2+deb7u1_i386
+libxcb-icccm4-dev_0.3.9-2_i386
+libxcb-image0-dev_0.3.9-1_i386
+libxcb-keysyms1-dev_0.3.9-1_i386
+libxcb-randr0-dev_1.8.1-2+deb7u1_i386
+libxcb-record0-dev_1.8.1-2+deb7u1_i386
+libxcb-render-util0-dev_0.3.8-1.1_i386
+libxcb-render0-dev_1.8.1-2+deb7u1_i386
+libxcb-res0-dev_1.8.1-2+deb7u1_i386
+libxcb-screensaver0-dev_1.8.1-2+deb7u1_i386
+libxcb-shape0-dev_1.8.1-2+deb7u1_i386
+libxcb-shm0-dev_1.8.1-2+deb7u1_i386
+libxcb-sync0-dev_1.8.1-2+deb7u1_i386
+libxcb-util0-dev_0.3.8-2_i386
+libxcb-xevie0-dev_1.8.1-2+deb7u1_i386
+libxcb-xf86dri0-dev_1.8.1-2+deb7u1_i386
+libxcb-xfixes0-dev_1.8.1-2+deb7u1_i386
+libxcb-xinerama0-dev_1.8.1-2+deb7u1_i386
+libxcb-xprint0-dev_1.8.1-2+deb7u1_i386
+libxcb-xtest0-dev_1.8.1-2+deb7u1_i386
+libxcb-xv0-dev_1.8.1-2+deb7u1_i386
+libxcb-xvmc0-dev_1.8.1-2+deb7u1_i386
+libxcb1-dev_1.8.1-2+deb7u1_i386
+libxcomp-dev_3.5.0.12-1+b1_i386
+libxcomposite-dev_1:0.4.3-2_i386
+libxcp-ocaml-dev_0.5.2-3+b1_i386
+libxcrypt-dev_1:2.4-3_i386
+libxcursor-dev_1:1.1.13-1+deb7u1_i386
+libxdamage-dev_1:1.1.3-2_i386
+libxdb-dev_1.2.0-7.2_i386
+libxdelta2-dev_1.1.3-9_i386
+libxdffileio-dev_0.3-1_i386
+libxdg-basedir-dev_1.1.1-2_i386
+libxdmcp-dev_1:1.1.1-1_i386
+libxdmf-dev_2.1.dfsg.1-5_i386
+libxdo-dev_1:2.20100701.2961-3+deb7u3_i386
+libxen-dev_4.1.4-3+deb7u1_i386
+libxen-ocaml-dev_4.1.4-3+deb7u1_i386
+libxenapi-ocaml-dev_1.3.2-15_i386
+libxenomai-dev_2.6.0-2_i386
+libxerces-c-dev_3.1.1-3_i386
+libxerces-c2-dev_2.8.0+deb1-3_i386
+libxext-dev_2:1.3.1-2+deb7u1_i386
+libxfce4menu-0.1-dev_4.6.2-1_i386
+libxfce4ui-1-dev_4.8.1-1_i386
+libxfce4util-dev_4.8.2-1_i386
+libxfcegui4-dev_4.8.1-5_i386
+libxfconf-0-dev_4.8.1-1_i386
+libxfixes-dev_1:5.0-4+deb7u1_i386
+libxfont-dev_1:1.4.5-3_i386
+libxft-dev_2.3.1-1_i386
+libxi-dev_2:1.6.1-1+deb7u1_i386
+libxine-dev_1.1.21-1+deb7u1_i386
+libxine2-dev_1.2.2-5_i386
+libxinerama-dev_2:1.1.2-1+deb7u1_i386
+libxkbfile-dev_1:1.0.8-1_i386
+libxklavier-dev_5.2.1-1_i386
+libxml++2.6-dev_2.34.2-1_i386
+libxml-light-ocaml-dev_2.2-15_i386
+libxml-security-c-dev_1.6.1-5+deb7u2_i386
+libxml2-dev_2.8.0+dfsg1-7+nmu3_i386
+libxmlada4.1-dev_4.1-2_i386
+libxmlezout2-dev_1.06.1-5_i386
+libxmlm-ocaml-dev_1.1.0-1_i386
+libxmlplaylist-ocaml-dev_0.1.3-1+b2_i386
+libxmlrpc-c++4-dev_1.16.33-3.2_i386
+libxmlrpc-c3-dev_1.16.33-3.2_all
+libxmlrpc-core-c3-dev_1.16.33-3.2_i386
+libxmlrpc-epi-dev_0.54.2-1_i386
+libxmlrpc-light-ocaml-dev_0.6.1-3+b5_i386
+libxmlsec1-dev_1.2.18-2_i386
+libxmltok1-dev_1.2-3_i386
+libxmltooling-dev_1.4.2-5_i386
+libxmmsclient++-dev_0.8+dfsg-4_i386
+libxmmsclient++-glib-dev_0.8+dfsg-4_i386
+libxmmsclient-dev_0.8+dfsg-4_i386
+libxmmsclient-glib-dev_0.8+dfsg-4_i386
+libxmpi4-dev_2.2.3b8-13_i386
+libxmu-dev_2:1.1.1-1_i386
+libxmuu-dev_2:1.1.1-1_i386
+libxnee-dev_3.13-1_i386
+libxneur-dev_0.15.0-1.1_i386
+libxosd-dev_2.2.14-2_i386
+libxp-dev_1:1.0.1-2+deb7u1_i386
+libxpa-dev_2.1.14-2_i386
+libxplc0.3.13-dev_0.3.13-3_i386
+libxpm-dev_1:3.5.10-1_i386
+libxqdbm-dev_1.8.78-2_i386
+libxqilla-dev_2.3.0-1_i386
+libxr1-dev_1.0-2.1_i386
+libxrandr-dev_2:1.3.2-2+deb7u1_i386
+libxrender-dev_1:0.9.7-1+deb7u1_i386
+libxres-dev_2:1.0.6-1+deb7u1_i386
+libxsettings-client-dev_0.17-6_i386
+libxsettings-dev_0.11-3_i386
+libxslt1-dev_1.1.26-14.1_i386
+libxss-dev_1:1.2.2-1_i386
+libxstr-ocaml-dev_0.2.1-21+b3_i386
+libxstrp4-camlp4-dev_1.8-3_all
+libxt-dev_1:1.1.3-1+deb7u1_i386
+libxtst-dev_2:1.2.1-1+deb7u1_i386
+libxv-dev_2:1.0.7-1+deb7u1_i386
+libxvidcore-dev_2:1.3.2-9_i386
+libxvmc-dev_2:1.0.7-1+deb7u2_i386
+libxxf86dga-dev_2:1.1.3-2+deb7u1_i386
+libxxf86vm-dev_1:1.1.2-1+deb7u1_i386
+libxy-dev_0.8-1+b1_i386
+libyahoo2-dev_1.0.1-1_i386
+libyajl-dev_2.0.4-2_i386
+libyaml-cpp-dev_0.3.0-1_i386
+libyaml-dev_0.1.4-2+deb7u4_i386
+libyaz4-dev_4.2.30-2_i386
+libyelp-dev_3.4.2-1+b1_i386
+libygl4-dev_4.2e-4_i386
+libykclient-dev_2.6-1_i386
+libykpers-1-dev_1.7.0-1_i386
+libyojson-ocaml-dev_1.0.3-1_i386
+libytnef0-dev_1.5-4_i386
+libyubikey-dev_1.8-1_i386
+libz80ex-dev_1.1.19-3_i386
+libzarith-ocaml-dev_1.1-2_i386
+libzbar-dev_0.10+doc-8_i386
+libzbargtk-dev_0.10+doc-8_i386
+libzbarqt-dev_0.10+doc-8_i386
+libzeep-dev_2.9.0-2_i386
+libzeitgeist-cil-dev_0.8.0.0-4_all
+libzeitgeist-dev_0.3.18-1_i386
+libzen-dev_0.4.27-2_i386
+libzephyr-dev_3.0.2-2_i386
+libzerg0-dev_1.0.7-3_i386
+libzeroc-ice34-dev_3.4.2-8.2_i386
+libzinnia-dev_0.06-1+b1_i386
+libzip-dev_0.10.1-1.1_i386
+libzip-ocaml-dev_1.04-6+b3_i386
+libzipios++-dev_0.1.5.9+cvs.2007.04.28-5.1_i386
+libzita-alsa-pcmi-dev_0.2.0-1_i386
+libzita-convolver-dev_3.1.0-2_i386
+libzita-resampler-dev_1.1.0-3_i386
+libzlcore-dev_0.12.10dfsg-8_i386
+libzltext-dev_0.12.10dfsg-8_i386
+libzmq-dev_2.2.0+dfsg-2_i386
+libzn-poly-dev_0.8-1.1_i386
+libzookeeper-mt-dev_3.3.5+dfsg1-2_i386
+libzookeeper-st-dev_3.3.5+dfsg1-2_i386
+libzorp-dev_3.9.5-4_i386
+libzorpll-dev_3.9.1.3-1_i386
+libzrtpcpp-dev_2.0.0-3_i386
+libzthread-dev_2.3.2-7_i386
+libzvbi-dev_0.2.33-6_i386
+libzzip-dev_0.13.56-1.1_i386
+licq-dev_1.6.1-3_all
+linux-libc-dev_3.2.57-3_i386
+lldpad-dev_0.9.44-1_i386
+llvm-2.9-dev_2.9+dfsg-7_i386
+llvm-3.0-dev_3.0-10_i386
+llvm-3.1-dev_3.1-1_i386
+llvm-dev_1:3.0-14+nmu2_i386
+lttv-dev_0.12.38-21032011-1+b1_i386
+lua-apr-dev_0.23.2-1_i386
+lua-bitop-dev_1.0.2-1_i386
+lua-curl-dev_0.3.0-7_i386
+lua-curses-dev_5.1.19-2_i386
+lua-cyrussasl-dev_1.0.0-4_i386
+lua-dbi-mysql-dev_0.5+svn78-4_i386
+lua-dbi-postgresql-dev_0.5+svn78-4_i386
+lua-dbi-sqlite3-dev_0.5+svn78-4_i386
+lua-event-dev_0.4.1-2_i386
+lua-expat-dev_1.2.0-5+deb7u1_i386
+lua-filesystem-dev_1.5.0+16+g84f1af5-1_i386
+lua-iconv-dev_7-1_i386
+lua-ldap-dev_1.1.0-1-geeac494-3_i386
+lua-leg-dev_0.1.2-8_all
+lua-lgi-dev_0.6.2-1_i386
+lua-lpeg-dev_0.10.2-5_i386
+lua-md5-dev_1.1.2-6_i386
+lua-penlight-dev_1.0.2+htmldoc-2_all
+lua-posix-dev_5.1.19-2_i386
+lua-rex-onig-dev_2.6.0-2_i386
+lua-rex-pcre-dev_2.6.0-2_i386
+lua-rex-posix-dev_2.6.0-2_i386
+lua-rex-tre-dev_2.6.0-2_i386
+lua-rings-dev_1.2.3-1_i386
+lua-sec-dev_0.4.1-1_i386
+lua-socket-dev_2.0.2-8_i386
+lua-sql-mysql-dev_2.3.0-1+build0_i386
+lua-sql-postgres-dev_2.3.0-1+build0_i386
+lua-sql-sqlite3-dev_2.3.0-1+build0_i386
+lua-svn-dev_0.4.0-7_i386
+lua-wsapi-fcgi-dev_1.5-3_i386
+lua-zip-dev_1.2.3-11_i386
+lua-zlib-dev_0.2-1_i386
+lua5.1-policy-dev_33_all
+lv2-dev_1.0.0~dfsg2-2_i386
+lxc-dev_0.8.0~rc1-8+deb7u2_i386
+lzma-dev_9.22-2_all
+manpages-de-dev_1.2-1_all
+manpages-dev_3.44-1_all
+manpages-fr-dev_3.44d1p1-1_all
+manpages-ja-dev_0.5.0.0.20120606-1_all
+manpages-pl-dev_1:0.3-1_all
+manpages-pt-dev_20040726-4_all
+matlab-support-dev_0.0.18_all
+mdbtools-dev_0.7-1+deb7u1_i386
+med-bio-dev_1.13.2_all
+med-imaging-dev_1.13.2_all
+mesa-common-dev_8.0.5-4+deb7u2_i386
+mffm-fftw-dev_1.7-3_i386
+mffm-timecode-dev_1.6-2_all
+mingw-w64-dev_2.0.3-1_all
+mingw-w64-i686-dev_2.0.3-1_all
+mingw-w64-x86-64-dev_2.0.3-1_all
+minpack-dev_19961126+dfsg1-1_i386
+mongodb-dev_1:2.0.6-1.1_i386
+mpi-default-dev_1.0.1_i386
+muroard-dev_0.1.10-2_i386
+neko-dev_1.8.1-6_all
+nettle-dev_2.4-3_i386
+network-manager-dev_0.9.4.0-10_i386
+ntfs-3g-dev_1:2012.1.15AR.5-2.1_i386
+ocfs2-tools-dev_1.6.4-1+deb7u1_i386
+ocl-icd-dev_1.3-3_i386
+ocl-icd-opencl-dev_1.3-3_i386
+ocsigen-dev_1.3.4-2_all
+octave-pkg-dev_1.0.2_all
+ofono-dev_1.6-2_all
+okteta-dev_4:4.8.4+dfsg-1_i386
+okular-dev_4:4.8.4-3_i386
+open-vm-tools-dev_2:8.8.0+2012.05.21-724730-1+nmu2_all
+openais-dev_1.1.4-4.1_i386
+openbox-dev_3.5.0-7_i386
+openchangeserver-dev_1:1.0-3_i386
+oss4-dev_4.2-build2006-2+deb7u1_all
+pacemaker-dev_1.1.7-1_i386
+packaging-dev_0.4_all
+paraview-dev_3.14.1-6_i386
+parole-dev_0.2.0.6-1+b1_i386
+parser3-dev_3.4.2-2_i386
+pbs-drmaa-dev_1.0.10-3_i386
+petsc-dev_3.2.dfsg-6_all
+php5-dev_5.4.4-14+deb7u9_i386
+pidgin-dev_2.10.9-1~deb7u1_all
+pinball-dev_0.3.1-13.1_i386
+planetpenguin-racer-gimp-dev_0.4-5_all
+planner-dev_0.14.6-1_i386
+plplot-tcl-dev_5.9.9-5_i386
+plptools-dev_1.0.9-2.4_i386
+plymouth-dev_0.8.5.1-5_i386
+portaudio19-dev_19+svn20111121-1_i386
+postfix-dev_2.9.6-2_all
+ppl-dev_0.11.2-8_i386
+ppp-dev_2.4.5-5.1_all
+prayer-templates-dev_1.3.4-dfsg1-1_i386
+proftpd-dev_1.3.4a-5+deb7u1_i386
+pslib-dev_0.4.5-3_i386
+publib-dev_0.40-1_i386
+puredata-dev_0.43.2-5_all
+pvm-dev_3.4.5-12.5_i386
+pxlib-dev_0.6.5-1_i386
+python-all-dev_2.7.3-4+deb7u1_all
+python-apt-dev_0.8.8.2_all
+python-cairo-dev_1.8.8-1_all
+python-cxx-dev_6.2.4-3_all
+python-dbus-dev_1.1.1-1_all
+python-dev_2.7.3-4+deb7u1_all
+python-egenix-mx-base-dev_3.2.1-1.1_all
+python-gamera-dev_3.3.3-2_all
+python-gi-dev_3.2.2-2_all
+python-gnome2-desktop-dev_2.32.0+dfsg-2_all
+python-gnome2-dev_2.28.1+dfsg-1_all
+python-gnome2-extras-dev_2.25.3-12_all
+python-gobject-2-dev_2.28.6-10_all
+python-gobject-dev_3.2.2-2_all
+python-greenlet-dev_0.3.1-2.5_i386
+python-gst0.10-dev_0.10.22-3_i386
+python-gtk2-dev_2.24.0-3_all
+python-kde4-dev_4:4.8.4-1_all
+python-ldb-dev_1:1.1.6-1_i386
+python-openturns-dev_1.0-4_i386
+python-pyorbit-dev_2.24.0-6_all
+python-qt4-dev_4.9.3-4_all
+python-sip-dev_4.13.3-2_i386
+python-talloc-dev_2.0.7+git20120207-1_i386
+python-webkit-dev_1.1.8-2_all
+python2.6-dev_2.6.8-1.1_i386
+python2.7-dev_2.7.3-6+deb7u2_i386
+python3-all-dev_3.2.3-6_all
+python3-cairo-dev_1.10.0+dfsg-2_all
+python3-cxx-dev_6.2.4-3_all
+python3-dev_3.2.3-6_all
+python3-sip-dev_4.13.3-2_i386
+python3.2-dev_3.2.3-7_i386
+qmf-dev_1.0.7~2011w23.2-2.1_i386
+qtmobility-dev_1.2.0-3_i386
+r-base-dev_2.15.1-4_all
+regina-normal-dev_4.93-1_i386
+resource-agents-dev_1:3.9.2-5+deb7u2_i386
+rhythmbox-dev_2.97-2.1_i386
+rivet-plugins-dev_1.8.0-1_all
+roarplaylistd-dev_0.1.1-2_all
+robot-player-dev_3.0.2+dfsg-4_all
+ruby-dev_1:1.9.3_all
+ruby-gnome2-dev_1.1.3-2+b1_i386
+ruby1.8-dev_1.8.7.358-7.1+deb7u1_i386
+ruby1.9.1-dev_1.9.3.194-8.1+deb7u2_i386
+rygel-1.0-dev_0.14.3-2+deb7u1_i386
+samba4-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+sbnc-php-dev_1.2-26_all
+science-astronomy-dev_1.0_all
+science-dataacquisition-dev_1.0_all
+science-engineering-dev_1.0_all
+science-highenergy-physics-dev_1.0_all
+science-mathematics-dev_1.0_all
+science-meteorology-dev_1.0_all
+science-nanoscale-physics-dev_1.0_all
+science-physics-dev_1.0_all
+scim-dev_1.4.13-5_all
+sciplot-dev_1.36-15_i386
+selinux-policy-dev_2:2.20110726-12_all
+seqan-dev_1.3.1-1_all
+sfftw-dev_2.1.5-1_i386
+skalibs-dev_0.47-1_i386
+slurm-drmaa-dev_1.0.4-3_i386
+slurm-llnl-basic-plugins-dev_2.3.4-2+b1_i386
+snappea-dev_3.0d3-22_i386
+spl-dev_1.0~pre6-3.1+b1_i386
+sra-toolkit-libs-dev_2.1.7a-1_i386
+ss-dev_2.0-1.42.5-1.1_i386
+stx-btree-dev_0.8.6-1_all
+styx-dev_1.8.0-1.1_i386
+supercollider-dev_1:3.4.5-1wheezy1_i386
+svdrpservice-dev_0.0.4-14_all
+sweep-dev_0.9.3-6_all
+swish-e-dev_2.4.7-3_i386
+syfi-dev_1.0.0.dfsg-1_all
+system-tools-backends-dev_2.10.2-1_all
+systemtap-sdt-dev_1.7-1+deb7u1_i386
+tcl-dev_8.5.0-2.1_all
+tcl-memchan-dev_2.3-2_i386
+tcl-trf-dev_2.1.4-dfsg1-1_i386
+tcl8.4-dev_8.4.19-5_i386
+tcl8.5-dev_8.5.11-2_i386
+tclcl-dev_1.20-6_all
+tclx8.4-dev_8.4.0-3_i386
+tclxml-dev_3.3~svn11-2_i386
+tdom-dev_0.8.3~20080525-3+nmu2_i386
+tesseract-ocr-dev_3.02.01-6_all
+tix-dev_8.4.3-4_i386
+tk-dev_8.5.0-2.1_all
+tk8.4-dev_8.4.19-5_i386
+tk8.5-dev_8.5.11-2_i386
+tqsllib-dev_2.2-5_i386
+trafficserver-dev_3.0.5-1_i386
+tuxpaint-dev_1:0.9.21-1.1_all
+unagi-dev_0.3.3-2_i386
+unixodbc-dev_2.2.14p2-5_i386
+uthash-dev_1.9.5-1_all
+uuid-dev_2.20.1-5.3_i386
+vdr-dev_1.7.28-1_all
+vflib3-dev_3.6.14.dfsg-3+b1_i386
+voms-dev_2.0.8-1_i386
+vstream-client-dev_1.2-6.1_i386
+wcslib-dev_4.13.4-1_i386
+weechat-dev_0.3.8-1+deb7u1_all
+wireshark-dev_1.8.2-5wheezy10_i386
+witty-dev_3.2.1-2_all
+wordnet-dev_1:3.0-29_i386
+wzdftpd-dev_0.8.3-6.2_i386
+x11proto-bigreqs-dev_1:1.1.2-1_all
+x11proto-composite-dev_1:0.4.2-2_all
+x11proto-core-dev_7.0.23-1_all
+x11proto-damage-dev_1:1.2.1-2_all
+x11proto-dmx-dev_1:2.3.1-2_all
+x11proto-dri2-dev_2.6-2_all
+x11proto-fixes-dev_1:5.0-2_all
+x11proto-fonts-dev_2.1.2-1_all
+x11proto-gl-dev_1.4.15-1_all
+x11proto-input-dev_2.2-1_all
+x11proto-kb-dev_1.0.6-2_all
+x11proto-print-dev_1.0.5-2_all
+x11proto-randr-dev_1.3.2-2_all
+x11proto-record-dev_1.14.2-1_all
+x11proto-render-dev_2:0.11.1-2_all
+x11proto-resource-dev_1.2.0-3_all
+x11proto-scrnsaver-dev_1.2.2-1_all
+x11proto-video-dev_2.3.1-2_all
+x11proto-xcmisc-dev_1.2.2-1_all
+x11proto-xext-dev_7.2.1-1_all
+x11proto-xf86bigfont-dev_1.2.0-3_all
+x11proto-xf86dga-dev_2.1-3_all
+x11proto-xf86dri-dev_2.1.1-2_all
+x11proto-xf86vidmode-dev_2.3.1-2_all
+x11proto-xinerama-dev_1.2.1-2_all
+xaw3dg-dev_1.5+E-18.2_i386
+xbmc-eventclients-dev_2:11.0~git20120510.82388d5-1_all
+xfce4-panel-dev_4.8.6-4_i386
+xfslibs-dev_3.1.7+b1_i386
+xmhtml1-dev_1.1.7-18_i386
+xmms2-dev_0.8+dfsg-4_all
+xorg-dev_1:7.7+3~deb7u1_all
+xotcl-dev_1.6.7-2_i386
+xpaint-dev_2.9.1.4-3+b2_i386
+xserver-xorg-dev_2:1.12.4-6+deb7u2_i386
+xserver-xorg-input-evdev-dev_1:2.7.0-1_all
+xserver-xorg-input-joystick-dev_1:1.6.1-1_all
+xserver-xorg-input-synaptics-dev_1.6.2-2_all
+xtrans-dev_1.2.7-1_all
+xulrunner-dev_24.4.0esr-1~deb7u2_i386
+xutils-dev_1:7.7~1_i386
+xviewg-dev_3.2p1.4-28.1_i386
+yate-dev_4.1.0-1~dfsg-3_i386
+yorick-dev_2.2.02+dfsg-6_i386
+zathura-dev_0.1.2-4_all
+zlib1g-dev_1:1.2.7.dfsg-13_i386
+znc-dev_0.206-2_i386
+zsh-dev_4.3.17-1_i386
\ No newline at end of file
diff --git a/src/github.com/smira/aptly/system/t05_snapshot/SearchSnapshot2Test_gold b/src/github.com/smira/aptly/system/t05_snapshot/SearchSnapshot2Test_gold
new file mode 100644
index 00000000..f7073402
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t05_snapshot/SearchSnapshot2Test_gold
@@ -0,0 +1 @@
+ERROR: unable to search: snapshot with name snapshot-xx not found
diff --git a/src/github.com/smira/aptly/system/t05_snapshot/SearchSnapshot3Test_gold b/src/github.com/smira/aptly/system/t05_snapshot/SearchSnapshot3Test_gold
new file mode 100644
index 00000000..58f09611
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t05_snapshot/SearchSnapshot3Test_gold
@@ -0,0 +1 @@
+ERROR: unable to search: parsing failed: unexpected token : expecting ')'
diff --git a/src/github.com/smira/aptly/system/t05_snapshot/SearchSnapshot4Test_gold b/src/github.com/smira/aptly/system/t05_snapshot/SearchSnapshot4Test_gold
new file mode 100644
index 00000000..007f3b4f
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t05_snapshot/SearchSnapshot4Test_gold
@@ -0,0 +1,95 @@
+
+coreutils_8.13-3.5_amd64
+coreutils_8.13-3.5_i386
+debconf_1.5.49_all
+dpkg_1.16.12_amd64
+dpkg_1.16.12_i386
+fontconfig-config_2.9.0-7.1_all
+fonts-freefont-ttf_20120503-1_all
+gcc-4.7-base_4.7.2-5_amd64
+gcc-4.7-base_4.7.2-5_i386
+gsfonts-x11_0.22_all
+gsfonts_1:8.11+urwcyr1.0.7~pre44-4.2_all
+libacl1_2.2.51-8_amd64
+libacl1_2.2.51-8_i386
+libattr1_1:2.4.46-8_amd64
+libattr1_1:2.4.46-8_i386
+libbz2-1.0_1.0.6-4_amd64
+libbz2-1.0_1.0.6-4_i386
+libc-bin_2.13-38+deb7u1_amd64
+libc-bin_2.13-38+deb7u1_i386
+libc6_2.13-38+deb7u1_amd64
+libc6_2.13-38+deb7u1_i386
+libexpat1_2.1.0-1+deb7u1_amd64
+libexpat1_2.1.0-1+deb7u1_i386
+libfontconfig1_2.9.0-7.1_amd64
+libfontconfig1_2.9.0-7.1_i386
+libfontenc1_1:1.1.1-1_amd64
+libfontenc1_1:1.1.1-1_i386
+libfreetype6_2.4.9-1.1_amd64
+libfreetype6_2.4.9-1.1_i386
+libgcc1_1:4.7.2-5_amd64
+libgcc1_1:4.7.2-5_i386
+libgcrypt11_1.5.0-5+deb7u1_amd64
+libgcrypt11_1.5.0-5+deb7u1_i386
+libgd2-noxpm_2.0.36~rc1~dfsg-6.1_amd64
+libgd2-noxpm_2.0.36~rc1~dfsg-6.1_i386
+libgd2-xpm_2.0.36~rc1~dfsg-6.1_amd64
+libgd2-xpm_2.0.36~rc1~dfsg-6.1_i386
+libgeoip1_1.4.8+dfsg-3_amd64
+libgeoip1_1.4.8+dfsg-3_i386
+libgpg-error0_1.10-3.1_amd64
+libgpg-error0_1.10-3.1_i386
+libjpeg8_8d-1_amd64
+libjpeg8_8d-1_i386
+liblzma5_5.1.1alpha+20120614-2_amd64
+liblzma5_5.1.1alpha+20120614-2_i386
+libpam0g_1.1.3-7.1_amd64
+libpam0g_1.1.3-7.1_i386
+libpcre3_1:8.30-5_amd64
+libpcre3_1:8.30-5_i386
+libpng12-0_1.2.49-1_amd64
+libpng12-0_1.2.49-1_i386
+libselinux1_2.1.9-5_amd64
+libselinux1_2.1.9-5_i386
+libssl1.0.0_1.0.1e-2+deb7u7_amd64
+libssl1.0.0_1.0.1e-2+deb7u7_i386
+libx11-6_2:1.5.0-1+deb7u1_amd64
+libx11-6_2:1.5.0-1+deb7u1_i386
+libx11-data_2:1.5.0-1+deb7u1_all
+libxau6_1:1.0.7-1_amd64
+libxau6_1:1.0.7-1_i386
+libxcb1_1.8.1-2+deb7u1_amd64
+libxcb1_1.8.1-2+deb7u1_i386
+libxdmcp6_1:1.1.1-1_amd64
+libxdmcp6_1:1.1.1-1_i386
+libxfont1_1:1.4.5-3_amd64
+libxfont1_1:1.4.5-3_i386
+libxml2_2.8.0+dfsg1-7+nmu3_amd64
+libxml2_2.8.0+dfsg1-7+nmu3_i386
+libxpm4_1:3.5.10-1_amd64
+libxpm4_1:3.5.10-1_i386
+libxslt1.1_1.1.26-14.1_amd64
+libxslt1.1_1.1.26-14.1_i386
+lsb-base_4.1+Debian8+deb7u1_all
+multiarch-support_2.13-38+deb7u1_amd64
+multiarch-support_2.13-38+deb7u1_i386
+nginx-common_1.2.1-2.2+wheezy2_all
+nginx-full_1.2.1-2.2+wheezy2_amd64
+nginx-full_1.2.1-2.2+wheezy2_i386
+nginx-light_1.2.1-2.2+wheezy2_amd64
+nginx-light_1.2.1-2.2+wheezy2_i386
+nginx_1.2.1-2.2+wheezy2_all
+perl-base_5.14.2-21+deb7u1_amd64
+perl-base_5.14.2-21+deb7u1_i386
+tar_1.26+dfsg-0.1_amd64
+tar_1.26+dfsg-0.1_i386
+ttf-bitstream-vera_1.10-8_all
+ttf-dejavu-core_2.33-3_all
+ucf_3.0025+nmu3_all
+x11-common_1:7.7+3~deb7u1_all
+xfonts-encodings_1:1.0.4-1_all
+xfonts-utils_1:7.7~1_amd64
+xfonts-utils_1:7.7~1_i386
+zlib1g_1:1.2.7.dfsg-13_amd64
+zlib1g_1:1.2.7.dfsg-13_i386
\ No newline at end of file
diff --git a/src/github.com/smira/aptly/system/t05_snapshot/VerifySnapshot4Test_gold b/src/github.com/smira/aptly/system/t05_snapshot/VerifySnapshot4Test_gold
index 7511132a..1d6c02ce 100644
--- a/src/github.com/smira/aptly/system/t05_snapshot/VerifySnapshot4Test_gold
+++ b/src/github.com/smira/aptly/system/t05_snapshot/VerifySnapshot4Test_gold
@@ -1,6 +1,6 @@
Loading packages...
Verifying...
-Missing dependencies (1742):
+Missing dependencies (1737):
915resolution [i386]
9fonts [i386]
abakus [i386]
@@ -74,7 +74,6 @@ Missing dependencies (1742):
big-blast [i386]
bigdft [i386]
bigsdb [i386]
- bind [i386]
bioclipse [i386]
bioimagesuite [i386]
bioimagexd [i386]
@@ -205,7 +204,6 @@ Missing dependencies (1742):
elmer-doc [i386]
elph [i386]
emacs-wiki [i386]
- emacs22 [i386]
emacs23-common-non-dfsg [i386]
emacspeak-ss [i386]
embassy [i386]
@@ -576,7 +574,6 @@ Missing dependencies (1742):
kbackgammon [i386]
kbdcontrol [i386]
kchart [i386]
- kde [i386]
kde-icons-crystal [i386]
kde-icons-oxygen [i386]
kde-l10n (>= 4:4.8.4) [i386]
@@ -1644,7 +1641,6 @@ Missing dependencies (1742):
ttf-larabie-deco [i386]
ttf-larabie-straight [i386]
ttf-mscorefonts-installer [i386]
- ttf-thryomanes [i386]
ttf-ubuntu-font-family (>= 0.80-0ubuntu1~medium) [i386]
ttf2pt1 [i386]
tuxpaint (= 1:0.9.21) [i386]
@@ -1726,7 +1722,6 @@ Missing dependencies (1742):
xmind [i386]
xnat [i386]
xorsa [i386]
- xpdf-reader [i386]
xsidplay [i386]
xtranslate [i386]
xul-ext-gnome-keyring [i386]
diff --git a/src/github.com/smira/aptly/system/t05_snapshot/VerifySnapshot5Test_gold b/src/github.com/smira/aptly/system/t05_snapshot/VerifySnapshot5Test_gold
index a13ee544..39e0af1c 100644
--- a/src/github.com/smira/aptly/system/t05_snapshot/VerifySnapshot5Test_gold
+++ b/src/github.com/smira/aptly/system/t05_snapshot/VerifySnapshot5Test_gold
@@ -1,6 +1,6 @@
Loading packages...
Verifying...
-Missing dependencies (1622):
+Missing dependencies (1617):
915resolution [i386]
9fonts [i386]
abakus [i386]
@@ -71,7 +71,6 @@ Missing dependencies (1622):
big-blast [i386]
bigdft [i386]
bigsdb [i386]
- bind [i386]
bioclipse [i386]
bioimagesuite [i386]
bioimagexd [i386]
@@ -188,7 +187,6 @@ Missing dependencies (1622):
elexis [i386]
elph [i386]
emacs-wiki [i386]
- emacs22 [i386]
emacspeak-ss [i386]
embassy [i386]
embassy-phylip [i386]
@@ -515,7 +513,6 @@ Missing dependencies (1622):
kbackgammon [i386]
kbdcontrol [i386]
kchart [i386]
- kde [i386]
kde-icons-crystal [i386]
kde-icons-oxygen [i386]
kde-l10n (>= 4:4.8.4) [i386]
@@ -1535,7 +1532,6 @@ Missing dependencies (1622):
tripal [i386]
trnascan-se [i386]
tscope [i386]
- ttf-thryomanes [i386]
ttf-ubuntu-font-family (>= 0.80-0ubuntu1~medium) [i386]
ttf2pt1 [i386]
tuxpaint (= 1:0.9.21) [i386]
@@ -1607,7 +1603,6 @@ Missing dependencies (1622):
xmind [i386]
xnat [i386]
xorsa [i386]
- xpdf-reader [i386]
xsidplay [i386]
xtranslate [i386]
xul-ext-gnome-keyring [i386]
diff --git a/src/github.com/smira/aptly/system/t05_snapshot/VerifySnapshot6Test_gold b/src/github.com/smira/aptly/system/t05_snapshot/VerifySnapshot6Test_gold
index af5b29d8..f4083476 100644
--- a/src/github.com/smira/aptly/system/t05_snapshot/VerifySnapshot6Test_gold
+++ b/src/github.com/smira/aptly/system/t05_snapshot/VerifySnapshot6Test_gold
@@ -1,6 +1,6 @@
Loading packages...
Verifying...
-Missing dependencies (3797):
+Missing dependencies (3781):
915resolution [amd64]
915resolution [i386]
9fonts [amd64]
@@ -51,8 +51,6 @@ Missing dependencies (3797):
angband-audio [i386]
aolserver-doc (>= 4.0.1-1) [amd64]
aolserver-doc (>= 4.0.1-1) [i386]
- apache [amd64]
- apache [i386]
apache-ssl [amd64]
apache-ssl [i386]
ape [amd64]
@@ -161,8 +159,6 @@ Missing dependencies (3797):
bigdft [i386]
bigsdb [amd64]
bigsdb [i386]
- bind [amd64]
- bind [i386]
bioclipse [amd64]
bioclipse [i386]
bioimagesuite [amd64]
@@ -458,8 +454,6 @@ Missing dependencies (3797):
elph [i386]
emacs-wiki [amd64]
emacs-wiki [i386]
- emacs22 [amd64]
- emacs22 [i386]
emacs23-common-non-dfsg [amd64]
emacs23-common-non-dfsg [i386]
emacspeak-ss [amd64]
@@ -1264,8 +1258,6 @@ Missing dependencies (3797):
kbdcontrol [i386]
kchart [amd64]
kchart [i386]
- kde [amd64]
- kde [i386]
kde-i18n-he [amd64]
kde-i18n-he [i386]
kde-icons-crystal [amd64]
@@ -2192,8 +2184,6 @@ Missing dependencies (3797):
mesquite [i386]
metadisorder [amd64]
metadisorder [i386]
- metamail [amd64]
- metamail [i386]
metarep [amd64]
metarep [i386]
mga-vid-module [amd64]
@@ -3508,8 +3498,6 @@ Missing dependencies (3797):
tc-utils [i386]
tempo [amd64]
tempo [i386]
- tetex-bin [amd64]
- tetex-bin [i386]
tetra [amd64]
tetra [i386]
texinfo-doc-nonfree [amd64]
@@ -3590,8 +3578,6 @@ Missing dependencies (3797):
ttf-larabie-straight [i386]
ttf-mscorefonts-installer [amd64]
ttf-mscorefonts-installer [i386]
- ttf-thryomanes [amd64]
- ttf-thryomanes [i386]
ttf-ubuntu-font-family (>= 0.80-0ubuntu1~medium) [amd64]
ttf-ubuntu-font-family (>= 0.80-0ubuntu1~medium) [i386]
ttf2pt1 [amd64]
@@ -3760,8 +3746,6 @@ Missing dependencies (3797):
xnat [i386]
xorsa [amd64]
xorsa [i386]
- xpdf-reader [amd64]
- xpdf-reader [i386]
xsidplay [amd64]
xsidplay [i386]
xtranslate [amd64]
diff --git a/src/github.com/smira/aptly/system/t05_snapshot/__init__.py b/src/github.com/smira/aptly/system/t05_snapshot/__init__.py
index 9b5bbd19..4e1995e9 100644
--- a/src/github.com/smira/aptly/system/t05_snapshot/__init__.py
+++ b/src/github.com/smira/aptly/system/t05_snapshot/__init__.py
@@ -11,3 +11,5 @@ from .diff import *
from .merge import *
from .drop import *
from .rename import *
+from .search import *
+from .filter import *
\ No newline at end of file
diff --git a/src/github.com/smira/aptly/system/t05_snapshot/filter.py b/src/github.com/smira/aptly/system/t05_snapshot/filter.py
new file mode 100644
index 00000000..340748e7
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t05_snapshot/filter.py
@@ -0,0 +1,98 @@
+from lib import BaseTest
+import re
+
+
+class FilterSnapshot1Test(BaseTest):
+ """
+ filter snapshot: simple filter
+ """
+ fixtureDB = True
+ fixtureCmds = [
+ "aptly snapshot create snap1 from mirror wheezy-non-free",
+ ]
+ runCmd = "aptly snapshot filter snap1 snap2 mame unrar"
+
+ def check(self):
+ def remove_created_at(s):
+ return re.sub(r"Created At: [0-9:A-Za-z -]+\n", "", s)
+
+ self.check_output()
+ self.check_cmd_output("aptly snapshot show -with-packages snap2", "snapshot_show", match_prepare=remove_created_at)
+
+
+class FilterSnapshot2Test(BaseTest):
+ """
+ filter snapshot: play with versions
+ """
+ fixtureDB = True
+ fixtureCmds = [
+ "aptly snapshot create snap1 from mirror wheezy-backports",
+ ]
+ runCmd = "aptly snapshot filter -with-deps snap1 snap2 'rsyslog (>= 7.4.4)'"
+
+ def check(self):
+ def remove_created_at(s):
+ return re.sub(r"Created At: [0-9:A-Za-z -]+\n", "", s)
+
+ self.check_output()
+ self.check_cmd_output("aptly snapshot show -with-packages snap2", "snapshot_show", match_prepare=remove_created_at)
+
+
+class FilterSnapshot3Test(BaseTest):
+ """
+ filter snapshot: complex condition
+ """
+ fixtureDB = True
+ fixtureCmds = [
+ "aptly snapshot create snap1 from mirror wheezy-main",
+ ]
+ runCmd = "aptly snapshot filter snap1 snap2 'Priority (required)' nginx xyz"
+
+ def check(self):
+ def remove_created_at(s):
+ return re.sub(r"Created At: [0-9:A-Za-z -]+\n", "", s)
+
+ self.check_output()
+ self.check_cmd_output("aptly snapshot show -with-packages snap2", "snapshot_show", match_prepare=remove_created_at)
+
+
+class FilterSnapshot5Test(BaseTest):
+ """
+ filter snapshot: no such snapshot
+ """
+ fixtureDB = True
+ fixtureCmds = [
+ ]
+ runCmd = "aptly snapshot filter snap1 snap2 'rsyslog (>= 7.4.4)'"
+ expectedCode = 1
+
+
+class FilterSnapshot6Test(BaseTest):
+ """
+ filter snapshot: duplicate snapshot
+ """
+ fixtureDB = True
+ fixtureCmds = [
+ "aptly snapshot create snap1 from mirror wheezy-main",
+ "aptly snapshot merge snap2 snap1",
+ ]
+ runCmd = "aptly snapshot filter snap1 snap2 'rsyslog (>= 7.4.4)'"
+ expectedCode = 1
+
+
+class FilterSnapshot7Test(BaseTest):
+ """
+ filter snapshot: follow sources
+ """
+ fixtureDB = True
+ fixtureCmds = [
+ "aptly snapshot create snap1 from mirror wheezy-backports-src",
+ ]
+ runCmd = "aptly -dep-follow-source snapshot filter -with-deps snap1 snap2 'rsyslog (>= 7.4.4), $$Architecture (i386)'"
+
+ def check(self):
+ def remove_created_at(s):
+ return re.sub(r"Created At: [0-9:A-Za-z -]+\n", "", s)
+
+ self.check_output()
+ self.check_cmd_output("aptly snapshot show --with-packages snap2", "snapshot_show", match_prepare=remove_created_at)
diff --git a/src/github.com/smira/aptly/system/t05_snapshot/search.py b/src/github.com/smira/aptly/system/t05_snapshot/search.py
new file mode 100644
index 00000000..3a065675
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t05_snapshot/search.py
@@ -0,0 +1,39 @@
+from lib import BaseTest
+
+
+class SearchSnapshot1Test(BaseTest):
+ """
+ search snapshot: regular search
+ """
+ fixtureDB = True
+ outputMatchPrepare = lambda _, s: "\n".join(sorted(s.split("\n")))
+ fixtureCmds = ["aptly snapshot create wheezy-main from mirror wheezy-main"]
+ runCmd = "aptly snapshot search wheezy-main '$$Architecture (i386), Name (% *-dev)'"
+
+
+class SearchSnapshot2Test(BaseTest):
+ """
+ search snapshot: missing snapshot
+ """
+ runCmd = "aptly snapshot search snapshot-xx 'Name'"
+ expectedCode = 1
+
+
+class SearchSnapshot3Test(BaseTest):
+ """
+ search snapshot: wrong expression
+ """
+ fixtureDB = True
+ fixtureCmds = ["aptly snapshot create wheezy-main from mirror wheezy-main"]
+ expectedCode = 1
+ runCmd = "aptly snapshot search wheezy-main '$$Architecture (i386'"
+
+
+class SearchSnapshot4Test(BaseTest):
+ """
+ search snapshot: with-deps search
+ """
+ fixtureDB = True
+ fixtureCmds = ["aptly snapshot create wheezy-main from mirror wheezy-main"]
+ outputMatchPrepare = lambda _, s: "\n".join(sorted(s.split("\n")))
+ runCmd = "aptly snapshot search -with-deps wheezy-main 'Name (nginx)'"
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishRepo12Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishRepo12Test_gold
index bee36b01..ee9f9d5e 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishRepo12Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishRepo12Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Local repo local-repo has been successfully published.
Please setup your webserver to serve directory '${HOME}/.aptly/public' with autoindexing.
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishRepo14Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishRepo14Test_gold
index 443899a1..c44a11e0 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishRepo14Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishRepo14Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishRepo15Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishRepo15Test_gold
index 443899a1..c44a11e0 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishRepo15Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishRepo15Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishRepo16Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishRepo16Test_gold
index 906bdcea..cbe2b131 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishRepo16Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishRepo16Test_gold
@@ -1,6 +1,7 @@
Warning: publishing from empty source, architectures list should be complete, it can't be changed after publishing (use -architectures flag)
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishRepo17Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishRepo17Test_gold
index 707a2715..0ccea7ca 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishRepo17Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishRepo17Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishRepo18Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishRepo18Test_gold
index a105d5fc..c24630e5 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishRepo18Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishRepo18Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishRepo1Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishRepo1Test_gold
index 8b8f3486..365295fa 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishRepo1Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishRepo1Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishRepo25Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishRepo25Test_gold
index 63326118..b65dfd33 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishRepo25Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishRepo25Test_gold
@@ -2,6 +2,7 @@ WARNING: force overwrite mode enabled, aptly might corrupt other published repos
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishRepo26Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishRepo26Test_gold
new file mode 100644
index 00000000..365295fa
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishRepo26Test_gold
@@ -0,0 +1,14 @@
+Loading packages...
+Generating metadata files and linking package files...
+Finalizing metadata files...
+Signing file 'Release' with gpg, please enter your passphrase when prompted:
+Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
+
+Local repo local-repo has been successfully published.
+Please setup your webserver to serve directory '${HOME}/.aptly/public' with autoindexing.
+Now you can add following line to apt sources:
+ deb http://your-server/ maverick main
+ deb-src http://your-server/ maverick main
+Don't forget to add your GPG key to apt with apt-key.
+
+You can also use `aptly serve` to publish your repositories over HTTP quickly.
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishRepo26Test_udeb_binary b/src/github.com/smira/aptly/system/t06_publish/PublishRepo26Test_udeb_binary
new file mode 100644
index 00000000..3f13340f
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishRepo26Test_udeb_binary
@@ -0,0 +1,20 @@
+Package: dmraid-udeb
+Version: 1.0.0.rc16-4.1
+Installed-Size: 36
+Priority: optional
+Section: debian-installer
+Maintainer: Giuseppe Iuculano
+Architecture: i386
+Description: Device-Mapper Software RAID support tool (udeb)
+ dmraid discovers, activates, deactivates and displays properties
+ of software RAID sets (eg, ATARAID) and contained DOS partitions.
+ .
+ This is the minimal package (udeb) used by debian-installer
+MD5sum: 4d8bb4dafb0ef9059dac75846e162784
+SHA1: fd5c73e08d4c5381b1136c2ff170332d77526246
+SHA256: fe4ff3351186f03039f8cd6f78e8e4f473a75b613f950caac06fa21dda2d59e8
+Source: dmraid
+Size: 11022
+Depends: libc6-udeb (>= 2.11), libdmraid1.0.0.rc16-udeb (>= 1.0.0.rc16), dmsetup-udeb
+Filename: pool/main/d/dmraid/dmraid-udeb_1.0.0.rc16-4.1_i386.udeb
+
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishRepo27Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishRepo27Test_gold
new file mode 100644
index 00000000..365295fa
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishRepo27Test_gold
@@ -0,0 +1,14 @@
+Loading packages...
+Generating metadata files and linking package files...
+Finalizing metadata files...
+Signing file 'Release' with gpg, please enter your passphrase when prompted:
+Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
+
+Local repo local-repo has been successfully published.
+Please setup your webserver to serve directory '${HOME}/.aptly/public' with autoindexing.
+Now you can add following line to apt sources:
+ deb http://your-server/ maverick main
+ deb-src http://your-server/ maverick main
+Don't forget to add your GPG key to apt with apt-key.
+
+You can also use `aptly serve` to publish your repositories over HTTP quickly.
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishRepo27Test_udeb_binary b/src/github.com/smira/aptly/system/t06_publish/PublishRepo27Test_udeb_binary
new file mode 100644
index 00000000..dbfc3986
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishRepo27Test_udeb_binary
@@ -0,0 +1,20 @@
+Package: dmraid-udeb
+Version: 1.0.0.rc16-4.1
+Installed-Size: 36
+Priority: optional
+Section: debian-installer
+Maintainer: Giuseppe Iuculano
+Architecture: i386
+Description: Device-Mapper Software RAID support tool (udeb)
+ dmraid discovers, activates, deactivates and displays properties
+ of software RAID sets (eg, ATARAID) and contained DOS partitions.
+ .
+ This is the minimal package (udeb) used by debian-installer
+MD5sum: 4d8bb4dafb0ef9059dac75846e162784
+SHA1: fd5c73e08d4c5381b1136c2ff170332d77526246
+SHA256: fe4ff3351186f03039f8cd6f78e8e4f473a75b613f950caac06fa21dda2d59e8
+Filename: pool/main/d/dmraid/dmraid-udeb_1.0.0.rc16-4.1_i386.udeb
+Size: 11022
+Source: dmraid
+Depends: libc6-udeb (>= 2.11), libdmraid1.0.0.rc16-udeb (>= 1.0.0.rc16), dmsetup-udeb
+
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishRepo2Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishRepo2Test_gold
index 443899a1..c44a11e0 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishRepo2Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishRepo2Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishRepo3Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishRepo3Test_gold
index 4aa7a0e2..0b9fb7c9 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishRepo3Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishRepo3Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishRepo4Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishRepo4Test_gold
index 0e0a9c7b..82b3864d 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishRepo4Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishRepo4Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot13Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot13Test_gold
index 848cd407..e9a324b8 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot13Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot13Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Snapshot snap13 has been successfully published.
Please setup your webserver to serve directory '${HOME}/.aptly/public' with autoindexing.
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot15Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot15Test_gold
index e0fafd8c..b5b73ebe 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot15Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot15Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Snapshot snap15 has been successfully published.
Please setup your webserver to serve directory '${HOME}/.aptly/public' with autoindexing.
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot16Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot16Test_gold
index e7518879..0befa253 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot16Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot16Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot17Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot17Test_gold
index a1d7e456..66bc66b4 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot17Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot17Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot19Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot19Test_gold
index 17f563c4..4546c238 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot19Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot19Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Snapshot snap5 has been successfully published.
Please setup your webserver to serve directory '${HOME}/.aptly/public' with autoindexing.
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot1Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot1Test_gold
index f21e3054..8cf10f19 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot1Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot1Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot1Test_packages_amd64 b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot1Test_packages_amd64
new file mode 100644
index 00000000..fe39b007
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot1Test_packages_amd64
@@ -0,0 +1,109 @@
+Package: gnuplot
+Version: 4.6.1-1~maverick2
+Installed-Size: 20
+Priority: optional
+Section: math
+Maintainer: Debian Science Team
+Architecture: all
+Description: Command-line driven interactive plotting program
+ Gnuplot is a portable command-line driven interactive data and function
+ plotting utility that supports lots of output formats, including drivers
+ for many printers, (La)TeX, (x)fig, Postscript, and so on. The X11-output
+ is packaged in gnuplot-x11.
+ .
+ Data files and self-defined functions can be manipulated by the internal
+ C-like language. Can perform smoothing, spline-fitting, or nonlinear fits,
+ and can work with complex numbers.
+ .
+ This package is for transition and to install a full-featured gnuplot
+ supporting the X11-output.
+MD5sum: 4912a4464d5588f685c4aa6cfc6be46c
+SHA1: 4a50deb413e05f77b31687405465b1229b3be328
+Source:
+Size: 1046
+Filename: pool/main/g/gnuplot/gnuplot_4.6.1-1~maverick2_all.deb
+Suggests: gnuplot-doc (>= 4.6.1-1~maverick2)
+Depends: gnuplot-nox (>= 4.6.1-1~maverick2), gnuplot-x11 (>= 4.6.1-1~maverick2)
+
+Package: gnuplot-doc
+Version: 4.6.1-1~maverick2
+Installed-Size: 5572
+Priority: optional
+Section: doc
+Maintainer: Debian Science Team
+Architecture: all
+Description: Command-line driven interactive plotting program
+ Gnuplot is a portable command-line driven interactive data and function
+ plotting utility that supports lots of output formats, including drivers
+ for many printers, (La)TeX, (x)fig, Postscript, and so on. The X11-output
+ is packaged in gnuplot-x11.
+ .
+ Data files and self-defined functions can be manipulated by the internal
+ C-like language. Can perform smoothing, spline-fitting, or nonlinear fits,
+ and can work with complex numbers.
+ .
+ This package contains the additional documentation.
+MD5sum: 25a5028811171f2f1fa157a2f6953e82
+SHA1: 837dd002143054ca01d3b01cae410cc4b4fe10c4
+Source: gnuplot
+Depends: dpkg (>= 1.15.4) | install-info
+Filename: pool/main/g/gnuplot/gnuplot-doc_4.6.1-1~maverick2_all.deb
+Size: 2675242
+
+Package: gnuplot-nox
+Version: 4.6.1-1~maverick2
+Installed-Size: 2624
+Priority: optional
+Section: math
+Maintainer: Debian Science Team
+Architecture: amd64
+Description: Command-line driven interactive plotting program
+ Gnuplot is a portable command-line driven interactive data and function
+ plotting utility that supports lots of output formats, including drivers
+ for many printers, (La)TeX, (x)fig, Postscript, and so on. The X11-output
+ is packaged in gnuplot-x11.
+ .
+ Data files and self-defined functions can be manipulated by the internal
+ C-like language. Can perform smoothing, spline-fitting, or nonlinear fits,
+ and can work with complex numbers.
+ .
+ This package is for working without an X server.
+MD5sum: db55daca818697b23024255e536399da
+SHA1: d5a1b0bbfb562e5cecef3f3fb70ddb4cd6103507
+Suggests: gnuplot-x11 (>= 4.6.1-1~maverick2), gnuplot-doc (>= 4.6.1-1~maverick2)
+Filename: pool/main/g/gnuplot/gnuplot-nox_4.6.1-1~maverick2_amd64.deb
+Replaces: gnuplot (<< 4.0.0)
+Source: gnuplot
+Recommends: groff, ttf-liberation
+Size: 1129114
+Depends: libc6 (>= 2.11), libcairo2 (>= 1.6.0), libedit2 (>= 2.5.cvs.20010821-1), libgd2-noxpm (>= 2.0.36~rc1~dfsg) | libgd2-xpm (>= 2.0.36~rc1~dfsg), libglib2.0-0 (>= 2.12.0), liblua5.1-0, libpango1.0-0 (>= 1.14.0)
+
+Package: gnuplot-x11
+Version: 4.6.1-1~maverick2
+Installed-Size: 1716
+Priority: optional
+Section: math
+Maintainer: Debian Science Team
+Architecture: amd64
+Description: Command-line driven interactive plotting program
+ Gnuplot is a portable command-line driven interactive data and function
+ plotting utility that supports lots of output formats, including drivers
+ for many printers, (La)TeX, (x)fig, Postscript, and so on. The X11-output
+ is packaged in gnuplot-x11.
+ .
+ Data files and self-defined functions can be manipulated by the internal
+ C-like language. Can perform smoothing, spline-fitting, or nonlinear fits,
+ and can work with complex numbers.
+ .
+ This package contains the terminal driver that enables gnuplot to plot
+ images interactively under X11. Most users will want this, it is however
+ packaged separately so that low-end systems don't need X installed to use
+ gnuplot.
+MD5sum: 17ab6787992b979e3a4851a90dfaf0a8
+SHA1: d60b0ee30a885ba0202adddccd7968ab70be7426
+Size: 819248
+Source: gnuplot
+Depends: gnuplot-nox (>= 4.6.1-1~maverick2), libc6 (>= 2.11), libcairo2 (>= 1.6.0), libedit2 (>= 2.5.cvs.20010821-1), libgcc1 (>= 1:4.1.1), libgd2-noxpm (>= 2.0.36~rc1~dfsg) | libgd2-xpm (>= 2.0.36~rc1~dfsg), libglib2.0-0 (>= 2.12.0), liblua5.1-0, libpango1.0-0 (>= 1.14.0), libstdc++6 (>= 4.1.1), libwxbase2.8-0 (>= 2.8.11.0), libwxgtk2.8-0 (>= 2.8.11.0), libx11-6
+Replaces: gnuplot (<< 4.0.0)
+Filename: pool/main/g/gnuplot/gnuplot-x11_4.6.1-1~maverick2_amd64.deb
+
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot1Test_packages_i386 b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot1Test_packages_i386
new file mode 100644
index 00000000..1c5127de
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot1Test_packages_i386
@@ -0,0 +1,109 @@
+Package: gnuplot
+Version: 4.6.1-1~maverick2
+Installed-Size: 20
+Priority: optional
+Section: math
+Maintainer: Debian Science Team
+Architecture: all
+Description: Command-line driven interactive plotting program
+ Gnuplot is a portable command-line driven interactive data and function
+ plotting utility that supports lots of output formats, including drivers
+ for many printers, (La)TeX, (x)fig, Postscript, and so on. The X11-output
+ is packaged in gnuplot-x11.
+ .
+ Data files and self-defined functions can be manipulated by the internal
+ C-like language. Can perform smoothing, spline-fitting, or nonlinear fits,
+ and can work with complex numbers.
+ .
+ This package is for transition and to install a full-featured gnuplot
+ supporting the X11-output.
+MD5sum: 4912a4464d5588f685c4aa6cfc6be46c
+SHA1: 4a50deb413e05f77b31687405465b1229b3be328
+Size: 1046
+Depends: gnuplot-nox (>= 4.6.1-1~maverick2), gnuplot-x11 (>= 4.6.1-1~maverick2)
+Suggests: gnuplot-doc (>= 4.6.1-1~maverick2)
+Filename: pool/main/g/gnuplot/gnuplot_4.6.1-1~maverick2_all.deb
+Source:
+
+Package: gnuplot-doc
+Version: 4.6.1-1~maverick2
+Installed-Size: 5572
+Priority: optional
+Section: doc
+Maintainer: Debian Science Team
+Architecture: all
+Description: Command-line driven interactive plotting program
+ Gnuplot is a portable command-line driven interactive data and function
+ plotting utility that supports lots of output formats, including drivers
+ for many printers, (La)TeX, (x)fig, Postscript, and so on. The X11-output
+ is packaged in gnuplot-x11.
+ .
+ Data files and self-defined functions can be manipulated by the internal
+ C-like language. Can perform smoothing, spline-fitting, or nonlinear fits,
+ and can work with complex numbers.
+ .
+ This package contains the additional documentation.
+MD5sum: 25a5028811171f2f1fa157a2f6953e82
+SHA1: 837dd002143054ca01d3b01cae410cc4b4fe10c4
+Source: gnuplot
+Filename: pool/main/g/gnuplot/gnuplot-doc_4.6.1-1~maverick2_all.deb
+Depends: dpkg (>= 1.15.4) | install-info
+Size: 2675242
+
+Package: gnuplot-nox
+Version: 4.6.1-1~maverick2
+Installed-Size: 2536
+Priority: optional
+Section: math
+Maintainer: Debian Science Team
+Architecture: i386
+Description: Command-line driven interactive plotting program
+ Gnuplot is a portable command-line driven interactive data and function
+ plotting utility that supports lots of output formats, including drivers
+ for many printers, (La)TeX, (x)fig, Postscript, and so on. The X11-output
+ is packaged in gnuplot-x11.
+ .
+ Data files and self-defined functions can be manipulated by the internal
+ C-like language. Can perform smoothing, spline-fitting, or nonlinear fits,
+ and can work with complex numbers.
+ .
+ This package is for working without an X server.
+MD5sum: a7ef16004b62fd78acb77edb058ea1c1
+SHA1: 629c3e62f787b0af47b184beb0460dd261c9ca4d
+Size: 1046496
+Source: gnuplot
+Depends: libc6 (>= 2.11), libcairo2 (>= 1.6.0), libedit2 (>= 2.5.cvs.20010821-1), libgd2-noxpm (>= 2.0.36~rc1~dfsg) | libgd2-xpm (>= 2.0.36~rc1~dfsg), libglib2.0-0 (>= 2.12.0), liblua5.1-0, libpango1.0-0 (>= 1.14.0)
+Suggests: gnuplot-x11 (>= 4.6.1-1~maverick2), gnuplot-doc (>= 4.6.1-1~maverick2)
+Recommends: groff, ttf-liberation
+Replaces: gnuplot (<< 4.0.0)
+Filename: pool/main/g/gnuplot/gnuplot-nox_4.6.1-1~maverick2_i386.deb
+
+Package: gnuplot-x11
+Version: 4.6.1-1~maverick2
+Installed-Size: 1604
+Priority: optional
+Section: math
+Maintainer: Debian Science Team
+Architecture: i386
+Description: Command-line driven interactive plotting program
+ Gnuplot is a portable command-line driven interactive data and function
+ plotting utility that supports lots of output formats, including drivers
+ for many printers, (La)TeX, (x)fig, Postscript, and so on. The X11-output
+ is packaged in gnuplot-x11.
+ .
+ Data files and self-defined functions can be manipulated by the internal
+ C-like language. Can perform smoothing, spline-fitting, or nonlinear fits,
+ and can work with complex numbers.
+ .
+ This package contains the terminal driver that enables gnuplot to plot
+ images interactively under X11. Most users will want this, it is however
+ packaged separately so that low-end systems don't need X installed to use
+ gnuplot.
+MD5sum: fcad938905d0ace50a6ce0c73b2c6583
+SHA1: 02f9a93097a8f798a054e26154dbe5789088c069
+Source: gnuplot
+Replaces: gnuplot (<< 4.0.0)
+Filename: pool/main/g/gnuplot/gnuplot-x11_4.6.1-1~maverick2_i386.deb
+Depends: gnuplot-nox (>= 4.6.1-1~maverick2), libc6 (>= 2.11), libcairo2 (>= 1.6.0), libedit2 (>= 2.5.cvs.20010821-1), libgcc1 (>= 1:4.1.1), libgd2-noxpm (>= 2.0.36~rc1~dfsg) | libgd2-xpm (>= 2.0.36~rc1~dfsg), libglib2.0-0 (>= 2.12.0), liblua5.1-0, libpango1.0-0 (>= 1.14.0), libstdc++6 (>= 4.1.1), libwxbase2.8-0 (>= 2.8.11.0), libwxgtk2.8-0 (>= 2.8.11.0), libx11-6
+Size: 724388
+
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot20Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot20Test_gold
index 1ff04477..648d37fb 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot20Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot20Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Snapshot snap3 has been successfully published.
Please setup your webserver to serve directory '${HOME}/.aptly/public' with autoindexing.
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot22Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot22Test_gold
index 1ff04477..648d37fb 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot22Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot22Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Snapshot snap3 has been successfully published.
Please setup your webserver to serve directory '${HOME}/.aptly/public' with autoindexing.
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot23Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot23Test_gold
index 1ff04477..648d37fb 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot23Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot23Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Snapshot snap3 has been successfully published.
Please setup your webserver to serve directory '${HOME}/.aptly/public' with autoindexing.
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot24Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot24Test_gold
index 92859d40..b951722b 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot24Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot24Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot25Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot25Test_gold
index 1b95a2eb..6e087c6e 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot25Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot25Test_gold
@@ -1,6 +1,7 @@
Warning: publishing from empty source, architectures list should be complete, it can't be changed after publishing (use -architectures flag)
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot26Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot26Test_gold
index b7def77e..b59e5089 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot26Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot26Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot27Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot27Test_gold
index 604b8d09..3e4d4262 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot27Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot27Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot2Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot2Test_gold
index 950aab8b..045b14e7 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot2Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot2Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot34Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot34Test_gold
index 2a851c89..aa3529d9 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot34Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot34Test_gold
@@ -2,6 +2,7 @@ WARNING: force overwrite mode enabled, aptly might corrupt other published repos
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot35Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot35Test_gold
new file mode 100644
index 00000000..ad5dad8d
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot35Test_gold
@@ -0,0 +1,13 @@
+Loading packages...
+Generating metadata files and linking package files...
+Finalizing metadata files...
+Signing file 'Release' with gpg, please enter your passphrase when prompted:
+Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
+
+Snapshot squeeze has been successfully published.
+Please setup your webserver to serve directory '${HOME}/.aptly/public' with autoindexing.
+Now you can add following line to apt sources:
+ deb http://your-server/ squeeze main
+Don't forget to add your GPG key to apt with apt-key.
+
+You can also use `aptly serve` to publish your repositories over HTTP quickly.
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot35Test_packages_amd64 b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot35Test_packages_amd64
new file mode 100644
index 00000000..32ad0b4b
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot35Test_packages_amd64
@@ -0,0 +1,88 @@
+Package: dmraid
+Version: 1.0.0.rc16-4.1
+Installed-Size: 112
+Priority: optional
+Section: admin
+Maintainer: Giuseppe Iuculano
+Architecture: amd64
+Description: Device-Mapper Software RAID support tool
+ dmraid discovers, activates, deactivates and displays properties
+ of software RAID sets (eg, ATARAID) and contained DOS partitions.
+ .
+ dmraid uses the Linux device-mapper to create devices with respective
+ mappings for the ATARAID sets discovered.
+ .
+ The following formats are supported:
+ Highpoint HPT37X/HPT45X
+ Intel Software RAID
+ LSI Logic MegaRAID
+ NVidia NForce RAID (nvraid)
+ Promise FastTrack
+ Silicon Image(tm) Medley(tm)
+ VIA Software RAID
+ .
+ Please read the documentation in /usr/share/doc/dmraid BEFORE attempting
+ any use of this software. Improper use can cause data loss!
+MD5sum: 35da9bcdd12c7fb08eb7192f0a17ddf2
+SHA1: 6a89d3f9e3b80a172811bb7d74eac43f119a8b7c
+SHA256: 125405c4b0a7364bf209c161f393d4d0152ba9d02a55a95d90a7637f7b373b8f
+Tag: admin::filesystem, admin::kernel, hardware::storage, implemented-in::c, interface::commandline, role::program, scope::utility, use::scanning
+Size: 38620
+Depends: libc6 (>= 2.3), libdmraid1.0.0.rc16 (>= 1.0.0.rc16), libselinux1 (>= 1.32), libsepol1 (>= 1.14), udev, dmsetup
+Homepage: http://people.redhat.com/~heinzm/sw/dmraid/
+Source:
+Filename: pool/main/d/dmraid/dmraid_1.0.0.rc16-4.1_amd64.deb
+
+Package: libdmraid-dev
+Version: 1.0.0.rc16-4.1
+Installed-Size: 496
+Priority: optional
+Section: libdevel
+Maintainer: Giuseppe Iuculano
+Architecture: amd64
+Description: Device-Mapper Software RAID support tool - header files
+ dmraid discovers, activates, deactivates and displays properties
+ of software RAID sets (eg, ATARAID) and contained DOS partitions.
+ .
+ dmraid uses the Linux device-mapper to create devices with respective
+ mappings for the ATARAID sets discovered.
+ .
+ This package contains the header files needed to link programs against
+ dmraid.
+MD5sum: bb209b5796592d786c28844b949216dc
+SHA1: cd8baba807fa92a88a265a044d821df8b677b5cb
+SHA256: 081a48ad5372a941c35d41733da89a52cbe2d8f49032c2a4ef03148e4049615f
+Homepage: http://people.redhat.com/~heinzm/sw/dmraid/
+Tag: admin::hardware, devel::lang:c, devel::library, hardware::storage, implemented-in::c, qa::low-popcon, role::devel-lib, use::driver
+Size: 152618
+Depends: libdmraid1.0.0.rc16 (= 1.0.0.rc16-4.1)
+Filename: pool/main/d/dmraid/libdmraid-dev_1.0.0.rc16-4.1_amd64.deb
+Source: dmraid
+
+Package: libdmraid1.0.0.rc16
+Version: 1.0.0.rc16-4.1
+Installed-Size: 244
+Priority: optional
+Section: libs
+Maintainer: Giuseppe Iuculano
+Architecture: amd64
+Description: Device-Mapper Software RAID support tool - shared library
+ dmraid discovers, activates, deactivates and displays properties
+ of software RAID sets (eg, ATARAID) and contained DOS partitions.
+ .
+ dmraid uses the Linux device-mapper to create devices with respective
+ mappings for the ATARAID sets discovered.
+ .
+ This package contains the dmraid shared library, which implements
+ the back half of dmraid, including on-disk metadata formats.
+MD5sum: a66d03bb1ddad78f879660ddedf86295
+SHA1: 6292936617c466e67a3148c66d0c27c068d055d3
+SHA256: 29f06bd3ae42e3380b356b69598be07724d178af35f2f1a64648c7f8ff85bef9
+Depends: libc6 (>= 2.7), libdevmapper1.02.1 (>= 2:1.02.20)
+Homepage: http://people.redhat.com/~heinzm/sw/dmraid/
+Size: 108978
+Tag: admin::hardware, admin::kernel, devel::lang:c, devel::library, hardware::storage, implemented-in::c, role::{devel-lib,kernel,shared-lib}, use::driver
+Filename: pool/main/d/dmraid/libdmraid1.0.0.rc16_1.0.0.rc16-4.1_amd64.deb
+Replaces: libdmraid1.0.0.rc15 (<< 1.0.0.rc16-1)
+Source: dmraid
+
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot35Test_packages_i386 b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot35Test_packages_i386
new file mode 100644
index 00000000..be1c153c
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot35Test_packages_i386
@@ -0,0 +1,88 @@
+Package: libdmraid1.0.0.rc16
+Version: 1.0.0.rc16-4.1
+Installed-Size: 268
+Priority: optional
+Section: libs
+Maintainer: Giuseppe Iuculano
+Architecture: i386
+Description: Device-Mapper Software RAID support tool - shared library
+ dmraid discovers, activates, deactivates and displays properties
+ of software RAID sets (eg, ATARAID) and contained DOS partitions.
+ .
+ dmraid uses the Linux device-mapper to create devices with respective
+ mappings for the ATARAID sets discovered.
+ .
+ This package contains the dmraid shared library, which implements
+ the back half of dmraid, including on-disk metadata formats.
+MD5sum: 9330ba2ffd2f22d695fdf692f8120159
+SHA1: 6b262419836e8cad4500043f5e9e6a1581074023
+SHA256: 2b2238679ac8ff4776a3a2caf533c551700d9f92a7d2af23d6457acf7de5d6c8
+Tag: admin::hardware, admin::kernel, devel::lang:c, devel::library, hardware::storage, implemented-in::c, role::{devel-lib,kernel,shared-lib}, use::driver
+Filename: pool/main/d/dmraid/libdmraid1.0.0.rc16_1.0.0.rc16-4.1_i386.deb
+Replaces: libdmraid1.0.0.rc15 (<< 1.0.0.rc16-1)
+Homepage: http://people.redhat.com/~heinzm/sw/dmraid/
+Source: dmraid
+Depends: libc6 (>= 2.7), libdevmapper1.02.1 (>= 2:1.02.20)
+Size: 106088
+
+Package: dmraid
+Version: 1.0.0.rc16-4.1
+Installed-Size: 176
+Priority: optional
+Section: admin
+Maintainer: Giuseppe Iuculano
+Architecture: i386
+Description: Device-Mapper Software RAID support tool
+ dmraid discovers, activates, deactivates and displays properties
+ of software RAID sets (eg, ATARAID) and contained DOS partitions.
+ .
+ dmraid uses the Linux device-mapper to create devices with respective
+ mappings for the ATARAID sets discovered.
+ .
+ The following formats are supported:
+ Highpoint HPT37X/HPT45X
+ Intel Software RAID
+ LSI Logic MegaRAID
+ NVidia NForce RAID (nvraid)
+ Promise FastTrack
+ Silicon Image(tm) Medley(tm)
+ VIA Software RAID
+ .
+ Please read the documentation in /usr/share/doc/dmraid BEFORE attempting
+ any use of this software. Improper use can cause data loss!
+MD5sum: f8aea4e9eaea341b112f02e9efe1678e
+SHA1: bb96a258038c79bc04eef49d5875deed4c67dd16
+SHA256: 6a8294bef99040055009da41597869bfdb17ac89c3166e49c57340abe7f702ba
+Size: 37984
+Depends: libc6 (>= 2.3), libdmraid1.0.0.rc16 (>= 1.0.0.rc16), libselinux1 (>= 1.32), libsepol1 (>= 1.14), udev, dmsetup
+Filename: pool/main/d/dmraid/dmraid_1.0.0.rc16-4.1_i386.deb
+Tag: admin::filesystem, admin::kernel, hardware::storage, implemented-in::c, interface::commandline, role::program, scope::utility, use::scanning
+Source:
+Homepage: http://people.redhat.com/~heinzm/sw/dmraid/
+
+Package: libdmraid-dev
+Version: 1.0.0.rc16-4.1
+Installed-Size: 440
+Priority: optional
+Section: libdevel
+Maintainer: Giuseppe Iuculano
+Architecture: i386
+Description: Device-Mapper Software RAID support tool - header files
+ dmraid discovers, activates, deactivates and displays properties
+ of software RAID sets (eg, ATARAID) and contained DOS partitions.
+ .
+ dmraid uses the Linux device-mapper to create devices with respective
+ mappings for the ATARAID sets discovered.
+ .
+ This package contains the header files needed to link programs against
+ dmraid.
+MD5sum: 5395970df02ab5f1609cd7eccc15ead1
+SHA1: f27bd38eeb58a32ee7e58ac8a2950649bd4ef17b
+SHA256: 2abe9142ce6aa341df57303b5bc847522779ea9109b0fe734e2ae4419872da71
+Tag: admin::hardware, devel::lang:c, devel::library, hardware::storage, implemented-in::c, qa::low-popcon, role::devel-lib, use::driver
+Homepage: http://people.redhat.com/~heinzm/sw/dmraid/
+Size: 145808
+Filename: pool/main/d/dmraid/libdmraid-dev_1.0.0.rc16-4.1_i386.deb
+Depends: libdmraid1.0.0.rc16 (= 1.0.0.rc16-4.1)
+Source: dmraid
+
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot35Test_packages_udeb_amd64 b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot35Test_packages_udeb_amd64
new file mode 100644
index 00000000..45ca5fd0
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot35Test_packages_udeb_amd64
@@ -0,0 +1,40 @@
+Package: dmraid-udeb
+Version: 1.0.0.rc16-4.1
+Installed-Size: 32
+Priority: optional
+Section: debian-installer
+Maintainer: Giuseppe Iuculano
+Architecture: amd64
+Description: Device-Mapper Software RAID support tool (udeb)
+ dmraid discovers, activates, deactivates and displays properties
+ of software RAID sets (eg, ATARAID) and contained DOS partitions.
+ .
+ This is the minimal package (udeb) used by debian-installer
+MD5sum: 721685fde18001ad0c9ac172c3118983
+SHA1: 88e229b76cb5866c8868a491a6690b3fde2b33d5
+SHA256: efae69921b97494e40437712053b60a5105fa433f3cfbae3bb2991d341eb95a6
+Filename: pool/main/d/dmraid/dmraid-udeb_1.0.0.rc16-4.1_amd64.udeb
+Depends: libc6-udeb (>= 2.11), libdmraid1.0.0.rc16-udeb (>= 1.0.0.rc16), dmsetup-udeb
+Source: dmraid
+Size: 11806
+
+Package: libdmraid1.0.0.rc16-udeb
+Version: 1.0.0.rc16-4.1
+Installed-Size: 0
+Priority: optional
+Section: debian-installer
+Maintainer: Giuseppe Iuculano
+Architecture: amd64
+Description: Device-Mapper Software RAID support tool - shared library (udeb)
+ dmraid discovers, activates, deactivates and displays properties
+ of software RAID sets (eg, ATARAID) and contained DOS partitions.
+ .
+ This is the minimal package (udeb shared library) used by debian-installer
+MD5sum: efae3ee2d1ccd78aaec7d452ecba4c6a
+SHA1: 2ef8c01a0375c92f59fed32949b9469cc53d0b99
+SHA256: aabf098de9fcf2da0c0f66f2d9f1cb61f7e244dd2b009361e40cd29827749d44
+Size: 92372
+Filename: pool/main/d/dmraid/libdmraid1.0.0.rc16-udeb_1.0.0.rc16-4.1_amd64.udeb
+Source: dmraid
+Depends: libc6-udeb (>= 2.11), libdevmapper1.02.1-udeb (>= 2:1.02.48)
+
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot35Test_packages_udeb_i386 b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot35Test_packages_udeb_i386
new file mode 100644
index 00000000..0f65046d
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot35Test_packages_udeb_i386
@@ -0,0 +1,40 @@
+Package: dmraid-udeb
+Version: 1.0.0.rc16-4.1
+Installed-Size: 36
+Priority: optional
+Section: debian-installer
+Maintainer: Giuseppe Iuculano
+Architecture: i386
+Description: Device-Mapper Software RAID support tool (udeb)
+ dmraid discovers, activates, deactivates and displays properties
+ of software RAID sets (eg, ATARAID) and contained DOS partitions.
+ .
+ This is the minimal package (udeb) used by debian-installer
+MD5sum: 4d8bb4dafb0ef9059dac75846e162784
+SHA1: fd5c73e08d4c5381b1136c2ff170332d77526246
+SHA256: fe4ff3351186f03039f8cd6f78e8e4f473a75b613f950caac06fa21dda2d59e8
+Source: dmraid
+Size: 11022
+Filename: pool/main/d/dmraid/dmraid-udeb_1.0.0.rc16-4.1_i386.udeb
+Depends: libc6-udeb (>= 2.11), libdmraid1.0.0.rc16-udeb (>= 1.0.0.rc16), dmsetup-udeb
+
+Package: libdmraid1.0.0.rc16-udeb
+Version: 1.0.0.rc16-4.1
+Installed-Size: 212
+Priority: optional
+Section: debian-installer
+Maintainer: Giuseppe Iuculano
+Architecture: i386
+Description: Device-Mapper Software RAID support tool - shared library (udeb)
+ dmraid discovers, activates, deactivates and displays properties
+ of software RAID sets (eg, ATARAID) and contained DOS partitions.
+ .
+ This is the minimal package (udeb shared library) used by debian-installer
+MD5sum: aba78093c15c8bcd8e237f6a578c6c65
+SHA1: c5e95d443889775a48d6c48bf332a21a37ce63c6
+SHA256: 1c51dbf4cd1a5a683fd60e2b4f44dc6f8f574de3aea52354541a9a105f10f918
+Depends: libc6-udeb (>= 2.11), libdevmapper1.02.1-udeb (>= 2:1.02.48)
+Source: dmraid
+Filename: pool/main/d/dmraid/libdmraid1.0.0.rc16-udeb_1.0.0.rc16-4.1_i386.udeb
+Size: 89490
+
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot35Test_release b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot35Test_release
new file mode 100644
index 00000000..2e1afbf0
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot35Test_release
@@ -0,0 +1,58 @@
+Origin: . squeeze
+Label: . squeeze
+Codename: squeeze
+Date: Tue, 30 Sep 2014 15:35:22 UTC
+Architectures: amd64 i386
+Components: main
+Description: Generated by aptly
+MD5Sum:
+ a75ee7a5106ba4369de928e26b7afefd 803 main/debian-installer/binary-i386/Packages.bz2
+ d82f063b0a674ee60d070fc960c33c92 677 main/debian-installer/binary-amd64/Packages.gz
+ 8b51fb682910e0d52caa31b61ef1192a 807 main/debian-installer/binary-amd64/Packages.bz2
+ a77ec46f63b69e32fdf3a5aa484c1190 1592 main/binary-i386/Packages.bz2
+ 9efff4ebb46b70b71215a8df4f71069d 88 main/binary-amd64/Release
+ d9d38d0cff22f7364cbabb4e8b536316 87 main/debian-installer/binary-i386/Release
+ 0eaacc9b677879735bcc958c2e24c699 1395 main/binary-i386/Packages.gz
+ e1c910470349056521dbc4d473a48637 677 main/debian-installer/binary-i386/Packages.gz
+ d9d38d0cff22f7364cbabb4e8b536316 87 main/binary-i386/Release
+ 1093e4c5170235ac5cc872f985088815 3669 main/binary-amd64/Packages
+ c4b9d1069fcb04fdad832a657ff02ef3 3663 main/binary-i386/Packages
+ b58a784bc0764d523fd9134b53c8dda0 1585 main/binary-amd64/Packages.bz2
+ 9ac58b6597a8e0344d69c2550aca9720 1601 main/debian-installer/binary-i386/Packages
+ f940214380907f004b1e175a6c20bf07 1603 main/debian-installer/binary-amd64/Packages
+ 9efff4ebb46b70b71215a8df4f71069d 88 main/debian-installer/binary-amd64/Release
+ 703b425641f4e847a1f0a8a0c28fb128 1394 main/binary-amd64/Packages.gz
+SHA1:
+ a0c5944608dc219fad9d799b3fa6aae280d331c0 803 main/debian-installer/binary-i386/Packages.bz2
+ 5faf018385934f65a6af0c4ab3af2fda62c63aff 677 main/debian-installer/binary-amd64/Packages.gz
+ 61c9b82f75a642839e6e32e5a734f890417b1160 807 main/debian-installer/binary-amd64/Packages.bz2
+ e69414d40bb79bca8dc1b274ceb42fb04c3d02ee 1592 main/binary-i386/Packages.bz2
+ 7c25a15429615225e3eb90540ba783561fc09448 88 main/binary-amd64/Release
+ f07fcb0797d81341b6284ed86e5903dc57341a90 87 main/debian-installer/binary-i386/Release
+ a8657c2409859da9f91280a5da48f3b5276e2829 1395 main/binary-i386/Packages.gz
+ b8e5b5b41a6ded99006a94c0550cd2291ac19d7f 677 main/debian-installer/binary-i386/Packages.gz
+ f07fcb0797d81341b6284ed86e5903dc57341a90 87 main/binary-i386/Release
+ 0c86f7bd6ed2b52b0ab12ea08a76d14235b85d7c 3669 main/binary-amd64/Packages
+ 4227cdcd3260e10eee066182f22ec8eec4fc7f0a 3663 main/binary-i386/Packages
+ 8cec67723e4cee24f67ffa46a1f4ae7165fb31f0 1585 main/binary-amd64/Packages.bz2
+ ae94f4b0b3396951399de65e04784ef7b0f95119 1601 main/debian-installer/binary-i386/Packages
+ 6f8e5137388e594b31bed56ca9e08f8e9f305ca4 1603 main/debian-installer/binary-amd64/Packages
+ 7c25a15429615225e3eb90540ba783561fc09448 88 main/debian-installer/binary-amd64/Release
+ 163a7a656c5e338d53bbc6cbe80263ca551dfa15 1394 main/binary-amd64/Packages.gz
+SHA256:
+ 4f8eeab36071b8791ce74099df89e01d46ab66f3c76dd9afe6c31fe48c30783d 803 main/debian-installer/binary-i386/Packages.bz2
+ bf7b96d1c66abb7dc6037299ab4fe0119d42b66c8c01cfa0520e27d813c99e50 677 main/debian-installer/binary-amd64/Packages.gz
+ 3a30d9da1ed1108d3451c0c7fe60d99594a2cdf2459a8e505920ed69043bdc6c 807 main/debian-installer/binary-amd64/Packages.bz2
+ 1d947dcc40ad2ace3b8226b68161948478a187eb9865d4b62c5068200e0ec058 1592 main/binary-i386/Packages.bz2
+ e8378aced6fec291729f656e1d884225ec9c28ba67fc434ef2531223bc37033e 88 main/binary-amd64/Release
+ 62b9292134aefb30a75aff3e25c2c694d128d73a1d193f29a397789dd902a854 87 main/debian-installer/binary-i386/Release
+ e30a8b568654e69f1fe7744ace4ffb0d385a8e52502ffd9f84a8184130386a08 1395 main/binary-i386/Packages.gz
+ f6f2350eab308eb2f290b98f088e973e70ded5d1244688b71edfb201ac85e832 677 main/debian-installer/binary-i386/Packages.gz
+ 62b9292134aefb30a75aff3e25c2c694d128d73a1d193f29a397789dd902a854 87 main/binary-i386/Release
+ e2d936cb65a504e6bf13bb09c5a0c6e8943cdd7845d715d571b1fb58262a624f 3669 main/binary-amd64/Packages
+ 14ae70d15fa8263b55056ef36bac9208ee9e03847118788cc00b6d2a46b5fa10 3663 main/binary-i386/Packages
+ 0128db3912e0e2f92b2e3a277c28239d6e072323b35bc007dbf32bc696df413c 1585 main/binary-amd64/Packages.bz2
+ c3f2708d36c503619f5b3f43b2c7da3f559b72f723c96d0ce9c664f92c6fcc14 1601 main/debian-installer/binary-i386/Packages
+ 1f90f76bc0df9a588940d14f3ee0ad7d26a86809537f2e5ff4d340e4a8a21f3d 1603 main/debian-installer/binary-amd64/Packages
+ e8378aced6fec291729f656e1d884225ec9c28ba67fc434ef2531223bc37033e 88 main/debian-installer/binary-amd64/Release
+ e179f48a91a8dc614a37e2fb21d8d82ff3937fd44e077ec0e2507b8382d896ab 1394 main/binary-amd64/Packages.gz
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot35Test_release_udeb_i386 b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot35Test_release_udeb_i386
new file mode 100644
index 00000000..77d3c28c
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot35Test_release_udeb_i386
@@ -0,0 +1,5 @@
+Origin: . squeeze
+Label: . squeeze
+Architecture: i386
+Archive: squeeze
+Component: main
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot3Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot3Test_gold
index 0b1abe52..ce8cd03c 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot3Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot3Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot4Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot4Test_gold
index 817f40ae..f4fe3441 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot4Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot4Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot5Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot5Test_gold
index 67cf0fc2..11b57889 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot5Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSnapshot5Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSwitch11Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishSwitch11Test_gold
index 038992dd..2385a0ed 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishSwitch11Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSwitch11Test_gold
@@ -2,6 +2,7 @@ WARNING: force overwrite mode enabled, aptly might corrupt other published repos
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
Cleaning up prefix "." components main...
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSwitch1Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishSwitch1Test_gold
index 4718a447..3369aa06 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishSwitch1Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSwitch1Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
Cleaning up prefix "." components main...
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSwitch2Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishSwitch2Test_gold
index 43468d71..c8464423 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishSwitch2Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSwitch2Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
Cleaning up prefix "ppa" components main...
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSwitch3Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishSwitch3Test_gold
index 4718a447..3369aa06 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishSwitch3Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSwitch3Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
Cleaning up prefix "." components main...
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSwitch4Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishSwitch4Test_gold
index 2a0bd499..7256431a 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishSwitch4Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSwitch4Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
Cleaning up prefix "ppa" components main...
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishSwitch8Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishSwitch8Test_gold
index e28bc2bb..d9870ff9 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishSwitch8Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishSwitch8Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
Cleaning up prefix "." components b, c...
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishUpdate10Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishUpdate10Test_gold
index f13cb098..bda2f4dd 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishUpdate10Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishUpdate10Test_gold
@@ -2,6 +2,7 @@ WARNING: force overwrite mode enabled, aptly might corrupt other published repos
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
Cleaning up prefix "." components main...
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishUpdate1Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishUpdate1Test_gold
index 9179c19d..72e92234 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishUpdate1Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishUpdate1Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
Cleaning up prefix "." components main...
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishUpdate2Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishUpdate2Test_gold
index 9179c19d..72e92234 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishUpdate2Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishUpdate2Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
Cleaning up prefix "." components main...
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishUpdate3Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishUpdate3Test_gold
index 9179c19d..72e92234 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishUpdate3Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishUpdate3Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
Cleaning up prefix "." components main...
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishUpdate4Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishUpdate4Test_gold
index 4ebbbebe..dce245d5 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishUpdate4Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishUpdate4Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
Cleaning up prefix "." components main...
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishUpdate7Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishUpdate7Test_gold
index 9eb5d807..813d7055 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishUpdate7Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishUpdate7Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Signing file 'Release' with gpg, please enter your passphrase when prompted:
Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
Cleaning up prefix "." components contrib, main...
diff --git a/src/github.com/smira/aptly/system/t06_publish/PublishUpdate8Test_gold b/src/github.com/smira/aptly/system/t06_publish/PublishUpdate8Test_gold
index 046785d1..09aa9845 100644
--- a/src/github.com/smira/aptly/system/t06_publish/PublishUpdate8Test_gold
+++ b/src/github.com/smira/aptly/system/t06_publish/PublishUpdate8Test_gold
@@ -1,5 +1,6 @@
Loading packages...
Generating metadata files and linking package files...
+Finalizing metadata files...
Cleaning up prefix "." components contrib, main...
Publish for local repo ./squeeze [i386] publishes {contrib: [repo2]}, {main: [repo1]} has been successfully updated.
diff --git a/src/github.com/smira/aptly/system/t06_publish/S3Publish1Test_binary b/src/github.com/smira/aptly/system/t06_publish/S3Publish1Test_binary
new file mode 100644
index 00000000..eecd933f
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t06_publish/S3Publish1Test_binary
@@ -0,0 +1,25 @@
+Package: libboost-program-options-dev
+Version: 1.49.0.1
+Installed-Size: 26
+Priority: optional
+Section: libdevel
+Maintainer: Debian Boost Team
+Architecture: i386
+Description: program options library for C++ (default version)
+ This package forms part of the Boost C++ Libraries collection.
+ .
+ Library to let program developers obtain program options, that is
+ (name, value) pairs from the user, via conventional methods such as
+ command line and config file.
+ .
+ This package is a dependency package, which depends on Debian's default
+ Boost version (currently 1.49).
+MD5sum: 0035d7822b2f8f0ec4013f270fd650c2
+SHA1: 36895eb64cfe89c33c0a2f7ac2f0c6e0e889e04b
+SHA256: c76b4bd12fd92e4dfe1b55b18a67a669d92f62985d6a96c8a21d96120982cf12
+Filename: pool/main/b/boost-defaults/libboost-program-options-dev_1.49.0.1_i386.deb
+Size: 2738
+Homepage: http://www.boost.org/libs/program_options/
+Source: boost-defaults
+Depends: libboost-program-options1.49-dev
+
diff --git a/src/github.com/smira/aptly/system/t06_publish/S3Publish1Test_gold b/src/github.com/smira/aptly/system/t06_publish/S3Publish1Test_gold
new file mode 100644
index 00000000..b65701eb
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t06_publish/S3Publish1Test_gold
@@ -0,0 +1,13 @@
+Loading packages...
+Generating metadata files and linking package files...
+Finalizing metadata files...
+Signing file 'Release' with gpg, please enter your passphrase when prompted:
+Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
+
+Local repo local-repo has been successfully published.
+Now you can add following line to apt sources:
+ deb http://your-server/ maverick main
+ deb-src http://your-server/ maverick main
+Don't forget to add your GPG key to apt with apt-key.
+
+You can also use `aptly serve` to publish your repositories over HTTP quickly.
diff --git a/src/github.com/smira/aptly/system/t06_publish/S3Publish1Test_release b/src/github.com/smira/aptly/system/t06_publish/S3Publish1Test_release
new file mode 100644
index 00000000..ad1fa6fd
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t06_publish/S3Publish1Test_release
@@ -0,0 +1,34 @@
+Origin: . maverick
+Label: . maverick
+Codename: maverick
+Date: Wed, 1 Oct 2014 08:48:48 UTC
+Architectures: i386
+Components: main
+Description: Generated by aptly
+MD5Sum:
+ b844530d1336e9a3c431f0d36cfc01b0 602 main/binary-i386/Packages.gz
+ 1d7829dac8923aafe499f313abfaadd7 652 main/binary-i386/Packages.bz2
+ 307b6495eab59c221e2ff8962896631b 2300 main/source/Sources
+ 65dd7338cfac70762457b586629e87e4 839 main/source/Sources.gz
+ 5cc219da21fdb8a96b265bca1c4c0808 1009 main/source/Sources.bz2
+ 60b30b7b0c62ae04bb3bc457abadaced 90 main/binary-i386/Release
+ 945211dc923a8d1b97835232648c0aa7 92 main/source/Release
+ d419bd11e2b7fe9669bccdf67a18ca17 984 main/binary-i386/Packages
+SHA1:
+ 1b314cedcf18a6d08d4aabbd8b9b5605ba293d04 602 main/binary-i386/Packages.gz
+ 5406a984c100b20fbebacdbac24ae3378885f73b 652 main/binary-i386/Packages.bz2
+ e30d7bc51cd042ee987316967bf3043ab95c8ce9 2300 main/source/Sources
+ d60a7032080848eb48bcf68962698ba642dcc383 839 main/source/Sources.gz
+ fb194b90e0e0efd456a7346c4224294018b6677d 1009 main/source/Sources.bz2
+ 2bfef2580deadf6863ee6f893e8b9a2c7522e1ed 90 main/binary-i386/Release
+ 8b98a2148d157bf87cc1955ef00ba1ba31275f94 92 main/source/Release
+ be80e1c588c6052f30865e44e3f1429f730d5bc8 984 main/binary-i386/Packages
+SHA256:
+ a079102fdc72e6228229aaa8e5e6ad59b582026419737e81e11a8af2addd125e 602 main/binary-i386/Packages.gz
+ 25d101a333e85d952afc74f684cef3716d69e3c33d8a4b1544faec683c1b5d96 652 main/binary-i386/Packages.bz2
+ bcf1fcf1ca2d1bb5565da8b4c39052d906832ad4885c21682d605b830e55a506 2300 main/source/Sources
+ 3e6cf6dc079333cdf01905957c611702f4ee10f654c84895ac7bf166bbbbd3bc 839 main/source/Sources.gz
+ 47b9d37fa81d23d227dd26e85821dd4f74db8f17ddefbe6ca686f62ddfedd8ad 1009 main/source/Sources.bz2
+ 1d91164164e6310a5e5fc93390995028956f657490a9ce7aa136dc94291828a8 90 main/binary-i386/Release
+ 2d75333511325affcefe66c6cfbaa6ab21e6aa0e85a6b4fa39a4191146b81460 92 main/source/Release
+ 59643cc2d105694d6876dc328290a1c949b4e91e62ee8db396abac83a7034f9f 984 main/binary-i386/Packages
diff --git a/src/github.com/smira/aptly/system/t06_publish/S3Publish1Test_sources b/src/github.com/smira/aptly/system/t06_publish/S3Publish1Test_sources
new file mode 100644
index 00000000..7ea3c88c
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t06_publish/S3Publish1Test_sources
@@ -0,0 +1,42 @@
+Package: pyspi
+Version: 0.6.1-1.3
+Maintainer: Jose Carlos Garcia Sogo
+Architecture: any
+Binary: python-at-spi
+Standards-Version: 3.7.3
+Format: 1.0
+Files: 22ff26db69b73d3438fdde21ab5ba2f1 3456 pyspi_0.6.1-1.3.diff.gz
+ b72cb94699298a117b7c82641c68b6fd 1782 pyspi_0.6.1-1.3.dsc
+ def336bd566ea688a06ec03db7ccf1f4 29063 pyspi_0.6.1.orig.tar.gz
+Checksums-Sha1: 95a2468e4bbce730ba286f2211fa41861b9f1d90 3456 pyspi_0.6.1-1.3.diff.gz
+ 56c8a9b1f4ab636052be8966690998cbe865cd6c 1782 pyspi_0.6.1-1.3.dsc
+ 9694b80acc171c0a5bc99f707933864edfce555e 29063 pyspi_0.6.1.orig.tar.gz
+Vcs-Svn: svn://svn.tribulaciones.org/srv/svn/pyspi/trunk
+Homepage: http://people.redhat.com/zcerza/dogtail
+Build-Depends: debhelper (>= 5), cdbs, libatspi-dev, python-pyrex, python-support (>= 0.4), python-all-dev, libx11-dev
+Directory: pool/main/p/pyspi
+Checksums-Sha256: 2e770b28df948f3197ed0b679bdea99f3f2bf745e9ddb440c677df9c3aeaee3c 3456 pyspi_0.6.1-1.3.diff.gz
+ d494aaf526f1ec6b02f14c2f81e060a5722d6532ddc760ec16972e45c2625989 1782 pyspi_0.6.1-1.3.dsc
+ 64069ee828c50b1c597d10a3fefbba279f093a4723965388cdd0ac02f029bfb9 29063 pyspi_0.6.1.orig.tar.gz
+
+Package: pyspi
+Version: 0.6.1-1.4
+Maintainer: Jose Carlos Garcia Sogo
+Architecture: any
+Vcs-Svn: svn://svn.tribulaciones.org/srv/svn/pyspi/trunk
+Standards-Version: 3.7.3
+Homepage: http://people.redhat.com/zcerza/dogtail
+Directory: pool/main/p/pyspi
+Build-Depends: debhelper (>= 5), cdbs, libatspi-dev, python-pyrex, python-support (>= 0.4), python-all-dev, libx11-dev
+Checksums-Sha256: 289d3aefa970876e9c43686ce2b02f478d7f3ed35a713928464a98d54ae4fca3 893 pyspi-0.6.1-1.3.stripped.dsc
+ 2e770b28df948f3197ed0b679bdea99f3f2bf745e9ddb440c677df9c3aeaee3c 3456 pyspi_0.6.1-1.3.diff.gz
+ 64069ee828c50b1c597d10a3fefbba279f093a4723965388cdd0ac02f029bfb9 29063 pyspi_0.6.1.orig.tar.gz
+Format: 1.0
+Checksums-Sha1: 5005fbd1f30637edc1d380b30f45db9b79100d07 893 pyspi-0.6.1-1.3.stripped.dsc
+ 95a2468e4bbce730ba286f2211fa41861b9f1d90 3456 pyspi_0.6.1-1.3.diff.gz
+ 9694b80acc171c0a5bc99f707933864edfce555e 29063 pyspi_0.6.1.orig.tar.gz
+Binary: python-at-spi
+Files: 2f5bd47cf38852b6fc927a50f98c1448 893 pyspi-0.6.1-1.3.stripped.dsc
+ 22ff26db69b73d3438fdde21ab5ba2f1 3456 pyspi_0.6.1-1.3.diff.gz
+ def336bd566ea688a06ec03db7ccf1f4 29063 pyspi_0.6.1.orig.tar.gz
+
diff --git a/src/github.com/smira/aptly/system/t06_publish/S3Publish2Test_binary b/src/github.com/smira/aptly/system/t06_publish/S3Publish2Test_binary
new file mode 100644
index 00000000..05d63c09
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t06_publish/S3Publish2Test_binary
@@ -0,0 +1,25 @@
+Package: libboost-program-options-dev
+Version: 1.49.0.1
+Installed-Size: 26
+Priority: optional
+Section: libdevel
+Maintainer: Debian Boost Team
+Architecture: i386
+Description: program options library for C++ (default version)
+ This package forms part of the Boost C++ Libraries collection.
+ .
+ Library to let program developers obtain program options, that is
+ (name, value) pairs from the user, via conventional methods such as
+ command line and config file.
+ .
+ This package is a dependency package, which depends on Debian's default
+ Boost version (currently 1.49).
+MD5sum: 0035d7822b2f8f0ec4013f270fd650c2
+SHA1: 36895eb64cfe89c33c0a2f7ac2f0c6e0e889e04b
+SHA256: c76b4bd12fd92e4dfe1b55b18a67a669d92f62985d6a96c8a21d96120982cf12
+Source: boost-defaults
+Filename: pool/main/b/boost-defaults/libboost-program-options-dev_1.49.0.1_i386.deb
+Depends: libboost-program-options1.49-dev
+Homepage: http://www.boost.org/libs/program_options/
+Size: 2738
+
diff --git a/src/github.com/smira/aptly/system/t06_publish/S3Publish2Test_gold b/src/github.com/smira/aptly/system/t06_publish/S3Publish2Test_gold
new file mode 100644
index 00000000..12c9c0e6
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t06_publish/S3Publish2Test_gold
@@ -0,0 +1,8 @@
+Loading packages...
+Generating metadata files and linking package files...
+Finalizing metadata files...
+Signing file 'Release' with gpg, please enter your passphrase when prompted:
+Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
+Cleaning up prefix "." components main...
+
+Publish for local repo s3:test1:./maverick [i386, source] publishes {main: [local-repo]} has been successfully updated.
diff --git a/src/github.com/smira/aptly/system/t06_publish/S3Publish2Test_release b/src/github.com/smira/aptly/system/t06_publish/S3Publish2Test_release
new file mode 100644
index 00000000..7c89bc78
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t06_publish/S3Publish2Test_release
@@ -0,0 +1,34 @@
+Origin: . maverick
+Label: . maverick
+Codename: maverick
+Date: Wed, 1 Oct 2014 09:13:14 UTC
+Architectures: i386
+Components: main
+Description: Generated by aptly
+MD5Sum:
+ d41d8cd98f00b204e9800998ecf8427e 0 main/source/Sources
+ f41c10a4b35cd3e1ec8abb9c2ab676ed 23 main/source/Sources.gz
+ 4059d198768f9f8dc9372dc1c54bc3c3 14 main/source/Sources.bz2
+ 60b30b7b0c62ae04bb3bc457abadaced 90 main/binary-i386/Release
+ 945211dc923a8d1b97835232648c0aa7 92 main/source/Release
+ db76ccafa3c9e4c1dba620259df78f87 984 main/binary-i386/Packages
+ d666eb8b2fc8a0ef525d37aff33c7b2f 603 main/binary-i386/Packages.gz
+ ca2b3a9fc60f4a0a1091b9f0357b11eb 651 main/binary-i386/Packages.bz2
+SHA1:
+ da39a3ee5e6b4b0d3255bfef95601890afd80709 0 main/source/Sources
+ 92c6cff562771f64540523a54baaa0b2afe54b3f 23 main/source/Sources.gz
+ 64a543afbb5f4bf728636bdcbbe7a2ed0804adc2 14 main/source/Sources.bz2
+ 2bfef2580deadf6863ee6f893e8b9a2c7522e1ed 90 main/binary-i386/Release
+ 8b98a2148d157bf87cc1955ef00ba1ba31275f94 92 main/source/Release
+ 7dcfa6945771369da0a22c2f90f2300b5d238662 984 main/binary-i386/Packages
+ ba6efb87b17aa8d08476b3f181702e4d3199794e 603 main/binary-i386/Packages.gz
+ 0b36a014d1a5ccbf3d73de0035970737659e3c0f 651 main/binary-i386/Packages.bz2
+SHA256:
+ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 main/source/Sources
+ 1775fca35fb6a4d31c541746eaea63c5cb3c00280c8b5a351d4e944cdca7489d 23 main/source/Sources.gz
+ d3dda84eb03b9738d118eb2be78e246106900493c0ae07819ad60815134a8058 14 main/source/Sources.bz2
+ 1d91164164e6310a5e5fc93390995028956f657490a9ce7aa136dc94291828a8 90 main/binary-i386/Release
+ 2d75333511325affcefe66c6cfbaa6ab21e6aa0e85a6b4fa39a4191146b81460 92 main/source/Release
+ 0e2e7586903004efb49dd419be8a98260dab502352c4b1bf6074f658220aef4e 984 main/binary-i386/Packages
+ e2bd1d551b4983253cc26004504ead7b6987e609db8cb7185ab3dde69d346acd 603 main/binary-i386/Packages.gz
+ 81bcd3d47fc3e9dbe1e201d7ec1b356dd2ae3bc5c171f76247243a64755c25d6 651 main/binary-i386/Packages.bz2
diff --git a/src/github.com/smira/aptly/system/t06_publish/S3Publish2Test_sources b/src/github.com/smira/aptly/system/t06_publish/S3Publish2Test_sources
new file mode 100644
index 00000000..e69de29b
diff --git a/src/github.com/smira/aptly/system/t06_publish/S3Publish3Test_binary b/src/github.com/smira/aptly/system/t06_publish/S3Publish3Test_binary
new file mode 100644
index 00000000..68a4003f
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t06_publish/S3Publish3Test_binary
@@ -0,0 +1,29 @@
+Package: gnuplot-x11
+Version: 4.6.1-1~maverick2
+Installed-Size: 1604
+Priority: optional
+Section: math
+Maintainer: Debian Science Team
+Architecture: i386
+Description: Command-line driven interactive plotting program
+ Gnuplot is a portable command-line driven interactive data and function
+ plotting utility that supports lots of output formats, including drivers
+ for many printers, (La)TeX, (x)fig, Postscript, and so on. The X11-output
+ is packaged in gnuplot-x11.
+ .
+ Data files and self-defined functions can be manipulated by the internal
+ C-like language. Can perform smoothing, spline-fitting, or nonlinear fits,
+ and can work with complex numbers.
+ .
+ This package contains the terminal driver that enables gnuplot to plot
+ images interactively under X11. Most users will want this, it is however
+ packaged separately so that low-end systems don't need X installed to use
+ gnuplot.
+MD5sum: fcad938905d0ace50a6ce0c73b2c6583
+SHA1: 02f9a93097a8f798a054e26154dbe5789088c069
+Replaces: gnuplot (<< 4.0.0)
+Filename: pool/main/g/gnuplot/gnuplot-x11_4.6.1-1~maverick2_i386.deb
+Depends: gnuplot-nox (>= 4.6.1-1~maverick2), libc6 (>= 2.11), libcairo2 (>= 1.6.0), libedit2 (>= 2.5.cvs.20010821-1), libgcc1 (>= 1:4.1.1), libgd2-noxpm (>= 2.0.36~rc1~dfsg) | libgd2-xpm (>= 2.0.36~rc1~dfsg), libglib2.0-0 (>= 2.12.0), liblua5.1-0, libpango1.0-0 (>= 1.14.0), libstdc++6 (>= 4.1.1), libwxbase2.8-0 (>= 2.8.11.0), libwxgtk2.8-0 (>= 2.8.11.0), libx11-6
+Size: 724388
+Source: gnuplot
+
diff --git a/src/github.com/smira/aptly/system/t06_publish/S3Publish3Test_gold b/src/github.com/smira/aptly/system/t06_publish/S3Publish3Test_gold
new file mode 100644
index 00000000..b6fc6fce
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t06_publish/S3Publish3Test_gold
@@ -0,0 +1,8 @@
+Loading packages...
+Generating metadata files and linking package files...
+Finalizing metadata files...
+Signing file 'Release' with gpg, please enter your passphrase when prompted:
+Clearsigning file 'Release' with gpg, please enter your passphrase when prompted:
+Cleaning up prefix "." components main...
+
+Publish for snapshot s3:test1:./maverick [amd64, i386] publishes {main: [snap3]: Pulled into 'snap2' with 'snap1' as source, pull request was: 'gnuplot-x11'} has been successfully switched to new snapshot.
diff --git a/src/github.com/smira/aptly/system/t06_publish/S3Publish3Test_release b/src/github.com/smira/aptly/system/t06_publish/S3Publish3Test_release
new file mode 100644
index 00000000..892aa912
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t06_publish/S3Publish3Test_release
@@ -0,0 +1,34 @@
+Origin: . maverick
+Label: . maverick
+Codename: maverick
+Date: Wed, 1 Oct 2014 09:16:49 UTC
+Architectures: amd64 i386
+Components: main
+Description: Generated by aptly
+MD5Sum:
+ 4717e26fc4a8703cd8886feb8ff9532d 91 main/binary-amd64/Release
+ 60b30b7b0c62ae04bb3bc457abadaced 90 main/binary-i386/Release
+ 2b810443a56c38746aba877b84fc74a1 1526 main/binary-amd64/Packages
+ 28bced4c89869001d9fe6b7c553dd1df 862 main/binary-amd64/Packages.gz
+ aaa2ee36bda75a9c66e31881ae128016 931 main/binary-amd64/Packages.bz2
+ aac26f9e4705d03000094f76d475aea2 1524 main/binary-i386/Packages
+ 158aec0342fc4ca52178b4512c5ee1b5 862 main/binary-i386/Packages.gz
+ 34859d0bf49cb66045de43d01b1de311 939 main/binary-i386/Packages.bz2
+SHA1:
+ 93c9982ebbb6a74a118d07e500b596097c8c4780 91 main/binary-amd64/Release
+ 2bfef2580deadf6863ee6f893e8b9a2c7522e1ed 90 main/binary-i386/Release
+ 876cafdad8672c4b0b66baec5b12213d2bcb4cf3 1526 main/binary-amd64/Packages
+ b3e2e9ad945a190e2ce4aeb36d1946d9ad04a075 862 main/binary-amd64/Packages.gz
+ bc8a7022261b79f5aeacdca551c51aeb7530b969 931 main/binary-amd64/Packages.bz2
+ 7eca65cdb4a4a6bcb51747f2c8d4829f4457f22b 1524 main/binary-i386/Packages
+ e1f5ab02bdd1fcaa0ab93c5680919f612692992c 862 main/binary-i386/Packages.gz
+ 8a7f311f39316dcedc8a199421116ba92a941028 939 main/binary-i386/Packages.bz2
+SHA256:
+ 73aa8d6aaf47a1bf3c546869ceb09a882a8c2d840f81878e552fe2d1260ac4e2 91 main/binary-amd64/Release
+ 1d91164164e6310a5e5fc93390995028956f657490a9ce7aa136dc94291828a8 90 main/binary-i386/Release
+ f47ca8ea0dc02b4423b1291b302e5594c0ac5c01da72c6f9de1ae17d3eddef2f 1526 main/binary-amd64/Packages
+ 0a939f23e1ed98ec3cf2033eb5665d4c40e7494d6331f453ac2043be3e234897 862 main/binary-amd64/Packages.gz
+ abdb8e2537c11272fc9f70ccbcbd2ee867ae797666d3bf11a51972fa2f4d0325 931 main/binary-amd64/Packages.bz2
+ 7b1e711ab4647a3e200af742690ffee76bcf7244f597fda699495e29177b1c71 1524 main/binary-i386/Packages
+ 5723a156f299c657b2eebd1c17ff1a0ca3f50036fc9a1b6c7d9f985a1841c171 862 main/binary-i386/Packages.gz
+ 41f396a3b5c7f78d743971a1011706c6782c8abac3168ff862fa301255baa040 939 main/binary-i386/Packages.bz2
diff --git a/src/github.com/smira/aptly/system/t06_publish/S3Publish4Test_gold b/src/github.com/smira/aptly/system/t06_publish/S3Publish4Test_gold
new file mode 100644
index 00000000..2d98c85a
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t06_publish/S3Publish4Test_gold
@@ -0,0 +1,4 @@
+Published repositories:
+ * s3:test1:./maverick [amd64, i386] publishes {main: [local-repo]}
+ * s3:test1:./xyz [amd64, i386] publishes {main: [local-repo]}
+ * s3:test1:prefix/maverick [amd64, i386] publishes {main: [local-repo]}
diff --git a/src/github.com/smira/aptly/system/t06_publish/S3Publish5Test_gold b/src/github.com/smira/aptly/system/t06_publish/S3Publish5Test_gold
new file mode 100644
index 00000000..cadce02c
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t06_publish/S3Publish5Test_gold
@@ -0,0 +1,3 @@
+Cleaning up prefix "." components main...
+
+Published repository has been removed successfully.
diff --git a/src/github.com/smira/aptly/system/t06_publish/__init__.py b/src/github.com/smira/aptly/system/t06_publish/__init__.py
index 55e1dd3b..45ba80df 100644
--- a/src/github.com/smira/aptly/system/t06_publish/__init__.py
+++ b/src/github.com/smira/aptly/system/t06_publish/__init__.py
@@ -8,3 +8,4 @@ from .repo import *
from .snapshot import *
from .switch import *
from .update import *
+from .s3 import *
diff --git a/src/github.com/smira/aptly/system/t06_publish/repo.py b/src/github.com/smira/aptly/system/t06_publish/repo.py
index e9f7df3b..b29d4623 100644
--- a/src/github.com/smira/aptly/system/t06_publish/repo.py
+++ b/src/github.com/smira/aptly/system/t06_publish/repo.py
@@ -584,3 +584,65 @@ class PublishRepo25Test(BaseTest):
super(PublishRepo25Test, self).check()
self.check_file_contents("public/pool/main/p/pyspi/pyspi_0.6.1.orig.tar.gz", "file")
+
+
+class PublishRepo26Test(BaseTest):
+ """
+ publish repo: sign with passphrase
+ """
+ fixtureCmds = [
+ "aptly repo create local-repo",
+ "aptly repo add local-repo ${files}",
+ ]
+ runCmd = "aptly publish repo -keyring=${files}/aptly_passphrase.pub -secret-keyring=${files}/aptly_passphrase.sec -passphrase=verysecret -distribution=maverick local-repo"
+ gold_processor = BaseTest.expand_environ
+ outputMatchPrepare = lambda _, s: s.replace("gpg: gpg-agent is not available in this session\n", "")
+
+ def check(self):
+ super(PublishRepo26Test, self).check()
+
+ # verify signatures
+ self.run_cmd(["gpg", "--no-auto-check-trustdb", "--keyring", os.path.join(os.path.dirname(inspect.getsourcefile(BaseTest)), "files", "aptly_passphrase.pub"),
+ "--verify", os.path.join(os.environ["HOME"], ".aptly", 'public/dists/maverick/InRelease')])
+ self.run_cmd(["gpg", "--no-auto-check-trustdb", "--keyring", os.path.join(os.path.dirname(inspect.getsourcefile(BaseTest)), "files", "aptly_passphrase.pub"),
+ "--verify", os.path.join(os.environ["HOME"], ".aptly", 'public/dists/maverick/Release.gpg'),
+ os.path.join(os.environ["HOME"], ".aptly", 'public/dists/maverick/Release')])
+
+
+class PublishRepo27Test(BaseTest):
+ """
+ publish repo: with udebs
+ """
+ fixtureCmds = [
+ "aptly repo create local-repo",
+ "aptly repo add local-repo ${files} ${udebs}",
+ ]
+ runCmd = "aptly publish repo -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec -distribution=maverick local-repo"
+ gold_processor = BaseTest.expand_environ
+
+ def check(self):
+ super(PublishRepo27Test, self).check()
+
+ self.check_exists('public/dists/maverick/InRelease')
+ self.check_exists('public/dists/maverick/Release')
+ self.check_exists('public/dists/maverick/Release.gpg')
+
+ self.check_exists('public/dists/maverick/main/binary-i386/Release')
+ self.check_exists('public/dists/maverick/main/binary-i386/Packages')
+ self.check_exists('public/dists/maverick/main/binary-i386/Packages.gz')
+ self.check_exists('public/dists/maverick/main/binary-i386/Packages.bz2')
+ self.check_exists('public/dists/maverick/main/source/Release')
+ self.check_exists('public/dists/maverick/main/source/Sources')
+ self.check_exists('public/dists/maverick/main/source/Sources.gz')
+ self.check_exists('public/dists/maverick/main/source/Sources.bz2')
+
+ self.check_exists('public/pool/main/p/pyspi/pyspi_0.6.1-1.3.dsc')
+ self.check_exists('public/pool/main/p/pyspi/pyspi_0.6.1-1.3.diff.gz')
+ self.check_exists('public/pool/main/p/pyspi/pyspi_0.6.1.orig.tar.gz')
+ self.check_exists('public/pool/main/p/pyspi/pyspi-0.6.1-1.3.stripped.dsc')
+ self.check_exists('public/pool/main/b/boost-defaults/libboost-program-options-dev_1.49.0.1_i386.deb')
+ self.check_exists('public/pool/main/d/dmraid/dmraid-udeb_1.0.0.rc16-4.1_amd64.udeb')
+ self.check_exists('public/pool/main/d/dmraid/dmraid-udeb_1.0.0.rc16-4.1_i386.udeb')
+
+ # verify contents except of sums
+ self.check_file_contents('public/dists/maverick/main/debian-installer/binary-i386/Packages', 'udeb_binary', match_prepare=lambda s: "\n".join(sorted(s.split("\n"))))
diff --git a/src/github.com/smira/aptly/system/t06_publish/s3.py b/src/github.com/smira/aptly/system/t06_publish/s3.py
new file mode 100644
index 00000000..cdb202c9
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t06_publish/s3.py
@@ -0,0 +1,158 @@
+from s3_lib import S3Test
+
+
+def strip_processor(output):
+ return "\n".join([l for l in output.split("\n") if not l.startswith(' ') and not l.startswith('Date:')])
+
+
+class S3Publish1Test(S3Test):
+ """
+ publish to S3: from repo
+ """
+ fixtureCmds = [
+ "aptly repo create -distribution=maverick local-repo",
+ "aptly repo add local-repo ${files}",
+ ]
+ runCmd = "aptly publish repo -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec local-repo s3:test1:"
+
+ def check(self):
+ super(S3Publish1Test, self).check()
+
+ self.check_exists('public/dists/maverick/InRelease')
+ self.check_exists('public/dists/maverick/Release')
+ self.check_exists('public/dists/maverick/Release.gpg')
+
+ self.check_exists('public/dists/maverick/main/binary-i386/Packages')
+ self.check_exists('public/dists/maverick/main/binary-i386/Packages.gz')
+ self.check_exists('public/dists/maverick/main/binary-i386/Packages.bz2')
+ self.check_exists('public/dists/maverick/main/source/Sources')
+ self.check_exists('public/dists/maverick/main/source/Sources.gz')
+ self.check_exists('public/dists/maverick/main/source/Sources.bz2')
+
+ self.check_exists('public/pool/main/p/pyspi/pyspi_0.6.1-1.3.dsc')
+ self.check_exists('public/pool/main/p/pyspi/pyspi_0.6.1-1.3.diff.gz')
+ self.check_exists('public/pool/main/p/pyspi/pyspi_0.6.1.orig.tar.gz')
+ self.check_exists('public/pool/main/p/pyspi/pyspi-0.6.1-1.3.stripped.dsc')
+ self.check_exists('public/pool/main/b/boost-defaults/libboost-program-options-dev_1.49.0.1_i386.deb')
+
+ # # verify contents except of sums
+ self.check_file_contents('public/dists/maverick/Release', 'release', match_prepare=strip_processor)
+ self.check_file_contents('public/dists/maverick/main/source/Sources', 'sources', match_prepare=lambda s: "\n".join(sorted(s.split("\n"))))
+ self.check_file_contents('public/dists/maverick/main/binary-i386/Packages', 'binary', match_prepare=lambda s: "\n".join(sorted(s.split("\n"))))
+
+
+class S3Publish2Test(S3Test):
+ """
+ publish to S3: publish update removed some packages
+ """
+ fixtureCmds = [
+ "aptly repo create -distribution=maverick local-repo",
+ "aptly repo add local-repo ${files}/",
+ "aptly publish repo -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec local-repo s3:test1:",
+ "aptly repo remove local-repo pyspi"
+ ]
+ runCmd = "aptly publish update -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec maverick s3:test1:"
+
+ def check(self):
+ super(S3Publish2Test, self).check()
+
+ self.check_exists('public/dists/maverick/InRelease')
+ self.check_exists('public/dists/maverick/Release')
+ self.check_exists('public/dists/maverick/Release.gpg')
+
+ self.check_exists('public/dists/maverick/main/binary-i386/Packages')
+ self.check_exists('public/dists/maverick/main/binary-i386/Packages.gz')
+ self.check_exists('public/dists/maverick/main/binary-i386/Packages.bz2')
+ self.check_exists('public/dists/maverick/main/source/Sources')
+ self.check_exists('public/dists/maverick/main/source/Sources.gz')
+ self.check_exists('public/dists/maverick/main/source/Sources.bz2')
+
+ self.check_not_exists('public/pool/main/p/pyspi/pyspi_0.6.1-1.3.dsc')
+ self.check_not_exists('public/pool/main/p/pyspi/pyspi_0.6.1-1.3.diff.gz')
+ self.check_not_exists('public/pool/main/p/pyspi/pyspi_0.6.1.orig.tar.gz')
+ self.check_not_exists('public/pool/main/p/pyspi/pyspi-0.6.1-1.3.stripped.dsc')
+ self.check_exists('public/pool/main/b/boost-defaults/libboost-program-options-dev_1.49.0.1_i386.deb')
+
+ # verify contents except of sums
+ self.check_file_contents('public/dists/maverick/Release', 'release', match_prepare=strip_processor)
+ self.check_file_contents('public/dists/maverick/main/source/Sources', 'sources', match_prepare=lambda s: "\n".join(sorted(s.split("\n"))))
+ self.check_file_contents('public/dists/maverick/main/binary-i386/Packages', 'binary', match_prepare=lambda s: "\n".join(sorted(s.split("\n"))))
+
+
+class S3Publish3Test(S3Test):
+ """
+ publish to S3: publish switch - removed some packages
+ """
+ fixtureDB = True
+ fixturePool = True
+ fixtureCmds = [
+ "aptly snapshot create snap1 from mirror gnuplot-maverick",
+ "aptly snapshot create snap2 empty",
+ "aptly snapshot pull -no-deps -architectures=i386,amd64 snap2 snap1 snap3 gnuplot-x11",
+ "aptly publish snapshot -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec -distribution=maverick snap1 s3:test1:",
+ ]
+ runCmd = "aptly publish switch -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec maverick s3:test1: snap3"
+
+ def check(self):
+ super(S3Publish3Test, self).check()
+
+ self.check_exists('public/dists/maverick/InRelease')
+ self.check_exists('public/dists/maverick/Release')
+ self.check_exists('public/dists/maverick/Release.gpg')
+
+ self.check_exists('public/dists/maverick/main/binary-i386/Packages.gz')
+ self.check_exists('public/dists/maverick/main/binary-i386/Packages.bz2')
+ self.check_exists('public/dists/maverick/main/binary-amd64/Packages')
+ self.check_exists('public/dists/maverick/main/binary-amd64/Packages.gz')
+ self.check_exists('public/dists/maverick/main/binary-amd64/Packages.bz2')
+
+ self.check_exists('public/pool/main/g/gnuplot/gnuplot-x11_4.6.1-1~maverick2_i386.deb')
+ self.check_exists('public/pool/main/g/gnuplot/gnuplot-x11_4.6.1-1~maverick2_amd64.deb')
+ self.check_not_exists('public/pool/main/g/gnuplot/gnuplot-nox_4.6.1-1~maverick2_i386.deb')
+ self.check_not_exists('public/pool/main/g/gnuplot/gnuplot-nox_4.6.1-1~maverick2_amd64.deb')
+
+ # verify contents except of sums
+ self.check_file_contents('public/dists/maverick/Release', 'release', match_prepare=strip_processor)
+ self.check_file_contents('public/dists/maverick/main/binary-i386/Packages', 'binary', match_prepare=lambda s: "\n".join(sorted(s.split("\n"))))
+
+
+class S3Publish4Test(S3Test):
+ """
+ publish to S3: multiple repos, list
+ """
+ fixtureCmds = [
+ "aptly repo create -distribution=maverick local-repo",
+ "aptly repo add local-repo ${udebs}",
+ "aptly publish repo -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec local-repo s3:test1:",
+ "aptly publish repo -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec -distribution=xyz local-repo s3:test1:",
+ "aptly publish repo -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec local-repo s3:test1:prefix",
+ ]
+ runCmd = "aptly publish list"
+
+
+class S3Publish5Test(S3Test):
+ """
+ publish to S3: publish drop - component cleanup
+ """
+ fixtureCmds = [
+ "aptly repo create local1",
+ "aptly repo create local2",
+ "aptly repo add local1 ${files}/libboost-program-options-dev_1.49.0.1_i386.deb",
+ "aptly repo add local2 ${files}",
+ "aptly publish repo -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec -distribution=sq1 local1 s3:test1:",
+ "aptly publish repo -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec -distribution=sq2 local2 s3:test1:",
+ ]
+ runCmd = "aptly publish drop sq2 s3:test1:"
+
+ def check(self):
+ super(S3Publish5Test, self).check()
+
+ self.check_exists('public/dists/sq1')
+ self.check_not_exists('public/dists/sq2')
+ self.check_exists('public/pool/main/')
+
+ self.check_not_exists('public/pool/main/p/pyspi/pyspi_0.6.1-1.3.dsc')
+ self.check_not_exists('public/pool/main/p/pyspi/pyspi_0.6.1-1.3.diff.gz')
+ self.check_not_exists('public/pool/main/p/pyspi/pyspi_0.6.1.orig.tar.gz')
+ self.check_not_exists('public/pool/main/p/pyspi/pyspi-0.6.1-1.3.stripped.dsc')
+ self.check_exists('public/pool/main/b/boost-defaults/libboost-program-options-dev_1.49.0.1_i386.deb')
diff --git a/src/github.com/smira/aptly/system/t06_publish/snapshot.py b/src/github.com/smira/aptly/system/t06_publish/snapshot.py
index 10d26b36..5fac3d25 100644
--- a/src/github.com/smira/aptly/system/t06_publish/snapshot.py
+++ b/src/github.com/smira/aptly/system/t06_publish/snapshot.py
@@ -8,6 +8,10 @@ def strip_processor(output):
return "\n".join([l for l in output.split("\n") if not l.startswith(' ') and not l.startswith('Date:')])
+def sorted_processor(output):
+ return "\n".join(sorted(output.split("\n")))
+
+
class PublishSnapshot1Test(BaseTest):
"""
publish snapshot: defaults
@@ -27,12 +31,16 @@ class PublishSnapshot1Test(BaseTest):
self.check_exists('public/dists/maverick/Release')
self.check_exists('public/dists/maverick/Release.gpg')
+ self.check_exists('public/dists/maverick/main/binary-i386/Release')
self.check_exists('public/dists/maverick/main/binary-i386/Packages')
self.check_exists('public/dists/maverick/main/binary-i386/Packages.gz')
self.check_exists('public/dists/maverick/main/binary-i386/Packages.bz2')
+ self.check_exists('public/dists/maverick/main/binary-amd64/Release')
self.check_exists('public/dists/maverick/main/binary-amd64/Packages')
self.check_exists('public/dists/maverick/main/binary-amd64/Packages.gz')
self.check_exists('public/dists/maverick/main/binary-amd64/Packages.bz2')
+ self.check_not_exists('public/dists/maverick/main/debian-installer/binary-i386/Packages')
+ self.check_not_exists('public/dists/maverick/main/debian-installer/binary-amd64/Packages')
self.check_exists('public/pool/main/g/gnuplot/gnuplot-doc_4.6.1-1~maverick2_all.deb')
@@ -42,6 +50,9 @@ class PublishSnapshot1Test(BaseTest):
self.check_file_contents('public/dists/maverick/main/binary-i386/Release', 'release_i386')
self.check_file_contents('public/dists/maverick/main/binary-amd64/Release', 'release_amd64')
+ self.check_file_contents('public/dists/maverick/main/binary-i386/Packages', 'packages_i386', match_prepare=sorted_processor)
+ self.check_file_contents('public/dists/maverick/main/binary-amd64/Packages', 'packages_amd64', match_prepare=sorted_processor)
+
# verify signatures
self.run_cmd(["gpg", "--no-auto-check-trustdb", "--keyring", os.path.join(os.path.dirname(inspect.getsourcefile(BaseTest)), "files", "aptly.pub"),
"--verify", os.path.join(os.environ["HOME"], ".aptly", 'public/dists/maverick/InRelease')])
@@ -822,3 +833,96 @@ class PublishSnapshot34Test(BaseTest):
super(PublishSnapshot34Test, self).check()
self.check_file_contents("public/pool/main/p/pyspi/pyspi_0.6.1.orig.tar.gz", "file")
+
+
+class PublishSnapshot35Test(BaseTest):
+ """
+ publish snapshot: mirror with udebs
+ """
+ fixtureGpg = True
+ fixtureCmds = [
+ "aptly -architectures=i386,amd64 mirror create -keyring=aptlytest.gpg -filter='$$Source (dmraid)' -with-udebs squeeze http://mirror.yandex.ru/debian/ squeeze main non-free",
+ "aptly mirror update -keyring=aptlytest.gpg squeeze",
+ "aptly snapshot create squeeze from mirror squeeze",
+ ]
+ runCmd = "aptly publish snapshot -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec squeeze"
+ gold_processor = BaseTest.expand_environ
+
+ def check(self):
+ super(PublishSnapshot35Test, self).check()
+
+ self.check_exists('public/dists/squeeze/InRelease')
+ self.check_exists('public/dists/squeeze/Release')
+ self.check_exists('public/dists/squeeze/Release.gpg')
+
+ self.check_exists('public/dists/squeeze/main/binary-i386/Release')
+ self.check_exists('public/dists/squeeze/main/binary-i386/Packages')
+ self.check_exists('public/dists/squeeze/main/binary-i386/Packages.gz')
+ self.check_exists('public/dists/squeeze/main/binary-i386/Packages.bz2')
+ self.check_exists('public/dists/squeeze/main/debian-installer/binary-i386/Release')
+ self.check_exists('public/dists/squeeze/main/debian-installer/binary-i386/Packages')
+ self.check_exists('public/dists/squeeze/main/debian-installer/binary-i386/Packages.gz')
+ self.check_exists('public/dists/squeeze/main/debian-installer/binary-i386/Packages.bz2')
+ self.check_exists('public/dists/squeeze/main/binary-amd64/Release')
+ self.check_exists('public/dists/squeeze/main/binary-amd64/Packages')
+ self.check_exists('public/dists/squeeze/main/binary-amd64/Packages.gz')
+ self.check_exists('public/dists/squeeze/main/binary-amd64/Packages.bz2')
+ self.check_exists('public/dists/squeeze/main/debian-installer/binary-amd64/Release')
+ self.check_exists('public/dists/squeeze/main/debian-installer/binary-amd64/Packages')
+ self.check_exists('public/dists/squeeze/main/debian-installer/binary-amd64/Packages.gz')
+ self.check_exists('public/dists/squeeze/main/debian-installer/binary-amd64/Packages.bz2')
+ self.check_not_exists('public/dists/squeeze/main/source/Sources')
+ self.check_not_exists('public/dists/squeeze/main/source/Sources.gz')
+ self.check_not_exists('public/dists/squeeze/main/source/Sources.bz2')
+
+ self.check_exists('public/pool/main/d/dmraid/dmraid-udeb_1.0.0.rc16-4.1_amd64.udeb')
+ self.check_exists('public/pool/main/d/dmraid/dmraid-udeb_1.0.0.rc16-4.1_i386.udeb')
+ self.check_exists('public/pool/main/d/dmraid/dmraid_1.0.0.rc16-4.1_amd64.deb')
+ self.check_exists('public/pool/main/d/dmraid/dmraid_1.0.0.rc16-4.1_i386.deb')
+
+ self.check_file_contents('public/dists/squeeze/main/binary-i386/Packages', 'packages_i386', match_prepare=sorted_processor)
+ self.check_file_contents('public/dists/squeeze/main/debian-installer/binary-i386/Packages', 'packages_udeb_i386', match_prepare=sorted_processor)
+ self.check_file_contents('public/dists/squeeze/main/binary-amd64/Packages', 'packages_amd64', match_prepare=sorted_processor)
+ self.check_file_contents('public/dists/squeeze/main/debian-installer/binary-amd64/Packages', 'packages_udeb_amd64', match_prepare=sorted_processor)
+
+ # verify contents except of sums
+ self.check_file_contents('public/dists/squeeze/Release', 'release', match_prepare=strip_processor)
+
+ self.check_file_contents('public/dists/squeeze/main/debian-installer/binary-i386/Release', 'release_udeb_i386', match_prepare=strip_processor)
+
+ # verify sums
+ release = self.read_file('public/dists/squeeze/Release').split("\n")
+ release = [l for l in release if l.startswith(" ")]
+ pathsSeen = set()
+ for l in release:
+ fileHash, fileSize, path = l.split()
+ pathsSeen.add(path)
+
+ fileSize = int(fileSize)
+
+ st = os.stat(os.path.join(os.environ["HOME"], ".aptly", 'public/dists/squeeze/', path))
+ if fileSize != st.st_size:
+ raise Exception("file size doesn't match for %s: %d != %d" % (path, fileSize, st.st_size))
+
+ if len(fileHash) == 32:
+ h = hashlib.md5()
+ elif len(fileHash) == 40:
+ h = hashlib.sha1()
+ else:
+ h = hashlib.sha256()
+
+ h.update(self.read_file(os.path.join('public/dists/squeeze', path)))
+
+ if h.hexdigest() != fileHash:
+ raise Exception("file hash doesn't match for %s: %s != %s" % (path, fileHash, h.hexdigest()))
+
+ pathsExepcted = set()
+ for arch in ("i386", "amd64"):
+ for udeb in ("", "debian-installer/"):
+ for ext in ("", ".gz", ".bz2"):
+ pathsExepcted.add("main/%sbinary-%s/Packages%s" % (udeb, arch, ext))
+
+ pathsExepcted.add("main/%sbinary-%s/Release" % (udeb, arch))
+
+ if pathsSeen != pathsExepcted:
+ raise Exception("path seen wrong: %r != %r" % (pathsSeen, pathsExepcted))
diff --git a/src/github.com/smira/aptly/system/t09_repo/AddRepo11Test/pyspi_0.6.1-1.3.conflict.dsc b/src/github.com/smira/aptly/system/t09_repo/AddRepo11Test/pyspi_0.6.1-1.3.conflict.dsc
new file mode 100644
index 00000000..21a67a86
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t09_repo/AddRepo11Test/pyspi_0.6.1-1.3.conflict.dsc
@@ -0,0 +1,12 @@
+Format: 1.0
+Source: pyspi
+Binary: python-at-spi
+Architecture: any
+Version: 0.6.1-1.3
+Maintainer: Jose Carlos Garcia Sogo
+Homepage: http://people.redhat.com/zcerza/dogtail
+Standards-Version: 3.7.3
+Vcs-Svn: svn://svn.tribulaciones.org/srv/svn/pyspi/trunk
+Build-Depends: debhelper (>= 5), cdbs, libatspi-dev, python-pyrex, python-support (>= 0.4), python-all-dev, libx11-dev
+Files:
+ d41d8cd98f00b204e9800998ecf8427e 0 pyspi_0.6.1.orig.tar.gz
diff --git a/src/github.com/smira/aptly/system/t09_repo/AddRepo11Test/pyspi_0.6.1.orig.tar.gz b/src/github.com/smira/aptly/system/t09_repo/AddRepo11Test/pyspi_0.6.1.orig.tar.gz
new file mode 100644
index 00000000..e69de29b
diff --git a/src/github.com/smira/aptly/system/t09_repo/AddRepo11Test_gold b/src/github.com/smira/aptly/system/t09_repo/AddRepo11Test_gold
new file mode 100644
index 00000000..ea24cee5
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t09_repo/AddRepo11Test_gold
@@ -0,0 +1,3 @@
+Loading packages...
+[-] pyspi_0.6.1-1.3_source removed due to conflict with package being added
+[+] pyspi_0.6.1-1.3_source added
diff --git a/src/github.com/smira/aptly/system/t09_repo/AddRepo11Test_repo_show b/src/github.com/smira/aptly/system/t09_repo/AddRepo11Test_repo_show
new file mode 100644
index 00000000..28d1e716
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t09_repo/AddRepo11Test_repo_show
@@ -0,0 +1,7 @@
+Name: repo11
+Comment: Repo11
+Default Distribution: squeeze
+Default Component: main
+Number of packages: 1
+Packages:
+ pyspi_0.6.1-1.3_source
diff --git a/src/github.com/smira/aptly/system/t09_repo/AddRepo12Test_gold b/src/github.com/smira/aptly/system/t09_repo/AddRepo12Test_gold
new file mode 100644
index 00000000..362cf9ac
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t09_repo/AddRepo12Test_gold
@@ -0,0 +1,2 @@
+Loading packages...
+[+] dmraid-udeb_1.0.0.rc16-4.1_amd64 added
diff --git a/src/github.com/smira/aptly/system/t09_repo/AddRepo12Test_repo_show b/src/github.com/smira/aptly/system/t09_repo/AddRepo12Test_repo_show
new file mode 100644
index 00000000..b5cda2da
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t09_repo/AddRepo12Test_repo_show
@@ -0,0 +1,7 @@
+Name: repo12
+Comment: Repo12
+Default Distribution: squeeze
+Default Component: main
+Number of packages: 1
+Packages:
+ dmraid-udeb_1.0.0.rc16-4.1_amd64
diff --git a/src/github.com/smira/aptly/system/t09_repo/AddRepo13Test_gold b/src/github.com/smira/aptly/system/t09_repo/AddRepo13Test_gold
new file mode 100644
index 00000000..89051da0
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t09_repo/AddRepo13Test_gold
@@ -0,0 +1,6 @@
+Loading packages...
+[+] libboost-program-options-dev_1.49.0.1_i386 added
+[+] pyspi_0.6.1-1.4_source added
+[+] pyspi_0.6.1-1.3_source added
+[+] dmraid-udeb_1.0.0.rc16-4.1_amd64 added
+[+] dmraid-udeb_1.0.0.rc16-4.1_i386 added
diff --git a/src/github.com/smira/aptly/system/t09_repo/AddRepo13Test_repo_show b/src/github.com/smira/aptly/system/t09_repo/AddRepo13Test_repo_show
new file mode 100644
index 00000000..b921958a
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t09_repo/AddRepo13Test_repo_show
@@ -0,0 +1,11 @@
+Name: repo13
+Comment: Repo13
+Default Distribution: squeeze
+Default Component: main
+Number of packages: 5
+Packages:
+ dmraid-udeb_1.0.0.rc16-4.1_amd64
+ dmraid-udeb_1.0.0.rc16-4.1_i386
+ libboost-program-options-dev_1.49.0.1_i386
+ pyspi_0.6.1-1.3_source
+ pyspi_0.6.1-1.4_source
diff --git a/src/github.com/smira/aptly/system/t09_repo/SearchRepo1Test_gold b/src/github.com/smira/aptly/system/t09_repo/SearchRepo1Test_gold
new file mode 100644
index 00000000..52405682
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t09_repo/SearchRepo1Test_gold
@@ -0,0 +1,4043 @@
+
+aolserver4-dev_4.5.1-15.1_i386
+apache2-prefork-dev_2.2.22-13+deb7u1_i386
+apache2-threaded-dev_2.2.22-13+deb7u1_i386
+apcalc-dev_2.12.4.4-3_i386
+aplus-fsf-dev_4.22.1-6_i386
+aroarfw-dev_0.1~beta4-5_all
+asterisk-dev_1:1.8.13.1~dfsg1-3+deb7u3_all
+atfs-dev_1.4pl6-11_i386
+audacious-dev_3.2.4-1_i386
+autotools-dev_20120608.1_all
+binutils-dev_2.22-8_i386
+biosquid-dev_1.9g+cvs20050121-2_i386
+bitlbee-dev_3.0.5-1.2_all
+blacs-pvm-dev_1.1-21_i386
+blends-dev_0.6.16.2_all
+blktap-dev_2.0.90-1_i386
+blt-dev_2.4z-4.2_i386
+boinc-dev_7.0.27+dfsg-5_i386
+boolstuff-dev_0.1.12-3_i386
+cairo-dock-dev_3.0.0-2+deb7u1_i386
+cernlib-base-dev_20061220+dfsg3-2_all
+cernlib-core-dev_20061220+dfsg3-2_all
+chipmunk-dev_5.3.4-1_i386
+cimg-dev_1.4.9-2_all
+clearsilver-dev_0.10.5-1.3_i386
+cli-common-dev_0.8.2_all
+clinica-dev_0.2.1~dfsg-1_i386
+clisp-dev_1:2.49-8.1_i386
+cluster-glue-dev_1.0.9+hg2665-1_i386
+codeblocks-dev_10.05-2.1_i386
+coinor-libcbc-dev_2.5.0-3_i386
+coinor-libcgl-dev_0.55.0-1.1_i386
+coinor-libclp-dev_1.12.0-2.1_i386
+coinor-libcoinutils-dev_2.6.4-3_i386
+coinor-libdylp-dev_1.6.0-1.1_i386
+coinor-libflopc++-dev_1.0.6-3.1_i386
+coinor-libipopt-dev_3.10.2-1.1_i386
+coinor-libosi-dev_0.103.0-1_i386
+coinor-libsymphony-dev_5.2.4-1.2_i386
+coinor-libvol-dev_1.1.7-1_i386
+collectd-dev_5.1.0-3_all
+comerr-dev_2.1-1.42.5-1.1_i386
+condor-dev_7.8.2~dfsg.1-1+deb7u1_i386
+config-package-dev_4.13_all
+connman-dev_1.0-1.1+wheezy1+b1_i386
+console-tools-dev_1:0.2.3dbs-70_i386
+coop-computing-tools-dev_3.5.1-2_i386
+corosync-dev_1.4.2-3_i386
+courier-authlib-dev_0.63.0-6+b1_i386
+crtmpserver-dev_1.0~dfsg-3_i386
+ctapi-dev_1.1_all
+ctn-dev_3.0.6-13+b2_i386
+cyrus-dev_2.4.16-4+deb7u1_all
+dcap-dev_2.47.6-2_i386
+dico-dev_2.1-3+b2_i386
+dictionaries-common-dev_1.12.11_all
+dietlibc-dev_0.33~cvs20120325-4_i386
+dolfin-dev_1.0.0-7_all
+dovecot-dev_1:2.1.7-7_i386
+dpkg-dev_1.16.12_all
+drac-dev_1.12-7.2_i386
+drizzle-plugin-dev_1:7.1.36-stable-1_i386
+dssi-dev_1.1.1~dfsg0-1_all
+e2fslibs-dev_1.42.5-1.1_i386
+emerillon-dev_0.1.90-1_i386
+eog-dev_3.4.2-1+build1_all
+epiphany-browser-dev_3.4.2-2.1_i386
+erlang-dev_1:15.b.1-dfsg-4+deb7u1_i386
+erlang-esdl-dev_1.2-2_all
+etl-dev_0.04.15-1_i386
+evolution-data-server-dev_3.4.4-3_i386
+evolution-dev_3.4.4-3_i386
+exim4-dev_4.80-7_i386
+expect-dev_5.45-2_i386
+expeyes-firmware-dev_2.0.0-3_all
+extremetuxracer-gimp-dev_0.4-5_all
+falconpl-dev_0.9.6.9-git20120606-2_i386
+fatrat-dev_1.1.3-5_all
+fcitx-libs-dev_1:4.2.4.1-7_i386
+fenix-dev_0.92a.dfsg1-9_all
+festival-dev_1:2.1~release-5.1_i386
+fftw-dev_2.1.5-1_i386
+finch-dev_2.10.9-1~deb7u1_all
+firebird-dev_2.5.2.26540.ds4-1~deb7u1_i386
+flite1-dev_1.4-release-6_i386
+flow-tools-dev_1:0.68-12.1+b1_i386
+fosfat-dev_0.4.0-3_i386
+freeglut3-dev_2.6.0-4_i386
+freetds-dev_0.91-2+deb7u1_i386
+frei0r-plugins-dev_1.1.22git20091109-1.2_i386
+ftgl-dev_2.1.3~rc5-4_all
+ftplib-dev_3.1-1-9_i386
+gambas3-dev_3.1.1-2+b1_i386
+gap-dev_4r4p12-2_i386
+gauche-dev_0.9.1-5.1_i386
+gcc-4.6-plugin-dev_4.6.3-14_i386
+gcc-4.7-plugin-dev_4.7.2-5_i386
+gcin-dev_2.7.6.1+dfsg-1_all
+gedit-dev_3.4.2-1_all
+gem-dev_1:0.93.3-5_all
+genius-dev_1.0.14-1_i386
+gfxboot-dev_4.5.0-3_i386
+giblib-dev_1.2.4-8_i386
+glabels-dev_3.0.0-3+b1_i386
+glee-dev_5.4.0-1_i386
+gmpc-dev_11.8.16-6_i386
+gnash-dev_0.8.11~git20120629-1+deb7u1_i386
+gnome-control-center-dev_1:3.4.3.1-2_all
+gnome-settings-daemon-dev_3.4.2+git20121218.7c1322-3+deb7u3_i386
+gnome-video-effects-dev_0.4.0-1_all
+gnumach-dev_2:1.3.99.dfsg.git20120610-1_i386
+gnunet-dev_0.9.3-7_i386
+gnunet-gtk-dev_0.9.3-1_i386
+gnuradio-dev_3.5.3.2-1_i386
+gosa-dev_2.7.4-4.3~deb7u1_all
+gpe-ownerinfo-dev_0.28-3_i386
+gpsim-dev_0.26.1-2.1_i386
+graphviz-dev_2.26.3-14+deb7u1_all
+grass-dev_6.4.2-2_i386
+gridengine-drmaa-dev_6.2u5-7.1_i386
+gromacs-dev_4.5.5-2_i386
+gsettings-desktop-schemas-dev_3.4.2-3_i386
+gthumb-dev_3:3.0.1-2_i386
+guile-1.6-dev_1.6.8-10.3_i386
+guile-1.8-dev_1.8.8+1-8_i386
+guile-2.0-dev_2.0.5+1-3_i386
+guile-cairo-dev_1.4.0-3_i386
+heartbeat-dev_1:3.0.5-3_i386
+heimdal-dev_1.6~git20120403+dfsg1-2_i386
+hime-dev_0.9.9+git20120619+dfsg-1_all
+hybrid-dev_1:7.2.2.dfsg.2-10_all
+icedove-dev_10.0.12-1_i386
+inn2-dev_2.5.3-3_i386
+inventor-dev_2.1.5-10-16_i386
+iproute-dev_20120521-3+b3_i386
+iptables-dev_1.4.14-3.1_i386
+irssi-dev_0.8.15-5_i386
+isc-dhcp-dev_4.2.2.dfsg.1-5+deb70u6_i386
+itcl3-dev_3.4.1-1_i386
+itk3-dev_3.3-4_i386
+ivtools-dev_1.2.10a1-1_i386
+kadu-dev_0.11.2-1_all
+kannel-dev_1.4.3-2+b2_i386
+kde-workspace-dev_4:4.8.4-6_i386
+kdebase-workspace-dev_4:4.8.4-6_all
+kdelibs5-dev_4:4.8.4-4_i386
+kdemultimedia-dev_4:4.8.4-2_i386
+kdepimlibs5-dev_4:4.8.4-2_i386
+kdevelop-dev_4:4.3.1-3+b1_i386
+kdevplatform-dev_1.3.1-2_i386
+kmymoney-dev_4.6.2-3.2_i386
+konwert-dev_1.8-11.2_all
+lam4-dev_7.1.4-3_i386
+lesstif2-dev_1:0.95.2-1.1_i386
+lib3ds-dev_1.3.0-6_i386
+lib4store-dev_1.1.4-2_i386
+lib64bz2-dev_1.0.6-4_i386
+lib64expat1-dev_2.1.0-1+deb7u1_i386
+lib64ffi-dev_3.0.10-3_i386
+lib64ncurses5-dev_5.9-10_i386
+lib64readline-gplv2-dev_5.2+dfsg-2~deb7u1_i386
+lib64readline6-dev_6.2+dfsg-0.1_i386
+lib64z1-dev_1:1.2.7.dfsg-13_i386
+liba52-0.7.4-dev_0.7.4-16_i386
+libaa1-dev_1.4p5-40_i386
+libaac-tactics-ocaml-dev_0.2.pl2-7_i386
+libaacs-dev_0.4.0-1_i386
+libaal-dev_1.0.5-5.1_i386
+libabiword-2.9-dev_2.9.2+svn20120603-8_i386
+libaccountsservice-dev_0.6.21-8_i386
+libace-dev_6.0.3+dfsg-0.1_i386
+libace-flreactor-dev_6.0.3+dfsg-0.1_i386
+libace-foxreactor-dev_6.0.3+dfsg-0.1_i386
+libace-htbp-dev_6.0.3+dfsg-0.1_i386
+libace-inet-dev_6.0.3+dfsg-0.1_i386
+libace-inet-ssl-dev_6.0.3+dfsg-0.1_i386
+libace-qtreactor-dev_6.0.3+dfsg-0.1_i386
+libace-rmcast-dev_6.0.3+dfsg-0.1_i386
+libace-ssl-dev_6.0.3+dfsg-0.1_i386
+libace-tkreactor-dev_6.0.3+dfsg-0.1_i386
+libace-tmcast-dev_6.0.3+dfsg-0.1_i386
+libace-xtreactor-dev_6.0.3+dfsg-0.1_i386
+libacexml-dev_6.0.3+dfsg-0.1_i386
+libacl1-dev_2.2.51-8_i386
+libacpi-dev_0.2-4_i386
+libacr38ucontrol-dev_1.7.11-1_i386
+libadasockets4-dev_1.8.10-2_i386
+libaddresses-dev_0.4.7-1+b5_i386
+libaddressview-dev_0.4.7-1+b5_i386
+libadios-dev_1.3-11_i386
+libadminutil-dev_1.1.15-1_i386
+libadns1-dev_1.4-2_i386
+libadolc-dev_2.3.0-1_i386
+libadplug-dev_2.2.1+dfsg3-0.1_i386
+libafflib-dev_3.6.6-1.1+b1_i386
+libafrodite-0.12-dev_0.12.1-3_i386
+libafterimage-dev_2.2.11-7_i386
+libagg-dev_2.5+dfsg1-8_i386
+libagrep-ocaml-dev_1.0-11+b3_i386
+libahven3-dev_2.1-4_i386
+libaiksaurus-1.2-dev_1.2.1+dev-0.12-6.1_i386
+libaiksaurusgtk-1.2-dev_1.2.1+dev-0.12-6.1_i386
+libaio-dev_0.3.109-3_i386
+libakonadi-dev_1.7.2-3_i386
+libalberta2-dev_2.0.1-5_i386
+libaldmb1-dev_1:0.9.3-5.4_i386
+libalglib-dev_2.6.0-6_i386
+libalkimia-dev_4.3.2-1.1_i386
+liballeggl4-dev_2:4.4.2-2.1_i386
+liballegro4.2-dev_2:4.4.2-2.1_i386
+libalog0.4.1-base-dev_0.4.1-2_i386
+libalog0.4.1-full-dev_0.4.1-2_i386
+libalsa-ocaml-dev_0.2.1-1+b1_i386
+libalsaplayer-dev_0.99.80-5.1_i386
+libalure-dev_1.2-6_i386
+libalut-dev_1.1.0-3_i386
+libampsharp-cil-dev_2.0.4-2_all
+libamu-dev_6.2+rc20110530-3_i386
+libanalitza-dev_4:4.8.4-2_i386
+libanet0.1-dev_0.1-3_i386
+libanjuta-dev_2:3.4.3-1_i386
+libann-dev_1.1.2+doc-3_i386
+libanthy-dev_9100h-16_i386
+libantlr-dev_2.7.7+dfsg-4_i386
+libantlr3c-dev_3.2-2_i386
+libao-dev_1.1.0-2_i386
+libao-ocaml-dev_0.2.0-1+b2_i386
+libaosd-dev_0.2.7-1_i386
+libapache2-mod-perl2-dev_2.0.7-3_all
+libapertium3-3.1-0-dev_3.1.0-2_i386
+libapm-dev_3.2.2-14_i386
+libapol-dev_3.3.7-3_i386
+libapparmor-dev_2.7.103-4_i386
+libappindicator-dev_0.4.92-2_i386
+libappindicator0.1-cil-dev_0.4.92-2_all
+libappindicator3-dev_0.4.92-2_i386
+libapq-postgresql3.2.0-dev_3.2.0-2_i386
+libapq3.2.0-dev_3.2.0-1_i386
+libapr-memcache-dev_0.7.0-1_i386
+libapr1-dev_1.4.6-3+deb7u1_i386
+libapreq2-dev_2.13-1+b2_i386
+libapron-dev_0.9.10-5.2_all
+libapron-ocaml-dev_0.9.10-5.2+b3_i386
+libaprutil1-dev_1.4.1-3_i386
+libapt-pkg-dev_0.9.7.9+deb7u1_i386
+libaqbanking34-dev_5.0.24-3_i386
+libaqsis-dev_1.8.1-3_i386
+libarchive-dev_3.0.4-3+nmu1_i386
+libargtable2-dev_12-1_i386
+libarmadillo-dev_1:3.2.3+dfsg-1_i386
+libarpack++2-dev_2.3-2_i386
+libarpack2-dev_3.1.1-2.1_i386
+libart-2.0-dev_2.3.21-2_i386
+libart2.0-cil-dev_2.24.2-3_all
+libasio-dev_1.4.1-3.2_all
+libasis2010-dev_2010-5_i386
+libasm-dev_0.152-1+wheezy1_i386
+libasound2-dev_1.0.25-4_i386
+libaspell-dev_0.60.7~20110707-1_i386
+libass-dev_0.10.0-3_i386
+libassa3.5-5-dev_3.5.1-2_i386
+libassimp-dev_3.0~dfsg-1_i386
+libassuan-dev_2.0.3-1_i386
+libast2-dev_0.7-6+b1_i386
+libasyncns-dev_0.8-4_i386
+libatasmart-dev_0.19-1_i386
+libatd-ocaml-dev_1.0.1-1+b1_i386
+libatdgen-ocaml-dev_1.2.2-1+b1_i386
+libatk-bridge2.0-dev_2.5.3-2_i386
+libatk1.0-dev_2.4.0-2_i386
+libatkmm-1.6-dev_2.22.6-1_i386
+libatlas-base-dev_3.8.4-9+deb7u1_i386
+libatlas-cpp-0.6-dev_0.6.2-3_i386
+libatlas-dev_3.8.4-9+deb7u1_all
+libatm1-dev_1:2.5.1-1.5_i386
+libatomic-ops-dev_7.2~alpha5+cvs20101124-1+deb7u1_i386
+libatomicparsley-dev_2.1.2-1_i386
+libatspi-dev_1.32.0-2_i386
+libatspi2.0-dev_2.5.3-2_i386
+libattica-dev_0.2.0-1_i386
+libattr1-dev_1:2.4.46-8_i386
+libaubio-dev_0.3.2-4.2+b1_i386
+libaudio-dev_1.9.3-5wheezy1_i386
+libaudiofile-dev_0.3.4-2_i386
+libaudiomask-dev_1.0-2_i386
+libaudit-dev_1:1.7.18-1.1_i386
+libaugeas-dev_0.10.0-1_i386
+libaunit2-dev_1.03-7_i386
+libautotrace-dev_0.31.1-16+b1_i386
+libautounit-dev_0.20.1-4_i386
+libavahi-cil-dev_0.6.19-4.2_all
+libavahi-client-dev_0.6.31-2_i386
+libavahi-common-dev_0.6.31-2_i386
+libavahi-compat-libdnssd-dev_0.6.31-2_i386
+libavahi-core-dev_0.6.31-2_i386
+libavahi-glib-dev_0.6.31-2_i386
+libavahi-gobject-dev_0.6.31-2_i386
+libavahi-qt4-dev_0.6.31-2_i386
+libavahi-ui-cil-dev_0.6.19-4.2_all
+libavahi-ui-dev_0.6.31-2_i386
+libavahi-ui-gtk3-dev_0.6.31-2_i386
+libavbin-dev_7-1.3_i386
+libavc1394-dev_0.5.4-2_i386
+libavcodec-dev_6:0.8.10-1_i386
+libavdevice-dev_6:0.8.10-1_i386
+libavfilter-dev_6:0.8.10-1_i386
+libavformat-dev_6:0.8.10-1_i386
+libavifile-0.7-dev_1:0.7.48~20090503.ds-13_i386
+libavl-dev_0.3.5-3_i386
+libavogadro-dev_1.0.3-5_i386
+libavutil-dev_6:0.8.10-1_i386
+libaws2.10.2-dev_2.10.2-4_i386
+libax25-dev_0.0.12-rc2+cvs20120204-2_i386
+libbabl-dev_0.1.10-1_i386
+libball1.4-dev_1.4.1+20111206-4_i386
+libballview1.4-dev_1.4.1+20111206-4_i386
+libbam-dev_0.1.18-1_i386
+libbamf-dev_0.2.118-1_i386
+libbamf3-dev_0.2.118-1_i386
+libbarry-dev_0.18.3-5_i386
+libbatteries-ocaml-dev_1.4.3-1_i386
+libbdd-dev_2.4-8_i386
+libbeecrypt-dev_4.2.1-4_i386
+libbenchmark-ocaml-dev_0.9-2+b3_i386
+libbfb0-dev_0.23-1.1_i386
+libbg1-dev_1.106-1_i386
+libbibutils-dev_4.12-5_i386
+libbin-prot-camlp4-dev_2.0.7-1_i386
+libbind-dev_1:9.8.4.dfsg.P1-6+nmu2+deb7u1_i386
+libbind4-dev_6.0-1_i386
+libbinio-dev_1.4+dfsg1-1_i386
+libbiniou-ocaml-dev_1.0.0-1+b1_i386
+libbio2jack0-dev_0.9-2.1_i386
+libbiococoa-dev_2.2.2-1+b2_i386
+libbiosig-dev_1.3.0-2_i386
+libbisho-common-dev_0.27.2+git20111122.9e68ef3d-1_i386
+libbison-dev_1:2.5.dfsg-2.1_i386
+libbitmask-dev_2.0-2_i386
+libbitstream-dev_1.0-1_all
+libbitstring-ocaml-dev_2.0.2-3+b1_i386
+libbjack-ocaml-dev_0.1.3-5+b1_i386
+libblacs-mpi-dev_1.1-31_i386
+libblas-dev_1.2.20110419-5_i386
+libbliss-dev_0.72-4_i386
+libblitz0-dev_1:0.9-13_i386
+libblkid-dev_2.20.1-5.3_i386
+libblocksruntime-dev_0.1-1_i386
+libbluedevil-dev_1.9.2-1_i386
+libbluetooth-dev_4.99-2_i386
+libbluray-dev_1:0.2.2-1_i386
+libbml-dev_0.6.1-1_i386
+libbobcat-dev_3.01.00-1+b1_i386
+libbogl-dev_0.1.18-8+b1_i386
+libbognor-regis-dev_0.6.12+git20101007.02c25268-7_i386
+libbonobo2-dev_2.24.3-1_i386
+libbonoboui2-dev_2.24.3-1_i386
+libboo-cil-dev_0.9.5~git20110729.r1.202a430-2_all
+libboost-all-dev_1.49.0.1_i386
+libboost-chrono-dev_1.49.0.1_i386
+libboost-chrono1.49-dev_1.49.0-3.2_i386
+libboost-date-time-dev_1.49.0.1_i386
+libboost-date-time1.49-dev_1.49.0-3.2_i386
+libboost-dev_1.49.0.1_i386
+libboost-filesystem-dev_1.49.0.1_i386
+libboost-filesystem1.49-dev_1.49.0-3.2_i386
+libboost-graph-dev_1.49.0.1_i386
+libboost-graph-parallel-dev_1.49.0.1_i386
+libboost-graph-parallel1.49-dev_1.49.0-3.2_i386
+libboost-graph1.49-dev_1.49.0-3.2_i386
+libboost-iostreams-dev_1.49.0.1_i386
+libboost-iostreams1.49-dev_1.49.0-3.2_i386
+libboost-locale-dev_1.49.0.1_i386
+libboost-locale1.49-dev_1.49.0-3.2_i386
+libboost-math-dev_1.49.0.1_i386
+libboost-math1.49-dev_1.49.0-3.2_i386
+libboost-mpi-dev_1.49.0.1_i386
+libboost-mpi-python-dev_1.49.0.1_i386
+libboost-mpi-python1.49-dev_1.49.0-3.2_i386
+libboost-mpi1.49-dev_1.49.0-3.2_i386
+libboost-program-options-dev_1.49.0.1_i386
+libboost-program-options1.49-dev_1.49.0-3.2_i386
+libboost-python-dev_1.49.0.1_i386
+libboost-python1.49-dev_1.49.0-3.2_i386
+libboost-random-dev_1.49.0.1_i386
+libboost-random1.49-dev_1.49.0-3.2_i386
+libboost-regex-dev_1.49.0.1_i386
+libboost-regex1.49-dev_1.49.0-3.2_i386
+libboost-serialization-dev_1.49.0.1_i386
+libboost-serialization1.49-dev_1.49.0-3.2_i386
+libboost-signals-dev_1.49.0.1_i386
+libboost-signals1.49-dev_1.49.0-3.2_i386
+libboost-system-dev_1.49.0.1_i386
+libboost-system1.49-dev_1.49.0-3.2_i386
+libboost-test-dev_1.49.0.1_i386
+libboost-test1.49-dev_1.49.0-3.2_i386
+libboost-thread-dev_1.49.0.1_i386
+libboost-thread1.49-dev_1.49.0-3.2_i386
+libboost-timer-dev_1.49.0.1_i386
+libboost-timer1.49-dev_1.49.0-3.2_i386
+libboost-wave-dev_1.49.0.1_i386
+libboost-wave1.49-dev_1.49.0-3.2_i386
+libboost1.49-all-dev_1.49.0-3.2_i386
+libboost1.49-dev_1.49.0-3.2_i386
+libbotan1.10-dev_1.10.5-1_i386
+libbox-dev_2.5-2_i386
+libbox2d-dev_2.0.1+dfsg1-1_i386
+libbpp-core-dev_2.0.3-1_i386
+libbpp-phyl-dev_2.0.3-1_i386
+libbpp-popgen-dev_2.0.3-1_i386
+libbpp-qt-dev_2.0.2-1_i386
+libbpp-raa-dev_2.0.3-1_i386
+libbpp-seq-dev_2.0.3-1_i386
+libbrahe-dev_1.3.2-3_i386
+libbrasero-media3-dev_3.4.1-4_i386
+libbrlapi-dev_4.4-10+deb7u1_i386
+libbs2b-dev_3.1.0+dfsg-2_i386
+libbsd-dev_0.4.2-1_i386
+libbse-dev_0.7.4-5_all
+libbt-dev_0.70.1-13_i386
+libbtparse-dev_0.63-1_i386
+libbuffy-dev_1.7-1_i386
+libbulletml-dev_0.0.6-5_i386
+libburn-dev_1.2.2-2_i386
+libbuzztard-dev_0.5.0-4_i386
+libbz2-dev_1.0.6-4_i386
+libbz2-ocaml-dev_0.6.0-6+b2_i386
+libc-ares-dev_1.9.1-3_i386
+libc-client2007e-dev_8:2007f~dfsg-2_i386
+libc6-dev_2.13-38+deb7u1_i386
+libcableswig-dev_0.1.0+cvs20111009-1_i386
+libcaca-dev_0.99.beta18-1_i386
+libcairo-ocaml-dev_1:1.2.0-2+b1_i386
+libcairo2-dev_1.12.2-3_i386
+libcairomm-1.0-dev_1.10.0-1_i386
+libcal3d12-dev_0.11.0-4.1_i386
+libcalendar-ocaml-dev_2.03-1+b2_i386
+libcamel1.2-dev_3.4.4-3_i386
+libcameleon-ocaml-dev_1.9.21-2+b1_i386
+libcaml2html-ocaml-dev_1.4.1-3_i386
+libcamlimages-ocaml-dev_1:4.0.1-4+b2_i386
+libcamljava-ocaml-dev_0.3-1+b3_i386
+libcamltemplate-ocaml-dev_1.0.2-1+b2_i386
+libcamomile-ocaml-dev_0.8.4-2_i386
+libcanberra-dev_0.28-6_i386
+libcanberra-gtk-common-dev_0.28-6_all
+libcanberra-gtk-dev_0.28-6_i386
+libcanberra-gtk3-dev_0.28-6_i386
+libcanlock2-dev_2b-6_i386
+libcanna1g-dev_3.7p3-11_i386
+libcap-dev_1:2.22-1.2_i386
+libcap-ng-dev_0.6.6-2_i386
+libcapi20-dev_1:3.25+dfsg1-3.3~deb7u1_i386
+libcapsinetwork-dev_0.3.0-7_i386
+libcaribou-dev_0.4.4-1_i386
+libcbf-dev_0.7.9.1-3_i386
+libccaudio2-dev_2.0.5-3_i386
+libccfits-dev_2.4-1_i386
+libcconv-dev_0.6.2-1_i386
+libccrtp-dev_2.0.3-4_i386
+libccs-dev_3.0.12-3.2+deb7u2_i386
+libccscript3-dev_1.1.7-2_i386
+libccss-dev_0.5.0-4_i386
+libcdaudio-dev_0.99.12p2-12_i386
+libcdb-dev_0.78_i386
+libcdd-dev_094b.dfsg-4.2_i386
+libcddb2-dev_1.3.2-3_i386
+libcdi-dev_1.5.4+dfsg.1-5_i386
+libcdio-cdda-dev_0.83-4_i386
+libcdio-dev_0.83-4_i386
+libcdio-paranoia-dev_0.83-4_i386
+libcdk5-dev_5.0.20060507-4_i386
+libcdparanoia-dev_3.10.2+debian-10.1_i386
+libcec-dev_1.6.2-1.1_i386
+libcegui-mk2-dev_0.7.6-2+b1_i386
+libcext-dev_6.1.1-2_i386
+libcf-ocaml-dev_0.10-3+b3_i386
+libcfg-dev_1.4.2-3_i386
+libcfitsio3-dev_3.300-2_i386
+libcgal-dev_4.0-5_i386
+libcgic-dev_2.05-3_i386
+libcgicc5-dev_3.2.9-3_i386
+libcgns-dev_3.1.3.4-1+b1_i386
+libcgroup-dev_0.38-1_i386
+libcgsi-gsoap-dev_1.3.5-1_i386
+libchamplain-0.12-dev_0.12.3-1_i386
+libchamplain-gtk-0.12-dev_0.12.3-1_i386
+libcharls-dev_1.0-2_i386
+libchasen-dev_2.4.5-6_i386
+libcheese-dev_3.4.2-2_i386
+libcheese-gtk-dev_3.4.2-2_i386
+libchewing3-dev_0.3.3-4_i386
+libchicken-dev_4.7.0-1_i386
+libchipcard-dev_5.0.3beta-3_i386
+libchise-dev_0.3.0-2+b1_i386
+libchm-dev_2:0.40a-2_i386
+libchromaprint-dev_0.6-2_i386
+libcib1-dev_1.1.7-1_i386
+libcitadel-dev_8.14-1_i386
+libcitygml0-dev_0.14+svn128-1+3p0p1+4_i386
+libck-connector-dev_0.4.5-3.1_i386
+libckyapplet1-dev_1.1.0-12_i386
+libclalsadrv-dev_2.0.0-3_all
+libclam-dev_1.4.0-5.1_i386
+libclam-qtmonitors-dev_1.4.0-3.1_i386
+libclamav-dev_0.98.1+dfsg-1+deb7u3_i386
+libclang-common-dev_1:3.0-6.2_i386
+libclang-dev_1:3.0-6.2_i386
+libclanlib-dev_1.0~svn3827-3_i386
+libclassad-dev_7.8.2~dfsg.1-1+deb7u1_i386
+libclaw-application-dev_1.7.0-3_i386
+libclaw-configuration-file-dev_1.7.0-3_i386
+libclaw-dev_1.7.0-3_i386
+libclaw-dynamic-library-dev_1.7.0-3_i386
+libclaw-graphic-dev_1.7.0-3_i386
+libclaw-logger-dev_1.7.0-3_i386
+libclaw-net-dev_1.7.0-3_i386
+libclaw-tween-dev_1.7.0-3_i386
+libclaws-mail-dev_3.8.1-2_i386
+libclhep-dev_2.1.2.3-1_i386
+libcli-dev_1.9.6-1_i386
+libclippoly-dev_0.11-3_i386
+libclips-dev_6.24-3_i386
+libcliquer-dev_1.21-1_i386
+libcln-dev_1.3.2-1.2_i386
+libcloog-isl-dev_0.17.0-3_i386
+libcloog-ppl-dev_0.15.11-4_i386
+libclthreads-dev_2.4.0-4_i386
+libclucene-dev_0.9.21b-2+b1_i386
+libclustalo-dev_1.1.0-1_i386
+libcluster-glue-dev_1.0.9+hg2665-1_all
+libclutter-1.0-dev_1.10.8-2_i386
+libclutter-cil-dev_1.0.0~alpha3~git20090817.r1.349dba6-8_all
+libclutter-gst-dev_1.5.4-1+build0_i386
+libclutter-gtk-1.0-dev_1.2.0-2_i386
+libclutter-imcontext-0.1-dev_0.1.4-3_i386
+libcluttergesture-dev_0.0.2.1-7_i386
+libclxclient-dev_3.6.1-6_i386
+libcman-dev_3.0.12-3.2+deb7u2_i386
+libcminpack-dev_1.2.2-1_i386
+libcmis-dev_0.1.0-1+b1_i386
+libcmor-dev_2.8.0-2+b1_i386
+libcmph-dev_0.9-1_i386
+libcneartree-dev_3.1.1-1_i386
+libcnf-dev_4.0-2_i386
+libcob1-dev_1.1-1_i386
+libcogl-dev_1.10.2-7_i386
+libcogl-pango-dev_1.10.2-7_i386
+libcoin60-dev_3.1.3-2.2_i386
+libcojets2-dev_20061220+dfsg3-2_i386
+libcollectdclient-dev_5.1.0-3_i386
+libcollection-dev_0.1.3-2_i386
+libcolorblind-dev_0.0.1-1_i386
+libcolord-dev_0.1.21-1_i386
+libcolord-gtk-dev_0.1.21-1_i386
+libcolorhug-dev_0.1.10-1_i386
+libcomedi-dev_0.10.0-3_i386
+libcommoncpp2-dev_1.8.1-5_i386
+libcompfaceg1-dev_1:1.5.2-5_i386
+libconcord-dev_0.24-1.1_i386
+libconfdb-dev_1.4.2-3_i386
+libconfig++-dev_1.4.8-5_i386
+libconfig++8-dev_1.4.8-5_i386
+libconfig-dev_1.4.8-5_i386
+libconfig-file-ocaml-dev_1.1-1_i386
+libconfig8-dev_1.4.8-5_i386
+libconfuse-dev_2.7-4_i386
+libcontactsdb-dev_0.5-8_i386
+libcoq-ocaml-dev_8.3.pl4+dfsg-2_i386
+libcore-ocaml-dev_107.01-5_i386
+libcorelinux-dev_0.4.32-7.3_i386
+libcoroipcc-dev_1.4.2-3_i386
+libcoroipcs-dev_1.4.2-3_i386
+libcorosync-dev_1.4.2-3_all
+libcos4-dev_4.1.6-2_i386
+libcothreads-ocaml-dev_0.10-3+b3_i386
+libcoyotl-dev_3.1.0-5_i386
+libcpg-dev_1.4.2-3_i386
+libcpl-dev_6.1.1-2_i386
+libcppcutter-dev_1.1.7-1.2_i386
+libcppunit-dev_1.12.1-4_i386
+libcppunit-subunit-dev_0.0.8+bzr176-1_i386
+libcpputest-dev_3.1-2_i386
+libcpufreq-dev_008-1_i386
+libcpuset-dev_1.0-3_i386
+libcqrlib2-dev_1.1.2-1_i386
+libcr-dev_0.8.5-2_i386
+libcrack2-dev_2.8.19-3_i386
+libcreal-ocaml-dev_0.7-6+b3_i386
+libcrmcluster1-dev_1.1.7-1_i386
+libcrmcommon2-dev_1.1.7-1_i386
+libcroco3-dev_0.6.6-2_i386
+libcry-ocaml-dev_0.2.2-1+b1_i386
+libcryptgps-ocaml-dev_0.2.1-7+b3_i386
+libcrypto++-dev_5.6.1-6_i386
+libcryptokit-ocaml-dev_1.5-1_i386
+libcryptsetup-dev_2:1.4.3-4_i386
+libcryptui-dev_3.2.2-1_i386
+libcrystalhd-dev_1:0.0~git20110715.fdd2f19-9_i386
+libcsfml-dev_1.6-1_i386
+libcsnd-dev_1:5.17.11~dfsg-3_all
+libcsoap-dev_1.1.0-17.1_i386
+libcsound64-dev_1:5.17.11~dfsg-3_all
+libcsoundac-dev_1:5.17.11~dfsg-3_all
+libcsv-ocaml-dev_1.2.2-1+b1_i386
+libctapimkt0-dev_1.0.1-1.1_i386
+libctdb-dev_1.12+git20120201-4_i386
+libctemplate-dev_2.2-3_i386
+libctl-dev_3.1.0-5_i386
+libctpl-dev_0.3.3.dfsg-2_i386
+libcuba3-dev_3.0+20111124-2_i386
+libcudf-dev_0.6.2-1_i386
+libcudf-ocaml-dev_0.6.2-1_i386
+libcue-dev_1.4.0-1_i386
+libcunit1-dev_2.1-0.dfsg-10_i386
+libcunit1-ncurses-dev_2.1-0.dfsg-10_i386
+libcups2-dev_1.5.3-5+deb7u1_i386
+libcupscgi1-dev_1.5.3-5+deb7u1_i386
+libcupsdriver1-dev_1.5.3-5+deb7u1_i386
+libcupsfilters-dev_1.0.18-2.1+deb7u1_i386
+libcupsimage2-dev_1.5.3-5+deb7u1_i386
+libcupsmime1-dev_1.5.3-5+deb7u1_i386
+libcupsppdc1-dev_1.5.3-5+deb7u1_i386
+libcupt2-dev_2.5.9_i386
+libcurl-ocaml-dev_0.5.3-2+b1_i386
+libcurl4-gnutls-dev_7.26.0-1+wheezy9_i386
+libcurl4-nss-dev_7.26.0-1+wheezy9_i386
+libcurl4-openssl-dev_7.26.0-1+wheezy9_i386
+libcurses-ocaml-dev_1.0.3-2_i386
+libcutter-dev_1.1.7-1.2_i386
+libcv-dev_2.3.1-11_i386
+libcvaux-dev_2.3.1-11_i386
+libcvc3-dev_2.4.1-4_i386
+libcvector2-dev_1.0.3-1_i386
+libcvm1-dev_0.96-1+b1_i386
+libcw3-dev_3.0.2-1_i386
+libcwidget-dev_0.5.16-3.4_i386
+libcwiid-dev_0.6.00+svn201-3+b1_i386
+libcwnn-dev_1.1.1~a021+cvs20100325-6_i386
+libcxgb3-dev_1.3.1-1_i386
+libcxxtools-dev_2.1.1-1_i386
+libdacs-dev_1.4.27b-2_i386
+libdaemon-dev_0.14-2_i386
+libdancer-xml0-dev_0.8.2.1-3_i386
+libdap-dev_3.11.1-11_i386
+libdapl-dev_2.0.19-1.1_i386
+libdaq-dev_0.6.2-2_i386
+libdar-dev_2.4.5.debian.1-1_i386
+libdatrie-dev_0.2.5-3_i386
+libdawgdic-dev_0.4.3-1_all
+libdb++-dev_5.1.6_i386
+libdb-dev_5.1.6_i386
+libdb-java-dev_5.1.6_i386
+libdb-sql-dev_5.1.6_i386
+libdb4o-cil-dev_8.0.184.15484+dfsg-2_all
+libdb5.1++-dev_5.1.29-5_i386
+libdb5.1-dev_5.1.29-5_i386
+libdb5.1-java-dev_5.1.29-5_i386
+libdb5.1-sql-dev_5.1.29-5_i386
+libdb5.1-stl-dev_5.1.29-5_i386
+libdballe-dev_5.18-1_i386
+libdballef-dev_5.18-1_i386
+libdbaudiolib0-dev_0.9.8-6.2_i386
+libdbi-dev_0.8.4-6_i386
+libdbus-1-dev_1.6.8-1+deb7u1_i386
+libdbus-c++-dev_0.9.0-6_i386
+libdbus-glib-1-dev_0.100.2-1_i386
+libdbus-glib1.0-cil-dev_0.5.0-4_all
+libdbus-ocaml-dev_0.29-1+b3_i386
+libdbus1.0-cil-dev_0.7.0-5_all
+libdbusada0.2-dev_0.2-2_i386
+libdbusmenu-glib-dev_0.6.2-1_i386
+libdbusmenu-gtk-dev_0.6.2-1_i386
+libdbusmenu-gtk3-dev_0.6.2-1_i386
+libdbusmenu-jsonloader-dev_0.6.2-1_i386
+libdbusmenu-qt-dev_0.9.0-1_i386
+libdc-dev_0.3.24~svn3121-2_i386
+libdc1394-22-dev_2.2.0-2_i386
+libdca-dev_0.0.5-5_i386
+libdcerpc-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libdcerpc-server-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libdcmtk2-dev_3.6.0-12_i386
+libdconf-dbus-1-dev_0.12.1-3_i386
+libdconf-dev_0.12.1-3_i386
+libddccontrol-dev_0.4.2-10_i386
+libdds-dev_2.1.2+ddd105-1_i386
+libdebconf-kde-dev_0.2-2_i386
+libdebconfclient0-dev_0.182_i386
+libdebian-installer4-dev_0.87_i386
+libdebug0-dev_0.4.4-1.1_i386
+libdecodeqr-dev_0.9.3-6.2_i386
+libdee-dev_1.0.10-3_i386
+libderiving-ocaml-dev_0.1.1a-3+b1_i386
+libderiving-ocsigen-ocaml-dev_0.3c-1_i386
+libdesktop-agnostic-dev_0.3.92+dfsg-1_i386
+libdessert0.87-dev_0.87.2-1_i386
+libdevhelp-dev_3.4.1-1_i386
+libdevil-dev_1.7.8-6.1+b1_i386
+libdevmapper-dev_2:1.02.74-8_i386
+libdhash-dev_0.1.3-2_i386
+libdiagnostics-dev_0.3.3-1.3_i386
+libdianewcanvas2-dev_0.6.10-5.4_i386
+libdieharder-dev_3.31.1-4_i386
+libdiet-admin2.8-dev_2.8.0-1+b1_i386
+libdiet-client2.8-dev_2.8.0-1+b1_i386
+libdiet-dagda2.8-dev_2.8.0-1+b1_i386
+libdiet-sed2.8-dev_2.8.0-1+b1_i386
+libdime-dev_0.20030921-2_all
+libdirac-dev_1.0.2-6_i386
+libdirectfb-dev_1.2.10.0-5_i386
+libdisasm-dev_0.23-5_i386
+libdiscid0-dev_0.2.2-3_i386
+libdiscover-dev_2.1.2-5.2_i386
+libdispatch-dev_0~svn197-3.1_i386
+libdisplaymigration0-dev_0.28-10_i386
+libdistorm64-dev_1.7.30-1_i386
+libdivecomputer-dev_0.1.0-3_i386
+libdjconsole-dev_0.1.3-1_i386
+libdjvulibre-dev_3.5.25.3-1_i386
+libdkim-dev_1:1.0.21-3_i386
+libdlm-dev_3.0.12-3.2+deb7u2_i386
+libdlmcontrol-dev_3.0.12-3.2+deb7u2_i386
+libdlrestrictions-dev_0.15.3_i386
+libdm0-dev_2.2.10-1_i386
+libdmalloc-dev_5.5.2-5_i386
+libdmapsharing-3.0-dev_2.9.15-1_i386
+libdmraid-dev_1.0.0.rc16-4.2_i386
+libdmtcpaware-dev_1.2.5-1_i386
+libdmtx-dev_0.7.2-2+build1_i386
+libdmx-dev_1:1.1.2-1+deb7u1_i386
+libdnet-dev_2.60_i386
+libdockapp-dev_1:0.5.0-3_i386
+libdolfin1.0-dev_1.0.0-7_i386
+libdoodle-dev_0.7.0-5_i386
+libdose2-ocaml-dev_1.4.2-4+b3_i386
+libdose3-ocaml-dev_3.0.2-3_i386
+libdotconf-dev_1.0.13-3_i386
+libdpkg-dev_1.16.12_i386
+libdpm-dev_1.8.2-1+b2_i386
+libdrawtk-dev_2.0-2_i386
+libdrizzle-dev_1:7.1.36-stable-1_all
+libdrizzledmessage-dev_1:7.1.36-stable-1_i386
+libdrm-dev_2.4.40-1~deb7u2_i386
+libdrumstick-dev_0.5.0-3_i386
+libdsdp-dev_5.8-9.1_i386
+libdshconfig1-dev_0.20.13-1_i386
+libdspam7-dev_3.10.1+dfsg-11_i386
+libdssi-ocaml-dev_0.1.0-1+b1_i386
+libdssialsacompat-dev_1.0.8a-1_i386
+libdtools-ocaml-dev_0.3.0-1_i386
+libdts-dev_0.0.5-5_i386
+libdumb1-dev_1:0.9.3-5.4_i386
+libdumbnet-dev_1.12-3.1_i386
+libdune-common-dev_2.2.0-1_i386
+libdune-geometry-dev_2.2.0-1_i386
+libdune-grid-dev_2.2.0-1_i386
+libdune-istl-dev_2.2.0-1_all
+libdune-localfunctions-dev_2.2.0-1_all
+libduo-dev_1.8-1_i386
+libduppy-ocaml-dev_0.4.2-1+b2_i386
+libdv4-dev_1.0.0-6_i386
+libdvb-dev_0.5.5.1-5.1_i386
+libdvbcsa-dev_1.1.0-2_i386
+libdvbpsi-dev_0.2.2-1_i386
+libdvdnav-dev_4.2.0+20120524-2_i386
+libdvdread-dev_4.2.0+20120521-2_i386
+libdw-dev_0.152-1+wheezy1_i386
+libdwarf-dev_20120410-2_i386
+libdx4-dev_1:4.4.4-4+b2_i386
+libdxflib-dev_2.2.0.0-8_i386
+libdynamite-dev_0.1.1-2_i386
+libeasy-format-ocaml-dev_1.0.0-1+b2_i386
+libeb16-dev_4.4.3-6_i386
+libebackend1.2-dev_3.4.4-3_i386
+libebml-dev_1.2.2-2_i386
+libebook1.2-dev_3.4.4-3_i386
+libecal1.2-dev_3.4.4-3_i386
+libecasoundc-dev_2.9.0-1_i386
+libecasoundc2.2-dev_2.9.0-1_all
+libechonest-dev_1.2.1-1_i386
+libecm-dev_6.4.2-1_i386
+libecore-dev_1.2.0-2_i386
+libecpg-dev_9.1.13-0wheezy1_i386
+libecryptfs-dev_99-1_i386
+libedac-dev_0.18-1_i386
+libedata-book1.2-dev_3.4.4-3_i386
+libedata-cal1.2-dev_3.4.4-3_i386
+libedataserver1.2-dev_3.4.4-3_i386
+libedataserverui-3.0-dev_3.4.4-3_i386
+libedbus-dev_1.2.0-1_i386
+libedit-dev_2.11-20080614-5_i386
+libeditline-dev_1.12-6_i386
+libedje-dev_1.2.0-1_i386
+libee-dev_0.4.1-1_i386
+libeegdev-dev_0.2-3_i386
+libeet-dev_1.6.0-1_i386
+libefreet-dev_1.2.0-1_i386
+libegl1-mesa-dev_8.0.5-4+deb7u2_i386
+libeigen2-dev_2.0.17-1_i386
+libeigen3-dev_3.1.0-1_i386
+libeina-dev_1.2.0-2_i386
+libelektra-cpp-dev_0.7.1-1_i386
+libelektra-dev_0.7.1-1_i386
+libelektratools-dev_0.7.1-1_i386
+libelemental-dev_1.2.0-8_i386
+libelementary-dev_0.7.0.55225-1_i386
+libelf-dev_0.152-1+wheezy1_i386
+libelfg0-dev_0.8.13-3_i386
+libeliom-ocaml-dev_2.2.2-1_i386
+libelk0-dev_3.99.8-2_i386
+libelmer-dev_6.1.0.svn.5396.dfsg2-2_i386
+libembryo-dev_1.2.0-1_i386
+libemos-dev_000382+dfsg-2_i386
+libenca-dev_1.13-4_i386
+libenchant-dev_1.6.0-7_i386
+libenet-dev_1.3.3-2_i386
+libepc-dev_0.4.4-1_i386
+libepc-ui-dev_0.4.4-1_i386
+libepr-api2-dev_2.2-2_all
+libepsilon-dev_0.9.1-2_i386
+libept-dev_1.0.9_i386
+libepub-dev_0.2.1-2+b1_i386
+liberis-1.3-dev_1.3.19-5_i386
+liberuby-dev_1.0.5-2.1_i386
+libescpr-dev_1.1.1-2_i386
+libesd0-dev_0.2.41-10+b1_i386
+libesmtp-dev_1.0.6-1+b1_i386
+libespeak-dev_1.46.02-2_i386
+libestools2.1-dev_1:2.1~release-5_i386
+libestr-dev_0.1.1-2_i386
+libethos-dev_0.2.2-3_i386
+libethos-ui-dev_0.2.2-3_i386
+libetpan-dev_1.0-5_i386
+libetsf-io-dev_1.0.3-4+b1_i386
+libeurodec1-dev_20061220+dfsg3-2_i386
+libev-dev_1:4.11-1_i386
+libev-libevent-dev_1:4.11-1_all
+libeval0-dev_0.29.6-2_i386
+libevas-dev_1.2.0-2_i386
+libevd-0.1-dev_0.1.20-2_i386
+libevent-dev_2.0.19-stable-3_i386
+libeventdb-dev_0.90-5_i386
+libevince-dev_3.4.0-3.1_i386
+libevocosm-dev_4.0.2-2.1_i386
+libevs-dev_1.4.2-3_i386
+libevtlog-dev_0.2.12-5_i386
+libewf-dev_20100226-1+b1_i386
+libexchangemapi-1.0-dev_3.4.4-1_i386
+libexempi-dev_2.2.0-1_i386
+libexif-dev_0.6.20-3_i386
+libexif-gtk-dev_0.3.5-5_i386
+libexiv2-dev_0.23-1_i386
+libexo-1-dev_0.6.2-5_i386
+libexodusii-dev_5.14.dfsg.1-2+b1_i386
+libexosip2-dev_3.6.0-4_i386
+libexpat-ocaml-dev_0.9.1+debian1-7+b2_i386
+libexpat1-dev_2.1.0-1+deb7u1_i386
+libexpect-ocaml-dev_0.0.2-1+b6_i386
+libexplain-dev_0.52.D002-1_i386
+libextlib-ocaml-dev_1.5.2-1+b1_i386
+libextractor-dev_1:0.6.3-5_i386
+libextractor-java-dev_0.6.0-6_i386
+libexttextcat-dev_3.2.0-2_i386
+libextunix-ocaml-dev_0.0.5-2_i386
+libeztrace-dev_0.7-2-4_i386
+libf2c2-dev_20090411-2_i386
+libfaad-dev_2.7-8_i386
+libfaad-ocaml-dev_0.3.0-1+b1_i386
+libfacile-ocaml-dev_1.1-8+b1_i386
+libfaifa-dev_0.2~svn82-1_i386
+libfakekey-dev_0.1-7_i386
+libfam-dev_2.7.0-17_i386
+libfann-dev_2.1.0~beta~dfsg-8_i386
+libfarstream-0.1-dev_0.1.2-1_i386
+libfastjet-dev_3.0.2+dfsg-2_i386
+libfastjet-fortran-dev_3.0.2+dfsg-2_i386
+libfastjetplugins-dev_3.0.2+dfsg-2_i386
+libfastjettools-dev_3.0.2+dfsg-2_i386
+libfauhdli-dev_20110812-1_i386
+libfcgi-dev_2.4.0-8.1_i386
+libfdt-dev_1.3.0-4_i386
+libfence-dev_3.0.12-3.2+deb7u2_i386
+libffado-dev_2.0.99+svn2171-2_i386
+libffcall1-dev_1.10+cvs20100619-2_i386
+libffi-dev_3.0.10-3_i386
+libffindex0-dev_0.9.6.1-1_i386
+libffmpegthumbnailer-dev_2.0.7-2_i386
+libffms2-dev_2.17-1_i386
+libfftw3-dev_3.3.2-3.1_i386
+libfftw3-mpi-dev_3.3.2-3.1_i386
+libfields-camlp4-dev_107.01-1+b2_i386
+libfileutils-ocaml-dev_0.4.2-1+b2_i386
+libfindlib-ocaml-dev_1.3.1-1_i386
+libfiredns-dev_0.9.12+dfsg-3_i386
+libfirestring-dev_0.9.12-8_i386
+libfishsound1-dev_1.0.0-1.1_i386
+libfiu-dev_0.90-3_i386
+libfixposix-dev_20110316.git47f17f7-1_i386
+libfko0-dev_2.0.0rc2-2+deb7u2_i386
+libflac++-dev_1.2.1-6_i386
+libflac-dev_1.2.1-6_i386
+libflac-ocaml-dev_0.1.1-1_i386
+libflake-dev_0.11-2_i386
+libflann-dev_1.7.1-4_i386
+libflatzebra-dev_0.1.5-4+b1_i386
+libflickrnet-cil-dev_1:2.2.0-4_all
+libflorist2011-dev_2011-1_i386
+libflowcanvas-dev_0.7.1+dfsg0-0.2_i386
+libfltk1.1-dev_1.1.10-14_i386
+libfltk1.3-dev_1.3.0-8_i386
+libfluidsynth-dev_1.1.5-2_i386
+libfm-dev_0.1.17-2.1_i386
+libfolia1-dev_0.9-2_i386
+libfolks-dev_0.6.9-1+b1_i386
+libfolks-eds-dev_0.6.9-1+b1_i386
+libfolks-telepathy-dev_0.6.9-1+b1_i386
+libfontconfig1-dev_2.9.0-7.1_i386
+libfontenc-dev_1:1.1.1-1_i386
+libfontforge-dev_0.0.20120101+git-2_i386
+libforms-dev_1.0.93sp1-2_i386
+libformsgl-dev_1.0.93sp1-2_i386
+libfox-1.6-dev_1.6.45-1_i386
+libfprint-dev_1:0.4.0-4-gdfff16f-4_i386
+libfreecell-solver-dev_3.12.0-1_i386
+libfreefem++-dev_3.19.1-1_i386
+libfreefem-dev_3.5.8-5_i386
+libfreehdl0-dev_0.0.7-1.1_i386
+libfreeimage-dev_3.15.1-1+b1_i386
+libfreeipmi-dev_1.1.5-3_i386
+libfreenect-dev_1:0.1.2+dfsg-6_i386
+libfreeradius-dev_2.1.12+dfsg-1.2_i386
+libfreerdp-dev_1.0.1-1.1+deb7u3_i386
+libfreetype6-dev_2.4.9-1.1_i386
+libfreexl-dev_1.0.0b-1_i386
+libfribidi-dev_0.19.2-3_i386
+libfs-dev_2:1.0.4-1+deb7u1_i386
+libfso-glib-dev_2012.05.24.1-1.1_i386
+libfsobasics-dev_0.11.0-1.1_i386
+libfsoframework-dev_0.11.0-1.1_i386
+libfsoresource-dev_0.11.0-1.1_i386
+libfsosystem-dev_0.11.0-1_i386
+libfsotransport-dev_0.11.1-2.1_i386
+libfsplib-dev_0.11-2_i386
+libfstrcmp-dev_0.4.D001-1+deb7u1_i386
+libftdi-dev_0.20-1+b1_i386
+libftdipp-dev_0.20-1+b1_i386
+libftgl-dev_2.1.3~rc5-4_i386
+libfuntools-dev_1.4.4-3_i386
+libfuse-dev_2.9.0-2+deb7u1_i386
+libfuzzy-dev_2.7-2_i386
+libfxt-dev_0.2.6-2_i386
+libg15-dev_1.2.7-2_i386
+libg15daemon-client-dev_1.9.5.3-8.2_i386
+libg15render-dev_1.3.0~svn316-2.2_i386
+libg2-dev_0.72-2.1_i386
+libg3d-dev_0.0.8-17_i386
+libga-dev_2.4.7-3_i386
+libgadap-dev_2.0-1_i386
+libgadu-dev_1:1.11.2-1+deb7u1_i386
+libgail-3-dev_3.4.2-7_i386
+libgail-dev_2.24.10-2_i386
+libgalax-ocaml-dev_1.1-10+b3_i386
+libgambc4-dev_4.2.8-1.1_i386
+libgamin-dev_0.1.10-4.1_i386
+libgammu-dev_1.31.90-1+b1_i386
+libganglia1-dev_3.3.8-1+nmu1_i386
+libganv-dev_0~svn4468~dfsg0-1_i386
+libgarcon-1-0-dev_0.1.12-1_i386
+libgarmin-dev_0~svn320-3_i386
+libgatos-dev_0.0.5-19_i386
+libgavl-dev_1.4.0-1_i386
+libgavl-ocaml-dev_0.1.4-1+b1_i386
+libgbm-dev_8.0.5-4+deb7u2_i386
+libgc-dev_1:7.1-9.1_i386
+libgcal-dev_0.9.6-3_i386
+libgccxml-dev_0.9.0+cvs20120420-4_i386
+libgcgi-dev_0.9.5.dfsg-7_i386
+libgcj12-dev_4.6.3-1_i386
+libgcj13-dev_4.7.2-3_i386
+libgck-1-dev_3.4.1-3_i386
+libgconf-bridge-dev_0.1-2.2_i386
+libgconf2-dev_3.2.5-1+build1_i386
+libgconf2.0-cil-dev_2.24.2-3_all
+libgconfmm-2.6-dev_2.28.0-1_i386
+libgcr-3-dev_3.4.1-3_i386
+libgcroots-dev_0.8.5-2.1_i386
+libgcrypt11-dev_1.5.0-5+deb7u1_i386
+libgctp-dev_1.0-1_i386
+libgd-gd2-noxpm-ocaml-dev_1.0~alpha5-5_i386
+libgd2-noxpm-dev_2.0.36~rc1~dfsg-6.1_i386
+libgd2-xpm-dev_2.0.36~rc1~dfsg-6.1_i386
+libgda-5.0-dev_5.0.3-2_i386
+libgdal-dev_1.9.0-3.1_i386
+libgdal1-dev_1.9.0-3.1_all
+libgdata-cil-dev_2.1.0.0-1_all
+libgdata-dev_0.12.0-1_i386
+libgdb-dev_7.4.1+dfsg-0.1_i386
+libgdbm-dev_1.8.3-11_i386
+libgdchart-gd2-noxpm-dev_0.11.5-7+b1_i386
+libgdchart-gd2-xpm-dev_0.11.5-7+b1_i386
+libgdcm2-dev_2.2.0-14.1_i386
+libgdf-dev_0.1.2-2_i386
+libgdict-1.0-dev_3.4.0-2_i386
+libgdk-pixbuf2.0-dev_2.26.1-1_i386
+libgdkcutter-pixbuf-dev_1.1.7-1.2_i386
+libgdl-3-dev_3.4.2-1_i386
+libgdome2-cpp-smart-dev_0.2.6-6+b1_i386
+libgdome2-dev_0.8.1+debian-4.1_i386
+libgdome2-ocaml-dev_0.2.6-6+b1_i386
+libgdu-dev_3.0.2-3_i386
+libgdu-gtk-dev_3.0.2-3_i386
+libgeant321-2-dev_1:3.21.14.dfsg-10_i386
+libgearman-dev_0.33-2_i386
+libgecode-dev_3.7.3-1_i386
+libgeda-dev_1:1.6.2-4.3_i386
+libgee-dev_0.6.4-2_i386
+libgegl-dev_0.2.0-2+nmu1_i386
+libgeier-dev_0.13-1+b1_i386
+libgenders0-dev_1.18-1_i386
+libgenome-1.3-0-dev_1.3.1-3_i386
+libgensec-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libgeoclue-dev_0.12.0-4_i386
+libgeocode-glib-dev_0.99.0-1_i386
+libgeographiclib-dev_1.21-1_i386
+libgeoip-dev_1.4.8+dfsg-3_i386
+libgeomview-dev_1.9.4-3_i386
+libgeos++-dev_3.3.3-1.1_i386
+libgeos-dev_3.3.3-1.1_i386
+libgeotiff-dev_1.3.0+dfsg-3_i386
+libgeotranz3-dev_3.1-2.1_i386
+libges-0.10-dev_0.10.1-2_i386
+libgetdata-dev_0.7.3-6_i386
+libgetfem++-dev_4.1.1+dfsg1-11_i386
+libgetopt++-dev_0.0.2-p22-3_i386
+libgetopt-ocaml-dev_0.0.20040811-10+b3_i386
+libgettext-ocaml-dev_0.3.4-1+b2_i386
+libgexiv2-dev_0.4.1-3_i386
+libgfarm-dev_2.4.1-1.1_i386
+libgflags-dev_2.0-1_i386
+libgfshare-dev_1.0.5-2_i386
+libghc-acid-state-dev_0.6.3-1+b2_i386
+libghc-active-dev_0.1.0.1-2+b2_i386
+libghc-adjunctions-dev_2.4.0.2-1_i386
+libghc-aeson-dev_0.6.0.2-1+b4_i386
+libghc-agda-dev_2.3.0.1-2_i386
+libghc-algebra-dev_2.1.1.2-1_i386
+libghc-alut-dev_2.1.0.2-4+b1_i386
+libghc-ami-dev_0.1-1+b5_i386
+libghc-ansi-terminal-dev_0.5.5-3+b1_i386
+libghc-ansi-wl-pprint-dev_0.6.4-1+b1_i386
+libghc-arrows-dev_0.4.4.0-3+b1_i386
+libghc-asn1-data-dev_0.6.1.3-2+b3_i386
+libghc-attempt-dev_0.4.0-1+b2_i386
+libghc-attoparsec-conduit-dev_0.4.0.1-1_i386
+libghc-attoparsec-dev_0.10.1.1-2+b1_i386
+libghc-attoparsec-enumerator-dev_0.3-3+b3_i386
+libghc-augeas-dev_0.6.1-1_i386
+libghc-authenticate-dev_1.2.1.1-2+b1_i386
+libghc-base-unicode-symbols-dev_0.2.2.3-1+b1_i386
+libghc-base16-bytestring-dev_0.1.1.4-2+b1_i386
+libghc-base64-bytestring-dev_0.1.1.1-2_i386
+libghc-bifunctors-dev_0.1.3.3-1+b1_i386
+libghc-binary-shared-dev_0.8.1-1+b1_i386
+libghc-bindings-dsl-dev_1.0.15-1+b1_i386
+libghc-bindings-gpgme-dev_0.1.4-1_i386
+libghc-bindings-libzip-dev_0.10-2_i386
+libghc-bitarray-dev_0.0.1-2+b1_i386
+libghc-blaze-builder-conduit-dev_0.4.0.2-1_i386
+libghc-blaze-builder-dev_0.3.1.0-1+b2_i386
+libghc-blaze-builder-enumerator-dev_0.2.0.4-1+b1_i386
+libghc-blaze-html-dev_0.4.3.1-3+b2_i386
+libghc-blaze-markup-dev_0.5.1.0-1_i386
+libghc-blaze-textual-dev_0.2.0.6-2+b2_i386
+libghc-bloomfilter-dev_1.2.6.8-1_i386
+libghc-boolean-dev_0.0.1-2+b1_i386
+libghc-boomerang-dev_1.3.1-1_i386
+libghc-brainfuck-dev_0.1-2+b2_i386
+libghc-byteorder-dev_1.0.3-2+b1_i386
+libghc-bytestring-lexing-dev_0.4.0-1+b1_i386
+libghc-bytestring-mmap-dev_0.2.2-2+b1_i386
+libghc-bytestring-nums-dev_0.3.5-2+b1_i386
+libghc-bytestring-show-dev_0.3.5.1-1+b1_i386
+libghc-bzlib-dev_0.5.0.3-2+b1_i386
+libghc-cabal-file-th-dev_0.2.2-1_i386
+libghc-cairo-dev_0.12.3-1+b1_i386
+libghc-case-insensitive-dev_0.4.0.1-2+b2_i386
+libghc-categories-dev_1.0.3-1+b1_i386
+libghc-cautious-file-dev_1.0.1-1_i386
+libghc-cereal-conduit-dev_0.5-1+b1_i386
+libghc-cereal-dev_0.3.5.2-1_i386
+libghc-certificate-dev_1.2.3-2_i386
+libghc-cgi-dev_3001.1.8.2-2+b3_i386
+libghc-chart-dev_0.15-1+b2_i386
+libghc-chell-dev_0.3-1_i386
+libghc-citeproc-hs-dev_0.3.4-1+b4_i386
+libghc-clientsession-dev_0.7.5-3+b1_i386
+libghc-clock-dev_0.2.0.0-2+b1_i386
+libghc-cmdargs-dev_0.9.5-1+b1_i386
+libghc-colour-dev_2.3.3-1+b1_i386
+libghc-comonad-dev_1.1.1.5-1+b1_i386
+libghc-comonad-transformers-dev_2.1.1.1-1+b1_i386
+libghc-comonads-fd-dev_2.1.1.2-1+b1_i386
+libghc-conduit-dev_0.4.2-2_i386
+libghc-configfile-dev_1.0.6-4+b3_i386
+libghc-configurator-dev_0.2.0.0-1+b2_i386
+libghc-contravariant-dev_0.2.0.2-1+b1_i386
+libghc-convertible-dev_1.0.11.0-3+b3_i386
+libghc-cookie-dev_0.4.0-1+b3_i386
+libghc-cpphs-dev_1.13.3-2+b1_i386
+libghc-cprng-aes-dev_0.2.3-3+b4_i386
+libghc-cpu-dev_0.1.1-1_i386
+libghc-criterion-dev_0.6.0.1-3+b4_i386
+libghc-crypto-api-dev_0.10.2-1+b2_i386
+libghc-crypto-conduit-dev_0.3.2-1+b1_i386
+libghc-crypto-dev_4.2.4-1+b1_i386
+libghc-crypto-pubkey-types-dev_0.1.1-1+b3_i386
+libghc-cryptocipher-dev_0.3.5-1+b1_i386
+libghc-cryptohash-dev_0.7.5-1+b2_i386
+libghc-css-text-dev_0.1.1-3+b2_i386
+libghc-csv-conduit-dev_0.2-1_i386
+libghc-csv-dev_0.1.2-2+b3_i386
+libghc-curl-dev_1.3.7-1+b1_i386
+libghc-darcs-dev_2.8.1-1+b1_i386
+libghc-data-accessor-dev_0.2.2.2-1+b1_i386
+libghc-data-accessor-mtl-dev_0.2.0.3-1+b1_i386
+libghc-data-accessor-template-dev_0.2.1.9-1+b2_i386
+libghc-data-binary-ieee754-dev_0.4.2.1-3+b1_i386
+libghc-data-default-dev_0.4.0-1_i386
+libghc-data-inttrie-dev_0.0.7-1+b1_i386
+libghc-data-lens-dev_2.10.0-1+b1_i386
+libghc-data-memocombinators-dev_0.4.3-1+b1_i386
+libghc-dataenc-dev_0.14.0.3-1+b1_i386
+libghc-datetime-dev_0.2.1-3_i386
+libghc-dbus-dev_0.10.3-1_i386
+libghc-debian-dev_3.64-3_i386
+libghc-diagrams-cairo-dev_0.5.0.2-1_i386
+libghc-diagrams-core-dev_0.5.0.1-1+b1_i386
+libghc-diagrams-dev_0.5-2_all
+libghc-diagrams-lib-dev_0.5-2_i386
+libghc-diff-dev_0.1.3-1+b1_i386
+libghc-digest-dev_0.0.1.0-1+b1_i386
+libghc-dimensional-dev_0.10.1.2-2+b1_i386
+libghc-directory-tree-dev_0.10.0-2+b1_i386
+libghc-distributive-dev_0.2.2-1+b1_i386
+libghc-dlist-dev_0.5-3+b1_i386
+libghc-download-curl-dev_0.1.3-3+b3_i386
+libghc-dpkg-dev_0.0.3-1_i386
+libghc-dyre-dev_0.8.7-1_i386
+libghc-edison-api-dev_1.2.1-18+b1_i386
+libghc-edison-core-dev_1.2.1.3-9+b1_i386
+libghc-edit-distance-dev_0.2.1-2_i386
+libghc-editline-dev_0.2.1.0-5+b1_i386
+libghc-ekg-dev_0.3.1.0-1+b2_i386
+libghc-email-validate-dev_0.2.8-1+b3_i386
+libghc-entropy-dev_0.2.1-2+b1_i386
+libghc-enumerator-dev_0.4.19-1+b1_i386
+libghc-erf-dev_2.0.0.0-2+b1_i386
+libghc-event-list-dev_0.1.0.1-1+b1_i386
+libghc-exception-transformers-dev_0.3.0.2-1+b1_i386
+libghc-executable-path-dev_0.0.3-1+b1_i386
+libghc-explicit-exception-dev_0.1.7-1+b1_i386
+libghc-failure-dev_0.2.0.1-1+b1_i386
+libghc-fast-logger-dev_0.0.2-1+b2_i386
+libghc-fastcgi-dev_3001.0.2.3-3+b3_i386
+libghc-fclabels-dev_1.1.3-1+b1_i386
+libghc-feed-dev_0.3.8-3_i386
+libghc-fgl-dev_5.4.2.4-2+b2_i386
+libghc-file-embed-dev_0.0.4.4-1_i386
+libghc-filemanip-dev_0.3.5.2-2+b2_i386
+libghc-filestore-dev_0.5-1_i386
+libghc-filesystem-conduit-dev_0.4.0-1_i386
+libghc-free-dev_2.1.1.1-1+b1_i386
+libghc-ftphs-dev_1.0.8-1+b3_i386
+libghc-gconf-dev_0.12.1-1+b1_i386
+libghc-gd-dev_3000.7.3-1_i386
+libghc-ghc-events-dev_0.4.0.0-2+b1_i386
+libghc-ghc-mtl-dev_1.0.1.1-1+b3_i386
+libghc-ghc-paths-dev_0.1.0.8-2+b1_i386
+libghc-ghc-syb-utils-dev_0.2.1.0-1+b3_i386
+libghc-gio-dev_0.12.3-1+b1_i386
+libghc-github-dev_0.4.0-2_i386
+libghc-gitit-dev_0.10.0.1-1+b1_i386
+libghc-glade-dev_0.12.1-1+b3_i386
+libghc-glfw-dev_0.5.0.1-1+b1_i386
+libghc-glib-dev_0.12.2-1+b1_i386
+libghc-glut-dev_2.1.2.2-1_i386
+libghc-gnuidn-dev_0.2-2+b2_i386
+libghc-gnutls-dev_0.1.2-1+b1_i386
+libghc-gsasl-dev_0.3.4-1+b1_i386
+libghc-gstreamer-dev_0.12.1-1+b2_i386
+libghc-gtk-dev_0.12.3-1+b2_i386
+libghc-gtkglext-dev_0.12.1-1+b3_i386
+libghc-gtksourceview2-dev_0.12.3-1+b3_i386
+libghc-haddock-dev_2.10.0-1+b2_i386
+libghc-hakyll-dev_3.2.7.2-1+b5_i386
+libghc-hamlet-dev_1.0.1.3-1+b1_i386
+libghc-happstack-dev_7.0.0-1+b1_i386
+libghc-happstack-server-dev_7.0.1-1+b1_i386
+libghc-harp-dev_0.4-3+b1_i386
+libghc-hashable-dev_1.1.2.3-1+b2_i386
+libghc-hashed-storage-dev_0.5.9-2+b2_i386
+libghc-hashmap-dev_1.3.0.1-1+b2_i386
+libghc-hashtables-dev_1.0.1.4-1+b1_i386
+libghc-haskeline-dev_0.6.4.7-1+b1_i386
+libghc-haskell-lexer-dev_1.0-3+b1_i386
+libghc-haskell-src-dev_1.0.1.5-1+b2_i386
+libghc-haskelldb-dev_2.1.1-5+b1_i386
+libghc-haskelldb-hdbc-dev_2.1.0-4_i386
+libghc-haskelldb-hdbc-odbc-dev_2.1.0-3_i386
+libghc-haskelldb-hdbc-postgresql-dev_2.1.0-3_i386
+libghc-haskelldb-hdbc-sqlite3-dev_2.1.0-3_i386
+libghc-haskore-dev_0.2.0.3-2_i386
+libghc-hastache-dev_0.3.3-2+b3_i386
+libghc-haxml-dev_1:1.22.5-2+b2_i386
+libghc-haxr-dev_3000.8.5-1+b3_i386
+libghc-hcard-dev_0.0-2+b2_i386
+libghc-hcwiid-dev_0.0.1-3+b1_i386
+libghc-hdbc-dev_2.3.1.1-1+b3_i386
+libghc-hdbc-odbc-dev_2.2.3.0-5+b3_i386
+libghc-hdbc-postgresql-dev_2.3.2.1-1+b3_i386
+libghc-hdbc-sqlite3-dev_2.3.3.0-1+b3_i386
+libghc-hfuse-dev_0.2.4.1-1_i386
+libghc-highlighting-kate-dev_0.5.1-1_i386
+libghc-hinotify-dev_0.3.2-1+b1_i386
+libghc-hint-dev_0.3.3.4-2+b4_i386
+libghc-hipmunk-dev_5.2.0.8-1+b1_i386
+libghc-hjavascript-dev_0.4.7-3+b1_i386
+libghc-hjscript-dev_0.5.0-3+b2_i386
+libghc-hjsmin-dev_0.1.1-1+b2_i386
+libghc-hlint-dev_1.8.28-1+b3_i386
+libghc-hoauth-dev_0.3.4-1+b1_i386
+libghc-hostname-dev_1.0-4+b1_i386
+libghc-hs-bibutils-dev_4.12-5+b2_i386
+libghc-hs3-dev_0.5.6-2+b4_i386
+libghc-hscolour-dev_1.19-3+b1_i386
+libghc-hscurses-dev_1.4.1.0-1+b2_i386
+libghc-hsemail-dev_1.7.1-2+b3_i386
+libghc-hsh-dev_2.0.3-6+b3_i386
+libghc-hslogger-dev_1.1.4+dfsg1-2+b3_i386
+libghc-hsp-dev_0.6.1-2+b3_i386
+libghc-hspec-dev_1.1.0-1+b1_i386
+libghc-hsql-dev_1.8.1-4_i386
+libghc-hsql-mysql-dev_1.8.1-4+b1_i386
+libghc-hsql-odbc-dev_1.8.1.1-2_i386
+libghc-hsql-postgresql-dev_1.8.1-3_i386
+libghc-hsql-sqlite3-dev_1.8.1-2_i386
+libghc-hssyck-dev_0.50-2+b2_i386
+libghc-hstringtemplate-dev_0.6.8-1_i386
+libghc-hsx-dev_0.9.1-3_i386
+libghc-html-conduit-dev_0.0.1-2_i386
+libghc-html-dev_1.0.1.2-5+b1_i386
+libghc-http-conduit-dev_1.4.1.6-3_i386
+libghc-http-date-dev_0.0.2-1+b2_i386
+libghc-http-dev_1:4000.2.3-1+b2_i386
+libghc-http-types-dev_0.6.11-1_i386
+libghc-hunit-dev_1.2.4.2-2+b1_i386
+libghc-hxt-cache-dev_9.0.2-2+b3_i386
+libghc-hxt-charproperties-dev_9.1.1-2+b1_i386
+libghc-hxt-curl-dev_9.1.1-1+b4_i386
+libghc-hxt-dev_9.2.2-2+b3_i386
+libghc-hxt-http-dev_9.1.4-2+b3_i386
+libghc-hxt-regex-xmlschema-dev_9.0.4-2+b3_i386
+libghc-hxt-relaxng-dev_9.1.4-1+b3_i386
+libghc-hxt-tagsoup-dev_9.1.1-1+b4_i386
+libghc-hxt-unicode-dev_9.0.2-2+b1_i386
+libghc-hxt-xpath-dev_9.1.2-1+b4_i386
+libghc-hxt-xslt-dev_9.1.1-1+b3_i386
+libghc-iconv-dev_0.4.1.0-2+b1_i386
+libghc-ieee754-dev_0.7.3-1+b1_i386
+libghc-ifelse-dev_0.85-4+b1_i386
+libghc-io-choice-dev_0.0.1-1+b3_i386
+libghc-io-storage-dev_0.3-2+b1_i386
+libghc-iospec-dev_0.2.5-1+b2_i386
+libghc-irc-dev_0.5.0.0-1+b3_i386
+libghc-iteratee-dev_0.8.8.2-2+b1_i386
+libghc-ixset-dev_1.0.3-2+b1_i386
+libghc-json-dev_0.5-2+b2_i386
+libghc-keys-dev_2.1.3.2-1+b1_i386
+libghc-knob-dev_0.1.1-1_i386
+libghc-lambdabot-utils-dev_4.2.1-3+b3_i386
+libghc-language-c-dev_0.4.2-2+b2_i386
+libghc-language-haskell-extract-dev_0.2.1-4+b1_i386
+libghc-language-javascript-dev_0.5.4-1+b2_i386
+libghc-largeword-dev_1.0.1-2+b1_i386
+libghc-lazysmallcheck-dev_0.6-1+b1_i386
+libghc-ldap-dev_0.6.6-4.1+b1_i386
+libghc-leksah-server-dev_0.12.0.4-3_i386
+libghc-libtagc-dev_0.12.0-2+b1_i386
+libghc-libxml-sax-dev_0.7.2-2+b1_i386
+libghc-libzip-dev_0.10-1+b2_i386
+libghc-lifted-base-dev_0.1.1-1+b1_i386
+libghc-listlike-dev_3.1.4-1+b1_i386
+libghc-llvm-base-dev_3.0.1.0-1_i386
+libghc-llvm-dev_3.0.1.0-1+b1_i386
+libghc-logict-dev_0.5.0.1-1+b1_i386
+libghc-ltk-dev_0.12.0.0-2+b1_i386
+libghc-maccatcher-dev_2.1.5-2+b3_i386
+libghc-magic-dev_1.0.8-8+b1_i386
+libghc-markov-chain-dev_0.0.3.2-1+b1_i386
+libghc-math-functions-dev_0.1.1.0-2+b2_i386
+libghc-maths-dev_0.4.3-1+b1_i386
+libghc-maybet-dev_0.1.2-3+b2_i386
+libghc-mbox-dev_0.1-2+b1_i386
+libghc-memotrie-dev_0.5-1_i386
+libghc-mersenne-random-dev_1.0.0.1-2+b1_i386
+libghc-midi-dev_0.2.0.1-1+b1_i386
+libghc-mime-mail-dev_0.4.1.1-2+b3_i386
+libghc-missingh-dev_1.1.0.3-6+b3_i386
+libghc-mmap-dev_0.5.7-2+b1_i386
+libghc-monad-control-dev_0.3.1.3-1+b1_i386
+libghc-monad-loops-dev_0.3.2.0-1_i386
+libghc-monad-par-dev_0.1.0.3-2+b1_i386
+libghc-monadcatchio-mtl-dev_0.3.0.4-2+b2_i386
+libghc-monadcatchio-transformers-dev_0.3.0.0-2+b1_i386
+libghc-monadcryptorandom-dev_0.4.1-1+b2_i386
+libghc-monadrandom-dev_0.1.6-2+b2_i386
+libghc-monads-tf-dev_0.1.0.0-1+b2_i386
+libghc-monoid-transformer-dev_0.0.2-3+b1_i386
+libghc-mtl-dev_2.1.1-1_i386
+libghc-mtlparse-dev_0.1.2-2+b2_i386
+libghc-murmur-hash-dev_0.1.0.5-2+b1_i386
+libghc-mwc-random-dev_0.11.0.0-4+b1_i386
+libghc-ncurses-dev_0.2.1-1+b1_i386
+libghc-netwire-dev_3.1.0-2+b5_i386
+libghc-network-conduit-dev_0.4.0.1-2_i386
+libghc-network-dev_2.3.0.13-1+b2_i386
+libghc-network-protocol-xmpp-dev_0.4.3-1_i386
+libghc-newtype-dev_0.2-1_i386
+libghc-non-negative-dev_0.1-2+b1_i386
+libghc-numbers-dev_2009.8.9-2+b1_i386
+libghc-numeric-quest-dev_0.2-1+b1_i386
+libghc-numinstances-dev_1.0-2+b1_i386
+libghc-numtype-dev_1.0-2+b1_i386
+libghc-oeis-dev_0.3.1-2+b3_i386
+libghc-openal-dev_1.3.1.3-4+b1_i386
+libghc-opengl-dev_2.2.3.1-1+b1_i386
+libghc-openpgp-asciiarmor-dev_0.1-1+b2_i386
+libghc-options-dev_0.1.1-1_i386
+libghc-pandoc-dev_1.9.4.2-2_i386
+libghc-pandoc-types-dev_1.9.1-1+b2_i386
+libghc-pango-dev_0.12.2-1+b2_i386
+libghc-parallel-dev_3.2.0.2-2+b1_i386
+libghc-parseargs-dev_0.1.3.2-2+b1_i386
+libghc-parsec2-dev_2.1.0.1-6+b1_i386
+libghc-parsec3-dev_3.1.2-1+b3_i386
+libghc-pastis-dev_0.1.2-2+b3_i386
+libghc-path-pieces-dev_0.1.0-1+b2_i386
+libghc-patience-dev_0.1.1-1_i386
+libghc-pcre-light-dev_0.4-3+b1_i386
+libghc-pem-dev_0.1.1-1+b3_i386
+libghc-persistent-dev_0.9.0.4-2_i386
+libghc-persistent-sqlite-dev_0.9.0.2-2_i386
+libghc-persistent-template-dev_0.9.0.2-1_i386
+libghc-polyparse-dev_1.7-1+b2_i386
+libghc-pool-conduit-dev_0.1.0.2-1_i386
+libghc-postgresql-libpq-dev_0.8.2-1_i386
+libghc-postgresql-simple-dev_0.1.4.3-1_i386
+libghc-pretty-show-dev_1.1.1-4+b1_i386
+libghc-primes-dev_0.2.1.0-2+b1_i386
+libghc-primitive-dev_0.4.1-1+b1_i386
+libghc-psqueue-dev_1.1-2+b1_i386
+libghc-puremd5-dev_2.1.0.3-2+b4_i386
+libghc-pwstore-fast-dev_2.2-2+b4_i386
+libghc-quickcheck1-dev_1.2.0.1-2+b1_i386
+libghc-quickcheck2-dev_2.4.2-1+b1_i386
+libghc-random-dev_1.0.1.1-1+b1_i386
+libghc-random-shuffle-dev_0.0.3-2+b2_i386
+libghc-ranged-sets-dev_0.3.0-2+b1_i386
+libghc-ranges-dev_0.2.4-2+b1_i386
+libghc-reactive-banana-dev_0.6.0.0-1+b3_i386
+libghc-readline-dev_1.0.1.0-3+b1_i386
+libghc-recaptcha-dev_0.1-4+b3_i386
+libghc-regex-base-dev_0.93.2-2+b2_i386
+libghc-regex-compat-dev_0.95.1-2+b1_i386
+libghc-regex-pcre-dev_0.94.2-2+b1_i386
+libghc-regex-posix-dev_0.95.1-2+b1_i386
+libghc-regex-tdfa-dev_1.1.8-2+b1_i386
+libghc-regex-tdfa-utf8-dev_1.0-5+b3_i386
+libghc-regexpr-dev_0.5.4-2+b2_i386
+libghc-representable-functors-dev_2.4.0.2-1+b1_i386
+libghc-representable-tries-dev_2.4.0.2-1_i386
+libghc-resource-pool-dev_0.2.1.0-2+b4_i386
+libghc-resourcet-dev_0.3.2.1-1+b1_i386
+libghc-rsa-dev_1.2.1.0-1+b1_i386
+libghc-safe-dev_0.3.3-1+b1_i386
+libghc-safecopy-dev_0.6.1-1+b1_i386
+libghc-sdl-dev_0.6.3-1+b1_i386
+libghc-sdl-gfx-dev_0.6.0-3+b1_i386
+libghc-sdl-image-dev_0.6.1-3+b1_i386
+libghc-sdl-mixer-dev_0.6.1-3+b1_i386
+libghc-sdl-ttf-dev_0.6.1-3+b1_i386
+libghc-semigroupoids-dev_1.3.1.2-1+b1_i386
+libghc-semigroups-dev_0.8.3.2-1_i386
+libghc-sendfile-dev_0.7.6-1+b2_i386
+libghc-sha-dev_1.5.0.1-1_i386
+libghc-shakespeare-css-dev_1.0.1.2-1+b1_i386
+libghc-shakespeare-dev_1.0.0.2-1+b1_i386
+libghc-shakespeare-i18n-dev_1.0.0.2-1+b1_i386
+libghc-shakespeare-js-dev_1.0.0.2-1+b1_i386
+libghc-shakespeare-text-dev_1.0.0.2-1+b1_i386
+libghc-shellac-dev_0.9.5.1-2+b2_i386
+libghc-show-dev_0.4.1.2-1+b2_i386
+libghc-silently-dev_1.1.4-1+b2_i386
+libghc-simple-sendfile-dev_0.2.3-1+b2_i386
+libghc-simpleea-dev_0.1.1-2+b2_i386
+libghc-simpleirc-dev_0.2.1-2+b3_i386
+libghc-skein-dev_0.1.0.7-2+b1_i386
+libghc-smallcheck-dev_0.6-1+b1_i386
+libghc-smtpclient-dev_1.0.4-3+b3_i386
+libghc-snap-core-dev_0.8.1-1+b4_i386
+libghc-snap-server-dev_0.8.1.1-1_i386
+libghc-socks-dev_0.4.1-1+b4_i386
+libghc-split-dev_0.1.4.2-2_i386
+libghc-src-exts-dev_1.11.1-3+b1_i386
+libghc-statevar-dev_1.0.0.0-2+b1_i386
+libghc-static-hash-dev_0.0.1-3+b2_i386
+libghc-statistics-dev_0.10.1.0-2+b1_i386
+libghc-stm-dev_2.3-1_i386
+libghc-stream-dev_0.4.6-1+b1_i386
+libghc-strict-concurrency-dev_0.2.4.1-2+b1_i386
+libghc-strict-dev_0.3.2-2+b1_i386
+libghc-strptime-dev_1.0.6-1_i386
+libghc-svgcairo-dev_0.12.1-1+b2_i386
+libghc-syb-dev_0.3.6.1-1_i386
+libghc-syb-with-class-dev_0.6.1.3-1+b1_i386
+libghc-syb-with-class-instances-text-dev_0.0.1-3+b2_i386
+libghc-system-fileio-dev_0.3.8-1_i386
+libghc-system-filepath-dev_0.4.6-1+b2_i386
+libghc-tagged-dev_0.4.2.1-1_i386
+libghc-tagsoup-dev_0.12.6-1+b3_i386
+libghc-tagstream-conduit-dev_0.3.2-1_i386
+libghc-tar-dev_0.3.2.0-2+b1_i386
+libghc-template-dev_0.2.0.7-1+b1_i386
+libghc-temporary-dev_1.1.2.3-1+b1_i386
+libghc-terminfo-dev_0.3.2.3-1+b1_i386
+libghc-test-framework-dev_0.6-1+b1_i386
+libghc-test-framework-hunit-dev_0.2.7-1+b3_i386
+libghc-test-framework-quickcheck2-dev_0.2.12.1-1+b1_i386
+libghc-test-framework-th-dev_0.2.2-5_i386
+libghc-test-framework-th-prime-dev_0.0.5-1_i386
+libghc-testpack-dev_2.1.1-1+b2_i386
+libghc-texmath-dev_0.6.0.6-1+b2_i386
+libghc-text-dev_0.11.2.0-1_i386
+libghc-text-icu-dev_0.6.3.4-2+b2_i386
+libghc-tinyurl-dev_0.1.0-2+b3_i386
+libghc-tls-dev_0.9.5-1+b4_i386
+libghc-tls-extra-dev_0.4.6.1-2_i386
+libghc-tokyocabinet-dev_0.0.5-5+b3_i386
+libghc-transformers-base-dev_0.4.1-2+b2_i386
+libghc-transformers-dev_0.3.0.0-1_i386
+libghc-type-level-dev_0.2.4-5_i386
+libghc-uniplate-dev_1.6.7-1+b2_i386
+libghc-unix-bytestring-dev_0.3.5-2+b1_i386
+libghc-unix-compat-dev_0.3.0.1-1+b1_i386
+libghc-unixutils-dev_1.50-1+b1_i386
+libghc-unlambda-dev_0.1-2+b2_i386
+libghc-unordered-containers-dev_0.2.1.0-1_i386
+libghc-uri-dev_0.1.6-1+b2_i386
+libghc-url-dev_2.1.2-4+b1_i386
+libghc-utf8-light-dev_0.4.0.1-2+b1_i386
+libghc-utf8-string-dev_0.3.7-1+b1_i386
+libghc-utility-ht-dev_0.0.5.1-3+b1_i386
+libghc-uuagc-cabal-dev_1.0.2.0-1+b1_i386
+libghc-uuid-dev_1.2.3-2+b4_i386
+libghc-uulib-dev_0.9.14-2_i386
+libghc-vault-dev_0.2.0.0-1+b2_i386
+libghc-vector-algorithms-dev_0.5.4-1+b2_i386
+libghc-vector-dev_0.9.1-2+b1_i386
+libghc-vector-space-dev_0.8.1-1_i386
+libghc-vector-space-points-dev_0.1.1.0-1+b1_i386
+libghc-void-dev_0.5.5.1-2+b1_i386
+libghc-vte-dev_0.12.1-1+b3_i386
+libghc-vty-dev_4.7.0.14-1+b1_i386
+libghc-wai-app-file-cgi-dev_0.5.8-1+b4_i386
+libghc-wai-app-static-dev_1.2.0.3-1+b3_i386
+libghc-wai-dev_1.2.0.2-1+b2_i386
+libghc-wai-extra-dev_1.2.0.4-1_i386
+libghc-wai-logger-dev_0.1.4-1+b6_i386
+libghc-wai-logger-prefork-dev_0.1.3-1+b6_i386
+libghc-wai-test-dev_1.2.0.2-1_i386
+libghc-warp-dev_1.2.1.1-1_i386
+libghc-warp-tls-dev_1.2.0.4-1+b4_i386
+libghc-web-routes-dev_0.25.3-2+b3_i386
+libghc-webkit-dev_0.12.3-2+b1_i386
+libghc-weighted-regexp-dev_0.3.1.1-2+b1_i386
+libghc-x11-dev_1.5.0.1-1+b2_i386
+libghc-x11-xft-dev_0.3.1-1+b3_i386
+libghc-xdg-basedir-dev_0.2.1-2+b1_i386
+libghc-xhtml-dev_3000.2.1-1_i386
+libghc-xml-conduit-dev_0.7.0.2-1_i386
+libghc-xml-dev_1.3.12-1+b2_i386
+libghc-xml-types-dev_0.3.1-2+b2_i386
+libghc-xml2html-dev_0.1.2.3-1_i386
+libghc-xmonad-contrib-dev_0.10-4~deb7u1_i386
+libghc-xmonad-dev_0.10-4+b2_i386
+libghc-xss-sanitize-dev_0.3.2-1+b1_i386
+libghc-yaml-dev_0.7.0.2-1+b2_i386
+libghc-yaml-light-dev_0.1.4-2+b2_i386
+libghc-yesod-auth-dev_1.0.2.1-2+b2_i386
+libghc-yesod-core-dev_1.0.1.2-1+b3_i386
+libghc-yesod-default-dev_1.0.1.1-1+b1_i386
+libghc-yesod-dev_1.0.1.6-2+b3_i386
+libghc-yesod-form-dev_1.0.0.4-1+b1_i386
+libghc-yesod-json-dev_1.0.0.1-1+b3_i386
+libghc-yesod-markdown-dev_0.4.0-1+b3_i386
+libghc-yesod-persistent-dev_1.0.0.1-1+b1_i386
+libghc-yesod-routes-dev_1.0.1.2-1_i386
+libghc-yesod-static-dev_1.0.0.2-1+b3_i386
+libghc-yesod-test-dev_0.2.0.6-1_i386
+libghc-zip-archive-dev_0.1.1.7-3+b2_i386
+libghc-zlib-bindings-dev_0.1.0.1-1_i386
+libghc-zlib-conduit-dev_0.4.0.1-1_i386
+libghc-zlib-dev_0.5.3.3-1+b1_i386
+libghc-zlib-enum-dev_0.2.2.1-1+b1_i386
+libghc6-agda-dev_1:8_all
+libghc6-alut-dev_1:8_all
+libghc6-arrows-dev_1:8_all
+libghc6-binary-dev_1:8_all
+libghc6-binary-shared-dev_1:8_all
+libghc6-bzlib-dev_1:8_all
+libghc6-cairo-dev_1:8_all
+libghc6-cautious-file-dev_1:8_all
+libghc6-cgi-dev_1:8_all
+libghc6-colour-dev_1:8_all
+libghc6-configfile-dev_1:8_all
+libghc6-convertible-dev_1:8_all
+libghc6-cpphs-dev_1:8_all
+libghc6-criterion-dev_1:8_all
+libghc6-csv-dev_1:8_all
+libghc6-curl-dev_1:8_all
+libghc6-data-accessor-dev_1:8_all
+libghc6-dataenc-dev_1:8_all
+libghc6-datetime-dev_1:8_all
+libghc6-debian-dev_1:8_all
+libghc6-deepseq-dev_1:8_all
+libghc6-diagrams-dev_1:8_all
+libghc6-diff-dev_1:8_all
+libghc6-digest-dev_1:8_all
+libghc6-edison-api-dev_1:8_all
+libghc6-edison-core-dev_1:8_all
+libghc6-editline-dev_1:8_all
+libghc6-erf-dev_1:8_all
+libghc6-event-list-dev_1:8_all
+libghc6-explicit-exception-dev_1:8_all
+libghc6-fastcgi-dev_1:8_all
+libghc6-feed-dev_1:8_all
+libghc6-fgl-dev_1:8_all
+libghc6-filemanip-dev_1:8_all
+libghc6-filestore-dev_1:8_all
+libghc6-ftphs-dev_1:8_all
+libghc6-gconf-dev_1:8_all
+libghc6-ghc-events-dev_1:8_all
+libghc6-ghc-mtl-dev_1:8_all
+libghc6-ghc-paths-dev_1:8_all
+libghc6-gio-dev_1:8_all
+libghc6-gitit-dev_1:8_all
+libghc6-glade-dev_1:8_all
+libghc6-glfw-dev_1:8_all
+libghc6-glib-dev_1:8_all
+libghc6-glut-dev_1:8_all
+libghc6-gstreamer-dev_1:8_all
+libghc6-gtk-dev_1:8_all
+libghc6-gtkglext-dev_1:8_all
+libghc6-gtksourceview2-dev_1:8_all
+libghc6-haddock-dev_1:8_all
+libghc6-happstack-dev_1:8_all
+libghc6-happstack-server-dev_1:8_all
+libghc6-harp-dev_1:8_all
+libghc6-hashed-storage-dev_1:8_all
+libghc6-haskeline-dev_1:8_all
+libghc6-haskell-lexer-dev_1:8_all
+libghc6-haskell-src-dev_1:8_all
+libghc6-haskelldb-dev_1:8_all
+libghc6-haskelldb-hdbc-dev_1:8_all
+libghc6-haskelldb-hdbc-odbc-dev_1:8_all
+libghc6-haskelldb-hdbc-postgresql-dev_1:8_all
+libghc6-haskelldb-hdbc-sqlite3-dev_1:8_all
+libghc6-haskore-dev_1:8_all
+libghc6-haxml-dev_1:8_all
+libghc6-haxr-dev_1:8_all
+libghc6-hdbc-dev_1:8_all
+libghc6-hdbc-odbc-dev_1:8_all
+libghc6-hdbc-postgresql-dev_1:8_all
+libghc6-hdbc-sqlite3-dev_1:8_all
+libghc6-highlighting-kate-dev_1:8_all
+libghc6-hint-dev_1:8_all
+libghc6-hjavascript-dev_1:8_all
+libghc6-hjscript-dev_1:8_all
+libghc6-hoauth-dev_1:8_all
+libghc6-hscolour-dev_1:8_all
+libghc6-hscurses-dev_1:8_all
+libghc6-hsemail-dev_1:8_all
+libghc6-hsh-dev_1:8_all
+libghc6-hslogger-dev_1:8_all
+libghc6-hsp-dev_1:8_all
+libghc6-hsql-dev_1:8_all
+libghc6-hsql-mysql-dev_1:8_all
+libghc6-hsql-odbc-dev_1:8_all
+libghc6-hsql-postgresql-dev_1:8_all
+libghc6-hsql-sqlite3-dev_1:8_all
+libghc6-hstringtemplate-dev_1:8_all
+libghc6-hsx-dev_1:8_all
+libghc6-html-dev_1:8_all
+libghc6-http-dev_1:8_all
+libghc6-hunit-dev_1:8_all
+libghc6-hxt-dev_1:8_all
+libghc6-ifelse-dev_1:8_all
+libghc6-irc-dev_1:8_all
+libghc6-json-dev_1:8_all
+libghc6-language-c-dev_1:8_all
+libghc6-lazysmallcheck-dev_1:8_all
+libghc6-ldap-dev_1:8_all
+libghc6-leksah-server-dev_1:8_all
+libghc6-llvm-dev_1:8_all
+libghc6-ltk-dev_1:8_all
+libghc6-magic-dev_1:8_all
+libghc6-markov-chain-dev_1:8_all
+libghc6-maybet-dev_1:8_all
+libghc6-midi-dev_1:8_all
+libghc6-missingh-dev_1:8_all
+libghc6-mmap-dev_1:8_all
+libghc6-monadcatchio-mtl-dev_1:8_all
+libghc6-monoid-transformer-dev_1:8_all
+libghc6-mtl-dev_1:8_all
+libghc6-mwc-random-dev_1:8_all
+libghc6-network-dev_1:8_all
+libghc6-non-negative-dev_1:8_all
+libghc6-openal-dev_1:8_all
+libghc6-opengl-dev_1:8_all
+libghc6-pandoc-dev_1:8_all
+libghc6-pango-dev_1:8_all
+libghc6-parallel-dev_1:8_all
+libghc6-parsec2-dev_1:8_all
+libghc6-parsec3-dev_1:8_all
+libghc6-pcre-light-dev_1:8_all
+libghc6-polyparse-dev_1:8_all
+libghc6-pretty-show-dev_1:8_all
+libghc6-primitive-dev_1:8_all
+libghc6-quickcheck1-dev_1:8_all
+libghc6-quickcheck2-dev_1:8_all
+libghc6-recaptcha-dev_1:8_all
+libghc6-regex-base-dev_1:8_all
+libghc6-regex-compat-dev_1:8_all
+libghc6-regex-posix-dev_1:8_all
+libghc6-regex-tdfa-dev_1:8_all
+libghc6-regex-tdfa-utf8-dev_1:8_all
+libghc6-safe-dev_1:8_all
+libghc6-sdl-dev_1:8_all
+libghc6-sdl-gfx-dev_1:8_all
+libghc6-sdl-image-dev_1:8_all
+libghc6-sdl-mixer-dev_1:8_all
+libghc6-sdl-ttf-dev_1:8_all
+libghc6-sendfile-dev_1:8_all
+libghc6-sha-dev_1:8_all
+libghc6-smtpclient-dev_1:8_all
+libghc6-split-dev_1:8_all
+libghc6-src-exts-dev_1:8_all
+libghc6-statistics-dev_1:8_all
+libghc6-stm-dev_1:8_all
+libghc6-stream-dev_1:8_all
+libghc6-strict-concurrency-dev_1:8_all
+libghc6-svgcairo-dev_1:8_all
+libghc6-syb-with-class-dev_1:8_all
+libghc6-syb-with-class-instances-text-dev_1:8_all
+libghc6-tagsoup-dev_1:8_all
+libghc6-tar-dev_1:8_all
+libghc6-terminfo-dev_1:8_all
+libghc6-testpack-dev_1:8_all
+libghc6-texmath-dev_1:8_all
+libghc6-text-dev_1:8_all
+libghc6-tokyocabinet-dev_1:8_all
+libghc6-transformers-dev_1:8_all
+libghc6-type-level-dev_1:8_all
+libghc6-uniplate-dev_1:8_all
+libghc6-unix-compat-dev_1:8_all
+libghc6-unixutils-dev_1:8_all
+libghc6-url-dev_1:8_all
+libghc6-utility-ht-dev_1:8_all
+libghc6-uulib-dev_1:8_all
+libghc6-vector-algorithms-dev_1:8_all
+libghc6-vector-dev_1:8_all
+libghc6-vte-dev_1:8_all
+libghc6-vty-dev_1:8_all
+libghc6-webkit-dev_1:8_all
+libghc6-x11-dev_1:8_all
+libghc6-x11-xft-dev_1:8_all
+libghc6-xhtml-dev_1:8_all
+libghc6-xml-dev_1:8_all
+libghc6-xmonad-contrib-dev_1:8_all
+libghc6-xmonad-dev_1:8_all
+libghc6-zip-archive-dev_1:8_all
+libghc6-zlib-dev_1:8_all
+libghemical-dev_3.0.0-2_i386
+libgif-dev_4.1.6-10_i386
+libgiftiio-dev_1.0.9-1_i386
+libgig-dev_3.3.0-2_i386
+libgii1-dev_1:1.0.2-4.1_i386
+libgimp2.0-dev_2.8.2-2+deb7u1_i386
+libginac-dev_1.6.2-1_i386
+libginspx-dev_20050529-3.1_i386
+libgio2.0-cil-dev_2.22.3-2_all
+libgirara-dev_0.1.2-3_i386
+libgirepository1.0-dev_1.32.1-1_i386
+libgjs-dev_1.32.0-5_i386
+libgkeyfile-cil-dev_0.1-4_all
+libgksu2-dev_2.0.13~pre1-6_i386
+libgl1-mesa-dev_8.0.5-4+deb7u2_i386
+libgl1-mesa-swx11-dev_8.0.5-4+deb7u2_i386
+libgl2ps-dev_1.3.6-1_i386
+libglade2-dev_1:2.6.4-1_i386
+libglade2.0-cil-dev_2.12.10-5_i386
+libglademm-2.4-dev_2.6.7-2_i386
+libgladeui-1-dev_3.6.7-2.1_i386
+libgladeui-dev_3.12.1-1_i386
+libglbsp-dev_2.24-1_i386
+libglc-dev_0.7.2-5+b1_i386
+libgle3-dev_3.1.0-7_i386
+libgles1-mesa-dev_8.0.5-4+deb7u2_i386
+libgles2-mesa-dev_8.0.5-4+deb7u2_i386
+libglew-dev_1.7.0-3_i386
+libglewmx-dev_1.7.0-3_i386
+libglfw-dev_2.7.2-1_i386
+libglib2.0-cil-dev_2.12.10-5_i386
+libglib2.0-dev_2.33.12+really2.32.4-5_i386
+libglibmm-2.4-dev_2.32.1-1_i386
+libglide2-dev_2002.04.10ds1-7_i386
+libglide3-dev_2002.04.10ds1-7_i386
+libglm-dev_0.9.3.3+dfsg-0.1_all
+libglobus-authz-callout-error-dev_2.2-1_i386
+libglobus-authz-dev_2.2-1_i386
+libglobus-callout-dev_2.2-1_i386
+libglobus-common-dev_14.7-2_i386
+libglobus-ftp-client-dev_7.3-1_i386
+libglobus-ftp-control-dev_4.4-1_i386
+libglobus-gass-cache-dev_8.1-2_i386
+libglobus-gass-copy-dev_8.4-1_i386
+libglobus-gass-server-ez-dev_4.3-1_i386
+libglobus-gass-transfer-dev_7.2-1_i386
+libglobus-gfork-dev_3.2-1_i386
+libglobus-gram-client-dev_12.4-1_i386
+libglobus-gram-job-manager-callout-error-dev_2.1-2_i386
+libglobus-gram-protocol-dev_11.3-1_i386
+libglobus-gridftp-server-control-dev_2.5-2_i386
+libglobus-gridftp-server-dev_6.10-2_i386
+libglobus-gridmap-callout-error-dev_1.2-2_i386
+libglobus-gsi-callback-dev_4.2-1_i386
+libglobus-gsi-cert-utils-dev_8.3-1_i386
+libglobus-gsi-credential-dev_5.3-1_i386
+libglobus-gsi-openssl-error-dev_2.1-2_i386
+libglobus-gsi-proxy-core-dev_6.2-1_i386
+libglobus-gsi-proxy-ssl-dev_4.1-2_i386
+libglobus-gsi-sysconfig-dev_5.2-1_i386
+libglobus-gss-assist-dev_8.5-1_i386
+libglobus-gssapi-error-dev_4.1-2_i386
+libglobus-gssapi-gsi-dev_10.6-1_i386
+libglobus-io-dev_9.3-1_i386
+libglobus-openssl-module-dev_3.2-1_i386
+libglobus-rls-client-dev_5.2-8_i386
+libglobus-rsl-dev_9.1-2_i386
+libglobus-scheduler-event-generator-dev_4.6-1_i386
+libglobus-usage-dev_3.1-2_i386
+libglobus-xio-dev_3.3-1_i386
+libglobus-xio-gsi-driver-dev_2.3-1_i386
+libglobus-xio-pipe-driver-dev_2.2-1_i386
+libglobus-xio-popen-driver-dev_2.3-1_i386
+libgloox-dev_1.0-1.1_i386
+libglpk-dev_4.45-1_i386
+libglrr-glib-dev_20050529-3.1_i386
+libglrr-gobject-dev_20050529-3.1_i386
+libglrr-gtk-dev_20050529-3.1_i386
+libglrr-widgets-dev_20050529-3.1_i386
+libglu1-mesa-dev_8.0.5-4+deb7u2_i386
+libglui-dev_2.36-4_i386
+libglw1-mesa-dev_8.0.0-1_i386
+libgme-dev_0.5.5-2_i386
+libgmerlin-avdec-dev_1.2.0~dfsg-1+b1_i386
+libgmerlin-dev_1.2.0~dfsg+1-1_i386
+libgmime-2.6-dev_2.6.10-1_i386
+libgmime2.6-cil-dev_2.6.10-1_all
+libgmlib-dev_1.0.6-1_i386
+libgmm++-dev_4.1.1+dfsg1-11_all
+libgmp-dev_2:5.0.5+dfsg-2_i386
+libgmp-ocaml-dev_20021123-17+b3_i386
+libgmp3-dev_2:5.0.5+dfsg-2_i386
+libgmpada3-dev_0.0.20120331-1_i386
+libgmt-dev_4.5.7-2_i386
+libgmtk-dev_1.0.6-1_i386
+libgnadecommon2-dev_1.6.2-9_i386
+libgnadeodbc2-dev_1.6.2-9_i386
+libgnadesqlite3-2-dev_1.6.2-9_i386
+libgnatprj4.6-dev_4.6.3-8_i386
+libgnatvsn4.6-dev_4.6.3-8_i386
+libgnelib-dev_0.75+svn20091130-1+b1_i386
+libgnet-dev_2.0.8-2.2_i386
+libgnokii-dev_0.6.30+dfsg-1+b1_i386
+libgnome-bluetooth-dev_3.4.2-1_i386
+libgnome-desktop-3-dev_3.4.2-1_i386
+libgnome-desktop-dev_2.32.1-2_i386
+libgnome-keyring-dev_3.4.1-1_i386
+libgnome-keyring1.0-cil-dev_1.0.0-4_i386
+libgnome-mag-dev_1:0.16.3-1_i386
+libgnome-media-profiles-dev_3.0.0-1_i386
+libgnome-menu-3-dev_3.4.2-5_i386
+libgnome-menu-dev_3.0.1-4_i386
+libgnome-speech-dev_1:0.4.25-5_i386
+libgnome-vfs2.0-cil-dev_2.24.2-3_all
+libgnome-vfsmm-2.6-dev_2.26.0-1_i386
+libgnome2-dev_2.32.1-3_i386
+libgnome2.0-cil-dev_2.24.2-3_i386
+libgnomeada2.24.1-dev_2.24.1-7_i386
+libgnomecanvas2-dev_2.30.3-1.2_i386
+libgnomecanvasmm-2.6-dev_2.26.0-1_i386
+libgnomecups1.0-dev_0.2.3-5_i386
+libgnomedesktop2.0-cil-dev_2.26.0-8_all
+libgnomekbd-dev_3.4.0.2-1_i386
+libgnomemm-2.6-dev_2.30.0-1_i386
+libgnomeprint2.2-dev_2.18.8-3_i386
+libgnomeprintui2.2-dev_2.18.6-3_i386
+libgnomeui-dev_2.24.5-2_i386
+libgnomeuimm-2.6-dev_2.28.0-1_i386
+libgnomevfs2-dev_1:2.24.4-2_i386
+libgnuift0-dev_0.1.14-12_i386
+libgnuplot-ocaml-dev_0.8.3-3_i386
+libgnustep-base-dev_1.22.1-4_i386
+libgnustep-dl2-dev_0.12.0-9+nmu1_i386
+libgnustep-gui-dev_0.20.0-3_i386
+libgnutls-dev_2.12.20-8+deb7u1_i386
+libgoa-1.0-dev_3.4.2-2_i386
+libgoffice-0.8-dev_0.8.17-1.2_i386
+libgofigure-dev_0.9.0-1+b2_i386
+libgoocanvas-dev_0.15-1_i386
+libgoocanvasmm-dev_0.15.4-1_i386
+libgoogle-perftools-dev_2.0-2_i386
+libgooglepinyin0-dev_0.1.2-1_i386
+libgpac-dev_0.5.0~dfsg0-1_i386
+libgpds-dev_1.5.1-6_i386
+libgpelaunch-dev_0.14-6_i386
+libgpepimc-dev_0.9-4_i386
+libgpeschedule-dev_0.17-4_i386
+libgpevtype-dev_0.50-6_i386
+libgpewidget-dev_0.117-6_i386
+libgpg-error-dev_1.10-3.1_i386
+libgpgme11-dev_1.2.0-1.4_i386
+libgphoto2-2-dev_2.4.14-2_i386
+libgpiv3-dev_0.6.1-4_i386
+libgpm-dev_1.20.4-6_i386
+libgpod-cil-dev_0.8.2-7_i386
+libgpod-dev_0.8.2-7_i386
+libgpod-nogtk-dev_0.8.2-7_i386
+libgportugol-dev_1.1-2_i386
+libgps-dev_3.6-4+deb7u1_i386
+libgraflib1-dev_20061220+dfsg3-2_i386
+libgrafx11-1-dev_20061220+dfsg3-2_i386
+libgrantlee-dev_0.1.4-1_i386
+libgraphicsmagick++1-dev_1.3.16-1.1_i386
+libgraphicsmagick1-dev_1.3.16-1.1_i386
+libgraphite-dev_1:2.3.1-0.2_i386
+libgraphite2-dev_1.1.3-1_i386
+libgraphviz-dev_2.26.3-14+deb7u1_i386
+libgretl1-dev_1.9.9-1_i386
+libgrib-api-dev_1.9.16-2+b1_i386
+libgrib2c-dev_1.2.2-2+b1_i386
+libgridsite-dev_1.7.16-1_i386
+libgrilo-0.1-dev_0.1.19-1_i386
+libgringotts-dev_1.2.10~pre3-1_i386
+libgrits-dev_0.7-1_i386
+libgrok-dev_1.20110708.1-4_i386
+libgrss-dev_0.5.0-1_i386
+libgs-dev_9.05~dfsg-6.3+deb7u1_i386
+libgsasl7-dev_1.8.0-2_i386
+libgsecuredelete-dev_0.2-1_i386
+libgsf-1-dev_1.14.21-2.1_i386
+libgsf-gnome-1-dev_1.14.21-2.1_i386
+libgsl0-dev_1.15+dfsg.2-2_i386
+libgsm0710-dev_1.2.2-2_i386
+libgsm0710mux-dev_0.11.2-1.1_i386
+libgsm1-dev_1.0.13-4_i386
+libgsmme-dev_1.10-13.2_i386
+libgsnmp0-dev_0.3.0-1.1_i386
+libgsql-dev_0.2.2-1.2+b1_i386
+libgss-dev_1.0.2-1_i386
+libgssdp-1.0-dev_0.12.2.1-2_i386
+libgssglue-dev_0.4-2_i386
+libgst-dev_3.2.4-2_i386
+libgstbuzztard-dev_0.5.0-2+deb7u1_i386
+libgstreamer-ocaml-dev_0.1.0-3+b1_i386
+libgstreamer-plugins-bad0.10-dev_0.10.23-7.1+deb7u1_i386
+libgstreamer-plugins-base0.10-dev_0.10.36-1.1_i386
+libgstreamer0.10-cil-dev_0.9.2-4_all
+libgstreamer0.10-dev_0.10.36-1.2_i386
+libgstrtspserver-0.10-dev_0.10.8-3_i386
+libgtest-dev_1.6.0-2_i386
+libgtextutils-dev_0.6.2-1_i386
+libgtg-dev_0.2+dfsg-1_i386
+libgtk-3-dev_3.4.2-7_i386
+libgtk-sharp-beans2.0-cil-dev_2.14.1-3_all
+libgtk-vnc-1.0-dev_0.5.0-3.1_i386
+libgtk-vnc-2.0-dev_0.5.0-3.1_i386
+libgtk2.0-cil-dev_2.12.10-5_i386
+libgtk2.0-dev_2.24.10-2_i386
+libgtkada2.24.1-dev_2.24.1-7_i386
+libgtkdatabox-0.9.1-1-dev_1:0.9.1.1-4_i386
+libgtkgl2.0-dev_2.0.1-2_i386
+libgtkglada2.24.1-dev_2.24.1-7_i386
+libgtkglarea-cil-dev_0.0.17-6_all
+libgtkglext1-dev_1.2.0-2_i386
+libgtkglextmm-x11-1.2-dev_1.2.0-4.1_i386
+libgtkhex-3-dev_3.4.1-1_i386
+libgtkhotkey-dev_0.2.1-3_i386
+libgtkhtml-4.0-dev_4.4.4-1_i386
+libgtkhtml-editor-3.14-dev_3.32.2-2.1_i386
+libgtkhtml-editor-4.0-dev_4.4.4-1_i386
+libgtkhtml3.14-cil-dev_2.26.0-8_i386
+libgtkhtml3.14-dev_3.32.2-2.1_i386
+libgtkimageview-dev_1.6.4+dfsg-0.1_i386
+libgtkmathview-dev_0.8.0-8_i386
+libgtkmm-2.4-dev_1:2.24.2-1_i386
+libgtkmm-3.0-dev_3.4.2-1_i386
+libgtkpod-dev_2.1.2-1_i386
+libgtksourceview-3.0-dev_3.4.2-1_i386
+libgtksourceview2-cil-dev_2.26.0-8_i386
+libgtksourceview2.0-dev_2.10.4-1_i386
+libgtksourceviewmm-3.0-dev_3.2.0-1_i386
+libgtkspell-3-dev_3.0.0~hg20110814-1_i386
+libgtkspell-dev_2.0.16-1_i386
+libgtop2-dev_2.28.4-3_i386
+libgts-dev_0.7.6+darcs110121-1.1_i386
+libguac-dev_0.6.0-2_i386
+libgucharmap-2-90-dev_1:3.4.1.1-2.1_i386
+libgudev-1.0-dev_175-7.2_i386
+libgudev1.0-cil-dev_0.1-3_all
+libguess-dev_1.1-1_i386
+libguestfs-dev_1:1.18.1-1+deb7u3_i386
+libguestfs-gobject-dev_1:1.18.1-1+deb7u3_i386
+libguestfs-ocaml-dev_1:1.18.1-1+deb7u3_i386
+libguichan-dev_0.8.2-10+b1_i386
+libgupnp-1.0-dev_0.18.4-1_i386
+libgupnp-av-1.0-dev_0.10.3-1_i386
+libgupnp-dlna-1.0-dev_0.6.6-1_i386
+libgupnp-igd-1.0-dev_0.2.1-2_i386
+libgusb-dev_0.1.3-5_i386
+libgutenprint-dev_5.2.9-1_i386
+libgutenprintui2-dev_5.2.9-1_i386
+libguytools2-dev_2.0.1-1.1_i386
+libgvnc-1.0-dev_0.5.0-3.1_i386
+libgweather-3-dev_3.4.1-1+build1_i386
+libgwenhywfar60-dev_4.3.3-1_i386
+libgwrap-runtime-dev_1.9.14-1.1_i386
+libgwyddion20-dev_2.28-2_i386
+libgxps-dev_0.2.2-2_i386
+libgyoto0-dev_0.0.3-5_i386
+libh323plus-dev_1.24.0~dfsg2-1_i386
+libhaildb-dev_2.3.2-1.2_i386
+libhal-dev_0.5.14-8_i386
+libhal-storage-dev_0.5.14-8_i386
+libhamlib++-dev_1.2.15.1-1_i386
+libhamlib-dev_1.2.15.1-1_i386
+libhandoff-dev_0.1-5_i386
+libhangul-dev_0.1.0-2_i386
+libharminv-dev_1.3.1-9_i386
+libhashkit-dev_1.0.8-1_i386
+libhawknl-dev_1.6.8+dfsg2-1_i386
+libhbaapi-dev_2.2.5-1_i386
+libhbalinux-dev_1.0.14-1_i386
+libhd-dev_16.0-2.2_i386
+libhdate-dev_1.6-1_i386
+libhdf4-alt-dev_4.2r4-13_i386
+libhdf4-dev_4.2r4-13_i386
+libhdf4g-dev_4.2r4-13_all
+libhdf5-dev_1.8.8-9_i386
+libhdf5-mpi-dev_1.8.8-9_i386
+libhdf5-mpich2-dev_1.8.8-9_i386
+libhdf5-openmpi-dev_1.8.8-9_i386
+libhdf5-serial-dev_1.8.8-9_i386
+libhdfeos-dev_2.17v1.00.dfsg.1-3_i386
+libhdhomerun-dev_20120405-1_i386
+libhe5-hdfeos-dev_5.1.13.dfsg.1-3_i386
+libheartbeat2-dev_1:3.0.5-3_i386
+libhepmc-dev_2.06.09-1_i386
+libhepmcfio-dev_2.06.09-1_i386
+libhepmcinterface8-dev_8.1.65-1_i386
+libherwig59-2-dev_20061220+dfsg3-2_i386
+libhesiod-dev_3.0.2-21_i386
+libhfsp-dev_1.0.4-12_i386
+libhighgui-dev_2.3.1-11_i386
+libhippocanvas-dev_0.3.1-1.1_i386
+libhiredis-dev_0.10.1-7_i386
+libhivex-dev_1.3.6-2_i386
+libhivex-ocaml-dev_1.3.6-2_i386
+libhkl-dev_4.0.3-4_i386
+libhmsbeagle-dev_1.0-6_i386
+libhocr-dev_0.10.17-1+b2_i386
+libhpdf-dev_2.2.1-1_i386
+libhpmud-dev_3.12.6-3.1+deb7u1_i386
+libhsclient-dev_1.1.0-7-g1044a28-1_i386
+libhtmlcxx-dev_0.85-2_i386
+libhtp-dev_0.2.6-2_i386
+libhtsengine-dev_1.06-1_i386
+libhttp-ocaml-dev_0.1.5-1+b2_i386
+libhttrack-dev_3.46.1-1_i386
+libhunspell-dev_1.3.2-4_i386
+libhwloc-dev_1.4.1-4_i386
+libhx-dev_3.12.1-1_i386
+libhyantes-dev_1.3.0-1_i386
+libhyena-cil-dev_0.5-2_all
+libhyphen-dev_2.8.3-2_i386
+libhypre-dev_2.8.0b-1_all
+libhz-dev_0.3.16-3_i386
+libi2c-dev_3.1.0-2_all
+libibcm-dev_1.0.4-1.1_i386
+libibcommon-dev_1.1.2-20090314-1_i386
+libibdm-dev_1.2-OFED-1.4.2-1.3_i386
+libibmad-dev_1.2.3-20090314-1.1_i386
+libibtk-dev_0.0.14-12_i386
+libibumad-dev_1.2.3-20090314-1.1_i386
+libibus-1.0-dev_1.4.1-9+deb7u1_i386
+libibus-qt-dev_1.3.1-2.1_i386
+libibverbs-dev_1.1.6-1_i386
+libical-dev_0.48-2_i386
+libicapapi-dev_1:0.1.6-1.1_i386
+libicc-dev_2.12+argyll1.4.0-8_i386
+libicc-utils-dev_1.6.4-1+b1_i386
+libice-dev_2:1.0.8-2_i386
+libicee-dev_1.2.0-6.1_i386
+libicns-dev_0.8.1-1_i386
+libiconv-hook-dev_0.0.20021209-10_i386
+libics-dev_1.5.2-3_i386
+libicu-dev_4.8.1.1-12+deb7u1_i386
+libid3-3.8.3-dev_3.8.3-15_i386
+libid3tag0-dev_0.15.1b-10_i386
+libident-dev_0.22-3_i386
+libidl-dev_0.8.14-0.2_i386
+libidn11-dev_1.25-2_i386
+libidn2-0-dev_0.8-2_i386
+libido-0.1-dev_0.3.4-1_i386
+libido3-0.1-dev_0.3.4-1_i386
+libidzebra-2.0-dev_2.0.44-3_i386
+libiec16022-dev_0.2.4-1_i386
+libiec61883-dev_1.2.0-0.1_i386
+libieee1284-3-dev_0.2.11-10_i386
+libifp-dev_1.0.0.2-5_i386
+libifstat-dev_1.1-8_i386
+libigraph0-dev_0.5.4-2_i386
+libigstk4-dev_4.4.0-2+b1_i386
+libijs-dev_0.35-8_i386
+libiksemel-dev_1.2-4_i386
+libilmbase-dev_1.0.1-4_i386
+libimdi-dev_1.4.0-8_i386
+libiml-dev_1.0.3-4.2_i386
+libimlib2-dev_1.4.5-1_i386
+libimobiledevice-dev_1.1.1-4_i386
+libindi-dev_0.9.1-2_i386
+libindicate-dev_0.6.92-1_i386
+libindicate-gtk-dev_0.6.92-1_i386
+libindicate-gtk0.1-cil-dev_0.6.92-1_all
+libindicate-gtk3-dev_0.6.92-1_i386
+libindicate-qt-dev_0.2.5.91-5_i386
+libindicate0.1-cil-dev_0.6.92-1_all
+libindicator-dev_0.5.0-1_i386
+libindicator-messages-status-provider-dev_0.6.0-1_i386
+libindicator3-dev_0.5.0-1_i386
+libindigo-dev_1.0.0-2_i386
+libinfinity-0.5-dev_0.5.2-6.1_i386
+libini-config-dev_0.1.3-2_i386
+libinifiles-ocaml-dev_1.2-2_i386
+libinnodb-dev_1.0.6.6750-1_i386
+libinotify-ocaml-dev_1.0-1+b3_i386
+libinotifytools0-dev_3.14-1_i386
+libinput-pad-dev_1.0.1-2_i386
+libinsighttoolkit3-dev_3.20.1+git20120521-3_i386
+libinstpatch-dev_1.0.0-3_i386
+libint-dev_1.1.4-1_i386
+libiodbc2-dev_3.52.7-2+deb7u1_i386
+libion-dev_3.0.1~dfsg1-1_i386
+libipa-hbac-dev_1.8.4-2_i386
+libipathverbs-dev_1.2-1_i386
+libipe-dev_7.1.2-1_i386
+libipmiconsole-dev_1.1.5-3_i386
+libipmidetect-dev_1.1.5-3_i386
+libipmimonitoring-dev_1.1.5-3_i386
+libipset-dev_6.12.1-1_i386
+libiptcdata0-dev_1.0.4-3_i386
+libircclient-dev_1.3+dfsg1-3_i386
+libirman-dev_0.4.4-2_i386
+libirrlicht-dev_1.7.3+dfsg1-4_i386
+libisajet758-3-dev_20061220+dfsg3-2_i386
+libiscsi-dev_1.4.0-3_i386
+libisl-dev_0.10-3_i386
+libiso9660-dev_0.83-4_i386
+libisoburn-dev_1.2.2-2_i386
+libisofs-dev_1.2.2-1_i386
+libitl-dev_0.7.0-3_i386
+libitl-gobject-dev_0.2-1_i386
+libitpp-dev_4.2-4_i386
+libitsol-dev_1.0.0-2_i386
+libivykis-dev_0.30.1-2_i386
+libiw-dev_30~pre9-8_i386
+libjack-dev_1:0.121.3+20120418git75e3e20b-2.1_i386
+libjack-jackd2-dev_1.9.8~dfsg.4+20120529git007cdc37-5_i386
+libjalali-dev_0.4.0-1.1_i386
+libjama-dev_1.2.4-2_all
+libjana-dev_0.0.0+git20091215.9ec1da8a-2+b4_i386
+libjana-ecal-dev_0.0.0+git20091215.9ec1da8a-2+b4_i386
+libjana-gtk-dev_0.0.0+git20091215.9ec1da8a-2+b4_i386
+libjansson-dev_2.3.1-2_i386
+libjasper-dev_1.900.1-13_i386
+libjaula-dev_1.4.0-3_i386
+libjavascriptcoregtk-1.0-dev_1.8.1-3.4_i386
+libjavascriptcoregtk-3.0-dev_1.8.1-3.4_i386
+libjbig-dev_2.0-2+deb7u1_i386
+libjbig2dec0-dev_0.11+20120125-1_i386
+libjconv-dev_2.8-6+b1_i386
+libjemalloc-dev_3.0.0-3_i386
+libjim-dev_0.73-3_i386
+libjpeg62-dev_6b1-3_i386
+libjpeg8-dev_8d-1_i386
+libjpgalleg4-dev_2:4.4.2-2.1_i386
+libjs-of-ocaml-dev_1.2-2_i386
+libjson-glib-dev_0.14.2-1_i386
+libjson-spirit-dev_4.04-1+b1_i386
+libjson-static-camlp4-dev_0.9.8-1+b5_i386
+libjson-wheel-ocaml-dev_1.0.6-2+b8_i386
+libjson0-dev_0.10-1.2_i386
+libjsoncpp-dev_0.6.0~rc2-3_i386
+libjte-dev_1.19-1_i386
+libjthread-dev_1.3.1-3_i386
+libjudy-dev_1.0.5-1_i386
+libjuman-dev_5.1-2.1_i386
+libk3b-dev_2.0.2-6_i386
+libkactivities-dev_4:4.8.4-1_i386
+libkakasi2-dev_2.3.5~pre1+cvs20071101-1_i386
+libkal-dev_0.9.0-1_i386
+libkarma-cil-dev_0.1.2-2.3_all
+libkarma-dev_0.1.2-2.3_i386
+libkate-dev_0.4.1-1_i386
+libkaya-gd-dev_0.4.4-6_i386
+libkaya-gl-dev_0.4.4-6_i386
+libkaya-mysql-dev_0.4.4-6_i386
+libkaya-ncurses-dev_0.4.4-6_i386
+libkaya-ncursesw-dev_0.4.4-6_i386
+libkaya-pgsql-dev_0.4.4-6_i386
+libkaya-sdl-dev_0.4.4-6_i386
+libkaya-sqlite3-dev_0.4.4-6_i386
+libkcddb-dev_4:4.8.4-2_i386
+libkdcraw-dev_4:4.8.4-1_i386
+libkdeedu-dev_4:4.8.4-1_i386
+libkdegames-dev_4:4.8.4-3_i386
+libkdtree++-dev_0.7.0-2_all
+libkernlib1-dev_20061220+dfsg3-2_i386
+libkexiv2-dev_4:4.8.4-1_i386
+libkeybinder-dev_0.2.2-4_i386
+libkeyutils-dev_1.5.5-3_i386
+libkibi-dev_0.1-1_i386
+libkipi-dev_4:4.8.4-1_i386
+libkiten-dev_4:4.8.4-1_i386
+libklatexformula3-dev_3.2.6-1_i386
+libklibc-dev_2.0.1-3.1_i386
+libkmfl-dev_0.9.8-1_i386
+libkmflcomp-dev_0.9.8-1_i386
+libkml-dev_1.3.0~r863-4.1_i386
+libkmod-dev_9-3_i386
+libkokyu-dev_6.0.3+dfsg-0.1_i386
+libkonq5-dev_4:4.8.4-2_i386
+libkonqsidebarplugin-dev_4:4.8.4-2_i386
+libkopete-dev_4:4.8.4-1+b1_i386
+libkosd2-dev_0.8.1-1_i386
+libkpathsea-dev_2012.20120628-4_i386
+libkqueue-dev_1.0.4-2_i386
+libkrb5-dev_1.10.1+dfsg-5+deb7u1_i386
+libksane-dev_4:4.8.4-1_i386
+libksba-dev_1.2.0-2_i386
+libktoblzcheck1-dev_1.39-1_i386
+libktorrent-dev_1.2.1-1_i386
+libktpcommoninternalsprivate-dev_0.4.0-1_i386
+libkvutils-dev_2.9.0-1_i386
+libkvutils2.2-dev_2.9.0-1_all
+libkwnn-dev_1.1.1~a021+cvs20100325-6_i386
+libkwwidgets1-dev_1.0.0~cvs20100930-8_i386
+libkxl0-dev_1.1.7-16_i386
+liblablgl-ocaml-dev_1.04-5+b3_i386
+liblablgtk-extras-ocaml-dev_1.0-1+b2_i386
+liblablgtk2-gl-ocaml-dev_2.14.2+dfsg-3_i386
+liblablgtk2-gnome-ocaml-dev_2.14.2+dfsg-3_i386
+liblablgtk2-ocaml-dev_2.14.2+dfsg-3_i386
+liblablgtkmathview-ocaml-dev_0.7.8-6+b1_i386
+liblablgtksourceview2-ocaml-dev_2.14.2+dfsg-3_i386
+libladr-dev_0.0.200902a-2.1_i386
+libladspa-ocaml-dev_0.1.4-1+b1_i386
+liblapack-dev_3.4.1+dfsg-1+deb70u1_i386
+liblapacke-dev_3.4.1+dfsg-1+deb70u1_i386
+liblas-dev_1.2.1-5+b1_i386
+liblash-compat-dev_1+dfsg0-3_all
+liblasi-dev_1.1.0-1_i386
+liblasso3-dev_2.3.6-2_i386
+liblastfm-dev_0.4.0~git20090710-2_i386
+liblastfm-ocaml-dev_0.3.0-2+b6_i386
+liblcgdm-dev_1.8.2-1+b2_i386
+liblcms1-dev_1.19.dfsg-1.2_i386
+liblcms2-dev_2.2+git20110628-2.2+deb7u1_i386
+libldap-ocaml-dev_2.1.8-8+b9_i386
+libldap2-dev_2.4.31-1+nmu2_i386
+libldb-dev_1:1.1.6-1_i386
+libldns-dev_1.6.13-1_i386
+libledit-ocaml-dev_2.03-1+b2_i386
+liblensfun-dev_0.2.5-2_i386
+libleptonica-dev_1.69-3.1_i386
+libleveldb-dev_0+20120530.gitdd0d562-1_i386
+liblfc-dev_1.8.2-1+b2_i386
+liblhapdf-dev_5.8.7+repack-1_i386
+liblhasa-dev_0.0.7-2_i386
+liblicense-dev_0.8.1-3_i386
+liblightdm-gobject-dev_1.2.2-4_i386
+liblightdm-qt-dev_1.2.2-4_i386
+liblilv-dev_0.14.2~dfsg0-4_i386
+liblinear-dev_1.8+dfsg-1_i386
+liblinebreak2-dev_2.1-1_i386
+liblink-grammar4-dev_4.7.4-2_i386
+liblinphone-dev_3.5.2-10_i386
+liblip-dev_2.0.0-1.1_i386
+liblircclient-dev_0.9.0~pre1-1_i386
+liblistaller-glib-dev_0.5.5-2_i386
+liblivemedia-dev_2012.05.17-1_i386
+libllvm-2.9-ocaml-dev_2.9+dfsg-7_i386
+libllvm-3.0-ocaml-dev_3.0-10_i386
+libllvm-3.1-ocaml-dev_3.1-1_i386
+libllvm-ocaml-dev_1:3.0-14+nmu2_i386
+liblo-dev_0.26~repack-7_i386
+liblo-ocaml-dev_0.1.0-1+b1_i386
+liblo10k1-dev_1.0.25-2_i386
+libloadpng4-dev_2:4.4.2-2.1_i386
+liblockdev1-dev_1.0.3-1.5_i386
+liblockfile-dev_1.09-5_i386
+liblodo3.0-dev_3.0.2+dfsg-4+b1_i386
+liblog4ada2-dev_1.2-3_i386
+liblog4c-dev_1.2.1-3_i386
+liblog4cplus-dev_1.0.4-1_i386
+liblog4cpp5-dev_1.0-4_i386
+liblog4cxx10-dev_0.10.0-1.2_i386
+liblog4net-cil-dev_1.2.10+dfsg-6_all
+liblog4shib-dev_1.0.4-1_i386
+liblog4tango4-dev_7.2.6+dfsg-14_i386
+liblogforwarderutils2-dev_2.7-1_i386
+liblognorm-dev_0.3.4-1_i386
+liblogservicecomponentbase2-dev_2.7-1_i386
+liblogservicetoolbase2-dev_2.7-1_i386
+liblogsys-dev_1.4.2-3_i386
+liblogthread-dev_3.0.12-3.2+deb7u2_i386
+libloki-dev_0.1.7-3_i386
+libloudmouth1-dev_1.4.3-9_i386
+liblouis-dev_2.4.1-1_i386
+liblouisutdml-dev_2.2.0-1_i386
+liblouisxml-dev_2.4.0-3_i386
+liblowpan-dev_0.2.2-2.1_all
+liblpsolve55-dev_5.5.0.13-7_i386
+liblqr-1-0-dev_0.4.1-2_i386
+liblrdf0-dev_0.4.0-5_i386
+liblrm2-dev_1.0.9+hg2665-1_i386
+liblrs-dev_0.42c-1+b1_i386
+liblscp-dev_0.5.6-6_i386
+libltcsmpte-dev_0.4.4-1_i386
+libltdl-dev_2.4.2-1.1_i386
+liblttctl-dev_0.89-05122011-1_i386
+liblttd-dev_0.89-05122011-1_i386
+liblttng-ust-dev_2.0.4-1_i386
+liblttoolbox3-3.1-0-dev_3.1.0-1.1_i386
+liblttvtraceread-2.6-dev_0.12.38-21032011-1+b1_i386
+liblua5.1-0-dev_5.1.5-4_i386
+liblua5.1-apr-dev_0.23.2-1_all
+liblua5.1-bitop-dev_1.0.2-1_all
+liblua5.1-cgi-dev_5.1.4+dfsg-2_all
+liblua5.1-copas-dev_1.1.6-5_all
+liblua5.1-curl-dev_0.3.0-7_all
+liblua5.1-cyrussasl-dev_1.0.0-4_all
+liblua5.1-event-dev_0.4.1-2_all
+liblua5.1-expat-dev_1.2.0-5+deb7u1_all
+liblua5.1-filesystem-dev_1.5.0+16+g84f1af5-1_all
+liblua5.1-leg-dev_0.1.2-8_all
+liblua5.1-logging-dev_1.2.0-1_all
+liblua5.1-lpeg-dev_0.10.2-5_all
+liblua5.1-md5-dev_1.1.2-6_all
+liblua5.1-oocairo-dev_1.4-1.2_i386
+liblua5.1-oopango-dev_1.1-1_i386
+liblua5.1-orbit-dev_2.2.0+dfsg1-1_all
+liblua5.1-posix-dev_5.1.19-2_all
+liblua5.1-rex-onig-dev_2.6.0-2_all
+liblua5.1-rex-pcre-dev_2.6.0-2_all
+liblua5.1-rex-posix-dev_2.6.0-2_all
+liblua5.1-rings-dev_1.2.3-1_all
+liblua5.1-rrd-dev_1.4.7-2_i386
+liblua5.1-sec-dev_0.4.1-1_all
+liblua5.1-soap-dev_3.0-3_all
+liblua5.1-socket-dev_2.0.2-8_all
+liblua5.1-sql-mysql-dev_2.3.0-1+build0_all
+liblua5.1-sql-postgres-dev_2.3.0-1+build0_all
+liblua5.1-sql-sqlite3-dev_2.3.0-1+build0_all
+liblua5.1-svn-dev_0.4.0-7_all
+liblua5.1-wsapi-fcgi-dev_1.5-3_all
+liblua5.1-xmlrpc-dev_1.2.1-5_all
+liblua5.1-zip-dev_1.2.3-11_all
+liblua5.2-dev_5.2.1-3_i386
+liblua50-dev_5.0.3-6_i386
+libluabind-dev_0.9.1+dfsg-5_i386
+liblualib50-dev_5.0.3-6_i386
+liblunar-1-dev_2.0.1-2.2_i386
+liblunar-date-dev_2.4.0-1_i386
+liblv2dynparam1-dev_2-5_i386
+liblvm2-dev_2.02.95-8_i386
+liblwipv6-dev_1.5a-2_i386
+liblwt-glib-ocaml-dev_2.3.2-1+b3_i386
+liblwt-ocaml-dev_2.3.2-1+b3_i386
+liblwt-ssl-ocaml-dev_2.3.2-1+b3_i386
+liblz-dev_1.3-2_i386
+liblzma-dev_5.1.1alpha+20120614-2_i386
+liblzo2-dev_2.06-1_i386
+libm17n-dev_1.6.3-2_i386
+libm17n-im-config-dev_0.9.0-3_i386
+libm4ri-dev_0.0.20080521-2_i386
+libmaa-dev_1.3.1-1_i386
+libmad-ocaml-dev_0.4.4-1+b1_i386
+libmad0-dev_0.15.1b-7_i386
+libmadlib-dev_1.3.0-2.1_i386
+libmagic-dev_5.11-2+deb7u3_i386
+libmagic-ocaml-dev_0.7.3-5+b3_i386
+libmagick++-dev_8:6.7.7.10-5+deb7u3_i386
+libmagickcore-dev_8:6.7.7.10-5+deb7u3_i386
+libmagickwand-dev_8:6.7.7.10-5+deb7u3_i386
+libmagics++-dev_2.14.11-4_i386
+libmailutils-dev_1:2.99.97-3_i386
+libmalaga-dev_7.12-4_i386
+libmaloc-dev_0.2-2.3_i386
+libmapi-dev_1:1.0-3_i386
+libmapiadmin-dev_1:1.0-3_i386
+libmapipp-dev_1:1.0-3_i386
+libmapiproxy-dev_1:1.0-3_i386
+libmapistore-dev_1:1.0-3_i386
+libmapnik-dev_2.0.0+ds1-3_all
+libmapnik2-dev_2.0.0+ds1-3+b4_i386
+libmarble-dev_4:4.8.4-3_i386
+libmarkdown2-dev_2.1.3-3_i386
+libmatchbox-dev_1.9-osso8-3_i386
+libmath++-dev_0.0.4-4_i386
+libmatheval-dev_1.1.8-1_i386
+libmathlib2-dev_20061220+dfsg3-2_i386
+libmatio-dev_1.3.4-4_i386
+libmatrixssl1.8-dev_1.8.8-1_i386
+libmatroska-dev_1.3.0-2_i386
+libmbt0-dev_3.2.8-1_i386
+libmcpp-dev_2.7.2-1.1_i386
+libmcrypt-dev_2.5.8-3.1_i386
+libmcs-dev_0.7.2-2.1_i386
+libmd3-dev_0.1.92-4_i386
+libmdc2-dev_0.10.7-1+b2_i386
+libmdds-dev_0.5.4-1_all
+libmdsp-dev_0.11-10_i386
+libmeanwhile-dev_1.0.2-4_i386
+libmecab-dev_0.99.3-3_i386
+libmed-dev_3.0.3-3_i386
+libmedc-dev_3.0.3-3_i386
+libmediainfo-dev_0.7.58-1_i386
+libmediastreamer-dev_3.5.2-10_i386
+libmedimport-dev_3.0.3-3_i386
+libmeep-dev_1.1.1-8+deb7u1_i386
+libmeep-lam4-dev_1.1.1-10~deb7u1_i386
+libmeep-mpi-default-dev_1.1.1-10~deb7u1_i386
+libmeep-mpich2-dev_1.1.1-10~deb7u1_i386
+libmeep-openmpi-dev_1.1.1-9~deb7u2_i386
+libmelt-ocaml-dev_1.4.0-1_i386
+libmemcache-dev_1.4.0.rc2-1_i386
+libmemcached-dev_1.0.8-1_i386
+libmemphis-0.2-dev_0.2.3-2_i386
+libmenhir-ocaml-dev_20120123.dfsg-1_i386
+libmenu-cache1-dev_0.3.3-1_i386
+libmercator-0.3-dev_0.3.0-2_i386
+libmeschach-dev_1.2b-13_i386
+libmetacity-dev_1:2.34.3-4_i386
+libmgl-dev_1.11.2-17_i386
+libmhash-dev_0.9.9.9-1.1_i386
+libmicrohttpd-dev_0.9.20-1+deb7u1_i386
+libmigemo-dev_20110227-7_i386
+libmikmatch-ocaml-dev_1.0.4-1+b1_i386
+libmikmod2-dev_3.1.12-5_i386
+libmilter-dev_8.14.4-4_i386
+libmimedir-dev_0.5.1-4_i386
+libmimedir-gnome-dev_0.4.2-5_i386
+libmimelib1-dev_5:1.1.4-2_i386
+libmimetic-dev_0.9.7-3_i386
+libmimic-dev_1.0.4-2.1_i386
+libminc-dev_2.1.10-1+b1_i386
+libming-dev_1:0.4.4-1.1_i386
+libmini18n-dev_0.2.1-1_i386
+libminidjvu-dev_0.8.svn.2010.05.06+dfsg-0.2_i386
+libminiupnpc-dev_1.5-2_i386
+libmission-control-plugins-dev_1:5.12.3-1_i386
+libmkv-dev_0.6.5.1-1_i386
+libmlpcap-ocaml-dev_0.9-16_i386
+libmlpost-ocaml-dev_0.8.1-3_i386
+libmlt++-dev_0.8.0-4_i386
+libmlt-dev_0.8.0-4_i386
+libmlx4-dev_1.0.4-1_i386
+libmm-dev_1.4.2-4_i386
+libmm-ocaml-dev_0.2.0-1+b1_i386
+libmmpong0.9-dev_0.9.1-2.1_i386
+libmms-dev_0.6.2-3_i386
+libmng-dev_1.0.10-3_i386
+libmnl-dev_1.0.3-3_i386
+libmodbus-dev_3.0.3-1_i386
+libmodglue1-dev_1.17-2.1_all
+libmodplug-dev_1:0.8.8.4-3+deb7u1+git20130828_all
+libmoe-dev_1.5.8-1_i386
+libmongo-client-dev_0.1.5-1+deb7u1_i386
+libmono-2.0-dev_2.10.8.1-8_i386
+libmono-addins-cil-dev_0.6.2-2_all
+libmono-addins-gui-cil-dev_0.6.2-2_all
+libmono-addins-msbuild-cil-dev_0.6.2-2_all
+libmono-cecil-cil-dev_0.9.5+dfsg-2_all
+libmono-cecil-flowanalysis-cil-dev_0.1~vcs20110809.r1.b34edf6-2_all
+libmono-cil-dev_2.10.8.1-8_all
+libmono-reflection-cil-dev_1.0+git20110407+d2343843-2_all
+libmono-uia-cil-dev_2.1-4_all
+libmono-upnp-cil-dev_0.1.2-1_all
+libmono-zeroconf-cil-dev_0.9.0-4_all
+libmonogame-cil-dev_2.5.1+dfsg-3_all
+libmopac7-dev_1.15-5_i386
+libmorph-dev_1:20090926_i386
+libmosquitto0-dev_0.15-2_all
+libmosquittopp0-dev_0.15-2_all
+libmount-dev_2.20.1-5.3_i386
+libmowgli-dev_1.0.0-1_i386
+libmozjs-dev_24.4.0esr-1~deb7u2_i386
+libmozjs185-dev_1.8.5-1.0.0+dfsg-4_i386
+libmp3lame-dev_3.99.5+repack1-3_i386
+libmp3lame-ocaml-dev_0.3.1-1+b1_i386
+libmp3splt-dev_0.7.2-2_i386
+libmp4v2-dev_2.0.0~dfsg0-1_i386
+libmpc-dev_0.9-4_i386
+libmpcdec-dev_2:0.1~r459-4_i386
+libmpd-dev_0.20.0-1.1_i386
+libmpdclient-dev_2.3-1_i386
+libmpeg2-4-dev_0.4.1-3_i386
+libmpeg3-dev_1.5.4-5_i386
+libmpfi-dev_1.5.1-1_i386
+libmpfr-dev_3.1.0-5_i386
+libmpg123-dev_1.14.4-1_i386
+libmpich2-dev_1.4.1-4.2_i386
+libmpikmeans-dev_1.5-1+b1_i386
+libmrml1-dev_0.1.14-12_i386
+libmrmpi-dev_1.0~20110620.dfsg-2_i386
+libmrss0-dev_0.19.2-3_i386
+libmsgpack-dev_0.5.7-2_i386
+libmsn-dev_4.2-2_i386
+libmsv-dev_0.0.0-1_i386
+libmtbl-dev_0.2-1_i386
+libmtcp-dev_1.2.5-1_i386
+libmtdev-dev_1.1.2-1_i386
+libmthca-dev_1.0.6-1_i386
+libmtp-dev_1.1.3-35-g0ece104-5_i386
+libmudflap0-4.4-dev_4.4.7-2_i386
+libmudflap0-4.6-dev_4.6.3-14_i386
+libmudflap0-4.7-dev_4.7.2-5_i386
+libmulticobex1-dev_0.23-1.1_i386
+libmumps-dev_4.10.0.dfsg-3_i386
+libmumps-ptscotch-dev_4.10.0.dfsg-3_i386
+libmumps-scotch-dev_4.10.0.dfsg-3_i386
+libmumps-seq-dev_4.10.0.dfsg-3_i386
+libmunge-dev_0.5.10-1_i386
+libmuparser-dev_2.1.0-3_i386
+libmupdf-dev_0.9-2_i386
+libmupen64plus-dev_1.99.5-6_all
+libmuroar-dev_0.1.8-2_i386
+libmusic-dev_1.0.7-1.2_i386
+libmusicbrainz3-dev_3.0.2-2.1_i386
+libmusicbrainz5-dev_5.0.1-2_i386
+libmutter-dev_3.4.1-5_i386
+libmx-dev_1.4.6-1_i386
+libmxml-dev_2.6-2_i386
+libmyproxy-dev_5.6-1_i386
+libmysql++-dev_3.1.0-2+b1_i386
+libmysql-cil-dev_6.4.3-2_all
+libmysql-ocaml-dev_1.1.1-1_i386
+libmysqlclient-dev_5.5.35+dfsg-0+wheezy1_i386
+libmysqlcppconn-dev_1.1.0-4+b1_i386
+libmysqld-dev_5.5.35+dfsg-0+wheezy1_i386
+libmythes-dev_2:1.2.2-1_i386
+libnabrit-dev_0.4.1-1_i386
+libnacl-dev_20110221-4_i386
+libnacore-dev_0.4.0-3_i386
+libnanohttp-dev_1.1.0-17.1_i386
+libnatpmp-dev_20110808-3_i386
+libnautilus-extension-dev_3.4.2-1+build1_i386
+libnbio-dev_0.30-1_i386
+libncap-dev_1.9.2-1+b2_i386
+libncbi6-dev_6.1.20120620-2_i386
+libncp-dev_2.2.6-9_i386
+libncurses5-dev_5.9-10_i386
+libncursesada2-dev_5.9.20110404-7_i386
+libncursesw5-dev_5.9-10_i386
+libndesk-dbus-glib1.0-cil-dev_0.4.1-4_all
+libndesk-dbus1.0-cil-dev_0.6.0-6_all
+libndr-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libndr-standard-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libnecpp-dev_1.5.0+cvs20101003-2.1_i386
+libneon27-dev_0.29.6-3_i386
+libneon27-gnutls-dev_0.29.6-3_i386
+libnes-dev_1.1.3-1_i386
+libnet1-dev_1.1.4-2.1_i386
+libnet6-1.3-dev_1:1.3.14-1_i386
+libnetcdf-dev_1:4.1.3-6+b1_i386
+libnetcf-dev_0.1.9-2_i386
+libnetclasses-dev_1.06.dfsg-5+b3_i386
+libnetfilter-conntrack-dev_1.0.1-1_i386
+libnetfilter-cttimeout-dev_1.0.0-1_i386
+libnetfilter-log-dev_1.0.0-1_i386
+libnetfilter-queue-dev_0.0.17-1_i386
+libnethttpd-ocaml-dev_3.5.1-1_i386
+libnetpbm10-dev_2:10.0-15+b1_i386
+libnetpbm9-dev_2:10.0-15+b1_i386
+libnetsvcs-dev_6.0.3+dfsg-0.1_i386
+libnewlib-dev_1.18.0-6.2_i386
+libnewmat10-dev_1.10.4-5_i386
+libnewt-dev_0.52.14-11.1_i386
+libnewtonsoft-json-cil-dev_4.5r6-1_all
+libnexus0-dev_4.2.1-svn1614-1+b2_i386
+libnfnetlink-dev_1.0.0-1.1_i386
+libnfo-dev_1.0.1-1_i386
+libnfs-dev_1.3.0-2_i386
+libnfsidmap-dev_0.25-4_i386
+libnice-dev_0.1.2-1_i386
+libnids-dev_1.23-2_i386
+libnifti-dev_2.0.0-1_i386
+libnih-dbus-dev_1.0.3-4.1_i386
+libnih-dev_1.0.3-4.1_i386
+libnini-cil-dev_1.1.0+dfsg.2-4_all
+libnjb-dev_2.2.7~dfsg0-3_i386
+libnl-3-dev_3.2.7-4_i386
+libnl-cli-3-dev_3.2.7-4_i386
+libnl-dev_1.1-7_i386
+libnl-genl-3-dev_3.2.7-4_i386
+libnl-nf-3-dev_3.2.7-4_i386
+libnl-route-3-dev_3.2.7-4_i386
+libnm-glib-dev_0.9.4.0-10_i386
+libnm-glib-vpn-dev_0.9.4.0-10_i386
+libnm-gtk-dev_0.9.4.1-5_i386
+libnm-util-dev_0.9.4.0-10_i386
+libnmz7-dev_2.0.21-6_i386
+libnoise-dev_1.0.0+nmu1_i386
+libnotify-cil-dev_0.4.0~r3032-6_all
+libnotify-dev_0.7.5-1_i386
+libnotmuch-dev_0.13.2-1_i386
+libnova-dev_0.14.0-2_i386
+libnpth0-dev_0.90-2_i386
+libnsbmp0-dev_0.0.1-1.1_i386
+libnsgif0-dev_0.0.1-1.1_i386
+libnspr4-dev_2:4.9.2-1+deb7u1_i386
+libnss3-dev_2:3.14.5-1_i386
+libntfs-dev_2.0.0-1+b1_i386
+libntl-dev_5.5.2-2_i386
+libntlm0-dev_1.2-1_i386
+libntrack-dev_016-1.1_i386
+libntrack-glib-dev_016-1.1_i386
+libntrack-gobject-dev_016-1.1_i386
+libntrack-qt4-dev_016-1.1_i386
+libnuclient-dev_2.4.3-2.2_i386
+libnuma-dev_2.0.8~rc4-1_i386
+libnunit-cil-dev_2.6.0.12051+dfsg-2_all
+libnussl-dev_2.4.3-2.2_i386
+libnvtt-dev_2.0.8-1+dfsg-2_i386
+libnxcl-dev_0.9-3.1_i386
+libnxml0-dev_0.18.3-4_i386
+libnzb-dev_0.0.20050629-6.1_i386
+liboasis-ocaml-dev_0.2.0-6_i386
+liboasis3-dev_3.3.beta.dfsg.1-8+b1_i386
+liboath-dev_1.12.4-1_i386
+liboauth-dev_0.9.4-3.1_i386
+libobby-0.4-dev_0.4.8-1_i386
+libobexftp0-dev_0.23-1.1_i386
+libobrowser-ocaml-dev_1.1.1+dfsg-1+b9_i386
+libobus-ocaml-dev_1.1.3-1+b8_i386
+libocamlbricks-ocaml-dev_0.50.1-4+b5_i386
+libocamlgraph-ocaml-dev_1.8.2-2_i386
+libocamlgraph-viewer-ocaml-dev_1.8.2-2_i386
+libocamlgsl-ocaml-dev_0.6.0-7+b2_i386
+libocamlnet-gtk2-ocaml-dev_3.5.1-1_i386
+libocamlnet-ocaml-dev_3.5.1-1_i386
+libocamlnet-ssl-ocaml-dev_3.5.1-1_i386
+libocamlodbc-ocaml-dev_2.15-5+b3_i386
+libocamlviz-ocaml-dev_1.01-2+b2_i386
+libocas-dev_0.93-1_i386
+liboce-foundation-dev_0.9.1-3_i386
+liboce-modeling-dev_0.9.1-3_all
+liboce-ocaf-dev_0.9.1-3_all
+liboce-ocaf-lite-dev_0.9.1-3_all
+liboce-visualization-dev_0.9.1-3_all
+libocpf-dev_1:1.0-3_i386
+libocrad-dev_0.22~rc1-2_i386
+libocsigen-ocaml-dev_1.3.4-2+b12_i386
+libocsigen-xhtml-ocaml-dev_1.3.4-2+b12_i386
+libocsigenserver-ocaml-dev_2.1-1_i386
+liboctave-dev_3.6.2-5+deb7u1_i386
+libode-dev_2:0.11.1-4_i386
+libode-sp-dev_2:0.11.1-4_i386
+libodin-dev_1.8.5-2_i386
+libodn-ocaml-dev_0.0.8-1_i386
+libofa0-dev_0.9.3-5_i386
+libofapi-dev_0git20070620-6_i386
+libofdt-dev_1.3.6-1_i386
+libofetion-dev_2.2.2-1_i386
+libofx-dev_1:0.9.4-2.1_i386
+libogdi3.2-dev_3.2.0~beta2-7_i386
+libogg-dev_1.3.0-4_i386
+libogg-ocaml-dev_0.4.3-1+b1_i386
+liboggkate-dev_0.4.1-1_i386
+liboggplay1-dev_0.2.1~git20091227-1.2_i386
+liboggz2-dev_1.1.1-1_i386
+liboglappth-dev_1.0.0-2_i386
+libogre-1.8-dev_1.8.0+dfsg1-3_i386
+libogre-dev_1.7.4+dfsg1-7_i386
+liboil0.3-dev_0.3.17-2_i386
+libois-dev_1.3.0+dfsg0-5_i386
+libomhacks-dev_0.16-1_i386
+libomnievents-dev_1:2.6.2-2_i386
+libomniorb4-dev_4.1.6-2_i386
+libomnithread3-dev_4.1.6-2_i386
+libomxil-bellagio-dev_0.9.3-1+b1_i386
+libonig-dev_5.9.1-1_i386
+liboobs-1-dev_3.0.0-1_i386
+liboop-dev_1.0-9_i386
+libooptools-dev_2.7-1_i386
+libopal-dev_3.10.4~dfsg-3_i386
+libopenafs-dev_1.6.1-3+deb7u2_i386
+libopenais-dev_1.1.4-4.1_i386
+libopenal-dev_1:1.14-4_i386
+libopenbabel-dev_2.3.1+dfsg-4_i386
+libopenblas-dev_0.1.1-6+deb7u3_i386
+libopencc-dev_0.3.0-3_i386
+libopenconnect-dev_3.20-4_i386
+libopencore-amrnb-dev_0.1.3-2_i386
+libopencore-amrwb-dev_0.1.3-2_i386
+libopencryptoki-dev_2.3.1+dfsg-3_i386
+libopencsg-dev_1.3.2-2_i386
+libopenct1-dev_0.6.20-1.2_i386
+libopencv-calib3d-dev_2.3.1-11_i386
+libopencv-contrib-dev_2.3.1-11_i386
+libopencv-core-dev_2.3.1-11_i386
+libopencv-dev_2.3.1-11_i386
+libopencv-features2d-dev_2.3.1-11_i386
+libopencv-flann-dev_2.3.1-11_i386
+libopencv-gpu-dev_2.3.1-11_i386
+libopencv-highgui-dev_2.3.1-11_i386
+libopencv-imgproc-dev_2.3.1-11_i386
+libopencv-legacy-dev_2.3.1-11_i386
+libopencv-ml-dev_2.3.1-11_i386
+libopencv-objdetect-dev_2.3.1-11_i386
+libopencv-video-dev_2.3.1-11_i386
+libopendkim-dev_2.6.8-4_i386
+libopenexr-dev_1.6.1-6_i386
+libopenhpi-dev_2.14.1-1.2_i386
+libopenigtlink1-dev_1.9.2~svn7468-1_i386
+libopenimageio-dev_1.0.5+dfsg0-1_i386
+libopenipmi-dev_2.0.16-1.3_i386
+libopenjpeg-dev_1.3+dfsg-4.7_i386
+libopenmeeg-dev_2.0.0.dfsg-5_i386
+libopenmpi-dev_1.4.5-1_i386
+libopenobex1-dev_1.5-2_i386
+libopenr2-dev_1.3.2-1.1_i386
+libopenraw-dev_0.0.9-3+b1_i386
+libopenrawgnome-dev_0.0.9-3+b1_i386
+libopenscap-dev_0.8.0-4+b1_i386
+libopenscenegraph-dev_3.0.1-4_i386
+libopenslide-dev_3.2.6-2_i386
+libopensm2-dev_3.2.6-20090317-2.1_i386
+libopenthreads-dev_3.0.1-4_i386
+libopentk-cil-dev_1.0.20101006+dfsg1-1_all
+libopentoken3-dev_4.0b-3_i386
+libopenturns-dev_1.0-4_i386
+libopenusb-dev_1.1.0-2_i386
+libopenvg1-mesa-dev_8.0.5-4+deb7u2_i386
+libopenvrml-dev_0.18.9-5+deb7u1_i386
+libopenwalnut1-dev_1.2.5-1.1+b1_i386
+liboping-dev_1.6.2-1_i386
+libopkele-dev_2.0.4-5.3_i386
+libopts25-dev_1:5.12-0.1_i386
+libopus-dev_0.9.14+20120615-1+nmu1_i386
+liborange-dev_0.4-2_i386
+liborbit2-dev_1:2.14.19-0.1_i386
+liborc-0.4-dev_1:0.4.16-2_i386
+liborigin-dev_20080225-2.1_i386
+liborigin2-dev_2:20110117-1+b2_i386
+libortp-dev_3.5.2-10_i386
+liboscpack-dev_1.0.2-1_i386
+libosgearth-dev_2.0+dfsg-4+b3_i386
+libosinfo-1.0-dev_0.1.1-1_i386
+libosip2-dev_3.6.0-4_i386
+libosl-dev_0.5.0-1_i386
+libosmesa6-dev_8.0.5-4+deb7u2_i386
+libosmgpsmap-dev_0.7.3-3_i386
+libosmium-dev_0.0~20111213-g7f3500a-3+b2_i386
+libosmpbf-dev_1.2.1-3_i386
+libosp-dev_1.5.2-10_i386
+libosptk3-dev_3.4.2-1+b1_i386
+libossim-dev_1.7.21-4_i386
+libossp-sa-dev_1.2.6-1_i386
+libossp-uuid-dev_1.6.2-1.3_i386
+libostyle-dev_1.4devel1-20.1+b1_i386
+libotcl1-dev_1.14+dfsg-2_i386
+libotf-dev_0.9.12-2_i386
+libotf-trace-dev_1.10.2+dfsg-2_i386
+libotpw-dev_1.3-2_i386
+libotr2-dev_3.2.1-1+deb7u1_i386
+libots-dev_0.5.0-2.1_i386
+libounit-ocaml-dev_1.1.1-1_i386
+libow-dev_2.8p15-1_i386
+libowfat-dev_0.28-6_i386
+libowfat-dietlibc-dev_0.28-6_i386
+libownet-dev_2.8p15-1_i386
+libp11-dev_0.2.8-2_i386
+libp11-kit-dev_0.12-3_i386
+libpackagekit-glib2-dev_0.7.6-3_i386
+libpackagekit-qt2-dev_0.7.6-3_i386
+libpacketdump3-dev_3.0.14-1_i386
+libpacklib-lesstif1-dev_20061220+dfsg3-2_i386
+libpacklib1-dev_20061220+dfsg3-2_i386
+libpacparser-dev_1.3.0-2_i386
+libpam-ocaml-dev_1.1-4+b3_i386
+libpam0g-dev_1.1.3-7.1_i386
+libpanel-applet-4-dev_3.4.2.1-4_i386
+libpango1.0-dev_1.30.0-1_i386
+libpangomm-1.4-dev_2.28.4-1_i386
+libpano13-dev_2.9.18+dfsg-5_i386
+libpantomime1.2-dev_1.2.0~pre3+snap20071004+dfsg-4+b1_i386
+libpaper-dev_1.1.24+nmu2_i386
+libpaps-dev_0.6.8-6_i386
+libpaq-dev_1.0.4-3+b1_i386
+libpar2-0-dev_0.2.1-1_i386
+libpari-dev_2.5.1-2_i386
+libparpack2-dev_3.1.1-2.1_i386
+libparrot-dev_4.0.0-3_i386
+libparser++-dev_0.2.3-2_all
+libparted0-dev_2.3-12_i386
+libpasswdqc-dev_1.2.0-1_all
+libpath-utils-dev_0.1.3-2_i386
+libpathfinder-dev_1.1.3-0.4+b1_i386
+libpawlib-lesstif3-dev_1:2.14.04.dfsg.2-8_i386
+libpawlib2-dev_1:2.14.04.dfsg.2-8_i386
+libpcap-dev_1.3.0-1_all
+libpcap0.8-dev_1.3.0-1_i386
+libpcapnav0-dev_0.8-1_i386
+libpci-dev_1:3.1.9-6_i386
+libpciaccess-dev_0.13.1-2_i386
+libpcl1-dev_1.6-1_i386
+libpcre++-dev_0.9.5-5.1_i386
+libpcre-ocaml-dev_6.2.5-1_i386
+libpcre3-dev_1:8.30-5_i386
+libpcscada2-dev_0.7.1-4_i386
+libpcsclite-dev_1.8.4-1+deb7u1_i386
+libpdflib804-2-dev_20061220+dfsg3-2_i386
+libpe-rules2-dev_1.1.7-1_i386
+libpe-status3-dev_1.1.7-1_i386
+libpeas-dev_1.4.0-2_i386
+libpengine3-dev_1.1.7-1_i386
+libperl-dev_5.14.2-21+deb7u1_i386
+libperl4caml-ocaml-dev_0.9.5-4+b4_i386
+libpetsc3.2-dev_3.2.dfsg-6_i386
+libpfqueue-dev_0.5.6-8_i386
+libpfs-dev_1.8.5-1_i386
+libpgm-dev_5.1.118-1~dfsg-0.1_i386
+libpgocaml-ocaml-dev_1.5-2_i386
+libpgpool-dev_3.1.3-5_i386
+libpgtcl-dev_1:1.5-6_i386
+libphash0-dev_0.9.4-1.2_i386
+libphat-dev_0.4.1-5_i386
+libphobos-4.4-dev_1.063-4.4.7-1_i386
+libphobos2-4.6-dev_0.29.1-4.6.3-2_i386
+libphone-ui-dev_1:0.0.1+git20110825-3_i386
+libphone-utils-dev_0.1+git20110523-2.1_i386
+libphonon-dev_4:4.6.0.0-3_i386
+libphononexperimental-dev_4:4.6.0.0-3_i386
+libphotos202-dev_20061220+dfsg3-2_i386
+libphtools2-dev_20061220+dfsg3-2_i386
+libphysfs-dev_2.0.2-6_i386
+libpiano-dev_2012.05.06-2_i386
+libpigment0.3-dev_0.3.17-1_i386
+libpils2-dev_1.0.9+hg2665-1_i386
+libpinyin0-dev_0.6.91-1_i386
+libpion-common-dev_4.0.7+dfsg-3.1_i386
+libpion-net-dev_4.0.7+dfsg-3.1_i386
+libpipeline-dev_1.2.1-1_i386
+libpisock-dev_0.12.5-5_i386
+libpixman-1-dev_0.26.0-4+deb7u1_i386
+libpkcs11-helper1-dev_1.09-1_i386
+libplayer-dev_2.0.1-2.1_i386
+libplayerc++3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayerc3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayercommon3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayercore3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayerdrivers3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayerinterface3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayerjpeg3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayertcp3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayerwkb3.0-dev_3.0.2+dfsg-4+b1_i386
+libplib-dev_1.8.5-6_i386
+libplist++-dev_1.8-1_i386
+libplist-dev_1.8-1_i386
+libpload-dev_1.4.2-3_i386
+libplot-dev_2.6-3_i386
+libploticus0-dev_2.41-5_i386
+libplotmm-dev_0.1.2-2_i386
+libplplot-ada0-dev_5.9.9-5_i386
+libplplot-dev_5.9.9-5_i386
+libplumb2-dev_1.0.9+hg2665-1_i386
+libplumbgpl2-dev_1.0.9+hg2665-1_i386
+libpmap3.0-dev_3.0.2+dfsg-4+b1_i386
+libpmi0-dev_2.3.4-2+b1_i386
+libpmount-dev_0.0.16_i386
+libpng++-dev_0.2.5-1_all
+libpng12-dev_1.2.49-1_i386
+libpnglite-dev_0.1.17-1_i386
+libpoco-dev_1.3.6p1-4_i386
+libpodofo-dev_0.9.0-1.1+b1_i386
+libpoker-eval-dev_138.0-1_i386
+libpolarssl-dev_1.2.9-1~deb7u2_i386
+libpoldiff-dev_3.3.7-3_i386
+libpolkit-agent-1-dev_0.105-3_i386
+libpolkit-backend-1-dev_0.105-3_i386
+libpolkit-gobject-1-dev_0.105-3_i386
+libpolkit-qt-1-dev_0.103.0-1_i386
+libpolybori-dev_0.5~rc1-2.2_i386
+libpolylib64-dev_5.22.5-3+dfsg_i386
+libpolyml-dev_5.2.1-1.1_i386
+libpolyorb2-dev_2.8~20110207-5.1_i386
+libpomp-dev_1.1+dfsg-2_i386
+libpoppler-cil-dev_0.0.3-2_all
+libpoppler-cpp-dev_0.18.4-6_i386
+libpoppler-dev_0.18.4-6_i386
+libpoppler-glib-dev_0.18.4-6_i386
+libpoppler-private-dev_0.18.4-6_i386
+libpoppler-qt4-dev_0.18.4-6_i386
+libpopplerkit-dev_0.0.20051227svn-7+b1_i386
+libpopt-dev_1.16-7_i386
+libportaudio-dev_18.1-7.1_i386
+libportaudio-ocaml-dev_0.2.0-1+b1_i386
+libportmidi-dev_1:184-2.1_i386
+libportsmf-dev_0.1~svn20101010-3_i386
+libpostgresql-ocaml-dev_1.18.0-1_i386
+libpostproc-dev_6:0.8.10-1_i386
+libpotrace-dev_1.10-1_i386
+libpowerman0-dev_2.3.5-1_i386
+libppd-dev_2:0.10-7.1_i386
+libppl0.11-dev_0.11.2-8_i386
+libpq-dev_9.1.13-0wheezy1_i386
+libpqxx3-dev_3.1-1.1_i386
+libprelude-dev_1.0.0-9_i386
+libpreludedb-dev_1.0.0-1.1+b2_i386
+libpresage-dev_0.8.8-1_i386
+libpri-dev_1.4.12-2_i386
+libprinterconf-dev_0.5-12_i386
+libprintsys-dev_0.6-13_i386
+libprison-dev_1.0+dfsg-1_i386
+libprocps0-dev_1:3.3.3-3_i386
+libproj-dev_4.7.0-2_i386
+libprojectm-dev_2.1.0+dfsg-1_i386
+libprojectm-qt-dev_2.1.0+dfsg-1_i386
+libprotobuf-c0-dev_0.14-1+b1_i386
+libprotobuf-dev_2.4.1-3_i386
+libprotoc-dev_2.4.1-3_i386
+libproxy-dev_0.3.1-6_i386
+libproxychains-dev_3.1-3_i386
+libpspell-dev_0.60.7~20110707-1_i386
+libpst-dev_0.6.54-4.1_i386
+libpstoedit-dev_3.60-2+b1_i386
+libpstreams-dev_0.7.0-2_all
+libpt-dev_2.10.4~dfsg-1_i386
+libptexenc-dev_2012.20120628-4_i386
+libpth-dev_2.0.7-16_i386
+libpthread-stubs0-dev_0.3-3_i386
+libpthread-workqueue-dev_0.8.2-1_i386
+libptscotch-dev_5.1.12b.dfsg-1.2_i386
+libpugl-dev_0~svn32+dfsg0-1_i386
+libpulse-dev_2.0-6.1_i386
+libpulse-ocaml-dev_0.1.2-1+b1_i386
+libpuma-dev_1:1.1+svn20120529-2_i386
+libpurelibc-dev_0.4.1-1_i386
+libpurple-dev_2.10.9-1~deb7u1_all
+libpuzzle-dev_0.9-5_i386
+libpwl-dev_0.11.2-8_i386
+libpxp-ocaml-dev_1.2.2-1+b4_i386
+libpycaml-ocaml-dev_0.82-14+b2_i386
+libpyside-dev_1.1.1-3_i386
+libpythia8-dev_8.1.65-1_i386
+libpythonqt2-dev_2.0.1-1.1_i386
+libqalculate-dev_0.9.7-8_i386
+libqapt-dev_1.3.0-2_i386
+libqb-dev_0.11.1-2_i386
+libqca2-dev_2.0.3-4_i386
+libqd-dev_2.3.11.dfsg-2.1_i386
+libqdaccolib-dev_0.8.2-1_i386
+libqdbm++-dev_1.8.78-2_i386
+libqdbm-dev_1.8.78-2_i386
+libqdjango-dev_0.2.5-2_i386
+libqedje-dev_0.4.0+lgpl-3_i386
+libqfits-dev_6.2.0-5_i386
+libqgis-dev_1.7.4+1.7.5~20120320-1.1+b1_i386
+libqglviewer-qt4-dev_2.3.4-4.2_i386
+libqgpsmm-dev_3.6-4+deb7u1_i386
+libqhull-dev_2009.1-3_i386
+libqimageblitz-dev_1:0.0.6-4_i386
+libqjson-dev_0.7.1-7_i386
+libqmf-dev_0.16-6+deb7u1_i386
+libqmf2-dev_0.16-6+deb7u1_i386
+libqmfconsole2-dev_0.16-6+deb7u1_i386
+libqmfengine1-dev_0.16-6+deb7u1_i386
+libqmmp-dev_0.5.5-1+b1_i386
+libqmmpui-dev_0.5.5-1+b1_i386
+libqoauth-dev_1.0.1-1_i386
+libqof-dev_0.8.6-1_i386
+libqofexpensesobjects-dev_0.1.9-2_i386
+libqpdf-dev_2.3.1-4_i386
+libqpidbroker2-dev_0.16-6+deb7u1_i386
+libqpidclient2-dev_0.16-6+deb7u1_i386
+libqpidcommon2-dev_0.16-6+deb7u1_i386
+libqpidmessaging2-dev_0.16-6+deb7u1_i386
+libqpidtypes1-dev_0.16-6+deb7u1_i386
+libqpol-dev_3.3.7-3_i386
+libqpx-dev_0.7.1.002-5_i386
+libqrencode-dev_3.3.0-2_i386
+libqrupdate-dev_1.1.1-1_i386
+libqsastime-dev_5.9.9-5_i386
+libqscintilla2-dev_2.6.2-2_all
+libqt4-dev_4:4.8.2+dfsg-11_i386
+libqt4-opengl-dev_4:4.8.2+dfsg-11_i386
+libqt4-private-dev_4:4.8.2+dfsg-11_i386
+libqt4pas-dev_2.5-6_i386
+libqtassistantclient-dev_4.6.3-4_i386
+libqtexengine-dev_0.3-3_i386
+libqtgstreamer-dev_0.10.2-2_i386
+libqtruby4shared-dev_4:4.8.4-1_i386
+libqtwebkit-dev_2.2.1-5_i386
+libquantlib0-dev_1.2-2+b1_i386
+libquantum-dev_1.1.0-3_i386
+libquicktime-dev_2:1.2.4-3_i386
+libquorum-dev_1.4.2-3_i386
+libquvi-dev_0.4.1-1_i386
+libqwt-dev_6.0.0-1.2_i386
+libqwt5-qt4-dev_5.2.2-3_i386
+libqwtplot3d-qt4-dev_0.2.7+svn191-7_i386
+libqxmlrpc-dev_0.0.svn6-2_i386
+libqxmpp-dev_0.4.92-1_i386
+libqxt-dev_0.6.1-6_i386
+libqzeitgeist-dev_0.7.0-1+b1_i386
+libqzion-dev_0.4.0+lgpl-4_i386
+librabbitmq-dev_0.0.1.hg216-1_i386
+libradare2-dev_0.9-3_i386
+libradius1-dev_0.3.2-14_i386
+libradiusclient-ng-dev_0.5.6-1.1_i386
+libranlip-dev_1.0-4.1_i386
+librapi2-dev_0.15-2.1_i386
+libraptor1-dev_1.4.21-7.1_i386
+libraptor2-dev_2.0.8-2_i386
+librarian-dev_0.8.1-5_i386
+librasqal3-dev_0.9.29-1_i386
+librasterlite-dev_1.1~svn11-2_i386
+libraul-dev_0.8.0+dfsg0-0.1+b1_i386
+libraw-dev_0.14.6-2_i386
+libraw1394-dev_2.0.9-1_i386
+librcc-dev_0.2.9-3_i386
+librcd-dev_0.1.13-3_i386
+librdf0-dev_1.0.15-1+b1_i386
+librdkit-dev_201203-3_i386
+librdmacm-dev_1.0.15-1+deb7u1_i386
+librdmawrap2-dev_0.16-6+deb7u1_i386
+libreact-ocaml-dev_0.9.3-1_i386
+libreadline-dev_6.2+dfsg-0.1_i386
+libreadline-gplv2-dev_5.2+dfsg-2~deb7u1_i386
+libreadline6-dev_6.2+dfsg-0.1_i386
+librec-dev_1.5-1_i386
+librecode-dev_3.6-20_i386
+libref-array-dev_0.1.3-2_i386
+libregina3-dev_3.6-2_i386
+libregistry-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libreins-ocaml-dev_0.1a-4+b1_i386
+libreiser4-dev_1.0.7-6.3_i386
+librelp-dev_1.0.0-1_i386
+libremctl-dev_3.2-4_i386
+librenaissance0-dev_0.9.0-4+b3_i386
+libreoffice-dev_1:3.5.4+dfsg2-0+deb7u2_i386
+librep-dev_0.90.2-1.3_i386
+libreplaygain-dev_1.0~r475-1_i386
+libres-ocaml-dev_3.2.0-2+b3_i386
+libresample1-dev_0.1.3-4_i386
+libresid-builder-dev_2.1.1-14_i386
+libresiprocate-1.8-dev_1.8.5-4_i386
+libresiprocate-turn-client-1.8-dev_1.8.5-4_i386
+librest-dev_0.7.12-3_i386
+librest-extras-dev_0.7.12-3_i386
+librhash-cil-dev_1.2.9-8+deb7u1_all
+librhash-dev_1.2.9-8+deb7u1_i386
+librheolef-dev_6.1-2.1_i386
+librivet-dev_1.8.0-1_i386
+librlog-dev_1.4-2_i386
+libroar-dev_1.0~beta2-3_i386
+libroot-bindings-python-dev_5.34.00-2_i386
+libroot-bindings-ruby-dev_5.34.00-2_i386
+libroot-core-dev_5.34.00-2_i386
+libroot-geom-dev_5.34.00-2_i386
+libroot-graf2d-gpad-dev_5.34.00-2_i386
+libroot-graf2d-graf-dev_5.34.00-2_i386
+libroot-graf2d-postscript-dev_5.34.00-2_i386
+libroot-graf3d-eve-dev_5.34.00-2_i386
+libroot-graf3d-g3d-dev_5.34.00-2_i386
+libroot-graf3d-gl-dev_5.34.00-2_i386
+libroot-gui-dev_5.34.00-2_i386
+libroot-gui-ged-dev_5.34.00-2_i386
+libroot-hist-dev_5.34.00-2_i386
+libroot-hist-spectrum-dev_5.34.00-2_i386
+libroot-html-dev_5.34.00-2_i386
+libroot-io-dev_5.34.00-2_i386
+libroot-io-xmlparser-dev_5.34.00-2_i386
+libroot-math-foam-dev_5.34.00-2_i386
+libroot-math-genvector-dev_5.34.00-2_i386
+libroot-math-mathcore-dev_5.34.00-2_i386
+libroot-math-mathmore-dev_5.34.00-2_i386
+libroot-math-matrix-dev_5.34.00-2_i386
+libroot-math-minuit-dev_5.34.00-2_i386
+libroot-math-mlp-dev_5.34.00-2_i386
+libroot-math-physics-dev_5.34.00-2_i386
+libroot-math-quadp-dev_5.34.00-2_i386
+libroot-math-smatrix-dev_5.34.00-2_i386
+libroot-math-splot-dev_5.34.00-2_i386
+libroot-math-unuran-dev_5.34.00-2_i386
+libroot-misc-memstat-dev_5.34.00-2_i386
+libroot-misc-minicern-dev_5.34.00-2_i386
+libroot-misc-table-dev_5.34.00-2_i386
+libroot-montecarlo-eg-dev_5.34.00-2_i386
+libroot-montecarlo-vmc-dev_5.34.00-2_i386
+libroot-net-auth-dev_5.34.00-2_i386
+libroot-net-bonjour-dev_5.34.00-2_i386
+libroot-net-dev_5.34.00-2_i386
+libroot-net-ldap-dev_5.34.00-2_i386
+libroot-proof-clarens-dev_5.34.00-2_i386
+libroot-proof-dev_5.34.00-2_i386
+libroot-proof-proofplayer-dev_5.34.00-2_i386
+libroot-roofit-dev_5.34.00-2_i386
+libroot-tmva-dev_5.34.00-2_i386
+libroot-tree-dev_5.34.00-2_i386
+libroot-tree-treeplayer-dev_5.34.00-2_i386
+librostlab-blast0-dev_1.0.0-2_i386
+librostlab3-dev_1.0.20-1_i386
+librpcsecgss-dev_0.19-5_i386
+librplay3-dev_3.3.2-14_i386
+librpm-dev_4.10.0-5+deb7u1_i386
+librra-dev_0.14-1.2_i386
+librrd-dev_1.4.7-2_i386
+librsl-dev_1.42-2_i386
+librsskit-dev_0.3-2_i386
+librsvg2-2.0-cil-dev_2.26.0-8_all
+librsvg2-dev_2.36.1-2_i386
+librsync-dev_0.9.7-9_i386
+librtai-dev_3.8.1-4_i386
+librtas-dev_1.3.6-1_i386
+librtasevent-dev_1.3.6-1_i386
+librtaudio-dev_4.0.10~ds0-2_i386
+librtfcomp-dev_1.1-5+b1_i386
+librtfilter-dev_1.1-4_i386
+librtmidi-dev_1.0.15~ds0-2_i386
+librtmp-dev_2.4+20111222.git4e06e21-1_i386
+librubberband-dev_1.3-1.3_i386
+librudecgi-dev_5.0.0-1_i386
+libruli4-dev_0.33-1.1_i386
+librxp-dev_1.5.0-1_i386
+libs3-dev_2.0-1_i386
+libs3d-dev_0.2.2-8_i386
+libs3dw-dev_0.2.2-8_i386
+libsaamf3-dev_1.1.4-4.1_i386
+libsackpt3-dev_1.1.4-4.1_i386
+libsaclm3-dev_1.1.4-4.1_i386
+libsaevt3-dev_1.1.4-4.1_i386
+libsage-dev_0.2.0-4.1_i386
+libsalck3-dev_1.1.4-4.1_i386
+libsam-dev_1.4.2-3_i386
+libsamba-credentials-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libsamba-hostconfig-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libsamba-policy-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libsamba-util-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libsamdb-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libsaml2-dev_2.4.3-4_i386
+libsampleicc-dev_1.6.4-1+b1_i386
+libsamplerate-ocaml-dev_0.1.1-1+b3_i386
+libsamplerate0-dev_0.1.8-5_i386
+libsamsg4-dev_1.1.4-4.1_i386
+libsane-dev_1.0.22-7.4_i386
+libsane-extras-dev_1.0.22.2_i386
+libsanlock-dev_2.2-2_i386
+libsary-dev_1:1.2.0-2.1_i386
+libsasl2-dev_2.1.25.dfsg1-6+deb7u1_i386
+libsatmr3-dev_1.1.4-4.1_i386
+libsbjson-dev_2.3.2-2_i386
+libsbsms-dev_2.0.1-1_i386
+libsbuf-dev_9.0+ds1-4_i386
+libsbuild-dev_1.6.4-4_i386
+libsc-dev_2.3.1-14_i386
+libscalapack-mpi-dev_1.8.0-9_i386
+libscalapack-pvm-dev_1.8.0-9_i386
+libscalc-dev_0.2.4-1_i386
+libscamperfile0-dev_20111202b-1_i386
+libschroedinger-dev_1.0.11-2_i386
+libschroedinger-ocaml-dev_0.1.0-1+b3_i386
+libscim-dev_1.4.13-5_i386
+libscm-dev_5e5-3.2_i386
+libscotch-dev_5.1.12b.dfsg-1.2_i386
+libscotchmetis-dev_5.1.12b.dfsg-1.2_i386
+libscotchparmetis-dev_5.1.12b.dfsg-1.2_i386
+libsctp-dev_1.0.11+dfsg-2_i386
+libscythestat-dev_1.0.2-1_all
+libsdl-console-dev_2.1-3_i386
+libsdl-gfx1.2-dev_2.0.23-3_i386
+libsdl-image1.2-dev_1.2.12-2_i386
+libsdl-mixer1.2-dev_1.2.12-3_i386
+libsdl-net1.2-dev_1.2.8-2_i386
+libsdl-ocaml-dev_0.9.0-1_i386
+libsdl-pango-dev_0.1.2-6_i386
+libsdl-sge-dev_030809dfsg-3_i386
+libsdl-sound1.2-dev_1.0.3-6_i386
+libsdl-stretch-dev_0.3.1-3_i386
+libsdl-ttf2.0-dev_2.0.11-2_i386
+libsdl1.2-dev_1.2.15-5_i386
+libsdpa-dev_7.3.8+dfsg-1_i386
+libsearchclient-dev_0.7.7-3_i386
+libseaudit-dev_3.3.7-3_i386
+libseed-gtk3-dev_3.2.0-2_i386
+libsefs-dev_3.3.7-3_i386
+libselinux1-dev_2.1.9-5_i386
+libsemanage1-dev_2.1.6-6_i386
+libsensors-applet-plugin-dev_3.0.0-0.2_i386
+libsensors4-dev_1:3.3.2-2+deb7u1_i386
+libsepol1-dev_2.1.4-3_i386
+libserd-dev_0.14.0~dfsg0-2_i386
+libserf-dev_1.1.0-2_i386
+libsexplib-camlp4-dev_7.0.4-2_i386
+libsexy-dev_0.1.11-2+b1_i386
+libsfml-dev_1.6+dfsg2-2_i386
+libsfst1-1.2-0-dev_1.2.0-1.2_i386
+libsgutils2-dev_1.33-1_i386
+libsha-ocaml-dev_1.7-2+b2_i386
+libshairport-dev_1.2.1~git20120110.aeb4987-2_i386
+libshevek-dev_1.3-1_i386
+libshhmsg1-dev_1.4.1-4.1_i386
+libshhopt1-dev_1.1.7-2.1_i386
+libshiboken-dev_1.1.1-1_i386
+libshibsp-dev_2.4.3+dfsg-5+b1_i386
+libshisa-dev_1.0.1-2_i386
+libshishi-dev_1.0.1-2_i386
+libshout-ocaml-dev_0.2.7-1+b3_i386
+libshout3-dev_2.2.2-8_i386
+libshp-dev_1.2.10-7_i386
+libshr-glib-dev_2011.03.08.2~git20110930-2_i386
+libsidl-dev_1.4.0.dfsg-8.1_i386
+libsidplay1-dev_1.36.59-5_i386
+libsidplay2-dev_2.1.1-14_i386
+libsidplayfp-dev_0.3.5-1_i386
+libsidutils-dev_2.1.1-14_i386
+libsieve2-dev_2.2.6-1.1_i386
+libsigc++-1.2-dev_1.2.7-2_i386
+libsigc++-2.0-dev_2.2.10-0.2_i386
+libsigc++-dev_1.0.4-9.4_i386
+libsigrok0-dev_0.1.0-2_i386
+libsigrokdecode0-dev_0.1.0-2_i386
+libsigsegv-dev_2.9-4_i386
+libsilly-dev_0.1.0-3_i386
+libsilo-dev_4.8-13_i386
+libsimage-dev_1.7.0-1.1+b1_i386
+libsimplelist0-dev_0.3.4-2_i386
+libsipwitch-dev_1.2.4-1_i386
+libsiscone-dev_2.0.5-1_i386
+libsiscone-spherical-dev_2.0.5-1_i386
+libskk-dev_0.0.12-3_i386
+libskstream-0.3-dev_0.3.8-1_i386
+libslang2-dev_2.2.4-15_i386
+libslepc3.2-dev_3.2-p5-1_i386
+libslp-dev_1.2.1-9_i386
+libslurm-dev_2.3.4-2+b1_i386
+libslurmdb-dev_2.3.4-2+b1_i386
+libslv2-dev_0.6.6+dfsg1-2_i386
+libsm-dev_2:1.2.1-2_i386
+libsmbclient-dev_2:3.6.6-6+deb7u3_i386
+libsmbclient-raw-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libsmbios-dev_2.0.3.dfsg-1.1_i386
+libsmf-dev_1.3-2_i386
+libsmi2-dev_0.4.8+dfsg2-7_i386
+libsmokekde-dev_4:4.8.4-1_i386
+libsmokeqt4-dev_4:4.8.4-1_i386
+libsmpeg-dev_0.4.5+cvs20030824-5_i386
+libsnacc-dev_1.3.1-1_i386
+libsnack2-dev_2.2.10-dfsg1-12.1_i386
+libsnappy-dev_1.0.5-2_i386
+libsndfile1-dev_1.0.25-5_i386
+libsndobj-dev_2.6.6.1-3_i386
+libsnmp-dev_5.4.3~dfsg-2.8_i386
+libsnmpkit-dev_0.9-16_i386
+libsocialweb-client-dev_0.25.20-2.1_i386
+libsocialweb-dev_0.25.20-2.1_i386
+libsocksd0-dev_1.1.19.dfsg-3+b3_i386
+libsofa-c-dev_2012.03.01-1_i386
+libsofa1-dev_1.0~beta4-7_i386
+libsofia-sip-ua-dev_1.12.11+20110422-1_i386
+libsofia-sip-ua-glib-dev_1.12.11+20110422-1_i386
+libsofthsm-dev_1.3.3-2_i386
+libsoil-dev_1.07~20080707.dfsg-2_i386
+libsombok-dev_2.2.1-1_i386
+libsonic-dev_0.1.17-1.1_i386
+libsope-dev_1.3.16-1_i386
+libsoprano-dev_2.7.6+dfsg.1-2wheezy1_i386
+libsoqt4-dev_1.5.0-2_i386
+libsord-dev_0.8.0~dfsg0-1_i386
+libsoundgen-dev_0.6-4_i386
+libsoundtouch-dev_1.6.0-3_i386
+libsoundtouch-ocaml-dev_0.1.7-1+b1_i386
+libsoup-gnome2.4-dev_2.38.1-3_i386
+libsoup2.4-dev_2.38.1-3_i386
+libsoupcutter-dev_1.1.7-1.2_i386
+libsource-highlight-dev_3.1.6-1.1_i386
+libsox-dev_14.4.0-3_i386
+libsp-gxmlcpp-dev_1.0.20040603-5_i386
+libsp1-dev_1.3.4-1.2.1-47.1+b1_i386
+libspandsp-dev_0.0.6~pre20-3.1_i386
+libsparsehash-dev_1.10-1_all
+libsparskit-dev_2.0.0-2_i386
+libspatialindex-dev_1.7.0-1_i386
+libspatialite-dev_3.0.0~beta20110817-3+deb7u1_i386
+libspctag-dev_0.2-1_i386
+libspectre-dev_0.2.7-2_i386
+libspectrum-dev_1.0.0-3_i386
+libspeechd-dev_0.7.1-6.2_i386
+libspeex-dev_1.2~rc1-7_i386
+libspeex-ocaml-dev_0.2.0-1+b3_i386
+libspeexdsp-dev_1.2~rc1-7_i386
+libspf2-dev_1.2.9-7_i386
+libsphere-dev_3.2-4_i386
+libspice-client-glib-2.0-dev_0.12-5_i386
+libspice-client-gtk-2.0-dev_0.12-5_i386
+libspice-client-gtk-3.0-dev_0.12-5_i386
+libspice-protocol-dev_0.10.1-1_all
+libspice-server-dev_0.11.0-1+deb7u1_i386
+libspiro-dev_20071029-2_i386
+libspnav-dev_0.2.2-1_i386
+libspooles-dev_2.2-9_i386
+libsprng2-dev_2.0a-8_i386
+libsqlexpr-ocaml-dev_0.4.1-1+b5_i386
+libsqlheavy-dev_0.1.1-1_i386
+libsqlheavygtk-dev_0.1.1-1_i386
+libsqlite0-dev_2.8.17-7_i386
+libsqlite3-dev_3.7.13-1+deb7u1_i386
+libsqlite3-ocaml-dev_1.6.1-1+b1_i386
+libsquizz-dev_0.99a-2_i386
+libsratom-dev_0.2.0~dfsg0-1_i386
+libsrecord-dev_1.58-1+b1_i386
+libsrf-dev_0.1+dfsg-1_i386
+libsrtp0-dev_1.4.4+20100615~dfsg-2+deb7u1_i386
+libss7-dev_1.0.2-3_i386
+libsscm-dev_0.8.5-2.1_i386
+libssh-dev_0.5.4-1+deb7u1_i386
+libssh2-1-dev_1.4.2-1.1_i386
+libssl-dev_1.0.1e-2+deb7u7_i386
+libssl-ocaml-dev_0.4.6-1_i386
+libsslcommon2-dev_0.16-6+deb7u1_i386
+libssreflect-ocaml-dev_1.3pl4-1_i386
+libsss-sudo-dev_1.8.4-2_i386
+libst-dev_1.9-3_i386
+libstaden-read-dev_1.12.4-1_i386
+libstarlink-ast-dev_7.0.4+dfsg-1_i386
+libstarlink-pal-dev_0.1.0-1_i386
+libstarpu-dev_1.0.1+dfsg-1_i386
+libstartup-notification0-dev_0.12-1_i386
+libstatgrab-dev_0.17-1_i386
+libstdc++6-4.4-dev_4.4.7-2_i386
+libstdc++6-4.6-dev_4.6.3-14_i386
+libstdc++6-4.7-dev_4.7.2-5_i386
+libstemmer-dev_0+svn546-2_i386
+libsteptalk-dev_0.10.0-5+b1_i386
+libstfl-dev_0.22-1+b1_i386
+libstk0-dev_4.4.3-2_i386
+libstlport4.6-dev_4.6.2-7_i386
+libstonith1-dev_1.0.9+hg2665-1_i386
+libstonithd1-dev_1.1.7-1_i386
+libstreamanalyzer-dev_0.7.7-3_i386
+libstreams-dev_0.7.7-3_i386
+libstrigihtmlgui-dev_0.7.7-3_i386
+libstrigiqtdbusclient-dev_0.7.7-3_i386
+libstroke0-dev_0.5.1-6_i386
+libstxxl-dev_1.3.1-4_i386
+libsublime-dev_1.3.1-2_i386
+libsubtitleeditor-dev_0.33.0-1_i386
+libsubunit-dev_0.0.8+bzr176-1_i386
+libsugarext-dev_0.96.1-2_i386
+libsuil-dev_0.6.4~dfsg0-3_i386
+libsuitesparse-dev_1:3.4.0-3_i386
+libsundials-serial-dev_2.5.0-3_i386
+libsunpinyin-dev_2.0.3+git20120607-1_i386
+libsuperlu3-dev_3.0+20070106-3_i386
+libsvga1-dev_1:1.4.3-33_i386
+libsvm-dev_3.12-1_i386
+libsvn-dev_1.6.17dfsg-4+deb7u6_i386
+libsvncpp-dev_0.12.0dfsg-6_i386
+libsvnqt-dev_1.5.5-4.1_i386
+libsvrcore-dev_1:4.0.4-15_i386
+libswami-dev_2.0.0+svn389-2_i386
+libswe-dev_1.77.00.0005-2_i386
+libswiften-dev_2.0~beta1+dev47-1_i386
+libsword-dev_1.6.2+dfsg-5_i386
+libswscale-dev_6:0.8.10-1_i386
+libsx-dev_2.05-3_i386
+libsyfi1.0-dev_1.0.0.dfsg-1_i386
+libsylph-dev_1.1.0-8_i386
+libsymmetrica-dev_2.0-1_i386
+libsynce0-dev_0.15-1.1_i386
+libsyncml-dev_0.5.4-2.1_i386
+libsynfig-dev_0.63.05-1_i386
+libsynopsis0.12-dev_0.12-8_i386
+libsynthesis-dev_3.4.0.16.7-1_i386
+libsysactivity-dev_0.6.4-1_i386
+libsysfs-dev_2.1.0+repack-2_i386
+libsyslog-ng-dev_3.3.5-4_i386
+libsyslog-ocaml-dev_1.4-6+b2_i386
+libsystemd-daemon-dev_44-11+deb7u4_i386
+libsystemd-id128-dev_44-11+deb7u4_i386
+libsystemd-journal-dev_44-11+deb7u4_i386
+libsystemd-login-dev_44-11+deb7u4_i386
+libt1-dev_5.1.2-3.6_i386
+libtacacs+1-dev_4.0.4.19-11_all
+libtachyon-dev_0.99~b2+dfsg-0.4_i386
+libtag-extras-dev_1.0.1-3_i386
+libtag1-dev_1.7.2-1_i386
+libtagc0-dev_1.7.2-1_i386
+libtagcoll2-dev_2.0.13-1.1_i386
+libtaglib-cil-dev_2.0.4.0-1_all
+libtaglib-ocaml-dev_0.2.0-1+b1_i386
+libtaktuk-1-dev_3.7.4-1_i386
+libtalloc-dev_2.0.7+git20120207-1_i386
+libtamuanova-dev_0.2-2_i386
+libtango7-dev_7.2.6+dfsg-14_i386
+libtaningia-dev_0.2.2-1_i386
+libtaoframework-devil-cil-dev_2.1.svn20090801-9_all
+libtaoframework-ffmpeg-cil-dev_2.1.svn20090801-9_all
+libtaoframework-freeglut-cil-dev_2.1.svn20090801-9_all
+libtaoframework-freetype-cil-dev_2.1.svn20090801-9_all
+libtaoframework-ftgl-cil-dev_2.1.svn20090801-9_all
+libtaoframework-lua-cil-dev_2.1.svn20090801-9_all
+libtaoframework-ode-cil-dev_2.1.svn20090801-9_all
+libtaoframework-openal-cil-dev_2.1.svn20090801-9_all
+libtaoframework-opengl-cil-dev_2.1.svn20090801-9_all
+libtaoframework-physfs-cil-dev_2.1.svn20090801-9_all
+libtaoframework-sdl-cil-dev_2.1.svn20090801-9_all
+libtar-dev_1.2.16-1+deb7u2_i386
+libtarantool-dev_1.4.6+20120629+2158-1_i386
+libtasn1-3-dev_2.13-2_i386
+libtbb-dev_4.0+r233-1_i386
+libtcc-dev_0.9.26~git20120612.ad5f375-6_i386
+libtcd-dev_2.2.2-1_i386
+libtclap-dev_1.2.1-1_i386
+libtclcl1-dev_1.20-6_i386
+libtdb-dev_1.2.10-2_i386
+libtecla1-dev_1.6.1-5_i386
+libteem-dev_1.11.0~svn5226-1_i386
+libtelepathy-farstream-dev_0.4.0-3_i386
+libtelepathy-glib-dev_0.18.2-2_i386
+libtelepathy-logger-dev_0.4.0-1_i386
+libtelepathy-logger-qt4-dev_0.4.0-1_i386
+libtelepathy-qt4-dev_0.9.1-4_i386
+libtelnet-dev_0.21-1_i386
+libtemplates-parser11.6-dev_11.6-2_i386
+libterralib-dev_4.0.0-4_i386
+libtesseract-dev_3.02.01-6_i386
+libtevent-dev_0.9.16-1_i386
+libtext-ocaml-dev_0.5-1+b2_i386
+libtextwrap-dev_0.1-13_i386
+libthai-dev_0.1.18-2_i386
+libtheora-dev_1.1.1+dfsg.1-3.1_i386
+libtheora-ocaml-dev_0.3.0-1+b3_i386
+libthepeg-dev_1.8.0-1_i386
+libthrust-dev_1.6.0-1_all
+libthunar-vfs-1-dev_1.2.0-3+b1_i386
+libthunarx-2-dev_1.2.3-4+b1_i386
+libticables-dev_1.2.0-2_i386
+libticalcs-dev_1.1.3+dfsg1-1_i386
+libticonv-dev_1.1.0-1.1_i386
+libtidy-dev_20091223cvs-1.2_i386
+libtiff4-dev_3.9.6-11_i386
+libtiff5-alt-dev_4.0.2-6+deb7u2_i386
+libtiff5-dev_4.0.2-6+deb7u2_i386
+libtifiles-dev_1.1.1-1_i386
+libtimbl3-dev_6.4.2-1_i386
+libtimblserver2-dev_1.4-2_i386
+libtinfo-dev_5.9-10_i386
+libtinyxml-dev_2.6.2-1_i386
+libtinyxml2-dev_0~git20120518.1.a2ae54e-1_i386
+libtirpc-dev_0.2.2-5_i386
+libtk-img-dev_1:1.3-release-12_i386
+libtnt-dev_1.2.6-1_all
+libtntdb-dev_1.2-2+b1_i386
+libtntnet-dev_2.1-2+deb7u1_i386
+libtododb-dev_0.11-3_i386
+libtogl-dev_1.7-12_all
+libtokyocabinet-dev_1.4.47-2_i386
+libtokyotyrant-dev_1.1.40-4.1+b1_i386
+libtolua++5.1-dev_1.0.93-3_i386
+libtolua-dev_5.2.0-1_i386
+libtomcrypt-dev_1.17-3.2_i386
+libtommath-dev_0.42.0-1_i386
+libtomoe-dev_0.6.0-1.3_i386
+libtonezone-dev_1:2.5.0.1-2_i386
+libtophide-ocaml-dev_1.0.0-3_all
+libtorch3-dev_3.1-2.1_i386
+libtorque2-dev_2.4.16+dfsg-1+deb7u2_i386
+libtorrent-dev_0.13.2-1_i386
+libtorrent-rasterbar-dev_0.15.10-1+b1_i386
+libtorture-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libtotem-dev_3.0.1-8_i386
+libtotem-pg-dev_1.4.2-3_i386
+libtotem-plparser-dev_3.4.2-1_i386
+libtowitoko-dev_2.0.7-8.3_i386
+libtpl-dev_1.5-2_all
+libtpm-unseal-dev_1.3.7-1_i386
+libtrace3-dev_3.0.14-1_i386
+libtracker-extract-0.14-dev_0.14.1-3_i386
+libtracker-miner-0.14-dev_0.14.1-3_i386
+libtracker-sparql-0.14-dev_0.14.1-3_i386
+libtransitioner1-dev_1.1.7-1_i386
+libtre-dev_0.8.0-3_i386
+libtreil-dev_1.8-1.1_i386
+libts-dev_1.0-11_i386
+libtse3-dev_0.3.1-4.3_i386
+libtsk-dev_3.2.3-2_i386
+libtspi-dev_0.3.9-3+wheezy1_i386
+libtulip-dev_3.7.0dfsg-4_i386
+libtumbler-1-dev_0.1.25-1+b1_i386
+libtut-dev_0.0.20070706-1_all
+libtuxcap-dev_1.4.0.dfsg2-2.1_i386
+libtwin-dev_12.04.13.17.57-g130ee5f-2_i386
+libtwofish-dev_0.3-3_i386
+libtwolame-dev_0.3.13-1_i386
+libtxc-dxtn-s2tc-dev_0~git20110809-3_i386
+libtype-conv-camlp4-dev_3.0.4-1_i386
+libtyxml-ocaml-dev_2.1-1_i386
+libuchardet-dev_0.0.1-1_i386
+libucimf-dev_2.3.8-4_i386
+libucl-dev_1.03-5_i386
+libuclmmbase1-dev_1.2.16.0-1_i386
+libucommon-dev_5.2.2-4_i386
+libucto1-dev_0.5.2-2_i386
+libudev-dev_175-7.2_i386
+libudf-dev_0.83-4_i386
+libudt-dev_4.10+dfsg-1_i386
+libudunits2-dev_2.1.23-3_i386
+libuhd-dev_3.4.2-1_i386
+libuim-dev_1:1.8.1-4_i386
+libumlib-dev_0.8.2-1_i386
+libunac1-dev_1.8.0-6_i386
+libunbound-dev_1.4.17-3_i386
+libunicap2-dev_0.9.12-2_i386
+libuninameslist-dev_0.0.20091231-1.1_i386
+libuninum-dev_2.7-1.1_i386
+libunique-3.0-dev_3.0.2-1_i386
+libunique-dev_1.1.6-4_i386
+libunistring-dev_0.9.3-5_i386
+libunittest++-dev_1.4.0-3_i386
+libunshield-dev_0.6-3_i386
+libunwind-setjmp0-dev_0.99-0.3_i386
+libunwind7-dev_0.99-0.3_i386
+libupnp-dev_1:1.6.17-1.2_all
+libupnp4-dev_1.8.0~svn20100507-1.2_i386
+libupnp6-dev_1:1.6.17-1.2_i386
+libupower-glib-dev_0.9.17-1_i386
+libupsclient1-dev_2.6.4-2.3+deb7u1_i386
+libupse-dev_1.0.0-1_i386
+libuptimed-dev_1:0.3.17-3.1_i386
+liburcu-dev_0.6.7-2_i386
+liburfkill-glib-dev_0.3.0-1_i386
+liburg0-dev_0.8.12-4_i386
+liburiparser-dev_0.7.5-1_i386
+libusb++-dev_2:0.1.12-20+nmu1_i386
+libusb-1.0-0-dev_2:1.0.11-1_i386
+libusb-dev_2:0.1.12-20+nmu1_i386
+libusb-ocaml-dev_1.2.0-2+b7_i386
+libusbip-dev_1.1.1+3.2.17-1_i386
+libusbmuxd-dev_1.0.7-2_i386
+libusbprog-dev_0.2.0-2_i386
+libusbredirhost-dev_0.4.3-2_i386
+libusbredirparser-dev_0.4.3-2_i386
+libusbtc08-dev_1.7.2-1_i386
+libuser1-dev_1:0.56.9.dfsg.1-1.2_i386
+libust-dev_2.0.4-1_i386
+libustr-dev_1.0.4-3_i386
+libutempter-dev_1.1.5-4_i386
+libuu-dev_0.5.20-3.3_i386
+libuuidm-ocaml-dev_0.9.4-1_i386
+libv4l-dev_0.8.8-3_i386
+libv8-dev_3.8.9.20-2_i386
+libv8-i18n-dev_0~0.svn7-3_i386
+libva-dev_1.0.15-4_i386
+libvala-0.14-dev_0.14.2-2_i386
+libvala-0.16-dev_0.16.1-2_i386
+libvaladoc-dev_0.3.2~git20120227-1_i386
+libvalhalla-dev_2.0.0-4+b1_i386
+libvanessa-adt-dev_0.0.9-1_i386
+libvanessa-logger-dev_0.0.10-1.1_i386
+libvanessa-socket-dev_0.0.12-1_i386
+libvarconf-dev_0.6.7-2_i386
+libvarnishapi-dev_3.0.2-2+deb7u1_i386
+libvbr-dev_2.6.8-4_i386
+libvc-dev_003.dfsg.1-12_i386
+libvcdinfo-dev_0.7.24+dfsg-0.1_i386
+libvde-dev_2.3.2-4_i386
+libvdeplug-dev_2.3.2-4_i386
+libvdk2-dev_2.4.0-5.3_i386
+libvdkbuilder2-dev_2.4.0-4.3_i386
+libvdkxdb2-dev_2.4.0-3.4_i386
+libvdpau-dev_0.4.1-7_i386
+libventrilo-dev_1.2.4-1_i386
+libverbiste-dev_0.1.34-1_i386
+libverto-dev_0.2.2-1_i386
+libvformat-dev_1.13-10_i386
+libvia-dev_2.0.4-2_i386
+libvibrant6-dev_6.1.20120620-2_i386
+libview-dev_0.6.6-2.1_i386
+libvigraimpex-dev_1.7.1+dfsg1-3_i386
+libvips-dev_7.28.5-1+deb7u1_i386
+libvirt-dev_0.9.12.3-1_i386
+libvirt-glib-1.0-dev_0.0.8-1_i386
+libvirt-ocaml-dev_0.6.1.2-1_i386
+libvisca-dev_1.0.1-1_i386
+libvisio-dev_0.0.17-1_i386
+libvisual-0.4-dev_0.4.0-5_i386
+libvlc-dev_2.0.3-5_i386
+libvlccore-dev_2.0.3-5_i386
+libvmmlib-dev_1.0-2_all
+libvncserver-dev_0.9.9+dfsg-1_i386
+libvo-aacenc-dev_0.1.2-1_i386
+libvo-amrwbenc-dev_0.1.2-1_i386
+libvoaacenc-ocaml-dev_0.1.0-1+b1_i386
+libvoikko-dev_3.5-1.1_i386
+libvolpack1-dev_1.0b3-3_i386
+libvorbis-dev_1.3.2-1.3_i386
+libvorbis-ocaml-dev_0.6.1-1+b1_i386
+libvorbisidec-dev_1.0.2+svn18153-0.2_i386
+libvotequorum-dev_1.4.2-3_i386
+libvpb-dev_4.2.55-1_i386
+libvpx-dev_1.1.0-1_i386
+libvrb0-dev_0.5.1-5.1_i386
+libvte-2.90-dev_1:0.32.2-1_i386
+libvte-dev_1:0.28.2-5_i386
+libvte0.16-cil-dev_2.26.0-8_i386
+libvtk5-dev_5.8.0-13+b1_i386
+libvtk5-qt4-dev_5.8.0-13+b1_i386
+libvtkedge-dev_0.2.0~20110819-2_i386
+libvtkgdcm2-dev_2.2.0-14.1_i386
+libvxl1-dev_1.14.0-18_i386
+libwacom-dev_0.6-1_i386
+libwaei-dev_3.4.3-1_i386
+libwaili-dev_19990723-20_i386
+libwavefront-standalone3.0-dev_3.0.2+dfsg-4+b1_i386
+libwavpack-dev_4.60.1-3_i386
+libwayland-dev_0.85.0-2_i386
+libwbclient-dev_2:3.6.6-6+deb7u3_i386
+libwbxml2-dev_0.10.7-1_i386
+libwcstools-dev_3.8.5-1_i386
+libwebauth-dev_4.1.1-2_i386
+libwebcam0-dev_0.2.2-1_i386
+libwebkit-cil-dev_0.3-6_all
+libwebkit-dev_1.8.1-3.4_i386
+libwebkitgtk-3.0-dev_1.8.1-3.4_i386
+libwebkitgtk-dev_1.8.1-3.4_i386
+libwebp-dev_0.1.3-3+nmu1_i386
+libwebrtc-audio-processing-dev_0.1-2_i386
+libweed-dev_1.6.2~ds1-2_i386
+libwfmath-0.3-dev_0.3.12-3_i386
+libwfut-0.2-dev_0.2.1-2_i386
+libwibble-dev_0.1.28-1.1_i386
+libwildmidi-dev_0.2.3.4-2.1_i386
+libwine-dev_1.4.1-4_i386
+libwings-dev_0.95.3-2_i386
+libwireshark-dev_1.8.2-5wheezy10_i386
+libwiretap-dev_1.8.2-5wheezy10_i386
+libwmf-dev_0.2.8.4-10.3_i386
+libwnck-3-dev_3.4.2-1_i386
+libwnck-dev_2.30.7-1_i386
+libwnck1.0-cil-dev_2.26.0-8_i386
+libwnn-dev_1.1.1~a021+cvs20100325-6_i386
+libwnn6-dev_1.0.0-14.2+b1_i386
+libwpd-dev_0.9.4-3_i386
+libwpg-dev_0.2.1-1_i386
+libwps-dev_0.2.7-1_i386
+libwrap0-dev_7.6.q-24_i386
+libwraster3-dev_0.95.3-2_i386
+libwreport-dev_2.4-1_i386
+libwsutil-dev_1.8.2-5wheezy10_i386
+libwt-dev_3.2.1-2_i386
+libwtdbo-dev_3.2.1-2_i386
+libwtdbofirebird-dev_3.2.1-2_i386
+libwtdbopostgres-dev_3.2.1-2_i386
+libwtdbosqlite-dev_3.2.1-2_i386
+libwtext-dev_3.2.1-2_i386
+libwtfcgi-dev_3.2.1-2_i386
+libwthttp-dev_3.2.1-2_i386
+libwttest-dev_3.2.1-2_i386
+libwv-dev_1.2.9-3_i386
+libwv2-dev_0.4.2.dfsg.2-1~deb7u1_i386
+libwvstreams-dev_4.6.1-5_i386
+libwxbase2.8-dev_2.8.12.1-12_i386
+libwxgtk2.8-dev_2.8.12.1-12_i386
+libwxsmithlib-dev_10.05-2.1_i386
+libwxsmithlib0-dev_10.05-2.1_i386
+libwxsqlite3-2.8-dev_3.0.0.1~dfsg0-2_i386
+libwxsvg-dev_2:1.1.8~dfsg0-2_i386
+libx11-dev_2:1.5.0-1+deb7u1_i386
+libx11-xcb-dev_2:1.5.0-1+deb7u1_i386
+libx264-dev_2:0.123.2189+git35cf912-1_i386
+libx52pro-dev_0.1.1-2.1_i386
+libx86-dev_1.1+ds1-10_i386
+libxalan110-dev_1.10-6_i386
+libxapian-dev_1.2.12-2_i386
+libxatracker-dev_8.0.5-4+deb7u2_i386
+libxau-dev_1:1.0.7-1_i386
+libxaw7-dev_2:1.0.10-2_i386
+libxbae-dev_4.60.4-3_i386
+libxbase2.0-dev_2.0.0-8.5_i386
+libxcb-composite0-dev_1.8.1-2+deb7u1_i386
+libxcb-damage0-dev_1.8.1-2+deb7u1_i386
+libxcb-dpms0-dev_1.8.1-2+deb7u1_i386
+libxcb-dri2-0-dev_1.8.1-2+deb7u1_i386
+libxcb-ewmh-dev_0.3.9-2_i386
+libxcb-glx0-dev_1.8.1-2+deb7u1_i386
+libxcb-icccm4-dev_0.3.9-2_i386
+libxcb-image0-dev_0.3.9-1_i386
+libxcb-keysyms1-dev_0.3.9-1_i386
+libxcb-randr0-dev_1.8.1-2+deb7u1_i386
+libxcb-record0-dev_1.8.1-2+deb7u1_i386
+libxcb-render-util0-dev_0.3.8-1.1_i386
+libxcb-render0-dev_1.8.1-2+deb7u1_i386
+libxcb-res0-dev_1.8.1-2+deb7u1_i386
+libxcb-screensaver0-dev_1.8.1-2+deb7u1_i386
+libxcb-shape0-dev_1.8.1-2+deb7u1_i386
+libxcb-shm0-dev_1.8.1-2+deb7u1_i386
+libxcb-sync0-dev_1.8.1-2+deb7u1_i386
+libxcb-util0-dev_0.3.8-2_i386
+libxcb-xevie0-dev_1.8.1-2+deb7u1_i386
+libxcb-xf86dri0-dev_1.8.1-2+deb7u1_i386
+libxcb-xfixes0-dev_1.8.1-2+deb7u1_i386
+libxcb-xinerama0-dev_1.8.1-2+deb7u1_i386
+libxcb-xprint0-dev_1.8.1-2+deb7u1_i386
+libxcb-xtest0-dev_1.8.1-2+deb7u1_i386
+libxcb-xv0-dev_1.8.1-2+deb7u1_i386
+libxcb-xvmc0-dev_1.8.1-2+deb7u1_i386
+libxcb1-dev_1.8.1-2+deb7u1_i386
+libxcomp-dev_3.5.0.12-1+b1_i386
+libxcomposite-dev_1:0.4.3-2_i386
+libxcp-ocaml-dev_0.5.2-3+b1_i386
+libxcrypt-dev_1:2.4-3_i386
+libxcursor-dev_1:1.1.13-1+deb7u1_i386
+libxdamage-dev_1:1.1.3-2_i386
+libxdb-dev_1.2.0-7.2_i386
+libxdelta2-dev_1.1.3-9_i386
+libxdffileio-dev_0.3-1_i386
+libxdg-basedir-dev_1.1.1-2_i386
+libxdmcp-dev_1:1.1.1-1_i386
+libxdmf-dev_2.1.dfsg.1-5_i386
+libxdo-dev_1:2.20100701.2961-3+deb7u3_i386
+libxen-dev_4.1.4-3+deb7u1_i386
+libxen-ocaml-dev_4.1.4-3+deb7u1_i386
+libxenapi-ocaml-dev_1.3.2-15_i386
+libxenomai-dev_2.6.0-2_i386
+libxerces-c-dev_3.1.1-3_i386
+libxerces-c2-dev_2.8.0+deb1-3_i386
+libxext-dev_2:1.3.1-2+deb7u1_i386
+libxfce4menu-0.1-dev_4.6.2-1_i386
+libxfce4ui-1-dev_4.8.1-1_i386
+libxfce4util-dev_4.8.2-1_i386
+libxfcegui4-dev_4.8.1-5_i386
+libxfconf-0-dev_4.8.1-1_i386
+libxfixes-dev_1:5.0-4+deb7u1_i386
+libxfont-dev_1:1.4.5-3_i386
+libxft-dev_2.3.1-1_i386
+libxi-dev_2:1.6.1-1+deb7u1_i386
+libxine-dev_1.1.21-1+deb7u1_i386
+libxine2-dev_1.2.2-5_i386
+libxinerama-dev_2:1.1.2-1+deb7u1_i386
+libxkbfile-dev_1:1.0.8-1_i386
+libxklavier-dev_5.2.1-1_i386
+libxml++2.6-dev_2.34.2-1_i386
+libxml-light-ocaml-dev_2.2-15_i386
+libxml-security-c-dev_1.6.1-5+deb7u2_i386
+libxml2-dev_2.8.0+dfsg1-7+nmu3_i386
+libxmlada4.1-dev_4.1-2_i386
+libxmlezout2-dev_1.06.1-5_i386
+libxmlm-ocaml-dev_1.1.0-1_i386
+libxmlplaylist-ocaml-dev_0.1.3-1+b2_i386
+libxmlrpc-c++4-dev_1.16.33-3.2_i386
+libxmlrpc-c3-dev_1.16.33-3.2_all
+libxmlrpc-core-c3-dev_1.16.33-3.2_i386
+libxmlrpc-epi-dev_0.54.2-1_i386
+libxmlrpc-light-ocaml-dev_0.6.1-3+b5_i386
+libxmlsec1-dev_1.2.18-2_i386
+libxmltok1-dev_1.2-3_i386
+libxmltooling-dev_1.4.2-5_i386
+libxmmsclient++-dev_0.8+dfsg-4_i386
+libxmmsclient++-glib-dev_0.8+dfsg-4_i386
+libxmmsclient-dev_0.8+dfsg-4_i386
+libxmmsclient-glib-dev_0.8+dfsg-4_i386
+libxmpi4-dev_2.2.3b8-13_i386
+libxmu-dev_2:1.1.1-1_i386
+libxmuu-dev_2:1.1.1-1_i386
+libxnee-dev_3.13-1_i386
+libxneur-dev_0.15.0-1.1_i386
+libxosd-dev_2.2.14-2_i386
+libxp-dev_1:1.0.1-2+deb7u1_i386
+libxpa-dev_2.1.14-2_i386
+libxplc0.3.13-dev_0.3.13-3_i386
+libxpm-dev_1:3.5.10-1_i386
+libxqdbm-dev_1.8.78-2_i386
+libxqilla-dev_2.3.0-1_i386
+libxr1-dev_1.0-2.1_i386
+libxrandr-dev_2:1.3.2-2+deb7u1_i386
+libxrender-dev_1:0.9.7-1+deb7u1_i386
+libxres-dev_2:1.0.6-1+deb7u1_i386
+libxsettings-client-dev_0.17-6_i386
+libxsettings-dev_0.11-3_i386
+libxslt1-dev_1.1.26-14.1_i386
+libxss-dev_1:1.2.2-1_i386
+libxstr-ocaml-dev_0.2.1-21+b3_i386
+libxstrp4-camlp4-dev_1.8-3_all
+libxt-dev_1:1.1.3-1+deb7u1_i386
+libxtst-dev_2:1.2.1-1+deb7u1_i386
+libxv-dev_2:1.0.7-1+deb7u1_i386
+libxvidcore-dev_2:1.3.2-9_i386
+libxvmc-dev_2:1.0.7-1+deb7u2_i386
+libxxf86dga-dev_2:1.1.3-2+deb7u1_i386
+libxxf86vm-dev_1:1.1.2-1+deb7u1_i386
+libxy-dev_0.8-1+b1_i386
+libyahoo2-dev_1.0.1-1_i386
+libyajl-dev_2.0.4-2_i386
+libyaml-cpp-dev_0.3.0-1_i386
+libyaml-dev_0.1.4-2+deb7u4_i386
+libyaz4-dev_4.2.30-2_i386
+libyelp-dev_3.4.2-1+b1_i386
+libygl4-dev_4.2e-4_i386
+libykclient-dev_2.6-1_i386
+libykpers-1-dev_1.7.0-1_i386
+libyojson-ocaml-dev_1.0.3-1_i386
+libytnef0-dev_1.5-4_i386
+libyubikey-dev_1.8-1_i386
+libz80ex-dev_1.1.19-3_i386
+libzarith-ocaml-dev_1.1-2_i386
+libzbar-dev_0.10+doc-8_i386
+libzbargtk-dev_0.10+doc-8_i386
+libzbarqt-dev_0.10+doc-8_i386
+libzeep-dev_2.9.0-2_i386
+libzeitgeist-cil-dev_0.8.0.0-4_all
+libzeitgeist-dev_0.3.18-1_i386
+libzen-dev_0.4.27-2_i386
+libzephyr-dev_3.0.2-2_i386
+libzerg0-dev_1.0.7-3_i386
+libzeroc-ice34-dev_3.4.2-8.2_i386
+libzinnia-dev_0.06-1+b1_i386
+libzip-dev_0.10.1-1.1_i386
+libzip-ocaml-dev_1.04-6+b3_i386
+libzipios++-dev_0.1.5.9+cvs.2007.04.28-5.1_i386
+libzita-alsa-pcmi-dev_0.2.0-1_i386
+libzita-convolver-dev_3.1.0-2_i386
+libzita-resampler-dev_1.1.0-3_i386
+libzlcore-dev_0.12.10dfsg-8_i386
+libzltext-dev_0.12.10dfsg-8_i386
+libzmq-dev_2.2.0+dfsg-2_i386
+libzn-poly-dev_0.8-1.1_i386
+libzookeeper-mt-dev_3.3.5+dfsg1-2_i386
+libzookeeper-st-dev_3.3.5+dfsg1-2_i386
+libzorp-dev_3.9.5-4_i386
+libzorpll-dev_3.9.1.3-1_i386
+libzrtpcpp-dev_2.0.0-3_i386
+libzthread-dev_2.3.2-7_i386
+libzvbi-dev_0.2.33-6_i386
+libzzip-dev_0.13.56-1.1_i386
+licq-dev_1.6.1-3_all
+linux-libc-dev_3.2.57-3_i386
+lldpad-dev_0.9.44-1_i386
+llvm-2.9-dev_2.9+dfsg-7_i386
+llvm-3.0-dev_3.0-10_i386
+llvm-3.1-dev_3.1-1_i386
+llvm-dev_1:3.0-14+nmu2_i386
+lttv-dev_0.12.38-21032011-1+b1_i386
+lua-apr-dev_0.23.2-1_i386
+lua-bitop-dev_1.0.2-1_i386
+lua-curl-dev_0.3.0-7_i386
+lua-curses-dev_5.1.19-2_i386
+lua-cyrussasl-dev_1.0.0-4_i386
+lua-dbi-mysql-dev_0.5+svn78-4_i386
+lua-dbi-postgresql-dev_0.5+svn78-4_i386
+lua-dbi-sqlite3-dev_0.5+svn78-4_i386
+lua-event-dev_0.4.1-2_i386
+lua-expat-dev_1.2.0-5+deb7u1_i386
+lua-filesystem-dev_1.5.0+16+g84f1af5-1_i386
+lua-iconv-dev_7-1_i386
+lua-ldap-dev_1.1.0-1-geeac494-3_i386
+lua-leg-dev_0.1.2-8_all
+lua-lgi-dev_0.6.2-1_i386
+lua-lpeg-dev_0.10.2-5_i386
+lua-md5-dev_1.1.2-6_i386
+lua-penlight-dev_1.0.2+htmldoc-2_all
+lua-posix-dev_5.1.19-2_i386
+lua-rex-onig-dev_2.6.0-2_i386
+lua-rex-pcre-dev_2.6.0-2_i386
+lua-rex-posix-dev_2.6.0-2_i386
+lua-rex-tre-dev_2.6.0-2_i386
+lua-rings-dev_1.2.3-1_i386
+lua-sec-dev_0.4.1-1_i386
+lua-socket-dev_2.0.2-8_i386
+lua-sql-mysql-dev_2.3.0-1+build0_i386
+lua-sql-postgres-dev_2.3.0-1+build0_i386
+lua-sql-sqlite3-dev_2.3.0-1+build0_i386
+lua-svn-dev_0.4.0-7_i386
+lua-wsapi-fcgi-dev_1.5-3_i386
+lua-zip-dev_1.2.3-11_i386
+lua-zlib-dev_0.2-1_i386
+lua5.1-policy-dev_33_all
+lv2-dev_1.0.0~dfsg2-2_i386
+lxc-dev_0.8.0~rc1-8+deb7u2_i386
+lzma-dev_9.22-2_all
+manpages-de-dev_1.2-1_all
+manpages-dev_3.44-1_all
+manpages-fr-dev_3.44d1p1-1_all
+manpages-ja-dev_0.5.0.0.20120606-1_all
+manpages-pl-dev_1:0.3-1_all
+manpages-pt-dev_20040726-4_all
+matlab-support-dev_0.0.18_all
+mdbtools-dev_0.7-1+deb7u1_i386
+med-bio-dev_1.13.2_all
+med-imaging-dev_1.13.2_all
+mesa-common-dev_8.0.5-4+deb7u2_i386
+mffm-fftw-dev_1.7-3_i386
+mffm-timecode-dev_1.6-2_all
+mingw-w64-dev_2.0.3-1_all
+mingw-w64-i686-dev_2.0.3-1_all
+mingw-w64-x86-64-dev_2.0.3-1_all
+minpack-dev_19961126+dfsg1-1_i386
+mongodb-dev_1:2.0.6-1.1_i386
+mpi-default-dev_1.0.1_i386
+muroard-dev_0.1.10-2_i386
+neko-dev_1.8.1-6_all
+nettle-dev_2.4-3_i386
+network-manager-dev_0.9.4.0-10_i386
+ntfs-3g-dev_1:2012.1.15AR.5-2.1_i386
+ocfs2-tools-dev_1.6.4-1+deb7u1_i386
+ocl-icd-dev_1.3-3_i386
+ocl-icd-opencl-dev_1.3-3_i386
+ocsigen-dev_1.3.4-2_all
+octave-pkg-dev_1.0.2_all
+ofono-dev_1.6-2_all
+okteta-dev_4:4.8.4+dfsg-1_i386
+okular-dev_4:4.8.4-3_i386
+open-vm-tools-dev_2:8.8.0+2012.05.21-724730-1+nmu2_all
+openais-dev_1.1.4-4.1_i386
+openbox-dev_3.5.0-7_i386
+openchangeserver-dev_1:1.0-3_i386
+oss4-dev_4.2-build2006-2+deb7u1_all
+pacemaker-dev_1.1.7-1_i386
+packaging-dev_0.4_all
+paraview-dev_3.14.1-6_i386
+parole-dev_0.2.0.6-1+b1_i386
+parser3-dev_3.4.2-2_i386
+pbs-drmaa-dev_1.0.10-3_i386
+petsc-dev_3.2.dfsg-6_all
+php5-dev_5.4.4-14+deb7u9_i386
+pidgin-dev_2.10.9-1~deb7u1_all
+pinball-dev_0.3.1-13.1_i386
+planetpenguin-racer-gimp-dev_0.4-5_all
+planner-dev_0.14.6-1_i386
+plplot-tcl-dev_5.9.9-5_i386
+plptools-dev_1.0.9-2.4_i386
+plymouth-dev_0.8.5.1-5_i386
+portaudio19-dev_19+svn20111121-1_i386
+postfix-dev_2.9.6-2_all
+ppl-dev_0.11.2-8_i386
+ppp-dev_2.4.5-5.1_all
+prayer-templates-dev_1.3.4-dfsg1-1_i386
+proftpd-dev_1.3.4a-5+deb7u1_i386
+pslib-dev_0.4.5-3_i386
+publib-dev_0.40-1_i386
+puredata-dev_0.43.2-5_all
+pvm-dev_3.4.5-12.5_i386
+pxlib-dev_0.6.5-1_i386
+python-all-dev_2.7.3-4+deb7u1_all
+python-apt-dev_0.8.8.2_all
+python-cairo-dev_1.8.8-1_all
+python-cxx-dev_6.2.4-3_all
+python-dbus-dev_1.1.1-1_all
+python-dev_2.7.3-4+deb7u1_all
+python-egenix-mx-base-dev_3.2.1-1.1_all
+python-gamera-dev_3.3.3-2_all
+python-gi-dev_3.2.2-2_all
+python-gnome2-desktop-dev_2.32.0+dfsg-2_all
+python-gnome2-dev_2.28.1+dfsg-1_all
+python-gnome2-extras-dev_2.25.3-12_all
+python-gobject-2-dev_2.28.6-10_all
+python-gobject-dev_3.2.2-2_all
+python-greenlet-dev_0.3.1-2.5_i386
+python-gst0.10-dev_0.10.22-3_i386
+python-gtk2-dev_2.24.0-3_all
+python-kde4-dev_4:4.8.4-1_all
+python-ldb-dev_1:1.1.6-1_i386
+python-openturns-dev_1.0-4_i386
+python-pyorbit-dev_2.24.0-6_all
+python-qt4-dev_4.9.3-4_all
+python-sip-dev_4.13.3-2_i386
+python-talloc-dev_2.0.7+git20120207-1_i386
+python-webkit-dev_1.1.8-2_all
+python2.6-dev_2.6.8-1.1_i386
+python2.7-dev_2.7.3-6+deb7u2_i386
+python3-all-dev_3.2.3-6_all
+python3-cairo-dev_1.10.0+dfsg-2_all
+python3-cxx-dev_6.2.4-3_all
+python3-dev_3.2.3-6_all
+python3-sip-dev_4.13.3-2_i386
+python3.2-dev_3.2.3-7_i386
+qmf-dev_1.0.7~2011w23.2-2.1_i386
+qtmobility-dev_1.2.0-3_i386
+r-base-dev_2.15.1-4_all
+regina-normal-dev_4.93-1_i386
+resource-agents-dev_1:3.9.2-5+deb7u2_i386
+rhythmbox-dev_2.97-2.1_i386
+rivet-plugins-dev_1.8.0-1_all
+roarplaylistd-dev_0.1.1-2_all
+robot-player-dev_3.0.2+dfsg-4_all
+ruby-dev_1:1.9.3_all
+ruby-gnome2-dev_1.1.3-2+b1_i386
+ruby1.8-dev_1.8.7.358-7.1+deb7u1_i386
+ruby1.9.1-dev_1.9.3.194-8.1+deb7u2_i386
+rygel-1.0-dev_0.14.3-2+deb7u1_i386
+samba4-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+sbnc-php-dev_1.2-26_all
+science-astronomy-dev_1.0_all
+science-dataacquisition-dev_1.0_all
+science-engineering-dev_1.0_all
+science-highenergy-physics-dev_1.0_all
+science-mathematics-dev_1.0_all
+science-meteorology-dev_1.0_all
+science-nanoscale-physics-dev_1.0_all
+science-physics-dev_1.0_all
+scim-dev_1.4.13-5_all
+sciplot-dev_1.36-15_i386
+selinux-policy-dev_2:2.20110726-12_all
+seqan-dev_1.3.1-1_all
+sfftw-dev_2.1.5-1_i386
+skalibs-dev_0.47-1_i386
+slurm-drmaa-dev_1.0.4-3_i386
+slurm-llnl-basic-plugins-dev_2.3.4-2+b1_i386
+snappea-dev_3.0d3-22_i386
+spl-dev_1.0~pre6-3.1+b1_i386
+sra-toolkit-libs-dev_2.1.7a-1_i386
+ss-dev_2.0-1.42.5-1.1_i386
+stx-btree-dev_0.8.6-1_all
+styx-dev_1.8.0-1.1_i386
+supercollider-dev_1:3.4.5-1wheezy1_i386
+svdrpservice-dev_0.0.4-14_all
+sweep-dev_0.9.3-6_all
+swish-e-dev_2.4.7-3_i386
+syfi-dev_1.0.0.dfsg-1_all
+system-tools-backends-dev_2.10.2-1_all
+systemtap-sdt-dev_1.7-1+deb7u1_i386
+tcl-dev_8.5.0-2.1_all
+tcl-memchan-dev_2.3-2_i386
+tcl-trf-dev_2.1.4-dfsg1-1_i386
+tcl8.4-dev_8.4.19-5_i386
+tcl8.5-dev_8.5.11-2_i386
+tclcl-dev_1.20-6_all
+tclx8.4-dev_8.4.0-3_i386
+tclxml-dev_3.3~svn11-2_i386
+tdom-dev_0.8.3~20080525-3+nmu2_i386
+tesseract-ocr-dev_3.02.01-6_all
+tix-dev_8.4.3-4_i386
+tk-dev_8.5.0-2.1_all
+tk8.4-dev_8.4.19-5_i386
+tk8.5-dev_8.5.11-2_i386
+tqsllib-dev_2.2-5_i386
+trafficserver-dev_3.0.5-1_i386
+tuxpaint-dev_1:0.9.21-1.1_all
+unagi-dev_0.3.3-2_i386
+unixodbc-dev_2.2.14p2-5_i386
+uthash-dev_1.9.5-1_all
+uuid-dev_2.20.1-5.3_i386
+vdr-dev_1.7.28-1_all
+vflib3-dev_3.6.14.dfsg-3+b1_i386
+voms-dev_2.0.8-1_i386
+vstream-client-dev_1.2-6.1_i386
+wcslib-dev_4.13.4-1_i386
+weechat-dev_0.3.8-1+deb7u1_all
+wireshark-dev_1.8.2-5wheezy10_i386
+witty-dev_3.2.1-2_all
+wordnet-dev_1:3.0-29_i386
+wzdftpd-dev_0.8.3-6.2_i386
+x11proto-bigreqs-dev_1:1.1.2-1_all
+x11proto-composite-dev_1:0.4.2-2_all
+x11proto-core-dev_7.0.23-1_all
+x11proto-damage-dev_1:1.2.1-2_all
+x11proto-dmx-dev_1:2.3.1-2_all
+x11proto-dri2-dev_2.6-2_all
+x11proto-fixes-dev_1:5.0-2_all
+x11proto-fonts-dev_2.1.2-1_all
+x11proto-gl-dev_1.4.15-1_all
+x11proto-input-dev_2.2-1_all
+x11proto-kb-dev_1.0.6-2_all
+x11proto-print-dev_1.0.5-2_all
+x11proto-randr-dev_1.3.2-2_all
+x11proto-record-dev_1.14.2-1_all
+x11proto-render-dev_2:0.11.1-2_all
+x11proto-resource-dev_1.2.0-3_all
+x11proto-scrnsaver-dev_1.2.2-1_all
+x11proto-video-dev_2.3.1-2_all
+x11proto-xcmisc-dev_1.2.2-1_all
+x11proto-xext-dev_7.2.1-1_all
+x11proto-xf86bigfont-dev_1.2.0-3_all
+x11proto-xf86dga-dev_2.1-3_all
+x11proto-xf86dri-dev_2.1.1-2_all
+x11proto-xf86vidmode-dev_2.3.1-2_all
+x11proto-xinerama-dev_1.2.1-2_all
+xaw3dg-dev_1.5+E-18.2_i386
+xbmc-eventclients-dev_2:11.0~git20120510.82388d5-1_all
+xfce4-panel-dev_4.8.6-4_i386
+xfslibs-dev_3.1.7+b1_i386
+xmhtml1-dev_1.1.7-18_i386
+xmms2-dev_0.8+dfsg-4_all
+xorg-dev_1:7.7+3~deb7u1_all
+xotcl-dev_1.6.7-2_i386
+xpaint-dev_2.9.1.4-3+b2_i386
+xserver-xorg-dev_2:1.12.4-6+deb7u2_i386
+xserver-xorg-input-evdev-dev_1:2.7.0-1_all
+xserver-xorg-input-joystick-dev_1:1.6.1-1_all
+xserver-xorg-input-synaptics-dev_1.6.2-2_all
+xtrans-dev_1.2.7-1_all
+xulrunner-dev_24.4.0esr-1~deb7u2_i386
+xutils-dev_1:7.7~1_i386
+xviewg-dev_3.2p1.4-28.1_i386
+yate-dev_4.1.0-1~dfsg-3_i386
+yorick-dev_2.2.02+dfsg-6_i386
+zathura-dev_0.1.2-4_all
+zlib1g-dev_1:1.2.7.dfsg-13_i386
+znc-dev_0.206-2_i386
+zsh-dev_4.3.17-1_i386
\ No newline at end of file
diff --git a/src/github.com/smira/aptly/system/t09_repo/SearchRepo2Test_gold b/src/github.com/smira/aptly/system/t09_repo/SearchRepo2Test_gold
new file mode 100644
index 00000000..0082b4bf
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t09_repo/SearchRepo2Test_gold
@@ -0,0 +1 @@
+ERROR: unable to search: local repo with name repo-xx not found
diff --git a/src/github.com/smira/aptly/system/t09_repo/SearchRepo3Test_gold b/src/github.com/smira/aptly/system/t09_repo/SearchRepo3Test_gold
new file mode 100644
index 00000000..58f09611
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t09_repo/SearchRepo3Test_gold
@@ -0,0 +1 @@
+ERROR: unable to search: parsing failed: unexpected token : expecting ')'
diff --git a/src/github.com/smira/aptly/system/t09_repo/SearchRepo4Test_gold b/src/github.com/smira/aptly/system/t09_repo/SearchRepo4Test_gold
new file mode 100644
index 00000000..007f3b4f
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t09_repo/SearchRepo4Test_gold
@@ -0,0 +1,95 @@
+
+coreutils_8.13-3.5_amd64
+coreutils_8.13-3.5_i386
+debconf_1.5.49_all
+dpkg_1.16.12_amd64
+dpkg_1.16.12_i386
+fontconfig-config_2.9.0-7.1_all
+fonts-freefont-ttf_20120503-1_all
+gcc-4.7-base_4.7.2-5_amd64
+gcc-4.7-base_4.7.2-5_i386
+gsfonts-x11_0.22_all
+gsfonts_1:8.11+urwcyr1.0.7~pre44-4.2_all
+libacl1_2.2.51-8_amd64
+libacl1_2.2.51-8_i386
+libattr1_1:2.4.46-8_amd64
+libattr1_1:2.4.46-8_i386
+libbz2-1.0_1.0.6-4_amd64
+libbz2-1.0_1.0.6-4_i386
+libc-bin_2.13-38+deb7u1_amd64
+libc-bin_2.13-38+deb7u1_i386
+libc6_2.13-38+deb7u1_amd64
+libc6_2.13-38+deb7u1_i386
+libexpat1_2.1.0-1+deb7u1_amd64
+libexpat1_2.1.0-1+deb7u1_i386
+libfontconfig1_2.9.0-7.1_amd64
+libfontconfig1_2.9.0-7.1_i386
+libfontenc1_1:1.1.1-1_amd64
+libfontenc1_1:1.1.1-1_i386
+libfreetype6_2.4.9-1.1_amd64
+libfreetype6_2.4.9-1.1_i386
+libgcc1_1:4.7.2-5_amd64
+libgcc1_1:4.7.2-5_i386
+libgcrypt11_1.5.0-5+deb7u1_amd64
+libgcrypt11_1.5.0-5+deb7u1_i386
+libgd2-noxpm_2.0.36~rc1~dfsg-6.1_amd64
+libgd2-noxpm_2.0.36~rc1~dfsg-6.1_i386
+libgd2-xpm_2.0.36~rc1~dfsg-6.1_amd64
+libgd2-xpm_2.0.36~rc1~dfsg-6.1_i386
+libgeoip1_1.4.8+dfsg-3_amd64
+libgeoip1_1.4.8+dfsg-3_i386
+libgpg-error0_1.10-3.1_amd64
+libgpg-error0_1.10-3.1_i386
+libjpeg8_8d-1_amd64
+libjpeg8_8d-1_i386
+liblzma5_5.1.1alpha+20120614-2_amd64
+liblzma5_5.1.1alpha+20120614-2_i386
+libpam0g_1.1.3-7.1_amd64
+libpam0g_1.1.3-7.1_i386
+libpcre3_1:8.30-5_amd64
+libpcre3_1:8.30-5_i386
+libpng12-0_1.2.49-1_amd64
+libpng12-0_1.2.49-1_i386
+libselinux1_2.1.9-5_amd64
+libselinux1_2.1.9-5_i386
+libssl1.0.0_1.0.1e-2+deb7u7_amd64
+libssl1.0.0_1.0.1e-2+deb7u7_i386
+libx11-6_2:1.5.0-1+deb7u1_amd64
+libx11-6_2:1.5.0-1+deb7u1_i386
+libx11-data_2:1.5.0-1+deb7u1_all
+libxau6_1:1.0.7-1_amd64
+libxau6_1:1.0.7-1_i386
+libxcb1_1.8.1-2+deb7u1_amd64
+libxcb1_1.8.1-2+deb7u1_i386
+libxdmcp6_1:1.1.1-1_amd64
+libxdmcp6_1:1.1.1-1_i386
+libxfont1_1:1.4.5-3_amd64
+libxfont1_1:1.4.5-3_i386
+libxml2_2.8.0+dfsg1-7+nmu3_amd64
+libxml2_2.8.0+dfsg1-7+nmu3_i386
+libxpm4_1:3.5.10-1_amd64
+libxpm4_1:3.5.10-1_i386
+libxslt1.1_1.1.26-14.1_amd64
+libxslt1.1_1.1.26-14.1_i386
+lsb-base_4.1+Debian8+deb7u1_all
+multiarch-support_2.13-38+deb7u1_amd64
+multiarch-support_2.13-38+deb7u1_i386
+nginx-common_1.2.1-2.2+wheezy2_all
+nginx-full_1.2.1-2.2+wheezy2_amd64
+nginx-full_1.2.1-2.2+wheezy2_i386
+nginx-light_1.2.1-2.2+wheezy2_amd64
+nginx-light_1.2.1-2.2+wheezy2_i386
+nginx_1.2.1-2.2+wheezy2_all
+perl-base_5.14.2-21+deb7u1_amd64
+perl-base_5.14.2-21+deb7u1_i386
+tar_1.26+dfsg-0.1_amd64
+tar_1.26+dfsg-0.1_i386
+ttf-bitstream-vera_1.10-8_all
+ttf-dejavu-core_2.33-3_all
+ucf_3.0025+nmu3_all
+x11-common_1:7.7+3~deb7u1_all
+xfonts-encodings_1:1.0.4-1_all
+xfonts-utils_1:7.7~1_amd64
+xfonts-utils_1:7.7~1_i386
+zlib1g_1:1.2.7.dfsg-13_amd64
+zlib1g_1:1.2.7.dfsg-13_i386
\ No newline at end of file
diff --git a/src/github.com/smira/aptly/system/t09_repo/__init__.py b/src/github.com/smira/aptly/system/t09_repo/__init__.py
index 52760f06..54b70ef5 100644
--- a/src/github.com/smira/aptly/system/t09_repo/__init__.py
+++ b/src/github.com/smira/aptly/system/t09_repo/__init__.py
@@ -13,3 +13,4 @@ from .move import *
from .remove import *
from .show import *
from .rename import *
+from .search import *
diff --git a/src/github.com/smira/aptly/system/t09_repo/add.py b/src/github.com/smira/aptly/system/t09_repo/add.py
index 225326b1..9b5d9319 100644
--- a/src/github.com/smira/aptly/system/t09_repo/add.py
+++ b/src/github.com/smira/aptly/system/t09_repo/add.py
@@ -216,3 +216,54 @@ class AddRepo10Test(BaseTest):
def check(self):
self.check_output()
self.check_cmd_output("aptly repo show -with-packages repo10", "repo_show")
+
+
+class AddRepo11Test(BaseTest):
+ """
+ add package to local repo: conflict in packages + -force-replace
+ """
+ fixtureCmds = [
+ "aptly repo create -comment=Repo11 -distribution=squeeze repo11",
+ "aptly repo add repo11 ${files}/pyspi_0.6.1-1.3.dsc",
+ ]
+ runCmd = "aptly repo add -force-replace repo11 ${testfiles}/pyspi_0.6.1-1.3.conflict.dsc"
+ outputMatchPrepare = lambda self, s: s.replace(os.path.join(os.path.dirname(inspect.getsourcefile(self.__class__)), self.__class__.__name__), "").replace(os.path.join(os.path.dirname(inspect.getsourcefile(BaseTest)), "files"), "")
+
+ def check(self):
+ self.check_output()
+ self.check_cmd_output("aptly repo show -with-packages repo11", "repo_show")
+
+
+class AddRepo12Test(BaseTest):
+ """
+ add package to local repo: .udeb file
+ """
+ fixtureCmds = [
+ "aptly repo create -comment=Repo12 -distribution=squeeze repo12",
+ ]
+ runCmd = "aptly repo add repo12 ${udebs}/dmraid-udeb_1.0.0.rc16-4.1_amd64.udeb"
+
+ def check(self):
+ self.check_output()
+ self.check_cmd_output("aptly repo show -with-packages repo12", "repo_show")
+
+ # check pool
+ self.check_exists('pool/72/16/dmraid-udeb_1.0.0.rc16-4.1_amd64.udeb')
+
+
+class AddRepo13Test(BaseTest):
+ """
+ add package to local repo: .udeb and .deb files
+ """
+ fixtureCmds = [
+ "aptly repo create -comment=Repo13 -distribution=squeeze repo13",
+ ]
+ runCmd = "aptly repo add repo13 ${udebs} ${files}"
+
+ def check(self):
+ self.check_output()
+ self.check_cmd_output("aptly repo show -with-packages repo13", "repo_show")
+
+ # check pool
+ self.check_exists('pool/72/16/dmraid-udeb_1.0.0.rc16-4.1_amd64.udeb')
+ self.check_exists('pool/b7/2c/pyspi_0.6.1-1.3.dsc')
diff --git a/src/github.com/smira/aptly/system/t09_repo/search.py b/src/github.com/smira/aptly/system/t09_repo/search.py
new file mode 100644
index 00000000..01a89558
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t09_repo/search.py
@@ -0,0 +1,39 @@
+from lib import BaseTest
+
+
+class SearchRepo1Test(BaseTest):
+ """
+ search repo: regular search
+ """
+ fixtureDB = True
+ outputMatchPrepare = lambda _, s: "\n".join(sorted(s.split("\n")))
+ fixtureCmds = ["aptly repo create wheezy-main", "aptly repo import wheezy-main wheezy-main Name"]
+ runCmd = "aptly repo search wheezy-main '$$Architecture (i386), Name (% *-dev)'"
+
+
+class SearchRepo2Test(BaseTest):
+ """
+ search repo: missing repo
+ """
+ runCmd = "aptly repo search repo-xx 'Name'"
+ expectedCode = 1
+
+
+class SearchRepo3Test(BaseTest):
+ """
+ search repo: wrong expression
+ """
+ fixtureDB = True
+ fixtureCmds = ["aptly repo create wheezy-main", "aptly repo import wheezy-main wheezy-main Name"]
+ expectedCode = 1
+ runCmd = "aptly repo search wheezy-main '$$Architecture (i386'"
+
+
+class SearchRepo4Test(BaseTest):
+ """
+ search repo: with-deps search
+ """
+ fixtureDB = True
+ fixtureCmds = ["aptly repo create wheezy-main", "aptly repo import wheezy-main wheezy-main Name"]
+ outputMatchPrepare = lambda _, s: "\n".join(sorted(s.split("\n")))
+ runCmd = "aptly repo search -with-deps wheezy-main 'Name (nginx)'"
diff --git a/src/github.com/smira/aptly/system/t10_task/RunTask1Test_gold b/src/github.com/smira/aptly/system/t10_task/RunTask1Test_gold
new file mode 100644
index 00000000..30358516
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t10_task/RunTask1Test_gold
@@ -0,0 +1,26 @@
+1) [Running]: repo list
+
+Begin command output: ----------------------------
+No local repositories found, create one with `aptly repo create ...`.
+
+End command output: ------------------------------
+2) [Running]: repo create local
+
+Begin command output: ----------------------------
+
+Local repo [local] successfully added.
+You can run 'aptly repo add local ...' to add packages to repository.
+
+End command output: ------------------------------
+3) [Running]: repo drop local
+
+Begin command output: ----------------------------
+Local repo `local` has been removed.
+
+End command output: ------------------------------
+4) [Running]: version
+
+Begin command output: ----------------------------
+aptly version: 0.8~dev
+
+End command output: ------------------------------
diff --git a/src/github.com/smira/aptly/system/t10_task/RunTask2Test_gold b/src/github.com/smira/aptly/system/t10_task/RunTask2Test_gold
new file mode 100644
index 00000000..bcdf84ba
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t10_task/RunTask2Test_gold
@@ -0,0 +1,22 @@
+1) [Running]: repo list -raw
+
+Begin command output: ----------------------------
+
+End command output: ------------------------------
+2) [Running]: repo create local
+
+Begin command output: ----------------------------
+
+Local repo [local] successfully added.
+You can run 'aptly repo add local ...' to add packages to repository.
+
+End command output: ------------------------------
+3) [Running]: repo list
+
+Begin command output: ----------------------------
+List of local repos:
+ * [local] (packages: 0)
+
+To get more information about local repository, run `aptly repo show `.
+
+End command output: ------------------------------
diff --git a/src/github.com/smira/aptly/system/t10_task/RunTask3Test_gold b/src/github.com/smira/aptly/system/t10_task/RunTask3Test_gold
new file mode 100644
index 00000000..6ca53cbb
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t10_task/RunTask3Test_gold
@@ -0,0 +1,9 @@
+1) [Running]: repo show a
+
+Begin command output: ----------------------------
+ERROR: unable to show: local repo with name a not found
+
+End command output: ------------------------------
+2) [Skipping]: repo create local
+3) [Skipping]: repo list
+ERROR: at least one command has reported an error
diff --git a/src/github.com/smira/aptly/system/t10_task/RunTask4Test/task b/src/github.com/smira/aptly/system/t10_task/RunTask4Test/task
new file mode 100644
index 00000000..5baee0af
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t10_task/RunTask4Test/task
@@ -0,0 +1,3 @@
+repo list
+repo create -distribution="Cool" abc
+repo show abc
diff --git a/src/github.com/smira/aptly/system/t10_task/RunTask4Test_gold b/src/github.com/smira/aptly/system/t10_task/RunTask4Test_gold
new file mode 100644
index 00000000..31067b4c
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t10_task/RunTask4Test_gold
@@ -0,0 +1,26 @@
+Reading file...
+
+1) [Running]: repo list
+
+Begin command output: ----------------------------
+No local repositories found, create one with `aptly repo create ...`.
+
+End command output: ------------------------------
+2) [Running]: repo create -distribution=Cool abc
+
+Begin command output: ----------------------------
+
+Local repo [abc] successfully added.
+You can run 'aptly repo add abc ...' to add packages to repository.
+
+End command output: ------------------------------
+3) [Running]: repo show abc
+
+Begin command output: ----------------------------
+Name: abc
+Comment:
+Default Distribution: Cool
+Default Component: main
+Number of packages: 0
+
+End command output: ------------------------------
diff --git a/src/github.com/smira/aptly/system/t10_task/RunTask5Test_gold b/src/github.com/smira/aptly/system/t10_task/RunTask5Test_gold
new file mode 100644
index 00000000..62a0741b
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t10_task/RunTask5Test_gold
@@ -0,0 +1,2 @@
+ERROR: no such file, not_found
+
diff --git a/src/github.com/smira/aptly/system/t10_task/__init__.py b/src/github.com/smira/aptly/system/t10_task/__init__.py
new file mode 100644
index 00000000..dd3ca362
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t10_task/__init__.py
@@ -0,0 +1,6 @@
+"""
+Test aptly task run
+"""
+
+# disabled for now
+#from .run import *
diff --git a/src/github.com/smira/aptly/system/t10_task/run.py b/src/github.com/smira/aptly/system/t10_task/run.py
new file mode 100644
index 00000000..2d7897ec
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t10_task/run.py
@@ -0,0 +1,38 @@
+from lib import BaseTest
+
+
+class RunTask1Test(BaseTest):
+ """
+ task run: simple commands, 1-word command
+ """
+ runCmd = "aptly task run repo list, repo create local, repo drop local, version"
+
+
+class RunTask2Test(BaseTest):
+ """
+ task run: commands with args
+ """
+ runCmd = "aptly task run -- repo list -raw, repo create local, repo list"
+
+
+class RunTask3Test(BaseTest):
+ """
+ task run: failure
+ """
+ expectedCode = 1
+ runCmd = "aptly task run -- repo show a, repo create local, repo list"
+
+
+class RunTask4Test(BaseTest):
+ """
+ task run: from file
+ """
+ runCmd = "aptly task run -filename=${testfiles}/task"
+
+
+class RunTask5Test(BaseTest):
+ """
+ task run: from file not found
+ """
+ expectedCode = 1
+ runCmd = "aptly task run -filename=not_found"
diff --git a/src/github.com/smira/aptly/system/t11_package/SearchPackage1Test_gold b/src/github.com/smira/aptly/system/t11_package/SearchPackage1Test_gold
new file mode 100644
index 00000000..e6017123
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t11_package/SearchPackage1Test_gold
@@ -0,0 +1,4309 @@
+
+amd-opencl-dev_1:12-6+point-3_i386
+amd-opencl-dev_1:13.12-4~bpo70+1_i386
+aolserver4-dev_4.5.1-15.1_i386
+apache2-prefork-dev_2.2.22-13+deb7u1_i386
+apache2-threaded-dev_2.2.22-13+deb7u1_i386
+apcalc-dev_2.12.4.4-3_i386
+aplus-fsf-dev_4.22.1-6_i386
+aroarfw-dev_0.1~beta4-5_all
+asterisk-dev_1:1.8.13.1~dfsg1-3+deb7u3_all
+asterisk-dev_1:11.10.2~dfsg-1~bpo70+1_all
+atfs-dev_1.4pl6-11_i386
+audacious-dev_3.2.4-1_i386
+autotools-dev_20120608.1_all
+binutils-dev_2.22-8_i386
+biosquid-dev_1.9g+cvs20050121-2_i386
+bitlbee-dev_3.0.5-1.2_all
+blacs-pvm-dev_1.1-21_i386
+blends-dev_0.6.16.2_all
+blktap-dev_2.0.90-1_i386
+blt-dev_2.4z-4.2_i386
+boinc-dev_7.0.27+dfsg-5_i386
+boinc-dev_7.2.47+dfsg-3~bpo70+1_all
+boolstuff-dev_0.1.12-3_i386
+cairo-dock-dev_3.0.0-2+deb7u1_i386
+cernlib-base-dev_20061220+dfsg3-2_all
+cernlib-core-dev_20061220+dfsg3-2_all
+chipmunk-dev_5.3.4-1_i386
+cimg-dev_1.4.9-2_all
+clearsilver-dev_0.10.5-1.3_i386
+cli-common-dev_0.8.2_all
+clinica-dev_0.2.1~dfsg-1_i386
+clisp-dev_1:2.49-8.1_i386
+cluster-glue-dev_1.0.9+hg2665-1_i386
+codeblocks-dev_10.05-2.1_i386
+codeblocks-dev_13.12-1~bpo70+1_i386
+coinor-libcbc-dev_2.5.0-3_i386
+coinor-libcgl-dev_0.55.0-1.1_i386
+coinor-libclp-dev_1.12.0-2.1_i386
+coinor-libcoinutils-dev_2.6.4-3_i386
+coinor-libdylp-dev_1.6.0-1.1_i386
+coinor-libflopc++-dev_1.0.6-3.1_i386
+coinor-libipopt-dev_3.10.2-1.1_i386
+coinor-libosi-dev_0.103.0-1_i386
+coinor-libsymphony-dev_5.2.4-1.2_i386
+coinor-libvol-dev_1.1.7-1_i386
+collectd-dev_5.1.0-3_all
+comerr-dev_2.1-1.42.5-1.1_i386
+condor-dev_7.8.2~dfsg.1-1+deb7u1_i386
+config-package-dev_4.13_all
+config-package-dev_5.1.1~bpo70+1_all
+connman-dev_1.0-1.1+wheezy1+b1_i386
+console-tools-dev_1:0.2.3dbs-70_i386
+coop-computing-tools-dev_3.5.1-2_i386
+corosync-dev_1.4.2-3_i386
+courier-authlib-dev_0.63.0-6+b1_i386
+crtmpserver-dev_1.0~dfsg-3_i386
+ctapi-dev_1.1_all
+ctn-dev_3.0.6-13+b2_i386
+cyrus-dev_2.4.16-4+deb7u1_all
+dcap-dev_2.47.6-2_i386
+dico-dev_2.1-3+b2_i386
+dictionaries-common-dev_1.12.11_all
+dietlibc-dev_0.33~cvs20120325-4_i386
+dolfin-dev_1.0.0-7_all
+dovecot-dev_1:2.1.7-7_i386
+dovecot-dev_1:2.2.9-1~bpo70+1_i386
+dpkg-dev_1.16.12_all
+drac-dev_1.12-7.2_i386
+drizzle-plugin-dev_1:7.1.36-stable-1_i386
+dssi-dev_1.1.1~dfsg0-1_all
+e2fslibs-dev_1.42.5-1.1_i386
+emerillon-dev_0.1.90-1_i386
+eog-dev_3.4.2-1+build1_all
+eom-dev_1.8.0+dfsg1-2~bpo70+1_i386
+epiphany-browser-dev_3.4.2-2.1_i386
+erlang-dev_1:15.b.1-dfsg-4+deb7u1_i386
+erlang-dev_1:17.0-dfsg-3~bpo70+1_i386
+erlang-esdl-dev_1.2-2_all
+etl-dev_0.04.15-1_i386
+evolution-data-server-dev_3.4.4-3_i386
+evolution-dev_3.4.4-3_i386
+exim4-dev_4.80-7_i386
+expect-dev_5.45-2_i386
+expeyes-firmware-dev_2.0.0-3_all
+extremetuxracer-gimp-dev_0.4-5_all
+falconpl-dev_0.9.6.9-git20120606-2_i386
+fatrat-dev_1.1.3-5_all
+fcitx-libs-dev_1:4.2.4.1-7_i386
+fcitx-libs-dev_1:4.2.8.3-3~bpo70+1_i386
+fenix-dev_0.92a.dfsg1-9_all
+festival-dev_1:2.1~release-5.1_i386
+fftw-dev_2.1.5-1_i386
+finch-dev_2.10.7-2~bpo70+1_all
+finch-dev_2.10.9-1~deb7u1_all
+firebird-dev_2.5.2.26540.ds4-1~deb7u1_i386
+flite1-dev_1.4-release-6_i386
+flow-tools-dev_1:0.68-12.1+b1_i386
+fosfat-dev_0.4.0-3_i386
+freecad-dev_0.13.2800-dfsg-1~bpo70+1_i386
+freeglut3-dev_2.6.0-4_i386
+freetds-dev_0.91-2+deb7u1_i386
+frei0r-plugins-dev_1.1.22git20091109-1.2_i386
+ftgl-dev_2.1.3~rc5-4_all
+ftplib-dev_3.1-1-9_i386
+gambas3-dev_3.1.1-2+b1_i386
+gap-dev_4r4p12-2_i386
+gauche-dev_0.9.1-5.1_i386
+gcc-4.6-plugin-dev_4.6.3-14_i386
+gcc-4.7-plugin-dev_4.7.2-5_i386
+gcin-dev_2.7.6.1+dfsg-1_all
+gedit-dev_3.4.2-1_all
+gem-dev_1:0.93.3-5_all
+genius-dev_1.0.14-1_i386
+gfxboot-dev_4.5.0-3_i386
+giblib-dev_1.2.4-8_i386
+glabels-dev_3.0.0-3+b1_i386
+glee-dev_5.4.0-1_i386
+gmpc-dev_11.8.16-6_i386
+gnash-dev_0.8.11~git20120629-1+deb7u1_i386
+gnash-dev_0.8.11~git20140319+dfsg-1~bpo70+1_i386
+gnome-control-center-dev_1:3.4.3.1-2_all
+gnome-settings-daemon-dev_3.4.2+git20121218.7c1322-3+deb7u3_i386
+gnome-video-effects-dev_0.4.0-1_all
+gnumach-dev_2:1.3.99.dfsg.git20120610-1_i386
+gnunet-dev_0.9.3-7_i386
+gnunet-gtk-dev_0.9.3-1_i386
+gnuradio-dev_3.5.3.2-1_i386
+gnuradio-dev_3.7.2.1-5~bpo70+1_i386
+gosa-dev_2.7.4-4.3~deb7u1_all
+gpe-ownerinfo-dev_0.28-3_i386
+gpsim-dev_0.26.1-2.1_i386
+graphviz-dev_2.26.3-14+deb7u1_all
+grass-dev_6.4.2-2_i386
+gridengine-drmaa-dev_6.2u5-7.1_i386
+gromacs-dev_4.5.5-2_i386
+gsettings-desktop-schemas-dev_3.4.2-3_i386
+gthumb-dev_3:3.0.1-2_i386
+guile-1.6-dev_1.6.8-10.3_i386
+guile-1.8-dev_1.8.8+1-8_i386
+guile-2.0-dev_2.0.5+1-3_i386
+guile-cairo-dev_1.4.0-3_i386
+heartbeat-dev_1:3.0.5-3_i386
+heimdal-dev_1.6~git20120403+dfsg1-2_i386
+hime-dev_0.9.9+git20120619+dfsg-1_all
+hybrid-dev_1:7.2.2.dfsg.2-10_all
+icedove-dev_10.0.12-1_i386
+inn2-dev_2.5.3-3_i386
+inventor-dev_2.1.5-10-16_i386
+iproute-dev_20120521-3+b3_i386
+iptables-dev_1.4.14-3.1_i386
+irssi-dev_0.8.15-5_i386
+isc-dhcp-dev_4.2.2.dfsg.1-5+deb70u6_i386
+itcl3-dev_3.4.1-1_i386
+itk3-dev_3.3-4_i386
+ivtools-dev_1.2.10a1-1_i386
+kadu-dev_0.11.2-1_all
+kannel-dev_1.4.3-2+b2_i386
+kde-workspace-dev_4:4.8.4-6_i386
+kdebase-workspace-dev_4:4.8.4-6_all
+kdelibs5-dev_4:4.8.4-4_i386
+kdemultimedia-dev_4:4.8.4-2_i386
+kdepimlibs5-dev_4:4.8.4-2_i386
+kdevelop-dev_4:4.3.1-3+b1_i386
+kdevplatform-dev_1.3.1-2_i386
+kmymoney-dev_4.6.2-3.2_i386
+konwert-dev_1.8-11.2_all
+lam4-dev_7.1.4-3_i386
+lesstif2-dev_1:0.95.2-1.1_i386
+lib3ds-dev_1.3.0-6_i386
+lib4store-dev_1.1.4-2_i386
+lib64bz2-dev_1.0.6-4_i386
+lib64expat1-dev_2.1.0-1+deb7u1_i386
+lib64ffi-dev_3.0.10-3_i386
+lib64ncurses5-dev_5.9-10_i386
+lib64readline-gplv2-dev_5.2+dfsg-2~deb7u1_i386
+lib64readline6-dev_6.2+dfsg-0.1_i386
+lib64z1-dev_1:1.2.7.dfsg-13_i386
+liba52-0.7.4-dev_0.7.4-16_i386
+libaa1-dev_1.4p5-40_i386
+libaac-tactics-ocaml-dev_0.2.pl2-7_i386
+libaacs-dev_0.4.0-1_i386
+libaal-dev_1.0.5-5.1_i386
+libabiword-2.9-dev_2.9.2+svn20120603-8_i386
+libaccountsservice-dev_0.6.21-8_i386
+libace-dev_6.0.3+dfsg-0.1_i386
+libace-flreactor-dev_6.0.3+dfsg-0.1_i386
+libace-foxreactor-dev_6.0.3+dfsg-0.1_i386
+libace-htbp-dev_6.0.3+dfsg-0.1_i386
+libace-inet-dev_6.0.3+dfsg-0.1_i386
+libace-inet-ssl-dev_6.0.3+dfsg-0.1_i386
+libace-qtreactor-dev_6.0.3+dfsg-0.1_i386
+libace-rmcast-dev_6.0.3+dfsg-0.1_i386
+libace-ssl-dev_6.0.3+dfsg-0.1_i386
+libace-tkreactor-dev_6.0.3+dfsg-0.1_i386
+libace-tmcast-dev_6.0.3+dfsg-0.1_i386
+libace-xtreactor-dev_6.0.3+dfsg-0.1_i386
+libacexml-dev_6.0.3+dfsg-0.1_i386
+libacl1-dev_2.2.51-8_i386
+libacpi-dev_0.2-4_i386
+libacr38ucontrol-dev_1.7.11-1_i386
+libadasockets4-dev_1.8.10-2_i386
+libaddresses-dev_0.4.7-1+b5_i386
+libaddressview-dev_0.4.7-1+b5_i386
+libadios-dev_1.3-11_i386
+libadminutil-dev_1.1.15-1_i386
+libadns1-dev_1.4-2_i386
+libadolc-dev_2.3.0-1_i386
+libadplug-dev_2.2.1+dfsg3-0.1_i386
+libafflib-dev_3.6.6-1.1+b1_i386
+libafrodite-0.12-dev_0.12.1-3_i386
+libafterimage-dev_2.2.11-7_i386
+libagg-dev_2.5+dfsg1-8_i386
+libagrep-ocaml-dev_1.0-11+b3_i386
+libahven3-dev_2.1-4_i386
+libaiksaurus-1.2-dev_1.2.1+dev-0.12-6.1_i386
+libaiksaurusgtk-1.2-dev_1.2.1+dev-0.12-6.1_i386
+libaio-dev_0.3.109-3_i386
+libakonadi-dev_1.7.2-3_i386
+libalberta2-dev_2.0.1-5_i386
+libaldmb1-dev_1:0.9.3-5.4_i386
+libalglib-dev_2.6.0-6_i386
+libalkimia-dev_4.3.2-1.1_i386
+liballeggl4-dev_2:4.4.2-2.1_i386
+liballegro4.2-dev_2:4.4.2-2.1_i386
+libalog0.4.1-base-dev_0.4.1-2_i386
+libalog0.4.1-full-dev_0.4.1-2_i386
+libalsa-ocaml-dev_0.2.1-1+b1_i386
+libalsaplayer-dev_0.99.80-5.1_i386
+libalure-dev_1.2-6_i386
+libalut-dev_1.1.0-3_i386
+libampsharp-cil-dev_2.0.4-2_all
+libamu-dev_6.2+rc20110530-3_i386
+libanalitza-dev_4:4.8.4-2_i386
+libanet0.1-dev_0.1-3_i386
+libanjuta-dev_2:3.4.3-1_i386
+libann-dev_1.1.2+doc-3_i386
+libanthy-dev_9100h-16_i386
+libantlr-dev_2.7.7+dfsg-4_i386
+libantlr3c-dev_3.2-2_i386
+libao-dev_1.1.0-2_i386
+libao-ocaml-dev_0.2.0-1+b2_i386
+libaosd-dev_0.2.7-1_i386
+libapache2-mod-perl2-dev_2.0.7-3_all
+libapertium3-3.1-0-dev_3.1.0-2_i386
+libapm-dev_3.2.2-14_i386
+libapol-dev_3.3.7-3_i386
+libapparmor-dev_2.7.103-4_i386
+libappindicator-dev_0.4.92-2_i386
+libappindicator0.1-cil-dev_0.4.92-2_all
+libappindicator3-dev_0.4.92-2_i386
+libapq-postgresql3.2.0-dev_3.2.0-2_i386
+libapq3.2.0-dev_3.2.0-1_i386
+libapr-memcache-dev_0.7.0-1_i386
+libapr1-dev_1.4.6-3+deb7u1_i386
+libapreq2-dev_2.13-1+b2_i386
+libapron-dev_0.9.10-5.2_all
+libapron-ocaml-dev_0.9.10-5.2+b3_i386
+libaprutil1-dev_1.4.1-3_i386
+libapt-pkg-dev_0.9.7.9+deb7u1_i386
+libaqbanking34-dev_5.0.24-3_i386
+libaqbanking34-dev_5.4.3beta-1~bpo70+1_i386
+libaqsis-dev_1.8.1-3_i386
+libarchive-dev_3.0.4-3+nmu1_i386
+libarchive-dev_3.1.2-8~bpo70+1_i386
+libargtable2-dev_12-1_i386
+libarmadillo-dev_1:3.2.3+dfsg-1_i386
+libarmadillo-dev_1:4.200.0+dfsg-1~bpo70+1_i386
+libarpack++2-dev_2.3-2_i386
+libarpack2-dev_3.1.1-2.1_i386
+libart-2.0-dev_2.3.21-2_i386
+libart2.0-cil-dev_2.24.2-3_all
+libasio-dev_1.4.1-3.2_all
+libasis2010-dev_2010-5_i386
+libasm-dev_0.152-1+wheezy1_i386
+libasound2-dev_1.0.25-4_i386
+libaspell-dev_0.60.7~20110707-1_i386
+libasprintf-dev_0.18.3-1~bpo7+1_i386
+libass-dev_0.10.0-3_i386
+libassa3.5-5-dev_3.5.1-2_i386
+libassimp-dev_3.0~dfsg-1_i386
+libassuan-dev_2.0.3-1_i386
+libast2-dev_0.7-6+b1_i386
+libasyncns-dev_0.8-4_i386
+libatasmart-dev_0.19-1_i386
+libatd-ocaml-dev_1.0.1-1+b1_i386
+libatdgen-ocaml-dev_1.2.2-1+b1_i386
+libatk-bridge2.0-dev_2.5.3-2_i386
+libatk1.0-dev_2.4.0-2_i386
+libatkmm-1.6-dev_2.22.6-1_i386
+libatlas-base-dev_3.8.4-9+deb7u1_i386
+libatlas-cpp-0.6-dev_0.6.2-3_i386
+libatlas-dev_3.8.4-9+deb7u1_all
+libatm1-dev_1:2.5.1-1.5_i386
+libatomic-ops-dev_7.2~alpha5+cvs20101124-1+deb7u1_i386
+libatomicparsley-dev_2.1.2-1_i386
+libatrildocument-dev_1.8.0+dfsg1-2~bpo70+1_i386
+libatrilview-dev_1.8.0+dfsg1-2~bpo70+1_i386
+libatspi-dev_1.32.0-2_i386
+libatspi2.0-dev_2.5.3-2_i386
+libattica-dev_0.2.0-1_i386
+libattr1-dev_1:2.4.46-8_i386
+libaubio-dev_0.3.2-4.2+b1_i386
+libaudio-dev_1.9.3-5wheezy1_i386
+libaudiofile-dev_0.3.4-2_i386
+libaudiomask-dev_1.0-2_i386
+libaudit-dev_1:1.7.18-1.1_i386
+libaugeas-dev_0.10.0-1_i386
+libaunit2-dev_1.03-7_i386
+libautotrace-dev_0.31.1-16+b1_i386
+libautounit-dev_0.20.1-4_i386
+libavahi-cil-dev_0.6.19-4.2_all
+libavahi-client-dev_0.6.31-2_i386
+libavahi-common-dev_0.6.31-2_i386
+libavahi-compat-libdnssd-dev_0.6.31-2_i386
+libavahi-core-dev_0.6.31-2_i386
+libavahi-glib-dev_0.6.31-2_i386
+libavahi-gobject-dev_0.6.31-2_i386
+libavahi-qt4-dev_0.6.31-2_i386
+libavahi-ui-cil-dev_0.6.19-4.2_all
+libavahi-ui-dev_0.6.31-2_i386
+libavahi-ui-gtk3-dev_0.6.31-2_i386
+libavbin-dev_7-1.3_i386
+libavc1394-dev_0.5.4-2_i386
+libavcodec-dev_6:0.8.10-1_i386
+libavcodec-dev_6:10.1-1~bpo70+1_i386
+libavdevice-dev_6:0.8.10-1_i386
+libavdevice-dev_6:10.1-1~bpo70+1_i386
+libavfilter-dev_6:0.8.10-1_i386
+libavfilter-dev_6:10.1-1~bpo70+1_i386
+libavformat-dev_6:0.8.10-1_i386
+libavformat-dev_6:10.1-1~bpo70+1_i386
+libavifile-0.7-dev_1:0.7.48~20090503.ds-13_i386
+libavl-dev_0.3.5-3_i386
+libavogadro-dev_1.0.3-5_i386
+libavresample-dev_6:10.1-1~bpo70+1_i386
+libavutil-dev_6:0.8.10-1_i386
+libavutil-dev_6:10.1-1~bpo70+1_i386
+libaws2.10.2-dev_2.10.2-4_i386
+libax25-dev_0.0.12-rc2+cvs20120204-2_i386
+libbabl-dev_0.1.10-1_i386
+libball1.4-dev_1.4.1+20111206-4_i386
+libballview1.4-dev_1.4.1+20111206-4_i386
+libbam-dev_0.1.18-1_i386
+libbam-dev_0.1.19-1~bpo70+1_i386
+libbamf-dev_0.2.118-1_i386
+libbamf3-dev_0.2.118-1_i386
+libbarry-dev_0.18.3-5_i386
+libbatteries-ocaml-dev_1.4.3-1_i386
+libbdd-dev_2.4-8_i386
+libbeecrypt-dev_4.2.1-4_i386
+libbenchmark-ocaml-dev_0.9-2+b3_i386
+libbfb0-dev_0.23-1.1_i386
+libbfio-dev_20130507-1~bpo70+1_i386
+libbg1-dev_1.106-1_i386
+libbibutils-dev_4.12-5_i386
+libbin-prot-camlp4-dev_2.0.7-1_i386
+libbind-dev_1:9.8.4.dfsg.P1-6+nmu2+deb7u1_i386
+libbind-dev_1:9.9.5.dfsg-4~bpo70+1_i386
+libbind4-dev_6.0-1_i386
+libbinio-dev_1.4+dfsg1-1_i386
+libbiniou-ocaml-dev_1.0.0-1+b1_i386
+libbio2jack0-dev_0.9-2.1_i386
+libbiococoa-dev_2.2.2-1+b2_i386
+libbiosig-dev_1.3.0-2_i386
+libbisho-common-dev_0.27.2+git20111122.9e68ef3d-1_i386
+libbison-dev_1:2.5.dfsg-2.1_i386
+libbitmask-dev_2.0-2_i386
+libbitstream-dev_1.0-1_all
+libbitstring-ocaml-dev_2.0.2-3+b1_i386
+libbjack-ocaml-dev_0.1.3-5+b1_i386
+libblacs-mpi-dev_1.1-31_i386
+libbladerf-dev_0.10.7.47.ebe70c4-4~bpo70+1_i386
+libblas-dev_1.2.20110419-5_i386
+libbliss-dev_0.72-4_i386
+libblitz0-dev_1:0.9-13_i386
+libblkid-dev_2.20.1-5.3_i386
+libblocksruntime-dev_0.1-1_i386
+libbluedevil-dev_1.9.2-1_i386
+libbluetooth-dev_4.99-2_i386
+libbluray-dev_1:0.2.2-1_i386
+libbml-dev_0.6.1-1_i386
+libbobcat-dev_3.01.00-1+b1_i386
+libbogl-dev_0.1.18-8+b1_i386
+libbognor-regis-dev_0.6.12+git20101007.02c25268-7_i386
+libboinc-app-dev_7.2.47+dfsg-3~bpo70+1_all
+libbonobo2-dev_2.24.3-1_i386
+libbonoboui2-dev_2.24.3-1_i386
+libboo-cil-dev_0.9.5~git20110729.r1.202a430-2_all
+libboost-all-dev_1.49.0.1_i386
+libboost-chrono-dev_1.49.0.1_i386
+libboost-chrono1.49-dev_1.49.0-3.2_i386
+libboost-date-time-dev_1.49.0.1_i386
+libboost-date-time1.49-dev_1.49.0-3.2_i386
+libboost-dev_1.49.0.1_i386
+libboost-filesystem-dev_1.49.0.1_i386
+libboost-filesystem1.49-dev_1.49.0-3.2_i386
+libboost-graph-dev_1.49.0.1_i386
+libboost-graph-parallel-dev_1.49.0.1_i386
+libboost-graph-parallel1.49-dev_1.49.0-3.2_i386
+libboost-graph1.49-dev_1.49.0-3.2_i386
+libboost-iostreams-dev_1.49.0.1_i386
+libboost-iostreams1.49-dev_1.49.0-3.2_i386
+libboost-locale-dev_1.49.0.1_i386
+libboost-locale1.49-dev_1.49.0-3.2_i386
+libboost-math-dev_1.49.0.1_i386
+libboost-math1.49-dev_1.49.0-3.2_i386
+libboost-mpi-dev_1.49.0.1_i386
+libboost-mpi-python-dev_1.49.0.1_i386
+libboost-mpi-python1.49-dev_1.49.0-3.2_i386
+libboost-mpi1.49-dev_1.49.0-3.2_i386
+libboost-program-options-dev_1.49.0.1_i386
+libboost-program-options1.49-dev_1.49.0-3.2_i386
+libboost-python-dev_1.49.0.1_i386
+libboost-python1.49-dev_1.49.0-3.2_i386
+libboost-random-dev_1.49.0.1_i386
+libboost-random1.49-dev_1.49.0-3.2_i386
+libboost-regex-dev_1.49.0.1_i386
+libboost-regex1.49-dev_1.49.0-3.2_i386
+libboost-serialization-dev_1.49.0.1_i386
+libboost-serialization1.49-dev_1.49.0-3.2_i386
+libboost-signals-dev_1.49.0.1_i386
+libboost-signals1.49-dev_1.49.0-3.2_i386
+libboost-system-dev_1.49.0.1_i386
+libboost-system1.49-dev_1.49.0-3.2_i386
+libboost-test-dev_1.49.0.1_i386
+libboost-test1.49-dev_1.49.0-3.2_i386
+libboost-thread-dev_1.49.0.1_i386
+libboost-thread1.49-dev_1.49.0-3.2_i386
+libboost-timer-dev_1.49.0.1_i386
+libboost-timer1.49-dev_1.49.0-3.2_i386
+libboost-wave-dev_1.49.0.1_i386
+libboost-wave1.49-dev_1.49.0-3.2_i386
+libboost1.49-all-dev_1.49.0-3.2_i386
+libboost1.49-dev_1.49.0-3.2_i386
+libbotan1.10-dev_1.10.5-1_i386
+libbox-dev_2.5-2_i386
+libbox2d-dev_2.0.1+dfsg1-1_i386
+libbpp-core-dev_2.0.3-1_i386
+libbpp-phyl-dev_2.0.3-1_i386
+libbpp-popgen-dev_2.0.3-1_i386
+libbpp-qt-dev_2.0.2-1_i386
+libbpp-raa-dev_2.0.3-1_i386
+libbpp-seq-dev_2.0.3-1_i386
+libbrahe-dev_1.3.2-3_i386
+libbrasero-media3-dev_3.4.1-4_i386
+libbrlapi-dev_4.4-10+deb7u1_i386
+libbs2b-dev_3.1.0+dfsg-2_i386
+libbsd-dev_0.4.2-1_i386
+libbse-dev_0.7.4-5_all
+libbt-dev_0.70.1-13_i386
+libbtparse-dev_0.63-1_i386
+libbuffy-dev_1.7-1_i386
+libbullet-dev_2.82-r2704+dfsg-2~bpo70+1_i386
+libbullet-extras-dev_2.82-r2704+dfsg-2~bpo70+1_i386
+libbulletml-dev_0.0.6-5_i386
+libburn-dev_1.2.2-2_i386
+libbuzztard-dev_0.5.0-4_i386
+libbz2-dev_1.0.6-4_i386
+libbz2-ocaml-dev_0.6.0-6+b2_i386
+libc-ares-dev_1.9.1-3_i386
+libc-client2007e-dev_8:2007f~dfsg-2_i386
+libc6-dev_2.13-38+deb7u1_i386
+libcableswig-dev_0.1.0+cvs20111009-1_i386
+libcaca-dev_0.99.beta18-1_i386
+libcairo-ocaml-dev_1:1.2.0-2+b1_i386
+libcairo2-dev_1.12.2-3_i386
+libcairomm-1.0-dev_1.10.0-1_i386
+libcaja-extension-dev_1.8.1-2~bpo70+1_i386
+libcajun-dev_2.0.3-1~bpo70+1_all
+libcal3d12-dev_0.11.0-4.1_i386
+libcalendar-ocaml-dev_2.03-1+b2_i386
+libcamel1.2-dev_3.4.4-3_i386
+libcameleon-ocaml-dev_1.9.21-2+b1_i386
+libcaml2html-ocaml-dev_1.4.1-3_i386
+libcamlimages-ocaml-dev_1:4.0.1-4+b2_i386
+libcamljava-ocaml-dev_0.3-1+b3_i386
+libcamlpdf-ocaml-dev_0.5-1+b2_i386
+libcamltemplate-ocaml-dev_1.0.2-1+b2_i386
+libcamomile-ocaml-dev_0.8.4-2_i386
+libcanberra-dev_0.28-6_i386
+libcanberra-gtk-common-dev_0.28-6_all
+libcanberra-gtk-dev_0.28-6_i386
+libcanberra-gtk3-dev_0.28-6_i386
+libcanlock2-dev_2b-6_i386
+libcanna1g-dev_3.7p3-11_i386
+libcap-dev_1:2.22-1.2_i386
+libcap-ng-dev_0.6.6-2_i386
+libcapi20-dev_1:3.25+dfsg1-3.3~deb7u1_i386
+libcapsinetwork-dev_0.3.0-7_i386
+libcaribou-dev_0.4.4-1_i386
+libcbf-dev_0.7.9.1-3_i386
+libccaudio2-dev_2.0.5-3_i386
+libccfits-dev_2.4-1_i386
+libcconv-dev_0.6.2-1_i386
+libccrtp-dev_2.0.3-4_i386
+libccs-dev_3.0.12-3.2+deb7u2_i386
+libccscript3-dev_1.1.7-2_i386
+libccss-dev_0.5.0-4_i386
+libcdaudio-dev_0.99.12p2-12_i386
+libcdb-dev_0.78_i386
+libcdd-dev_094b.dfsg-4.2_i386
+libcddb2-dev_1.3.2-3_i386
+libcdi-dev_1.5.4+dfsg.1-5_i386
+libcdio-cdda-dev_0.83-4_i386
+libcdio-dev_0.83-4_i386
+libcdio-paranoia-dev_0.83-4_i386
+libcdk5-dev_5.0.20060507-4_i386
+libcdparanoia-dev_3.10.2+debian-10.1_i386
+libcec-dev_1.6.2-1.1_i386
+libcec-dev_2.1.4-1~bpo70+1_i386
+libcegui-mk2-dev_0.7.6-2+b1_i386
+libcephfs-dev_0.80.1-1~bpo70+1_i386
+libcext-dev_6.1.1-2_i386
+libcf-ocaml-dev_0.10-3+b3_i386
+libcfg-dev_1.4.2-3_i386
+libcfitsio3-dev_3.300-2_i386
+libcgal-dev_4.0-5_i386
+libcgic-dev_2.05-3_i386
+libcgicc5-dev_3.2.9-3_i386
+libcgns-dev_3.1.3.4-1+b1_i386
+libcgroup-dev_0.38-1_i386
+libcgsi-gsoap-dev_1.3.5-1_i386
+libchamplain-0.12-dev_0.12.3-1_i386
+libchamplain-gtk-0.12-dev_0.12.3-1_i386
+libcharls-dev_1.0-2_i386
+libchasen-dev_2.4.5-6_i386
+libcheese-dev_3.4.2-2_i386
+libcheese-gtk-dev_3.4.2-2_i386
+libchewing3-dev_0.3.3-4_i386
+libchicken-dev_4.7.0-1_i386
+libchipcard-dev_5.0.3beta-3_i386
+libchise-dev_0.3.0-2+b1_i386
+libchm-dev_2:0.40a-2_i386
+libchromaprint-dev_0.6-2_i386
+libchromaprint-dev_1.1-1~bpo70+1_i386
+libcib1-dev_1.1.7-1_i386
+libcitadel-dev_8.14-1_i386
+libcitygml0-dev_0.14+svn128-1+3p0p1+4_i386
+libck-connector-dev_0.4.5-3.1_i386
+libck-connector-dev_0.4.6-4~bpo70+1_i386
+libckyapplet1-dev_1.1.0-12_i386
+libclalsadrv-dev_2.0.0-3_all
+libclam-dev_1.4.0-5.1_i386
+libclam-qtmonitors-dev_1.4.0-3.1_i386
+libclamav-dev_0.98.1+dfsg-1+deb7u3_i386
+libclamav-dev_0.98.1+dfsg-1+deb7u4_i386
+libclang-common-dev_1:3.0-6.2_i386
+libclang-dev_1:3.0-6.2_i386
+libclanlib-dev_1.0~svn3827-3_i386
+libclassad-dev_7.8.2~dfsg.1-1+deb7u1_i386
+libclaw-application-dev_1.7.0-3_i386
+libclaw-configuration-file-dev_1.7.0-3_i386
+libclaw-dev_1.7.0-3_i386
+libclaw-dynamic-library-dev_1.7.0-3_i386
+libclaw-graphic-dev_1.7.0-3_i386
+libclaw-logger-dev_1.7.0-3_i386
+libclaw-net-dev_1.7.0-3_i386
+libclaw-tween-dev_1.7.0-3_i386
+libclaws-mail-dev_3.8.1-2_i386
+libclaws-mail-dev_3.9.3-1~bpo70+1_i386
+libclhep-dev_2.1.2.3-1_i386
+libcli-dev_1.9.6-1_i386
+libclippoly-dev_0.11-3_i386
+libclips-dev_6.24-3_i386
+libcliquer-dev_1.21-1_i386
+libcln-dev_1.3.2-1.2_i386
+libcloog-isl-dev_0.17.0-3_i386
+libcloog-ppl-dev_0.15.11-4_i386
+libclthreads-dev_2.4.0-4_i386
+libclucene-dev_0.9.21b-2+b1_i386
+libclustalo-dev_1.1.0-1_i386
+libcluster-glue-dev_1.0.9+hg2665-1_all
+libclutter-1.0-dev_1.10.8-2_i386
+libclutter-cil-dev_1.0.0~alpha3~git20090817.r1.349dba6-8_all
+libclutter-gst-dev_1.5.4-1+build0_i386
+libclutter-gtk-1.0-dev_1.2.0-2_i386
+libclutter-imcontext-0.1-dev_0.1.4-3_i386
+libcluttergesture-dev_0.0.2.1-7_i386
+libclxclient-dev_3.6.1-6_i386
+libcman-dev_3.0.12-3.2+deb7u2_i386
+libcminpack-dev_1.2.2-1_i386
+libcmis-dev_0.1.0-1+b1_i386
+libcmor-dev_2.8.0-2+b1_i386
+libcmph-dev_0.9-1_i386
+libcneartree-dev_3.1.1-1_i386
+libcnf-dev_4.0-2_i386
+libcob1-dev_1.1-1_i386
+libcogl-dev_1.10.2-7_i386
+libcogl-pango-dev_1.10.2-7_i386
+libcoin60-dev_3.1.3-2.2_i386
+libcoin80-dev_3.1.4~abc9f50-3~bpo70+1_i386
+libcojets2-dev_20061220+dfsg3-2_i386
+libcollectdclient-dev_5.1.0-3_i386
+libcollection-dev_0.1.3-2_i386
+libcolorblind-dev_0.0.1-1_i386
+libcolord-dev_0.1.21-1_i386
+libcolord-gtk-dev_0.1.21-1_i386
+libcolorhug-dev_0.1.10-1_i386
+libcomedi-dev_0.10.0-3_i386
+libcommoncpp2-dev_1.8.1-5_i386
+libcompfaceg1-dev_1:1.5.2-5_i386
+libconcord-dev_0.24-1.1_i386
+libconfdb-dev_1.4.2-3_i386
+libconfig++-dev_1.4.8-5_i386
+libconfig++8-dev_1.4.8-5_i386
+libconfig-dev_1.4.8-5_i386
+libconfig-file-ocaml-dev_1.1-1_i386
+libconfig8-dev_1.4.8-5_i386
+libconfuse-dev_2.7-4_i386
+libcontactsdb-dev_0.5-8_i386
+libcoq-ocaml-dev_8.3.pl4+dfsg-2_i386
+libcore++-dev_1.7-12_i386
+libcore-ocaml-dev_107.01-5_i386
+libcorelinux-dev_0.4.32-7.3_i386
+libcoroipcc-dev_1.4.2-3_i386
+libcoroipcs-dev_1.4.2-3_i386
+libcorosync-dev_1.4.2-3_all
+libcos4-dev_4.1.6-2_i386
+libcothreads-ocaml-dev_0.10-3+b3_i386
+libcoyotl-dev_3.1.0-5_i386
+libcpg-dev_1.4.2-3_i386
+libcpl-dev_6.1.1-2_i386
+libcppcutter-dev_1.1.7-1.2_i386
+libcppunit-dev_1.12.1-4_i386
+libcppunit-subunit-dev_0.0.8+bzr176-1_i386
+libcpputest-dev_3.1-2_i386
+libcpufreq-dev_008-1_i386
+libcpuset-dev_1.0-3_i386
+libcqrlib2-dev_1.1.2-1_i386
+libcr-dev_0.8.5-2_i386
+libcrack2-dev_2.8.19-3_i386
+libcreal-ocaml-dev_0.7-6+b3_i386
+libcrmcluster1-dev_1.1.7-1_i386
+libcrmcommon2-dev_1.1.7-1_i386
+libcroco3-dev_0.6.6-2_i386
+libcry-ocaml-dev_0.2.2-1+b1_i386
+libcryptgps-ocaml-dev_0.2.1-7+b3_i386
+libcrypto++-dev_5.6.1-6_i386
+libcryptokit-ocaml-dev_1.5-1_i386
+libcryptsetup-dev_2:1.4.3-4_i386
+libcryptui-dev_3.2.2-1_i386
+libcrystalhd-dev_1:0.0~git20110715.fdd2f19-9_i386
+libcsfml-dev_1.6-1_i386
+libcsnd-dev_1:5.17.11~dfsg-3_all
+libcsoap-dev_1.1.0-17.1_i386
+libcsound64-dev_1:5.17.11~dfsg-3_all
+libcsoundac-dev_1:5.17.11~dfsg-3_all
+libcsv-ocaml-dev_1.2.2-1+b1_i386
+libcsvimp-dev_0.4.7-2~bpo70+1_i386
+libctapimkt0-dev_1.0.1-1.1_i386
+libctdb-dev_1.12+git20120201-4_i386
+libctdb-dev_2.5.3+debian0-1~bpo70+1_i386
+libctemplate-dev_2.2-3_i386
+libctl-dev_3.1.0-5_i386
+libctpl-dev_0.3.3.dfsg-2_i386
+libcuba3-dev_3.0+20111124-2_i386
+libcudf-dev_0.6.2-1_i386
+libcudf-ocaml-dev_0.6.2-1_i386
+libcue-dev_1.4.0-1_i386
+libcuneiform-dev_1.1.0+dfsg-4_i386
+libcunit1-dev_2.1-0.dfsg-10_i386
+libcunit1-ncurses-dev_2.1-0.dfsg-10_i386
+libcups2-dev_1.5.3-5+deb7u1_i386
+libcupscgi1-dev_1.5.3-5+deb7u1_i386
+libcupsdriver1-dev_1.5.3-5+deb7u1_i386
+libcupsfilters-dev_1.0.18-2.1+deb7u1_i386
+libcupsimage2-dev_1.5.3-5+deb7u1_i386
+libcupsmime1-dev_1.5.3-5+deb7u1_i386
+libcupsppdc1-dev_1.5.3-5+deb7u1_i386
+libcupt2-dev_2.5.9_i386
+libcupti-dev_4.2.9-2_i386
+libcupti-dev_5.0.35-8~bpo70+1_i386
+libcurl-ocaml-dev_0.5.3-2+b1_i386
+libcurl4-gnutls-dev_7.26.0-1+wheezy9_i386
+libcurl4-nss-dev_7.26.0-1+wheezy9_i386
+libcurl4-openssl-dev_7.26.0-1+wheezy9_i386
+libcurses-ocaml-dev_1.0.3-2_i386
+libcutter-dev_1.1.7-1.2_i386
+libcv-dev_2.3.1-11_i386
+libcvaux-dev_2.3.1-11_i386
+libcvc3-dev_2.4.1-4_i386
+libcvector2-dev_1.0.3-1_i386
+libcvm1-dev_0.96-1+b1_i386
+libcw3-dev_3.0.2-1_i386
+libcwidget-dev_0.5.16-3.4_i386
+libcwiid-dev_0.6.00+svn201-3+b1_i386
+libcwnn-dev_1.1.1~a021+cvs20100325-6_i386
+libcxgb3-dev_1.3.1-1_i386
+libcxxtools-dev_2.1.1-1_i386
+libdacs-dev_1.4.27b-2_i386
+libdaemon-dev_0.14-2_i386
+libdancer-xml0-dev_0.8.2.1-3_i386
+libdap-dev_3.11.1-11_i386
+libdapl-dev_2.0.19-1.1_i386
+libdaq-dev_0.6.2-2_i386
+libdar-dev_2.4.5.debian.1-1_i386
+libdatrie-dev_0.2.5-3_i386
+libdawgdic-dev_0.4.3-1_all
+libdb++-dev_5.1.6_i386
+libdb-dev_5.1.6_i386
+libdb-java-dev_5.1.6_i386
+libdb-sql-dev_5.1.6_i386
+libdb4o-cil-dev_8.0.184.15484+dfsg-2_all
+libdb5.1++-dev_5.1.29-5_i386
+libdb5.1-dev_5.1.29-5_i386
+libdb5.1-java-dev_5.1.29-5_i386
+libdb5.1-sql-dev_5.1.29-5_i386
+libdb5.1-stl-dev_5.1.29-5_i386
+libdballe-dev_5.18-1_i386
+libdballef-dev_5.18-1_i386
+libdbaudiolib0-dev_0.9.8-6.2_i386
+libdbi-dev_0.8.4-6_i386
+libdbus-1-dev_1.6.8-1+deb7u1_i386
+libdbus-c++-dev_0.9.0-6_i386
+libdbus-glib-1-dev_0.100.2-1_i386
+libdbus-glib1.0-cil-dev_0.5.0-4_all
+libdbus-ocaml-dev_0.29-1+b3_i386
+libdbus1.0-cil-dev_0.7.0-5_all
+libdbusada0.2-dev_0.2-2_i386
+libdbusmenu-glib-dev_0.6.2-1_i386
+libdbusmenu-gtk-dev_0.6.2-1_i386
+libdbusmenu-gtk3-dev_0.6.2-1_i386
+libdbusmenu-jsonloader-dev_0.6.2-1_i386
+libdbusmenu-qt-dev_0.9.0-1_i386
+libdc-dev_0.3.24~svn3121-2_i386
+libdc1394-22-dev_2.2.0-2_i386
+libdca-dev_0.0.5-5_i386
+libdcerpc-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libdcerpc-server-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libdcmtk2-dev_3.6.0-12_i386
+libdconf-dbus-1-dev_0.12.1-3_i386
+libdconf-dev_0.12.1-3_i386
+libddccontrol-dev_0.4.2-10_i386
+libdds-dev_2.1.2+ddd105-1_i386
+libdebconf-kde-dev_0.2-2_i386
+libdebconfclient0-dev_0.182_i386
+libdebian-installer4-dev_0.87_i386
+libdebug0-dev_0.4.4-1.1_i386
+libdecodeqr-dev_0.9.3-6.2_i386
+libdee-dev_1.0.10-3_i386
+libderiving-ocaml-dev_0.1.1a-3+b1_i386
+libderiving-ocsigen-ocaml-dev_0.3c-1_i386
+libdesktop-agnostic-dev_0.3.92+dfsg-1_i386
+libdessert0.87-dev_0.87.2-1_i386
+libdevhelp-dev_3.4.1-1_i386
+libdevil-dev_1.7.8-6.1+b1_i386
+libdevmapper-dev_2:1.02.74-8_i386
+libdhash-dev_0.1.3-2_i386
+libdiagnostics-dev_0.3.3-1.3_i386
+libdianewcanvas2-dev_0.6.10-5.4_i386
+libdieharder-dev_3.31.1-4_i386
+libdiet-admin2.8-dev_2.8.0-1+b1_i386
+libdiet-client2.8-dev_2.8.0-1+b1_i386
+libdiet-dagda2.8-dev_2.8.0-1+b1_i386
+libdiet-sed2.8-dev_2.8.0-1+b1_i386
+libdime-dev_0.20030921-2_all
+libdirac-dev_1.0.2-6_i386
+libdirectfb-dev_1.2.10.0-5_i386
+libdisasm-dev_0.23-5_i386
+libdiscid0-dev_0.2.2-3_i386
+libdiscover-dev_2.1.2-5.2_i386
+libdispatch-dev_0~svn197-3.1_i386
+libdisplaymigration0-dev_0.28-10_i386
+libdistorm64-dev_1.7.30-1_i386
+libdivecomputer-dev_0.1.0-3_i386
+libdjconsole-dev_0.1.3-1_i386
+libdjvulibre-dev_3.5.25.3-1_i386
+libdkim-dev_1:1.0.21-3_i386
+libdlm-dev_3.0.12-3.2+deb7u2_i386
+libdlmcontrol-dev_3.0.12-3.2+deb7u2_i386
+libdlrestrictions-dev_0.15.3_i386
+libdm0-dev_2.2.10-1_i386
+libdmalloc-dev_5.5.2-5_i386
+libdmapsharing-3.0-dev_2.9.15-1_i386
+libdmraid-dev_1.0.0.rc16-4.2_i386
+libdmtcpaware-dev_1.2.5-1_i386
+libdmtx-dev_0.7.2-2+build1_i386
+libdmx-dev_1:1.1.2-1+deb7u1_i386
+libdnet-dev_2.60_i386
+libdockapp-dev_1:0.5.0-3_i386
+libdolfin1.0-dev_1.0.0-7_i386
+libdoodle-dev_0.7.0-5_i386
+libdose2-ocaml-dev_1.4.2-4+b3_i386
+libdose3-ocaml-dev_3.0.2-3_i386
+libdotconf-dev_1.0.13-3_i386
+libdpkg-dev_1.16.12_i386
+libdpm-dev_1.8.2-1+b2_i386
+libdrawtk-dev_2.0-2_i386
+libdrizzle-dev_1:7.1.36-stable-1_all
+libdrizzledmessage-dev_1:7.1.36-stable-1_i386
+libdrm-dev_2.4.40-1~deb7u2_i386
+libdrumstick-dev_0.5.0-3_i386
+libdsdp-dev_5.8-9.1_i386
+libdshconfig1-dev_0.20.13-1_i386
+libdspam7-dev_3.10.1+dfsg-11_i386
+libdssi-ocaml-dev_0.1.0-1+b1_i386
+libdssialsacompat-dev_1.0.8a-1_i386
+libdtools-ocaml-dev_0.3.0-1_i386
+libdts-dev_0.0.5-5_i386
+libdumb1-dev_1:0.9.3-5.4_i386
+libdumbnet-dev_1.12-3.1_i386
+libdune-common-dev_2.2.0-1_i386
+libdune-geometry-dev_2.2.0-1_i386
+libdune-grid-dev_2.2.0-1_i386
+libdune-istl-dev_2.2.0-1_all
+libdune-localfunctions-dev_2.2.0-1_all
+libduo-dev_1.8-1_i386
+libduo-dev_1.8.1-1~deb7u1_i386
+libduppy-ocaml-dev_0.4.2-1+b2_i386
+libdv4-dev_1.0.0-6_i386
+libdvb-dev_0.5.5.1-5.1_i386
+libdvbcsa-dev_1.1.0-2_i386
+libdvbpsi-dev_0.2.2-1_i386
+libdvdnav-dev_4.2.0+20120524-2_i386
+libdvdread-dev_4.2.0+20120521-2_i386
+libdvdread-dev_4.2.1-2~bpo70+1_i386
+libdw-dev_0.152-1+wheezy1_i386
+libdwarf-dev_20120410-2_i386
+libdx4-dev_1:4.4.4-4+b2_i386
+libdxflib-dev_2.2.0.0-8_i386
+libdynamite-dev_0.1.1-2_i386
+libeasy-format-ocaml-dev_1.0.0-1+b2_i386
+libeb16-dev_4.4.3-6_i386
+libebackend1.2-dev_3.4.4-3_i386
+libebml-dev_1.2.2-2_i386
+libebook1.2-dev_3.4.4-3_i386
+libecal1.2-dev_3.4.4-3_i386
+libecasoundc-dev_2.9.0-1_i386
+libecasoundc2.2-dev_2.9.0-1_all
+libechonest-dev_1.2.1-1_i386
+libecm-dev_6.4.2-1_i386
+libecore-dev_1.2.0-2_i386
+libecpg-dev_9.1.13-0wheezy1_i386
+libecryptfs-dev_99-1_i386
+libedac-dev_0.18-1_i386
+libedata-book1.2-dev_3.4.4-3_i386
+libedata-cal1.2-dev_3.4.4-3_i386
+libedataserver1.2-dev_3.4.4-3_i386
+libedataserverui-3.0-dev_3.4.4-3_i386
+libedbus-dev_1.2.0-1_i386
+libedit-dev_2.11-20080614-5_i386
+libeditline-dev_1.12-6_i386
+libedje-dev_1.2.0-1_i386
+libee-dev_0.4.1-1_i386
+libeegdev-dev_0.2-3_i386
+libeet-dev_1.6.0-1_i386
+libefreet-dev_1.2.0-1_i386
+libegl1-mesa-dev_8.0.5-4+deb7u2_i386
+libeigen2-dev_2.0.17-1_i386
+libeigen3-dev_3.1.0-1_i386
+libeigen3-dev_3.2.1-2~bpo70+1_all
+libeina-dev_1.2.0-2_i386
+libeiskaltdcpp-dev_2.2.9-3~bpo70+1_i386
+libelektra-cpp-dev_0.7.1-1_i386
+libelektra-dev_0.7.1-1_i386
+libelektratools-dev_0.7.1-1_i386
+libelemental-dev_1.2.0-8_i386
+libelementary-dev_0.7.0.55225-1_i386
+libelf-dev_0.152-1+wheezy1_i386
+libelfg0-dev_0.8.13-3_i386
+libeliom-ocaml-dev_2.2.2-1_i386
+libelk0-dev_3.99.8-2_i386
+libelmer-dev_6.1.0.svn.5396.dfsg2-2_i386
+libembryo-dev_1.2.0-1_i386
+libemos-dev_000382+dfsg-2_i386
+libenca-dev_1.13-4_i386
+libenchant-dev_1.6.0-7_i386
+libenet-dev_1.3.3-2_i386
+libepc-dev_0.4.4-1_i386
+libepc-ui-dev_0.4.4-1_i386
+libepr-api2-dev_2.2-2_all
+libepsilon-dev_0.9.1-2_i386
+libept-dev_1.0.9_i386
+libepub-dev_0.2.1-2+b1_i386
+liberis-1.3-dev_1.3.19-5_i386
+liberuby-dev_1.0.5-2.1_i386
+libescpr-dev_1.1.1-2_i386
+libesd0-dev_0.2.41-10+b1_i386
+libesmtp-dev_1.0.6-1+b1_i386
+libespeak-dev_1.46.02-2_i386
+libestools2.1-dev_1:2.1~release-5_i386
+libestr-dev_0.1.1-2_i386
+libestr-dev_0.1.9-1~bpo70+1_i386
+libethos-dev_0.2.2-3_i386
+libethos-ui-dev_0.2.2-3_i386
+libetpan-dev_1.0-5_i386
+libetsf-io-dev_1.0.3-4+b1_i386
+libeurodec1-dev_20061220+dfsg3-2_i386
+libev-dev_1:4.11-1_i386
+libev-libevent-dev_1:4.11-1_all
+libeval0-dev_0.29.6-2_i386
+libevas-dev_1.2.0-2_i386
+libevd-0.1-dev_0.1.20-2_i386
+libevent-dev_2.0.19-stable-3_i386
+libeventdb-dev_0.90-5_i386
+libevince-dev_3.4.0-3.1_i386
+libevocosm-dev_4.0.2-2.1_i386
+libevs-dev_1.4.2-3_i386
+libevtlog-dev_0.2.12-5_i386
+libewf-dev_20100226-1+b1_i386
+libewf-dev_20130416-3~bpo70+1_i386
+libexchangemapi-1.0-dev_3.4.4-1_i386
+libexempi-dev_2.2.0-1_i386
+libexif-dev_0.6.20-3_i386
+libexif-gtk-dev_0.3.5-5_i386
+libexiv2-dev_0.23-1_i386
+libexo-1-dev_0.6.2-5_i386
+libexodusii-dev_5.14.dfsg.1-2+b1_i386
+libexosip2-dev_3.6.0-4_i386
+libexpat-ocaml-dev_0.9.1+debian1-7+b2_i386
+libexpat1-dev_2.1.0-1+deb7u1_i386
+libexpect-ocaml-dev_0.0.2-1+b6_i386
+libexplain-dev_0.52.D002-1_i386
+libextlib-ocaml-dev_1.5.2-1+b1_i386
+libextractor-dev_1:0.6.3-5_i386
+libextractor-java-dev_0.6.0-6_i386
+libexttextcat-dev_3.2.0-2_i386
+libextunix-ocaml-dev_0.0.5-2_i386
+libeztrace-dev_0.7-2-4_i386
+libf2c2-dev_20090411-2_i386
+libfaad-dev_2.7-8_i386
+libfaad-ocaml-dev_0.3.0-1+b1_i386
+libfacile-ocaml-dev_1.1-8+b1_i386
+libfaifa-dev_0.2~svn82-1_i386
+libfakekey-dev_0.1-7_i386
+libfam-dev_2.7.0-17_i386
+libfann-dev_2.1.0~beta~dfsg-8_i386
+libfarstream-0.1-dev_0.1.2-1_i386
+libfastjet-dev_3.0.2+dfsg-2_i386
+libfastjet-fortran-dev_3.0.2+dfsg-2_i386
+libfastjetplugins-dev_3.0.2+dfsg-2_i386
+libfastjettools-dev_3.0.2+dfsg-2_i386
+libfauhdli-dev_20110812-1_i386
+libfcgi-dev_2.4.0-8.1_i386
+libfdt-dev_1.3.0-4_i386
+libfence-dev_3.0.12-3.2+deb7u2_i386
+libffado-dev_2.0.99+svn2171-2_i386
+libffcall1-dev_1.10+cvs20100619-2_i386
+libffi-dev_3.0.10-3_i386
+libffindex0-dev_0.9.6.1-1_i386
+libffmpegthumbnailer-dev_2.0.7-2_i386
+libffms2-dev_2.17-1_i386
+libfftw3-dev_3.3.2-3.1_i386
+libfftw3-mpi-dev_3.3.2-3.1_i386
+libfields-camlp4-dev_107.01-1+b2_i386
+libfileutils-ocaml-dev_0.4.2-1+b2_i386
+libfindlib-ocaml-dev_1.3.1-1_i386
+libfiredns-dev_0.9.12+dfsg-3_i386
+libfirestring-dev_0.9.12-8_i386
+libfishsound1-dev_1.0.0-1.1_i386
+libfiu-dev_0.90-3_i386
+libfixposix-dev_20110316.git47f17f7-1_i386
+libfko0-dev_2.0.0rc2-2+deb7u2_i386
+libfko2-dev_2.5.1-1~bpo70+1_i386
+libflac++-dev_1.2.1-6_i386
+libflac-dev_1.2.1-6_i386
+libflac-ocaml-dev_0.1.1-1_i386
+libflake-dev_0.11-2_i386
+libflann-dev_1.7.1-4_i386
+libflatzebra-dev_0.1.5-4+b1_i386
+libflickrnet-cil-dev_1:2.2.0-4_all
+libflorist2011-dev_2011-1_i386
+libflowcanvas-dev_0.7.1+dfsg0-0.2_i386
+libfltk1.1-dev_1.1.10-14_i386
+libfltk1.3-dev_1.3.0-8_i386
+libfluidsynth-dev_1.1.5-2_i386
+libfm-dev_0.1.17-2.1_i386
+libfm-dev_1.1.2.2-1~bpo70+1_i386
+libfm-gtk-dev_1.1.2.2-1~bpo70+1_i386
+libfolia1-dev_0.9-2_i386
+libfolks-dev_0.6.9-1+b1_i386
+libfolks-eds-dev_0.6.9-1+b1_i386
+libfolks-telepathy-dev_0.6.9-1+b1_i386
+libfontconfig1-dev_2.9.0-7.1_i386
+libfontenc-dev_1:1.1.1-1_i386
+libfontforge-dev_0.0.20120101+git-2_i386
+libforms-dev_1.0.93sp1-2_i386
+libformsgl-dev_1.0.93sp1-2_i386
+libfox-1.6-dev_1.6.45-1_i386
+libfprint-dev_1:0.4.0-4-gdfff16f-4_i386
+libfreecell-solver-dev_3.12.0-1_i386
+libfreefem++-dev_3.19.1-1_i386
+libfreefem-dev_3.5.8-5_i386
+libfreehdl0-dev_0.0.7-1.1_i386
+libfreeimage-dev_3.15.1-1+b1_i386
+libfreeipmi-dev_1.1.5-3_i386
+libfreenect-dev_1:0.1.2+dfsg-6_i386
+libfreeradius-client-dev_1.1.6-7~bpo70+1_i386
+libfreeradius-dev_2.1.12+dfsg-1.2_i386
+libfreerdp-dev_1.0.1-1.1+deb7u3_i386
+libfreetype6-dev_2.4.9-1.1_i386
+libfreexl-dev_1.0.0b-1_i386
+libfribidi-dev_0.19.2-3_i386
+libfs-dev_2:1.0.4-1+deb7u1_i386
+libfso-glib-dev_2012.05.24.1-1.1_i386
+libfsobasics-dev_0.11.0-1.1_i386
+libfsoframework-dev_0.11.0-1.1_i386
+libfsoresource-dev_0.11.0-1.1_i386
+libfsosystem-dev_0.11.0-1_i386
+libfsotransport-dev_0.11.1-2.1_i386
+libfsplib-dev_0.11-2_i386
+libfstrcmp-dev_0.4.D001-1+deb7u1_i386
+libftdi-dev_0.20-1+b1_i386
+libftdipp-dev_0.20-1+b1_i386
+libftgl-dev_2.1.3~rc5-4_i386
+libfuntools-dev_1.4.4-3_i386
+libfuse-dev_2.9.0-2+deb7u1_i386
+libfuzzy-dev_2.7-2_i386
+libfxt-dev_0.2.6-2_i386
+libg15-dev_1.2.7-2_i386
+libg15daemon-client-dev_1.9.5.3-8.2_i386
+libg15render-dev_1.3.0~svn316-2.2_i386
+libg2-dev_0.72-2.1_i386
+libg3d-dev_0.0.8-17_i386
+libga-dev_2.4.7-3_i386
+libgadap-dev_2.0-1_i386
+libgadu-dev_1:1.11.2-1+deb7u1_i386
+libgail-3-dev_3.4.2-7_i386
+libgail-dev_2.24.10-2_i386
+libgalax-ocaml-dev_1.1-10+b3_i386
+libgambc4-dev_4.2.8-1.1_i386
+libgamin-dev_0.1.10-4.1_i386
+libgammu-dev_1.31.90-1+b1_i386
+libganglia1-dev_3.3.8-1+nmu1_i386
+libganv-dev_0~svn4468~dfsg0-1_i386
+libgarcon-1-0-dev_0.1.12-1_i386
+libgarmin-dev_0~svn320-3_i386
+libgatos-dev_0.0.5-19_i386
+libgavl-dev_1.4.0-1_i386
+libgavl-ocaml-dev_0.1.4-1+b1_i386
+libgbm-dev_8.0.5-4+deb7u2_i386
+libgc-dev_1:7.1-9.1_i386
+libgcal-dev_0.9.6-3_i386
+libgccxml-dev_0.9.0+cvs20120420-4_i386
+libgcgi-dev_0.9.5.dfsg-7_i386
+libgcj12-dev_4.6.3-1_i386
+libgcj13-dev_4.7.2-3_i386
+libgck-1-dev_3.4.1-3_i386
+libgconf-bridge-dev_0.1-2.2_i386
+libgconf2-dev_3.2.5-1+build1_i386
+libgconf2.0-cil-dev_2.24.2-3_all
+libgconfmm-2.6-dev_2.28.0-1_i386
+libgcr-3-dev_3.4.1-3_i386
+libgcroots-dev_0.8.5-2.1_i386
+libgcrypt11-dev_1.5.0-5+deb7u1_i386
+libgctp-dev_1.0-1_i386
+libgd-gd2-noxpm-ocaml-dev_1.0~alpha5-5_i386
+libgd2-noxpm-dev_2.0.36~rc1~dfsg-6.1_i386
+libgd2-xpm-dev_2.0.36~rc1~dfsg-6.1_i386
+libgda-5.0-dev_5.0.3-2_i386
+libgdal-dev_1.9.0-3.1_i386
+libgdal1-dev_1.9.0-3.1_all
+libgdata-cil-dev_2.1.0.0-1_all
+libgdata-dev_0.12.0-1_i386
+libgdb-dev_7.4.1+dfsg-0.1_i386
+libgdbm-dev_1.8.3-11_i386
+libgdchart-gd2-noxpm-dev_0.11.5-7+b1_i386
+libgdchart-gd2-xpm-dev_0.11.5-7+b1_i386
+libgdcm2-dev_2.2.0-14.1_i386
+libgdf-dev_0.1.2-2_i386
+libgdict-1.0-dev_3.4.0-2_i386
+libgdk-pixbuf2.0-dev_2.26.1-1_i386
+libgdkcutter-pixbuf-dev_1.1.7-1.2_i386
+libgdl-3-dev_3.4.2-1_i386
+libgdome2-cpp-smart-dev_0.2.6-6+b1_i386
+libgdome2-dev_0.8.1+debian-4.1_i386
+libgdome2-ocaml-dev_0.2.6-6+b1_i386
+libgdu-dev_3.0.2-3_i386
+libgdu-gtk-dev_3.0.2-3_i386
+libgeant321-2-dev_1:3.21.14.dfsg-10_i386
+libgearman-dev_0.33-2_i386
+libgecode-dev_3.7.3-1_i386
+libgeda-dev_1:1.6.2-4.3_i386
+libgee-dev_0.6.4-2_i386
+libgegl-dev_0.2.0-2+nmu1_i386
+libgeier-dev_0.13-1+b1_i386
+libgenders0-dev_1.18-1_i386
+libgenome-1.3-0-dev_1.3.1-3_i386
+libgensec-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libgeoclue-dev_0.12.0-4_i386
+libgeocode-glib-dev_0.99.0-1_i386
+libgeographiclib-dev_1.21-1_i386
+libgeoip-dev_1.4.8+dfsg-3_i386
+libgeoip-dev_1.5.0-3~bpo70+1_i386
+libgeomview-dev_1.9.4-3_i386
+libgeos++-dev_3.3.3-1.1_i386
+libgeos-dev_3.3.3-1.1_i386
+libgeotiff-dev_1.3.0+dfsg-3_i386
+libgeotranz3-dev_3.1-2.1_i386
+libges-0.10-dev_0.10.1-2_i386
+libgetdata-dev_0.7.3-6_i386
+libgetfem++-dev_4.1.1+dfsg1-11_i386
+libgetopt++-dev_0.0.2-p22-3_i386
+libgetopt-ocaml-dev_0.0.20040811-10+b3_i386
+libgettext-ocaml-dev_0.3.4-1+b2_i386
+libgettextpo-dev_0.18.3-1~bpo7+1_i386
+libgexiv2-dev_0.4.1-3_i386
+libgfarm-dev_2.4.1-1.1_i386
+libgflags-dev_2.0-1_i386
+libgfshare-dev_1.0.5-2_i386
+libghc-acid-state-dev_0.6.3-1+b2_i386
+libghc-active-dev_0.1.0.1-2+b2_i386
+libghc-adjunctions-dev_2.4.0.2-1_i386
+libghc-aeson-dev_0.6.0.2-1+b4_i386
+libghc-agda-dev_2.3.0.1-2_i386
+libghc-algebra-dev_2.1.1.2-1_i386
+libghc-alut-dev_2.1.0.2-4+b1_i386
+libghc-ami-dev_0.1-1+b5_i386
+libghc-ansi-terminal-dev_0.5.5-3+b1_i386
+libghc-ansi-wl-pprint-dev_0.6.4-1+b1_i386
+libghc-arrows-dev_0.4.4.0-3+b1_i386
+libghc-asn1-data-dev_0.6.1.3-2+b3_i386
+libghc-async-dev_2.0.1.3-1~bpo70+1_i386
+libghc-attempt-dev_0.4.0-1+b2_i386
+libghc-attoparsec-conduit-dev_0.4.0.1-1_i386
+libghc-attoparsec-dev_0.10.1.1-2+b1_i386
+libghc-attoparsec-enumerator-dev_0.3-3+b3_i386
+libghc-augeas-dev_0.6.1-1_i386
+libghc-authenticate-dev_1.2.1.1-2+b1_i386
+libghc-base-unicode-symbols-dev_0.2.2.3-1+b1_i386
+libghc-base16-bytestring-dev_0.1.1.4-2+b1_i386
+libghc-base64-bytestring-dev_0.1.1.1-2_i386
+libghc-base64-bytestring-dev_1.0.0.1-1~bpo70+1_i386
+libghc-bifunctors-dev_0.1.3.3-1+b1_i386
+libghc-binary-shared-dev_0.8.1-1+b1_i386
+libghc-bindings-dsl-dev_1.0.15-1+b1_i386
+libghc-bindings-gpgme-dev_0.1.4-1_i386
+libghc-bindings-libzip-dev_0.10-2_i386
+libghc-bitarray-dev_0.0.1-2+b1_i386
+libghc-blaze-builder-conduit-dev_0.4.0.2-1_i386
+libghc-blaze-builder-dev_0.3.1.0-1+b2_i386
+libghc-blaze-builder-enumerator-dev_0.2.0.4-1+b1_i386
+libghc-blaze-html-dev_0.4.3.1-3+b2_i386
+libghc-blaze-markup-dev_0.5.1.0-1_i386
+libghc-blaze-textual-dev_0.2.0.6-2+b2_i386
+libghc-bloomfilter-dev_1.2.6.8-1_i386
+libghc-boolean-dev_0.0.1-2+b1_i386
+libghc-boomerang-dev_1.3.1-1_i386
+libghc-brainfuck-dev_0.1-2+b2_i386
+libghc-byteorder-dev_1.0.3-2+b1_i386
+libghc-bytestring-lexing-dev_0.4.0-1+b1_i386
+libghc-bytestring-mmap-dev_0.2.2-2+b1_i386
+libghc-bytestring-nums-dev_0.3.5-2+b1_i386
+libghc-bytestring-show-dev_0.3.5.1-1+b1_i386
+libghc-bzlib-dev_0.5.0.3-2+b1_i386
+libghc-cabal-file-th-dev_0.2.2-1_i386
+libghc-cairo-dev_0.12.3-1+b1_i386
+libghc-case-insensitive-dev_0.4.0.1-2+b2_i386
+libghc-categories-dev_1.0.3-1+b1_i386
+libghc-cautious-file-dev_1.0.1-1_i386
+libghc-cereal-conduit-dev_0.5-1+b1_i386
+libghc-cereal-dev_0.3.5.2-1_i386
+libghc-certificate-dev_1.2.3-2_i386
+libghc-cgi-dev_3001.1.8.2-2+b3_i386
+libghc-chart-dev_0.15-1+b2_i386
+libghc-chell-dev_0.3-1_i386
+libghc-citeproc-hs-dev_0.3.4-1+b4_i386
+libghc-clientsession-dev_0.7.5-3+b1_i386
+libghc-clock-dev_0.2.0.0-2+b1_i386
+libghc-cmdargs-dev_0.9.5-1+b1_i386
+libghc-colour-dev_2.3.3-1+b1_i386
+libghc-comonad-dev_1.1.1.5-1+b1_i386
+libghc-comonad-transformers-dev_2.1.1.1-1+b1_i386
+libghc-comonads-fd-dev_2.1.1.2-1+b1_i386
+libghc-conduit-dev_0.4.2-2_i386
+libghc-configfile-dev_1.0.6-4+b3_i386
+libghc-configurator-dev_0.2.0.0-1+b2_i386
+libghc-contravariant-dev_0.2.0.2-1+b1_i386
+libghc-convertible-dev_1.0.11.0-3+b3_i386
+libghc-cookie-dev_0.4.0-1+b3_i386
+libghc-cpphs-dev_1.13.3-2+b1_i386
+libghc-cprng-aes-dev_0.2.3-3+b4_i386
+libghc-cpu-dev_0.1.1-1_i386
+libghc-criterion-dev_0.6.0.1-3+b4_i386
+libghc-crypto-api-dev_0.10.2-1+b2_i386
+libghc-crypto-conduit-dev_0.3.2-1+b1_i386
+libghc-crypto-dev_4.2.4-1+b1_i386
+libghc-crypto-pubkey-types-dev_0.1.1-1+b3_i386
+libghc-cryptocipher-dev_0.3.5-1+b1_i386
+libghc-cryptohash-dev_0.7.5-1+b2_i386
+libghc-css-text-dev_0.1.1-3+b2_i386
+libghc-csv-conduit-dev_0.2-1_i386
+libghc-csv-dev_0.1.2-2+b3_i386
+libghc-curl-dev_1.3.7-1+b1_i386
+libghc-darcs-dev_2.8.1-1+b1_i386
+libghc-data-accessor-dev_0.2.2.2-1+b1_i386
+libghc-data-accessor-mtl-dev_0.2.0.3-1+b1_i386
+libghc-data-accessor-template-dev_0.2.1.9-1+b2_i386
+libghc-data-binary-ieee754-dev_0.4.2.1-3+b1_i386
+libghc-data-default-dev_0.4.0-1_i386
+libghc-data-inttrie-dev_0.0.7-1+b1_i386
+libghc-data-lens-dev_2.10.0-1+b1_i386
+libghc-data-memocombinators-dev_0.4.3-1+b1_i386
+libghc-dataenc-dev_0.14.0.3-1+b1_i386
+libghc-datetime-dev_0.2.1-3_i386
+libghc-dbus-dev_0.10.3-1_i386
+libghc-debian-dev_3.64-3_i386
+libghc-diagrams-cairo-dev_0.5.0.2-1_i386
+libghc-diagrams-core-dev_0.5.0.1-1+b1_i386
+libghc-diagrams-dev_0.5-2_all
+libghc-diagrams-lib-dev_0.5-2_i386
+libghc-diff-dev_0.1.3-1+b1_i386
+libghc-digest-dev_0.0.1.0-1+b1_i386
+libghc-dimensional-dev_0.10.1.2-2+b1_i386
+libghc-directory-tree-dev_0.10.0-2+b1_i386
+libghc-distributive-dev_0.2.2-1+b1_i386
+libghc-dlist-dev_0.5-3+b1_i386
+libghc-doctest-dev_0.9.1-1~bpo70+1_i386
+libghc-download-curl-dev_0.1.3-3+b3_i386
+libghc-dpkg-dev_0.0.3-1_i386
+libghc-dyre-dev_0.8.7-1_i386
+libghc-edison-api-dev_1.2.1-18+b1_i386
+libghc-edison-core-dev_1.2.1.3-9+b1_i386
+libghc-edit-distance-dev_0.2.1-2_i386
+libghc-editline-dev_0.2.1.0-5+b1_i386
+libghc-ekg-dev_0.3.1.0-1+b2_i386
+libghc-email-validate-dev_0.2.8-1+b3_i386
+libghc-entropy-dev_0.2.1-2+b1_i386
+libghc-enumerator-dev_0.4.19-1+b1_i386
+libghc-erf-dev_2.0.0.0-2+b1_i386
+libghc-event-list-dev_0.1.0.1-1+b1_i386
+libghc-exception-transformers-dev_0.3.0.2-1+b1_i386
+libghc-exceptions-dev_0.5-1~bpo70+1_i386
+libghc-executable-path-dev_0.0.3-1+b1_i386
+libghc-explicit-exception-dev_0.1.7-1+b1_i386
+libghc-failure-dev_0.2.0.1-1+b1_i386
+libghc-fast-logger-dev_0.0.2-1+b2_i386
+libghc-fastcgi-dev_3001.0.2.3-3+b3_i386
+libghc-fclabels-dev_1.1.3-1+b1_i386
+libghc-feed-dev_0.3.8-3_i386
+libghc-fgl-dev_5.4.2.4-2+b2_i386
+libghc-file-embed-dev_0.0.4.4-1_i386
+libghc-filemanip-dev_0.3.5.2-2+b2_i386
+libghc-filestore-dev_0.5-1_i386
+libghc-filesystem-conduit-dev_0.4.0-1_i386
+libghc-free-dev_2.1.1.1-1+b1_i386
+libghc-ftphs-dev_1.0.8-1+b3_i386
+libghc-gconf-dev_0.12.1-1+b1_i386
+libghc-gd-dev_3000.7.3-1_i386
+libghc-generic-deriving-dev_1.4.0-2~bpo70+1_i386
+libghc-ghc-events-dev_0.4.0.0-2+b1_i386
+libghc-ghc-mtl-dev_1.0.1.1-1+b3_i386
+libghc-ghc-paths-dev_0.1.0.8-2+b1_i386
+libghc-ghc-syb-utils-dev_0.2.1.0-1+b3_i386
+libghc-gio-dev_0.12.3-1+b1_i386
+libghc-github-dev_0.4.0-2_i386
+libghc-gitit-dev_0.10.0.1-1+b1_i386
+libghc-glade-dev_0.12.1-1+b3_i386
+libghc-glfw-dev_0.5.0.1-1+b1_i386
+libghc-glib-dev_0.12.2-1+b1_i386
+libghc-glut-dev_2.1.2.2-1_i386
+libghc-gnuidn-dev_0.2-2+b2_i386
+libghc-gnutls-dev_0.1.2-1+b1_i386
+libghc-gnutls-dev_0.1.4-3~bpo70+1_i386
+libghc-gsasl-dev_0.3.4-1+b1_i386
+libghc-gstreamer-dev_0.12.1-1+b2_i386
+libghc-gtk-dev_0.12.3-1+b2_i386
+libghc-gtkglext-dev_0.12.1-1+b3_i386
+libghc-gtksourceview2-dev_0.12.3-1+b3_i386
+libghc-haddock-dev_2.10.0-1+b2_i386
+libghc-hakyll-dev_3.2.7.2-1+b5_i386
+libghc-hamlet-dev_1.0.1.3-1+b1_i386
+libghc-happstack-dev_7.0.0-1+b1_i386
+libghc-happstack-server-dev_7.0.1-1+b1_i386
+libghc-harp-dev_0.4-3+b1_i386
+libghc-hashable-dev_1.1.2.3-1+b2_i386
+libghc-hashed-storage-dev_0.5.9-2+b2_i386
+libghc-hashmap-dev_1.3.0.1-1+b2_i386
+libghc-hashtables-dev_1.0.1.4-1+b1_i386
+libghc-haskeline-dev_0.6.4.7-1+b1_i386
+libghc-haskell-lexer-dev_1.0-3+b1_i386
+libghc-haskell-src-dev_1.0.1.5-1+b2_i386
+libghc-haskelldb-dev_2.1.1-5+b1_i386
+libghc-haskelldb-hdbc-dev_2.1.0-4_i386
+libghc-haskelldb-hdbc-odbc-dev_2.1.0-3_i386
+libghc-haskelldb-hdbc-postgresql-dev_2.1.0-3_i386
+libghc-haskelldb-hdbc-sqlite3-dev_2.1.0-3_i386
+libghc-haskore-dev_0.2.0.3-2_i386
+libghc-hastache-dev_0.3.3-2+b3_i386
+libghc-haxml-dev_1:1.22.5-2+b2_i386
+libghc-haxr-dev_3000.8.5-1+b3_i386
+libghc-hcard-dev_0.0-2+b2_i386
+libghc-hcwiid-dev_0.0.1-3+b1_i386
+libghc-hdbc-dev_2.3.1.1-1+b3_i386
+libghc-hdbc-odbc-dev_2.2.3.0-5+b3_i386
+libghc-hdbc-postgresql-dev_2.3.2.1-1+b3_i386
+libghc-hdbc-sqlite3-dev_2.3.3.0-1+b3_i386
+libghc-hfuse-dev_0.2.4.1-1_i386
+libghc-highlighting-kate-dev_0.5.1-1_i386
+libghc-hinotify-dev_0.3.2-1+b1_i386
+libghc-hint-dev_0.3.3.4-2+b4_i386
+libghc-hipmunk-dev_5.2.0.8-1+b1_i386
+libghc-hjavascript-dev_0.4.7-3+b1_i386
+libghc-hjscript-dev_0.5.0-3+b2_i386
+libghc-hjsmin-dev_0.1.1-1+b2_i386
+libghc-hlint-dev_1.8.28-1+b3_i386
+libghc-hoauth-dev_0.3.4-1+b1_i386
+libghc-hostname-dev_1.0-4+b1_i386
+libghc-hs-bibutils-dev_4.12-5+b2_i386
+libghc-hs3-dev_0.5.6-2+b4_i386
+libghc-hscolour-dev_1.19-3+b1_i386
+libghc-hscurses-dev_1.4.1.0-1+b2_i386
+libghc-hsemail-dev_1.7.1-2+b3_i386
+libghc-hsh-dev_2.0.3-6+b3_i386
+libghc-hslogger-dev_1.1.4+dfsg1-2+b3_i386
+libghc-hsp-dev_0.6.1-2+b3_i386
+libghc-hspec-dev_1.1.0-1+b1_i386
+libghc-hsql-dev_1.8.1-4_i386
+libghc-hsql-mysql-dev_1.8.1-4+b1_i386
+libghc-hsql-odbc-dev_1.8.1.1-2_i386
+libghc-hsql-postgresql-dev_1.8.1-3_i386
+libghc-hsql-sqlite3-dev_1.8.1-2_i386
+libghc-hssyck-dev_0.50-2+b2_i386
+libghc-hstringtemplate-dev_0.6.8-1_i386
+libghc-hsx-dev_0.9.1-3_i386
+libghc-html-conduit-dev_0.0.1-2_i386
+libghc-html-dev_1.0.1.2-5+b1_i386
+libghc-http-conduit-dev_1.4.1.6-3_i386
+libghc-http-date-dev_0.0.2-1+b2_i386
+libghc-http-dev_1:4000.2.3-1+b2_i386
+libghc-http-types-dev_0.6.11-1_i386
+libghc-hunit-dev_1.2.4.2-2+b1_i386
+libghc-hxt-cache-dev_9.0.2-2+b3_i386
+libghc-hxt-charproperties-dev_9.1.1-2+b1_i386
+libghc-hxt-curl-dev_9.1.1-1+b4_i386
+libghc-hxt-dev_9.2.2-2+b3_i386
+libghc-hxt-http-dev_9.1.4-2+b3_i386
+libghc-hxt-regex-xmlschema-dev_9.0.4-2+b3_i386
+libghc-hxt-relaxng-dev_9.1.4-1+b3_i386
+libghc-hxt-tagsoup-dev_9.1.1-1+b4_i386
+libghc-hxt-unicode-dev_9.0.2-2+b1_i386
+libghc-hxt-xpath-dev_9.1.2-1+b4_i386
+libghc-hxt-xslt-dev_9.1.1-1+b3_i386
+libghc-iconv-dev_0.4.1.0-2+b1_i386
+libghc-ieee754-dev_0.7.3-1+b1_i386
+libghc-ifelse-dev_0.85-4+b1_i386
+libghc-io-choice-dev_0.0.1-1+b3_i386
+libghc-io-storage-dev_0.3-2+b1_i386
+libghc-iospec-dev_0.2.5-1+b2_i386
+libghc-irc-dev_0.5.0.0-1+b3_i386
+libghc-iteratee-dev_0.8.8.2-2+b1_i386
+libghc-ixset-dev_1.0.3-2+b1_i386
+libghc-json-dev_0.5-2+b2_i386
+libghc-keys-dev_2.1.3.2-1+b1_i386
+libghc-knob-dev_0.1.1-1_i386
+libghc-lambdabot-utils-dev_4.2.1-3+b3_i386
+libghc-language-c-dev_0.4.2-2+b2_i386
+libghc-language-haskell-extract-dev_0.2.1-4+b1_i386
+libghc-language-javascript-dev_0.5.4-1+b2_i386
+libghc-largeword-dev_1.0.1-2+b1_i386
+libghc-lazysmallcheck-dev_0.6-1+b1_i386
+libghc-ldap-dev_0.6.6-4.1+b1_i386
+libghc-leksah-server-dev_0.12.0.4-3_i386
+libghc-libtagc-dev_0.12.0-2+b1_i386
+libghc-libxml-sax-dev_0.7.2-2+b1_i386
+libghc-libzip-dev_0.10-1+b2_i386
+libghc-lifted-base-dev_0.1.1-1+b1_i386
+libghc-listlike-dev_3.1.4-1+b1_i386
+libghc-llvm-base-dev_3.0.1.0-1_i386
+libghc-llvm-dev_3.0.1.0-1+b1_i386
+libghc-logict-dev_0.5.0.1-1+b1_i386
+libghc-ltk-dev_0.12.0.0-2+b1_i386
+libghc-maccatcher-dev_2.1.5-2+b3_i386
+libghc-magic-dev_1.0.8-8+b1_i386
+libghc-markov-chain-dev_0.0.3.2-1+b1_i386
+libghc-math-functions-dev_0.1.1.0-2+b2_i386
+libghc-maths-dev_0.4.3-1+b1_i386
+libghc-maybet-dev_0.1.2-3+b2_i386
+libghc-mbox-dev_0.1-2+b1_i386
+libghc-memotrie-dev_0.5-1_i386
+libghc-mersenne-random-dev_1.0.0.1-2+b1_i386
+libghc-midi-dev_0.2.0.1-1+b1_i386
+libghc-mime-mail-dev_0.4.1.1-2+b3_i386
+libghc-missingh-dev_1.1.0.3-6+b3_i386
+libghc-mmap-dev_0.5.7-2+b1_i386
+libghc-monad-control-dev_0.3.1.3-1+b1_i386
+libghc-monad-loops-dev_0.3.2.0-1_i386
+libghc-monad-par-dev_0.1.0.3-2+b1_i386
+libghc-monadcatchio-mtl-dev_0.3.0.4-2+b2_i386
+libghc-monadcatchio-transformers-dev_0.3.0.0-2+b1_i386
+libghc-monadcryptorandom-dev_0.4.1-1+b2_i386
+libghc-monadrandom-dev_0.1.6-2+b2_i386
+libghc-monads-tf-dev_0.1.0.0-1+b2_i386
+libghc-monoid-transformer-dev_0.0.2-3+b1_i386
+libghc-mtl-dev_2.1.1-1_i386
+libghc-mtlparse-dev_0.1.2-2+b2_i386
+libghc-murmur-hash-dev_0.1.0.5-2+b1_i386
+libghc-mwc-random-dev_0.11.0.0-4+b1_i386
+libghc-ncurses-dev_0.2.1-1+b1_i386
+libghc-netwire-dev_3.1.0-2+b5_i386
+libghc-network-conduit-dev_0.4.0.1-2_i386
+libghc-network-dev_2.3.0.13-1+b2_i386
+libghc-network-info-dev_0.2.0.1-2~bpo70+1_i386
+libghc-network-multicast-dev_0.0.10-1~bpo70+1_i386
+libghc-network-protocol-xmpp-dev_0.4.3-1_i386
+libghc-network-protocol-xmpp-dev_0.4.4-2~bpo70+1_i386
+libghc-newtype-dev_0.2-1_i386
+libghc-non-negative-dev_0.1-2+b1_i386
+libghc-numbers-dev_2009.8.9-2+b1_i386
+libghc-numeric-quest-dev_0.2-1+b1_i386
+libghc-numinstances-dev_1.0-2+b1_i386
+libghc-numtype-dev_1.0-2+b1_i386
+libghc-oeis-dev_0.3.1-2+b3_i386
+libghc-openal-dev_1.3.1.3-4+b1_i386
+libghc-opengl-dev_2.2.3.1-1+b1_i386
+libghc-openpgp-asciiarmor-dev_0.1-1+b2_i386
+libghc-options-dev_0.1.1-1_i386
+libghc-pandoc-dev_1.9.4.2-2_i386
+libghc-pandoc-types-dev_1.9.1-1+b2_i386
+libghc-pango-dev_0.12.2-1+b2_i386
+libghc-parallel-dev_3.2.0.2-2+b1_i386
+libghc-parseargs-dev_0.1.3.2-2+b1_i386
+libghc-parsec2-dev_2.1.0.1-6+b1_i386
+libghc-parsec3-dev_3.1.2-1+b3_i386
+libghc-pastis-dev_0.1.2-2+b3_i386
+libghc-path-pieces-dev_0.1.0-1+b2_i386
+libghc-patience-dev_0.1.1-1_i386
+libghc-pcre-light-dev_0.4-3+b1_i386
+libghc-pem-dev_0.1.1-1+b3_i386
+libghc-persistent-dev_0.9.0.4-2_i386
+libghc-persistent-sqlite-dev_0.9.0.2-2_i386
+libghc-persistent-template-dev_0.9.0.2-1_i386
+libghc-polyparse-dev_1.7-1+b2_i386
+libghc-pool-conduit-dev_0.1.0.2-1_i386
+libghc-postgresql-libpq-dev_0.8.2-1_i386
+libghc-postgresql-simple-dev_0.1.4.3-1_i386
+libghc-pretty-show-dev_1.1.1-4+b1_i386
+libghc-primes-dev_0.2.1.0-2+b1_i386
+libghc-primitive-dev_0.4.1-1+b1_i386
+libghc-psqueue-dev_1.1-2+b1_i386
+libghc-puremd5-dev_2.1.0.3-2+b4_i386
+libghc-pwstore-fast-dev_2.2-2+b4_i386
+libghc-quickcheck1-dev_1.2.0.1-2+b1_i386
+libghc-quickcheck2-dev_2.4.2-1+b1_i386
+libghc-random-dev_1.0.1.1-1+b1_i386
+libghc-random-shuffle-dev_0.0.3-2+b2_i386
+libghc-ranged-sets-dev_0.3.0-2+b1_i386
+libghc-ranges-dev_0.2.4-2+b1_i386
+libghc-reactive-banana-dev_0.6.0.0-1+b3_i386
+libghc-readline-dev_1.0.1.0-3+b1_i386
+libghc-recaptcha-dev_0.1-4+b3_i386
+libghc-regex-base-dev_0.93.2-2+b2_i386
+libghc-regex-compat-dev_0.95.1-2+b1_i386
+libghc-regex-pcre-dev_0.94.2-2+b1_i386
+libghc-regex-posix-dev_0.95.1-2+b1_i386
+libghc-regex-tdfa-dev_1.1.8-2+b1_i386
+libghc-regex-tdfa-utf8-dev_1.0-5+b3_i386
+libghc-regexpr-dev_0.5.4-2+b2_i386
+libghc-representable-functors-dev_2.4.0.2-1+b1_i386
+libghc-representable-tries-dev_2.4.0.2-1_i386
+libghc-resource-pool-dev_0.2.1.0-2+b4_i386
+libghc-resourcet-dev_0.3.2.1-1+b1_i386
+libghc-rsa-dev_1.2.1.0-1+b1_i386
+libghc-safe-dev_0.3.3-1+b1_i386
+libghc-safecopy-dev_0.6.1-1+b1_i386
+libghc-safesemaphore-dev_0.9.0-1~bpo70+1_i386
+libghc-sdl-dev_0.6.3-1+b1_i386
+libghc-sdl-gfx-dev_0.6.0-3+b1_i386
+libghc-sdl-image-dev_0.6.1-3+b1_i386
+libghc-sdl-mixer-dev_0.6.1-3+b1_i386
+libghc-sdl-ttf-dev_0.6.1-3+b1_i386
+libghc-semigroupoids-dev_1.3.1.2-1+b1_i386
+libghc-semigroups-dev_0.8.3.2-1_i386
+libghc-sendfile-dev_0.7.6-1+b2_i386
+libghc-sha-dev_1.5.0.1-1_i386
+libghc-shakespeare-css-dev_1.0.1.2-1+b1_i386
+libghc-shakespeare-dev_1.0.0.2-1+b1_i386
+libghc-shakespeare-i18n-dev_1.0.0.2-1+b1_i386
+libghc-shakespeare-js-dev_1.0.0.2-1+b1_i386
+libghc-shakespeare-text-dev_1.0.0.2-1+b1_i386
+libghc-shellac-dev_0.9.5.1-2+b2_i386
+libghc-show-dev_0.4.1.2-1+b2_i386
+libghc-silently-dev_1.1.4-1+b2_i386
+libghc-simple-sendfile-dev_0.2.3-1+b2_i386
+libghc-simpleea-dev_0.1.1-2+b2_i386
+libghc-simpleirc-dev_0.2.1-2+b3_i386
+libghc-skein-dev_0.1.0.7-2+b1_i386
+libghc-smallcheck-dev_0.6-1+b1_i386
+libghc-smtpclient-dev_1.0.4-3+b3_i386
+libghc-snap-core-dev_0.8.1-1+b4_i386
+libghc-snap-server-dev_0.8.1.1-1_i386
+libghc-socks-dev_0.4.1-1+b4_i386
+libghc-split-dev_0.1.4.2-2_i386
+libghc-src-exts-dev_1.11.1-3+b1_i386
+libghc-statevar-dev_1.0.0.0-2+b1_i386
+libghc-static-hash-dev_0.0.1-3+b2_i386
+libghc-statistics-dev_0.10.1.0-2+b1_i386
+libghc-stm-dev_2.3-1_i386
+libghc-stream-dev_0.4.6-1+b1_i386
+libghc-strict-concurrency-dev_0.2.4.1-2+b1_i386
+libghc-strict-dev_0.3.2-2+b1_i386
+libghc-strptime-dev_1.0.6-1_i386
+libghc-svgcairo-dev_0.12.1-1+b2_i386
+libghc-syb-dev_0.3.6.1-1_i386
+libghc-syb-with-class-dev_0.6.1.3-1+b1_i386
+libghc-syb-with-class-instances-text-dev_0.0.1-3+b2_i386
+libghc-system-fileio-dev_0.3.8-1_i386
+libghc-system-filepath-dev_0.4.6-1+b2_i386
+libghc-tagged-dev_0.4.2.1-1_i386
+libghc-tagsoup-dev_0.12.6-1+b3_i386
+libghc-tagstream-conduit-dev_0.3.2-1_i386
+libghc-tar-dev_0.3.2.0-2+b1_i386
+libghc-template-dev_0.2.0.7-1+b1_i386
+libghc-temporary-dev_1.1.2.3-1+b1_i386
+libghc-terminfo-dev_0.3.2.3-1+b1_i386
+libghc-test-framework-dev_0.6-1+b1_i386
+libghc-test-framework-hunit-dev_0.2.7-1+b3_i386
+libghc-test-framework-quickcheck2-dev_0.2.12.1-1+b1_i386
+libghc-test-framework-th-dev_0.2.2-5_i386
+libghc-test-framework-th-prime-dev_0.0.5-1_i386
+libghc-testpack-dev_2.1.1-1+b2_i386
+libghc-texmath-dev_0.6.0.6-1+b2_i386
+libghc-text-dev_0.11.2.0-1_i386
+libghc-text-icu-dev_0.6.3.4-2+b2_i386
+libghc-tinyurl-dev_0.1.0-2+b3_i386
+libghc-tls-dev_0.9.5-1+b4_i386
+libghc-tls-extra-dev_0.4.6.1-2_i386
+libghc-tokyocabinet-dev_0.0.5-5+b3_i386
+libghc-transformers-base-dev_0.4.1-2+b2_i386
+libghc-transformers-dev_0.3.0.0-1_i386
+libghc-type-level-dev_0.2.4-5_i386
+libghc-uniplate-dev_1.6.7-1+b2_i386
+libghc-unix-bytestring-dev_0.3.5-2+b1_i386
+libghc-unix-compat-dev_0.3.0.1-1+b1_i386
+libghc-unixutils-dev_1.50-1+b1_i386
+libghc-unlambda-dev_0.1-2+b2_i386
+libghc-unordered-containers-dev_0.2.1.0-1_i386
+libghc-uri-dev_0.1.6-1+b2_i386
+libghc-url-dev_2.1.2-4+b1_i386
+libghc-utf8-light-dev_0.4.0.1-2+b1_i386
+libghc-utf8-string-dev_0.3.7-1+b1_i386
+libghc-utility-ht-dev_0.0.5.1-3+b1_i386
+libghc-uuagc-cabal-dev_1.0.2.0-1+b1_i386
+libghc-uuid-dev_1.2.3-2+b4_i386
+libghc-uulib-dev_0.9.14-2_i386
+libghc-vault-dev_0.2.0.0-1+b2_i386
+libghc-vector-algorithms-dev_0.5.4-1+b2_i386
+libghc-vector-dev_0.9.1-2+b1_i386
+libghc-vector-space-dev_0.8.1-1_i386
+libghc-vector-space-points-dev_0.1.1.0-1+b1_i386
+libghc-void-dev_0.5.5.1-2+b1_i386
+libghc-vte-dev_0.12.1-1+b3_i386
+libghc-vty-dev_4.7.0.14-1+b1_i386
+libghc-wai-app-file-cgi-dev_0.5.8-1+b4_i386
+libghc-wai-app-static-dev_1.2.0.3-1+b3_i386
+libghc-wai-dev_1.2.0.2-1+b2_i386
+libghc-wai-extra-dev_1.2.0.4-1_i386
+libghc-wai-logger-dev_0.1.4-1+b6_i386
+libghc-wai-logger-prefork-dev_0.1.3-1+b6_i386
+libghc-wai-test-dev_1.2.0.2-1_i386
+libghc-warp-dev_1.2.1.1-1_i386
+libghc-warp-tls-dev_1.2.0.4-1+b4_i386
+libghc-web-routes-dev_0.25.3-2+b3_i386
+libghc-webkit-dev_0.12.3-2+b1_i386
+libghc-weighted-regexp-dev_0.3.1.1-2+b1_i386
+libghc-x11-dev_1.5.0.1-1+b2_i386
+libghc-x11-xft-dev_0.3.1-1+b3_i386
+libghc-xdg-basedir-dev_0.2.1-2+b1_i386
+libghc-xhtml-dev_3000.2.1-1_i386
+libghc-xml-conduit-dev_0.7.0.2-1_i386
+libghc-xml-dev_1.3.12-1+b2_i386
+libghc-xml-hamlet-dev_0.3.0.1-1~bpo70+1_i386
+libghc-xml-types-dev_0.3.1-2+b2_i386
+libghc-xml2html-dev_0.1.2.3-1_i386
+libghc-xmonad-contrib-dev_0.10-4~deb7u1_i386
+libghc-xmonad-dev_0.10-4+b2_i386
+libghc-xss-sanitize-dev_0.3.2-1+b1_i386
+libghc-yaml-dev_0.7.0.2-1+b2_i386
+libghc-yaml-light-dev_0.1.4-2+b2_i386
+libghc-yesod-auth-dev_1.0.2.1-2+b2_i386
+libghc-yesod-core-dev_1.0.1.2-1+b3_i386
+libghc-yesod-default-dev_1.0.1.1-1+b1_i386
+libghc-yesod-dev_1.0.1.6-2+b3_i386
+libghc-yesod-form-dev_1.0.0.4-1+b1_i386
+libghc-yesod-json-dev_1.0.0.1-1+b3_i386
+libghc-yesod-markdown-dev_0.4.0-1+b3_i386
+libghc-yesod-persistent-dev_1.0.0.1-1+b1_i386
+libghc-yesod-routes-dev_1.0.1.2-1_i386
+libghc-yesod-static-dev_1.0.0.2-1+b3_i386
+libghc-yesod-test-dev_0.2.0.6-1_i386
+libghc-zip-archive-dev_0.1.1.7-3+b2_i386
+libghc-zlib-bindings-dev_0.1.0.1-1_i386
+libghc-zlib-conduit-dev_0.4.0.1-1_i386
+libghc-zlib-dev_0.5.3.3-1+b1_i386
+libghc-zlib-enum-dev_0.2.2.1-1+b1_i386
+libghc6-agda-dev_1:8_all
+libghc6-alut-dev_1:8_all
+libghc6-arrows-dev_1:8_all
+libghc6-binary-dev_1:8_all
+libghc6-binary-shared-dev_1:8_all
+libghc6-bzlib-dev_1:8_all
+libghc6-cairo-dev_1:8_all
+libghc6-cautious-file-dev_1:8_all
+libghc6-cgi-dev_1:8_all
+libghc6-colour-dev_1:8_all
+libghc6-configfile-dev_1:8_all
+libghc6-convertible-dev_1:8_all
+libghc6-cpphs-dev_1:8_all
+libghc6-criterion-dev_1:8_all
+libghc6-csv-dev_1:8_all
+libghc6-curl-dev_1:8_all
+libghc6-data-accessor-dev_1:8_all
+libghc6-dataenc-dev_1:8_all
+libghc6-datetime-dev_1:8_all
+libghc6-debian-dev_1:8_all
+libghc6-deepseq-dev_1:8_all
+libghc6-diagrams-dev_1:8_all
+libghc6-diff-dev_1:8_all
+libghc6-digest-dev_1:8_all
+libghc6-edison-api-dev_1:8_all
+libghc6-edison-core-dev_1:8_all
+libghc6-editline-dev_1:8_all
+libghc6-erf-dev_1:8_all
+libghc6-event-list-dev_1:8_all
+libghc6-explicit-exception-dev_1:8_all
+libghc6-fastcgi-dev_1:8_all
+libghc6-feed-dev_1:8_all
+libghc6-fgl-dev_1:8_all
+libghc6-filemanip-dev_1:8_all
+libghc6-filestore-dev_1:8_all
+libghc6-ftphs-dev_1:8_all
+libghc6-gconf-dev_1:8_all
+libghc6-ghc-events-dev_1:8_all
+libghc6-ghc-mtl-dev_1:8_all
+libghc6-ghc-paths-dev_1:8_all
+libghc6-gio-dev_1:8_all
+libghc6-gitit-dev_1:8_all
+libghc6-glade-dev_1:8_all
+libghc6-glfw-dev_1:8_all
+libghc6-glib-dev_1:8_all
+libghc6-glut-dev_1:8_all
+libghc6-gstreamer-dev_1:8_all
+libghc6-gtk-dev_1:8_all
+libghc6-gtkglext-dev_1:8_all
+libghc6-gtksourceview2-dev_1:8_all
+libghc6-haddock-dev_1:8_all
+libghc6-happstack-dev_1:8_all
+libghc6-happstack-server-dev_1:8_all
+libghc6-harp-dev_1:8_all
+libghc6-hashed-storage-dev_1:8_all
+libghc6-haskeline-dev_1:8_all
+libghc6-haskell-lexer-dev_1:8_all
+libghc6-haskell-src-dev_1:8_all
+libghc6-haskelldb-dev_1:8_all
+libghc6-haskelldb-hdbc-dev_1:8_all
+libghc6-haskelldb-hdbc-odbc-dev_1:8_all
+libghc6-haskelldb-hdbc-postgresql-dev_1:8_all
+libghc6-haskelldb-hdbc-sqlite3-dev_1:8_all
+libghc6-haskore-dev_1:8_all
+libghc6-haxml-dev_1:8_all
+libghc6-haxr-dev_1:8_all
+libghc6-hdbc-dev_1:8_all
+libghc6-hdbc-odbc-dev_1:8_all
+libghc6-hdbc-postgresql-dev_1:8_all
+libghc6-hdbc-sqlite3-dev_1:8_all
+libghc6-highlighting-kate-dev_1:8_all
+libghc6-hint-dev_1:8_all
+libghc6-hjavascript-dev_1:8_all
+libghc6-hjscript-dev_1:8_all
+libghc6-hoauth-dev_1:8_all
+libghc6-hscolour-dev_1:8_all
+libghc6-hscurses-dev_1:8_all
+libghc6-hsemail-dev_1:8_all
+libghc6-hsh-dev_1:8_all
+libghc6-hslogger-dev_1:8_all
+libghc6-hsp-dev_1:8_all
+libghc6-hsql-dev_1:8_all
+libghc6-hsql-mysql-dev_1:8_all
+libghc6-hsql-odbc-dev_1:8_all
+libghc6-hsql-postgresql-dev_1:8_all
+libghc6-hsql-sqlite3-dev_1:8_all
+libghc6-hstringtemplate-dev_1:8_all
+libghc6-hsx-dev_1:8_all
+libghc6-html-dev_1:8_all
+libghc6-http-dev_1:8_all
+libghc6-hunit-dev_1:8_all
+libghc6-hxt-dev_1:8_all
+libghc6-ifelse-dev_1:8_all
+libghc6-irc-dev_1:8_all
+libghc6-json-dev_1:8_all
+libghc6-language-c-dev_1:8_all
+libghc6-lazysmallcheck-dev_1:8_all
+libghc6-ldap-dev_1:8_all
+libghc6-leksah-server-dev_1:8_all
+libghc6-llvm-dev_1:8_all
+libghc6-ltk-dev_1:8_all
+libghc6-magic-dev_1:8_all
+libghc6-markov-chain-dev_1:8_all
+libghc6-maybet-dev_1:8_all
+libghc6-midi-dev_1:8_all
+libghc6-missingh-dev_1:8_all
+libghc6-mmap-dev_1:8_all
+libghc6-monadcatchio-mtl-dev_1:8_all
+libghc6-monoid-transformer-dev_1:8_all
+libghc6-mtl-dev_1:8_all
+libghc6-mwc-random-dev_1:8_all
+libghc6-network-dev_1:8_all
+libghc6-non-negative-dev_1:8_all
+libghc6-openal-dev_1:8_all
+libghc6-opengl-dev_1:8_all
+libghc6-pandoc-dev_1:8_all
+libghc6-pango-dev_1:8_all
+libghc6-parallel-dev_1:8_all
+libghc6-parsec2-dev_1:8_all
+libghc6-parsec3-dev_1:8_all
+libghc6-pcre-light-dev_1:8_all
+libghc6-polyparse-dev_1:8_all
+libghc6-pretty-show-dev_1:8_all
+libghc6-primitive-dev_1:8_all
+libghc6-quickcheck1-dev_1:8_all
+libghc6-quickcheck2-dev_1:8_all
+libghc6-recaptcha-dev_1:8_all
+libghc6-regex-base-dev_1:8_all
+libghc6-regex-compat-dev_1:8_all
+libghc6-regex-posix-dev_1:8_all
+libghc6-regex-tdfa-dev_1:8_all
+libghc6-regex-tdfa-utf8-dev_1:8_all
+libghc6-safe-dev_1:8_all
+libghc6-sdl-dev_1:8_all
+libghc6-sdl-gfx-dev_1:8_all
+libghc6-sdl-image-dev_1:8_all
+libghc6-sdl-mixer-dev_1:8_all
+libghc6-sdl-ttf-dev_1:8_all
+libghc6-sendfile-dev_1:8_all
+libghc6-sha-dev_1:8_all
+libghc6-smtpclient-dev_1:8_all
+libghc6-split-dev_1:8_all
+libghc6-src-exts-dev_1:8_all
+libghc6-statistics-dev_1:8_all
+libghc6-stm-dev_1:8_all
+libghc6-stream-dev_1:8_all
+libghc6-strict-concurrency-dev_1:8_all
+libghc6-svgcairo-dev_1:8_all
+libghc6-syb-with-class-dev_1:8_all
+libghc6-syb-with-class-instances-text-dev_1:8_all
+libghc6-tagsoup-dev_1:8_all
+libghc6-tar-dev_1:8_all
+libghc6-terminfo-dev_1:8_all
+libghc6-testpack-dev_1:8_all
+libghc6-texmath-dev_1:8_all
+libghc6-text-dev_1:8_all
+libghc6-tokyocabinet-dev_1:8_all
+libghc6-transformers-dev_1:8_all
+libghc6-type-level-dev_1:8_all
+libghc6-uniplate-dev_1:8_all
+libghc6-unix-compat-dev_1:8_all
+libghc6-unixutils-dev_1:8_all
+libghc6-url-dev_1:8_all
+libghc6-utility-ht-dev_1:8_all
+libghc6-uulib-dev_1:8_all
+libghc6-vector-algorithms-dev_1:8_all
+libghc6-vector-dev_1:8_all
+libghc6-vte-dev_1:8_all
+libghc6-vty-dev_1:8_all
+libghc6-webkit-dev_1:8_all
+libghc6-x11-dev_1:8_all
+libghc6-x11-xft-dev_1:8_all
+libghc6-xhtml-dev_1:8_all
+libghc6-xml-dev_1:8_all
+libghc6-xmonad-contrib-dev_1:8_all
+libghc6-xmonad-dev_1:8_all
+libghc6-zip-archive-dev_1:8_all
+libghc6-zlib-dev_1:8_all
+libghemical-dev_3.0.0-2_i386
+libgif-dev_4.1.6-10_i386
+libgiftiio-dev_1.0.9-1_i386
+libgig-dev_3.3.0-2_i386
+libgii1-dev_1:1.0.2-4.1_i386
+libgimp2.0-dev_2.8.2-2+deb7u1_i386
+libginac-dev_1.6.2-1_i386
+libginspx-dev_20050529-3.1_i386
+libgio2.0-cil-dev_2.22.3-2_all
+libgirara-dev_0.1.2-3_i386
+libgirepository1.0-dev_1.32.1-1_i386
+libgjs-dev_1.32.0-5_i386
+libgkeyfile-cil-dev_0.1-4_all
+libgksu2-dev_2.0.13~pre1-6_i386
+libgl1-mesa-dev_8.0.5-4+deb7u2_i386
+libgl1-mesa-swx11-dev_8.0.5-4+deb7u2_i386
+libgl2ps-dev_1.3.6-1_i386
+libglade2-dev_1:2.6.4-1_i386
+libglade2.0-cil-dev_2.12.10-5_i386
+libglademm-2.4-dev_2.6.7-2_i386
+libgladeui-1-dev_3.6.7-2.1_i386
+libgladeui-dev_3.12.1-1_i386
+libglbsp-dev_2.24-1_i386
+libglc-dev_0.7.2-5+b1_i386
+libgle3-dev_3.1.0-7_i386
+libgles1-mesa-dev_8.0.5-4+deb7u2_i386
+libgles2-mesa-dev_8.0.5-4+deb7u2_i386
+libglew-dev_1.7.0-3_i386
+libglewmx-dev_1.7.0-3_i386
+libglfw-dev_2.7.2-1_i386
+libglib2.0-cil-dev_2.12.10-5_i386
+libglib2.0-dev_2.33.12+really2.32.4-5_i386
+libglibmm-2.4-dev_2.32.1-1_i386
+libglide2-dev_2002.04.10ds1-7_i386
+libglide3-dev_2002.04.10ds1-7_i386
+libglm-dev_0.9.3.3+dfsg-0.1_all
+libglobus-authz-callout-error-dev_2.2-1_i386
+libglobus-authz-dev_2.2-1_i386
+libglobus-callout-dev_2.2-1_i386
+libglobus-common-dev_14.7-2_i386
+libglobus-ftp-client-dev_7.3-1_i386
+libglobus-ftp-control-dev_4.4-1_i386
+libglobus-gass-cache-dev_8.1-2_i386
+libglobus-gass-copy-dev_8.4-1_i386
+libglobus-gass-server-ez-dev_4.3-1_i386
+libglobus-gass-transfer-dev_7.2-1_i386
+libglobus-gfork-dev_3.2-1_i386
+libglobus-gram-client-dev_12.4-1_i386
+libglobus-gram-job-manager-callout-error-dev_2.1-2_i386
+libglobus-gram-protocol-dev_11.3-1_i386
+libglobus-gridftp-server-control-dev_2.5-2_i386
+libglobus-gridftp-server-dev_6.10-2_i386
+libglobus-gridmap-callout-error-dev_1.2-2_i386
+libglobus-gsi-callback-dev_4.2-1_i386
+libglobus-gsi-cert-utils-dev_8.3-1_i386
+libglobus-gsi-credential-dev_5.3-1_i386
+libglobus-gsi-openssl-error-dev_2.1-2_i386
+libglobus-gsi-proxy-core-dev_6.2-1_i386
+libglobus-gsi-proxy-ssl-dev_4.1-2_i386
+libglobus-gsi-sysconfig-dev_5.2-1_i386
+libglobus-gss-assist-dev_8.5-1_i386
+libglobus-gssapi-error-dev_4.1-2_i386
+libglobus-gssapi-gsi-dev_10.6-1_i386
+libglobus-io-dev_9.3-1_i386
+libglobus-openssl-module-dev_3.2-1_i386
+libglobus-rls-client-dev_5.2-8_i386
+libglobus-rsl-dev_9.1-2_i386
+libglobus-scheduler-event-generator-dev_4.6-1_i386
+libglobus-usage-dev_3.1-2_i386
+libglobus-xio-dev_3.3-1_i386
+libglobus-xio-gsi-driver-dev_2.3-1_i386
+libglobus-xio-pipe-driver-dev_2.2-1_i386
+libglobus-xio-popen-driver-dev_2.3-1_i386
+libgloox-dev_1.0-1.1_i386
+libgloox-dev_1.0.9-3~bpo70+1_i386
+libglpk-dev_4.45-1_i386
+libglrr-glib-dev_20050529-3.1_i386
+libglrr-gobject-dev_20050529-3.1_i386
+libglrr-gtk-dev_20050529-3.1_i386
+libglrr-widgets-dev_20050529-3.1_i386
+libglu1-mesa-dev_8.0.5-4+deb7u2_i386
+libglui-dev_2.36-4_i386
+libglw1-mesa-dev_8.0.0-1_i386
+libgme-dev_0.5.5-2_i386
+libgmerlin-avdec-dev_1.2.0~dfsg-1+b1_i386
+libgmerlin-dev_1.2.0~dfsg+1-1_i386
+libgmime-2.6-dev_2.6.10-1_i386
+libgmime2.6-cil-dev_2.6.10-1_all
+libgmlib-dev_1.0.6-1_i386
+libgmm++-dev_4.1.1+dfsg1-11_all
+libgmp-dev_2:5.0.5+dfsg-2_i386
+libgmp-ocaml-dev_20021123-17+b3_i386
+libgmp3-dev_2:5.0.5+dfsg-2_i386
+libgmpada3-dev_0.0.20120331-1_i386
+libgmsh-dev_2.7.0.dfsg-1~bpo70+1_i386
+libgmt-dev_4.5.7-2_i386
+libgmtk-dev_1.0.6-1_i386
+libgnadecommon2-dev_1.6.2-9_i386
+libgnadeodbc2-dev_1.6.2-9_i386
+libgnadesqlite3-2-dev_1.6.2-9_i386
+libgnatprj4.6-dev_4.6.3-8_i386
+libgnatvsn4.6-dev_4.6.3-8_i386
+libgnelib-dev_0.75+svn20091130-1+b1_i386
+libgnet-dev_2.0.8-2.2_i386
+libgnokii-dev_0.6.30+dfsg-1+b1_i386
+libgnome-bluetooth-dev_3.4.2-1_i386
+libgnome-desktop-3-dev_3.4.2-1_i386
+libgnome-desktop-dev_2.32.1-2_i386
+libgnome-keyring-dev_3.4.1-1_i386
+libgnome-keyring1.0-cil-dev_1.0.0-4_i386
+libgnome-mag-dev_1:0.16.3-1_i386
+libgnome-media-profiles-dev_3.0.0-1_i386
+libgnome-menu-3-dev_3.4.2-5_i386
+libgnome-menu-dev_3.0.1-4_i386
+libgnome-speech-dev_1:0.4.25-5_i386
+libgnome-vfs2.0-cil-dev_2.24.2-3_all
+libgnome-vfsmm-2.6-dev_2.26.0-1_i386
+libgnome2-dev_2.32.1-3_i386
+libgnome2.0-cil-dev_2.24.2-3_i386
+libgnomeada2.24.1-dev_2.24.1-7_i386
+libgnomecanvas2-dev_2.30.3-1.2_i386
+libgnomecanvasmm-2.6-dev_2.26.0-1_i386
+libgnomecups1.0-dev_0.2.3-5_i386
+libgnomedesktop2.0-cil-dev_2.26.0-8_all
+libgnomekbd-dev_3.4.0.2-1_i386
+libgnomemm-2.6-dev_2.30.0-1_i386
+libgnomeprint2.2-dev_2.18.8-3_i386
+libgnomeprintui2.2-dev_2.18.6-3_i386
+libgnomeui-dev_2.24.5-2_i386
+libgnomeuimm-2.6-dev_2.28.0-1_i386
+libgnomevfs2-dev_1:2.24.4-2_i386
+libgnuift0-dev_0.1.14-12_i386
+libgnuplot-ocaml-dev_0.8.3-3_i386
+libgnustep-base-dev_1.22.1-4_i386
+libgnustep-dl2-dev_0.12.0-9+nmu1_i386
+libgnustep-gui-dev_0.20.0-3_i386
+libgnutls-dev_2.12.20-8+deb7u1_i386
+libgnutls28-dev_3.2.15-2~bpo70+1_i386
+libgoa-1.0-dev_3.4.2-2_i386
+libgoffice-0.8-dev_0.8.17-1.2_i386
+libgofigure-dev_0.9.0-1+b2_i386
+libgoocanvas-dev_0.15-1_i386
+libgoocanvasmm-dev_0.15.4-1_i386
+libgoogle-perftools-dev_2.0-2_i386
+libgooglepinyin0-dev_0.1.2-1_i386
+libgpac-dev_0.5.0~dfsg0-1_i386
+libgpcl-dev_2.32-1_i386
+libgpds-dev_1.5.1-6_i386
+libgpelaunch-dev_0.14-6_i386
+libgpepimc-dev_0.9-4_i386
+libgpeschedule-dev_0.17-4_i386
+libgpevtype-dev_0.50-6_i386
+libgpewidget-dev_0.117-6_i386
+libgpg-error-dev_1.10-3.1_i386
+libgpg-error-dev_1.12-0.2~bpo70+1_i386
+libgpgme11-dev_1.2.0-1.4_i386
+libgpgme11-dev_1.4.3-0.1~bpo70+1_i386
+libgphoto2-2-dev_2.4.14-2_i386
+libgpiv3-dev_0.6.1-4_i386
+libgpm-dev_1.20.4-6_i386
+libgpod-cil-dev_0.8.2-7_i386
+libgpod-dev_0.8.2-7_i386
+libgpod-nogtk-dev_0.8.2-7_i386
+libgportugol-dev_1.1-2_i386
+libgps-dev_3.6-4+deb7u1_i386
+libgps-dev_3.9-3~bpo70+1_i386
+libgraflib1-dev_20061220+dfsg3-2_i386
+libgrafx11-1-dev_20061220+dfsg3-2_i386
+libgrantlee-dev_0.1.4-1_i386
+libgraphicsmagick++1-dev_1.3.16-1.1_i386
+libgraphicsmagick1-dev_1.3.16-1.1_i386
+libgraphite-dev_1:2.3.1-0.2_i386
+libgraphite2-dev_1.1.3-1_i386
+libgraphviz-dev_2.26.3-14+deb7u1_i386
+libgretl1-dev_1.9.9-1_i386
+libgrib-api-dev_1.9.16-2+b1_i386
+libgrib2c-dev_1.2.2-2+b1_i386
+libgridsite-dev_1.7.16-1_i386
+libgrilo-0.1-dev_0.1.19-1_i386
+libgringotts-dev_1.2.10~pre3-1_i386
+libgrits-dev_0.7-1_i386
+libgrok-dev_1.20110708.1-4_i386
+libgrss-dev_0.5.0-1_i386
+libgs-dev_9.05~dfsg-6.3+deb7u1_i386
+libgsasl7-dev_1.8.0-2_i386
+libgsecuredelete-dev_0.2-1_i386
+libgsf-1-dev_1.14.21-2.1_i386
+libgsf-gnome-1-dev_1.14.21-2.1_i386
+libgsl0-dev_1.15+dfsg.2-2_i386
+libgsm0710-dev_1.2.2-2_i386
+libgsm0710mux-dev_0.11.2-1.1_i386
+libgsm1-dev_1.0.13-4_i386
+libgsmme-dev_1.10-13.2_i386
+libgsnmp0-dev_0.3.0-1.1_i386
+libgsoap-dev_2.8.16-2~bpo70+1_i386
+libgsql-dev_0.2.2-1.2+b1_i386
+libgss-dev_1.0.2-1_i386
+libgssdp-1.0-dev_0.12.2.1-2_i386
+libgssglue-dev_0.4-2_i386
+libgst-dev_3.2.4-2_i386
+libgstbuzztard-dev_0.5.0-2+deb7u1_i386
+libgstreamer-ocaml-dev_0.1.0-3+b1_i386
+libgstreamer-plugins-bad0.10-dev_0.10.23-7.1+deb7u1_i386
+libgstreamer-plugins-bad1.0-dev_1.2.4-1~bpo70+1_i386
+libgstreamer-plugins-base0.10-dev_0.10.36-1.1_i386
+libgstreamer-plugins-base1.0-dev_1.2.4-1~bpo70+1_i386
+libgstreamer0.10-cil-dev_0.9.2-4_all
+libgstreamer0.10-dev_0.10.36-1.2_i386
+libgstreamer1.0-dev_1.2.4-1~bpo70+1_i386
+libgstrtspserver-0.10-dev_0.10.8-3_i386
+libgtest-dev_1.6.0-2_i386
+libgtextutils-dev_0.6.2-1_i386
+libgtg-dev_0.2+dfsg-1_i386
+libgtk-3-dev_3.4.2-7_i386
+libgtk-sharp-beans2.0-cil-dev_2.14.1-3_all
+libgtk-vnc-1.0-dev_0.5.0-3.1_i386
+libgtk-vnc-2.0-dev_0.5.0-3.1_i386
+libgtk2.0-cil-dev_2.12.10-5_i386
+libgtk2.0-dev_2.24.10-2_i386
+libgtkada2.24.1-dev_2.24.1-7_i386
+libgtkdatabox-0.9.1-1-dev_1:0.9.1.1-4_i386
+libgtkgl2.0-dev_2.0.1-2_i386
+libgtkglada2.24.1-dev_2.24.1-7_i386
+libgtkglarea-cil-dev_0.0.17-6_all
+libgtkglext1-dev_1.2.0-2_i386
+libgtkglextmm-x11-1.2-dev_1.2.0-4.1_i386
+libgtkhex-3-dev_3.4.1-1_i386
+libgtkhotkey-dev_0.2.1-3_i386
+libgtkhtml-4.0-dev_4.4.4-1_i386
+libgtkhtml-editor-3.14-dev_3.32.2-2.1_i386
+libgtkhtml-editor-4.0-dev_4.4.4-1_i386
+libgtkhtml3.14-cil-dev_2.26.0-8_i386
+libgtkhtml3.14-dev_3.32.2-2.1_i386
+libgtkimageview-dev_1.6.4+dfsg-0.1_i386
+libgtkmathview-dev_0.8.0-8_i386
+libgtkmm-2.4-dev_1:2.24.2-1_i386
+libgtkmm-3.0-dev_3.4.2-1_i386
+libgtkpod-dev_2.1.2-1_i386
+libgtksourceview-3.0-dev_3.4.2-1_i386
+libgtksourceview2-cil-dev_2.26.0-8_i386
+libgtksourceview2.0-dev_2.10.4-1_i386
+libgtksourceviewmm-3.0-dev_3.2.0-1_i386
+libgtkspell-3-dev_3.0.0~hg20110814-1_i386
+libgtkspell-dev_2.0.16-1_i386
+libgtop2-dev_2.28.4-3_i386
+libgts-dev_0.7.6+darcs110121-1.1_i386
+libguac-dev_0.6.0-2_i386
+libgucharmap-2-90-dev_1:3.4.1.1-2.1_i386
+libgudev-1.0-dev_175-7.2_i386
+libgudev-1.0-dev_204-8~bpo70+1_i386
+libgudev1.0-cil-dev_0.1-3_all
+libguess-dev_1.1-1_i386
+libguestfs-dev_1:1.18.1-1+deb7u3_i386
+libguestfs-gobject-dev_1:1.18.1-1+deb7u3_i386
+libguestfs-ocaml-dev_1:1.18.1-1+deb7u3_i386
+libguichan-dev_0.8.2-10+b1_i386
+libgupnp-1.0-dev_0.18.4-1_i386
+libgupnp-av-1.0-dev_0.10.3-1_i386
+libgupnp-dlna-1.0-dev_0.6.6-1_i386
+libgupnp-igd-1.0-dev_0.2.1-2_i386
+libgusb-dev_0.1.3-5_i386
+libgutenprint-dev_5.2.9-1_i386
+libgutenprintui2-dev_5.2.9-1_i386
+libguytools2-dev_2.0.1-1.1_i386
+libgvnc-1.0-dev_0.5.0-3.1_i386
+libgweather-3-dev_3.4.1-1+build1_i386
+libgwenhywfar60-dev_4.12.0beta-1~bpo70+1_i386
+libgwenhywfar60-dev_4.3.3-1_i386
+libgwrap-runtime-dev_1.9.14-1.1_i386
+libgwyddion20-dev_2.28-2_i386
+libgxps-dev_0.2.2-2_i386
+libgyoto0-dev_0.0.3-5_i386
+libgyoto1-dev_0.1.0-2~bpo70+1_i386
+libh323plus-dev_1.24.0~dfsg2-1_i386
+libhackrf-dev_2014.04.1-1~bpo70+1_i386
+libhaildb-dev_2.3.2-1.2_i386
+libhal-dev_0.5.14-8_i386
+libhal-storage-dev_0.5.14-8_i386
+libhamlib++-dev_1.2.15.1-1_i386
+libhamlib-dev_1.2.15.1-1_i386
+libhandoff-dev_0.1-5_i386
+libhangul-dev_0.1.0-2_i386
+libharminv-dev_1.3.1-9_i386
+libhashkit-dev_1.0.8-1_i386
+libhavege-dev_1.9.1-1~bpo70+1_i386
+libhawknl-dev_1.6.8+dfsg2-1_i386
+libhbaapi-dev_2.2.5-1_i386
+libhbalinux-dev_1.0.14-1_i386
+libhd-dev_16.0-2.2_i386
+libhdate-dev_1.6-1_i386
+libhdf4-alt-dev_4.2r4-13_i386
+libhdf4-dev_4.2r4-13_i386
+libhdf4g-dev_4.2r4-13_all
+libhdf5-dev_1.8.8-9_i386
+libhdf5-mpi-dev_1.8.8-9_i386
+libhdf5-mpich2-dev_1.8.8-9_i386
+libhdf5-openmpi-dev_1.8.8-9_i386
+libhdf5-serial-dev_1.8.8-9_i386
+libhdfeos-dev_2.17v1.00.dfsg.1-3_i386
+libhdhomerun-dev_20120405-1_i386
+libhe5-hdfeos-dev_5.1.13.dfsg.1-3_i386
+libheartbeat2-dev_1:3.0.5-3_i386
+libhepmc-dev_2.06.09-1_i386
+libhepmcfio-dev_2.06.09-1_i386
+libhepmcinterface8-dev_8.1.65-1_i386
+libherwig59-2-dev_20061220+dfsg3-2_i386
+libhesiod-dev_3.0.2-21_i386
+libhfsp-dev_1.0.4-12_i386
+libhighgui-dev_2.3.1-11_i386
+libhippocanvas-dev_0.3.1-1.1_i386
+libhiredis-dev_0.10.1-7_i386
+libhivex-dev_1.3.6-2_i386
+libhivex-dev_1.3.9-1~bpo70+1_i386
+libhivex-ocaml-dev_1.3.6-2_i386
+libhivex-ocaml-dev_1.3.9-1~bpo70+1_i386
+libhkl-dev_4.0.3-4_i386
+libhmsbeagle-dev_1.0-6_i386
+libhocr-dev_0.10.17-1+b2_i386
+libhpdf-dev_2.2.1-1_i386
+libhpmud-dev_3.12.6-3.1+deb7u1_i386
+libhsclient-dev_1.1.0-7-g1044a28-1_i386
+libhtmlcxx-dev_0.85-2_i386
+libhtp-dev_0.2.6-2_i386
+libhtsengine-dev_1.06-1_i386
+libhttp-ocaml-dev_0.1.5-1+b2_i386
+libhttrack-dev_3.46.1-1_i386
+libhunspell-dev_1.3.2-4_i386
+libhwloc-dev_1.4.1-4_i386
+libhx-dev_3.12.1-1_i386
+libhyantes-dev_1.3.0-1_i386
+libhyena-cil-dev_0.5-2_all
+libhyphen-dev_2.8.3-2_i386
+libhypre-dev_2.8.0b-1_all
+libhz-dev_0.3.16-3_i386
+libi2c-dev_3.1.0-2_all
+libibcm-dev_1.0.4-1.1_i386
+libibcommon-dev_1.1.2-20090314-1_i386
+libibdm-dev_1.2-OFED-1.4.2-1.3_i386
+libibmad-dev_1.2.3-20090314-1.1_i386
+libibtk-dev_0.0.14-12_i386
+libibumad-dev_1.2.3-20090314-1.1_i386
+libibus-1.0-dev_1.4.1-9+deb7u1_i386
+libibus-1.0-dev_1.5.1.is.1.4.2-1~bpo70+1_i386
+libibus-qt-dev_1.3.1-2.1_i386
+libibverbs-dev_1.1.6-1_i386
+libical-dev_0.48-2_i386
+libicapapi-dev_1:0.1.6-1.1_i386
+libicc-dev_2.12+argyll1.4.0-8_i386
+libicc-utils-dev_1.6.4-1+b1_i386
+libice-dev_2:1.0.8-2_i386
+libicecc-dev_1.0.1-1~bpo70+1_i386
+libicee-dev_1.2.0-6.1_i386
+libicns-dev_0.8.1-1_i386
+libiconv-hook-dev_0.0.20021209-10_i386
+libics-dev_1.5.2-3_i386
+libicu-dev_4.8.1.1-12+deb7u1_i386
+libid3-3.8.3-dev_3.8.3-15_i386
+libid3tag0-dev_0.15.1b-10_i386
+libident-dev_0.22-3_i386
+libidl-dev_0.8.14-0.2_i386
+libidn11-dev_1.25-2_i386
+libidn2-0-dev_0.8-2_i386
+libido-0.1-dev_0.3.4-1_i386
+libido3-0.1-dev_0.3.4-1_i386
+libidzebra-2.0-dev_2.0.44-3_i386
+libiec16022-dev_0.2.4-1_i386
+libiec61883-dev_1.2.0-0.1_i386
+libieee1284-3-dev_0.2.11-10_i386
+libifp-dev_1.0.0.2-5_i386
+libifstat-dev_1.1-8_i386
+libigraph0-dev_0.5.4-2_i386
+libigstk4-dev_4.4.0-2+b1_i386
+libijs-dev_0.35-8_i386
+libiksemel-dev_1.2-4_i386
+libilmbase-dev_1.0.1-4_i386
+libimdi-dev_1.4.0-8_i386
+libiml-dev_1.0.3-4.2_i386
+libimlib2-dev_1.4.5-1_i386
+libimobiledevice-dev_1.1.1-4_i386
+libindi-dev_0.9.1-2_i386
+libindicate-dev_0.6.92-1_i386
+libindicate-gtk-dev_0.6.92-1_i386
+libindicate-gtk0.1-cil-dev_0.6.92-1_all
+libindicate-gtk3-dev_0.6.92-1_i386
+libindicate-qt-dev_0.2.5.91-5_i386
+libindicate0.1-cil-dev_0.6.92-1_all
+libindicator-dev_0.5.0-1_i386
+libindicator-messages-status-provider-dev_0.6.0-1_i386
+libindicator3-dev_0.5.0-1_i386
+libindigo-dev_1.0.0-2_i386
+libinfinity-0.5-dev_0.5.2-6.1_i386
+libini-config-dev_0.1.3-2_i386
+libinifiles-ocaml-dev_1.2-2_i386
+libinnodb-dev_1.0.6.6750-1_i386
+libinotify-ocaml-dev_1.0-1+b3_i386
+libinotifytools0-dev_3.14-1_i386
+libinput-pad-dev_1.0.1-2_i386
+libinsighttoolkit3-dev_3.20.1+git20120521-3_i386
+libinstpatch-dev_1.0.0-3_i386
+libint-dev_1.1.4-1_i386
+libiodbc2-dev_3.52.7-2+deb7u1_i386
+libion-dev_3.0.1~dfsg1-1_i386
+libipa-hbac-dev_1.8.4-2_i386
+libipathverbs-dev_1.2-1_i386
+libipe-dev_7.1.2-1_i386
+libipmiconsole-dev_1.1.5-3_i386
+libipmidetect-dev_1.1.5-3_i386
+libipmimonitoring-dev_1.1.5-3_i386
+libipset-dev_6.12.1-1_i386
+libiptcdata0-dev_1.0.4-3_i386
+libircclient-dev_1.3+dfsg1-3_i386
+libirman-dev_0.4.4-2_i386
+libirrlicht-dev_1.7.3+dfsg1-4_i386
+libisajet758-3-dev_20061220+dfsg3-2_i386
+libiscsi-dev_1.4.0-3_i386
+libisl-dev_0.10-3_i386
+libiso9660-dev_0.83-4_i386
+libisoburn-dev_1.2.2-2_i386
+libisofs-dev_1.2.2-1_i386
+libitl-dev_0.7.0-3_i386
+libitl-gobject-dev_0.2-1_i386
+libitpp-dev_4.2-4_i386
+libitsol-dev_1.0.0-2_i386
+libivykis-dev_0.30.1-2_i386
+libiw-dev_30~pre9-8_i386
+libjack-dev_1:0.121.3+20120418git75e3e20b-2.1_i386
+libjack-jackd2-dev_1.9.8~dfsg.4+20120529git007cdc37-5_i386
+libjalali-dev_0.4.0-1.1_i386
+libjama-dev_1.2.4-2_all
+libjana-dev_0.0.0+git20091215.9ec1da8a-2+b4_i386
+libjana-ecal-dev_0.0.0+git20091215.9ec1da8a-2+b4_i386
+libjana-gtk-dev_0.0.0+git20091215.9ec1da8a-2+b4_i386
+libjansson-dev_2.3.1-2_i386
+libjasper-dev_1.900.1-13_i386
+libjaula-dev_1.4.0-3_i386
+libjavascriptcoregtk-1.0-dev_1.8.1-3.4_i386
+libjavascriptcoregtk-3.0-dev_1.8.1-3.4_i386
+libjbig-dev_2.0-2+deb7u1_i386
+libjbig2dec0-dev_0.11+20120125-1_i386
+libjconv-dev_2.8-6+b1_i386
+libjemalloc-dev_3.0.0-3_i386
+libjim-dev_0.73-3_i386
+libjpeg62-dev_6b1-3_i386
+libjpeg8-dev_8d-1_i386
+libjpgalleg4-dev_2:4.4.2-2.1_i386
+libjs-of-ocaml-dev_1.2-2_i386
+libjson-c-dev_0.11-3~bpo7+1_i386
+libjson-glib-dev_0.14.2-1_i386
+libjson-spirit-dev_4.04-1+b1_i386
+libjson-static-camlp4-dev_0.9.8-1+b5_i386
+libjson-wheel-ocaml-dev_1.0.6-2+b8_i386
+libjson0-dev_0.10-1.2_i386
+libjson0-dev_0.11-3~bpo7+1_i386
+libjsoncpp-dev_0.6.0~rc2-3_i386
+libjte-dev_1.19-1_i386
+libjthread-dev_1.3.1-3_i386
+libjudy-dev_1.0.5-1_i386
+libjuman-dev_5.1-2.1_i386
+libk3b-dev_2.0.2-6_i386
+libkactivities-dev_4:4.8.4-1_i386
+libkakasi2-dev_2.3.5~pre1+cvs20071101-1_i386
+libkal-dev_0.9.0-1_i386
+libkarma-cil-dev_0.1.2-2.3_all
+libkarma-dev_0.1.2-2.3_i386
+libkate-dev_0.4.1-1_i386
+libkaya-gd-dev_0.4.4-6_i386
+libkaya-gl-dev_0.4.4-6_i386
+libkaya-mysql-dev_0.4.4-6_i386
+libkaya-ncurses-dev_0.4.4-6_i386
+libkaya-ncursesw-dev_0.4.4-6_i386
+libkaya-pgsql-dev_0.4.4-6_i386
+libkaya-sdl-dev_0.4.4-6_i386
+libkaya-sqlite3-dev_0.4.4-6_i386
+libkcddb-dev_4:4.8.4-2_i386
+libkdcraw-dev_4:4.8.4-1_i386
+libkdeedu-dev_4:4.8.4-1_i386
+libkdegames-dev_4:4.8.4-3_i386
+libkdtree++-dev_0.7.0-2_all
+libkernlib1-dev_20061220+dfsg3-2_i386
+libkexiv2-dev_4:4.8.4-1_i386
+libkeybinder-dev_0.2.2-4_i386
+libkeyutils-dev_1.5.5-3_i386
+libkibi-dev_0.1-1_i386
+libkipi-dev_4:4.8.4-1_i386
+libkiten-dev_4:4.8.4-1_i386
+libklatexformula3-dev_3.2.6-1_i386
+libklibc-dev_2.0.1-3.1_i386
+libkmfl-dev_0.9.8-1_i386
+libkmflcomp-dev_0.9.8-1_i386
+libkml-dev_1.3.0~r863-4.1_i386
+libkmod-dev_9-3_i386
+libkokyu-dev_6.0.3+dfsg-0.1_i386
+libkonq5-dev_4:4.8.4-2_i386
+libkonqsidebarplugin-dev_4:4.8.4-2_i386
+libkopete-dev_4:4.8.4-1+b1_i386
+libkosd2-dev_0.8.1-1_i386
+libkpathsea-dev_2012.20120628-4_i386
+libkqueue-dev_1.0.4-2_i386
+libkrb5-dev_1.10.1+dfsg-5+deb7u1_i386
+libksane-dev_4:4.8.4-1_i386
+libksba-dev_1.2.0-2_i386
+libktoblzcheck1-dev_1.39-1_i386
+libktorrent-dev_1.2.1-1_i386
+libktpcommoninternalsprivate-dev_0.4.0-1_i386
+libkvutils-dev_2.9.0-1_i386
+libkvutils2.2-dev_2.9.0-1_all
+libkwnn-dev_1.1.1~a021+cvs20100325-6_i386
+libkwwidgets1-dev_1.0.0~cvs20100930-8_i386
+libkxl0-dev_1.1.7-16_i386
+liblablgl-ocaml-dev_1.04-5+b3_i386
+liblablgtk-extras-ocaml-dev_1.0-1+b2_i386
+liblablgtk2-gl-ocaml-dev_2.14.2+dfsg-3_i386
+liblablgtk2-gnome-ocaml-dev_2.14.2+dfsg-3_i386
+liblablgtk2-ocaml-dev_2.14.2+dfsg-3_i386
+liblablgtkmathview-ocaml-dev_0.7.8-6+b1_i386
+liblablgtksourceview2-ocaml-dev_2.14.2+dfsg-3_i386
+libladr-dev_0.0.200902a-2.1_i386
+libladspa-ocaml-dev_0.1.4-1+b1_i386
+liblapack-dev_3.4.1+dfsg-1+deb70u1_i386
+liblapacke-dev_3.4.1+dfsg-1+deb70u1_i386
+liblas-dev_1.2.1-5+b1_i386
+liblash-compat-dev_1+dfsg0-3_all
+liblasi-dev_1.1.0-1_i386
+liblasso3-dev_2.3.6-2_i386
+liblastfm-dev_0.4.0~git20090710-2_i386
+liblastfm-ocaml-dev_0.3.0-2+b6_i386
+liblcgdm-dev_1.8.2-1+b2_i386
+liblcms1-dev_1.19.dfsg-1.2_i386
+liblcms2-dev_2.2+git20110628-2.2+deb7u1_i386
+libldap-ocaml-dev_2.1.8-8+b9_i386
+libldap2-dev_2.4.31-1+nmu2_i386
+libldb-dev_1:1.1.16-1~bpo70+1_i386
+libldb-dev_1:1.1.6-1_i386
+libldns-dev_1.6.13-1_i386
+libldns-dev_1.6.16-1~bpo70+1_i386
+libledit-ocaml-dev_2.03-1+b2_i386
+liblensfun-dev_0.2.5-2_i386
+libleptonica-dev_1.69-3.1_i386
+libleveldb-dev_0+20120530.gitdd0d562-1_i386
+liblfc-dev_1.8.2-1+b2_i386
+liblhapdf-dev_5.8.7+repack-1_i386
+liblhasa-dev_0.0.7-2_i386
+liblicense-dev_0.8.1-3_i386
+libliggghts-dev_3.0.0+repack-1~bpo70+1_i386
+liblightdm-gobject-dev_1.2.2-4_i386
+liblightdm-qt-dev_1.2.2-4_i386
+liblilv-dev_0.14.2~dfsg0-4_i386
+liblinear-dev_1.8+dfsg-1_i386
+liblinebreak2-dev_2.1-1_i386
+liblink-grammar4-dev_4.7.4-2_i386
+liblinphone-dev_3.5.2-10_i386
+liblip-dev_2.0.0-1.1_i386
+liblircclient-dev_0.9.0~pre1-1_i386
+liblistaller-glib-dev_0.5.5-2_i386
+liblivemedia-dev_2012.05.17-1_i386
+liblldpctl-dev_0.7.9-1~bpo70+1_i386
+libllvm-2.9-ocaml-dev_2.9+dfsg-7_i386
+libllvm-3.0-ocaml-dev_3.0-10_i386
+libllvm-3.1-ocaml-dev_3.1-1_i386
+libllvm-ocaml-dev_1:3.0-14+nmu2_i386
+liblo-dev_0.26~repack-7_i386
+liblo-ocaml-dev_0.1.0-1+b1_i386
+liblo10k1-dev_1.0.25-2_i386
+libloadpng4-dev_2:4.4.2-2.1_i386
+liblockdev1-dev_1.0.3-1.5_i386
+liblockfile-dev_1.09-5_i386
+liblodo3.0-dev_3.0.2+dfsg-4+b1_i386
+liblog4ada2-dev_1.2-3_i386
+liblog4c-dev_1.2.1-3_i386
+liblog4cplus-dev_1.0.4-1_i386
+liblog4cpp5-dev_1.0-4_i386
+liblog4cxx10-dev_0.10.0-1.2_i386
+liblog4net-cil-dev_1.2.10+dfsg-6_all
+liblog4shib-dev_1.0.4-1_i386
+liblog4tango4-dev_7.2.6+dfsg-14_i386
+liblog4tango5-dev_8.1.2c+dfsg-4~bpo70+1_i386
+liblogforwarderutils2-dev_2.7-1_i386
+liblogging-stdlog-dev_1.0.4-1~bpo70+1_i386
+liblognorm-dev_0.3.4-1_i386
+liblogservicecomponentbase2-dev_2.7-1_i386
+liblogservicetoolbase2-dev_2.7-1_i386
+liblogsys-dev_1.4.2-3_i386
+liblogthread-dev_3.0.12-3.2+deb7u2_i386
+libloki-dev_0.1.7-3_i386
+libloudmouth1-dev_1.4.3-9_i386
+liblouis-dev_2.4.1-1_i386
+liblouisutdml-dev_2.2.0-1_i386
+liblouisxml-dev_2.4.0-3_i386
+liblowpan-dev_0.2.2-2.1_all
+liblpsolve55-dev_5.5.0.13-7_i386
+liblqr-1-0-dev_0.4.1-2_i386
+liblrdf0-dev_0.4.0-5_i386
+liblrm2-dev_1.0.9+hg2665-1_i386
+liblrs-dev_0.42c-1+b1_i386
+liblscp-dev_0.5.6-6_i386
+libltcsmpte-dev_0.4.4-1_i386
+libltdl-dev_2.4.2-1.1_i386
+liblttctl-dev_0.89-05122011-1_i386
+liblttd-dev_0.89-05122011-1_i386
+liblttng-ust-dev_2.0.4-1_i386
+liblttoolbox3-3.1-0-dev_3.1.0-1.1_i386
+liblttvtraceread-2.6-dev_0.12.38-21032011-1+b1_i386
+liblua5.1-0-dev_5.1.5-4_i386
+liblua5.1-apr-dev_0.23.2-1_all
+liblua5.1-bitop-dev_1.0.2-1_all
+liblua5.1-cgi-dev_5.1.4+dfsg-2_all
+liblua5.1-copas-dev_1.1.6-5_all
+liblua5.1-curl-dev_0.3.0-7_all
+liblua5.1-cyrussasl-dev_1.0.0-4_all
+liblua5.1-event-dev_0.4.1-2_all
+liblua5.1-expat-dev_1.2.0-5+deb7u1_all
+liblua5.1-filesystem-dev_1.5.0+16+g84f1af5-1_all
+liblua5.1-leg-dev_0.1.2-8_all
+liblua5.1-logging-dev_1.2.0-1_all
+liblua5.1-lpeg-dev_0.10.2-5_all
+liblua5.1-md5-dev_1.1.2-6_all
+liblua5.1-oocairo-dev_1.4-1.2_i386
+liblua5.1-oopango-dev_1.1-1_i386
+liblua5.1-orbit-dev_2.2.0+dfsg1-1_all
+liblua5.1-posix-dev_5.1.19-2_all
+liblua5.1-rex-onig-dev_2.6.0-2_all
+liblua5.1-rex-pcre-dev_2.6.0-2_all
+liblua5.1-rex-posix-dev_2.6.0-2_all
+liblua5.1-rings-dev_1.2.3-1_all
+liblua5.1-rrd-dev_1.4.7-2_i386
+liblua5.1-sec-dev_0.4.1-1_all
+liblua5.1-soap-dev_3.0-3_all
+liblua5.1-socket-dev_2.0.2-8_all
+liblua5.1-sql-mysql-dev_2.3.0-1+build0_all
+liblua5.1-sql-postgres-dev_2.3.0-1+build0_all
+liblua5.1-sql-sqlite3-dev_2.3.0-1+build0_all
+liblua5.1-svn-dev_0.4.0-7_all
+liblua5.1-wsapi-fcgi-dev_1.5-3_all
+liblua5.1-xmlrpc-dev_1.2.1-5_all
+liblua5.1-zip-dev_1.2.3-11_all
+liblua5.2-dev_5.2.1-3_i386
+liblua50-dev_5.0.3-6_i386
+libluabind-dev_0.9.1+dfsg-5_i386
+liblualib50-dev_5.0.3-6_i386
+liblunar-1-dev_2.0.1-2.2_i386
+liblunar-date-dev_2.4.0-1_i386
+liblv2dynparam1-dev_2-5_i386
+liblvm2-dev_2.02.95-8_i386
+liblwipv6-dev_1.5a-2_i386
+liblwt-glib-ocaml-dev_2.3.2-1+b3_i386
+liblwt-ocaml-dev_2.3.2-1+b3_i386
+liblwt-ssl-ocaml-dev_2.3.2-1+b3_i386
+liblz-dev_1.3-2_i386
+liblz4-dev_0.0~r114-2~bpo70+1_i386
+liblzma-dev_5.1.1alpha+20120614-2_i386
+liblzo2-dev_2.06-1_i386
+libm17n-dev_1.6.3-2_i386
+libm17n-im-config-dev_0.9.0-3_i386
+libm4ri-dev_0.0.20080521-2_i386
+libmaa-dev_1.3.1-1_i386
+libmad-ocaml-dev_0.4.4-1+b1_i386
+libmad0-dev_0.15.1b-7_i386
+libmadlib-dev_1.3.0-2.1_i386
+libmagic-dev_1:5.17-1~bpo70+1_i386
+libmagic-dev_5.11-2+deb7u3_i386
+libmagic-ocaml-dev_0.7.3-5+b3_i386
+libmagick++-dev_8:6.7.7.10-5+deb7u3_i386
+libmagickcore-dev_8:6.7.7.10-5+deb7u3_i386
+libmagickwand-dev_8:6.7.7.10-5+deb7u3_i386
+libmagics++-dev_2.14.11-4_i386
+libmailutils-dev_1:2.99.97-3_i386
+libmalaga-dev_7.12-4_i386
+libmaloc-dev_0.2-2.3_i386
+libmapi-dev_1:1.0-3_i386
+libmapi-dev_1:2.1-1~bpo70+1_i386
+libmapiadmin-dev_1:1.0-3_i386
+libmapiadmin-dev_1:2.1-1~bpo70+1_i386
+libmapipp-dev_1:1.0-3_i386
+libmapipp-dev_1:2.1-1~bpo70+1_i386
+libmapiproxy-dev_1:1.0-3_i386
+libmapiproxy-dev_1:2.1-1~bpo70+1_i386
+libmapistore-dev_1:1.0-3_i386
+libmapistore-dev_1:2.1-1~bpo70+1_i386
+libmapnik-dev_2.0.0+ds1-3_all
+libmapnik2-dev_2.0.0+ds1-3+b4_i386
+libmarble-dev_4:4.8.4-3_i386
+libmarco-dev_1.8.0+dfsg1-5~bpo70+1_i386
+libmarkdown2-dev_2.1.3-3_i386
+libmatchbox-dev_1.9-osso8-3_i386
+libmate-desktop-dev_1.8.1+dfsg1-1~bpo70+1_i386
+libmate-menu-dev_1.8.0-2~bpo70+1_i386
+libmate-panel-applet-dev_1.8.0+dfsg1-2~bpo70+1_i386
+libmate-sensors-applet-plugin-dev_1.8.0+dfsg1-1~bpo70+1_i386
+libmate-slab-dev_1.8.1+dfsg1-3~bpo70+1_i386
+libmate-window-settings-dev_1.8.1+dfsg1-3~bpo70+1_i386
+libmatedict-dev_1.8.0+dfsg1-4~bpo70+1_i386
+libmatekbd-dev_1.8.0-2~bpo70+1_i386
+libmatepolkit-dev_1.8.0+dfsg1-3~bpo70+1_i386
+libmateweather-dev_1.8.0-2~bpo70+1_i386
+libmath++-dev_0.0.4-4_i386
+libmatheval-dev_1.1.8-1_i386
+libmathlib2-dev_20061220+dfsg3-2_i386
+libmatio-dev_1.3.4-4_i386
+libmatrixssl1.8-dev_1.8.8-1_i386
+libmatroska-dev_1.3.0-2_i386
+libmbt0-dev_3.2.8-1_i386
+libmcpp-dev_2.7.2-1.1_i386
+libmcrypt-dev_2.5.8-3.1_i386
+libmcs-dev_0.7.2-2.1_i386
+libmd3-dev_0.1.92-4_i386
+libmdc2-dev_0.10.7-1+b2_i386
+libmdds-dev_0.5.4-1_all
+libmdsp-dev_0.11-10_i386
+libmeanwhile-dev_1.0.2-4_i386
+libmecab-dev_0.99.3-3_i386
+libmed-dev_3.0.3-3_i386
+libmedc-dev_3.0.3-3_i386
+libmediainfo-dev_0.7.58-1_i386
+libmediastreamer-dev_3.5.2-10_i386
+libmedimport-dev_3.0.3-3_i386
+libmeep-dev_1.1.1-8+deb7u1_i386
+libmeep-lam4-dev_1.1.1-10~deb7u1_i386
+libmeep-mpi-default-dev_1.1.1-10~deb7u1_i386
+libmeep-mpich2-dev_1.1.1-10~deb7u1_i386
+libmeep-openmpi-dev_1.1.1-9~deb7u2_i386
+libmelt-ocaml-dev_1.4.0-1_i386
+libmemcache-dev_1.4.0.rc2-1_i386
+libmemcached-dev_1.0.8-1_i386
+libmemphis-0.2-dev_0.2.3-2_i386
+libmenhir-ocaml-dev_20120123.dfsg-1_i386
+libmenu-cache1-dev_0.3.3-1_i386
+libmercator-0.3-dev_0.3.0-2_i386
+libmeschach-dev_1.2b-13_i386
+libmetacity-dev_1:2.34.3-4_i386
+libmgl-dev_1.11.2-17_i386
+libmhash-dev_0.9.9.9-1.1_i386
+libmicrohttpd-dev_0.9.20-1+deb7u1_i386
+libmigemo-dev_20110227-7_i386
+libmikmatch-ocaml-dev_1.0.4-1+b1_i386
+libmikmod2-dev_3.1.12-5_i386
+libmilter-dev_8.14.4-4_i386
+libmimedir-dev_0.5.1-4_i386
+libmimedir-gnome-dev_0.4.2-5_i386
+libmimelib1-dev_5:1.1.4-2_i386
+libmimetic-dev_0.9.7-3_i386
+libmimic-dev_1.0.4-2.1_i386
+libminc-dev_2.1.10-1+b1_i386
+libming-dev_1:0.4.4-1.1_i386
+libmini18n-dev_0.2.1-1_i386
+libminidjvu-dev_0.8.svn.2010.05.06+dfsg-0.2_i386
+libminiupnpc-dev_1.5-2_i386
+libminiupnpc-dev_1.6-3~bpo70+1_i386
+libmirisdr-dev_0.0.4.59ba37-2~bpo70+1_i386
+libmission-control-plugins-dev_1:5.12.3-1_i386
+libmkv-dev_0.6.5.1-1_i386
+libmlpcap-ocaml-dev_0.9-16_i386
+libmlpost-ocaml-dev_0.8.1-3_i386
+libmlt++-dev_0.8.0-4_i386
+libmlt-dev_0.8.0-4_i386
+libmlx4-dev_1.0.4-1_i386
+libmm-dev_1.4.2-4_i386
+libmm-ocaml-dev_0.2.0-1+b1_i386
+libmmpong0.9-dev_0.9.1-2.1_i386
+libmms-dev_0.6.2-3_i386
+libmng-dev_1.0.10-3_i386
+libmnl-dev_1.0.3-3_i386
+libmodbus-dev_3.0.3-1_i386
+libmodglue1-dev_1.17-2.1_all
+libmodplug-dev_1:0.8.8.4-3+deb7u1+git20130828_all
+libmoe-dev_1.5.8-1_i386
+libmongo-client-dev_0.1.5-1+deb7u1_i386
+libmono-2.0-dev_2.10.8.1-8_i386
+libmono-addins-cil-dev_0.6.2-2_all
+libmono-addins-gui-cil-dev_0.6.2-2_all
+libmono-addins-msbuild-cil-dev_0.6.2-2_all
+libmono-cecil-cil-dev_0.9.5+dfsg-2_all
+libmono-cecil-flowanalysis-cil-dev_0.1~vcs20110809.r1.b34edf6-2_all
+libmono-cil-dev_2.10.8.1-8_all
+libmono-reflection-cil-dev_1.0+git20110407+d2343843-2_all
+libmono-uia-cil-dev_2.1-4_all
+libmono-upnp-cil-dev_0.1.2-1_all
+libmono-zeroconf-cil-dev_0.9.0-4_all
+libmonogame-cil-dev_2.5.1+dfsg-3_all
+libmopac7-dev_1.15-5_i386
+libmorph-dev_1:20090926_i386
+libmosquitto0-dev_0.15-2_all
+libmosquittopp0-dev_0.15-2_all
+libmotif-dev_2.3.3-8_i386
+libmount-dev_2.20.1-5.3_i386
+libmowgli-dev_1.0.0-1_i386
+libmozjs-dev_24.4.0esr-1~deb7u2_i386
+libmozjs185-dev_1.8.5-1.0.0+dfsg-4_i386
+libmp3lame-dev_3.99.5+repack1-3_i386
+libmp3lame-ocaml-dev_0.3.1-1+b1_i386
+libmp3splt-dev_0.7.2-2_i386
+libmp4v2-dev_2.0.0~dfsg0-1_i386
+libmpc-dev_0.9-4_i386
+libmpcdec-dev_2:0.1~r459-4_i386
+libmpd-dev_0.20.0-1.1_i386
+libmpdclient-dev_2.3-1_i386
+libmpeg2-4-dev_0.4.1-3_i386
+libmpeg3-dev_1.5.4-5_i386
+libmpfi-dev_1.5.1-1_i386
+libmpfr-dev_3.1.0-5_i386
+libmpg123-dev_1.14.4-1_i386
+libmpich2-dev_1.4.1-4.2_i386
+libmpikmeans-dev_1.5-1+b1_i386
+libmrml1-dev_0.1.14-12_i386
+libmrmpi-dev_1.0~20110620.dfsg-2_i386
+libmrss0-dev_0.19.2-3_i386
+libmsgpack-dev_0.5.7-2_i386
+libmsn-dev_4.2-2_i386
+libmspub-dev_0.0.6-1~bpo70+1_i386
+libmsv-dev_0.0.0-1_i386
+libmsv-dev_1.0-1~bpo70+1_i386
+libmtbl-dev_0.2-1_i386
+libmtcp-dev_1.2.5-1_i386
+libmtdev-dev_1.1.2-1_i386
+libmthca-dev_1.0.6-1_i386
+libmtp-dev_1.1.3-35-g0ece104-5_i386
+libmtp-dev_1.1.6-20-g1b9f164-1~bpo70+1_i386
+libmudflap0-4.4-dev_4.4.7-2_i386
+libmudflap0-4.6-dev_4.6.3-14_i386
+libmudflap0-4.7-dev_4.7.2-5_i386
+libmulticobex1-dev_0.23-1.1_i386
+libmumps-dev_4.10.0.dfsg-3_i386
+libmumps-ptscotch-dev_4.10.0.dfsg-3_i386
+libmumps-scotch-dev_4.10.0.dfsg-3_i386
+libmumps-seq-dev_4.10.0.dfsg-3_i386
+libmunge-dev_0.5.10-1_i386
+libmuparser-dev_2.1.0-3_i386
+libmupdf-dev_0.9-2_i386
+libmupen64plus-dev_1.99.5-6_all
+libmuroar-dev_0.1.8-2_i386
+libmusic-dev_1.0.7-1.2_i386
+libmusicbrainz3-dev_3.0.2-2.1_i386
+libmusicbrainz5-dev_5.0.1-2_i386
+libmutter-dev_3.4.1-5_i386
+libmx-dev_1.4.6-1_i386
+libmxml-dev_2.6-2_i386
+libmyproxy-dev_5.6-1_i386
+libmysql++-dev_3.1.0-2+b1_i386
+libmysql-cil-dev_6.4.3-2_all
+libmysql-ocaml-dev_1.1.1-1_i386
+libmysqlclient-dev_5.5.35+dfsg-0+wheezy1_i386
+libmysqlcppconn-dev_1.1.0-4+b1_i386
+libmysqld-dev_5.5.35+dfsg-0+wheezy1_i386
+libmythes-dev_2:1.2.2-1_i386
+libnabrit-dev_0.4.1-1_i386
+libnacl-dev_20110221-4_i386
+libnacore-dev_0.4.0-3_i386
+libnanohttp-dev_1.1.0-17.1_i386
+libnatpmp-dev_20110808-3_i386
+libnautilus-extension-dev_3.4.2-1+build1_i386
+libnauty-dev_2.4r2-1_i386
+libnbio-dev_0.30-1_i386
+libncap-dev_1.9.2-1+b2_i386
+libncbi6-dev_6.1.20120620-2_i386
+libncp-dev_2.2.6-9_i386
+libncurses5-dev_5.9-10_i386
+libncursesada2-dev_5.9.20110404-7_i386
+libncursesw5-dev_5.9-10_i386
+libndesk-dbus-glib1.0-cil-dev_0.4.1-4_all
+libndesk-dbus1.0-cil-dev_0.6.0-6_all
+libndr-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libndr-standard-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libnecpp-dev_1.5.0+cvs20101003-2.1_i386
+libneon27-dev_0.29.6-3_i386
+libneon27-gnutls-dev_0.29.6-3_i386
+libnes-dev_1.1.3-1_i386
+libnet1-dev_1.1.4-2.1_i386
+libnet6-1.3-dev_1:1.3.14-1_i386
+libnetcdf-dev_1:4.1.3-6+b1_i386
+libnetcf-dev_0.1.9-2_i386
+libnetclasses-dev_1.06.dfsg-5+b3_i386
+libnetfilter-conntrack-dev_1.0.1-1_i386
+libnetfilter-cttimeout-dev_1.0.0-1_i386
+libnetfilter-log-dev_1.0.0-1_i386
+libnetfilter-queue-dev_0.0.17-1_i386
+libnethttpd-ocaml-dev_3.5.1-1_i386
+libnetpbm10-dev_2:10.0-15+b1_i386
+libnetpbm9-dev_2:10.0-15+b1_i386
+libnetsvcs-dev_6.0.3+dfsg-0.1_i386
+libnewlib-dev_1.18.0-6.2_i386
+libnewmat10-dev_1.10.4-5_i386
+libnewt-dev_0.52.14-11.1_i386
+libnewtonsoft-json-cil-dev_4.5r6-1_all
+libnexus0-dev_4.2.1-svn1614-1+b2_i386
+libnfnetlink-dev_1.0.0-1.1_i386
+libnfo-dev_1.0.1-1_i386
+libnfs-dev_1.3.0-2_i386
+libnfsidmap-dev_0.25-4_i386
+libnice-dev_0.1.2-1_i386
+libnids-dev_1.23-2_i386
+libnifti-dev_2.0.0-1_i386
+libnih-dbus-dev_1.0.3-4.1_i386
+libnih-dev_1.0.3-4.1_i386
+libnini-cil-dev_1.1.0+dfsg.2-4_all
+libnjb-dev_2.2.7~dfsg0-3_i386
+libnl-3-dev_3.2.7-4_i386
+libnl-cli-3-dev_3.2.7-4_i386
+libnl-dev_1.1-7_i386
+libnl-genl-3-dev_3.2.7-4_i386
+libnl-nf-3-dev_3.2.7-4_i386
+libnl-route-3-dev_3.2.7-4_i386
+libnm-glib-dev_0.9.4.0-10_i386
+libnm-glib-vpn-dev_0.9.4.0-10_i386
+libnm-gtk-dev_0.9.4.1-5_i386
+libnm-util-dev_0.9.4.0-10_i386
+libnmz7-dev_2.0.21-6_i386
+libnoise-dev_1.0.0+nmu1_i386
+libnotify-cil-dev_0.4.0~r3032-6_all
+libnotify-dev_0.7.5-1_i386
+libnotmuch-dev_0.13.2-1_i386
+libnotmuch-dev_0.16-1~bpo70+1_i386
+libnova-dev_0.14.0-2_i386
+libnpth0-dev_0.90-2_i386
+libnsbmp0-dev_0.0.1-1.1_i386
+libnsgif0-dev_0.0.1-1.1_i386
+libnspr4-dev_2:4.9.2-1+deb7u1_i386
+libnss3-dev_2:3.14.5-1_i386
+libntdb-dev_1.0-2~bpo70+1_i386
+libntfs-dev_2.0.0-1+b1_i386
+libntl-dev_5.5.2-2_i386
+libntlm0-dev_1.2-1_i386
+libntrack-dev_016-1.1_i386
+libntrack-glib-dev_016-1.1_i386
+libntrack-gobject-dev_016-1.1_i386
+libntrack-qt4-dev_016-1.1_i386
+libnuclient-dev_2.4.3-2.2_i386
+libnuma-dev_2.0.8~rc4-1_i386
+libnunit-cil-dev_2.6.0.12051+dfsg-2_all
+libnussl-dev_2.4.3-2.2_i386
+libnvtt-dev_2.0.8-1+dfsg-2_i386
+libnvtt-dev_2.0.8-1+dfsg-4~bpo70+1_i386
+libnxcl-dev_0.9-3.1_i386
+libnxml0-dev_0.18.3-4_i386
+libnzb-dev_0.0.20050629-6.1_i386
+liboasis-ocaml-dev_0.2.0-6_i386
+liboasis3-dev_3.3.beta.dfsg.1-8+b1_i386
+liboath-dev_1.12.4-1_i386
+liboauth-dev_0.9.4-3.1_i386
+libobby-0.4-dev_0.4.8-1_i386
+libobexftp0-dev_0.23-1.1_i386
+libobrowser-ocaml-dev_1.1.1+dfsg-1+b9_i386
+libobus-ocaml-dev_1.1.3-1+b8_i386
+libocamlbricks-ocaml-dev_0.50.1-4+b5_i386
+libocamlbricks-ocaml-dev_0.90+bzr367-1~bpo70+1_i386
+libocamlgraph-ocaml-dev_1.8.2-2_i386
+libocamlgraph-viewer-ocaml-dev_1.8.2-2_i386
+libocamlgsl-ocaml-dev_0.6.0-7+b2_i386
+libocamlnet-gtk2-ocaml-dev_3.5.1-1_i386
+libocamlnet-ocaml-dev_3.5.1-1_i386
+libocamlnet-ssl-ocaml-dev_3.5.1-1_i386
+libocamlodbc-ocaml-dev_2.15-5+b3_i386
+libocamlviz-ocaml-dev_1.01-2+b2_i386
+libocas-dev_0.93-1_i386
+liboce-foundation-dev_0.9.1-3_i386
+liboce-modeling-dev_0.9.1-3_all
+liboce-ocaf-dev_0.9.1-3_all
+liboce-ocaf-lite-dev_0.9.1-3_all
+liboce-visualization-dev_0.9.1-3_all
+libocpf-dev_1:1.0-3_i386
+libocpf-dev_1:2.1-1~bpo70+1_i386
+libocrad-dev_0.22~rc1-2_i386
+libocsigen-ocaml-dev_1.3.4-2+b12_i386
+libocsigen-xhtml-ocaml-dev_1.3.4-2+b12_i386
+libocsigenserver-ocaml-dev_2.1-1_i386
+libocsync-dev_0.91.4-1~bpo70+1_i386
+liboctave-dev_3.6.2-5+deb7u1_i386
+liboctave-dev_3.8.1-1~bpo70+1_i386
+libode-dev_2:0.11.1-4_i386
+libode-sp-dev_2:0.11.1-4_i386
+libodin-dev_1.8.5-2_i386
+libodn-ocaml-dev_0.0.8-1_i386
+libofa0-dev_0.9.3-5_i386
+libofapi-dev_0git20070620-6_i386
+libofdt-dev_1.3.6-1_i386
+libofetion-dev_2.2.2-1_i386
+libofx-dev_1:0.9.4-2.1_i386
+libogdi3.2-dev_3.2.0~beta2-7_i386
+libogg-dev_1.3.0-4_i386
+libogg-ocaml-dev_0.4.3-1+b1_i386
+liboggkate-dev_0.4.1-1_i386
+liboggplay1-dev_0.2.1~git20091227-1.2_i386
+liboggz2-dev_1.1.1-1_i386
+liboglappth-dev_1.0.0-2_i386
+libogre-1.8-dev_1.8.0+dfsg1-3_i386
+libogre-dev_1.7.4+dfsg1-7_i386
+liboil0.3-dev_0.3.17-2_i386
+libois-dev_1.3.0+dfsg0-5_i386
+libomhacks-dev_0.16-1_i386
+libomnievents-dev_1:2.6.2-2_i386
+libomniorb4-dev_4.1.6-2_i386
+libomnithread3-dev_4.1.6-2_i386
+libomxil-bellagio-dev_0.9.3-1+b1_i386
+libonig-dev_5.9.1-1_i386
+liboobs-1-dev_3.0.0-1_i386
+liboop-dev_1.0-9_i386
+libooptools-dev_2.7-1_i386
+libopal-dev_3.10.4~dfsg-3_i386
+libopenafs-dev_1.6.1-3+deb7u2_i386
+libopenafs-dev_1.6.9-1~bpo70+1_i386
+libopenais-dev_1.1.4-4.1_i386
+libopenal-dev_1:1.14-4_i386
+libopenbabel-dev_2.3.1+dfsg-4_i386
+libopenblas-dev_0.1.1-6+deb7u3_i386
+libopencc-dev_0.3.0-3_i386
+libopenconnect-dev_3.20-4_i386
+libopencore-amrnb-dev_0.1.3-2_i386
+libopencore-amrwb-dev_0.1.3-2_i386
+libopencryptoki-dev_2.3.1+dfsg-3_i386
+libopencsg-dev_1.3.2-2_i386
+libopenct1-dev_0.6.20-1.2_i386
+libopencv-calib3d-dev_2.3.1-11_i386
+libopencv-contrib-dev_2.3.1-11_i386
+libopencv-core-dev_2.3.1-11_i386
+libopencv-dev_2.3.1-11_i386
+libopencv-features2d-dev_2.3.1-11_i386
+libopencv-flann-dev_2.3.1-11_i386
+libopencv-gpu-dev_2.3.1-11_i386
+libopencv-highgui-dev_2.3.1-11_i386
+libopencv-imgproc-dev_2.3.1-11_i386
+libopencv-legacy-dev_2.3.1-11_i386
+libopencv-ml-dev_2.3.1-11_i386
+libopencv-objdetect-dev_2.3.1-11_i386
+libopencv-video-dev_2.3.1-11_i386
+libopendbx1-dev_1.4.6-5~bpo70+1_i386
+libopendkim-dev_2.6.8-4_i386
+libopendmarc-dev_1.2.0+dfsg-1~bpo70+1_i386
+libopenexr-dev_1.6.1-6_i386
+libopenhpi-dev_2.14.1-1.2_i386
+libopenigtlink1-dev_1.9.2~svn7468-1_i386
+libopenimageio-dev_1.0.5+dfsg0-1_i386
+libopenipmi-dev_2.0.16-1.3_i386
+libopenjpeg-dev_1.3+dfsg-4.7_i386
+libopenmeeg-dev_2.0.0.dfsg-5_i386
+libopenmpi-dev_1.4.5-1_i386
+libopenobex1-dev_1.5-2_i386
+libopenr2-dev_1.3.2-1.1_i386
+libopenraw-dev_0.0.9-3+b1_i386
+libopenrawgnome-dev_0.0.9-3+b1_i386
+libopenrpt-dev_3.3.4-6~bpo70+1_i386
+libopenscap-dev_0.8.0-4+b1_i386
+libopenscenegraph-dev_3.0.1-4_i386
+libopenslide-dev_3.2.6-2_i386
+libopensm2-dev_3.2.6-20090317-2.1_i386
+libopenthreads-dev_3.0.1-4_i386
+libopentk-cil-dev_1.0.20101006+dfsg1-1_all
+libopentoken3-dev_4.0b-3_i386
+libopenturns-dev_1.0-4_i386
+libopenusb-dev_1.1.0-2_i386
+libopenvg1-mesa-dev_8.0.5-4+deb7u2_i386
+libopenvrml-dev_0.18.9-5+deb7u1_i386
+libopenwalnut1-dev_1.2.5-1.1+b1_i386
+liboping-dev_1.6.2-1_i386
+libopkele-dev_2.0.4-5.3_i386
+libopts25-dev_1:5.12-0.1_i386
+libopus-dev_0.9.14+20120615-1+nmu1_i386
+libopus-dev_1.1-1~bpo70+1_i386
+liborange-dev_0.4-2_i386
+liborbit2-dev_1:2.14.19-0.1_i386
+liborc-0.4-dev_1:0.4.16-2_i386
+liborc-0.4-dev_1:0.4.19-1~bpo70+1_i386
+liborigin-dev_20080225-2.1_i386
+liborigin2-dev_2:20110117-1+b2_i386
+libortp-dev_3.5.2-10_i386
+liboscpack-dev_1.0.2-1_i386
+libosgearth-dev_2.0+dfsg-4+b3_i386
+libosinfo-1.0-dev_0.1.1-1_i386
+libosip2-dev_3.6.0-4_i386
+libosl-dev_0.5.0-1_i386
+libosmesa6-dev_8.0.5-4+deb7u2_i386
+libosmgpsmap-dev_0.7.3-3_i386
+libosmium-dev_0.0~20111213-g7f3500a-3+b2_i386
+libosmosdr-dev_0.1.8.effcaa7-1~bpo70+1_i386
+libosmpbf-dev_1.2.1-3_i386
+libosp-dev_1.5.2-10_i386
+libosptk3-dev_3.4.2-1+b1_i386
+libossim-dev_1.7.21-4_i386
+libossp-sa-dev_1.2.6-1_i386
+libossp-uuid-dev_1.6.2-1.3_i386
+libostyle-dev_1.4devel1-20.1+b1_i386
+libotcl1-dev_1.14+dfsg-2_i386
+libotf-dev_0.9.12-2_i386
+libotf-trace-dev_1.10.2+dfsg-2_i386
+libotpw-dev_1.3-2_i386
+libotr2-dev_3.2.1-1+deb7u1_i386
+libotr5-dev_4.0.0-2.2~bpo70+1_i386
+libots-dev_0.5.0-2.1_i386
+libounit-ocaml-dev_1.1.1-1_i386
+libow-dev_2.8p15-1_i386
+libowfat-dev_0.28-6_i386
+libowfat-dietlibc-dev_0.28-6_i386
+libownet-dev_2.8p15-1_i386
+libp11-dev_0.2.8-2_i386
+libp11-kit-dev_0.12-3_i386
+libp11-kit-dev_0.20.2-1~bpo70+1_i386
+libpackagekit-glib2-dev_0.7.6-3_i386
+libpackagekit-qt2-dev_0.7.6-3_i386
+libpacketdump3-dev_3.0.14-1_i386
+libpacklib-lesstif1-dev_20061220+dfsg3-2_i386
+libpacklib1-dev_20061220+dfsg3-2_i386
+libpacparser-dev_1.3.0-2_i386
+libpam-ocaml-dev_1.1-4+b3_i386
+libpam0g-dev_1.1.3-7.1_i386
+libpanel-applet-4-dev_3.4.2.1-4_i386
+libpango1.0-dev_1.30.0-1_i386
+libpangomm-1.4-dev_2.28.4-1_i386
+libpano13-dev_2.9.18+dfsg-5_i386
+libpantomime1.2-dev_1.2.0~pre3+snap20071004+dfsg-4+b1_i386
+libpaper-dev_1.1.24+nmu2_i386
+libpaps-dev_0.6.8-6_i386
+libpaq-dev_1.0.4-3+b1_i386
+libpar2-0-dev_0.2.1-1_i386
+libpari-dev_2.5.1-2_i386
+libpari-dev_2.7.1-1~bpo70+1_i386
+libparmetis-dev_3.1.1-4_i386
+libparpack2-dev_3.1.1-2.1_i386
+libparrot-dev_4.0.0-3_i386
+libparser++-dev_0.2.3-2_all
+libparted0-dev_2.3-12_i386
+libpasswdqc-dev_1.2.0-1_all
+libpath-utils-dev_0.1.3-2_i386
+libpathfinder-dev_1.1.3-0.4+b1_i386
+libpawlib-lesstif3-dev_1:2.14.04.dfsg.2-8_i386
+libpawlib2-dev_1:2.14.04.dfsg.2-8_i386
+libpcap-dev_1.3.0-1_all
+libpcap0.8-dev_1.3.0-1_i386
+libpcapnav0-dev_0.8-1_i386
+libpci-dev_1:3.1.9-6_i386
+libpciaccess-dev_0.13.1-2_i386
+libpcl1-dev_1.6-1_i386
+libpcre++-dev_0.9.5-5.1_i386
+libpcre-ocaml-dev_6.2.5-1_i386
+libpcre3-dev_1:8.30-5_i386
+libpcscada2-dev_0.7.1-4_i386
+libpcsclite-dev_1.8.4-1+deb7u1_i386
+libpdflib804-2-dev_20061220+dfsg3-2_i386
+libpe-rules2-dev_1.1.7-1_i386
+libpe-status3-dev_1.1.7-1_i386
+libpeas-dev_1.4.0-2_i386
+libpengine3-dev_1.1.7-1_i386
+libperl-dev_5.14.2-21+deb7u1_i386
+libperl4caml-ocaml-dev_0.9.5-4+b4_i386
+libpetsc3.2-dev_3.2.dfsg-6_i386
+libpfqueue-dev_0.5.6-8_i386
+libpfs-dev_1.8.5-1_i386
+libpgm-dev_5.1.118-1~dfsg-0.1_i386
+libpgocaml-ocaml-dev_1.5-2_i386
+libpgpool-dev_3.1.3-5_i386
+libpgtcl-dev_1:1.5-6_i386
+libphash0-dev_0.9.4-1.2_i386
+libphat-dev_0.4.1-5_i386
+libphobos-4.4-dev_1.063-4.4.7-1_i386
+libphobos2-4.6-dev_0.29.1-4.6.3-2_i386
+libphone-ui-dev_1:0.0.1+git20110825-3_i386
+libphone-utils-dev_0.1+git20110523-2.1_i386
+libphonon-dev_4:4.6.0.0-3_i386
+libphononexperimental-dev_4:4.6.0.0-3_i386
+libphotos202-dev_20061220+dfsg3-2_i386
+libphtools2-dev_20061220+dfsg3-2_i386
+libphysfs-dev_2.0.2-6_i386
+libpiano-dev_2012.05.06-2_i386
+libpigment0.3-dev_0.3.17-1_i386
+libpils2-dev_1.0.9+hg2665-1_i386
+libpinyin0-dev_0.6.91-1_i386
+libpion-common-dev_4.0.7+dfsg-3.1_i386
+libpion-net-dev_4.0.7+dfsg-3.1_i386
+libpipeline-dev_1.2.1-1_i386
+libpisock-dev_0.12.5-5_i386
+libpixman-1-dev_0.26.0-4+deb7u1_i386
+libpjproject-dev_2.1.0.0.ast20130823-1~bpo70+1_i386
+libpkcs11-helper1-dev_1.09-1_i386
+libplayer-dev_2.0.1-2.1_i386
+libplayerc++3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayerc3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayercommon3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayercore3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayerdrivers3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayerinterface3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayerjpeg3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayertcp3.0-dev_3.0.2+dfsg-4+b1_i386
+libplayerwkb3.0-dev_3.0.2+dfsg-4+b1_i386
+libplib-dev_1.8.5-6_i386
+libplist++-dev_1.8-1_i386
+libplist-dev_1.8-1_i386
+libpload-dev_1.4.2-3_i386
+libplot-dev_2.6-3_i386
+libploticus0-dev_2.41-5_i386
+libplotmm-dev_0.1.2-2_i386
+libplplot-ada0-dev_5.9.9-5_i386
+libplplot-dev_5.9.9-5_i386
+libplumb2-dev_1.0.9+hg2665-1_i386
+libplumbgpl2-dev_1.0.9+hg2665-1_i386
+libpmap3.0-dev_3.0.2+dfsg-4+b1_i386
+libpmi0-dev_2.3.4-2+b1_i386
+libpmount-dev_0.0.16_i386
+libpng++-dev_0.2.5-1_all
+libpng12-dev_1.2.49-1_i386
+libpnglite-dev_0.1.17-1_i386
+libpoco-dev_1.3.6p1-4_i386
+libpodofo-dev_0.9.0-1.1+b1_i386
+libpoker-eval-dev_138.0-1_i386
+libpolarssl-dev_1.2.9-1~deb7u2_i386
+libpoldiff-dev_3.3.7-3_i386
+libpolkit-agent-1-dev_0.105-3_i386
+libpolkit-backend-1-dev_0.105-3_i386
+libpolkit-gobject-1-dev_0.105-3_i386
+libpolkit-qt-1-dev_0.103.0-1_i386
+libpolybori-dev_0.5~rc1-2.2_i386
+libpolylib64-dev_5.22.5-3+dfsg_i386
+libpolyml-dev_5.2.1-1.1_i386
+libpolyorb2-dev_2.8~20110207-5.1_i386
+libpomp-dev_1.1+dfsg-2_i386
+libpoppler-cil-dev_0.0.3-2_all
+libpoppler-cpp-dev_0.18.4-6_i386
+libpoppler-cpp-dev_0.24.5-4~bpo70+1_i386
+libpoppler-dev_0.18.4-6_i386
+libpoppler-dev_0.24.5-4~bpo70+1_i386
+libpoppler-glib-dev_0.18.4-6_i386
+libpoppler-glib-dev_0.24.5-4~bpo70+1_i386
+libpoppler-private-dev_0.18.4-6_i386
+libpoppler-private-dev_0.24.5-4~bpo70+1_i386
+libpoppler-qt4-dev_0.18.4-6_i386
+libpoppler-qt4-dev_0.24.5-4~bpo70+1_i386
+libpopplerkit-dev_0.0.20051227svn-7+b1_i386
+libpopt-dev_1.16-7_i386
+libportaudio-dev_18.1-7.1_i386
+libportaudio-ocaml-dev_0.2.0-1+b1_i386
+libportmidi-dev_1:184-2.1_i386
+libportsmf-dev_0.1~svn20101010-3_i386
+libpostgresql-ocaml-dev_1.18.0-1_i386
+libpostproc-dev_6:0.8.10-1_i386
+libpostproc-dev_6:0.git20120821-4~bpo70+1_i386
+libpotrace-dev_1.10-1_i386
+libpowerman0-dev_2.3.5-1_i386
+libppd-dev_2:0.10-7.1_i386
+libppl0.11-dev_0.11.2-8_i386
+libpq-dev_9.1.13-0wheezy1_i386
+libpqxx3-dev_3.1-1.1_i386
+libprelude-dev_1.0.0-9_i386
+libpreludedb-dev_1.0.0-1.1+b2_i386
+libpresage-dev_0.8.8-1_i386
+libpri-dev_1.4.12-2_i386
+libprinterconf-dev_0.5-12_i386
+libprintsys-dev_0.6-13_i386
+libprison-dev_1.0+dfsg-1_i386
+libprocps0-dev_1:3.3.3-3_i386
+libproj-dev_4.7.0-2_i386
+libprojectm-dev_2.1.0+dfsg-1_i386
+libprojectm-qt-dev_2.1.0+dfsg-1_i386
+libprotobuf-c0-dev_0.14-1+b1_i386
+libprotobuf-dev_2.4.1-3_i386
+libprotoc-dev_2.4.1-3_i386
+libproxy-dev_0.3.1-6_i386
+libproxychains-dev_3.1-3_i386
+libpspell-dev_0.60.7~20110707-1_i386
+libpst-dev_0.6.54-4.1_i386
+libpstoedit-dev_3.60-2+b1_i386
+libpstreams-dev_0.7.0-2_all
+libpt-dev_2.10.4~dfsg-1_i386
+libptexenc-dev_2012.20120628-4_i386
+libpth-dev_2.0.7-16_i386
+libpthread-stubs0-dev_0.3-3_i386
+libpthread-workqueue-dev_0.8.2-1_i386
+libptscotch-dev_5.1.12b.dfsg-1.2_i386
+libpugl-dev_0~svn32+dfsg0-1_i386
+libpulse-dev_2.0-6.1_i386
+libpulse-dev_4.0-6~bpo7+1_i386
+libpulse-ocaml-dev_0.1.2-1+b1_i386
+libpuma-dev_1:1.1+svn20120529-2_i386
+libpurelibc-dev_0.4.1-1_i386
+libpurple-dev_2.10.7-2~bpo70+1_all
+libpurple-dev_2.10.9-1~deb7u1_all
+libpuzzle-dev_0.9-5_i386
+libpwl-dev_0.11.2-8_i386
+libpxp-ocaml-dev_1.2.2-1+b4_i386
+libpycaml-ocaml-dev_0.82-14+b2_i386
+libpyside-dev_1.1.1-3_i386
+libpythia8-dev_8.1.65-1_i386
+libpythonqt2-dev_2.0.1-1.1_i386
+libqalculate-dev_0.9.7-8_i386
+libqapt-dev_1.3.0-2_i386
+libqb-dev_0.11.1-2_i386
+libqca2-dev_2.0.3-4_i386
+libqd-dev_2.3.11.dfsg-2.1_i386
+libqdaccolib-dev_0.8.2-1_i386
+libqdbm++-dev_1.8.78-2_i386
+libqdbm-dev_1.8.78-2_i386
+libqdjango-dev_0.2.5-2_i386
+libqedje-dev_0.4.0+lgpl-3_i386
+libqfits-dev_6.2.0-5_i386
+libqgis-dev_1.7.4+1.7.5~20120320-1.1+b1_i386
+libqglviewer-qt4-dev_2.3.4-4.2_i386
+libqgpsmm-dev_3.6-4+deb7u1_i386
+libqgpsmm-dev_3.9-3~bpo70+1_i386
+libqhull-dev_2009.1-3_i386
+libqimageblitz-dev_1:0.0.6-4_i386
+libqjson-dev_0.7.1-7_i386
+libqmf-dev_0.16-6+deb7u1_i386
+libqmf2-dev_0.16-6+deb7u1_i386
+libqmfconsole2-dev_0.16-6+deb7u1_i386
+libqmfengine1-dev_0.16-6+deb7u1_i386
+libqmmp-dev_0.5.5-1+b1_i386
+libqmmpui-dev_0.5.5-1+b1_i386
+libqoauth-dev_1.0.1-1_i386
+libqof-dev_0.8.6-1_i386
+libqofexpensesobjects-dev_0.1.9-2_i386
+libqpdf-dev_2.3.1-4_i386
+libqpidbroker2-dev_0.16-6+deb7u1_i386
+libqpidclient2-dev_0.16-6+deb7u1_i386
+libqpidcommon2-dev_0.16-6+deb7u1_i386
+libqpidmessaging2-dev_0.16-6+deb7u1_i386
+libqpidtypes1-dev_0.16-6+deb7u1_i386
+libqpol-dev_3.3.7-3_i386
+libqpx-dev_0.7.1.002-5_i386
+libqpx-dev_0.7.2-4~bpo70+1_i386
+libqrencode-dev_3.3.0-2_i386
+libqrupdate-dev_1.1.1-1_i386
+libqsastime-dev_5.9.9-5_i386
+libqscintilla2-dev_2.6.2-2_all
+libqt4-dev_4:4.8.2+dfsg-11_i386
+libqt4-opengl-dev_4:4.8.2+dfsg-11_i386
+libqt4-private-dev_4:4.8.2+dfsg-11_i386
+libqt4pas-dev_2.5-6_i386
+libqtassistantclient-dev_4.6.3-4_i386
+libqtexengine-dev_0.3-3_i386
+libqtgstreamer-dev_0.10.2-2_i386
+libqtruby4shared-dev_4:4.8.4-1_i386
+libqtwebkit-dev_2.2.1-5_i386
+libquantlib0-dev_1.2-2+b1_i386
+libquantum-dev_1.1.0-3_i386
+libquicktime-dev_2:1.2.4-3_i386
+libquorum-dev_1.4.2-3_i386
+libquvi-dev_0.4.1-1_i386
+libqwt-dev_6.0.0-1.2_i386
+libqwt5-qt4-dev_5.2.2-3_i386
+libqwtplot3d-qt4-dev_0.2.7+svn191-7_i386
+libqxmlrpc-dev_0.0.svn6-2_i386
+libqxmpp-dev_0.4.92-1_i386
+libqxmpp-dev_0.8.0-1~bpo70+1_i386
+libqxt-dev_0.6.1-6_i386
+libqzeitgeist-dev_0.7.0-1+b1_i386
+libqzion-dev_0.4.0+lgpl-4_i386
+librabbitmq-dev_0.0.1.hg216-1_i386
+libradare2-dev_0.9-3_i386
+libradius1-dev_0.3.2-14_i386
+libradiusclient-ng-dev_0.5.6-1.1_i386
+librados-dev_0.80.1-1~bpo70+1_i386
+libranlip-dev_1.0-4.1_i386
+librapi2-dev_0.15-2.1_i386
+libraptor1-dev_1.4.21-7.1_i386
+libraptor2-dev_2.0.8-2_i386
+librarian-dev_0.8.1-5_i386
+librasqal3-dev_0.9.29-1_i386
+librasterlite-dev_1.1~svn11-2_i386
+libraul-dev_0.8.0+dfsg0-0.1+b1_i386
+libraw-dev_0.14.6-2_i386
+libraw1394-dev_2.0.9-1_i386
+librbd-dev_0.80.1-1~bpo70+1_i386
+librcc-dev_0.2.9-3_i386
+librcd-dev_0.1.13-3_i386
+librdf0-dev_1.0.15-1+b1_i386
+librdkit-dev_201203-3_i386
+librdmacm-dev_1.0.15-1+deb7u1_i386
+librdmacm-dev_1.0.16-1~bpo70+1_i386
+librdmawrap2-dev_0.16-6+deb7u1_i386
+libreact-ocaml-dev_0.9.3-1_i386
+libreadline-dev_6.2+dfsg-0.1_i386
+libreadline-gplv2-dev_5.2+dfsg-2~deb7u1_i386
+libreadline6-dev_6.2+dfsg-0.1_i386
+librec-dev_1.5-1_i386
+librecode-dev_3.6-20_i386
+librecon-1.9-dev_1.9.7-1~bpo70+1_i386
+libref-array-dev_0.1.3-2_i386
+libregina3-dev_3.6-2_i386
+libregistry-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libreins-ocaml-dev_0.1a-4+b1_i386
+libreiser4-dev_1.0.7-6.3_i386
+librelp-dev_1.0.0-1_i386
+librelp-dev_1.2.7-1~bpo70+1_i386
+libremctl-dev_3.2-4_i386
+libremctl-dev_3.8-1~bpo70+1_i386
+librenaissance0-dev_0.9.0-4+b3_i386
+libreoffice-dev_1:3.5.4+dfsg2-0+deb7u2_i386
+libreoffice-dev_1:4.2.5-1~bpo70+1_i386
+librep-dev_0.90.2-1.3_i386
+libreplaygain-dev_1.0~r475-1_i386
+libres-ocaml-dev_3.2.0-2+b3_i386
+libresample1-dev_0.1.3-4_i386
+libresid-builder-dev_2.1.1-14_i386
+libresiprocate-1.8-dev_1.8.5-4_i386
+libresiprocate-1.9-dev_1.9.7-1~bpo70+1_i386
+libresiprocate-turn-client-1.8-dev_1.8.5-4_i386
+libresiprocate-turn-client-1.9-dev_1.9.7-1~bpo70+1_i386
+librest-dev_0.7.12-3_i386
+librest-extras-dev_0.7.12-3_i386
+librgxg-dev_0.1-1~bpo70+1_i386
+librhash-cil-dev_1.2.9-8+deb7u1_all
+librhash-dev_1.2.9-8+deb7u1_i386
+librheolef-dev_6.1-2.1_i386
+librivet-dev_1.8.0-1_i386
+librlog-dev_1.4-2_i386
+libroar-dev_1.0~beta2-3_i386
+libroot-bindings-python-dev_5.34.00-2_i386
+libroot-bindings-ruby-dev_5.34.00-2_i386
+libroot-core-dev_5.34.00-2_i386
+libroot-geom-dev_5.34.00-2_i386
+libroot-graf2d-gpad-dev_5.34.00-2_i386
+libroot-graf2d-graf-dev_5.34.00-2_i386
+libroot-graf2d-postscript-dev_5.34.00-2_i386
+libroot-graf3d-eve-dev_5.34.00-2_i386
+libroot-graf3d-g3d-dev_5.34.00-2_i386
+libroot-graf3d-gl-dev_5.34.00-2_i386
+libroot-gui-dev_5.34.00-2_i386
+libroot-gui-ged-dev_5.34.00-2_i386
+libroot-hist-dev_5.34.00-2_i386
+libroot-hist-spectrum-dev_5.34.00-2_i386
+libroot-html-dev_5.34.00-2_i386
+libroot-io-dev_5.34.00-2_i386
+libroot-io-xmlparser-dev_5.34.00-2_i386
+libroot-math-foam-dev_5.34.00-2_i386
+libroot-math-genvector-dev_5.34.00-2_i386
+libroot-math-mathcore-dev_5.34.00-2_i386
+libroot-math-mathmore-dev_5.34.00-2_i386
+libroot-math-matrix-dev_5.34.00-2_i386
+libroot-math-minuit-dev_5.34.00-2_i386
+libroot-math-mlp-dev_5.34.00-2_i386
+libroot-math-physics-dev_5.34.00-2_i386
+libroot-math-quadp-dev_5.34.00-2_i386
+libroot-math-smatrix-dev_5.34.00-2_i386
+libroot-math-splot-dev_5.34.00-2_i386
+libroot-math-unuran-dev_5.34.00-2_i386
+libroot-misc-memstat-dev_5.34.00-2_i386
+libroot-misc-minicern-dev_5.34.00-2_i386
+libroot-misc-table-dev_5.34.00-2_i386
+libroot-montecarlo-eg-dev_5.34.00-2_i386
+libroot-montecarlo-vmc-dev_5.34.00-2_i386
+libroot-net-auth-dev_5.34.00-2_i386
+libroot-net-bonjour-dev_5.34.00-2_i386
+libroot-net-dev_5.34.00-2_i386
+libroot-net-ldap-dev_5.34.00-2_i386
+libroot-proof-clarens-dev_5.34.00-2_i386
+libroot-proof-dev_5.34.00-2_i386
+libroot-proof-proofplayer-dev_5.34.00-2_i386
+libroot-roofit-dev_5.34.00-2_i386
+libroot-tmva-dev_5.34.00-2_i386
+libroot-tree-dev_5.34.00-2_i386
+libroot-tree-treeplayer-dev_5.34.00-2_i386
+librostlab-blast0-dev_1.0.0-2_i386
+librostlab3-dev_1.0.20-1_i386
+librpcsecgss-dev_0.19-5_i386
+librplay3-dev_3.3.2-14_i386
+librpm-dev_4.10.0-5+deb7u1_i386
+librra-dev_0.14-1.2_i386
+librrd-dev_1.4.7-2_i386
+librsl-dev_1.42-2_i386
+librsskit-dev_0.3-2_i386
+librsvg2-2.0-cil-dev_2.26.0-8_all
+librsvg2-dev_2.36.1-2_i386
+librsync-dev_0.9.7-9_i386
+librtai-dev_3.8.1-4_i386
+librtas-dev_1.3.6-1_i386
+librtasevent-dev_1.3.6-1_i386
+librtaudio-dev_4.0.10~ds0-2_i386
+librtfcomp-dev_1.1-5+b1_i386
+librtfilter-dev_1.1-4_i386
+librtlsdr-dev_0.5.3-3~bpo70+1_i386
+librtmidi-dev_1.0.15~ds0-2_i386
+librtmp-dev_2.4+20111222.git4e06e21-1_i386
+librubberband-dev_1.3-1.3_i386
+librudecgi-dev_5.0.0-1_i386
+libruli4-dev_0.33-1.1_i386
+librxp-dev_1.5.0-1_i386
+libs3-dev_2.0-1_i386
+libs3d-dev_0.2.2-8_i386
+libs3dw-dev_0.2.2-8_i386
+libsaamf3-dev_1.1.4-4.1_i386
+libsackpt3-dev_1.1.4-4.1_i386
+libsaclm3-dev_1.1.4-4.1_i386
+libsaevt3-dev_1.1.4-4.1_i386
+libsage-dev_0.2.0-4.1_i386
+libsalck3-dev_1.1.4-4.1_i386
+libsam-dev_1.4.2-3_i386
+libsamba-credentials-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libsamba-hostconfig-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libsamba-policy-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libsamba-util-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libsamdb-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libsaml2-dev_2.4.3-4_i386
+libsaml2-dev_2.5.3-2~bpo70+1_i386
+libsampleicc-dev_1.6.4-1+b1_i386
+libsamplerate-ocaml-dev_0.1.1-1+b3_i386
+libsamplerate0-dev_0.1.8-5_i386
+libsamsg4-dev_1.1.4-4.1_i386
+libsane-dev_1.0.22-7.4_i386
+libsane-extras-dev_1.0.22.2_i386
+libsanlock-dev_2.2-2_i386
+libsary-dev_1:1.2.0-2.1_i386
+libsasl2-dev_2.1.25.dfsg1-6+deb7u1_i386
+libsatmr3-dev_1.1.4-4.1_i386
+libsbc-dev_1.1-2~bpo7+1_i386
+libsbjson-dev_2.3.2-2_i386
+libsbsms-dev_2.0.1-1_i386
+libsbuf-dev_9.0+ds1-4_i386
+libsbuild-dev_1.6.4-4_i386
+libsc-dev_2.3.1-14_i386
+libscalapack-mpi-dev_1.8.0-9_i386
+libscalapack-pvm-dev_1.8.0-9_i386
+libscalc-dev_0.2.4-1_i386
+libscamperfile0-dev_20111202b-1_i386
+libschroedinger-dev_1.0.11-2_i386
+libschroedinger-ocaml-dev_0.1.0-1+b3_i386
+libscim-dev_1.4.13-5_i386
+libscm-dev_5e5-3.2_i386
+libscotch-dev_5.1.12b.dfsg-1.2_i386
+libscotchmetis-dev_5.1.12b.dfsg-1.2_i386
+libscotchparmetis-dev_5.1.12b.dfsg-1.2_i386
+libsctp-dev_1.0.11+dfsg-2_i386
+libscythestat-dev_1.0.2-1_all
+libsdl-console-dev_2.1-3_i386
+libsdl-gfx1.2-dev_2.0.23-3_i386
+libsdl-image1.2-dev_1.2.12-2_i386
+libsdl-mixer1.2-dev_1.2.12-3_i386
+libsdl-net1.2-dev_1.2.8-2_i386
+libsdl-ocaml-dev_0.9.0-1_i386
+libsdl-pango-dev_0.1.2-6_i386
+libsdl-sge-dev_030809dfsg-3_i386
+libsdl-sound1.2-dev_1.0.3-6_i386
+libsdl-stretch-dev_0.3.1-3_i386
+libsdl-ttf2.0-dev_2.0.11-2_i386
+libsdl1.2-dev_1.2.15-5_i386
+libsdl2-dev_2.0.0+dfsg1-2~bpo70+1_i386
+libsdpa-dev_7.3.8+dfsg-1_i386
+libsearchclient-dev_0.7.7-3_i386
+libseaudit-dev_3.3.7-3_i386
+libseccomp-dev_2.1.1-1~bpo70+1_i386
+libseed-gtk3-dev_3.2.0-2_i386
+libsefs-dev_3.3.7-3_i386
+libselinux1-dev_2.1.9-5_i386
+libsemanage1-dev_2.1.6-6_i386
+libsensors-applet-plugin-dev_3.0.0-0.2_i386
+libsensors4-dev_1:3.3.2-2+deb7u1_i386
+libsepol1-dev_2.1.4-3_i386
+libserd-dev_0.14.0~dfsg0-2_i386
+libserf-dev_1.1.0-2_i386
+libsexplib-camlp4-dev_7.0.4-2_i386
+libsexy-dev_0.1.11-2+b1_i386
+libsfml-dev_1.6+dfsg2-2_i386
+libsfst1-1.2-0-dev_1.2.0-1.2_i386
+libsgutils2-dev_1.33-1_i386
+libsha-ocaml-dev_1.7-2+b2_i386
+libshairport-dev_1.2.1~git20120110.aeb4987-2_i386
+libshevek-dev_1.3-1_i386
+libshhmsg1-dev_1.4.1-4.1_i386
+libshhopt1-dev_1.1.7-2.1_i386
+libshiboken-dev_1.1.1-1_i386
+libshibsp-dev_2.4.3+dfsg-5+b1_i386
+libshibsp-dev_2.5.2+dfsg-2~bpo70+1_i386
+libshisa-dev_1.0.1-2_i386
+libshishi-dev_1.0.1-2_i386
+libshout-ocaml-dev_0.2.7-1+b3_i386
+libshout3-dev_2.2.2-8_i386
+libshp-dev_1.2.10-7_i386
+libshr-glib-dev_2011.03.08.2~git20110930-2_i386
+libsidl-dev_1.4.0.dfsg-8.1_i386
+libsidplay1-dev_1.36.59-5_i386
+libsidplay2-dev_2.1.1-14_i386
+libsidplayfp-dev_0.3.5-1_i386
+libsidutils-dev_2.1.1-14_i386
+libsieve2-dev_2.2.6-1.1_i386
+libsigc++-1.2-dev_1.2.7-2_i386
+libsigc++-2.0-dev_2.2.10-0.2_i386
+libsigc++-dev_1.0.4-9.4_i386
+libsigrok0-dev_0.1.0-2_i386
+libsigrokdecode0-dev_0.1.0-2_i386
+libsigsegv-dev_2.9-4_i386
+libsilly-dev_0.1.0-3_i386
+libsilo-dev_4.8-13_i386
+libsimage-dev_1.7.0-1.1+b1_i386
+libsimplelist0-dev_0.3.4-2_i386
+libsipwitch-dev_1.2.4-1_i386
+libsipxtapi-dev_3.3.0~test15-1~bpo70+1_i386
+libsiscone-dev_2.0.5-1_i386
+libsiscone-spherical-dev_2.0.5-1_i386
+libskk-dev_0.0.12-3_i386
+libskstream-0.3-dev_0.3.8-1_i386
+libslang2-dev_2.2.4-15_i386
+libslepc3.2-dev_3.2-p5-1_i386
+libslp-dev_1.2.1-9_i386
+libslurm-dev_2.3.4-2+b1_i386
+libslurmdb-dev_2.3.4-2+b1_i386
+libslv2-dev_0.6.6+dfsg1-2_i386
+libsm-dev_2:1.2.1-2_i386
+libsmbclient-dev_2:3.6.6-6+deb7u3_i386
+libsmbclient-dev_2:4.1.9+dfsg-1~bpo70+1_i386
+libsmbclient-raw-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libsmbios-dev_2.0.3.dfsg-1.1_i386
+libsmbsharemodes-dev_2:4.1.9+dfsg-1~bpo70+1_i386
+libsmf-dev_1.3-2_i386
+libsmi2-dev_0.4.8+dfsg2-7_i386
+libsmokekde-dev_4:4.8.4-1_i386
+libsmokeqt4-dev_4:4.8.4-1_i386
+libsmpeg-dev_0.4.5+cvs20030824-5_i386
+libsnacc-dev_1.3.1-1_i386
+libsnack2-dev_2.2.10-dfsg1-12.1_i386
+libsnappy-dev_1.0.5-2_i386
+libsndfile1-dev_1.0.25-5_i386
+libsndobj-dev_2.6.6.1-3_i386
+libsnmp-dev_5.4.3~dfsg-2.8_i386
+libsnmpkit-dev_0.9-16_i386
+libsocialweb-client-dev_0.25.20-2.1_i386
+libsocialweb-dev_0.25.20-2.1_i386
+libsocksd0-dev_1.1.19.dfsg-3+b3_i386
+libsofa-c-dev_2012.03.01-1_i386
+libsofa1-dev_1.0~beta4-7_i386
+libsofia-sip-ua-dev_1.12.11+20110422-1_i386
+libsofia-sip-ua-glib-dev_1.12.11+20110422-1_i386
+libsofthsm-dev_1.3.3-2_i386
+libsoil-dev_1.07~20080707.dfsg-2_i386
+libsombok-dev_2.2.1-1_i386
+libsonic-dev_0.1.17-1.1_i386
+libsope-dev_1.3.16-1_i386
+libsope-dev_2.0.5-1~bpo70+1_i386
+libsoprano-dev_2.7.6+dfsg.1-2wheezy1_i386
+libsoqt4-dev_1.5.0-2_i386
+libsoqt4-dev_1.6.0~e8310f-1~bpo70+1_i386
+libsord-dev_0.8.0~dfsg0-1_i386
+libsoundgen-dev_0.6-4_i386
+libsoundtouch-dev_1.6.0-3_i386
+libsoundtouch-ocaml-dev_0.1.7-1+b1_i386
+libsoup-gnome2.4-dev_2.38.1-3_i386
+libsoup2.4-dev_2.38.1-3_i386
+libsoupcutter-dev_1.1.7-1.2_i386
+libsource-highlight-dev_3.1.6-1.1_i386
+libsox-dev_14.4.0-3_i386
+libsp-gxmlcpp-dev_1.0.20040603-5_i386
+libsp1-dev_1.3.4-1.2.1-47.1+b1_i386
+libspandsp-dev_0.0.6~pre20-3.1_i386
+libsparsehash-dev_1.10-1_all
+libsparskit-dev_2.0.0-2_i386
+libspatialindex-dev_1.7.0-1_i386
+libspatialite-dev_3.0.0~beta20110817-3+deb7u1_i386
+libspctag-dev_0.2-1_i386
+libspectre-dev_0.2.7-2_i386
+libspectrum-dev_1.0.0-3_i386
+libspeechd-dev_0.7.1-6.2_i386
+libspeex-dev_1.2~rc1-7_i386
+libspeex-ocaml-dev_0.2.0-1+b3_i386
+libspeexdsp-dev_1.2~rc1-7_i386
+libspf2-dev_1.2.9-7_i386
+libsphere-dev_3.2-4_i386
+libspice-client-glib-2.0-dev_0.12-5_i386
+libspice-client-gtk-2.0-dev_0.12-5_i386
+libspice-client-gtk-3.0-dev_0.12-5_i386
+libspice-protocol-dev_0.10.1-1_all
+libspice-protocol-dev_0.12.6-1~bpo70+2_all
+libspice-server-dev_0.11.0-1+deb7u1_i386
+libspice-server-dev_0.12.4-0nocelt2~bpo70+1_i386
+libspiro-dev_20071029-2_i386
+libspnav-dev_0.2.2-1_i386
+libspooles-dev_2.2-9_i386
+libsprng2-dev_2.0a-8_i386
+libsqlcipher-dev_2.2.1-2~bpo70+1_i386
+libsqlexpr-ocaml-dev_0.4.1-1+b5_i386
+libsqlheavy-dev_0.1.1-1_i386
+libsqlheavygtk-dev_0.1.1-1_i386
+libsqlite0-dev_2.8.17-7_i386
+libsqlite3-dev_3.7.13-1+deb7u1_i386
+libsqlite3-ocaml-dev_1.6.1-1+b1_i386
+libsquizz-dev_0.99a-2_i386
+libsratom-dev_0.2.0~dfsg0-1_i386
+libsrecord-dev_1.58-1+b1_i386
+libsrf-dev_0.1+dfsg-1_i386
+libsrtp0-dev_1.4.4+20100615~dfsg-2+deb7u1_i386
+libss7-dev_1.0.2-3_i386
+libsscm-dev_0.8.5-2.1_i386
+libssh-dev_0.5.4-1+deb7u1_i386
+libssh-dev_0.5.4-3~bpo70+1_i386
+libssh2-1-dev_1.4.2-1.1_i386
+libssl-dev_1.0.1e-2+deb7u7_i386
+libssl-ocaml-dev_0.4.6-1_i386
+libsslcommon2-dev_0.16-6+deb7u1_i386
+libssreflect-ocaml-dev_1.3pl4-1_i386
+libsss-sudo-dev_1.8.4-2_i386
+libst-dev_1.9-3_i386
+libstaden-read-dev_1.12.4-1_i386
+libstarlink-ast-dev_7.0.4+dfsg-1_i386
+libstarlink-pal-dev_0.1.0-1_i386
+libstarpu-contrib-dev_1.0.1+dfsg-1_i386
+libstarpu-dev_1.0.1+dfsg-1_i386
+libstartup-notification0-dev_0.12-1_i386
+libstatgrab-dev_0.17-1_i386
+libstdc++6-4.4-dev_4.4.7-2_i386
+libstdc++6-4.6-dev_4.6.3-14_i386
+libstdc++6-4.7-dev_4.7.2-5_i386
+libstemmer-dev_0+svn546-2_i386
+libsteptalk-dev_0.10.0-5+b1_i386
+libstfl-dev_0.22-1+b1_i386
+libstk0-dev_4.4.3-2_i386
+libstlport4.6-dev_4.6.2-7_i386
+libstonith1-dev_1.0.9+hg2665-1_i386
+libstonithd1-dev_1.1.7-1_i386
+libstreamanalyzer-dev_0.7.7-3_i386
+libstreams-dev_0.7.7-3_i386
+libstrigihtmlgui-dev_0.7.7-3_i386
+libstrigiqtdbusclient-dev_0.7.7-3_i386
+libstroke0-dev_0.5.1-6_i386
+libstxxl-dev_1.3.1-4_i386
+libsublime-dev_1.3.1-2_i386
+libsubtitleeditor-dev_0.33.0-1_i386
+libsubunit-dev_0.0.8+bzr176-1_i386
+libsugarext-dev_0.96.1-2_i386
+libsuil-dev_0.6.4~dfsg0-3_i386
+libsuitesparse-dev_1:3.4.0-3_i386
+libsuitesparse-metis-dev_3.1.0-2_i386
+libsundials-serial-dev_2.5.0-3_i386
+libsunpinyin-dev_2.0.3+git20120607-1_i386
+libsuperlu3-dev_3.0+20070106-3_i386
+libsvga1-dev_1:1.4.3-33_i386
+libsvm-dev_3.12-1_i386
+libsvn-dev_1.6.17dfsg-4+deb7u6_i386
+libsvncpp-dev_0.12.0dfsg-6_i386
+libsvnqt-dev_1.5.5-4.1_i386
+libsvrcore-dev_1:4.0.4-15_i386
+libswami-dev_2.0.0+svn389-2_i386
+libswe-dev_1.77.00.0005-2_i386
+libswiften-dev_2.0~beta1+dev47-1_i386
+libsword-dev_1.6.2+dfsg-5_i386
+libswscale-dev_6:0.8.10-1_i386
+libswscale-dev_6:10.1-1~bpo70+1_i386
+libsx-dev_2.05-3_i386
+libsyfi1.0-dev_1.0.0.dfsg-1_i386
+libsylph-dev_1.1.0-8_i386
+libsymmetrica-dev_2.0-1_i386
+libsynce0-dev_0.15-1.1_i386
+libsyncml-dev_0.5.4-2.1_i386
+libsynfig-dev_0.63.05-1_i386
+libsynopsis0.12-dev_0.12-8_i386
+libsynthesis-dev_3.4.0.16.7-1_i386
+libsynthesis-dev_3.4.0.47.1-1~bpo70+1_i386
+libsysactivity-dev_0.6.4-1_i386
+libsysfs-dev_2.1.0+repack-2_i386
+libsyslog-ng-dev_3.3.5-4_i386
+libsyslog-ocaml-dev_1.4-6+b2_i386
+libsystemd-daemon-dev_204-8~bpo70+1_i386
+libsystemd-daemon-dev_44-11+deb7u4_i386
+libsystemd-id128-dev_204-8~bpo70+1_i386
+libsystemd-id128-dev_44-11+deb7u4_i386
+libsystemd-journal-dev_204-8~bpo70+1_i386
+libsystemd-journal-dev_44-11+deb7u4_i386
+libsystemd-login-dev_204-8~bpo70+1_i386
+libsystemd-login-dev_44-11+deb7u4_i386
+libt1-dev_5.1.2-3.6_i386
+libtacacs+1-dev_4.0.4.19-11_all
+libtachyon-dev_0.99~b2+dfsg-0.4_i386
+libtag-extras-dev_1.0.1-3_i386
+libtag1-dev_1.7.2-1_i386
+libtag1-dev_1.9.1-2~bpo70+1_i386
+libtagc0-dev_1.7.2-1_i386
+libtagc0-dev_1.9.1-2~bpo70+1_i386
+libtagcoll2-dev_2.0.13-1.1_i386
+libtaglib-cil-dev_2.0.4.0-1_all
+libtaglib-ocaml-dev_0.2.0-1+b1_i386
+libtaktuk-1-dev_3.7.4-1_i386
+libtalloc-dev_2.0.7+git20120207-1_i386
+libtalloc-dev_2.1.1-1~bpo70+1_i386
+libtamuanova-dev_0.2-2_i386
+libtango7-dev_7.2.6+dfsg-14_i386
+libtango8-dev_8.1.2c+dfsg-4~bpo70+1_i386
+libtaningia-dev_0.2.2-1_i386
+libtaoframework-devil-cil-dev_2.1.svn20090801-9_all
+libtaoframework-ffmpeg-cil-dev_2.1.svn20090801-9_all
+libtaoframework-freeglut-cil-dev_2.1.svn20090801-9_all
+libtaoframework-freetype-cil-dev_2.1.svn20090801-9_all
+libtaoframework-ftgl-cil-dev_2.1.svn20090801-9_all
+libtaoframework-lua-cil-dev_2.1.svn20090801-9_all
+libtaoframework-ode-cil-dev_2.1.svn20090801-9_all
+libtaoframework-openal-cil-dev_2.1.svn20090801-9_all
+libtaoframework-opengl-cil-dev_2.1.svn20090801-9_all
+libtaoframework-physfs-cil-dev_2.1.svn20090801-9_all
+libtaoframework-sdl-cil-dev_2.1.svn20090801-9_all
+libtar-dev_1.2.16-1+deb7u2_i386
+libtarantool-dev_1.4.6+20120629+2158-1_i386
+libtasn1-3-dev_2.13-2_i386
+libtasn1-6-dev_3.6-1~bpo70+1_i386
+libtbb-dev_4.0+r233-1_i386
+libtcc-dev_0.9.26~git20120612.ad5f375-6_i386
+libtcd-dev_2.2.2-1_i386
+libtclap-dev_1.2.1-1_i386
+libtclcl1-dev_1.20-6_i386
+libtcplay-dev_1.1-1~bpo70+1_i386
+libtdb-dev_1.2.10-2_i386
+libtdb-dev_1.2.12-1~bpo70+1_i386
+libtecla1-dev_1.6.1-5_i386
+libteem-dev_1.11.0~svn5226-1_i386
+libtelepathy-farstream-dev_0.4.0-3_i386
+libtelepathy-glib-dev_0.18.2-2_i386
+libtelepathy-logger-dev_0.4.0-1_i386
+libtelepathy-logger-qt4-dev_0.4.0-1_i386
+libtelepathy-qt4-dev_0.9.1-4_i386
+libtelnet-dev_0.21-1_i386
+libtemplates-parser11.6-dev_11.6-2_i386
+libterralib-dev_4.0.0-4_i386
+libtesseract-dev_3.02.01-6_i386
+libtet1.4-dev_1.4.3-1_i386
+libtevent-dev_0.9.16-1_i386
+libtevent-dev_0.9.21-1~bpo70+1_i386
+libtext-ocaml-dev_0.5-1+b2_i386
+libtextwrap-dev_0.1-13_i386
+libthai-dev_0.1.18-2_i386
+libtheora-dev_1.1.1+dfsg.1-3.1_i386
+libtheora-ocaml-dev_0.3.0-1+b3_i386
+libthepeg-dev_1.8.0-1_i386
+libthrust-dev_1.6.0-1_all
+libthunar-vfs-1-dev_1.2.0-3+b1_i386
+libthunarx-2-dev_1.2.3-4+b1_i386
+libticables-dev_1.2.0-2_i386
+libticalcs-dev_1.1.3+dfsg1-1_i386
+libticonv-dev_1.1.0-1.1_i386
+libtidy-dev_20091223cvs-1.2_i386
+libtiff4-dev_3.9.6-11_i386
+libtiff5-alt-dev_4.0.2-6+deb7u2_i386
+libtiff5-dev_4.0.2-6+deb7u2_i386
+libtifiles-dev_1.1.1-1_i386
+libtimbl3-dev_6.4.2-1_i386
+libtimblserver2-dev_1.4-2_i386
+libtinfo-dev_5.9-10_i386
+libtinyxml-dev_2.6.2-1_i386
+libtinyxml2-dev_0~git20120518.1.a2ae54e-1_i386
+libtirpc-dev_0.2.2-5_i386
+libtk-img-dev_1:1.3-release-12_i386
+libtnt-dev_1.2.6-1_all
+libtntdb-dev_1.2-2+b1_i386
+libtntnet-dev_2.1-2+deb7u1_i386
+libtododb-dev_0.11-3_i386
+libtogl-dev_1.7-12_all
+libtokyocabinet-dev_1.4.47-2_i386
+libtokyotyrant-dev_1.1.40-4.1+b1_i386
+libtolua++5.1-dev_1.0.93-3_i386
+libtolua-dev_5.2.0-1_i386
+libtomcrypt-dev_1.17-3.2_i386
+libtommath-dev_0.42.0-1_i386
+libtomoe-dev_0.6.0-1.3_i386
+libtonezone-dev_1:2.5.0.1-2_i386
+libtophide-ocaml-dev_1.0.0-3_all
+libtorch3-dev_3.1-2.1_i386
+libtorque2-dev_2.4.16+dfsg-1+deb7u2_i386
+libtorrent-dev_0.13.2-1_i386
+libtorrent-rasterbar-dev_0.15.10-1+b1_i386
+libtorture-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+libtotem-dev_3.0.1-8_i386
+libtotem-pg-dev_1.4.2-3_i386
+libtotem-plparser-dev_3.4.2-1_i386
+libtowitoko-dev_2.0.7-8.3_i386
+libtpl-dev_1.5-2_all
+libtpm-unseal-dev_1.3.7-1_i386
+libtrace3-dev_3.0.14-1_i386
+libtracker-extract-0.14-dev_0.14.1-3_i386
+libtracker-miner-0.14-dev_0.14.1-3_i386
+libtracker-sparql-0.14-dev_0.14.1-3_i386
+libtrain-dev_0.9b-11_i386
+libtransitioner1-dev_1.1.7-1_i386
+libtre-dev_0.8.0-3_i386
+libtreil-dev_1.8-1.1_i386
+libtriangle-dev_1.6-2_i386
+libts-dev_1.0-11_i386
+libtse3-dev_0.3.1-4.3_i386
+libtsk-dev_3.2.3-2_i386
+libtsk-dev_4.1.3-3~bpo70+1_i386
+libtspi-dev_0.3.9-3+wheezy1_i386
+libttspico-dev_1.0+git20110131-2_i386
+libtulip-dev_3.7.0dfsg-4_i386
+libtumbler-1-dev_0.1.25-1+b1_i386
+libtut-dev_0.0.20070706-1_all
+libtuxcap-dev_1.4.0.dfsg2-2.1_i386
+libtwin-dev_12.04.13.17.57-g130ee5f-2_i386
+libtwofish-dev_0.3-3_i386
+libtwolame-dev_0.3.13-1_i386
+libtxc-dxtn-s2tc-dev_0~git20110809-3_i386
+libtype-conv-camlp4-dev_3.0.4-1_i386
+libtyxml-ocaml-dev_2.1-1_i386
+libu1db-dev_0.1.4-2~bpo70+1_i386
+libuchardet-dev_0.0.1-1_i386
+libucimf-dev_2.3.8-4_i386
+libucl-dev_1.03-5_i386
+libuclmmbase1-dev_1.2.16.0-1_i386
+libucommon-dev_5.2.2-4_i386
+libucto1-dev_0.5.2-2_i386
+libudev-dev_175-7.2_i386
+libudev-dev_204-8~bpo70+1_i386
+libudf-dev_0.83-4_i386
+libudt-dev_4.10+dfsg-1_i386
+libudunits2-dev_2.1.23-3_i386
+libuhd-dev_3.4.2-1_i386
+libuhd-dev_3.5.5-1~bpo70+1_i386
+libuim-dev_1:1.8.1-4_i386
+libumlib-dev_0.8.2-1_i386
+libunac1-dev_1.8.0-6_i386
+libunbound-dev_1.4.17-3_i386
+libunbound-dev_1.4.22-1~bpo70+1_i386
+libunicap2-dev_0.9.12-2_i386
+libuninameslist-dev_0.0.20091231-1.1_i386
+libuninum-dev_2.7-1.1_i386
+libunique-3.0-dev_3.0.2-1_i386
+libunique-dev_1.1.6-4_i386
+libunistring-dev_0.9.3-5_i386
+libunittest++-dev_1.4.0-3_i386
+libunshield-dev_0.6-3_i386
+libunwind-setjmp0-dev_0.99-0.3_i386
+libunwind7-dev_0.99-0.3_i386
+libupnp-dev_1:1.6.17-1.2_all
+libupnp4-dev_1.8.0~svn20100507-1.2_i386
+libupnp6-dev_1:1.6.17-1.2_i386
+libupower-glib-dev_0.9.17-1_i386
+libupsclient1-dev_2.6.4-2.3+deb7u1_i386
+libupse-dev_1.0.0-1_i386
+libuptimed-dev_1:0.3.17-3.1_i386
+liburcu-dev_0.6.7-2_i386
+liburfkill-glib-dev_0.3.0-1_i386
+liburg0-dev_0.8.12-4_i386
+liburiparser-dev_0.7.5-1_i386
+libusb++-dev_2:0.1.12-20+nmu1_i386
+libusb-1.0-0-dev_2:1.0.11-1_i386
+libusb-1.0-0-dev_2:1.0.18-2~bpo70+1_i386
+libusb-dev_2:0.1.12-20+nmu1_i386
+libusb-ocaml-dev_1.2.0-2+b7_i386
+libusbip-dev_1.1.1+3.14-1~bpo70+1_i386
+libusbip-dev_1.1.1+3.2.17-1_i386
+libusbmuxd-dev_1.0.7-2_i386
+libusbprog-dev_0.2.0-2_i386
+libusbredirhost-dev_0.4.3-2_i386
+libusbredirhost-dev_0.6-2~bpo70+1_i386
+libusbredirparser-dev_0.4.3-2_i386
+libusbredirparser-dev_0.6-2~bpo70+1_i386
+libusbtc08-dev_1.7.2-1_i386
+libuser1-dev_1:0.56.9.dfsg.1-1.2_i386
+libust-dev_2.0.4-1_i386
+libustr-dev_1.0.4-3_i386
+libutempter-dev_1.1.5-4_i386
+libuu-dev_0.5.20-3.3_i386
+libuuidm-ocaml-dev_0.9.4-1_i386
+libv4l-dev_0.8.8-3_i386
+libv8-3.14-dev_3.14.5.8-8~bpo70+1_i386
+libv8-dev_3.14.5.8-8~bpo70+1_i386
+libv8-dev_3.8.9.20-2_i386
+libv8-i18n-dev_0~0.svn7-3_i386
+libva-dev_1.0.15-4_i386
+libvala-0.14-dev_0.14.2-2_i386
+libvala-0.16-dev_0.16.1-2_i386
+libvaladoc-dev_0.3.2~git20120227-1_i386
+libvalhalla-dev_2.0.0-4+b1_i386
+libvanessa-adt-dev_0.0.9-1_i386
+libvanessa-logger-dev_0.0.10-1.1_i386
+libvanessa-socket-dev_0.0.12-1_i386
+libvarconf-dev_0.6.7-2_i386
+libvarnishapi-dev_3.0.2-2+deb7u1_i386
+libvbr-dev_2.6.8-4_i386
+libvc-dev_003.dfsg.1-12_i386
+libvcdinfo-dev_0.7.24+dfsg-0.1_i386
+libvde-dev_2.3.2-4_i386
+libvdeplug-dev_2.3.2-4_i386
+libvdk2-dev_2.4.0-5.3_i386
+libvdkbuilder2-dev_2.4.0-4.3_i386
+libvdkxdb2-dev_2.4.0-3.4_i386
+libvdpau-dev_0.4.1-7_i386
+libventrilo-dev_1.2.4-1_i386
+libverbiste-dev_0.1.34-1_i386
+libverto-dev_0.2.2-1_i386
+libvformat-dev_1.13-10_i386
+libvia-dev_2.0.4-2_i386
+libvibrant6-dev_6.1.20120620-2_i386
+libviennacl-dev_1.2.0-2_all
+libview-dev_0.6.6-2.1_i386
+libvigraimpex-dev_1.7.1+dfsg1-3_i386
+libvips-dev_7.28.5-1+deb7u1_i386
+libvirt-dev_0.9.12.3-1_i386
+libvirt-dev_1.2.4-1~bpo70+1_i386
+libvirt-glib-1.0-dev_0.0.8-1_i386
+libvirt-ocaml-dev_0.6.1.2-1_i386
+libvisca-dev_1.0.1-1_i386
+libvisio-dev_0.0.17-1_i386
+libvisual-0.4-dev_0.4.0-5_i386
+libvlc-dev_2.0.3-5_i386
+libvlc-dev_2.1.2-2~bpo70+3_i386
+libvlccore-dev_2.0.3-5_i386
+libvlccore-dev_2.1.2-2~bpo70+3_i386
+libvmmlib-dev_1.0-2_all
+libvmtk-dev_1.0.1-1_i386
+libvncserver-dev_0.9.9+dfsg-1_i386
+libvo-aacenc-dev_0.1.2-1_i386
+libvo-amrwbenc-dev_0.1.2-1_i386
+libvoaacenc-ocaml-dev_0.1.0-1+b1_i386
+libvoikko-dev_3.5-1.1_i386
+libvolpack1-dev_1.0b3-3_i386
+libvorbis-dev_1.3.2-1.3_i386
+libvorbis-ocaml-dev_0.6.1-1+b1_i386
+libvorbisidec-dev_1.0.2+svn18153-0.2_i386
+libvotequorum-dev_1.4.2-3_i386
+libvpb-dev_4.2.55-1_i386
+libvpx-dev_1.1.0-1_i386
+libvrb0-dev_0.5.1-5.1_i386
+libvte-2.90-dev_1:0.32.2-1_i386
+libvte-dev_1:0.28.2-5_i386
+libvte0.16-cil-dev_2.26.0-8_i386
+libvtk5-dev_5.8.0-13+b1_i386
+libvtk5-qt4-dev_5.8.0-13+b1_i386
+libvtkedge-dev_0.2.0~20110819-2_i386
+libvtkgdcm2-dev_2.2.0-14.1_i386
+libvxl1-dev_1.14.0-18_i386
+libwacom-dev_0.6-1_i386
+libwaei-dev_3.4.3-1_i386
+libwaili-dev_19990723-20_i386
+libwavefront-standalone3.0-dev_3.0.2+dfsg-4+b1_i386
+libwavpack-dev_4.60.1-3_i386
+libwayland-dev_0.85.0-2_i386
+libwbclient-dev_2:3.6.6-6+deb7u3_i386
+libwbclient-dev_2:4.1.9+dfsg-1~bpo70+1_i386
+libwbxml2-dev_0.10.7-1_i386
+libwcstools-dev_3.8.5-1_i386
+libwebauth-dev_4.1.1-2_i386
+libwebauth-dev_4.6.0-2~bpo70+1_i386
+libwebcam0-dev_0.2.2-1_i386
+libwebkit-cil-dev_0.3-6_all
+libwebkit-dev_1.8.1-3.4_i386
+libwebkitgtk-3.0-dev_1.8.1-3.4_i386
+libwebkitgtk-dev_1.8.1-3.4_i386
+libwebp-dev_0.1.3-3+nmu1_i386
+libwebrtc-audio-processing-dev_0.1-2_i386
+libweed-dev_1.6.2~ds1-2_i386
+libwfmath-0.3-dev_0.3.12-3_i386
+libwfut-0.2-dev_0.2.1-2_i386
+libwibble-dev_0.1.28-1.1_i386
+libwildmidi-dev_0.2.3.4-2.1_i386
+libwine-dev_1.4.1-4_i386
+libwings-dev_0.95.3-2_i386
+libwireshark-dev_1.10.7-1~bpo70+1_i386
+libwireshark-dev_1.8.2-5wheezy10_i386
+libwiretap-dev_1.10.7-1~bpo70+1_i386
+libwiretap-dev_1.8.2-5wheezy10_i386
+libwmf-dev_0.2.8.4-10.3_i386
+libwnck-3-dev_3.4.2-1_i386
+libwnck-dev_2.30.7-1_i386
+libwnck1.0-cil-dev_2.26.0-8_i386
+libwnn-dev_1.1.1~a021+cvs20100325-6_i386
+libwnn6-dev_1.0.0-14.2+b1_i386
+libwpd-dev_0.9.4-3_i386
+libwpg-dev_0.2.1-1_i386
+libwps-dev_0.2.7-1_i386
+libwrap0-dev_7.6.q-24_i386
+libwraster3-dev_0.95.3-2_i386
+libwreport-dev_2.4-1_i386
+libwsutil-dev_1.10.7-1~bpo70+1_i386
+libwsutil-dev_1.8.2-5wheezy10_i386
+libwt-dev_3.2.1-2_i386
+libwtdbo-dev_3.2.1-2_i386
+libwtdbofirebird-dev_3.2.1-2_i386
+libwtdbopostgres-dev_3.2.1-2_i386
+libwtdbosqlite-dev_3.2.1-2_i386
+libwtext-dev_3.2.1-2_i386
+libwtfcgi-dev_3.2.1-2_i386
+libwthttp-dev_3.2.1-2_i386
+libwttest-dev_3.2.1-2_i386
+libwv-dev_1.2.9-3_i386
+libwv2-dev_0.4.2.dfsg.2-1~deb7u1_i386
+libwvstreams-dev_4.6.1-5_i386
+libwxbase2.8-dev_2.8.12.1-12_i386
+libwxgtk2.8-dev_2.8.12.1-12_i386
+libwxsmithlib-dev_10.05-2.1_i386
+libwxsmithlib-dev_13.12-1~bpo70+1_i386
+libwxsmithlib0-dev_10.05-2.1_i386
+libwxsmithlib0-dev_13.12-1~bpo70+1_i386
+libwxsqlite3-2.8-dev_3.0.0.1~dfsg0-2_i386
+libwxsvg-dev_2:1.1.8~dfsg0-2_i386
+libx11-dev_2:1.5.0-1+deb7u1_i386
+libx11-xcb-dev_2:1.5.0-1+deb7u1_i386
+libx264-dev_2:0.123.2189+git35cf912-1_i386
+libx52pro-dev_0.1.1-2.1_i386
+libx86-dev_1.1+ds1-10_i386
+libxalan110-dev_1.10-6_i386
+libxapian-dev_1.2.12-2_i386
+libxapian-dev_1.2.16-2~bpo70+1_i386
+libxatracker-dev_8.0.5-4+deb7u2_i386
+libxau-dev_1:1.0.7-1_i386
+libxaw7-dev_2:1.0.10-2_i386
+libxbae-dev_4.60.4-3_i386
+libxbase2.0-dev_2.0.0-8.5_i386
+libxcb-composite0-dev_1.8.1-2+deb7u1_i386
+libxcb-cursor-dev_0.1.1-2~bpo70+1_i386
+libxcb-damage0-dev_1.8.1-2+deb7u1_i386
+libxcb-dpms0-dev_1.8.1-2+deb7u1_i386
+libxcb-dri2-0-dev_1.8.1-2+deb7u1_i386
+libxcb-ewmh-dev_0.3.9-2_i386
+libxcb-glx0-dev_1.8.1-2+deb7u1_i386
+libxcb-icccm4-dev_0.3.9-2_i386
+libxcb-image0-dev_0.3.9-1_i386
+libxcb-keysyms1-dev_0.3.9-1_i386
+libxcb-randr0-dev_1.8.1-2+deb7u1_i386
+libxcb-record0-dev_1.8.1-2+deb7u1_i386
+libxcb-render-util0-dev_0.3.8-1.1_i386
+libxcb-render0-dev_1.8.1-2+deb7u1_i386
+libxcb-res0-dev_1.8.1-2+deb7u1_i386
+libxcb-screensaver0-dev_1.8.1-2+deb7u1_i386
+libxcb-shape0-dev_1.8.1-2+deb7u1_i386
+libxcb-shm0-dev_1.8.1-2+deb7u1_i386
+libxcb-sync0-dev_1.8.1-2+deb7u1_i386
+libxcb-util0-dev_0.3.8-2_i386
+libxcb-xevie0-dev_1.8.1-2+deb7u1_i386
+libxcb-xf86dri0-dev_1.8.1-2+deb7u1_i386
+libxcb-xfixes0-dev_1.8.1-2+deb7u1_i386
+libxcb-xinerama0-dev_1.8.1-2+deb7u1_i386
+libxcb-xprint0-dev_1.8.1-2+deb7u1_i386
+libxcb-xtest0-dev_1.8.1-2+deb7u1_i386
+libxcb-xv0-dev_1.8.1-2+deb7u1_i386
+libxcb-xvmc0-dev_1.8.1-2+deb7u1_i386
+libxcb1-dev_1.8.1-2+deb7u1_i386
+libxcomp-dev_3.5.0.12-1+b1_i386
+libxcomposite-dev_1:0.4.3-2_i386
+libxcp-ocaml-dev_0.5.2-3+b1_i386
+libxcrypt-dev_1:2.4-3_i386
+libxcursor-dev_1:1.1.13-1+deb7u1_i386
+libxdamage-dev_1:1.1.3-2_i386
+libxdb-dev_1.2.0-7.2_i386
+libxdelta2-dev_1.1.3-9_i386
+libxdffileio-dev_0.3-1_i386
+libxdg-basedir-dev_1.1.1-2_i386
+libxdmcp-dev_1:1.1.1-1_i386
+libxdmf-dev_2.1.dfsg.1-5_i386
+libxdo-dev_1:2.20100701.2961-3+deb7u3_i386
+libxen-dev_4.1.4-3+deb7u1_i386
+libxen-ocaml-dev_4.1.4-3+deb7u1_i386
+libxenapi-ocaml-dev_1.3.2-15_i386
+libxenomai-dev_2.6.0-2_i386
+libxerces-c-dev_3.1.1-3_i386
+libxerces-c2-dev_2.8.0+deb1-3_i386
+libxext-dev_2:1.3.1-2+deb7u1_i386
+libxfce4menu-0.1-dev_4.6.2-1_i386
+libxfce4ui-1-dev_4.8.1-1_i386
+libxfce4util-dev_4.8.2-1_i386
+libxfcegui4-dev_4.8.1-5_i386
+libxfconf-0-dev_4.8.1-1_i386
+libxfixes-dev_1:5.0-4+deb7u1_i386
+libxfont-dev_1:1.4.5-3_i386
+libxft-dev_2.3.1-1_i386
+libxi-dev_2:1.6.1-1+deb7u1_i386
+libxine-dev_1.1.21-1+deb7u1_i386
+libxine2-dev_1.2.2-5_i386
+libxinerama-dev_2:1.1.2-1+deb7u1_i386
+libxkbfile-dev_1:1.0.8-1_i386
+libxklavier-dev_5.2.1-1_i386
+libxml++2.6-dev_2.34.2-1_i386
+libxml-light-ocaml-dev_2.2-15_i386
+libxml-security-c-dev_1.6.1-5+deb7u2_i386
+libxml-security-c-dev_1.7.2-2~bpo70+1_i386
+libxml2-dev_2.8.0+dfsg1-7+nmu3_i386
+libxmlada4.1-dev_4.1-2_i386
+libxmlezout2-dev_1.06.1-5_i386
+libxmlm-ocaml-dev_1.1.0-1_i386
+libxmlplaylist-ocaml-dev_0.1.3-1+b2_i386
+libxmlrpc-c++4-dev_1.16.33-3.2_i386
+libxmlrpc-c3-dev_1.16.33-3.2_all
+libxmlrpc-core-c3-dev_1.16.33-3.2_i386
+libxmlrpc-epi-dev_0.54.2-1_i386
+libxmlrpc-light-ocaml-dev_0.6.1-3+b5_i386
+libxmlsec1-dev_1.2.18-2_i386
+libxmltok1-dev_1.2-3_i386
+libxmltooling-dev_1.4.2-5_i386
+libxmltooling-dev_1.5.3-2~bpo70+1_i386
+libxmmsclient++-dev_0.8+dfsg-4_i386
+libxmmsclient++-glib-dev_0.8+dfsg-4_i386
+libxmmsclient-dev_0.8+dfsg-4_i386
+libxmmsclient-glib-dev_0.8+dfsg-4_i386
+libxmpi4-dev_2.2.3b8-13_i386
+libxmu-dev_2:1.1.1-1_i386
+libxmuu-dev_2:1.1.1-1_i386
+libxnee-dev_3.13-1_i386
+libxneur-dev_0.15.0-1.1_i386
+libxnvctrl-dev_304.88-1_i386
+libxnvctrl-dev_319.72-1~bpo70+1_i386
+libxosd-dev_2.2.14-2_i386
+libxp-dev_1:1.0.1-2+deb7u1_i386
+libxpa-dev_2.1.14-2_i386
+libxplc0.3.13-dev_0.3.13-3_i386
+libxpm-dev_1:3.5.10-1_i386
+libxqdbm-dev_1.8.78-2_i386
+libxqilla-dev_2.3.0-1_i386
+libxr1-dev_1.0-2.1_i386
+libxrandr-dev_2:1.3.2-2+deb7u1_i386
+libxrender-dev_1:0.9.7-1+deb7u1_i386
+libxres-dev_2:1.0.6-1+deb7u1_i386
+libxsettings-client-dev_0.17-6_i386
+libxsettings-dev_0.11-3_i386
+libxslt1-dev_1.1.26-14.1_i386
+libxss-dev_1:1.2.2-1_i386
+libxstr-ocaml-dev_0.2.1-21+b3_i386
+libxstrp4-camlp4-dev_1.8-3_all
+libxt-dev_1:1.1.3-1+deb7u1_i386
+libxtst-dev_2:1.2.1-1+deb7u1_i386
+libxtuplecommon-dev_4.1.0-3~bpo70+1_i386
+libxv-dev_2:1.0.7-1+deb7u1_i386
+libxvbaw-dev_1:12-6+point-3_i386
+libxvbaw-dev_1:13.12-4~bpo70+1_i386
+libxvidcore-dev_2:1.3.2-9_i386
+libxvmc-dev_2:1.0.7-1+deb7u2_i386
+libxxf86dga-dev_2:1.1.3-2+deb7u1_i386
+libxxf86vm-dev_1:1.1.2-1+deb7u1_i386
+libxy-dev_0.8-1+b1_i386
+libyahoo2-dev_1.0.1-1_i386
+libyajl-dev_2.0.4-2_i386
+libyaml-cpp-dev_0.3.0-1_i386
+libyaml-dev_0.1.4-2+deb7u4_i386
+libyara-dev_2.0.0-2~bpo70+1_i386
+libyaz4-dev_4.2.30-2_i386
+libydpdict2-dev_1.0.2-1_i386
+libyelp-dev_3.4.2-1+b1_i386
+libygl4-dev_4.2e-4_i386
+libykclient-dev_2.6-1_i386
+libykpers-1-dev_1.7.0-1_i386
+libyojson-ocaml-dev_1.0.3-1_i386
+libytnef0-dev_1.5-4_i386
+libyubikey-dev_1.8-1_i386
+libz80ex-dev_1.1.19-3_i386
+libzarith-ocaml-dev_1.1-2_i386
+libzbar-dev_0.10+doc-8_i386
+libzbargtk-dev_0.10+doc-8_i386
+libzbarqt-dev_0.10+doc-8_i386
+libzeep-dev_2.9.0-2_i386
+libzeitgeist-cil-dev_0.8.0.0-4_all
+libzeitgeist-dev_0.3.18-1_i386
+libzen-dev_0.4.27-2_i386
+libzephyr-dev_3.0.2-2_i386
+libzerg0-dev_1.0.7-3_i386
+libzeroc-ice34-dev_3.4.2-8.2_i386
+libzinnia-dev_0.06-1+b1_i386
+libzip-dev_0.10.1-1.1_i386
+libzip-ocaml-dev_1.04-6+b3_i386
+libzipios++-dev_0.1.5.9+cvs.2007.04.28-5.1_i386
+libzita-alsa-pcmi-dev_0.2.0-1_i386
+libzita-convolver-dev_3.1.0-2_i386
+libzita-resampler-dev_1.1.0-3_i386
+libzlcore-dev_0.12.10dfsg-8_i386
+libzltext-dev_0.12.10dfsg-8_i386
+libzmq-dev_2.2.0+dfsg-2_i386
+libzmq3-dev_3.2.3+dfsg-2~bpo70+1_i386
+libzn-poly-dev_0.8-1.1_i386
+libzookeeper-mt-dev_3.3.5+dfsg1-2_i386
+libzookeeper-st-dev_3.3.5+dfsg1-2_i386
+libzorp-dev_3.9.5-4_i386
+libzorpll-dev_3.9.1.3-1_i386
+libzrtpcpp-dev_2.0.0-3_i386
+libzthread-dev_2.3.2-7_i386
+libzvbi-dev_0.2.33-6_i386
+libzzip-dev_0.13.56-1.1_i386
+licq-dev_1.6.1-3_all
+linux-libc-dev_3.14.7-1~bpo70+1_i386
+linux-libc-dev_3.2.57-3_i386
+lldpad-dev_0.9.44-1_i386
+llvm-2.9-dev_2.9+dfsg-7_i386
+llvm-3.0-dev_3.0-10_i386
+llvm-3.1-dev_3.1-1_i386
+llvm-dev_1:3.0-14+nmu2_i386
+lttv-dev_0.12.38-21032011-1+b1_i386
+lua-apr-dev_0.23.2-1_i386
+lua-bitop-dev_1.0.2-1_i386
+lua-curl-dev_0.3.0-7_i386
+lua-curses-dev_5.1.19-2_i386
+lua-cyrussasl-dev_1.0.0-4_i386
+lua-dbi-mysql-dev_0.5+svn78-4_i386
+lua-dbi-postgresql-dev_0.5+svn78-4_i386
+lua-dbi-sqlite3-dev_0.5+svn78-4_i386
+lua-event-dev_0.4.1-2_i386
+lua-expat-dev_1.2.0-5+deb7u1_i386
+lua-filesystem-dev_1.5.0+16+g84f1af5-1_i386
+lua-iconv-dev_7-1_i386
+lua-ldap-dev_1.1.0-1-geeac494-3_i386
+lua-leg-dev_0.1.2-8_all
+lua-lgi-dev_0.6.2-1_i386
+lua-lpeg-dev_0.10.2-5_i386
+lua-md5-dev_1.1.2-6_i386
+lua-penlight-dev_1.0.2+htmldoc-2_all
+lua-posix-dev_5.1.19-2_i386
+lua-rex-onig-dev_2.6.0-2_i386
+lua-rex-pcre-dev_2.6.0-2_i386
+lua-rex-posix-dev_2.6.0-2_i386
+lua-rex-tre-dev_2.6.0-2_i386
+lua-rings-dev_1.2.3-1_i386
+lua-sec-dev_0.4.1+git063e8a8-2~bpo70+1_i386
+lua-sec-dev_0.4.1-1_i386
+lua-socket-dev_2.0.2-8_i386
+lua-socket-dev_3.0~rc1-3~bpo70+1_i386
+lua-sql-mysql-dev_2.3.0-1+build0_i386
+lua-sql-postgres-dev_2.3.0-1+build0_i386
+lua-sql-sqlite3-dev_2.3.0-1+build0_i386
+lua-svn-dev_0.4.0-7_i386
+lua-wsapi-fcgi-dev_1.5-3_i386
+lua-zip-dev_1.2.3-11_i386
+lua-zlib-dev_0.2-1_i386
+lua5.1-policy-dev_33_all
+lv2-dev_1.0.0~dfsg2-2_i386
+lxc-dev_0.8.0~rc1-8+deb7u2_i386
+lzma-dev_9.22-2_all
+manpages-de-dev_1.2-1_all
+manpages-dev_3.44-1_all
+manpages-fr-dev_3.44d1p1-1_all
+manpages-ja-dev_0.5.0.0.20120606-1_all
+manpages-pl-dev_1:0.3-1_all
+manpages-posix-dev_2.16-1_all
+manpages-pt-dev_20040726-4_all
+matlab-support-dev_0.0.18_all
+mdbtools-dev_0.7-1+deb7u1_i386
+med-bio-dev_1.13.2_all
+med-imaging-dev_1.13.2_all
+mesa-common-dev_8.0.5-4+deb7u2_i386
+mffm-fftw-dev_1.7-3_i386
+mffm-timecode-dev_1.6-2_all
+mingw-w64-dev_2.0.3-1_all
+mingw-w64-i686-dev_2.0.3-1_all
+mingw-w64-x86-64-dev_2.0.3-1_all
+minpack-dev_19961126+dfsg1-1_i386
+mongodb-dev_1:2.0.6-1.1_i386
+mongodb-dev_1:2.4.8-2~bpo70+1_i386
+mpi-default-dev_1.0.1_i386
+muroard-dev_0.1.10-2_i386
+neko-dev_1.8.1-6_all
+nettle-dev_2.4-3_i386
+nettle-dev_2.7.1-1~bpo70+1_i386
+network-manager-dev_0.9.4.0-10_i386
+nodejs-dev_0.10.26~dfsg1-1~bpo70+1_i386
+notion-dev_3+2012042300-1_all
+ntfs-3g-dev_1:2012.1.15AR.5-2.1_i386
+nvidia-cg-dev_3.1.0013-1_i386
+nvidia-cuda-dev_4.2.9-2_i386
+nvidia-cuda-dev_5.0.35-8~bpo70+1_i386
+nvidia-glx-legacy-71xx-dev_71.86.15-3_i386
+nvidia-glx-legacy-dev_71.86.15-3_i386
+nvidia-opencl-dev_4.2.9-2_i386
+nvidia-opencl-dev_5.0.35-8~bpo70+1_i386
+ocfs2-tools-dev_1.6.4-1+deb7u1_i386
+ocl-icd-dev_1.3-3_i386
+ocl-icd-opencl-dev_1.3-3_i386
+ocsigen-dev_1.3.4-2_all
+octave-pkg-dev_1.0.2_all
+ofono-dev_1.6-2_all
+okteta-dev_4:4.8.4+dfsg-1_i386
+okular-dev_4:4.8.4-3_i386
+open-vm-tools-dev_2:8.8.0+2012.05.21-724730-1+nmu2_all
+open-vm-tools-dev_2:9.4.0-1280544-8~bpo70+1_all
+openais-dev_1.1.4-4.1_i386
+openbox-dev_3.5.0-7_i386
+openbox-dev_3.5.2-6~bpo70+1_i386
+openchangeserver-dev_1:1.0-3_i386
+openchangeserver-dev_1:2.1-1~bpo70+1_i386
+oss4-dev_4.2-build2006-2+deb7u1_all
+pacemaker-dev_1.1.7-1_i386
+packaging-dev_0.4_all
+paraview-dev_3.14.1-6_i386
+paraview-dev_4.0.1-1~bpo70+1_i386
+parole-dev_0.2.0.6-1+b1_i386
+parser3-dev_3.4.2-2_i386
+pbs-drmaa-dev_1.0.10-3_i386
+petsc-dev_3.2.dfsg-6_all
+php5-dev_5.4.4-14+deb7u9_i386
+pidgin-dev_2.10.7-2~bpo70+1_all
+pidgin-dev_2.10.9-1~deb7u1_all
+pike7.8-dev_7.8.700-7~bpo70+1_i386
+pinball-dev_0.3.1-13.1_i386
+planetpenguin-racer-gimp-dev_0.4-5_all
+planner-dev_0.14.6-1_i386
+plplot-tcl-dev_5.9.9-5_i386
+plptools-dev_1.0.9-2.4_i386
+pluma-dev_1.8.1+dfsg1-2~bpo70+1_i386
+plymouth-dev_0.8.5.1-5_i386
+portaudio19-dev_19+svn20111121-1_i386
+postfix-dev_2.11.1-1~bpo70+1_all
+postfix-dev_2.9.6-2_all
+ppl-dev_0.11.2-8_i386
+ppp-dev_2.4.5-5.1_all
+prayer-templates-dev_1.3.4-dfsg1-1_i386
+proftpd-dev_1.3.4a-5+deb7u1_i386
+pslib-dev_0.4.5-3_i386
+publib-dev_0.40-1_i386
+puredata-dev_0.43.2-5_all
+pvm-dev_3.4.5-12.5_i386
+pxlib-dev_0.6.5-1_i386
+python-all-dev_2.7.3-4+deb7u1_all
+python-apt-dev_0.8.8.2_all
+python-cairo-dev_1.8.8-1_all
+python-cxx-dev_6.2.4-3_all
+python-dbus-dev_1.1.1-1_all
+python-dev_2.7.3-4+deb7u1_all
+python-egenix-mx-base-dev_3.2.1-1.1_all
+python-gamera-dev_3.3.3-2_all
+python-gi-dev_3.2.2-2_all
+python-gnome2-desktop-dev_2.32.0+dfsg-2_all
+python-gnome2-dev_2.28.1+dfsg-1_all
+python-gnome2-extras-dev_2.25.3-12_all
+python-gobject-2-dev_2.28.6-10_all
+python-gobject-dev_3.2.2-2_all
+python-greenlet-dev_0.3.1-2.5_i386
+python-gst0.10-dev_0.10.22-3_i386
+python-gtk2-dev_2.24.0-3_all
+python-kde4-dev_4:4.8.4-1_all
+python-ldb-dev_1:1.1.16-1~bpo70+1_i386
+python-ldb-dev_1:1.1.6-1_i386
+python-openturns-dev_1.0-4_i386
+python-pyorbit-dev_2.24.0-6_all
+python-qt4-dev_4.9.3-4_all
+python-sip-dev_4.13.3-2_i386
+python-talloc-dev_2.0.7+git20120207-1_i386
+python-talloc-dev_2.1.1-1~bpo70+1_i386
+python-webkit-dev_1.1.8-2_all
+python2.6-dev_2.6.8-1.1_i386
+python2.7-dev_2.7.3-6+deb7u2_i386
+python3-all-dev_3.2.3-6_all
+python3-cairo-dev_1.10.0+dfsg-2_all
+python3-cxx-dev_6.2.4-3_all
+python3-dev_3.2.3-6_all
+python3-sip-dev_4.13.3-2_i386
+python3.2-dev_3.2.3-7_i386
+qmf-dev_1.0.7~2011w23.2-2.1_i386
+qtkeychain-dev_0.1.0-2~bpo70+1_i386
+qtmobility-dev_1.2.0-3_i386
+r-base-dev_2.15.1-4_all
+regina-normal-dev_4.93-1_i386
+resource-agents-dev_1:3.9.2-5+deb7u2_i386
+rhythmbox-dev_2.97-2.1_i386
+rivet-plugins-dev_1.8.0-1_all
+roarplaylistd-dev_0.1.1-2_all
+robot-player-dev_3.0.2+dfsg-4_all
+ruby-dev_1:1.9.3_all
+ruby-gnome2-dev_1.1.3-2+b1_i386
+ruby1.8-dev_1.8.7.358-7.1+deb7u1_i386
+ruby1.9.1-dev_1.9.3.194-8.1+deb7u2_i386
+rygel-1.0-dev_0.14.3-2+deb7u1_i386
+samba-dev_2:4.1.9+dfsg-1~bpo70+1_i386
+samba4-dev_4.0.0~beta2+dfsg1-3.2+deb7u2_i386
+sbnc-php-dev_1.2-26_all
+science-astronomy-dev_1.0_all
+science-dataacquisition-dev_1.0_all
+science-engineering-dev_1.0_all
+science-highenergy-physics-dev_1.0_all
+science-mathematics-dev_1.0_all
+science-meteorology-dev_1.0_all
+science-nanoscale-physics-dev_1.0_all
+science-physics-dev_1.0_all
+scim-dev_1.4.13-5_all
+sciplot-dev_1.36-15_i386
+selinux-policy-dev_2:2.20110726-12_all
+seqan-dev_1.3.1-1_all
+sfftw-dev_2.1.5-1_i386
+skalibs-dev_0.47-1_i386
+slurm-drmaa-dev_1.0.4-3_i386
+slurm-llnl-basic-plugins-dev_2.3.4-2+b1_i386
+snappea-dev_3.0d3-22_i386
+spl-dev_1.0~pre6-3.1+b1_i386
+sra-toolkit-libs-dev_2.1.7a-1_i386
+ss-dev_2.0-1.42.5-1.1_i386
+stx-btree-dev_0.8.6-1_all
+styx-dev_1.8.0-1.1_i386
+supercollider-dev_1:3.4.5-1wheezy1_i386
+svdrpservice-dev_0.0.4-14_all
+sweep-dev_0.9.3-6_all
+swish-e-dev_2.4.7-3_i386
+syfi-dev_1.0.0.dfsg-1_all
+system-tools-backends-dev_2.10.2-1_all
+systemtap-sdt-dev_1.7-1+deb7u1_i386
+tcl-dev_8.5.0-2.1_all
+tcl-memchan-dev_2.3-2_i386
+tcl-trf-dev_2.1.4-dfsg1-1_i386
+tcl8.4-dev_8.4.19-5_i386
+tcl8.5-dev_8.5.11-2_i386
+tclcl-dev_1.20-6_all
+tclx8.4-dev_8.4.0-3_i386
+tclxml-dev_3.3~svn11-2_i386
+tdom-dev_0.8.3~20080525-3+nmu2_i386
+tesseract-ocr-dev_3.02.01-6_all
+tix-dev_8.4.3-4_i386
+tk-dev_8.5.0-2.1_all
+tk8.4-dev_8.4.19-5_i386
+tk8.5-dev_8.5.11-2_i386
+tqsllib-dev_2.2-5_i386
+trafficserver-dev_3.0.5-1_i386
+tuxpaint-dev_1:0.9.21-1.1_all
+unagi-dev_0.3.3-2_i386
+unixodbc-dev_2.2.14p2-5_i386
+uthash-dev_1.9.5-1_all
+uuid-dev_2.20.1-5.3_i386
+vdr-dev_1.7.28-1_all
+vflib3-dev_3.6.14.dfsg-3+b1_i386
+voms-dev_2.0.8-1_i386
+vstream-client-dev_1.2-6.1_i386
+wcslib-dev_4.13.4-1_i386
+weechat-dev_0.3.8-1+deb7u1_all
+weechat-dev_0.4.3-2~bpo70+1_all
+wireshark-dev_1.10.7-1~bpo70+1_i386
+wireshark-dev_1.8.2-5wheezy10_i386
+witty-dev_3.2.1-2_all
+wordnet-dev_1:3.0-29_i386
+wzdftpd-dev_0.8.3-6.2_i386
+x11proto-bigreqs-dev_1:1.1.2-1_all
+x11proto-composite-dev_1:0.4.2-2_all
+x11proto-core-dev_7.0.23-1_all
+x11proto-damage-dev_1:1.2.1-2_all
+x11proto-dmx-dev_1:2.3.1-2_all
+x11proto-dri2-dev_2.6-2_all
+x11proto-fixes-dev_1:5.0-2_all
+x11proto-fonts-dev_2.1.2-1_all
+x11proto-gl-dev_1.4.15-1_all
+x11proto-input-dev_2.2-1_all
+x11proto-kb-dev_1.0.6-2_all
+x11proto-print-dev_1.0.5-2_all
+x11proto-randr-dev_1.3.2-2_all
+x11proto-record-dev_1.14.2-1_all
+x11proto-render-dev_2:0.11.1-2_all
+x11proto-resource-dev_1.2.0-3_all
+x11proto-scrnsaver-dev_1.2.2-1_all
+x11proto-video-dev_2.3.1-2_all
+x11proto-xcmisc-dev_1.2.2-1_all
+x11proto-xext-dev_7.2.1-1_all
+x11proto-xf86bigfont-dev_1.2.0-3_all
+x11proto-xf86dga-dev_2.1-3_all
+x11proto-xf86dri-dev_2.1.1-2_all
+x11proto-xf86vidmode-dev_2.3.1-2_all
+x11proto-xinerama-dev_1.2.1-2_all
+xaw3dg-dev_1.5+E-18.2_i386
+xbmc-addons-dev_2:13.1~rc1+dfsg1-1~bpo70+1_all
+xbmc-eventclients-dev_2:11.0~git20120510.82388d5-1_all
+xbmc-eventclients-dev_2:13.1~rc1+dfsg1-1~bpo70+1_all
+xfce4-panel-dev_4.8.6-4_i386
+xfslibs-dev_3.1.7+b1_i386
+xmhtml1-dev_1.1.7-18_i386
+xmms2-dev_0.8+dfsg-4_all
+xorg-dev_1:7.7+3~deb7u1_all
+xotcl-dev_1.6.7-2_i386
+xpaint-dev_2.9.1.4-3+b2_i386
+xserver-xorg-dev_2:1.12.4-6+deb7u2_i386
+xserver-xorg-input-evdev-dev_1:2.7.0-1_all
+xserver-xorg-input-joystick-dev_1:1.6.1-1_all
+xserver-xorg-input-synaptics-dev_1.6.2-2_all
+xtrans-dev_1.2.7-1_all
+xulrunner-dev_24.4.0esr-1~deb7u2_i386
+xutils-dev_1:7.7~1_i386
+xviewg-dev_3.2p1.4-28.1_i386
+yate-dev_4.1.0-1~dfsg-3_i386
+yorick-dev_2.2.02+dfsg-6_i386
+zathura-dev_0.1.2-4_all
+zlib1g-dev_1:1.2.7.dfsg-13_i386
+znc-dev_0.206-2_i386
+zsh-dev_4.3.17-1_i386
\ No newline at end of file
diff --git a/src/github.com/smira/aptly/system/t11_package/SearchPackage2Test_gold b/src/github.com/smira/aptly/system/t11_package/SearchPackage2Test_gold
new file mode 100644
index 00000000..e69de29b
diff --git a/src/github.com/smira/aptly/system/t11_package/SearchPackage3Test_gold b/src/github.com/smira/aptly/system/t11_package/SearchPackage3Test_gold
new file mode 100644
index 00000000..1fef093c
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t11_package/SearchPackage3Test_gold
@@ -0,0 +1 @@
+nginx-full_1.2.1-2.2+wheezy2_amd64
diff --git a/src/github.com/smira/aptly/system/t11_package/SearchPackage4Test_gold b/src/github.com/smira/aptly/system/t11_package/SearchPackage4Test_gold
new file mode 100644
index 00000000..ffe5c1be
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t11_package/SearchPackage4Test_gold
@@ -0,0 +1,4 @@
+
+coreutils_8.13-3.5_amd64
+coreutils_8.13-3.5_i386
+coreutils_8.13-3.5_source
\ No newline at end of file
diff --git a/src/github.com/smira/aptly/system/t11_package/ShowPackage1Test_gold b/src/github.com/smira/aptly/system/t11_package/ShowPackage1Test_gold
new file mode 100644
index 00000000..2596fdce
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t11_package/ShowPackage1Test_gold
@@ -0,0 +1,163 @@
+
+
+
+
+
+
+
+
+
+Architecture: amd64
+Architecture: amd64
+Architecture: amd64
+Architecture: amd64
+Architecture: i386
+Architecture: i386
+Architecture: i386
+Architecture: i386
+Breaks: nginx (<< 1.4.5-1)
+Breaks: nginx (<< 1.4.5-1)
+Conflicts: nginx-full, nginx-light, nginx-naxsi
+Conflicts: nginx-full, nginx-light, nginx-naxsi
+Conflicts: nginx-full, nginx-light, nginx-naxsi
+Conflicts: nginx-full, nginx-light, nginx-naxsi
+Conflicts: nginx-full-dbg, nginx-light-dbg, nginx-naxsi-dbg
+Conflicts: nginx-full-dbg, nginx-light-dbg, nginx-naxsi-dbg
+Conflicts: nginx-full-dbg, nginx-light-dbg, nginx-naxsi-dbg
+Conflicts: nginx-full-dbg, nginx-light-dbg, nginx-naxsi-dbg
+Depends: nginx-common (= 1.2.1-2.2+wheezy2), perl (>= 5.14.2-21+deb7u1), perlapi-5.14.2, libc6 (>= 2.11), libexpat1 (>= 2.0.1), libgd2-noxpm (>= 2.0.36~rc1~dfsg) | libgd2-xpm (>= 2.0.36~rc1~dfsg), libgeoip1 (>= 1.4.8+dfsg), liblua5.1-0, libpam0g (>= 0.99.7.1), libpcre3 (>= 8.10), libperl5.14 (>= 5.14.2), libssl1.0.0 (>= 1.0.0), libxml2 (>= 2.7.4), libxslt1.1 (>= 1.1.25), zlib1g (>= 1:1.1.4)
+Depends: nginx-common (= 1.2.1-2.2+wheezy2), perl (>= 5.14.2-21+deb7u1), perlapi-5.14.2, libc6 (>= 2.11), libexpat1 (>= 2.0.1), libgd2-noxpm (>= 2.0.36~rc1~dfsg) | libgd2-xpm (>= 2.0.36~rc1~dfsg), libgeoip1 (>= 1.4.8+dfsg), liblua5.1-0, libpam0g (>= 0.99.7.1), libpcre3 (>= 8.10), libperl5.14 (>= 5.14.2), libssl1.0.0 (>= 1.0.0), libxml2 (>= 2.7.4), libxslt1.1 (>= 1.1.25), zlib1g (>= 1:1.1.4)
+Depends: nginx-common (= 1.6.0-1~bpo70+1), perl (>= 5.14.2-21+deb7u1), perlapi-5.14.2, libc6 (>= 2.11), libexpat1 (>= 2.0.1), libgd2-noxpm (>= 2.0.36~rc1~dfsg) | libgd2-xpm (>= 2.0.36~rc1~dfsg), libgeoip1 (>= 1.4.8+dfsg), liblua5.1-0, libpam0g (>= 0.99.7.1), libpcre3 (>= 8.10), libperl5.14 (>= 5.14.2), libssl1.0.0 (>= 1.0.1), libxml2 (>= 2.7.4), libxslt1.1 (>= 1.1.25), zlib1g (>= 1:1.2.0)
+Depends: nginx-common (= 1.6.0-1~bpo70+1), perl (>= 5.14.2-21+deb7u1), perlapi-5.14.2, libc6 (>= 2.11), libexpat1 (>= 2.0.1), libgd2-noxpm (>= 2.0.36~rc1~dfsg) | libgd2-xpm (>= 2.0.36~rc1~dfsg), libgeoip1 (>= 1.4.8+dfsg), liblua5.1-0, libpam0g (>= 0.99.7.1), libpcre3 (>= 8.10), libperl5.14 (>= 5.14.2), libssl1.0.0 (>= 1.0.1), libxml2 (>= 2.7.4), libxslt1.1 (>= 1.1.25), zlib1g (>= 1:1.2.0)
+Depends: nginx-extras (= 1.2.1-2.2+wheezy2)
+Depends: nginx-extras (= 1.2.1-2.2+wheezy2)
+Depends: nginx-extras (= 1.6.0-1~bpo70+1)
+Depends: nginx-extras (= 1.6.0-1~bpo70+1)
+Description-md5: 5b3494bcc5c46937a8b11b44469c77b3
+Description-md5: 5b3494bcc5c46937a8b11b44469c77b3
+Description-md5: a1852af8d0ef61a51df8e6cb9581d6a6
+Description-md5: a1852af8d0ef61a51df8e6cb9581d6a6
+Description-md5: dfe40e4b526a7896997294d525c6e22f
+Description-md5: dfe40e4b526a7896997294d525c6e22f
+Description-md5: dfe40e4b526a7896997294d525c6e22f
+Description-md5: dfe40e4b526a7896997294d525c6e22f
+Description: nginx web/proxy server (extended version)
+Description: nginx web/proxy server (extended version)
+Description: nginx web/proxy server (extended version)
+Description: nginx web/proxy server (extended version)
+Description: nginx web/proxy server (extended version) - debugging symbols
+Description: nginx web/proxy server (extended version) - debugging symbols
+Description: nginx web/proxy server (extended version) - debugging symbols
+Description: nginx web/proxy server (extended version) - debugging symbols
+Filename: nginx-extras-dbg_1.2.1-2.2+wheezy2_amd64.deb
+Filename: nginx-extras-dbg_1.2.1-2.2+wheezy2_i386.deb
+Filename: nginx-extras-dbg_1.6.0-1~bpo70+1_amd64.deb
+Filename: nginx-extras-dbg_1.6.0-1~bpo70+1_i386.deb
+Filename: nginx-extras_1.2.1-2.2+wheezy2_amd64.deb
+Filename: nginx-extras_1.2.1-2.2+wheezy2_i386.deb
+Filename: nginx-extras_1.6.0-1~bpo70+1_amd64.deb
+Filename: nginx-extras_1.6.0-1~bpo70+1_i386.deb
+Homepage: http://nginx.net
+Homepage: http://nginx.net
+Homepage: http://nginx.net
+Homepage: http://nginx.net
+Homepage: http://nginx.net
+Homepage: http://nginx.net
+Homepage: http://nginx.net
+Homepage: http://nginx.net
+Installed-Size: 1231
+Installed-Size: 1315
+Installed-Size: 1482
+Installed-Size: 1526
+Installed-Size: 5256
+Installed-Size: 5407
+Installed-Size: 8841
+Installed-Size: 9867
+MD5sum: 02a19018aae7a2a399f507fc0cb64d62
+MD5sum: 4b3b6c67272522433d50420d25e2b645
+MD5sum: 4e7009234d9b2d284b8986e7ffbe2846
+MD5sum: 6fee6f3675b1c56aa569f1cd655147c9
+MD5sum: c4a6097ed1e9cd3cc48c379acc444a1a
+MD5sum: d2ebc412ca7dfcc2f9fa0993ad6ea21e
+MD5sum: f7449a09f637555070687aa1adcdbebc
+MD5sum: fabd2b985a687bbf3b6a3a29d7ef5619
+Maintainer: Kartik Mistry
+Maintainer: Kartik Mistry
+Maintainer: Kartik Mistry
+Maintainer: Kartik Mistry
+Maintainer: Kartik Mistry
+Maintainer: Kartik Mistry
+Maintainer: Kartik Mistry
+Maintainer: Kartik Mistry
+Package: nginx-extras
+Package: nginx-extras
+Package: nginx-extras
+Package: nginx-extras
+Package: nginx-extras-dbg
+Package: nginx-extras-dbg
+Package: nginx-extras-dbg
+Package: nginx-extras-dbg
+Priority: extra
+Priority: extra
+Priority: extra
+Priority: extra
+Priority: extra
+Priority: extra
+Priority: extra
+Priority: extra
+Provides: httpd, httpd-cgi, nginx
+Provides: httpd, httpd-cgi, nginx
+Provides: httpd, nginx
+Provides: httpd, nginx
+SHA1: 286a9e206c57dfd33ee318ed4f45c3619d3a68d4
+SHA1: 5ae182d975a5d249340b9cc24512ac92157ce170
+SHA1: 5dc4cd5bfa96083ad01a32ff83c11857304c3a8b
+SHA1: 69f94693a5693d0e02d8f473ab0fb8628c26fdde
+SHA1: 778e4cd89b4323f307ba0476488982fec1c30b34
+SHA1: 932ad607b2ce5e130071d403e62adf8c4e90e257
+SHA1: abd23b106ee886c5fab024433f1ef6db4699c282
+SHA1: fe254aca7d88d7b0f42ef5951ab4e4013e147958
+SHA256: 2b2901cd6fac19b06bd8750ce6dd337306e76fdf5ae27b5693702b41fb96ad1b
+SHA256: 390323fef7da9a6465eb25139cde8bbeb3588398f1e40c31973921dfea32d8bf
+SHA256: 8970a47653ed40d4b2096c2c42d7e3858fe8ac6b291c1bc6f3c52a535589d790
+SHA256: 9e38a151e26168a05b39e9f50ee12e621cf7fef44096dc0856b70f81205de24b
+SHA256: a1cc9d55d5e17b6b0ab000a7b50a76dd175e83fe89742827b62ca36cd05042f6
+SHA256: b7bbee42030cf59a17a9fa28d9bc3aa07dd7e328a5bd002ac7fa3698c5456f1b
+SHA256: bbb5c9abac66cc848b9b8ce8b6fabe1d9b3e826959afd6d8ec502b95d5f0c814
+SHA256: d970bbb7fb92bc13fa1447de0c04c9e31c45056a450ce173f75d4e5715d0850b
+Section: debug
+Section: debug
+Section: debug
+Section: debug
+Section: httpd
+Section: httpd
+Section: httpd
+Section: httpd
+Size: 4450540
+Size: 4549842
+Size: 5181882
+Size: 5302224
+Size: 601422
+Size: 606894
+Size: 699448
+Size: 705372
+Source: nginx
+Source: nginx
+Source: nginx
+Source: nginx
+Source: nginx
+Source: nginx
+Source: nginx
+Source: nginx
+Suggests: nginx-doc (= 1.6.0-1~bpo70+1)
+Suggests: nginx-doc (= 1.6.0-1~bpo70+1)
+Tag: role::debug-symbols
+Tag: role::debug-symbols
+Version: 1.2.1-2.2+wheezy2
+Version: 1.2.1-2.2+wheezy2
+Version: 1.2.1-2.2+wheezy2
+Version: 1.2.1-2.2+wheezy2
+Version: 1.6.0-1~bpo70+1
+Version: 1.6.0-1~bpo70+1
+Version: 1.6.0-1~bpo70+1
+Version: 1.6.0-1~bpo70+1
\ No newline at end of file
diff --git a/src/github.com/smira/aptly/system/t11_package/ShowPackage2Test_gold b/src/github.com/smira/aptly/system/t11_package/ShowPackage2Test_gold
new file mode 100644
index 00000000..e69de29b
diff --git a/src/github.com/smira/aptly/system/t11_package/ShowPackage3Test_gold b/src/github.com/smira/aptly/system/t11_package/ShowPackage3Test_gold
new file mode 100644
index 00000000..d8eeb960
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t11_package/ShowPackage3Test_gold
@@ -0,0 +1,21 @@
+Package: nginx-full
+Version: 1.2.1-2.2+wheezy2
+Installed-Size: 915
+Priority: optional
+Section: httpd
+Maintainer: Kartik Mistry
+Architecture: amd64
+Description: nginx web/proxy server (standard version)
+MD5sum: 586a2ff5648004cd0114447f5df46a29
+SHA1: 7bf9b91714046f12d765adad860677f5b650c616
+SHA256: aa724376b6bf534c8ff38a8c5de4d4208d4de2b57946f875857349436542306b
+Description-md5: b334eec6202adf5e9045cc6066a082d1
+Conflicts: nginx-extras, nginx-light, nginx-naxsi
+Filename: nginx-full_1.2.1-2.2+wheezy2_amd64.deb
+Size: 435328
+Homepage: http://nginx.net
+Depends: nginx-common (= 1.2.1-2.2+wheezy2), libc6 (>= 2.10), libexpat1 (>= 2.0.1), libgd2-noxpm (>= 2.0.36~rc1~dfsg) | libgd2-xpm (>= 2.0.36~rc1~dfsg), libgeoip1 (>= 1.4.8+dfsg), libpam0g (>= 0.99.7.1), libpcre3 (>= 8.10), libssl1.0.0 (>= 1.0.0), libxml2 (>= 2.7.4), libxslt1.1 (>= 1.1.25), zlib1g (>= 1:1.1.4)
+Provides: httpd, nginx
+Source: nginx
+Tag: network::server, protocol::http, role::program
+
diff --git a/src/github.com/smira/aptly/system/t11_package/ShowPackage4Test_gold b/src/github.com/smira/aptly/system/t11_package/ShowPackage4Test_gold
new file mode 100644
index 00000000..4d72b1df
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t11_package/ShowPackage4Test_gold
@@ -0,0 +1,24 @@
+Package: nginx-full
+Version: 1.2.1-2.2+wheezy2
+Installed-Size: 915
+Priority: optional
+Section: httpd
+Maintainer: Kartik Mistry
+Architecture: amd64
+Description: nginx web/proxy server (standard version)
+MD5sum: 586a2ff5648004cd0114447f5df46a29
+SHA1: 7bf9b91714046f12d765adad860677f5b650c616
+SHA256: aa724376b6bf534c8ff38a8c5de4d4208d4de2b57946f875857349436542306b
+Conflicts: nginx-extras, nginx-light, nginx-naxsi
+Description-md5: b334eec6202adf5e9045cc6066a082d1
+Filename: nginx-full_1.2.1-2.2+wheezy2_amd64.deb
+Size: 435328
+Depends: nginx-common (= 1.2.1-2.2+wheezy2), libc6 (>= 2.10), libexpat1 (>= 2.0.1), libgd2-noxpm (>= 2.0.36~rc1~dfsg) | libgd2-xpm (>= 2.0.36~rc1~dfsg), libgeoip1 (>= 1.4.8+dfsg), libpam0g (>= 0.99.7.1), libpcre3 (>= 8.10), libssl1.0.0 (>= 1.0.0), libxml2 (>= 2.7.4), libxslt1.1 (>= 1.1.25), zlib1g (>= 1:1.1.4)
+Homepage: http://nginx.net
+Provides: httpd, nginx
+Source: nginx
+Tag: network::server, protocol::http, role::program
+
+Files in the pool:
+ ${HOME}/.aptly/pool/58/6a/nginx-full_1.2.1-2.2+wheezy2_amd64.deb
+
diff --git a/src/github.com/smira/aptly/system/t11_package/ShowPackage5Test_gold b/src/github.com/smira/aptly/system/t11_package/ShowPackage5Test_gold
new file mode 100644
index 00000000..a8f69479
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t11_package/ShowPackage5Test_gold
@@ -0,0 +1,25 @@
+Package: nginx-full
+Version: 1.2.1-2.2+wheezy2
+Installed-Size: 915
+Priority: optional
+Section: httpd
+Maintainer: Kartik Mistry
+Architecture: amd64
+Description: nginx web/proxy server (standard version)
+MD5sum: 586a2ff5648004cd0114447f5df46a29
+SHA1: 7bf9b91714046f12d765adad860677f5b650c616
+SHA256: aa724376b6bf534c8ff38a8c5de4d4208d4de2b57946f875857349436542306b
+Homepage: http://nginx.net
+Source: nginx
+Size: 435328
+Conflicts: nginx-extras, nginx-light, nginx-naxsi
+Description-md5: b334eec6202adf5e9045cc6066a082d1
+Tag: network::server, protocol::http, role::program
+Filename: nginx-full_1.2.1-2.2+wheezy2_amd64.deb
+Depends: nginx-common (= 1.2.1-2.2+wheezy2), libc6 (>= 2.10), libexpat1 (>= 2.0.1), libgd2-noxpm (>= 2.0.36~rc1~dfsg) | libgd2-xpm (>= 2.0.36~rc1~dfsg), libgeoip1 (>= 1.4.8+dfsg), libpam0g (>= 0.99.7.1), libpcre3 (>= 8.10), libssl1.0.0 (>= 1.0.0), libxml2 (>= 2.7.4), libxslt1.1 (>= 1.1.25), zlib1g (>= 1:1.1.4)
+Provides: httpd, nginx
+
+References to package:
+ mirror [wheezy-main]: http://mirror.yandex.ru/debian/ wheezy
+ mirror [wheezy-main-src]: http://mirror.yandex.ru/debian/ wheezy [src]
+
diff --git a/src/github.com/smira/aptly/system/t11_package/ShowPackage6Test_gold b/src/github.com/smira/aptly/system/t11_package/ShowPackage6Test_gold
new file mode 100644
index 00000000..122178d8
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t11_package/ShowPackage6Test_gold
@@ -0,0 +1,29 @@
+Package: nginx-full
+Version: 1.2.1-2.2+wheezy2
+Installed-Size: 915
+Priority: optional
+Section: httpd
+Maintainer: Kartik Mistry
+Architecture: amd64
+Description: nginx web/proxy server (standard version)
+MD5sum: 586a2ff5648004cd0114447f5df46a29
+SHA1: 7bf9b91714046f12d765adad860677f5b650c616
+SHA256: aa724376b6bf534c8ff38a8c5de4d4208d4de2b57946f875857349436542306b
+Homepage: http://nginx.net
+Tag: network::server, protocol::http, role::program
+Conflicts: nginx-extras, nginx-light, nginx-naxsi
+Source: nginx
+Size: 435328
+Filename: nginx-full_1.2.1-2.2+wheezy2_amd64.deb
+Provides: httpd, nginx
+Depends: nginx-common (= 1.2.1-2.2+wheezy2), libc6 (>= 2.10), libexpat1 (>= 2.0.1), libgd2-noxpm (>= 2.0.36~rc1~dfsg) | libgd2-xpm (>= 2.0.36~rc1~dfsg), libgeoip1 (>= 1.4.8+dfsg), libpam0g (>= 0.99.7.1), libpcre3 (>= 8.10), libssl1.0.0 (>= 1.0.0), libxml2 (>= 2.7.4), libxslt1.1 (>= 1.1.25), zlib1g (>= 1:1.1.4)
+Description-md5: b334eec6202adf5e9045cc6066a082d1
+
+References to package:
+ mirror [wheezy-main]: http://mirror.yandex.ru/debian/ wheezy
+ mirror [wheezy-main-src]: http://mirror.yandex.ru/debian/ wheezy [src]
+ local repo [repo1]
+ snapshot [snap1]: Snapshot from mirror [wheezy-main]: http://mirror.yandex.ru/debian/ wheezy
+ snapshot [snap4]: Merged from sources: 'snap1', 'snap2', 'snap3'
+ snapshot [snap3]: Snapshot from mirror [wheezy-main-src]: http://mirror.yandex.ru/debian/ wheezy [src]
+
diff --git a/src/github.com/smira/aptly/system/t11_package/__init__.py b/src/github.com/smira/aptly/system/t11_package/__init__.py
new file mode 100644
index 00000000..73dc4f0c
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t11_package/__init__.py
@@ -0,0 +1,6 @@
+"""
+Testing package subcommands
+"""
+
+from .search import *
+from .show import *
diff --git a/src/github.com/smira/aptly/system/t11_package/search.py b/src/github.com/smira/aptly/system/t11_package/search.py
new file mode 100644
index 00000000..fee0d545
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t11_package/search.py
@@ -0,0 +1,34 @@
+from lib import BaseTest
+
+
+class SearchPackage1Test(BaseTest):
+ """
+ search package: regular search
+ """
+ fixtureDB = True
+ outputMatchPrepare = lambda _, s: "\n".join(sorted(s.split("\n")))
+ runCmd = "aptly package search '$$Architecture (i386), Name (% *-dev)'"
+
+
+class SearchPackage2Test(BaseTest):
+ """
+ search package: missing package
+ """
+ runCmd = "aptly package search 'Name (package-xx)'"
+
+
+class SearchPackage3Test(BaseTest):
+ """
+ search package: by key
+ """
+ fixtureDB = True
+ runCmd = "aptly package search nginx-full_1.2.1-2.2+wheezy2_amd64"
+
+
+class SearchPackage4Test(BaseTest):
+ """
+ search package: by dependency
+ """
+ fixtureDB = True
+ outputMatchPrepare = lambda _, s: "\n".join(sorted(s.split("\n")))
+ runCmd = "aptly package search coreutils"
diff --git a/src/github.com/smira/aptly/system/t11_package/show.py b/src/github.com/smira/aptly/system/t11_package/show.py
new file mode 100644
index 00000000..e1365fa0
--- /dev/null
+++ b/src/github.com/smira/aptly/system/t11_package/show.py
@@ -0,0 +1,62 @@
+from lib import BaseTest
+
+
+class ShowPackage1Test(BaseTest):
+ """
+ show package: regular show
+ """
+ fixtureDB = True
+ outputMatchPrepare = lambda _, s: "\n".join(sorted(s.split("\n")))
+ runCmd = "aptly package show 'Name (% nginx-extras*)'"
+
+
+class ShowPackage2Test(BaseTest):
+ """
+ show package: missing package
+ """
+ runCmd = "aptly package show 'Name (package-xx)'"
+
+
+class ShowPackage3Test(BaseTest):
+ """
+ show package: by key
+ """
+ fixtureDB = True
+ outputMatchPrepare = lambda _, s: "\n".join(sorted(s.split("\n")))
+ runCmd = "aptly package show nginx-full_1.2.1-2.2+wheezy2_amd64"
+
+
+class ShowPackage4Test(BaseTest):
+ """
+ show package: with files
+ """
+ fixtureDB = True
+ outputMatchPrepare = lambda _, s: "\n".join(sorted(s.split("\n")))
+ gold_processor = BaseTest.expand_environ
+ runCmd = "aptly package show -with-files nginx-full_1.2.1-2.2+wheezy2_amd64"
+
+
+class ShowPackage5Test(BaseTest):
+ """
+ show package: with inclusion
+ """
+ fixtureDB = True
+ outputMatchPrepare = lambda _, s: "\n".join(sorted(s.split("\n")))
+ runCmd = "aptly package show -with-references nginx-full_1.2.1-2.2+wheezy2_amd64"
+
+
+class ShowPackage6Test(BaseTest):
+ """
+ show package: with inclusion + more inclusions
+ """
+ fixtureDB = True
+ fixtureCmds = [
+ "aptly snapshot create snap1 from mirror wheezy-main",
+ "aptly snapshot create snap2 from mirror wheezy-contrib",
+ "aptly snapshot create snap3 from mirror wheezy-main-src",
+ "aptly snapshot merge snap4 snap1 snap2 snap3",
+ "aptly repo create repo1",
+ "aptly repo import wheezy-main repo1 nginx",
+ ]
+ outputMatchPrepare = lambda _, s: "\n".join(sorted(s.split("\n")))
+ runCmd = "aptly package show -with-references nginx-full_1.2.1-2.2+wheezy2_amd64"
diff --git a/src/github.com/smira/aptly/system/udebs/dmraid-udeb_1.0.0.rc16-4.1_amd64.udeb b/src/github.com/smira/aptly/system/udebs/dmraid-udeb_1.0.0.rc16-4.1_amd64.udeb
new file mode 100644
index 00000000..0e7f0635
Binary files /dev/null and b/src/github.com/smira/aptly/system/udebs/dmraid-udeb_1.0.0.rc16-4.1_amd64.udeb differ
diff --git a/src/github.com/smira/aptly/system/udebs/dmraid-udeb_1.0.0.rc16-4.1_i386.udeb b/src/github.com/smira/aptly/system/udebs/dmraid-udeb_1.0.0.rc16-4.1_i386.udeb
new file mode 100644
index 00000000..ba61e2d7
Binary files /dev/null and b/src/github.com/smira/aptly/system/udebs/dmraid-udeb_1.0.0.rc16-4.1_i386.udeb differ
diff --git a/src/github.com/smira/aptly/utils/config.go b/src/github.com/smira/aptly/utils/config.go
index d613d9ab..96755a76 100644
--- a/src/github.com/smira/aptly/utils/config.go
+++ b/src/github.com/smira/aptly/utils/config.go
@@ -26,12 +26,15 @@ type ConfigStructure struct {
// S3PublishRoot describes single S3 publishing entry point
type S3PublishRoot struct {
- Region string `json:"region"`
- Bucket string `json:"bucket"`
- AccessKeyID string `json:"awsAccessKeyID"`
- SecretAccessKey string `json:"awsSecretAccessKey"`
- Prefix string `json:"prefix"`
- ACL string `json:"acl"`
+ Region string `json:"region"`
+ Bucket string `json:"bucket"`
+ AccessKeyID string `json:"awsAccessKeyID"`
+ SecretAccessKey string `json:"awsSecretAccessKey"`
+ Prefix string `json:"prefix"`
+ ACL string `json:"acl"`
+ StorageClass string `json:"storageClass"`
+ EncryptionMethod string `json:"encryptionMethod"`
+ PlusWorkaround bool `json:"plusWorkaround"`
}
// Config is configuration for aptly, shared by all modules
diff --git a/src/github.com/smira/aptly/utils/config_test.go b/src/github.com/smira/aptly/utils/config_test.go
index c335bb3b..cc56cdb5 100644
--- a/src/github.com/smira/aptly/utils/config_test.go
+++ b/src/github.com/smira/aptly/utils/config_test.go
@@ -65,7 +65,10 @@ func (s *ConfigSuite) TestSaveConfig(c *C) {
" \"awsAccessKeyID\": \"\",\n"+
" \"awsSecretAccessKey\": \"\",\n"+
" \"prefix\": \"\",\n"+
- " \"acl\": \"\"\n"+
+ " \"acl\": \"\",\n"+
+ " \"storageClass\": \"\",\n"+
+ " \"encryptionMethod\": \"\",\n"+
+ " \"plusWorkaround\": false\n"+
" }\n"+
" }\n"+
"}")
diff --git a/src/github.com/smira/aptly/utils/gpg.go b/src/github.com/smira/aptly/utils/gpg.go
index 73549000..90244192 100644
--- a/src/github.com/smira/aptly/utils/gpg.go
+++ b/src/github.com/smira/aptly/utils/gpg.go
@@ -17,6 +17,7 @@ type Signer interface {
Init() error
SetKey(keyRef string)
SetKeyRing(keyring, secretKeyring string)
+ SetPassphrase(passphrase, passphraseFile string)
DetachedSign(source string, destination string) error
ClearSign(source string, destination string) error
}
@@ -38,8 +39,9 @@ var (
// GpgSigner is implementation of Signer interface using gpg
type GpgSigner struct {
- keyRef string
- keyring, secretKeyring string
+ keyRef string
+ keyring, secretKeyring string
+ passphrase, passphraseFile string
}
// SetKey sets key ID to use when signing files
@@ -52,6 +54,11 @@ func (g *GpgSigner) SetKeyRing(keyring, secretKeyring string) {
g.keyring, g.secretKeyring = keyring, secretKeyring
}
+// SetPassphrase sets passhprase params
+func (g *GpgSigner) SetPassphrase(passphrase, passphraseFile string) {
+ g.passphrase, g.passphraseFile = passphrase, passphraseFile
+}
+
func (g *GpgSigner) gpgArgs() []string {
args := []string{}
if g.keyring != "" {
@@ -65,6 +72,14 @@ func (g *GpgSigner) gpgArgs() []string {
args = append(args, "-u", g.keyRef)
}
+ if g.passphrase != "" {
+ args = append(args, "--passphrase", g.passphrase)
+ }
+
+ if g.passphraseFile != "" {
+ args = append(args, "--passphrase-file", g.passphraseFile)
+ }
+
return args
}