| 281 | } |
| 282 | |
| 283 | func (w *Worktree) ResetSparsely(opts *ResetOptions, dirs []string) error { |
| 284 | if err := opts.Validate(w.r); err != nil { |
| 285 | return err |
| 286 | } |
| 287 | |
| 288 | if opts.Mode == MergeReset { |
| 289 | unstaged, err := w.containsUnstagedChanges() |
| 290 | if err != nil { |
| 291 | return err |
| 292 | } |
| 293 | |
| 294 | if unstaged { |
| 295 | return ErrUnstagedChanges |
| 296 | } |
| 297 | } |
| 298 | |
| 299 | if err := w.setHEADCommit(opts.Commit); err != nil { |
| 300 | return err |
| 301 | } |
| 302 | |
| 303 | if opts.Mode == SoftReset { |
| 304 | return nil |
| 305 | } |
| 306 | |
| 307 | t, err := w.r.getTreeFromCommitHash(opts.Commit) |
| 308 | if err != nil { |
| 309 | return err |
| 310 | } |
| 311 | |
| 312 | var removedFiles []string |
| 313 | if opts.Mode == MixedReset || opts.Mode == MergeReset || opts.Mode == HardReset { |
| 314 | if removedFiles, err = w.resetIndex(t, dirs, opts.Files); err != nil { |
| 315 | return err |
| 316 | } |
| 317 | } |
| 318 | |
| 319 | if opts.Mode == MergeReset && len(removedFiles) > 0 { |
| 320 | if err := w.resetWorktree(t, removedFiles); err != nil { |
| 321 | return err |
| 322 | } |
| 323 | } |
| 324 | |
| 325 | if opts.Mode == HardReset { |
| 326 | if err := w.resetWorktree(t, opts.Files); err != nil { |
| 327 | return err |
| 328 | } |
| 329 | } |
| 330 | |
| 331 | return nil |
| 332 | } |
| 333 | |
| 334 | // Restore restores specified files in the working tree or stage with contents from |
| 335 | // a restore source. If a path is tracked but does not exist in the restore, |