diff options
Diffstat (limited to 'src/lib.rs')
| -rw-r--r-- | src/lib.rs | 16 |
1 files changed, 9 insertions, 7 deletions
@@ -36,6 +36,7 @@ use git2::{ Commit, FetchOptions, MergeOptions, Oid, PushOptions, Reference, RemoteCallbacks, Repository, Signature, Time, Tree, }; +use is_executable::is_executable; use serde::{Deserialize, Serialize}; use thiserror::Error; use uuid::Uuid; @@ -136,16 +137,17 @@ pub fn current_branch(repository: &Repository) -> Result<String, git2::Error> { Ok(branch_name) } -pub fn filemode_for_dir_entry(metadata: &Metadata) -> i32 { - if metadata.is_dir() { +pub fn filemode_for_dir_entry(path: &Path) -> std::io::Result<i32> { + let metadata = path.metadata()?; + Ok(if metadata.is_dir() { 0o040000 } else if metadata.is_symlink() { 0o120000 - } else if metadata.permissions().readonly() { - 0o100644 - } else { + } else if is_executable(path) { 0o100755 - } + } else { + 0o100644 + }) } pub fn path_to_tree(repository: &Repository, path: &Path) -> Result<Oid, TreeError> { @@ -160,7 +162,7 @@ pub fn path_to_tree(repository: &Repository, path: &Path) -> Result<Oid, TreeErr continue; } - let filemode = filemode_for_dir_entry(&entry.metadata()?); + let filemode = filemode_for_dir_entry(&entry.path())?; let oid = path_to_tree(repository, &entry.path())?; let filename = entry.file_name(); tree.insert(filename, oid, filemode)?; |
