The pruning for the synchronized mirrors is a option now. Default value: enable_prune = true (#3246)
Executed go fmt getEngine() not handles DB parameters (#2972) (#2974) Uses .AllCols() for Update in updateMirror() Spanish traslation removed Fixed a wrong way to ommit the --prune option in process.ExecDir() for MirrorUpdate function
This commit is contained in:
parent
467d7dacb6
commit
98b152030d
9 changed files with 41 additions and 19 deletions
|
@ -58,3 +58,4 @@ Vladimir Jigulin mogaika AT yandex DOT ru
|
||||||
Vladimir Vissoultchev <wqweto AT gmail DOT com>
|
Vladimir Vissoultchev <wqweto AT gmail DOT com>
|
||||||
YJSoft <yjsoft AT yjsoft DOT pe DOT kr>
|
YJSoft <yjsoft AT yjsoft DOT pe DOT kr>
|
||||||
Łukasz Jan Niemier <lukasz AT niemier DOT pl>
|
Łukasz Jan Niemier <lukasz AT niemier DOT pl>
|
||||||
|
Pablo Saavedra <psaavedra AT igalia DOT com>
|
||||||
|
|
|
@ -353,6 +353,8 @@ default_branch = Default Branch
|
||||||
mirror_interval = Mirror Interval (hour)
|
mirror_interval = Mirror Interval (hour)
|
||||||
mirror_address = Mirror Address
|
mirror_address = Mirror Address
|
||||||
mirror_address_desc = Please include necessary user credentials in the address.
|
mirror_address_desc = Please include necessary user credentials in the address.
|
||||||
|
mirror_enable_prune = Remove all objects references remotely removed in the mirror
|
||||||
|
mirror_prune = Prune
|
||||||
watchers = Watchers
|
watchers = Watchers
|
||||||
stargazers = Stargazers
|
stargazers = Stargazers
|
||||||
forks = Forks
|
forks = Forks
|
||||||
|
|
|
@ -558,6 +558,8 @@ type Mirror struct {
|
||||||
NextUpdateUnix int64
|
NextUpdateUnix int64
|
||||||
|
|
||||||
address string `xorm:"-"`
|
address string `xorm:"-"`
|
||||||
|
|
||||||
|
EnablePrune bool `xorm:"NOT NULL DEFAULT true"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Mirror) BeforeInsert() {
|
func (m *Mirror) BeforeInsert() {
|
||||||
|
@ -656,7 +658,7 @@ func GetMirror(repoId int64) (*Mirror, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateMirror(e Engine, m *Mirror) error {
|
func updateMirror(e Engine, m *Mirror) error {
|
||||||
_, err := e.Id(m.ID).Update(m)
|
_, err := e.Id(m.ID).AllCols().Update(m)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -748,6 +750,7 @@ func MigrateRepository(u *User, opts MigrateRepoOptions) (*Repository, error) {
|
||||||
if _, err = x.InsertOne(&Mirror{
|
if _, err = x.InsertOne(&Mirror{
|
||||||
RepoID: repo.ID,
|
RepoID: repo.ID,
|
||||||
Interval: 24,
|
Interval: 24,
|
||||||
|
EnablePrune: true,
|
||||||
NextUpdate: time.Now().Add(24 * time.Hour),
|
NextUpdate: time.Now().Add(24 * time.Hour),
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
return repo, fmt.Errorf("InsertOne: %v", err)
|
return repo, fmt.Errorf("InsertOne: %v", err)
|
||||||
|
@ -1680,10 +1683,16 @@ func MirrorUpdate() {
|
||||||
}
|
}
|
||||||
|
|
||||||
repoPath := m.Repo.RepoPath()
|
repoPath := m.Repo.RepoPath()
|
||||||
|
|
||||||
|
var gitArgs = []string{"remote", "update"}
|
||||||
|
if m.EnablePrune {
|
||||||
|
gitArgs = []string{"remote", "update", "--prune"}
|
||||||
|
}
|
||||||
|
|
||||||
if _, stderr, err := process.ExecDir(
|
if _, stderr, err := process.ExecDir(
|
||||||
time.Duration(setting.Git.Timeout.Mirror)*time.Second,
|
time.Duration(setting.Git.Timeout.Mirror)*time.Second,
|
||||||
repoPath, fmt.Sprintf("MirrorUpdate: %s", repoPath),
|
repoPath, fmt.Sprintf("MirrorUpdate: %s", repoPath),
|
||||||
"git", "remote", "update", "--prune"); err != nil {
|
"git", gitArgs...); err != nil {
|
||||||
desc := fmt.Sprintf("Fail to update mirror repository(%s): %s", repoPath, stderr)
|
desc := fmt.Sprintf("Fail to update mirror repository(%s): %s", repoPath, stderr)
|
||||||
log.Error(4, desc)
|
log.Error(4, desc)
|
||||||
if err = CreateRepositoryNotice(desc); err != nil {
|
if err = CreateRepositoryNotice(desc); err != nil {
|
||||||
|
|
|
@ -1,27 +1,27 @@
|
||||||
package models_test
|
package models_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
|
||||||
. "github.com/smartystreets/goconvey/convey"
|
|
||||||
. "github.com/gogits/gogs/models"
|
. "github.com/gogits/gogs/models"
|
||||||
|
. "github.com/smartystreets/goconvey/convey"
|
||||||
|
"testing"
|
||||||
|
|
||||||
"github.com/gogits/gogs/modules/markdown"
|
"github.com/gogits/gogs/modules/markdown"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestRepo(t *testing.T) {
|
func TestRepo(t *testing.T) {
|
||||||
Convey("The metas map", t, func () {
|
Convey("The metas map", t, func() {
|
||||||
var repo = new(Repository)
|
var repo = new(Repository)
|
||||||
repo.Name = "testrepo"
|
repo.Name = "testrepo"
|
||||||
repo.Owner = new(User)
|
repo.Owner = new(User)
|
||||||
repo.Owner.Name = "testuser"
|
repo.Owner.Name = "testuser"
|
||||||
repo.ExternalTrackerFormat = "https://someurl.com/{user}/{repo}/{issue}"
|
repo.ExternalTrackerFormat = "https://someurl.com/{user}/{repo}/{issue}"
|
||||||
|
|
||||||
Convey("When no external tracker is configured", func () {
|
Convey("When no external tracker is configured", func() {
|
||||||
Convey("It should be nil", func () {
|
Convey("It should be nil", func() {
|
||||||
repo.EnableExternalTracker = false
|
repo.EnableExternalTracker = false
|
||||||
So(repo.ComposeMetas(), ShouldEqual, map[string]string(nil))
|
So(repo.ComposeMetas(), ShouldEqual, map[string]string(nil))
|
||||||
})
|
})
|
||||||
Convey("It should be nil even if other settings are present", func () {
|
Convey("It should be nil even if other settings are present", func() {
|
||||||
repo.EnableExternalTracker = false
|
repo.EnableExternalTracker = false
|
||||||
repo.ExternalTrackerFormat = "http://someurl.com/{user}/{repo}/{issue}"
|
repo.ExternalTrackerFormat = "http://someurl.com/{user}/{repo}/{issue}"
|
||||||
repo.ExternalTrackerStyle = markdown.ISSUE_NAME_STYLE_NUMERIC
|
repo.ExternalTrackerStyle = markdown.ISSUE_NAME_STYLE_NUMERIC
|
||||||
|
@ -29,31 +29,31 @@ func TestRepo(t *testing.T) {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
Convey("When an external issue tracker is configured", func () {
|
Convey("When an external issue tracker is configured", func() {
|
||||||
repo.EnableExternalTracker = true
|
repo.EnableExternalTracker = true
|
||||||
Convey("It should default to numeric issue style", func () {
|
Convey("It should default to numeric issue style", func() {
|
||||||
metas := repo.ComposeMetas()
|
metas := repo.ComposeMetas()
|
||||||
So(metas["style"], ShouldEqual, markdown.ISSUE_NAME_STYLE_NUMERIC)
|
So(metas["style"], ShouldEqual, markdown.ISSUE_NAME_STYLE_NUMERIC)
|
||||||
})
|
})
|
||||||
Convey("It should pass through numeric issue style setting", func () {
|
Convey("It should pass through numeric issue style setting", func() {
|
||||||
repo.ExternalTrackerStyle = markdown.ISSUE_NAME_STYLE_NUMERIC
|
repo.ExternalTrackerStyle = markdown.ISSUE_NAME_STYLE_NUMERIC
|
||||||
metas := repo.ComposeMetas()
|
metas := repo.ComposeMetas()
|
||||||
So(metas["style"], ShouldEqual, markdown.ISSUE_NAME_STYLE_NUMERIC)
|
So(metas["style"], ShouldEqual, markdown.ISSUE_NAME_STYLE_NUMERIC)
|
||||||
})
|
})
|
||||||
Convey("It should pass through alphanumeric issue style setting", func () {
|
Convey("It should pass through alphanumeric issue style setting", func() {
|
||||||
repo.ExternalTrackerStyle = markdown.ISSUE_NAME_STYLE_ALPHANUMERIC
|
repo.ExternalTrackerStyle = markdown.ISSUE_NAME_STYLE_ALPHANUMERIC
|
||||||
metas := repo.ComposeMetas()
|
metas := repo.ComposeMetas()
|
||||||
So(metas["style"], ShouldEqual, markdown.ISSUE_NAME_STYLE_ALPHANUMERIC)
|
So(metas["style"], ShouldEqual, markdown.ISSUE_NAME_STYLE_ALPHANUMERIC)
|
||||||
})
|
})
|
||||||
Convey("It should contain the user name", func () {
|
Convey("It should contain the user name", func() {
|
||||||
metas := repo.ComposeMetas()
|
metas := repo.ComposeMetas()
|
||||||
So(metas["user"], ShouldEqual, "testuser")
|
So(metas["user"], ShouldEqual, "testuser")
|
||||||
})
|
})
|
||||||
Convey("It should contain the repo name", func () {
|
Convey("It should contain the repo name", func() {
|
||||||
metas := repo.ComposeMetas()
|
metas := repo.ComposeMetas()
|
||||||
So(metas["repo"], ShouldEqual, "testrepo")
|
So(metas["repo"], ShouldEqual, "testrepo")
|
||||||
})
|
})
|
||||||
Convey("It should contain the URL format", func () {
|
Convey("It should contain the URL format", func() {
|
||||||
metas := repo.ComposeMetas()
|
metas := repo.ComposeMetas()
|
||||||
So(metas["format"], ShouldEqual, "https://someurl.com/{user}/{repo}/{issue}")
|
So(metas["format"], ShouldEqual, "https://someurl.com/{user}/{repo}/{issue}")
|
||||||
})
|
})
|
||||||
|
|
|
@ -88,6 +88,7 @@ type RepoSettingForm struct {
|
||||||
Interval int
|
Interval int
|
||||||
MirrorAddress string
|
MirrorAddress string
|
||||||
Private bool
|
Private bool
|
||||||
|
EnablePrune bool
|
||||||
|
|
||||||
// Advanced settings
|
// Advanced settings
|
||||||
EnableWiki bool
|
EnableWiki bool
|
||||||
|
|
|
@ -160,6 +160,7 @@ func RepoAssignment(args ...bool) macaron.Handler {
|
||||||
ctx.Handle(500, "GetMirror", err)
|
ctx.Handle(500, "GetMirror", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
ctx.Data["MirrorEnablePrune"] = ctx.Repo.Mirror.EnablePrune
|
||||||
ctx.Data["MirrorInterval"] = ctx.Repo.Mirror.Interval
|
ctx.Data["MirrorInterval"] = ctx.Repo.Mirror.Interval
|
||||||
ctx.Data["Mirror"] = ctx.Repo.Mirror
|
ctx.Data["Mirror"] = ctx.Repo.Mirror
|
||||||
}
|
}
|
||||||
|
|
|
@ -107,6 +107,7 @@ func SettingsPost(ctx *context.Context, form auth.RepoSettingForm) {
|
||||||
|
|
||||||
if repo.IsMirror {
|
if repo.IsMirror {
|
||||||
if form.Interval > 0 {
|
if form.Interval > 0 {
|
||||||
|
ctx.Repo.Mirror.EnablePrune = form.EnablePrune
|
||||||
ctx.Repo.Mirror.Interval = form.Interval
|
ctx.Repo.Mirror.Interval = form.Interval
|
||||||
ctx.Repo.Mirror.NextUpdate = time.Now().Add(time.Duration(form.Interval) * time.Hour)
|
ctx.Repo.Mirror.NextUpdate = time.Now().Add(time.Duration(form.Interval) * time.Hour)
|
||||||
if err := models.UpdateMirror(ctx.Repo.Mirror); err != nil {
|
if err := models.UpdateMirror(ctx.Repo.Mirror); err != nil {
|
||||||
|
|
|
@ -51,6 +51,13 @@
|
||||||
</div>
|
</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
{{if .Repository.IsMirror}}
|
{{if .Repository.IsMirror}}
|
||||||
|
<div class="inline field {{if .Err_EnablePrune}}error{{end}}">
|
||||||
|
<label>{{.i18n.Tr "repo.mirror_prune"}}</label>
|
||||||
|
<div class="ui checkbox">
|
||||||
|
<input id="enable_prune" name="enable_prune" type="checkbox" {{if .MirrorEnablePrune}}checked{{end}}>
|
||||||
|
<label>{{.i18n.Tr "repo.mirror_enable_prune"}}</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="inline field {{if .Err_Interval}}error{{end}}">
|
<div class="inline field {{if .Err_Interval}}error{{end}}">
|
||||||
<label for="interval">{{.i18n.Tr "repo.mirror_interval"}}</label>
|
<label for="interval">{{.i18n.Tr "repo.mirror_interval"}}</label>
|
||||||
<input id="interval" name="interval" type="number" value="{{.MirrorInterval}}">
|
<input id="interval" name="interval" type="number" value="{{.MirrorInterval}}">
|
||||||
|
|
Reference in a new issue