(v string)
| 75 | } |
| 76 | |
| 77 | func semParse(v string) (p parsed, ok bool) { |
| 78 | if v == "" || v[0] != 'v' { |
| 79 | p.err = "missing v prefix" |
| 80 | return |
| 81 | } |
| 82 | p.major, v, ok = parseInt(v[1:]) |
| 83 | if !ok { |
| 84 | p.err = "bad major version" |
| 85 | return |
| 86 | } |
| 87 | if v == "" { |
| 88 | p.minor = "0" |
| 89 | p.patch = "0" |
| 90 | p.short = ".0.0" |
| 91 | return |
| 92 | } |
| 93 | if v[0] != '.' { |
| 94 | p.err = "bad minor prefix" |
| 95 | ok = false |
| 96 | return |
| 97 | } |
| 98 | p.minor, v, ok = parseInt(v[1:]) |
| 99 | if !ok { |
| 100 | p.err = "bad minor version" |
| 101 | return |
| 102 | } |
| 103 | if v == "" { |
| 104 | p.patch = "0" |
| 105 | p.short = ".0" |
| 106 | return |
| 107 | } |
| 108 | if v[0] != '.' { |
| 109 | p.err = "bad patch prefix" |
| 110 | ok = false |
| 111 | return |
| 112 | } |
| 113 | p.patch, v, ok = parseInt(v[1:]) |
| 114 | if !ok { |
| 115 | p.err = "bad patch version" |
| 116 | return |
| 117 | } |
| 118 | if len(v) > 0 && v[0] == '-' { |
| 119 | p.prerelease, v, ok = parsePrerelease(v) |
| 120 | if !ok { |
| 121 | p.err = "bad prerelease" |
| 122 | return |
| 123 | } |
| 124 | } |
| 125 | if len(v) > 0 && v[0] == '+' { |
| 126 | p.build, v, ok = parseBuild(v) |
| 127 | if !ok { |
| 128 | p.err = "bad build" |
| 129 | return |
| 130 | } |
| 131 | } |
| 132 | if v != "" { |
| 133 | p.err = "junk on end" |
| 134 | ok = false |
no test coverage detected