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 functiontags/v0.9.99
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> |
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 |
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() { | ||||
} | } | ||||
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 | ||||
} | } | ||||
if opts.IsMirror { | if opts.IsMirror { | ||||
if _, err = x.InsertOne(&Mirror{ | if _, err = x.InsertOne(&Mirror{ | ||||
RepoID: repo.ID, | |||||
Interval: 24, | |||||
NextUpdate: time.Now().Add(24 * time.Hour), | |||||
RepoID: repo.ID, | |||||
Interval: 24, | |||||
EnablePrune: true, | |||||
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) | ||||
} | } | ||||
} | } | ||||
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 { |
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("It should be nil", func () { | |||||
Convey("When no external tracker is configured", 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 | ||||
}) | }) | ||||
}) | }) | ||||
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}") | ||||
}) | }) |
Interval int | Interval int | ||||
MirrorAddress string | MirrorAddress string | ||||
Private bool | Private bool | ||||
EnablePrune bool | |||||
// Advanced settings | // Advanced settings | ||||
EnableWiki bool | EnableWiki bool |
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 | ||||
} | } |
package user | package user | ||||
import ( | import ( | ||||
"os" | |||||
"os" | |||||
) | ) | ||||
func CurrentUsername() string { | func CurrentUsername() string { |
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 { |
</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}}"> |