package.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. package file
  2. import (
  3. "bufio"
  4. "fmt"
  5. "io"
  6. "os"
  7. "path/filepath"
  8. "strings"
  9. )
  10. func NewTemplate(dir, old, new string) error {
  11. return ReplacePackage(dir, old, new, []string{"vendor", ".git", ".idea"})
  12. }
  13. func ReplacePackageV2(dir string, old []string, ignoreFile []string) error {
  14. if old == nil || len(old) == 0 {
  15. return nil
  16. }
  17. files, err := GetAllFiles(dir, func(fileName string) bool {
  18. var pass = true
  19. if ignoreFile == nil || len(ignoreFile) == 0 {
  20. return true
  21. }
  22. for _, elem := range ignoreFile {
  23. if strings.Contains(fileName, elem) {
  24. pass = false
  25. break
  26. }
  27. }
  28. return pass
  29. })
  30. if err != nil {
  31. return err
  32. }
  33. for _, file := range files {
  34. err := ModifyFileV2(old, file)
  35. if err != nil {
  36. return err
  37. }
  38. }
  39. return nil
  40. }
  41. func ReplacePackage(dir, old, new string, ignoreFile []string) error {
  42. files, err := GetAllFiles(dir, func(fileName string) bool {
  43. var pass = true
  44. if ignoreFile == nil || len(ignoreFile) == 0 {
  45. return true
  46. }
  47. for _, elem := range ignoreFile {
  48. if strings.Contains(fileName, elem) {
  49. pass = false
  50. break
  51. }
  52. }
  53. return pass
  54. })
  55. if err != nil {
  56. return err
  57. }
  58. for _, file := range files {
  59. err := ModifyFile(old, new, file)
  60. if err != nil {
  61. return err
  62. }
  63. }
  64. return nil
  65. }
  66. type FilterFile func(fileName string) bool
  67. func GetAllFiles(dirPth string, filter FilterFile) ([]string, error) {
  68. files := make([]string, 0)
  69. err := filepath.Walk(dirPth, func(path string, info os.FileInfo, err error) error {
  70. if info.IsDir() {
  71. return nil
  72. }
  73. if filter(path) {
  74. files = append(files, path)
  75. }
  76. return nil
  77. })
  78. if err != nil {
  79. return nil, err
  80. }
  81. return files, nil
  82. }
  83. func ModifyFile(old, new string, fileName string) error {
  84. rfile, err := os.OpenFile(fileName, os.O_RDONLY, os.ModePerm)
  85. if err != nil {
  86. return err
  87. }
  88. defer rfile.Close()
  89. reader := bufio.NewReader(rfile)
  90. fileLine := make([]string, 0)
  91. count := 0
  92. for {
  93. lines, isEOF, err := reader.ReadLine()
  94. if err != nil {
  95. if err == io.EOF {
  96. break
  97. }
  98. return err
  99. }
  100. if isEOF {
  101. break
  102. }
  103. line := string(lines)
  104. if strings.Contains(line, old) {
  105. count++
  106. fileLine = append(fileLine, strings.ReplaceAll(string(lines), old, new))
  107. } else {
  108. fileLine = append(fileLine, line)
  109. }
  110. }
  111. if count == 0 {
  112. return nil
  113. }
  114. wfile, err := os.OpenFile(fileName, os.O_WRONLY|os.O_TRUNC, os.ModePerm)
  115. if err != nil {
  116. return err
  117. }
  118. defer wfile.Close()
  119. for _, elem := range fileLine {
  120. _, err := fmt.Fprintln(wfile, elem)
  121. if err != nil {
  122. return err
  123. }
  124. }
  125. fmt.Printf("change success : %s\n", fileName)
  126. return nil
  127. }
  128. func ModifyFileV2(old []string, fileName string) error {
  129. rfile, err := os.OpenFile(fileName, os.O_RDONLY, os.ModePerm)
  130. if err != nil {
  131. return err
  132. }
  133. defer rfile.Close()
  134. reader := bufio.NewReader(rfile)
  135. fileLine := make([]string, 0)
  136. count := 0
  137. for {
  138. lines, isEOF, err := reader.ReadLine()
  139. if err != nil {
  140. if strings.Compare(err.Error(), "EOF") == 0 {
  141. break
  142. }
  143. return err
  144. }
  145. if isEOF {
  146. break
  147. }
  148. line := string(lines)
  149. for _, elem := range old {
  150. if strings.Contains(line, elem) {
  151. count++
  152. rep := make([]byte, len(elem))
  153. for i, _ := range rep {
  154. rep[i] = '*'
  155. }
  156. fileLine = append(fileLine, strings.ReplaceAll(string(lines), elem, string(rep)))
  157. break
  158. } else {
  159. fileLine = append(fileLine, line)
  160. break
  161. }
  162. }
  163. }
  164. if count == 0 {
  165. return nil
  166. }
  167. wfile, err := os.OpenFile(fileName, os.O_WRONLY|os.O_TRUNC, os.ModePerm)
  168. if err != nil {
  169. return err
  170. }
  171. defer wfile.Close()
  172. for _, elem := range fileLine {
  173. _, err := fmt.Fprintln(wfile, elem)
  174. if err != nil {
  175. return err
  176. }
  177. }
  178. fmt.Printf("replace %s success!!!\n", fileName)
  179. return nil
  180. }