Skip to content

Commit 2d70ac2

Browse files
authored
Merge branch 'master' into fix-14576-static-build-instructions
2 parents 32b4511 + f180009 commit 2d70ac2

File tree

14 files changed

+263
-92
lines changed

14 files changed

+263
-92
lines changed

cmd/dump.go

+24-42
Original file line numberDiff line numberDiff line change
@@ -49,38 +49,6 @@ func addFile(w archiver.Writer, filePath string, absPath string, verbose bool) e
4949
})
5050
}
5151

52-
func addRecursive(w archiver.Writer, dirPath string, absPath string, verbose bool) error {
53-
if verbose {
54-
log.Info("Adding dir %s\n", dirPath)
55-
}
56-
dir, err := os.Open(absPath)
57-
if err != nil {
58-
return fmt.Errorf("Could not open directory %s: %s", absPath, err)
59-
}
60-
defer dir.Close()
61-
62-
files, err := dir.Readdir(0)
63-
if err != nil {
64-
return fmt.Errorf("Unable to list files in %s: %s", absPath, err)
65-
}
66-
67-
if err := addFile(w, dirPath, absPath, false); err != nil {
68-
return err
69-
}
70-
71-
for _, fileInfo := range files {
72-
if fileInfo.IsDir() {
73-
err = addRecursive(w, filepath.Join(dirPath, fileInfo.Name()), filepath.Join(absPath, fileInfo.Name()), verbose)
74-
} else {
75-
err = addFile(w, filepath.Join(dirPath, fileInfo.Name()), filepath.Join(absPath, fileInfo.Name()), verbose)
76-
}
77-
if err != nil {
78-
return err
79-
}
80-
}
81-
return nil
82-
}
83-
8452
func isSubdir(upper string, lower string) (bool, error) {
8553
if relPath, err := filepath.Rel(upper, lower); err != nil {
8654
return false, err
@@ -157,6 +125,10 @@ It can be used for backup and capture Gitea server image to send to maintainer`,
157125
Name: "skip-log, L",
158126
Usage: "Skip the log dumping",
159127
},
128+
cli.BoolFlag{
129+
Name: "skip-custom-dir",
130+
Usage: "Skip custom directory",
131+
},
160132
cli.GenericFlag{
161133
Name: "type",
162134
Value: outputTypeEnum,
@@ -211,6 +183,11 @@ func runDump(ctx *cli.Context) error {
211183
}
212184
defer file.Close()
213185

186+
absFileName, err := filepath.Abs(fileName)
187+
if err != nil {
188+
return err
189+
}
190+
214191
verbose := ctx.Bool("verbose")
215192
outType := ctx.String("type")
216193
var iface interface{}
@@ -233,7 +210,7 @@ func runDump(ctx *cli.Context) error {
233210
log.Info("Skip dumping local repositories")
234211
} else {
235212
log.Info("Dumping local repositories... %s", setting.RepoRootPath)
236-
if err := addRecursive(w, "repos", setting.RepoRootPath, verbose); err != nil {
213+
if err := addRecursiveExclude(w, "repos", setting.RepoRootPath, []string{absFileName}, verbose); err != nil {
237214
fatal("Failed to include repositories: %v", err)
238215
}
239216

@@ -292,17 +269,21 @@ func runDump(ctx *cli.Context) error {
292269
}
293270
}
294271

295-
customDir, err := os.Stat(setting.CustomPath)
296-
if err == nil && customDir.IsDir() {
297-
if is, _ := isSubdir(setting.AppDataPath, setting.CustomPath); !is {
298-
if err := addRecursive(w, "custom", setting.CustomPath, verbose); err != nil {
299-
fatal("Failed to include custom: %v", err)
272+
if ctx.IsSet("skip-custom-dir") && ctx.Bool("skip-custom-dir") {
273+
log.Info("Skiping custom directory")
274+
} else {
275+
customDir, err := os.Stat(setting.CustomPath)
276+
if err == nil && customDir.IsDir() {
277+
if is, _ := isSubdir(setting.AppDataPath, setting.CustomPath); !is {
278+
if err := addRecursiveExclude(w, "custom", setting.CustomPath, []string{absFileName}, verbose); err != nil {
279+
fatal("Failed to include custom: %v", err)
280+
}
281+
} else {
282+
log.Info("Custom dir %s is inside data dir %s, skipped", setting.CustomPath, setting.AppDataPath)
300283
}
301284
} else {
302-
log.Info("Custom dir %s is inside data dir %s, skipped", setting.CustomPath, setting.AppDataPath)
285+
log.Info("Custom dir %s doesn't exist, skipped", setting.CustomPath)
303286
}
304-
} else {
305-
log.Info("Custom dir %s doesn't exist, skipped", setting.CustomPath)
306287
}
307288

308289
isExist, err := util.IsExist(setting.AppDataPath)
@@ -325,6 +306,7 @@ func runDump(ctx *cli.Context) error {
325306
excludes = append(excludes, setting.LFS.Path)
326307
excludes = append(excludes, setting.Attachment.Path)
327308
excludes = append(excludes, setting.LogRootPath)
309+
excludes = append(excludes, absFileName)
328310
if err := addRecursiveExclude(w, "data", setting.AppDataPath, excludes, verbose); err != nil {
329311
fatal("Failed to include data directory: %v", err)
330312
}
@@ -358,7 +340,7 @@ func runDump(ctx *cli.Context) error {
358340
log.Error("Unable to check if %s exists. Error: %v", setting.LogRootPath, err)
359341
}
360342
if isExist {
361-
if err := addRecursive(w, "log", setting.LogRootPath, verbose); err != nil {
343+
if err := addRecursiveExclude(w, "log", setting.LogRootPath, []string{absFileName}, verbose); err != nil {
362344
fatal("Failed to include log: %v", err)
363345
}
364346
}

docs/content/doc/usage/command-line.en-us.md

+1
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,7 @@ in the current directory.
253253
- `--file name`, `-f name`: Name of the dump file with will be created. Optional. (default: gitea-dump-[timestamp].zip).
254254
- `--tempdir path`, `-t path`: Path to the temporary directory used. Optional. (default: /tmp).
255255
- `--skip-repository`, `-R`: Skip the repository dumping. Optional.
256+
- `--skip-custom-dir`: Skip dumping of the custom dir. Optional.
256257
- `--database`, `-d`: Specify the database SQL syntax. Optional.
257258
- `--verbose`, `-V`: If provided, shows additional details. Optional.
258259
- Examples:

integrations/api_releases_test.go

+10-10
Original file line numberDiff line numberDiff line change
@@ -154,25 +154,25 @@ func TestAPIGetReleaseByTag(t *testing.T) {
154154
assert.EqualValues(t, "Not Found", err.Message)
155155
}
156156

157-
func TestAPIDeleteTagByName(t *testing.T) {
157+
func TestAPIDeleteReleaseByTagName(t *testing.T) {
158158
defer prepareTestEnv(t)()
159159

160160
repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository)
161161
owner := models.AssertExistsAndLoadBean(t, &models.User{ID: repo.OwnerID}).(*models.User)
162162
session := loginUser(t, owner.LowerName)
163163
token := getTokenForLoggedInUser(t, session)
164164

165-
urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/releases/tags/delete-tag?token=%s",
166-
owner.Name, repo.Name, token)
165+
createNewReleaseUsingAPI(t, session, token, owner, repo, "release-tag", "", "Release Tag", "test")
167166

168-
req := NewRequestf(t, http.MethodDelete, urlStr)
167+
// delete release
168+
req := NewRequestf(t, http.MethodDelete, fmt.Sprintf("/api/v1/repos/%s/%s/releases/tags/release-tag?token=%s", owner.Name, repo.Name, token))
169169
_ = session.MakeRequest(t, req, http.StatusNoContent)
170170

171-
// Make sure that actual releases can't be deleted outright
172-
createNewReleaseUsingAPI(t, session, token, owner, repo, "release-tag", "", "Release Tag", "test")
173-
urlStr = fmt.Sprintf("/api/v1/repos/%s/%s/releases/tags/release-tag?token=%s",
174-
owner.Name, repo.Name, token)
171+
// make sure release is deleted
172+
req = NewRequestf(t, http.MethodDelete, fmt.Sprintf("/api/v1/repos/%s/%s/releases/tags/release-tag?token=%s", owner.Name, repo.Name, token))
173+
_ = session.MakeRequest(t, req, http.StatusNotFound)
175174

176-
req = NewRequestf(t, http.MethodDelete, urlStr)
177-
_ = session.MakeRequest(t, req, http.StatusConflict)
175+
// delete release tag too
176+
req = NewRequestf(t, http.MethodDelete, fmt.Sprintf("/api/v1/repos/%s/%s/tags/release-tag?token=%s", owner.Name, repo.Name, token))
177+
_ = session.MakeRequest(t, req, http.StatusNoContent)
178178
}

integrations/api_repo_git_commits_test.go

+18-6
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,14 @@ import (
1414
"github.com/stretchr/testify/assert"
1515
)
1616

17+
func compareCommitFiles(t *testing.T, expect []string, files []*api.CommitAffectedFiles) {
18+
var actual []string
19+
for i := range files {
20+
actual = append(actual, files[i].Filename)
21+
}
22+
assert.ElementsMatch(t, expect, actual)
23+
}
24+
1725
func TestAPIReposGitCommits(t *testing.T) {
1826
defer prepareTestEnv(t)()
1927
user := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User)
@@ -56,10 +64,13 @@ func TestAPIReposGitCommitList(t *testing.T) {
5664
var apiData []api.Commit
5765
DecodeJSON(t, resp, &apiData)
5866

59-
assert.Equal(t, 3, len(apiData))
60-
assert.Equal(t, "69554a64c1e6030f051e5c3f94bfbd773cd6a324", apiData[0].CommitMeta.SHA)
61-
assert.Equal(t, "27566bd5738fc8b4e3fef3c5e72cce608537bd95", apiData[1].CommitMeta.SHA)
62-
assert.Equal(t, "5099b81332712fe655e34e8dd63574f503f61811", apiData[2].CommitMeta.SHA)
67+
assert.Len(t, apiData, 3)
68+
assert.EqualValues(t, "69554a64c1e6030f051e5c3f94bfbd773cd6a324", apiData[0].CommitMeta.SHA)
69+
compareCommitFiles(t, []string{"readme.md"}, apiData[0].Files)
70+
assert.EqualValues(t, "27566bd5738fc8b4e3fef3c5e72cce608537bd95", apiData[1].CommitMeta.SHA)
71+
compareCommitFiles(t, []string{"readme.md"}, apiData[1].Files)
72+
assert.EqualValues(t, "5099b81332712fe655e34e8dd63574f503f61811", apiData[2].CommitMeta.SHA)
73+
compareCommitFiles(t, []string{"readme.md"}, apiData[2].Files)
6374
}
6475

6576
func TestAPIReposGitCommitListPage2Empty(t *testing.T) {
@@ -76,7 +87,7 @@ func TestAPIReposGitCommitListPage2Empty(t *testing.T) {
7687
var apiData []api.Commit
7788
DecodeJSON(t, resp, &apiData)
7889

79-
assert.Equal(t, 0, len(apiData))
90+
assert.Len(t, apiData, 0)
8091
}
8192

8293
func TestAPIReposGitCommitListDifferentBranch(t *testing.T) {
@@ -93,6 +104,7 @@ func TestAPIReposGitCommitListDifferentBranch(t *testing.T) {
93104
var apiData []api.Commit
94105
DecodeJSON(t, resp, &apiData)
95106

96-
assert.Equal(t, 1, len(apiData))
107+
assert.Len(t, apiData, 1)
97108
assert.Equal(t, "f27c2b2b03dcab38beaf89b0ab4ff61f6de63441", apiData[0].CommitMeta.SHA)
109+
compareCommitFiles(t, []string{"readme.md"}, apiData[0].Files)
98110
}

integrations/api_repo_git_tags_test.go

+24
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package integrations
66

77
import (
8+
"fmt"
89
"net/http"
910
"testing"
1011

@@ -59,3 +60,26 @@ func TestAPIGitTags(t *testing.T) {
5960
badReq := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/git/tags/%s?token=%s", user.Name, repo.Name, commit.ID.String(), token)
6061
session.MakeRequest(t, badReq, http.StatusBadRequest)
6162
}
63+
64+
func TestAPIDeleteTagByName(t *testing.T) {
65+
defer prepareTestEnv(t)()
66+
67+
repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository)
68+
owner := models.AssertExistsAndLoadBean(t, &models.User{ID: repo.OwnerID}).(*models.User)
69+
session := loginUser(t, owner.LowerName)
70+
token := getTokenForLoggedInUser(t, session)
71+
72+
urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/tags/delete-tag?token=%s",
73+
owner.Name, repo.Name, token)
74+
75+
req := NewRequestf(t, http.MethodDelete, urlStr)
76+
_ = session.MakeRequest(t, req, http.StatusNoContent)
77+
78+
// Make sure that actual releases can't be deleted outright
79+
createNewReleaseUsingAPI(t, session, token, owner, repo, "release-tag", "", "Release Tag", "test")
80+
urlStr = fmt.Sprintf("/api/v1/repos/%s/%s/tags/release-tag?token=%s",
81+
owner.Name, repo.Name, token)
82+
83+
req = NewRequestf(t, http.MethodDelete, urlStr)
84+
_ = session.MakeRequest(t, req, http.StatusConflict)
85+
}

modules/convert/git_commit.go

+15
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,20 @@ func ToCommit(repo *models.Repository, commit *git.Commit, userCache map[string]
131131
}
132132
}
133133

134+
// Retrieve files affected by the commit
135+
fileStatus, err := git.GetCommitFileStatus(repo.RepoPath(), commit.ID.String())
136+
if err != nil {
137+
return nil, err
138+
}
139+
affectedFileList := make([]*api.CommitAffectedFiles, 0, len(fileStatus.Added)+len(fileStatus.Removed)+len(fileStatus.Modified))
140+
for _, files := range [][]string{fileStatus.Added, fileStatus.Removed, fileStatus.Modified} {
141+
for _, filename := range files {
142+
affectedFileList = append(affectedFileList, &api.CommitAffectedFiles{
143+
Filename: filename,
144+
})
145+
}
146+
}
147+
134148
return &api.Commit{
135149
CommitMeta: &api.CommitMeta{
136150
URL: repo.APIURL() + "/git/commits/" + commit.ID.String(),
@@ -162,5 +176,6 @@ func ToCommit(repo *models.Repository, commit *git.Commit, userCache map[string]
162176
Author: apiAuthor,
163177
Committer: apiCommitter,
164178
Parents: apiParents,
179+
Files: affectedFileList,
165180
}, nil
166181
}

modules/git/blob_nogogit.go

-3
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ import (
1111
"io"
1212
"strconv"
1313
"strings"
14-
15-
gitea_log "code.gitea.io/gitea/modules/log"
1614
)
1715

1816
// Blob represents a Git object.
@@ -35,7 +33,6 @@ func (b *Blob) DataAsync() (io.ReadCloser, error) {
3533
err := NewCommand("cat-file", "--batch").RunInDirFullPipeline(b.repoPath, stdoutWriter, stderr, strings.NewReader(b.ID.String()+"\n"))
3634
if err != nil {
3735
err = ConcatenateError(err, stderr.String())
38-
gitea_log.Error("Blob.DataAsync Error: %v", err)
3936
_ = stdoutWriter.CloseWithError(err)
4037
} else {
4138
_ = stdoutWriter.Close()

modules/migrations/github.go

+5
Original file line numberDiff line numberDiff line change
@@ -301,10 +301,15 @@ func (g *GithubDownloaderV3) convertGithubRelease(rel *github.RepositoryRelease)
301301
Created: asset.CreatedAt.Time,
302302
Updated: asset.UpdatedAt.Time,
303303
DownloadFunc: func() (io.ReadCloser, error) {
304+
g.sleep()
304305
asset, redir, err := g.client.Repositories.DownloadReleaseAsset(g.ctx, g.repoOwner, g.repoName, *asset.ID, http.DefaultClient)
305306
if err != nil {
306307
return nil, err
307308
}
309+
err = g.RefreshRate()
310+
if err != nil {
311+
log.Error("g.client.RateLimits: %s", err)
312+
}
308313
if asset == nil {
309314
return ioutil.NopCloser(bytes.NewBufferString(redir)), nil
310315
}

modules/structs/repo_commit.go

+11-5
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,12 @@ type RepoCommit struct {
4242
// Commit contains information generated from a Git commit.
4343
type Commit struct {
4444
*CommitMeta
45-
HTMLURL string `json:"html_url"`
46-
RepoCommit *RepoCommit `json:"commit"`
47-
Author *User `json:"author"`
48-
Committer *User `json:"committer"`
49-
Parents []*CommitMeta `json:"parents"`
45+
HTMLURL string `json:"html_url"`
46+
RepoCommit *RepoCommit `json:"commit"`
47+
Author *User `json:"author"`
48+
Committer *User `json:"committer"`
49+
Parents []*CommitMeta `json:"parents"`
50+
Files []*CommitAffectedFiles `json:"files"`
5051
}
5152

5253
// CommitDateOptions store dates for GIT_AUTHOR_DATE and GIT_COMMITTER_DATE
@@ -56,3 +57,8 @@ type CommitDateOptions struct {
5657
// swagger:strfmt date-time
5758
Committer time.Time `json:"committer"`
5859
}
60+
61+
// CommitAffectedFiles store information about files affected by the commit
62+
type CommitAffectedFiles struct {
63+
Filename string `json:"filename"`
64+
}

0 commit comments

Comments
 (0)