ParseYarnLock 解析yarn.lock文件结构
(file *model.File)
| 15 | |
| 16 | // ParseYarnLock 解析yarn.lock文件结构 |
| 17 | func ParseYarnLock(file *model.File) map[string]*YarnLock { |
| 18 | |
| 19 | /* |
| 20 | name@version[, name@version]: |
| 21 | version "xxx" |
| 22 | dependencies: |
| 23 | name "xxx" |
| 24 | name "xxx" |
| 25 | */ |
| 26 | |
| 27 | lock := map[string]*YarnLock{} |
| 28 | |
| 29 | var lastDep *YarnLock |
| 30 | |
| 31 | file.ReadLine(func(line string) { |
| 32 | |
| 33 | if strings.HasPrefix(line, "#") { |
| 34 | return |
| 35 | } |
| 36 | |
| 37 | if !strings.HasPrefix(line, " ") && strings.HasSuffix(line, ":") { |
| 38 | lastDep = &YarnLock{Dependencies: map[string]string{}} |
| 39 | for tag := range strings.SplitSeq(line, ",") { |
| 40 | i := strings.LastIndex(tag, "@") |
| 41 | if i == -1 { |
| 42 | logs.Warnf("parse file %s line: %s fail", file.Relpath(), line) |
| 43 | continue |
| 44 | } |
| 45 | name := strings.Trim(tag[:i], ` ":`) |
| 46 | version := strings.Trim(tag[i+1:], ` ":`) |
| 47 | lastDep.Name = name |
| 48 | lock[npmkey(name, version)] = lastDep |
| 49 | } |
| 50 | return |
| 51 | } |
| 52 | |
| 53 | if strings.HasPrefix(line, " ") { |
| 54 | line = strings.TrimSpace(line) |
| 55 | i := strings.Index(line, " ") |
| 56 | if i == -1 { |
| 57 | return |
| 58 | } |
| 59 | name := strings.Trim(line[:i], `"`) |
| 60 | version := strings.Trim(line[i+1:], `"`) |
| 61 | lastDep.Dependencies[name] = version |
| 62 | return |
| 63 | } |
| 64 | |
| 65 | if strings.HasPrefix(line, " ") { |
| 66 | line = strings.TrimSpace(line) |
| 67 | if !strings.HasPrefix(line, "version") { |
| 68 | return |
| 69 | } |
| 70 | lastDep.Version = strings.Trim(strings.TrimPrefix(line, "version"), `" `) |
| 71 | return |
| 72 | } |
| 73 | |
| 74 | }) |