git-module

fork of https://git.lin.moe/gogs/git-module

git clone git://git.lin.moe/fork/git-module.git

  1//go:build test_sha256
  2
  3package git
  4
  5import (
  6	"bytes"
  7	"context"
  8	"fmt"
  9	stdlog "log"
 10	"os"
 11)
 12
 13var (
 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"),
 48
 49		34: MustIDFromString("6ee5b1e01c3084acd459c41a9aad860bda0a0a83b23e93fa3b8e67262acaed22"), // blob HEAD:.DS_Store
 50		35: MustIDFromString("4fe5cee2cdd0d2a7995f10ab9f7b2b09d061b62028a51653a61948adb4434dc8"), // blob HEAD:.gitattributes
 51		36: MustIDFromString("db1173e5dbc280c588ac18c12461db62cf09485299984c08c0b532b0d63ceab0"), // blob HEAD:.gitignore
 52		37: MustIDFromString("2523f972d932f186489bb4cd9746f65c72a34ff4210b80cd6c09c9865a08ad95"), // blob HEAD:.gitmodules
 53		38: MustIDFromString("4f015a6e9501b585b7823f588bae41ec901354bafe30a8fe9f82160099c5c584"), // blob HEAD:.travis.yml
 54		39: MustIDFromString("dd66873b93ef9e7f3909bb919f45bbd91540d85ea171043f21b4f0d830e404bb"), // blob HEAD:README.txt
 55		40: MustIDFromString("ef9d169adc6eda7180040708d8a888d2726f8429e08235a0a6f992c2737c1d17"), // blob HEAD:build.gradle
 56		41: MustIDFromString("ba2cc18e595b5f70a47cea3ed71f3568addd55e7bb5581a8918b7885abb7888e"), // tree HEAD:gogs
 57		42: MustIDFromString("ccfb232c491a6ba1cebce68dab2a9c3f4b79018ea45442dad99c281f52227807"), // tree HEAD:img
 58		43: MustIDFromString("a8e75d30f8ae30c37d91c14753f723b3b232e4293d9cc446c90c11570aee410e"), // blob HEAD:pom.xml
 59		44: MustIDFromString("a3291603bebc8a2b8d354e2fea44a3e093ff6b9f0171333a26ce8d56b8f6652c"), // tree HEAD:resource
 60		45: MustIDFromString("20f59dd73b24e3dc47f2bcf20d5d827095f1cea9778023e37b5d5d7cb36b9232"), // blob HEAD:run.sh
 61		46: MustIDFromString("5ea265eb087b456525021721cc2d33b005c998b5c8908b1d0122f118bb53bc9a"), // tree HEAD:sameSHAs
 62		47: MustIDFromString("e98f5bc0b76add753e2d330fb2974e596bdf8b96111237ebc204c4fe0280bc89"), // tree HEAD:src
 63		48: MustIDFromString("fdd5f856ccd57ffc0dc86a02c3d55863d078bb901c2b72353a20dc399f932536"), // blob HEAD:symlink.run.sh
 64		49: MustIDFromString("dae65197c87793004ef9f0bc2fac54aa4f74cf57e8bb11a274e06cce3d50fd50"), // blob HEAD:img/sourcegraph.png
 65
 66		50: MustIDFromString("264607f7e6128c06d1bab93857dbaf10c1ad98cd98ade780a9adcfd388774056"), // tag v1.1.0
 67
 68		51: MustIDFromString("6d86d830e90b4801ac5130275272cf9c047998a63a082d6afe3adead7527495a"), // blob 31a3d8b:README.txt
 69		52: MustIDFromString("93324ee06704d200656b2bc0ddd75c4262965a2ab2b7e151aece2cf692960678"), // blob 31a3d8b:resources/labels.properties
 70		53: MustIDFromString("a4de9b44e29e16ecb7fa9d1de3cc59216fdcde0fa36e193cf9e0e629e22d1815"), // blob 31a3d8b:src/Main.groovy
 71		54: MustIDFromString("473a0f4c3be8a93681a267e3b1e9a7dcda1185436fe141f7749120a303721813"), // blob 489afb5:fix.txt
 72	}
 73	submoduleSHA = MustIDFromString("8fa8e7ed491f06aa84c52730587547852f91e8d1b0b9105660209f253edd2c41")
 74)
 75
 76const (
 77	repoPath             = "testdata/testrepo-sha256.git"
 78	testrepoObjectFormat = ObjectFormatSHA256
 79	testEmptyShaID       = EmptySha256ID
 80)
 81
 82func initTestRepo() {
 83	ctx := context.Background()
 84
 85	// Set up the test repository
 86	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		}
106
107		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		})
116
117		if err != nil {
118			os.RemoveAll(repoPath)
119			stdlog.Fatal(err)
120		}
121	}
122	var err error
123	testrepo, err = Open(repoPath)
124	if err != nil {
125		stdlog.Fatal(err)
126	}
127}
128
129func fastExport(ctx context.Context, repo *Repository) ([]byte, error) {
130	return exec(ctx, repo.path, []string{"fast-export", "--all"}, nil)
131}
132
133func fastImport(ctx context.Context, repo *Repository, data []byte, submoduleRewrite map[string]map[string]string) error {
134	args := []string{"fast-import"}
135
136	for submodule, hashes := range submoduleRewrite {
137		frompath := tempPath()
138		fromfile, err := os.Create(frompath)
139		if err != nil {
140			return err
141		}
142		defer os.Remove(frompath)
143		topath := tempPath()
144		tofile, err := os.Create(topath)
145		if err != nil {
146			fromfile.Close()
147			return err
148		}
149		defer os.Remove(topath)
150
151		markIndex := 0
152		for from, to := range hashes {
153			markIndex += 1
154			fmt.Fprintf(fromfile, ":%d %s\n", markIndex, from)
155			fmt.Fprintf(tofile, ":%d %s\n", markIndex, to)
156		}
157		fromfile.Close()
158		tofile.Close()
159
160		args = append(args,
161			fmt.Sprintf("--rewrite-submodules-from=%s:%s", submodule, frompath),
162			fmt.Sprintf("--rewrite-submodules-to=%s:%s", submodule, topath))
163	}
164
165	c, cancel := cmd(ctx, repo.path, args, nil)
166	defer cancel()
167	c.Input(bytes.NewReader(data))
168	return c.Run().Wait()
169}