59
60
output := make([]*LsObject, len(paths))
61
for i, fpath := range paths {
62
- dagnode, err := core.Resolve(req.Context().Context, node, path.Path(fpath))
62
+ ctx := req.Context().Context
63
+ merkleNode, err := core.Resolve(ctx, node, path.Path(fpath))
64
if err != nil {
65
res.SetError(err, cmds.ErrNormal)
66
return
67
}
68
68
- output[i] = &LsObject{
69
- Argument: fpath,
70
- Links: make([]LsLink, len(dagnode.Links)),
69
+ unixFSNode, err := unixfs.FromBytes(merkleNode.Data)
70
+ if err != nil {
71
+ res.SetError(err, cmds.ErrNormal)
72
+ return
73
}
72
- for j, link := range dagnode.Links {
73
- ctx, cancel := context.WithTimeout(context.TODO(), time.Minute)
74
- defer cancel()
75
- link.Node, err = link.GetNode(ctx, node.DAG)
76
- if err != nil {
77
- res.SetError(err, cmds.ErrNormal)
78
- return
79
- }
80
- d, err := unixfs.FromBytes(link.Node.Data)
74
+
75
+ output[i] = &LsObject{}
76
+
77
+ t := unixFSNode.GetType()
78
+ switch t {
79
+ default:
80
+ res.SetError(fmt.Errorf("unrecognized type: %s", t), cmds.ErrImplementation)
81
+ return
82
+ case unixfspb.Data_File:
83
+ key, err := merkleNode.Key()
84
if err != nil {
85
res.SetError(err, cmds.ErrNormal)
86
return
87
}
85
- lsLink := LsLink{
86
- Name: link.Name,
87
- Hash: link.Hash.B58String(),
88
- Type: d.GetType(),
88
+ output[i].Links = []LsLink{LsLink{
89
+ Name: fpath,
90
+ Hash: key.String(),
91
+ Type: t,
92
+ Size: unixFSNode.GetFilesize(),
93
+ }}
94
+ case unixfspb.Data_Directory:
95
+ output[i].Argument = fpath
96
+ output[i].Links = make([]LsLink, len(merkleNode.Links))
97
+ for j, link := range merkleNode.Links {
98
+ getCtx, cancel := context.WithTimeout(context.TODO(), time.Minute)
99
+ defer cancel()
100
+ link.Node, err = link.GetNode(getCtx, node.DAG)
101
+ if err != nil {
102
+ res.SetError(err, cmds.ErrNormal)
103
+ return
104
+ }
105
+ d, err := unixfs.FromBytes(link.Node.Data)
106
+ if err != nil {
107
+ res.SetError(err, cmds.ErrNormal)
108
+ return
109
+ }
110
+ lsLink := LsLink{
111
+ Name: link.Name,
112
+ Hash: link.Hash.B58String(),
113
+ Type: d.GetType(),
114
+ }
115
+ if lsLink.Type == unixfspb.Data_File {
116
+ lsLink.Size = d.GetFilesize()
117
+ } else {
118
+ lsLink.Size = link.Size
119
+ }
120
+ output[i].Links[j] = lsLink
121
}
90
- if lsLink.Type == unixfspb.Data_File {
91
- lsLink.Size = d.GetFilesize()
92
- } else {
93
- lsLink.Size = link.Size
94
- }
95
- output[i].Links[j] = lsLink
122
}
123
}
124
130
output := res.Output().(*LsOutput)
131
buf := new(bytes.Buffer)
132
w := tabwriter.NewWriter(buf, 1, 2, 1, ' ', 0)
107
- for _, object := range output.Objects {
108
- if len(output.Objects) > 1 {
133
+ lastObjectDirHeader := false
134
+ for i, object := range output.Objects {
135
+ if len(output.Objects) > 1 && object.Argument != "" {
136
+ if i > 0 {
137
+ fmt.Fprintln(w)
138
+ }
139
fmt.Fprintf(w, "%s:\n", object.Argument)
140
+ lastObjectDirHeader = true
141
+ } else {
142
+ if lastObjectDirHeader {
143
+ fmt.Fprintln(w)
144
+ }
145
+ lastObjectDirHeader = false
146
}
147
for _, link := range object.Links {
148
fmt.Fprintf(w, "%s\n", link.Name)
149
}
114
- if len(output.Objects) > 1 {
115
- fmt.Fprintln(w)
116
- }
150
}
151
w.Flush()
152