Custom wrapper around imperanence
This commit is contained in:
		
					parent
					
						
							
								a6f886da07
							
						
					
				
			
			
				commit
				
					
						886d86f95c
					
				
			
		
					 7 changed files with 121 additions and 13 deletions
				
			
		home/adrielus
modules/home-manager
|  | @ -1,11 +1,11 @@ | |||
| { | ||||
| { config, ... }: { | ||||
|   programs.discord = { | ||||
|     enable = true; | ||||
|     disableUpdateCheck = true; | ||||
|     enableDevtools = true; | ||||
|   }; | ||||
| 
 | ||||
|   home.persistence."/persist/home/adrielus".directories = [ | ||||
|     ".config/discord" # Why tf does discord store it's state here 💀 | ||||
|   satellite.persistence.at.state.apps.Discord.directories = [ | ||||
|     "${config.xdg.configHome}/discord" # Why tf does discord store it's state here 💀 | ||||
|   ]; | ||||
| } | ||||
|  |  | |||
|  | @ -3,9 +3,12 @@ | |||
|     pkgs.qbittorrent | ||||
|   ]; | ||||
| 
 | ||||
|   home.persistence."/persist/home/adrielus".directories = [ | ||||
|     ".config/qBittorrent" # Config options | ||||
|   satellite.persistence.at.state.apps.QBittorrent.directories = [ | ||||
|     "${config.xdg.configHome}/qBittorrent" # Config options | ||||
|   ]; | ||||
| 
 | ||||
|   satellite.persistence.at.cache.apps.QBittorrent.directories = [ | ||||
|     # TODO: investigate which subdirectories/files I actually want to keep | ||||
|     ".local/share/qBittorrent" # Torrent files, logs, etc  | ||||
|     "${config.xdg.dataHome}/qBittorrent" # Torrent files, logs, etc | ||||
|   ]; | ||||
| } | ||||
|  |  | |||
|  | @ -1,9 +1,9 @@ | |||
| { pkgs, ... }: { | ||||
| { pkgs, config, ... }: { | ||||
|   home.packages = [ | ||||
|     pkgs.signal-desktop # Signal client | ||||
|   ]; | ||||
| 
 | ||||
|   home.persistence."/persist/home/adrielus".directories = [ | ||||
|     ".config/Signal" # Why tf does signal store it's state here 💀 | ||||
|   satellite.persistence.at.state.apps.Signal.directories = [ | ||||
|     "${config.xdg.configHome}/Signal" # Why tf does signal store it's state here 💀 | ||||
|   ]; | ||||
| } | ||||
|  |  | |||
|  | @ -1,10 +1,11 @@ | |||
| { pkgs, config, ... }: { | ||||
| { pkgs, config, ... }: | ||||
| { | ||||
|   home.packages = [ | ||||
|     pkgs.lutris | ||||
|   ]; | ||||
| 
 | ||||
|   home.persistence."/persist/home/adrielus".directories = [ | ||||
|     ".config/lutris" # General config data | ||||
|     ("Lutris/.config/lutris") # General config data | ||||
|     ".cache/lutris/banners" # Game banners | ||||
|     ".cache/lutris/coverart" # Game cover art | ||||
| 
 | ||||
|  |  | |||
|  | @ -31,7 +31,26 @@ | |||
|   ]; | ||||
| 
 | ||||
|   home.sessionVariables.QT_SCREEN_SCALE_FACTORS = 1.4; # Bigger text in qt apps | ||||
|   satellite.dev.enable = true; # Simlink some stuff outside the store | ||||
| 
 | ||||
|   satellite = { | ||||
|     # Simlink some commonly modified dotfiles outside the store | ||||
|     dev.enable = true; | ||||
| 
 | ||||
|     # Set up my custom imperanence wrapper | ||||
|     persistence = { | ||||
|       enable = true; | ||||
| 
 | ||||
|       # Actual data/media (eg: projects, images, videos, etc) | ||||
|       at.data.path = "/persist/data"; | ||||
| 
 | ||||
|       # App state I want to keep | ||||
|       at.state.path = "/persist/state"; | ||||
| 
 | ||||
|       # App state which I should be able to delete at any point | ||||
|       at.cache.path = "/persist/cache"; | ||||
|     }; | ||||
|   }; | ||||
| 
 | ||||
| 
 | ||||
|   # Temp stuff | ||||
|   xsession.initExtra = '' | ||||
|  |  | |||
|  | @ -5,4 +5,5 @@ | |||
|   discord = import ./discord.nix; | ||||
|   firefox = import ./firefox; | ||||
|   satellite-dev = import ./satellite-dev.nix; | ||||
|   satellite-persistence = import ./persistence.nix; | ||||
| } | ||||
|  |  | |||
							
								
								
									
										84
									
								
								modules/home-manager/persistence.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								modules/home-manager/persistence.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,84 @@ | |||
| # My own module with nicer syntax for impernanence  | ||||
| { lib, config, ... }: | ||||
| let cfg = config.satellite.persistence; | ||||
| in | ||||
| { | ||||
|   options.satellite.persistence = { | ||||
|     enable = lib.mkEnableOption (lib.mkDoc "satellite persitence"); | ||||
| 
 | ||||
|     at = lib.mkOption { | ||||
|       default = { }; | ||||
|       description = "Record of persistent locations (eg: /persist)"; | ||||
|       type = lib.types.attrsOf (lib.types.submodule (_: { | ||||
|         options = { | ||||
|           path = lib.mkOption { | ||||
|             type = lib.types.str; | ||||
|             example = "/persist"; | ||||
|             default = null; | ||||
|             description = "The location to store the files described in this record"; | ||||
|           }; | ||||
| 
 | ||||
|           apps = lib.mkOption { | ||||
|             default = { }; | ||||
|             description = "The apps to be stores in this persistent location"; | ||||
|             type = lib.types.attrsOf (lib.types.submodule (_: { | ||||
|               options = { | ||||
|                 directories = lib.mkOption { | ||||
|                   default = [ ]; | ||||
|                   description = "Modified version of home.persistence.*.directories which takes in absolute paths"; | ||||
|                   type = lib.types.listOf (lib.types.either lib.types.str (lib.types.submodule { | ||||
|                     options = { | ||||
|                       directory = lib.mkOption { | ||||
|                         type = lib.types.str; | ||||
|                         default = null; | ||||
|                         description = "The directory path to be linked."; | ||||
|                       }; | ||||
| 
 | ||||
|                       method = lib.mkOption { | ||||
|                         type = lib.types.enum [ "bindfs" "symlink" ]; | ||||
|                         default = "bindfs"; | ||||
|                         description = '' | ||||
|                           The linking method that should be used for this | ||||
|                           directory. bindfs is the default and works for most use | ||||
|                           cases, however some programs may behave better with | ||||
|                           symlinks. | ||||
|                         ''; | ||||
|                       }; | ||||
|                     }; | ||||
|                   })); | ||||
|                 }; | ||||
|               }; | ||||
|             })); | ||||
|           }; | ||||
|         }; | ||||
|       })); | ||||
|     }; | ||||
|   }; | ||||
| 
 | ||||
|   config = | ||||
|     let | ||||
|       makeLocation = location: | ||||
|         let | ||||
|           processPath = appName: value: | ||||
|             "${appName}/${lib.strings.removePrefix config.home.homeDirectory (builtins.toString value)}"; | ||||
| 
 | ||||
|           mkDirectory = appName: directory: | ||||
|             if builtins.isAttrs directory then { | ||||
|               method = directory.method; | ||||
|               directory = processPath appName directory.directory; | ||||
|             } | ||||
|             else processPath appName directory; | ||||
| 
 | ||||
|           mkAppDirectory = appName: app: builtins.map (mkDirectory appName) app.directories; | ||||
|         in | ||||
|         lib.attrsets.nameValuePair (location.path + config.home.homeDirectory) { | ||||
|           removePrefixDirectory = true; | ||||
|           allowOther = true; | ||||
|           directories = lib.lists.flatten | ||||
|             (lib.attrsets.mapAttrsToList mkAppDirectory location.apps); | ||||
|         }; | ||||
|     in | ||||
|     lib.mkIf cfg.enable { | ||||
|       home.persistence = lib.attrsets.mapAttrs' (_: makeLocation) cfg.at; | ||||
|     }; | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Matei Adriel
				Matei Adriel