summaryrefslogtreecommitdiff
path: root/repo.merge.go
blob: dfc03d4aa07e6a285cdba137d5a4f7063738cee1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package gitpb

import (
	"fmt"
	"iter"

	"github.com/go-cmd/cmd"
	"go.wit.com/log"
)

func (r *Repo) MergeToDevel() (*cmd.Status, error) {
	r.Reload()
	if r.GetCurrentBranchName() != r.GetDevelBranchName() {
		return nil, fmt.Errorf("repo not on devel branch")
	}
	if r.CheckDirty() {
		return nil, fmt.Errorf("repo is dirty")
	}
	devel := r.GetDevelBranchName()
	user := r.GetUserBranchName()

	log.Info("MergeToDevel() merging from", user, "into", devel)

	cmd := []string{"git", "merge", user}
	result, err := r.RunQuiet(cmd)
	if err != nil {
		log.Log(WARN, "MergeToDevel() failed", r.GetFullPath())
		return result, err
	}

	if !r.IsBranchRemote(devel) {
		r.Reload() // rescan the repo
		// devel branch is not remote. do not try 'git push'
		return result, nil
	}
	if r.GetReadOnly() {
		r.Reload() // rescan the repo
		// devel branch is read only. you can not git push
		return result, nil
	}

	// it seems like we have write access. lets find out!
	cmd = []string{"git", "push"}
	result, err = r.RunQuiet(cmd)
	if err != nil {
		log.Log(WARN, "GitPushToDevel() failed", r.GetFullPath())
		return result, err
	}
	r.Reload() // rescan the repo
	return result, nil
}

func (r *Repo) MergeToMaster() (*cmd.Status, error) {
	r.Reload()

	if r.GetCurrentBranchName() != r.GetMasterBranchName() {
		return nil, fmt.Errorf("repo not on master branch")
	}
	if r.GetReadOnly() {
		r.Reload() // rescan the repo
		// master branch is read only. you can not git push
		return nil, fmt.Errorf("can't merge to master on read only() repos")
	}
	if r.CheckDirty() {
		return nil, fmt.Errorf("repo is dirty")
	}
	master := r.GetMasterBranchName()
	devel := r.GetDevelBranchName()

	log.Info("MergeToMaster() merging from", devel, "into", master)

	cmd := []string{"git", "merge", devel}
	result, err := r.RunQuiet(cmd)
	if err != nil {
		log.Log(WARN, "MergeToMaster() failed", r.GetFullPath())
		return result, err
	}

	if r.GetReadOnly() {
		r.Reload() // rescan the repo
		// master branch is read only. you can not git push
		return result, nil
	}

	// it seems like we have write access. lets find out!
	cmd = []string{"git", "push"}
	result, err = r.RunQuiet(cmd)
	if err != nil {
		log.Log(WARN, "GitPushToMaster() failed", r.GetFullPath())
		return result, err
	}
	r.Reload() // rescan the repo
	return result, nil
}

/*
func (x *Repos) All2() iter.Seq[*Repo] {
	repoMu.RLock()
	defer repoMu.RUnlock()

	// Create a new slice to hold pointers to each Repo
	var tmp []*Repo
	tmp = make([]*Repo, len(x.Repos))
	for i, p := range x.Repos {
		tmp[i] = p // Copy pointers for safe iteration
	}

	// return x.Repos
	return nil
}
*/

func (x *Repos) IterAll() iter.Seq[*Repo] {
	items := x.selectAllRepos()
	return func(yield func(*Repo) bool) {
		for _, v := range items {
			if !yield(v) {
				return
			}
		}
	}
}

/*
func (x *Repos) IterByFullPath() iter.Seq[*Repo] {
	items := x.selectAllRepos()
	sort.Sort(RepoFullPath(items))
	log.Info("MAKING Iter.Seq[] with length", len(items))
	return func(yield func(*Repo) bool) {
		for _, v := range items {
			if !yield(v) {
				return
			}
		}
	}
}
*/