Skip to content

Commit

Permalink
modify MergePubfiles
Browse files Browse the repository at this point in the history
  • Loading branch information
tsingbx committed Feb 24, 2025
1 parent d92b035 commit 6fe72b0
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 58 deletions.
8 changes: 4 additions & 4 deletions chore/genpub/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ func main() {

genpub := func(do bool, args ...string) {
fs := flagsetMap[genpubCommand]
pR := flag.Bool("r", false, "true if generate .pub recursively")
pR := fs.Bool("r", false, "true if generate .pub recursively")
if err := fs.Parse(args); err != nil {
log.Printf("error: %s", err)
return
Expand All @@ -122,16 +122,16 @@ func main() {
} else {
fmt.Println("starting generate .pub files recursively for working dir")
}
pub.DoDirRecursively(dir, func(d string) {
pub.WriteDir(d)
pub.DoDirRecursively(dir, func(pubFile string) {
pub.WritePubfile(pubFile)
})
} else {
if dir != "." {
fmt.Printf("starting generate .pub file for %s\n", dir)
} else {
fmt.Println("starting generate .pub file for working dir")
}
pub.WriteDir(dir)
pub.WritePubfile(pub.PubFilenameForDir(dir))
}
}

Expand Down
144 changes: 90 additions & 54 deletions chore/genpub/pub/pub.go
Original file line number Diff line number Diff line change
Expand Up @@ -108,8 +108,9 @@ func (p *PubWriter) WriteFile(file *ast.File) {
}
}

func doWriteDir(w io.Writer, dir string) {
func doWritePubfile(w io.Writer, pubfile string) {
fset := token.NewFileSet()
dir := filepath.Dir(pubfile)
pkgMap, err := parser.ParseDir(fset, dir, func(fi fs.FileInfo) bool {
return !strings.HasPrefix(fi.Name(), "_") &&
!strings.HasPrefix(fi.Name(), ".") &&
Expand Down Expand Up @@ -162,32 +163,24 @@ func GenDirs(quit <-chan int, dir string) <-chan string {
return dirs
}

func WriteDir(dir string) {
fmt.Println("start handle =>", dir)
path := PubFilenameForDir(dir)
if len(path) <= 0 {
panic("fatal error")
}
_, err := os.Stat(dir)
if err != nil {
panic(err)
}
f, err := os.Create(path)
func WritePubfile(pubFile string) {
fmt.Println("start handle =>", pubFile)
f, err := os.Create(pubFile)
if err != nil {
panic(err)
}
defer f.Close()
w := bufio.NewWriter(f)
defer func() {
if w.Buffered() <= 0 {
fmt.Println("write empty file for", dir+",", "remove it")
os.Remove(path)
fmt.Println("write empty file for", pubFile, "remove it")
os.Remove(pubFile)
} else {
w.Flush()
}
fmt.Println("handle finished =>", dir)
fmt.Println("handle finished =>", pubFile)
}()
doWriteDir(w, dir)
doWritePubfile(w, pubFile)
}

func PubFilenameForDir(dir string) string {
Expand All @@ -204,70 +197,113 @@ func PubFilenameForDir(dir string) string {
return filepath.Join(path, file+".pub")
}

func DoDirRecursively(dir string, fn func(d string)) {
func DoDirRecursively(dir string, fn func(pubFile string)) {
quit := make(chan int)
defer close(quit)
dirs := GenDirs(quit, dir)
pubFiles := GenPubFiles(quit, dirs)
wg := sync.WaitGroup{}
for d := range dirs {
for pubFile := range pubFiles {
wg.Add(1)
go func(path string) {
go func(pub string) {
defer wg.Done()
fn(path)
}(d)
fn(pub)
}(pubFile)
}
wg.Wait()
}

func CleanPubfile(dir string) {
pubfile := PubFilenameForDir(dir)
_, err := os.Stat(pubfile)
func CleanPubfile(pubFile string) {
_, err := os.Stat(pubFile)
if !os.IsNotExist(err) {
err = os.Remove(pubfile)
err = os.Remove(pubFile)
if err != nil {
log.Panicln(err)
log.Println(err)
} else {
fmt.Println("remove", pubfile, "successfully")
fmt.Println("remove", pubFile, "successfully")
}
}
}

func CleanPubfileRecursively(dir string) {
DoDirRecursively(dir, func(d string) {
CleanPubfile(d)
DoDirRecursively(dir, func(pubFile string) {
CleanPubfile(pubFile)
})
}

func MergePubfiles(llcppgPubFileName string, dir string) {
f, err := os.Create(llcppgPubFileName)
if err != nil {
panic(err)
}
defer f.Close()
w := bufio.NewWriter(f)
defer func() {
if w.Buffered() > 0 {
w.Flush()
} else {
fmt.Println("no pub files to merge! remove it!")
os.Remove(llcppgPubFileName)
func GenPubFiles(quit chan int, dirs <-chan string) <-chan string {
output := make(chan string)
go func() {
defer close(output)
var moreData bool = true
var dir string
for moreData {
select {
case dir, moreData = <-dirs:
if moreData {
pubfile := PubFilenameForDir(dir)
output <- pubfile
}
case <-quit:
return
}
}
}()
return output
}

func ReadPubFiles(quit chan int, files <-chan string) <-chan []byte {
output := make(chan []byte)
go func() {
defer close(output)
var file string
var moreData bool = true
for moreData {
select {
case file, moreData = <-files:
if moreData {
b, err := os.ReadFile(file)
if err == nil {
output <- b
} else {
log.Println(err)
}
}
case <-quit:
return
}
}
}()
return output
}

func MergePubfiles(llcppgPubFileName string, dir string) {
quit := make(chan int)
defer close(quit)
dirs := GenDirs(quit, dir)
for d := range dirs {
pubfile := PubFilenameForDir(d)
_, err := os.Stat(pubfile)
if !os.IsNotExist(err) {
b, err := os.ReadFile(pubfile)
if err != nil {
panic(err)
}
_, err = w.Write(b)
if err != nil {
panic(err)
pubFiles := GenPubFiles(quit, dirs)
pubFileBytes := ReadPubFiles(quit, pubFiles)
wg := sync.WaitGroup{}
wg.Add(1)
go func(fileName string, input <-chan []byte) {
defer wg.Done()
f, err := os.Create(fileName)
if err != nil {
panic(err)
}
defer f.Close()
w := bufio.NewWriter(f)
defer func() {
if w.Buffered() > 0 {
w.Flush()
} else {
fmt.Println("no pub files to merge! remove it!")
os.Remove(fileName)
}
}()
for b := range input {
w.Write(b)
}
}
}(llcppgPubFileName, pubFileBytes)
wg.Wait()
}

0 comments on commit 6fe72b0

Please sign in to comment.