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 }