aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2025-12-25 14:34:45 +0530
committerAkshay Nair <phenax5@gmail.com>2025-12-25 14:34:45 +0530
commit5d216ac19a99ebb6bc0506a5745e6c3dc1dffe5e (patch)
tree9462d66a318600b04ac5d1db283bd706632a0454 /lib
parentb4fe44842fb6914f9060b0d018de53983b0aab0b (diff)
downloaddaffm-5d216ac19a99ebb6bc0506a5745e6c3dc1dffe5e.tar.gz
daffm-5d216ac19a99ebb6bc0506a5745e6c3dc1dffe5e.zip
Handle errors with owner/group entry
Diffstat (limited to 'lib')
-rw-r--r--lib/Daffm/State.hs9
-rw-r--r--lib/Daffm/View.hs8
2 files changed, 10 insertions, 7 deletions
diff --git a/lib/Daffm/State.hs b/lib/Daffm/State.hs
index 9b3d81d..f7c8aa1 100644
--- a/lib/Daffm/State.hs
+++ b/lib/Daffm/State.hs
@@ -11,6 +11,7 @@ import Control.Exception (try)
import Control.Monad (filterM, forM)
import Daffm.Types
import Daffm.Utils (trim)
+import Data.Either (fromRight)
import Data.List (findIndex, sortBy)
import qualified Data.Map.Strict as Map
import Data.Maybe (fromMaybe)
@@ -147,16 +148,16 @@ getFileInfo name = do
if
| Posix.isSymbolicLink stat -> Just . Text.pack <$> getSymbolicLinkTarget path
| otherwise -> pure Nothing
- user <- Posix.getUserEntryForID $ Posix.fileOwner stat
- group <- Posix.getGroupEntryForID $ Posix.fileGroup stat
+ user <- either2Maybe <$> try (Posix.getUserEntryForID $ Posix.fileOwner stat)
+ group <- either2Maybe <$> try (Posix.getGroupEntryForID $ Posix.fileGroup stat)
pure $
FileInfo
{ filePath = Text.pack path,
fileName = name,
fileSize = Posix.fileSize stat,
fileMode = Posix.fileMode stat,
- fileUser = Text.pack . Posix.userName $ user,
- fileGroup = Text.pack . Posix.groupName $ group,
+ fileUser = maybe "?" (Text.pack . Posix.userName) user,
+ fileGroup = maybe "?" (Text.pack . Posix.groupName) group,
fileType = fileTypeFromStatus stat,
fileLinkType = fileTypeFromStatus <$> linkStat,
fileLinkTarget = linkTarget
diff --git a/lib/Daffm/View.hs b/lib/Daffm/View.hs
index 01488af..fb72ea6 100644
--- a/lib/Daffm/View.hs
+++ b/lib/Daffm/View.hs
@@ -44,21 +44,23 @@ fileListView appState@(AppState {stateFiles}) =
L.renderListWithIndex (fileItemView appState) True stateFiles
fileItemView :: AppState -> Int -> Bool -> FileInfo -> Widget FocusTarget
-fileItemView appState index sel fileInfo@(FileInfo {filePath, fileSize, fileType, fileMode, fileUser, fileGroup}) =
+fileItemView appState index sel fileInfo@(FileInfo {filePath, fileSize, fileType, fileMode}) =
hBox
[ hFixed 2 fileSelectionView,
hFixed 1 $ fileTypeView fileType,
hFixed 10 $ fileModeView fileMode,
- hFixed 16 $ fileOwnerView fileUser fileGroup,
+ hFixed (maxOwnerSize + 1) $ fileOwnerView fileInfo,
hFixed 7 $ fileSizeView fileSize,
fileNameView sel fileInfo,
searchMatchIndicatorView
]
where
+ maxOwnerSize = Vec.maximum . Vec.map (Text.length . ownerInfo) . L.listElements $ stateFiles appState
+ ownerInfo (FileInfo {fileUser = user, fileGroup = group}) = user <> ":" <> group
fileSizeView = txt . prettyFileSize . fromIntegral
fileTypeView = withAttr fileTypeAttr . txt . showFileType
fileModeView = withAttr fileModeAttr . txt . showFileMode
- fileOwnerView user group = withAttr fileOwnerAttr . txt $ user <> ":" <> group
+ fileOwnerView = withAttr fileOwnerAttr . txt . ownerInfo
fileSelectionView = txt $ if Set.member filePath $ stateFileSelections appState then ">" else " "
searchMatchIndicatorView
| index `Vec.elem` stateSearchMatches appState = padLeft (Pad 1) $ withAttr searchMarchAttr $ txt "*"