Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 36 additions & 47 deletions src/Commands/QueryStashes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,9 @@ public class QueryStashes : Command
{
public QueryStashes(string repo)
{
_boundary = $"-----BOUNDARY_OF_COMMIT{Guid.NewGuid()}-----";

WorkingDirectory = repo;
Context = repo;
Args = $"stash list --no-show-signature --format=\"%H%n%P%n%ct%n%gd%n%B%n{_boundary}\"";
Args = $"stash list -z --no-show-signature --format=\"%H%n%P%n%ct%n%gd%n%B\"";
}

public List<Models.Stash> Result()
Expand All @@ -21,66 +19,57 @@ public QueryStashes(string repo)
if (!rs.IsSuccess)
return outs;

var nextPartIdx = 0;
var start = 0;
var end = rs.StdOut.IndexOf('\n', start);
while (end > 0)
var items = rs.StdOut.Split('\0', System.StringSplitOptions.RemoveEmptyEntries);
foreach (var item in items)
{
var line = rs.StdOut.Substring(start, end - start);
var current = new Models.Stash();

switch (nextPartIdx)
var nextPartIdx = 0;
var start = 0;
var end = item.IndexOf('\n', start);
while (end > 0 && nextPartIdx < 4)
{
case 0:
_current = new Models.Stash() { SHA = line };
outs.Add(_current);
break;
case 1:
ParseParent(line);
break;
case 2:
_current.Time = ulong.Parse(line);
break;
case 3:
_current.Name = line;
break;
default:
var boundary = rs.StdOut.IndexOf(_boundary, end + 1, StringComparison.Ordinal);
if (boundary > end)
{
_current.Message = rs.StdOut.Substring(start, boundary - start - 1);
end = boundary + _boundary.Length;
}
else
{
_current.Message = rs.StdOut.Substring(start);
end = rs.StdOut.Length - 2;
}
var line = item.Substring(start, end - start);

switch (nextPartIdx)
{
case 0:
current.SHA = line;
break;
case 1:
ParseParent(line, ref current);
break;
case 2:
current.Time = ulong.Parse(line);
break;
case 3:
current.Name = line;
break;
}

nextPartIdx = -1;
nextPartIdx++;

start = end + 1;
if (start >= item.Length - 1)
break;
}

nextPartIdx++;
end = item.IndexOf('\n', start);
}

start = end + 1;
if (start >= rs.StdOut.Length - 1)
break;
if (start < item.Length)
current.Message = item.Substring(start);

end = rs.StdOut.IndexOf('\n', start);
outs.Add(current);
}

return outs;
}

private void ParseParent(string data)
private void ParseParent(string data, ref Models.Stash current)
{
if (data.Length < 8)
return;

_current.Parents.AddRange(data.Split(separator: ' ', options: StringSplitOptions.RemoveEmptyEntries));
current.Parents.AddRange(data.Split(separator: ' ', options: StringSplitOptions.RemoveEmptyEntries));
}

private Models.Stash _current = null;
private readonly string _boundary;
}
}
1 change: 1 addition & 0 deletions src/Resources/Locales/en_US.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -697,6 +697,7 @@
<x:String x:Key="Text.Stash.TipForSelectedFiles" xml:space="preserve">Both staged and unstaged changes of selected file(s) will be stashed!!!</x:String>
<x:String x:Key="Text.Stash.Title" xml:space="preserve">Stash Local Changes</x:String>
<x:String x:Key="Text.StashCM.Apply" xml:space="preserve">Apply</x:String>
<x:String x:Key="Text.StashCM.CopyMessage" xml:space="preserve">Copy Message</x:String>
<x:String x:Key="Text.StashCM.Drop" xml:space="preserve">Drop</x:String>
<x:String x:Key="Text.StashCM.SaveAsPatch" xml:space="preserve">Save as Patch...</x:String>
<x:String x:Key="Text.StashDropConfirm" xml:space="preserve">Drop Stash</x:String>
Expand Down
10 changes: 10 additions & 0 deletions src/ViewModels/StashesPage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -194,11 +194,21 @@ public ContextMenu MakeContextMenu(Models.Stash stash)
e.Handled = true;
};

var copy = new MenuItem();
copy.Header = App.Text("StashCM.CopyMessage");
copy.Icon = App.CreateMenuIcon("Icons.Copy");
copy.Click += (_, ev) =>
{
App.CopyText(stash.Message);
ev.Handled = true;
};

var menu = new ContextMenu();
menu.Items.Add(apply);
menu.Items.Add(drop);
menu.Items.Add(new MenuItem { Header = "-" });
menu.Items.Add(patch);
menu.Items.Add(copy);
return menu;
}

Expand Down
Loading