Compare commits

..

No commits in common. "6a1e438c9471f0be5d9137626c1158fbe7a47b9c" and "04b33eb70f6e413fed5e438bd8cc1b728d101fd0" have entirely different histories.

4 changed files with 74 additions and 136 deletions

View file

@ -48,23 +48,19 @@ impl Comment {
}
}
}
let Some(description) = description else {
if description == None {
return Err(CommentError::CommentParseError);
};
}
let author = crate::git::git_log_oldest_author(comment_dir)?;
let creation_time = crate::git::git_log_oldest_timestamp(comment_dir)?;
let dir = std::path::PathBuf::from(comment_dir);
Ok(Self {
uuid: String::from(
dir.file_name()
.ok_or(std::io::Error::from(std::io::ErrorKind::NotFound))?
.to_string_lossy(),
),
uuid: String::from(dir.file_name().unwrap().to_string_lossy()),
author,
creation_time,
description,
description: description.unwrap(),
dir: std::path::PathBuf::from(comment_dir),
})
}
@ -113,11 +109,7 @@ impl Comment {
&format!(
"add comment {} on issue {}",
comment.uuid,
issue
.dir
.file_name()
.ok_or(std::io::Error::from(std::io::ErrorKind::NotFound))?
.to_string_lossy(),
issue.dir.file_name().unwrap().to_string_lossy(),
),
)?;
}
@ -138,15 +130,10 @@ impl Comment {
crate::git::add(&description_filename)?;
if crate::git::worktree_is_dirty(&self.dir.to_string_lossy())? {
crate::git::commit(
&description_filename
.parent()
.ok_or(std::io::Error::from(std::io::ErrorKind::NotFound))?,
&description_filename.parent().unwrap(),
&format!(
"edit comment {} on issue FIXME", // FIXME: name the issue that the comment is on
self.dir
.file_name()
.ok_or(std::io::Error::from(std::io::ErrorKind::NotFound))?
.to_string_lossy()
self.dir.file_name().unwrap().to_string_lossy()
),
)?;
self.read_description()?;
@ -178,8 +165,8 @@ impl Comment {
.spawn()?
.wait_with_output()?;
if !result.status.success() {
println!("stdout: {}", &String::from_utf8_lossy(&result.stdout));
println!("stderr: {}", &String::from_utf8_lossy(&result.stderr));
println!("stdout: {}", std::str::from_utf8(&result.stdout).unwrap());
println!("stderr: {}", std::str::from_utf8(&result.stderr).unwrap());
return Err(CommentError::EditorError);
}

View file

@ -48,8 +48,8 @@ impl Worktree {
.args(["worktree", "add", &path.path().to_string_lossy(), branch])
.output()?;
if !result.status.success() {
println!("stdout: {}", &String::from_utf8_lossy(&result.stdout));
println!("stderr: {}", &String::from_utf8_lossy(&result.stderr));
println!("stdout: {}", std::str::from_utf8(&result.stdout).unwrap());
println!("stderr: {}", std::str::from_utf8(&result.stderr).unwrap());
return Err(GitError::Oops);
}
Ok(Self { path })
@ -67,8 +67,8 @@ impl Worktree {
])
.output()?;
if !result.status.success() {
println!("stdout: {}", &String::from_utf8_lossy(&result.stdout));
println!("stderr: {}", &String::from_utf8_lossy(&result.stderr));
println!("stdout: {}", std::str::from_utf8(&result.stdout).unwrap());
println!("stderr: {}", std::str::from_utf8(&result.stderr).unwrap());
return Err(GitError::Oops);
}
Ok(Self { path })
@ -87,8 +87,8 @@ pub fn checkout_branch_in_worktree(
.args(["worktree", "add", &worktree_dir.to_string_lossy(), branch])
.output()?;
if !result.status.success() {
println!("stdout: {}", &String::from_utf8_lossy(&result.stdout));
println!("stderr: {}", &String::from_utf8_lossy(&result.stderr));
println!("stdout: {}", std::str::from_utf8(&result.stdout).unwrap());
println!("stderr: {}", std::str::from_utf8(&result.stderr).unwrap());
return Err(GitError::Oops);
}
Ok(())
@ -99,8 +99,8 @@ pub fn git_worktree_prune() -> Result<(), GitError> {
.args(["worktree", "prune"])
.output()?;
if !result.status.success() {
println!("stdout: {}", &String::from_utf8_lossy(&result.stdout));
println!("stderr: {}", &String::from_utf8_lossy(&result.stderr));
println!("stdout: {}", std::str::from_utf8(&result.stdout).unwrap());
println!("stderr: {}", std::str::from_utf8(&result.stderr).unwrap());
return Err(GitError::Oops);
}
Ok(())
@ -111,8 +111,8 @@ pub fn git_remove_branch(branch: &str) -> Result<(), GitError> {
.args(["branch", "-D", branch])
.output()?;
if !result.status.success() {
println!("stdout: {}", &String::from_utf8_lossy(&result.stdout));
println!("stderr: {}", &String::from_utf8_lossy(&result.stderr));
println!("stdout: {}", std::str::from_utf8(&result.stdout).unwrap());
println!("stderr: {}", std::str::from_utf8(&result.stderr).unwrap());
return Err(GitError::Oops);
}
Ok(())
@ -139,14 +139,11 @@ pub fn worktree_is_dirty(dir: &str) -> Result<bool, GitError> {
pub fn add(file: &std::path::Path) -> Result<(), GitError> {
let result = std::process::Command::new("git")
.args(["add", &file.to_string_lossy()])
.current_dir(
file.parent()
.ok_or(std::io::Error::from(std::io::ErrorKind::NotFound))?,
)
.current_dir(file.parent().unwrap())
.output()?;
if !result.status.success() {
println!("stdout: {}", &String::from_utf8_lossy(&result.stdout));
println!("stderr: {}", &String::from_utf8_lossy(&result.stderr));
println!("stdout: {}", std::str::from_utf8(&result.stdout).unwrap());
println!("stderr: {}", std::str::from_utf8(&result.stderr).unwrap());
return Err(GitError::Oops);
}
return Ok(());
@ -155,14 +152,11 @@ pub fn add(file: &std::path::Path) -> Result<(), GitError> {
pub fn restore_file(file: &std::path::Path) -> Result<(), GitError> {
let result = std::process::Command::new("git")
.args(["restore", &file.to_string_lossy()])
.current_dir(
file.parent()
.ok_or(std::io::Error::from(std::io::ErrorKind::NotFound))?,
)
.current_dir(file.parent().unwrap())
.output()?;
if !result.status.success() {
println!("stdout: {}", &String::from_utf8_lossy(&result.stdout));
println!("stderr: {}", &String::from_utf8_lossy(&result.stderr));
println!("stdout: {}", std::str::from_utf8(&result.stdout).unwrap());
println!("stderr: {}", std::str::from_utf8(&result.stderr).unwrap());
return Err(GitError::Oops);
}
return Ok(());
@ -174,8 +168,8 @@ pub fn commit(dir: &std::path::Path, msg: &str) -> Result<(), GitError> {
.current_dir(dir)
.output()?;
if !result.status.success() {
println!("stdout: {}", &String::from_utf8_lossy(&result.stdout));
println!("stderr: {}", &String::from_utf8_lossy(&result.stderr));
println!("stdout: {}", std::str::from_utf8(&result.stdout).unwrap());
println!("stderr: {}", std::str::from_utf8(&result.stderr).unwrap());
return Err(GitError::Oops);
}
Ok(())
@ -186,18 +180,12 @@ pub fn git_commit_file(file: &std::path::Path) -> Result<(), GitError> {
git_dir.pop();
let result = std::process::Command::new("git")
.args([
"add",
&file
.file_name()
.ok_or(std::io::Error::from(std::io::ErrorKind::NotFound))?
.to_string_lossy(),
])
.args(["add", &file.file_name().unwrap().to_string_lossy()])
.current_dir(&git_dir)
.output()?;
if !result.status.success() {
println!("stdout: {}", &String::from_utf8_lossy(&result.stdout));
println!("stderr: {}", &String::from_utf8_lossy(&result.stderr));
println!("stdout: {}", std::str::from_utf8(&result.stdout).unwrap());
println!("stderr: {}", std::str::from_utf8(&result.stderr).unwrap());
return Err(GitError::Oops);
}
@ -207,20 +195,15 @@ pub fn git_commit_file(file: &std::path::Path) -> Result<(), GitError> {
"-m",
&format!(
"update '{}' in issue {}",
file.file_name()
.ok_or(std::io::Error::from(std::io::ErrorKind::NotFound))?
.to_string_lossy(),
git_dir
.file_name()
.ok_or(std::io::Error::from(std::io::ErrorKind::NotFound))?
.to_string_lossy()
file.file_name().unwrap().to_string_lossy(),
git_dir.file_name().unwrap().to_string_lossy()
),
])
.current_dir(&git_dir)
.output()?;
if !result.status.success() {
println!("stdout: {}", &String::from_utf8_lossy(&result.stdout));
println!("stderr: {}", &String::from_utf8_lossy(&result.stderr));
println!("stdout: {}", std::str::from_utf8(&result.stdout).unwrap());
println!("stderr: {}", std::str::from_utf8(&result.stderr).unwrap());
return Err(GitError::Oops);
}
@ -233,8 +216,8 @@ pub fn git_fetch(dir: &std::path::Path, remote: &str) -> Result<(), GitError> {
.current_dir(dir)
.output()?;
if !result.status.success() {
println!("stdout: {}", &String::from_utf8_lossy(&result.stdout));
println!("stderr: {}", &String::from_utf8_lossy(&result.stderr));
println!("stdout: {}", std::str::from_utf8(&result.stdout).unwrap());
println!("stderr: {}", std::str::from_utf8(&result.stderr).unwrap());
return Err(GitError::Oops);
}
Ok(())
@ -270,13 +253,13 @@ pub fn sync(dir: &std::path::Path, remote: &str, branch: &str) -> Result<(), Git
"Sync failed! 'git log' error! Help, a human needs to fix the mess in {:?}",
branch
);
println!("stdout: {}", &String::from_utf8_lossy(&result.stdout));
println!("stderr: {}", &String::from_utf8_lossy(&result.stderr));
println!("stdout: {}", std::str::from_utf8(&result.stdout).unwrap());
println!("stderr: {}", std::str::from_utf8(&result.stderr).unwrap());
return Err(GitError::Oops);
}
if result.stdout.len() > 0 {
println!("Changes fetched from remote {}:", remote);
println!("{}", &String::from_utf8_lossy(&result.stdout));
println!("{}", std::str::from_utf8(&result.stdout).unwrap());
println!("");
}
@ -296,13 +279,13 @@ pub fn sync(dir: &std::path::Path, remote: &str, branch: &str) -> Result<(), Git
"Sync failed! 'git log' error! Help, a human needs to fix the mess in {:?}",
branch
);
println!("stdout: {}", &String::from_utf8_lossy(&result.stdout));
println!("stderr: {}", &String::from_utf8_lossy(&result.stderr));
println!("stdout: {}", std::str::from_utf8(&result.stdout).unwrap());
println!("stderr: {}", std::str::from_utf8(&result.stderr).unwrap());
return Err(GitError::Oops);
}
if result.stdout.len() > 0 {
println!("Changes to push to remote {}:", remote);
println!("{}", &String::from_utf8_lossy(&result.stdout));
println!("{}", std::str::from_utf8(&result.stdout).unwrap());
println!("");
}
@ -316,8 +299,8 @@ pub fn sync(dir: &std::path::Path, remote: &str, branch: &str) -> Result<(), Git
"Sync failed! Merge error! Help, a human needs to fix the mess in {:?}",
branch
);
println!("stdout: {}", &String::from_utf8_lossy(&result.stdout));
println!("stderr: {}", &String::from_utf8_lossy(&result.stderr));
println!("stdout: {}", std::str::from_utf8(&result.stdout).unwrap());
println!("stderr: {}", std::str::from_utf8(&result.stderr).unwrap());
return Err(GitError::Oops);
}
@ -331,8 +314,8 @@ pub fn sync(dir: &std::path::Path, remote: &str, branch: &str) -> Result<(), Git
"Sync failed! Push error! Help, a human needs to fix the mess in {:?}",
branch
);
println!("stdout: {}", &String::from_utf8_lossy(&result.stdout));
println!("stderr: {}", &String::from_utf8_lossy(&result.stderr));
println!("stdout: {}", std::str::from_utf8(&result.stdout).unwrap());
println!("stderr: {}", std::str::from_utf8(&result.stderr).unwrap());
return Err(GitError::Oops);
}
@ -349,16 +332,13 @@ pub fn git_log_oldest_timestamp(
"log",
"--pretty=format:%at",
"--",
&path
.file_name()
.ok_or(std::io::Error::from(std::io::ErrorKind::NotFound))?
.to_string_lossy(),
&path.file_name().unwrap().to_string_lossy(),
])
.current_dir(&git_dir)
.output()?;
if !result.status.success() {
println!("stdout: {}", &String::from_utf8_lossy(&result.stdout));
println!("stderr: {}", &String::from_utf8_lossy(&result.stderr));
println!("stdout: {}", std::str::from_utf8(&result.stdout).unwrap());
println!("stderr: {}", std::str::from_utf8(&result.stderr).unwrap());
return Err(GitError::Oops);
}
let timestamp_str = std::str::from_utf8(&result.stdout).unwrap();
@ -378,16 +358,13 @@ pub fn git_log_oldest_author(path: &std::path::Path) -> Result<String, GitError>
"log",
"--pretty=format:%an <%ae>",
"--",
&path
.file_name()
.ok_or(std::io::Error::from(std::io::ErrorKind::NotFound))?
.to_string_lossy(),
&path.file_name().unwrap().to_string_lossy(),
])
.current_dir(&git_dir)
.output()?;
if !result.status.success() {
println!("stdout: {}", &String::from_utf8_lossy(&result.stdout));
println!("stderr: {}", &String::from_utf8_lossy(&result.stderr));
println!("stdout: {}", std::str::from_utf8(&result.stdout).unwrap());
println!("stderr: {}", std::str::from_utf8(&result.stderr).unwrap());
return Err(GitError::Oops);
}
let author_str = std::str::from_utf8(&result.stdout).unwrap();
@ -406,8 +383,8 @@ pub fn create_orphan_branch(branch: &str) -> Result<(), GitError> {
.args(["worktree", "prune"])
.output()?;
if !result.status.success() {
println!("stdout: {}", &String::from_utf8_lossy(&result.stdout));
println!("stderr: {}", &String::from_utf8_lossy(&result.stderr));
println!("stdout: {}", std::str::from_utf8(&result.stdout).unwrap());
println!("stderr: {}", std::str::from_utf8(&result.stderr).unwrap());
return Err(GitError::Oops);
}
@ -423,8 +400,8 @@ fn create_orphan_branch_at_path(
.args(["worktree", "add", "--orphan", "-b", branch, &worktree_dir])
.output()?;
if !result.status.success() {
println!("stdout: {}", &String::from_utf8_lossy(&result.stdout));
println!("stderr: {}", &String::from_utf8_lossy(&result.stderr));
println!("stdout: {}", std::str::from_utf8(&result.stdout).unwrap());
println!("stderr: {}", std::str::from_utf8(&result.stderr).unwrap());
return Err(GitError::Oops);
}
@ -441,8 +418,8 @@ fn create_orphan_branch_at_path(
.current_dir(worktree_path)
.output()?;
if !result.status.success() {
println!("stdout: {}", &String::from_utf8_lossy(&result.stdout));
println!("stderr: {}", &String::from_utf8_lossy(&result.stderr));
println!("stdout: {}", std::str::from_utf8(&result.stdout).unwrap());
println!("stderr: {}", std::str::from_utf8(&result.stderr).unwrap());
return Err(GitError::Oops);
}
@ -451,8 +428,8 @@ fn create_orphan_branch_at_path(
.current_dir(worktree_path)
.output()?;
if !result.status.success() {
println!("stdout: {}", &String::from_utf8_lossy(&result.stdout));
println!("stderr: {}", &String::from_utf8_lossy(&result.stderr));
println!("stdout: {}", std::str::from_utf8(&result.stdout).unwrap());
println!("stderr: {}", std::str::from_utf8(&result.stderr).unwrap());
return Err(GitError::Oops);
}

View file

@ -153,9 +153,9 @@ impl Issue {
}
}
let Some(description) = description else {
if description == None {
return Err(IssueError::IssueParseError);
};
}
// parse the issue ID from the directory name
let id = if let Some(parsed_id) = match dir.file_name() {
@ -179,7 +179,7 @@ impl Issue {
state: state,
dependencies,
assignee,
description,
description: description.unwrap(),
comments,
dir: std::path::PathBuf::from(dir),
})
@ -267,9 +267,9 @@ impl Issue {
"edit description of issue {}",
description_filename
.parent()
.ok_or(std::io::Error::from(std::io::ErrorKind::NotFound))?
.unwrap()
.file_name()
.ok_or(std::io::Error::from(std::io::ErrorKind::NotFound))?
.unwrap()
.to_string_lossy(),
))?;
Ok(())
@ -293,10 +293,7 @@ impl Issue {
write!(state_file, "{}", new_state)?;
self.commit(&format!(
"change state of issue {}, {} -> {}",
self.dir
.file_name()
.ok_or(std::io::Error::from(std::io::ErrorKind::NotFound))?
.to_string_lossy(),
self.dir.file_name().unwrap().to_string_lossy(),
old_state,
new_state,
))?;
@ -326,10 +323,7 @@ impl Issue {
self.done_time = Some(done_time.clone());
self.commit(&format!(
"set done-time of issue {} to {}",
self.dir
.file_name()
.ok_or(std::io::Error::from(std::io::ErrorKind::NotFound))?
.to_string_lossy(),
self.dir.file_name().unwrap().to_string_lossy(),
done_time,
))?;
Ok(())
@ -347,10 +341,7 @@ impl Issue {
write!(assignee_file, "{}", new_assignee)?;
self.commit(&format!(
"change assignee of issue {}, {} -> {}",
self.dir
.file_name()
.ok_or(std::io::Error::from(std::io::ErrorKind::NotFound))?
.to_string_lossy(),
self.dir.file_name().unwrap().to_string_lossy(),
old_assignee,
new_assignee,
))?;
@ -367,10 +358,7 @@ impl Issue {
self.tags.sort();
self.commit_tags(&format!(
"issue {} add tag {}",
self.dir
.file_name()
.ok_or(std::io::Error::from(std::io::ErrorKind::NotFound))?
.to_string_lossy(),
self.dir.file_name().unwrap().to_string_lossy(),
tag
))?;
Ok(())
@ -385,10 +373,7 @@ impl Issue {
self.tags.remove(index);
self.commit_tags(&format!(
"issue {} remove tag {}",
self.dir
.file_name()
.ok_or(std::io::Error::from(std::io::ErrorKind::NotFound))?
.to_string_lossy(),
self.dir.file_name().unwrap().to_string_lossy(),
tag
))?;
Ok(())
@ -447,8 +432,8 @@ impl Issue {
.spawn()?
.wait_with_output()?;
if !result.status.success() {
println!("stdout: {}", &String::from_utf8_lossy(&result.stdout));
println!("stderr: {}", &String::from_utf8_lossy(&result.stderr));
println!("stdout: {}", std::str::from_utf8(&result.stdout).unwrap());
println!("stderr: {}", std::str::from_utf8(&result.stderr).unwrap());
return Err(IssueError::EditorError);
}
if !description_filename.exists() || description_filename.metadata()?.len() == 0 {

View file

@ -56,19 +56,8 @@ impl Issues {
for direntry in dir.read_dir()? {
if let Ok(direntry) = direntry {
if direntry.metadata()?.is_dir() {
match crate::issue::Issue::new_from_dir(direntry.path().as_path()) {
Err(e) => {
eprintln!(
"failed to parse issue {}, skipping",
direntry.file_name().to_string_lossy()
);
eprintln!("ignoring error: {:?}", e);
continue;
}
Ok(issue) => {
issues.add_issue(issue);
}
}
let issue = crate::issue::Issue::new_from_dir(direntry.path().as_path())?;
issues.add_issue(issue);
} else if direntry.file_name() == "config.toml" {
issues.parse_config(direntry.path().as_path())?;
} else {