| 230 | } |
| 231 | |
| 232 | func (w *Worktree) getCommitFromCheckoutOptions(opts *CheckoutOptions) (plumbing.Hash, error) { |
| 233 | hash := opts.Hash |
| 234 | if hash.IsZero() { |
| 235 | b, err := w.r.Reference(opts.Branch, true) |
| 236 | if err != nil { |
| 237 | return plumbing.ZeroHash, err |
| 238 | } |
| 239 | |
| 240 | hash = b.Hash() |
| 241 | } |
| 242 | |
| 243 | o, err := w.r.Object(plumbing.AnyObject, hash) |
| 244 | if err != nil { |
| 245 | return plumbing.ZeroHash, err |
| 246 | } |
| 247 | |
| 248 | switch o := o.(type) { |
| 249 | case *object.Tag: |
| 250 | if o.TargetType != plumbing.CommitObject { |
| 251 | return plumbing.ZeroHash, fmt.Errorf("%w: tag target %q", object.ErrUnsupportedObject, o.TargetType) |
| 252 | } |
| 253 | |
| 254 | return o.Target, nil |
| 255 | case *object.Commit: |
| 256 | return o.Hash, nil |
| 257 | } |
| 258 | |
| 259 | return plumbing.ZeroHash, fmt.Errorf("%w: %q", object.ErrUnsupportedObject, o.Type()) |
| 260 | } |
| 261 | |
| 262 | func (w *Worktree) setHEADToCommit(commit plumbing.Hash) error { |
| 263 | head := plumbing.NewHashReference(plumbing.HEAD, commit) |