|
9 | 9 | "net/http"
|
10 | 10 | "os"
|
11 | 11 | "regexp"
|
| 12 | + "strings" |
12 | 13 |
|
13 | 14 | log "github.com/sirupsen/logrus"
|
14 | 15 |
|
@@ -90,16 +91,51 @@ func (pullService *pullService) pullGit(fresh bool) error {
|
90 | 91 | }
|
91 | 92 | }
|
92 | 93 |
|
| 94 | + refSpecs := []config.RefSpec{ |
| 95 | + config.RefSpec("+refs/heads/*:" + cachedirectory.CacheReferencePrefix + "heads/*"), |
| 96 | + config.RefSpec("+refs/tags/*:" + cachedirectory.CacheReferencePrefix + "tags/*"), |
| 97 | + } |
| 98 | + reverseRefSpecs := []config.RefSpec{} |
| 99 | + for _, refSpec := range refSpecs { |
| 100 | + reverseRefSpecs = append(reverseRefSpecs, refSpec.Reverse()) |
| 101 | + } |
| 102 | + |
| 103 | + remote, err := localRepository.Remote(git.DefaultRemoteName) |
| 104 | + if err != nil { |
| 105 | + return errors.Wrap(err, "Error getting remote.") |
| 106 | + } |
| 107 | + remoteReferences, err := remote.List(&git.ListOptions{Auth: credentials}) |
| 108 | + if err != nil { |
| 109 | + return errors.Wrap(err, "Error listing remote references.") |
| 110 | + } |
| 111 | + localReferences, err := localRepository.References() |
| 112 | + if err != nil { |
| 113 | + return errors.Wrap(err, "Error listing local references.") |
| 114 | + } |
| 115 | + localReferences.ForEach(func(localReference *plumbing.Reference) error { |
| 116 | + if !strings.HasPrefix(localReference.Name().String(), "refs/") { |
| 117 | + return nil |
| 118 | + } |
| 119 | + for _, remoteReference := range remoteReferences { |
| 120 | + remoteReferenceName := strings.TrimPrefix(remoteReference.Name().String(), "refs/") |
| 121 | + if cachedirectory.CacheReferencePrefix+remoteReferenceName == localReference.Name().String() { |
| 122 | + return nil |
| 123 | + } |
| 124 | + } |
| 125 | + err := localRepository.Storer.RemoveReference(localReference.Name()) |
| 126 | + if err != nil { |
| 127 | + return errors.Wrap(err, "Error pruning reference.") |
| 128 | + } |
| 129 | + return nil |
| 130 | + }) |
| 131 | + |
93 | 132 | err = localRepository.FetchContext(pullService.ctx, &git.FetchOptions{
|
94 | 133 | RemoteName: git.DefaultRemoteName,
|
95 |
| - RefSpecs: []config.RefSpec{ |
96 |
| - config.RefSpec("+refs/heads/*:" + cachedirectory.CacheReferencePrefix + "heads/*"), |
97 |
| - config.RefSpec("+refs/tags/*:" + cachedirectory.CacheReferencePrefix + "tags/*"), |
98 |
| - }, |
99 |
| - Progress: os.Stderr, |
100 |
| - Tags: git.NoTags, |
101 |
| - Force: true, |
102 |
| - Auth: credentials, |
| 134 | + RefSpecs: refSpecs, |
| 135 | + Progress: os.Stderr, |
| 136 | + Tags: git.NoTags, |
| 137 | + Force: true, |
| 138 | + Auth: credentials, |
103 | 139 | })
|
104 | 140 | if err != nil && err != git.NoErrAlreadyUpToDate {
|
105 | 141 | return errors.Wrap(err, "Error doing Git fetch.")
|
|
0 commit comments