// Check and optionally fix global Git configuration func GlobalConfig(fix bool, cmux *sync.Mutex) { // Output buffer until we are forced to gain access to console. var buffer bytes.Buffer anythingToWrite := false my, err := user.Current() if err != nil { panic("Unable to get current user from OS.") } configFile := my.HomeDir + "/.gitconfig" fmt.Fprintln(&buffer) fmt.Fprintf(&buffer, colour.Boldf+"\n", "Checking global Git configuration") c, err := conf.ReadConfigFile(configFile) if err != nil { fmt.Fprintf(&buffer, colour.FgRedf+"\t%v\n", "FAIL", err.Error()) if fix { c = conf.NewConfigFile() fmt.Fprintf(&buffer, colour.FgBluef+"\tCreating new configuration.\n", "FIX") anythingToWrite = true } } if c != nil { // Check for user.name if c.HasOption("user", "name") { fmt.Fprintf(&buffer, colour.FgGreenf+"\tuser.name found.\n", "OK") } else { fmt.Fprintf(&buffer, colour.FgRedf+"\tuser.name was not found.\n", "FAIL") if fix { fmt.Fprintf(&buffer, colour.FgYellowf+"\tUnable to fix this for you.\n", "WARNING") } fmt.Fprintln(&buffer, "\tUse 'git config --global user.name [your name]' to fix it.") } // Check for user.email if c.HasOption("user", "email") { fmt.Fprintf(&buffer, colour.FgGreenf+"\tuser.email found.\n", "OK") } else { fmt.Fprintf(&buffer, colour.FgRedf+"\tuser.email was not found\n", "FAIL") if fix { fmt.Fprintf(&buffer, colour.FgYellowf+"\tUnable to fix this for you.\n", "WARNING") } fmt.Fprintln(&buffer, "\tUse 'git config --global user.email [your email]' to fix it.") } // Check for push.default name, _ := c.GetString("push", "default") if name == "simple" { fmt.Fprintf(&buffer, colour.FgGreenf+"\tpush.default = simple\n", "OK") } else { fmt.Fprintf(&buffer, colour.FgRedf+"\tpush.default is '%s' but should be '%s'\n", "FAIL", name, "simple") if fix { fmt.Fprintf(&buffer, colour.FgBluef+"\tSetting push.default to 'simple'", "FIX") c.AddOption("push", "default", "simple") anythingToWrite = true } } // Get access to console cmux.Lock() defer cmux.Unlock() fmt.Print(buffer.String()) buffer.Reset() if fix { if anythingToWrite { fmt.Println() fmt.Printf("Configuration to be written to '%s':\n", configFile) c.Write(os.Stdout, fmt.Sprintf("Written/updated by gnit, %v", time.Now())) fmt.Println() fmt.Print("Do you want to write these changes? [yN]: ") in := bufio.NewReader(os.Stdin) r, _, _ := in.ReadRune() if r == 'y' { // Notice that the file permisions "0640" is not implemented by the conf package err := c.WriteConfigFile(configFile, 0640, fmt.Sprintf("Written/updated by gnit, %v", time.Now())) if err != nil { panic(err.Error()) } fmt.Printf(colour.FgGreenf+"\tGit configuration written\n", "SUCCESS") } else { fmt.Println("Aborting...") } } } } }
func RepoConfig(fix bool, cmux *sync.Mutex) { // Output buffer until we are forced to gain access to console. var buffer bytes.Buffer defer func() { // Get access to console cmux.Lock() defer cmux.Unlock() fmt.Print(buffer.String()) }() anythingToWrite := false fmt.Fprintln(&buffer) fmt.Fprintf(&buffer, colour.Boldf+"\n", "Checking Git repo setup") // Check if actually inside Git repository gitDir, err := GitDir() if err != nil { panic("Not a git repository.") } // Load config file configFile := gitDir + "/config" c, err := conf.ReadConfigFile(configFile) if err != nil { fmt.Fprintf(&buffer, colour.FgRedf+"\t%s\n", "FAIL", err.Error()) if fix { fmt.Fprintf(&buffer, colour.FgYellowf+"\tUnable to fix this for you.\n", "WARNING") } return } // Check remote and "refs/for/develop" hasReview := c.HasSection("remote \"review\"") if !hasReview { if fix { fmt.Fprintf(&buffer, colour.FgRedf+"\tRemote 'review' not found.\n", "FAIL") c.AddSection("remote \"review\"") fmt.Fprintln(&buffer, "\tAdding remote 'review'.") anythingToWrite = true } } // Verify url if c.HasOption("remote \"review\"", "url") { fmt.Fprintf(&buffer, colour.FgGreenf+"\tRemote review.url found.\n", "OK") } else { fmt.Fprintf(&buffer, colour.FgRedf+"\tRemote review.url not correct.\n", "FAIL") if fix { if c.HasOption("remote \"origin\"", "url") { // BUG: If origin is not gerrit:* then this check will continue to fail! originUrl, _ := c.GetString("remote \"origin\"", "url") fmt.Fprintf(&buffer, colour.FgBluef+"\tSetting remote review.url = '%s'\n", "FIX", originUrl) c.AddOption("remote \"review\"", "url", originUrl) anythingToWrite = true } else { fmt.Fprintf(&buffer, colour.FgYellowf+"\tUnable to fix this for you.\n", "WARNING") } } } // Verify push push, _ := c.GetString("remote \"review\"", "push") if push == "HEAD:refs/for/develop" { fmt.Fprintf(&buffer, colour.FgGreenf+"\tRemote review.push = HEAD:refs/for/develop\n", "OK") } else { fmt.Fprintf(&buffer, colour.FgRedf+"\tRemote review.push is '%s' but should be '%s'\n", "FAIL", push, "HEAD:refs/for/develop") if fix { fmt.Fprintf(&buffer, colour.FgBluef+"\tSetting remote review.push to 'HEAD:refs/for/develop'\n", "FIX") c.AddOption("remote \"review\"", "push", "HEAD:refs/for/develop") anythingToWrite = true } } // Get access to console cmux.Lock() defer cmux.Unlock() fmt.Print(buffer.String()) buffer.Reset() if fix { if anythingToWrite { fmt.Println() fmt.Printf("Configuration to be written to '%s':\n", configFile) c.Write(os.Stdout, fmt.Sprintf("Written/updated by gnit, %v", time.Now())) fmt.Println() fmt.Print("Do you want to write these changes? [yN]: ") in := bufio.NewReader(os.Stdin) r, _, _ := in.ReadRune() if r == 'y' { // Notice that the file permisions "0640" is not implemented by the conf package err := c.WriteConfigFile(configFile, 0640, fmt.Sprintf("Written/updated by gnit, %v", time.Now())) if err != nil { panic(err.Error()) } fmt.Printf(colour.FgGreenf+"\tGit configuration written\n", "SUCCESS") } else { fmt.Println("Aborting...") } } } }