| 118 | } |
| 119 | |
| 120 | func diffRun(opts *DiffOptions) error { |
| 121 | findOptions := shared.FindOptions{ |
| 122 | Selector: opts.SelectorArg, |
| 123 | Fields: []string{"number"}, |
| 124 | } |
| 125 | |
| 126 | if opts.BrowserMode { |
| 127 | findOptions.Fields = []string{"url"} |
| 128 | } |
| 129 | |
| 130 | pr, baseRepo, err := opts.Finder.Find(findOptions) |
| 131 | if err != nil { |
| 132 | return err |
| 133 | } |
| 134 | |
| 135 | if opts.BrowserMode { |
| 136 | openUrl := fmt.Sprintf("%s/files", pr.URL) |
| 137 | if opts.IO.IsStdoutTTY() { |
| 138 | fmt.Fprintf(opts.IO.ErrOut, "Opening %s in your browser.\n", text.DisplayURL(openUrl)) |
| 139 | } |
| 140 | return opts.Browser.Browse(openUrl) |
| 141 | } |
| 142 | |
| 143 | httpClient, err := opts.HttpClient() |
| 144 | if err != nil { |
| 145 | return err |
| 146 | } |
| 147 | |
| 148 | if opts.NameOnly { |
| 149 | opts.Patch = false |
| 150 | } |
| 151 | |
| 152 | diffReadCloser, err := fetchDiff(httpClient, baseRepo, pr.Number, opts.Patch) |
| 153 | if err != nil { |
| 154 | return fmt.Errorf("could not find pull request diff: %w", err) |
| 155 | } |
| 156 | defer diffReadCloser.Close() |
| 157 | |
| 158 | var diff io.Reader = diffReadCloser |
| 159 | if len(opts.Exclude) > 0 { |
| 160 | filtered, err := filterDiff(diff, opts.Exclude) |
| 161 | if err != nil { |
| 162 | return err |
| 163 | } |
| 164 | diff = filtered |
| 165 | } |
| 166 | if opts.IO.IsStdoutTTY() { |
| 167 | diff = sanitizedReader(diff) |
| 168 | } |
| 169 | |
| 170 | if err := opts.IO.StartPager(); err == nil { |
| 171 | defer opts.IO.StopPager() |
| 172 | } else { |
| 173 | fmt.Fprintf(opts.IO.ErrOut, "failed to start pager: %v\n", err) |
| 174 | } |
| 175 | |
| 176 | if opts.NameOnly { |
| 177 | return changedFilesNames(opts.IO.Out, diff) |