PackageManager just because
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

214 lines
3.0 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. package Filesystem
  2. import (
  3. "bytes"
  4. "crypto/sha1"
  5. "encoding/gob"
  6. "encoding/hex"
  7. "errors"
  8. "fmt"
  9. "hash"
  10. "io"
  11. "os"
  12. "path/filepath"
  13. )
  14. var (
  15. // TODO: Where do I put this
  16. Data string
  17. )
  18. type Package struct {
  19. Name string
  20. Version string
  21. }
  22. type FileObject struct {
  23. FileMode os.FileMode
  24. Size int64
  25. Package Package
  26. Ref string
  27. Sha1 []byte
  28. }
  29. type ByName []Package
  30. func (f FileObject) IsLink() bool {
  31. return f.FileMode&os.ModeSymlink != 0
  32. }
  33. func (f FileObject) objFile() string {
  34. return filepath.Join(f.objDir(), hex.EncodeToString(f.Sha1))
  35. }
  36. func (f FileObject) objDir() string {
  37. return filepath.Join(Data, hex.EncodeToString(f.Sha1[:2]))
  38. }
  39. func (f FileObject) Reset(dst string) error {
  40. var e error
  41. if f.IsLink() {
  42. _, e = os.Lstat(dst)
  43. if !os.IsNotExist(e) {
  44. e = os.Remove(dst)
  45. if e != nil {
  46. return e
  47. }
  48. }
  49. e = os.Symlink(f.Ref, dst)
  50. if e != nil {
  51. return e
  52. }
  53. return nil
  54. }
  55. f.cp(f.objFile(), dst)
  56. e = os.Chmod(dst, f.FileMode)
  57. if e != nil {
  58. return e
  59. }
  60. return nil
  61. }
  62. func (f FileObject) Stov(src string) error {
  63. var e error
  64. if f.IsLink() {
  65. return nil
  66. }
  67. e = os.MkdirAll(f.objDir(), 0744)
  68. if e != nil {
  69. return e
  70. }
  71. f.cp(src, f.objFile())
  72. return nil
  73. }
  74. func (f FileObject) cp(src string, dst string) error {
  75. var (
  76. srcFile, dstFile *os.File
  77. e error
  78. )
  79. fmt.Println("cp ", src, dst)
  80. srcFile, e = os.Open(src)
  81. if e != nil {
  82. return e
  83. }
  84. defer srcFile.Close()
  85. dstFile, e = os.Create(dst)
  86. if e != nil {
  87. return e
  88. }
  89. defer dstFile.Close()
  90. _, e = io.Copy(dstFile, srcFile)
  91. if e != nil {
  92. return e
  93. }
  94. return dstFile.Sync()
  95. }
  96. func (f FileObject) IsDifferent(fn FileObject) error {
  97. if f.FileMode != fn.FileMode {
  98. return errors.New("Mode does not match")
  99. }
  100. if f.IsLink() {
  101. if f.Ref != fn.Ref {
  102. return errors.New("Ref does not match")
  103. }
  104. return nil
  105. }
  106. if f.Size != fn.Size {
  107. return errors.New("Size does not match")
  108. }
  109. if bytes.Compare(f.Sha1, fn.Sha1) != 0 {
  110. return errors.New("Sha1 does not match")
  111. }
  112. return nil
  113. }
  114. func CreateFileObject(f string) (FileObject, error) {
  115. var (
  116. sha1Hash hash.Hash = sha1.New()
  117. fo FileObject
  118. fi os.FileInfo
  119. file *os.File
  120. e error
  121. )
  122. fi, e = os.Lstat(f)
  123. if e != nil {
  124. return fo, e
  125. }
  126. fo = FileObject{
  127. FileMode: fi.Mode(),
  128. Size: fi.Size(),
  129. }
  130. if fo.IsLink() {
  131. fo.Ref, e = os.Readlink(f)
  132. if e != nil {
  133. return fo, e
  134. }
  135. return fo, nil
  136. }
  137. file, e = os.Open(f)
  138. if e != nil {
  139. return fo, e
  140. }
  141. defer file.Close()
  142. io.Copy(sha1Hash, file)
  143. fo.Sha1 = sha1Hash.Sum(nil)
  144. return fo, nil
  145. }
  146. func (f FileObject) ToBytes() ([]byte, error) {
  147. var (
  148. encoder *gob.Encoder
  149. buf bytes.Buffer
  150. e error
  151. )
  152. encoder = gob.NewEncoder(&buf)
  153. e = encoder.Encode(f)
  154. return buf.Bytes(), e
  155. }
  156. func FromBytes(v []byte) (FileObject, error) {
  157. var (
  158. buf *bytes.Buffer
  159. decoder *gob.Decoder
  160. fo FileObject
  161. e error
  162. )
  163. buf = bytes.NewBuffer(v)
  164. decoder = gob.NewDecoder(buf)
  165. e = decoder.Decode(&fo)
  166. if e != nil {
  167. return fo, e
  168. }
  169. return fo, nil
  170. }