diff --git a/conf/locale/TRANSLATORS b/conf/locale/TRANSLATORS index 687f702474..fc1bc20d88 100644 --- a/conf/locale/TRANSLATORS +++ b/conf/locale/TRANSLATORS @@ -58,3 +58,4 @@ Vladimir Jigulin mogaika AT yandex DOT ru Vladimir Vissoultchev YJSoft Ɓukasz Jan Niemier +Pablo Saavedra diff --git a/conf/locale/locale_en-US.ini b/conf/locale/locale_en-US.ini index 13efc6bca6..071a20e7f7 100644 --- a/conf/locale/locale_en-US.ini +++ b/conf/locale/locale_en-US.ini @@ -353,6 +353,8 @@ default_branch = Default Branch mirror_interval = Mirror Interval (hour) mirror_address = Mirror 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 stargazers = Stargazers forks = Forks diff --git a/models/repo.go b/models/repo.go index 56e5e00eea..c2dd9adeaf 100644 --- a/models/repo.go +++ b/models/repo.go @@ -558,6 +558,8 @@ type Mirror struct { NextUpdateUnix int64 address string `xorm:"-"` + + EnablePrune bool `xorm:"NOT NULL DEFAULT true"` } func (m *Mirror) BeforeInsert() { @@ -656,7 +658,7 @@ func GetMirror(repoId int64) (*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 } @@ -746,9 +748,10 @@ func MigrateRepository(u *User, opts MigrateRepoOptions) (*Repository, error) { if opts.IsMirror { 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 { return repo, fmt.Errorf("InsertOne: %v", err) } @@ -1680,10 +1683,16 @@ func MirrorUpdate() { } repoPath := m.Repo.RepoPath() + + var gitArgs = []string{"remote", "update"} + if m.EnablePrune { + gitArgs = []string{"remote", "update", "--prune"} + } + if _, stderr, err := process.ExecDir( time.Duration(setting.Git.Timeout.Mirror)*time.Second, 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) log.Error(4, desc) if err = CreateRepositoryNotice(desc); err != nil { diff --git a/models/repo_test.go b/models/repo_test.go index 4a4203ba02..69d90b938f 100644 --- a/models/repo_test.go +++ b/models/repo_test.go @@ -1,27 +1,27 @@ package models_test import ( - "testing" - . "github.com/smartystreets/goconvey/convey" . "github.com/gogits/gogs/models" + . "github.com/smartystreets/goconvey/convey" + "testing" "github.com/gogits/gogs/modules/markdown" ) func TestRepo(t *testing.T) { - Convey("The metas map", t, func () { + Convey("The metas map", t, func() { var repo = new(Repository) repo.Name = "testrepo" repo.Owner = new(User) repo.Owner.Name = "testuser" 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 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.ExternalTrackerFormat = "http://someurl.com/{user}/{repo}/{issue}" 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 - Convey("It should default to numeric issue style", func () { + Convey("It should default to numeric issue style", func() { metas := repo.ComposeMetas() 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 metas := repo.ComposeMetas() 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 metas := repo.ComposeMetas() 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() So(metas["user"], ShouldEqual, "testuser") }) - Convey("It should contain the repo name", func () { + Convey("It should contain the repo name", func() { metas := repo.ComposeMetas() So(metas["repo"], ShouldEqual, "testrepo") }) - Convey("It should contain the URL format", func () { + Convey("It should contain the URL format", func() { metas := repo.ComposeMetas() So(metas["format"], ShouldEqual, "https://someurl.com/{user}/{repo}/{issue}") }) diff --git a/modules/auth/repo_form.go b/modules/auth/repo_form.go index aa74ab3b99..13e53497d5 100644 --- a/modules/auth/repo_form.go +++ b/modules/auth/repo_form.go @@ -88,6 +88,7 @@ type RepoSettingForm struct { Interval int MirrorAddress string Private bool + EnablePrune bool // Advanced settings EnableWiki bool diff --git a/modules/context/repo.go b/modules/context/repo.go index a330da5c3f..a7ca17d3bc 100644 --- a/modules/context/repo.go +++ b/modules/context/repo.go @@ -160,6 +160,7 @@ func RepoAssignment(args ...bool) macaron.Handler { ctx.Handle(500, "GetMirror", err) return } + ctx.Data["MirrorEnablePrune"] = ctx.Repo.Mirror.EnablePrune ctx.Data["MirrorInterval"] = ctx.Repo.Mirror.Interval ctx.Data["Mirror"] = ctx.Repo.Mirror } diff --git a/modules/user/user.go b/modules/user/user.go index 8a2557f327..4415632ee9 100644 --- a/modules/user/user.go +++ b/modules/user/user.go @@ -5,7 +5,7 @@ package user import ( - "os" + "os" ) func CurrentUsername() string { diff --git a/routers/repo/setting.go b/routers/repo/setting.go index 99f9b8af83..14d2963656 100644 --- a/routers/repo/setting.go +++ b/routers/repo/setting.go @@ -107,6 +107,7 @@ func SettingsPost(ctx *context.Context, form auth.RepoSettingForm) { if repo.IsMirror { if form.Interval > 0 { + ctx.Repo.Mirror.EnablePrune = form.EnablePrune ctx.Repo.Mirror.Interval = form.Interval ctx.Repo.Mirror.NextUpdate = time.Now().Add(time.Duration(form.Interval) * time.Hour) if err := models.UpdateMirror(ctx.Repo.Mirror); err != nil { diff --git a/templates/repo/settings/options.tmpl b/templates/repo/settings/options.tmpl index 0e0821c2f9..a3133159ed 100644 --- a/templates/repo/settings/options.tmpl +++ b/templates/repo/settings/options.tmpl @@ -51,6 +51,13 @@ {{end}} {{if .Repository.IsMirror}} +
+ +
+ + +
+