Fix archive error when rename repo or user (#16399)
Use repo id instead of full name to generate archive path
This commit is contained in:
		
							parent
							
								
									b81106be3f
								
							
						
					
					
						commit
						67f135ca5d
					
				
					 5 changed files with 35 additions and 23 deletions
				
			
		|  | @ -1764,22 +1764,6 @@ func GetPrivateRepositoryCount(u *User) (int64, error) { | ||||||
| 	return getPrivateRepositoryCount(x, u) | 	return getPrivateRepositoryCount(x, u) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // DeleteRepositoryArchives deletes all repositories' archives.
 |  | ||||||
| func DeleteRepositoryArchives(ctx context.Context) error { |  | ||||||
| 	return x. |  | ||||||
| 		Where("id > 0"). |  | ||||||
| 		Iterate(new(Repository), |  | ||||||
| 			func(idx int, bean interface{}) error { |  | ||||||
| 				repo := bean.(*Repository) |  | ||||||
| 				select { |  | ||||||
| 				case <-ctx.Done(): |  | ||||||
| 					return ErrCancelledf("before deleting repository archives for %s", repo.FullName()) |  | ||||||
| 				default: |  | ||||||
| 				} |  | ||||||
| 				return util.RemoveAll(filepath.Join(repo.RepoPath(), "archives")) |  | ||||||
| 			}) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // DeleteOldRepositoryArchives deletes old repository archives.
 | // DeleteOldRepositoryArchives deletes old repository archives.
 | ||||||
| func DeleteOldRepositoryArchives(ctx context.Context, olderThan time.Duration) error { | func DeleteOldRepositoryArchives(ctx context.Context, olderThan time.Duration) error { | ||||||
| 	log.Trace("Doing: ArchiveCleanup") | 	log.Trace("Doing: ArchiveCleanup") | ||||||
|  |  | ||||||
|  | @ -52,12 +52,7 @@ func (archiver *RepoArchiver) LoadRepo() (*Repository, error) { | ||||||
| 
 | 
 | ||||||
| // RelativePath returns relative path
 | // RelativePath returns relative path
 | ||||||
| func (archiver *RepoArchiver) RelativePath() (string, error) { | func (archiver *RepoArchiver) RelativePath() (string, error) { | ||||||
| 	repo, err := archiver.LoadRepo() | 	return fmt.Sprintf("%d/%s/%s.%s", archiver.RepoID, archiver.CommitID[:2], archiver.CommitID, archiver.Type.String()), nil | ||||||
| 	if err != nil { |  | ||||||
| 		return "", err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return fmt.Sprintf("%s/%s/%s.%s", repo.FullName(), archiver.CommitID[:2], archiver.CommitID, archiver.Type.String()), nil |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // GetRepoArchiver get an archiver
 | // GetRepoArchiver get an archiver
 | ||||||
|  | @ -84,3 +79,9 @@ func UpdateRepoArchiverStatus(ctx DBContext, archiver *RepoArchiver) error { | ||||||
| 	_, err := ctx.e.ID(archiver.ID).Cols("status").Update(archiver) | 	_, err := ctx.e.ID(archiver.ID).Cols("status").Update(archiver) | ||||||
| 	return err | 	return err | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | // DeleteAllRepoArchives deletes all repo archives records
 | ||||||
|  | func DeleteAllRepoArchives() error { | ||||||
|  | 	_, err := x.Where("1=1").Delete(new(RepoArchiver)) | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -33,7 +33,7 @@ func registerDeleteRepositoryArchives() { | ||||||
| 		RunAtStart: false, | 		RunAtStart: false, | ||||||
| 		Schedule:   "@annually", | 		Schedule:   "@annually", | ||||||
| 	}, func(ctx context.Context, _ *models.User, _ Config) error { | 	}, func(ctx context.Context, _ *models.User, _ Config) error { | ||||||
| 		return models.DeleteRepositoryArchives(ctx) | 		return repo_module.DeleteRepositoryArchives(ctx) | ||||||
| 	}) | 	}) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										20
									
								
								modules/repository/archive.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								modules/repository/archive.go
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,20 @@ | ||||||
|  | // Copyright 2021 The Gitea Authors. All rights reserved.
 | ||||||
|  | // Use of this source code is governed by a MIT-style
 | ||||||
|  | // license that can be found in the LICENSE file.
 | ||||||
|  | 
 | ||||||
|  | package repository | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 
 | ||||||
|  | 	"code.gitea.io/gitea/models" | ||||||
|  | 	"code.gitea.io/gitea/modules/storage" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // DeleteRepositoryArchives deletes all repositories' archives.
 | ||||||
|  | func DeleteRepositoryArchives(ctx context.Context) error { | ||||||
|  | 	if err := models.DeleteAllRepoArchives(); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return storage.Clean(storage.RepoArchives) | ||||||
|  | } | ||||||
|  | @ -88,6 +88,13 @@ func Copy(dstStorage ObjectStorage, dstPath string, srcStorage ObjectStorage, sr | ||||||
| 	return dstStorage.Save(dstPath, f, size) | 	return dstStorage.Save(dstPath, f, size) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // Clean delete all the objects in this storage
 | ||||||
|  | func Clean(storage ObjectStorage) error { | ||||||
|  | 	return storage.IterateObjects(func(path string, obj Object) error { | ||||||
|  | 		return storage.Delete(path) | ||||||
|  | 	}) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // SaveFrom saves data to the ObjectStorage with path p from the callback
 | // SaveFrom saves data to the ObjectStorage with path p from the callback
 | ||||||
| func SaveFrom(objStorage ObjectStorage, p string, callback func(w io.Writer) error) error { | func SaveFrom(objStorage ObjectStorage, p string, callback func(w io.Writer) error) error { | ||||||
| 	pr, pw := io.Pipe() | 	pr, pw := io.Pipe() | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue