Skip to content

Commit 39f4871

Browse files
committed
Skip uploading for previously uploaded files
Closes #4
1 parent b9f499f commit 39f4871

File tree

1 file changed

+59
-28
lines changed

1 file changed

+59
-28
lines changed

main.go

Lines changed: 59 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,13 @@ import (
1919
"github.com/aws/aws-sdk-go/aws/credentials"
2020
"github.com/aws/aws-sdk-go/aws/endpoints"
2121
"github.com/aws/aws-sdk-go/aws/session"
22+
"github.com/aws/aws-sdk-go/service/s3"
2223
"github.com/aws/aws-sdk-go/service/s3/s3manager"
2324
)
2425

2526
var defaultS3Bucket = "static.buffer.com"
27+
var uploader *s3manager.Uploader
28+
var svc *s3.S3
2629

2730
func fatal(format string, a ...interface{}) {
2831
s := "Error: " + format + "\n"
@@ -76,10 +79,8 @@ func GetFilesFromGlobsList(globList string) ([]string, error) {
7679
return files, nil
7780
}
7881

79-
// GetS3Uploader returns a configured Uploader
80-
func GetS3Uploader() (*s3manager.Uploader, error) {
81-
var uploader *s3manager.Uploader
82-
82+
// SetupS3Uploader configures and assigns the global "uploader" and "svc" variables
83+
func SetupS3Uploader() {
8384
awsAccessKeyID := os.Getenv("AWS_ACCESS_KEY_ID")
8485
awsSecretAccessKey := os.Getenv("AWS_SECRET_ACCESS_KEY")
8586

@@ -89,14 +90,63 @@ func GetS3Uploader() (*s3manager.Uploader, error) {
8990
Credentials: creds,
9091
Region: aws.String(endpoints.UsEast1RegionID),
9192
}))
92-
9393
_, err := creds.Get()
9494
if err != nil {
9595
fatal("failed to load AWS credentials %s", err)
9696
}
9797

9898
uploader = s3manager.NewUploader(sess)
99-
return uploader, nil
99+
svc = s3.New(sess)
100+
}
101+
102+
// HasPreviousUpload performs a HEAD request to check if a file has been uploaded already
103+
func HasPreviousUpload(svc *s3.S3, bucket string, filename string) bool {
104+
req, _ := svc.HeadObjectRequest(&s3.HeadObjectInput{
105+
Bucket: aws.String(bucket),
106+
Key: aws.String(filename),
107+
})
108+
err := req.Send()
109+
if err == nil {
110+
return true
111+
}
112+
return false
113+
}
114+
115+
// GetFileURL returns the final url of the file
116+
func GetFileURL(filename string, bucket string) string {
117+
// the static.buffer.com bucket has a domain alias
118+
if bucket == defaultS3Bucket {
119+
return "https://" + path.Join(bucket, filename)
120+
}
121+
return "https://s3.amazonaws.com" + path.Join("/", filename)
122+
}
123+
124+
// UploadFile ensures a given file is uploaded to the s3 bucket and returns
125+
// the filename
126+
func UploadFile(file *os.File, filename string, bucket string) (fileURL string, err error) {
127+
mimeType := GetFileMimeType(filename)
128+
129+
var action string
130+
if !HasPreviousUpload(svc, bucket, filename) {
131+
_, err := uploader.Upload(&s3manager.UploadInput{
132+
Bucket: aws.String(bucket),
133+
Key: aws.String(filename),
134+
ContentType: aws.String(mimeType),
135+
CacheControl: aws.String("public, max-age=31520626"),
136+
Expires: aws.Time(time.Now().AddDate(10, 0, 0)),
137+
Body: file,
138+
})
139+
if err != nil {
140+
return fileURL, err
141+
}
142+
action = "Uploaded"
143+
} else {
144+
action = "Skipped"
145+
}
146+
147+
fileURL = GetFileURL(filename, bucket)
148+
fmt.Printf("%-10s %s\n", action, fileURL)
149+
return fileURL, nil
100150
}
101151

102152
// VersionAndUploadFiles will verion files and upload them to s3 and return
@@ -108,11 +158,6 @@ func VersionAndUploadFiles(
108158
) (map[string]string, error) {
109159
fileVersions := map[string]string{}
110160

111-
uploader, err := GetS3Uploader()
112-
if err != nil {
113-
return fileVersions, err
114-
}
115-
116161
for _, filename := range filenames {
117162
file, err := os.Open(filename)
118163
if err != nil {
@@ -130,27 +175,12 @@ func VersionAndUploadFiles(
130175
uploadFilename = GetVersionedFilename(filename, checksum)
131176
}
132177
bucketFilename := path.Join(directory, uploadFilename)
133-
mimeType := GetFileMimeType(filename)
134178

135-
result, err := uploader.Upload(&s3manager.UploadInput{
136-
Bucket: aws.String(bucket),
137-
Key: aws.String(bucketFilename),
138-
ContentType: aws.String(mimeType),
139-
CacheControl: aws.String("public, max-age=31520626"),
140-
Expires: aws.Time(time.Now().AddDate(10, 0, 0)),
141-
Body: file,
142-
})
179+
fileURL, err := UploadFile(file, bucketFilename, bucket)
143180
if err != nil {
144181
return fileVersions, err
145182
}
146-
147-
// the static.buffer.com bucket has a domain alias
148-
if bucket == defaultS3Bucket {
149-
fileVersions[filename] = "https://" + path.Join(bucket, bucketFilename)
150-
} else {
151-
fileVersions[filename] = result.Location
152-
}
153-
fmt.Printf("Uploaded %s\n", fileVersions[filename])
183+
fileVersions[filename] = fileURL
154184
}
155185

156186
return fileVersions, nil
@@ -173,6 +203,7 @@ func main() {
173203
}
174204
fmt.Printf("Found %d files to upload and version:\n", len(files))
175205

206+
SetupS3Uploader()
176207
fileVersions, err := VersionAndUploadFiles(*s3Bucket, *directory, files)
177208
if err != nil {
178209
fatal("failed to upload files %s", err)

0 commit comments

Comments
 (0)