2016-11-04 01:16:01 +03:00
// Copyright 2015 The Gogs Authors. All rights reserved.
2020-01-23 02:46:46 +03:00
// Copyright 2020 The Gitea Authors. All rights reserved.
2016-11-04 01:16:01 +03:00
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package git
import (
2020-08-28 09:55:12 +03:00
"context"
2016-11-04 01:16:01 +03:00
"fmt"
2021-06-24 00:12:38 +03:00
"io"
2016-11-04 01:16:01 +03:00
"path/filepath"
"strings"
)
2016-12-22 12:30:52 +03:00
// ArchiveType archive types
2016-11-04 01:16:01 +03:00
type ArchiveType int
const (
2016-12-22 12:30:52 +03:00
// ZIP zip archive type
2016-11-04 01:16:01 +03:00
ZIP ArchiveType = iota + 1
2016-12-22 12:30:52 +03:00
// TARGZ tar gz archive type
2016-11-04 01:16:01 +03:00
TARGZ
2021-08-24 19:47:09 +03:00
// BUNDLE bundle archive type
BUNDLE
2016-11-04 01:16:01 +03:00
)
2020-01-23 02:46:46 +03:00
// String converts an ArchiveType to string
func ( a ArchiveType ) String ( ) string {
switch a {
2016-11-04 01:16:01 +03:00
case ZIP :
2020-01-23 02:46:46 +03:00
return "zip"
2016-11-04 01:16:01 +03:00
case TARGZ :
2020-01-23 02:46:46 +03:00
return "tar.gz"
2021-08-24 19:47:09 +03:00
case BUNDLE :
return "bundle"
2016-11-04 01:16:01 +03:00
}
2020-01-23 02:46:46 +03:00
return "unknown"
}
// CreateArchive create archive content to the target path
2021-06-24 00:12:38 +03:00
func ( repo * Repository ) CreateArchive ( ctx context . Context , format ArchiveType , target io . Writer , usePrefix bool , commitID string ) error {
if format . String ( ) == "unknown" {
return fmt . Errorf ( "unknown format: %v" , format )
2020-01-23 02:46:46 +03:00
}
args := [ ] string {
"archive" ,
}
2021-06-24 00:12:38 +03:00
if usePrefix {
args = append ( args , "--prefix=" + filepath . Base ( strings . TrimSuffix ( repo . Path , ".git" ) ) + "/" )
2020-01-23 02:46:46 +03:00
}
args = append ( args ,
2021-06-24 00:12:38 +03:00
"--format=" + format . String ( ) ,
commitID ,
2020-01-23 02:46:46 +03:00
)
2016-11-04 01:16:01 +03:00
2021-06-24 00:12:38 +03:00
var stderr strings . Builder
2022-04-01 05:55:30 +03:00
err := NewCommand ( ctx , args ... ) . Run ( & RunOpts {
Dir : repo . Path ,
Stdout : target ,
Stderr : & stderr ,
2022-02-11 15:47:22 +03:00
} )
2021-06-24 00:12:38 +03:00
if err != nil {
return ConcatenateError ( err , stderr . String ( ) )
}
return nil
2016-11-04 01:16:01 +03:00
}