main.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package main
  2. import (
  3. "encoding/csv"
  4. "fmt"
  5. "html/template"
  6. "io"
  7. "os"
  8. )
  9. type redirect struct {
  10. Clean, Target string
  11. }
  12. func main() {
  13. var err error
  14. if len(os.Args) != 4 {
  15. panic(fmt.Errorf(`
  16. Syntax:
  17. %s source destination prefix
  18. Where:
  19. - source URL pairs in TSV format
  20. - destination Apache .htaccess fragment
  21. - prefix Prefix to strip from source URLs in pairs
  22. `, os.Args[0]))
  23. }
  24. source := os.Args[1]
  25. dest := os.Args[2]
  26. prefix := os.Args[3]
  27. fmt.Fprintf(os.Stderr, "Converting %s to %s, stripping %s\n", source, dest, prefix)
  28. var tsv io.ReadCloser
  29. tsv, err = os.Open(source)
  30. if err != nil {
  31. panic(err)
  32. }
  33. defer tsv.Close()
  34. redirects, err := read(tsv, prefix)
  35. if err != nil {
  36. panic(err)
  37. }
  38. hta, err := os.Create(dest)
  39. if err != nil {
  40. panic(err)
  41. }
  42. defer hta.Close()
  43. write(hta, redirects)
  44. }
  45. func read(tsv io.Reader, expectedPrefix string) ([]redirect, error) {
  46. var err error
  47. l := len(expectedPrefix)
  48. r := csv.NewReader(tsv)
  49. r.Comma = '\t'
  50. r.FieldsPerRecord = 2
  51. rows, err := r.ReadAll()
  52. if err != nil {
  53. return nil, err
  54. }
  55. redirects := make([]redirect, len(rows))
  56. for i, rawRow := range rows {
  57. absClean := rawRow[0]
  58. actualPrefix := absClean[0:l]
  59. if actualPrefix != expectedPrefix {
  60. panic(fmt.Errorf("incorrect source prefix: [%s], should be [%s]", actualPrefix, expectedPrefix))
  61. }
  62. clean := absClean[l:]
  63. redirects[i] = redirect{Clean: clean, Target: rawRow[1]}
  64. }
  65. return redirects, nil
  66. }
  67. func write(w io.Writer, redirects []redirect) {
  68. tpl := template.Must(template.ParseFiles(`htaccess_rows.gohtml`))
  69. err := tpl.Execute(w, redirects)
  70. if err != nil {
  71. panic(err)
  72. }
  73. tpl.Execute(os.Stderr, redirects)
  74. }