~fwereade/pyjuju/go-log-type

« back to all changes in this revision

Viewing changes to charm/dir.go

  • Committer: Gustavo Niemeyer
  • Date: 2012-02-10 16:33:57 UTC
  • mfrom: (51.2.11 go-charm-symlinks)
  • Revision ID: gustavo@niemeyer.net-20120210163357-lb2jk8ani7if2h5h
charm: fix symlink and file mode when bundling/expanding

R=fwereade, rog
CC=
https://codereview.appspot.com/5647047

Show diffs side-by-side

added added

removed removed

Lines of Context:
156
156
                relpath += "/"
157
157
                method = zip.Store
158
158
        }
 
159
 
 
160
        mode := fi.Mode()
 
161
        if err := checkFileType(relpath, mode); err != nil {
 
162
                return err
 
163
        }
 
164
        if mode&os.ModeSymlink != 0 {
 
165
                method = zip.Store
 
166
        }
159
167
        if hidden || relpath == "revision" {
160
168
                return nil
161
169
        }
163
171
                Name:   relpath,
164
172
                Method: method,
165
173
        }
166
 
        h.SetMode(fi.Mode())
 
174
 
 
175
        perm := os.FileMode(0644)
 
176
        if mode&os.ModeSymlink != 0 {
 
177
                perm = 0777
 
178
        } else if mode&0100 != 0 {
 
179
                perm = 0755
 
180
        }
 
181
        h.SetMode(mode&^0777 | perm)
 
182
 
167
183
        w, err := zp.CreateHeader(h)
168
184
        if err != nil || fi.IsDir() {
169
185
                return err
170
186
        }
171
 
        data, err := ioutil.ReadFile(path)
172
 
        if err != nil {
173
 
                return err
 
187
        var data []byte
 
188
        if mode&os.ModeSymlink != 0 {
 
189
                target, err := os.Readlink(path)
 
190
                if err != nil {
 
191
                        return err
 
192
                }
 
193
                if err := checkSymlinkTarget(zp.root, relpath, target); err != nil {
 
194
                        return err
 
195
                }
 
196
                data = []byte(target)
 
197
        } else {
 
198
                data, err = ioutil.ReadFile(path)
 
199
                if err != nil {
 
200
                        return err
 
201
                }
174
202
        }
175
203
        _, err = w.Write(data)
176
204
        return err
177
205
}
 
206
 
 
207
func checkFileType(path string, mode os.FileMode) error {
 
208
        e := "file has an unknown type: %q"
 
209
        switch mode & os.ModeType {
 
210
        case os.ModeDir, os.ModeSymlink, 0:
 
211
                return nil
 
212
        case os.ModeNamedPipe:
 
213
                e = "file is a named pipe: %q"
 
214
        case os.ModeSocket:
 
215
                e = "file is a socket: %q"
 
216
        case os.ModeDevice:
 
217
                e = "file is a device: %q"
 
218
        }
 
219
        return fmt.Errorf(e, path)
 
220
}