public ITask CommitFiles(List <string> files, string message, string body) { var task = GitClient.Add(files) .Then(GitClient.Commit(message, body)); return(HookupHandlers(task, true)); }
private void Commit() { // Do not allow new commits before we have received one successful update busy = true; var files = Enumerable.Range(0, tree.Entries.Count) .Where(i => tree.CommitTargets[i].All) .Select(i => tree.Entries[i].Path) .ToArray(); ITask <string> addTask; if (files.Length == tree.Entries.Count) { addTask = GitClient.AddAll(); } else { addTask = GitClient.Add(files); } addTask .Then(GitClient.Commit(commitMessage, commitBody)) .Then(GitClient.Status()) .FinallyInUI((b, exception) => { commitMessage = ""; commitBody = ""; busy = false; }).Start(); }
public void InitializeRepository() { isBusy = true; progress.UpdateProgress(0, 100, "Initializing..."); var thread = new Thread(() => { var success = true; try { var targetPath = NPath.CurrentDirectory; var gitignore = targetPath.Combine(".gitignore"); var gitAttrs = targetPath.Combine(".gitattributes"); var assetsGitignore = targetPath.Combine("Assets", ".gitignore"); var filesForInitialCommit = new List <string> { gitignore, gitAttrs, assetsGitignore }; GitClient.Init().RunSynchronously(); progress.UpdateProgress(10, 100, "Initializing..."); ConfigureMergeSettings(); progress.UpdateProgress(20, 100, "Initializing..."); GitClient.LfsInstall().RunSynchronously(); progress.UpdateProgress(30, 100, "Initializing..."); AssemblyResources.ToFile(ResourceType.Generic, ".gitignore", targetPath, Environment); AssemblyResources.ToFile(ResourceType.Generic, ".gitattributes", targetPath, Environment); assetsGitignore.CreateFile(); GitClient.Add(filesForInitialCommit).RunSynchronously(); progress.UpdateProgress(60, 100, "Initializing..."); GitClient.Commit("Initial commit", null).RunSynchronously(); progress.UpdateProgress(70, 100, "Initializing..."); Environment.InitializeRepository(); } catch (Exception ex) { Logger.Error(ex, "A problem ocurred initializing the repository"); progress.UpdateProgress(90, 100, "Failed to initialize repository"); success = false; } if (success) { progress.UpdateProgress(90, 100, "Initializing..."); RestartRepository(); TaskManager.RunInUI(InitializeUI); UsageTracker.IncrementProjectsInitialized(); progress.UpdateProgress(100, 100, "Initialized"); } isBusy = false; }); thread.Start(); }
public ITask CommitFiles(List <string> files, string message, string body) { var add = GitClient.Add(files); add.OnStart += t => IsBusy = true; return(add .Then(GitClient.Commit(message, body)) .Finally(() => IsBusy = false)); }
public ITask InitializeRepository() { //Logger.Trace("Running Repository Initialize"); var targetPath = NPath.CurrentDirectory; var unityYamlMergeExec = Environment.UnityApplicationContents.Combine("Tools", "UnityYAMLMerge" + Environment.ExecutableExtension); var yamlMergeCommand = Environment.IsWindows ? $@"'{unityYamlMergeExec}' merge -p ""$BASE"" ""$REMOTE"" ""$LOCAL"" ""$MERGED""" : $@"'{unityYamlMergeExec}' merge -p '$BASE' '$REMOTE' '$LOCAL' '$MERGED'"; var gitignore = targetPath.Combine(".gitignore"); var gitAttrs = targetPath.Combine(".gitattributes"); var assetsGitignore = targetPath.Combine("Assets", ".gitignore"); var filesForInitialCommit = new List <string> { gitignore, gitAttrs, assetsGitignore }; var task = GitClient.Init() .Then(GitClient.SetConfig("merge.unityyamlmerge.cmd", yamlMergeCommand, GitConfigSource.Local)) .Then(GitClient.SetConfig("merge.unityyamlmerge.trustExitCode", "false", GitConfigSource.Local)) .Then(GitClient.LfsInstall()) .ThenInUI(SetProjectToTextSerialization) .Then(new ActionTask(CancellationToken, _ => { AssemblyResources.ToFile(ResourceType.Generic, ".gitignore", targetPath, Environment); AssemblyResources.ToFile(ResourceType.Generic, ".gitattributes", targetPath, Environment); assetsGitignore.CreateFile(); })) .Then(GitClient.Add(filesForInitialCommit)) .Then(GitClient.Commit("Initial commit", null)) .Then(_ => { Environment.InitializeRepository(); RestartRepository(); }) .ThenInUI(() => { TaskManager.Run(UsageTracker.IncrementNumberOfProjectsInitialized); InitializeUI(); }); return(task); }
private void TreeNode(FileTreeNode node) { GUILayout.Space(Styles.TreeVerticalSpacing); var target = node.Target; var isFolder = node.Children.Any(); GUILayout.BeginHorizontal(); { if (!Readonly) { // Commit inclusion toggle var state = node.State; var toggled = state == CommitState.All; EditorGUI.BeginChangeCheck(); { toggled = GUILayout.Toggle(toggled, "", state == CommitState.Some ? Styles.ToggleMixedStyle : GUI.skin.toggle, GUILayout.ExpandWidth(false)); } if (EditorGUI.EndChangeCheck()) { var filesAdded = new List <string>(); var filesRemoved = new List <string>(); stateChangeCallback = new Action <FileTreeNode>(s => { if (s.State == CommitState.None) { filesRemoved.Add(s.Path); } else { filesAdded.Add(s.Path); } }); node.State = toggled ? CommitState.All : CommitState.None; if (filesAdded.Count > 0) { GitClient.Add(filesAdded); } if (filesRemoved.Count > 0) { GitClient.Remove(filesAdded); } if (filesAdded.Count > 0 || filesRemoved.Count > 0) { GitClient.Status(); } // we might need to run git status after these calls } } // Foldout if (isFolder) { Rect foldoutRect; if (Readonly) { foldoutRect = GUILayoutUtility.GetRect(1, 1); foldoutRect.Set(foldoutRect.x - 7f, foldoutRect.y + 3f, 0f, EditorGUIUtility.singleLineHeight); } else { foldoutRect = GUILayoutUtility.GetLastRect(); } foldoutRect.Set(foldoutRect.x - Styles.FoldoutWidth + Styles.FoldoutIndentation, foldoutRect.y, Styles.FoldoutWidth, foldoutRect.height); EditorGUI.BeginChangeCheck(); { node.Open = GUI.Toggle(foldoutRect, node.Open, "", EditorStyles.foldout); } if (EditorGUI.EndChangeCheck()) { if (!node.Open && !foldedTreeEntries.Contains(node.RepositoryPath)) { foldedTreeEntries.Add(node.RepositoryPath); } else if (node.Open) { foldedTreeEntries.Remove(node.RepositoryPath); } OnCommitTreeChange(); } } GitFileStatus?status = null; // Node icon and label GUILayout.BeginHorizontal(); { GUILayout.Space(Styles.CommitIconHorizontalPadding); var iconRect = GUILayoutUtility.GetRect(Styles.CommitIconSize, Styles.CommitIconSize, GUILayout.ExpandWidth(false)); iconRect.y += 2; iconRect.x -= 2; if (Event.current.type == EventType.Repaint) { var icon = node.Icon ?? (isFolder ? Styles.FolderIcon : Styles.DefaultAssetIcon); if (icon != null) { GUI.DrawTexture(iconRect, icon, ScaleMode.ScaleToFit); } } var statusRect = new Rect( iconRect.xMax - 9, iconRect.yMax - 7, 9, 9); // Current status (if any) if (target != null) { var idx = entryCommitTargets.IndexOf(target); if (idx > -1) { status = entries[idx].Status; var statusIcon = Styles.GetFileStatusIcon(entries[idx].Status, false); if (statusIcon != null) { GUI.DrawTexture(statusRect, statusIcon); } } } GUILayout.Space(Styles.CommitIconHorizontalPadding); } GUILayout.EndHorizontal(); // Make the text gray and strikethrough if the file is deleted if (status == GitFileStatus.Deleted) { GUILayout.Label(new GUIContent(node.Label, node.RepositoryPath), Styles.DeletedFileLabel, GUILayout.ExpandWidth(true)); var labelRect = GUILayoutUtility.GetLastRect(); var strikeRect = new Rect(labelRect.xMin, labelRect.center.y, labelRect.width, 1); EditorGUI.DrawRect(strikeRect, Color.gray); } else { GUILayout.Label(new GUIContent(node.Label, node.RepositoryPath), GUILayout.ExpandWidth(true)); } GUILayout.FlexibleSpace(); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); { // Render children (if any and folded out) if (isFolder && node.Open) { GUILayout.Space(Styles.TreeIndentation); GUILayout.BeginVertical(); { foreach (var child in node.Children) { TreeNode(child); } } GUILayout.EndVertical(); } } GUILayout.EndHorizontal(); }