@@ -71,15 +71,7 @@ func (ta *TarArchive) Create(sourceDir string) error {
7171
7272 var writer io.Writer = file
7373
74- // Add gzip compression if enabled
75- var gzipWriter * gzip.Writer
76- if ta .Options .Compression {
77- gzipWriter = gzip .NewWriter (writer )
78- writer = gzipWriter
79- defer gzipWriter .Close ()
80- }
81-
82- // Add GPG encryption if enabled
74+ // Add GPG encryption first (outermost layer)
8375 var encryptedWriter io.WriteCloser
8476 if ta .Options .GPGEncrypt && ta .gpg != nil {
8577 encryptedWriter , err = ta .gpg .Encrypt (writer )
@@ -90,6 +82,14 @@ func (ta *TarArchive) Create(sourceDir string) error {
9082 defer encryptedWriter .Close ()
9183 }
9284
85+ // Add gzip compression (middle layer)
86+ var gzipWriter * gzip.Writer
87+ if ta .Options .Compression {
88+ gzipWriter = gzip .NewWriter (writer )
89+ writer = gzipWriter
90+ defer gzipWriter .Close ()
91+ }
92+
9393 tarWriter := tar .NewWriter (writer )
9494 defer tarWriter .Close ()
9595
@@ -191,8 +191,32 @@ func (ta *TarArchive) Extract(destDir string) error {
191191
192192 var reader io.Reader = file
193193
194- // Handle GPG decryption if encrypted
194+ // Check if the file is actually encrypted before trying to decrypt
195+ actuallyEncrypted := false
195196 if ta .Options .GPGEncrypt && ta .gpg != nil {
197+ // Read a small header to check if it's encrypted
198+ header := make ([]byte , 50 )
199+ n , err := file .Read (header )
200+ if err != nil && err != io .EOF {
201+ return fmt .Errorf ("failed to read file header: %w" , err )
202+ }
203+
204+ actuallyEncrypted = ta .gpg .IsEncrypted (header [:n ])
205+
206+ // Reset file position
207+ file .Seek (0 , 0 )
208+
209+ if ta .Options .Verbose {
210+ if actuallyEncrypted {
211+ fmt .Printf ("File is GPG encrypted, decrypting...\n " )
212+ } else {
213+ fmt .Printf ("File is not encrypted despite .gpg extension\n " )
214+ }
215+ }
216+ }
217+
218+ // Handle GPG decryption if actually encrypted
219+ if actuallyEncrypted && ta .gpg != nil {
196220 decryptedReader , err := ta .gpg .Decrypt (reader )
197221 if err != nil {
198222 return fmt .Errorf ("failed to decrypt archive: %w" , err )
@@ -372,12 +396,12 @@ func IsTarFile(path string) bool {
372396// ParseTarOptions determines TAR options from file extension
373397func ParseTarOptions (path string ) TarOptions {
374398 path = strings .ToLower (path )
375-
399+
376400 options := TarOptions {
377401 Compression : strings .Contains (path , ".gz" ) || strings .Contains (path , ".tgz" ),
378402 GPGEncrypt : strings .HasSuffix (path , ".gpg" ),
379403 GPGSign : false , // This should be set explicitly by user
380404 }
381405
382406 return options
383- }
407+ }
0 commit comments