parseAt extract @ statements
()
| 250 | |
| 251 | // parseAt extract @ statements |
| 252 | func (p *Parser) parseAt() (Revisioner, error) { |
| 253 | var tok, nextTok token |
| 254 | var lit, nextLit string |
| 255 | var err error |
| 256 | |
| 257 | tok, _, err = p.scan() |
| 258 | |
| 259 | if err != nil { |
| 260 | return nil, err |
| 261 | } |
| 262 | |
| 263 | if tok != obrace { |
| 264 | p.unscan() |
| 265 | |
| 266 | return Ref("HEAD"), nil |
| 267 | } |
| 268 | |
| 269 | tok, lit, err = p.scan() |
| 270 | |
| 271 | if err != nil { |
| 272 | return nil, err |
| 273 | } |
| 274 | |
| 275 | nextTok, nextLit, err = p.scan() |
| 276 | |
| 277 | if err != nil { |
| 278 | return nil, err |
| 279 | } |
| 280 | |
| 281 | switch { |
| 282 | case tok == word && (lit == "u" || lit == "upstream") && nextTok == cbrace: |
| 283 | return AtUpstream{}, nil |
| 284 | case tok == word && lit == "push" && nextTok == cbrace: |
| 285 | return AtPush{}, nil |
| 286 | case tok == number && nextTok == cbrace: |
| 287 | n, _ := strconv.Atoi(lit) |
| 288 | |
| 289 | return AtReflog{n}, nil |
| 290 | case tok == minus && nextTok == number: |
| 291 | n, _ := strconv.Atoi(nextLit) |
| 292 | |
| 293 | t, _, err := p.scan() |
| 294 | |
| 295 | if err != nil { |
| 296 | return nil, err |
| 297 | } |
| 298 | |
| 299 | if t != cbrace { |
| 300 | return nil, &ErrInvalidRevision{s: `missing "}" in @{-n} structure`} |
| 301 | } |
| 302 | |
| 303 | return AtCheckout{n}, nil |
| 304 | default: |
| 305 | p.unscan() |
| 306 | |
| 307 | date := lit |
| 308 | |
| 309 | for { |