mirror of
https://github.com/aptly-dev/aptly.git
synced 2026-06-01 04:40:38 +00:00
Compare commits
51 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 52f7c83f95 | |||
| d7665119e4 | |||
| 587086beb4 | |||
| 644d24d1cc | |||
| 2fe8cfdc12 | |||
| 2ecd933d50 | |||
| 90ea1111e2 | |||
| 165a1c53b5 | |||
| 876935050a | |||
| d9a1299f6b | |||
| ff52d2655a | |||
| bc438ff694 | |||
| 0db3cac281 | |||
| 9ed6e8dbbd | |||
| 7294241c08 | |||
| 60cca0245b | |||
| 75b860e0b1 | |||
| 7f5a7323a6 | |||
| 1069458aee | |||
| 76edf9649b | |||
| 8b0d293c6a | |||
| 281d0dd68d | |||
| cfaa8f3881 | |||
| f1b6841757 | |||
| b966b2eabf | |||
| a4e573bb07 | |||
| 067d197dac | |||
| 18d04c7977 | |||
| a29453805c | |||
| 05b1296144 | |||
| 29e33069aa | |||
| ee05bb23c9 | |||
| 505da096e6 | |||
| 77be7b9e3b | |||
| ffafed472c | |||
| 8c9cc41099 | |||
| f50e008763 | |||
| 64b04c2764 | |||
| d6c7a9a89c | |||
| 0339f0fe23 | |||
| fcedaa3fc5 | |||
| 7acfc84c9d | |||
| 02b937ad17 | |||
| 7ad1c1ad17 | |||
| 640bd2b530 | |||
| 06149ef2bb | |||
| b271e8fe31 | |||
| efc6ab27db | |||
| 05c063839d | |||
| fd30b37a0e | |||
| 9738687116 |
+38
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"AppName": "aptly",
|
||||
"ArtifactsDest": "xc-out/",
|
||||
"TasksExclude": [
|
||||
"rmbin"
|
||||
],
|
||||
"TasksAppend": [
|
||||
"bintray"
|
||||
],
|
||||
"TaskSettings": {
|
||||
"deb": {
|
||||
"metadata": {
|
||||
"maintainer": "Andrey Smirnov",
|
||||
"maintainerEmail": "me@smira.ru",
|
||||
"description": "Debian repository management tool"
|
||||
},
|
||||
"metadata-deb": {
|
||||
"License": "MIT",
|
||||
"Homepage": "https://www.aptly.info/",
|
||||
"Recommends": "bzip2, graphviz, xz-utils",
|
||||
"Depends": ""
|
||||
},
|
||||
"other-mapped-files": {
|
||||
"/": "root/"
|
||||
}
|
||||
},
|
||||
"bintray": {
|
||||
"repository": "aptly",
|
||||
"subject": "smira",
|
||||
"package": "aptly",
|
||||
"downloadspage": "bintray.md"
|
||||
}
|
||||
},
|
||||
"Arch": "386 amd64",
|
||||
"Os": "linux darwin freebsd",
|
||||
"MainDirsExclude": "man,_vendor",
|
||||
"ConfigVersion": "0.9"
|
||||
}
|
||||
@@ -19,3 +19,6 @@ List of contributors, in chronological order:
|
||||
* Paul Krohn (https://github.com/paul-krohn)
|
||||
* Vincent Bernat (https://github.com/vincentbernat)
|
||||
* x539 (https://github.com/x539)
|
||||
* Phil Frost (https://github.com/bitglue)
|
||||
* Benoit Foucher (https://github.com/bentoi)
|
||||
* Geoffrey Thomas (https://github.com/geofft)
|
||||
|
||||
@@ -1,23 +1,26 @@
|
||||
gom 'github.com/AlekSi/pointer', :commit => '5f6d527dae3d678b46fbb20331ddf44e2b841943'
|
||||
gom 'github.com/awalterschulze/gographviz', :commit => '20d1f693416d9be045340150094aa42035a41c9e'
|
||||
gom 'github.com/aws/aws-sdk-go', :commit => 'a170e9cb76475a0da7c0326a13cc2b39e9244b3b'
|
||||
gom 'github.com/cheggaaa/pb', :commit => '2c1b74620cc58a81ac152ee2d322e28c806d81ed'
|
||||
gom 'github.com/DisposaBoy/JsonConfigReader', :commit => '33a99fdf1d5ee1f79b5077e9c06f955ad356d5f4'
|
||||
gom 'github.com/gin-gonic/gin', :commit => 'b1758d3bfa09e61ddbc1c9a627e936eec6a170de'
|
||||
gom 'github.com/go-ini/ini', :commit => 'afbd495e5aaea13597b5e14fe514ddeaa4d76fc3'
|
||||
gom 'github.com/jlaffaye/ftp', :commit => 'fec71e62e457557fbe85cefc847a048d57815d76'
|
||||
gom 'github.com/jmespath/go-jmespath', :commit => '0b12d6b521d83fc7f755e7cfc1b1fbdd35a01a74'
|
||||
gom 'github.com/julienschmidt/httprouter', :commit => '46807412fe50aaceb73bb57061c2230fd26a1640'
|
||||
gom 'github.com/mattn/go-shellwords', :commit => 'c7ca6f94add751566a61cf2199e1de78d4c3eee4'
|
||||
gom 'github.com/mitchellh/goamz/s3', :commit => 'caaaea8b30ee15616494ee68abd5d8ebbbef05cf'
|
||||
gom 'github.com/mkrautz/goar', :commit => '282caa8bd9daba480b51f1d5a988714913b97aad'
|
||||
gom 'github.com/mxk/go-flowrate/flowrate', :commit => 'cca7078d478f8520f85629ad7c68962d31ed7682'
|
||||
gom 'github.com/ncw/swift', :commit => '384ef27c70645e285f8bb9d02276bf654d06027e'
|
||||
gom 'github.com/smira/go-aws-auth', :commit => '0070896e9d7f4f9f2d558532b2d896ce2239992a'
|
||||
gom 'github.com/smira/go-xz', :commit => '0c531f070014e218b21f3cfca801cc992d52726d'
|
||||
gom 'github.com/smira/commander', :commit => 'f408b00e68d5d6e21b9f18bd310978dafc604e47'
|
||||
gom 'github.com/smira/flag', :commit => '357ed3e599ffcbd4aeaa828e1d10da2df3ea5107'
|
||||
gom 'github.com/smira/go-ftp-protocol/protocol', :commit => '066b75c2b70dca7ae10b1b88b47534a3c31ccfaa'
|
||||
gom 'github.com/smira/go-uuid/uuid', :commit => 'ed3ca8a15a931b141440a7e98e4f716eec255f7d'
|
||||
gom 'github.com/smira/lzma', :commit => '2a7c55cad4a2d02ab972a03357db5760833a49bc'
|
||||
gom 'github.com/smira/lzma', :commit => '7f0af6269940baa2c938fabe73e0d7ba41205683'
|
||||
gom 'github.com/golang/snappy', :commit => '723cc1e459b8eea2dea4583200fd60757d40097a'
|
||||
gom 'github.com/syndtr/goleveldb/leveldb', :commit => '1a9d62f03ea92815b46fcaab357cfd4df264b1a0'
|
||||
gom 'github.com/syndtr/goleveldb/leveldb', :commit => '917f41c560270110ceb73c5b38be2a9127387071'
|
||||
gom 'github.com/ugorji/go/codec', :commit => '71c2886f5a673a35f909803f38ece5810165097b'
|
||||
gom 'github.com/vaughan0/go-ini', :commit => 'a98ad7ee00ec53921f08832bc06ecf7fd600e6a1'
|
||||
gom 'github.com/wsxiaoys/terminal/color', :commit => '5668e431776a7957528361f90ce828266c69ed08'
|
||||
|
||||
@@ -59,18 +59,6 @@ mem.png: mem.dat mem.gp
|
||||
gnuplot mem.gp
|
||||
open mem.png
|
||||
|
||||
package:
|
||||
rm -rf root/
|
||||
mkdir -p root/usr/bin/ root/usr/share/man/man1/ root/etc/bash_completion.d
|
||||
cp $(BINPATH)/aptly root/usr/bin
|
||||
cp man/aptly.1 root/usr/share/man/man1
|
||||
(cd root/etc/bash_completion.d && wget https://raw.github.com/aptly-dev/aptly-bash-completion/master/aptly)
|
||||
gzip root/usr/share/man/man1/aptly.1
|
||||
fpm -s dir -t deb -n aptly -v $(VERSION) --url=http://www.aptly.info/ --license=MIT --vendor="Andrey Smirnov <me@smira.ru>" \
|
||||
-f -m "Andrey Smirnov <me@smira.ru>" --description="Debian repository management tool" --deb-recommends bzip2 \
|
||||
--deb-recommends graphviz --deb-recommends xz-utils -C root/ .
|
||||
mv aptly_$(VERSION)_*.deb ~
|
||||
|
||||
src-package:
|
||||
rm -rf aptly-$(VERSION)
|
||||
mkdir -p aptly-$(VERSION)/src/github.com/smira/aptly/
|
||||
@@ -84,4 +72,12 @@ src-package:
|
||||
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
|
||||
|
||||
goxc:
|
||||
rm -rf root/
|
||||
mkdir -p root/usr/share/man/man1/ root/etc/bash_completion.d
|
||||
cp man/aptly.1 root/usr/share/man/man1
|
||||
(cd root/etc/bash_completion.d && wget https://raw.github.com/aptly-dev/aptly-bash-completion/master/aptly)
|
||||
gzip root/usr/share/man/man1/aptly.1
|
||||
gom exec goxc -pv=$(VERSION) -max-processors=4 $(GOXC_OPTS)
|
||||
|
||||
.PHONY: coverage.out
|
||||
|
||||
+6
-1
@@ -48,7 +48,7 @@ To install aptly on Debian/Ubuntu, add new repository to /etc/apt/sources.list::
|
||||
|
||||
And import key that is used to sign the release::
|
||||
|
||||
$ apt-key adv --keyserver keys.gnupg.net --recv-keys E083A3782A194991
|
||||
$ apt-key adv --keyserver keys.gnupg.net --recv-keys 9E3E53F19C7DE460
|
||||
|
||||
After that you can install aptly as any other software package::
|
||||
|
||||
@@ -90,6 +90,7 @@ Vagrant:
|
||||
Docker:
|
||||
|
||||
- `Docker container <https://github.com/mikepurvis/aptly-docker>`_ with aptly inside by Mike Purvis
|
||||
- `Docker container <https://github.com/bryanhong/docker-aptly>`_ with aptly and nginx by Bryan Hong
|
||||
|
||||
With configuration management systems:
|
||||
|
||||
@@ -104,3 +105,7 @@ With configuration management systems:
|
||||
CLI for aptly API:
|
||||
|
||||
- `Ruby aptly CLI/library <https://github.com/sepulworld/aptly_cli>`_ by Zane Williamson
|
||||
|
||||
Scala sbt:
|
||||
|
||||
- `sbt aptly plugin <https://github.com/amalakar/sbt-aptly>`_ by Arup Malakar
|
||||
|
||||
+31
-34
@@ -27,6 +27,29 @@ const (
|
||||
RELEASEDB
|
||||
)
|
||||
|
||||
// Flushes all collections which cache in-memory objects
|
||||
func flushColections() {
|
||||
// lock everything to eliminate in-progress calls
|
||||
r := context.CollectionFactory().RemoteRepoCollection()
|
||||
r.Lock()
|
||||
defer r.Unlock()
|
||||
|
||||
l := context.CollectionFactory().LocalRepoCollection()
|
||||
l.Lock()
|
||||
defer l.Unlock()
|
||||
|
||||
s := context.CollectionFactory().SnapshotCollection()
|
||||
s.Lock()
|
||||
defer s.Unlock()
|
||||
|
||||
p := context.CollectionFactory().PublishedRepoCollection()
|
||||
p.Lock()
|
||||
defer p.Unlock()
|
||||
|
||||
// all collections locked, flush them
|
||||
context.CollectionFactory().Flush()
|
||||
}
|
||||
|
||||
// Periodically flushes CollectionFactory to free up memory used by
|
||||
// collections, flushing caches. If the two channels are provided,
|
||||
// they are used to acquire and release the database.
|
||||
@@ -38,40 +61,12 @@ func cacheFlusher(requests chan int, acks chan error) {
|
||||
for {
|
||||
<-ticker
|
||||
|
||||
func() {
|
||||
// lock database if needed
|
||||
if requests != nil {
|
||||
requests <- ACQUIREDB
|
||||
err := <-acks
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer func() {
|
||||
requests <- RELEASEDB
|
||||
<-acks
|
||||
}()
|
||||
}
|
||||
|
||||
// lock everything to eliminate in-progress calls
|
||||
r := context.CollectionFactory().RemoteRepoCollection()
|
||||
r.Lock()
|
||||
defer r.Unlock()
|
||||
|
||||
l := context.CollectionFactory().LocalRepoCollection()
|
||||
l.Lock()
|
||||
defer l.Unlock()
|
||||
|
||||
s := context.CollectionFactory().SnapshotCollection()
|
||||
s.Lock()
|
||||
defer s.Unlock()
|
||||
|
||||
p := context.CollectionFactory().PublishedRepoCollection()
|
||||
p.Lock()
|
||||
defer p.Unlock()
|
||||
|
||||
// all collections locked, flush them
|
||||
context.CollectionFactory().Flush()
|
||||
}()
|
||||
// if aptly API runs in -no-lock mode,
|
||||
// caches are flushed when DB is closed anyway, no need
|
||||
// to flush them here
|
||||
if requests == nil {
|
||||
flushColections()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -95,6 +90,7 @@ func acquireDatabase(requests chan int, acks chan error) {
|
||||
case RELEASEDB:
|
||||
clients--
|
||||
if clients == 0 {
|
||||
flushColections()
|
||||
acks <- context.CloseDatabase()
|
||||
} else {
|
||||
acks <- nil
|
||||
@@ -146,6 +142,7 @@ func showPackages(c *gin.Context, reflist *deb.PackageRefList) {
|
||||
nil, context.DependencyOptions(), architecturesList)
|
||||
if err != nil {
|
||||
c.Fail(500, fmt.Errorf("unable to search: %s", err))
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -97,6 +97,7 @@ func apiPublishRepoOrSnapshot(c *gin.Context) {
|
||||
Label string
|
||||
Origin string
|
||||
ForceOverwrite bool
|
||||
SkipContents *bool
|
||||
Architectures []string
|
||||
Signing SigningOptions
|
||||
}
|
||||
@@ -183,6 +184,11 @@ func apiPublishRepoOrSnapshot(c *gin.Context) {
|
||||
published.Origin = b.Origin
|
||||
published.Label = b.Label
|
||||
|
||||
published.SkipContents = context.Config().SkipContentsPublishing
|
||||
if b.SkipContents != nil {
|
||||
published.SkipContents = *b.SkipContents
|
||||
}
|
||||
|
||||
duplicate := collection.CheckDuplicate(published)
|
||||
if duplicate != nil {
|
||||
context.CollectionFactory().PublishedRepoCollection().LoadComplete(duplicate, context.CollectionFactory())
|
||||
@@ -199,6 +205,7 @@ func apiPublishRepoOrSnapshot(c *gin.Context) {
|
||||
err = collection.Add(published)
|
||||
if err != nil {
|
||||
c.Fail(500, fmt.Errorf("unable to save to DB: %s", err))
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(201, published)
|
||||
@@ -213,6 +220,7 @@ func apiPublishUpdateSwitch(c *gin.Context) {
|
||||
var b struct {
|
||||
ForceOverwrite bool
|
||||
Signing SigningOptions
|
||||
SkipContents *bool
|
||||
Snapshots []struct {
|
||||
Component string `binding:"required"`
|
||||
Name string `binding:"required"`
|
||||
@@ -289,22 +297,30 @@ func apiPublishUpdateSwitch(c *gin.Context) {
|
||||
}
|
||||
} else {
|
||||
c.Fail(500, fmt.Errorf("unknown published repository type"))
|
||||
return
|
||||
}
|
||||
|
||||
if b.SkipContents != nil {
|
||||
published.SkipContents = *b.SkipContents
|
||||
}
|
||||
|
||||
err = published.Publish(context.PackagePool(), context, context.CollectionFactory(), signer, nil, b.ForceOverwrite)
|
||||
if err != nil {
|
||||
c.Fail(500, fmt.Errorf("unable to update: %s", err))
|
||||
return
|
||||
}
|
||||
|
||||
err = collection.Update(published)
|
||||
if err != nil {
|
||||
c.Fail(500, fmt.Errorf("unable to save to DB: %s", err))
|
||||
return
|
||||
}
|
||||
|
||||
err = collection.CleanupPrefixComponentFiles(published.Prefix, updatedComponents,
|
||||
context.GetPublishedStorage(storage), context.CollectionFactory(), nil)
|
||||
if err != nil {
|
||||
c.Fail(500, fmt.Errorf("unable to update: %s", err))
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(200, published)
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
package aptly
|
||||
|
||||
// Version of aptly
|
||||
const Version = "0.9.6"
|
||||
const Version = "0.9.7"
|
||||
|
||||
// Enable debugging features?
|
||||
const EnableDebug = false
|
||||
|
||||
@@ -119,6 +119,8 @@ func aptlyPublishSnapshotOrRepo(cmd *commander.Command, args []string) error {
|
||||
published.Origin = context.Flags().Lookup("origin").Value.String()
|
||||
published.Label = context.Flags().Lookup("label").Value.String()
|
||||
|
||||
published.SkipContents = context.Config().SkipContentsPublishing
|
||||
|
||||
if context.Flags().IsSet("skip-contents") {
|
||||
published.SkipContents = context.Flags().Lookup("skip-contents").Value.Get().(bool)
|
||||
}
|
||||
|
||||
+4
-2
@@ -321,9 +321,11 @@ func (context *AptlyContext) GetPublishedStorage(name string) aptly.PublishedSto
|
||||
}
|
||||
|
||||
var err error
|
||||
publishedStorage, err = s3.NewPublishedStorage(params.AccessKeyID, params.SecretAccessKey,
|
||||
publishedStorage, err = s3.NewPublishedStorage(
|
||||
params.AccessKeyID, params.SecretAccessKey, params.SessionToken,
|
||||
params.Region, params.Endpoint, params.Bucket, params.ACL, params.Prefix, params.StorageClass,
|
||||
params.EncryptionMethod, params.PlusWorkaround, params.DisableMultiDel)
|
||||
params.EncryptionMethod, params.PlusWorkaround, params.DisableMultiDel,
|
||||
params.ForceSigV2, params.Debug)
|
||||
if err != nil {
|
||||
Fatal(err)
|
||||
}
|
||||
|
||||
+1
-1
@@ -61,7 +61,7 @@ func OpenDB(path string) (Storage, error) {
|
||||
|
||||
// RecoverDB recovers LevelDB database from corruption
|
||||
func RecoverDB(path string) error {
|
||||
stor, err := storage.OpenFile(path)
|
||||
stor, err := storage.OpenFile(path, false)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -256,6 +256,12 @@ func CollectChangesFiles(locations []string, reporter aptly.ResultReporter) (cha
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
if err2 != nil {
|
||||
reporter.Warning("Unable to process %s: %s", location, err2)
|
||||
failedFiles = append(failedFiles, location)
|
||||
continue
|
||||
}
|
||||
} else if strings.HasSuffix(info.Name(), ".changes") {
|
||||
changesFiles = append(changesFiles, location)
|
||||
}
|
||||
|
||||
+1
-1
@@ -127,7 +127,7 @@ func GetContentsFromDeb(packageFile string) ([]string, error) {
|
||||
case "data.tar.gz":
|
||||
ungzip, err := gzip.NewReader(library)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("unable to ungzip data.tar.gz from %s: %s", packageFile,err)
|
||||
return nil, fmt.Errorf("unable to ungzip data.tar.gz from %s: %s", packageFile, err)
|
||||
}
|
||||
defer ungzip.Close()
|
||||
tarInput = ungzip
|
||||
|
||||
@@ -30,6 +30,7 @@ var (
|
||||
"MD5Sum",
|
||||
"SHA1",
|
||||
"SHA256",
|
||||
"SHA512",
|
||||
}
|
||||
|
||||
canonicalOrderBinary = []string{
|
||||
@@ -59,6 +60,7 @@ var (
|
||||
"MD5sum",
|
||||
"SHA1",
|
||||
"SHA256",
|
||||
"SHA512",
|
||||
"Description",
|
||||
}
|
||||
|
||||
@@ -104,6 +106,8 @@ func isMultilineField(field string, isRelease bool) bool {
|
||||
return true
|
||||
case "Checksums-Sha256":
|
||||
return true
|
||||
case "Checksums-Sha512":
|
||||
return true
|
||||
case "Package-List":
|
||||
return true
|
||||
case "MD5Sum":
|
||||
@@ -112,6 +116,8 @@ func isMultilineField(field string, isRelease bool) bool {
|
||||
return isRelease
|
||||
case "SHA256":
|
||||
return isRelease
|
||||
case "SHA512":
|
||||
return isRelease
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -34,6 +34,12 @@ func CollectPackageFiles(locations []string, reporter aptly.ResultReporter) (pac
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
if err2 != nil {
|
||||
reporter.Warning("Unable to process %s: %s", location, err2)
|
||||
failedFiles = append(failedFiles, location)
|
||||
continue
|
||||
}
|
||||
} else {
|
||||
if strings.HasSuffix(info.Name(), ".deb") || strings.HasSuffix(info.Name(), ".udeb") ||
|
||||
strings.HasSuffix(info.Name(), ".dsc") || strings.HasSuffix(info.Name(), ".ddeb") {
|
||||
|
||||
+38
-8
@@ -36,6 +36,10 @@ type PackageList struct {
|
||||
packagesIndex []*Package
|
||||
// Map of packages for each virtual package (provides)
|
||||
providesIndex map[string][]*Package
|
||||
// Package key generation function
|
||||
keyFunc func(p *Package) string
|
||||
// Allow duplicates?
|
||||
duplicatesAllowed bool
|
||||
}
|
||||
|
||||
// PackageConflictError means that package can't be added to the list due to error
|
||||
@@ -49,9 +53,35 @@ var (
|
||||
_ PackageCatalog = &PackageList{}
|
||||
)
|
||||
|
||||
// NewPackageList creates empty package list
|
||||
func packageShortKey(p *Package) string {
|
||||
return string(p.ShortKey(""))
|
||||
}
|
||||
|
||||
func packageFullKey(p *Package) string {
|
||||
return string(p.Key(""))
|
||||
}
|
||||
|
||||
// NewPackageList creates empty package list without duplicate package
|
||||
func NewPackageList() *PackageList {
|
||||
return &PackageList{packages: make(map[string]*Package, 1000)}
|
||||
return NewPackageListWithDuplicates(false, 1000)
|
||||
}
|
||||
|
||||
func NewPackageListWithDuplicates(duplicates bool, capacity int) *PackageList {
|
||||
if capacity == 0 {
|
||||
capacity = 1000
|
||||
}
|
||||
|
||||
result := &PackageList{
|
||||
packages: make(map[string]*Package, capacity),
|
||||
duplicatesAllowed: duplicates,
|
||||
keyFunc: packageShortKey,
|
||||
}
|
||||
|
||||
if duplicates {
|
||||
result.keyFunc = packageFullKey
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
// NewPackageListFromRefList loads packages list from PackageRefList
|
||||
@@ -61,7 +91,7 @@ func NewPackageListFromRefList(reflist *PackageRefList, collection *PackageColle
|
||||
return NewPackageList(), nil
|
||||
}
|
||||
|
||||
result := &PackageList{packages: make(map[string]*Package, reflist.Len())}
|
||||
result := NewPackageListWithDuplicates(false, reflist.Len())
|
||||
|
||||
if progress != nil {
|
||||
progress.InitBar(int64(reflist.Len()), false)
|
||||
@@ -91,7 +121,7 @@ func NewPackageListFromRefList(reflist *PackageRefList, collection *PackageColle
|
||||
|
||||
// Add appends package to package list, additionally checking for uniqueness
|
||||
func (l *PackageList) Add(p *Package) error {
|
||||
key := string(p.ShortKey(""))
|
||||
key := l.keyFunc(p)
|
||||
existing, ok := l.packages[key]
|
||||
if ok {
|
||||
if !existing.Equals(p) {
|
||||
@@ -170,7 +200,7 @@ func (l *PackageList) Append(pl *PackageList) error {
|
||||
|
||||
// Remove removes package from the list, and updates index when required
|
||||
func (l *PackageList) Remove(p *Package) {
|
||||
delete(l.packages, string(p.ShortKey("")))
|
||||
delete(l.packages, l.keyFunc(p))
|
||||
if l.indexed {
|
||||
for _, provides := range p.Provides {
|
||||
for i, pkg := range l.providesIndex[provides] {
|
||||
@@ -252,7 +282,7 @@ func depSliceDeduplicate(s []Dependency) []Dependency {
|
||||
|
||||
// VerifyDependencies looks for missing dependencies in package list.
|
||||
//
|
||||
// Analysis would be peformed for each architecture, in specified sources
|
||||
// Analysis would be performed 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)
|
||||
@@ -365,7 +395,7 @@ func (l *PackageList) PrepareIndex() {
|
||||
|
||||
// Scan searches package index using full scan
|
||||
func (l *PackageList) Scan(q PackageQuery) (result *PackageList) {
|
||||
result = NewPackageList()
|
||||
result = NewPackageListWithDuplicates(l.duplicatesAllowed, 0)
|
||||
for _, pkg := range l.packages {
|
||||
if q.Matches(pkg) {
|
||||
result.Add(pkg)
|
||||
@@ -382,7 +412,7 @@ func (l *PackageList) SearchSupported() bool {
|
||||
|
||||
// SearchByKey looks up package by exact key reference
|
||||
func (l *PackageList) SearchByKey(arch, name, version string) (result *PackageList) {
|
||||
result = NewPackageList()
|
||||
result = NewPackageListWithDuplicates(l.duplicatesAllowed, 0)
|
||||
|
||||
pkg := l.packages["P"+arch+" "+name+" "+version]
|
||||
if pkg != nil {
|
||||
|
||||
+19
-12
@@ -76,6 +76,7 @@ func NewPackageFromControlFile(input Stanza) *Package {
|
||||
MD5: strings.TrimSpace(md5),
|
||||
SHA1: strings.TrimSpace(input["SHA1"]),
|
||||
SHA256: strings.TrimSpace(input["SHA256"]),
|
||||
SHA512: strings.TrimSpace(input["SHA512"]),
|
||||
},
|
||||
}})
|
||||
|
||||
@@ -84,6 +85,7 @@ func NewPackageFromControlFile(input Stanza) *Package {
|
||||
delete(input, "MD5Sum")
|
||||
delete(input, "SHA1")
|
||||
delete(input, "SHA256")
|
||||
delete(input, "SHA512")
|
||||
delete(input, "Size")
|
||||
|
||||
depends := &PackageDependencies{}
|
||||
@@ -405,15 +407,7 @@ func (p *Package) Contents(packagePool aptly.PackagePool) []string {
|
||||
return nil
|
||||
}
|
||||
|
||||
if p.contents == nil {
|
||||
if p.collection == nil {
|
||||
panic("contents == nil && collection == nil")
|
||||
}
|
||||
|
||||
p.contents = p.collection.loadContents(p, packagePool)
|
||||
}
|
||||
|
||||
return p.contents
|
||||
return p.collection.loadContents(p, packagePool)
|
||||
}
|
||||
|
||||
// CalculateContents looks up contents in package file
|
||||
@@ -458,7 +452,7 @@ func (p *Package) Stanza() (result Stanza) {
|
||||
}
|
||||
|
||||
if p.IsSource {
|
||||
md5, sha1, sha256 := make([]string, 0), make([]string, 0), make([]string, 0)
|
||||
md5, sha1, sha256, sha512 := []string{}, []string{}, []string{}, []string{}
|
||||
|
||||
for _, f := range p.Files() {
|
||||
if f.Checksums.MD5 != "" {
|
||||
@@ -470,11 +464,21 @@ func (p *Package) Stanza() (result Stanza) {
|
||||
if f.Checksums.SHA256 != "" {
|
||||
sha256 = append(sha256, fmt.Sprintf(" %s %d %s\n", f.Checksums.SHA256, f.Checksums.Size, f.Filename))
|
||||
}
|
||||
if f.Checksums.SHA512 != "" {
|
||||
sha512 = append(sha512, fmt.Sprintf(" %s %d %s\n", f.Checksums.SHA512, f.Checksums.Size, f.Filename))
|
||||
}
|
||||
}
|
||||
|
||||
result["Files"] = strings.Join(md5, "")
|
||||
result["Checksums-Sha1"] = strings.Join(sha1, "")
|
||||
result["Checksums-Sha256"] = strings.Join(sha256, "")
|
||||
if len(sha1) > 0 {
|
||||
result["Checksums-Sha1"] = strings.Join(sha1, "")
|
||||
}
|
||||
if len(sha256) > 0 {
|
||||
result["Checksums-Sha256"] = strings.Join(sha256, "")
|
||||
}
|
||||
if len(sha512) > 0 {
|
||||
result["Checksums-Sha512"] = strings.Join(sha512, "")
|
||||
}
|
||||
} else {
|
||||
f := p.Files()[0]
|
||||
result["Filename"] = f.DownloadURL()
|
||||
@@ -487,6 +491,9 @@ func (p *Package) Stanza() (result Stanza) {
|
||||
if f.Checksums.SHA256 != "" {
|
||||
result["SHA256"] = f.Checksums.SHA256
|
||||
}
|
||||
if f.Checksums.SHA512 != "" {
|
||||
result["SHA512"] = f.Checksums.SHA512
|
||||
}
|
||||
result["Size"] = fmt.Sprintf("%d", f.Checksums.Size)
|
||||
}
|
||||
|
||||
|
||||
@@ -282,7 +282,7 @@ func (collection *PackageCollection) DeleteByKey(key []byte) error {
|
||||
|
||||
// Scan does full scan on all the packages
|
||||
func (collection *PackageCollection) Scan(q PackageQuery) (result *PackageList) {
|
||||
result = NewPackageList()
|
||||
result = NewPackageListWithDuplicates(true, 0)
|
||||
|
||||
for _, key := range collection.db.KeysByPrefix([]byte("P")) {
|
||||
pkg, err := collection.ByKey(key)
|
||||
|
||||
@@ -134,10 +134,16 @@ func (files PackageFiles) ParseSumFields(stanza Stanza) (PackageFiles, error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
files, err = files.parseSumField(stanza["Checksums-Sha256"], func(sum *utils.ChecksumInfo, data string) { sum.SHA256 = data })
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
files, err = files.parseSumField(stanza["Checksums-Sha512"], func(sum *utils.ChecksumInfo, data string) { sum.SHA512 = data })
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return files, nil
|
||||
}
|
||||
|
||||
+7
-1
@@ -290,10 +290,11 @@ func (p *PublishedRepo) MarshalJSON() ([]byte, error) {
|
||||
"SourceKind": p.SourceKind,
|
||||
"Sources": sources,
|
||||
"Storage": p.Storage,
|
||||
"SkipContents": p.SkipContents,
|
||||
})
|
||||
}
|
||||
|
||||
// String returns human-readable represenation of PublishedRepo
|
||||
// String returns human-readable representation of PublishedRepo
|
||||
func (p *PublishedRepo) String() string {
|
||||
var sources = []string{}
|
||||
|
||||
@@ -640,6 +641,9 @@ func (p *PublishedRepo) Publish(packagePool aptly.PackagePool, publishedStorageP
|
||||
|
||||
var bufWriter *bufio.Writer
|
||||
bufWriter, err = indexes.ReleaseIndex(component, arch, udeb).BufWriter()
|
||||
if err != nil {
|
||||
return fmt.Errorf("unable to get ReleaseIndex writer: %s", err)
|
||||
}
|
||||
|
||||
err = release.WriteTo(bufWriter, false, true)
|
||||
if err != nil {
|
||||
@@ -669,6 +673,7 @@ func (p *PublishedRepo) Publish(packagePool aptly.PackagePool, publishedStorageP
|
||||
release["MD5Sum"] = ""
|
||||
release["SHA1"] = ""
|
||||
release["SHA256"] = ""
|
||||
release["SHA512"] = ""
|
||||
|
||||
release["Components"] = strings.Join(p.Components(), " ")
|
||||
|
||||
@@ -676,6 +681,7 @@ func (p *PublishedRepo) Publish(packagePool aptly.PackagePool, publishedStorageP
|
||||
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)
|
||||
release["SHA512"] += fmt.Sprintf(" %s %8d %s\n", info.SHA512, info.Size, path)
|
||||
}
|
||||
|
||||
releaseFile := indexes.ReleaseFile()
|
||||
|
||||
+1
-1
@@ -146,7 +146,7 @@ func (repo *RemoteRepo) IsFlat() bool {
|
||||
return repo.Distribution == "" || (strings.HasPrefix(repo.Distribution, ".") && strings.HasSuffix(repo.Distribution, "/"))
|
||||
}
|
||||
|
||||
// NumPackages return number of packages retrived from remote repo
|
||||
// NumPackages return number of packages retrieved from remote repo
|
||||
func (repo *RemoteRepo) NumPackages() int {
|
||||
if repo.packageRefs == nil {
|
||||
return 0
|
||||
|
||||
@@ -151,7 +151,7 @@ func (pool *PackagePool) Import(path string, hashMD5 string) error {
|
||||
}
|
||||
|
||||
// create subdirs as necessary
|
||||
err = os.MkdirAll(filepath.Dir(poolPath), 0755)
|
||||
err = os.MkdirAll(filepath.Dir(poolPath), 0777)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
+2
-2
@@ -32,7 +32,7 @@ func (storage *PublishedStorage) PublicPath() string {
|
||||
|
||||
// MkDir creates directory recursively under public path
|
||||
func (storage *PublishedStorage) MkDir(path string) error {
|
||||
return os.MkdirAll(filepath.Join(storage.rootPath, path), 0755)
|
||||
return os.MkdirAll(filepath.Join(storage.rootPath, path), 0777)
|
||||
}
|
||||
|
||||
// PutFile puts file into published storage at specified path
|
||||
@@ -87,7 +87,7 @@ func (storage *PublishedStorage) LinkFromPool(publishedDirectory string, sourceP
|
||||
baseName := filepath.Base(sourcePath)
|
||||
poolPath := filepath.Join(storage.rootPath, publishedDirectory)
|
||||
|
||||
err := os.MkdirAll(poolPath, 0755)
|
||||
err := os.MkdirAll(poolPath, 0777)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
+3
-1
@@ -167,7 +167,7 @@ func (downloader *downloaderImpl) handleTask(task *downloadTask) {
|
||||
return
|
||||
}
|
||||
|
||||
err = os.MkdirAll(filepath.Dir(task.destination), 0755)
|
||||
err = os.MkdirAll(filepath.Dir(task.destination), 0777)
|
||||
if err != nil {
|
||||
task.result <- fmt.Errorf("%s: %s", task.url, err)
|
||||
return
|
||||
@@ -209,6 +209,8 @@ func (downloader *downloaderImpl) handleTask(task *downloadTask) {
|
||||
err = fmt.Errorf("%s: sha1 hash mismatch %#v != %#v", task.url, actual.SHA1, task.expected.SHA1)
|
||||
} else if task.expected.SHA256 != "" && actual.SHA256 != task.expected.SHA256 {
|
||||
err = fmt.Errorf("%s: sha256 hash mismatch %#v != %#v", task.url, actual.SHA256, task.expected.SHA256)
|
||||
} else if task.expected.SHA512 != "" && actual.SHA512 != task.expected.SHA512 {
|
||||
err = fmt.Errorf("%s: sha512 hash mismatch %#v != %#v", task.url, actual.SHA512, task.expected.SHA512)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
|
||||
+8
-2
@@ -1,7 +1,7 @@
|
||||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "APTLY" "1" "January 2016" "" ""
|
||||
.TH "APTLY" "1" "March 2016" "" ""
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBaptly\fR \- Debian repository management tool
|
||||
@@ -48,6 +48,7 @@ Configuration file is stored in JSON format (default values shown below):
|
||||
"downloadSourcePackages": false,
|
||||
"ppaDistributorID": "ubuntu",
|
||||
"ppaCodename": "",
|
||||
"skipContentsPublishing": false,
|
||||
"S3PublishEndpoints": {
|
||||
"test": {
|
||||
"region": "us\-east\-1",
|
||||
@@ -60,7 +61,9 @@ Configuration file is stored in JSON format (default values shown below):
|
||||
"storageClass": "",
|
||||
"encryptionMethod": "",
|
||||
"plusWorkaround": false,
|
||||
"disableMultiDel": false
|
||||
"disableMultiDel": false,
|
||||
"forceSigV2": false,
|
||||
"debug": false
|
||||
}
|
||||
},
|
||||
"SwiftPublishEndpoints": {
|
||||
@@ -1818,5 +1821,8 @@ Vincent Bernat (https://github\.com/vincentbernat)
|
||||
.IP "\[ci]" 4
|
||||
x539 (https://github\.com/x539)
|
||||
.
|
||||
.IP "\[ci]" 4
|
||||
Phil Frost (https://github\.com/bitglue)
|
||||
.
|
||||
.IP "" 0
|
||||
|
||||
|
||||
@@ -40,6 +40,7 @@ Configuration file is stored in JSON format (default values shown below):
|
||||
"downloadSourcePackages": false,
|
||||
"ppaDistributorID": "ubuntu",
|
||||
"ppaCodename": "",
|
||||
"skipContentsPublishing": false,
|
||||
"S3PublishEndpoints": {
|
||||
"test": {
|
||||
"region": "us-east-1",
|
||||
@@ -52,7 +53,9 @@ Configuration file is stored in JSON format (default values shown below):
|
||||
"storageClass": "",
|
||||
"encryptionMethod": "",
|
||||
"plusWorkaround": false,
|
||||
"disableMultiDel": false
|
||||
"disableMultiDel": false,
|
||||
"forceSigV2": false,
|
||||
"debug": false
|
||||
}
|
||||
},
|
||||
"SwiftPublishEndpoints": {
|
||||
|
||||
+117
-79
@@ -2,11 +2,15 @@ package s3
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/mitchellh/goamz/aws"
|
||||
"github.com/mitchellh/goamz/s3"
|
||||
"github.com/aws/aws-sdk-go/aws"
|
||||
"github.com/aws/aws-sdk-go/aws/corehandlers"
|
||||
"github.com/aws/aws-sdk-go/aws/credentials"
|
||||
"github.com/aws/aws-sdk-go/aws/request"
|
||||
"github.com/aws/aws-sdk-go/aws/session"
|
||||
"github.com/aws/aws-sdk-go/service/s3"
|
||||
"github.com/smira/aptly/aptly"
|
||||
"github.com/smira/aptly/files"
|
||||
"net/http"
|
||||
"github.com/smira/go-aws-auth"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
@@ -15,8 +19,9 @@ import (
|
||||
// PublishedStorage abstract file system with published files (actually hosted on S3)
|
||||
type PublishedStorage struct {
|
||||
s3 *s3.S3
|
||||
bucket *s3.Bucket
|
||||
acl s3.ACL
|
||||
config *aws.Config
|
||||
bucket string
|
||||
acl string
|
||||
prefix string
|
||||
storageClass string
|
||||
encryptionMethod string
|
||||
@@ -31,8 +36,11 @@ var (
|
||||
)
|
||||
|
||||
// NewPublishedStorageRaw creates published storage from raw aws credentials
|
||||
func NewPublishedStorageRaw(auth aws.Auth, region aws.Region, bucket, defaultACL, prefix,
|
||||
storageClass, encryptionMethod string, plusWorkaround, disabledMultiDel bool) (*PublishedStorage, error) {
|
||||
func NewPublishedStorageRaw(
|
||||
bucket, defaultACL, prefix, storageClass, encryptionMethod string,
|
||||
plusWorkaround, disabledMultiDel bool,
|
||||
config *aws.Config,
|
||||
) (*PublishedStorage, error) {
|
||||
if defaultACL == "" {
|
||||
defaultACL = "private"
|
||||
}
|
||||
@@ -41,9 +49,13 @@ func NewPublishedStorageRaw(auth aws.Auth, region aws.Region, bucket, defaultACL
|
||||
storageClass = ""
|
||||
}
|
||||
|
||||
sess := session.New(config)
|
||||
|
||||
result := &PublishedStorage{
|
||||
s3: s3.New(auth, region),
|
||||
acl: s3.ACL(defaultACL),
|
||||
s3: s3.New(sess),
|
||||
bucket: bucket,
|
||||
config: config,
|
||||
acl: defaultACL,
|
||||
prefix: prefix,
|
||||
storageClass: storageClass,
|
||||
encryptionMethod: encryptionMethod,
|
||||
@@ -51,48 +63,56 @@ func NewPublishedStorageRaw(auth aws.Auth, region aws.Region, bucket, defaultACL
|
||||
disableMultiDel: disabledMultiDel,
|
||||
}
|
||||
|
||||
result.s3.HTTPClient = func() *http.Client {
|
||||
return RetryingClient
|
||||
}
|
||||
result.bucket = result.s3.Bucket(bucket)
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
// NewPublishedStorage creates new instance of PublishedStorage with specified S3 access
|
||||
// keys, region and bucket name
|
||||
func NewPublishedStorage(accessKey, secretKey, region, endpoint, bucket, defaultACL, prefix,
|
||||
storageClass, encryptionMethod string, plusWorkaround, disableMultiDel bool) (*PublishedStorage, error) {
|
||||
auth, err := aws.GetAuth(accessKey, secretKey)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
func NewPublishedStorage(accessKey, secretKey, sessionToken, region, endpoint, bucket, defaultACL, prefix,
|
||||
storageClass, encryptionMethod string, plusWorkaround, disableMultiDel, forceSigV2, debug bool) (*PublishedStorage, error) {
|
||||
|
||||
config := &aws.Config{
|
||||
Region: aws.String(region),
|
||||
}
|
||||
|
||||
var awsRegion aws.Region
|
||||
|
||||
if endpoint == "" {
|
||||
var ok bool
|
||||
|
||||
awsRegion, ok = aws.Regions[region]
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("unknown region: %#v", region)
|
||||
}
|
||||
} else {
|
||||
awsRegion = aws.Region{
|
||||
Name: region,
|
||||
S3Endpoint: endpoint,
|
||||
S3LocationConstraint: true,
|
||||
S3LowercaseBucket: true,
|
||||
}
|
||||
if endpoint != "" {
|
||||
config = config.WithEndpoint(endpoint).WithS3ForcePathStyle(true)
|
||||
}
|
||||
|
||||
return NewPublishedStorageRaw(auth, awsRegion, bucket, defaultACL, prefix, storageClass, encryptionMethod,
|
||||
plusWorkaround, disableMultiDel)
|
||||
if accessKey != "" {
|
||||
config.Credentials = credentials.NewStaticCredentials(accessKey, secretKey, sessionToken)
|
||||
}
|
||||
|
||||
if debug {
|
||||
config = config.WithLogLevel(aws.LogDebug)
|
||||
}
|
||||
|
||||
result, err := NewPublishedStorageRaw(bucket, defaultACL, prefix, storageClass,
|
||||
encryptionMethod, plusWorkaround, disableMultiDel, config)
|
||||
|
||||
if err == nil && forceSigV2 {
|
||||
creds := []awsauth.Credentials{}
|
||||
|
||||
if accessKey != "" {
|
||||
creds = append(creds, awsauth.Credentials{
|
||||
AccessKeyID: accessKey,
|
||||
SecretAccessKey: secretKey,
|
||||
})
|
||||
}
|
||||
|
||||
result.s3.Handlers.Sign.Clear()
|
||||
result.s3.Handlers.Sign.PushBackNamed(corehandlers.BuildContentLengthHandler)
|
||||
result.s3.Handlers.Sign.PushBack(func(req *request.Request) {
|
||||
awsauth.SignS3(req.HTTPRequest, creds...)
|
||||
})
|
||||
}
|
||||
|
||||
return result, err
|
||||
}
|
||||
|
||||
// String
|
||||
func (storage *PublishedStorage) String() string {
|
||||
return fmt.Sprintf("S3: %s:%s/%s", storage.s3.Region.Name, storage.bucket.Name, storage.prefix)
|
||||
return fmt.Sprintf("S3: %s:%s/%s", *storage.config.Region, storage.bucket, storage.prefix)
|
||||
}
|
||||
|
||||
// MkDir creates directory recursively under public path
|
||||
@@ -106,7 +126,6 @@ func (storage *PublishedStorage) PutFile(path string, sourceFilename string) err
|
||||
var (
|
||||
source *os.File
|
||||
err error
|
||||
fi os.FileInfo
|
||||
)
|
||||
source, err = os.Open(sourceFilename)
|
||||
if err != nil {
|
||||
@@ -114,22 +133,20 @@ func (storage *PublishedStorage) PutFile(path string, sourceFilename string) err
|
||||
}
|
||||
defer source.Close()
|
||||
|
||||
fi, err = source.Stat()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
headers := map[string][]string{
|
||||
"Content-Type": {"binary/octet-stream"},
|
||||
params := &s3.PutObjectInput{
|
||||
Bucket: aws.String(storage.bucket),
|
||||
Key: aws.String(filepath.Join(storage.prefix, path)),
|
||||
Body: source,
|
||||
ACL: aws.String(storage.acl),
|
||||
}
|
||||
if storage.storageClass != "" {
|
||||
headers["x-amz-storage-class"] = []string{storage.storageClass}
|
||||
params.StorageClass = aws.String(storage.storageClass)
|
||||
}
|
||||
if storage.encryptionMethod != "" {
|
||||
headers["x-amz-server-side-encryption"] = []string{storage.encryptionMethod}
|
||||
params.ServerSideEncryption = aws.String(storage.encryptionMethod)
|
||||
}
|
||||
|
||||
err = storage.bucket.PutReaderHeader(filepath.Join(storage.prefix, path), source, fi.Size(), headers, storage.acl)
|
||||
_, err = storage.s3.PutObject(params)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error uploading %s to %s: %s", sourceFilename, storage, err)
|
||||
}
|
||||
@@ -142,7 +159,11 @@ func (storage *PublishedStorage) PutFile(path string, sourceFilename string) err
|
||||
|
||||
// Remove removes single file under public path
|
||||
func (storage *PublishedStorage) Remove(path string) error {
|
||||
err := storage.bucket.Del(filepath.Join(storage.prefix, path))
|
||||
params := &s3.DeleteObjectInput{
|
||||
Bucket: aws.String(storage.bucket),
|
||||
Key: aws.String(path),
|
||||
}
|
||||
_, err := storage.s3.DeleteObject(params)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error deleting %s from %s: %s", path, storage, err)
|
||||
}
|
||||
@@ -165,7 +186,11 @@ func (storage *PublishedStorage) RemoveDirs(path string, progress aptly.Progress
|
||||
|
||||
if storage.disableMultiDel {
|
||||
for i := range filelist {
|
||||
err = storage.bucket.Del(filepath.Join(storage.prefix, path, filelist[i]))
|
||||
params := &s3.DeleteObjectInput{
|
||||
Bucket: aws.String(storage.bucket),
|
||||
Key: aws.String(filepath.Join(storage.prefix, path, filelist[i])),
|
||||
}
|
||||
_, err := storage.s3.DeleteObject(params)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error deleting path %s from %s: %s", filelist[i], storage, err)
|
||||
}
|
||||
@@ -180,13 +205,23 @@ func (storage *PublishedStorage) RemoveDirs(path string, progress aptly.Progress
|
||||
} else {
|
||||
part = filelist[i*page : (i+1)*page]
|
||||
}
|
||||
paths := make([]string, len(part))
|
||||
paths := make([]*s3.ObjectIdentifier, len(part))
|
||||
|
||||
for i := range part {
|
||||
paths[i] = filepath.Join(storage.prefix, path, part[i])
|
||||
paths[i] = &s3.ObjectIdentifier{
|
||||
Key: aws.String(filepath.Join(storage.prefix, path, part[i])),
|
||||
}
|
||||
}
|
||||
|
||||
err = storage.bucket.MultiDel(paths)
|
||||
params := &s3.DeleteObjectsInput{
|
||||
Bucket: aws.String(storage.bucket),
|
||||
Delete: &s3.Delete{
|
||||
Objects: paths,
|
||||
Quiet: aws.Bool(true),
|
||||
},
|
||||
}
|
||||
|
||||
_, err := storage.s3.DeleteObjects(params)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error deleting multiple paths from %s: %s", storage, err)
|
||||
}
|
||||
@@ -259,44 +294,38 @@ func (storage *PublishedStorage) Filelist(prefix string) ([]string, error) {
|
||||
func (storage *PublishedStorage) internalFilelist(prefix string, hidePlusWorkaround bool) (paths []string, md5s []string, err error) {
|
||||
paths = make([]string, 0, 1024)
|
||||
md5s = make([]string, 0, 1024)
|
||||
marker := ""
|
||||
prefix = filepath.Join(storage.prefix, prefix)
|
||||
if prefix != "" {
|
||||
prefix += "/"
|
||||
}
|
||||
for {
|
||||
contents, err := storage.bucket.List(prefix, "", marker, 1000)
|
||||
if err != nil {
|
||||
return nil, nil, fmt.Errorf("error listing under prefix %s in %s: %s", prefix, storage, err)
|
||||
}
|
||||
lastKey := ""
|
||||
|
||||
params := &s3.ListObjectsInput{
|
||||
Bucket: aws.String(storage.bucket),
|
||||
Prefix: aws.String(prefix),
|
||||
MaxKeys: aws.Int64(1000),
|
||||
}
|
||||
|
||||
err = storage.s3.ListObjectsPages(params, func(contents *s3.ListObjectsOutput, lastPage bool) bool {
|
||||
for _, key := range contents.Contents {
|
||||
lastKey = key.Key
|
||||
if storage.plusWorkaround && hidePlusWorkaround && strings.Index(lastKey, " ") != -1 {
|
||||
if storage.plusWorkaround && hidePlusWorkaround && strings.Index(*key.Key, " ") != -1 {
|
||||
// if we use plusWorkaround, we want to hide those duplicates
|
||||
/// from listing
|
||||
continue
|
||||
}
|
||||
|
||||
if prefix == "" {
|
||||
paths = append(paths, key.Key)
|
||||
paths = append(paths, *key.Key)
|
||||
} else {
|
||||
paths = append(paths, key.Key[len(prefix):])
|
||||
paths = append(paths, (*key.Key)[len(prefix):])
|
||||
}
|
||||
md5s = append(md5s, strings.Replace(key.ETag, "\"", "", -1))
|
||||
}
|
||||
if contents.IsTruncated {
|
||||
marker = contents.NextMarker
|
||||
if marker == "" {
|
||||
// From the s3 docs: If response does not include the
|
||||
// NextMarker and it is truncated, you can use the value of the
|
||||
// last Key in the response as the marker in the subsequent
|
||||
// request to get the next set of object keys.
|
||||
marker = lastKey
|
||||
}
|
||||
} else {
|
||||
break
|
||||
md5s = append(md5s, strings.Replace(*key.ETag, "\"", "", -1))
|
||||
}
|
||||
|
||||
return true
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return nil, nil, fmt.Errorf("error listing under prefix %s in %s: %s", prefix, storage, err)
|
||||
}
|
||||
|
||||
return paths, md5s, nil
|
||||
@@ -304,7 +333,16 @@ func (storage *PublishedStorage) internalFilelist(prefix string, hidePlusWorkaro
|
||||
|
||||
// RenameFile renames (moves) file
|
||||
func (storage *PublishedStorage) RenameFile(oldName, newName string) error {
|
||||
err := storage.bucket.Copy(filepath.Join(storage.prefix, oldName), filepath.Join(storage.prefix, newName), storage.acl)
|
||||
source := fmt.Sprintf("/%s/%s", storage.bucket, filepath.Join(storage.prefix, oldName))
|
||||
|
||||
params := &s3.CopyObjectInput{
|
||||
Bucket: aws.String(storage.bucket),
|
||||
CopySource: aws.String(source),
|
||||
Key: aws.String(filepath.Join(storage.prefix, newName)),
|
||||
ACL: aws.String(storage.acl),
|
||||
}
|
||||
|
||||
_, err := storage.s3.CopyObject(params)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error copying %s -> %s in %s: %s", oldName, newName, storage, err)
|
||||
}
|
||||
|
||||
+66
-68
@@ -1,18 +1,21 @@
|
||||
package s3
|
||||
|
||||
import (
|
||||
"github.com/mitchellh/goamz/aws"
|
||||
"github.com/mitchellh/goamz/s3/s3test"
|
||||
"github.com/smira/aptly/files"
|
||||
"bytes"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
. "gopkg.in/check.v1"
|
||||
|
||||
"github.com/aws/aws-sdk-go/aws"
|
||||
"github.com/aws/aws-sdk-go/service/s3"
|
||||
|
||||
"github.com/smira/aptly/files"
|
||||
)
|
||||
|
||||
type PublishedStorageSuite struct {
|
||||
srv *s3test.Server
|
||||
srv *Server
|
||||
storage, prefixedStorage *PublishedStorage
|
||||
}
|
||||
|
||||
@@ -20,18 +23,16 @@ var _ = Suite(&PublishedStorageSuite{})
|
||||
|
||||
func (s *PublishedStorageSuite) SetUpTest(c *C) {
|
||||
var err error
|
||||
s.srv, err = s3test.NewServer(&s3test.Config{})
|
||||
s.srv, err = NewServer(&Config{})
|
||||
c.Assert(err, IsNil)
|
||||
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", "", "", "", "", false, true)
|
||||
s.storage, err = NewPublishedStorage("aa", "bb", "", "test-1", s.srv.URL(), "test", "", "", "", "", false, true, false, false)
|
||||
c.Assert(err, IsNil)
|
||||
s.prefixedStorage, err = NewPublishedStorage("aa", "bb", "", "test-1", s.srv.URL(), "test", "", "lala", "", "", false, true, false, false)
|
||||
c.Assert(err, IsNil)
|
||||
|
||||
s.prefixedStorage, err = NewPublishedStorageRaw(auth, aws.Region{Name: "test-1", S3Endpoint: s.srv.URL(), S3LocationConstraint: true}, "test", "", "lala", "", "", false, true)
|
||||
c.Assert(err, IsNil)
|
||||
|
||||
err = s.storage.s3.Bucket("test").PutBucket("private")
|
||||
_, err = s.storage.s3.CreateBucket(&s3.CreateBucketInput{Bucket: aws.String("test")})
|
||||
c.Assert(err, IsNil)
|
||||
}
|
||||
|
||||
@@ -39,10 +40,37 @@ func (s *PublishedStorageSuite) TearDownTest(c *C) {
|
||||
s.srv.Quit()
|
||||
}
|
||||
|
||||
func (s *PublishedStorageSuite) TestNewPublishedStorage(c *C) {
|
||||
stor, err := NewPublishedStorage("aa", "bbb", "", "", "", "", "", "", "", false, false)
|
||||
c.Check(stor, IsNil)
|
||||
c.Check(err, ErrorMatches, "unknown region: .*")
|
||||
func (s *PublishedStorageSuite) GetFile(c *C, path string) []byte {
|
||||
resp, err := s.storage.s3.GetObject(&s3.GetObjectInput{
|
||||
Bucket: aws.String(s.storage.bucket),
|
||||
Key: aws.String(path),
|
||||
})
|
||||
c.Assert(err, IsNil)
|
||||
|
||||
body, err := ioutil.ReadAll(resp.Body)
|
||||
resp.Body.Close()
|
||||
c.Assert(err, IsNil)
|
||||
|
||||
return body
|
||||
}
|
||||
|
||||
func (s *PublishedStorageSuite) AssertNoFile(c *C, path string) {
|
||||
_, err := s.storage.s3.HeadObject(&s3.HeadObjectInput{
|
||||
Bucket: aws.String(s.storage.bucket),
|
||||
Key: aws.String(path),
|
||||
})
|
||||
c.Assert(err, ErrorMatches, ".*\n.*status code: 404.*")
|
||||
}
|
||||
|
||||
func (s *PublishedStorageSuite) PutFile(c *C, path string, data []byte) {
|
||||
_, err := s.storage.s3.PutObject(&s3.PutObjectInput{
|
||||
Bucket: aws.String(s.storage.bucket),
|
||||
Key: aws.String(path),
|
||||
Body: bytes.NewReader(data),
|
||||
ContentType: aws.String("binary/octet-stream"),
|
||||
ACL: aws.String("private"),
|
||||
})
|
||||
c.Assert(err, IsNil)
|
||||
}
|
||||
|
||||
func (s *PublishedStorageSuite) TestPutFile(c *C) {
|
||||
@@ -53,16 +81,12 @@ func (s *PublishedStorageSuite) TestPutFile(c *C) {
|
||||
err = s.storage.PutFile("a/b.txt", filepath.Join(dir, "a"))
|
||||
c.Check(err, IsNil)
|
||||
|
||||
data, err := s.storage.bucket.Get("a/b.txt")
|
||||
c.Check(err, IsNil)
|
||||
c.Check(data, DeepEquals, []byte("welcome to s3!"))
|
||||
c.Check(s.GetFile(c, "a/b.txt"), DeepEquals, []byte("welcome to s3!"))
|
||||
|
||||
err = s.prefixedStorage.PutFile("a/b.txt", filepath.Join(dir, "a"))
|
||||
c.Check(err, IsNil)
|
||||
|
||||
data, err = s.storage.bucket.Get("lala/a/b.txt")
|
||||
c.Check(err, IsNil)
|
||||
c.Check(data, DeepEquals, []byte("welcome to s3!"))
|
||||
c.Check(s.GetFile(c, "lala/a/b.txt"), DeepEquals, []byte("welcome to s3!"))
|
||||
}
|
||||
|
||||
func (s *PublishedStorageSuite) TestPutFilePlusWorkaround(c *C) {
|
||||
@@ -75,20 +99,15 @@ func (s *PublishedStorageSuite) TestPutFilePlusWorkaround(c *C) {
|
||||
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!"))
|
||||
c.Check(s.GetFile(c, "a/b+c.txt"), 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!"))
|
||||
c.Check(s.GetFile(c, "a/b c.txt"), 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 {
|
||||
err := s.storage.bucket.Put(path, []byte("test"), "binary/octet-stream", "private")
|
||||
c.Check(err, IsNil)
|
||||
s.PutFile(c, path, []byte("test"))
|
||||
}
|
||||
|
||||
list, err := s.storage.Filelist("")
|
||||
@@ -114,8 +133,7 @@ func (s *PublishedStorageSuite) TestFilelistPlusWorkaround(c *C) {
|
||||
|
||||
paths := []string{"a", "b", "c", "testa", "test/a+1", "test/a 1", "lala/a+b", "lala/a b", "lala/c"}
|
||||
for _, path := range paths {
|
||||
err := s.storage.bucket.Put(path, []byte("test"), "binary/octet-stream", "private")
|
||||
c.Check(err, IsNil)
|
||||
s.PutFile(c, path, []byte("test"))
|
||||
}
|
||||
|
||||
list, err := s.storage.Filelist("")
|
||||
@@ -136,40 +154,30 @@ func (s *PublishedStorageSuite) TestFilelistPlusWorkaround(c *C) {
|
||||
}
|
||||
|
||||
func (s *PublishedStorageSuite) TestRemove(c *C) {
|
||||
err := s.storage.bucket.Put("a/b", []byte("test"), "binary/octet-stream", "private")
|
||||
s.PutFile(c, "a/b", []byte("test"))
|
||||
|
||||
err := s.storage.Remove("a/b")
|
||||
c.Check(err, IsNil)
|
||||
|
||||
err = s.storage.Remove("a/b")
|
||||
c.Check(err, IsNil)
|
||||
|
||||
_, err = s.storage.bucket.Get("a/b")
|
||||
c.Check(err, ErrorMatches, "The specified key does not exist.")
|
||||
s.AssertNoFile(c, "a/b")
|
||||
}
|
||||
|
||||
func (s *PublishedStorageSuite) TestRemovePlusWorkaround(c *C) {
|
||||
s.storage.plusWorkaround = true
|
||||
|
||||
err := s.storage.bucket.Put("a/b+c", []byte("test"), "binary/octet-stream", "private")
|
||||
s.PutFile(c, "a/b+c", []byte("test"))
|
||||
s.PutFile(c, "a/b", []byte("test"))
|
||||
|
||||
err := s.storage.Remove("a/b+c")
|
||||
c.Check(err, IsNil)
|
||||
|
||||
err = s.storage.bucket.Put("a/b", []byte("test"), "binary/octet-stream", "private")
|
||||
c.Check(err, IsNil)
|
||||
|
||||
err = s.storage.Remove("a/b+c")
|
||||
c.Check(err, IsNil)
|
||||
|
||||
_, err = s.storage.bucket.Get("a/b+c")
|
||||
c.Check(err, ErrorMatches, "The specified key does not exist.")
|
||||
|
||||
_, err = s.storage.bucket.Get("a/b c")
|
||||
c.Check(err, ErrorMatches, "The specified key does not exist.")
|
||||
s.AssertNoFile(c, "a/b+c")
|
||||
s.AssertNoFile(c, "a/b c")
|
||||
|
||||
err = s.storage.Remove("a/b")
|
||||
c.Check(err, IsNil)
|
||||
|
||||
_, err = s.storage.bucket.Get("a/b")
|
||||
c.Check(err, ErrorMatches, "The specified key does not exist.")
|
||||
|
||||
s.AssertNoFile(c, "a/b")
|
||||
}
|
||||
|
||||
func (s *PublishedStorageSuite) TestRemoveDirs(c *C) {
|
||||
@@ -177,8 +185,7 @@ func (s *PublishedStorageSuite) TestRemoveDirs(c *C) {
|
||||
|
||||
paths := []string{"a", "b", "c", "testa", "test/a+1", "test/a 1", "lala/a+b", "lala/a b", "lala/c"}
|
||||
for _, path := range paths {
|
||||
err := s.storage.bucket.Put(path, []byte("test"), "binary/octet-stream", "private")
|
||||
c.Check(err, IsNil)
|
||||
s.PutFile(c, path, []byte("test"))
|
||||
}
|
||||
|
||||
err := s.storage.RemoveDirs("test", nil)
|
||||
@@ -192,8 +199,7 @@ func (s *PublishedStorageSuite) TestRemoveDirs(c *C) {
|
||||
func (s *PublishedStorageSuite) TestRemoveDirsPlusWorkaround(c *C) {
|
||||
paths := []string{"a", "b", "c", "testa", "test/a", "test/b", "lala/a", "lala/b", "lala/c"}
|
||||
for _, path := range paths {
|
||||
err := s.storage.bucket.Put(path, []byte("test"), "binary/octet-stream", "private")
|
||||
c.Check(err, IsNil)
|
||||
s.PutFile(c, path, []byte("test"))
|
||||
}
|
||||
|
||||
err := s.storage.RemoveDirs("test", nil)
|
||||
@@ -230,31 +236,23 @@ func (s *PublishedStorageSuite) TestLinkFromPool(c *C) {
|
||||
err = s.storage.LinkFromPool(filepath.Join("", "pool", "main", "m/mars-invaders"), pool, sourcePath, "c1df1da7a1ce305a3b60af9d5733ac1d", false)
|
||||
c.Check(err, IsNil)
|
||||
|
||||
data, err := s.storage.bucket.Get("pool/main/m/mars-invaders/mars-invaders_1.03.deb")
|
||||
c.Check(err, IsNil)
|
||||
c.Check(data, DeepEquals, []byte("Contents"))
|
||||
c.Check(s.GetFile(c, "pool/main/m/mars-invaders/mars-invaders_1.03.deb"), DeepEquals, []byte("Contents"))
|
||||
|
||||
// duplicate link from pool
|
||||
err = s.storage.LinkFromPool(filepath.Join("", "pool", "main", "m/mars-invaders"), pool, sourcePath, "c1df1da7a1ce305a3b60af9d5733ac1d", false)
|
||||
c.Check(err, IsNil)
|
||||
|
||||
data, err = s.storage.bucket.Get("pool/main/m/mars-invaders/mars-invaders_1.03.deb")
|
||||
c.Check(err, IsNil)
|
||||
c.Check(data, DeepEquals, []byte("Contents"))
|
||||
c.Check(s.GetFile(c, "pool/main/m/mars-invaders/mars-invaders_1.03.deb"), DeepEquals, []byte("Contents"))
|
||||
|
||||
// link from pool with conflict
|
||||
err = s.storage.LinkFromPool(filepath.Join("", "pool", "main", "m/mars-invaders"), pool, sourcePath2, "e9dfd31cc505d51fc26975250750deab", false)
|
||||
c.Check(err, ErrorMatches, ".*file already exists and is different.*")
|
||||
|
||||
data, err = s.storage.bucket.Get("pool/main/m/mars-invaders/mars-invaders_1.03.deb")
|
||||
c.Check(err, IsNil)
|
||||
c.Check(data, DeepEquals, []byte("Contents"))
|
||||
c.Check(s.GetFile(c, "pool/main/m/mars-invaders/mars-invaders_1.03.deb"), DeepEquals, []byte("Contents"))
|
||||
|
||||
// link from pool with conflict and force
|
||||
err = s.storage.LinkFromPool(filepath.Join("", "pool", "main", "m/mars-invaders"), pool, sourcePath2, "e9dfd31cc505d51fc26975250750deab", true)
|
||||
c.Check(err, IsNil)
|
||||
|
||||
data, err = s.storage.bucket.Get("pool/main/m/mars-invaders/mars-invaders_1.03.deb")
|
||||
c.Check(err, IsNil)
|
||||
c.Check(data, DeepEquals, []byte("Spam"))
|
||||
c.Check(s.GetFile(c, "pool/main/m/mars-invaders/mars-invaders_1.03.deb"), DeepEquals, []byte("Spam"))
|
||||
}
|
||||
|
||||
-121
@@ -1,121 +0,0 @@
|
||||
package s3
|
||||
|
||||
// This was taken from github.com/mitchellh/goamz/amz/client.go:
|
||||
|
||||
import (
|
||||
"math"
|
||||
"net"
|
||||
"net/http"
|
||||
"time"
|
||||
)
|
||||
|
||||
type RetryableFunc func(*http.Request, *http.Response, error) bool
|
||||
type WaitFunc func(try int)
|
||||
type DeadlineFunc func() time.Time
|
||||
|
||||
type ResilientTransport struct {
|
||||
// Timeout is the maximum amount of time a dial will wait for
|
||||
// a connect to complete.
|
||||
//
|
||||
// The default is no timeout.
|
||||
//
|
||||
// With or without a timeout, the operating system may impose
|
||||
// its own earlier timeout. For instance, TCP timeouts are
|
||||
// often around 3 minutes.
|
||||
DialTimeout time.Duration
|
||||
|
||||
// MaxTries, if non-zero, specifies the number of times we will retry on
|
||||
// failure. Retries are only attempted for temporary network errors or known
|
||||
// safe failures.
|
||||
MaxTries int
|
||||
ShouldRetry RetryableFunc
|
||||
Wait WaitFunc
|
||||
transport *http.Transport
|
||||
}
|
||||
|
||||
// Convenience method for creating an http client
|
||||
func NewClient(rt *ResilientTransport) *http.Client {
|
||||
rt.transport = &http.Transport{
|
||||
Dial: func(netw, addr string) (net.Conn, error) {
|
||||
c, err := net.DialTimeout(netw, addr, rt.DialTimeout)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return c, nil
|
||||
},
|
||||
DisableKeepAlives: true,
|
||||
Proxy: http.ProxyFromEnvironment,
|
||||
}
|
||||
// TODO: Would be nice is ResilientTransport allowed clients to initialize
|
||||
// with http.Transport attributes.
|
||||
return &http.Client{
|
||||
Transport: rt,
|
||||
}
|
||||
}
|
||||
|
||||
var retryingTransport = &ResilientTransport{
|
||||
DialTimeout: 15 * time.Second,
|
||||
MaxTries: 3,
|
||||
ShouldRetry: awsRetry,
|
||||
Wait: ExpBackoff,
|
||||
}
|
||||
|
||||
// Exported default client
|
||||
var RetryingClient = NewClient(retryingTransport)
|
||||
|
||||
func (t *ResilientTransport) RoundTrip(req *http.Request) (*http.Response, error) {
|
||||
return t.tries(req)
|
||||
}
|
||||
|
||||
// Retry a request a maximum of t.MaxTries times.
|
||||
// We'll only retry if the proper criteria are met.
|
||||
// If a wait function is specified, wait that amount of time
|
||||
// In between requests.
|
||||
func (t *ResilientTransport) tries(req *http.Request) (res *http.Response, err error) {
|
||||
for try := 0; try < t.MaxTries; try += 1 {
|
||||
res, err = t.transport.RoundTrip(req)
|
||||
|
||||
if !t.ShouldRetry(req, res, err) {
|
||||
break
|
||||
}
|
||||
if try == (t.MaxTries - 1) {
|
||||
break
|
||||
}
|
||||
if res != nil {
|
||||
res.Body.Close()
|
||||
}
|
||||
if t.Wait != nil {
|
||||
t.Wait(try)
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func ExpBackoff(try int) {
|
||||
time.Sleep(100 * time.Millisecond *
|
||||
time.Duration(math.Exp2(float64(try))))
|
||||
}
|
||||
|
||||
// Decide if we should retry a request.
|
||||
// In general, the criteria for retrying a request is described here
|
||||
// http://docs.aws.amazon.com/general/latest/gr/api-retries.html
|
||||
func awsRetry(req *http.Request, res *http.Response, err error) bool {
|
||||
retry := false
|
||||
|
||||
// Retry if there's a temporary network error.
|
||||
if neterr, ok := err.(net.Error); ok {
|
||||
if neterr.Temporary() {
|
||||
retry = true
|
||||
}
|
||||
}
|
||||
|
||||
// Retry if we get a 5xx series error.
|
||||
if res != nil {
|
||||
if res.StatusCode >= 500 && res.StatusCode < 600 {
|
||||
retry = true
|
||||
}
|
||||
}
|
||||
|
||||
return retry
|
||||
}
|
||||
@@ -0,0 +1,699 @@
|
||||
package s3
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/md5"
|
||||
"encoding/hex"
|
||||
"encoding/xml"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"net"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"regexp"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
const debug = true
|
||||
|
||||
type s3Error struct {
|
||||
statusCode int
|
||||
XMLName struct{} `xml:"Error"`
|
||||
Code string
|
||||
Message string
|
||||
BucketName string
|
||||
RequestId string
|
||||
HostId string
|
||||
}
|
||||
|
||||
type action struct {
|
||||
srv *Server
|
||||
w http.ResponseWriter
|
||||
req *http.Request
|
||||
reqId string
|
||||
}
|
||||
|
||||
// Config controls the internal behaviour of the Server. A nil config is the default
|
||||
// and behaves as if all configurations assume their default behaviour. Once passed
|
||||
// to NewServer, the configuration must not be modified.
|
||||
type Config struct {
|
||||
// Send409Conflict controls how the Server will respond to calls to PUT on a
|
||||
// previously existing bucket. The default is false, and corresponds to the
|
||||
// us-east-1 s3 enpoint. Setting this value to true emulates the behaviour of
|
||||
// all other regions.
|
||||
// http://docs.amazonwebservices.com/AmazonS3/latest/API/ErrorResponses.html
|
||||
Send409Conflict bool
|
||||
}
|
||||
|
||||
func (c *Config) send409Conflict() bool {
|
||||
if c != nil {
|
||||
return c.Send409Conflict
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// Server is a fake S3 server for testing purposes.
|
||||
// All of the data for the server is kept in memory.
|
||||
type Server struct {
|
||||
url string
|
||||
reqId int
|
||||
listener net.Listener
|
||||
mu sync.Mutex
|
||||
buckets map[string]*bucket
|
||||
config *Config
|
||||
}
|
||||
|
||||
type bucket struct {
|
||||
name string
|
||||
acl string
|
||||
ctime time.Time
|
||||
objects map[string]*object
|
||||
}
|
||||
|
||||
type object struct {
|
||||
name string
|
||||
mtime time.Time
|
||||
meta http.Header // metadata to return with requests.
|
||||
checksum []byte // also held as Content-MD5 in meta.
|
||||
data []byte
|
||||
}
|
||||
|
||||
// A resource encapsulates the subject of an HTTP request.
|
||||
// The resource referred to may or may not exist
|
||||
// when the request is made.
|
||||
type resource interface {
|
||||
put(a *action) interface{}
|
||||
get(a *action) interface{}
|
||||
post(a *action) interface{}
|
||||
delete(a *action) interface{}
|
||||
}
|
||||
|
||||
func NewServer(config *Config) (*Server, error) {
|
||||
l, err := net.Listen("tcp", "localhost:0")
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("cannot listen on localhost: %v", err)
|
||||
}
|
||||
srv := &Server{
|
||||
listener: l,
|
||||
url: "http://" + l.Addr().String(),
|
||||
buckets: make(map[string]*bucket),
|
||||
config: config,
|
||||
}
|
||||
go http.Serve(l, http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
|
||||
srv.serveHTTP(w, req)
|
||||
}))
|
||||
return srv, nil
|
||||
}
|
||||
|
||||
// Quit closes down the server.
|
||||
func (srv *Server) Quit() {
|
||||
srv.listener.Close()
|
||||
}
|
||||
|
||||
// URL returns a URL for the server.
|
||||
func (srv *Server) URL() string {
|
||||
return srv.url
|
||||
}
|
||||
|
||||
func fatalError(code int, codeStr string, errf string, a ...interface{}) {
|
||||
panic(&s3Error{
|
||||
statusCode: code,
|
||||
Code: codeStr,
|
||||
Message: fmt.Sprintf(errf, a...),
|
||||
})
|
||||
}
|
||||
|
||||
// serveHTTP serves the S3 protocol.
|
||||
func (srv *Server) serveHTTP(w http.ResponseWriter, req *http.Request) {
|
||||
// ignore error from ParseForm as it's usually spurious.
|
||||
req.ParseForm()
|
||||
|
||||
srv.mu.Lock()
|
||||
defer srv.mu.Unlock()
|
||||
|
||||
if debug {
|
||||
log.Printf("s3test %q %q", req.Method, req.URL)
|
||||
}
|
||||
a := &action{
|
||||
srv: srv,
|
||||
w: w,
|
||||
req: req,
|
||||
reqId: fmt.Sprintf("%09X", srv.reqId),
|
||||
}
|
||||
srv.reqId++
|
||||
|
||||
var r resource
|
||||
defer func() {
|
||||
switch err := recover().(type) {
|
||||
case *s3Error:
|
||||
switch r := r.(type) {
|
||||
case objectResource:
|
||||
err.BucketName = r.bucket.name
|
||||
case bucketResource:
|
||||
err.BucketName = r.name
|
||||
}
|
||||
err.RequestId = a.reqId
|
||||
// TODO HostId
|
||||
w.Header().Set("Content-Type", `xml version="1.0" encoding="UTF-8"`)
|
||||
w.WriteHeader(err.statusCode)
|
||||
xmlMarshal(w, err)
|
||||
case nil:
|
||||
default:
|
||||
panic(err)
|
||||
}
|
||||
}()
|
||||
|
||||
r = srv.resourceForURL(req.URL)
|
||||
|
||||
var resp interface{}
|
||||
switch req.Method {
|
||||
case "PUT":
|
||||
resp = r.put(a)
|
||||
case "GET", "HEAD":
|
||||
resp = r.get(a)
|
||||
case "DELETE":
|
||||
resp = r.delete(a)
|
||||
case "POST":
|
||||
resp = r.post(a)
|
||||
default:
|
||||
fatalError(400, "MethodNotAllowed", "unknown http request method %q", req.Method)
|
||||
}
|
||||
if resp != nil && req.Method != "HEAD" {
|
||||
xmlMarshal(w, resp)
|
||||
}
|
||||
}
|
||||
|
||||
// xmlMarshal is the same as xml.Marshal except that
|
||||
// it panics on error. The marshalling should not fail,
|
||||
// but we want to know if it does.
|
||||
func xmlMarshal(w io.Writer, x interface{}) {
|
||||
if err := xml.NewEncoder(w).Encode(x); err != nil {
|
||||
panic(fmt.Errorf("error marshalling %#v: %v", x, err))
|
||||
}
|
||||
}
|
||||
|
||||
// In a fully implemented test server, each of these would have
|
||||
// its own resource type.
|
||||
var unimplementedBucketResourceNames = map[string]bool{
|
||||
"acl": true,
|
||||
"lifecycle": true,
|
||||
"policy": true,
|
||||
"location": true,
|
||||
"logging": true,
|
||||
"notification": true,
|
||||
"versions": true,
|
||||
"requestPayment": true,
|
||||
"versioning": true,
|
||||
"website": true,
|
||||
"uploads": true,
|
||||
}
|
||||
|
||||
var unimplementedObjectResourceNames = map[string]bool{
|
||||
"uploadId": true,
|
||||
"acl": true,
|
||||
"torrent": true,
|
||||
"uploads": true,
|
||||
}
|
||||
|
||||
var pathRegexp = regexp.MustCompile("/(([^/]+)(/(.*))?)?")
|
||||
|
||||
// resourceForURL returns a resource object for the given URL.
|
||||
func (srv *Server) resourceForURL(u *url.URL) (r resource) {
|
||||
|
||||
if u.Path == "/" {
|
||||
return serviceResource{
|
||||
buckets: srv.buckets,
|
||||
}
|
||||
}
|
||||
|
||||
m := pathRegexp.FindStringSubmatch(u.Path)
|
||||
if m == nil {
|
||||
fatalError(404, "InvalidURI", "Couldn't parse the specified URI")
|
||||
}
|
||||
bucketName := m[2]
|
||||
objectName := m[4]
|
||||
if bucketName == "" {
|
||||
return nullResource{} // root
|
||||
}
|
||||
b := bucketResource{
|
||||
name: bucketName,
|
||||
bucket: srv.buckets[bucketName],
|
||||
}
|
||||
q := u.Query()
|
||||
if objectName == "" {
|
||||
for name := range q {
|
||||
if unimplementedBucketResourceNames[name] {
|
||||
return nullResource{}
|
||||
}
|
||||
}
|
||||
return b
|
||||
|
||||
}
|
||||
if b.bucket == nil {
|
||||
fatalError(404, "NoSuchBucket", "The specified bucket does not exist")
|
||||
}
|
||||
objr := objectResource{
|
||||
name: objectName,
|
||||
version: q.Get("versionId"),
|
||||
bucket: b.bucket,
|
||||
}
|
||||
for name := range q {
|
||||
if unimplementedObjectResourceNames[name] {
|
||||
return nullResource{}
|
||||
}
|
||||
}
|
||||
if obj := objr.bucket.objects[objr.name]; obj != nil {
|
||||
objr.object = obj
|
||||
}
|
||||
return objr
|
||||
}
|
||||
|
||||
// nullResource has error stubs for all resource methods.
|
||||
type nullResource struct{}
|
||||
|
||||
func notAllowed() interface{} {
|
||||
fatalError(400, "MethodNotAllowed", "The specified method is not allowed against this resource")
|
||||
return nil
|
||||
}
|
||||
|
||||
func (nullResource) put(a *action) interface{} { return notAllowed() }
|
||||
func (nullResource) get(a *action) interface{} { return notAllowed() }
|
||||
func (nullResource) post(a *action) interface{} { return notAllowed() }
|
||||
func (nullResource) delete(a *action) interface{} { return notAllowed() }
|
||||
|
||||
const timeFormat = "2006-01-02T15:04:05Z"
|
||||
|
||||
type serviceResource struct {
|
||||
buckets map[string]*bucket
|
||||
}
|
||||
|
||||
func (serviceResource) put(a *action) interface{} { return notAllowed() }
|
||||
func (serviceResource) post(a *action) interface{} { return notAllowed() }
|
||||
func (serviceResource) delete(a *action) interface{} { return notAllowed() }
|
||||
|
||||
// GET on an s3 service lists the buckets.
|
||||
// http://docs.aws.amazon.com/AmazonS3/latest/API/RESTServiceGET.html
|
||||
func (r serviceResource) get(a *action) interface{} {
|
||||
type respBucket struct {
|
||||
Name string
|
||||
}
|
||||
|
||||
type response struct {
|
||||
Buckets []respBucket `xml:">Bucket"`
|
||||
}
|
||||
|
||||
resp := response{}
|
||||
|
||||
for _, bucketPtr := range r.buckets {
|
||||
bkt := respBucket{
|
||||
Name: bucketPtr.name,
|
||||
}
|
||||
resp.Buckets = append(resp.Buckets, bkt)
|
||||
}
|
||||
|
||||
return &resp
|
||||
}
|
||||
|
||||
type bucketResource struct {
|
||||
name string
|
||||
bucket *bucket // non-nil if the bucket already exists.
|
||||
}
|
||||
|
||||
type Owner struct {
|
||||
ID string
|
||||
DisplayName string
|
||||
}
|
||||
|
||||
// The ListResp type holds the results of a List bucket operation.
|
||||
type ListResp struct {
|
||||
Name string
|
||||
Prefix string
|
||||
Delimiter string
|
||||
Marker string
|
||||
NextMarker string
|
||||
MaxKeys int
|
||||
// IsTruncated is true if the results have been truncated because
|
||||
// there are more keys and prefixes than can fit in MaxKeys.
|
||||
// N.B. this is the opposite sense to that documented (incorrectly) in
|
||||
// http://goo.gl/YjQTc
|
||||
IsTruncated bool
|
||||
Contents []Key
|
||||
CommonPrefixes []string `xml:">Prefix"`
|
||||
}
|
||||
|
||||
// The Key type represents an item stored in an S3 bucket.
|
||||
type Key struct {
|
||||
Key string
|
||||
LastModified string
|
||||
Size int64
|
||||
// ETag gives the hex-encoded MD5 sum of the contents,
|
||||
// surrounded with double-quotes.
|
||||
ETag string
|
||||
StorageClass string
|
||||
Owner Owner
|
||||
}
|
||||
|
||||
// GET on a bucket lists the objects in the bucket.
|
||||
// http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketGET.html
|
||||
func (r bucketResource) get(a *action) interface{} {
|
||||
if r.bucket == nil {
|
||||
fatalError(404, "NoSuchBucket", "The specified bucket does not exist")
|
||||
}
|
||||
delimiter := a.req.Form.Get("delimiter")
|
||||
marker := a.req.Form.Get("marker")
|
||||
maxKeys := -1
|
||||
if s := a.req.Form.Get("max-keys"); s != "" {
|
||||
i, err := strconv.Atoi(s)
|
||||
if err != nil || i < 0 {
|
||||
fatalError(400, "invalid value for max-keys: %q", s)
|
||||
}
|
||||
maxKeys = i
|
||||
}
|
||||
prefix := a.req.Form.Get("prefix")
|
||||
a.w.Header().Set("Content-Type", "application/xml")
|
||||
|
||||
if a.req.Method == "HEAD" {
|
||||
return nil
|
||||
}
|
||||
|
||||
var objs orderedObjects
|
||||
|
||||
// first get all matching objects and arrange them in alphabetical order.
|
||||
for name, obj := range r.bucket.objects {
|
||||
if strings.HasPrefix(name, prefix) {
|
||||
objs = append(objs, obj)
|
||||
}
|
||||
}
|
||||
sort.Sort(objs)
|
||||
|
||||
if maxKeys <= 0 {
|
||||
maxKeys = 1000
|
||||
}
|
||||
resp := &ListResp{
|
||||
Name: r.bucket.name,
|
||||
Prefix: prefix,
|
||||
Delimiter: delimiter,
|
||||
Marker: marker,
|
||||
MaxKeys: maxKeys,
|
||||
}
|
||||
|
||||
var prefixes []string
|
||||
for _, obj := range objs {
|
||||
if !strings.HasPrefix(obj.name, prefix) {
|
||||
continue
|
||||
}
|
||||
name := obj.name
|
||||
isPrefix := false
|
||||
if delimiter != "" {
|
||||
if i := strings.Index(obj.name[len(prefix):], delimiter); i >= 0 {
|
||||
name = obj.name[:len(prefix)+i+len(delimiter)]
|
||||
if prefixes != nil && prefixes[len(prefixes)-1] == name {
|
||||
continue
|
||||
}
|
||||
isPrefix = true
|
||||
}
|
||||
}
|
||||
if name <= marker {
|
||||
continue
|
||||
}
|
||||
if len(resp.Contents)+len(prefixes) >= maxKeys {
|
||||
resp.IsTruncated = true
|
||||
break
|
||||
}
|
||||
if isPrefix {
|
||||
prefixes = append(prefixes, name)
|
||||
} else {
|
||||
// Contents contains only keys not found in CommonPrefixes
|
||||
resp.Contents = append(resp.Contents, obj.s3Key())
|
||||
}
|
||||
}
|
||||
resp.CommonPrefixes = prefixes
|
||||
return resp
|
||||
}
|
||||
|
||||
// orderedObjects holds a slice of objects that can be sorted
|
||||
// by name.
|
||||
type orderedObjects []*object
|
||||
|
||||
func (s orderedObjects) Len() int {
|
||||
return len(s)
|
||||
}
|
||||
func (s orderedObjects) Swap(i, j int) {
|
||||
s[i], s[j] = s[j], s[i]
|
||||
}
|
||||
func (s orderedObjects) Less(i, j int) bool {
|
||||
return s[i].name < s[j].name
|
||||
}
|
||||
|
||||
func (obj *object) s3Key() Key {
|
||||
return Key{
|
||||
Key: obj.name,
|
||||
LastModified: obj.mtime.Format(timeFormat),
|
||||
Size: int64(len(obj.data)),
|
||||
ETag: fmt.Sprintf(`"%x"`, obj.checksum),
|
||||
// TODO StorageClass
|
||||
// TODO Owner
|
||||
}
|
||||
}
|
||||
|
||||
// DELETE on a bucket deletes the bucket if it's not empty.
|
||||
func (r bucketResource) delete(a *action) interface{} {
|
||||
b := r.bucket
|
||||
if b == nil {
|
||||
fatalError(404, "NoSuchBucket", "The specified bucket does not exist")
|
||||
}
|
||||
if len(b.objects) > 0 {
|
||||
fatalError(400, "BucketNotEmpty", "The bucket you tried to delete is not empty")
|
||||
}
|
||||
delete(a.srv.buckets, b.name)
|
||||
return nil
|
||||
}
|
||||
|
||||
// PUT on a bucket creates the bucket.
|
||||
// http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketPUT.html
|
||||
func (r bucketResource) put(a *action) interface{} {
|
||||
var created bool
|
||||
if r.bucket == nil {
|
||||
if !validBucketName(r.name) {
|
||||
fatalError(400, "InvalidBucketName", "The specified bucket is not valid")
|
||||
}
|
||||
if loc := locationConstraint(a); loc == "" {
|
||||
fatalError(400, "InvalidRequets", "The unspecified location constraint is incompatible for the region specific endpoint this request was sent to.")
|
||||
}
|
||||
// TODO validate acl
|
||||
r.bucket = &bucket{
|
||||
name: r.name,
|
||||
// TODO default acl
|
||||
objects: make(map[string]*object),
|
||||
}
|
||||
a.srv.buckets[r.name] = r.bucket
|
||||
created = true
|
||||
}
|
||||
if !created && a.srv.config.send409Conflict() {
|
||||
fatalError(409, "BucketAlreadyOwnedByYou", "Your previous request to create the named bucket succeeded and you already own it.")
|
||||
}
|
||||
r.bucket.acl = a.req.Header.Get("x-amz-acl")
|
||||
return nil
|
||||
}
|
||||
|
||||
func (bucketResource) post(a *action) interface{} {
|
||||
fatalError(400, "Method", "bucket POST method not available")
|
||||
return nil
|
||||
}
|
||||
|
||||
// validBucketName returns whether name is a valid bucket name.
|
||||
// Here are the rules, from:
|
||||
// http://docs.amazonwebservices.com/AmazonS3/2006-03-01/dev/BucketRestrictions.html
|
||||
//
|
||||
// Can contain lowercase letters, numbers, periods (.), underscores (_),
|
||||
// and dashes (-). You can use uppercase letters for buckets only in the
|
||||
// US Standard region.
|
||||
//
|
||||
// Must start with a number or letter
|
||||
//
|
||||
// Must be between 3 and 255 characters long
|
||||
//
|
||||
// There's one extra rule (Must not be formatted as an IP address (e.g., 192.168.5.4)
|
||||
// but the real S3 server does not seem to check that rule, so we will not
|
||||
// check it either.
|
||||
//
|
||||
func validBucketName(name string) bool {
|
||||
if len(name) < 3 || len(name) > 255 {
|
||||
return false
|
||||
}
|
||||
r := name[0]
|
||||
if !(r >= '0' && r <= '9' || r >= 'a' && r <= 'z') {
|
||||
return false
|
||||
}
|
||||
for _, r := range name {
|
||||
switch {
|
||||
case r >= '0' && r <= '9':
|
||||
case r >= 'a' && r <= 'z':
|
||||
case r == '_' || r == '-':
|
||||
case r == '.':
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
var responseParams = map[string]bool{
|
||||
"content-type": true,
|
||||
"content-language": true,
|
||||
"expires": true,
|
||||
"cache-control": true,
|
||||
"content-disposition": true,
|
||||
"content-encoding": true,
|
||||
}
|
||||
|
||||
type objectResource struct {
|
||||
name string
|
||||
version string
|
||||
bucket *bucket // always non-nil.
|
||||
object *object // may be nil.
|
||||
}
|
||||
|
||||
// GET on an object gets the contents of the object.
|
||||
// http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html
|
||||
func (objr objectResource) get(a *action) interface{} {
|
||||
obj := objr.object
|
||||
if obj == nil {
|
||||
fatalError(404, "NoSuchKey", "The specified key does not exist.")
|
||||
}
|
||||
h := a.w.Header()
|
||||
// add metadata
|
||||
for name, d := range obj.meta {
|
||||
h[name] = d
|
||||
}
|
||||
// override header values in response to request parameters.
|
||||
for name, vals := range a.req.Form {
|
||||
if strings.HasPrefix(name, "response-") {
|
||||
name = name[len("response-"):]
|
||||
if !responseParams[name] {
|
||||
continue
|
||||
}
|
||||
h.Set(name, vals[0])
|
||||
}
|
||||
}
|
||||
if r := a.req.Header.Get("Range"); r != "" {
|
||||
fatalError(400, "NotImplemented", "range unimplemented")
|
||||
}
|
||||
// TODO Last-Modified-Since
|
||||
// TODO If-Modified-Since
|
||||
// TODO If-Unmodified-Since
|
||||
// TODO If-Match
|
||||
// TODO If-None-Match
|
||||
// TODO Connection: close ??
|
||||
// TODO x-amz-request-id
|
||||
h.Set("Content-Length", fmt.Sprint(len(obj.data)))
|
||||
h.Set("ETag", hex.EncodeToString(obj.checksum))
|
||||
h.Set("Last-Modified", obj.mtime.UTC().Format(http.TimeFormat))
|
||||
if a.req.Method == "HEAD" {
|
||||
return nil
|
||||
}
|
||||
// TODO avoid holding the lock when writing data.
|
||||
_, err := a.w.Write(obj.data)
|
||||
if err != nil {
|
||||
// we can't do much except just log the fact.
|
||||
log.Printf("error writing data: %v", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
var metaHeaders = map[string]bool{
|
||||
"Content-MD5": true,
|
||||
"x-amz-acl": true,
|
||||
"Content-Type": true,
|
||||
"Content-Encoding": true,
|
||||
"Content-Disposition": true,
|
||||
}
|
||||
|
||||
// PUT on an object creates the object.
|
||||
func (objr objectResource) put(a *action) interface{} {
|
||||
// TODO Cache-Control header
|
||||
// TODO Expires header
|
||||
// TODO x-amz-server-side-encryption
|
||||
// TODO x-amz-storage-class
|
||||
|
||||
// TODO is this correct, or should we erase all previous metadata?
|
||||
obj := objr.object
|
||||
if obj == nil {
|
||||
obj = &object{
|
||||
name: objr.name,
|
||||
meta: make(http.Header),
|
||||
}
|
||||
}
|
||||
|
||||
var expectHash []byte
|
||||
if c := a.req.Header.Get("Content-MD5"); c != "" {
|
||||
var err error
|
||||
expectHash, err = hex.DecodeString(c)
|
||||
if err != nil || len(expectHash) != md5.Size {
|
||||
fatalError(400, "InvalidDigest", "The Content-MD5 you specified was invalid")
|
||||
}
|
||||
}
|
||||
sum := md5.New()
|
||||
// TODO avoid holding lock while reading data.
|
||||
data, err := ioutil.ReadAll(io.TeeReader(a.req.Body, sum))
|
||||
if err != nil {
|
||||
fatalError(400, "TODO", "read error")
|
||||
}
|
||||
gotHash := sum.Sum(nil)
|
||||
if expectHash != nil && bytes.Compare(gotHash, expectHash) != 0 {
|
||||
fatalError(400, "BadDigest", "The Content-MD5 you specified did not match what we received")
|
||||
}
|
||||
if a.req.ContentLength >= 0 && int64(len(data)) != a.req.ContentLength {
|
||||
fatalError(400, "IncompleteBody", "You did not provide the number of bytes specified by the Content-Length HTTP header")
|
||||
}
|
||||
|
||||
// PUT request has been successful - save data and metadata
|
||||
for key, values := range a.req.Header {
|
||||
key = http.CanonicalHeaderKey(key)
|
||||
if metaHeaders[key] || strings.HasPrefix(key, "X-Amz-Meta-") {
|
||||
obj.meta[key] = values
|
||||
}
|
||||
}
|
||||
obj.data = data
|
||||
obj.checksum = gotHash
|
||||
obj.mtime = time.Now()
|
||||
objr.bucket.objects[objr.name] = obj
|
||||
return nil
|
||||
}
|
||||
|
||||
func (objr objectResource) delete(a *action) interface{} {
|
||||
delete(objr.bucket.objects, objr.name)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (objr objectResource) post(a *action) interface{} {
|
||||
fatalError(400, "MethodNotAllowed", "The specified method is not allowed against this resource")
|
||||
return nil
|
||||
}
|
||||
|
||||
type CreateBucketConfiguration struct {
|
||||
LocationConstraint string
|
||||
}
|
||||
|
||||
// locationConstraint parses the <CreateBucketConfiguration /> request body (if present).
|
||||
// If there is no body, an empty string will be returned.
|
||||
func locationConstraint(a *action) string {
|
||||
var body bytes.Buffer
|
||||
if _, err := io.Copy(&body, a.req.Body); err != nil {
|
||||
fatalError(400, "InvalidRequest", err.Error())
|
||||
}
|
||||
if body.Len() == 0 {
|
||||
return ""
|
||||
}
|
||||
var loc CreateBucketConfiguration
|
||||
if err := xml.NewDecoder(&body).Decode(&loc); err != nil {
|
||||
fatalError(400, "InvalidRequest", err.Error())
|
||||
}
|
||||
return loc.LocationConstraint
|
||||
}
|
||||
+1
-1
@@ -27,7 +27,7 @@ class APITest(BaseTest):
|
||||
if APITest.aptly_server is None:
|
||||
super(APITest, self).prepare()
|
||||
|
||||
APITest.aptly_server = self._start_process("aptly api serve -listen=%s" % (self.base_url),)
|
||||
APITest.aptly_server = self._start_process("aptly api serve -no-lock -listen=%s" % (self.base_url),)
|
||||
time.sleep(1)
|
||||
|
||||
if os.path.exists(os.path.join(os.environ["HOME"], ".aptly", "upload")):
|
||||
|
||||
+1
-1
@@ -22,7 +22,7 @@ class S3Test(BaseTest):
|
||||
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_name = "aptly-sys-test-" + str(uuid.uuid1())
|
||||
self.bucket = s3_conn.create_bucket(self.bucket_name)
|
||||
self.configOverride = {"S3PublishEndpoints": {
|
||||
"test1": {
|
||||
|
||||
+1
-1
@@ -37,7 +37,7 @@ class SwiftTest(BaseTest):
|
||||
return super(SwiftTest, self).fixture_available() and swift_conn is not None
|
||||
|
||||
def prepare(self):
|
||||
self.container_name = "aptly-sys-test-" + str(uuid.uuid4())
|
||||
self.container_name = "aptly-sys-test-" + str(uuid.uuid1())
|
||||
swift_conn.put_container(self.container_name)
|
||||
|
||||
self.configOverride = {"SwiftPublishEndpoints": {
|
||||
|
||||
@@ -1 +1 @@
|
||||
aptly version: 0.9.6
|
||||
aptly version: 0.9.7
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"downloadSourcePackages": false,
|
||||
"ppaDistributorID": "ubuntu",
|
||||
"ppaCodename": "",
|
||||
"skipContentsPublishing": false,
|
||||
"S3PublishEndpoints": {},
|
||||
"SwiftPublishEndpoints": {}
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"downloadSourcePackages": false,
|
||||
"ppaDistributorID": "ubuntu",
|
||||
"ppaCodename": "",
|
||||
"skipContentsPublishing": false,
|
||||
"S3PublishEndpoints": {},
|
||||
"SwiftPublishEndpoints": {}
|
||||
}
|
||||
@@ -1,10 +1,12 @@
|
||||
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...
|
||||
gpgv: RSA key ID 473041FA
|
||||
gpgv: Good signature from "Debian Archive Automatic Signing Key (6.0/squeeze) <ftpmaster@debian.org>"
|
||||
gpgv: RSA key ID B98321F9
|
||||
gpgv: Good signature from "Squeeze Stable Release Key <debian-release@lists.debian.org>"
|
||||
Downloading http://mirror.yandex.ru/debian/dists/wheezy/InRelease...
|
||||
Downloading http://mirror.yandex.ru/debian/dists/wheezy/Release...
|
||||
Downloading http://mirror.yandex.ru/debian/dists/wheezy/Release.gpg...
|
||||
gpgv: RSA key ID 46925553
|
||||
gpgv: Good signature from "Debian Archive Automatic Signing Key (7.0/wheezy) <ftpmaster@debian.org>"
|
||||
gpgv: RSA key ID 2B90D010
|
||||
gpgv: Good signature from "Debian Archive Automatic Signing Key (8/jessie) <ftpmaster@debian.org>"
|
||||
gpgv: RSA key ID 65FFB764
|
||||
gpgv: Good signature from "Wheezy Stable Release Key <debian-release@lists.debian.org>"
|
||||
|
||||
Mirror [mirror11]: http://mirror.yandex.ru/debian/ squeeze successfully added.
|
||||
Mirror [mirror11]: http://mirror.yandex.ru/debian/ wheezy successfully added.
|
||||
You can run 'aptly mirror update mirror11' to download repository contents.
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
Name: mirror11
|
||||
Archive Root URL: http://mirror.yandex.ru/debian/
|
||||
Distribution: squeeze
|
||||
Distribution: wheezy
|
||||
Components: main, contrib, non-free
|
||||
Architectures: amd64, armel, i386, ia64, kfreebsd-amd64, kfreebsd-i386, mips, mipsel, powerpc, s390, sparc
|
||||
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 i386 ia64 kfreebsd-amd64 kfreebsd-i386 mips mipsel powerpc s390 sparc
|
||||
Codename: squeeze
|
||||
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, 25 Apr 2015 11:01:14 UTC
|
||||
Description: Debian 6.0.10 Released 19 July 2014
|
||||
Date: Sat, 05 Sep 2015 11:44:23 UTC
|
||||
Description: Debian 7.9 Released 05 September 2015
|
||||
|
||||
Label: Debian
|
||||
Origin: Debian
|
||||
Suite: oldoldstable
|
||||
Version: 6.0.10
|
||||
Suite: oldstable
|
||||
Version: 7.9
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
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...
|
||||
gpgv: keyblock resource `${HOME}/.gnupg/aptlytest.gpg': file open error
|
||||
gpgv: RSA key ID 473041FA
|
||||
gpgv: Can't check signature: public key not found
|
||||
gpgv: RSA key ID B98321F9
|
||||
gpgv: Can't check signature: public key not found
|
||||
Downloading http://mirror.yandex.ru/debian/dists/squeeze-lts/InRelease...
|
||||
|
||||
gpgv: RSA key ID 46925553
|
||||
|
||||
Downloading http://mirror.yandex.ru/debian/dists/squeeze-lts/Release...
|
||||
Downloading http://mirror.yandex.ru/debian/dists/squeeze-lts/Release.gpg...
|
||||
|
||||
gpgv: RSA key ID 46925553
|
||||
|
||||
ERROR: unable to fetch mirror: verification of detached signature failed: exit status 2
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
Downloading http://mirror.yandex.ru/debian-backports/dists/squeeze-backports/InRelease...
|
||||
gpgv: Signature made Fri Feb 7 06:56:50 2014 MSK using RSA key ID 46925553
|
||||
Downloading http://mirror.yandex.ru/debian/dists/wheezy-backports/InRelease...
|
||||
gpgv: RSA key ID 46925553
|
||||
gpgv: Good signature from "Debian Archive Automatic Signing Key (7.0/wheezy) <ftpmaster@debian.org>"
|
||||
gpgv: RSA key ID 2B90D010
|
||||
gpgv: Good signature from "Debian Archive Automatic Signing Key (8/jessie) <ftpmaster@debian.org>"
|
||||
|
||||
Mirror [mirror9]: http://mirror.yandex.ru/debian-backports/ squeeze-backports successfully added.
|
||||
Mirror [mirror9]: http://mirror.yandex.ru/debian/ wheezy-backports successfully added.
|
||||
You can run 'aptly mirror update mirror9' to download repository contents.
|
||||
|
||||
@@ -1,20 +1,21 @@
|
||||
Name: mirror9
|
||||
Archive Root URL: http://mirror.yandex.ru/debian-backports/
|
||||
Distribution: squeeze-backports
|
||||
Archive Root URL: http://mirror.yandex.ru/debian/
|
||||
Distribution: wheezy-backports
|
||||
Components: main, contrib, non-free
|
||||
Architectures: amd64, armel, i386, ia64, kfreebsd-amd64, kfreebsd-i386, mips, mipsel, powerpc, s390, sparc
|
||||
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 i386 ia64 kfreebsd-amd64 kfreebsd-i386 mips mipsel powerpc s390 sparc
|
||||
Architectures: amd64 armel armhf i386 ia64 kfreebsd-amd64 kfreebsd-i386 mips mipsel powerpc s390 s390x sparc
|
||||
ButAutomaticUpgrades: yes
|
||||
Codename: squeeze-backports
|
||||
Codename: wheezy-backports
|
||||
Components: main contrib non-free
|
||||
Description: Backports for the Squeeze Distribution
|
||||
Description: Backports for the Wheezy Distribution
|
||||
|
||||
Label: Debian Backports
|
||||
NotAutomatic: yes
|
||||
Origin: Debian Backports
|
||||
Suite: squeeze-backports
|
||||
Suite: wheezy-backports
|
||||
Version:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
List of mirrors:
|
||||
* [mirror1]: http://mirror.yandex.ru/debian/ wheezy
|
||||
* [mirror2]: http://mirror.yandex.ru/debian/ squeeze [src]
|
||||
* [mirror3]: http://mirror.yandex.ru/debian/ squeeze
|
||||
* [mirror2]: http://mirror.yandex.ru/debian/ wheezy [src]
|
||||
* [mirror3]: http://mirror.yandex.ru/debian/ wheezy
|
||||
* [mirror4]: http://download.opensuse.org/repositories/Apache:/MirrorBrain/Debian_7.0/ ./
|
||||
|
||||
To get more information about mirror, run `aptly mirror show <name>`.
|
||||
|
||||
@@ -2,32 +2,35 @@
|
||||
|
||||
Applying filter...
|
||||
Building download queue...
|
||||
Download queue: 10 items (0.76 MiB)
|
||||
Download queue: 11 items (5.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) <ftpmaster@debian.org>"
|
||||
gpgv: Good signature from "Squeeze Stable Release Key <debian-release@lists.debian.org>"
|
||||
gpgv: RSA key ID 473041FA
|
||||
gpgv: RSA key ID B98321F9
|
||||
Downloading http://mirror.yandex.ru/debian/dists/wheezy/InRelease...
|
||||
Downloading http://mirror.yandex.ru/debian/dists/wheezy/Release...
|
||||
Downloading http://mirror.yandex.ru/debian/dists/wheezy/Release.gpg...
|
||||
Downloading http://mirror.yandex.ru/debian/dists/wheezy/main/binary-amd64/Packages.bz2...
|
||||
Downloading http://mirror.yandex.ru/debian/dists/wheezy/main/binary-i386/Packages.bz2...
|
||||
Downloading http://mirror.yandex.ru/debian/dists/wheezy/main/debian-installer/binary-amd64/Packages.bz2...
|
||||
Downloading http://mirror.yandex.ru/debian/dists/wheezy/main/debian-installer/binary-i386/Packages.bz2...
|
||||
Downloading http://mirror.yandex.ru/debian/dists/wheezy/non-free/binary-amd64/Packages.bz2...
|
||||
Downloading http://mirror.yandex.ru/debian/dists/wheezy/non-free/binary-i386/Packages.bz2...
|
||||
Downloading http://mirror.yandex.ru/debian/dists/wheezy/non-free/debian-installer/binary-amd64/Packages.bz2...
|
||||
Downloading http://mirror.yandex.ru/debian/dists/wheezy/non-free/debian-installer/binary-i386/Packages.bz2...
|
||||
Downloading http://mirror.yandex.ru/debian/pool/main/g/gnupg/gnupg-curl_1.4.12-7+deb7u7_amd64.deb...
|
||||
Downloading http://mirror.yandex.ru/debian/pool/main/g/gnupg/gnupg-curl_1.4.12-7+deb7u7_i386.deb...
|
||||
Downloading http://mirror.yandex.ru/debian/pool/main/g/gnupg/gnupg-udeb_1.4.12-7+deb7u7_amd64.udeb...
|
||||
Downloading http://mirror.yandex.ru/debian/pool/main/g/gnupg/gnupg-udeb_1.4.12-7+deb7u7_i386.udeb...
|
||||
Downloading http://mirror.yandex.ru/debian/pool/main/g/gnupg/gnupg_1.4.12-7+deb7u7_amd64.deb...
|
||||
Downloading http://mirror.yandex.ru/debian/pool/main/g/gnupg/gnupg_1.4.12-7+deb7u7_i386.deb...
|
||||
Downloading http://mirror.yandex.ru/debian/pool/main/g/gnupg/gpgv-udeb_1.4.12-7+deb7u7_amd64.udeb...
|
||||
Downloading http://mirror.yandex.ru/debian/pool/main/g/gnupg/gpgv-udeb_1.4.12-7+deb7u7_i386.udeb...
|
||||
Downloading http://mirror.yandex.ru/debian/pool/main/g/gnupg/gpgv-win32_1.4.12-7+deb7u7_all.deb...
|
||||
Downloading http://mirror.yandex.ru/debian/pool/main/g/gnupg/gpgv_1.4.12-7+deb7u7_amd64.deb...
|
||||
Downloading http://mirror.yandex.ru/debian/pool/main/g/gnupg/gpgv_1.4.12-7+deb7u7_i386.deb...
|
||||
Mirror `wheezy` has been successfully updated.
|
||||
Packages filtered: 57430 -> 11.
|
||||
gpgv: Good signature from "Debian Archive Automatic Signing Key (7.0/wheezy) <ftpmaster@debian.org>"
|
||||
gpgv: Good signature from "Debian Archive Automatic Signing Key (8/jessie) <ftpmaster@debian.org>"
|
||||
gpgv: Good signature from "Wheezy Stable Release Key <debian-release@lists.debian.org>"
|
||||
gpgv: RSA key ID 2B90D010
|
||||
gpgv: RSA key ID 46925553
|
||||
gpgv: RSA key ID 65FFB764
|
||||
@@ -90,7 +90,7 @@ class CreateMirror9Test(BaseTest):
|
||||
"""
|
||||
create mirror: repo with InRelease verification
|
||||
"""
|
||||
runCmd = "aptly mirror create --keyring=aptlytest.gpg mirror9 http://mirror.yandex.ru/debian-backports/ squeeze-backports"
|
||||
runCmd = "aptly mirror create --keyring=aptlytest.gpg mirror9 http://mirror.yandex.ru/debian/ wheezy-backports"
|
||||
fixtureGpg = True
|
||||
outputMatchPrepare = lambda _, s: re.sub(r'Signature made .* using|Warning: using insecure memory!\n', '', s)
|
||||
|
||||
@@ -117,7 +117,7 @@ class CreateMirror11Test(BaseTest):
|
||||
"""
|
||||
create mirror: repo with Release + Release.gpg verification
|
||||
"""
|
||||
runCmd = "aptly mirror create --keyring=aptlytest.gpg mirror11 http://mirror.yandex.ru/debian/ squeeze"
|
||||
runCmd = "aptly mirror create --keyring=aptlytest.gpg mirror11 http://mirror.yandex.ru/debian/ wheezy"
|
||||
fixtureGpg = True
|
||||
outputMatchPrepare = lambda _, s: re.sub(r'Signature made .* using', '', s)
|
||||
|
||||
@@ -130,7 +130,7 @@ class CreateMirror12Test(BaseTest):
|
||||
"""
|
||||
create mirror: repo with Release+Release.gpg verification, failure
|
||||
"""
|
||||
runCmd = "aptly mirror create --keyring=aptlytest.gpg mirror12 http://mirror.yandex.ru/debian/ squeeze"
|
||||
runCmd = "aptly mirror create --keyring=aptlytest.gpg mirror12 http://mirror.yandex.ru/debian/ squeeze-lts"
|
||||
fixtureGpg = False
|
||||
gold_processor = BaseTest.expand_environ
|
||||
outputMatchPrepare = lambda _, s: re.sub(r'Signature made .* using|gpgv: keyblock resource .*$|gpgv: Can\'t check signature: .*$', '', s, flags=re.MULTILINE)
|
||||
|
||||
@@ -7,8 +7,8 @@ class ListMirror1Test(BaseTest):
|
||||
"""
|
||||
fixtureCmds = [
|
||||
"aptly mirror create --ignore-signatures mirror1 http://mirror.yandex.ru/debian/ wheezy",
|
||||
"aptly mirror create -with-sources --ignore-signatures mirror2 http://mirror.yandex.ru/debian/ squeeze contrib",
|
||||
"aptly -architectures=i386 mirror create --ignore-signatures mirror3 http://mirror.yandex.ru/debian/ squeeze non-free",
|
||||
"aptly mirror create -with-sources --ignore-signatures mirror2 http://mirror.yandex.ru/debian/ wheezy contrib",
|
||||
"aptly -architectures=i386 mirror create --ignore-signatures mirror3 http://mirror.yandex.ru/debian/ wheezy non-free",
|
||||
"aptly mirror create -ignore-signatures mirror4 http://download.opensuse.org/repositories/Apache:/MirrorBrain/Debian_7.0/ ./",
|
||||
]
|
||||
runCmd = "aptly mirror list"
|
||||
|
||||
@@ -165,9 +165,9 @@ class UpdateMirror12Test(BaseTest):
|
||||
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",
|
||||
"aptly -architectures=i386,amd64 mirror create -keyring=aptlytest.gpg -filter='$$Source (gnupg)' -with-udebs wheezy http://mirror.yandex.ru/debian/ wheezy main non-free",
|
||||
]
|
||||
runCmd = "aptly mirror update -keyring=aptlytest.gpg squeeze"
|
||||
runCmd = "aptly mirror update -keyring=aptlytest.gpg wheezy"
|
||||
outputMatchPrepare = lambda _, s: re.sub(r'Signature made .* using', '', s)
|
||||
|
||||
def output_processor(self, output):
|
||||
|
||||
@@ -8,3 +8,4 @@ Description: Generated by aptly
|
||||
MD5Sum:
|
||||
SHA1:
|
||||
SHA256:
|
||||
SHA512:
|
||||
|
||||
@@ -8,3 +8,4 @@ Description: Generated by aptly
|
||||
MD5Sum:
|
||||
SHA1:
|
||||
SHA256:
|
||||
SHA512:
|
||||
|
||||
@@ -8,3 +8,4 @@ Description: Generated by aptly
|
||||
MD5Sum:
|
||||
SHA1:
|
||||
SHA256:
|
||||
SHA512:
|
||||
|
||||
@@ -20,6 +20,7 @@ Package: libboost-program-options-dev
|
||||
Priority: optional
|
||||
SHA1: 36895eb64cfe89c33c0a2f7ac2f0c6e0e889e04b
|
||||
SHA256: c76b4bd12fd92e4dfe1b55b18a67a669d92f62985d6a96c8a21d96120982cf12
|
||||
SHA512: d7302241373da972aa9b9e71d2fd769b31a38f71182aa71bc0d69d090d452c69bb74b8612c002ccf8a89c279ced84ac27177c8b92d20f00023b3d268e6cec69c
|
||||
Section: libdevel
|
||||
Size: 2738
|
||||
Source: boost-defaults
|
||||
|
||||
@@ -8,3 +8,4 @@ Description: Generated by aptly
|
||||
MD5Sum:
|
||||
SHA1:
|
||||
SHA256:
|
||||
SHA512:
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
22ff26db69b73d3438fdde21ab5ba2f1 3456 pyspi_0.6.1-1.3.diff.gz
|
||||
22ff26db69b73d3438fdde21ab5ba2f1 3456 pyspi_0.6.1-1.3.diff.gz
|
||||
262cac59a2e81c7f110851ff9670c97ffc3d192d9937b880422a0907f26340d43e7de7e68b904a4fb10bedb02b65c3bd1f7bdd20ea8c4293e690e7a8e0e70ee5 893 pyspi-0.6.1-1.3.stripped.dsc
|
||||
289d3aefa970876e9c43686ce2b02f478d7f3ed35a713928464a98d54ae4fca3 893 pyspi-0.6.1-1.3.stripped.dsc
|
||||
2e770b28df948f3197ed0b679bdea99f3f2bf745e9ddb440c677df9c3aeaee3c 3456 pyspi_0.6.1-1.3.diff.gz
|
||||
2e770b28df948f3197ed0b679bdea99f3f2bf745e9ddb440c677df9c3aeaee3c 3456 pyspi_0.6.1-1.3.diff.gz
|
||||
@@ -19,6 +20,7 @@
|
||||
d494aaf526f1ec6b02f14c2f81e060a5722d6532ddc760ec16972e45c2625989 1782 pyspi_0.6.1-1.3.dsc
|
||||
def336bd566ea688a06ec03db7ccf1f4 29063 pyspi_0.6.1.orig.tar.gz
|
||||
def336bd566ea688a06ec03db7ccf1f4 29063 pyspi_0.6.1.orig.tar.gz
|
||||
fde06b7dc5762a04986d0669420822f6a1e82b195322ae9cbd2dae40bda557c57ad77fe3546007ea645f801c4cd30ef4eb0e96efb2dee6b71c4c9a187d643683 1782 pyspi_0.6.1-1.3.dsc
|
||||
Architecture: any
|
||||
Architecture: any
|
||||
Binary: python-at-spi
|
||||
@@ -29,6 +31,8 @@ Checksums-Sha1:
|
||||
Checksums-Sha1:
|
||||
Checksums-Sha256:
|
||||
Checksums-Sha256:
|
||||
Checksums-Sha512:
|
||||
Checksums-Sha512:
|
||||
Directory: pool/main/p/pyspi
|
||||
Directory: pool/main/p/pyspi
|
||||
Files:
|
||||
|
||||
@@ -1,20 +1,22 @@
|
||||
Package: dmraid-udeb
|
||||
Version: 1.0.0.rc16-4.1
|
||||
Installed-Size: 36
|
||||
Priority: optional
|
||||
Section: debian-installer
|
||||
Maintainer: Giuseppe Iuculano <iuculano@debian.org>
|
||||
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
|
||||
dmraid discovers, activates, deactivates and displays properties
|
||||
of software RAID sets (eg, ATARAID) and contained DOS partitions.
|
||||
Architecture: i386
|
||||
Depends: libc6-udeb (>= 2.11), libdmraid1.0.0.rc16-udeb (>= 1.0.0.rc16), dmsetup-udeb
|
||||
Description: Device-Mapper Software RAID support tool (udeb)
|
||||
Filename: pool/main/d/dmraid/dmraid-udeb_1.0.0.rc16-4.1_i386.udeb
|
||||
Installed-Size: 36
|
||||
MD5sum: 4d8bb4dafb0ef9059dac75846e162784
|
||||
Maintainer: Giuseppe Iuculano <iuculano@debian.org>
|
||||
Package: dmraid-udeb
|
||||
Priority: optional
|
||||
SHA1: fd5c73e08d4c5381b1136c2ff170332d77526246
|
||||
SHA256: fe4ff3351186f03039f8cd6f78e8e4f473a75b613f950caac06fa21dda2d59e8
|
||||
Filename: pool/main/d/dmraid/dmraid-udeb_1.0.0.rc16-4.1_i386.udeb
|
||||
SHA512: d215bfffe485964a9a3db39788be713a8e10cd39fa1b2849e9e474eb1de2b01f69d3fff0997cc577cac7804da41123af2b4826baafb19e5e6ebdf5070f17a6e8
|
||||
Section: debian-installer
|
||||
Size: 11022
|
||||
Source: dmraid
|
||||
Depends: libc6-udeb (>= 2.11), libdmraid1.0.0.rc16-udeb (>= 1.0.0.rc16), dmsetup-udeb
|
||||
|
||||
Version: 1.0.0.rc16-4.1
|
||||
@@ -8,3 +8,4 @@ Description: Generated by aptly
|
||||
MD5Sum:
|
||||
SHA1:
|
||||
SHA256:
|
||||
SHA512:
|
||||
|
||||
@@ -8,3 +8,4 @@ Description: Generated by aptly
|
||||
MD5Sum:
|
||||
SHA1:
|
||||
SHA256:
|
||||
SHA512:
|
||||
|
||||
@@ -8,3 +8,4 @@ Description: Generated by aptly
|
||||
MD5Sum:
|
||||
SHA1:
|
||||
SHA256:
|
||||
SHA512:
|
||||
|
||||
@@ -20,6 +20,7 @@ Package: libboost-program-options-dev
|
||||
Priority: optional
|
||||
SHA1: 36895eb64cfe89c33c0a2f7ac2f0c6e0e889e04b
|
||||
SHA256: c76b4bd12fd92e4dfe1b55b18a67a669d92f62985d6a96c8a21d96120982cf12
|
||||
SHA512: d7302241373da972aa9b9e71d2fd769b31a38f71182aa71bc0d69d090d452c69bb74b8612c002ccf8a89c279ced84ac27177c8b92d20f00023b3d268e6cec69c
|
||||
Section: libdevel
|
||||
Size: 2738
|
||||
Source: boost-defaults
|
||||
|
||||
@@ -8,3 +8,4 @@ Description: Generated by aptly
|
||||
MD5Sum:
|
||||
SHA1:
|
||||
SHA256:
|
||||
SHA512:
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
22ff26db69b73d3438fdde21ab5ba2f1 3456 pyspi_0.6.1-1.3.diff.gz
|
||||
22ff26db69b73d3438fdde21ab5ba2f1 3456 pyspi_0.6.1-1.3.diff.gz
|
||||
262cac59a2e81c7f110851ff9670c97ffc3d192d9937b880422a0907f26340d43e7de7e68b904a4fb10bedb02b65c3bd1f7bdd20ea8c4293e690e7a8e0e70ee5 893 pyspi-0.6.1-1.3.stripped.dsc
|
||||
289d3aefa970876e9c43686ce2b02f478d7f3ed35a713928464a98d54ae4fca3 893 pyspi-0.6.1-1.3.stripped.dsc
|
||||
2e770b28df948f3197ed0b679bdea99f3f2bf745e9ddb440c677df9c3aeaee3c 3456 pyspi_0.6.1-1.3.diff.gz
|
||||
2e770b28df948f3197ed0b679bdea99f3f2bf745e9ddb440c677df9c3aeaee3c 3456 pyspi_0.6.1-1.3.diff.gz
|
||||
@@ -19,6 +20,7 @@
|
||||
d494aaf526f1ec6b02f14c2f81e060a5722d6532ddc760ec16972e45c2625989 1782 pyspi_0.6.1-1.3.dsc
|
||||
def336bd566ea688a06ec03db7ccf1f4 29063 pyspi_0.6.1.orig.tar.gz
|
||||
def336bd566ea688a06ec03db7ccf1f4 29063 pyspi_0.6.1.orig.tar.gz
|
||||
fde06b7dc5762a04986d0669420822f6a1e82b195322ae9cbd2dae40bda557c57ad77fe3546007ea645f801c4cd30ef4eb0e96efb2dee6b71c4c9a187d643683 1782 pyspi_0.6.1-1.3.dsc
|
||||
Architecture: any
|
||||
Architecture: any
|
||||
Binary: python-at-spi
|
||||
@@ -29,6 +31,8 @@ Checksums-Sha1:
|
||||
Checksums-Sha1:
|
||||
Checksums-Sha256:
|
||||
Checksums-Sha256:
|
||||
Checksums-Sha512:
|
||||
Checksums-Sha512:
|
||||
Directory: pool/main/p/pyspi
|
||||
Directory: pool/main/p/pyspi
|
||||
Files:
|
||||
|
||||
@@ -2,10 +2,10 @@ Origin: . maverick
|
||||
Label: . maverick
|
||||
Suite: maverick
|
||||
Codename: maverick
|
||||
Date: Fri, 31 Jan 2014 14:18:52 UTC
|
||||
Architectures: amd64 i386
|
||||
Components: main
|
||||
Description: Generated by aptly
|
||||
MD5Sum:
|
||||
SHA1:
|
||||
SHA256:
|
||||
SHA512:
|
||||
|
||||
@@ -8,3 +8,4 @@ Description: Generated by aptly
|
||||
MD5Sum:
|
||||
SHA1:
|
||||
SHA256:
|
||||
SHA512:
|
||||
|
||||
@@ -8,3 +8,4 @@ Description: Generated by aptly
|
||||
MD5Sum:
|
||||
SHA1:
|
||||
SHA256:
|
||||
SHA512:
|
||||
|
||||
@@ -8,3 +8,4 @@ Description: Generated by aptly
|
||||
MD5Sum:
|
||||
SHA1:
|
||||
SHA256:
|
||||
SHA512:
|
||||
|
||||
@@ -4,10 +4,10 @@ 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.
|
||||
Snapshot wheezy 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
|
||||
deb http://your-server/ wheezy 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.
|
||||
|
||||
@@ -1,87 +1,81 @@
|
||||
Package: dmraid
|
||||
Priority: optional
|
||||
Section: admin
|
||||
Installed-Size: 112
|
||||
Maintainer: Giuseppe Iuculano <iuculano@debian.org>
|
||||
Architecture: amd64
|
||||
Version: 1.0.0.rc16-4.1
|
||||
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_amd64.deb
|
||||
Size: 38620
|
||||
MD5sum: 35da9bcdd12c7fb08eb7192f0a17ddf2
|
||||
SHA1: 6a89d3f9e3b80a172811bb7d74eac43f119a8b7c
|
||||
SHA256: 125405c4b0a7364bf209c161f393d4d0152ba9d02a55a95d90a7637f7b373b8f
|
||||
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!
|
||||
Homepage: http://people.redhat.com/~heinzm/sw/dmraid/
|
||||
Tag: admin::filesystem, admin::kernel, hardware::storage, implemented-in::c, interface::commandline, role::program, scope::utility, use::scanning
|
||||
|
||||
Package: libdmraid-dev
|
||||
Priority: optional
|
||||
Section: libdevel
|
||||
Installed-Size: 496
|
||||
Maintainer: Giuseppe Iuculano <iuculano@debian.org>
|
||||
Architecture: amd64
|
||||
Source: dmraid
|
||||
Version: 1.0.0.rc16-4.1
|
||||
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
|
||||
Size: 152618
|
||||
MD5sum: bb209b5796592d786c28844b949216dc
|
||||
SHA1: cd8baba807fa92a88a265a044d821df8b677b5cb
|
||||
SHA256: 081a48ad5372a941c35d41733da89a52cbe2d8f49032c2a4ef03148e4049615f
|
||||
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.
|
||||
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/
|
||||
|
||||
Package: libdmraid1.0.0.rc16
|
||||
Priority: optional
|
||||
Section: libs
|
||||
Installed-Size: 244
|
||||
Maintainer: Giuseppe Iuculano <iuculano@debian.org>
|
||||
Architecture: amd64
|
||||
Source: dmraid
|
||||
Version: 1.0.0.rc16-4.1
|
||||
Replaces: libdmraid1.0.0.rc15 (<< 1.0.0.rc16-1)
|
||||
Depends: libc6 (>= 2.7), libdevmapper1.02.1 (>= 2:1.02.20)
|
||||
Filename: pool/main/d/dmraid/libdmraid1.0.0.rc16_1.0.0.rc16-4.1_amd64.deb
|
||||
Size: 108978
|
||||
MD5sum: a66d03bb1ddad78f879660ddedf86295
|
||||
SHA1: 6292936617c466e67a3148c66d0c27c068d055d3
|
||||
SHA256: 29f06bd3ae42e3380b356b69598be07724d178af35f2f1a64648c7f8ff85bef9
|
||||
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.
|
||||
Homepage: http://people.redhat.com/~heinzm/sw/dmraid/
|
||||
Tag: admin::hardware, admin::kernel, devel::lang:c, devel::library, hardware::storage, implemented-in::c, role::{devel-lib,kernel,shared-lib}, use::driver
|
||||
|
||||
|
||||
|
||||
Architecture: all
|
||||
Architecture: amd64
|
||||
Architecture: amd64
|
||||
Architecture: amd64
|
||||
Depends: libbz2-1.0, libc6 (>= 2.4), libreadline6 (>= 6.0), libusb-0.1-4 (>= 2:0.1.12), zlib1g (>= 1:1.1.4), dpkg (>= 1.15.4) | install-info, gpgv
|
||||
Depends: libbz2-1.0, libc6 (>= 2.4), zlib1g (>= 1:1.1.4)
|
||||
Depends: libc6 (>= 2.4), libcurl3-gnutls (>= 7.16.2), libldap-2.4-2 (>= 2.4.7), gnupg
|
||||
Description-Md5: 19709c7fc27595437225fd34d295b347
|
||||
Description-Md5: 3f8767984a5f4b323de309446d07435d
|
||||
Description-Md5: 55306a4e1e1fd63e577767c1b9f5161c
|
||||
Description-Md5: 8bbdb812806fb623e26b7b93f549c74b
|
||||
Description: GNU privacy guard - a free PGP replacement
|
||||
Description: GNU privacy guard - a free PGP replacement (cURL)
|
||||
Description: GNU privacy guard - signature verification tool
|
||||
Description: GNU privacy guard - signature verification tool (win32 build)
|
||||
Filename: pool/main/g/gnupg/gnupg-curl_1.4.12-7+deb7u7_amd64.deb
|
||||
Filename: pool/main/g/gnupg/gnupg_1.4.12-7+deb7u7_amd64.deb
|
||||
Filename: pool/main/g/gnupg/gpgv-win32_1.4.12-7+deb7u7_all.deb
|
||||
Filename: pool/main/g/gnupg/gpgv_1.4.12-7+deb7u7_amd64.deb
|
||||
Homepage: http://www.gnupg.org
|
||||
Homepage: http://www.gnupg.org
|
||||
Homepage: http://www.gnupg.org
|
||||
Homepage: http://www.gnupg.org
|
||||
Installed-Size: 130
|
||||
Installed-Size: 1480
|
||||
Installed-Size: 438
|
||||
Installed-Size: 4962
|
||||
MD5sum: 17916456c6e84c434205bad15e98e902
|
||||
MD5sum: 56699ccfefc9bb6c39325d746363c018
|
||||
MD5sum: 5f15f3ac2f586b95ab21c3f83fd1bf35
|
||||
MD5sum: 91a07e1a42703f0ce59c4a1de60e961d
|
||||
Maintainer: Debian GnuPG-Maintainers <pkg-gnupg-maint@lists.alioth.debian.org>
|
||||
Maintainer: Debian GnuPG-Maintainers <pkg-gnupg-maint@lists.alioth.debian.org>
|
||||
Maintainer: Debian GnuPG-Maintainers <pkg-gnupg-maint@lists.alioth.debian.org>
|
||||
Maintainer: Debian GnuPG-Maintainers <pkg-gnupg-maint@lists.alioth.debian.org>
|
||||
Multi-Arch: foreign
|
||||
Multi-Arch: foreign
|
||||
Multi-Arch: foreign
|
||||
Package: gnupg
|
||||
Package: gnupg-curl
|
||||
Package: gpgv
|
||||
Package: gpgv-win32
|
||||
Priority: extra
|
||||
Priority: important
|
||||
Priority: important
|
||||
Priority: optional
|
||||
Recommends: libldap-2.4-2 (>= 2.4.7), gnupg-curl
|
||||
SHA1: 8dae53bc42d1f35054ce35124da8b92f6097f1c2
|
||||
SHA1: bc5c60462be7702988e083cf68c7f8edfcb962a5
|
||||
SHA1: c03f15e5ee0fba0b77a51e063db87708aee0e422
|
||||
SHA1: df8a0ef18df0fb86167128ac6c31d6709c2f9c6b
|
||||
SHA256: 27760f636f6dbfe387dfbede1131fe7a0dd5fd3b0ab562213193ffa7cfcadfb5
|
||||
SHA256: 2920249908a8297f85006def6a55fb99abfcc8466cac2b9f28d01ce8315df065
|
||||
SHA256: 8361f45f51a7e70e3367e5b2df59fa8defc8648a76afa4159da3f249460f5b33
|
||||
SHA256: b626c3320c0ba2c41c5214bf8175c713f3713cc393e9361a977dc0202c197875
|
||||
Section: utils
|
||||
Section: utils
|
||||
Section: utils
|
||||
Section: utils
|
||||
Size: 1956126
|
||||
Size: 228244
|
||||
Size: 617064
|
||||
Size: 64308
|
||||
Source: gnupg
|
||||
Source: gnupg
|
||||
Source: gnupg
|
||||
Suggests: gnupg
|
||||
Suggests: gnupg-doc, xloadimage | imagemagick | eog, libpcsclite1
|
||||
Suggests: wine
|
||||
Tag: implemented-in::c, interface::commandline, network::client, protocol::http, role::plugin, role::program, scope::utility, security::authentication, security::cryptography, suite::gnu, use::checking, works-with::file, works-with::text
|
||||
Tag: implemented-in::c, interface::commandline, role::program, scope::utility, security::authentication, security::cryptography, security::privacy, suite::gnu, use::checking, works-with::file, works-with::text
|
||||
Tag: implemented-in::c, interface::commandline, role::program, scope::utility, security::cryptography, suite::gnu, use::checking
|
||||
Version: 1.4.12-7+deb7u7
|
||||
Version: 1.4.12-7+deb7u7
|
||||
Version: 1.4.12-7+deb7u7
|
||||
Version: 1.4.12-7+deb7u7
|
||||
@@ -1,87 +1,81 @@
|
||||
Package: dmraid
|
||||
Priority: optional
|
||||
Section: admin
|
||||
Installed-Size: 176
|
||||
Maintainer: Giuseppe Iuculano <iuculano@debian.org>
|
||||
Architecture: i386
|
||||
Version: 1.0.0.rc16-4.1
|
||||
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
|
||||
Size: 37984
|
||||
MD5sum: f8aea4e9eaea341b112f02e9efe1678e
|
||||
SHA1: bb96a258038c79bc04eef49d5875deed4c67dd16
|
||||
SHA256: 6a8294bef99040055009da41597869bfdb17ac89c3166e49c57340abe7f702ba
|
||||
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!
|
||||
Tag: admin::filesystem, admin::kernel, hardware::storage, implemented-in::c, interface::commandline, role::program, scope::utility, use::scanning
|
||||
Homepage: http://people.redhat.com/~heinzm/sw/dmraid/
|
||||
|
||||
Package: libdmraid-dev
|
||||
Priority: optional
|
||||
Section: libdevel
|
||||
Installed-Size: 440
|
||||
Maintainer: Giuseppe Iuculano <iuculano@debian.org>
|
||||
Architecture: i386
|
||||
Source: dmraid
|
||||
Version: 1.0.0.rc16-4.1
|
||||
Depends: libdmraid1.0.0.rc16 (= 1.0.0.rc16-4.1)
|
||||
Filename: pool/main/d/dmraid/libdmraid-dev_1.0.0.rc16-4.1_i386.deb
|
||||
Size: 145808
|
||||
MD5sum: 5395970df02ab5f1609cd7eccc15ead1
|
||||
SHA1: f27bd38eeb58a32ee7e58ac8a2950649bd4ef17b
|
||||
SHA256: 2abe9142ce6aa341df57303b5bc847522779ea9109b0fe734e2ae4419872da71
|
||||
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.
|
||||
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/
|
||||
|
||||
Package: libdmraid1.0.0.rc16
|
||||
Priority: optional
|
||||
Section: libs
|
||||
Installed-Size: 268
|
||||
Maintainer: Giuseppe Iuculano <iuculano@debian.org>
|
||||
Architecture: i386
|
||||
Source: dmraid
|
||||
Version: 1.0.0.rc16-4.1
|
||||
Replaces: libdmraid1.0.0.rc15 (<< 1.0.0.rc16-1)
|
||||
Depends: libc6 (>= 2.7), libdevmapper1.02.1 (>= 2:1.02.20)
|
||||
Filename: pool/main/d/dmraid/libdmraid1.0.0.rc16_1.0.0.rc16-4.1_i386.deb
|
||||
Size: 106088
|
||||
MD5sum: 9330ba2ffd2f22d695fdf692f8120159
|
||||
SHA1: 6b262419836e8cad4500043f5e9e6a1581074023
|
||||
SHA256: 2b2238679ac8ff4776a3a2caf533c551700d9f92a7d2af23d6457acf7de5d6c8
|
||||
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.
|
||||
Tag: admin::hardware, admin::kernel, devel::lang:c, devel::library, hardware::storage, implemented-in::c, role::{devel-lib,kernel,shared-lib}, use::driver
|
||||
Homepage: http://people.redhat.com/~heinzm/sw/dmraid/
|
||||
|
||||
|
||||
|
||||
Architecture: all
|
||||
Architecture: i386
|
||||
Architecture: i386
|
||||
Architecture: i386
|
||||
Depends: libbz2-1.0, libc6 (>= 2.4), libreadline6 (>= 6.0), libusb-0.1-4 (>= 2:0.1.12), zlib1g (>= 1:1.1.4), dpkg (>= 1.15.4) | install-info, gpgv
|
||||
Depends: libbz2-1.0, libc6 (>= 2.4), zlib1g (>= 1:1.1.4)
|
||||
Depends: libc6 (>= 2.4), libcurl3-gnutls (>= 7.16.2), libldap-2.4-2 (>= 2.4.7), gnupg
|
||||
Description-Md5: 19709c7fc27595437225fd34d295b347
|
||||
Description-Md5: 3f8767984a5f4b323de309446d07435d
|
||||
Description-Md5: 55306a4e1e1fd63e577767c1b9f5161c
|
||||
Description-Md5: 8bbdb812806fb623e26b7b93f549c74b
|
||||
Description: GNU privacy guard - a free PGP replacement
|
||||
Description: GNU privacy guard - a free PGP replacement (cURL)
|
||||
Description: GNU privacy guard - signature verification tool
|
||||
Description: GNU privacy guard - signature verification tool (win32 build)
|
||||
Filename: pool/main/g/gnupg/gnupg-curl_1.4.12-7+deb7u7_i386.deb
|
||||
Filename: pool/main/g/gnupg/gnupg_1.4.12-7+deb7u7_i386.deb
|
||||
Filename: pool/main/g/gnupg/gpgv-win32_1.4.12-7+deb7u7_all.deb
|
||||
Filename: pool/main/g/gnupg/gpgv_1.4.12-7+deb7u7_i386.deb
|
||||
Homepage: http://www.gnupg.org
|
||||
Homepage: http://www.gnupg.org
|
||||
Homepage: http://www.gnupg.org
|
||||
Homepage: http://www.gnupg.org
|
||||
Installed-Size: 1480
|
||||
Installed-Size: 401
|
||||
Installed-Size: 4613
|
||||
Installed-Size: 89
|
||||
MD5sum: 5f15f3ac2f586b95ab21c3f83fd1bf35
|
||||
MD5sum: 7619869434ee598ba4b1e3de3a48b7a6
|
||||
MD5sum: b7456c472a331b1e905712328d25da27
|
||||
MD5sum: f892c96687ced1c2adfd8f00d9ca6f5a
|
||||
Maintainer: Debian GnuPG-Maintainers <pkg-gnupg-maint@lists.alioth.debian.org>
|
||||
Maintainer: Debian GnuPG-Maintainers <pkg-gnupg-maint@lists.alioth.debian.org>
|
||||
Maintainer: Debian GnuPG-Maintainers <pkg-gnupg-maint@lists.alioth.debian.org>
|
||||
Maintainer: Debian GnuPG-Maintainers <pkg-gnupg-maint@lists.alioth.debian.org>
|
||||
Multi-Arch: foreign
|
||||
Multi-Arch: foreign
|
||||
Multi-Arch: foreign
|
||||
Package: gnupg
|
||||
Package: gnupg-curl
|
||||
Package: gpgv
|
||||
Package: gpgv-win32
|
||||
Priority: extra
|
||||
Priority: important
|
||||
Priority: important
|
||||
Priority: optional
|
||||
Recommends: libldap-2.4-2 (>= 2.4.7), gnupg-curl
|
||||
SHA1: 31e0942b2511a2c73723271163efc0eb29d056ff
|
||||
SHA1: 72c9a6c444d8a6e8ec57f2b778c631946def9d1a
|
||||
SHA1: 9889f1717f36e00b6143aed530bd3d0c54c116fd
|
||||
SHA1: df8a0ef18df0fb86167128ac6c31d6709c2f9c6b
|
||||
SHA256: 27760f636f6dbfe387dfbede1131fe7a0dd5fd3b0ab562213193ffa7cfcadfb5
|
||||
SHA256: 6898801e3f3c97a30bef1ee50381479b69360a28807fb63fcce4abef4da1aec7
|
||||
SHA256: b852d7681ea328bd8b45140973624781e65d0363961d92bcc2ab0bbf1cc6ed52
|
||||
SHA256: cff40c87faea248c77de7d9fc50fcbc80631cd1bc8cec2b1033e0db452e08ea6
|
||||
Section: utils
|
||||
Section: utils
|
||||
Section: utils
|
||||
Section: utils
|
||||
Size: 1938694
|
||||
Size: 221686
|
||||
Size: 617064
|
||||
Size: 63192
|
||||
Source: gnupg
|
||||
Source: gnupg
|
||||
Source: gnupg
|
||||
Suggests: gnupg
|
||||
Suggests: gnupg-doc, xloadimage | imagemagick | eog, libpcsclite1
|
||||
Suggests: wine
|
||||
Tag: implemented-in::c, interface::commandline, network::client, protocol::http, role::plugin, role::program, scope::utility, security::authentication, security::cryptography, suite::gnu, use::checking, works-with::file, works-with::text
|
||||
Tag: implemented-in::c, interface::commandline, role::program, scope::utility, security::authentication, security::cryptography, security::privacy, suite::gnu, use::checking, works-with::file, works-with::text
|
||||
Tag: implemented-in::c, interface::commandline, role::program, scope::utility, security::cryptography, suite::gnu, use::checking
|
||||
Version: 1.4.12-7+deb7u7
|
||||
Version: 1.4.12-7+deb7u7
|
||||
Version: 1.4.12-7+deb7u7
|
||||
Version: 1.4.12-7+deb7u7
|
||||
@@ -1,40 +1,35 @@
|
||||
Package: dmraid-udeb
|
||||
Version: 1.0.0.rc16-4.1
|
||||
Installed-Size: 32
|
||||
Priority: optional
|
||||
Section: debian-installer
|
||||
Maintainer: Giuseppe Iuculano <iuculano@debian.org>
|
||||
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 <iuculano@debian.org>
|
||||
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)
|
||||
|
||||
|
||||
Architecture: amd64
|
||||
Architecture: amd64
|
||||
Depends: libc6-udeb (>= 2.13), libusb-0.1-udeb, zlib1g-udeb (>= 1:1.2.3.3.dfsg-1)
|
||||
Depends: libc6-udeb (>= 2.13), zlib1g-udeb (>= 1:1.2.3.3.dfsg-1)
|
||||
Description-Md5: 0d5b74cda45e2a6526c6943d2cd0c362
|
||||
Description-Md5: c52656f4cc79fd4b089086b9173d2923
|
||||
Description: GNU privacy guard - a free PGP replacement
|
||||
Description: minimal signature verification tool
|
||||
Filename: pool/main/g/gnupg/gnupg-udeb_1.4.12-7+deb7u7_amd64.udeb
|
||||
Filename: pool/main/g/gnupg/gpgv-udeb_1.4.12-7+deb7u7_amd64.udeb
|
||||
Installed-Size: 301
|
||||
Installed-Size: 833
|
||||
MD5sum: 2fda838d1101cc202ddd087c8c98b635
|
||||
MD5sum: 6d90567115ee873d4ce6c87991cfaed0
|
||||
Maintainer: Debian GnuPG-Maintainers <pkg-gnupg-maint@lists.alioth.debian.org>
|
||||
Maintainer: Debian GnuPG-Maintainers <pkg-gnupg-maint@lists.alioth.debian.org>
|
||||
Package: gnupg-udeb
|
||||
Package: gpgv-udeb
|
||||
Priority: extra
|
||||
Priority: extra
|
||||
SHA1: 5d32171182e956f8277d44378b1623bbeae23110
|
||||
SHA1: dbe121bae44db6eb6108311f41997c4ede1178b2
|
||||
SHA256: 4abcb1191d8a3e58d88fb56084f9d784255ba68c767babc3c2819b7a1a689b78
|
||||
SHA256: dd7230f9d025c47e8c94e4101e2970e94aed50ec0c65801f9c7cd0a03d6723e1
|
||||
Section: debian-installer
|
||||
Section: debian-installer
|
||||
Size: 130734
|
||||
Size: 354018
|
||||
Source: gnupg
|
||||
Source: gnupg
|
||||
Version: 1.4.12-7+deb7u7
|
||||
Version: 1.4.12-7+deb7u7
|
||||
@@ -1,40 +1,35 @@
|
||||
Package: dmraid-udeb
|
||||
Version: 1.0.0.rc16-4.1
|
||||
Installed-Size: 36
|
||||
Priority: optional
|
||||
Section: debian-installer
|
||||
Maintainer: Giuseppe Iuculano <iuculano@debian.org>
|
||||
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 <iuculano@debian.org>
|
||||
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
|
||||
|
||||
|
||||
Architecture: i386
|
||||
Architecture: i386
|
||||
Depends: libc6-udeb (>= 2.13), libusb-0.1-udeb, zlib1g-udeb (>= 1:1.2.3.3.dfsg-1)
|
||||
Depends: libc6-udeb (>= 2.13), zlib1g-udeb (>= 1:1.2.3.3.dfsg-1)
|
||||
Description-Md5: 0d5b74cda45e2a6526c6943d2cd0c362
|
||||
Description-Md5: c52656f4cc79fd4b089086b9173d2923
|
||||
Description: GNU privacy guard - a free PGP replacement
|
||||
Description: minimal signature verification tool
|
||||
Filename: pool/main/g/gnupg/gnupg-udeb_1.4.12-7+deb7u7_i386.udeb
|
||||
Filename: pool/main/g/gnupg/gpgv-udeb_1.4.12-7+deb7u7_i386.udeb
|
||||
Installed-Size: 275
|
||||
Installed-Size: 783
|
||||
MD5sum: 1abee98b231ab5b25dd7976ab61247cf
|
||||
MD5sum: e12304db5e3c3401e64ad5967a5c9064
|
||||
Maintainer: Debian GnuPG-Maintainers <pkg-gnupg-maint@lists.alioth.debian.org>
|
||||
Maintainer: Debian GnuPG-Maintainers <pkg-gnupg-maint@lists.alioth.debian.org>
|
||||
Package: gnupg-udeb
|
||||
Package: gpgv-udeb
|
||||
Priority: extra
|
||||
Priority: extra
|
||||
SHA1: e64cb327e89ba41ba6aaeca7e9e69cf18479ed40
|
||||
SHA1: f6937084ae96b269131a08bb365619e704f91d21
|
||||
SHA256: 7d86005e0f2a7bdeff3204ccb0e50d6d06b07011621acb56ad322480bd11494c
|
||||
SHA256: 96eae21eb31fa79d196dfbec63594f62c39753aad59d02d69bf9495ad486ec01
|
||||
Section: debian-installer
|
||||
Section: debian-installer
|
||||
Size: 125582
|
||||
Size: 343860
|
||||
Source: gnupg
|
||||
Source: gnupg
|
||||
Version: 1.4.12-7+deb7u7
|
||||
Version: 1.4.12-7+deb7u7
|
||||
@@ -1,59 +1,11 @@
|
||||
Origin: . squeeze
|
||||
Label: . squeeze
|
||||
Suite: squeeze
|
||||
Codename: squeeze
|
||||
Date: Tue, 30 Sep 2014 15:35:22 UTC
|
||||
Origin: . wheezy
|
||||
Label: . wheezy
|
||||
Suite: wheezy
|
||||
Codename: wheezy
|
||||
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
|
||||
SHA512:
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
Origin: . squeeze
|
||||
Label: . squeeze
|
||||
Archive: squeeze
|
||||
Origin: . wheezy
|
||||
Label: . wheezy
|
||||
Archive: wheezy
|
||||
Architecture: i386
|
||||
Component: main
|
||||
|
||||
@@ -8,3 +8,4 @@ Description: Generated by aptly
|
||||
MD5Sum:
|
||||
SHA1:
|
||||
SHA256:
|
||||
SHA512:
|
||||
|
||||
@@ -8,3 +8,4 @@ Description: Generated by aptly
|
||||
MD5Sum:
|
||||
SHA1:
|
||||
SHA256:
|
||||
SHA512:
|
||||
|
||||
@@ -8,3 +8,4 @@ Description: Generated by aptly
|
||||
MD5Sum:
|
||||
SHA1:
|
||||
SHA256:
|
||||
SHA512:
|
||||
|
||||
@@ -20,6 +20,7 @@ Package: libboost-program-options-dev
|
||||
Priority: optional
|
||||
SHA1: 36895eb64cfe89c33c0a2f7ac2f0c6e0e889e04b
|
||||
SHA256: c76b4bd12fd92e4dfe1b55b18a67a669d92f62985d6a96c8a21d96120982cf12
|
||||
SHA512: d7302241373da972aa9b9e71d2fd769b31a38f71182aa71bc0d69d090d452c69bb74b8612c002ccf8a89c279ced84ac27177c8b92d20f00023b3d268e6cec69c
|
||||
Section: libdevel
|
||||
Size: 2738
|
||||
Source: boost-defaults
|
||||
|
||||
@@ -8,3 +8,4 @@ Description: Generated by aptly
|
||||
MD5Sum:
|
||||
SHA1:
|
||||
SHA256:
|
||||
SHA512:
|
||||
|
||||
@@ -20,6 +20,7 @@ Package: libboost-program-options-dev
|
||||
Priority: optional
|
||||
SHA1: 36895eb64cfe89c33c0a2f7ac2f0c6e0e889e04b
|
||||
SHA256: c76b4bd12fd92e4dfe1b55b18a67a669d92f62985d6a96c8a21d96120982cf12
|
||||
SHA512: d7302241373da972aa9b9e71d2fd769b31a38f71182aa71bc0d69d090d452c69bb74b8612c002ccf8a89c279ced84ac27177c8b92d20f00023b3d268e6cec69c
|
||||
Section: libdevel
|
||||
Size: 2738
|
||||
Source: boost-defaults
|
||||
|
||||
@@ -8,3 +8,4 @@ Description: Generated by aptly
|
||||
MD5Sum:
|
||||
SHA1:
|
||||
SHA256:
|
||||
SHA512:
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
|
||||
|
||||
(name, value) pairs from the user, via conventional methods such as
|
||||
.
|
||||
.
|
||||
@@ -19,6 +20,7 @@ Package: libboost-program-options-dev
|
||||
Priority: optional
|
||||
SHA1: 36895eb64cfe89c33c0a2f7ac2f0c6e0e889e04b
|
||||
SHA256: c76b4bd12fd92e4dfe1b55b18a67a669d92f62985d6a96c8a21d96120982cf12
|
||||
SHA512: d7302241373da972aa9b9e71d2fd769b31a38f71182aa71bc0d69d090d452c69bb74b8612c002ccf8a89c279ced84ac27177c8b92d20f00023b3d268e6cec69c
|
||||
Section: libdevel
|
||||
Size: 2738
|
||||
Source: boost-defaults
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
22ff26db69b73d3438fdde21ab5ba2f1 3456 pyspi_0.6.1-1.3.diff.gz
|
||||
22ff26db69b73d3438fdde21ab5ba2f1 3456 pyspi_0.6.1-1.3.diff.gz
|
||||
262cac59a2e81c7f110851ff9670c97ffc3d192d9937b880422a0907f26340d43e7de7e68b904a4fb10bedb02b65c3bd1f7bdd20ea8c4293e690e7a8e0e70ee5 893 pyspi-0.6.1-1.3.stripped.dsc
|
||||
289d3aefa970876e9c43686ce2b02f478d7f3ed35a713928464a98d54ae4fca3 893 pyspi-0.6.1-1.3.stripped.dsc
|
||||
2e770b28df948f3197ed0b679bdea99f3f2bf745e9ddb440c677df9c3aeaee3c 3456 pyspi_0.6.1-1.3.diff.gz
|
||||
2e770b28df948f3197ed0b679bdea99f3f2bf745e9ddb440c677df9c3aeaee3c 3456 pyspi_0.6.1-1.3.diff.gz
|
||||
@@ -19,6 +20,7 @@
|
||||
d494aaf526f1ec6b02f14c2f81e060a5722d6532ddc760ec16972e45c2625989 1782 pyspi_0.6.1-1.3.dsc
|
||||
def336bd566ea688a06ec03db7ccf1f4 29063 pyspi_0.6.1.orig.tar.gz
|
||||
def336bd566ea688a06ec03db7ccf1f4 29063 pyspi_0.6.1.orig.tar.gz
|
||||
fde06b7dc5762a04986d0669420822f6a1e82b195322ae9cbd2dae40bda557c57ad77fe3546007ea645f801c4cd30ef4eb0e96efb2dee6b71c4c9a187d643683 1782 pyspi_0.6.1-1.3.dsc
|
||||
Architecture: any
|
||||
Architecture: any
|
||||
Binary: python-at-spi
|
||||
@@ -29,6 +31,8 @@ Checksums-Sha1:
|
||||
Checksums-Sha1:
|
||||
Checksums-Sha256:
|
||||
Checksums-Sha256:
|
||||
Checksums-Sha512:
|
||||
Checksums-Sha512:
|
||||
Directory: pool/main/p/pyspi
|
||||
Directory: pool/main/p/pyspi
|
||||
Files:
|
||||
|
||||
@@ -20,6 +20,7 @@ Package: libboost-program-options-dev
|
||||
Priority: optional
|
||||
SHA1: 36895eb64cfe89c33c0a2f7ac2f0c6e0e889e04b
|
||||
SHA256: c76b4bd12fd92e4dfe1b55b18a67a669d92f62985d6a96c8a21d96120982cf12
|
||||
SHA512: d7302241373da972aa9b9e71d2fd769b31a38f71182aa71bc0d69d090d452c69bb74b8612c002ccf8a89c279ced84ac27177c8b92d20f00023b3d268e6cec69c
|
||||
Section: libdevel
|
||||
Size: 2738
|
||||
Source: boost-defaults
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
22ff26db69b73d3438fdde21ab5ba2f1 3456 pyspi_0.6.1-1.3.diff.gz
|
||||
22ff26db69b73d3438fdde21ab5ba2f1 3456 pyspi_0.6.1-1.3.diff.gz
|
||||
262cac59a2e81c7f110851ff9670c97ffc3d192d9937b880422a0907f26340d43e7de7e68b904a4fb10bedb02b65c3bd1f7bdd20ea8c4293e690e7a8e0e70ee5 893 pyspi-0.6.1-1.3.stripped.dsc
|
||||
289d3aefa970876e9c43686ce2b02f478d7f3ed35a713928464a98d54ae4fca3 893 pyspi-0.6.1-1.3.stripped.dsc
|
||||
2e770b28df948f3197ed0b679bdea99f3f2bf745e9ddb440c677df9c3aeaee3c 3456 pyspi_0.6.1-1.3.diff.gz
|
||||
2e770b28df948f3197ed0b679bdea99f3f2bf745e9ddb440c677df9c3aeaee3c 3456 pyspi_0.6.1-1.3.diff.gz
|
||||
@@ -19,6 +20,7 @@
|
||||
d494aaf526f1ec6b02f14c2f81e060a5722d6532ddc760ec16972e45c2625989 1782 pyspi_0.6.1-1.3.dsc
|
||||
def336bd566ea688a06ec03db7ccf1f4 29063 pyspi_0.6.1.orig.tar.gz
|
||||
def336bd566ea688a06ec03db7ccf1f4 29063 pyspi_0.6.1.orig.tar.gz
|
||||
fde06b7dc5762a04986d0669420822f6a1e82b195322ae9cbd2dae40bda557c57ad77fe3546007ea645f801c4cd30ef4eb0e96efb2dee6b71c4c9a187d643683 1782 pyspi_0.6.1-1.3.dsc
|
||||
Architecture: any
|
||||
Architecture: any
|
||||
Binary: python-at-spi
|
||||
@@ -29,6 +31,8 @@ Checksums-Sha1:
|
||||
Checksums-Sha1:
|
||||
Checksums-Sha256:
|
||||
Checksums-Sha256:
|
||||
Checksums-Sha512:
|
||||
Checksums-Sha512:
|
||||
Directory: pool/main/p/pyspi
|
||||
Directory: pool/main/p/pyspi
|
||||
Files:
|
||||
|
||||
@@ -1,25 +1,27 @@
|
||||
Package: libboost-program-options-dev
|
||||
Version: 1.49.0.1
|
||||
Installed-Size: 26
|
||||
Priority: optional
|
||||
Section: libdevel
|
||||
Maintainer: Debian Boost Team <pkg-boost-devel@lists.alioth.debian.org>
|
||||
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).
|
||||
Library to let program developers obtain program options, that is
|
||||
This package forms part of the Boost C++ Libraries collection.
|
||||
This package is a dependency package, which depends on Debian's default
|
||||
command line and config file.
|
||||
Architecture: i386
|
||||
Depends: libboost-program-options1.49-dev
|
||||
Description: program options library for C++ (default version)
|
||||
Filename: pool/main/b/boost-defaults/libboost-program-options-dev_1.49.0.1_i386.deb
|
||||
Homepage: http://www.boost.org/libs/program_options/
|
||||
Installed-Size: 26
|
||||
MD5sum: 0035d7822b2f8f0ec4013f270fd650c2
|
||||
Maintainer: Debian Boost Team <pkg-boost-devel@lists.alioth.debian.org>
|
||||
Package: libboost-program-options-dev
|
||||
Priority: optional
|
||||
SHA1: 36895eb64cfe89c33c0a2f7ac2f0c6e0e889e04b
|
||||
SHA256: c76b4bd12fd92e4dfe1b55b18a67a669d92f62985d6a96c8a21d96120982cf12
|
||||
Filename: pool/main/b/boost-defaults/libboost-program-options-dev_1.49.0.1_i386.deb
|
||||
SHA512: d7302241373da972aa9b9e71d2fd769b31a38f71182aa71bc0d69d090d452c69bb74b8612c002ccf8a89c279ced84ac27177c8b92d20f00023b3d268e6cec69c
|
||||
Section: libdevel
|
||||
Size: 2738
|
||||
Homepage: http://www.boost.org/libs/program_options/
|
||||
Source: boost-defaults
|
||||
Depends: libboost-program-options1.49-dev
|
||||
|
||||
Version: 1.49.0.1
|
||||
@@ -2,34 +2,10 @@ Origin: . maverick
|
||||
Label: . maverick
|
||||
Suite: 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
|
||||
SHA512:
|
||||
|
||||
@@ -1,48 +1,52 @@
|
||||
Package: pyspi
|
||||
Version: 0.6.1-1.3
|
||||
Maintainer: Jose Carlos Garcia Sogo <jsogo@debian.org>
|
||||
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 <jsogo@debian.org>
|
||||
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:
|
||||
|
||||
22ff26db69b73d3438fdde21ab5ba2f1 3456 pyspi_0.6.1-1.3.diff.gz
|
||||
22ff26db69b73d3438fdde21ab5ba2f1 3456 pyspi_0.6.1-1.3.diff.gz
|
||||
262cac59a2e81c7f110851ff9670c97ffc3d192d9937b880422a0907f26340d43e7de7e68b904a4fb10bedb02b65c3bd1f7bdd20ea8c4293e690e7a8e0e70ee5 893 pyspi-0.6.1-1.3.stripped.dsc
|
||||
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:
|
||||
2e770b28df948f3197ed0b679bdea99f3f2bf745e9ddb440c677df9c3aeaee3c 3456 pyspi_0.6.1-1.3.diff.gz
|
||||
2f5bd47cf38852b6fc927a50f98c1448 893 pyspi-0.6.1-1.3.stripped.dsc
|
||||
5005fbd1f30637edc1d380b30f45db9b79100d07 893 pyspi-0.6.1-1.3.stripped.dsc
|
||||
56c8a9b1f4ab636052be8966690998cbe865cd6c 1782 pyspi_0.6.1-1.3.dsc
|
||||
64069ee828c50b1c597d10a3fefbba279f093a4723965388cdd0ac02f029bfb9 29063 pyspi_0.6.1.orig.tar.gz
|
||||
64069ee828c50b1c597d10a3fefbba279f093a4723965388cdd0ac02f029bfb9 29063 pyspi_0.6.1.orig.tar.gz
|
||||
95a2468e4bbce730ba286f2211fa41861b9f1d90 3456 pyspi_0.6.1-1.3.diff.gz
|
||||
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
|
||||
9694b80acc171c0a5bc99f707933864edfce555e 29063 pyspi_0.6.1.orig.tar.gz
|
||||
b72cb94699298a117b7c82641c68b6fd 1782 pyspi_0.6.1-1.3.dsc
|
||||
d494aaf526f1ec6b02f14c2f81e060a5722d6532ddc760ec16972e45c2625989 1782 pyspi_0.6.1-1.3.dsc
|
||||
def336bd566ea688a06ec03db7ccf1f4 29063 pyspi_0.6.1.orig.tar.gz
|
||||
|
||||
def336bd566ea688a06ec03db7ccf1f4 29063 pyspi_0.6.1.orig.tar.gz
|
||||
fde06b7dc5762a04986d0669420822f6a1e82b195322ae9cbd2dae40bda557c57ad77fe3546007ea645f801c4cd30ef4eb0e96efb2dee6b71c4c9a187d643683 1782 pyspi_0.6.1-1.3.dsc
|
||||
Architecture: any
|
||||
Architecture: any
|
||||
Binary: python-at-spi
|
||||
Binary: python-at-spi
|
||||
Build-Depends: debhelper (>= 5), cdbs, libatspi-dev, python-pyrex, python-support (>= 0.4), python-all-dev, libx11-dev
|
||||
Build-Depends: debhelper (>= 5), cdbs, libatspi-dev, python-pyrex, python-support (>= 0.4), python-all-dev, libx11-dev
|
||||
Checksums-Sha1:
|
||||
Checksums-Sha1:
|
||||
Checksums-Sha256:
|
||||
Checksums-Sha256:
|
||||
Checksums-Sha512:
|
||||
Checksums-Sha512:
|
||||
Directory: pool/main/p/pyspi
|
||||
Directory: pool/main/p/pyspi
|
||||
Files:
|
||||
Files:
|
||||
Format: 1.0
|
||||
Format: 1.0
|
||||
Homepage: http://people.redhat.com/zcerza/dogtail
|
||||
Homepage: http://people.redhat.com/zcerza/dogtail
|
||||
Maintainer: Jose Carlos Garcia Sogo <jsogo@debian.org>
|
||||
Maintainer: Jose Carlos Garcia Sogo <jsogo@debian.org>
|
||||
Package: pyspi
|
||||
Package: pyspi
|
||||
Standards-Version: 3.7.3
|
||||
Standards-Version: 3.7.3
|
||||
Vcs-Svn: svn://svn.tribulaciones.org/srv/svn/pyspi/trunk
|
||||
Vcs-Svn: svn://svn.tribulaciones.org/srv/svn/pyspi/trunk
|
||||
Version: 0.6.1-1.3
|
||||
Version: 0.6.1-1.4
|
||||
|
||||
@@ -1,25 +1,27 @@
|
||||
Package: libboost-program-options-dev
|
||||
Version: 1.49.0.1
|
||||
Installed-Size: 26
|
||||
Priority: optional
|
||||
Section: libdevel
|
||||
Maintainer: Debian Boost Team <pkg-boost-devel@lists.alioth.debian.org>
|
||||
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).
|
||||
Library to let program developers obtain program options, that is
|
||||
This package forms part of the Boost C++ Libraries collection.
|
||||
This package is a dependency package, which depends on Debian's default
|
||||
command line and config file.
|
||||
Architecture: i386
|
||||
Depends: libboost-program-options1.49-dev
|
||||
Description: program options library for C++ (default version)
|
||||
Filename: pool/main/b/boost-defaults/libboost-program-options-dev_1.49.0.1_i386.deb
|
||||
Homepage: http://www.boost.org/libs/program_options/
|
||||
Installed-Size: 26
|
||||
MD5sum: 0035d7822b2f8f0ec4013f270fd650c2
|
||||
Maintainer: Debian Boost Team <pkg-boost-devel@lists.alioth.debian.org>
|
||||
Package: libboost-program-options-dev
|
||||
Priority: optional
|
||||
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/
|
||||
SHA512: d7302241373da972aa9b9e71d2fd769b31a38f71182aa71bc0d69d090d452c69bb74b8612c002ccf8a89c279ced84ac27177c8b92d20f00023b3d268e6cec69c
|
||||
Section: libdevel
|
||||
Size: 2738
|
||||
|
||||
Source: boost-defaults
|
||||
Version: 1.49.0.1
|
||||
@@ -2,34 +2,10 @@ Origin: . maverick
|
||||
Label: . maverick
|
||||
Suite: 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
|
||||
SHA512:
|
||||
|
||||
@@ -2,34 +2,10 @@ Origin: . maverick
|
||||
Label: . maverick
|
||||
Suite: 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
|
||||
SHA512:
|
||||
|
||||
@@ -1,25 +1,27 @@
|
||||
Package: libboost-program-options-dev
|
||||
Version: 1.49.0.1
|
||||
Installed-Size: 26
|
||||
Priority: optional
|
||||
Section: libdevel
|
||||
Maintainer: Debian Boost Team <pkg-boost-devel@lists.alioth.debian.org>
|
||||
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).
|
||||
Library to let program developers obtain program options, that is
|
||||
This package forms part of the Boost C++ Libraries collection.
|
||||
This package is a dependency package, which depends on Debian's default
|
||||
command line and config file.
|
||||
Architecture: i386
|
||||
Depends: libboost-program-options1.49-dev
|
||||
Description: program options library for C++ (default version)
|
||||
Filename: pool/main/b/boost-defaults/libboost-program-options-dev_1.49.0.1_i386.deb
|
||||
Homepage: http://www.boost.org/libs/program_options/
|
||||
Installed-Size: 26
|
||||
MD5sum: 0035d7822b2f8f0ec4013f270fd650c2
|
||||
Maintainer: Debian Boost Team <pkg-boost-devel@lists.alioth.debian.org>
|
||||
Package: libboost-program-options-dev
|
||||
Priority: optional
|
||||
SHA1: 36895eb64cfe89c33c0a2f7ac2f0c6e0e889e04b
|
||||
SHA256: c76b4bd12fd92e4dfe1b55b18a67a669d92f62985d6a96c8a21d96120982cf12
|
||||
Filename: pool/main/b/boost-defaults/libboost-program-options-dev_1.49.0.1_i386.deb
|
||||
SHA512: d7302241373da972aa9b9e71d2fd769b31a38f71182aa71bc0d69d090d452c69bb74b8612c002ccf8a89c279ced84ac27177c8b92d20f00023b3d268e6cec69c
|
||||
Section: libdevel
|
||||
Size: 2738
|
||||
Homepage: http://www.boost.org/libs/program_options/
|
||||
Source: boost-defaults
|
||||
Depends: libboost-program-options1.49-dev
|
||||
|
||||
Version: 1.49.0.1
|
||||
@@ -2,34 +2,10 @@ Origin: . maverick
|
||||
Label: . maverick
|
||||
Suite: maverick
|
||||
Codename: maverick
|
||||
Date: Sun, 22 Feb 2015 10:44:27 UTC
|
||||
Architectures: i386
|
||||
Components: main
|
||||
Description: Generated by aptly
|
||||
MD5Sum:
|
||||
c002a2d87044f69fe3f535cd126db3ba 92 main/source/Release
|
||||
c03724183668d701ac6aa300d13af562 984 main/binary-i386/Packages
|
||||
585addbc83368aeee669c9c4894aa85d 601 main/binary-i386/Packages.gz
|
||||
c6622332526ac6c6b0e3945ed4977d92 650 main/binary-i386/Packages.bz2
|
||||
43403263280667501151421b9cd7fc68 2300 main/source/Sources
|
||||
8f77bf834a8c9a30f5647b153d73dc88 828 main/source/Sources.gz
|
||||
30682c2ffbfcb8141af41fc88236ffcf 1013 main/source/Sources.bz2
|
||||
2dea0f34410be57d2e41713f14dd047b 90 main/binary-i386/Release
|
||||
SHA1:
|
||||
a4d68060e2ba2b00073d2b8848224b30c81a2060 92 main/source/Release
|
||||
5baf9f7d7ece54603fe839a414cd652d22da6ba2 984 main/binary-i386/Packages
|
||||
312c9eb461c3bc08d26355f4e233ea761573fad4 601 main/binary-i386/Packages.gz
|
||||
7f5a42f1cccde76e61db4785cc7e2d568366527f 650 main/binary-i386/Packages.bz2
|
||||
7faccfe9d57725a221f7bcf24cb9f6fd15cfbc46 2300 main/source/Sources
|
||||
e779570785b5be8be647cecbe2f9aee9593e9f22 828 main/source/Sources.gz
|
||||
5cadb5837aae91aa666b76030fdd89db9142aeda 1013 main/source/Sources.bz2
|
||||
689d7b3d67cb1cc3d4a0e730a2c2462aa3344fef 90 main/binary-i386/Release
|
||||
SHA256:
|
||||
8fd77dcde4aacfdaca30f1c74ec058ffdb79ec741ec0c04647c90d927f74ced8 92 main/source/Release
|
||||
e16e3432eaf9a48f782c2afc92263819d2295169d276635282a163cb4b8da073 984 main/binary-i386/Packages
|
||||
2ced8276178f296b76d85f2a2bd640d912923d0110b98c86899be1eac3f98afc 601 main/binary-i386/Packages.gz
|
||||
97fbdadc2dfc8d26c9f4ea11642e208a3abe5d6868ba49b5c855ccfb54311ae3 650 main/binary-i386/Packages.bz2
|
||||
bef12367ae59c9bd0e4dfd35ff1a5b202fa74d32bf842ff973096f5397912f3f 2300 main/source/Sources
|
||||
085e855df6237384010d4147b80f600b190045ee9018dcecd64fa9441218f306 828 main/source/Sources.gz
|
||||
c0c27f19c08ff311efd4611990959866464bdcb6ef73fdd4904a93992301299c 1013 main/source/Sources.bz2
|
||||
faa23b79fc6811f4eb4839e2a98bb023c9d70b815b1f39b1e54b8c42a0afc74e 90 main/binary-i386/Release
|
||||
SHA512:
|
||||
|
||||
@@ -1,48 +1,52 @@
|
||||
Package: pyspi
|
||||
Version: 0.6.1-1.3
|
||||
Maintainer: Jose Carlos Garcia Sogo <jsogo@debian.org>
|
||||
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 <jsogo@debian.org>
|
||||
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:
|
||||
|
||||
22ff26db69b73d3438fdde21ab5ba2f1 3456 pyspi_0.6.1-1.3.diff.gz
|
||||
22ff26db69b73d3438fdde21ab5ba2f1 3456 pyspi_0.6.1-1.3.diff.gz
|
||||
262cac59a2e81c7f110851ff9670c97ffc3d192d9937b880422a0907f26340d43e7de7e68b904a4fb10bedb02b65c3bd1f7bdd20ea8c4293e690e7a8e0e70ee5 893 pyspi-0.6.1-1.3.stripped.dsc
|
||||
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:
|
||||
2e770b28df948f3197ed0b679bdea99f3f2bf745e9ddb440c677df9c3aeaee3c 3456 pyspi_0.6.1-1.3.diff.gz
|
||||
2f5bd47cf38852b6fc927a50f98c1448 893 pyspi-0.6.1-1.3.stripped.dsc
|
||||
5005fbd1f30637edc1d380b30f45db9b79100d07 893 pyspi-0.6.1-1.3.stripped.dsc
|
||||
56c8a9b1f4ab636052be8966690998cbe865cd6c 1782 pyspi_0.6.1-1.3.dsc
|
||||
64069ee828c50b1c597d10a3fefbba279f093a4723965388cdd0ac02f029bfb9 29063 pyspi_0.6.1.orig.tar.gz
|
||||
64069ee828c50b1c597d10a3fefbba279f093a4723965388cdd0ac02f029bfb9 29063 pyspi_0.6.1.orig.tar.gz
|
||||
95a2468e4bbce730ba286f2211fa41861b9f1d90 3456 pyspi_0.6.1-1.3.diff.gz
|
||||
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
|
||||
9694b80acc171c0a5bc99f707933864edfce555e 29063 pyspi_0.6.1.orig.tar.gz
|
||||
b72cb94699298a117b7c82641c68b6fd 1782 pyspi_0.6.1-1.3.dsc
|
||||
d494aaf526f1ec6b02f14c2f81e060a5722d6532ddc760ec16972e45c2625989 1782 pyspi_0.6.1-1.3.dsc
|
||||
def336bd566ea688a06ec03db7ccf1f4 29063 pyspi_0.6.1.orig.tar.gz
|
||||
|
||||
def336bd566ea688a06ec03db7ccf1f4 29063 pyspi_0.6.1.orig.tar.gz
|
||||
fde06b7dc5762a04986d0669420822f6a1e82b195322ae9cbd2dae40bda557c57ad77fe3546007ea645f801c4cd30ef4eb0e96efb2dee6b71c4c9a187d643683 1782 pyspi_0.6.1-1.3.dsc
|
||||
Architecture: any
|
||||
Architecture: any
|
||||
Binary: python-at-spi
|
||||
Binary: python-at-spi
|
||||
Build-Depends: debhelper (>= 5), cdbs, libatspi-dev, python-pyrex, python-support (>= 0.4), python-all-dev, libx11-dev
|
||||
Build-Depends: debhelper (>= 5), cdbs, libatspi-dev, python-pyrex, python-support (>= 0.4), python-all-dev, libx11-dev
|
||||
Checksums-Sha1:
|
||||
Checksums-Sha1:
|
||||
Checksums-Sha256:
|
||||
Checksums-Sha256:
|
||||
Checksums-Sha512:
|
||||
Checksums-Sha512:
|
||||
Directory: pool/main/p/pyspi
|
||||
Directory: pool/main/p/pyspi
|
||||
Files:
|
||||
Files:
|
||||
Format: 1.0
|
||||
Format: 1.0
|
||||
Homepage: http://people.redhat.com/zcerza/dogtail
|
||||
Homepage: http://people.redhat.com/zcerza/dogtail
|
||||
Maintainer: Jose Carlos Garcia Sogo <jsogo@debian.org>
|
||||
Maintainer: Jose Carlos Garcia Sogo <jsogo@debian.org>
|
||||
Package: pyspi
|
||||
Package: pyspi
|
||||
Standards-Version: 3.7.3
|
||||
Standards-Version: 3.7.3
|
||||
Vcs-Svn: svn://svn.tribulaciones.org/srv/svn/pyspi/trunk
|
||||
Vcs-Svn: svn://svn.tribulaciones.org/srv/svn/pyspi/trunk
|
||||
Version: 0.6.1-1.3
|
||||
Version: 0.6.1-1.4
|
||||
|
||||
@@ -1,25 +1,27 @@
|
||||
Package: libboost-program-options-dev
|
||||
Version: 1.49.0.1
|
||||
Installed-Size: 26
|
||||
Priority: optional
|
||||
Section: libdevel
|
||||
Maintainer: Debian Boost Team <pkg-boost-devel@lists.alioth.debian.org>
|
||||
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).
|
||||
Library to let program developers obtain program options, that is
|
||||
This package forms part of the Boost C++ Libraries collection.
|
||||
This package is a dependency package, which depends on Debian's default
|
||||
command line and config file.
|
||||
Architecture: i386
|
||||
Depends: libboost-program-options1.49-dev
|
||||
Description: program options library for C++ (default version)
|
||||
Filename: pool/main/b/boost-defaults/libboost-program-options-dev_1.49.0.1_i386.deb
|
||||
Homepage: http://www.boost.org/libs/program_options/
|
||||
Installed-Size: 26
|
||||
MD5sum: 0035d7822b2f8f0ec4013f270fd650c2
|
||||
Maintainer: Debian Boost Team <pkg-boost-devel@lists.alioth.debian.org>
|
||||
Package: libboost-program-options-dev
|
||||
Priority: optional
|
||||
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/
|
||||
SHA512: d7302241373da972aa9b9e71d2fd769b31a38f71182aa71bc0d69d090d452c69bb74b8612c002ccf8a89c279ced84ac27177c8b92d20f00023b3d268e6cec69c
|
||||
Section: libdevel
|
||||
Size: 2738
|
||||
|
||||
Source: boost-defaults
|
||||
Version: 1.49.0.1
|
||||
@@ -2,34 +2,10 @@ Origin: . maverick
|
||||
Label: . maverick
|
||||
Suite: maverick
|
||||
Codename: maverick
|
||||
Date: Sun, 22 Feb 2015 10:44:40 UTC
|
||||
Architectures: i386
|
||||
Components: main
|
||||
Description: Generated by aptly
|
||||
MD5Sum:
|
||||
585addbc83368aeee669c9c4894aa85d 601 main/binary-i386/Packages.gz
|
||||
c6622332526ac6c6b0e3945ed4977d92 650 main/binary-i386/Packages.bz2
|
||||
d41d8cd98f00b204e9800998ecf8427e 0 main/source/Sources
|
||||
f41c10a4b35cd3e1ec8abb9c2ab676ed 23 main/source/Sources.gz
|
||||
4059d198768f9f8dc9372dc1c54bc3c3 14 main/source/Sources.bz2
|
||||
2dea0f34410be57d2e41713f14dd047b 90 main/binary-i386/Release
|
||||
c002a2d87044f69fe3f535cd126db3ba 92 main/source/Release
|
||||
c03724183668d701ac6aa300d13af562 984 main/binary-i386/Packages
|
||||
SHA1:
|
||||
312c9eb461c3bc08d26355f4e233ea761573fad4 601 main/binary-i386/Packages.gz
|
||||
7f5a42f1cccde76e61db4785cc7e2d568366527f 650 main/binary-i386/Packages.bz2
|
||||
da39a3ee5e6b4b0d3255bfef95601890afd80709 0 main/source/Sources
|
||||
92c6cff562771f64540523a54baaa0b2afe54b3f 23 main/source/Sources.gz
|
||||
64a543afbb5f4bf728636bdcbbe7a2ed0804adc2 14 main/source/Sources.bz2
|
||||
689d7b3d67cb1cc3d4a0e730a2c2462aa3344fef 90 main/binary-i386/Release
|
||||
a4d68060e2ba2b00073d2b8848224b30c81a2060 92 main/source/Release
|
||||
5baf9f7d7ece54603fe839a414cd652d22da6ba2 984 main/binary-i386/Packages
|
||||
SHA256:
|
||||
2ced8276178f296b76d85f2a2bd640d912923d0110b98c86899be1eac3f98afc 601 main/binary-i386/Packages.gz
|
||||
97fbdadc2dfc8d26c9f4ea11642e208a3abe5d6868ba49b5c855ccfb54311ae3 650 main/binary-i386/Packages.bz2
|
||||
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 main/source/Sources
|
||||
1775fca35fb6a4d31c541746eaea63c5cb3c00280c8b5a351d4e944cdca7489d 23 main/source/Sources.gz
|
||||
d3dda84eb03b9738d118eb2be78e246106900493c0ae07819ad60815134a8058 14 main/source/Sources.bz2
|
||||
faa23b79fc6811f4eb4839e2a98bb023c9d70b815b1f39b1e54b8c42a0afc74e 90 main/binary-i386/Release
|
||||
8fd77dcde4aacfdaca30f1c74ec058ffdb79ec741ec0c04647c90d927f74ced8 92 main/source/Release
|
||||
e16e3432eaf9a48f782c2afc92263819d2295169d276635282a163cb4b8da073 984 main/binary-i386/Packages
|
||||
SHA512:
|
||||
|
||||
@@ -2,34 +2,10 @@ Origin: . maverick
|
||||
Label: . maverick
|
||||
Suite: maverick
|
||||
Codename: maverick
|
||||
Date: Sun, 22 Feb 2015 10:45:11 UTC
|
||||
Architectures: amd64 i386
|
||||
Components: main
|
||||
Description: Generated by aptly
|
||||
MD5Sum:
|
||||
ed4a96d0034fa903b943468d1a7cb73b 91 main/binary-amd64/Release
|
||||
2dea0f34410be57d2e41713f14dd047b 90 main/binary-i386/Release
|
||||
9fe269c89d1aac6bceeef8d9df4b3735 1526 main/binary-amd64/Packages
|
||||
a6f1ebab83ff467727220c85cb3fb093 863 main/binary-amd64/Packages.gz
|
||||
583f5b63ccd8f833789357440f414eaf 930 main/binary-amd64/Packages.bz2
|
||||
515b376e5200e6e5c3d26b2bb3466123 1524 main/binary-i386/Packages
|
||||
9b03fafb2b578c5e678a85ffd2950084 865 main/binary-i386/Packages.gz
|
||||
548ab0b40975dc0e28a0f97421294c1d 929 main/binary-i386/Packages.bz2
|
||||
SHA1:
|
||||
95af074e15d6a50d8f5defdf5f8a0f464d62ce97 91 main/binary-amd64/Release
|
||||
689d7b3d67cb1cc3d4a0e730a2c2462aa3344fef 90 main/binary-i386/Release
|
||||
f4d8cfac4c02f57be17a0888971a7af5d68fe58b 1526 main/binary-amd64/Packages
|
||||
c0b190dc735a59e18db4a6db3cbe2f06615f0f6b 863 main/binary-amd64/Packages.gz
|
||||
bdecced219abb1db32c0df390f19df5f8656f975 930 main/binary-amd64/Packages.bz2
|
||||
d96e51c75dc23ae516d10f27931d46a65ed136e2 1524 main/binary-i386/Packages
|
||||
8c6f4dc45c9870d5b73751ba336640220f70d4c8 865 main/binary-i386/Packages.gz
|
||||
16d49629b2fcc5eb3557fe4a712953d255ef2042 929 main/binary-i386/Packages.bz2
|
||||
SHA256:
|
||||
3d9f8a049c9f85b8755316b04240369f73e0b74a8e4e64d008b46116e47f656e 91 main/binary-amd64/Release
|
||||
faa23b79fc6811f4eb4839e2a98bb023c9d70b815b1f39b1e54b8c42a0afc74e 90 main/binary-i386/Release
|
||||
7af97eb8a100b006cc2b49c9d12b4ed78e2ba89c05ff8c0059898c8eab9b1400 1526 main/binary-amd64/Packages
|
||||
cc842568f69d941516414b5753e9c1f500bfe6a209ee2d0cece17554715eabdb 863 main/binary-amd64/Packages.gz
|
||||
e1511b7ffc5f9bcc6e1fdcfb32e5a8902f339f28910776d771de8c0dcd10034e 930 main/binary-amd64/Packages.bz2
|
||||
1c06ffbaae938cca6f1471c7074fbf1ae5da09033183a4e41d9d4737ddc19048 1524 main/binary-i386/Packages
|
||||
e469b02604cec35f69912b375b948ff2190a8741cd74ca175d6baed7ba4ca280 865 main/binary-i386/Packages.gz
|
||||
af51d9566c47b93ca2bbd2004db83f90e3598e76b3925781358781799a24c39b 929 main/binary-i386/Packages.bz2
|
||||
SHA512:
|
||||
|
||||
@@ -79,8 +79,10 @@ class PublishRepo1Test(BaseTest):
|
||||
h = hashlib.md5()
|
||||
elif len(fileHash) == 40:
|
||||
h = hashlib.sha1()
|
||||
else:
|
||||
elif len(fileHash) == 64:
|
||||
h = hashlib.sha256()
|
||||
else:
|
||||
h = hashlib.sha512()
|
||||
|
||||
h.update(self.read_file(os.path.join('public/dists/maverick', path)))
|
||||
|
||||
@@ -471,8 +473,10 @@ class PublishRepo17Test(BaseTest):
|
||||
h = hashlib.md5()
|
||||
elif len(fileHash) == 40:
|
||||
h = hashlib.sha1()
|
||||
else:
|
||||
elif len(fileHash) == 64:
|
||||
h = hashlib.sha256()
|
||||
else:
|
||||
h = hashlib.sha512()
|
||||
|
||||
h.update(self.read_file(os.path.join('public/dists/maverick', path)))
|
||||
|
||||
|
||||
@@ -91,8 +91,10 @@ class PublishSnapshot1Test(BaseTest):
|
||||
h = hashlib.md5()
|
||||
elif len(fileHash) == 40:
|
||||
h = hashlib.sha1()
|
||||
else:
|
||||
elif len(fileHash) == 64:
|
||||
h = hashlib.sha256()
|
||||
else:
|
||||
h = hashlib.sha512()
|
||||
|
||||
h.update(self.read_file(os.path.join('public/dists/maverick', path)))
|
||||
|
||||
@@ -731,8 +733,10 @@ class PublishSnapshot26Test(BaseTest):
|
||||
h = hashlib.md5()
|
||||
elif len(fileHash) == 40:
|
||||
h = hashlib.sha1()
|
||||
else:
|
||||
elif len(fileHash) == 64:
|
||||
h = hashlib.sha256()
|
||||
else:
|
||||
h = hashlib.sha512()
|
||||
|
||||
h.update(self.read_file(os.path.join('public/dists/maverick', path)))
|
||||
|
||||
@@ -878,61 +882,61 @@ class PublishSnapshot35Test(BaseTest):
|
||||
"""
|
||||
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",
|
||||
"aptly -architectures=i386,amd64 mirror create -keyring=aptlytest.gpg -filter='$$Source (gnupg)' -with-udebs wheezy http://mirror.yandex.ru/debian/ wheezy main non-free",
|
||||
"aptly mirror update -keyring=aptlytest.gpg wheezy",
|
||||
"aptly snapshot create wheezy from mirror wheezy",
|
||||
]
|
||||
runCmd = "aptly publish snapshot -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec squeeze"
|
||||
runCmd = "aptly publish snapshot -keyring=${files}/aptly.pub -secret-keyring=${files}/aptly.sec wheezy"
|
||||
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/wheezy/InRelease')
|
||||
self.check_exists('public/dists/wheezy/Release')
|
||||
self.check_exists('public/dists/wheezy/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/Contents-i386.gz')
|
||||
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/Contents-udeb-i386.gz')
|
||||
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/Contents-amd64.gz')
|
||||
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_exists('public/dists/squeeze/main/Contents-udeb-amd64.gz')
|
||||
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/dists/wheezy/main/binary-i386/Release')
|
||||
self.check_exists('public/dists/wheezy/main/binary-i386/Packages')
|
||||
self.check_exists('public/dists/wheezy/main/binary-i386/Packages.gz')
|
||||
self.check_exists('public/dists/wheezy/main/binary-i386/Packages.bz2')
|
||||
self.check_exists('public/dists/wheezy/main/Contents-i386.gz')
|
||||
self.check_exists('public/dists/wheezy/main/debian-installer/binary-i386/Release')
|
||||
self.check_exists('public/dists/wheezy/main/debian-installer/binary-i386/Packages')
|
||||
self.check_exists('public/dists/wheezy/main/debian-installer/binary-i386/Packages.gz')
|
||||
self.check_exists('public/dists/wheezy/main/debian-installer/binary-i386/Packages.bz2')
|
||||
self.check_exists('public/dists/wheezy/main/Contents-udeb-i386.gz')
|
||||
self.check_exists('public/dists/wheezy/main/binary-amd64/Release')
|
||||
self.check_exists('public/dists/wheezy/main/binary-amd64/Packages')
|
||||
self.check_exists('public/dists/wheezy/main/binary-amd64/Packages.gz')
|
||||
self.check_exists('public/dists/wheezy/main/binary-amd64/Packages.bz2')
|
||||
self.check_exists('public/dists/wheezy/main/Contents-amd64.gz')
|
||||
self.check_exists('public/dists/wheezy/main/debian-installer/binary-amd64/Release')
|
||||
self.check_exists('public/dists/wheezy/main/debian-installer/binary-amd64/Packages')
|
||||
self.check_exists('public/dists/wheezy/main/debian-installer/binary-amd64/Packages.gz')
|
||||
self.check_exists('public/dists/wheezy/main/debian-installer/binary-amd64/Packages.bz2')
|
||||
self.check_exists('public/dists/wheezy/main/Contents-udeb-amd64.gz')
|
||||
self.check_not_exists('public/dists/wheezy/main/source/Sources')
|
||||
self.check_not_exists('public/dists/wheezy/main/source/Sources.gz')
|
||||
self.check_not_exists('public/dists/wheezy/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_exists('public/pool/main/g/gnupg/gpgv-udeb_1.4.12-7+deb7u7_amd64.udeb')
|
||||
self.check_exists('public/pool/main/g/gnupg/gpgv-udeb_1.4.12-7+deb7u7_i386.udeb')
|
||||
self.check_exists('public/pool/main/g/gnupg/gpgv_1.4.12-7+deb7u7_amd64.deb')
|
||||
self.check_exists('public/pool/main/g/gnupg/gpgv_1.4.12-7+deb7u7_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)
|
||||
self.check_file_contents('public/dists/wheezy/main/binary-i386/Packages', 'packages_i386', match_prepare=sorted_processor)
|
||||
self.check_file_contents('public/dists/wheezy/main/debian-installer/binary-i386/Packages', 'packages_udeb_i386', match_prepare=sorted_processor)
|
||||
self.check_file_contents('public/dists/wheezy/main/binary-amd64/Packages', 'packages_amd64', match_prepare=sorted_processor)
|
||||
self.check_file_contents('public/dists/wheezy/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/wheezy/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)
|
||||
self.check_file_contents('public/dists/wheezy/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 = self.read_file('public/dists/wheezy/Release').split("\n")
|
||||
release = [l for l in release if l.startswith(" ")]
|
||||
pathsSeen = set()
|
||||
for l in release:
|
||||
@@ -941,7 +945,7 @@ class PublishSnapshot35Test(BaseTest):
|
||||
|
||||
fileSize = int(fileSize)
|
||||
|
||||
st = os.stat(os.path.join(os.environ["HOME"], ".aptly", 'public/dists/squeeze/', path))
|
||||
st = os.stat(os.path.join(os.environ["HOME"], ".aptly", 'public/dists/wheezy/', path))
|
||||
if fileSize != st.st_size:
|
||||
raise Exception("file size doesn't match for %s: %d != %d" % (path, fileSize, st.st_size))
|
||||
|
||||
@@ -949,10 +953,12 @@ class PublishSnapshot35Test(BaseTest):
|
||||
h = hashlib.md5()
|
||||
elif len(fileHash) == 40:
|
||||
h = hashlib.sha1()
|
||||
else:
|
||||
elif len(fileHash) == 64:
|
||||
h = hashlib.sha256()
|
||||
else:
|
||||
h = hashlib.sha512()
|
||||
|
||||
h.update(self.read_file(os.path.join('public/dists/squeeze', path)))
|
||||
h.update(self.read_file(os.path.join('public/dists/wheezy', path)))
|
||||
|
||||
if h.hexdigest() != fileHash:
|
||||
raise Exception("file hash doesn't match for %s: %s != %s" % (path, fileHash, h.hexdigest()))
|
||||
|
||||
@@ -73,8 +73,10 @@ class PublishSwitch1Test(BaseTest):
|
||||
h = hashlib.md5()
|
||||
elif len(fileHash) == 40:
|
||||
h = hashlib.sha1()
|
||||
else:
|
||||
elif len(fileHash) == 64:
|
||||
h = hashlib.sha256()
|
||||
else:
|
||||
h = hashlib.sha512()
|
||||
|
||||
h.update(self.read_file(os.path.join('public/dists/maverick', path)))
|
||||
|
||||
@@ -331,8 +333,10 @@ class PublishSwitch8Test(BaseTest):
|
||||
h = hashlib.md5()
|
||||
elif len(fileHash) == 40:
|
||||
h = hashlib.sha1()
|
||||
else:
|
||||
elif len(fileHash) == 64:
|
||||
h = hashlib.sha256()
|
||||
else:
|
||||
h = hashlib.sha512()
|
||||
|
||||
h.update(self.read_file(os.path.join('public/dists/maverick', path)))
|
||||
|
||||
|
||||
@@ -72,8 +72,10 @@ class PublishUpdate1Test(BaseTest):
|
||||
h = hashlib.md5()
|
||||
elif len(fileHash) == 40:
|
||||
h = hashlib.sha1()
|
||||
else:
|
||||
elif len(fileHash) == 64:
|
||||
h = hashlib.sha256()
|
||||
else:
|
||||
h = hashlib.sha512()
|
||||
|
||||
h.update(self.read_file(os.path.join('public/dists/maverick', path)))
|
||||
|
||||
|
||||
@@ -21,6 +21,6 @@ End command output: ------------------------------
|
||||
4) [Running]: version
|
||||
|
||||
Begin command output: ----------------------------
|
||||
aptly version: 0.9.6
|
||||
aptly version: 0.9.7
|
||||
|
||||
End command output: ------------------------------
|
||||
|
||||
@@ -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 <jsogo@debian.org>
|
||||
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
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user