devel-importer: handle history rewrite
Imports can have history rewritten because email addresses can change in OBS and are not recorded as in git commits. This can be handled via comparing Tree objects and rebasing new changes ontop.
This commit is contained in:
@@ -105,7 +105,7 @@ func (e *GitHandler) CloneDevel(gitDir, outName, urlString string) error {
|
||||
params = append(params, url.String(), outName)
|
||||
|
||||
if err != nil {
|
||||
return fmt.Errorf("error parsing SSH URL. %w", err);
|
||||
return fmt.Errorf("error parsing SSH URL. %w", err)
|
||||
}
|
||||
out, err := e.GitExecWithOutput(gitDir, params...)
|
||||
if err != nil {
|
||||
@@ -472,6 +472,53 @@ func parseGitBlob(data <-chan byte) ([]byte, error) {
|
||||
return d, nil
|
||||
}
|
||||
|
||||
func (e *GitHandler) GitParseCommits(cwd string, commitIDs []string) (parsedCommits []commit, err error) {
|
||||
var done sync.Mutex
|
||||
|
||||
done.Lock()
|
||||
data_in, data_out := ChanIO{make(chan byte, 256)}, ChanIO{make(chan byte, 70)}
|
||||
parsedCommits = make([]commit, 0, len(commitIDs))
|
||||
|
||||
go func() {
|
||||
defer done.Unlock()
|
||||
defer close(data_out.ch)
|
||||
|
||||
for _, id := range commitIDs {
|
||||
data_out.Write([]byte(id))
|
||||
data_out.ch <- '\x00'
|
||||
c, e := parseGitCommit(data_in.ch)
|
||||
if e != nil {
|
||||
err = fmt.Errorf("Error parsing git commit: %w", e)
|
||||
return
|
||||
}
|
||||
|
||||
parsedCommits = append(parsedCommits, c)
|
||||
}
|
||||
}()
|
||||
|
||||
cmd := exec.Command("/usr/bin/git", "cat-file", "--batch", "-Z")
|
||||
cmd.Env = []string{
|
||||
"GIT_CEILING_DIRECTORIES=" + e.GitPath,
|
||||
"GIT_CONFIG_GLOBAL=/dev/null",
|
||||
}
|
||||
cmd.Dir = filepath.Join(e.GitPath, cwd)
|
||||
cmd.Stdout = &data_in
|
||||
cmd.Stdin = &data_out
|
||||
cmd.Stderr = writeFunc(func(data []byte) (int, error) {
|
||||
if e.DebugLogger {
|
||||
log.Printf(string(data))
|
||||
}
|
||||
return len(data), nil
|
||||
})
|
||||
if e.DebugLogger {
|
||||
log.Printf("command run: %v\n", cmd.Args)
|
||||
}
|
||||
err = cmd.Run()
|
||||
|
||||
done.Lock()
|
||||
return
|
||||
}
|
||||
|
||||
// TODO: support sub-trees
|
||||
func (e *GitHandler) GitCatFile(cwd, commitId, filename string) (data []byte, err error) {
|
||||
var done sync.Mutex
|
||||
|
||||
Reference in New Issue
Block a user