Compare commits

..

51 Commits

Author SHA1 Message Date
Andrey Smirnov 52f7c83f95 Release 0.9.7. 2016-04-18 12:30:36 +03:00
Andrey Smirnov d7665119e4 Few more fixes. 2016-03-28 13:44:19 +03:00
Andrey Smirnov 587086beb4 Misc style and simple mistakes fixes. 2016-03-28 13:34:05 +03:00
Andrey Smirnov 644d24d1cc Attempt to lower memory usage when publishing with contents. 2016-03-28 13:28:26 +03:00
Andrey Smirnov 2fe8cfdc12 Allow credentials for S3 SigV2 to be specified in config once again. #356 2016-03-28 12:52:50 +03:00
Andrey Smirnov 2ecd933d50 Merge pull request #372 from amalakar/add_sbt_aptly
Add link to scala sbt plugin
2016-03-27 23:02:15 +03:00
Andrey Smirnov 90ea1111e2 Merge pull request #371 from smira/s3-list-fix
Replace object listing with SDK-standard iteration.
2016-03-27 23:01:53 +03:00
Andrey Smirnov 165a1c53b5 Merge pull request #368 from smira/225-duplicates-package-search
Fix package search missing duplicate packages. #225
2016-03-27 23:01:38 +03:00
Arup Malakar 876935050a Add link to scala sbt plugin 2016-03-26 10:35:32 -07:00
Andrey Smirnov d9a1299f6b Replace object listing with SDK-standard iteration. 2016-03-24 13:04:16 +03:00
Andrey Smirnov ff52d2655a Fix package search missing duplicate packages. #225
Implement package list with duplicate entries, use it when
initiating search from PackageCollection.
2016-03-22 12:23:13 +03:00
Andrey Smirnov bc438ff694 Add @bentoi and @geofft to AUTHORS. [ci skip] 2016-03-20 22:12:28 +03:00
Andrey Smirnov 0db3cac281 Merge pull request #366 from geofft/signing
gpg: Sign with SHA-256 for compatibility with APT 1.2.7
2016-03-20 22:10:48 +03:00
Andrey Smirnov 9ed6e8dbbd Merge pull request #367 from bentoi/mkdir_mask_bug
Fixed mkdir mode from 755 to 777
2016-03-20 22:10:32 +03:00
Andrey Smirnov 7294241c08 Merge branch 's3-sigv2-debug' 2016-03-20 22:02:03 +03:00
Andrey Smirnov 60cca0245b Fix system tests. 2016-03-20 22:01:41 +03:00
Andrey Smirnov 75b860e0b1 Support SigV2 and S3 debug for publishing. 2016-03-20 20:11:19 +03:00
Benoit Foucher 7f5a7323a6 Fixed mkdir mode from 755 to 777 2016-03-18 09:37:18 +00:00
Geoffrey Thomas 1069458aee gpg: Sign with SHA-256 for compatibility with APT 1.2.7 2016-03-15 17:04:15 -04:00
Andrey Smirnov 76edf9649b Update goleveldb with latest fix. 2016-03-15 12:47:47 +03:00
Andrey Smirnov 8b0d293c6a Update public key ID for repo.aptly.info 2016-03-15 12:30:32 +03:00
Andrey Smirnov 281d0dd68d Merge branch 'apachelogger-issue/361' 2016-03-10 18:42:49 +03:00
Andrey Smirnov cfaa8f3881 Fix system tests. 2016-03-10 18:42:40 +03:00
Harald Sitter f1b6841757 add Checksums-Sha512 to isMultilineField
Otherwise line breaks are not properly handled and the output contains
excess newlines

Fixes #361
2016-03-10 14:40:10 +01:00
Andrey Smirnov b966b2eabf Fix HOME expansion. 2016-03-02 13:56:11 +03:00
Andrey Smirnov a4e573bb07 Fix system tests after squeeze->squeeze-lts move. 2016-03-02 13:25:12 +03:00
Andrey Smirnov 067d197dac Update to latest version of goleveldb. 2016-03-01 12:53:25 +03:00
Andrey Smirnov 18d04c7977 Fix failure not being reported from API. #290 2016-03-01 12:52:54 +03:00
Andrey Smirnov a29453805c Publish under root using :. explicit prefix. #339 2016-03-01 12:34:59 +03:00
Andrey Smirnov 05b1296144 Merge pull request #354 from smira/313-sha512
Support for SHA-512 hashes on publishing/downloads.
2016-02-18 13:06:44 +03:00
Andrey Smirnov 29e33069aa Merge pull request #355 from smira/remove-s3-retrying-client
Remove S3 retrying client which is leftover from goamz times.
2016-02-18 13:05:46 +03:00
Andrey Smirnov ee05bb23c9 Fix Swift tests for SHA512. 2016-02-18 12:29:12 +03:00
Andrey Smirnov 505da096e6 Remove S3 retrying client which is leftover from goamz times.
Also workaround go vet warnings in s3/sever_test.go
2016-02-18 12:03:04 +03:00
Andrey Smirnov 77be7b9e3b Support for SHA-512 hashes on publishing/downloads. 2016-02-18 12:01:51 +03:00
Andrey Smirnov ffafed472c Merge pull request #347 from smira/skip-contents
Make 'skipContents' configurable in API. #345
2016-02-14 15:06:49 +03:00
Andrey Smirnov 8c9cc41099 Fix nil pointer dereference on S3 publishing. #338 2016-02-14 14:52:49 +03:00
Andrey Smirnov f50e008763 Make 'SkipContents' configurable in API. #345
Also add global configuration to disable 'skipContents' by
default for all new published repos/snapshots.
2016-02-14 14:49:16 +03:00
Andrey Smirnov 64b04c2764 Merge pull request #346 from smira/api-no-lock-fix
Flush collection contents on each DB unlock in API.
2016-02-14 14:13:52 +03:00
Andrey Smirnov d6c7a9a89c Flush collection contents on each DB unlock in API.
See #343
2016-02-13 13:36:35 +03:00
Andrey Smirnov 0339f0fe23 Allow additional options for goxc [ci skip] 2016-02-11 12:46:09 +03:00
Andrey Smirnov fcedaa3fc5 Merge branch 'bitglue-aws_sdk' #344 2016-02-09 12:00:16 +03:00
Andrey Smirnov 7acfc84c9d Add @bitglue to AUTHORS. [ci skip] 2016-02-09 11:47:29 +03:00
Andrey Smirnov 02b937ad17 Fix unit-tests. 2016-02-08 14:42:30 +03:00
Andrey Smirnov 7ad1c1ad17 Fix dependencies. #344 2016-02-04 11:05:37 +03:00
Phil Frost 640bd2b530 Use official AWS SDK; support STS credentials
Now that there's an official Go AWS SDK from Amazon, use that instead of
goamz. goamz isn't getting much love these days.

Implement support for STS credentials, as in assumed roles and EC2
instance profiles. The configuration is extended to support a session
token, though I'm not sure why anyone would put temporary credentials in
a configuration file. More likely, no credentials will be explicitly
configured at all, and they will be discovered through the standard SDK
mechanisms described at
<https://blogs.aws.amazon.com/security/post/Tx3D6U6WSFGOK2H/A-New-and-Standardized-Way-to-Manage-Credentials-in-the-AWS-SDKs>.

Resolves #342.
2016-02-03 15:13:01 -05:00
Andrey Smirnov 06149ef2bb Merge pull request #340 from bryanhong/master
another example of aptly in Docker
2016-02-03 17:44:00 +03:00
Bryan Hong b271e8fe31 another example of aptly in Docker 2016-02-03 00:33:03 -08:00
Andrey Smirnov efc6ab27db goxc-based build system 2016-02-02 13:03:18 +03:00
Andrey Smirnov 05c063839d Update to smira/lzma with import path fixed. 2016-02-02 11:56:13 +03:00
Andrey Smirnov fd30b37a0e Bump version to 0.9.7~dev. 2016-01-24 23:15:23 +03:00
Andrey Smirnov 9738687116 Add -no-lock to aptly api serve to excercise locking. 2016-01-24 23:02:46 +03:00
109 changed files with 1825 additions and 1105 deletions
+38
View File
@@ -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"
}
+3
View File
@@ -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)
+6 -3
View File
@@ -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'
+8 -12
View File
@@ -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
View File
@@ -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
View File
@@ -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
}
}
+16
View File
@@ -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
View File
@@ -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
+2
View File
@@ -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
View File
@@ -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
View File
@@ -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
}
+6
View File
@@ -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
View File
@@ -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
+6
View File
@@ -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
}
+6
View File
@@ -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
View File
@@ -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
View File
@@ -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)
}
+1 -1
View File
@@ -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)
+6
View File
@@ -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
View File
@@ -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
View File
@@ -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
+1 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
+4 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
}
+699
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -1 +1 @@
aptly version: 0.9.6
aptly version: 0.9.7
+1
View File
@@ -12,6 +12,7 @@
"downloadSourcePackages": false,
"ppaDistributorID": "ubuntu",
"ppaCodename": "",
"skipContentsPublishing": false,
"S3PublishEndpoints": {},
"SwiftPublishEndpoints": {}
}
+1
View File
@@ -12,6 +12,7 @@
"downloadSourcePackages": false,
"ppaDistributorID": "ubuntu",
"ppaCodename": "",
"skipContentsPublishing": false,
"S3PublishEndpoints": {},
"SwiftPublishEndpoints": {}
}
+10 -8
View File
@@ -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
+9 -8
View File
@@ -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
+5 -3
View File
@@ -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:
+2 -2
View File
@@ -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>`.
+31 -28
View File
@@ -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
+3 -3
View File
@@ -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)
+2 -2
View File
@@ -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"
+2 -2
View File
@@ -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:
+19 -17
View File
@@ -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
+1 -25
View File
@@ -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:
+45 -41
View File
@@ -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
+20 -18
View File
@@ -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
+1 -25
View File
@@ -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:
+1 -25
View File
@@ -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:
+19 -17
View File
@@ -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
+1 -25
View File
@@ -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:
+45 -41
View File
@@ -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
+20 -18
View File
@@ -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
+1 -25
View File
@@ -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:
+1 -25
View File
@@ -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:
+6 -2
View File
@@ -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)))
+52 -46
View File
@@ -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()))
+6 -2
View File
@@ -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)))
+3 -1
View File
@@ -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)))
+1 -1
View File
@@ -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