(status int, args []string, lines []string)
| 75 | } |
| 76 | |
| 77 | func (c *sshLockClient) parseListLockResponse(status int, args []string, lines []string) (all []Lock, ours []Lock, theirs []Lock, nextCursor string, message string, err error) { |
| 78 | locks := make(map[string]*lockData) |
| 79 | var last *lockData |
| 80 | if status >= 200 && status <= 299 { |
| 81 | for _, entry := range args { |
| 82 | if strings.HasPrefix(entry, "next-cursor=") { |
| 83 | if len(nextCursor) > 0 { |
| 84 | return nil, nil, nil, "", "", errors.New(tr.Tr.Get("lock response: multiple next-cursor responses")) |
| 85 | } |
| 86 | nextCursor = entry[12:] |
| 87 | } |
| 88 | } |
| 89 | for _, entry := range lines { |
| 90 | values := strings.SplitN(entry, " ", 3) |
| 91 | var cmd string |
| 92 | if len(values) > 0 { |
| 93 | cmd = values[0] |
| 94 | } |
| 95 | if cmd == "lock" { |
| 96 | if len(values) != 2 { |
| 97 | return nil, nil, nil, "", "", errors.New(tr.Tr.Get("lock response: invalid response: %q", entry)) |
| 98 | } else if last != nil && c.lockDataIsIncomplete(last) { |
| 99 | return nil, nil, nil, "", "", errors.New(tr.Tr.Get("lock response: incomplete lock data")) |
| 100 | } |
| 101 | id := values[1] |
| 102 | last = &lockData{who: ownerUnknown} |
| 103 | last.lock.Id = id |
| 104 | locks[id] = last |
| 105 | } else if len(values) != 3 { |
| 106 | return nil, nil, nil, "", "", errors.New(tr.Tr.Get("lock response: invalid response: %q", entry)) |
| 107 | } else if last == nil || last.lock.Id != values[1] { |
| 108 | return nil, nil, nil, "", "", errors.New(tr.Tr.Get("lock response: interspersed response: %q", entry)) |
| 109 | } else { |
| 110 | switch cmd { |
| 111 | case "path": |
| 112 | last.lock.Path = values[2] |
| 113 | case "owner": |
| 114 | last.who = owner(values[2]) |
| 115 | case "ownername": |
| 116 | last.lock.Owner = &User{} |
| 117 | last.lock.Owner.Name = values[2] |
| 118 | case "locked-at": |
| 119 | last.lock.LockedAt, err = time.Parse(time.RFC3339, values[2]) |
| 120 | if err != nil { |
| 121 | return nil, nil, nil, "", "", errors.New(tr.Tr.Get("lock response: invalid locked-at: %s", entry)) |
| 122 | } |
| 123 | } |
| 124 | } |
| 125 | } |
| 126 | if last != nil && c.lockDataIsIncomplete(last) { |
| 127 | return nil, nil, nil, "", "", errors.New(tr.Tr.Get("lock response: incomplete lock data")) |
| 128 | } |
| 129 | for _, lock := range locks { |
| 130 | all = append(all, lock.lock) |
| 131 | if lock.who == ownerOurs { |
| 132 | ours = append(ours, lock.lock) |
| 133 | } else if lock.who == ownerTheirs { |
| 134 | theirs = append(theirs, lock.lock) |
no test coverage detected