From 5169b2d145b0086516491a35887bfc5eb07be2ae Mon Sep 17 00:00:00 2001 From: Stefan Majewsky Date: Tue, 4 Apr 2017 22:00:22 +0200 Subject: implement "index" subcommand --- main.go | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) (limited to 'main.go') diff --git a/main.go b/main.go index 012667e..9027dbb 100644 --- a/main.go +++ b/main.go @@ -21,6 +21,8 @@ package main import ( "fmt" "os" + "path/filepath" + "strings" ) func main() { @@ -60,4 +62,74 @@ func usageAndExit() { } func commandIndex() { + oldIndex := ReadIndex() + var newIndex Index + + //check if existing index entries are still checked out + existingRepos := make(map[string]*Repo) + for _, repo := range oldIndex.Repos { + gitDirPath := filepath.Join(repo.AbsolutePath(), ".git") + fi, err := os.Stat(gitDirPath) + if err == nil { + if fi.IsDir() { + //everything okay with this repo + existingRepos[repo.CheckoutPath] = repo + newIndex.Repos = append(newIndex.Repos, repo) + continue + } + FatalIfError(fmt.Errorf("%s is not a directory: I'm seriously confused", gitDirPath)) + } + if !os.IsNotExist(err) { + FatalIfError(err) + } + + //repo has been deleted - ask what to do + fmt.Printf("repository %s has been deleted\n", filepath.Join(RootPath, repo.CheckoutPath)) + + var remoteURLs []string + for _, remote := range repo.Remotes { + if remote.Name == "origin" { + remoteURLs = []string{remote.URL} + break + } + remoteURLs = append(remoteURLs, remote.URL) + } + + var choice string + if len(remoteURLs) == 0 { + choice = Prompt( + "no remote to restore from; (d)elete from index or (s)kip?", + []string{"d", "s"}, + ) + } else { + choice = Prompt( + fmt.Sprintf("(r)estore from %s, (d)elete from index, or (s)kip?", strings.Join(remoteURLs, " and ")), + []string{"r", "d", "s"}, + ) + } + + switch choice { + case "r": + FatalIfError(repo.Checkout()) + newIndex.Repos = append(newIndex.Repos, repo) + case "d": + continue + case "s": + newIndex.Repos = append(newIndex.Repos, repo) + } + } + + //index new repos + FatalIfError(ForeachPhysicalRepo(func(newRepo Repo) error { + repo, exists := existingRepos[newRepo.CheckoutPath] + if exists { + //update the existing index entry with the new remotes + repo.Remotes = newRepo.Remotes + } else { + newIndex.Repos = append(newIndex.Repos, &newRepo) + } + return nil + })) + + newIndex.Write() } -- cgit v1.3.1