mirror of
https://github.com/restic/restic.git
synced 2026-09-14 16:27:59 +00:00
Compare commits
4
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0912a8db07 | ||
|
|
eefeb387d9 | ||
|
|
c7d789ab04 | ||
|
|
92918ef1b6 |
@@ -4,7 +4,7 @@ take a lot longer to find the problem! Please take the time to help us
|
|||||||
debugging the problem by collecting information, even if it seems irrelevant to
|
debugging the problem by collecting information, even if it seems irrelevant to
|
||||||
you. Thanks!
|
you. Thanks!
|
||||||
|
|
||||||
If you have a question, the forum at https://forum.restic.net is a better place.
|
If you have a question, the forum at https://discourse.restic.net is a better place.
|
||||||
Please do not create issues for usage or documentation questions! We're using
|
Please do not create issues for usage or documentation questions! We're using
|
||||||
the GitHub issue tracker mainly for tracking bugs and feature requests.
|
the GitHub issue tracker mainly for tracking bugs and feature requests.
|
||||||
-->
|
-->
|
||||||
|
|||||||
+5
-8
@@ -2,9 +2,8 @@ language: go
|
|||||||
sudo: false
|
sudo: false
|
||||||
|
|
||||||
go:
|
go:
|
||||||
- "1.8.x"
|
- 1.8.x
|
||||||
- "1.9.x"
|
- 1.9.x
|
||||||
- "1.10"
|
|
||||||
|
|
||||||
os:
|
os:
|
||||||
- linux
|
- linux
|
||||||
@@ -17,14 +16,12 @@ env:
|
|||||||
matrix:
|
matrix:
|
||||||
exclude:
|
exclude:
|
||||||
- os: osx
|
- os: osx
|
||||||
go: "1.8.x"
|
go: 1.8.x
|
||||||
- os: osx
|
|
||||||
go: "1.9.x"
|
|
||||||
- os: linux
|
- os: linux
|
||||||
go: "1.10"
|
go: 1.9.x
|
||||||
include:
|
include:
|
||||||
- os: linux
|
- os: linux
|
||||||
go: "1.10"
|
go: 1.9.x
|
||||||
sudo: true
|
sudo: true
|
||||||
env:
|
env:
|
||||||
RESTIC_TEST_FUSE=1
|
RESTIC_TEST_FUSE=1
|
||||||
|
|||||||
+2
-174
@@ -1,175 +1,3 @@
|
|||||||
Changelog for restic 0.8.2 (2018-02-17)
|
|
||||||
=======================================
|
|
||||||
|
|
||||||
The following sections list the changes in restic 0.8.2 relevant to
|
|
||||||
restic users. The changes are ordered by importance.
|
|
||||||
|
|
||||||
Summary
|
|
||||||
-------
|
|
||||||
|
|
||||||
* Fix #1506: Limit bandwith at the http.RoundTripper for HTTP based backends
|
|
||||||
* Fix #1512: Restore directory permissions as the last step
|
|
||||||
* Fix #1528: Correctly create missing subdirs in data/
|
|
||||||
* Fix #1590: Strip spaces for lines read via --files-from
|
|
||||||
* Fix #1589: Complete intermediate index upload
|
|
||||||
* Fix #1594: Google Cloud Storage: Use generic HTTP transport
|
|
||||||
* Fix #1595: Backup: Remove bandwidth display
|
|
||||||
* Enh #1522: Add support for TLS client certificate authentication
|
|
||||||
* Enh #1541: Reduce number of remote requests during repository check
|
|
||||||
* Enh #1567: Reduce number of backend requests for rebuild-index and prune
|
|
||||||
* Enh #1507: Only reload snapshots once per minute for fuse mount
|
|
||||||
* Enh #1538: Reduce memory allocations for querying the index
|
|
||||||
* Enh #1549: Speed up querying across indices and scanning existing files
|
|
||||||
* Enh #1554: Fuse/mount: Correctly handle EOF, add template option
|
|
||||||
* Enh #1564: Don't terminate ssh on SIGINT
|
|
||||||
* Enh #1579: Retry Backend.List() in case of errors
|
|
||||||
* Enh #1584: Limit index file size
|
|
||||||
|
|
||||||
Details
|
|
||||||
-------
|
|
||||||
|
|
||||||
* Bugfix #1506: Limit bandwith at the http.RoundTripper for HTTP based backends
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/1506
|
|
||||||
https://github.com/restic/restic/pull/1511
|
|
||||||
|
|
||||||
* Bugfix #1512: Restore directory permissions as the last step
|
|
||||||
|
|
||||||
This change allows restoring into directories that were not writable during backup. Before,
|
|
||||||
restic created the directory, set the read-only mode and then failed to create files in the
|
|
||||||
directory. This change now restores the directory (with its permissions) as the very last
|
|
||||||
step.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/1512
|
|
||||||
https://github.com/restic/restic/pull/1536
|
|
||||||
|
|
||||||
* Bugfix #1528: Correctly create missing subdirs in data/
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/1528
|
|
||||||
https://github.com/restic/restic/pull/1529
|
|
||||||
|
|
||||||
* Bugfix #1590: Strip spaces for lines read via --files-from
|
|
||||||
|
|
||||||
Leading and trailing spaces in lines read via `--files-from` are now stripped, so it behaves
|
|
||||||
the same as with lines read via `--exclude-file`.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/1590
|
|
||||||
https://github.com/restic/restic/pull/1613
|
|
||||||
|
|
||||||
* Bugfix #1589: Complete intermediate index upload
|
|
||||||
|
|
||||||
After a user posted a comprehensive report of what he observed, we were able to find a bug and
|
|
||||||
correct it: During backup, restic uploads so-called "intermediate" index files. When the
|
|
||||||
backup finishes during a transfer of such an intermediate index, the upload is cancelled, but
|
|
||||||
the backup is finished without an error. This leads to an inconsistent state, where the
|
|
||||||
snapshot references data that is contained in the repo, but is not referenced in any index.
|
|
||||||
|
|
||||||
The situation can be resolved by building a new index with `rebuild-index`, but looks very
|
|
||||||
confusing at first. Since all the data got uploaded to the repo successfully, there was no risk
|
|
||||||
of data loss, just minor inconvenience for our users.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/1589
|
|
||||||
|
|
||||||
* Bugfix #1594: Google Cloud Storage: Use generic HTTP transport
|
|
||||||
|
|
||||||
It was discovered that the Google Cloud Storage backend did not use the generic HTTP transport,
|
|
||||||
so things such as bandwidth limiting with `--limit-upload` did not work. This is resolved now.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/1594
|
|
||||||
|
|
||||||
* Bugfix #1595: Backup: Remove bandwidth display
|
|
||||||
|
|
||||||
This commit removes the bandwidth displayed during backup process. It is misleading and
|
|
||||||
seldomly correct, because it's neither the "read bandwidth" (only for the very first backup)
|
|
||||||
nor the "upload bandwidth". Many users are confused about (and rightly so), c.f. #1581, #1033,
|
|
||||||
#1591
|
|
||||||
|
|
||||||
We'll eventually replace this display with something more relevant when the new archiver code
|
|
||||||
is ready.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/1595
|
|
||||||
|
|
||||||
* Enhancement #1522: Add support for TLS client certificate authentication
|
|
||||||
|
|
||||||
Support has been added for using a TLS client certificate for authentication to HTTP based
|
|
||||||
backend. A file containing the PEM encoded private key and certificate can be set using the
|
|
||||||
`--tls-client-cert` option.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/1522
|
|
||||||
https://github.com/restic/restic/pull/1524
|
|
||||||
|
|
||||||
* Enhancement #1541: Reduce number of remote requests during repository check
|
|
||||||
|
|
||||||
This change eliminates redundant remote repository calls and significantly improves
|
|
||||||
repository check time.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/1541
|
|
||||||
https://github.com/restic/restic/pull/1548
|
|
||||||
|
|
||||||
* Enhancement #1567: Reduce number of backend requests for rebuild-index and prune
|
|
||||||
|
|
||||||
We've found a way to reduce then number of backend requests for the `rebuild-index` and `prune`
|
|
||||||
operations. This significantly speeds up the operations for high-latency backends.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/1567
|
|
||||||
https://github.com/restic/restic/pull/1574
|
|
||||||
https://github.com/restic/restic/pull/1575
|
|
||||||
|
|
||||||
* Enhancement #1507: Only reload snapshots once per minute for fuse mount
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/1507
|
|
||||||
|
|
||||||
* Enhancement #1538: Reduce memory allocations for querying the index
|
|
||||||
|
|
||||||
This change reduces the internal memory allocations when the index data structures in memory
|
|
||||||
are queried if a blob (part of a file) already exists in the repo. It should speed up backup a bit,
|
|
||||||
and maybe even reduce RAM usage.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/1538
|
|
||||||
|
|
||||||
* Enhancement #1549: Speed up querying across indices and scanning existing files
|
|
||||||
|
|
||||||
This change increases the whenever a blob (part of a file) is searched for in a restic
|
|
||||||
repository. This will reduce cpu usage some when backing up files already backed up by restic.
|
|
||||||
Cpu usage is further decreased when scanning files.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/1549
|
|
||||||
|
|
||||||
* Enhancement #1554: Fuse/mount: Correctly handle EOF, add template option
|
|
||||||
|
|
||||||
We've added the `--snapshot-template` string, which can be used to specify a template for a
|
|
||||||
snapshot directory. In addition, accessing data after the end of a file via the fuse mount is now
|
|
||||||
handled correctly.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/1554
|
|
||||||
|
|
||||||
* Enhancement #1564: Don't terminate ssh on SIGINT
|
|
||||||
|
|
||||||
We've reworked the code which runs the `ssh` login for the sftp backend so that it can prompt for a
|
|
||||||
password (if needed) but does not exit when the user presses CTRL+C (SIGINT) e.g. during
|
|
||||||
backup. This allows restic to properly shut down when it receives SIGINT and remove the lock
|
|
||||||
file from the repo, afterwards exiting the `ssh` process.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/1564
|
|
||||||
https://github.com/restic/restic/pull/1588
|
|
||||||
|
|
||||||
* Enhancement #1579: Retry Backend.List() in case of errors
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/1579
|
|
||||||
|
|
||||||
* Enhancement #1584: Limit index file size
|
|
||||||
|
|
||||||
Before, restic would create a single new index file on `prune` or `rebuild-index`, this may
|
|
||||||
lead to memory problems when this huge index is created and loaded again. We're now limiting the
|
|
||||||
size of the index file, and split newly created index files into several smaller ones. This
|
|
||||||
allows restic to be more memory-efficient.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/1412
|
|
||||||
https://github.com/restic/restic/issues/979
|
|
||||||
https://github.com/restic/restic/issues/526
|
|
||||||
https://github.com/restic/restic/pull/1584
|
|
||||||
|
|
||||||
|
|
||||||
Changelog for restic 0.8.1 (2017-12-27)
|
Changelog for restic 0.8.1 (2017-12-27)
|
||||||
=======================================
|
=======================================
|
||||||
|
|
||||||
@@ -499,7 +327,7 @@ Summary
|
|||||||
* Enh #1061: Add Dockerfile and official Docker image
|
* Enh #1061: Add Dockerfile and official Docker image
|
||||||
* Enh #1126: Use the standard Go git repository layout, use `dep` for vendoring
|
* Enh #1126: Use the standard Go git repository layout, use `dep` for vendoring
|
||||||
* Enh #1134: Add support for storing backups on Google Cloud Storage
|
* Enh #1134: Add support for storing backups on Google Cloud Storage
|
||||||
* Enh #1144: Properly report errors when reading files with exclude patterns
|
* Enh #1144: Properly report errors when reading files with exclude patterns.
|
||||||
* Enh #1149: Add support for storing backups on Microsoft Azure Blob Storage
|
* Enh #1149: Add support for storing backups on Microsoft Azure Blob Storage
|
||||||
* Enh #1196: Add `--group-by` to `forget` command for flexible grouping
|
* Enh #1196: Add `--group-by` to `forget` command for flexible grouping
|
||||||
* Enh #1203: Print stats on all BSD systems when SIGINFO (ctrl+t) is received
|
* Enh #1203: Print stats on all BSD systems when SIGINFO (ctrl+t) is received
|
||||||
@@ -587,7 +415,7 @@ Details
|
|||||||
https://github.com/restic/restic/pull/1134
|
https://github.com/restic/restic/pull/1134
|
||||||
https://github.com/restic/restic/pull/1052
|
https://github.com/restic/restic/pull/1052
|
||||||
|
|
||||||
* Enhancement #1144: Properly report errors when reading files with exclude patterns
|
* Enhancement #1144: Properly report errors when reading files with exclude patterns.
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/1144
|
https://github.com/restic/restic/pull/1144
|
||||||
|
|
||||||
|
|||||||
+1
-2
@@ -120,8 +120,7 @@ down to the following steps:
|
|||||||
|
|
||||||
6. You will receive comments on your code and the feature or bug that they
|
6. You will receive comments on your code and the feature or bug that they
|
||||||
address. Maybe you need to rework some minor things, in this case push new
|
address. Maybe you need to rework some minor things, in this case push new
|
||||||
commits to the branch you created for the pull request (or amend the
|
commits to the branch you created for the pull request, they will be
|
||||||
existing commit, use common sense to decide which is better), they will be
|
|
||||||
automatically added to the pull request.
|
automatically added to the pull request.
|
||||||
|
|
||||||
7. If your pull request changes anything that users should be aware of (a
|
7. If your pull request changes anything that users should be aware of (a
|
||||||
|
|||||||
Generated
+30
-47
@@ -10,20 +10,20 @@
|
|||||||
[[projects]]
|
[[projects]]
|
||||||
name = "cloud.google.com/go"
|
name = "cloud.google.com/go"
|
||||||
packages = ["compute/metadata"]
|
packages = ["compute/metadata"]
|
||||||
revision = "767c40d6a2e058483c25fa193e963a22da17236d"
|
revision = "2d3a6656c17a60b0815b7e06ab0be04eacb6e613"
|
||||||
version = "v0.18.0"
|
version = "v0.16.0"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
name = "github.com/Azure/azure-sdk-for-go"
|
name = "github.com/Azure/azure-sdk-for-go"
|
||||||
packages = ["storage"]
|
packages = ["storage"]
|
||||||
revision = "eae258195456be76b2ec9ad2ee2ab63cdda365d9"
|
revision = "7692b0cef22674113fcf71cc17ac3ccc1a7fef48"
|
||||||
version = "v12.2.0-beta"
|
version = "v11.2.2-beta"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
name = "github.com/Azure/go-autorest"
|
name = "github.com/Azure/go-autorest"
|
||||||
packages = ["autorest","autorest/adal","autorest/azure","autorest/date"]
|
packages = ["autorest","autorest/adal","autorest/azure","autorest/date"]
|
||||||
revision = "c2a68353555b68de3ee8455a4fd3e890a0ac6d99"
|
revision = "c67b24a8e30d876542a85022ebbdecf0e5a935e8"
|
||||||
version = "v9.8.1"
|
version = "v9.4.1"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
name = "github.com/cenkalti/backoff"
|
name = "github.com/cenkalti/backoff"
|
||||||
@@ -65,7 +65,7 @@
|
|||||||
branch = "master"
|
branch = "master"
|
||||||
name = "github.com/golang/protobuf"
|
name = "github.com/golang/protobuf"
|
||||||
packages = ["proto"]
|
packages = ["proto"]
|
||||||
revision = "c65a0412e71e8b9b3bfd22925720d23c0f054237"
|
revision = "1e59b77b52bf8e4b449a57e6f79f21226d571845"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
name = "github.com/inconshreveable/mousetrap"
|
name = "github.com/inconshreveable/mousetrap"
|
||||||
@@ -74,10 +74,10 @@
|
|||||||
version = "v1.0"
|
version = "v1.0"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
name = "github.com/juju/ratelimit"
|
name = "github.com/juju/ratelimit"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
revision = "59fac5042749a5afb9af70e813da1dd5474f0167"
|
revision = "59fac5042749a5afb9af70e813da1dd5474f0167"
|
||||||
version = "1.0.1"
|
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
@@ -92,27 +92,22 @@
|
|||||||
version = "v0.2.1"
|
version = "v0.2.1"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
name = "github.com/marstr/guid"
|
branch = "master"
|
||||||
|
name = "github.com/minio/go-homedir"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
revision = "8bdf7d1a087ccc975cf37dd6507da50698fd19ca"
|
revision = "21304a94172ae3a09dee2cd86a12fb6f842138c7"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
name = "github.com/minio/minio-go"
|
name = "github.com/minio/minio-go"
|
||||||
packages = [".","pkg/credentials","pkg/encrypt","pkg/policy","pkg/s3signer","pkg/s3utils","pkg/set"]
|
packages = [".","pkg/credentials","pkg/encrypt","pkg/policy","pkg/s3signer","pkg/s3utils","pkg/set"]
|
||||||
revision = "14f1d472d115bac5ca4804094aa87484a72ced61"
|
revision = "57a8ae886b49af6eb0d2c27c2d007ed2f71e1da5"
|
||||||
version = "4.0.6"
|
version = "4.0.3"
|
||||||
|
|
||||||
[[projects]]
|
|
||||||
branch = "master"
|
|
||||||
name = "github.com/mitchellh/go-homedir"
|
|
||||||
packages = ["."]
|
|
||||||
revision = "b8bc1bf767474819792c23f32d8286a45736f1c6"
|
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
name = "github.com/ncw/swift"
|
name = "github.com/ncw/swift"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
revision = "ae9f0ea1605b9aa6434ed5c731ca35d83ba67c55"
|
revision = "c95c6e5c2d1a3d37fc44c8c6dc9e231c7500667d"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
name = "github.com/pkg/errors"
|
name = "github.com/pkg/errors"
|
||||||
@@ -129,8 +124,8 @@
|
|||||||
[[projects]]
|
[[projects]]
|
||||||
name = "github.com/pkg/sftp"
|
name = "github.com/pkg/sftp"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
revision = "f6a9258a0f570c3a76681b897b6ded57cb0dfa88"
|
revision = "98203f5a8333288eb3163b7c667d4260fe1333e9"
|
||||||
version = "1.2.0"
|
version = "1.0.0"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
name = "github.com/pkg/xattr"
|
name = "github.com/pkg/xattr"
|
||||||
@@ -151,16 +146,16 @@
|
|||||||
version = "v1.5"
|
version = "v1.5"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
name = "github.com/satori/go.uuid"
|
name = "github.com/satori/uuid"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
revision = "f58768cc1a7a7e77a3bd49e98cdd21419399b6a3"
|
revision = "879c5887cd475cd7864858769793b2ceb0d44feb"
|
||||||
version = "v1.2.0"
|
version = "v1.1.0"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
name = "github.com/sirupsen/logrus"
|
name = "github.com/sirupsen/logrus"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
revision = "d682213848ed68c0a260ca37d6dd5ace8423f5ba"
|
revision = "f006c2ac4710855cf0f916dd6b77acf6b048dc6e"
|
||||||
version = "v1.0.4"
|
version = "v1.0.3"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
name = "github.com/spf13/cobra"
|
name = "github.com/spf13/cobra"
|
||||||
@@ -177,44 +172,32 @@
|
|||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
name = "golang.org/x/crypto"
|
name = "golang.org/x/crypto"
|
||||||
packages = ["curve25519","ed25519","ed25519/internal/edwards25519","internal/chacha20","pbkdf2","poly1305","scrypt","ssh","ssh/terminal"]
|
packages = ["curve25519","ed25519","ed25519/internal/edwards25519","pbkdf2","poly1305","scrypt","ssh","ssh/terminal"]
|
||||||
revision = "3d37316aaa6bd9929127ac9a527abf408178ea7b"
|
revision = "94eea52f7b742c7cbe0b03b22f0c4c8631ece122"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
name = "golang.org/x/net"
|
name = "golang.org/x/net"
|
||||||
packages = ["context","context/ctxhttp","idna","lex/httplex"]
|
packages = ["context","context/ctxhttp","webdav","webdav/internal/xml"]
|
||||||
revision = "5ccada7d0a7ba9aeb5d3aca8d3501b4c2a509fec"
|
revision = "a8b9294777976932365dabb6640cf1468d95c70f"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
name = "golang.org/x/oauth2"
|
name = "golang.org/x/oauth2"
|
||||||
packages = [".","google","internal","jws","jwt"]
|
packages = [".","google","internal","jws","jwt"]
|
||||||
revision = "b28fcf2b08a19742b43084fb40ab78ac6c3d8067"
|
revision = "f95fa95eaa936d9d87489b15d1d18b97c1ba9c28"
|
||||||
|
|
||||||
[[projects]]
|
|
||||||
branch = "master"
|
|
||||||
name = "golang.org/x/sync"
|
|
||||||
packages = ["errgroup"]
|
|
||||||
revision = "fd80eb99c8f653c847d294a001bdf2a3a6f768f5"
|
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
name = "golang.org/x/sys"
|
name = "golang.org/x/sys"
|
||||||
packages = ["unix","windows"]
|
packages = ["unix","windows"]
|
||||||
revision = "af50095a40f9041b3b38960738837185c26e9419"
|
revision = "8b4580aae2a0dd0c231a45d3ccb8434ff533b840"
|
||||||
|
|
||||||
[[projects]]
|
|
||||||
branch = "master"
|
|
||||||
name = "golang.org/x/text"
|
|
||||||
packages = ["collate","collate/build","internal/colltab","internal/gen","internal/tag","internal/triegen","internal/ucd","language","secure/bidirule","transform","unicode/bidi","unicode/cldr","unicode/norm","unicode/rangetable"]
|
|
||||||
revision = "e19ae1496984b1c655b8044a65c0300a3c878dd3"
|
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
name = "google.golang.org/api"
|
name = "google.golang.org/api"
|
||||||
packages = ["gensupport","googleapi","googleapi/internal/uritemplates","storage/v1"]
|
packages = ["gensupport","googleapi","googleapi/internal/uritemplates","storage/v1"]
|
||||||
revision = "65b0d8655182691ad23b4fac11e6f7b897d9b634"
|
revision = "3a1d936b7575b82197a1fea0632218dd07b1e65c"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
name = "google.golang.org/appengine"
|
name = "google.golang.org/appengine"
|
||||||
@@ -226,11 +209,11 @@
|
|||||||
branch = "v2"
|
branch = "v2"
|
||||||
name = "gopkg.in/yaml.v2"
|
name = "gopkg.in/yaml.v2"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
revision = "d670f9405373e636a5a2765eea47fac0c9bc91a4"
|
revision = "287cf08546ab5e7e37d55a84f7ed3fd1db036de5"
|
||||||
|
|
||||||
[solve-meta]
|
[solve-meta]
|
||||||
analyzer-name = "dep"
|
analyzer-name = "dep"
|
||||||
analyzer-version = 1
|
analyzer-version = 1
|
||||||
inputs-digest = "336ac5c261c174cac89f9a7102b493f08edfbd51fd61d1673d1d2ec4132d80ab"
|
inputs-digest = "b01eeeb2be041c7cd11f9ee50324ef456ac1e1cd0720408c6d72f88f92f09320"
|
||||||
solver-name = "gps-cdcl"
|
solver-name = "gps-cdcl"
|
||||||
solver-version = 1
|
solver-version = 1
|
||||||
|
|||||||
+2
-2
@@ -17,8 +17,8 @@ init:
|
|||||||
|
|
||||||
install:
|
install:
|
||||||
- rmdir c:\go /s /q
|
- rmdir c:\go /s /q
|
||||||
- appveyor DownloadFile https://dl.google.com/go/go1.10.windows-amd64.msi
|
- appveyor DownloadFile https://storage.googleapis.com/golang/go1.9.windows-amd64.msi
|
||||||
- msiexec /i go1.10.windows-amd64.msi /q
|
- msiexec /i go1.9.windows-amd64.msi /q
|
||||||
- go version
|
- go version
|
||||||
- go env
|
- go env
|
||||||
- appveyor DownloadFile http://sourceforge.netcologne.de/project/gnuwin32/tar/1.13-1/tar-1.13-1-bin.zip -FileName tar.zip
|
- appveyor DownloadFile http://sourceforge.netcologne.de/project/gnuwin32/tar/1.13-1/tar-1.13-1-bin.zip -FileName tar.zip
|
||||||
|
|||||||
@@ -1,33 +1,4 @@
|
|||||||
// BSD 2-Clause License
|
// +build ignore
|
||||||
//
|
|
||||||
// Copyright (c) 2016-2018, Alexander Neumann <alexander@bumpern.de>
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// This file has been copied from the repository at:
|
|
||||||
// https://github.com/fd0/build-go
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright notice, this
|
|
||||||
// list of conditions and the following disclaimer.
|
|
||||||
//
|
|
||||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
// this list of conditions and the following disclaimer in the documentation
|
|
||||||
// and/or other materials provided with the distribution.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// +build ignore_build_go
|
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
@@ -44,27 +15,6 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// config contains the configuration for the program to build.
|
|
||||||
var config = Config{
|
|
||||||
Name: "restic", // name of the program executable and directory
|
|
||||||
Namespace: "github.com/restic/restic", // subdir of GOPATH, e.g. "github.com/foo/bar"
|
|
||||||
Main: "github.com/restic/restic/cmd/restic", // package name for the main package
|
|
||||||
Tests: []string{ // tests to run
|
|
||||||
"github.com/restic/restic/internal/...",
|
|
||||||
"github.com/restic/restic/cmd/...",
|
|
||||||
},
|
|
||||||
MinVersion: GoVersion{Major: 1, Minor: 8, Patch: 0}, // minimum Go version supported
|
|
||||||
}
|
|
||||||
|
|
||||||
// Config configures the build.
|
|
||||||
type Config struct {
|
|
||||||
Name string
|
|
||||||
Namespace string
|
|
||||||
Main string
|
|
||||||
Tests []string
|
|
||||||
MinVersion GoVersion
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
var (
|
||||||
verbose bool
|
verbose bool
|
||||||
keepGopath bool
|
keepGopath bool
|
||||||
@@ -72,6 +22,22 @@ var (
|
|||||||
enableCGO bool
|
enableCGO bool
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var config = struct {
|
||||||
|
Name string
|
||||||
|
Namespace string
|
||||||
|
Main string
|
||||||
|
Tests []string
|
||||||
|
MinVersion GoVersion
|
||||||
|
}{
|
||||||
|
Name: "restic", // name of the program executable and directory
|
||||||
|
Namespace: "github.com/restic/restic", // subdir of GOPATH, e.g. "github.com/foo/bar"
|
||||||
|
Main: "github.com/restic/restic/cmd/restic", // package name for the main package
|
||||||
|
Tests: []string{ // tests to run
|
||||||
|
"github.com/restic/restic/internal/...",
|
||||||
|
"github.com/restic/restic/cmd/..."},
|
||||||
|
MinVersion: GoVersion{Major: 1, Minor: 8, Patch: 0}, // minimum Go version supported
|
||||||
|
}
|
||||||
|
|
||||||
// specialDir returns true if the file begins with a special character ('.' or '_').
|
// specialDir returns true if the file begins with a special character ('.' or '_').
|
||||||
func specialDir(name string) bool {
|
func specialDir(name string) bool {
|
||||||
if name == "." {
|
if name == "." {
|
||||||
@@ -227,7 +193,6 @@ func showUsage(output io.Writer) {
|
|||||||
fmt.Fprintf(output, " --enable-cgo use CGO to link against libc\n")
|
fmt.Fprintf(output, " --enable-cgo use CGO to link against libc\n")
|
||||||
fmt.Fprintf(output, " --goos value set GOOS for cross-compilation\n")
|
fmt.Fprintf(output, " --goos value set GOOS for cross-compilation\n")
|
||||||
fmt.Fprintf(output, " --goarch value set GOARCH for cross-compilation\n")
|
fmt.Fprintf(output, " --goarch value set GOARCH for cross-compilation\n")
|
||||||
fmt.Fprintf(output, " --goarm value set GOARM for cross-compilation\n")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func verbosePrintf(message string, args ...interface{}) {
|
func verbosePrintf(message string, args ...interface{}) {
|
||||||
@@ -253,16 +218,13 @@ func cleanEnv() (env []string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// build runs "go build args..." with GOPATH set to gopath.
|
// build runs "go build args..." with GOPATH set to gopath.
|
||||||
func build(cwd, goos, goarch, goarm, gopath string, args ...string) error {
|
func build(cwd, goos, goarch, gopath string, args ...string) error {
|
||||||
a := []string{"build"}
|
a := []string{"build"}
|
||||||
a = append(a, "-asmflags", fmt.Sprintf("-trimpath=%s", gopath))
|
a = append(a, "-asmflags", fmt.Sprintf("-trimpath=%s", gopath))
|
||||||
a = append(a, "-gcflags", fmt.Sprintf("-trimpath=%s", gopath))
|
a = append(a, "-gcflags", fmt.Sprintf("-trimpath=%s", gopath))
|
||||||
a = append(a, args...)
|
a = append(a, args...)
|
||||||
cmd := exec.Command("go", a...)
|
cmd := exec.Command("go", a...)
|
||||||
cmd.Env = append(cleanEnv(), "GOPATH="+gopath, "GOARCH="+goarch, "GOOS="+goos)
|
cmd.Env = append(cleanEnv(), "GOPATH="+gopath, "GOARCH="+goarch, "GOOS="+goos)
|
||||||
if goarm != "" {
|
|
||||||
cmd.Env = append(cmd.Env, "GOARM="+goarm)
|
|
||||||
}
|
|
||||||
if !enableCGO {
|
if !enableCGO {
|
||||||
cmd.Env = append(cmd.Env, "CGO_ENABLED=0")
|
cmd.Env = append(cmd.Env, "CGO_ENABLED=0")
|
||||||
}
|
}
|
||||||
@@ -435,7 +397,6 @@ func main() {
|
|||||||
|
|
||||||
targetGOOS := runtime.GOOS
|
targetGOOS := runtime.GOOS
|
||||||
targetGOARCH := runtime.GOARCH
|
targetGOARCH := runtime.GOARCH
|
||||||
targetGOARM := ""
|
|
||||||
|
|
||||||
var outputFilename string
|
var outputFilename string
|
||||||
|
|
||||||
@@ -469,9 +430,6 @@ func main() {
|
|||||||
case "--goarch":
|
case "--goarch":
|
||||||
skipNext = true
|
skipNext = true
|
||||||
targetGOARCH = params[i+1]
|
targetGOARCH = params[i+1]
|
||||||
case "--goarm":
|
|
||||||
skipNext = true
|
|
||||||
targetGOARM = params[i+1]
|
|
||||||
case "-h":
|
case "-h":
|
||||||
showUsage(os.Stdout)
|
showUsage(os.Stdout)
|
||||||
return
|
return
|
||||||
@@ -556,7 +514,7 @@ func main() {
|
|||||||
"-o", output, config.Main,
|
"-o", output, config.Main,
|
||||||
}
|
}
|
||||||
|
|
||||||
err = build(filepath.Join(gopath, "src"), targetGOOS, targetGOARCH, targetGOARM, gopath, args...)
|
err = build(filepath.Join(gopath, "src"), targetGOOS, targetGOARCH, gopath, args...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
die("build failed: %v\n", err)
|
die("build failed: %v\n", err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
Enhancement: Properly report errors when reading files with exclude patterns
|
Enhancement: Properly report errors when reading files with exclude patterns.
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/1144
|
https://github.com/restic/restic/pull/1144
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
Enhancement: Add support for TLS client certificate authentication
|
|
||||||
|
|
||||||
Support has been added for using a TLS client certificate for authentication to
|
|
||||||
HTTP based backend. A file containing the PEM encoded private key and
|
|
||||||
certificate can be set using the `--tls-client-cert` option.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/1522
|
|
||||||
https://github.com/restic/restic/pull/1524
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
Enhancement: Reduce number of remote requests during repository check
|
|
||||||
|
|
||||||
This change eliminates redundant remote repository calls and significantly
|
|
||||||
improves repository check time.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/1541
|
|
||||||
https://github.com/restic/restic/pull/1548
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
Enhancement: Reduce number of backend requests for rebuild-index and prune
|
|
||||||
|
|
||||||
We've found a way to reduce then number of backend requests for the
|
|
||||||
`rebuild-index` and `prune` operations. This significantly speeds up the
|
|
||||||
operations for high-latency backends.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/1567
|
|
||||||
https://github.com/restic/restic/pull/1574
|
|
||||||
https://github.com/restic/restic/pull/1575
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
Bugfix: Strip spaces for lines read via --files-from
|
|
||||||
|
|
||||||
Leading and trailing spaces in lines read via `--files-from` are now stripped,
|
|
||||||
so it behaves the same as with lines read via `--exclude-file`.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/1590
|
|
||||||
https://github.com/restic/restic/pull/1613
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
Enhancement: Speed up querying across indices and scanning existing files
|
|
||||||
|
|
||||||
This change increases the whenever a blob (part of a file) is searched for in a
|
|
||||||
restic repository. This will reduce cpu usage some when backing up files already
|
|
||||||
backed up by restic. Cpu usage is further decreased when scanning files.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/1549
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
Enhancement: Don't terminate ssh on SIGINT
|
|
||||||
|
|
||||||
We've reworked the code which runs the `ssh` login for the sftp backend so that
|
|
||||||
it can prompt for a password (if needed) but does not exit when the user
|
|
||||||
presses CTRL+C (SIGINT) e.g. during backup. This allows restic to properly shut
|
|
||||||
down when it receives SIGINT and remove the lock file from the repo, afterwards
|
|
||||||
exiting the `ssh` process.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/1564
|
|
||||||
https://github.com/restic/restic/pull/1588
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
Enhancement: Retry Backend.List() in case of errors
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/1579
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
Enhancement: Limit index file size
|
|
||||||
|
|
||||||
Before, restic would create a single new index file on `prune` or
|
|
||||||
`rebuild-index`, this may lead to memory problems when this huge index is
|
|
||||||
created and loaded again. We're now limiting the size of the index file, and
|
|
||||||
split newly created index files into several smaller ones. This allows restic
|
|
||||||
to be more memory-efficient.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/1584
|
|
||||||
https://github.com/restic/restic/issues/1412
|
|
||||||
https://github.com/restic/restic/issues/979
|
|
||||||
https://github.com/restic/restic/issues/526
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
Bugfix: Complete intermediate index upload
|
|
||||||
|
|
||||||
After a user posted a comprehensive report of what he observed, we were able to
|
|
||||||
find a bug and correct it: During backup, restic uploads so-called
|
|
||||||
"intermediate" index files. When the backup finishes during a transfer of such
|
|
||||||
an intermediate index, the upload is cancelled, but the backup is finished
|
|
||||||
without an error. This leads to an inconsistent state, where the snapshot
|
|
||||||
references data that is contained in the repo, but is not referenced in any
|
|
||||||
index.
|
|
||||||
|
|
||||||
The situation can be resolved by building a new index with `rebuild-index`, but
|
|
||||||
looks very confusing at first. Since all the data got uploaded to the repo
|
|
||||||
successfully, there was no risk of data loss, just minor inconvenience for our
|
|
||||||
users.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/1589
|
|
||||||
https://forum.restic.net/t/error-loading-tree-check-prune-and-forget-gives-error-b2-backend/406
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
Bugfix: Google Cloud Storage: Use generic HTTP transport
|
|
||||||
|
|
||||||
It was discovered that the Google Cloud Storage backend did not use the generic
|
|
||||||
HTTP transport, so things such as bandwidth limiting with `--limit-upload` did
|
|
||||||
not work. This is resolved now.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/1594
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
Bugfix: backup: Remove bandwidth display
|
|
||||||
|
|
||||||
This commit removes the bandwidth displayed during backup process. It is
|
|
||||||
misleading and seldomly correct, because it's neither the "read
|
|
||||||
bandwidth" (only for the very first backup) nor the "upload bandwidth".
|
|
||||||
Many users are confused about (and rightly so), c.f. #1581, #1033, #1591
|
|
||||||
|
|
||||||
We'll eventually replace this display with something more relevant when
|
|
||||||
the new archiver code is ready.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/1595
|
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
# This file lists all versions for the changelog. Each line consists of the
|
||||||
|
# version string, followed by an optional release date.
|
||||||
|
#
|
||||||
|
# The resulting changelog generated by `calens` will list all versions in
|
||||||
|
# exactly this order.
|
||||||
|
0.8.2
|
||||||
|
0.8.1 2017-12-27
|
||||||
|
0.8.0 2017-11-26
|
||||||
|
0.7.3 2017-09-20
|
||||||
|
0.7.2 2017-09-13
|
||||||
|
0.7.1 2017-07-22
|
||||||
|
0.7.0 2017-07-01
|
||||||
|
0.6.1 2017-06-01
|
||||||
|
0.6.0 2017-05-29
|
||||||
@@ -22,9 +22,19 @@ var stderr = os.Stderr
|
|||||||
func init() {
|
func init() {
|
||||||
cleanupHandlers.ch = make(chan os.Signal)
|
cleanupHandlers.ch = make(chan os.Signal)
|
||||||
go CleanupHandler(cleanupHandlers.ch)
|
go CleanupHandler(cleanupHandlers.ch)
|
||||||
|
InstallSignalHandler()
|
||||||
|
}
|
||||||
|
|
||||||
|
// InstallSignalHandler listens for SIGINT, and triggers the cleanup handlers.
|
||||||
|
func InstallSignalHandler() {
|
||||||
signal.Notify(cleanupHandlers.ch, syscall.SIGINT)
|
signal.Notify(cleanupHandlers.ch, syscall.SIGINT)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SuspendSignalHandler removes the signal handler for SIGINT.
|
||||||
|
func SuspendSignalHandler() {
|
||||||
|
signal.Reset(syscall.SIGINT)
|
||||||
|
}
|
||||||
|
|
||||||
// AddCleanupHandler adds the function f to the list of cleanup handlers so
|
// AddCleanupHandler adds the function f to the list of cleanup handlers so
|
||||||
// that it is executed when all the cleanup handlers are run, e.g. when SIGINT
|
// that it is executed when all the cleanup handlers are run, e.g. when SIGINT
|
||||||
// is received.
|
// is received.
|
||||||
|
|||||||
@@ -138,9 +138,10 @@ func newArchiveProgress(gopts GlobalOptions, todo restic.Stat) *restic.Progress
|
|||||||
|
|
||||||
itemsDone := s.Files + s.Dirs
|
itemsDone := s.Files + s.Dirs
|
||||||
|
|
||||||
status1 := fmt.Sprintf("[%s] %s %s / %s %d / %d items %d errors ",
|
status1 := fmt.Sprintf("[%s] %s %s/s %s / %s %d / %d items %d errors ",
|
||||||
formatDuration(d),
|
formatDuration(d),
|
||||||
formatPercent(s.Bytes, todo.Bytes),
|
formatPercent(s.Bytes, todo.Bytes),
|
||||||
|
formatBytes(bps),
|
||||||
formatBytes(s.Bytes), formatBytes(todo.Bytes),
|
formatBytes(s.Bytes), formatBytes(todo.Bytes),
|
||||||
itemsDone, itemsTodo,
|
itemsDone, itemsTodo,
|
||||||
s.Errors)
|
s.Errors)
|
||||||
@@ -161,7 +162,7 @@ func newArchiveProgress(gopts GlobalOptions, todo restic.Stat) *restic.Progress
|
|||||||
}
|
}
|
||||||
|
|
||||||
archiveProgress.OnDone = func(s restic.Stat, d time.Duration, ticker bool) {
|
archiveProgress.OnDone = func(s restic.Stat, d time.Duration, ticker bool) {
|
||||||
fmt.Printf("\nduration: %s\n", formatDuration(d))
|
fmt.Printf("\nduration: %s, %s\n", formatDuration(d), formatRate(todo.Bytes, d))
|
||||||
}
|
}
|
||||||
|
|
||||||
return archiveProgress
|
return archiveProgress
|
||||||
@@ -205,7 +206,7 @@ func newArchiveStdinProgress(gopts GlobalOptions) *restic.Progress {
|
|||||||
}
|
}
|
||||||
|
|
||||||
archiveProgress.OnDone = func(s restic.Stat, d time.Duration, ticker bool) {
|
archiveProgress.OnDone = func(s restic.Stat, d time.Duration, ticker bool) {
|
||||||
fmt.Printf("\nduration: %s\n", formatDuration(d))
|
fmt.Printf("\nduration: %s, %s\n", formatDuration(d), formatRate(s.Bytes, d))
|
||||||
}
|
}
|
||||||
|
|
||||||
return archiveProgress
|
return archiveProgress
|
||||||
@@ -304,7 +305,7 @@ func readLinesFromFile(filename string) ([]string, error) {
|
|||||||
|
|
||||||
scanner := bufio.NewScanner(r)
|
scanner := bufio.NewScanner(r)
|
||||||
for scanner.Scan() {
|
for scanner.Scan() {
|
||||||
line := strings.TrimSpace(scanner.Text())
|
line := scanner.Text()
|
||||||
// ignore empty lines
|
// ignore empty lines
|
||||||
if line == "" {
|
if line == "" {
|
||||||
continue
|
continue
|
||||||
|
|||||||
@@ -165,8 +165,8 @@ func runCat(gopts GlobalOptions, args []string) error {
|
|||||||
|
|
||||||
case "blob":
|
case "blob":
|
||||||
for _, t := range []restic.BlobType{restic.DataBlob, restic.TreeBlob} {
|
for _, t := range []restic.BlobType{restic.DataBlob, restic.TreeBlob} {
|
||||||
list, found := repo.Index().Lookup(id, t)
|
list, err := repo.Index().Lookup(id, t)
|
||||||
if !found {
|
if err != nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
blob := list[0]
|
blob := list[0]
|
||||||
|
|||||||
+63
-18
@@ -15,6 +15,8 @@ import (
|
|||||||
"github.com/restic/restic/internal/pack"
|
"github.com/restic/restic/internal/pack"
|
||||||
"github.com/restic/restic/internal/repository"
|
"github.com/restic/restic/internal/repository"
|
||||||
"github.com/restic/restic/internal/restic"
|
"github.com/restic/restic/internal/restic"
|
||||||
|
|
||||||
|
"github.com/restic/restic/internal/worker"
|
||||||
)
|
)
|
||||||
|
|
||||||
var cmdDebug = &cobra.Command{
|
var cmdDebug = &cobra.Command{
|
||||||
@@ -50,18 +52,26 @@ func prettyPrintJSON(wr io.Writer, item interface{}) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func debugPrintSnapshots(repo *repository.Repository, wr io.Writer) error {
|
func debugPrintSnapshots(repo *repository.Repository, wr io.Writer) error {
|
||||||
return repo.List(context.TODO(), restic.SnapshotFile, func(id restic.ID, size int64) error {
|
for id := range repo.List(context.TODO(), restic.SnapshotFile) {
|
||||||
snapshot, err := restic.LoadSnapshot(context.TODO(), repo, id)
|
snapshot, err := restic.LoadSnapshot(context.TODO(), repo, id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
fmt.Fprintf(os.Stderr, "LoadSnapshot(%v): %v", id.Str(), err)
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Fprintf(wr, "snapshot_id: %v\n", id)
|
fmt.Fprintf(wr, "snapshot_id: %v\n", id)
|
||||||
|
|
||||||
return prettyPrintJSON(wr, snapshot)
|
err = prettyPrintJSON(wr, snapshot)
|
||||||
})
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const dumpPackWorkers = 10
|
||||||
|
|
||||||
// Pack is the struct used in printPacks.
|
// Pack is the struct used in printPacks.
|
||||||
type Pack struct {
|
type Pack struct {
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
@@ -78,21 +88,49 @@ type Blob struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func printPacks(repo *repository.Repository, wr io.Writer) error {
|
func printPacks(repo *repository.Repository, wr io.Writer) error {
|
||||||
|
f := func(ctx context.Context, job worker.Job) (interface{}, error) {
|
||||||
|
name := job.Data.(string)
|
||||||
|
|
||||||
return repo.List(context.TODO(), restic.DataFile, func(id restic.ID, size int64) error {
|
h := restic.Handle{Type: restic.DataFile, Name: name}
|
||||||
h := restic.Handle{Type: restic.DataFile, Name: id.String()}
|
|
||||||
|
|
||||||
blobs, err := pack.List(repo.Key(), restic.ReaderAt(repo.Backend(), h), size)
|
blobInfo, err := repo.Backend().Stat(ctx, h)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintf(os.Stderr, "error for pack %v: %v\n", id.Str(), err)
|
return nil, err
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
p := Pack{
|
blobs, err := pack.List(repo.Key(), restic.ReaderAt(repo.Backend(), h), blobInfo.Size)
|
||||||
Name: id.String(),
|
if err != nil {
|
||||||
Blobs: make([]Blob, len(blobs)),
|
return nil, err
|
||||||
}
|
}
|
||||||
for i, blob := range blobs {
|
|
||||||
|
return blobs, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
jobCh := make(chan worker.Job)
|
||||||
|
resCh := make(chan worker.Job)
|
||||||
|
wp := worker.New(context.TODO(), dumpPackWorkers, f, jobCh, resCh)
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
for name := range repo.Backend().List(context.TODO(), restic.DataFile) {
|
||||||
|
jobCh <- worker.Job{Data: name}
|
||||||
|
}
|
||||||
|
close(jobCh)
|
||||||
|
}()
|
||||||
|
|
||||||
|
for job := range resCh {
|
||||||
|
name := job.Data.(string)
|
||||||
|
|
||||||
|
if job.Error != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, "error for pack %v: %v\n", name, job.Error)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
entries := job.Result.([]restic.Blob)
|
||||||
|
p := Pack{
|
||||||
|
Name: name,
|
||||||
|
Blobs: make([]Blob, len(entries)),
|
||||||
|
}
|
||||||
|
for i, blob := range entries {
|
||||||
p.Blobs[i] = Blob{
|
p.Blobs[i] = Blob{
|
||||||
Type: blob.Type,
|
Type: blob.Type,
|
||||||
Length: blob.Length,
|
Length: blob.Length,
|
||||||
@@ -101,14 +139,16 @@ func printPacks(repo *repository.Repository, wr io.Writer) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return prettyPrintJSON(os.Stdout, p)
|
prettyPrintJSON(os.Stdout, p)
|
||||||
})
|
}
|
||||||
|
|
||||||
|
wp.Wait()
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func dumpIndexes(repo restic.Repository) error {
|
func dumpIndexes(repo restic.Repository) error {
|
||||||
return repo.List(context.TODO(), restic.IndexFile, func(id restic.ID, size int64) error {
|
for id := range repo.List(context.TODO(), restic.IndexFile) {
|
||||||
fmt.Printf("index_id: %v\n", id)
|
fmt.Printf("index_id: %v\n", id)
|
||||||
|
|
||||||
idx, err := repository.LoadIndex(context.TODO(), repo, id)
|
idx, err := repository.LoadIndex(context.TODO(), repo, id)
|
||||||
@@ -116,8 +156,13 @@ func dumpIndexes(repo restic.Repository) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return idx.Dump(os.Stdout)
|
err = idx.Dump(os.Stdout)
|
||||||
})
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func runDebugDump(gopts GlobalOptions, args []string) error {
|
func runDebugDump(gopts GlobalOptions, args []string) error {
|
||||||
|
|||||||
@@ -135,9 +135,9 @@ func updateBlobs(repo restic.Repository, blobs restic.BlobSet, stats *DiffStat)
|
|||||||
stats.TreeBlobs++
|
stats.TreeBlobs++
|
||||||
}
|
}
|
||||||
|
|
||||||
size, found := repo.LookupBlobSize(h.ID, h.Type)
|
size, err := repo.LookupBlobSize(h.ID, h.Type)
|
||||||
if !found {
|
if err != nil {
|
||||||
Warnf("unable to find blob size for %v\n", h)
|
Warnf("unable to find blob size for %v: %v\n", h, err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -59,9 +59,9 @@ func splitPath(path string) []string {
|
|||||||
func dumpNode(ctx context.Context, repo restic.Repository, node *restic.Node) error {
|
func dumpNode(ctx context.Context, repo restic.Repository, node *restic.Node) error {
|
||||||
var buf []byte
|
var buf []byte
|
||||||
for _, id := range node.Content {
|
for _, id := range node.Content {
|
||||||
size, found := repo.LookupBlobSize(id, restic.DataBlob)
|
size, err := repo.LookupBlobSize(id, restic.DataBlob)
|
||||||
if !found {
|
if err != nil {
|
||||||
return errors.Errorf("id %v not found in repository", id)
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
buf = buf[:cap(buf)]
|
buf = buf[:cap(buf)]
|
||||||
|
|||||||
@@ -182,11 +182,11 @@ type Finder struct {
|
|||||||
|
|
||||||
func (f *Finder) findInTree(ctx context.Context, treeID restic.ID, prefix string) error {
|
func (f *Finder) findInTree(ctx context.Context, treeID restic.ID, prefix string) error {
|
||||||
if f.notfound.Has(treeID) {
|
if f.notfound.Has(treeID) {
|
||||||
debug.Log("%v skipping tree %v, has already been checked", prefix, treeID)
|
debug.Log("%v skipping tree %v, has already been checked", prefix, treeID.Str())
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
debug.Log("%v checking tree %v\n", prefix, treeID)
|
debug.Log("%v checking tree %v\n", prefix, treeID.Str())
|
||||||
|
|
||||||
tree, err := f.repo.LoadTree(ctx, treeID)
|
tree, err := f.repo.LoadTree(ctx, treeID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -30,11 +30,11 @@ func runInit(gopts GlobalOptions, args []string) error {
|
|||||||
|
|
||||||
be, err := create(gopts.Repo, gopts.extended)
|
be, err := create(gopts.Repo, gopts.extended)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Fatalf("create repository at %s failed: %v\n", gopts.Repo, err)
|
return errors.Fatalf("create backend at %s failed: %v\n", gopts.Repo, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
gopts.password, err = ReadPasswordTwice(gopts,
|
gopts.password, err = ReadPasswordTwice(gopts,
|
||||||
"enter password for new repository: ",
|
"enter password for new backend: ",
|
||||||
"enter password again: ")
|
"enter password again: ")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -44,10 +44,10 @@ func runInit(gopts GlobalOptions, args []string) error {
|
|||||||
|
|
||||||
err = s.Init(gopts.ctx, gopts.password)
|
err = s.Init(gopts.ctx, gopts.password)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Fatalf("create key in repository at %s failed: %v\n", gopts.Repo, err)
|
return errors.Fatalf("create key in backend at %s failed: %v\n", gopts.Repo, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
Verbosef("created restic repository %v at %s\n", s.Config().ID[:10], gopts.Repo)
|
Verbosef("created restic backend %v at %s\n", s.Config().ID[:10], gopts.Repo)
|
||||||
Verbosef("\n")
|
Verbosef("\n")
|
||||||
Verbosef("Please note that knowledge of your password is required to access\n")
|
Verbosef("Please note that knowledge of your password is required to access\n")
|
||||||
Verbosef("the repository. Losing your password means that your data is\n")
|
Verbosef("the repository. Losing your password means that your data is\n")
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user