1//go:build test_sha25623package git45import (6 "bytes"7 "context"8 "fmt"9 stdlog "log"10 "os"11)1213var (14 testrepoMarks = map[int64]Oid{15 // Commits, generated by `git rev-list --all | tac`16 1: MustIDFromString("31a3d8bb18edda3252f7242035d4695ee9b8ddbd47d7c62f656756442c2e85af"),17 2: MustIDFromString("a1a482f1f2fa00c70e892a0ecc49c0ef0295eb7f6bf96b51a7dd32e40c54e92e"),18 3: MustIDFromString("8573f82fa6f1b1f3a74bd5df5a7e68db9477911cda33dc624cfd07cecccf6fe2"),19 4: MustIDFromString("c41b25357f8e259ba78791a01a2dce80a677061d7474e7c35ff290d4527d9a49"),20 5: MustIDFromString("5402a2cd6d628b46225e4fa5be0d854711472237d121ead1581fca4b3c8d0633"),21 6: MustIDFromString("44f45f65f43901e58282d2861eb4661e1fa8f33ef156e0e340a599c306d73828"),22 7: MustIDFromString("8e892031b84c4bf15314c3f7173549e0874442db76f429568f1fa55b49a1cfc0"),23 8: MustIDFromString("a3e5aa80d28fae8260994aba69cb80ad442fdcb3b3971307b3383f92f81842a5"),24 9: MustIDFromString("f812c295641e30395a5e02b05bbd18763335bd8867f5e7bdcf5510dbd6144b75"),25 10: MustIDFromString("a0e41bd21586bc939b7d7400c2066bb627fca7a2cbbe17a167ed03db1a9182bc"),26 11: MustIDFromString("206a8d713b97b4695e4f23e5660fd37b87d33c952965111e42f077cb44dbda93"),27 12: MustIDFromString("701cdc22435b22d31974188a4ba4a3f42746f57e7564761a98a65ff4de67f9b0"),28 13: MustIDFromString("8e32744b5ec628e9397d39fef23ed89b6465042945630e352028063307813725"),29 14: MustIDFromString("74f4d668782edc5276954505f6d2a954eda5b61dde2395d387e2a025ac070e88"),30 15: MustIDFromString("6a652d215eb60f2b319da986145810246a4fb4ff903cfc66710aeb66ae9c2a79"),31 16: MustIDFromString("772c8079c93111471b91b01ac22626677d1baefdc83c9646f1f482d149316edd"),32 17: MustIDFromString("74fec01c00c1863972cb13bfa3ed2acf8d46ded93fb97ac7290df68bd0198864"),33 18: MustIDFromString("d925b2b2d0778452a00c3d1d5b94a7cc3b2c540dc87219cfe5b292ea3877ed8f"),34 19: MustIDFromString("ff7369e546af022289c553b7c825c6934a4b6aa8d44d5d2408e8bba44725527b"),35 20: MustIDFromString("7a7e4c3508b5723d61b982e049655eca96350e1df1c5efe04a8caf6a50c0ecd0"),36 21: MustIDFromString("716c81cf2828bc20c3ae95ce73bbb978c503c400939800adf432efcea221b7cb"),37 22: MustIDFromString("1eb65ce7570a6249d955c477ccdcd1e8142d3e8696f2268a65c5aafafe2d7708"),38 23: MustIDFromString("629328565e5fa5ff0e5cd6e1d62d68f068cacfdca5a1cf6d957abbcc40e68c5f"),39 24: MustIDFromString("cda497d4c0d261045789f123ec274cd662384fb847e8f0a82fe93016546045a1"),40 25: MustIDFromString("de231aea47c5095ff5257fb9af8aebf260b48d07a1e84749cf3554a4e3ebd9a9"),41 26: MustIDFromString("489afb570dc4cc091f55bcbbea564171a54563b09272ec807b886916707d1f02"),42 27: MustIDFromString("3127f6e5e4e530dde76e8e3357ae37310c6c1fc2ab07194df2622c456160594c"),43 28: MustIDFromString("e814f101e4c215abaec1b2f42496c4012079c1f2d02519a8d389e8973e34c74a"),44 29: MustIDFromString("95a36dbd75ae6c85054678688660a5849c043d1c21b39cefbc1d6f87d93a5dd2"),45 30: MustIDFromString("d4043c6c6c5b313187a7ccfc0bc8f17dbe725374aa03a81bd6b49994e33f77bd"),46 31: MustIDFromString("e8983d273da9a8236d8566fdbf83a34499b2d5e89e5e60d8b3537d6cd1946026"),47 32: MustIDFromString("949e74b2fd94b95da3492e613656fc7fda5f7a6e82184ea291a89bd2b028dd2e"),4849 34: MustIDFromString("6ee5b1e01c3084acd459c41a9aad860bda0a0a83b23e93fa3b8e67262acaed22"), // blob HEAD:.DS_Store50 35: MustIDFromString("4fe5cee2cdd0d2a7995f10ab9f7b2b09d061b62028a51653a61948adb4434dc8"), // blob HEAD:.gitattributes51 36: MustIDFromString("db1173e5dbc280c588ac18c12461db62cf09485299984c08c0b532b0d63ceab0"), // blob HEAD:.gitignore52 37: MustIDFromString("2523f972d932f186489bb4cd9746f65c72a34ff4210b80cd6c09c9865a08ad95"), // blob HEAD:.gitmodules53 38: MustIDFromString("4f015a6e9501b585b7823f588bae41ec901354bafe30a8fe9f82160099c5c584"), // blob HEAD:.travis.yml54 39: MustIDFromString("dd66873b93ef9e7f3909bb919f45bbd91540d85ea171043f21b4f0d830e404bb"), // blob HEAD:README.txt55 40: MustIDFromString("ef9d169adc6eda7180040708d8a888d2726f8429e08235a0a6f992c2737c1d17"), // blob HEAD:build.gradle56 41: MustIDFromString("ba2cc18e595b5f70a47cea3ed71f3568addd55e7bb5581a8918b7885abb7888e"), // tree HEAD:gogs57 42: MustIDFromString("ccfb232c491a6ba1cebce68dab2a9c3f4b79018ea45442dad99c281f52227807"), // tree HEAD:img58 43: MustIDFromString("a8e75d30f8ae30c37d91c14753f723b3b232e4293d9cc446c90c11570aee410e"), // blob HEAD:pom.xml59 44: MustIDFromString("a3291603bebc8a2b8d354e2fea44a3e093ff6b9f0171333a26ce8d56b8f6652c"), // tree HEAD:resource60 45: MustIDFromString("20f59dd73b24e3dc47f2bcf20d5d827095f1cea9778023e37b5d5d7cb36b9232"), // blob HEAD:run.sh61 46: MustIDFromString("5ea265eb087b456525021721cc2d33b005c998b5c8908b1d0122f118bb53bc9a"), // tree HEAD:sameSHAs62 47: MustIDFromString("e98f5bc0b76add753e2d330fb2974e596bdf8b96111237ebc204c4fe0280bc89"), // tree HEAD:src63 48: MustIDFromString("fdd5f856ccd57ffc0dc86a02c3d55863d078bb901c2b72353a20dc399f932536"), // blob HEAD:symlink.run.sh64 49: MustIDFromString("dae65197c87793004ef9f0bc2fac54aa4f74cf57e8bb11a274e06cce3d50fd50"), // blob HEAD:img/sourcegraph.png6566 50: MustIDFromString("264607f7e6128c06d1bab93857dbaf10c1ad98cd98ade780a9adcfd388774056"), // tag v1.1.06768 51: MustIDFromString("6d86d830e90b4801ac5130275272cf9c047998a63a082d6afe3adead7527495a"), // blob 31a3d8b:README.txt69 52: MustIDFromString("93324ee06704d200656b2bc0ddd75c4262965a2ab2b7e151aece2cf692960678"), // blob 31a3d8b:resources/labels.properties70 53: MustIDFromString("a4de9b44e29e16ecb7fa9d1de3cc59216fdcde0fa36e193cf9e0e629e22d1815"), // blob 31a3d8b:src/Main.groovy71 54: MustIDFromString("473a0f4c3be8a93681a267e3b1e9a7dcda1185436fe141f7749120a303721813"), // blob 489afb5:fix.txt72 }73 submoduleSHA = MustIDFromString("8fa8e7ed491f06aa84c52730587547852f91e8d1b0b9105660209f253edd2c41")74)7576const (77 repoPath = "testdata/testrepo-sha256.git"78 testrepoObjectFormat = ObjectFormatSHA25679 testEmptyShaID = EmptySha256ID80)8182func initTestRepo() {83 ctx := context.Background()8485 // Set up the test repository86 if !isExist(repoPath) {87 sha1RepoPath := tempPath()88 if err := Clone(ctx, "https://github.com/gogs/git-module-testrepo.git", sha1RepoPath, CloneOptions{89 Bare: true,90 }); err != nil {91 stdlog.Fatal(err)92 }93 defer os.RemoveAll(sha1RepoPath)94 sha1Repo, err := Open(sha1RepoPath)95 if err != nil {96 stdlog.Fatal(err)97 }98 err = Init(ctx, repoPath, InitOptions{Bare: true, ObjectFormat: "sha256"})99 if err != nil {100 stdlog.Fatal(err)101 }102 sha256Repo, err := Open(repoPath)103 if err != nil {104 stdlog.Fatal(err)105 }106107 data, err := fastExport(ctx, sha1Repo)108 if err != nil {109 stdlog.Fatal(err)110 }111 err = fastImport(ctx, sha256Repo, data, map[string]map[string]string{112 "gogs/docs-api": {113 "6b08f76a5313fa3d26859515b30aa17a5faa2807": "8fa8e7ed491f06aa84c52730587547852f91e8d1b0b9105660209f253edd2c41",114 },115 })116117 if err != nil {118 os.RemoveAll(repoPath)119 stdlog.Fatal(err)120 }121 }122 var err error123 testrepo, err = Open(repoPath)124 if err != nil {125 stdlog.Fatal(err)126 }127}128129func fastExport(ctx context.Context, repo *Repository) ([]byte, error) {130 return exec(ctx, repo.path, []string{"fast-export", "--all"}, nil)131}132133func fastImport(ctx context.Context, repo *Repository, data []byte, submoduleRewrite map[string]map[string]string) error {134 args := []string{"fast-import"}135136 for submodule, hashes := range submoduleRewrite {137 frompath := tempPath()138 fromfile, err := os.Create(frompath)139 if err != nil {140 return err141 }142 defer os.Remove(frompath)143 topath := tempPath()144 tofile, err := os.Create(topath)145 if err != nil {146 fromfile.Close()147 return err148 }149 defer os.Remove(topath)150151 markIndex := 0152 for from, to := range hashes {153 markIndex += 1154 fmt.Fprintf(fromfile, ":%d %s\n", markIndex, from)155 fmt.Fprintf(tofile, ":%d %s\n", markIndex, to)156 }157 fromfile.Close()158 tofile.Close()159160 args = append(args,161 fmt.Sprintf("--rewrite-submodules-from=%s:%s", submodule, frompath),162 fmt.Sprintf("--rewrite-submodules-to=%s:%s", submodule, topath))163 }164165 c, cancel := cmd(ctx, repo.path, args, nil)166 defer cancel()167 c.Input(bytes.NewReader(data))168 return c.Run().Wait()169}