diff --git a/src/Commands/Pull.cs b/src/Commands/Pull.cs index 99eaa86b..29d45322 100644 --- a/src/Commands/Pull.cs +++ b/src/Commands/Pull.cs @@ -28,7 +28,7 @@ namespace SourceGit.Commands { if (needStash) { var changes = new LocalChanges(Cwd).Result(); if (changes.Count > 0) { - if (!new Stash(Cwd).Push(null, "PULL_AUTO_STASH", true)) { + if (!new Stash(Cwd).Push(changes, "PULL_AUTO_STASH")) { return false; } } else { diff --git a/src/Commands/Stash.cs b/src/Commands/Stash.cs index 02d46342..68d63488 100644 --- a/src/Commands/Stash.cs +++ b/src/Commands/Stash.cs @@ -1,5 +1,5 @@ using System.Collections.Generic; -using System.Text; +using System.IO; namespace SourceGit.Commands { /// @@ -11,25 +11,37 @@ namespace SourceGit.Commands { Cwd = repo; } - public bool Push(List files, string message, bool includeUntracked) { - StringBuilder builder = new StringBuilder(); - builder.Append("stash push "); - if (includeUntracked) builder.Append("-u "); - builder.Append("-m \""); - builder.Append(message); - builder.Append("\" "); + public bool Push(List changes, string message) { + var temp = Path.GetTempFileName(); + var stream = new FileStream(temp, FileMode.Create); + var writer = new StreamWriter(stream); - if (files != null && files.Count > 0) { - builder.Append("--"); - foreach (var f in files) { - builder.Append(" \""); - builder.Append(f); - builder.Append("\""); + var needAdd = new List(); + foreach (var c in changes) { + writer.WriteLine(c.Path); + + if (c.WorkTree == Models.Change.Status.Added || c.WorkTree == Models.Change.Status.Untracked) { + needAdd.Add(c.Path); + if (needAdd.Count > 10) { + new Add(Cwd, needAdd).Exec(); + needAdd.Clear(); + } } } + if (needAdd.Count > 0) { + new Add(Cwd, needAdd).Exec(); + needAdd.Clear(); + } - Args = builder.ToString(); - return Exec(); + writer.Flush(); + stream.Flush(); + writer.Close(); + stream.Close(); + + Args = $"stash push -m \"{message}\" --pathspec-from-file=\"{temp}\""; + var succ = Exec(); + File.Delete(temp); + return succ; } public bool Apply(string name) { diff --git a/src/Resources/Locales/en_US.xaml b/src/Resources/Locales/en_US.xaml index 19b9cdb0..7c85f5dc 100644 --- a/src/Resources/Locales/en_US.xaml +++ b/src/Resources/Locales/en_US.xaml @@ -379,7 +379,6 @@ Stashes STASHES CHANGES - Untracked files not shown COMMIT : {0} -> {1} diff --git a/src/Resources/Locales/zh_CN.xaml b/src/Resources/Locales/zh_CN.xaml index 11129439..538cdddf 100644 --- a/src/Resources/Locales/zh_CN.xaml +++ b/src/Resources/Locales/zh_CN.xaml @@ -57,7 +57,7 @@ 提交ID : 提交变化 - 克隆远程仓库 + 克隆远程仓库 远程仓库 : 远程仓库地址 父级目录 : @@ -69,7 +69,7 @@ 额外参数 : 其他克隆参数,选填 - 基本信息 + 基本信息 修改者 提交者 提交指纹 @@ -87,7 +87,7 @@ 邮箱 : 邮箱地址 - 新建分支 + 新建分支 创建本地分支 新分支基于 : 新分支名 : @@ -97,14 +97,14 @@ 忽略 完成后切换到新分支 - 新建标签 + 新建标签 标签位于 : 标签名 : 推荐格式 :v1.0.0-alpha 标签描述 : 选填 - 浏览 + 浏览 在文件浏览器中打开 终端 打开GIT终端 @@ -125,7 +125,7 @@ 下一步 终止冲突解决 - GIT工作流 + GIT工作流 初始化GIT工作流 发布分支 : 开发分支 : @@ -150,7 +150,7 @@ {0}分支名包含非法字符! {0}前缀未填写! {0}前缀包含非法字符! - 开发分支与发布分支不可相同! + 开发分支与发布分支不可相同! 刷新 书签 @@ -158,7 +158,7 @@ 打开 在浏览器中查看 - 推送 '{0}' + 推送 '{0}' 放弃所有更改 快进到 '{0}' 拉回 '{0}' @@ -172,12 +172,12 @@ 切换上游分支... 复制分支名 - 拉取 '{0}' 更新 + 拉取 '{0}' 更新 编辑 '{0}' 删除 '{0}' 复制远程地址 - 重置 '{0}' 到此处 + 重置 '{0}' 到此处 从此处开始对 '{0}' 交互式变基 变基 '{0}' 到此处 挑选此提交 @@ -186,15 +186,15 @@ 复制提交指纹 复制提交信息 - 推送 '{0}' + 推送 '{0}' 删除 '{0}' 复制标签名 - 应用 + 应用 应用并删除 删除 - 从暂存中移除 + 从暂存中移除 暂存... 放弃更改... 贮藏... @@ -204,20 +204,20 @@ 贮藏选中的 {0} 个文件... 另存为补丁... - 确定要删除此分支吗? + 确定要删除此分支吗? 分支名 : 确定要移除该远程吗? 远程名 : - 确定要移除该标签吗? + 确定要移除该标签吗? 标签名 : 同时删除远程仓库中的此标签 - 确定要移除该子模块吗? + 确定要移除该子模块吗? 子模块路径 : - 下一个差异 + 下一个差异 上一个差异 切换显示模式 请选择需要对比的文件 @@ -228,14 +228,14 @@ LFS对象变更 复制 - 放弃更改确认 + 放弃更改确认 需要放弃的变更 : 本操作不支持回退,请确认后继续!!! 所有本地址未提交的修改 总计{0}项选中更改 - 拉取 - 拉取远程仓库内容 + 拉取 + 拉取远程仓库内容 远程仓库 : 拉取所有的远程仓库 自动清理远程已删除分支 @@ -247,11 +247,11 @@ 列表模式 树形模式 - 选择目录... + 选择目录... 当前选择 : 历史记录 - 查询提交指纹、信息、作者。回车键开始,ESC键取消 + 查询提交指纹、信息、作者。回车键开始,ESC键取消 清空 切换横向/纵向显示 已选中{0}项提交 @@ -261,18 +261,18 @@ 3. 多选时,仅统计选中行数 4. 右键用于操作选中的某个提交 - 初始化新仓库 + 初始化新仓库 路径 : 点击【确定】将在此目录执行`git init`操作 - 交互式变基 + 交互式变基 操作分支 : 开始提交 : 开 始 向上移动 向下移动 - Source Git + Source Git 偏好设置 关于 出错了 @@ -298,7 +298,7 @@ 删除 拉回 - 拉回(拉取并合并) + 拉回(拉取并合并) 远程 : 拉取分支 : 本地分支 : @@ -313,37 +313,37 @@ 同时推送标签 启用强制推送 - 推送标签到远程仓库 + 推送标签到远程仓库 标签 : 远程仓库 : - 变基操作 + 变基操作 分支 : 目标提交 : 自动贮藏并恢复本地变更 - 添加远程仓库 + 添加远程仓库 编辑远程仓库 远程名 : 唯一远程名 仓库地址 : 远程仓库的地址 - 分支重命名 + 分支重命名 分支 : 新的名称 : 新的分支名不能与现有分支名相同 - 重置当前分支到指定版本 + 重置当前分支到指定版本 当前分支 : 提交 : 重置模式 : - 确定要回滚吗? + 确定要回滚吗? 目标提交 : 回滚后提交更改 - 偏好设置 + 偏好设置 通用配置 需要重启软件 显示语言 : @@ -376,14 +376,13 @@ 选填,用于命名此贮藏 包含未跟踪的文件 - 贮藏列表 + 贮藏列表 贮藏列表 查看变更 - 不显示未跟踪的文件 - 对比提交 : {0} -> {1} + 对比提交 : {0} -> {1} - 检测更新 + 检测更新 {0}已发布! 发布时间 GIT版本 @@ -409,13 +408,13 @@ 没有提交信息记录 最近输入的提交信息 - 检测到挑选提交冲突! + 检测到挑选提交冲突! 检测到变基冲突! 检测到回滚提交冲突! 检测到分支合并冲突! GIT尚未配置。请打开【偏好设置】配置GIT路径。 - 路径({0})不存在或不可读取! + 路径({0})不存在或不可读取! 无法找到bash.exe,请确保其在git.exe同目录中! 二进制文件不支持该操作!!! 选中文件不支持该操作!!! diff --git a/src/Views/Popups/CreateBranch.xaml.cs b/src/Views/Popups/CreateBranch.xaml.cs index c9227320..d79211dc 100644 --- a/src/Views/Popups/CreateBranch.xaml.cs +++ b/src/Views/Popups/CreateBranch.xaml.cs @@ -62,7 +62,7 @@ namespace SourceGit.Views.Popups { if (AutoStash) { var changes = new Commands.LocalChanges(repo).Result(); if (changes.Count > 0) { - if (!new Commands.Stash(repo).Push(null, "NEWBRANCH_AUTO_STASH", true)) { + if (!new Commands.Stash(repo).Push(changes, "NEWBRANCH_AUTO_STASH")) { return false; } } else { diff --git a/src/Views/Popups/Stash.xaml.cs b/src/Views/Popups/Stash.xaml.cs index f6165e17..0a48044e 100644 --- a/src/Views/Popups/Stash.xaml.cs +++ b/src/Views/Popups/Stash.xaml.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using System.Threading.Tasks; namespace SourceGit.Views.Popups { @@ -9,14 +10,14 @@ namespace SourceGit.Views.Popups { /// public partial class Stash : Controls.PopupWidget { private string repo = null; - private List files = null; + private List changes = null; - public Stash(string repo, List files) { + public Stash(string repo, List changes) { this.repo = repo; - this.files = files; + this.changes = changes; InitializeComponent(); - chkIncludeUntracked.IsEnabled = files == null || files.Count == 0; + chkIncludeUntracked.IsEnabled = changes == null || changes.Count == 0; } public override string GetTitle() { @@ -29,15 +30,21 @@ namespace SourceGit.Views.Popups { return Task.Run(() => { Models.Watcher.SetEnabled(repo, false); - if (files == null || files.Count == 0) { - new Commands.Stash(repo).Push(null, message, includeUntracked); - } else { - for (int i = 0; i < files.Count; i += 10) { - var count = Math.Min(10, files.Count - i); - var step = files.GetRange(i, count); - new Commands.Stash(repo).Push(step, message, includeUntracked); + + if (changes == null || changes.Count == 0) { + changes = new Commands.LocalChanges(repo).Result(); + } + + var jobs = new List(); + foreach (var c in changes) { + if (c.WorkTree == Models.Change.Status.Added || c.WorkTree == Models.Change.Status.Untracked) { + if (includeUntracked) jobs.Add(c); + } else { + jobs.Add(c); } } + + new Commands.Stash(repo).Push(changes, message); Models.Watcher.SetEnabled(repo, true); return true; }); diff --git a/src/Views/Widgets/Stashes.xaml b/src/Views/Widgets/Stashes.xaml index 1b9fdb9c..7d4538a8 100644 --- a/src/Views/Widgets/Stashes.xaml +++ b/src/Views/Widgets/Stashes.xaml @@ -27,8 +27,14 @@ + + @@ -71,25 +77,19 @@ - - - - - + + + - - + diff --git a/src/Views/Widgets/WorkingCopyChanges.xaml.cs b/src/Views/Widgets/WorkingCopyChanges.xaml.cs index da3217bd..b95698d1 100644 --- a/src/Views/Widgets/WorkingCopyChanges.xaml.cs +++ b/src/Views/Widgets/WorkingCopyChanges.xaml.cs @@ -306,8 +306,8 @@ namespace SourceGit.Views.Widgets { } private async void SaveAsPatch(string saveTo, List changes) { - FileStream stream = new FileStream(saveTo, FileMode.Create); - StreamWriter writer = new StreamWriter(stream); + var stream = new FileStream(saveTo, FileMode.Create); + var writer = new StreamWriter(stream); foreach (var c in changes) { await Task.Run(() => new Commands.SaveChangeToStream(repo, c, writer).Exec()); @@ -353,7 +353,7 @@ namespace SourceGit.Views.Widgets { var stash = new MenuItem(); stash.Header = App.Text("FileCM.Stash"); stash.Click += (o, e) => { - new Popups.Stash(repo, files).Show(); + new Popups.Stash(repo, changes).Show(); e.Handled = true; }; @@ -416,7 +416,7 @@ namespace SourceGit.Views.Widgets { var stash = new MenuItem(); stash.Header = App.Text("FileCM.StashMulti", changes.Count); stash.Click += (o, e) => { - new Popups.Stash(repo, files).Show(); + new Popups.Stash(repo, changes).Show(); e.Handled = true; }; @@ -475,7 +475,7 @@ namespace SourceGit.Views.Widgets { var stash = new MenuItem(); stash.Header = App.Text("FileCM.Stash"); stash.Click += (o, e) => { - new Popups.Stash(repo, files).Show(); + new Popups.Stash(repo, changes).Show(); e.Handled = true; }; @@ -538,7 +538,7 @@ namespace SourceGit.Views.Widgets { var stash = new MenuItem(); stash.Header = App.Text("FileCM.StashMulti", changes.Count); stash.Click += (o, e) => { - new Popups.Stash(repo, files).Show(); + new Popups.Stash(repo, changes).Show(); e.Handled = true; };