Skip to content
This repository was archived by the owner on Sep 9, 2020. It is now read-only.

Consolidate ProjectIndentifier sorts; drop build support for go1.7 #714

Merged
merged 2 commits into from
Aug 29, 2017
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
consolidate ProjectIndentifier sorts
  • Loading branch information
jmank88 committed Aug 18, 2017
commit bb11ff769b68e93b101c26bb4842bb0ba9a13e25
4 changes: 3 additions & 1 deletion cmd/dep/status.go
Original file line number Diff line number Diff line change
Expand Up @@ -341,7 +341,9 @@ func runStatusAll(ctx *dep.Ctx, out outputter, p *dep.Project, sm gps.SourceMana
// deterministically ordered. (This may be superfluous if the lock is always
// written in alpha order, but it doesn't hurt to double down.)
slp := p.Lock.Projects()
sort.Sort(dep.SortedLockedProjects(slp))
sort.Slice(slp, func(i, j int) bool {
return slp[i].Ident().Less(slp[j].Ident())
})

if bytes.Equal(s.HashInputs(), p.Lock.SolveMeta.InputsDigest) {
// If these are equal, we're guaranteed that the lock is a transitively
Expand Down
20 changes: 6 additions & 14 deletions internal/gps/constraints.go
Original file line number Diff line number Diff line change
Expand Up @@ -331,7 +331,9 @@ func (m ProjectConstraints) asSortedSlice() []ProjectConstraint {
k++
}

sort.Stable(sortedConstraints(pcs))
sort.SliceStable(pcs, func(i, j int) bool {
return pcs[i].Ident.Less(pcs[j].Ident)
})
return pcs
}

Expand All @@ -348,7 +350,9 @@ func (m ProjectConstraints) overrideAll(pcm ProjectConstraints) (out []workingCo
k++
}

sort.Stable(sortedWC(out))
sort.SliceStable(out, func(i, j int) bool {
return out[i].Ident.Less(out[j].Ident)
})
return
}

Expand Down Expand Up @@ -389,15 +393,3 @@ func (m ProjectConstraints) override(pr ProjectRoot, pp ProjectProperties) worki

return wc
}

type sortedConstraints []ProjectConstraint

func (s sortedConstraints) Len() int { return len(s) }
func (s sortedConstraints) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
func (s sortedConstraints) Less(i, j int) bool { return s[i].Ident.less(s[j].Ident) }

type sortedWC []workingConstraint

func (s sortedWC) Len() int { return len(s) }
func (s sortedWC) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
func (s sortedWC) Less(i, j int) bool { return s[i].Ident.less(s[j].Ident) }
4 changes: 2 additions & 2 deletions internal/gps/identifier.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,14 +80,14 @@ type ProjectIdentifier struct {
Source string
}

func (i ProjectIdentifier) less(j ProjectIdentifier) bool {
// Less compares by ProjectRoot then normalized Source.
func (i ProjectIdentifier) Less(j ProjectIdentifier) bool {
if i.ProjectRoot < j.ProjectRoot {
return true
}
if j.ProjectRoot < i.ProjectRoot {
return false
}

return i.normalizedSource() < j.normalizedSource()
}

Expand Down
51 changes: 17 additions & 34 deletions internal/gps/lock.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,20 +39,8 @@ func LocksAreEq(l1, l2 Lock, checkHash bool) bool {
return false
}

// Check if the slices are sorted already. If they are, we can compare
// without copying. Otherwise, we have to copy to avoid altering the
// original input.
sp1, sp2 := lpsorter(p1), lpsorter(p2)
if len(p1) > 1 && !sort.IsSorted(sp1) {
p1 = make([]LockedProject, len(p1))
copy(p1, l1.Projects())
sort.Sort(lpsorter(p1))
}
if len(p2) > 1 && !sort.IsSorted(sp2) {
p2 = make([]LockedProject, len(p2))
copy(p2, l2.Projects())
sort.Sort(lpsorter(p2))
}
p1 = sortedLockedProjects(p1)
p2 = sortedLockedProjects(p2)

for k, lp := range p1 {
if !lp.Eq(p2[k]) {
Expand All @@ -62,6 +50,21 @@ func LocksAreEq(l1, l2 Lock, checkHash bool) bool {
return true
}

// sortedLockedProjects returns a sorted copy of lps, or itself if already sorted.
func sortedLockedProjects(lps []LockedProject) []LockedProject {
if len(lps) <= 1 || sort.SliceIsSorted(lps, func(i, j int) bool {
return lps[i].Ident().Less(lps[j].Ident())
}) {
return lps
}
cp := make([]LockedProject, len(lps))
copy(cp, lps)
sort.Slice(cp, func(i, j int) bool {
return cp[i].Ident().Less(cp[j].Ident())
})
return cp
}

// LockedProject is a single project entry from a lock file. It expresses the
// project's name, one or both of version and underlying revision, the network
// URI for accessing it, the path at which it should be placed within a vendor
Expand Down Expand Up @@ -230,23 +233,3 @@ func prepLock(l Lock) safeLock {

return rl
}

// SortLockedProjects sorts a slice of LockedProject in alphabetical order by
// ProjectIdentifier.
func SortLockedProjects(lps []LockedProject) {
sort.Stable(lpsorter(lps))
}

type lpsorter []LockedProject

func (lps lpsorter) Swap(i, j int) {
lps[i], lps[j] = lps[j], lps[i]
}

func (lps lpsorter) Len() int {
return len(lps)
}

func (lps lpsorter) Less(i, j int) bool {
return lps[i].Ident().less(lps[j].Ident())
}
5 changes: 4 additions & 1 deletion internal/gps/lock_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package gps

import (
"reflect"
"sort"
"testing"
)

Expand All @@ -20,7 +21,9 @@ func TestLockedProjectSorting(t *testing.T) {
lps2 := make([]LockedProject, len(lps))
copy(lps2, lps)

SortLockedProjects(lps2)
sort.SliceStable(lps2, func(i, j int) bool {
return lps2[i].Ident().Less(lps2[j].Ident())
})

// only the two should have switched positions
lps[0], lps[2] = lps[2], lps[0]
Expand Down
16 changes: 2 additions & 14 deletions internal/gps/lockdiff.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,20 +74,8 @@ func DiffLocks(l1 Lock, l2 Lock) *LockDiff {

p1, p2 := l1.Projects(), l2.Projects()

// Check if the slices are sorted already. If they are, we can compare
// without copying. Otherwise, we have to copy to avoid altering the
// original input.
sp1, sp2 := lpsorter(p1), lpsorter(p2)
if len(p1) > 1 && !sort.IsSorted(sp1) {
p1 = make([]LockedProject, len(p1))
copy(p1, l1.Projects())
sort.Sort(lpsorter(p1))
}
if len(p2) > 1 && !sort.IsSorted(sp2) {
p2 = make([]LockedProject, len(p2))
copy(p2, l2.Projects())
sort.Sort(lpsorter(p2))
}
p1 = sortedLockedProjects(p1)
p2 = sortedLockedProjects(p2)

diff := LockDiff{}

Expand Down
4 changes: 2 additions & 2 deletions internal/gps/solver.go
Original file line number Diff line number Diff line change
Expand Up @@ -1123,7 +1123,7 @@ func (s *solver) unselectedComparator(i, j int) bool {
case !ilock && jlock:
return false
case ilock && jlock:
return iname.less(jname)
return iname.Less(jname)
}

// Now, sort by number of available versions. This will trigger network
Expand Down Expand Up @@ -1152,7 +1152,7 @@ func (s *solver) unselectedComparator(i, j int) bool {
}

// Finally, if all else fails, fall back to comparing by name
return iname.less(jname)
return iname.Less(jname)
}

func (s *solver) fail(id ProjectIdentifier) {
Expand Down
22 changes: 3 additions & 19 deletions lock.go
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,9 @@ func (l *Lock) toRaw() rawLock {
Projects: make([]rawLockedProject, len(l.P)),
}

sort.Sort(SortedLockedProjects(l.P))
sort.Slice(l.P, func(i, j int) bool {
return l.P[i].Ident().Less(l.P[j].Ident())
})

for k, lp := range l.P {
id := lp.Ident()
Expand Down Expand Up @@ -197,21 +199,3 @@ func LockFromSolution(in gps.Solution) *Lock {
copy(l.P, p)
return l
}

// SortedLockedProjects implements sort.Interface.
type SortedLockedProjects []gps.LockedProject

func (s SortedLockedProjects) Len() int { return len(s) }
func (s SortedLockedProjects) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
func (s SortedLockedProjects) Less(i, j int) bool {
l, r := s[i].Ident(), s[j].Ident()

if l.ProjectRoot < r.ProjectRoot {
return true
}
if r.ProjectRoot < l.ProjectRoot {
return false
}

return l.Source < r.Source
}