github.com/catandhorse/git-lfs@v2.5.2+incompatible/lfs/lfs.go (about)

     1  // Package lfs brings together the core LFS functionality
     2  // NOTE: Subject to change, do not rely on this package from outside git-lfs source
     3  package lfs
     4  
     5  import (
     6  	"fmt"
     7  	"os"
     8  	"sort"
     9  	"strings"
    10  
    11  	"github.com/git-lfs/git-lfs/config"
    12  	"github.com/git-lfs/git-lfs/lfsapi"
    13  	"github.com/git-lfs/git-lfs/tools"
    14  	"github.com/git-lfs/git-lfs/tq"
    15  	"github.com/rubyist/tracerx"
    16  )
    17  
    18  func Environ(cfg *config.Configuration, manifest *tq.Manifest) []string {
    19  	osEnviron := os.Environ()
    20  	env := make([]string, 0, len(osEnviron)+7)
    21  
    22  	api, err := lfsapi.NewClient(cfg)
    23  	if err != nil {
    24  		// TODO(@ttaylorr): don't panic
    25  		panic(err.Error())
    26  	}
    27  
    28  	download := api.Endpoints.AccessFor(api.Endpoints.Endpoint("download", cfg.Remote()).Url)
    29  	upload := api.Endpoints.AccessFor(api.Endpoints.Endpoint("upload", cfg.PushRemote()).Url)
    30  
    31  	dltransfers := manifest.GetDownloadAdapterNames()
    32  	sort.Strings(dltransfers)
    33  	ultransfers := manifest.GetUploadAdapterNames()
    34  	sort.Strings(ultransfers)
    35  
    36  	fetchPruneConfig := NewFetchPruneConfig(cfg.Git)
    37  
    38  	references := strings.Join(cfg.LocalReferenceDirs(), ", ")
    39  
    40  	env = append(env,
    41  		fmt.Sprintf("LocalWorkingDir=%s", cfg.LocalWorkingDir()),
    42  		fmt.Sprintf("LocalGitDir=%s", cfg.LocalGitDir()),
    43  		fmt.Sprintf("LocalGitStorageDir=%s", cfg.LocalGitStorageDir()),
    44  		fmt.Sprintf("LocalMediaDir=%s", cfg.LFSObjectDir()),
    45  		fmt.Sprintf("LocalReferenceDirs=%s", references),
    46  		fmt.Sprintf("TempDir=%s", cfg.TempDir()),
    47  		fmt.Sprintf("ConcurrentTransfers=%d", api.ConcurrentTransfers),
    48  		fmt.Sprintf("TusTransfers=%v", cfg.TusTransfersAllowed()),
    49  		fmt.Sprintf("BasicTransfersOnly=%v", cfg.BasicTransfersOnly()),
    50  		fmt.Sprintf("SkipDownloadErrors=%v", cfg.SkipDownloadErrors()),
    51  		fmt.Sprintf("FetchRecentAlways=%v", fetchPruneConfig.FetchRecentAlways),
    52  		fmt.Sprintf("FetchRecentRefsDays=%d", fetchPruneConfig.FetchRecentRefsDays),
    53  		fmt.Sprintf("FetchRecentCommitsDays=%d", fetchPruneConfig.FetchRecentCommitsDays),
    54  		fmt.Sprintf("FetchRecentRefsIncludeRemotes=%v", fetchPruneConfig.FetchRecentRefsIncludeRemotes),
    55  		fmt.Sprintf("PruneOffsetDays=%d", fetchPruneConfig.PruneOffsetDays),
    56  		fmt.Sprintf("PruneVerifyRemoteAlways=%v", fetchPruneConfig.PruneVerifyRemoteAlways),
    57  		fmt.Sprintf("PruneRemoteName=%s", fetchPruneConfig.PruneRemoteName),
    58  		fmt.Sprintf("LfsStorageDir=%s", cfg.LFSStorageDir()),
    59  		fmt.Sprintf("AccessDownload=%s", download),
    60  		fmt.Sprintf("AccessUpload=%s", upload),
    61  		fmt.Sprintf("DownloadTransfers=%s", strings.Join(dltransfers, ",")),
    62  		fmt.Sprintf("UploadTransfers=%s", strings.Join(ultransfers, ",")),
    63  	)
    64  	if len(cfg.FetchExcludePaths()) > 0 {
    65  		env = append(env, fmt.Sprintf("FetchExclude=%s", strings.Join(cfg.FetchExcludePaths(), ", ")))
    66  	}
    67  	if len(cfg.FetchIncludePaths()) > 0 {
    68  		env = append(env, fmt.Sprintf("FetchInclude=%s", strings.Join(cfg.FetchIncludePaths(), ", ")))
    69  	}
    70  	for _, ext := range cfg.Extensions() {
    71  		env = append(env, fmt.Sprintf("Extension[%d]=%s", ext.Priority, ext.Name))
    72  	}
    73  
    74  	for _, e := range osEnviron {
    75  		if !strings.Contains(strings.SplitN(e, "=", 2)[0], "GIT_") {
    76  			continue
    77  		}
    78  		env = append(env, e)
    79  	}
    80  
    81  	return env
    82  }
    83  
    84  func init() {
    85  	tracerx.DefaultKey = "GIT"
    86  	tracerx.Prefix = "trace git-lfs: "
    87  	if len(os.Getenv("GIT_TRACE")) < 1 {
    88  		if tt := os.Getenv("GIT_TRANSFER_TRACE"); len(tt) > 0 {
    89  			os.Setenv("GIT_TRACE", tt)
    90  		}
    91  	}
    92  }
    93  
    94  const (
    95  	gitExt       = ".git"
    96  	gitPtrPrefix = "gitdir: "
    97  )
    98  
    99  func LinkOrCopyFromReference(cfg *config.Configuration, oid string, size int64) error {
   100  	if cfg.LFSObjectExists(oid, size) {
   101  		return nil
   102  	}
   103  	altMediafiles := cfg.Filesystem().ObjectReferencePaths(oid)
   104  	mediafile, err := cfg.Filesystem().ObjectPath(oid)
   105  	if err != nil {
   106  		return err
   107  	}
   108  	for _, altMediafile := range altMediafiles {
   109  		tracerx.Printf("altMediafile: %s", altMediafile)
   110  		if altMediafile != "" && tools.FileExistsOfSize(altMediafile, size) {
   111  			err = LinkOrCopy(cfg, altMediafile, mediafile)
   112  			if err == nil {
   113  				break
   114  			}
   115  		}
   116  	}
   117  	return err
   118  }