Compare commits
4 commits
cfe49adca9
...
def729d43a
| Author | SHA1 | Date | |
|---|---|---|---|
| def729d43a | |||
| e2a7c81a13 | |||
| cc1b378346 | |||
| 452671d272 |
2 changed files with 138 additions and 97 deletions
|
|
@ -415,116 +415,114 @@ fn handle_command(
|
||||||
Commands::Assign {
|
Commands::Assign {
|
||||||
issue_id,
|
issue_id,
|
||||||
new_assignee,
|
new_assignee,
|
||||||
} => {
|
} => match new_assignee {
|
||||||
let issues = entomologist::database::read_issues_database(issues_database_source)?;
|
Some(new_assignee) => {
|
||||||
let Some(original_issue) = issues.issues.get(issue_id) else {
|
let issues_database = entomologist::database::make_issues_database(
|
||||||
return Err(anyhow::anyhow!("issue {} not found", issue_id));
|
issues_database_source,
|
||||||
};
|
entomologist::database::IssuesDatabaseAccess::ReadWrite,
|
||||||
let old_assignee: String = match &original_issue.assignee {
|
)?;
|
||||||
Some(assignee) => assignee.clone(),
|
let mut issues = entomologist::issues::Issues::new_from_dir(&issues_database.dir)?;
|
||||||
None => String::from("None"),
|
let Some(issue) = issues.get_mut_issue(issue_id) else {
|
||||||
};
|
return Err(anyhow::anyhow!("issue {} not found", issue_id));
|
||||||
println!("issue: {}", issue_id);
|
};
|
||||||
match new_assignee {
|
let old_assignee: String = match &issue.assignee {
|
||||||
Some(new_assignee) => {
|
Some(assignee) => assignee.clone(),
|
||||||
let issues_database = entomologist::database::make_issues_database(
|
None => String::from("None"),
|
||||||
issues_database_source,
|
};
|
||||||
entomologist::database::IssuesDatabaseAccess::ReadWrite,
|
issue.set_assignee(new_assignee)?;
|
||||||
)?;
|
println!("issue: {}", issue_id);
|
||||||
let mut issues =
|
println!("assignee: {} -> {}", old_assignee, new_assignee);
|
||||||
entomologist::issues::Issues::new_from_dir(&issues_database.dir)?;
|
}
|
||||||
let Some(issue) = issues.get_mut_issue(issue_id) else {
|
None => {
|
||||||
return Err(anyhow::anyhow!("issue {} not found", issue_id));
|
let issues = entomologist::database::read_issues_database(issues_database_source)?;
|
||||||
};
|
let Some(original_issue) = issues.issues.get(issue_id) else {
|
||||||
println!("assignee: {} -> {}", old_assignee, new_assignee);
|
return Err(anyhow::anyhow!("issue {} not found", issue_id));
|
||||||
issue.set_assignee(new_assignee)?;
|
};
|
||||||
|
let old_assignee: String = match &original_issue.assignee {
|
||||||
|
Some(assignee) => assignee.clone(),
|
||||||
|
None => String::from("None"),
|
||||||
|
};
|
||||||
|
println!("issue: {}", issue_id);
|
||||||
|
println!("assignee: {}", old_assignee);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
Commands::Tag { issue_id, tag } => match tag {
|
||||||
|
Some(tag) => {
|
||||||
|
// Add or remove tag.
|
||||||
|
if tag.len() == 0 {
|
||||||
|
return Err(anyhow::anyhow!("invalid zero-length tag"));
|
||||||
}
|
}
|
||||||
None => {
|
let issues_database = entomologist::database::make_issues_database(
|
||||||
println!("assignee: {}", old_assignee);
|
issues_database_source,
|
||||||
|
entomologist::database::IssuesDatabaseAccess::ReadWrite,
|
||||||
|
)?;
|
||||||
|
let mut issues = entomologist::issues::Issues::new_from_dir(&issues_database.dir)?;
|
||||||
|
let Some(issue) = issues.get_mut_issue(issue_id) else {
|
||||||
|
return Err(anyhow::anyhow!("issue {} not found", issue_id));
|
||||||
|
};
|
||||||
|
if tag.chars().nth(0).unwrap() == '-' {
|
||||||
|
let tag = &tag[1..];
|
||||||
|
issue.remove_tag(tag)?;
|
||||||
|
} else {
|
||||||
|
issue.add_tag(tag)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
None => {
|
||||||
|
// Just list the tags.
|
||||||
Commands::Tag { issue_id, tag } => {
|
let issues = entomologist::database::read_issues_database(issues_database_source)?;
|
||||||
let issues = entomologist::database::read_issues_database(issues_database_source)?;
|
let Some(issue) = issues.issues.get(issue_id) else {
|
||||||
let Some(issue) = issues.issues.get(issue_id) else {
|
return Err(anyhow::anyhow!("issue {} not found", issue_id));
|
||||||
return Err(anyhow::anyhow!("issue {} not found", issue_id));
|
};
|
||||||
};
|
match &issue.tags.len() {
|
||||||
match tag {
|
0 => println!("no tags"),
|
||||||
Some(tag) => {
|
_ => {
|
||||||
// Add or remove tag.
|
// Could use `format!(" {:?}", issue.tags)`
|
||||||
let issues_database = entomologist::database::make_issues_database(
|
// here, but that results in `["tag1", "TAG2",
|
||||||
issues_database_source,
|
// "i-am-also-a-tag"]` and i don't want the
|
||||||
entomologist::database::IssuesDatabaseAccess::ReadWrite,
|
// double-quotes around each tag.
|
||||||
)?;
|
for tag in &issue.tags {
|
||||||
let mut issues =
|
println!("{}", tag);
|
||||||
entomologist::issues::Issues::new_from_dir(&issues_database.dir)?;
|
|
||||||
let Some(issue) = issues.get_mut_issue(issue_id) else {
|
|
||||||
return Err(anyhow::anyhow!("issue {} not found", issue_id));
|
|
||||||
};
|
|
||||||
if tag.len() == 0 {
|
|
||||||
return Err(anyhow::anyhow!("invalid zero-length tag"));
|
|
||||||
}
|
|
||||||
if tag.chars().nth(0).unwrap() == '-' {
|
|
||||||
let tag = &tag[1..];
|
|
||||||
issue.remove_tag(tag)?;
|
|
||||||
} else {
|
|
||||||
issue.add_tag(tag)?;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
None => {
|
|
||||||
// Just list the tags.
|
|
||||||
match &issue.tags.len() {
|
|
||||||
0 => println!("no tags"),
|
|
||||||
_ => {
|
|
||||||
// Could use `format!(" {:?}", issue.tags)`
|
|
||||||
// here, but that results in `["tag1", "TAG2",
|
|
||||||
// "i-am-also-a-tag"]` and i don't want the
|
|
||||||
// double-quotes around each tag.
|
|
||||||
for tag in &issue.tags {
|
|
||||||
println!("{}", tag);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
|
||||||
Commands::DoneTime {
|
Commands::DoneTime {
|
||||||
issue_id,
|
issue_id,
|
||||||
done_time,
|
done_time,
|
||||||
} => {
|
} => match done_time {
|
||||||
let issues = entomologist::database::read_issues_database(issues_database_source)?;
|
Some(done_time) => {
|
||||||
let Some(issue) = issues.issues.get(issue_id) else {
|
// Add or remove tag.
|
||||||
return Err(anyhow::anyhow!("issue {} not found", issue_id));
|
let issues_database = entomologist::database::make_issues_database(
|
||||||
};
|
issues_database_source,
|
||||||
match done_time {
|
entomologist::database::IssuesDatabaseAccess::ReadWrite,
|
||||||
Some(done_time) => {
|
)?;
|
||||||
// Add or remove tag.
|
let mut issues = entomologist::issues::Issues::new_from_dir(&issues_database.dir)?;
|
||||||
let issues_database = entomologist::database::make_issues_database(
|
let Some(issue) = issues.get_mut_issue(issue_id) else {
|
||||||
issues_database_source,
|
return Err(anyhow::anyhow!("issue {} not found", issue_id));
|
||||||
entomologist::database::IssuesDatabaseAccess::ReadWrite,
|
};
|
||||||
)?;
|
let done_time = match chrono::DateTime::parse_from_rfc3339(done_time) {
|
||||||
let mut issues =
|
Ok(done_time) => done_time.with_timezone(&chrono::Local),
|
||||||
entomologist::issues::Issues::new_from_dir(&issues_database.dir)?;
|
Err(e) => {
|
||||||
let Some(issue) = issues.get_mut_issue(issue_id) else {
|
eprintln!("failed to parse done-time from {}", done_time);
|
||||||
return Err(anyhow::anyhow!("issue {} not found", issue_id));
|
return Err(e.into());
|
||||||
};
|
}
|
||||||
let done_time = match chrono::DateTime::parse_from_rfc3339(done_time) {
|
};
|
||||||
Ok(done_time) => done_time.with_timezone(&chrono::Local),
|
issue.set_done_time(done_time)?;
|
||||||
Err(e) => {
|
}
|
||||||
eprintln!("failed to parse done-time from {}", done_time);
|
None => {
|
||||||
return Err(e.into());
|
let issues = entomologist::database::read_issues_database(issues_database_source)?;
|
||||||
}
|
let Some(issue) = issues.issues.get(issue_id) else {
|
||||||
};
|
return Err(anyhow::anyhow!("issue {} not found", issue_id));
|
||||||
issue.set_done_time(done_time)?;
|
};
|
||||||
}
|
match &issue.done_time {
|
||||||
None => match &issue.done_time {
|
|
||||||
Some(done_time) => println!("done_time: {}", done_time),
|
Some(done_time) => println!("done_time: {}", done_time),
|
||||||
None => println!("None"),
|
None => println!("None"),
|
||||||
},
|
};
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
|
|
||||||
Commands::Depend {
|
Commands::Depend {
|
||||||
issue_id,
|
issue_id,
|
||||||
|
|
|
||||||
43
tools/time-ent
Executable file
43
tools/time-ent
Executable file
|
|
@ -0,0 +1,43 @@
|
||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# * Create a temporary ent issue database branch based on a specific
|
||||||
|
# commit in `entomologist-data`.
|
||||||
|
#
|
||||||
|
# * Perform some ent operations on this temporary branch and measure
|
||||||
|
# the runtime.
|
||||||
|
#
|
||||||
|
# * Clean up by deleteting the temporary branch.
|
||||||
|
|
||||||
|
set -e
|
||||||
|
#set -x
|
||||||
|
|
||||||
|
|
||||||
|
# This is a commit in the `entomologist-data` branch that we're somewhat
|
||||||
|
# arbitrarily using here to time different `ent` operations.
|
||||||
|
TEST_COMMIT=a33f1165d77571d770f1a1021afe4c07360247f0
|
||||||
|
|
||||||
|
# This is the branch that we create from the above commit and test our
|
||||||
|
# `ent` operations on. We'll delete this branch when we're done with
|
||||||
|
# the tests.
|
||||||
|
TEST_BRANCH=$(mktemp --dry-run entomologist-data-XXXXXXXX)
|
||||||
|
|
||||||
|
|
||||||
|
function time_ent() {
|
||||||
|
echo timing: ent "$@"
|
||||||
|
time -p ent -b "${TEST_BRANCH}" "$@"
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
git branch "${TEST_BRANCH}" "${TEST_COMMIT}"
|
||||||
|
|
||||||
|
time_ent tag 7e2a3a59fb6b77403ff1035255367607
|
||||||
|
time_ent tag 7e2a3a59fb6b77403ff1035255367607 new-tag
|
||||||
|
|
||||||
|
time_ent assign 7e2a3a59fb6b77403ff1035255367607
|
||||||
|
time_ent assign 7e2a3a59fb6b77403ff1035255367607 new-user
|
||||||
|
|
||||||
|
time_ent done-time 7e2a3a59fb6b77403ff1035255367607
|
||||||
|
time_ent done-time 7e2a3a59fb6b77403ff1035255367607 2025-04-01T01:23:45-06:00
|
||||||
|
|
||||||
|
git branch -D "${TEST_BRANCH}"
|
||||||
Loading…
Add table
Add a link
Reference in a new issue