Merge pull request #3674 from yoctocloud/file_scheme
common/download.go: allow to specify relative path for file scheme
This commit is contained in:
commit
1d31d2d8d4
|
@ -105,21 +105,29 @@ func (d *DownloadClient) Get() (string, error) {
|
||||||
return d.config.TargetPath, nil
|
return d.config.TargetPath, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
url, err := url.Parse(d.config.Url)
|
u, err := url.Parse(d.config.Url)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Printf("Parsed URL: %#v", url)
|
log.Printf("Parsed URL: %#v", u)
|
||||||
|
|
||||||
// Files when we don't copy the file are special cased.
|
// Files when we don't copy the file are special cased.
|
||||||
var f *os.File
|
var f *os.File
|
||||||
var finalPath string
|
var finalPath string
|
||||||
sourcePath := ""
|
sourcePath := ""
|
||||||
if url.Scheme == "file" && !d.config.CopyFile {
|
if u.Scheme == "file" && !d.config.CopyFile {
|
||||||
|
// This is special case for relative path in this case user specify
|
||||||
|
// file:../ and after parse destination goes to Opaque
|
||||||
|
if u.Path != "" {
|
||||||
|
// If url.Path is set just use this
|
||||||
|
finalPath = u.Path
|
||||||
|
} else if u.Opaque != "" {
|
||||||
|
// otherwise try url.Opaque
|
||||||
|
finalPath = u.Opaque
|
||||||
|
}
|
||||||
// This is a special case where we use a source file that already exists
|
// This is a special case where we use a source file that already exists
|
||||||
// locally and we don't make a copy. Normally we would copy or download.
|
// locally and we don't make a copy. Normally we would copy or download.
|
||||||
finalPath = url.Path
|
|
||||||
log.Printf("[DEBUG] Using local file: %s", finalPath)
|
log.Printf("[DEBUG] Using local file: %s", finalPath)
|
||||||
|
|
||||||
// Remove forward slash on absolute Windows file URLs before processing
|
// Remove forward slash on absolute Windows file URLs before processing
|
||||||
|
@ -128,13 +136,16 @@ func (d *DownloadClient) Get() (string, error) {
|
||||||
}
|
}
|
||||||
// Keep track of the source so we can make sure not to delete this later
|
// Keep track of the source so we can make sure not to delete this later
|
||||||
sourcePath = finalPath
|
sourcePath = finalPath
|
||||||
|
if _, err = os.Stat(finalPath); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
finalPath = d.config.TargetPath
|
finalPath = d.config.TargetPath
|
||||||
|
|
||||||
var ok bool
|
var ok bool
|
||||||
d.downloader, ok = d.config.DownloaderMap[url.Scheme]
|
d.downloader, ok = d.config.DownloaderMap[u.Scheme]
|
||||||
if !ok {
|
if !ok {
|
||||||
return "", fmt.Errorf("No downloader for scheme: %s", url.Scheme)
|
return "", fmt.Errorf("No downloader for scheme: %s", u.Scheme)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Otherwise, download using the downloader.
|
// Otherwise, download using the downloader.
|
||||||
|
@ -143,8 +154,8 @@ func (d *DownloadClient) Get() (string, error) {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Printf("[DEBUG] Downloading: %s", url.String())
|
log.Printf("[DEBUG] Downloading: %s", u.String())
|
||||||
err = d.downloader.Download(f, url)
|
err = d.downloader.Download(f, u)
|
||||||
f.Close()
|
f.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
|
|
Loading…
Reference in New Issue