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  }