mirror of
https://github.com/minimaxir/big-list-of-naughty-strings.git
synced 2025-10-03 09:01:55 +02:00
Merge branch 'master' into master
This commit is contained in:
@@ -93,7 +93,7 @@
|
|||||||
"!@#$%^&*()`~",
|
"!@#$%^&*()`~",
|
||||||
"\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f",
|
"\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f",
|
||||||
"",
|
"",
|
||||||
"\t\u000b\f
",
|
"\t\u000b\f
",
|
||||||
"",
|
"",
|
||||||
"",
|
"",
|
||||||
"",
|
"",
|
||||||
@@ -132,6 +132,7 @@
|
|||||||
"社會科學院語學研究所",
|
"社會科學院語學研究所",
|
||||||
"울란바토르",
|
"울란바토르",
|
||||||
"𠜎𠜱𠝹𠱓𠱸𠲖𠳏",
|
"𠜎𠜱𠝹𠱓𠱸𠲖𠳏",
|
||||||
|
"𐐜 𐐔𐐇𐐝𐐀𐐡𐐇𐐓 𐐙𐐊𐐡𐐝𐐓/𐐝𐐇𐐗𐐊𐐤𐐔 𐐒𐐋𐐗 𐐒𐐌 𐐜 𐐡𐐀𐐖𐐇𐐤𐐓𐐝 𐐱𐑂 𐑄 𐐔𐐇𐐝𐐀𐐡𐐇𐐓 𐐏𐐆𐐅𐐤𐐆𐐚𐐊𐐡𐐝𐐆𐐓𐐆",
|
||||||
"表ポあA鷗ŒéB逍Üߪąñ丂㐀𠀀",
|
"表ポあA鷗ŒéB逍Üߪąñ丂㐀𠀀",
|
||||||
"Ⱥ",
|
"Ⱥ",
|
||||||
"Ⱦ",
|
"Ⱦ",
|
||||||
@@ -164,7 +165,7 @@
|
|||||||
"הָיְתָהtestالصفحات التّحول",
|
"הָיְתָהtestالصفحات التّحول",
|
||||||
"﷽",
|
"﷽",
|
||||||
"ﷺ",
|
"ﷺ",
|
||||||
"مُنَاقَشَةُ سُبُلِ اِسْتِخْدَامِ اللُّغَةِ فِي النُّظُمِ الْقَائِمَةِ وَفِيم يَخُصَّ التَّطْبِيقَاتُ الْحاسُوبِيَّةُ، ",
|
"مُنَاقَشَةُ سُبُلِ اِسْتِخْدَامِ اللُّغَةِ فِي النُّظُمِ الْقَائِمَةِ وَفِيم يَخُصَّ التَّطْبِيقَاتُ الْحاسُوبِيَّةُ، ",
|
||||||
"test",
|
"test",
|
||||||
"test",
|
"test",
|
||||||
"
test
",
|
"
test
",
|
||||||
@@ -505,3 +506,4 @@
|
|||||||
"జ్ఞా",
|
"జ్ఞా",
|
||||||
"گچپژ"
|
"گچپژ"
|
||||||
]
|
]
|
||||||
|
|
||||||
|
4
blns.txt
4
blns.txt
@@ -194,6 +194,10 @@ INF
|
|||||||
울란바토르
|
울란바토르
|
||||||
𠜎𠜱𠝹𠱓𠱸𠲖𠳏
|
𠜎𠜱𠝹𠱓𠱸𠲖𠳏
|
||||||
|
|
||||||
|
# Strings which contain two-byte letters: can cause issues with naïve UTF-16 capitalizers which think that 16 bits == 1 character
|
||||||
|
|
||||||
|
𐐜 𐐔𐐇𐐝𐐀𐐡𐐇𐐓 𐐙𐐊𐐡𐐝𐐓/𐐝𐐇𐐗𐐊𐐤𐐔 𐐒𐐋𐐗 𐐒𐐌 𐐜 𐐡𐐀𐐖𐐇𐐤𐐓𐐝 𐐱𐑂 𐑄 𐐔𐐇𐐝𐐀𐐡𐐇𐐓 𐐏𐐆𐐅𐐤𐐆𐐚𐐊𐐡𐐝𐐆𐐓𐐆
|
||||||
|
|
||||||
# Special Unicode Characters Union
|
# Special Unicode Characters Union
|
||||||
#
|
#
|
||||||
# A super string recommended by VMware Inc. Globalization Team: can effectively cause rendering issues or character-length issues to validate product globalization readiness.
|
# A super string recommended by VMware Inc. Globalization Team: can effectively cause rendering issues or character-length issues to validate product globalization readiness.
|
||||||
|
@@ -7,42 +7,42 @@
|
|||||||
package internal
|
package internal
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
type asset struct {
|
type asset struct {
|
||||||
bytes []byte
|
bytes []byte
|
||||||
info os.FileInfo
|
info os.FileInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
type bindataFileInfo struct {
|
type bindataFileInfo struct {
|
||||||
name string
|
name string
|
||||||
size int64
|
size int64
|
||||||
mode os.FileMode
|
mode os.FileMode
|
||||||
modTime time.Time
|
modTime time.Time
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fi bindataFileInfo) Name() string {
|
func (fi bindataFileInfo) Name() string {
|
||||||
return fi.name
|
return fi.name
|
||||||
}
|
}
|
||||||
func (fi bindataFileInfo) Size() int64 {
|
func (fi bindataFileInfo) Size() int64 {
|
||||||
return fi.size
|
return fi.size
|
||||||
}
|
}
|
||||||
func (fi bindataFileInfo) Mode() os.FileMode {
|
func (fi bindataFileInfo) Mode() os.FileMode {
|
||||||
return fi.mode
|
return fi.mode
|
||||||
}
|
}
|
||||||
func (fi bindataFileInfo) ModTime() time.Time {
|
func (fi bindataFileInfo) ModTime() time.Time {
|
||||||
return fi.modTime
|
return fi.modTime
|
||||||
}
|
}
|
||||||
func (fi bindataFileInfo) IsDir() bool {
|
func (fi bindataFileInfo) IsDir() bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
func (fi bindataFileInfo) Sys() interface{} {
|
func (fi bindataFileInfo) Sys() interface{} {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var _BlnsBase64Json = []byte(`[
|
var _BlnsBase64Json = []byte(`[
|
||||||
@@ -206,6 +206,7 @@ var _BlnsBase64Json = []byte(`[
|
|||||||
"56S+5pyD56eR5a246Zmi6Kqe5a2456CU56m25omA",
|
"56S+5pyD56eR5a246Zmi6Kqe5a2456CU56m25omA",
|
||||||
"7Jq4656A67CU7Yag66W0",
|
"7Jq4656A67CU7Yag66W0",
|
||||||
"8KCcjvCgnLHwoJ258KCxk/CgsbjwoLKW8KCzjw==",
|
"8KCcjvCgnLHwoJ258KCxk/CgsbjwoLKW8KCzjw==",
|
||||||
|
"6KGo44Od44GCQem3l8WSw6nvvKLpgI3DnMOfwqrEhcOx5LiC45CA8KCAgA==",
|
||||||
"44O94Ly84LqI2YTNnOC6iOC8ve++iSDjg73gvLzguojZhM2c4LqI4Ly9776J",
|
"44O94Ly84LqI2YTNnOC6iOC8ve++iSDjg73gvLzguojZhM2c4LqI4Ly9776J",
|
||||||
"KO+9oeKXlSDiiIAg4peV772hKQ==",
|
"KO+9oeKXlSDiiIAg4peV772hKQ==",
|
||||||
"772A772oKMK04oiA772A4oip",
|
"772A772oKMK04oiA772A4oip",
|
||||||
@@ -717,18 +718,18 @@ var _BlnsBase64Json = []byte(`[
|
|||||||
]`)
|
]`)
|
||||||
|
|
||||||
func BlnsBase64JsonBytes() ([]byte, error) {
|
func BlnsBase64JsonBytes() ([]byte, error) {
|
||||||
return _BlnsBase64Json, nil
|
return _BlnsBase64Json, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func BlnsBase64Json() (*asset, error) {
|
func BlnsBase64Json() (*asset, error) {
|
||||||
bytes, err := BlnsBase64JsonBytes()
|
bytes, err := BlnsBase64JsonBytes()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "../blns.base64.json", size: 33414, mode: os.FileMode(420), modTime: time.Unix(1484832583, 0)}
|
info := bindataFileInfo{name: "../blns.base64.json", size: 34148, mode: os.FileMode(420), modTime: time.Unix(1548804227, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var _BlnsJson = []byte(`[
|
var _BlnsJson = []byte(`[
|
||||||
@@ -827,8 +828,8 @@ var _BlnsJson = []byte(`[
|
|||||||
"\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f",
|
"\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f",
|
||||||
"",
|
"",
|
||||||
"\t\u000b\f
",
|
"\t\u000b\f
",
|
||||||
"",
|
"`+"\xEF\xBB\xBF"+`",
|
||||||
"",
|
"`+"\xEF\xBB\xBF"+`",
|
||||||
"",
|
"",
|
||||||
"Ω≈ç√∫˜µ≤≥÷",
|
"Ω≈ç√∫˜µ≤≥÷",
|
||||||
"åß∂ƒ©˙∆˚¬…æ",
|
"åß∂ƒ©˙∆˚¬…æ",
|
||||||
@@ -865,6 +866,9 @@ var _BlnsJson = []byte(`[
|
|||||||
"社會科學院語學研究所",
|
"社會科學院語學研究所",
|
||||||
"울란바토르",
|
"울란바토르",
|
||||||
"𠜎𠜱𠝹𠱓𠱸𠲖𠳏",
|
"𠜎𠜱𠝹𠱓𠱸𠲖𠳏",
|
||||||
|
"表ポあA鷗ŒéB逍Üߪąñ丂㐀𠀀",
|
||||||
|
"Ⱥ",
|
||||||
|
"Ⱦ",
|
||||||
"ヽ༼ຈل͜ຈ༽ノ ヽ༼ຈل͜ຈ༽ノ",
|
"ヽ༼ຈل͜ຈ༽ノ ヽ༼ຈل͜ຈ༽ノ",
|
||||||
"(。◕ ∀ ◕。)",
|
"(。◕ ∀ ◕。)",
|
||||||
"`ィ(´∀`∩",
|
"`ィ(´∀`∩",
|
||||||
@@ -873,7 +877,7 @@ var _BlnsJson = []byte(`[
|
|||||||
"゚・✿ヾ╲(。◕‿◕。)╱✿・゚",
|
"゚・✿ヾ╲(。◕‿◕。)╱✿・゚",
|
||||||
",。・:*:・゜’( ☻ ω ☻ )。・:*:・゜’",
|
",。・:*:・゜’( ☻ ω ☻ )。・:*:・゜’",
|
||||||
"(╯°□°)╯︵ ┻━┻)",
|
"(╯°□°)╯︵ ┻━┻)",
|
||||||
"(ノಥ益ಥ)ノ ┻━┻",
|
"(ノಥ益ಥ)ノ`+"\xEF\xBB\xBF"+` ┻━┻",
|
||||||
"┬─┬ノ( º _ ºノ)",
|
"┬─┬ノ( º _ ºノ)",
|
||||||
"( ͡° ͜ʖ ͡°)",
|
"( ͡° ͜ʖ ͡°)",
|
||||||
"😍",
|
"😍",
|
||||||
@@ -1177,9 +1181,12 @@ var _BlnsJson = []byte(`[
|
|||||||
"$HOME",
|
"$HOME",
|
||||||
"$ENV{'HOME'}",
|
"$ENV{'HOME'}",
|
||||||
"%d",
|
"%d",
|
||||||
"%s",
|
"%s%s%s%s%s",
|
||||||
"{0}",
|
"{0}",
|
||||||
"%*.*s",
|
"%*.*s",
|
||||||
|
"%@",
|
||||||
|
"%n",
|
||||||
|
"File:///",
|
||||||
"../../../../../../../../../../../etc/passwd%00",
|
"../../../../../../../../../../../etc/passwd%00",
|
||||||
"../../../../../../../../../../../etc/hosts",
|
"../../../../../../../../../../../etc/hosts",
|
||||||
"() { 0; }; touch /tmp/blns.shellshock1.fail;",
|
"() { 0; }; touch /tmp/blns.shellshock1.fail;",
|
||||||
@@ -1227,78 +1234,80 @@ var _BlnsJson = []byte(`[
|
|||||||
"Roses are \u001b[0;31mred\u001b[0m, violets are \u001b[0;34mblue. Hope you enjoy terminal hue",
|
"Roses are \u001b[0;31mred\u001b[0m, violets are \u001b[0;34mblue. Hope you enjoy terminal hue",
|
||||||
"But now...\u001b[20Cfor my greatest trick...\u001b[8m",
|
"But now...\u001b[20Cfor my greatest trick...\u001b[8m",
|
||||||
"The quic\b\b\b\b\b\bk brown fo\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007x... [Beeeep]",
|
"The quic\b\b\b\b\b\bk brown fo\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007x... [Beeeep]",
|
||||||
"Powerلُلُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ冗"
|
"Powerلُلُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ冗",
|
||||||
|
"🏳0🌈️",
|
||||||
|
"జ్ఞా"
|
||||||
]`)
|
]`)
|
||||||
|
|
||||||
func BlnsJsonBytes() ([]byte, error) {
|
func BlnsJsonBytes() ([]byte, error) {
|
||||||
return _BlnsJson, nil
|
return _BlnsJson, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func BlnsJson() (*asset, error) {
|
func BlnsJson() (*asset, error) {
|
||||||
bytes, err := BlnsJsonBytes()
|
bytes, err := BlnsJsonBytes()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
info := bindataFileInfo{name: "../blns.json", size: 22013, mode: os.FileMode(420), modTime: time.Unix(1484832486, 0)}
|
info := bindataFileInfo{name: "../blns.json", size: 26381, mode: os.FileMode(420), modTime: time.Unix(1548804227, 0)}
|
||||||
a := &asset{bytes: bytes, info: info}
|
a := &asset{bytes: bytes, info: info}
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Asset loads and returns the asset for the given name.
|
// Asset loads and returns the asset for the given name.
|
||||||
// It returns an error if the asset could not be found or
|
// It returns an error if the asset could not be found or
|
||||||
// could not be loaded.
|
// could not be loaded.
|
||||||
func Asset(name string) ([]byte, error) {
|
func Asset(name string) ([]byte, error) {
|
||||||
cannonicalName := strings.Replace(name, "\\", "/", -1)
|
cannonicalName := strings.Replace(name, "\\", "/", -1)
|
||||||
if f, ok := _bindata[cannonicalName]; ok {
|
if f, ok := _bindata[cannonicalName]; ok {
|
||||||
a, err := f()
|
a, err := f()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err)
|
return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err)
|
||||||
}
|
}
|
||||||
return a.bytes, nil
|
return a.bytes, nil
|
||||||
}
|
}
|
||||||
return nil, fmt.Errorf("Asset %s not found", name)
|
return nil, fmt.Errorf("Asset %s not found", name)
|
||||||
}
|
}
|
||||||
|
|
||||||
// MustAsset is like Asset but panics when Asset would return an error.
|
// MustAsset is like Asset but panics when Asset would return an error.
|
||||||
// It simplifies safe initialization of global variables.
|
// It simplifies safe initialization of global variables.
|
||||||
func MustAsset(name string) []byte {
|
func MustAsset(name string) []byte {
|
||||||
a, err := Asset(name)
|
a, err := Asset(name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic("asset: Asset(" + name + "): " + err.Error())
|
panic("asset: Asset(" + name + "): " + err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
return a
|
return a
|
||||||
}
|
}
|
||||||
|
|
||||||
// AssetInfo loads and returns the asset info for the given name.
|
// AssetInfo loads and returns the asset info for the given name.
|
||||||
// It returns an error if the asset could not be found or
|
// It returns an error if the asset could not be found or
|
||||||
// could not be loaded.
|
// could not be loaded.
|
||||||
func AssetInfo(name string) (os.FileInfo, error) {
|
func AssetInfo(name string) (os.FileInfo, error) {
|
||||||
cannonicalName := strings.Replace(name, "\\", "/", -1)
|
cannonicalName := strings.Replace(name, "\\", "/", -1)
|
||||||
if f, ok := _bindata[cannonicalName]; ok {
|
if f, ok := _bindata[cannonicalName]; ok {
|
||||||
a, err := f()
|
a, err := f()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err)
|
return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err)
|
||||||
}
|
}
|
||||||
return a.info, nil
|
return a.info, nil
|
||||||
}
|
}
|
||||||
return nil, fmt.Errorf("AssetInfo %s not found", name)
|
return nil, fmt.Errorf("AssetInfo %s not found", name)
|
||||||
}
|
}
|
||||||
|
|
||||||
// AssetNames returns the names of the assets.
|
// AssetNames returns the names of the assets.
|
||||||
func AssetNames() []string {
|
func AssetNames() []string {
|
||||||
names := make([]string, 0, len(_bindata))
|
names := make([]string, 0, len(_bindata))
|
||||||
for name := range _bindata {
|
for name := range _bindata {
|
||||||
names = append(names, name)
|
names = append(names, name)
|
||||||
}
|
}
|
||||||
return names
|
return names
|
||||||
}
|
}
|
||||||
|
|
||||||
// _bindata is a table, holding each asset generator, mapped to its name.
|
// _bindata is a table, holding each asset generator, mapped to its name.
|
||||||
var _bindata = map[string]func() (*asset, error){
|
var _bindata = map[string]func() (*asset, error){
|
||||||
"../blns.base64.json": BlnsBase64Json,
|
"../blns.base64.json": BlnsBase64Json,
|
||||||
"../blns.json": BlnsJson,
|
"../blns.json": BlnsJson,
|
||||||
}
|
}
|
||||||
|
|
||||||
// AssetDir returns the file names below a certain
|
// AssetDir returns the file names below a certain
|
||||||
@@ -1315,81 +1324,82 @@ var _bindata = map[string]func() (*asset, error){
|
|||||||
// AssetDir("foo.txt") and AssetDir("notexist") would return an error
|
// AssetDir("foo.txt") and AssetDir("notexist") would return an error
|
||||||
// AssetDir("") will return []string{"data"}.
|
// AssetDir("") will return []string{"data"}.
|
||||||
func AssetDir(name string) ([]string, error) {
|
func AssetDir(name string) ([]string, error) {
|
||||||
node := _bintree
|
node := _bintree
|
||||||
if len(name) != 0 {
|
if len(name) != 0 {
|
||||||
cannonicalName := strings.Replace(name, "\\", "/", -1)
|
cannonicalName := strings.Replace(name, "\\", "/", -1)
|
||||||
pathList := strings.Split(cannonicalName, "/")
|
pathList := strings.Split(cannonicalName, "/")
|
||||||
for _, p := range pathList {
|
for _, p := range pathList {
|
||||||
node = node.Children[p]
|
node = node.Children[p]
|
||||||
if node == nil {
|
if node == nil {
|
||||||
return nil, fmt.Errorf("Asset %s not found", name)
|
return nil, fmt.Errorf("Asset %s not found", name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if node.Func != nil {
|
if node.Func != nil {
|
||||||
return nil, fmt.Errorf("Asset %s not found", name)
|
return nil, fmt.Errorf("Asset %s not found", name)
|
||||||
}
|
}
|
||||||
rv := make([]string, 0, len(node.Children))
|
rv := make([]string, 0, len(node.Children))
|
||||||
for childName := range node.Children {
|
for childName := range node.Children {
|
||||||
rv = append(rv, childName)
|
rv = append(rv, childName)
|
||||||
}
|
}
|
||||||
return rv, nil
|
return rv, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type bintree struct {
|
type bintree struct {
|
||||||
Func func() (*asset, error)
|
Func func() (*asset, error)
|
||||||
Children map[string]*bintree
|
Children map[string]*bintree
|
||||||
}
|
}
|
||||||
var _bintree = &bintree{nil, map[string]*bintree{
|
var _bintree = &bintree{nil, map[string]*bintree{
|
||||||
"..": &bintree{nil, map[string]*bintree{
|
"..": &bintree{nil, map[string]*bintree{
|
||||||
"blns.base64.json": &bintree{BlnsBase64Json, map[string]*bintree{}},
|
"blns.base64.json": &bintree{BlnsBase64Json, map[string]*bintree{}},
|
||||||
"blns.json": &bintree{BlnsJson, map[string]*bintree{}},
|
"blns.json": &bintree{BlnsJson, map[string]*bintree{}},
|
||||||
}},
|
}},
|
||||||
}}
|
}}
|
||||||
|
|
||||||
// RestoreAsset restores an asset under the given directory
|
// RestoreAsset restores an asset under the given directory
|
||||||
func RestoreAsset(dir, name string) error {
|
func RestoreAsset(dir, name string) error {
|
||||||
data, err := Asset(name)
|
data, err := Asset(name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
info, err := AssetInfo(name)
|
info, err := AssetInfo(name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755))
|
err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode())
|
err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())
|
err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// RestoreAssets restores an asset under the given directory recursively
|
// RestoreAssets restores an asset under the given directory recursively
|
||||||
func RestoreAssets(dir, name string) error {
|
func RestoreAssets(dir, name string) error {
|
||||||
children, err := AssetDir(name)
|
children, err := AssetDir(name)
|
||||||
// File
|
// File
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return RestoreAsset(dir, name)
|
return RestoreAsset(dir, name)
|
||||||
}
|
}
|
||||||
// Dir
|
// Dir
|
||||||
for _, child := range children {
|
for _, child := range children {
|
||||||
err = RestoreAssets(dir, filepath.Join(name, child))
|
err = RestoreAssets(dir, filepath.Join(name, child))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func _filePath(dir, name string) string {
|
func _filePath(dir, name string) string {
|
||||||
cannonicalName := strings.Replace(name, "\\", "/", -1)
|
cannonicalName := strings.Replace(name, "\\", "/", -1)
|
||||||
return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...)
|
return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user