stringutils.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. // Package stringutils provides helper functions for dealing with strings.
  2. package stringutils
  3. import (
  4. "bytes"
  5. "math/rand"
  6. "strings"
  7. "github.com/docker/docker/pkg/random"
  8. )
  9. // GenerateRandomAlphaOnlyString generates an alphabetical random string with length n.
  10. func GenerateRandomAlphaOnlyString(n int) string {
  11. // make a really long string
  12. letters := []byte("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
  13. b := make([]byte, n)
  14. r := rand.New(random.NewSource())
  15. for i := range b {
  16. b[i] = letters[r.Intn(len(letters))]
  17. }
  18. return string(b)
  19. }
  20. // GenerateRandomASCIIString generates an ASCII random stirng with length n.
  21. func GenerateRandomASCIIString(n int) string {
  22. chars := "abcdefghijklmnopqrstuvwxyz" +
  23. "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
  24. "~!@#$%^&*()-_+={}[]\\|<,>.?/\"';:` "
  25. res := make([]byte, n)
  26. for i := 0; i < n; i++ {
  27. res[i] = chars[rand.Intn(len(chars))]
  28. }
  29. return string(res)
  30. }
  31. // Truncate truncates a string to maxlen.
  32. func Truncate(s string, maxlen int) string {
  33. if len(s) <= maxlen {
  34. return s
  35. }
  36. return s[:maxlen]
  37. }
  38. // InSlice tests whether a string is contained in a slice of strings or not.
  39. // Comparison is case insensitive
  40. func InSlice(slice []string, s string) bool {
  41. for _, ss := range slice {
  42. if strings.ToLower(s) == strings.ToLower(ss) {
  43. return true
  44. }
  45. }
  46. return false
  47. }
  48. func quote(word string, buf *bytes.Buffer) {
  49. // Bail out early for "simple" strings
  50. if word != "" && !strings.ContainsAny(word, "\\'\"`${[|&;<>()~*?! \t\n") {
  51. buf.WriteString(word)
  52. return
  53. }
  54. buf.WriteString("'")
  55. for i := 0; i < len(word); i++ {
  56. b := word[i]
  57. if b == '\'' {
  58. // Replace literal ' with a close ', a \', and a open '
  59. buf.WriteString("'\\''")
  60. } else {
  61. buf.WriteByte(b)
  62. }
  63. }
  64. buf.WriteString("'")
  65. }
  66. // ShellQuoteArguments takes a list of strings and escapes them so they will be
  67. // handled right when passed as arguments to an program via a shell
  68. func ShellQuoteArguments(args []string) string {
  69. var buf bytes.Buffer
  70. for i, arg := range args {
  71. if i != 0 {
  72. buf.WriteByte(' ')
  73. }
  74. quote(arg, &buf)
  75. }
  76. return buf.String()
  77. }