mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Migrate repository by organization
This commit is contained in:
		@@ -251,8 +251,8 @@ func MirrorUpdate() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MigrateRepository migrates a existing repository from other project hosting.
 | 
			
		||||
func MigrateRepository(user *User, name, desc string, private, mirror bool, url string) (*Repository, error) {
 | 
			
		||||
	repo, err := CreateRepository(user, name, desc, "", "", private, mirror, false)
 | 
			
		||||
func MigrateRepository(u *User, name, desc string, private, mirror bool, url string) (*Repository, error) {
 | 
			
		||||
	repo, err := CreateRepository(u, name, desc, "", "", private, mirror, false)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
@@ -261,11 +261,11 @@ func MigrateRepository(user *User, name, desc string, private, mirror bool, url
 | 
			
		||||
	tmpDir := filepath.Join(os.TempDir(), fmt.Sprintf("%d", time.Now().Nanosecond()))
 | 
			
		||||
	os.MkdirAll(tmpDir, os.ModePerm)
 | 
			
		||||
 | 
			
		||||
	repoPath := RepoPath(user.Name, name)
 | 
			
		||||
	repoPath := RepoPath(u.Name, name)
 | 
			
		||||
 | 
			
		||||
	repo.IsBare = false
 | 
			
		||||
	if mirror {
 | 
			
		||||
		if err = MirrorRepository(repo.Id, user.Name, repo.Name, repoPath, url); err != nil {
 | 
			
		||||
		if err = MirrorRepository(repo.Id, u.Name, repo.Name, repoPath, url); err != nil {
 | 
			
		||||
			return repo, err
 | 
			
		||||
		}
 | 
			
		||||
		repo.IsMirror = true
 | 
			
		||||
 
 | 
			
		||||
@@ -48,6 +48,7 @@ type MigrateRepoForm struct {
 | 
			
		||||
	Url          string `form:"url" binding:"Url"`
 | 
			
		||||
	AuthUserName string `form:"auth_username"`
 | 
			
		||||
	AuthPasswd   string `form:"auth_password"`
 | 
			
		||||
	Uid          int64  `form:"uid" binding:"Required"`
 | 
			
		||||
	RepoName     string `form:"repo" binding:"Required;AlphaDash;MaxSize(100)"`
 | 
			
		||||
	Mirror       bool   `form:"mirror"`
 | 
			
		||||
	Private      bool   `form:"private"`
 | 
			
		||||
 
 | 
			
		||||
@@ -53,7 +53,7 @@ func CreatePost(ctx *middleware.Context, form auth.CreateRepoForm) {
 | 
			
		||||
	ctx.Data["Licenses"] = models.Licenses
 | 
			
		||||
 | 
			
		||||
	if err := ctx.User.GetOrganizations(); err != nil {
 | 
			
		||||
		ctx.Handle(500, "home.Dashboard(GetOrganizations)", err)
 | 
			
		||||
		ctx.Handle(500, "home.CreatePost(GetOrganizations)", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	ctx.Data["Orgs"] = ctx.User.Orgs
 | 
			
		||||
@@ -70,9 +70,9 @@ func CreatePost(ctx *middleware.Context, form auth.CreateRepoForm) {
 | 
			
		||||
		u, err = models.GetUserById(form.Uid)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			if err == models.ErrUserNotExist {
 | 
			
		||||
				ctx.Handle(404, "home.Dashboard(GetUserById)", err)
 | 
			
		||||
				ctx.Handle(404, "home.CreatePost(GetUserById)", err)
 | 
			
		||||
			} else {
 | 
			
		||||
				ctx.Handle(500, "home.Dashboard(GetUserById)", err)
 | 
			
		||||
				ctx.Handle(500, "home.CreatePost(GetUserById)", err)
 | 
			
		||||
			}
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
@@ -97,12 +97,19 @@ func CreatePost(ctx *middleware.Context, form auth.CreateRepoForm) {
 | 
			
		||||
			log.Error("repo.CreatePost(DeleteRepository): %v", errDelete)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	ctx.Handle(500, "repo.CreatePost", err)
 | 
			
		||||
	ctx.Handle(500, "repo.CreatePost(CreateRepository)", err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Migrate(ctx *middleware.Context) {
 | 
			
		||||
	ctx.Data["Title"] = "Migrate repository"
 | 
			
		||||
	ctx.Data["PageIsNewRepo"] = true
 | 
			
		||||
 | 
			
		||||
	if err := ctx.User.GetOrganizations(); err != nil {
 | 
			
		||||
		ctx.Handle(500, "home.Migrate(GetOrganizations)", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	ctx.Data["Orgs"] = ctx.User.Orgs
 | 
			
		||||
 | 
			
		||||
	ctx.HTML(200, MIGRATE)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -110,19 +117,40 @@ func MigratePost(ctx *middleware.Context, form auth.MigrateRepoForm) {
 | 
			
		||||
	ctx.Data["Title"] = "Migrate repository"
 | 
			
		||||
	ctx.Data["PageIsNewRepo"] = true
 | 
			
		||||
 | 
			
		||||
	if err := ctx.User.GetOrganizations(); err != nil {
 | 
			
		||||
		ctx.Handle(500, "home.MigratePost(GetOrganizations)", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	ctx.Data["Orgs"] = ctx.User.Orgs
 | 
			
		||||
 | 
			
		||||
	if ctx.HasError() {
 | 
			
		||||
		ctx.HTML(200, MIGRATE)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	u := ctx.User
 | 
			
		||||
	// Not equal means current user is an organization.
 | 
			
		||||
	if u.Id != form.Uid {
 | 
			
		||||
		var err error
 | 
			
		||||
		u, err = models.GetUserById(form.Uid)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			if err == models.ErrUserNotExist {
 | 
			
		||||
				ctx.Handle(404, "home.MigratePost(GetUserById)", err)
 | 
			
		||||
			} else {
 | 
			
		||||
				ctx.Handle(500, "home.MigratePost(GetUserById)", err)
 | 
			
		||||
			}
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	authStr := strings.Replace(fmt.Sprintf("://%s:%s",
 | 
			
		||||
		form.AuthUserName, form.AuthPasswd), "@", "%40", -1)
 | 
			
		||||
	url := strings.Replace(form.Url, "://", authStr+"@", 1)
 | 
			
		||||
	repo, err := models.MigrateRepository(ctx.User, form.RepoName, form.Description, form.Private,
 | 
			
		||||
	repo, err := models.MigrateRepository(u, form.RepoName, form.Description, form.Private,
 | 
			
		||||
		form.Mirror, url)
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		log.Trace("%s Repository migrated: %s/%s", ctx.Req.RequestURI, ctx.User.LowerName, form.RepoName)
 | 
			
		||||
		ctx.Redirect("/" + ctx.User.Name + "/" + form.RepoName)
 | 
			
		||||
		log.Trace("%s Repository migrated: %s/%s", ctx.Req.RequestURI, u.LowerName, form.RepoName)
 | 
			
		||||
		ctx.Redirect("/" + u.Name + "/" + form.RepoName)
 | 
			
		||||
		return
 | 
			
		||||
	} else if err == models.ErrRepoAlreadyExist {
 | 
			
		||||
		ctx.RenderWithErr("Repository name has already been used", MIGRATE, &form)
 | 
			
		||||
@@ -133,7 +161,7 @@ func MigratePost(ctx *middleware.Context, form auth.MigrateRepoForm) {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if repo != nil {
 | 
			
		||||
		if errDelete := models.DeleteRepository(ctx.User.Id, repo.Id, ctx.User.Name); errDelete != nil {
 | 
			
		||||
		if errDelete := models.DeleteRepository(u.Id, repo.Id, u.Name); errDelete != nil {
 | 
			
		||||
			log.Error("repo.MigratePost(DeleteRepository): %v", errDelete)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@@ -142,7 +170,7 @@ func MigratePost(ctx *middleware.Context, form auth.MigrateRepoForm) {
 | 
			
		||||
		ctx.RenderWithErr(err.Error(), MIGRATE, &form)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	ctx.Handle(500, "repo.Migrate", err)
 | 
			
		||||
	ctx.Handle(500, "repo.Migrate(MigrateRepository)", err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Single(ctx *middleware.Context, params martini.Params) {
 | 
			
		||||
 
 | 
			
		||||
@@ -44,10 +44,38 @@
 | 
			
		||||
        <div class="form-group">
 | 
			
		||||
            <label class="col-md-2 control-label">Owner<strong class="text-danger">*</strong></label>
 | 
			
		||||
            <div class="col-md-8">
 | 
			
		||||
                <p class="form-control-static">{{.SignedUserName}}</p>
 | 
			
		||||
                <input type="hidden" value="{{.SignedUserId}}" name="userId"/>
 | 
			
		||||
                <div class="btn-group" id="repo-owner-switch">
 | 
			
		||||
                    <button type="button" class="btn btn-default" id="repo-owner-current">
 | 
			
		||||
                        <img src="{{.SignedUser.AvatarLink}}?s=28" alt="user-avatar" title="username" id="repo-owner-avatar">
 | 
			
		||||
                        <span id="repo-owner-name">{{.SignedUser.Name}}</span>
 | 
			
		||||
                    </button>
 | 
			
		||||
                    <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
 | 
			
		||||
                        <span class="caret"></span>
 | 
			
		||||
                    </button>
 | 
			
		||||
                    <div class="dropdown-menu clone-group-btn no-propagation">
 | 
			
		||||
                        <ul id="dashboard-switch-menu" class="list-unstyled">
 | 
			
		||||
                            <li data-uid="{{.SignedUser.Id}}" class="checked">
 | 
			
		||||
                                <a>
 | 
			
		||||
                                    <i class="fa fa-check"></i>
 | 
			
		||||
                                    <img src="{{.SignedUser.AvatarLink}}?s=28" alt="user-avatar" title="username">
 | 
			
		||||
                                    {{.SignedUser.Name}}
 | 
			
		||||
                                </a>
 | 
			
		||||
                            </li>
 | 
			
		||||
                            {{range .Orgs}}
 | 
			
		||||
                            <li data-uid="{{.Id}}">
 | 
			
		||||
                                <a>
 | 
			
		||||
                                    <i class="fa fa-check"></i>
 | 
			
		||||
                                    <img src="{{.AvatarLink}}?s=28" alt="user-avatar" title="username">
 | 
			
		||||
                                    {{.Name}}
 | 
			
		||||
                                </a>
 | 
			
		||||
                            </li>
 | 
			
		||||
                            {{end}}
 | 
			
		||||
                        </ul>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <input type="hidden" value="{{.SignedUserId}}" name="uid" id="repo-owner-id"/>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div class="form-group {{if .Err_RepoName}}has-error has-feedback{{end}}">
 | 
			
		||||
            <label class="col-md-2 control-label">Repository<strong class="text-danger">*</strong></label>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user