16
|
1 package main
|
|
2
|
|
3 import (
|
|
4 "fmt"
|
|
5 "flag"
|
|
6 "io/ioutil"
|
|
7 "log"
|
|
8 "os"
|
|
9 "path/filepath"
|
|
10 "regexp"
|
|
11 "sort"
|
|
12 "strings"
|
|
13 )
|
|
14
|
|
15 func main() {
|
|
16 var list = flag.Bool( "l", false, "list db." )
|
|
17 var newest = flag.Bool( "n", false, "only save newest." )
|
|
18 var output = flag.String( "o", "", "output filename." )
|
|
19 var help = flag.Bool( "h", false, "print help." )
|
|
20 flag.Parse()
|
|
21
|
|
22 idxdb := "index.db"
|
|
23
|
|
24 content, err := ioutil.ReadFile( idxdb )
|
|
25 if err != nil {
|
|
26 log.Fatal( err )
|
|
27 }
|
|
28
|
|
29 if *list {
|
|
30 fmt.Printf( "%s", content )
|
|
31 os.Exit( 0 )
|
|
32 }
|
|
33
|
|
34 if *help || flag.NArg()!= 1 {
|
|
35 fmt.Fprintf( os.Stderr, "$ mkidx [20201231]\n" )
|
|
36 flag.PrintDefaults()
|
|
37 os.Exit( 1 )
|
|
38 }
|
|
39
|
|
40 if *output == "" {
|
|
41 *output = idxdb
|
|
42 }
|
|
43
|
|
44 d := flag.Args()[0]
|
|
45 r, err := regexp.Compile( "^20[0-9]{6}$" )
|
|
46 if err != nil {
|
|
47 log.Fatal( err )
|
|
48 }
|
|
49 m := r.FindString( d )
|
|
50 if len( m ) == 0 {
|
|
51 fmt.Fprintf( os.Stderr, "bad directory.\n" )
|
|
52 os.Exit( 1 )
|
|
53 }
|
|
54
|
|
55 var hs []string
|
|
56
|
|
57 fi, _ := os.Stat( d )
|
|
58 if fi.IsDir() {
|
|
59 filepath.Walk( d, func( path string, info os.FileInfo, err error ) error {
|
|
60 if !info.IsDir() && strings.HasSuffix( path, ".tgz" ) {
|
|
61 h := strings.TrimSuffix( path, ".tgz" )[9:]
|
|
62 hs = append( hs, h + ":" + d )
|
|
63 }
|
|
64 return nil
|
|
65 } )
|
|
66 } else {
|
|
67 fmt.Fprintf( os.Stderr, "%s: not directory\n", d )
|
|
68 log.Fatal( err )
|
|
69 }
|
|
70
|
|
71 for _, s := range strings.Split( string( content ), "\n" ) {
|
|
72 hs = append( hs, s )
|
|
73 }
|
|
74
|
|
75 sort.Strings( hs )
|
|
76 var str string
|
|
77
|
|
78 if !*newest {
|
|
79 for _, s := range hs {
|
|
80 str += s + "\n"
|
|
81 }
|
|
82 } else {
|
|
83 seen := make( map[string]int )
|
|
84 for _, s := range hs {
|
|
85 if seen[s] == 0 {
|
|
86 str += s + "\n"
|
|
87 }
|
|
88 seen[s]++
|
|
89 }
|
|
90 }
|
|
91
|
|
92 if err := ioutil.WriteFile( *output, []byte( str ), 0644 ); err !=nil {
|
|
93 log.Fatal( err )
|
|
94 }
|
|
95 }
|
|
96
|