// Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Sortac sorts the AUTHORS and CONTRIBUTORS files. // // Usage: // // sortac [file...] // // Sortac sorts the named files in place. // If given no arguments, it sorts standard input to standard output. package main import ( "bufio" "bytes" "flag" "fmt" "io" "io/ioutil" "log" "os" "golang.org/x/text/collate" "golang.org/x/text/language" ) func main() { log.SetFlags(0) log.SetPrefix("sortac: ") flag.Parse() args := flag.Args() if len(args) == 0 { os.Stdout.Write(sortAC(os.Stdin)) } else { for _, arg := range args { f, err := os.Open(arg) if err != nil { log.Fatal(err) } sorted := sortAC(f) f.Close() if err := ioutil.WriteFile(arg, sorted, 0644); err != nil { log.Fatal(err) } } } } func sortAC(r io.Reader) []byte { bs := bufio.NewScanner(r) var header []string var lines []string for bs.Scan() { t := bs.Text() lines = append(lines, t) if t == "# Please keep the list sorted." { header = lines lines = nil continue } } if err := bs.Err(); err != nil { log.Fatal(err) } var out bytes.Buffer c := collate.New(language.Und, collate.Loose) c.SortStrings(lines) for _, l := range header { fmt.Fprintln(&out, l) } for _, l := range lines { fmt.Fprintln(&out, l) } return out.Bytes() }