gitlab.com/jfprevost/gitlab-runner-notlscheck@v11.11.4+incompatible/helpers/archives/zip_create.go (about)

     1  package archives
     2  
     3  import (
     4  	"archive/zip"
     5  	"io"
     6  	"io/ioutil"
     7  	"os"
     8  	"path/filepath"
     9  
    10  	"github.com/sirupsen/logrus"
    11  )
    12  
    13  func createZipDirectoryEntry(archive *zip.Writer, fh *zip.FileHeader) error {
    14  	fh.Name += "/"
    15  	_, err := archive.CreateHeader(fh)
    16  	return err
    17  }
    18  
    19  func createZipSymlinkEntry(archive *zip.Writer, fh *zip.FileHeader) error {
    20  	fw, err := archive.CreateHeader(fh)
    21  	if err != nil {
    22  		return err
    23  	}
    24  
    25  	link, err := os.Readlink(fh.Name)
    26  	if err != nil {
    27  		return err
    28  	}
    29  
    30  	_, err = io.WriteString(fw, link)
    31  	return err
    32  }
    33  
    34  func createZipFileEntry(archive *zip.Writer, fh *zip.FileHeader) error {
    35  	fh.Method = zip.Deflate
    36  	fw, err := archive.CreateHeader(fh)
    37  	if err != nil {
    38  		return err
    39  	}
    40  
    41  	file, err := os.Open(fh.Name)
    42  	if err != nil {
    43  		return err
    44  	}
    45  
    46  	_, err = io.Copy(fw, file)
    47  	file.Close()
    48  	if err != nil {
    49  		return err
    50  	}
    51  	return nil
    52  }
    53  
    54  func createZipEntry(archive *zip.Writer, fileName string) error {
    55  	fi, err := os.Lstat(fileName)
    56  	if err != nil {
    57  		logrus.Warningln("File ignored:", err)
    58  		return nil
    59  	}
    60  
    61  	fh, err := zip.FileInfoHeader(fi)
    62  	if err != nil {
    63  		return err
    64  	}
    65  	fh.Name = fileName
    66  	fh.Extra = createZipExtra(fi)
    67  
    68  	switch fi.Mode() & os.ModeType {
    69  	case os.ModeDir:
    70  		return createZipDirectoryEntry(archive, fh)
    71  
    72  	case os.ModeSymlink:
    73  		return createZipSymlinkEntry(archive, fh)
    74  
    75  	case os.ModeNamedPipe, os.ModeSocket, os.ModeDevice:
    76  		// Ignore the files that of these types
    77  		logrus.Warningln("File ignored:", fileName)
    78  		return nil
    79  
    80  	default:
    81  		return createZipFileEntry(archive, fh)
    82  	}
    83  }
    84  
    85  func CreateZipArchive(w io.Writer, fileNames []string) error {
    86  	tracker := newPathErrorTracker()
    87  
    88  	archive := zip.NewWriter(w)
    89  	defer archive.Close()
    90  
    91  	for _, fileName := range fileNames {
    92  		if err := errorIfGitDirectory(fileName); tracker.actionable(err) {
    93  			printGitArchiveWarning("archive")
    94  		}
    95  
    96  		err := createZipEntry(archive, fileName)
    97  		if err != nil {
    98  			return err
    99  		}
   100  	}
   101  
   102  	return nil
   103  }
   104  
   105  func CreateZipFile(fileName string, fileNames []string) error {
   106  	// create directories to store archive
   107  	os.MkdirAll(filepath.Dir(fileName), 0700)
   108  
   109  	tempFile, err := ioutil.TempFile(filepath.Dir(fileName), "archive_")
   110  	if err != nil {
   111  		return err
   112  	}
   113  	defer tempFile.Close()
   114  	defer os.Remove(tempFile.Name())
   115  
   116  	logrus.Debugln("Temporary file:", tempFile.Name())
   117  	err = CreateZipArchive(tempFile, fileNames)
   118  	if err != nil {
   119  		return err
   120  	}
   121  	tempFile.Close()
   122  
   123  	err = os.Rename(tempFile.Name(), fileName)
   124  	if err != nil {
   125  		return err
   126  	}
   127  
   128  	return nil
   129  }