forked from TrueCloudLab/restic
Compare commits
16 commits
tcl/master
...
add-config
Author | SHA1 | Date | |
---|---|---|---|
|
abb1dc4eb6 | ||
|
8d21bb92db | ||
|
0b3c402801 | ||
|
b3b70002ab | ||
|
4916ba7a8a | ||
|
ea565df3e8 | ||
|
0758c92afc | ||
|
8b0092908a | ||
|
ffd7bc1021 | ||
|
6bad560324 | ||
|
7ad648c686 | ||
|
0c078cc205 | ||
|
1fbcf63830 | ||
|
740e2d6139 | ||
|
aaef54559a | ||
|
722517c480 |
8671 changed files with 5389132 additions and 101732 deletions
2
.gitattributes
vendored
2
.gitattributes
vendored
|
@ -1,2 +0,0 @@
|
||||||
# Workaround for https://github.com/golang/go/issues/52268.
|
|
||||||
**/testdata/fuzz/*/* eol=lf
|
|
79
.github/ISSUE_TEMPLATE.md
vendored
Normal file
79
.github/ISSUE_TEMPLATE.md
vendored
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
<!--
|
||||||
|
|
||||||
|
Welcome! - We kindly ask that you:
|
||||||
|
|
||||||
|
1. Fill out the issue template below - not doing so needs a good reason.
|
||||||
|
2. Use the forum if you have a question rather than a bug or feature request.
|
||||||
|
|
||||||
|
The forum is at: https://forum.restic.net
|
||||||
|
|
||||||
|
NOTE: Not filling out the issue template needs a good reason, as otherwise it
|
||||||
|
may take a lot longer to find the problem, not to mention it can take up a lot
|
||||||
|
more time which can otherwise be spent on development. Please also take the
|
||||||
|
time to help us debug the issue by collecting relevant information, even if
|
||||||
|
it doesn't seem to be relevant to you. Thanks!
|
||||||
|
|
||||||
|
The forum is a better place for questions about restic or general suggestions
|
||||||
|
and topics, e.g. usage or documentation questions! This issue tracker is mainly
|
||||||
|
for tracking bugs and feature requests directly relating to the development of
|
||||||
|
the software itself, rather than the project.
|
||||||
|
|
||||||
|
Thanks for understanding, and for contributing to the project!
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
## Output of `restic version`
|
||||||
|
|
||||||
|
|
||||||
|
## How did you run restic exactly?
|
||||||
|
|
||||||
|
<!--
|
||||||
|
This section should include at least:
|
||||||
|
|
||||||
|
* The complete command line and any environment variables you used to
|
||||||
|
configure restic's backend access. Make sure to replace sensitive values!
|
||||||
|
|
||||||
|
* The output of the commands, what restic prints gives may give us much
|
||||||
|
information to diagnose the problem!
|
||||||
|
-->
|
||||||
|
|
||||||
|
## What backend/server/service did you use to store the repository?
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Expected behavior
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Describe what you'd like restic to do differently.
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Actual behavior
|
||||||
|
|
||||||
|
<!--
|
||||||
|
In this section, please try to concentrate on observations, so only describe
|
||||||
|
what you observed directly.
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Steps to reproduce the behavior
|
||||||
|
|
||||||
|
<!--
|
||||||
|
The more time you spend describing an easy way to reproduce the behavior (if
|
||||||
|
this is possible), the easier it is for the project developers to fix it!
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Do you have any idea what may have caused this?
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Do you have an idea how to solve the issue?
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Did restic help you or made you happy in any way?
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Answering this question is not required, but if you have anything positive to share, please do so here!
|
||||||
|
Sometimes we get tired of reading bug reports all day and a little positive end note does wonders.
|
||||||
|
Idea by Joey Hess, https://joeyh.name/blog/entry/two_holiday_stories/
|
||||||
|
-->
|
90
.github/ISSUE_TEMPLATE/Bug.md
vendored
90
.github/ISSUE_TEMPLATE/Bug.md
vendored
|
@ -1,90 +0,0 @@
|
||||||
---
|
|
||||||
name: Bug report
|
|
||||||
about: Report a problem with restic to help us resolve it and improve
|
|
||||||
---
|
|
||||||
|
|
||||||
<!--
|
|
||||||
|
|
||||||
Welcome! - We kindly ask that you:
|
|
||||||
|
|
||||||
1. Fill out the issue template below - not doing so needs a good reason.
|
|
||||||
2. Use the forum if you have a question rather than a bug or feature request.
|
|
||||||
|
|
||||||
The forum is at: https://forum.restic.net
|
|
||||||
|
|
||||||
NOTE: Not filling out the issue template needs a good reason, as otherwise it
|
|
||||||
may take a lot longer to find the problem, not to mention it can take up a lot
|
|
||||||
more time which can otherwise be spent on development. Please also take the
|
|
||||||
time to help us debug the issue by collecting relevant information, even if
|
|
||||||
it doesn't seem to be relevant to you. Thanks!
|
|
||||||
|
|
||||||
The forum is a better place for questions about restic or general suggestions
|
|
||||||
and topics, e.g. usage or documentation questions! This issue tracker is mainly
|
|
||||||
for tracking bugs and feature requests directly relating to the development of
|
|
||||||
the software itself, rather than the project.
|
|
||||||
|
|
||||||
Thanks for understanding, and for contributing to the project!
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
|
|
||||||
Output of `restic version`
|
|
||||||
--------------------------
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
What backend/service did you use to store the repository?
|
|
||||||
---------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Problem description / Steps to reproduce
|
|
||||||
----------------------------------------
|
|
||||||
|
|
||||||
<!--
|
|
||||||
This section should include at least:
|
|
||||||
|
|
||||||
* A description of the problem you are having with restic.
|
|
||||||
|
|
||||||
* The complete command line and any environment variables you used to
|
|
||||||
configure restic's backend access. Make sure to replace sensitive values!
|
|
||||||
|
|
||||||
* The output of the commands, what restic prints gives may give us much
|
|
||||||
information to diagnose the problem!
|
|
||||||
|
|
||||||
* The more time you spend describing an easy way to reproduce the behavior (if
|
|
||||||
this is possible), the easier it is for the project developers to fix it!
|
|
||||||
-->
|
|
||||||
|
|
||||||
|
|
||||||
Expected behavior
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Describe what you'd like restic to do differently.
|
|
||||||
-->
|
|
||||||
|
|
||||||
Actual behavior
|
|
||||||
---------------
|
|
||||||
|
|
||||||
<!--
|
|
||||||
In this section, please try to concentrate on observations, so only describe
|
|
||||||
what you observed directly.
|
|
||||||
-->
|
|
||||||
|
|
||||||
Do you have any idea what may have caused this?
|
|
||||||
-----------------------------------------------
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Did something noteworthy happen on your system, Internet connection, backend services, etc?
|
|
||||||
-->
|
|
||||||
|
|
||||||
|
|
||||||
Did restic help you today? Did it make you happy in any way?
|
|
||||||
------------------------------------------------------------
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Answering this question is not required, but if you have anything positive to share, please do so here!
|
|
||||||
Sometimes we get tired of reading bug reports all day and a little positive end note does wonders.
|
|
||||||
Idea by Joey Hess, https://joeyh.name/blog/entry/two_holiday_stories/
|
|
||||||
-->
|
|
57
.github/ISSUE_TEMPLATE/Feature.md
vendored
57
.github/ISSUE_TEMPLATE/Feature.md
vendored
|
@ -1,57 +0,0 @@
|
||||||
---
|
|
||||||
name: Feature request
|
|
||||||
about: Suggest a new feature or enhancement for restic
|
|
||||||
---
|
|
||||||
|
|
||||||
<!--
|
|
||||||
|
|
||||||
Welcome! - We kindly ask that you:
|
|
||||||
|
|
||||||
1. Fill out the issue template below - not doing so needs a good reason.
|
|
||||||
2. Use the forum if you have a question rather than a bug or feature request.
|
|
||||||
|
|
||||||
The forum is at: https://forum.restic.net
|
|
||||||
|
|
||||||
The forum is a better place for questions about restic or general suggestions
|
|
||||||
and topics, e.g. usage or documentation questions! This issue tracker is mainly
|
|
||||||
for tracking bugs and feature requests directly relating to the development of
|
|
||||||
the software itself, rather than the project.
|
|
||||||
|
|
||||||
Thanks for understanding, and for contributing to the project!
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
|
|
||||||
Output of `restic version`
|
|
||||||
--------------------------
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Please add the version of restic you're currently using here, this helps us
|
|
||||||
later to see what has changed in restic when we revisit this issue after some
|
|
||||||
time.
|
|
||||||
-->
|
|
||||||
|
|
||||||
What should restic do differently? Which functionality do you think we should add?
|
|
||||||
----------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Please describe the feature you'd like us to add here.
|
|
||||||
-->
|
|
||||||
|
|
||||||
|
|
||||||
What are you trying to do? What problem would this solve?
|
|
||||||
---------------------------------------------------------
|
|
||||||
|
|
||||||
<!--
|
|
||||||
This section should contain a brief description what you're trying to do, which
|
|
||||||
would be possible after implementing the new feature.
|
|
||||||
-->
|
|
||||||
|
|
||||||
Did restic help you today? Did it make you happy in any way?
|
|
||||||
------------------------------------------------------------
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Answering this question is not required, but if you have anything positive to share, please do so here!
|
|
||||||
Sometimes we get tired of reading bug reports all day and a little positive end note does wonders.
|
|
||||||
Idea by Joey Hess, https://joeyh.name/blog/entry/two_holiday_stories/
|
|
||||||
-->
|
|
4
.github/ISSUE_TEMPLATE/config.yml
vendored
4
.github/ISSUE_TEMPLATE/config.yml
vendored
|
@ -1,4 +0,0 @@
|
||||||
contact_links:
|
|
||||||
- name: restic forum
|
|
||||||
url: https://forum.restic.net
|
|
||||||
about: Please ask questions about using restic here, do not open an issue for questions.
|
|
39
.github/PULL_REQUEST_TEMPLATE.md
vendored
39
.github/PULL_REQUEST_TEMPLATE.md
vendored
|
@ -2,39 +2,30 @@
|
||||||
Thank you very much for contributing code or documentation to restic! Please
|
Thank you very much for contributing code or documentation to restic! Please
|
||||||
fill out the following questions to make it easier for us to review your
|
fill out the following questions to make it easier for us to review your
|
||||||
changes.
|
changes.
|
||||||
|
|
||||||
|
You do not need to check all the boxes below all at once, feel free to take
|
||||||
|
your time and add more commits. If you're done and ready for review, please
|
||||||
|
check the last box.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
What does this PR change? What problem does it solve?
|
### What is the purpose of this change? What does it change?
|
||||||
-----------------------------------------------------
|
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Describe the changes and their purpose here, as detailed as needed.
|
Describe the changes here, as detailed as needed.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
Was the change previously discussed in an issue or on the forum?
|
### Was the change discussed in an issue or in the forum before?
|
||||||
----------------------------------------------------------------
|
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Link issues and relevant forum posts here.
|
Link issues and relevant forum posts here.
|
||||||
|
|
||||||
If this PR resolves an issue on GitHub, use "Closes #1234" so that the issue
|
|
||||||
is closed automatically when this PR is merged.
|
|
||||||
-->
|
-->
|
||||||
|
|
||||||
Checklist
|
### Checklist
|
||||||
---------
|
|
||||||
|
|
||||||
<!--
|
- [ ] I have read the [Contribution Guidelines](https://github.com/restic/restic/blob/master/CONTRIBUTING.md#providing-patches)
|
||||||
You do not need to check all the boxes below all at once. Feel free to take
|
- [ ] I have added tests for all changes in this PR
|
||||||
your time and add more commits. If you're done and ready for review, please
|
- [ ] I have added documentation for the changes (in the manual)
|
||||||
check the last box. Enable a checkbox by replacing [ ] with [x].
|
- [ ] There's a new file in `changelog/unreleased/` that describes the changes for our users (template [here](https://github.com/restic/restic/blob/master/changelog/TEMPLATE))
|
||||||
-->
|
- [ ] I have run `gofmt` on the code in all commits
|
||||||
|
- [ ] All commit messages are formatted in the same style as [the other commits in the repo](https://github.com/restic/restic/blob/master/CONTRIBUTING.md#git-commits)
|
||||||
- [ ] I have read the [contribution guidelines](https://github.com/restic/restic/blob/master/CONTRIBUTING.md#providing-patches).
|
- [ ] I'm done, this Pull Request is ready for review
|
||||||
- [ ] I have [enabled maintainer edits](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/allowing-changes-to-a-pull-request-branch-created-from-a-fork).
|
|
||||||
- [ ] I have added tests for all code changes.
|
|
||||||
- [ ] I have added documentation for relevant changes (in the manual).
|
|
||||||
- [ ] There's a new file in `changelog/unreleased/` that describes the changes for our users (see [template](https://github.com/restic/restic/blob/master/changelog/TEMPLATE)).
|
|
||||||
- [ ] I have run `gofmt` on the code in all commits.
|
|
||||||
- [ ] All commit messages are formatted in the same style as [the other commits in the repo](https://github.com/restic/restic/blob/master/CONTRIBUTING.md#git-commits).
|
|
||||||
- [ ] I'm done! This pull request is ready for review.
|
|
||||||
|
|
13
.github/dependabot.yml
vendored
13
.github/dependabot.yml
vendored
|
@ -1,13 +0,0 @@
|
||||||
version: 2
|
|
||||||
updates:
|
|
||||||
# Dependencies listed in go.mod
|
|
||||||
- package-ecosystem: "gomod"
|
|
||||||
directory: "/" # Location of package manifests
|
|
||||||
schedule:
|
|
||||||
interval: "monthly"
|
|
||||||
|
|
||||||
# Dependencies listed in .github/workflows/*.yml
|
|
||||||
- package-ecosystem: "github-actions"
|
|
||||||
directory: "/"
|
|
||||||
schedule:
|
|
||||||
interval: "monthly"
|
|
66
.github/workflows/docker.yml
vendored
66
.github/workflows/docker.yml
vendored
|
@ -1,66 +0,0 @@
|
||||||
|
|
||||||
name: Create and publish a Docker image
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- 'v*'
|
|
||||||
branches:
|
|
||||||
- 'master'
|
|
||||||
|
|
||||||
env:
|
|
||||||
REGISTRY: ghcr.io
|
|
||||||
IMAGE_NAME: ${{ github.repository }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-and-push-image:
|
|
||||||
if: github.repository == 'restic/restic'
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
packages: write
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Log in to the Container registry
|
|
||||||
uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567
|
|
||||||
with:
|
|
||||||
registry: ${{ env.REGISTRY }}
|
|
||||||
username: ${{ github.actor }}
|
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Extract metadata (tags, labels) for Docker
|
|
||||||
id: meta
|
|
||||||
uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81
|
|
||||||
with:
|
|
||||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
|
||||||
tags: |
|
|
||||||
type=ref,event=branch
|
|
||||||
type=semver,pattern={{version}}
|
|
||||||
type=semver,pattern={{major}}.{{minor}}
|
|
||||||
|
|
||||||
- name: Set up QEMU
|
|
||||||
uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@2b51285047da1547ffb1b2203d8be4c0af6b1f20
|
|
||||||
|
|
||||||
- name: Ensure consistent binaries
|
|
||||||
run: |
|
|
||||||
echo "removing git directory for consistency with release binaries"
|
|
||||||
rm -rf .git
|
|
||||||
# remove VCS information from release builds, keep VCS for nightly builds on master
|
|
||||||
if: github.ref != 'refs/heads/master'
|
|
||||||
|
|
||||||
- name: Build and push Docker image
|
|
||||||
uses: docker/build-push-action@15560696de535e4014efeff63c48f16952e52dd1
|
|
||||||
with:
|
|
||||||
push: true
|
|
||||||
context: .
|
|
||||||
file: docker/Dockerfile.release
|
|
||||||
platforms: linux/386,linux/amd64,linux/arm,linux/arm64
|
|
||||||
pull: true
|
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
|
335
.github/workflows/tests.yml
vendored
335
.github/workflows/tests.yml
vendored
|
@ -1,335 +0,0 @@
|
||||||
name: test
|
|
||||||
on:
|
|
||||||
# run tests on push to master, but not when other branches are pushed to
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
|
|
||||||
# run tests for all pull requests
|
|
||||||
pull_request:
|
|
||||||
merge_group:
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
env:
|
|
||||||
latest_go: "1.22.x"
|
|
||||||
GO111MODULE: on
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
# list of jobs to run:
|
|
||||||
include:
|
|
||||||
- job_name: Windows
|
|
||||||
go: 1.22.x
|
|
||||||
os: windows-latest
|
|
||||||
|
|
||||||
- job_name: macOS
|
|
||||||
go: 1.22.x
|
|
||||||
os: macOS-latest
|
|
||||||
test_fuse: false
|
|
||||||
|
|
||||||
- job_name: Linux
|
|
||||||
go: 1.22.x
|
|
||||||
os: ubuntu-latest
|
|
||||||
test_cloud_backends: true
|
|
||||||
test_fuse: true
|
|
||||||
check_changelog: true
|
|
||||||
|
|
||||||
- job_name: Linux (race)
|
|
||||||
go: 1.22.x
|
|
||||||
os: ubuntu-latest
|
|
||||||
test_fuse: true
|
|
||||||
test_opts: "-race"
|
|
||||||
|
|
||||||
- job_name: Linux
|
|
||||||
go: 1.21.x
|
|
||||||
os: ubuntu-latest
|
|
||||||
test_fuse: true
|
|
||||||
|
|
||||||
- job_name: Linux
|
|
||||||
go: 1.20.x
|
|
||||||
os: ubuntu-latest
|
|
||||||
test_fuse: true
|
|
||||||
|
|
||||||
- job_name: Linux
|
|
||||||
go: 1.19.x
|
|
||||||
os: ubuntu-latest
|
|
||||||
test_fuse: true
|
|
||||||
|
|
||||||
name: ${{ matrix.job_name }} Go ${{ matrix.go }}
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
|
|
||||||
env:
|
|
||||||
GOPROXY: https://proxy.golang.org
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Check out code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Set up Go ${{ matrix.go }}
|
|
||||||
uses: actions/setup-go@v5
|
|
||||||
with:
|
|
||||||
go-version: ${{ matrix.go }}
|
|
||||||
|
|
||||||
- name: Get programs (Linux/macOS)
|
|
||||||
run: |
|
|
||||||
echo "build Go tools"
|
|
||||||
go install github.com/restic/rest-server/cmd/rest-server@master
|
|
||||||
|
|
||||||
echo "install minio server"
|
|
||||||
mkdir $HOME/bin
|
|
||||||
if [ "$RUNNER_OS" == "macOS" ]; then
|
|
||||||
wget --no-verbose -O $HOME/bin/minio https://dl.minio.io/server/minio/release/darwin-amd64/minio
|
|
||||||
else
|
|
||||||
wget --no-verbose -O $HOME/bin/minio https://dl.minio.io/server/minio/release/linux-amd64/minio
|
|
||||||
fi
|
|
||||||
chmod 755 $HOME/bin/minio
|
|
||||||
|
|
||||||
echo "install rclone"
|
|
||||||
if [ "$RUNNER_OS" == "macOS" ]; then
|
|
||||||
wget --no-verbose -O rclone.zip https://downloads.rclone.org/rclone-current-osx-amd64.zip
|
|
||||||
else
|
|
||||||
wget --no-verbose -O rclone.zip https://downloads.rclone.org/rclone-current-linux-amd64.zip
|
|
||||||
fi
|
|
||||||
unzip rclone.zip
|
|
||||||
cp rclone*/rclone $HOME/bin
|
|
||||||
chmod 755 $HOME/bin/rclone
|
|
||||||
rm -rf rclone*
|
|
||||||
|
|
||||||
# add $HOME/bin to path ($GOBIN was already added to the path by setup-go@v3)
|
|
||||||
echo $HOME/bin >> $GITHUB_PATH
|
|
||||||
if: matrix.os == 'ubuntu-latest' || matrix.os == 'macOS-latest'
|
|
||||||
|
|
||||||
- name: Get programs (Windows)
|
|
||||||
shell: powershell
|
|
||||||
run: |
|
|
||||||
$ProgressPreference = 'SilentlyContinue'
|
|
||||||
|
|
||||||
echo "build Go tools"
|
|
||||||
go install github.com/restic/rest-server/cmd/rest-server@master
|
|
||||||
|
|
||||||
echo "install minio server"
|
|
||||||
mkdir $Env:USERPROFILE/bin
|
|
||||||
Invoke-WebRequest https://dl.minio.io/server/minio/release/windows-amd64/minio.exe -OutFile $Env:USERPROFILE/bin/minio.exe
|
|
||||||
|
|
||||||
echo "install rclone"
|
|
||||||
Invoke-WebRequest https://downloads.rclone.org/rclone-current-windows-amd64.zip -OutFile rclone.zip
|
|
||||||
|
|
||||||
unzip rclone.zip
|
|
||||||
copy rclone*/rclone.exe $Env:USERPROFILE/bin
|
|
||||||
|
|
||||||
# add $USERPROFILE/bin to path ($GOBIN was already added to the path by setup-go@v3)
|
|
||||||
echo $Env:USERPROFILE\bin >> $Env:GITHUB_PATH
|
|
||||||
|
|
||||||
echo "install tar"
|
|
||||||
cd $env:USERPROFILE
|
|
||||||
mkdir tar
|
|
||||||
cd tar
|
|
||||||
|
|
||||||
# install exactly these versions of tar and the libraries, other combinations might not work!
|
|
||||||
|
|
||||||
Invoke-WebRequest https://github.com/restic/test-assets/raw/master/tar-1.13-1-bin.zip -OutFile tar.zip
|
|
||||||
unzip tar.zip
|
|
||||||
Invoke-WebRequest https://github.com/restic/test-assets/raw/master/libintl-0.11.5-2-bin.zip -OutFile libintl.zip
|
|
||||||
unzip libintl.zip
|
|
||||||
Invoke-WebRequest https://github.com/restic/test-assets/raw/master/libiconv-1.8-1-bin.zip -OutFile libiconv.zip
|
|
||||||
unzip libiconv.zip
|
|
||||||
|
|
||||||
# add $USERPROFILE/tar/bin to path
|
|
||||||
echo $Env:USERPROFILE\tar\bin >> $Env:GITHUB_PATH
|
|
||||||
if: matrix.os == 'windows-latest'
|
|
||||||
|
|
||||||
- name: Build with build.go
|
|
||||||
run: |
|
|
||||||
go run build.go
|
|
||||||
|
|
||||||
- name: Minimal test
|
|
||||||
run: |
|
|
||||||
./restic init
|
|
||||||
./restic backup .
|
|
||||||
env:
|
|
||||||
RESTIC_REPOSITORY: ../testrepo
|
|
||||||
RESTIC_PASSWORD: password
|
|
||||||
|
|
||||||
- name: Run local Tests
|
|
||||||
env:
|
|
||||||
RESTIC_TEST_FUSE: ${{ matrix.test_fuse }}
|
|
||||||
run: |
|
|
||||||
go test -cover ${{matrix.test_opts}} ./...
|
|
||||||
|
|
||||||
- name: Test cloud backends
|
|
||||||
env:
|
|
||||||
RESTIC_TEST_S3_KEY: ${{ secrets.RESTIC_TEST_S3_KEY }}
|
|
||||||
RESTIC_TEST_S3_SECRET: ${{ secrets.RESTIC_TEST_S3_SECRET }}
|
|
||||||
RESTIC_TEST_S3_REPOSITORY: ${{ secrets.RESTIC_TEST_S3_REPOSITORY }}
|
|
||||||
RESTIC_TEST_AZURE_ACCOUNT_NAME: ${{ secrets.RESTIC_TEST_AZURE_ACCOUNT_NAME }}
|
|
||||||
RESTIC_TEST_AZURE_ACCOUNT_KEY: ${{ secrets.RESTIC_TEST_AZURE_ACCOUNT_KEY }}
|
|
||||||
RESTIC_TEST_AZURE_REPOSITORY: ${{ secrets.RESTIC_TEST_AZURE_REPOSITORY }}
|
|
||||||
RESTIC_TEST_B2_ACCOUNT_ID: ${{ secrets.RESTIC_TEST_B2_ACCOUNT_ID }}
|
|
||||||
RESTIC_TEST_B2_ACCOUNT_KEY: ${{ secrets.RESTIC_TEST_B2_ACCOUNT_KEY }}
|
|
||||||
RESTIC_TEST_B2_REPOSITORY: ${{ secrets.RESTIC_TEST_B2_REPOSITORY }}
|
|
||||||
RESTIC_TEST_GS_REPOSITORY: ${{ secrets.RESTIC_TEST_GS_REPOSITORY }}
|
|
||||||
RESTIC_TEST_GS_PROJECT_ID: ${{ secrets.RESTIC_TEST_GS_PROJECT_ID }}
|
|
||||||
GOOGLE_PROJECT_ID: ${{ secrets.RESTIC_TEST_GS_PROJECT_ID }}
|
|
||||||
RESTIC_TEST_GS_APPLICATION_CREDENTIALS_B64: ${{ secrets.RESTIC_TEST_GS_APPLICATION_CREDENTIALS_B64 }}
|
|
||||||
RESTIC_TEST_OS_AUTH_URL: ${{ secrets.RESTIC_TEST_OS_AUTH_URL }}
|
|
||||||
RESTIC_TEST_OS_TENANT_NAME: ${{ secrets.RESTIC_TEST_OS_TENANT_NAME }}
|
|
||||||
RESTIC_TEST_OS_USERNAME: ${{ secrets.RESTIC_TEST_OS_USERNAME }}
|
|
||||||
RESTIC_TEST_OS_PASSWORD: ${{ secrets.RESTIC_TEST_OS_PASSWORD }}
|
|
||||||
RESTIC_TEST_OS_REGION_NAME: ${{ secrets.RESTIC_TEST_OS_REGION_NAME }}
|
|
||||||
RESTIC_TEST_SWIFT: ${{ secrets.RESTIC_TEST_SWIFT }}
|
|
||||||
# fail if any of the following tests cannot be run
|
|
||||||
RESTIC_TEST_DISALLOW_SKIP: "restic/backend/rest.TestBackendREST,\
|
|
||||||
restic/backend/sftp.TestBackendSFTP,\
|
|
||||||
restic/backend/s3.TestBackendMinio,\
|
|
||||||
restic/backend/rclone.TestBackendRclone,\
|
|
||||||
restic/backend/s3.TestBackendS3,\
|
|
||||||
restic/backend/swift.TestBackendSwift,\
|
|
||||||
restic/backend/b2.TestBackendB2,\
|
|
||||||
restic/backend/gs.TestBackendGS,\
|
|
||||||
restic/backend/azure.TestBackendAzure"
|
|
||||||
run: |
|
|
||||||
# prepare credentials for Google Cloud Storage tests in a temp file
|
|
||||||
export GOOGLE_APPLICATION_CREDENTIALS=$(mktemp --tmpdir restic-gcs-auth-XXXXXXX)
|
|
||||||
echo $RESTIC_TEST_GS_APPLICATION_CREDENTIALS_B64 | base64 -d > $GOOGLE_APPLICATION_CREDENTIALS
|
|
||||||
go test -cover -parallel 4 ./internal/backend/...
|
|
||||||
|
|
||||||
# only run cloud backend tests for pull requests from and pushes to our
|
|
||||||
# own repo, otherwise the secrets are not available
|
|
||||||
# Skip for Dependabot pull requests as these are run without secrets
|
|
||||||
# https://docs.github.com/en/code-security/dependabot/working-with-dependabot/automating-dependabot-with-github-actions#responding-to-events
|
|
||||||
if: ((github.repository == 'restic/restic' && github.event_name == 'push') || github.event.pull_request.head.repo.full_name == github.repository) && (github.actor != 'dependabot[bot]') && matrix.test_cloud_backends
|
|
||||||
|
|
||||||
- name: Check changelog files with calens
|
|
||||||
run: |
|
|
||||||
echo "install calens"
|
|
||||||
go install github.com/restic/calens@latest
|
|
||||||
|
|
||||||
echo "check changelog files"
|
|
||||||
calens
|
|
||||||
if: matrix.check_changelog
|
|
||||||
|
|
||||||
cross_compile:
|
|
||||||
strategy:
|
|
||||||
|
|
||||||
matrix:
|
|
||||||
# run cross-compile in three batches parallel so the overall tests run faster
|
|
||||||
subset:
|
|
||||||
- "0/3"
|
|
||||||
- "1/3"
|
|
||||||
- "2/3"
|
|
||||||
|
|
||||||
env:
|
|
||||||
GOPROXY: https://proxy.golang.org
|
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
name: Cross Compile for subset ${{ matrix.subset }}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Check out code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Set up Go ${{ env.latest_go }}
|
|
||||||
uses: actions/setup-go@v5
|
|
||||||
with:
|
|
||||||
go-version: ${{ env.latest_go }}
|
|
||||||
|
|
||||||
- name: Cross-compile for subset ${{ matrix.subset }}
|
|
||||||
run: |
|
|
||||||
mkdir build-output build-output-debug
|
|
||||||
go run ./helpers/build-release-binaries/main.go -o build-output -s . --platform-subset ${{ matrix.subset }}
|
|
||||||
go run ./helpers/build-release-binaries/main.go -o build-output-debug -s . --platform-subset ${{ matrix.subset }} --tags debug
|
|
||||||
|
|
||||||
lint:
|
|
||||||
name: lint
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
# allow annotating code in the PR
|
|
||||||
checks: write
|
|
||||||
steps:
|
|
||||||
- name: Check out code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Set up Go ${{ env.latest_go }}
|
|
||||||
uses: actions/setup-go@v5
|
|
||||||
with:
|
|
||||||
go-version: ${{ env.latest_go }}
|
|
||||||
|
|
||||||
- name: golangci-lint
|
|
||||||
uses: golangci/golangci-lint-action@v6
|
|
||||||
with:
|
|
||||||
# Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version.
|
|
||||||
version: v1.57.1
|
|
||||||
args: --verbose --timeout 5m
|
|
||||||
|
|
||||||
# only run golangci-lint for pull requests, otherwise ALL hints get
|
|
||||||
# reported. We need to slowly address all issues until we can enable
|
|
||||||
# linting the master branch :)
|
|
||||||
if: github.event_name == 'pull_request'
|
|
||||||
|
|
||||||
- name: Check go.mod/go.sum
|
|
||||||
run: |
|
|
||||||
echo "check if go.mod and go.sum are up to date"
|
|
||||||
go mod tidy
|
|
||||||
git diff --exit-code go.mod go.sum
|
|
||||||
|
|
||||||
analyze:
|
|
||||||
name: Analyze results
|
|
||||||
needs: [test, cross_compile, lint]
|
|
||||||
if: always()
|
|
||||||
|
|
||||||
permissions: # no need to access code
|
|
||||||
contents: none
|
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Decide whether the needed jobs succeeded or failed
|
|
||||||
uses: re-actors/alls-green@05ac9388f0aebcb5727afa17fcccfecd6f8ec5fe
|
|
||||||
with:
|
|
||||||
jobs: ${{ toJSON(needs) }}
|
|
||||||
|
|
||||||
docker:
|
|
||||||
name: docker
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Check out code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Docker meta
|
|
||||||
id: meta
|
|
||||||
uses: docker/metadata-action@v5
|
|
||||||
with:
|
|
||||||
# list of Docker images to use as base name for tags
|
|
||||||
images: |
|
|
||||||
restic/restic
|
|
||||||
# generate Docker tags based on the following events/attributes
|
|
||||||
tags: |
|
|
||||||
type=schedule
|
|
||||||
type=ref,event=branch
|
|
||||||
type=ref,event=pr
|
|
||||||
type=semver,pattern={{version}}
|
|
||||||
type=semver,pattern={{major}}.{{minor}}
|
|
||||||
type=semver,pattern={{major}}
|
|
||||||
type=sha
|
|
||||||
|
|
||||||
- name: Set up QEMU
|
|
||||||
uses: docker/setup-qemu-action@v3
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Build and push
|
|
||||||
id: docker_build
|
|
||||||
uses: docker/build-push-action@v6
|
|
||||||
with:
|
|
||||||
push: false
|
|
||||||
context: .
|
|
||||||
file: docker/Dockerfile
|
|
||||||
pull: true
|
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
|
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -1,5 +1,3 @@
|
||||||
/.idea
|
|
||||||
/restic
|
/restic
|
||||||
/restic.exe
|
|
||||||
/.vagrant
|
/.vagrant
|
||||||
/.vscode
|
/doc/_build
|
||||||
|
|
|
@ -1,69 +0,0 @@
|
||||||
# This is the configuration for golangci-lint for the restic project.
|
|
||||||
#
|
|
||||||
# A sample config with all settings is here:
|
|
||||||
# https://github.com/golangci/golangci-lint/blob/master/.golangci.example.yml
|
|
||||||
|
|
||||||
linters:
|
|
||||||
# only enable the linters listed below
|
|
||||||
disable-all: true
|
|
||||||
enable:
|
|
||||||
# make sure all errors returned by functions are handled
|
|
||||||
- errcheck
|
|
||||||
|
|
||||||
# show how code can be simplified
|
|
||||||
- gosimple
|
|
||||||
|
|
||||||
# make sure code is formatted
|
|
||||||
- gofmt
|
|
||||||
|
|
||||||
# examine code and report suspicious constructs, such as Printf calls whose
|
|
||||||
# arguments do not align with the format string
|
|
||||||
- govet
|
|
||||||
|
|
||||||
# make sure names and comments are used according to the conventions
|
|
||||||
- revive
|
|
||||||
|
|
||||||
# detect when assignments to existing variables are not used
|
|
||||||
- ineffassign
|
|
||||||
|
|
||||||
# run static analysis and find errors
|
|
||||||
- staticcheck
|
|
||||||
|
|
||||||
# find unused variables, functions, structs, types, etc.
|
|
||||||
- unused
|
|
||||||
|
|
||||||
# parse and typecheck code
|
|
||||||
- typecheck
|
|
||||||
|
|
||||||
# ensure that http response bodies are closed
|
|
||||||
- bodyclose
|
|
||||||
|
|
||||||
- importas
|
|
||||||
|
|
||||||
issues:
|
|
||||||
# don't use the default exclude rules, this hides (among others) ignored
|
|
||||||
# errors from Close() calls
|
|
||||||
exclude-use-default: false
|
|
||||||
|
|
||||||
# list of things to not warn about
|
|
||||||
exclude:
|
|
||||||
# revive: do not warn about missing comments for exported stuff
|
|
||||||
- exported (function|method|var|type|const) .* should have comment or be unexported
|
|
||||||
# revive: ignore constants in all caps
|
|
||||||
- don't use ALL_CAPS in Go names; use CamelCase
|
|
||||||
# revive: lots of packages don't have such a comment
|
|
||||||
- "package-comments: should have a package comment"
|
|
||||||
# staticcheck: there's no easy way to replace these packages
|
|
||||||
- "SA1019: \"golang.org/x/crypto/poly1305\" is deprecated"
|
|
||||||
- "SA1019: \"golang.org/x/crypto/openpgp\" is deprecated"
|
|
||||||
|
|
||||||
exclude-rules:
|
|
||||||
# revive: ignore unused parameters in tests
|
|
||||||
- path: (_test\.go|testing\.go|backend/.*/tests\.go)
|
|
||||||
text: "unused-parameter:"
|
|
||||||
|
|
||||||
linters-settings:
|
|
||||||
importas:
|
|
||||||
alias:
|
|
||||||
- pkg: github.com/restic/restic/internal/test
|
|
||||||
alias: rtest
|
|
2
.hound.yml
Normal file
2
.hound.yml
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
go:
|
||||||
|
enabled: true
|
|
@ -1,22 +0,0 @@
|
||||||
# Read the Docs configuration file
|
|
||||||
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
|
|
||||||
|
|
||||||
version: 2
|
|
||||||
|
|
||||||
build:
|
|
||||||
os: ubuntu-22.04
|
|
||||||
tools:
|
|
||||||
python: "3.11"
|
|
||||||
|
|
||||||
# Build HTMLZip
|
|
||||||
formats:
|
|
||||||
- htmlzip
|
|
||||||
|
|
||||||
# Build documentation in the docs/ directory with Sphinx
|
|
||||||
sphinx:
|
|
||||||
configuration: doc/conf.py
|
|
||||||
|
|
||||||
# https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
|
|
||||||
python:
|
|
||||||
install:
|
|
||||||
- requirements: doc/requirements.txt
|
|
41
.travis.yml
Normal file
41
.travis.yml
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
language: go
|
||||||
|
sudo: false
|
||||||
|
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- os: linux
|
||||||
|
go: "1.9.x"
|
||||||
|
env: RESTIC_TEST_FUSE=0 RESTIC_TEST_CLOUD_BACKENDS=0 RESTIC_BUILD_SOLARIS=0
|
||||||
|
|
||||||
|
# only run fuse and cloud backends tests on Travis for the latest Go on Linux
|
||||||
|
- os: linux
|
||||||
|
go: "1.10.x"
|
||||||
|
sudo: true
|
||||||
|
|
||||||
|
- os: osx
|
||||||
|
go: "1.10.x"
|
||||||
|
env: RESTIC_TEST_FUSE=0 RESTIC_TEST_CLOUD_BACKENDS=0
|
||||||
|
|
||||||
|
branches:
|
||||||
|
only:
|
||||||
|
- master
|
||||||
|
|
||||||
|
notifications:
|
||||||
|
irc:
|
||||||
|
channels:
|
||||||
|
- "chat.freenode.net#restic"
|
||||||
|
on_success: change
|
||||||
|
on_failure: change
|
||||||
|
skip_join: true
|
||||||
|
|
||||||
|
install:
|
||||||
|
- go version
|
||||||
|
- export GOBIN="$GOPATH/bin"
|
||||||
|
- export PATH="$PATH:$GOBIN"
|
||||||
|
- go env
|
||||||
|
|
||||||
|
script:
|
||||||
|
- go run run_integration_tests.go
|
||||||
|
|
||||||
|
after_success:
|
||||||
|
- bash <(curl -s https://codecov.io/bash) -f all.cov
|
6752
CHANGELOG.md
6752
CHANGELOG.md
File diff suppressed because it is too large
Load diff
142
CONTRIBUTING.md
142
CONTRIBUTING.md
|
@ -6,18 +6,17 @@ Ways to Help Out
|
||||||
Thank you for your contribution! Please **open an issue first** (or add a
|
Thank you for your contribution! Please **open an issue first** (or add a
|
||||||
comment to an existing issue) if you plan to work on any code or add a new
|
comment to an existing issue) if you plan to work on any code or add a new
|
||||||
feature. This way, duplicate work is prevented and we can discuss your ideas
|
feature. This way, duplicate work is prevented and we can discuss your ideas
|
||||||
and design first. Small bugfixes are an exception to this rule, just open a
|
and design first.
|
||||||
pull request in this case.
|
|
||||||
|
|
||||||
There are several ways you can help us out. First of all code contributions and
|
There are several ways you can help us out. First of all code contributions and
|
||||||
bug fixes are most welcome. However even "minor" details as fixing spelling
|
bug fixes are most welcome. However even "minor" details as fixing spelling
|
||||||
errors, improving documentation or pointing out usability issues are a great
|
errors, improving documentation or pointing out usability issues are a great
|
||||||
help also.
|
help also.
|
||||||
|
|
||||||
|
|
||||||
The restic project uses the GitHub infrastructure (see the
|
The restic project uses the GitHub infrastructure (see the
|
||||||
[project page](https://github.com/restic/restic)) for all related discussions
|
[project page](https://github.com/restic/restic)) for all related discussions
|
||||||
as well as the [forum](https://forum.restic.net/) and the `#restic` channel
|
as well as the `#restic` channel on `irc.freenode.net`.
|
||||||
on [irc.libera.chat](https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:6697/#restic).
|
|
||||||
|
|
||||||
If you want to find an area that currently needs improving have a look at the
|
If you want to find an area that currently needs improving have a look at the
|
||||||
open issues listed at the
|
open issues listed at the
|
||||||
|
@ -26,10 +25,7 @@ for discussing enhancement to the restic tools.
|
||||||
|
|
||||||
If you are unsure what to do, please have a look at the issues, especially
|
If you are unsure what to do, please have a look at the issues, especially
|
||||||
those tagged
|
those tagged
|
||||||
[minor complexity](https://github.com/restic/restic/labels/help%3A%20minor%20complexity)
|
[minor complexity](https://github.com/restic/restic/labels/minor%20complexity).
|
||||||
or [good first issue](https://github.com/restic/restic/labels/help%3A%20good%20first%20issue).
|
|
||||||
If you are already a bit experienced with the restic internals, take a look
|
|
||||||
at the issues tagged as [help wanted](https://github.com/restic/restic/labels/help%3A%20wanted).
|
|
||||||
|
|
||||||
|
|
||||||
Reporting Bugs
|
Reporting Bugs
|
||||||
|
@ -49,8 +45,9 @@ environment was used and so on. Please tell us at least the following things:
|
||||||
Remember, the easier it is for us to reproduce the bug, the earlier it will be
|
Remember, the easier it is for us to reproduce the bug, the earlier it will be
|
||||||
corrected!
|
corrected!
|
||||||
|
|
||||||
In addition, you can instruct restic to create a debug log by setting the
|
In addition, you can compile restic with debug support by running
|
||||||
environment variable `DEBUG_LOG` to a file, e.g. like this:
|
`go run build.go -tags debug` and instructing it to create a debug log by
|
||||||
|
setting the environment variable `DEBUG_LOG` to a file, e.g. like this:
|
||||||
|
|
||||||
$ export DEBUG_LOG=/tmp/restic-debug.log
|
$ export DEBUG_LOG=/tmp/restic-debug.log
|
||||||
$ restic backup ~/work
|
$ restic backup ~/work
|
||||||
|
@ -59,72 +56,39 @@ Please be aware that the debug log file will contain potentially sensitive
|
||||||
things like file and directory names, so please either redact it before
|
things like file and directory names, so please either redact it before
|
||||||
uploading it somewhere or post only the parts that are really relevant.
|
uploading it somewhere or post only the parts that are really relevant.
|
||||||
|
|
||||||
If restic gets stuck, please also include a stacktrace in the description.
|
|
||||||
On non-Windows systems, you can send a SIGQUIT signal to restic or press
|
|
||||||
`Ctrl-\` to achieve the same result. This causes restic to print a stacktrace
|
|
||||||
and then exit immediately. This will not damage your repository, however,
|
|
||||||
it might be necessary to manually clean up stale lock files using
|
|
||||||
`restic unlock`.
|
|
||||||
|
|
||||||
On Windows, please set the environment variable `RESTIC_DEBUG_STACKTRACE_SIGINT`
|
|
||||||
to `true` and press `Ctrl-C` to create a stacktrace.
|
|
||||||
|
|
||||||
If you think restic uses too much memory or a too large cache directory, then
|
|
||||||
please include the output of `restic stats --mode debug`.
|
|
||||||
|
|
||||||
|
|
||||||
Development Environment
|
Development Environment
|
||||||
=======================
|
=======================
|
||||||
|
|
||||||
The repository contains the code written for restic in the directories
|
In order to compile restic with the `go` tool directly, it needs to be checked
|
||||||
`cmd/` and `internal/`.
|
out at the right path within a `GOPATH`. The concept of a `GOPATH` is explained
|
||||||
|
in ["How to write Go code"](https://golang.org/doc/code.html).
|
||||||
|
|
||||||
Make sure you have the minimum required Go version installed. Clone the repo
|
If you do not have a directory with Go code yet, executing the following
|
||||||
(without having `$GOPATH` set) and `cd` into the directory:
|
instructions in your shell will create one for you and check out the restic
|
||||||
|
repo:
|
||||||
|
|
||||||
$ unset GOPATH
|
$ export GOPATH="$HOME/go"
|
||||||
|
$ mkdir -p "$GOPATH/src/github.com/restic"
|
||||||
|
$ cd "$GOPATH/src/github.com/restic"
|
||||||
$ git clone https://github.com/restic/restic
|
$ git clone https://github.com/restic/restic
|
||||||
$ cd restic
|
$ cd restic
|
||||||
|
|
||||||
Then use the `go` tool to build restic:
|
You can then build restic as follows:
|
||||||
|
|
||||||
$ go build ./cmd/restic
|
$ go build ./cmd/restic
|
||||||
$ ./restic version
|
$ ./restic version
|
||||||
restic 0.14.0-dev (compiled manually) compiled with go1.19 on linux/amd64
|
restic compiled manually
|
||||||
|
compiled with go1.8.3 on linux/amd64
|
||||||
|
|
||||||
To create a debug build use:
|
The following commands can be used to run all the tests:
|
||||||
|
|
||||||
$ go build -tags debug ./cmd/restic
|
$ go test ./cmd/... ./internal/...
|
||||||
|
|
||||||
You can run all tests with the following command:
|
|
||||||
|
|
||||||
$ go test ./...
|
|
||||||
|
|
||||||
|
|
||||||
Performance and Memory Usage Issues
|
|
||||||
===================================
|
|
||||||
|
|
||||||
Debug builds of restic support the `--block-profile`, `--cpu-profile`,
|
|
||||||
`--mem-profile`, and `--trace-profile` options which collect performance data
|
|
||||||
that later on can be analyzed using the go tools:
|
|
||||||
|
|
||||||
$ restic --cpu-profile . [...]
|
|
||||||
$ go tool pprof -http localhost:12345 cpu.pprof
|
|
||||||
|
|
||||||
To analyze a trace profile use `go tool trace -http=localhost:12345 trace.out`.
|
|
||||||
|
|
||||||
As the memory usage of restic changes over time, it may be useful to capture a
|
|
||||||
snapshot of the current heap. This is possible using then `--listen-profile`
|
|
||||||
option. Then while restic runs you can query and afterwards analyze the heap statistics.
|
|
||||||
|
|
||||||
$ restic --listen-profile localhost:12345 [...]
|
|
||||||
$ curl http://localhost:12345/debug/pprof/heap -o heap.pprof
|
|
||||||
$ go tool pprof -http localhost:12345 heap.pprof
|
|
||||||
|
|
||||||
Further useful tools are setting the environment variable `GODEBUG=gctrace=1`,
|
|
||||||
which provides information about garbage collector runs. For a graphical variant
|
|
||||||
combine this with gcvis.
|
|
||||||
|
|
||||||
|
The repository contains two sets of directories with code: `cmd/` and
|
||||||
|
`internal/` contain the code written for restic, whereas `vendor/` contains
|
||||||
|
copies of libraries restic depends on. The libraries are managed with the
|
||||||
|
[`dep`](https://github.com/golang/dep) tool.
|
||||||
|
|
||||||
Providing Patches
|
Providing Patches
|
||||||
=================
|
=================
|
||||||
|
@ -138,19 +102,21 @@ down to the following steps:
|
||||||
GitHub. For a new feature, please add an issue before starting to work on
|
GitHub. For a new feature, please add an issue before starting to work on
|
||||||
it, so that duplicate work is prevented.
|
it, so that duplicate work is prevented.
|
||||||
|
|
||||||
1. Next, fork our project on GitHub if you haven't done so already.
|
1. First we would kindly ask you to fork our project on GitHub if you haven't
|
||||||
|
done so already.
|
||||||
|
|
||||||
2. Clone your fork of the repository locally and **create a new branch** for
|
2. Clone the repository locally and create a new branch. If you are working on
|
||||||
your changes. If you are working on the code itself, please set up the
|
the code itself, please set up the development environment as described in
|
||||||
development environment as described in the previous section.
|
the previous section. Especially take care to place your forked repository
|
||||||
|
at the correct path (`src/github.com/restic/restic`) within your `GOPATH`.
|
||||||
|
|
||||||
3. Commit your changes to the new branch as fine grained as possible, as
|
3. Then commit your changes as fine grained as possible, as smaller patches,
|
||||||
smaller patches, for individual changes, are easier to discuss and merge.
|
that handle one and only one issue are easier to discuss and merge.
|
||||||
|
|
||||||
4. Push the new branch with your changes to your fork of the repository.
|
4. Push the new branch with your changes to your fork of the repository.
|
||||||
|
|
||||||
5. Create a pull request by visiting the GitHub website, it will guide you
|
5. Create a pull request by visiting the GitHub website, it will guide you
|
||||||
through the process. Please [allow edits from maintainers](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/allowing-changes-to-a-pull-request-branch-created-from-a-fork).
|
through the process.
|
||||||
|
|
||||||
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
|
||||||
|
@ -158,44 +124,30 @@ down to the following steps:
|
||||||
existing commit, use common sense to decide which is better), 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
|
7. If your pull request changes anything that users should be aware of (a
|
||||||
(a bugfix, a new feature, ...) please add an entry as a new file in
|
bugfix, a new feature, ...) please add an entry to the file
|
||||||
`changelog/unreleased` including the issue number in the filename (e.g.
|
['CHANGELOG.md'](CHANGELOG.md). It will be used in the announcement of the
|
||||||
`issue-8756`). Use the template in `changelog/TEMPLATE` for the content.
|
next stable release. While writing, ask yourself: If I were the user, what
|
||||||
It will be used in the announcement of the next stable release. While
|
would I need to be aware of with this change.
|
||||||
writing, ask yourself: If I were the user, what would I need to be aware
|
|
||||||
of with this change?
|
|
||||||
|
|
||||||
8. Do not edit the man pages under `doc/man` or `doc/manual_rest.rst` -
|
8. Once your code looks good and passes all the tests, we'll merge it. Thanks
|
||||||
these are autogenerated before new releases.
|
|
||||||
|
|
||||||
9. Once your code looks good and passes all the tests, we'll merge it. Thanks
|
|
||||||
a lot for your contribution!
|
a lot for your contribution!
|
||||||
|
|
||||||
Please provide the patches for each bug or feature in a separate branch and
|
Please provide the patches for each bug or feature in a separate branch and
|
||||||
open up a pull request for each, as this simplifies discussion and merging.
|
open up a pull request for each.
|
||||||
|
|
||||||
The restic project uses the `gofmt` tool for Go source indentation, so please
|
The restic project uses the `gofmt` tool for Go source indentation, so please
|
||||||
run
|
run
|
||||||
|
|
||||||
gofmt -w **/*.go
|
gofmt -w **/*.go
|
||||||
|
|
||||||
in the project root directory before committing. For each Pull Request, the
|
in the project root directory before committing. Installing the script
|
||||||
formatting is tested with `gofmt` for the latest stable version of Go.
|
`fmt-check` from https://github.com/edsrzf/gofmt-git-hook locally as a
|
||||||
Installing the script `fmt-check` from https://github.com/edsrzf/gofmt-git-hook
|
pre-commit hook checks formatting before committing automatically, just copy
|
||||||
locally as a pre-commit hook checks formatting before committing automatically,
|
this script to `.git/hooks/pre-commit`.
|
||||||
just copy this script to `.git/hooks/pre-commit`.
|
|
||||||
|
|
||||||
The project is using the program
|
|
||||||
[`golangci-lint`](https://github.com/golangci/golangci-lint) to run a list of
|
|
||||||
linters and checkers. It will be run on the code when you submit a PR. In order
|
|
||||||
to check your code beforehand, you can run `golangci-lint run` manually.
|
|
||||||
Eventually, we will enable `golangci-lint` for the whole code base. For now,
|
|
||||||
you can ignore warnings printed for lines you did not modify, those will be
|
|
||||||
ignored by the CI.
|
|
||||||
|
|
||||||
For each pull request, several different systems run the integration tests on
|
For each pull request, several different systems run the integration tests on
|
||||||
Linux, macOS and Windows. We won't merge any code that does not pass all tests
|
Linux, OS X and Windows. We won't merge any code that does not pass all tests
|
||||||
for all systems, so when a tests fails, try to find out what's wrong and fix
|
for all systems, so when a tests fails, try to find out what's wrong and fix
|
||||||
it. If you need help on this, please leave a comment in the pull request, and
|
it. If you need help on this, please leave a comment in the pull request, and
|
||||||
we'll be glad to assist. Having a PR with failing integration tests is nothing
|
we'll be glad to assist. Having a PR with failing integration tests is nothing
|
||||||
|
@ -212,7 +164,7 @@ history and triaging bugs much easier.
|
||||||
Git commit messages have a very terse summary in the first line of the commit
|
Git commit messages have a very terse summary in the first line of the commit
|
||||||
message, followed by an empty line, followed by a more verbose description or a
|
message, followed by an empty line, followed by a more verbose description or a
|
||||||
List of changed things. For examples, please refer to the excellent [How to
|
List of changed things. For examples, please refer to the excellent [How to
|
||||||
Write a Git Commit Message](https://chris.beams.io/posts/git-commit/).
|
Write a Git Commit Message](http://chris.beams.io/posts/git-commit/).
|
||||||
|
|
||||||
If you change/add multiple different things that aren't related at all, try to
|
If you change/add multiple different things that aren't related at all, try to
|
||||||
make several smaller commits. This is much easier to review. Using `git add -p`
|
make several smaller commits. This is much easier to review. Using `git add -p`
|
||||||
|
|
255
Gopkg.lock
generated
Normal file
255
Gopkg.lock
generated
Normal file
|
@ -0,0 +1,255 @@
|
||||||
|
# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
|
||||||
|
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "bazil.org/fuse"
|
||||||
|
packages = [".","fs","fuseutil"]
|
||||||
|
revision = "371fbbdaa8987b715bdd21d6adc4c9b20155f748"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "cloud.google.com/go"
|
||||||
|
packages = ["compute/metadata"]
|
||||||
|
revision = "4b98a6370e36d7a85192e7bad08a4ebd82eac2a8"
|
||||||
|
version = "v0.20.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/Azure/azure-sdk-for-go"
|
||||||
|
packages = ["storage","version"]
|
||||||
|
revision = "56332fec5b308fbb6615fa1af6117394cdba186d"
|
||||||
|
version = "v15.0.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/Azure/go-autorest"
|
||||||
|
packages = ["autorest","autorest/adal","autorest/azure","autorest/date"]
|
||||||
|
revision = "ed4b7f5bf1ec0c9ede1fda2681d96771282f2862"
|
||||||
|
version = "v10.4.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/cenkalti/backoff"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "2ea60e5f094469f9e65adb9cd103795b73ae743e"
|
||||||
|
version = "v2.0.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/cpuguy83/go-md2man"
|
||||||
|
packages = ["md2man"]
|
||||||
|
revision = "20f5889cbdc3c73dbd2862796665e7c465ade7d1"
|
||||||
|
version = "v1.0.8"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/dgrijalva/jwt-go"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "06ea1031745cb8b3dab3f6a236daf2b0aa468b7e"
|
||||||
|
version = "v3.2.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "github.com/dustin/go-humanize"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "bb3d318650d48840a39aa21a027c6630e198e626"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/elithrar/simple-scrypt"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "d150773194090feb6c897805a7bcea8d49544e2c"
|
||||||
|
version = "v1.3.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/go-ini/ini"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "6333e38ac20b8949a8dd68baa3650f4dee8f39f0"
|
||||||
|
version = "v1.33.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/golang/protobuf"
|
||||||
|
packages = ["proto"]
|
||||||
|
revision = "925541529c1fa6821df4e44ce2723319eb2be768"
|
||||||
|
version = "v1.0.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/google/go-cmp"
|
||||||
|
packages = ["cmp","cmp/internal/diff","cmp/internal/function","cmp/internal/value"]
|
||||||
|
revision = "8099a9787ce5dc5984ed879a3bda47dc730a8e97"
|
||||||
|
version = "v0.1.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/inconshreveable/mousetrap"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75"
|
||||||
|
version = "v1.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/juju/ratelimit"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "59fac5042749a5afb9af70e813da1dd5474f0167"
|
||||||
|
version = "1.0.1"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "github.com/kr/fs"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "2788f0dbd16903de03cb8186e5c7d97b69ad387b"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/kurin/blazer"
|
||||||
|
packages = ["b2","base","internal/b2assets","internal/b2types","internal/blog","x/window"]
|
||||||
|
revision = "318e9768bf9a0fe52a64b9f8fe74f4f5caef6452"
|
||||||
|
version = "v0.4.4"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/marstr/guid"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "8bd9a64bf37eb297b492a4101fb28e80ac0b290f"
|
||||||
|
version = "v1.1.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/mattn/go-isatty"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "0360b2af4f38e8d38c7fce2a9f4e702702d73a39"
|
||||||
|
version = "v0.0.3"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/minio/minio-go"
|
||||||
|
packages = [".","pkg/credentials","pkg/encrypt","pkg/policy","pkg/s3signer","pkg/s3utils","pkg/set"]
|
||||||
|
revision = "66252c2a3c15f7b90cc8493d497a04ac3b6e3606"
|
||||||
|
version = "5.0.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "github.com/mitchellh/go-homedir"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "b8bc1bf767474819792c23f32d8286a45736f1c6"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "github.com/ncw/swift"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "b2a7479cf26fa841ff90dd932d0221cb5c50782d"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/pkg/errors"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "645ef00459ed84a119197bfb8d8205042c6df63d"
|
||||||
|
version = "v0.8.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/pkg/profile"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "5b67d428864e92711fcbd2f8629456121a56d91f"
|
||||||
|
version = "v1.2.1"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/pkg/sftp"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "49488377fa2f14143ba3067cf7555f60f6c7b550"
|
||||||
|
version = "1.5.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/pkg/xattr"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "1d7b7ffe7c46974a836eb583b7452f22de1c18cf"
|
||||||
|
version = "v0.2.3"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/restic/chunker"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "db83917be3b88cc307464b7d8a221c173e34a0db"
|
||||||
|
version = "v0.2.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/russross/blackfriday"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "55d61fa8aa702f59229e6cff85793c22e580eaf5"
|
||||||
|
version = "v1.5.1"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/satori/go.uuid"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "f58768cc1a7a7e77a3bd49e98cdd21419399b6a3"
|
||||||
|
version = "v1.2.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/sirupsen/logrus"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "c155da19408a8799da419ed3eeb0cb5db0ad5dbc"
|
||||||
|
version = "v1.0.5"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/spf13/cobra"
|
||||||
|
packages = [".","doc"]
|
||||||
|
revision = "a1f051bc3eba734da4772d60e2d677f47cf93ef4"
|
||||||
|
version = "v0.0.2"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/spf13/pflag"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "e57e3eeb33f795204c1ca35f56c44f83227c6e66"
|
||||||
|
version = "v1.0.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "golang.org/x/crypto"
|
||||||
|
packages = ["argon2","blake2b","curve25519","ed25519","ed25519/internal/edwards25519","internal/chacha20","pbkdf2","poly1305","scrypt","ssh","ssh/terminal"]
|
||||||
|
revision = "4ec37c66abab2c7e02ae775328b2ff001c3f025a"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "golang.org/x/net"
|
||||||
|
packages = ["context","context/ctxhttp","http2","http2/hpack","idna","lex/httplex"]
|
||||||
|
revision = "6078986fec03a1dcc236c34816c71b0e05018fda"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "golang.org/x/oauth2"
|
||||||
|
packages = [".","google","internal","jws","jwt"]
|
||||||
|
revision = "fdc9e635145ae97e6c2cb777c48305600cf515cb"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "golang.org/x/sync"
|
||||||
|
packages = ["errgroup"]
|
||||||
|
revision = "1d60e4601c6fd243af51cc01ddf169918a5407ca"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "golang.org/x/sys"
|
||||||
|
packages = ["cpu","unix","windows"]
|
||||||
|
revision = "7db1c3b1a98089d0071c84f646ff5c96aad43682"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "golang.org/x/text"
|
||||||
|
packages = ["collate","collate/build","encoding","encoding/internal","encoding/internal/identifier","encoding/unicode","internal/colltab","internal/gen","internal/tag","internal/triegen","internal/ucd","internal/utf8internal","language","runes","secure/bidirule","transform","unicode/bidi","unicode/cldr","unicode/norm","unicode/rangetable"]
|
||||||
|
revision = "f21a4dfb5e38f5895301dc265a8def02365cc3d0"
|
||||||
|
version = "v0.3.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "google.golang.org/api"
|
||||||
|
packages = ["gensupport","googleapi","googleapi/internal/uritemplates","storage/v1"]
|
||||||
|
revision = "dbbc13f71100fa6ece308335445fca6bb0dd5c2f"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "google.golang.org/appengine"
|
||||||
|
packages = [".","internal","internal/app_identity","internal/base","internal/datastore","internal/log","internal/modules","internal/remote_api","internal/urlfetch","urlfetch"]
|
||||||
|
revision = "150dc57a1b433e64154302bdc40b6bb8aefa313a"
|
||||||
|
version = "v1.0.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "v2"
|
||||||
|
name = "gopkg.in/tomb.v2"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "d5d1b5820637886def9eef33e03a27a9f166942c"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "gopkg.in/yaml.v2"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "5420a8b6744d3b0345ab293f6fcba19c978f1183"
|
||||||
|
version = "v2.2.1"
|
||||||
|
|
||||||
|
[solve-meta]
|
||||||
|
analyzer-name = "dep"
|
||||||
|
analyzer-version = 1
|
||||||
|
inputs-digest = "a5de339cba7570216b212439b90e1e6c384c94be8342fe7755b7cb66aa0a3440"
|
||||||
|
solver-name = "gps-cdcl"
|
||||||
|
solver-version = 1
|
21
Gopkg.toml
Normal file
21
Gopkg.toml
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
|
||||||
|
# Gopkg.toml example
|
||||||
|
#
|
||||||
|
# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md
|
||||||
|
# for detailed Gopkg.toml documentation.
|
||||||
|
#
|
||||||
|
# required = ["github.com/user/thing/cmd/thing"]
|
||||||
|
# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
|
||||||
|
#
|
||||||
|
# [[constraint]]
|
||||||
|
# name = "github.com/user/project"
|
||||||
|
# version = "1.0.0"
|
||||||
|
#
|
||||||
|
# [[constraint]]
|
||||||
|
# name = "github.com/user/project2"
|
||||||
|
# branch = "dev"
|
||||||
|
# source = "github.com/myfork/project2"
|
||||||
|
#
|
||||||
|
# [[override]]
|
||||||
|
# name = "github.com/x/y"
|
||||||
|
# version = "2.4.0"
|
109
README.md
109
README.md
|
@ -1,109 +0,0 @@
|
||||||
[![Documentation](https://readthedocs.org/projects/restic/badge/?version=latest)](https://restic.readthedocs.io/en/latest/?badge=latest)
|
|
||||||
[![Build Status](https://github.com/restic/restic/workflows/test/badge.svg)](https://github.com/restic/restic/actions?query=workflow%3Atest)
|
|
||||||
[![Go Report Card](https://goreportcard.com/badge/github.com/restic/restic)](https://goreportcard.com/report/github.com/restic/restic)
|
|
||||||
|
|
||||||
# Introduction
|
|
||||||
|
|
||||||
restic is a backup program that is fast, efficient and secure. It supports the three major operating systems (Linux, macOS, Windows) and a few smaller ones (FreeBSD, OpenBSD).
|
|
||||||
|
|
||||||
For detailed usage and installation instructions check out the [documentation](https://restic.readthedocs.io/en/latest).
|
|
||||||
|
|
||||||
You can ask questions in our [Discourse forum](https://forum.restic.net).
|
|
||||||
|
|
||||||
## Quick start
|
|
||||||
|
|
||||||
Once you've [installed](https://restic.readthedocs.io/en/latest/020_installation.html) restic, start
|
|
||||||
off with creating a repository for your backups:
|
|
||||||
|
|
||||||
$ restic init --repo /tmp/backup
|
|
||||||
enter password for new backend:
|
|
||||||
enter password again:
|
|
||||||
created restic backend 085b3c76b9 at /tmp/backup
|
|
||||||
Please note that knowledge of your password is required to access the repository.
|
|
||||||
Losing your password means that your data is irrecoverably lost.
|
|
||||||
|
|
||||||
and add some data:
|
|
||||||
|
|
||||||
$ restic --repo /tmp/backup backup ~/work
|
|
||||||
enter password for repository:
|
|
||||||
scan [/home/user/work]
|
|
||||||
scanned 764 directories, 1816 files in 0:00
|
|
||||||
[0:29] 100.00% 54.732 MiB/s 1.582 GiB / 1.582 GiB 2580 / 2580 items 0 errors ETA 0:00
|
|
||||||
duration: 0:29, 54.47MiB/s
|
|
||||||
snapshot 40dc1520 saved
|
|
||||||
|
|
||||||
Next you can either use `restic restore` to restore files or use `restic
|
|
||||||
mount` to mount the repository via fuse and browse the files from previous
|
|
||||||
snapshots.
|
|
||||||
|
|
||||||
For more options check out the [online documentation](https://restic.readthedocs.io/en/latest/).
|
|
||||||
|
|
||||||
# Backends
|
|
||||||
|
|
||||||
Saving a backup on the same machine is nice but not a real backup strategy.
|
|
||||||
Therefore, restic supports the following backends for storing backups natively:
|
|
||||||
|
|
||||||
- [Local directory](https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#local)
|
|
||||||
- [sftp server (via SSH)](https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#sftp)
|
|
||||||
- [HTTP REST server](https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#rest-server) ([protocol](https://restic.readthedocs.io/en/latest/100_references.html#rest-backend), [rest-server](https://github.com/restic/rest-server))
|
|
||||||
- [Amazon S3](https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#amazon-s3) (either from Amazon or using the [Minio](https://minio.io) server)
|
|
||||||
- [OpenStack Swift](https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#openstack-swift)
|
|
||||||
- [BackBlaze B2](https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#backblaze-b2)
|
|
||||||
- [Microsoft Azure Blob Storage](https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#microsoft-azure-blob-storage)
|
|
||||||
- [Google Cloud Storage](https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#google-cloud-storage)
|
|
||||||
- And many other services via the [rclone](https://rclone.org) [Backend](https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#other-services-via-rclone)
|
|
||||||
|
|
||||||
# Design Principles
|
|
||||||
|
|
||||||
Restic is a program that does backups right and was designed with the
|
|
||||||
following principles in mind:
|
|
||||||
|
|
||||||
- **Easy**: Doing backups should be a frictionless process, otherwise
|
|
||||||
you might be tempted to skip it. Restic should be easy to configure
|
|
||||||
and use, so that, in the event of a data loss, you can just restore
|
|
||||||
it. Likewise, restoring data should not be complicated.
|
|
||||||
|
|
||||||
- **Fast**: Backing up your data with restic should only be limited by
|
|
||||||
your network or hard disk bandwidth so that you can backup your files
|
|
||||||
every day. Nobody does backups if it takes too much time. Restoring
|
|
||||||
backups should only transfer data that is needed for the files that
|
|
||||||
are to be restored, so that this process is also fast.
|
|
||||||
|
|
||||||
- **Verifiable**: Much more important than backup is restore, so restic
|
|
||||||
enables you to easily verify that all data can be restored.
|
|
||||||
|
|
||||||
- **Secure**: Restic uses cryptography to guarantee confidentiality and
|
|
||||||
integrity of your data. The location the backup data is stored is
|
|
||||||
assumed not to be a trusted environment (e.g. a shared space where
|
|
||||||
others like system administrators are able to access your backups).
|
|
||||||
Restic is built to secure your data against such attackers.
|
|
||||||
|
|
||||||
- **Efficient**: With the growth of data, additional snapshots should
|
|
||||||
only take the storage of the actual increment. Even more, duplicate
|
|
||||||
data should be de-duplicated before it is actually written to the
|
|
||||||
storage back end to save precious backup space.
|
|
||||||
|
|
||||||
# Reproducible Builds
|
|
||||||
|
|
||||||
The binaries released with each restic version starting at 0.6.1 are
|
|
||||||
[reproducible](https://reproducible-builds.org/), which means that you can
|
|
||||||
reproduce a byte identical version from the source code for that
|
|
||||||
release. Instructions on how to do that are contained in the
|
|
||||||
[builder repository](https://github.com/restic/builder).
|
|
||||||
|
|
||||||
## News
|
|
||||||
|
|
||||||
You can follow the restic project on Mastodon [@resticbackup](https://fosstodon.org/@restic) or subscribe to
|
|
||||||
the [project blog](https://restic.net/blog/).
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
Restic is licensed under [BSD 2-Clause License](https://opensource.org/licenses/BSD-2-Clause). You can find the
|
|
||||||
complete text in [`LICENSE`](LICENSE).
|
|
||||||
|
|
||||||
## Sponsorship
|
|
||||||
|
|
||||||
Backend integration tests for Google Cloud Storage and Microsoft Azure Blob
|
|
||||||
Storage are sponsored by [AppsCode](https://appscode.com)!
|
|
||||||
|
|
||||||
[![Sponsored by AppsCode](https://cdn.appscode.com/images/logo/appscode/ac-logo-color.png)](https://appscode.com)
|
|
125
README.rst
Normal file
125
README.rst
Normal file
|
@ -0,0 +1,125 @@
|
||||||
|
|Documentation| |Build Status| |Build status| |Report Card| |Say Thanks| |TestCoverage|
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
------------
|
||||||
|
|
||||||
|
restic is a backup program that is fast, efficient and secure.
|
||||||
|
|
||||||
|
For detailed usage and installation instructions check out the `documentation <https://restic.readthedocs.io/en/latest>`__.
|
||||||
|
|
||||||
|
You can ask questions in our `Discourse forum <https://forum.restic.net>`__.
|
||||||
|
|
||||||
|
Quick start
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Once you've `installed
|
||||||
|
<https://restic.readthedocs.io/en/latest/020_installation.html>`__ restic, start
|
||||||
|
off with creating a repository for your backups:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ restic init --repo /tmp/backup
|
||||||
|
enter password for new backend:
|
||||||
|
enter password again:
|
||||||
|
created restic backend 085b3c76b9 at /tmp/backup
|
||||||
|
Please note that knowledge of your password is required to access the repository.
|
||||||
|
Losing your password means that your data is irrecoverably lost.
|
||||||
|
|
||||||
|
and add some data:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ restic --repo /tmp/backup backup ~/work
|
||||||
|
enter password for repository:
|
||||||
|
scan [/home/user/work]
|
||||||
|
scanned 764 directories, 1816 files in 0:00
|
||||||
|
[0:29] 100.00% 54.732 MiB/s 1.582 GiB / 1.582 GiB 2580 / 2580 items 0 errors ETA 0:00
|
||||||
|
duration: 0:29, 54.47MiB/s
|
||||||
|
snapshot 40dc1520 saved
|
||||||
|
|
||||||
|
Next you can either use ``restic restore`` to restore files or use ``restic
|
||||||
|
mount`` to mount the repository via fuse and browse the files from previous
|
||||||
|
snapshots.
|
||||||
|
|
||||||
|
For more options check out the `online documentation <https://restic.readthedocs.io/en/latest/>`__.
|
||||||
|
|
||||||
|
Backends
|
||||||
|
--------
|
||||||
|
|
||||||
|
Saving a backup on the same machine is nice but not a real backup strategy.
|
||||||
|
Therefore, restic supports the following backends for storing backups natively:
|
||||||
|
|
||||||
|
- `Local directory <https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#local>`__
|
||||||
|
- `sftp server (via SSH) <https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#sftp>`__
|
||||||
|
- `HTTP REST server <https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#rest-server>`__ (`protocol <doc/100_references.rst#rest-backend>`__ `rest-server <https://github.com/restic/rest-server>`__)
|
||||||
|
- `AWS S3 <https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#amazon-s3>`__ (either from Amazon or using the `Minio <https://minio.io>`__ server)
|
||||||
|
- `OpenStack Swift <https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#openstack-swift>`__
|
||||||
|
- `BackBlaze B2 <https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#backblaze-b2>`__
|
||||||
|
- `Microsoft Azure Blob Storage <https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#microsoft-azure-blob-storage>`__
|
||||||
|
- `Google Cloud Storage <https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#google-cloud-storage>`__
|
||||||
|
- And many other services via the `rclone <https://rclone.org>`__ `Backend <https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#other-services-via-rclone>`__
|
||||||
|
|
||||||
|
Design Principles
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
Restic is a program that does backups right and was designed with the
|
||||||
|
following principles in mind:
|
||||||
|
|
||||||
|
- **Easy:** Doing backups should be a frictionless process, otherwise
|
||||||
|
you might be tempted to skip it. Restic should be easy to configure
|
||||||
|
and use, so that, in the event of a data loss, you can just restore
|
||||||
|
it. Likewise, restoring data should not be complicated.
|
||||||
|
|
||||||
|
- **Fast**: Backing up your data with restic should only be limited by
|
||||||
|
your network or hard disk bandwidth so that you can backup your files
|
||||||
|
every day. Nobody does backups if it takes too much time. Restoring
|
||||||
|
backups should only transfer data that is needed for the files that
|
||||||
|
are to be restored, so that this process is also fast.
|
||||||
|
|
||||||
|
- **Verifiable**: Much more important than backup is restore, so restic
|
||||||
|
enables you to easily verify that all data can be restored.
|
||||||
|
|
||||||
|
- **Secure**: Restic uses cryptography to guarantee confidentiality and
|
||||||
|
integrity of your data. The location the backup data is stored is
|
||||||
|
assumed not to be a trusted environment (e.g. a shared space where
|
||||||
|
others like system administrators are able to access your backups).
|
||||||
|
Restic is built to secure your data against such attackers.
|
||||||
|
|
||||||
|
- **Efficient**: With the growth of data, additional snapshots should
|
||||||
|
only take the storage of the actual increment. Even more, duplicate
|
||||||
|
data should be de-duplicated before it is actually written to the
|
||||||
|
storage back end to save precious backup space.
|
||||||
|
|
||||||
|
Reproducible Builds
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
The binaries released with each restic version starting at 0.6.1 are
|
||||||
|
`reproducible <https://reproducible-builds.org/>`__, which means that you can
|
||||||
|
easily reproduce a byte identical version from the source code for that
|
||||||
|
release. Instructions on how to do that are contained in the
|
||||||
|
`builder repository <https://github.com/restic/builder>`__.
|
||||||
|
|
||||||
|
News
|
||||||
|
----
|
||||||
|
|
||||||
|
You can follow the restic project on Twitter `@resticbackup <https://twitter.com/resticbackup>`__ or by subscribing to
|
||||||
|
the `development blog <https://restic.net/blog/>`__.
|
||||||
|
|
||||||
|
License
|
||||||
|
-------
|
||||||
|
|
||||||
|
Restic is licensed under `BSD 2-Clause License <https://opensource.org/licenses/BSD-2-Clause>`__. You can find the
|
||||||
|
complete text in ``LICENSE``.
|
||||||
|
|
||||||
|
.. |Documentation| image:: https://readthedocs.org/projects/restic/badge/?version=latest
|
||||||
|
:target: https://restic.readthedocs.io/en/latest/?badge=latest
|
||||||
|
.. |Build Status| image:: https://travis-ci.com/restic/restic.svg?branch=master
|
||||||
|
:target: https://travis-ci.com/restic/restic
|
||||||
|
.. |Build status| image:: https://ci.appveyor.com/api/projects/status/nuy4lfbgfbytw92q/branch/master?svg=true
|
||||||
|
:target: https://ci.appveyor.com/project/fd0/restic/branch/master
|
||||||
|
.. |Report Card| image:: https://goreportcard.com/badge/github.com/restic/restic
|
||||||
|
:target: https://goreportcard.com/report/github.com/restic/restic
|
||||||
|
.. |Say Thanks| image:: https://img.shields.io/badge/Say%20Thanks-!-1EAEDB.svg
|
||||||
|
:target: https://saythanks.io/to/restic
|
||||||
|
.. |TestCoverage| image:: https://codecov.io/gh/restic/restic/branch/master/graph/badge.svg
|
||||||
|
:target: https://codecov.io/gh/restic/restic
|
2
VERSION
2
VERSION
|
@ -1 +1 @@
|
||||||
0.17.3
|
0.9.1
|
||||||
|
|
29
appveyor.yml
Normal file
29
appveyor.yml
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
clone_folder: c:\restic
|
||||||
|
|
||||||
|
environment:
|
||||||
|
GOPATH: c:\gopath
|
||||||
|
|
||||||
|
branches:
|
||||||
|
only:
|
||||||
|
- master
|
||||||
|
|
||||||
|
init:
|
||||||
|
- ps: >-
|
||||||
|
$app = Get-WmiObject -Class Win32_Product -Filter "Vendor = 'http://golang.org'"
|
||||||
|
|
||||||
|
if ($app) {
|
||||||
|
$app.Uninstall()
|
||||||
|
}
|
||||||
|
|
||||||
|
install:
|
||||||
|
- rmdir c:\go /s /q
|
||||||
|
- appveyor DownloadFile https://dl.google.com/go/go1.10.windows-amd64.msi
|
||||||
|
- msiexec /i go1.10.windows-amd64.msi /q
|
||||||
|
- go version
|
||||||
|
- go env
|
||||||
|
- appveyor DownloadFile http://sourceforge.netcologne.de/project/gnuwin32/tar/1.13-1/tar-1.13-1-bin.zip -FileName tar.zip
|
||||||
|
- 7z x tar.zip bin/tar.exe
|
||||||
|
- set PATH=bin/;%PATH%
|
||||||
|
|
||||||
|
build_script:
|
||||||
|
- go run run_integration_tests.go
|
366
build.go
366
build.go
|
@ -1,17 +1,9 @@
|
||||||
// Description
|
|
||||||
//
|
|
||||||
// This program aims to make building Go programs for end users easier by just
|
|
||||||
// calling it with `go run`, without having to setup a GOPATH.
|
|
||||||
//
|
|
||||||
// This program checks for a minimum Go version. It will use Go modules for
|
|
||||||
// compilation. It builds the package configured as Main in the Config struct.
|
|
||||||
|
|
||||||
// BSD 2-Clause License
|
// BSD 2-Clause License
|
||||||
//
|
//
|
||||||
// Copyright (c) 2016-2018, Alexander Neumann <alexander@bumpern.de>
|
// Copyright (c) 2016-2018, Alexander Neumann <alexander@bumpern.de>
|
||||||
// All rights reserved.
|
// All rights reserved.
|
||||||
//
|
//
|
||||||
// This file has been derived from the repository at:
|
// This file has been copied from the repository at:
|
||||||
// https://github.com/fd0/build-go
|
// https://github.com/fd0/build-go
|
||||||
//
|
//
|
||||||
// Redistribution and use in source and binary forms, with or without
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
@ -35,7 +27,6 @@
|
||||||
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
// 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.
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
//go:build ignore_build_go
|
|
||||||
// +build ignore_build_go
|
// +build ignore_build_go
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
@ -43,8 +34,10 @@ package main
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
|
"path"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
@ -53,32 +46,169 @@ import (
|
||||||
|
|
||||||
// config contains the configuration for the program to build.
|
// config contains the configuration for the program to build.
|
||||||
var config = Config{
|
var config = Config{
|
||||||
Name: "restic", // name of the program executable and directory
|
Name: "restic", // name of the program executable and directory
|
||||||
Namespace: "github.com/restic/restic", // subdir of GOPATH, e.g. "github.com/foo/bar"
|
Namespace: "github.com/restic/restic", // subdir of GOPATH, e.g. "github.com/foo/bar"
|
||||||
Main: "./cmd/restic", // package name for the main package
|
Main: "github.com/restic/restic/cmd/restic", // package name for the main package
|
||||||
DefaultBuildTags: []string{"selfupdate"}, // specify build tags which are always used
|
Tests: []string{ // tests to run
|
||||||
Tests: []string{"./..."}, // tests to run
|
"github.com/restic/restic/internal/...",
|
||||||
MinVersion: GoVersion{Major: 1, Minor: 18, Patch: 0}, // minimum Go version supported
|
"github.com/restic/restic/cmd/...",
|
||||||
|
},
|
||||||
|
MinVersion: GoVersion{Major: 1, Minor: 9, Patch: 0}, // minimum Go version supported
|
||||||
}
|
}
|
||||||
|
|
||||||
// Config configures the build.
|
// Config configures the build.
|
||||||
type Config struct {
|
type Config struct {
|
||||||
Name string
|
Name string
|
||||||
Namespace string
|
Namespace string
|
||||||
Main string
|
Main string
|
||||||
DefaultBuildTags []string
|
Tests []string
|
||||||
Tests []string
|
MinVersion GoVersion
|
||||||
MinVersion GoVersion
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
verbose bool
|
verbose bool
|
||||||
runTests bool
|
keepGopath bool
|
||||||
enableCGO bool
|
runTests bool
|
||||||
enablePIE bool
|
enableCGO bool
|
||||||
goVersion = ParseGoVersion(runtime.Version())
|
enablePIE bool
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// specialDir returns true if the file begins with a special character ('.' or '_').
|
||||||
|
func specialDir(name string) bool {
|
||||||
|
if name == "." {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
base := filepath.Base(name)
|
||||||
|
if base == "vendor" || base[0] == '_' || base[0] == '.' {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// excludePath returns true if the file should not be copied to the new GOPATH.
|
||||||
|
func excludePath(name string) bool {
|
||||||
|
ext := path.Ext(name)
|
||||||
|
if ext == ".go" || ext == ".s" || ext == ".h" {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
parentDir := filepath.Base(filepath.Dir(name))
|
||||||
|
if parentDir == "testdata" {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// updateGopath builds a valid GOPATH at dst, with all Go files in src/ copied
|
||||||
|
// to dst/prefix/, so calling
|
||||||
|
//
|
||||||
|
// updateGopath("/tmp/gopath", "/home/u/restic", "github.com/restic/restic")
|
||||||
|
//
|
||||||
|
// with "/home/u/restic" containing the file "foo.go" yields the following tree
|
||||||
|
// at "/tmp/gopath":
|
||||||
|
//
|
||||||
|
// /tmp/gopath
|
||||||
|
// └── src
|
||||||
|
// └── github.com
|
||||||
|
// └── restic
|
||||||
|
// └── restic
|
||||||
|
// └── foo.go
|
||||||
|
func updateGopath(dst, src, prefix string) error {
|
||||||
|
verbosePrintf("copy contents of %v to %v\n", src, filepath.Join(dst, prefix))
|
||||||
|
return filepath.Walk(src, func(name string, fi os.FileInfo, err error) error {
|
||||||
|
if name == src {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if specialDir(name) {
|
||||||
|
if fi.IsDir() {
|
||||||
|
return filepath.SkipDir
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if fi.IsDir() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if excludePath(name) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
intermediatePath, err := filepath.Rel(src, name)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
fileSrc := filepath.Join(src, intermediatePath)
|
||||||
|
fileDst := filepath.Join(dst, "src", prefix, intermediatePath)
|
||||||
|
|
||||||
|
return copyFile(fileDst, fileSrc)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func directoryExists(dirname string) bool {
|
||||||
|
stat, err := os.Stat(dirname)
|
||||||
|
if err != nil && os.IsNotExist(err) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return stat.IsDir()
|
||||||
|
}
|
||||||
|
|
||||||
|
// copyFile creates dst from src, preserving file attributes and timestamps.
|
||||||
|
func copyFile(dst, src string) error {
|
||||||
|
fi, err := os.Stat(src)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
fsrc, err := os.Open(src)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err = os.MkdirAll(filepath.Dir(dst), 0755); err != nil {
|
||||||
|
fmt.Printf("MkdirAll(%v)\n", filepath.Dir(dst))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
fdst, err := os.Create(dst)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err = io.Copy(fdst, fsrc); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err == nil {
|
||||||
|
err = fsrc.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
if err == nil {
|
||||||
|
err = fdst.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
if err == nil {
|
||||||
|
err = os.Chmod(dst, fi.Mode())
|
||||||
|
}
|
||||||
|
|
||||||
|
if err == nil {
|
||||||
|
err = os.Chtimes(dst, fi.ModTime(), fi.ModTime())
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// die prints the message with fmt.Fprintf() to stderr and exits with an error
|
// die prints the message with fmt.Fprintf() to stderr and exits with an error
|
||||||
// code.
|
// code.
|
||||||
func die(message string, args ...interface{}) {
|
func die(message string, args ...interface{}) {
|
||||||
|
@ -92,6 +222,7 @@ func showUsage(output io.Writer) {
|
||||||
fmt.Fprintf(output, "OPTIONS:\n")
|
fmt.Fprintf(output, "OPTIONS:\n")
|
||||||
fmt.Fprintf(output, " -v --verbose output more messages\n")
|
fmt.Fprintf(output, " -v --verbose output more messages\n")
|
||||||
fmt.Fprintf(output, " -t --tags specify additional build tags\n")
|
fmt.Fprintf(output, " -t --tags specify additional build tags\n")
|
||||||
|
fmt.Fprintf(output, " -k --keep-gopath do not remove the GOPATH after build\n")
|
||||||
fmt.Fprintf(output, " -T --test run tests\n")
|
fmt.Fprintf(output, " -T --test run tests\n")
|
||||||
fmt.Fprintf(output, " -o --output set output file name\n")
|
fmt.Fprintf(output, " -o --output set output file name\n")
|
||||||
fmt.Fprintf(output, " --enable-cgo use CGO to link against libc\n")
|
fmt.Fprintf(output, " --enable-cgo use CGO to link against libc\n")
|
||||||
|
@ -99,6 +230,7 @@ func showUsage(output io.Writer) {
|
||||||
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")
|
fmt.Fprintf(output, " --goarm value set GOARM for cross-compilation\n")
|
||||||
|
fmt.Fprintf(output, " --tempdir dir use a specific directory for compilation\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
func verbosePrintf(message string, args ...interface{}) {
|
func verbosePrintf(message string, args ...interface{}) {
|
||||||
|
@ -109,68 +241,64 @@ func verbosePrintf(message string, args ...interface{}) {
|
||||||
fmt.Printf("build: "+message, args...)
|
fmt.Printf("build: "+message, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// printEnv prints Go-relevant environment variables in a nice way using verbosePrintf.
|
// cleanEnv returns a clean environment with GOPATH and GOBIN removed (if
|
||||||
func printEnv(env []string) {
|
// present).
|
||||||
verbosePrintf("environment (GO*):\n")
|
func cleanEnv() (env []string) {
|
||||||
for _, v := range env {
|
for _, v := range os.Environ() {
|
||||||
// ignore environment variables which do not start with GO*.
|
if strings.HasPrefix(v, "GOPATH=") || strings.HasPrefix(v, "GOBIN=") {
|
||||||
if !strings.HasPrefix(v, "GO") {
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
verbosePrintf(" %s\n", v)
|
|
||||||
|
env = append(env, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return env
|
||||||
}
|
}
|
||||||
|
|
||||||
// build runs "go build args..." with GOPATH set to gopath.
|
// build runs "go build args..." with GOPATH set to gopath.
|
||||||
func build(cwd string, env map[string]string, args ...string) error {
|
func build(cwd string, ver GoVersion, goos, goarch, goarm, gopath string, args ...string) error {
|
||||||
// -trimpath removes all absolute paths from the binary.
|
a := []string{"build"}
|
||||||
a := []string{"build", "-trimpath"}
|
|
||||||
|
|
||||||
|
if ver.AtLeast(GoVersion{1, 10, 0}) {
|
||||||
|
verbosePrintf("Go version is at least 1.10, using new syntax for -gcflags\n")
|
||||||
|
// use new prefix
|
||||||
|
a = append(a, "-asmflags", fmt.Sprintf("all=-trimpath=%s", gopath))
|
||||||
|
a = append(a, "-gcflags", fmt.Sprintf("all=-trimpath=%s", gopath))
|
||||||
|
} else {
|
||||||
|
a = append(a, "-asmflags", fmt.Sprintf("-trimpath=%s", gopath))
|
||||||
|
a = append(a, "-gcflags", fmt.Sprintf("-trimpath=%s", gopath))
|
||||||
|
}
|
||||||
if enablePIE {
|
if enablePIE {
|
||||||
a = append(a, "-buildmode=pie")
|
a = append(a, "-buildmode=pie")
|
||||||
}
|
}
|
||||||
|
|
||||||
a = append(a, args...)
|
a = append(a, args...)
|
||||||
cmd := exec.Command("go", a...)
|
cmd := exec.Command("go", a...)
|
||||||
cmd.Env = os.Environ()
|
cmd.Env = append(cleanEnv(), "GOPATH="+gopath, "GOARCH="+goarch, "GOOS="+goos)
|
||||||
for k, v := range env {
|
if goarm != "" {
|
||||||
cmd.Env = append(cmd.Env, k+"="+v)
|
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")
|
||||||
}
|
}
|
||||||
|
|
||||||
printEnv(cmd.Env)
|
|
||||||
|
|
||||||
cmd.Dir = cwd
|
cmd.Dir = cwd
|
||||||
cmd.Stdout = os.Stdout
|
cmd.Stdout = os.Stdout
|
||||||
cmd.Stderr = os.Stderr
|
cmd.Stderr = os.Stderr
|
||||||
|
verbosePrintf("go %s\n", a)
|
||||||
verbosePrintf("chdir %q\n", cwd)
|
|
||||||
verbosePrintf("go %q\n", a)
|
|
||||||
|
|
||||||
return cmd.Run()
|
return cmd.Run()
|
||||||
}
|
}
|
||||||
|
|
||||||
// test runs "go test args..." with GOPATH set to gopath.
|
// test runs "go test args..." with GOPATH set to gopath.
|
||||||
func test(cwd string, env map[string]string, args ...string) error {
|
func test(cwd, gopath string, args ...string) error {
|
||||||
args = append([]string{"test", "-count", "1"}, args...)
|
args = append([]string{"test"}, args...)
|
||||||
cmd := exec.Command("go", args...)
|
cmd := exec.Command("go", args...)
|
||||||
cmd.Env = os.Environ()
|
cmd.Env = append(cleanEnv(), "GOPATH="+gopath)
|
||||||
for k, v := range env {
|
|
||||||
cmd.Env = append(cmd.Env, k+"="+v)
|
|
||||||
}
|
|
||||||
if !enableCGO {
|
|
||||||
cmd.Env = append(cmd.Env, "CGO_ENABLED=0")
|
|
||||||
}
|
|
||||||
cmd.Dir = cwd
|
cmd.Dir = cwd
|
||||||
cmd.Stdout = os.Stdout
|
cmd.Stdout = os.Stdout
|
||||||
cmd.Stderr = os.Stderr
|
cmd.Stderr = os.Stderr
|
||||||
|
verbosePrintf("go %s\n", args)
|
||||||
printEnv(cmd.Env)
|
|
||||||
|
|
||||||
verbosePrintf("chdir %q\n", cwd)
|
|
||||||
verbosePrintf("go %q\n", args)
|
|
||||||
|
|
||||||
return cmd.Run()
|
return cmd.Run()
|
||||||
}
|
}
|
||||||
|
@ -178,7 +306,7 @@ func test(cwd string, env map[string]string, args ...string) error {
|
||||||
// getVersion returns the version string from the file VERSION in the current
|
// getVersion returns the version string from the file VERSION in the current
|
||||||
// directory.
|
// directory.
|
||||||
func getVersionFromFile() string {
|
func getVersionFromFile() string {
|
||||||
buf, err := os.ReadFile("VERSION")
|
buf, err := ioutil.ReadFile("VERSION")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
verbosePrintf("error reading file VERSION: %v\n", err)
|
verbosePrintf("error reading file VERSION: %v\n", err)
|
||||||
return ""
|
return ""
|
||||||
|
@ -318,22 +446,22 @@ func (v GoVersion) String() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
if !goVersion.AtLeast(config.MinVersion) {
|
ver := ParseGoVersion(runtime.Version())
|
||||||
fmt.Fprintf(os.Stderr, "Detected version %s is too old, restic requires at least %s\n", goVersion, config.MinVersion)
|
if !ver.AtLeast(config.MinVersion) {
|
||||||
|
fmt.Fprintf(os.Stderr, "%s detected, this program requires at least %s\n", ver, config.MinVersion)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
buildTags := config.DefaultBuildTags
|
buildTags := []string{}
|
||||||
|
|
||||||
skipNext := false
|
skipNext := false
|
||||||
params := os.Args[1:]
|
params := os.Args[1:]
|
||||||
|
|
||||||
env := map[string]string{
|
targetGOOS := runtime.GOOS
|
||||||
"GO111MODULE": "on", // make sure we build in Module mode
|
targetGOARCH := runtime.GOARCH
|
||||||
"GOOS": runtime.GOOS,
|
targetGOARM := ""
|
||||||
"GOARCH": runtime.GOARCH,
|
|
||||||
"GOARM": "",
|
gopath := ""
|
||||||
}
|
|
||||||
|
|
||||||
var outputFilename string
|
var outputFilename string
|
||||||
|
|
||||||
|
@ -346,15 +474,20 @@ func main() {
|
||||||
switch arg {
|
switch arg {
|
||||||
case "-v", "--verbose":
|
case "-v", "--verbose":
|
||||||
verbose = true
|
verbose = true
|
||||||
|
case "-k", "--keep-gopath":
|
||||||
|
keepGopath = true
|
||||||
case "-t", "-tags", "--tags":
|
case "-t", "-tags", "--tags":
|
||||||
if i+1 >= len(params) {
|
if i+1 >= len(params) {
|
||||||
die("-t given but no tag specified")
|
die("-t given but no tag specified")
|
||||||
}
|
}
|
||||||
skipNext = true
|
skipNext = true
|
||||||
buildTags = append(buildTags, strings.Split(params[i+1], " ")...)
|
buildTags = strings.Split(params[i+1], " ")
|
||||||
case "-o", "--output":
|
case "-o", "--output":
|
||||||
skipNext = true
|
skipNext = true
|
||||||
outputFilename = params[i+1]
|
outputFilename = params[i+1]
|
||||||
|
case "--tempdir":
|
||||||
|
skipNext = true
|
||||||
|
gopath = params[i+1]
|
||||||
case "-T", "--test":
|
case "-T", "--test":
|
||||||
runTests = true
|
runTests = true
|
||||||
case "--enable-cgo":
|
case "--enable-cgo":
|
||||||
|
@ -363,13 +496,13 @@ func main() {
|
||||||
enablePIE = true
|
enablePIE = true
|
||||||
case "--goos":
|
case "--goos":
|
||||||
skipNext = true
|
skipNext = true
|
||||||
env["GOOS"] = params[i+1]
|
targetGOOS = params[i+1]
|
||||||
case "--goarch":
|
case "--goarch":
|
||||||
skipNext = true
|
skipNext = true
|
||||||
env["GOARCH"] = params[i+1]
|
targetGOARCH = params[i+1]
|
||||||
case "--goarm":
|
case "--goarm":
|
||||||
skipNext = true
|
skipNext = true
|
||||||
env["GOARM"] = params[i+1]
|
targetGOARM = params[i+1]
|
||||||
case "-h":
|
case "-h":
|
||||||
showUsage(os.Stdout)
|
showUsage(os.Stdout)
|
||||||
return
|
return
|
||||||
|
@ -380,20 +513,15 @@ func main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
solarisMinVersion := GoVersion{Major: 1, Minor: 20, Patch: 0}
|
verbosePrintf("detected Go version %v\n", ver)
|
||||||
if env["GOARCH"] == "solaris" && !goVersion.AtLeast(solarisMinVersion) {
|
|
||||||
fmt.Fprintf(os.Stderr, "Detected version %s is too old, restic requires at least %s for Solaris\n", goVersion, solarisMinVersion)
|
if len(buildTags) == 0 {
|
||||||
os.Exit(1)
|
verbosePrintf("adding build-tag release\n")
|
||||||
|
buildTags = []string{"release"}
|
||||||
}
|
}
|
||||||
|
|
||||||
verbosePrintf("detected Go version %v\n", goVersion)
|
|
||||||
|
|
||||||
preserveSymbols := false
|
|
||||||
for i := range buildTags {
|
for i := range buildTags {
|
||||||
buildTags[i] = strings.TrimSpace(buildTags[i])
|
buildTags[i] = strings.TrimSpace(buildTags[i])
|
||||||
if buildTags[i] == "debug" || buildTags[i] == "profile" {
|
|
||||||
preserveSymbols = true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
verbosePrintf("build tags: %s\n", buildTags)
|
verbosePrintf("build tags: %s\n", buildTags)
|
||||||
|
@ -403,16 +531,50 @@ func main() {
|
||||||
die("Getwd(): %v\n", err)
|
die("Getwd(): %v\n", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if gopath == "" {
|
||||||
|
gopath, err = ioutil.TempDir("", fmt.Sprintf("%v-build-", config.Name))
|
||||||
|
if err != nil {
|
||||||
|
die("TempDir(): %v\n", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
verbosePrintf("create GOPATH at %v\n", gopath)
|
||||||
|
if err = updateGopath(gopath, root, config.Namespace); err != nil {
|
||||||
|
die("copying files from %v/src to %v/src failed: %v\n", root, gopath, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
vendor := filepath.Join(root, "vendor")
|
||||||
|
if directoryExists(vendor) {
|
||||||
|
if err = updateGopath(gopath, vendor, filepath.Join(config.Namespace, "vendor")); err != nil {
|
||||||
|
die("copying files from %v to %v failed: %v\n", root, gopath, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
if !keepGopath {
|
||||||
|
verbosePrintf("remove %v\n", gopath)
|
||||||
|
if err = os.RemoveAll(gopath); err != nil {
|
||||||
|
die("remove GOPATH at %s failed: %v\n", err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
verbosePrintf("leaving temporary GOPATH at %v\n", gopath)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
if outputFilename == "" {
|
if outputFilename == "" {
|
||||||
outputFilename = config.Name
|
outputFilename = config.Name
|
||||||
if env["GOOS"] == "windows" {
|
if targetGOOS == "windows" {
|
||||||
outputFilename += ".exe"
|
outputFilename += ".exe"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cwd, err := os.Getwd()
|
||||||
|
if err != nil {
|
||||||
|
die("Getwd() returned %v\n", err)
|
||||||
|
}
|
||||||
output := outputFilename
|
output := outputFilename
|
||||||
if !filepath.IsAbs(output) {
|
if !filepath.IsAbs(output) {
|
||||||
output = filepath.Join(root, output)
|
output = filepath.Join(cwd, output)
|
||||||
}
|
}
|
||||||
|
|
||||||
version := getVersion()
|
version := getVersion()
|
||||||
|
@ -420,36 +582,16 @@ func main() {
|
||||||
if version != "" {
|
if version != "" {
|
||||||
constants["main.version"] = version
|
constants["main.version"] = version
|
||||||
}
|
}
|
||||||
ldflags := constants.LDFlags()
|
ldflags := "-s -w " + constants.LDFlags()
|
||||||
if !preserveSymbols {
|
|
||||||
// Strip debug symbols.
|
|
||||||
ldflags = "-s -w " + ldflags
|
|
||||||
}
|
|
||||||
verbosePrintf("ldflags: %s\n", ldflags)
|
verbosePrintf("ldflags: %s\n", ldflags)
|
||||||
|
|
||||||
var (
|
args := []string{
|
||||||
buildArgs []string
|
|
||||||
testArgs []string
|
|
||||||
)
|
|
||||||
|
|
||||||
mainPackage := config.Main
|
|
||||||
if strings.HasPrefix(mainPackage, config.Namespace) {
|
|
||||||
mainPackage = strings.Replace(mainPackage, config.Namespace, "./", 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
buildTarget := filepath.FromSlash(mainPackage)
|
|
||||||
buildCWD, err := os.Getwd()
|
|
||||||
if err != nil {
|
|
||||||
die("unable to determine current working directory: %v\n", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
buildArgs = append(buildArgs,
|
|
||||||
"-tags", strings.Join(buildTags, " "),
|
"-tags", strings.Join(buildTags, " "),
|
||||||
"-ldflags", ldflags,
|
"-ldflags", ldflags,
|
||||||
"-o", output, buildTarget,
|
"-o", output, config.Main,
|
||||||
)
|
}
|
||||||
|
|
||||||
err = build(buildCWD, env, buildArgs...)
|
err = build(filepath.Join(gopath, "src"), ver, targetGOOS, targetGOARCH, targetGOARM, gopath, args...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
die("build failed: %v\n", err)
|
die("build failed: %v\n", err)
|
||||||
}
|
}
|
||||||
|
@ -457,9 +599,7 @@ func main() {
|
||||||
if runTests {
|
if runTests {
|
||||||
verbosePrintf("running tests\n")
|
verbosePrintf("running tests\n")
|
||||||
|
|
||||||
testArgs = append(testArgs, config.Tests...)
|
err = test(cwd, gopath, config.Tests...)
|
||||||
|
|
||||||
err = test(buildCWD, env, testArgs...)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
die("running tests failed: %v\n", err)
|
die("running tests failed: %v\n", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
Enhancement: Support specifying multiple host flags for various commands
|
|
||||||
|
|
||||||
Previously commands didn't take more than one `--host` or `-H` argument into account, which could be limiting with e.g.
|
|
||||||
the `forget` command.
|
|
||||||
|
|
||||||
The `dump`, `find`, `forget`, `ls`, `mount`, `restore`, `snapshots`, `stats` and `tag` commands will now take into account
|
|
||||||
multiple `--host` and `-H` flags.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/1570
|
|
|
@ -1,8 +0,0 @@
|
||||||
Enhancement: Optimize `restic mount`
|
|
||||||
|
|
||||||
We've optimized the FUSE implementation used within restic.
|
|
||||||
`restic mount` is now more responsive and uses less memory.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/1680
|
|
||||||
https://github.com/restic/restic/pull/2587
|
|
||||||
https://github.com/restic/restic/pull/2787
|
|
|
@ -1,6 +0,0 @@
|
||||||
Bugfix: Report correct number of directories processed by backup
|
|
||||||
|
|
||||||
The directory statistics calculation was fixed to report the actual number
|
|
||||||
of processed directories instead of always zero.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/1863
|
|
|
@ -1,5 +0,0 @@
|
||||||
Enhancement: Display snapshot date when using `restic find`
|
|
||||||
|
|
||||||
Added the respective snapshot date to the output of `restic find`.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2072
|
|
|
@ -1,9 +0,0 @@
|
||||||
Enhancement: Allow specifying user and host when creating keys
|
|
||||||
|
|
||||||
When adding a new key to the repository, the username and hostname for the new
|
|
||||||
key can be specified on the command line. This allows overriding the defaults,
|
|
||||||
for example if you would prefer to use the FQDN to identify the host or if you
|
|
||||||
want to add keys for several different hosts without having to run the key add
|
|
||||||
command on those hosts.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2175
|
|
|
@ -1,9 +0,0 @@
|
||||||
Bugfix: Fix tar issues when dumping `/`
|
|
||||||
|
|
||||||
We've fixed an issue with dumping either `/` or files on the first sublevel
|
|
||||||
e.g. `/foo` to tar. This also fixes tar dumping issues on Windows where this
|
|
||||||
issue could also happen.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2254
|
|
||||||
https://github.com/restic/restic/issues/2357
|
|
||||||
https://github.com/restic/restic/pull/2255
|
|
|
@ -1,5 +0,0 @@
|
||||||
Enhancement: Add support for ppc64le
|
|
||||||
|
|
||||||
Adds support for ppc64le, the processor architecture from IBM.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2277
|
|
|
@ -1,7 +0,0 @@
|
||||||
Bugfix: Handle format verbs like '%' properly in `find` output
|
|
||||||
|
|
||||||
The JSON or "normal" output of the `find` command can now deal with file names
|
|
||||||
that contain substrings which the Golang `fmt` package considers "format verbs"
|
|
||||||
like `%s`.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2281
|
|
|
@ -1,8 +0,0 @@
|
||||||
Bugfix: Do not hang when run as a background job
|
|
||||||
|
|
||||||
Restic did hang on exit while restoring the terminal configuration when it was
|
|
||||||
started as a background job, for example using `restic ... &`. This has been
|
|
||||||
fixed by only restoring the terminal configuration when restic is interrupted
|
|
||||||
while reading a password from the terminal.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2298
|
|
|
@ -1,8 +0,0 @@
|
||||||
Bugfix: Fix mangled json output of backup command
|
|
||||||
|
|
||||||
We've fixed a race condition in the json output of the backup command
|
|
||||||
that could cause multiple lines to get mixed up. We've also ensured that
|
|
||||||
the backup summary is printed last.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2389
|
|
||||||
https://github.com/restic/restic/pull/2545
|
|
|
@ -1,5 +0,0 @@
|
||||||
Bugfix: Refresh lock timestamp
|
|
||||||
|
|
||||||
Long-running operations did not refresh lock timestamp, resulting in locks becoming stale. This is now fixed.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2390
|
|
|
@ -1,12 +0,0 @@
|
||||||
Enhancement: Ignore sync errors when operation not supported by local filesystem
|
|
||||||
|
|
||||||
The local backend has been modified to work with filesystems which doesn't support
|
|
||||||
the `sync` operation. This operation is normally used by restic to ensure that data
|
|
||||||
files are fully written to disk before continuing.
|
|
||||||
|
|
||||||
For these limited filesystems, saving a file in the backend would previously fail with
|
|
||||||
an "operation not supported" error. This error is now ignored, which means that e.g.
|
|
||||||
an SMB mount on macOS can now be used as storage location for a repository.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2395
|
|
||||||
https://forum.restic.net/t/sync-errors-on-mac-over-smb/1859
|
|
|
@ -1,7 +0,0 @@
|
||||||
Enhancement: Add flag `--iexclude-file` to backup command
|
|
||||||
|
|
||||||
The backup command now supports the flag `--iexclude-file` which is a
|
|
||||||
case-insensitive version of `--exclude-file`.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2427
|
|
||||||
https://github.com/restic/restic/pull/2898
|
|
|
@ -1,6 +0,0 @@
|
||||||
Bugfix: backup --json reports total_bytes_processed as 0
|
|
||||||
|
|
||||||
We've fixed the json output of total_bytes_processed. The non-json output
|
|
||||||
was already fixed with pull request #2138 but left the json output untouched.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2429
|
|
|
@ -1,5 +0,0 @@
|
||||||
Bugfix: Fix incorrect bytes stats in `diff` command
|
|
||||||
|
|
||||||
In some cases, the wrong number of bytes (e.g. 16777215.998 TiB) were reported by the `diff` command. This is now fixed.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2469
|
|
|
@ -1,9 +0,0 @@
|
||||||
Change: Remove vendored dependencies
|
|
||||||
|
|
||||||
We've removed the vendored dependencies (in the subdir `vendor/`). When
|
|
||||||
building restic, the Go compiler automatically fetches the dependencies. It
|
|
||||||
will also cryptographically verify that the correct code has been fetched by
|
|
||||||
using the hashes in `go.sum` (see the link to the documentation below).
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2482
|
|
||||||
https://golang.org/cmd/go/#hdr-Module_downloading_and_verification
|
|
|
@ -1,16 +0,0 @@
|
||||||
Bugfix: Do not crash with Synology NAS sftp server
|
|
||||||
|
|
||||||
It was found that when restic is used to store data on an sftp server on a
|
|
||||||
Synology NAS with a relative path (one which does not start with a slash), it
|
|
||||||
may go into an endless loop trying to create directories on the server. We've
|
|
||||||
fixed this bug by using a function in the sftp library instead of our own
|
|
||||||
implementation.
|
|
||||||
|
|
||||||
The bug was discovered because the Synology sftp server behaves erratic with
|
|
||||||
non-absolute path (e.g. `home/restic-repo`). This can be resolved by just using
|
|
||||||
an absolute path instead (`/home/restic-repo`). We've also added a paragraph in
|
|
||||||
the FAQ.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2518
|
|
||||||
https://github.com/restic/restic/issues/2363
|
|
||||||
https://github.com/restic/restic/pull/2530
|
|
|
@ -1,5 +0,0 @@
|
||||||
Bugfix: Fix incorrect size calculation in `stats --mode restore-size`
|
|
||||||
|
|
||||||
The restore-size mode of stats was counting hard-linked files as if they were independent.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2531
|
|
|
@ -1,5 +0,0 @@
|
||||||
Bugfix: Fix incorrect file counts in `stats --mode restore-size`
|
|
||||||
|
|
||||||
The restore-size mode of stats was failing to count empty directories and some files with hard links.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2537
|
|
|
@ -1,8 +0,0 @@
|
||||||
Enhancement: Support excluding files by their size
|
|
||||||
|
|
||||||
The `backup` command now supports the `--exclude-larger-than` option to exclude files which are
|
|
||||||
larger than the specified maximum size. This can for example be useful to exclude unimportant
|
|
||||||
files with a large file size.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2569
|
|
||||||
https://github.com/restic/restic/pull/2914
|
|
|
@ -1,16 +0,0 @@
|
||||||
Enhancement: Self-heal missing file parts during backup of unchanged files
|
|
||||||
|
|
||||||
We've improved the resilience of restic to certain types of repository corruption.
|
|
||||||
|
|
||||||
For files that are unchanged since the parent snapshot, the backup command now
|
|
||||||
verifies that all parts of the files still exist in the repository. Parts that are
|
|
||||||
missing, e.g. from a damaged repository, are backed up again. This verification
|
|
||||||
was already run for files that were modified since the parent snapshot, but is
|
|
||||||
now also done for unchanged files.
|
|
||||||
|
|
||||||
Note that restic will not backup file parts that are referenced in the index but
|
|
||||||
where the actual data is not present on disk, as this situation can only be
|
|
||||||
detected by restic check. Please ensure that you run `restic check` regularly.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2571
|
|
||||||
https://github.com/restic/restic/pull/2827
|
|
|
@ -1,9 +0,0 @@
|
||||||
Enhancement: Support filtering snapshots by tag and path in the stats command
|
|
||||||
|
|
||||||
We've added filtering snapshots by `--tag tagList` and by `--path path` to
|
|
||||||
the `stats` command. This includes filtering of only 'latest' snapshots or
|
|
||||||
all snapshots in a repository.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2858
|
|
||||||
https://github.com/restic/restic/pull/2859
|
|
||||||
https://forum.restic.net/t/stats-for-a-host-and-filtered-snapshots/3020
|
|
|
@ -1,20 +0,0 @@
|
||||||
Enhancement: Add command for copying snapshots between repositories
|
|
||||||
|
|
||||||
We've added a copy command, allowing you to copy snapshots from one
|
|
||||||
repository to another.
|
|
||||||
|
|
||||||
Note that this process will have to read (download) and write (upload) the
|
|
||||||
entire snapshot(s) due to the different encryption keys used on the source
|
|
||||||
and destination repository. Also, the transferred files are not re-chunked,
|
|
||||||
which may break deduplication between files already stored in the
|
|
||||||
destination repo and files copied there using this command.
|
|
||||||
|
|
||||||
To fully support deduplication between repositories when the copy command is
|
|
||||||
used, the init command now supports the `--copy-chunker-params` option,
|
|
||||||
which initializes the new repository with identical parameters for splitting
|
|
||||||
files into chunks as an already existing repository. This allows copied
|
|
||||||
snapshots to be equally deduplicated in both repositories.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/323
|
|
||||||
https://github.com/restic/restic/pull/2606
|
|
||||||
https://github.com/restic/restic/pull/2928
|
|
|
@ -1,10 +0,0 @@
|
||||||
Enhancement: Use optimized library for hash calculation of file chunks
|
|
||||||
|
|
||||||
We've switched the library used to calculate the hashes of file chunks, which
|
|
||||||
are used for deduplication, to the optimized Minio SHA-256 implementation.
|
|
||||||
|
|
||||||
Depending on the CPU it improves the hashing throughput by 10-30%. Modern x86
|
|
||||||
CPUs with the SHA Extension should be about two to three times faster.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/551
|
|
||||||
https://github.com/restic/restic/pull/2709
|
|
|
@ -1,23 +0,0 @@
|
||||||
Enhancement: Simplify and improve restore performance
|
|
||||||
|
|
||||||
Significantly improves restore performance of large files (i.e. 50M+):
|
|
||||||
https://github.com/restic/restic/issues/2074
|
|
||||||
https://forum.restic.net/t/restore-using-rclone-gdrive-backend-is-slow/1112/8
|
|
||||||
https://forum.restic.net/t/degraded-restore-performance-s3-backend/1400
|
|
||||||
|
|
||||||
Fixes "not enough cache capacity" error during restore:
|
|
||||||
https://github.com/restic/restic/issues/2244
|
|
||||||
|
|
||||||
NOTE: This new implementation does not guarantee order in which blobs
|
|
||||||
are written to the target files and, for example, the last blob of a
|
|
||||||
file can be written to the file before any of the preceding file blobs.
|
|
||||||
It is therefore possible to have gaps in the data written to the target
|
|
||||||
files if restore fails or interrupted by the user.
|
|
||||||
|
|
||||||
The implementation will try to preallocate space for the restored files
|
|
||||||
on the filesystem to prevent file fragmentation. This ensures good read
|
|
||||||
performance for large files, like for example VM images. If preallocating
|
|
||||||
space is not supported by the filesystem, then this step is silently skipped.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/2195
|
|
||||||
https://github.com/restic/restic/pull/2893
|
|
|
@ -1,8 +0,0 @@
|
||||||
Enhancement: Improve speed of check command
|
|
||||||
|
|
||||||
We've improved the check command to traverse trees only once independent of
|
|
||||||
whether they are contained in multiple snapshots. The check command is now much
|
|
||||||
faster for repositories with a large number of snapshots.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/2328
|
|
||||||
https://github.com/restic/restic/issues/2284
|
|
|
@ -1,5 +0,0 @@
|
||||||
Enhancement: support user@domain parsing as user
|
|
||||||
|
|
||||||
Added the ability for user@domain-like users to be authenticated over SFTP servers.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/2423
|
|
|
@ -1,19 +0,0 @@
|
||||||
Change: Return exit code 3 when failing to backup all source data
|
|
||||||
|
|
||||||
The backup command used to return a zero exit code as long as a snapshot
|
|
||||||
could be created successfully, even if some of the source files could not
|
|
||||||
be read (in which case the snapshot would contain the rest of the files).
|
|
||||||
|
|
||||||
This made it hard for automation/scripts to detect failures/incomplete
|
|
||||||
backups by looking at the exit code. Restic now returns the following exit
|
|
||||||
codes for the backup command:
|
|
||||||
|
|
||||||
- 0 when the command was successful
|
|
||||||
- 1 when there was a fatal error (no snapshot created)
|
|
||||||
- 3 when some source data could not be read (incomplete snapshot created)
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/2546
|
|
||||||
https://github.com/restic/restic/issues/956
|
|
||||||
https://github.com/restic/restic/issues/2064
|
|
||||||
https://github.com/restic/restic/issues/2526
|
|
||||||
https://github.com/restic/restic/issues/2364
|
|
|
@ -1,9 +0,0 @@
|
||||||
Enhancement: Improve the chunking algorithm
|
|
||||||
|
|
||||||
We've updated the chunker library responsible for splitting files into smaller
|
|
||||||
blocks. It should improve the chunking throughput by 5-15% depending on the
|
|
||||||
CPU.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/2576
|
|
||||||
https://github.com/restic/restic/pull/2845
|
|
||||||
https://github.com/restic/restic/issues/2820
|
|
|
@ -1,6 +0,0 @@
|
||||||
Bugfix: SFTP backend supports IPv6 addresses
|
|
||||||
|
|
||||||
The SFTP backend now supports IPv6 addresses natively, without relying on
|
|
||||||
aliases in the external SSH configuration.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/2592
|
|
|
@ -1,6 +0,0 @@
|
||||||
Enhancement: Improve speed of diff command
|
|
||||||
|
|
||||||
We've improved the performance of the diff command when comparing snapshots
|
|
||||||
with similar content. It should run up to twice as fast as before.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/2598
|
|
|
@ -1,6 +0,0 @@
|
||||||
Enhancement: Slightly reduce memory usage of prune and stats commands
|
|
||||||
|
|
||||||
The prune and the stats command kept directory identifiers in memory twice
|
|
||||||
while searching for used blobs.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/2599
|
|
|
@ -1,14 +0,0 @@
|
||||||
Change: Update dependencies, require Go >= 1.13
|
|
||||||
|
|
||||||
Restic now requires Go to be at least 1.13. This allows simplifications in the
|
|
||||||
build process and removing workarounds.
|
|
||||||
|
|
||||||
This is also probably the last version of restic still supporting mounting
|
|
||||||
repositories via fuse on macOS. The library we're using for fuse does not
|
|
||||||
support macOS any more and osxfuse is not open source any more.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/2600
|
|
||||||
https://github.com/restic/restic/pull/2852
|
|
||||||
https://github.com/restic/restic/pull/2927
|
|
||||||
https://github.com/bazil/fuse/issues/224
|
|
||||||
https://github.com/osxfuse/osxfuse/issues/590
|
|
|
@ -1,7 +0,0 @@
|
||||||
Bugfix: Honor RESTIC_CACHE_DIR environment variable on Mac and Windows
|
|
||||||
|
|
||||||
On Mac and Windows, the RESTIC_CACHE_DIR environment variable was ignored.
|
|
||||||
This variable can now be used on all platforms to set the directory where
|
|
||||||
restic stores caches.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/2607
|
|
|
@ -1,6 +0,0 @@
|
||||||
Bugfix: Don't abort the stats command when data blobs are missing
|
|
||||||
|
|
||||||
Running the stats command in the blobs-per-file mode on a repository with
|
|
||||||
missing data blobs previously resulted in a crash.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/2668
|
|
|
@ -1,8 +0,0 @@
|
||||||
Bugfix: Add stricter prune error checks
|
|
||||||
|
|
||||||
Additional checks were added to the prune command in order to improve
|
|
||||||
resiliency to backend, hardware and/or networking issues. The checks now
|
|
||||||
detect a few more cases where such outside factors could potentially cause
|
|
||||||
data loss.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/2674
|
|
|
@ -1,6 +0,0 @@
|
||||||
Enhancement: S3 backend: Add support for WebIdentityTokenFile
|
|
||||||
|
|
||||||
We've added support for EKS IAM roles for service accounts feature to the S3 backend.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/2733
|
|
||||||
https://github.com/restic/restic/issues/2703
|
|
|
@ -1,6 +0,0 @@
|
||||||
Enhancement: Optimize handling of new index entries
|
|
||||||
|
|
||||||
Restic now uses less memory for backups which add a lot of data, e.g. large initial backups.
|
|
||||||
In addition, we've improved the stability in some edge cases.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/2773
|
|
|
@ -1,8 +0,0 @@
|
||||||
Enhancement: Reduce memory consumption of in-memory index
|
|
||||||
|
|
||||||
We've improved how the index is stored in memory.
|
|
||||||
This change can reduce memory usage for large repositories by up to 50%
|
|
||||||
(depending on the operation).
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/2781
|
|
||||||
https://github.com/restic/restic/pull/2812
|
|
|
@ -1,6 +0,0 @@
|
||||||
Enhancement: Optimize `list blobs` command
|
|
||||||
|
|
||||||
We've changed the implementation of `list blobs` which should be now a bit faster
|
|
||||||
and consume almost no memory even for large repositories.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/2786
|
|
|
@ -1,6 +0,0 @@
|
||||||
Enhancement: Optimized file access in restic mount
|
|
||||||
|
|
||||||
Reading large (> 100GiB) files from restic mountpoints is now faster,
|
|
||||||
and the speedup is greater for larger files.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/2790
|
|
|
@ -1,8 +0,0 @@
|
||||||
Change: Honor the --no-lock flag in the mount command
|
|
||||||
|
|
||||||
The mount command now does not lock the repository if given the
|
|
||||||
--no-lock flag. This allows to mount repositories which are archived
|
|
||||||
on a read only backend/filesystem.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/1597
|
|
||||||
https://github.com/restic/restic/pull/2821
|
|
|
@ -1,7 +0,0 @@
|
||||||
Enhancement: Speed-up file deletion in forget, prune and rebuild-index
|
|
||||||
|
|
||||||
We've sped up the file deletion for the commands forget, prune and
|
|
||||||
rebuild-index, especially for remote repositories.
|
|
||||||
Deletion was sequential before and is now run in parallel.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/2840
|
|
|
@ -1,9 +0,0 @@
|
||||||
Bugfix: Fix possible crash in the progress bar of check --read-data
|
|
||||||
|
|
||||||
We've fixed a possible crash while displaying the progress bar for the
|
|
||||||
check --read-data command. The crash occurred when the length of the
|
|
||||||
progress bar status exceeded the terminal width, which only happened for
|
|
||||||
very narrow terminal windows.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/2899
|
|
||||||
https://forum.restic.net/t/restic-rclone-pcloud-connection-issues/2963/15
|
|
|
@ -1,11 +0,0 @@
|
||||||
Bugfix: Restore timestamps and permissions on intermediate directories
|
|
||||||
|
|
||||||
When using the `--include` option of the restore command, restic restored
|
|
||||||
timestamps and permissions only on directories selected by the include pattern.
|
|
||||||
Intermediate directories, which are necessary to restore files located in sub-
|
|
||||||
directories, were created with default permissions. We've fixed the restore
|
|
||||||
command to restore timestamps and permissions for these directories as well.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/1212
|
|
||||||
https://github.com/restic/restic/issues/1402
|
|
||||||
https://github.com/restic/restic/pull/2906
|
|
|
@ -1,15 +0,0 @@
|
||||||
Bugfix: Mark repository files as read-only when using the local backend
|
|
||||||
|
|
||||||
Files stored in a local repository were marked as writable on the
|
|
||||||
filesystem for non-Windows systems, which did not prevent accidental file
|
|
||||||
modifications outside of restic. In addition, the local backend did not work
|
|
||||||
with certain filesystems and network mounts which do not permit modifications
|
|
||||||
of file permissions.
|
|
||||||
|
|
||||||
restic now marks files stored in a local repository as read-only on the
|
|
||||||
filesystem on non-Windows systems. The error handling is improved to support
|
|
||||||
more filesystems.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/1756
|
|
||||||
https://github.com/restic/restic/issues/2157
|
|
||||||
https://github.com/restic/restic/pull/2989
|
|
|
@ -1,10 +0,0 @@
|
||||||
Bugfix: Hide password in REST backend repository URLs
|
|
||||||
|
|
||||||
When using a password in the REST backend repository URL,
|
|
||||||
the password could in some cases be included in the output
|
|
||||||
from restic, e.g. when initializing a repo or during an error.
|
|
||||||
|
|
||||||
The password is now replaced with "***" where applicable.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2241
|
|
||||||
https://github.com/restic/restic/pull/2658
|
|
|
@ -1,12 +0,0 @@
|
||||||
Bugfix: Correctly dump directories into tar files
|
|
||||||
|
|
||||||
The dump command previously wrote directories in a tar file in a way which
|
|
||||||
can cause compatibility problems. This caused, for example, 7zip on Windows
|
|
||||||
to not open tar files containing directories. In addition it was not possible
|
|
||||||
to dump directories with extended attributes. These compatibility problems
|
|
||||||
are now corrected.
|
|
||||||
|
|
||||||
In addition, a tar file now includes the name of the owner and group of a file.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2319
|
|
||||||
https://github.com/restic/restic/pull/3039
|
|
|
@ -1,9 +0,0 @@
|
||||||
Bugfix: Don't require `self-update --output` placeholder file
|
|
||||||
|
|
||||||
`restic self-update --output /path/to/new-restic` used to require that
|
|
||||||
new-restic was an existing file, to be overwritten. Now it's possible
|
|
||||||
to download an updated restic binary to a new path, without first
|
|
||||||
having to create a placeholder file.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2491
|
|
||||||
https://github.com/restic/restic/pull/2937
|
|
|
@ -1,7 +0,0 @@
|
||||||
Bugfix: Fix rare cases of backup command hanging forever
|
|
||||||
|
|
||||||
We've fixed an issue with the backup progress reporting which could cause
|
|
||||||
restic to hang forever right before finishing a backup.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2834
|
|
||||||
https://github.com/restic/restic/pull/2963
|
|
|
@ -1,6 +0,0 @@
|
||||||
Bugfix: Fix manpage formatting
|
|
||||||
|
|
||||||
The manpage formatting in restic v0.10.0 was garbled, which is fixed now.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2938
|
|
||||||
https://github.com/restic/restic/pull/2977
|
|
|
@ -1,7 +0,0 @@
|
||||||
Bugfix: Make --exclude-larger-than handle disappearing files
|
|
||||||
|
|
||||||
There was a small bug in the backup command's --exclude-larger-than
|
|
||||||
option where files that disappeared between scanning and actually
|
|
||||||
backing them up to the repository caused a panic. This is now fixed.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2942
|
|
|
@ -1,9 +0,0 @@
|
||||||
Bugfix: restic generate, help and self-update no longer check passwords
|
|
||||||
|
|
||||||
The commands `restic cache`, `generate`, `help` and `self-update` don't need
|
|
||||||
passwords, but they previously did run the RESTIC_PASSWORD_COMMAND (if set in
|
|
||||||
the environment), prompting users to authenticate for no reason. They now skip
|
|
||||||
running the password command.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2951
|
|
||||||
https://github.com/restic/restic/pull/2987
|
|
|
@ -1,9 +0,0 @@
|
||||||
Enhancement: Optimize check for unchanged files during backup
|
|
||||||
|
|
||||||
During a backup restic skips processing files which have not changed since the last backup run.
|
|
||||||
Previously this required opening each file once which can be slow on network filesystems. The
|
|
||||||
backup command now checks for file changes before opening a file. This considerably reduces
|
|
||||||
the time to create a backup on network filesystems.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2969
|
|
||||||
https://github.com/restic/restic/pull/2970
|
|
|
@ -1,9 +0,0 @@
|
||||||
Bugfix: Make snapshots --json output [] instead of null when no snapshots
|
|
||||||
|
|
||||||
Restic previously output `null` instead of `[]` for the `--json snapshots`
|
|
||||||
command, when there were no snapshots in the repository. This caused some
|
|
||||||
minor problems when parsing the output, but is now fixed such that `[]` is
|
|
||||||
output when the list of snapshots is empty.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2979
|
|
||||||
https://github.com/restic/restic/pull/2984
|
|
|
@ -1,12 +0,0 @@
|
||||||
Enhancement: Add support for Volume Shadow Copy Service (VSS) on Windows
|
|
||||||
|
|
||||||
Volume Shadow Copy Service allows read access to files that are locked by
|
|
||||||
another process using an exclusive lock through a filesystem snapshot. Restic
|
|
||||||
was unable to backup those files before. This update enables backing up these
|
|
||||||
files.
|
|
||||||
|
|
||||||
This needs to be enabled explicitly using the --use-fs-snapshot option of the
|
|
||||||
backup command.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/340
|
|
||||||
https://github.com/restic/restic/pull/2274
|
|
|
@ -1,7 +0,0 @@
|
||||||
Enhancement: Authenticate to Google Cloud Storage with access token
|
|
||||||
|
|
||||||
When using the GCS backend, it is now possible to authenticate with OAuth2
|
|
||||||
access tokens instead of a credentials file by setting the GOOGLE_ACCESS_TOKEN
|
|
||||||
environment variable.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/2849
|
|
|
@ -1,10 +0,0 @@
|
||||||
Enhancement: New option --repository-file
|
|
||||||
|
|
||||||
We've added a new command-line option --repository-file as an alternative
|
|
||||||
to -r. This allows to read the repository URL from a file in order to
|
|
||||||
prevent certain types of information leaks, especially for URLs containing
|
|
||||||
credentials.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/1458
|
|
||||||
https://github.com/restic/restic/issues/2900
|
|
||||||
https://github.com/restic/restic/pull/2910
|
|
|
@ -1,8 +0,0 @@
|
||||||
Enhancement: Warn if parent snapshot cannot be loaded during backup
|
|
||||||
|
|
||||||
During a backup restic uses the parent snapshot to check whether a file was
|
|
||||||
changed and has to be backed up again. For this check the backup has to read
|
|
||||||
the directories contained in the old snapshot. If a tree blob cannot be
|
|
||||||
loaded, restic now warns about this problem with the backup repository.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/pull/2978
|
|
|
@ -1,10 +0,0 @@
|
||||||
Bugfix: Make `mount` not create missing mount point directory
|
|
||||||
|
|
||||||
When specifying a non-existent directory as mount point for the `mount`
|
|
||||||
command, restic used to create the specified directory automatically.
|
|
||||||
|
|
||||||
This has now changed such that restic instead gives an error when the
|
|
||||||
specified directory for the mount point does not exist.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/1681
|
|
||||||
https://github.com/restic/restic/pull/3008
|
|
|
@ -1,8 +0,0 @@
|
||||||
Bugfix: Ignore `no data available` filesystem error during backup
|
|
||||||
|
|
||||||
Restic was unable to backup files on some filesystems, for example certain
|
|
||||||
configurations of CIFS on Linux which return a `no data available` error
|
|
||||||
when reading extended attributes. These errors are now ignored.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/1800
|
|
||||||
https://github.com/restic/restic/pull/3034
|
|
|
@ -1,8 +0,0 @@
|
||||||
Enhancement: Allow specifying percentage in `check --read-data-subset`
|
|
||||||
|
|
||||||
We've enhanced the `check` command's `--read-data-subset` option to also accept
|
|
||||||
a percentage (e.g. `2.5%` or `10%`). This will check the given percentage of
|
|
||||||
pack files (which are randomly selected on each run).
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2186
|
|
||||||
https://github.com/restic/restic/pull/3038
|
|
|
@ -1,14 +0,0 @@
|
||||||
Enhancement: Report permanent/fatal backend errors earlier
|
|
||||||
|
|
||||||
When encountering errors in reading from or writing to storage backends,
|
|
||||||
restic retries the failing operation up to nine times (for a total of ten
|
|
||||||
attempts). It used to retry all backend operations, but now detects some
|
|
||||||
permanent error conditions so that it can report fatal errors earlier.
|
|
||||||
|
|
||||||
Permanent failures include local disks being full, SSH connections
|
|
||||||
dropping and permission errors.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2453
|
|
||||||
https://github.com/restic/restic/pull/3170
|
|
||||||
https://github.com/restic/restic/issues/3180
|
|
||||||
https://github.com/restic/restic/pull/3181
|
|
|
@ -1,21 +0,0 @@
|
||||||
Enhancement: Add Alibaba/Aliyun OSS support in the `s3` backend
|
|
||||||
|
|
||||||
A new extended option `s3.bucket-lookup` has been added to support
|
|
||||||
Alibaba/Aliyun OSS in the `s3` backend. The option can be set to one
|
|
||||||
of the following values:
|
|
||||||
|
|
||||||
- `auto` - Existing behaviour
|
|
||||||
- `dns` - Use DNS style bucket access
|
|
||||||
- `path` - Use path style bucket access
|
|
||||||
|
|
||||||
To make the `s3` backend work with Alibaba/Aliyun OSS you must set
|
|
||||||
`s3.bucket-lookup` to `dns` and set the `s3.region` parameter. For
|
|
||||||
example:
|
|
||||||
|
|
||||||
restic -o s3.bucket-lookup=dns -o s3.region=oss-eu-west-1 -r s3:https://oss-eu-west-1.aliyuncs.com/bucketname init
|
|
||||||
|
|
||||||
Note that `s3.region` must be set, otherwise the MinIO SDK tries to
|
|
||||||
look it up and it seems that Alibaba doesn't support that properly.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2528
|
|
||||||
https://github.com/restic/restic/pull/2535
|
|
|
@ -1,9 +0,0 @@
|
||||||
Bugfix: Report the correct owner of directories in FUSE mounts
|
|
||||||
|
|
||||||
Restic 0.10.0 changed the FUSE mount to always report the current user
|
|
||||||
as the owner of directories within the FUSE mount, which is incorrect.
|
|
||||||
|
|
||||||
This is now changed back to reporting the correct owner of a directory.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2563
|
|
||||||
https://github.com/restic/restic/pull/3141
|
|
|
@ -1,31 +0,0 @@
|
||||||
Bugfix: Make `backup` and `tag` commands separate tags by comma
|
|
||||||
|
|
||||||
Running `restic backup --tag foo,bar` previously created snapshots with one
|
|
||||||
single tag containing a comma (`foo,bar`) instead of two tags (`foo`, `bar`).
|
|
||||||
|
|
||||||
Similarly, the `tag` command's `--set`, `--add` and `--remove` options would
|
|
||||||
treat `foo,bar` as one tag instead of two tags. This was inconsistent with
|
|
||||||
other commands and often unexpected when one intended `foo,bar` to mean two
|
|
||||||
tags.
|
|
||||||
|
|
||||||
To be consistent in all commands, restic now interprets `foo,bar` to mean two
|
|
||||||
separate tags (`foo` and `bar`) instead of one tag (`foo,bar`) everywhere,
|
|
||||||
including in the `backup` and `tag` commands.
|
|
||||||
|
|
||||||
NOTE: This change might result in unexpected behavior in cases where you use
|
|
||||||
the `forget` command and filter on tags like `foo,bar`. Snapshots previously
|
|
||||||
backed up with `--tag foo,bar` will still not match that filter, but snapshots
|
|
||||||
saved from now on will match that filter.
|
|
||||||
|
|
||||||
To replace `foo,bar` tags with `foo` and `bar` tags in old snapshots, you can
|
|
||||||
first generate a list of the relevant snapshots using a command like:
|
|
||||||
|
|
||||||
restic snapshots --json --quiet | jq '.[] | select(contains({tags: ["foo,bar"]})) | .id'
|
|
||||||
|
|
||||||
and then use `restic tag --set foo --set bar snapshotID [...]` to set the new
|
|
||||||
tags. Please adjust the commands to include real tag names and any additional
|
|
||||||
tags, as well as the list of snapshots to process.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2688
|
|
||||||
https://github.com/restic/restic/pull/2690
|
|
||||||
https://github.com/restic/restic/pull/3197
|
|
|
@ -1,17 +0,0 @@
|
||||||
Enhancement: Configurable progress reports for non-interactive terminals
|
|
||||||
|
|
||||||
The `backup`, `check` and `prune` commands never printed any progress
|
|
||||||
reports on non-interactive terminals. This behavior is now configurable
|
|
||||||
using the `RESTIC_PROGRESS_FPS` environment variable. Use for example a
|
|
||||||
value of `1` for an update every second, or `0.01666` for an update every
|
|
||||||
minute.
|
|
||||||
|
|
||||||
The `backup` command now also prints the current progress when restic
|
|
||||||
receives a `SIGUSR1` signal.
|
|
||||||
|
|
||||||
Setting the `RESTIC_PROGRESS_FPS` environment variable or sending a `SIGUSR1`
|
|
||||||
signal prints a status report even when `--quiet` was specified.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2706
|
|
||||||
https://github.com/restic/restic/issues/3194
|
|
||||||
https://github.com/restic/restic/pull/3199
|
|
|
@ -1,5 +0,0 @@
|
||||||
Bugfix: Make the `cat` command respect the `--no-lock` option
|
|
||||||
|
|
||||||
The `cat` command would not respect the `--no-lock` flag. This is now fixed.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2739
|
|
|
@ -1,13 +0,0 @@
|
||||||
Enhancement: Add `backup` options `--files-from-{verbatim,raw}`
|
|
||||||
|
|
||||||
The new `backup` options `--files-from-verbatim` and `--files-from-raw` read a
|
|
||||||
list of files to back up from a file. Unlike the existing `--files-from`
|
|
||||||
option, these options do not interpret the listed filenames as glob patterns;
|
|
||||||
instead, whitespace in filenames is preserved as-is and no pattern expansion is
|
|
||||||
done. Please see the documentation for specifics.
|
|
||||||
|
|
||||||
These new options are highly recommended over `--files-from`, when using a
|
|
||||||
script to generate the list of files to back up.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/2944
|
|
||||||
https://github.com/restic/restic/issues/3013
|
|
|
@ -1,18 +0,0 @@
|
||||||
Enhancement: Allow usage of deprecated S3 `ListObjects` API
|
|
||||||
|
|
||||||
Some S3 API implementations, e.g. Ceph before version 14.2.5, have a broken
|
|
||||||
`ListObjectsV2` implementation which causes problems for restic when using
|
|
||||||
their API endpoints. When a broken server implementation is used, restic prints
|
|
||||||
errors similar to the following:
|
|
||||||
|
|
||||||
List() returned error: Truncated response should have continuation token set
|
|
||||||
|
|
||||||
As a temporary workaround, restic now allows using the older `ListObjects`
|
|
||||||
endpoint by setting the `s3.list-objects-v1` extended option, for instance:
|
|
||||||
|
|
||||||
restic -o s3.list-objects-v1=true snapshots
|
|
||||||
|
|
||||||
Please note that this option may be removed in future versions of restic.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/3083
|
|
||||||
https://github.com/restic/restic/pull/3085
|
|
|
@ -1,10 +0,0 @@
|
||||||
Bugfix: The `--use-fs-snapshot` option now works on windows/386
|
|
||||||
|
|
||||||
Restic failed to create VSS snapshots on windows/386 with the following error:
|
|
||||||
|
|
||||||
GetSnapshotProperties() failed: E_INVALIDARG (0x80070057)
|
|
||||||
|
|
||||||
This is now fixed.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/3087
|
|
||||||
https://github.com/restic/restic/pull/3090
|
|
|
@ -1,17 +0,0 @@
|
||||||
Change: Deleting files on Google Drive now moves them to the trash
|
|
||||||
|
|
||||||
When deleting files on Google Drive via the `rclone` backend, restic used to
|
|
||||||
bypass the trash folder required that one used the `-o rclone.args` option to
|
|
||||||
enable usage of the trash folder. This ensured that deleted files in Google
|
|
||||||
Drive were not kept indefinitely in the trash folder. However, since Google
|
|
||||||
Drive's trash retention policy changed to deleting trashed files after 30 days,
|
|
||||||
this is no longer needed.
|
|
||||||
|
|
||||||
Restic now leaves it up to rclone and its configuration to use or not use the
|
|
||||||
trash folder when deleting files. The default is to use the trash folder, as
|
|
||||||
of rclone 1.53.2. To re-enable the restic 0.11 behavior, set the
|
|
||||||
`RCLONE_DRIVE_USE_TRASH` environment variable or change the rclone
|
|
||||||
configuration. See the rclone documentation for more details.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/3095
|
|
||||||
https://github.com/restic/restic/pull/3102
|
|
|
@ -1,10 +0,0 @@
|
||||||
Bugfix: Do not require gs bucket permissions when running `init`
|
|
||||||
|
|
||||||
Restic used to require bucket level permissions for the `gs` backend
|
|
||||||
in order to initialize a restic repository.
|
|
||||||
|
|
||||||
It now allows a `gs` service account to initialize a repository if the
|
|
||||||
bucket does exist and the service account has permissions to write/read
|
|
||||||
to that bucket.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/3100
|
|
|
@ -1,9 +0,0 @@
|
||||||
Bugfix: Correctly detect output redirection for `backup` command on Windows
|
|
||||||
|
|
||||||
On Windows, since restic 0.10.0 the `backup` command did not properly detect
|
|
||||||
when the output was redirected to a file. This caused restic to output
|
|
||||||
terminal control characters. This has been fixed by correcting the terminal
|
|
||||||
detection.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/3111
|
|
||||||
https://github.com/restic/restic/pull/3150
|
|
|
@ -1,11 +0,0 @@
|
||||||
Enhancement: Support additional environment variables for Swift authentication
|
|
||||||
|
|
||||||
The `swift` backend now supports the following additional environment variables
|
|
||||||
for passing authentication details to restic:
|
|
||||||
`OS_USER_ID`, `OS_USER_DOMAIN_ID`, `OS_PROJECT_DOMAIN_ID` and `OS_TRUST_ID`
|
|
||||||
|
|
||||||
Depending on the `openrc` configuration file these might be required when the
|
|
||||||
user and project domains differ from one another.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/3147
|
|
||||||
https://github.com/restic/restic/pull/3158
|
|
|
@ -1,9 +0,0 @@
|
||||||
Bugfix: Don't create invalid snapshots when `backup` is interrupted
|
|
||||||
|
|
||||||
When canceling a backup run at a certain moment it was possible that
|
|
||||||
restic created a snapshot with an invalid "null" tree. This caused
|
|
||||||
`check` and other operations to fail. The `backup` command now properly
|
|
||||||
handles interruptions and never saves a snapshot when interrupted.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/3151
|
|
||||||
https://github.com/restic/restic/pull/3164
|
|
|
@ -1,9 +0,0 @@
|
||||||
Bugfix: Improve error handling in the `restore` command
|
|
||||||
|
|
||||||
The `restore` command used to not print errors while downloading file contents
|
|
||||||
from the repository. It also incorrectly exited with a zero error code even
|
|
||||||
when there were errors during the restore process. This has all been fixed and
|
|
||||||
`restore` now returns with a non-zero exit code when there's an error.
|
|
||||||
|
|
||||||
https://github.com/restic/restic/issues/3166
|
|
||||||
https://github.com/restic/restic/pull/3207
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue