github.com/qri-io/qri@v0.10.1-0.20220104210721-c771715036cb/base/linkfile/linkfile.go (about) 1 package linkfile 2 3 import ( 4 "fmt" 5 "io" 6 "io/ioutil" 7 "os" 8 "path/filepath" 9 "strings" 10 11 "github.com/qri-io/qri/base/hiddenfile" 12 "github.com/qri-io/qri/dsref" 13 ) 14 15 // RefLinkTextFilename is the filename for a reference linkfile 16 const RefLinkTextFilename = "qri-ref.txt" 17 18 // RefLinkHiddenFilename is the filename for a hidden reference linkfile 19 const RefLinkHiddenFilename = ".qri-ref" 20 21 // Read reads a reference from a linkfile with the given filename 22 func Read(filename string) (dsref.Ref, error) { 23 var ref dsref.Ref 24 data, err := ioutil.ReadFile(filename) 25 if err != nil { 26 return ref, err 27 } 28 return dsref.Parse(strings.TrimSpace(string(data))) 29 } 30 31 // ExistsInDir returns whether a linkfile exists in the directory 32 func ExistsInDir(dir string) bool { 33 if _, err := os.Stat(filepath.Join(dir, RefLinkTextFilename)); err == nil { 34 return true 35 } 36 if _, err := os.Stat(filepath.Join(dir, RefLinkHiddenFilename)); err == nil { 37 return true 38 } 39 return false 40 } 41 42 // WriteTextInDir writes a reference to a visible linkfile in the given directory 43 func WriteTextInDir(dir string, ref dsref.Ref) (string, error) { 44 filename := filepath.Join(dir, RefLinkTextFilename) 45 return filename, ioutil.WriteFile(filename, []byte(refText(ref)), 0644) 46 } 47 48 // WriteHiddenInDir writes a reference to a hidden linkfile in the given directory 49 func WriteHiddenInDir(dir string, ref dsref.Ref) (string, error) { 50 filename := filepath.Join(dir, RefLinkHiddenFilename) 51 return filename, hiddenfile.WriteHiddenFile(filename, refText(ref)) 52 } 53 54 // WriteRef writes a reference to the given io.Writer 55 func WriteRef(w io.Writer, ref dsref.Ref) { 56 w.Write([]byte(refText(ref))) 57 } 58 59 func refText(ref dsref.Ref) string { 60 if ref.Path != "" { 61 return fmt.Sprintf("%s/%s@%s", ref.Username, ref.Name, ref.Path) 62 } 63 return fmt.Sprintf("%s/%s", ref.Username, ref.Name) 64 }